aboutsummaryrefslogtreecommitdiffstats
path: root/db/migrations/user_adjustments.js
diff options
context:
space:
mode:
authorRan Guin <[email protected]>2021-06-16 20:31:22 -0700
committerRan Guin <[email protected]>2021-06-16 20:31:22 -0700
commit28ec81485855769cacec176b83ac959a518da655 (patch)
tree7a6f599923fc12dfcca877395daf7171c6f17eab /db/migrations/user_adjustments.js
parentfe6011b5602608c2b6f737f26652a8966139f562 (diff)
downloadcoinos-server-28ec81485855769cacec176b83ac959a518da655.tar.gz
coinos-server-28ec81485855769cacec176b83ac959a518da655.zip
change referral status options; enable access to used or available referrals
Diffstat (limited to 'db/migrations/user_adjustments.js')
0 files changed, 0 insertions, 0 deletions
>94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
import { get } from 'svelte/store';
import {
	events as $events,
	invoices,
	invoice,
	request,
	newPayment,
	last,
	rate,
	txns,
	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;
let le = browser && localStorage.getItem('events');
let events = le && le !== 'undefined' ? JSON.parse(le) : {};
let q = Object.keys(events);

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() {
		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();
}