forked from reconbot/graphql-lambda-subscriptions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomplete.ts
43 lines (38 loc) · 1.92 KB
/
complete.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
import AggregateError from 'aggregate-error'
import { parse } from 'graphql'
import { CompleteMessage } from 'graphql-ws'
import { buildExecutionContext } from 'graphql/execution/execute'
import { SubscribePseudoIterable, MessageHandler, PubSubEvent } from '../types'
import { deleteConnection } from '../utils/deleteConnection'
import { buildContext } from '../utils/buildContext'
import { getResolverAndArgs } from '../utils/getResolverAndArgs'
import { isArray } from '../utils/isArray'
/** Handler function for 'complete' message. */
export const complete: MessageHandler<CompleteMessage> = async ({ server, event, message }) => {
server.log('messages:complete', { connectionId: event.requestContext.connectionId })
try {
const subscription = await server.models.subscription.get({ id: `${event.requestContext.connectionId}|${message.id}` })
if (!subscription) {
return
}
const execContext = buildExecutionContext({
schema: server.schema,
document: parse(subscription.subscription.query),
contextValue: await buildContext({ server, connectionInitPayload: subscription.connectionInitPayload, connectionId: subscription.connectionId }),
variableValues: subscription.subscription.variables,
operationName: subscription.subscription.operationName,
})
if (isArray(execContext)) {
throw new AggregateError(execContext)
}
const { field, root, args, context, info } = getResolverAndArgs({ execContext })
const onComplete = (field?.subscribe as SubscribePseudoIterable<PubSubEvent>)?.onComplete
server.log('messages:complete:onComplete', { onComplete: !!onComplete })
await onComplete?.(root, args, context, info)
await server.models.subscription.delete({ id: subscription.id })
} catch (err) {
server.log('messages:complete:onError', { err, event })
await server.onError?.(err, { event, message })
await deleteConnection(server)(event.requestContext)
}
}