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
49
50
51
52
|
{
"name": "coinos",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "nodemon index.js | pino-pretty",
"generate": "sequelize-automate -c config/index.js"
},
"dependencies": {
"@grpc/proto-loader": "^0.5.3",
"axios": "^0.19.0",
"bcrypt": "^3.0.6",
"bitcoin-core": "https://github.com/asoltys/bitcoin-core",
"bitcoinjs-lib": "^5.1.7",
"body-parser": "^1.19.0",
"bolt11": "^1.2.5",
"buffer-reverse": "^1.0.1",
"clightning-client": "^0.1.2",
"compression": "^1.7.4",
"connect-redis": "3.4.1",
"cookie-parser": "^1.4.4",
"cors": "^2.8.5",
"elementsjs-lib": "https://github.com/asoltys/elementsjs-lib",
"express": "4.17.1",
"express-session": "^1.16.2",
"grpc": "^1.24.2",
"http-proxy-middleware": "^0.20.0",
"jsonwebtoken": "^8.5.1",
"long": "^4.0.0",
"mailgun-js": "^0.22.0",
"mysql2": "^2.1.0",
"otplib": "^12.0.1",
"passport": "0.4.0",
"passport-jwt": "^4.0.0",
"passport-local": "1.0.0",
"pino": "^5.17.0",
"request": "~2.88.0",
"sequelize": "^5.21.3",
"uuid": "^3.3.2",
"ws": "^7.1.2",
"zeromq": "^5.1.0"
},
"devDependencies": {
"nodemon": "^2.0.2",
"pino-pretty": "^3.6.1",
"pm2": "^4.4.0",
"prettier": "^1.18.2"
},
"resolutions": {
"coinos": "portal:/home/adam/coinos-server"
}
}
ss="kd">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;
invalidate('app:invoice');
let payments = get(payments);
let i = payments.findIndex((p) => p.id === data.id);
if (~i) (payments[i] = data), payments.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(token);
}
|