server.jsView |
---|
4 | 4 … | const path = require('path') |
5 | 5 … | const ssbKeys = require('ssb-keys') |
6 | 6 … | const minimist = require('minimist') |
7 | 7 … | const notifier = require('node-notifier') |
8 | | -const SysTray = require('systray').default |
9 | | -let tray = {} |
| 8 … | +const SysTray = require('forked-systray').default |
10 | 9 … | |
11 | | -function start(appname) { |
| 10 … | + |
| 11 … | +let tray = null |
| 12 … | +let ssbConfig = null |
12 | 13 … | |
| 14 … | +function noop () {} |
| 15 … | + |
| 16 … | +function start (customConfig, donecb) { |
| 17 … | + donecb = donecb || noop |
| 18 … | + |
| 19 … | + customConfig = customConfig || {} |
| 20 … | + let appname = customConfig.appname || false |
| 21 … | + let customPluginPaths = customConfig.plugins || false |
13 | 22 … | let argv = process.argv.slice(2) |
14 | 23 … | let i = argv.indexOf('--') |
15 | 24 … | let conf = argv.slice(i + 1) |
16 | 25 … | argv = ~i ? argv.slice(0, i) : argv |
17 | | - let ssb_appname = appname ? appname : process.env.ssb_appname |
| 26 … | + let ssbAppName = appname || process.env.ssb_appname |
18 | 27 … | |
19 | | - const config = require('ssb-config/inject')(ssb_appname, minimist(conf)) |
| 28 … | + const config = require('ssb-config/inject')(ssbAppName, minimist(conf)) |
20 | 29 … | |
21 | 30 … | const keys = ssbKeys.loadOrCreateSync(path.join(config.path, 'secret')) |
22 | 31 … | if (keys.curve === 'k256') { |
| 32 … | + |
23 | 33 … | throw new Error('k256 curves are no longer supported,' + |
24 | | - 'please delete' + path.join(config.path, 'secret')) |
| 34 … | + 'please delete' + path.join(config.path, 'secret')) |
25 | 35 … | } |
| 36 … | + config.keys = keys |
| 37 … | + ssbConfig = config |
26 | 38 … | |
27 | 39 … | const manifestFile = path.join(config.path, 'manifest.json') |
28 | 40 … | |
29 | 41 … | const createSbot = require('scuttlebot') |
30 | | - |
31 | 42 … | .use(require('scuttlebot/plugins/master')) |
32 | 43 … | .use(require('scuttlebot/plugins/gossip')) |
33 | 44 … | .use(require('scuttlebot/plugins/replicate')) |
34 | 45 … | .use(require('scuttlebot/plugins/invite')) |
35 | 46 … | .use(require('scuttlebot/plugins/local')) |
| 47 … | + .use(require('scuttlebot/plugins/logging')) |
36 | 48 … | .use(require('ssb-about')) |
37 | 49 … | .use(require('ssb-backlinks')) |
38 | 50 … | .use(require('ssb-blobs')) |
| 51 … | + .use(require('ssb-chess-db')) |
39 | 52 … | .use(require('ssb-ebt')) |
40 | | - .use(require('ssb-chess-db')) |
41 | 53 … | .use(require('ssb-friends')) |
| 54 … | + .use(require('ssb-links')) |
| 55 … | + .use(require('ssb-names')) |
42 | 56 … | .use(require('ssb-meme')) |
43 | | - .use(require('ssb-names')) |
44 | 57 … | .use(require('ssb-ooo')) |
45 | 58 … | .use(require('ssb-private')) |
| 59 … | + .use(require('ssb-query')) |
46 | 60 … | .use(require('ssb-search')) |
47 | | - .use(require('ssb-query')) |
| 61 … | + .use(require('ssb-talequery')) |
| 62 … | + .use(require('ssb-unread')) |
48 | 63 … | .use(require('ssb-ws')) |
49 | 64 … | |
| 65 … | + |
| 66 … | + require('scuttlebot/plugins/plugins').loadUserPlugins(createSbot, config) |
| 67 … | + |
| 68 … | + |
| 69 … | + let appManifestFile = path.resolve('scuttleshell.json') |
| 70 … | + if (fs.existsSync(appManifestFile)) { |
| 71 … | + let manifest = JSON.parse(fs.readFileSync(appManifestFile)) |
| 72 … | + if (manifest.hasOwnProperty('plugins') && Array.isArray(manifest.plugins)) { |
| 73 … | + console.log('loading custom plugins: ', manifest.plugins.join(', ')) |
| 74 … | + manifest.plugins.forEach(plugin => createSbot.use(require(plugin))) |
| 75 … | + } |
| 76 … | + } |
| 77 … | + |
| 78 … | + |
| 79 … | + if (Array.isArray(customPluginPaths)) { |
| 80 … | + console.log('loading custom plugins: ', customPluginPaths.join(', ')) |
| 81 … | + customPluginPaths.forEach(plugin => createSbot.use(require(plugin))) |
| 82 … | + } |
| 83 … | + |
| 84 … | + |
| 85 … | + const args = minimist(process.argv.slice(1)) |
| 86 … | + const extraPlugin = args['extra-plugin'] |
| 87 … | + if (typeof extraPlugin === 'string') { |
| 88 … | + createSbot.use(require(extraPlugin)) |
| 89 … | + } else if (extraPlugin instanceof Array) { |
| 90 … | + extraPlugin.forEach((plugPath) => createSbot.use(require(plugPath))) |
| 91 … | + } |
| 92 … | + |
50 | 93 … | |
51 | | - |
52 | | - config.keys = keys |
53 | 94 … | const server = createSbot(config) |
54 | 95 … | |
55 | 96 … | |
56 | 97 … | fs.writeFileSync(manifestFile, JSON.stringify(server.getManifest(), null, 2)) |
61 | 102 … | icon: icon.toString('base64'), |
62 | 103 … | title: 'Scuttle-Shell', |
63 | 104 … | tooltip: 'Secure Scuttlebutt', |
64 | 105 … | items: [ |
65 | | - |
66 | 106 … | { |
| 107 … | + title: 'starting...', |
| 108 … | + checked: false, |
| 109 … | + enabled: true |
| 110 … | + }, |
| 111 … | + { |
| 112 … | + title: 'version: unset', |
| 113 … | + checked: false, |
| 114 … | + enabled: false |
| 115 … | + }, |
| 116 … | + { |
67 | 117 … | title: 'Quit', |
68 | 118 … | tooltip: 'Stop sbot and quit tray application', |
69 | 119 … | checked: false, |
70 | 120 … | enabled: true |
71 | 121 … | } |
72 | 122 … | ] |
73 | 123 … | }, |
74 | 124 … | debug: false, |
75 | | - copyDir: true, |
| 125 … | + copyDir: true |
76 | 126 … | }) |
77 | 127 … | |
78 | | - tray.onClick(action => { |
79 | | - switch (action.seq_id) { |
80 | | - case 0: |
81 | | - console.log("### EXITING IN TWO SECONDS ###") |
| 128 … | + tray.on('click', (action) => { |
| 129 … | + console.log('scuttle-shell got action:', action) |
| 130 … | + switch (action.item.title) { |
| 131 … | + case 'Quit': |
| 132 … | + console.log('### EXITING IN TWO SECONDS ###') |
82 | 133 … | |
83 | 134 … | notifier.notify({ |
84 | 135 … | title: 'Secure Scuttlebutt', |
85 | 136 … | message: `Secure Scuttlebutt will exit in two seconds...`, |
86 | | - icon: path.join(__dirname, "icon.png"), |
| 137 … | + icon: path.join(__dirname, 'icon.png'), |
87 | 138 … | wait: true, |
88 | | - id: 0, |
| 139 … | + id: 0 |
89 | 140 … | }) |
90 | 141 … | |
91 | 142 … | tray.kill() |
92 | 143 … | } |
93 | 144 … | }) |
94 | 145 … | |
95 | | - tray.onExit((code, signal) => { |
| 146 … | + tray.on('exit', (code, signal) => { |
| 147 … | + console.log('scuttle-shell got exit:', code) |
96 | 148 … | setTimeout(() => |
97 | 149 … | process.exit(0), 2000) |
98 | 150 … | }) |
99 | 151 … | |
| 152 … | + const sbotVersion = server.version() |
| 153 … | + console.log(`started sbot server v${sbotVersion}`) |
| 154 … | + tray.emit('action', { |
| 155 … | + type: 'update-item', |
| 156 … | + seq_id: 1, |
| 157 … | + item: { |
| 158 … | + title: `sbot version: ${sbotVersion}`, |
| 159 … | + checked: false, |
| 160 … | + enabled: false |
| 161 … | + } |
| 162 … | + }) |
| 163 … | + |
| 164 … | + server.about.get((err, curr) => { |
| 165 … | + if (err) { |
| 166 … | + console.warn('got err from about idx:', err) |
| 167 … | + return |
| 168 … | + } |
| 169 … | + |
| 170 … | + if (typeof curr === 'undefined') { |
| 171 … | + return |
| 172 … | + } |
| 173 … | + const myAbouts = curr[ssbConfig.keys.id] |
| 174 … | + if (typeof myAbouts === 'undefined') { |
| 175 … | + return |
| 176 … | + } |
| 177 … | + const myNames = myAbouts['name'] |
| 178 … | + if (typeof myNames === 'undefined') { |
| 179 … | + return |
| 180 … | + } |
| 181 … | + const fromMe = myNames[ssbConfig.keys.id] |
| 182 … | + if (fromMe instanceof Array && fromMe.length === 2) { |
| 183 … | + tray.emit('action', { |
| 184 … | + type: 'update-item', |
| 185 … | + seq_id: 0, |
| 186 … | + item: { |
| 187 … | + title: `@${fromMe[0]}`, |
| 188 … | + tooltip: ssbConfig.keys.id, |
| 189 … | + checked: false, |
| 190 … | + enabled: false |
| 191 … | + } |
| 192 … | + }) |
| 193 … | + } |
| 194 … | + }) |
| 195 … | + donecb(null) |
100 | 196 … | } |
101 | 197 … | |
102 | | -function stop() { |
| 198 … | +function stop () { |
| 199 … | + |
103 | 200 … | tray.kill() |
104 | 201 … | } |
105 | 202 … | |
106 | | -module.exports = { start, stop } |
| 203 … | +const getConfig = () => { |
| 204 … | + if (ssbConfig === null) { |
| 205 … | + return { type: 'error', msg: 'uninitialized config - call start() first' } |
| 206 … | + } |
| 207 … | + try { |
| 208 … | + const k = ssbConfig.keys |
| 209 … | + const manifest = JSON.parse(fs.readFileSync(path.join(ssbConfig.path, 'manifest.json'))) |
| 210 … | + const remote = 'ws://localhost:8989~shs:' + k.id.substring(1, k.id.indexOf('.')) |
| 211 … | + return { |
| 212 … | + type: 'config', |
| 213 … | + keys: k, |
| 214 … | + manifest: manifest, |
| 215 … | + remote: remote |
| 216 … | + } |
| 217 … | + } catch (n) { |
| 218 … | + return { type: 'error', msg: n.message } |
| 219 … | + } |
| 220 … | +} |
107 | 221 … | |
| 222 … | +module.exports = { start, stop, getConfig } |
| 223 … | + |
108 | 224 … | if (require.main === module) { |
109 | | - var errorLevel = start() |
110 | | -} |
| 225 … | + start({}, (err) => { |
| 226 … | + if (err) console.error(err) |
| 227 … | + }) |
| 228 … | +} |