tre-init
Version:
Initialize and test a new ssb network
114 lines (104 loc) • 3.03 kB
JavaScript
const fs = require('fs')
const {join, resolve} = require('path')
const ssbClient = require('scuttlebot-release/node_modules/ssb-client')
const ssbKeys = require('scuttlebot-release/node_modules/ssb-keys')
const {isMsg} = require('ssb-ref')
const argv = require('minimist')(process.argv.slice(2))
const {stringify} = require('tre-invite-code')
const showList = require('./apps-list')
const autoname = argv.name
const conf = require('rc')('tre')
const path = conf.config
if (!path) {
console.error('.trerc not found')
process.exit(1)
}
let remotes
try {
remotes = JSON.parse(
fs.readFileSync(join(path, '../.tre/remotes'), 'utf8')
)
} catch(err) {
console.error('Unable to read .tre/remotes:', err.message)
process.exit(1)
}
let remote
if (Object.values(remotes).length == 1) remote = Object.values(remotes)[0]
if (!remote) {
console.error('specify a remote. Available remotes: ' + Object.keys(remotes))
}
console.error('remote:', remote)
const keys = ssbKeys.loadSync(join(path, '../.tre/secret'))
let webapp = argv.webapp
const count = argv.count || 1
showList(conf, keys, (err, apps) => {
if (err) {
console.error('Unable to list webapps:', err.message)
process.exit(1)
}
if (!apps.length) {
console.error('No wenapps found in network')
}
if (apps.length == 1 && !webapp) {
webapp = revisionRoot(apps[0])
} else if (apps.length > 1 && !webapp) {
console.error('Please specify a webapp (Example: --webapp \'%lvxL\')')
process.exit(1)
}
if (webapp && !isMsg(webapp)) {
const kv = apps.find(kv => {
const revRoot = revisionRoot(kv)
return revRoot.startsWith(webapp)
})
if (!kv) {
console.error('No webapp found that starts with', webapp)
process.exit(1)
}
webapp = revisionRoot(kv)
}
const boot = webapp
console.error('boot message is', webapp)
getInviteCode(conf, keys, remote, count, (err, code) => {
if (err) {
console.error('Unable to connect to remote sbot:', err.message)
process.exit(1)
}
console.error('got invite code', code)
const network = conf.network || conf.caps && `*${conf.caps.shs}.random`
const invite = {
network,
autofollow: keys.id,
autoinvite: code,
autoname,
boot
}
if (!autoname) delete invite.autoname
if (!argv.compact) {
console.log(JSON.stringify(invite, null, 2))
} else {
console.log(stringify(invite))
}
})
})
function getInviteCode(conf, keys, remote, count, cb) {
console.error('using identity:', keys.id)
console.error('using appKey:', conf.caps.shs)
console.error('asking for', count, 'invite(s)')
ssbClient(keys, {
caps: conf.caps,
appKey: conf.appKey,
remote,
manifest: {invite: {create: 'async'}}
}, (err, ssb) => {
if (err) return cb(err)
ssb.invite.create(count, (err, code) => {
ssb.close()
cb(err, code)
})
})
}
// -- utils
function revisionRoot(kv) {
return kv.value.content.revisionRoot || kv.key
}