server.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #! /usr/bin/env node
  2. const moduleAlias = require('module-alias');
  3. moduleAlias.addAlias('punycode', 'punycode/');
  4. var fs = require('fs')
  5. var path = require('path')
  6. const SecretStack = require('secret-stack')
  7. var caps = require('ssb-caps')
  8. var SSB = require('ssb-db')
  9. var Client = require('ssb-client')
  10. var cmdAliases = require('./ssb/cli-cmd-aliases')
  11. var ProgressBar = require('./ssb/progress')
  12. var packageJson = require('../package.json')
  13. var Config = require('ssb-config/inject')
  14. var minimist = require('minimist')
  15. var muxrpcli = require('muxrpcli')
  16. var argv = process.argv.slice(2)
  17. var i = argv.indexOf('--')
  18. var conf = argv.slice(i+1)
  19. argv = ~i ? argv.slice(0, i) : argv
  20. var config = Config("ssb", minimist(conf))
  21. var config = Config("ssb", {"replicationScheduler": {"autostart": true, "partialReplication": null} ,"pub": true, "local": true, "friends": { "dunbar": 300, "hops":3}, "gossip":{ "connections": 10, "local": true, "friends": true, "seed": false, "global": false}, "connections": {"incoming": {"net": [{"scope": "public","transform": "shs","port": 8008},{"scope": "device","transform": "shs","port": 8008}],"tunnel": [{"scope": "public", "portal": "@1wOEiCjJJ0nEs1OABUIV20valZ1LHUsfHJY/ivBoM8Y=.ed25519", "transform": "shs"}],"onion": [{"scope": "public","transform": "shs"}],"ws": [{"scope": "public","transform": "shs"}]},"outgoing": {"net": [{"transform": "shs"}],"ws": [{"transform": "shs"}],"tunnel": [{"transform": "shs"}]}}})
  22. var manifestFile = path.join(config.path, 'manifest.json')
  23. // generate initial info
  24. if (argv[0] == 'start') {
  25. console.log(packageJson.name, "[version: "+ packageJson.version+ "]", "[dataPath: "+ config.path+ "]", "["+'logging.level:'+config.logging.level+"]")
  26. console.log('my key ID:', config.keys.public)
  27. // add ssb server required plugins
  28. var tribes = require('ssb-tribes')
  29. var conn = require('ssb-conn')
  30. var legacy_conn = require('ssb-legacy-conn')
  31. var db2 = require('ssb-db2')
  32. var replication_scheduler = ('ssb-replication-scheduler')
  33. var friends = require('ssb-friends')
  34. var ebt = require('ssb-ebt')
  35. var box = require('ssb-box')
  36. var threads = require('ssb-threads')
  37. var invite = require('ssb-invite')
  38. var conn_db = require('ssb-conn-db')
  39. var search2 = require('ssb-search2')
  40. var friend_pub = require('ssb-friend-pub')
  41. var invite_client = require('ssb-invite-client')
  42. var tunnel = require('ssb-tunnel')
  43. var config = require('ssb-config')
  44. var conn_query = require('ssb-conn-query')
  45. var conn_hub = require('ssb-conn-hub')
  46. var conn_staging = require('ssb-conn-staging')
  47. var device_address = require('ssb-device-address')
  48. var gossip = require('ssb-gossip')
  49. var master = require('ssb-master')
  50. var logging = require('ssb-logging')
  51. var partial_replication = require('ssb-partial-replication')
  52. var about = require('ssb-about')
  53. var onion = require('ssb-onion')
  54. var unix = require('ssb-unix-socket')
  55. var auth = require('ssb-no-auth')
  56. var backlinks = require('ssb-backlinks')
  57. var links = require('ssb-links')
  58. // create ssb server
  59. function createSsbServer () {
  60. return SecretStack({ caps }).use(SSB, gossip, tribes, conn, db2, master, ebt, box, threads, invite, conn_db, search2, friend_pub, invite_client, tunnel, config, conn_query, conn_hub, conn_staging, device_address, friends, logging, replication_scheduler, partial_replication, about, onion, unix, auth, backlinks, links)
  61. }
  62. // add other required plugins (+flotilla) by SNH-Oasis (client) (plugin order is required!)
  63. var Server = createSsbServer()
  64. .use(require('ssb-master'))
  65. .use(require('ssb-gossip'))
  66. .use(require('ssb-ebt'))
  67. .use(require('ssb-friends'))
  68. .use(require('ssb-blobs'))
  69. .use(require('ssb-lan'))
  70. .use(require('ssb-meme'))
  71. .use(require('ssb-ooo'))
  72. .use(require('ssb-plugins'))
  73. .use(require('ssb-conn'))
  74. .use(require('ssb-box'))
  75. .use(require('ssb-search'))
  76. .use(require('ssb-friend-pub'))
  77. .use(require('ssb-invite-client'))
  78. .use(require('ssb-logging'))
  79. .use(require('ssb-replication-scheduler'))
  80. .use(require('ssb-partial-replication'))
  81. .use(require("ssb-room/tunnel/client"))
  82. .use(require('ssb-about'))
  83. .use(require('ssb-onion'))
  84. .use(require('ssb-unix-socket'))
  85. .use(require('ssb-no-auth'))
  86. .use(require('ssb-backlinks'))
  87. .use(require("ssb-tangle"))
  88. .use(require('ssb-links'))
  89. .use(require('ssb-query'))
  90. // add third-party plugins (loaded from ~/.ssb/config)
  91. require('ssb-plugins').loadUserPlugins(Server, config)
  92. // load config into ssb & start it
  93. var server = Server(config)
  94. // generate manifest
  95. fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2))
  96. // show server progress
  97. if(process.stdout.isTTY && (config.logging.level != 'info'))
  98. ProgressBar(server.progress)
  99. } else {
  100. var manifest
  101. try {
  102. manifest = JSON.parse(fs.readFileSync(manifestFile))
  103. } catch (err) {
  104. throw explain(err,
  105. 'no manifest file'
  106. + '- should be generated first time server is run'
  107. )
  108. }
  109. var opts = {
  110. manifest: manifest,
  111. port: config.port,
  112. host: 'localhost',
  113. caps: config.caps,
  114. key: config.key || config.keys.id
  115. }
  116. Client(config.keys, opts, function (err, rpc) {
  117. if(err) {
  118. if (/could not connect/.test(err.message)) {
  119. console.error('Error: Could not connect to ssb-server ' + opts.host + ':' + opts.port)
  120. console.error('Use the "start" command to start it.')
  121. console.error('Use --verbose option to see full error')
  122. if(config.verbose) throw err
  123. process.exit(1)
  124. }
  125. throw err
  126. }
  127. for (var k in cmdAliases) {
  128. rpc[k] = rpc[cmdAliases[k]]
  129. manifest[k] = manifest[cmdAliases[k]]
  130. }
  131. manifest.config = 'sync'
  132. rpc.config = function (cb) {
  133. console.log(JSON.stringify(config, null, 2))
  134. cb()
  135. }
  136. if (process.argv[2] === 'blobs.add') {
  137. var filename = process.argv[3]
  138. var source =
  139. filename ? File(process.argv[3])
  140. : !process.stdin.isTTY ? toPull.source(process.stdin)
  141. : (function () {
  142. console.error('USAGE:')
  143. console.error(' blobs.add <filename> # add a file')
  144. console.error(' source | blobs.add # read from stdin')
  145. process.exit(1)
  146. })()
  147. pull(
  148. source,
  149. rpc.blobs.add(null, function (err, hash) {
  150. if (err)
  151. throw err
  152. console.log(hash)
  153. process.exit()
  154. })
  155. )
  156. return
  157. }
  158. muxrpcli(argv, manifest, rpc, config.verbose)
  159. })
  160. }