aboutsummaryrefslogtreecommitdiffstats
path: root/package.json
blob: f732d98573c6f117a5536a5ddf90801ce73cba86 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
  "name": "coinos",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js & grunt",
    "postinstall": "cp config.js.sample config.js"
  },
  "dependencies": {
    "async": "2.1.1",
    "bcoin": "git+https://github.com/bcoin-org/bcoin.git#master",
    "bcryptjs": "^2.3.0",
    "bip39": "^2.2.0",
    "bitcoinjs-lib": "^2.3.0",
    "bluebird": "^3.4.6",
    "body-parser": "^1.5.0",
    "browser-sync": "^2.11.0",
    "coffee-script": "1.11.1",
    "connect-assets": "*",
    "connect-redis": "3.1.0",
    "consolidate": "0.14.1",
    "cookie-parser": "^1.3.2",
    "express": "4.14.0",
    "express-session": "^1.6.5",
    "hogan-express": "0.5.2",
    "http-proxy-middleware": "^0.17.2",
    "less": "2.7.1",
    "moment": "^2.10.6",
    "node-http-proxy": "^0.2.3",
    "passport": "0.3.2",
    "passport-local": "1.0.0",
    "redis": "2.6.2",
    "request": "~2.75.0",
    "sendgrid": "^4.3.0",
    "twilio": "^2.11.0"
  },
  "devDependencies": {
    "bower": "^1.8.0",
    "coffeeify": "^2.0.1",
    "grunt": "^1.0.1",
    "grunt-browser-sync": "^2.2.0",
    "grunt-browserify": "^5.0.0",
    "grunt-contrib-coffee": "^1.0.0",
    "grunt-contrib-less": "^1.1.0",
    "grunt-contrib-watch": "^1.0.0",
    "grunt-newer": "^1.1.1"
  }
}
nx">send('login', token) && send('heartbeat'); export const send = (type, data) => { socket?.readyState === 1 && socket.send(JSON.stringify({ type, data })); return true; }; export const messages = (data) => ({ id() { last.set(Date.now()); }, invoice() { invoice.set(data); }, event() { data.seen = Math.round(Date.now() / 1000); events[data.id] = data; q.push(data.id); $events.set(events); while (q.length > 10000) delete events[q.shift()]; localStorage.setItem( 'events', JSON.stringify(q.slice(-100).reduce((a, b) => (a = { ...a, [b]: events[b] }), {})) ); }, rate() { rate.set(data); }, request() { request.set(data); invalidate('app:invoice'); }, async payment() { let { amount, invoice } = data; if (invoice) invalidate('app:invoice'); if (get(user)?.account_id !== data.account_id) return; let payments = get(txns); let i = payments.findIndex((p) => p.id === data.id); if (~i) (payments[i] = data), txns.set(payments); else newPayment.set(true); invalidate((url) => url.pathname === '/payments'); if (amount > 0) { success(`${data.confirmed ? 'Received' : 'Detected'} ${sat(amount)}!`); } else { success(`Sent ${sat(amount)}!`); } }, connected: auth }); const initialReconnectDelay = 1000; const maxReconnectDelay = 16000; let currentReconnectDelay = initialReconnectDelay; export function connect(t) { token = t; if (socket) return auth(); socket = new WebSocket(PUBLIC_SOCKET); socket.addEventListener('open', onWebsocketOpen); socket.addEventListener('close', onWebsocketClose); socket.addEventListener('message', onWebsocketMessage); } export function close() { if (socket) socket.close(); } function onWebsocketMessage(msg) { let { type, data } = JSON.parse(msg.data); messages(data)[type] && messages(data)[type](); } function onWebsocketOpen() { currentReconnectDelay = initialReconnectDelay; } function onWebsocketClose() { socket = null; setTimeout(() => { reconnectToWebsocket(); }, currentReconnectDelay + Math.floor(Math.random() * 3000)); } function reconnectToWebsocket() { if (currentReconnectDelay < maxReconnectDelay) { currentReconnectDelay *= 2; } connect(); }