|
requestContext.document = parse(query, config.parseOptions); |
|
await parsingDidEnd(); |
|
} catch (syntaxError) { |
|
await parsingDidEnd(syntaxError as Error); |
|
await executionDispatcher.invokeHook('executionDidEnd'); |
|
} catch (executionError) { |
|
await executionDispatcher.invokeHook( |
|
'executionDidEnd', |
|
executionError as Error, |
|
); |
In (at least) these two cases, if the end hook itself throws, we then call it again in the catch block (but with no try/catch if it throws!). I'd say these try/catches incorrectly assume that the hook won't throw, but we should be prepared for it to throw and handle it gracefully.
This probably means calling the hook after the try/catch or something else which doesn't result in the end hook possibly being called twice.
apollo-server/packages/apollo-server-core/src/requestPipeline.ts
Lines 247 to 250 in 54416e2
apollo-server/packages/apollo-server-core/src/requestPipeline.ts
Lines 436 to 441 in 54416e2
In (at least) these two cases, if the end hook itself throws, we then call it again in the catch block (but with no try/catch if it throws!). I'd say these try/catches incorrectly assume that the hook won't throw, but we should be prepared for it to throw and handle it gracefully.
This probably means calling the hook after the try/catch or something else which doesn't result in the end hook possibly being called twice.