-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.js
More file actions
59 lines (57 loc) · 1.34 KB
/
main.js
File metadata and controls
59 lines (57 loc) · 1.34 KB
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
53
54
55
56
57
58
59
/* eslint-disable node/no-unsupported-features/es-syntax */
const STATUS_NO_CONTENT = 204
export const wsHandler = async () => {
const { WebSocket, WebSocketServer } = await import('ws')
let clientId = 0
const clients = new Map()
const server = new WebSocketServer({
clientTracking: false,
noServer: true,
})
const end = () => {
for (const client of clients.values()) {
if (client.readyState !== WebSocket.OPEN) {
continue
}
client.terminate()
}
server.close()
}
const handle = ({ head, request, socket }) => {
if (request.aborted === true) {
return undefined
}
return new Promise((resolve) => {
server.handleUpgrade(request, socket, head, (webSocket) => {
if (clientId === Number.MAX_SAFE_INTEGER) {
clientId = 1
} else {
clientId++
}
clients.set(clientId, webSocket)
request.once('close', () => {
clients.delete(clientId)
})
resolve({
clientId,
webSocket,
})
})
})
}
const push = ({ message, options }) => {
for (const client of clients.values()) {
if (client.readyState !== WebSocket.OPEN) {
continue
}
client.send(message, options)
}
return undefined
}
return {
clients,
end,
handle,
push,
}
}