aboutsummaryrefslogtreecommitdiffstats
path: root/static/punks-sm/41.webp
blob: 302fb7353f370ac7fff6103e40963a3c14cb0930 (plain)
ofshex dumpascii
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 0f
import { 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);
}