mime-chat/src/background/websockets.ts
2021-06-01 09:50:25 -04:00

95 lines
2.2 KiB
TypeScript

"use strict";
import WebSocket from 'ws';
let socket: WebSocket;
const socketUrl = process.env.PLATFORM_URL;
// Run every time we want to connect to backend.
export default function useWebSockets(
receiveCallback: (s: string) => void,
openCallback?: () => void
) {
// Returns bool (sucess or fail).
const sendMessage = (data: any) => {
console.log("WS:Sending message: ", data)
if (socket.readyState !== 1) {
return false
}
else {
socket.send(JSON.stringify(data))
return true
}
}
const send = async (data: Record<string, any>): Promise<boolean> => (
new Promise((resolve, reject) => {
if (socket.readyState !== 1) {
reject(false);
}
socket.send(JSON.stringify(data))
resolve(true);
}))
const onOpen = (_event: WebSocket.OpenEvent) => {
console.log("WS:Connected to WS Server!");
if (openCallback) openCallback();
}
const onServerMessage = (event: WebSocket.MessageEvent) => {
console.log("WS:Message received: ", event.data);
receiveCallback(event.data.toString())
}
const onClose = (_event: WebSocket.CloseEvent) => {
console.log("WS:Socket closed normally.")
}
// Reconnect automatically on error.
const onError = (event: WebSocket.ErrorEvent) => {
console.log("WS:WebSocket error: ", event.message);
console.log("Attempting reconnect in 1s.")
setTimeout(createSocket, 1000)
}
const createSocket = (authPayload: {
token: string;
crimataId: string;
}) => {
if (socketUrl)
socket = new WebSocket(socketUrl)
// Add listeners.
socket.addEventListener("open", (_event: WebSocket.OpenEvent) => {
socket.send(JSON.stringify({
key: authPayload.token,
crimata_id: authPayload.crimataId
}));
})
socket.addEventListener("message", onServerMessage)
socket.addEventListener("close", onClose)
socket.addEventListener("error", onError)
console.log("WS:New socket created.")
}
return {
createSocket,
sendMessage,
send
}
}