47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
const sockets: Record<string, MySocket> = {};
|
|
|
|
type MySocket = {
|
|
send: (data: string) => void;
|
|
addMessageListener: (listener: (event: string) => void) => void;
|
|
_listeners: ((event: string) => void)[];
|
|
_ws: WebSocket;
|
|
};
|
|
|
|
const isSocketOpen = (url: string): boolean => {
|
|
return sockets[url]?._ws?.readyState === WebSocket.OPEN;
|
|
};
|
|
|
|
const initSocket = (url: string): MySocket => {
|
|
if (sockets[url]) {
|
|
if (isSocketOpen(url)) {
|
|
return sockets[url];
|
|
} else {
|
|
sockets[url]._ws.close();
|
|
}
|
|
}
|
|
|
|
const ws = new WebSocket(url);
|
|
const socket: MySocket = {
|
|
send: (data: string) => {
|
|
sockets[url]._ws.send(data);
|
|
},
|
|
addMessageListener: (listener: (event: string) => void) => {
|
|
socket._listeners.push(listener);
|
|
},
|
|
_listeners: sockets[url]?._listeners ?? [],
|
|
_ws: ws,
|
|
};
|
|
|
|
|
|
ws.onerror = () => ws.close();
|
|
ws.onclose = () => initSocket(url);
|
|
ws.onmessage = (event) => {
|
|
console
|
|
sockets[url]._listeners.forEach((listener) => listener(event.data));
|
|
};
|
|
|
|
sockets[url] = socket;
|
|
|
|
return sockets[url];
|
|
};
|