-
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
message-callback.ts
52 lines (45 loc) · 1.3 KB
/
message-callback.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import type { WebSocketInterface } from '../../index.js';
interface WebSocketListener {
(data: MessageEvent<string>): any;
}
/**
* Wait for a websocket response
*
* @param socket WebSocket
* @param number timeout
*
* @returns Incoming message object
*/
export const messageCallback = (socket: WebSocketInterface, timeout = 1000) =>
new Promise<Record<string, any> | MessageEvent<string> | undefined>((resolve, reject) => {
const handler: WebSocketListener = (data: MessageEvent<string>) => {
try {
const message = JSON.parse(data.data) as Record<string, any>;
if (typeof message === 'object' && !Array.isArray(message) && message !== null) {
unbind();
resolve(message);
} else {
unbind();
abort();
}
} catch (err) {
// return the original event to allow customization
unbind();
resolve(data);
}
};
const abort = () => reject();
const unbind = () => {
clearTimeout(timer);
socket.removeEventListener('message', handler);
socket.removeEventListener('error', abort);
socket.removeEventListener('close', abort);
};
socket.addEventListener('message', handler);
socket.addEventListener('error', abort);
socket.addEventListener('close', abort);
const timer = setTimeout(() => {
unbind();
resolve(undefined);
}, timeout);
});