-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun.js
executable file
·102 lines (83 loc) · 3.01 KB
/
run.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#! /usr/bin/env node
import loadConfig from './lib/config.js'
import setupLogger from 'pino'
import goodbye from 'graceful-goodbye'
import Corestore from 'corestore'
import Rehoster from 'hypercore-rehoster'
import Hyperswarm from 'hyperswarm'
import { asHex } from 'hexkey-utils'
import DHT from 'hyperdht'
import SwarmManager from 'swarm-manager'
import { logRehostingInfo } from './lib/utils.js'
import setupRehostServer from './lib/server.js'
async function main () {
const config = loadConfig()
const logger = setupLogger(
{ name: 'rehost-server', level: config.LOG_LEVEL }
)
const configEntries = []
for (const [key, value] of Object.entries(config)) {
configEntries.push(`${key}: ${value}`)
}
logger.info(`Using config:\n -${configEntries.join('\n- ')}`)
const rehoster = await initRehoster(config, logger)
const server = await setupRehostServer(rehoster, {
host: config.HOST,
port: config.PORT,
exposeSwarm: config.EXPOSE_SWARM,
logger,
configPath: config.REHOSTER_KEYS_PATH,
detailedMetrics: config.DETAILED_METRICS
})
const minutesLogInterval = config.MIN_LOG_SUMMARY_INTERVAL
if (minutesLogInterval) {
setInterval(
async () => {
await logRehostingInfo(rehoster, logger)
}, minutesLogInterval * 60 * 1000
)
}
goodbye(async () => {
logger.info('Closing down server')
await server.close()
logger.info('Closed server down successfully--exiting program')
})
}
async function initRehoster (config, logger) {
const corestore = new Corestore(config.CORESTORE_LOC)
const swarm = setupSwarm(logger, corestore, config.SWARM_PORT)
const manager = new SwarmManager(swarm)
const rehoster = new Rehoster(corestore, manager, { beeName: config.BEE_NAME }
)
rehoster.on('invalidKey', ({ invalidKey, rehosterKey }) => {
logger.warn(
`Rehoster at key ${asHex(rehosterKey)}` +
` contains an invalid key: ${asHex(invalidKey)}--ignoring`
)
})
return rehoster
}
function setupSwarm (logger, corestore, port) {
const dht = new DHT({ port })
const swarm = new Hyperswarm({ dht })
swarm.on('connection', (socket, peerInfo) => {
corestore.replicate(socket)
socket.on('error', e => logger.info(e)) // Usually just unexpectedly closed
const key = asHex(peerInfo.publicKey)
logger.info(`Connection opened with ${key}--total: ${swarm.connections.size}`)
if (logger.level === 'debug' && peerInfo.topics && peerInfo.topics.length > 0) {
const hexDiscKeys = peerInfo.topics.map(t => asHex(t)).sort()
// Might be that the peerInfo topics are always known to us, in which case the check is redundant
const keyMap = hexDiscKeys.map(
k => `${k} <-- ${corestore.cores.get(k) ? asHex(corestore.cores.get(k).key) : 'Not known'}`
)
logger.debug(`Peer ${key} topics (disc key <-- pub key):\n - ` +
`${keyMap.join('\n - ')}`)
}
socket.on('close', () => {
logger.info(`Connection closed with ${key}--total: ${swarm.connections.size}`)
})
})
return swarm
}
main()