| ofs | hex dump | ascii |
|---|
| 0000 | 52 49 46 46 be 0f 00 00 57 45 42 50 56 50 38 20 b2 0f 00 00 10 3d 00 9d 01 2a 80 00 80 00 3e 79 | RIFF....WEBPVP8......=...*....>y |
| 0020 | 30 93 46 24 a2 a1 a1 31 76 6c 68 90 0f 09 6c 00 b5 cf 55 8e d7 d5 7f 4f f4 45 b2 3f ac f2 81 d9 | 0.F$...1vlh...l...U....O.E.?.... |
| 0040 | 0c 6d bb c7 ce 2f a3 3f 30 0e 7a 3e 64 3c dc bd 2a ff 7b f5 0c fe 93 d4 b3 e8 45 d2 d5 fb bf 8d | .m.../.?0.z>d<..*.{.......E..... |
| 0060 | 15 21 7e 4d 63 43 a5 df 7a 67 d1 9b fb 49 fb 66 90 1e 58 b0 0e f6 77 02 36 79 e2 e7 4d ce 80 de | .!~McC..zg...I.f..X...w.6y..M... |
| 0080 | 32 1a 0e 7b 03 d8 43 cb 57 d9 67 a0 c1 6d bf 94 9f 8f 7c d6 75 dc cf bf a0 b2 f1 1d ec fb 0e d0 | 2..{..C.W.g..m....|.u........... |
| 00a0 | 0d 99 1c 20 b6 07 b7 bc 27 f3 d4 c1 f8 6d 39 39 d0 fe ad 41 f4 6a 15 f7 19 ce 9f b0 1e c1 55 f3 | ........'....m99...A.j........U. |
| 00c0 | 68 6f 52 7c 00 e7 87 4b 0d af 0b eb 91 70 c0 b9 1d 5a 39 e2 d9 82 94 3c 96 35 63 b0 cc 12 de 42 | hoR|...K.....p...Z9....<.5c....B |
| 00e0 | ef 85 9d 07 7a 8a 71 8f fb 9e ea 64 e2 57 da 44 0b 9a 2b 1a 1c 11 f2 35 28 54 90 1f 75 78 e0 1a | ....z.q....d.W.D..+....5(T..ux.. |
| 0100 | e6 38 af c5 19 d1 2c ac 84 07 5f ff 4e 16 1c 15 78 59 bd a1 69 16 8a eb 56 00 1a f4 0f bc 66 09 | .8....,..._.N...xY..i...V.....f. |
| 0120 | 5f 7c 14 93 af a8 e1 04 74 08 93 eb 8c e1 bd 35 7a c3 63 87 b9 7c ee ff ca ee 5d ac 71 8c 76 47 | _|......t......5z.c..|....].q.vG |
| 0140 | 51 4d 95 44 99 28 d8 52 4e 73 dc 27 7e 52 b8 d0 78 02 44 1b 29 76 66 d7 86 8c 33 34 5e b6 ed 6e | QM.D.(.RNs.'~R..x.D.)vf...34^..n |
| 0160 | 00 86 02 93 0a 9e 5d dd 06 9c 88 75 c2 78 2e 14 d7 95 38 56 59 7e c9 73 12 51 22 5f 5a 4c 9c 5a | ......]....u.x....8VY~.s.Q"_ZL.Z |
| 0180 | 70 71 fd 6b 9c 60 e9 3c f0 26 7d 6b 61 4b d1 69 f5 9f a6 b9 41 f5 24 48 b7 e8 27 a7 28 d2 83 90 | pq.k.`.<.&}kaK.i....A.$H..'.(... |
| 01a0 | c8 e2 5f 05 82 e3 98 9f 03 30 05 58 c9 6f 80 dd 42 f2 66 0e c5 ec 06 f4 a3 b5 4c 64 b4 0d e7 ee | .._......0.X.o..B.f.......Ld.... |
| 01c0 | 1f 1e 72 25 ab f2 97 f1 09 60 26 05 3f eb 7f c1 76 af 45 9d 2c 14 59 87 e6 c7 7a ef 0c 71 a6 f4 | ..r%.....`&.?...v.E.,.Y...z..q.. |
| 01e0 | 76 9b fa 62 52 a1 61 46 40 e5 89 98 7d f2 2e 34 91 75 4d 16 9b 99 20 d9 a3 ff cc 8c 31 ce ac 04 | v..bR.aF@...}..4.uM.........1... |
| 0200 | 79 2d 8a f2 00 00 6b dd d2 89 32 7d 36 21 78 72 1c e0 ab 8a 2a e5 33 13 95 78 25 0a db 18 12 bc | y-....k...2}6!xr....*.3..x%..... |
| 0220 | 03 9a 06 a5 40 dd e3 20 d1 9b b1 39 ca 80 6d 42 74 81 e6 2d 4d f1 77 44 06 e7 e7 b0 e8 28 4c 8e | ....@......9..mBt..-M.wD.....(L. |
| 0240 | 9e 23 d8 67 ff a6 55 df d0 53 ce c0 3e 34 fa d1 41 fe 39 e4 56 71 3f 35 04 a3 65 37 3f d9 47 ff | .#.g..U..S..>4..A.9.Vq?5..e7?.G. |
| 0260 | 22 da 13 d5 c8 0b e4 80 40 cf 03 e0 ba 88 85 4f 09 61 2e d4 dc a7 02 50 5d d9 3b f2 99 51 d9 69 | ".......@......O.a.....P].;..Q.i |
| 0280 | b6 27 46 b8 df d0 5b aa 49 d6 8f 59 25 21 55 45 f7 21 8b 13 55 3e 1d db b7 0f e5 a2 95 2c 2f 89 | .'F...[.I..Y%!UE.!..U>.......,/. |
| 02a0 | 99 e1 ce 25 7e 95 ae 39 1e db 88 e5 cb 2e 0c 21 5b 6d b9 c6 08 a8 4f 1a ae b4 dc 9e 45 64 b3 c7 | ...%~..9.......![m....O.....Ed.. |
| 02c0 | 0e 66 f8 00 60 f1 87 58 41 bb 9b 15 88 0e 38 45 87 d6 14 05 9d 9f 52 96 eb 02 f0 7a 33 fa 00 26 | .f..`..XA.....8E......R....z3..& |
| 02e0 | 71 e2 50 af 3c 84 16 55 bd 50 5c 23 34 33 ad 75 2b 7c 69 ed 20 0e e9 05 a3 c4 d8 c0 5a e2 62 e9 | q.P.<..U.P\#43.u+|i.........Z.b. |
| 0300 | 75 8a 13 c6 a3 60 fa ad d2 4e 14 aa e4 38 39 d5 0f 20 56 09 f7 c8 c1 a9 fc d0 ae dd 6a 15 0e 97 | u....`...N...89...V.........j... |
| 0320 | 39 0f 7f a2 61 d7 c5 aa 2a 3b b1 58 27 a1 78 4b 2e b5 49 83 45 5e e3 67 3f 6d f9 ef e8 ac ef 13 | 9...a...*;.X'.xK..I.E^.g?m...... |
| 0340 | 3f df f0 ed 8c df e8 a8 59 d9 a4 a1 2b 0d 0fimport { get } from 'svelte/store';
import { event, invoice, request, newPayment, last, rate, payments, user } from '$lib/store';
import { success, sat } from '$lib/utils';
import { PUBLIC_SOCKET } from '$env/static/public';
import { invalidate } from '$app/navigation';
import { browser } from '$app/environment';
let socket, token;
export const auth = () => token && 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() {
event.set(data);
},
rate() {
rate.set(data);
},
request() {
request.set(data);
invalidate('app:invoice');
},
async payment() {
let { amount, invoice } = data;
invalidate('app:invoice');
let p = get(payments);
let i = p.findIndex((p) => p.id === data.id);
if (~i) {
p[i] = data;
payments.set(p);
} 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);
}
|