SSB_server.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env node
  2. const moduleAlias = require('module-alias');
  3. moduleAlias.addAlias('punycode', 'punycode/');
  4. const fs = require('fs');
  5. const path = require('path');
  6. const SecretStack = require('secret-stack');
  7. const caps = require('ssb-caps');
  8. const SSB = require('ssb-db');
  9. const config = require('./ssb_config');
  10. const { printMetadata } = require('./ssb_metadata');
  11. require('ssb-plugins').loadUserPlugins(SecretStack({ caps }), config);
  12. const Server = SecretStack({ caps })
  13. .use(SSB)
  14. .use(require('ssb-master'))
  15. .use(require('ssb-gossip'))
  16. .use(require('ssb-ebt'))
  17. .use(require('ssb-friends'))
  18. .use(require('ssb-blobs'))
  19. .use(require('ssb-lan'))
  20. .use(require('ssb-meme'))
  21. .use(require('ssb-plugins'))
  22. .use(require('ssb-conn'))
  23. .use(require('ssb-box'))
  24. .use(require('ssb-search'))
  25. .use(require('ssb-private'))
  26. .use(require('ssb-friend-pub'))
  27. .use(require('ssb-invite-client'))
  28. .use(require('ssb-logging'))
  29. .use(require('ssb-replication-scheduler'))
  30. .use(require('ssb-partial-replication'))
  31. .use(require('ssb-about'))
  32. .use(require('ssb-onion'))
  33. .use(require('ssb-unix-socket'))
  34. .use(require('ssb-no-auth'))
  35. .use(require('ssb-backlinks'))
  36. .use(require('ssb-links'))
  37. .use(require('ssb-tangle'))
  38. .use(require('ssb-query'));
  39. if (config.autofollow?.enabled !== false) {
  40. Server.use(require('ssb-autofollow'));
  41. }
  42. const manifestFile = path.join(config.path, 'manifest.json');
  43. let server;
  44. const argv = process.argv.slice(2);
  45. if (argv[0] === 'start') {
  46. server = Server(config);
  47. fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2));
  48. const { cmdAliases } = require('../client/cli-cmd-aliases');
  49. const manifest = server.getManifest();
  50. for (const k in cmdAliases) {
  51. server[k] = server[cmdAliases[k]];
  52. manifest[k] = manifest[cmdAliases[k]];
  53. }
  54. manifest.config = 'sync';
  55. server.config = cb => {
  56. console.log(JSON.stringify(config, null, 2));
  57. cb();
  58. };
  59. if (process.stdout.isTTY && config.logging?.level !== 'info') {
  60. const showProgress = () => {
  61. let prog = -1;
  62. const bar = r => '\r' + '*'.repeat(Math.floor(r * 50)) + '.'.repeat(50 - Math.floor(r * 50));
  63. const percent = r => (Math.round(r * 10000) / 100).toFixed(2) + '%';
  64. const rate = prog => prog.target === prog.current ? 1 : (prog.current - prog.start) / (prog.target - prog.start);
  65. const interval = setInterval(() => {
  66. const p = server.progress();
  67. let r = 1;
  68. const tasks = [];
  69. for (const k in p) {
  70. const pr = rate(p[k]);
  71. if (pr < 1) tasks.push(`${k}:${percent(pr)}`);
  72. r = Math.min(r, pr);
  73. }
  74. if (r !== prog) {
  75. prog = r;
  76. process.stdout.write(bar(r) + ` (${tasks.join(', ')})\x1b[K\r`);
  77. }
  78. }, 333);
  79. interval.unref?.();
  80. };
  81. showProgress();
  82. }
  83. const { printMetadata, colors } = require('./ssb_metadata');
  84. printMetadata('OASIS Server Only', colors.cyan);
  85. }
  86. module.exports = {
  87. config,
  88. server: server || Server(config),
  89. open: async () => server || Server(config)
  90. };