forked from reconbot/graphql-lambda-subscriptions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandleWebSocketEvent.ts
91 lines (81 loc) · 2.57 KB
/
handleWebSocketEvent.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import { GRAPHQL_TRANSPORT_WS_PROTOCOL, MessageType } from 'graphql-ws'
import { ServerClosure, SubscriptionServer } from './types'
import { disconnect } from './messages/disconnect'
import { ping } from './messages/ping'
import { complete } from './messages/complete'
import { subscribe } from './messages/subscribe'
import { connection_init } from './messages/connection_init'
import { pong } from './messages/pong'
export const handleWebSocketEvent = (serverPromise: Promise<ServerClosure>): SubscriptionServer['webSocketHandler'] => async (event) => {
const server = await serverPromise
if (!event.requestContext) {
server.log('handleWebSocketEvent unknown', { event })
return {
statusCode: 200,
body: '',
}
}
if (event.requestContext.eventType === 'CONNECT') {
server.log('handleWebSocketEvent CONNECT', { connectionId: event.requestContext.connectionId })
await server.onConnect?.({ event })
return {
statusCode: 200,
headers: {
'Sec-WebSocket-Protocol': GRAPHQL_TRANSPORT_WS_PROTOCOL,
},
body: '',
}
}
if (event.requestContext.eventType === 'MESSAGE') {
const message = event.body === null ? null : JSON.parse(event.body)
server.log('handleWebSocketEvent MESSAGE', { connectionId: event.requestContext.connectionId, type: message.type })
if (message.type === MessageType.ConnectionInit) {
await connection_init({ server, event, message })
return {
statusCode: 200,
body: '',
}
}
if (message.type === MessageType.Subscribe) {
await subscribe({ server, event, message })
return {
statusCode: 200,
body: '',
}
}
if (message.type === MessageType.Complete) {
await complete({ server, event, message })
return {
statusCode: 200,
body: '',
}
}
if (message.type === MessageType.Ping) {
await ping({ server, event, message })
return {
statusCode: 200,
body: '',
}
}
if (message.type === MessageType.Pong) {
await pong({ server, event, message })
return {
statusCode: 200,
body: '',
}
}
}
if (event.requestContext.eventType === 'DISCONNECT') {
server.log('handleWebSocketEvent DISCONNECT', { connectionId: event.requestContext.connectionId })
await disconnect({ server, event, message: null })
return {
statusCode: 200,
body: '',
}
}
server.log('handleWebSocketEvent UNKNOWN', { connectionId: event.requestContext.connectionId })
return {
statusCode: 200,
body: '',
}
}