This repository has been archived on 2023-11-14. You can view files and clone it, but cannot push or open issues/pull-requests.
viscord/packages/renderer/src/lib/api.ts

91 lines
2.1 KiB
TypeScript
Raw Normal View History

2022-07-20 16:04:09 -04:00
let socket: WebSocket | null = null;
let connectionAttempts = 0;
2022-07-22 17:43:59 -04:00
const url = 'wss://dev.valnet.xyz';
2022-07-20 16:04:09 -04:00
let routers: any[] = [];
const connect = async () => {
try {
connectionAttempts ++;
console.log('attempting api connection...');
socket = new WebSocket(url);
} catch (e) {
if(connectionAttempts === 1)
connect();
else {
const seconds = 2 ** connectionAttempts;
console.log(`waiting ${seconds} seconds before reconnecting`);
setTimeout(connect, 1000 * seconds);
}
return;
}
socket.addEventListener('open', () => {
if(socket === null) return;
connectionAttempts = 0;
// socket.send('Hello Server!');
});
socket.addEventListener('message', (event) => {
const {action, data} = JSON.parse(event.data);
2022-07-21 23:45:52 -04:00
console.log('[IN]', action, data);
2022-07-20 16:04:09 -04:00
for(const router of routers) {
router(action, data);
}
});
socket.addEventListener('close', () => {
socket = null;
connect();
});
};
connect();
2022-07-21 04:18:39 -04:00
export async function send(action: string, data?: any) {
2022-07-20 16:04:09 -04:00
if(socket === null) return;
2022-07-21 04:18:39 -04:00
if(socket && socket.readyState === socket.CONNECTING) {
try {
await new Promise((resolve, reject) => {
socket?.addEventListener('open', resolve);
socket?.addEventListener('close', reject);
});
} catch(e) {
return;
}
if(socket.readyState !== socket.OPEN) return;
}
2022-07-20 16:04:09 -04:00
const message = JSON.stringify({ action, data });
socket.send(message);
}
export function router(routes: any) {
for(const routeName in routes) {
const route = routes[routeName];
if(typeof route === 'object') {
for(const suffix in route) {
const combinedRouteName = routeName + ':' + suffix;
routes[combinedRouteName] = route[suffix];
}
delete routes[routeName];
}
}
return function(route: string, data: any) {
if(route in routes) {
routes[route](data);
} else {
console.warn(`route <${route}> not found`);
}
};
}
export function registerRouter(router: any) {
routers.push(router);
}
export function unregisterRouter(router: any) {
routers = routers.filter(r => r !== router);
}