|
| 1 | +'use strict' |
| 2 | + |
| 3 | +const IpfsdCtl = require('..') |
| 4 | +const SocketIO = require('socket.io') |
| 5 | +const each = require('async/each') |
| 6 | +const waterfall = require('async/waterfall') |
| 7 | +const eachSeries = require('async/eachSeries') |
| 8 | +const series = require('async/series') |
| 9 | +const parsePayload = require('./utils').parsePayload |
| 10 | + |
| 11 | +const nodes = new Map() |
| 12 | + |
| 13 | +function start (opts, callback) { |
| 14 | + if (typeof opts === 'function') { |
| 15 | + callback = opts |
| 16 | + opts = null |
| 17 | + } |
| 18 | + |
| 19 | + let node = null |
| 20 | + waterfall([ |
| 21 | + (cb) => IpfsdCtl.disposable(opts, cb), |
| 22 | + (n, cb) => { |
| 23 | + node = n |
| 24 | + series([ |
| 25 | + (pCb) => { |
| 26 | + const configValues = { |
| 27 | + Bootstrap: [], |
| 28 | + Discovery: {}, |
| 29 | + 'API.HTTPHeaders.Access-Control-Allow-Origin': ['*'], |
| 30 | + 'API.HTTPHeaders.Access-Control-Allow-Methods': [ |
| 31 | + 'PUT', |
| 32 | + 'POST', |
| 33 | + 'GET' |
| 34 | + ] |
| 35 | + } |
| 36 | + eachSeries(Object.keys(configValues), (configKey, cb) => { |
| 37 | + const configVal = JSON.stringify(configValues[configKey]) |
| 38 | + node.setConfig(configKey, configVal, cb) |
| 39 | + }, pCb) |
| 40 | + }, |
| 41 | + (pCb) => node.startDaemon(['--enable-pubsub-experiment'], cb) |
| 42 | + ], cb) |
| 43 | + }, |
| 44 | + (api, cb) => api.id(cb), |
| 45 | + (id, cb) => cb(null, nodes.set(id.id, node)) |
| 46 | + ], (err) => { |
| 47 | + callback(err, { |
| 48 | + apiAddr: node.apiAddr.toString() |
| 49 | + }) |
| 50 | + }) |
| 51 | +} |
| 52 | + |
| 53 | +function stop (node, callback) { |
| 54 | + if (typeof node === 'function') { |
| 55 | + callback = node |
| 56 | + node = undefined |
| 57 | + } |
| 58 | + |
| 59 | + if (node) { |
| 60 | + return nodes.get(node).stopDaemon(callback) |
| 61 | + } |
| 62 | + |
| 63 | + each(nodes, (node, cb) => node[1].stopDaemon(cb), callback) |
| 64 | +} |
| 65 | + |
| 66 | +module.exports = (http) => { |
| 67 | + const io = new SocketIO(http.listener) |
| 68 | + io.on('connection', handle) |
| 69 | + |
| 70 | + function handle (socket) { |
| 71 | + const response = (action) => (err, data) => { |
| 72 | + if (err) { |
| 73 | + return socket.emit(action, JSON.stringify({ err })) |
| 74 | + } |
| 75 | + |
| 76 | + socket.emit(action, JSON.stringify({ data })) |
| 77 | + } |
| 78 | + |
| 79 | + socket.on('start', (data) => start.apply(null, parsePayload(data).concat(response('start')))) |
| 80 | + socket.on('stop', (data) => stop.apply(null, parsePayload(data).concat(response('stop')))) |
| 81 | + } |
| 82 | +} |
0 commit comments