#! /usr/bin/env node var fs = require('fs') var path = require('path') var pull = require('pull-stream') var toPull = require('stream-to-pull-stream') var File = require('pull-file') var explain = require('explain-error') var ssbKeys = require('ssb-keys') var stringify = require('pull-stringify') var createHash = require('multiblob/util').createHash var minimist = require('minimist') var muxrpcli = require('muxrpcli') var cmdAliases = require('minsbot/lib/cli-cmd-aliases') var ProgressBar = require('minsbot/lib/progress') var packageJson = require('minsbot/package.json') var open = require('opn') //get config as cli options after --, options before that are //options to the command. var argv = process.argv.slice(2) var i = argv.indexOf('--') var conf = argv.slice(i+1) argv = ~i ? argv.slice(0, i) : argv var network = 'ssb' //var network = 'decent' //var network = 'testnet' var config = require('minsbot/config/inject')(network) keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret')) var liteClient = fs.readFileSync(path.join('./build/index.html')) var manifestFile = path.join(config.path, 'manifest.json') if (argv[0] == 'server') { console.log('my key ID:', keys.public) // special server command: // import sbot and start the server var createSbot = require('minsbot') .use(require('minsbot/plugins/plugins')) .use(require('minsbot/plugins/master')) .use(require('minsbot/plugins/gossip')) .use(require('minsbot/plugins/replicate')) .use(require('ssb-friends')) .use(require('ssb-blobs')) .use(require('minsbot/plugins/invite')) .use(require('minsbot/plugins/local')) .use(require('minsbot/plugins/logging')) .use(require('minsbot/query')) .use(require('ssb-links')) .use(require('ssb-backlinks')) .use(require('minsbot/decent-ws')) .use(require('ssb-ebt')) .use({ name: 'serve', version: '1.0.0', init: function (sbot) { sbot.ws.use(function (req, res, next) { //res.setHeader('Access-Control-Allow-Origin', '*') var send = config delete send.keys // very important to keep this, as it removes the server keys from the config before broadcast send.address = sbot.ws.getAddress() sbot.invite.create({modern: true}, function (err, cb) { send.invite = cb }) if(req.url == '/') res.end(liteClient) if(req.url == '/get-config') res.end(JSON.stringify(send)) else next() }) } }) open('http://localhost:' + config.ws.port, {wait: false}) // add third-party plugins //require('./plugins/plugins').loadUserPlugins(createSbot, config) // start server config.keys = keys var server = createSbot(config) // write RPC manifest to ~/.ssb/manifest.json fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2)) ProgressBar(server.progress) } else { // normal command: // create a client connection to the server // read manifest.json var manifest try { manifest = JSON.parse(fs.readFileSync(manifestFile)) } catch (err) { throw explain(err, 'no manifest file' + '- should be generated first time server is run' ) } // connect require('ssb-client')(keys, { manifest: manifest, port: config.port, host: config.host||'localhost', caps: config.caps, key: config.key || keys.id }, function (err, rpc) { if(err) { if (/could not connect/.test(err.message)) { console.log('Error: Could not connect to the scuttlebot server.') console.log('Use the "server" command to start it.') if(config.verbose) throw err process.exit(1) } throw err } // add aliases for (var k in cmdAliases) { rpc[k] = rpc[cmdAliases[k]] manifest[k] = manifest[cmdAliases[k]] } // add some extra commands manifest.version = 'async' manifest.config = 'sync' rpc.version = function (cb) { console.log(require('./package.json').version) cb() } rpc.config = function (cb) { console.log(JSON.stringify(config, null, 2)) cb() } // HACK // we need to output the hash of blobs that are added via blobs.add // because muxrpc doesnt support the `sink` callback yet, we need this manual override // -prf if (process.argv[2] === 'blobs.add') { var filename = process.argv[3] var source = filename ? File(process.argv[3]) : !process.stdin.isTTY ? toPull.source(process.stdin) : (function () { console.error('USAGE:') console.error(' blobs.add # add a file') console.error(' source | blobs.add # read from stdin') process.exit(1) })() var hasher = createHash('sha256') pull( source, hasher, rpc.blobs.add(function (err) { if (err) throw err console.log('&'+hasher.digest) process.exit() }) ) return } // run commandline flow muxrpcli(argv, manifest, rpc, config.verbose) }) }