Files: 2bccd6311eaa538c1dcb6a4d796fe73d159ea6ad / server.js
4593 bytesRaw
1 | |
2 | |
3 | const fs = require('fs') |
4 | const path = require('path') |
5 | const ssbKeys = require('ssb-keys') |
6 | const minimist = require('minimist') |
7 | const notifier = require('node-notifier') |
8 | const SysTray = require('forked-systray').default |
9 | let tray = {} |
10 | |
11 | function start(customConfig) { |
12 | customConfig = customConfig || {} |
13 | let appname = customConfig.appname || false |
14 | let customPluginPaths = customConfig.plugins || false |
15 | let argv = process.argv.slice(2) |
16 | let i = argv.indexOf('--') |
17 | let conf = argv.slice(i + 1) |
18 | argv = ~i ? argv.slice(0, i) : argv |
19 | let ssbAppName = appname || process.env.ssb_appname |
20 | |
21 | const config = require('ssb-config/inject')(ssbAppName, minimist(conf)) |
22 | |
23 | const keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret')) |
24 | if (keys.curve === 'k256') { |
25 | throw new Error('k256 curves are no longer supported,' + |
26 | 'please delete' + path.join(config.path, 'secret')) |
27 | } |
28 | |
29 | const manifestFile = path.join(config.path, 'manifest.json') |
30 | |
31 | const createSbot = require('scuttlebot') |
32 | .use(require('scuttlebot/plugins/master')) |
33 | .use(require('scuttlebot/plugins/gossip')) |
34 | .use(require('scuttlebot/plugins/replicate')) |
35 | .use(require('scuttlebot/plugins/invite')) |
36 | .use(require('scuttlebot/plugins/local')) |
37 | .use(require('scuttlebot/plugins/logging')) |
38 | .use(require('ssb-about')) |
39 | .use(require('ssb-backlinks')) |
40 | .use(require('ssb-blobs')) |
41 | .use(require('ssb-chess-db')) |
42 | .use(require('ssb-ebt')) |
43 | .use(require('ssb-friends')) |
44 | .use(require('ssb-links')) // needed by patchfoo |
45 | .use(require('ssb-names')) |
46 | .use(require('ssb-meme')) |
47 | .use(require('ssb-ooo')) |
48 | .use(require('ssb-private')) |
49 | .use(require('ssb-query')) |
50 | .use(require('ssb-search')) |
51 | .use(require('ssb-talequery')) // only tale:net |
52 | .use(require('ssb-unread')) |
53 | .use(require('ssb-ws')) |
54 | |
55 | // load user plugins (from $HOME/.ssb/node_modules using $HOME/.ssb/config plugins {name:true}) |
56 | require('scuttlebot/plugins/plugins').loadUserPlugins(createSbot, config) |
57 | |
58 | // Custom plugins from json |
59 | let appManifestFile = path.resolve('scuttleshell.json') |
60 | if (fs.existsSync(appManifestFile)) { |
61 | let manifest = JSON.parse(fs.readFileSync(appManifestFile)) |
62 | if (manifest.hasOwnProperty('plugins') && Array.isArray(manifest.plugins)) { |
63 | console.log('loading custom plugins: ', manifest.plugins.join(', ')) |
64 | manifest.plugins.forEach(plugin => createSbot.use(require(plugin))) |
65 | } |
66 | } |
67 | |
68 | if (Array.isArray(customPluginPaths)) { |
69 | console.log('loading custom plugins: ', customPluginPaths.join(', ')) |
70 | customPluginPaths.forEach(plugin => createSbot.use(require(plugin))) |
71 | } |
72 | |
73 | // start server |
74 | |
75 | config.keys = keys |
76 | console.log('config:', config) |
77 | const server = createSbot(config) |
78 | |
79 | // write RPC manifest to ~/.ssb/manifest.json |
80 | fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2)) |
81 | |
82 | const icon = fs.readFileSync(path.join(__dirname, `icon.${process.platform === 'win32' ? 'ico' : 'png'}`)) |
83 | tray = new SysTray({ |
84 | menu: { |
85 | icon: icon.toString('base64'), |
86 | title: 'Scuttle-Shell', |
87 | tooltip: 'Secure Scuttlebutt', |
88 | items: [ |
89 | { |
90 | title: 'Quit', |
91 | tooltip: 'Stop sbot and quit tray application', |
92 | checked: false, |
93 | enabled: true |
94 | } |
95 | ] |
96 | }, |
97 | debug: false, |
98 | copyDir: true |
99 | }) |
100 | |
101 | tray.onClick(action => { |
102 | console.log('got action:', action) |
103 | switch (action.seq_id) { |
104 | case 0: |
105 | console.log('### EXITING IN TWO SECONDS ###') |
106 | |
107 | notifier.notify({ |
108 | title: 'Secure Scuttlebutt', |
109 | message: `Secure Scuttlebutt will exit in two seconds...`, |
110 | icon: path.join(__dirname, 'icon.png'), |
111 | wait: true, |
112 | id: 0 |
113 | }) |
114 | |
115 | tray.kill() |
116 | } |
117 | }) |
118 | |
119 | tray.onExit((code, signal) => { |
120 | console.log('got exit:', code) |
121 | setTimeout(() => |
122 | process.exit(0), 2000) |
123 | }) |
124 | } |
125 | |
126 | function stop() { |
127 | tray.kill() |
128 | } |
129 | |
130 | const getConfig = () => { |
131 | try { |
132 | let secret = fs.readFileSync(pathToSecret, 'utf8') |
133 | let keys = JSON.parse(secret.replace(/#[^\n]*/g, '')) |
134 | let manifest = JSON.parse(fs.readFileSync(path.join(config.path, 'manifest.json'))) |
135 | let remote = 'ws://localhost:8989~shs:' + keys.id.substring(1, keys.id.indexOf('.')) |
136 | return { type: 'config', keys: keys, manifest: manifest, remote: remote, secret: secret } |
137 | } catch (n) { |
138 | return { type: 'error', msg: n.message } |
139 | } |
140 | } |
141 | |
142 | module.exports = { start, stop, getConfig } |
143 | |
144 | if (require.main === module) { |
145 | var errorLevel = start() |
146 | console.log('exited with:', errorLevel) |
147 | } |
148 |
Built with git-ssb-web