Skip to content

Commit 36f4e8f

Browse files
fsdiogoachingbrain
authored andcommitted
fix: dont spawn node for local ops (#110)
* chore: remove unneeded asyncs * fix: dont spawn node for local ops
1 parent 78a563a commit 36f4e8f

File tree

6 files changed

+107
-73
lines changed

6 files changed

+107
-73
lines changed

src/core/commands/proxy.js

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
'use strict'
22

33
const config = require('../config')
4-
const startIpfs = require('./start-ipfs')
54
const startServer = require('./start-server')
65
const rewriteLockfile = require('./rewrite-lock-file')
7-
const request = require('ipfs-registry-mirror-common/utils/retry-request')
8-
const {
9-
spawn
10-
} = require('child_process')
6+
const { spawn } = require('child_process')
117
const which = require('which-promise')
12-
const timeout = require('ipfs-registry-mirror-common/utils/timeout-promise')
138

149
const cleanUpOps = []
1510

@@ -28,44 +23,9 @@ process.on('SIGINT', cleanUp)
2823
module.exports = async (options) => {
2924
options = config(options)
3025

31-
const ipfs = await startIpfs(options)
32-
33-
cleanUpOps.push(() => {
34-
return new Promise((resolve) => {
35-
if (options.ipfs.node !== 'proc') {
36-
return resolve()
37-
}
38-
39-
ipfs.stop(() => {
40-
console.info('👿 IPFS node stopped') // eslint-disable-line no-console
41-
resolve()
42-
})
43-
})
44-
})
45-
46-
console.info('🗂️ Loading registry index from', options.registry) // eslint-disable-line no-console
47-
48-
try {
49-
const mirror = await request(Object.assign({}, options.request, {
50-
uri: options.registry,
51-
json: true
52-
}))
53-
54-
console.info('☎️ Dialling registry mirror', mirror.ipfs.addresses.join(',')) // eslint-disable-line no-console
55-
56-
await timeout(
57-
ipfs.api.swarm.connect(mirror.ipfs.addresses[0]),
58-
options.registryConnectTimeout
59-
)
60-
61-
console.info('📱️ Connected to registry') // eslint-disable-line no-console
62-
} catch (error) {
63-
console.info('📴 Not connected to registry') // eslint-disable-line no-console
64-
}
65-
6626
console.info('👩‍🚀 Starting local proxy') // eslint-disable-line no-console
6727

68-
const server = await startServer(options, ipfs.api)
28+
const server = await startServer(options)
6929

7030
cleanUpOps.push(() => {
7131
return new Promise((resolve) => {

src/core/commands/start-ipfs.js

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const spawn = (createArgs, spawnArgs = { init: true }) => {
2121

2222
const startIpfs = async (config) => {
2323
if (config.ipfs.node === 'proc') {
24-
console.info(`👿 Spawning an in-process IPFS node using repo at ${config.ipfs.repo}`) // eslint-disable-line no-console
24+
console.info(`😈 Spawning an in-process IPFS node using repo at ${config.ipfs.repo}`) // eslint-disable-line no-console
2525

2626
const node = await spawn({
2727
type: 'proc',
@@ -31,46 +31,40 @@ const startIpfs = async (config) => {
3131
repoPath: config.ipfs.repo
3232
})
3333

34-
return new Promise(async (resolve, reject) => {
35-
try {
36-
const initalise = promisify(node.init.bind(node))
37-
const start = promisify(node.start.bind(node))
34+
const initalise = promisify(node.init.bind(node))
35+
const start = promisify(node.start.bind(node))
3836

39-
if (!node.initialized) {
40-
await initalise()
41-
}
37+
if (!node.initialized) {
38+
await initalise()
39+
}
4240

43-
await start()
41+
await start()
4442

45-
resolve(node)
46-
} catch (error) {
47-
reject(error)
48-
}
49-
})
43+
return node
5044
} else if (config.ipfs.node === 'disposable') {
51-
console.info('👿 Spawning an in-process disposable IPFS node') // eslint-disable-line no-console
45+
console.info('😈 Spawning an in-process disposable IPFS node') // eslint-disable-line no-console
5246

5347
return spawn({
5448
type: 'proc',
5549
exec: require('ipfs')
5650
})
5751
} else if (config.ipfs.node === 'js') {
58-
console.info('👿 Spawning a js-IPFS node') // eslint-disable-line no-console
52+
console.info('😈 Spawning a js-IPFS node') // eslint-disable-line no-console
5953

6054
return spawn({
6155
type: 'js',
6256
exec: await which('jsipfs')
6357
})
6458
} else if (config.ipfs.node === 'go') {
65-
console.info('👿 Spawning a go-IPFS node') // eslint-disable-line no-console
59+
console.info('😈 Spawning a go-IPFS node') // eslint-disable-line no-console
6660

6761
return spawn({
6862
type: 'go',
6963
exec: await which('ipfs')
7064
})
7165
}
7266

73-
console.info(`👿 Connecting to a remote IPFS node at ${config.ipfs.node}`) // eslint-disable-line no-console
67+
console.info(`😈 Connecting to a remote IPFS node at ${config.ipfs.node}`) // eslint-disable-line no-console
7468

7569
return {
7670
api: new IpfsApi(config.ipfs.node),

src/core/commands/start-server.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,21 @@ const favicon = require('ipfs-registry-mirror-common/handlers/favicon')
99
const root = require('../handlers/root')
1010
const tarball = require('../handlers/tarball')
1111
const manifest = require('../handlers/manifest')
12+
const getIpfs = require('../middlewares/getIpfs')
1213

13-
const startServer = (config, ipfs) => {
14+
const startServer = (config) => {
1415
const app = express()
1516

1617
app.use(requestLog)
1718

18-
app.get('/favicon.ico', favicon(config, ipfs, app))
19-
app.get('/favicon.png', favicon(config, ipfs, app))
19+
app.get('/favicon.ico', favicon(config, app))
20+
app.get('/favicon.png', favicon(config, app))
2021

21-
app.get('/', root(config, ipfs, app))
22+
app.get('/', getIpfs(config), root(config, app))
2223

2324
// intercept requests for tarballs and manifests
24-
app.get('/*.tgz', tarball(config, ipfs, app))
25-
app.get('/*', manifest(config, ipfs, app))
25+
app.get('/*.tgz', getIpfs(config), tarball(config, app))
26+
app.get('/*', getIpfs(config), manifest(config, app))
2627

2728
// everything else should just proxy for the registry
2829
const registry = proxy(config.registry, {
@@ -35,9 +36,7 @@ const startServer = (config, ipfs) => {
3536

3637
app.use(errorLog)
3738

38-
app.locals.ipfs = ipfs
39-
40-
return new Promise(async (resolve, reject) => {
39+
return new Promise((resolve, reject) => {
4140
const callback = once((error) => {
4241
if (error) {
4342
reject(error)

src/core/handlers/manifest.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,18 @@ const replaceTarballUrls = (pkg, config) => {
2222
return pkg
2323
}
2424

25-
module.exports = (config, ipfs, app) => {
25+
module.exports = (config, app) => {
2626
return async (request, response, next) => {
2727
log(`Requested ${request.path}`)
2828

2929
let moduleName = sanitiseName(request.path)
3030

3131
log(`Loading manifest for ${moduleName}`)
3232

33+
const ipfs = response.locals.ipfs
34+
3335
try {
34-
const manifest = await loadManifest(config, ipfs, moduleName)
36+
const manifest = await loadManifest(config, ipfs.api, moduleName)
3537

3638
// because we start the server on a random high port, the previously stored
3739
// manifests may have port numbers from the last time we ran, so overwrite

src/core/handlers/tarball.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ const path = require('path')
55
const loadTarball = require('ipfs-registry-mirror-common/utils/load-tarball')
66
const lol = require('ipfs-registry-mirror-common/utils/error-message')
77

8-
module.exports = (config, ipfs, app) => {
8+
module.exports = (config, app) => {
99
return async (request, response, next) => {
1010
log(`Requested ${request.path}`)
1111

1212
let file = request.path
1313

1414
log(`Loading ${file}`)
1515

16+
const ipfs = response.locals.ipfs
17+
1618
try {
17-
const readStream = await loadTarball(config, ipfs, file)
19+
const readStream = await loadTarball(config, ipfs.api, file)
1820

1921
readStream.on('error', (error) => {
2022
log(`Error loading ${file} - ${error}`)

src/core/middlewares/getIpfs.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
'use strict'
2+
3+
const startIpfs = require('../commands/start-ipfs')
4+
const request = require('ipfs-registry-mirror-common/utils/retry-request')
5+
const timeout = require('ipfs-registry-mirror-common/utils/timeout-promise')
6+
7+
const cleanUpOps = []
8+
9+
const cleanUp = async () => {
10+
Promise.all(
11+
cleanUpOps.map(op => op())
12+
)
13+
.then(() => {
14+
process.exit(0)
15+
})
16+
}
17+
18+
process.on('SIGTERM', cleanUp)
19+
process.on('SIGINT', cleanUp)
20+
21+
const ipfsInstance = (function() {
22+
let ipfs = null
23+
24+
return {
25+
get: () => ipfs,
26+
set: (instance) => { ipfs = instance }
27+
}
28+
}())
29+
30+
module.exports = (options) => {
31+
return async (req, res, next) => {
32+
if (ipfsInstance.get() !== null) {
33+
res.locals.ipfs = ipfsInstance.get()
34+
return next()
35+
}
36+
37+
const ipfs = await startIpfs(options)
38+
39+
cleanUpOps.push(() => {
40+
return new Promise((resolve) => {
41+
if (options.ipfs.node !== 'proc') {
42+
return resolve()
43+
}
44+
45+
ipfs.stop(() => {
46+
console.info('😈 IPFS node stopped') // eslint-disable-line no-console
47+
ipfsInstance.set(null)
48+
resolve()
49+
})
50+
})
51+
})
52+
53+
console.info('🗂️ Loading registry index from', options.registry) // eslint-disable-line no-console
54+
55+
try {
56+
const mirror = await request(Object.assign({}, options.request, {
57+
uri: options.registry,
58+
json: true
59+
}))
60+
61+
console.info('☎️ Dialling registry mirror', mirror.ipfs.addresses.join(',')) // eslint-disable-line no-console
62+
63+
await timeout(
64+
ipfs.api.swarm.connect(mirror.ipfs.addresses[0]),
65+
options.registryConnectTimeout
66+
)
67+
68+
console.info('📱️ Connected to registry') // eslint-disable-line no-console
69+
} catch (error) {
70+
console.info('📴 Not connected to registry') // eslint-disable-line no-console
71+
}
72+
73+
ipfsInstance.set(ipfs)
74+
res.locals.ipfs = ipfs
75+
next()
76+
}
77+
}

0 commit comments

Comments
 (0)