├── .gitignore ├── README.md ├── commands.js ├── index.js ├── input.js ├── interface.js ├── package-lock.json ├── package.json ├── simple-screen.js └── util.js /.gitignore: -------------------------------------------------------------------------------- 1 | #~top ignores~ 2 | node_modules/ 3 | *.css 4 | *.vim 5 | *bundle*.js 6 | /html/*.html 7 | *.swo 8 | config.conf 9 | config.js 10 | *.txt 11 | *.pdf 12 | archives 13 | 14 | ################# 15 | ## Eclipse 16 | ################# 17 | *.pydevproject 18 | .project 19 | .metadata 20 | bin/ 21 | tmp/ 22 | *.tmp 23 | *.bak 24 | *.swp 25 | *~.nib 26 | local.properties 27 | .classpath 28 | .settings/ 29 | .loadpath 30 | 31 | # External tool builders 32 | .externalToolBuilders/ 33 | 34 | # Locally stored "Eclipse launch configurations" 35 | *.launch 36 | 37 | # CDT-specific 38 | .cproject 39 | 40 | # PDT-specific 41 | .buildpath 42 | 43 | 44 | ################# 45 | ## Visual Studio 46 | ################# 47 | 48 | ## Ignore Visual Studio temporary files, build results, and 49 | ## files generated by popular Visual Studio add-ons. 50 | 51 | # User-specific files 52 | *.suo 53 | *.user 54 | *.sln.docstates 55 | 56 | # Build results 57 | 58 | [Dd]ebug/ 59 | [Rr]elease/ 60 | x64/ 61 | build/ 62 | [Bb]in/ 63 | [Oo]bj/ 64 | 65 | # MSTest test Results 66 | [Tt]est[Rr]esult*/ 67 | [Bb]uild[Ll]og.* 68 | 69 | *_i.c 70 | *_p.c 71 | *.ilk 72 | *.meta 73 | *.obj 74 | *.pch 75 | *.pdb 76 | *.pgc 77 | *.pgd 78 | *.rsp 79 | *.sbr 80 | *.tlb 81 | *.tli 82 | *.tlh 83 | *.tmp 84 | *.tmp_proj 85 | *.log 86 | *.vspscc 87 | *.vssscc 88 | .builds 89 | *.pidb 90 | *.log 91 | *.scc 92 | 93 | # Visual C++ cache files 94 | ipch/ 95 | *.aps 96 | *.ncb 97 | *.opensdf 98 | *.sdf 99 | *.cachefile 100 | 101 | # Visual Studio profiler 102 | *.psess 103 | *.vsp 104 | *.vspx 105 | 106 | # Guidance Automation Toolkit 107 | *.gpState 108 | 109 | # ReSharper is a .NET coding add-in 110 | _ReSharper*/ 111 | *.[Rr]e[Ss]harper 112 | 113 | # TeamCity is a build add-in 114 | _TeamCity* 115 | 116 | # DotCover is a Code Coverage Tool 117 | *.dotCover 118 | 119 | # NCrunch 120 | *.ncrunch* 121 | .*crunch*.local.xml 122 | 123 | # Installshield output folder 124 | [Ee]xpress/ 125 | 126 | # DocProject is a documentation generator add-in 127 | DocProject/buildhelp/ 128 | DocProject/Help/*.HxT 129 | DocProject/Help/*.HxC 130 | DocProject/Help/*.hhc 131 | DocProject/Help/*.hhk 132 | DocProject/Help/*.hhp 133 | DocProject/Help/Html2 134 | DocProject/Help/html 135 | 136 | # Click-Once directory 137 | publish/ 138 | 139 | # Publish Web Output 140 | *.Publish.xml 141 | *.pubxml 142 | 143 | # NuGet Packages Directory 144 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 145 | #packages/ 146 | 147 | # Windows Azure Build Output 148 | csx 149 | *.build.csdef 150 | 151 | # Windows Store app package directory 152 | AppPackages/ 153 | 154 | # Others 155 | sql/ 156 | *.Cache 157 | ClientBin/ 158 | [Ss]tyle[Cc]op.* 159 | ~$* 160 | *~ 161 | *.dbmdl 162 | *.[Pp]ublish.xml 163 | *.pfx 164 | *.publishsettings 165 | 166 | # RIA/Silverlight projects 167 | Generated_Code/ 168 | 169 | # Backup & report files from converting an old project file to a newer 170 | # Visual Studio version. Backup files are not needed, because we have git ;-) 171 | _UpgradeReport_Files/ 172 | Backup*/ 173 | UpgradeLog*.XML 174 | UpgradeLog*.htm 175 | 176 | # SQL Server files 177 | App_Data/*.mdf 178 | App_Data/*.ldf 179 | 180 | ############# 181 | ## Windows detritus 182 | ############# 183 | 184 | # Windows image file caches 185 | Thumbs.db 186 | ehthumbs.db 187 | 188 | # Folder config file 189 | Desktop.ini 190 | 191 | # Recycle Bin used on file shares 192 | $RECYCLE.BIN/ 193 | 194 | # Mac crap 195 | .DS_Store 196 | 197 | 198 | ############# 199 | ## Python 200 | ############# 201 | 202 | *.py[co] 203 | 204 | # Packages 205 | *.egg 206 | *.egg-info 207 | dist/ 208 | build/ 209 | eggs/ 210 | parts/ 211 | var/ 212 | sdist/ 213 | develop-eggs/ 214 | .installed.cfg 215 | 216 | # Installer logs 217 | pip-log.txt 218 | 219 | # Unit test / coverage reports 220 | .coverage 221 | .tox 222 | 223 | #Translations 224 | *.mo 225 | 226 | #Mr Developer 227 | .mr.developer.cfg 228 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cabal 2 | p2p forum software 3 | 4 | cabal is a place where mesh conspirators can talk about p2p topics in a p2p way 5 | 6 | see [cabal-club](https://github.com/cabal-club) for active development 7 | 8 | ## usage 9 | Start a new instance: 10 | ``` 11 | node index.js --db --nick 12 | ``` 13 | 14 | Connect to an existing instance: 15 | ``` 16 | node index.js --key --nick 17 | ``` 18 | -------------------------------------------------------------------------------- /commands.js: -------------------------------------------------------------------------------- 1 | var util = require("./util.js") 2 | var through = require("through2") 3 | 4 | function Commander(view, cabal) { 5 | if (!(this instanceof Commander)) return new Commander(view, cabal) 6 | var self = this 7 | this.cabal = cabal 8 | this.channel = "default" 9 | this.view = view 10 | this.pattern = (/\/(\w*)\s*(.*)/) 11 | } 12 | 13 | Commander.prototype.process = function(line) { 14 | var self = this 15 | var match = self.pattern.exec(line) 16 | var cmd = match && match[1] || "" 17 | var arg = match && match[2] || "" 18 | arg = arg.trim() 19 | 20 | if (cmd === "put") { 21 | var [key, value] = arg.split("=") 22 | self.cabal.db.put(key, value, util.log) 23 | } else if (cmd === "list") { 24 | self.cabal.getChannels((err, channels) => { 25 | channels.map(self.view.writeLine.bind(self.view)) 26 | }) 27 | } else if (cmd === "chat") { 28 | if (arg !== '') { 29 | cabal.message(channel, arg) 30 | } 31 | } else if (cmd === "nick") { 32 | if (arg == '') return 33 | self.cabal.username = arg 34 | } else if (cmd === "get") { 35 | self.cabal.db.get(arg, console.log) 36 | } else if (cmd === "all") { 37 | var stream = cabal.db.createHistoryStream() 38 | stream.pipe(through.obj(function(chunk, enc, next) { 39 | console.log(chunk) 40 | next() 41 | })) 42 | } else if (cmd === "change") { 43 | if (arg == '') arg = 'what' 44 | self.channel = arg 45 | self.view.changeChannel(arg) 46 | } else if (cmd === "auth") { self.cabal.db.authorize(Buffer.from(arg, "hex"), util.log) 47 | } else if (cmd === "local") { console.log("local key is\n\t", self.cabal.db.local.key.toString("hex")) 48 | } else if (cmd === "db") { console.log("db key is\n\t", self.cabal.db.key.toString("hex")) 49 | } else if (cmd === "registered") { self.cabal.db.authorized(Buffer.from(arg, "hex"), util.log) 50 | } else { 51 | line = line.trim() 52 | if (line !== '') { 53 | cabal.message(self.channel, line) 54 | } 55 | } 56 | } 57 | 58 | function loadChannel(name) { 59 | var channel = `channels/${name}` 60 | // monitor(channel) 61 | interface.getMessages(channel, 25, (messages) => { 62 | messages.map((m) => { 63 | self.view.writeMessage.bind(self.view)(m) 64 | }) 65 | }) 66 | } 67 | 68 | module.exports = Commander 69 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var Cabal = require("../cabal-club/cabal-node/index.js") 2 | var cabalSwarm = require("../cabal-club/cabal-node/swarm.js") 3 | var frontend = require("./neat-screen.js") 4 | var minimist = require("minimist") 5 | 6 | var args = minimist(process.argv.slice(2)) 7 | 8 | if (!args.db) { 9 | if (args.key) { 10 | args.db = 'archives/' + args.key 11 | } else { 12 | console.error("error: need --db flag!\nexamples:\n\tnode index.js --db \n\tnode index.js --db my.db") 13 | return 14 | } 15 | } 16 | 17 | cabal = Cabal(args.db, args.key, {username: args.nick || "anonymous"}) 18 | 19 | cabal.db.on("ready", function() { 20 | frontend(cabal) 21 | var swarm = cabalSwarm(cabal) 22 | }) 23 | -------------------------------------------------------------------------------- /input.js: -------------------------------------------------------------------------------- 1 | var readline = require("readline") 2 | var through = require("through2") 3 | var Interface = require("./interface.js") 4 | var Screen = require("./neat-screen.js") 5 | var util = require("./util.js") 6 | 7 | function readInput(db, nick) { 8 | var rl = readline.createInterface({ 9 | input: process.stdin, 10 | output: process.stdout, 11 | terminal: false 12 | }) 13 | 14 | var currentChannel = "default" 15 | 16 | var interface = Interface(db) 17 | var screen = Screen(inputHandler) 18 | var watcher 19 | 20 | loadChannel(currentChannel) 21 | 22 | function inputHandler(state, bus) { 23 | state.messages = [] 24 | bus = bus 25 | state.channel = "default" 26 | bus.emit("render") 27 | console.log(screen) 28 | } 29 | 30 | function monitor(channel) { 31 | // if we monitor a new channel, destroy the old watcher first 32 | if (watcher) watcher.destroy() 33 | watcher = db.watch(channel, () => { 34 | interface.getMessages(channel, 25).then((msg) => { 35 | msg.map((m) => { 36 | screen.writeMessage.bind(screen)(m) 37 | }) 38 | }) 39 | }) 40 | } 41 | 42 | var pattern = (/\.(\w*)\s*(.*)/) 43 | rl.on("line", function(line) { 44 | }) 45 | 46 | function writeMessage(msg) { 47 | var channel = `channels/${currentChannel}` 48 | interface.writeMessage(channel, nick, msg) 49 | } 50 | 51 | function loadChannel(name) { 52 | var channel = `channels/${name}` 53 | monitor(channel) 54 | interface.getMessages(channel, 25).then((msg) => { 55 | msg.map((m) => { 56 | screen.writeMessage.bind(screen)(m) 57 | }) 58 | }) 59 | } 60 | } 61 | 62 | module.exports = readInput 63 | -------------------------------------------------------------------------------- /interface.js: -------------------------------------------------------------------------------- 1 | var util = require('./util.js') 2 | var through = require('through2') 3 | var concat = require('concat-stream') 4 | function Interface (db) { 5 | if (!(this instanceof Interface)) return new Interface(db) 6 | this.db = db 7 | } 8 | 9 | Interface.prototype.writeMessage = function (channel, nick, msg) { 10 | var self = this 11 | self.db.get(`${channel}/latest`, (err, node) => { 12 | node = node || {value: 0} 13 | var latest = parseInt(node.value) 14 | var newLatest = latest + 1 15 | self.db.put(`${channel}/${newLatest}`, {text: msg, author: nick, time: Date.now()}, (err, node) => { 16 | self.db.put(`${channel}/latest`, newLatest) 17 | }) 18 | }) 19 | } 20 | 21 | var channelPattern = /channels\/(.*)\/.*/ 22 | Interface.prototype.getChannels = function () { 23 | var self = this 24 | return new Promise((resolve, reject) => { 25 | var stream = self.db.createReadStream('channels') 26 | var concatStream = concat((data) => { 27 | var channels = {} 28 | data.forEach((d) => { 29 | var match = channelPattern.exec(d) 30 | if (match && match[1]) { 31 | channels[match[1]] = true 32 | } 33 | }) 34 | resolve(Object.keys(channels)) 35 | }) 36 | 37 | stream 38 | .pipe(through.obj(function (chunk, enc, next) { 39 | if (chunk.key.slice(-6) !== 'latest') this.push([chunk.key]) 40 | next() 41 | })) 42 | .pipe(concatStream) 43 | }) 44 | } 45 | 46 | Interface.prototype.test = function () { 47 | var self = this 48 | var stream = self.db.createReadStream('data') 49 | stream 50 | .pipe(through.obj(function (chunk, enc, next) { 51 | this.push(chunk.value) 52 | next() 53 | })) 54 | .pipe(process.stdout) 55 | 56 | self.db.list('data', (arr) => { 57 | console.log('DB.LIST') 58 | console.log(arr) 59 | }) 60 | } 61 | 62 | Interface.prototype.getMessages = function (channel, max) { 63 | var self = this 64 | return new Promise((resolve, reject) => { 65 | self.db.get(`${channel}/latest`, (err, node) => { 66 | if (!node) return 67 | var latest = node.value 68 | var messagePromises = [] 69 | for (var i = 0; i < max; i++) { 70 | if (latest - i < 1) break 71 | var promise = getMessage(latest - i, channel) 72 | messagePromises.push(promise) 73 | } 74 | 75 | function getMessage (time, channel) { 76 | return new Promise((resolve, reject) => { 77 | self.db.get(`${channel}/${time}`, (err, node) => { 78 | if (err) reject(err) 79 | resolve(node) 80 | }) 81 | }) 82 | } 83 | 84 | messagePromises.reverse() 85 | Promise.all(messagePromises).then((messages) => { 86 | resolve(messages) 87 | }) 88 | }) 89 | }) 90 | } 91 | module.exports = Interface 92 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cabal", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-diff": { 8 | "version": "1.1.0", 9 | "resolved": "https://registry.npmjs.org/ansi-diff/-/ansi-diff-1.1.0.tgz", 10 | "integrity": "sha512-fBcvTGkqVSdJNEBk6mL+1FCcbfI5pyWARjHdM4pfLpHeJUfOmN4SIJ4XWGEzKJNYBATbEOISTLuGAX9jqSrpFA==", 11 | "requires": { 12 | "ansi-split": "1.0.1" 13 | } 14 | }, 15 | "ansi-regex": { 16 | "version": "3.0.0", 17 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 18 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 19 | }, 20 | "ansi-split": { 21 | "version": "1.0.1", 22 | "resolved": "https://registry.npmjs.org/ansi-split/-/ansi-split-1.0.1.tgz", 23 | "integrity": "sha512-RRxQym4DFtDNmHIkW6aeFVvrXURb11lGAEPXNiryjCe8bK8RsANjzJ0M2aGOkvBYwP4Bl/xZ8ijtr6D3j1x/eg==", 24 | "requires": { 25 | "ansi-regex": "3.0.0" 26 | } 27 | }, 28 | "array-lru": { 29 | "version": "1.1.1", 30 | "resolved": "https://registry.npmjs.org/array-lru/-/array-lru-1.1.1.tgz", 31 | "integrity": "sha1-DH4bTgIq4Wb/HoRIxZXzGB/NMzc=" 32 | }, 33 | "atomic-batcher": { 34 | "version": "1.0.2", 35 | "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", 36 | "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" 37 | }, 38 | "bencode": { 39 | "version": "1.0.0", 40 | "resolved": "https://registry.npmjs.org/bencode/-/bencode-1.0.0.tgz", 41 | "integrity": "sha512-N+VOSP5MkoX+xgnp6Y056iCY5TmCZg9rgPNPQe0bIiXchxYFP4vs/Tf0dTdQ+qQhP7HM2gvfFq+sUVjQsGy5Zw==", 42 | "requires": { 43 | "safe-buffer": "5.1.2" 44 | } 45 | }, 46 | "bitfield-rle": { 47 | "version": "2.1.0", 48 | "resolved": "https://registry.npmjs.org/bitfield-rle/-/bitfield-rle-2.1.0.tgz", 49 | "integrity": "sha1-rinpOCp7pImN6fSLsj/TOMT73Pg=", 50 | "requires": { 51 | "varint": "4.0.1" 52 | }, 53 | "dependencies": { 54 | "varint": { 55 | "version": "4.0.1", 56 | "resolved": "https://registry.npmjs.org/varint/-/varint-4.0.1.tgz", 57 | "integrity": "sha1-SQgpuULSSEY7KzUJeZXDv3NxmOk=" 58 | } 59 | } 60 | }, 61 | "bittorrent-dht": { 62 | "version": "7.10.0", 63 | "resolved": "https://registry.npmjs.org/bittorrent-dht/-/bittorrent-dht-7.10.0.tgz", 64 | "integrity": "sha512-fvb6M58Ceiv/S94nu6zeaiMoJvUYOeIqRbgaClm+kJTzCAqJPtAR/31pXNYB5iEReOoKqQB5zY33gY0W6ZRWQQ==", 65 | "requires": { 66 | "bencode": "1.0.0", 67 | "buffer-equals": "1.0.4", 68 | "debug": "3.1.0", 69 | "inherits": "2.0.3", 70 | "k-bucket": "3.3.1", 71 | "k-rpc": "4.3.1", 72 | "lru": "3.1.0", 73 | "randombytes": "2.0.6", 74 | "safe-buffer": "5.1.2", 75 | "simple-sha1": "2.1.0" 76 | }, 77 | "dependencies": { 78 | "debug": { 79 | "version": "3.1.0", 80 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 81 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 82 | "requires": { 83 | "ms": "2.0.0" 84 | } 85 | } 86 | } 87 | }, 88 | "blake2b": { 89 | "version": "2.1.2", 90 | "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.2.tgz", 91 | "integrity": "sha1-aIDt3KNc/t6SxPsnJCITNPmJFFo=", 92 | "requires": { 93 | "blake2b-wasm": "1.1.7", 94 | "nanoassert": "1.1.0" 95 | } 96 | }, 97 | "blake2b-wasm": { 98 | "version": "1.1.7", 99 | "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", 100 | "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", 101 | "requires": { 102 | "nanoassert": "1.1.0" 103 | } 104 | }, 105 | "buffer-alloc": { 106 | "version": "1.1.0", 107 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz", 108 | "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", 109 | "requires": { 110 | "buffer-alloc-unsafe": "0.1.1", 111 | "buffer-fill": "0.1.1" 112 | }, 113 | "dependencies": { 114 | "buffer-alloc-unsafe": { 115 | "version": "0.1.1", 116 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz", 117 | "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=" 118 | } 119 | } 120 | }, 121 | "buffer-alloc-unsafe": { 122 | "version": "1.0.0", 123 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.0.0.tgz", 124 | "integrity": "sha1-R0qojzTnvHX6MR0uZFdAnFhGw/4=" 125 | }, 126 | "buffer-equals": { 127 | "version": "1.0.4", 128 | "resolved": "https://registry.npmjs.org/buffer-equals/-/buffer-equals-1.0.4.tgz", 129 | "integrity": "sha1-A1O1T9B/2VZBcGca5vZrnPENJ/U=" 130 | }, 131 | "buffer-fill": { 132 | "version": "0.1.1", 133 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz", 134 | "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==" 135 | }, 136 | "buffer-from": { 137 | "version": "1.0.0", 138 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", 139 | "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" 140 | }, 141 | "bulk-write-stream": { 142 | "version": "1.1.4", 143 | "resolved": "https://registry.npmjs.org/bulk-write-stream/-/bulk-write-stream-1.1.4.tgz", 144 | "integrity": "sha512-GtKwd/4etuk1hNeprXoESBO1RSeRYJMXKf+O0qHmWdUomLT8ysNEfX/4bZFXr3BK6eukpHiEnhY2uMtEHDM2ng==", 145 | "requires": { 146 | "buffer-from": "1.0.0", 147 | "inherits": "2.0.3", 148 | "readable-stream": "2.3.6" 149 | } 150 | }, 151 | "circular-append-file": { 152 | "version": "1.0.1", 153 | "resolved": "https://registry.npmjs.org/circular-append-file/-/circular-append-file-1.0.1.tgz", 154 | "integrity": "sha512-BUDFvrBTCdeVhg9E05PX4XgMegk6xWB69uGwyuATEg7PMfa9lGU1mzFSK0xWNW2O0i9CAQHN0oIdXI/kI2hPkg==", 155 | "requires": { 156 | "multistream": "2.1.0" 157 | } 158 | }, 159 | "codecs": { 160 | "version": "1.2.1", 161 | "resolved": "https://registry.npmjs.org/codecs/-/codecs-1.2.1.tgz", 162 | "integrity": "sha512-SPnx+ZHXVJ0qTInRXmnxuyu8PDvSzvop5MXp1BOr/urFQI3yL2n5ewE755skTklF/hKVlWj8cinGxdR2gvLvTA==" 163 | }, 164 | "concat-stream": { 165 | "version": "1.6.2", 166 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 167 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 168 | "requires": { 169 | "buffer-from": "1.0.0", 170 | "inherits": "2.0.3", 171 | "readable-stream": "2.3.6", 172 | "typedarray": "0.0.6" 173 | } 174 | }, 175 | "connections": { 176 | "version": "1.4.2", 177 | "resolved": "https://registry.npmjs.org/connections/-/connections-1.4.2.tgz", 178 | "integrity": "sha1-eJBIK/XHGvbFyhkr4xNq7XRCiq0=" 179 | }, 180 | "core-util-is": { 181 | "version": "1.0.2", 182 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 183 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 184 | }, 185 | "dat-swarm-defaults": { 186 | "version": "1.0.1", 187 | "resolved": "https://registry.npmjs.org/dat-swarm-defaults/-/dat-swarm-defaults-1.0.1.tgz", 188 | "integrity": "sha512-T2WlO7BVmN9USchefsP8entQiByIlJLGuzHLL9qEqOBkyKB8p0Y7XPWxP8dcL43+SkeoxU5NVe7O0bsi3xL8Jg==", 189 | "requires": { 190 | "xtend": "4.0.1" 191 | } 192 | }, 193 | "debug": { 194 | "version": "2.6.9", 195 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 196 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 197 | "requires": { 198 | "ms": "2.0.0" 199 | } 200 | }, 201 | "diffy": { 202 | "version": "2.0.0", 203 | "resolved": "https://registry.npmjs.org/diffy/-/diffy-2.0.0.tgz", 204 | "integrity": "sha512-T1+MF7chaOtNaBeV59td6lYlci6dCTUraySH8LDltafhd+FLTsYpJJbLVpl6S4ih6kPFMaHSIqQ92bRVvoE+3Q==", 205 | "requires": { 206 | "ansi-diff": "1.1.0", 207 | "neat-input": "1.6.0" 208 | } 209 | }, 210 | "discovery-channel": { 211 | "version": "5.5.1", 212 | "resolved": "https://registry.npmjs.org/discovery-channel/-/discovery-channel-5.5.1.tgz", 213 | "integrity": "sha512-EEmZQFE0PiOsJj7G3KVCwFGbYs4QchUvzA91iHtZ6HfkIqfBEDSTGLygJrUlY1Tr77WDV+qZVrZuNghHxSL/vw==", 214 | "requires": { 215 | "bittorrent-dht": "7.10.0", 216 | "buffer-from": "1.0.0", 217 | "debug": "2.6.9", 218 | "dns-discovery": "6.1.0", 219 | "pretty-hash": "1.0.1", 220 | "thunky": "0.1.0" 221 | } 222 | }, 223 | "discovery-swarm": { 224 | "version": "5.1.1", 225 | "resolved": "https://registry.npmjs.org/discovery-swarm/-/discovery-swarm-5.1.1.tgz", 226 | "integrity": "sha512-r38993qP/fcuAlNLSOwGZUps1inzNA4wXkIkv/piwFDseyIWNjYyk/4DHGxyf/bWMB86gPWIUdA6AhydkWmgdA==", 227 | "requires": { 228 | "buffer-equals": "1.0.4", 229 | "connections": "1.4.2", 230 | "debug": "2.6.9", 231 | "discovery-channel": "5.5.1", 232 | "length-prefixed-message": "3.0.3", 233 | "pump": "1.0.3", 234 | "to-buffer": "1.1.1", 235 | "utp-native": "1.7.1" 236 | } 237 | }, 238 | "dns-discovery": { 239 | "version": "6.1.0", 240 | "resolved": "https://registry.npmjs.org/dns-discovery/-/dns-discovery-6.1.0.tgz", 241 | "integrity": "sha512-Kl2tL2zuNR1w6SnsoRaqrOFm7gGP3/i/HzRXtyVBqaOq/5L1D2TUdViUAZ8e/NDbt+jQCJFWoaKCnmDC343usQ==", 242 | "requires": { 243 | "circular-append-file": "1.0.1", 244 | "debug": "2.6.9", 245 | "dns-socket": "3.0.0", 246 | "lru": "2.0.1", 247 | "minimist": "1.2.0", 248 | "multicast-dns": "7.0.0", 249 | "network-address": "1.1.2", 250 | "pump": "3.0.0", 251 | "speedometer": "1.0.0", 252 | "unordered-set": "1.1.0" 253 | }, 254 | "dependencies": { 255 | "lru": { 256 | "version": "2.0.1", 257 | "resolved": "https://registry.npmjs.org/lru/-/lru-2.0.1.tgz", 258 | "integrity": "sha1-+XmHHhYuP1yiVL5GhExT1MU2RUQ=", 259 | "requires": { 260 | "inherits": "2.0.3" 261 | } 262 | }, 263 | "pump": { 264 | "version": "3.0.0", 265 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 266 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 267 | "requires": { 268 | "end-of-stream": "1.4.1", 269 | "once": "1.4.0" 270 | } 271 | } 272 | } 273 | }, 274 | "dns-packet": { 275 | "version": "4.2.0", 276 | "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz", 277 | "integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==", 278 | "requires": { 279 | "ip": "1.1.5", 280 | "safe-buffer": "5.1.2" 281 | } 282 | }, 283 | "dns-socket": { 284 | "version": "3.0.0", 285 | "resolved": "https://registry.npmjs.org/dns-socket/-/dns-socket-3.0.0.tgz", 286 | "integrity": "sha512-M0WkByoJ/mTm+HtwBQLsRJPe5uGIC/lYVOp+s6ZzhbZ5iq4GxjFyxYPQhB85dgCLvVb43aJQXHDC9aUgyKGc/Q==", 287 | "requires": { 288 | "dns-packet": "4.2.0" 289 | } 290 | }, 291 | "end-of-stream": { 292 | "version": "1.4.1", 293 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 294 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 295 | "requires": { 296 | "once": "1.4.0" 297 | } 298 | }, 299 | "flat-tree": { 300 | "version": "1.6.0", 301 | "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.6.0.tgz", 302 | "integrity": "sha1-/KMM3bkAb7ZW6168ea6ydOf96e0=" 303 | }, 304 | "from2": { 305 | "version": "2.3.0", 306 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 307 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 308 | "requires": { 309 | "inherits": "2.0.3", 310 | "readable-stream": "2.3.6" 311 | } 312 | }, 313 | "hypercore": { 314 | "version": "6.14.0", 315 | "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-6.14.0.tgz", 316 | "integrity": "sha512-cM7IqW37u7JmG79yeaoaFuCMz7IEk+v/aQsnWrYo0HHTubRs36R28PoKVQykb9jcF7F7g6GT+yxTO+yG/hwe6Q==", 317 | "requires": { 318 | "array-lru": "1.1.1", 319 | "atomic-batcher": "1.0.2", 320 | "bitfield-rle": "2.1.0", 321 | "buffer-alloc-unsafe": "1.0.0", 322 | "buffer-equals": "1.0.4", 323 | "buffer-from": "1.0.0", 324 | "bulk-write-stream": "1.1.4", 325 | "codecs": "1.2.1", 326 | "flat-tree": "1.6.0", 327 | "from2": "2.3.0", 328 | "hypercore-protocol": "6.6.4", 329 | "inherits": "2.0.3", 330 | "last-one-wins": "1.0.4", 331 | "memory-pager": "1.1.0", 332 | "merkle-tree-stream": "3.0.3", 333 | "process-nextick-args": "1.0.7", 334 | "random-access-file": "2.0.1", 335 | "sodium-universal": "2.0.0", 336 | "sparse-bitfield": "3.0.3", 337 | "thunky": "1.0.2", 338 | "uint64be": "2.0.2", 339 | "unordered-array-remove": "1.0.2", 340 | "unordered-set": "2.0.0" 341 | }, 342 | "dependencies": { 343 | "process-nextick-args": { 344 | "version": "1.0.7", 345 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 346 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 347 | }, 348 | "thunky": { 349 | "version": "1.0.2", 350 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", 351 | "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" 352 | }, 353 | "unordered-set": { 354 | "version": "2.0.0", 355 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.0.tgz", 356 | "integrity": "sha1-mFon6XW6oguCY66np5HpMAlBqew=" 357 | } 358 | } 359 | }, 360 | "hypercore-protocol": { 361 | "version": "6.6.4", 362 | "resolved": "https://registry.npmjs.org/hypercore-protocol/-/hypercore-protocol-6.6.4.tgz", 363 | "integrity": "sha512-9TU7P+uve0e5v1ZiBx70DFhkpepW4iNSGYlZthK+Unm0EbZ+Yppc6clH7JTffPBNUMSnDrE552MfXMilpCHZMw==", 364 | "requires": { 365 | "buffer-alloc-unsafe": "1.0.0", 366 | "buffer-from": "1.0.0", 367 | "inherits": "2.0.3", 368 | "protocol-buffers-encodings": "1.1.0", 369 | "readable-stream": "2.3.6", 370 | "sodium-universal": "2.0.0", 371 | "sorted-indexof": "1.0.0", 372 | "varint": "5.0.0" 373 | }, 374 | "dependencies": { 375 | "varint": { 376 | "version": "5.0.0", 377 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 378 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 379 | } 380 | } 381 | }, 382 | "hyperdb": { 383 | "version": "git+https://github.com/mafintosh/hyperdb.git#5e22cb1a3c64ed8b7a236fd5918276624a361439", 384 | "requires": { 385 | "array-lru": "1.1.1", 386 | "bulk-write-stream": "1.1.4", 387 | "codecs": "1.2.1", 388 | "hypercore": "6.14.0", 389 | "hypercore-protocol": "6.6.4", 390 | "inherits": "2.0.3", 391 | "mutexify": "1.2.0", 392 | "nanoiterator": "1.1.0", 393 | "protocol-buffers-encodings": "1.1.0", 394 | "random-access-file": "2.0.1", 395 | "sodium-universal": "2.0.0", 396 | "thunky": "1.0.2", 397 | "unordered-array-remove": "1.0.2", 398 | "unordered-set": "2.0.0", 399 | "varint": "5.0.0" 400 | }, 401 | "dependencies": { 402 | "thunky": { 403 | "version": "1.0.2", 404 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", 405 | "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" 406 | }, 407 | "unordered-set": { 408 | "version": "2.0.0", 409 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.0.tgz", 410 | "integrity": "sha1-mFon6XW6oguCY66np5HpMAlBqew=" 411 | }, 412 | "varint": { 413 | "version": "5.0.0", 414 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 415 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 416 | } 417 | } 418 | }, 419 | "inherits": { 420 | "version": "2.0.3", 421 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 422 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 423 | }, 424 | "ini": { 425 | "version": "1.3.5", 426 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 427 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 428 | "optional": true 429 | }, 430 | "ip": { 431 | "version": "1.1.5", 432 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 433 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 434 | }, 435 | "isarray": { 436 | "version": "1.0.0", 437 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 438 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 439 | }, 440 | "k-bucket": { 441 | "version": "3.3.1", 442 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-3.3.1.tgz", 443 | "integrity": "sha512-kgwWqYT79rAahn4maIVTP8dIe+m1KulufWW+f1bB9DlZrRFiGpZ4iJOg2HUp4xJYBWONP3+rOPIWF/RXABU6mw==", 444 | "requires": { 445 | "buffer-equals": "1.0.4", 446 | "inherits": "2.0.3", 447 | "randombytes": "2.0.6" 448 | } 449 | }, 450 | "k-rpc": { 451 | "version": "4.3.1", 452 | "resolved": "https://registry.npmjs.org/k-rpc/-/k-rpc-4.3.1.tgz", 453 | "integrity": "sha512-mgAJZeFYbpP0xzJzmS0TQTYoFI0sjy3GnKFhg8wyboL+KvWg2WLaA2Oy9PthLPx2Rxz4WeBMk4y3MSOrDJ95FA==", 454 | "requires": { 455 | "buffer-equals": "1.0.4", 456 | "k-bucket": "4.0.1", 457 | "k-rpc-socket": "1.8.0", 458 | "randombytes": "2.0.6", 459 | "safe-buffer": "5.1.2" 460 | }, 461 | "dependencies": { 462 | "k-bucket": { 463 | "version": "4.0.1", 464 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-4.0.1.tgz", 465 | "integrity": "sha512-YvDpmY3waI999h1zZoW1rJ04fZrgZ+5PAlVmvwDHT6YO/Q1AOhdel07xsKy9eAvJjQ9xZV1wz3rXKqEfaWvlcQ==", 466 | "requires": { 467 | "inherits": "2.0.3", 468 | "randombytes": "2.0.6" 469 | } 470 | } 471 | } 472 | }, 473 | "k-rpc-socket": { 474 | "version": "1.8.0", 475 | "resolved": "https://registry.npmjs.org/k-rpc-socket/-/k-rpc-socket-1.8.0.tgz", 476 | "integrity": "sha512-f/9TynsO8YYjZ6JjNNtSSH7CJcIHcio1buy3zqByGxb/GX8AWLdL6FZEWTrN8V3/J7W4/E0ZTQQ+Jt2rVq7ELg==", 477 | "requires": { 478 | "bencode": "2.0.0", 479 | "buffer-equals": "1.0.4", 480 | "safe-buffer": "5.1.2" 481 | }, 482 | "dependencies": { 483 | "bencode": { 484 | "version": "2.0.0", 485 | "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.0.tgz", 486 | "integrity": "sha512-wr2HwwrUpfB5c68zmAudOltC7rZ1G0+lQOcnuEcfIM3AWAVnB3rHI3nlgd/2CWTfQ3w3zagKt89zni/M+VLZ8g==", 487 | "requires": { 488 | "safe-buffer": "5.1.2" 489 | } 490 | } 491 | } 492 | }, 493 | "keypress": { 494 | "version": "0.2.1", 495 | "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", 496 | "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=" 497 | }, 498 | "last-one-wins": { 499 | "version": "1.0.4", 500 | "resolved": "https://registry.npmjs.org/last-one-wins/-/last-one-wins-1.0.4.tgz", 501 | "integrity": "sha1-wb/Qy8tGeQ7JFWuNGu6Py4bNoio=" 502 | }, 503 | "length-prefixed-message": { 504 | "version": "3.0.3", 505 | "resolved": "https://registry.npmjs.org/length-prefixed-message/-/length-prefixed-message-3.0.3.tgz", 506 | "integrity": "sha1-JFR01pq8BhTco2jcNaqAdJgqI6w=", 507 | "requires": { 508 | "varint": "3.0.1" 509 | } 510 | }, 511 | "lodash.throttle": { 512 | "version": "4.1.1", 513 | "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", 514 | "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" 515 | }, 516 | "lru": { 517 | "version": "3.1.0", 518 | "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", 519 | "integrity": "sha1-6n+4VG2DczOWoTCR12z+tMBoN9U=", 520 | "requires": { 521 | "inherits": "2.0.3" 522 | } 523 | }, 524 | "memory-pager": { 525 | "version": "1.1.0", 526 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.1.0.tgz", 527 | "integrity": "sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==" 528 | }, 529 | "merkle-tree-stream": { 530 | "version": "3.0.3", 531 | "resolved": "https://registry.npmjs.org/merkle-tree-stream/-/merkle-tree-stream-3.0.3.tgz", 532 | "integrity": "sha1-+KBkdg0355eK1fn208EZpJT1cIE=", 533 | "requires": { 534 | "flat-tree": "1.6.0", 535 | "readable-stream": "2.3.6" 536 | } 537 | }, 538 | "minimist": { 539 | "version": "1.2.0", 540 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 541 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 542 | }, 543 | "mkdirp": { 544 | "version": "0.5.1", 545 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 546 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 547 | "requires": { 548 | "minimist": "0.0.8" 549 | }, 550 | "dependencies": { 551 | "minimist": { 552 | "version": "0.0.8", 553 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 554 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 555 | } 556 | } 557 | }, 558 | "ms": { 559 | "version": "2.0.0", 560 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 561 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 562 | }, 563 | "multicast-dns": { 564 | "version": "7.0.0", 565 | "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.0.0.tgz", 566 | "integrity": "sha512-BqB5TtIXHo+8gN33N1CA1clsvPsAJlnc6D49SzfQA0xq75cxj15g2y9NaRdf4x2u4v1P66PBC+Wg6YgPO5Bc/g==", 567 | "requires": { 568 | "dns-packet": "4.2.0", 569 | "thunky": "1.0.2" 570 | }, 571 | "dependencies": { 572 | "thunky": { 573 | "version": "1.0.2", 574 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", 575 | "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=" 576 | } 577 | } 578 | }, 579 | "multistream": { 580 | "version": "2.1.0", 581 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.0.tgz", 582 | "integrity": "sha1-YlwmfVxEQkrWKUeItbtNo9yzLx0=", 583 | "requires": { 584 | "inherits": "2.0.3", 585 | "readable-stream": "2.3.6" 586 | } 587 | }, 588 | "mutexify": { 589 | "version": "1.2.0", 590 | "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.2.0.tgz", 591 | "integrity": "sha512-oprzxd2zhfrJqEuB98qc1dRMMonClBQ57UPDjnbcrah4orEMTq1jq3+AcdFe5ePzdbJXI7zmdhfftIdMnhYFoQ==" 592 | }, 593 | "nan": { 594 | "version": "2.10.0", 595 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 596 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 597 | "optional": true 598 | }, 599 | "nanoassert": { 600 | "version": "1.1.0", 601 | "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", 602 | "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" 603 | }, 604 | "nanobus": { 605 | "version": "4.3.3", 606 | "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.3.3.tgz", 607 | "integrity": "sha512-4/uzl+LkMGoVv/9eMzH2QFvefmlJErT0KR7EmuYbmht2QvxSEqTjhFFOZ/KHE6chH58fKL3njrOcEwbYV0h9Yw==", 608 | "requires": { 609 | "nanotiming": "7.3.1", 610 | "remove-array-items": "1.0.0" 611 | } 612 | }, 613 | "nanoiterator": { 614 | "version": "1.1.0", 615 | "resolved": "https://registry.npmjs.org/nanoiterator/-/nanoiterator-1.1.0.tgz", 616 | "integrity": "sha512-vRVHypQzmaqLrYDjjPEJIhhHvqjHTJvaj0o4A/oC5zckiejgWfbjwfTRIKppwRPJWge+elquBnWsbpvp/bHDMg==", 617 | "requires": { 618 | "inherits": "2.0.3", 619 | "readable-stream": "2.3.6" 620 | } 621 | }, 622 | "nanoscheduler": { 623 | "version": "1.0.3", 624 | "resolved": "https://registry.npmjs.org/nanoscheduler/-/nanoscheduler-1.0.3.tgz", 625 | "integrity": "sha512-jBbrF3qdU9321r8n9X7yu18DjP31Do2ItJm3mWrt90wJTrnDO+HXpoV7ftaUglAtjgj9s+OaCxGufbvx6pvbEQ==", 626 | "requires": { 627 | "nanoassert": "1.1.0" 628 | } 629 | }, 630 | "nanotiming": { 631 | "version": "7.3.1", 632 | "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-7.3.1.tgz", 633 | "integrity": "sha512-l3lC7v/PfOuRWQa8vV29Jo6TG10wHtnthLElFXs4Te4Aas57Fo4n1Q8LH9n+NDh9riOzTVvb2QNBhTS4JUKNjw==", 634 | "requires": { 635 | "nanoassert": "1.1.0", 636 | "nanoscheduler": "1.0.3" 637 | } 638 | }, 639 | "neat-input": { 640 | "version": "1.6.0", 641 | "resolved": "https://registry.npmjs.org/neat-input/-/neat-input-1.6.0.tgz", 642 | "integrity": "sha512-dJaltkLgdicolTE7mJbhQXg2EqKvX3howrrlrOBrlEOmkvj1RqkRkRV5iVEQhNVDzLYSfRF59B5pWLl0SFWdJg==", 643 | "requires": { 644 | "keypress": "0.2.1" 645 | } 646 | }, 647 | "neat-log": { 648 | "version": "2.4.0", 649 | "resolved": "https://registry.npmjs.org/neat-log/-/neat-log-2.4.0.tgz", 650 | "integrity": "sha512-5Gb0J17bqRxKBfgetrYCZav7kpFgunDhFq0i+kEq5Kn36Cuw4IskIl3yd+/P8jCcAzaKrQ7mrb+p6r/NP5esWA==", 651 | "requires": { 652 | "diffy": "2.0.0", 653 | "lodash.throttle": "4.1.1", 654 | "nanobus": "4.3.3" 655 | } 656 | }, 657 | "network-address": { 658 | "version": "1.1.2", 659 | "resolved": "https://registry.npmjs.org/network-address/-/network-address-1.1.2.tgz", 660 | "integrity": "sha1-Sqe/1D8D8LgclwKxPWqFjdsybz4=" 661 | }, 662 | "node-gyp-build": { 663 | "version": "3.3.0", 664 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.3.0.tgz", 665 | "integrity": "sha512-SNtBzznpPggc7mY8XTfnYBywd9OGN99bwnxGKFqud9erYJMbwnJn6B8HXER2dy8iOYr6Nf2SzBQoJjV8gdM4Nw==", 666 | "optional": true 667 | }, 668 | "once": { 669 | "version": "1.4.0", 670 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 671 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 672 | "requires": { 673 | "wrappy": "1.0.2" 674 | } 675 | }, 676 | "pretty-hash": { 677 | "version": "1.0.1", 678 | "resolved": "https://registry.npmjs.org/pretty-hash/-/pretty-hash-1.0.1.tgz", 679 | "integrity": "sha1-FuBXkYje9WvbVliSvNBaXWUySAc=" 680 | }, 681 | "process-nextick-args": { 682 | "version": "2.0.0", 683 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 684 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 685 | }, 686 | "protocol-buffers-encodings": { 687 | "version": "1.1.0", 688 | "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.1.0.tgz", 689 | "integrity": "sha512-SmjEuAf3hc3h3rWZ6V1YaaQw2MNJWK848gLJgzx/sefOJdNLujKinJVXIS0q2cBQpQn2Q32TinawZyDZPzm4kQ==", 690 | "requires": { 691 | "signed-varint": "2.0.1", 692 | "varint": "5.0.0" 693 | }, 694 | "dependencies": { 695 | "varint": { 696 | "version": "5.0.0", 697 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 698 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 699 | } 700 | } 701 | }, 702 | "pump": { 703 | "version": "1.0.3", 704 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 705 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 706 | "requires": { 707 | "end-of-stream": "1.4.1", 708 | "once": "1.4.0" 709 | } 710 | }, 711 | "random-access-file": { 712 | "version": "2.0.1", 713 | "resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-2.0.1.tgz", 714 | "integrity": "sha512-nb4fClpzoUY+v1SHrro+9yykN90eMA1rc+xM39tnZ5R3BgFY+J/NxPZ0KuUpishEsvnwou9Fvm2wa3cjeuG7vg==", 715 | "requires": { 716 | "mkdirp": "0.5.1", 717 | "random-access-storage": "1.2.0" 718 | } 719 | }, 720 | "random-access-storage": { 721 | "version": "1.2.0", 722 | "resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-1.2.0.tgz", 723 | "integrity": "sha512-KASq0p0d4Tri71p1w9+gvKBhUpjt9/9TGtVMschfwNjdw93rZFnKlsZ+4CKFq/qi2GvdobIFLu0CjnQpfsr05Q==", 724 | "requires": { 725 | "inherits": "2.0.3" 726 | } 727 | }, 728 | "randombytes": { 729 | "version": "2.0.6", 730 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 731 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 732 | "requires": { 733 | "safe-buffer": "5.1.2" 734 | } 735 | }, 736 | "readable-stream": { 737 | "version": "2.3.6", 738 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 739 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 740 | "requires": { 741 | "core-util-is": "1.0.2", 742 | "inherits": "2.0.3", 743 | "isarray": "1.0.0", 744 | "process-nextick-args": "2.0.0", 745 | "safe-buffer": "5.1.2", 746 | "string_decoder": "1.1.1", 747 | "util-deprecate": "1.0.2" 748 | } 749 | }, 750 | "remove-array-items": { 751 | "version": "1.0.0", 752 | "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.0.0.tgz", 753 | "integrity": "sha1-B79CyzMvTPboXq2DteToltIyayE=" 754 | }, 755 | "rusha": { 756 | "version": "0.8.13", 757 | "resolved": "https://registry.npmjs.org/rusha/-/rusha-0.8.13.tgz", 758 | "integrity": "sha1-mghOe4YLF7/zAVuSxnpqM2GRUTo=" 759 | }, 760 | "safe-buffer": { 761 | "version": "5.1.2", 762 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 763 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 764 | }, 765 | "signed-varint": { 766 | "version": "2.0.1", 767 | "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz", 768 | "integrity": "sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk=", 769 | "requires": { 770 | "varint": "5.0.0" 771 | }, 772 | "dependencies": { 773 | "varint": { 774 | "version": "5.0.0", 775 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz", 776 | "integrity": "sha1-2Ca4n3SQcy+rwMDtaT7Uddyynr8=" 777 | } 778 | } 779 | }, 780 | "simple-sha1": { 781 | "version": "2.1.0", 782 | "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.0.tgz", 783 | "integrity": "sha1-lCe7lv8SY8wQqEFM7dUaGLkZ6LM=", 784 | "requires": { 785 | "rusha": "0.8.13" 786 | } 787 | }, 788 | "siphash24": { 789 | "version": "1.1.0", 790 | "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.0.tgz", 791 | "integrity": "sha512-nDCEEZKb6m7OxxG/5wwaLy2R+KpyLcOnGjTJlFXG+14FUmpDD1FCFV/MjsYATjShsqPkSkl1BVevI0TCehdsTw==", 792 | "requires": { 793 | "nanoassert": "1.1.0" 794 | } 795 | }, 796 | "sodium-javascript": { 797 | "version": "0.5.5", 798 | "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.5.tgz", 799 | "integrity": "sha512-UMmCHovws/sxIBZsIRhIl8uRPou/RFDD0vVop81T1hG106NLLgqajKKuHAOtAP6hflnZ0UrVA2VFwddTd/NQyA==", 800 | "requires": { 801 | "blake2b": "2.1.2", 802 | "nanoassert": "1.1.0", 803 | "siphash24": "1.1.0", 804 | "xsalsa20": "1.0.2" 805 | } 806 | }, 807 | "sodium-native": { 808 | "version": "2.1.6", 809 | "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-2.1.6.tgz", 810 | "integrity": "sha512-vfovcNlU8C93SbeNoGSAdW5zVOTlrh1sTy+TzdC2FhDTE/IUK6j4ML5gdr/qziLz4XRT4EQWJvbFzql6CAAH/A==", 811 | "optional": true, 812 | "requires": { 813 | "ini": "1.3.5", 814 | "nan": "2.10.0", 815 | "node-gyp-build": "3.3.0" 816 | } 817 | }, 818 | "sodium-universal": { 819 | "version": "2.0.0", 820 | "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-2.0.0.tgz", 821 | "integrity": "sha512-csdVyakzHJRyCevY4aZC2Eacda8paf+4nmRGF2N7KxCLKY2Ajn72JsExaQlJQ2BiXJncp44p3T+b80cU+2TTsg==", 822 | "requires": { 823 | "sodium-javascript": "0.5.5", 824 | "sodium-native": "2.1.6" 825 | } 826 | }, 827 | "sorted-indexof": { 828 | "version": "1.0.0", 829 | "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", 830 | "integrity": "sha1-F8dC/3zxh+L1mhXfm4HxemLOCJk=" 831 | }, 832 | "sparse-bitfield": { 833 | "version": "3.0.3", 834 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 835 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 836 | "requires": { 837 | "memory-pager": "1.1.0" 838 | } 839 | }, 840 | "speedometer": { 841 | "version": "1.0.0", 842 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", 843 | "integrity": "sha1-zWccsGdSwivKM3Di8zREC+T8YuI=" 844 | }, 845 | "strftime": { 846 | "version": "0.10.0", 847 | "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", 848 | "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" 849 | }, 850 | "string_decoder": { 851 | "version": "1.1.1", 852 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 853 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 854 | "requires": { 855 | "safe-buffer": "5.1.2" 856 | } 857 | }, 858 | "through2": { 859 | "version": "2.0.3", 860 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 861 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 862 | "requires": { 863 | "readable-stream": "2.3.6", 864 | "xtend": "4.0.1" 865 | } 866 | }, 867 | "thunky": { 868 | "version": "0.1.0", 869 | "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", 870 | "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=" 871 | }, 872 | "to-buffer": { 873 | "version": "1.1.1", 874 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 875 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" 876 | }, 877 | "typedarray": { 878 | "version": "0.0.6", 879 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 880 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 881 | }, 882 | "uint64be": { 883 | "version": "2.0.2", 884 | "resolved": "https://registry.npmjs.org/uint64be/-/uint64be-2.0.2.tgz", 885 | "integrity": "sha512-9QqdvpGQTXgxthP+lY4e/gIBy+RuqcBaC6JVwT5I3bDLgT/btL6twZMR0pI3/Fgah9G/pdwzIprE5gL6v9UvyQ==", 886 | "requires": { 887 | "buffer-alloc": "1.1.0" 888 | } 889 | }, 890 | "unordered-array-remove": { 891 | "version": "1.0.2", 892 | "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", 893 | "integrity": "sha1-xUbo+I4xegzyZEyX7LV9umbSUO8=" 894 | }, 895 | "unordered-set": { 896 | "version": "1.1.0", 897 | "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-1.1.0.tgz", 898 | "integrity": "sha1-K6fvMW7dC5WQzFR8dPdqLxZP7Mo=" 899 | }, 900 | "util-deprecate": { 901 | "version": "1.0.2", 902 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 903 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 904 | }, 905 | "utp-native": { 906 | "version": "1.7.1", 907 | "resolved": "https://registry.npmjs.org/utp-native/-/utp-native-1.7.1.tgz", 908 | "integrity": "sha512-FSs76hQZsSsdI4YeePxb5SQoWmHxDRznImGiAN905O1svyHvcoQ3hYptu3Y9hPxRHeB3lHzJR5KRZy0Byj7qqg==", 909 | "optional": true, 910 | "requires": { 911 | "nan": "2.10.0", 912 | "node-gyp-build": "3.3.0", 913 | "readable-stream": "2.3.6" 914 | } 915 | }, 916 | "varint": { 917 | "version": "3.0.1", 918 | "resolved": "https://registry.npmjs.org/varint/-/varint-3.0.1.tgz", 919 | "integrity": "sha1-nT9T4DbAqxIACnS8LSTL8JOlgdk=" 920 | }, 921 | "wrappy": { 922 | "version": "1.0.2", 923 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 924 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 925 | }, 926 | "xsalsa20": { 927 | "version": "1.0.2", 928 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.0.2.tgz", 929 | "integrity": "sha512-g1DFmZ5JJ9Qzvt4dMw6m9IydqoCSP381ucU5zm46Owbk3bwmqAr8eEJirOPc7PrXRn45drzOpAyDp8jsnoyXyw==" 930 | }, 931 | "xtend": { 932 | "version": "4.0.1", 933 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 934 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 935 | } 936 | } 937 | } 938 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cabal", 3 | "version": "1.0.0", 4 | "description": "p2p forum software", 5 | "main": "index.js", 6 | "dependencies": { 7 | "concat-stream": "^1.6.2", 8 | "dat-swarm-defaults": "^1.0.1", 9 | "discovery-swarm": "^5.1.1", 10 | "hyperdb": "git+https://github.com/mafintosh/hyperdb.git", 11 | "minimist": "^1.2.0", 12 | "neat-log": "^2.4.0", 13 | "strftime": "^0.10.0", 14 | "through2": "^2.0.3" 15 | }, 16 | "devDependencies": {}, 17 | "scripts": { 18 | "test": "echo \"Error: no test specified\" && exit 1" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/new-computers/cabal.git" 23 | }, 24 | "keywords": [ 25 | "hyperdb", 26 | "dat", 27 | "cblgh", 28 | "p2p" 29 | ], 30 | "author": "cblgh", 31 | "license": "ISC", 32 | "bugs": { 33 | "url": "https://github.com/new-computers/cabal/issues" 34 | }, 35 | "homepage": "https://github.com/new-computers/cabal#readme" 36 | } 37 | -------------------------------------------------------------------------------- /simple-screen.js: -------------------------------------------------------------------------------- 1 | var strftime = require('strftime') 2 | function Screen () { 3 | if (!(this instanceof Screen)) return new Screen() 4 | } 5 | 6 | // use to write user messages 7 | Screen.prototype.writeMessage = function (msg) { 8 | console.log(`${formatTime(msg.value.time)} <${msg.value.author}> ${msg.value.text}`) 9 | } 10 | 11 | // use to write anything else to the screen, e.g. info messages or emotes 12 | Screen.prototype.writeLine = function (line) { 13 | console.log(line) 14 | } 15 | 16 | function formatTime (t) { 17 | return strftime('%T', new Date(t)) 18 | } 19 | module.exports = Screen 20 | -------------------------------------------------------------------------------- /util.js: -------------------------------------------------------------------------------- 1 | function logResult (err, result) { 2 | if (err) { console.error('hyperdb failed with', err) } 3 | if (arguments.length >= 2) { console.log(result) } 4 | } 5 | 6 | module.exports = {log: logResult} 7 | --------------------------------------------------------------------------------