graphql
Version:
A Query Language and Runtime which can target any service.
1 lines • 11.3 kB
Source Map (JSON)
{"version":3,"file":"BranchingIncrementalPublisher.js","sourceRoot":"","sources":["../../../src/execution/legacyIncremental/BranchingIncrementalPublisher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ObjMap } from '../../jsutils/ObjMap.ts';\nimport { addPath, pathToArray } from '../../jsutils/Path.ts';\n\nimport { ensureGraphQLError } from '../../error/ensureGraphQLError.ts';\nimport type { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type {\n DeliveryGroup,\n ExecutionGroupValue,\n IncrementalWork,\n ItemStream,\n StreamItemValue,\n} from '../incremental/IncrementalExecutor.ts';\nimport type { WorkQueueEvent } from '../incremental/WorkQueue.ts';\nimport { createWorkQueue } from '../incremental/WorkQueue.ts';\nimport { mapAsyncIterable } from '../mapAsyncIterable.ts';\nimport { withConcurrentAbruptClose } from '../withConcurrentAbruptClose.ts';\n\nimport type {\n LegacyExperimentalIncrementalExecutionResults,\n LegacyIncrementalDeferResult,\n LegacyIncrementalResult,\n LegacyIncrementalStreamResult,\n LegacyInitialIncrementalExecutionResult,\n LegacySubsequentIncrementalExecutionResult,\n} from './BranchingIncrementalExecutor.ts';\n\ninterface SubsequentIncrementalExecutionResultContext {\n incremental: Array<LegacyIncrementalResult>;\n hasNext: boolean;\n}\n\n/** @internal */\nexport class BranchingIncrementalPublisher {\n private _indices: Map<ItemStream, number>;\n\n constructor() {\n this._indices = new Map();\n }\n\n buildResponse(\n data: ObjMap<unknown>,\n errors: ReadonlyArray<GraphQLError>,\n work: IncrementalWork,\n abortSignal: AbortSignal | undefined,\n onFinished: () => void,\n ): LegacyExperimentalIncrementalExecutionResults {\n const { initialStreams, events } = createWorkQueue<\n ExecutionGroupValue,\n StreamItemValue,\n DeliveryGroup,\n ItemStream\n >(work);\n\n for (const stream of initialStreams) {\n this._indices.set(stream, stream.initialCount);\n }\n\n function abort(): void {\n subsequentResults.throw(abortSignal?.reason).catch(() => {\n // Ignore errors\n });\n }\n\n if (abortSignal) {\n abortSignal.addEventListener('abort', abort);\n }\n const onWorkQueueFinished = () => {\n onFinished();\n abortSignal?.removeEventListener('abort', abort);\n };\n\n const initialResult: LegacyInitialIncrementalExecutionResult = errors.length\n ? { errors, data, hasNext: true }\n : { data, hasNext: true };\n\n const subsequentResults = withConcurrentAbruptClose(\n mapAsyncIterable(events, (batch) =>\n this._handleBatch(batch, onWorkQueueFinished),\n ),\n () => onWorkQueueFinished(),\n );\n\n return {\n initialResult,\n subsequentResults,\n };\n }\n\n private _handleBatch(\n batch: ReadonlyArray<\n WorkQueueEvent<\n ExecutionGroupValue,\n StreamItemValue,\n DeliveryGroup,\n ItemStream\n >\n >,\n onWorkQueueFinished: (() => void) | undefined,\n ): LegacySubsequentIncrementalExecutionResult {\n const context: SubsequentIncrementalExecutionResultContext = {\n incremental: [],\n hasNext: true,\n };\n\n for (const event of batch) {\n this._handleWorkQueueEvent(event, context, onWorkQueueFinished);\n }\n\n const { incremental, hasNext } = context;\n\n const result: LegacySubsequentIncrementalExecutionResult = { hasNext };\n if (incremental.length > 0) {\n result.incremental = incremental;\n }\n\n return result;\n }\n\n private _handleWorkQueueEvent(\n event: WorkQueueEvent<\n ExecutionGroupValue,\n StreamItemValue,\n DeliveryGroup,\n ItemStream\n >,\n context: SubsequentIncrementalExecutionResultContext,\n onWorkQueueFinished: (() => void) | undefined,\n ): void {\n switch (event.kind) {\n case 'GROUP_VALUES': {\n const group = event.group;\n for (const value of event.values) {\n context.incremental.push(\n buildIncrementalResult(\n {\n data: value.data,\n path: pathToArray(group.path),\n },\n group.label,\n value.errors,\n ),\n );\n }\n break;\n }\n case 'GROUP_SUCCESS': {\n break;\n }\n case 'GROUP_FAILURE': {\n const group = event.group;\n context.incremental.push(\n buildIncrementalResult(\n {\n data: null,\n path: pathToArray(group.path),\n },\n group.label,\n [ensureGraphQLError(event.error)],\n ),\n );\n break;\n }\n case 'STREAM_VALUES': {\n const stream = event.stream;\n const { values } = event;\n const items: Array<unknown> = [];\n const errors: Array<GraphQLError> = [];\n for (const value of values) {\n items.push(value.item);\n if (value.errors !== undefined) {\n errors.push(...value.errors);\n }\n }\n let index = this._indices.get(stream);\n if (index === undefined) {\n index = stream.initialCount;\n this._indices.set(stream, index);\n }\n this._indices.set(stream, index + items.length);\n context.incremental.push(\n buildIncrementalResult(\n {\n items,\n path: pathToArray(addPath(stream.path, index, undefined)),\n },\n stream.label,\n errors.length > 0 ? errors : undefined,\n ),\n );\n break;\n }\n case 'STREAM_SUCCESS': {\n this._indices.delete(event.stream);\n break;\n }\n case 'STREAM_FAILURE': {\n this._indices.delete(event.stream);\n const stream = event.stream;\n context.incremental.push(\n buildIncrementalResult(\n {\n items: null,\n path: pathToArray(stream.path),\n },\n stream.label,\n [ensureGraphQLError(event.error)],\n ),\n );\n break;\n }\n case 'WORK_QUEUE_TERMINATION': {\n onWorkQueueFinished?.();\n context.hasNext = false;\n break;\n }\n }\n }\n}\n\nfunction buildIncrementalResult(\n originalIncrementalResult:\n | Omit<LegacyIncrementalDeferResult, 'label' | 'errors'>\n | Omit<LegacyIncrementalStreamResult, 'label' | 'errors'>,\n label: string | undefined,\n errors: ReadonlyArray<GraphQLError> | undefined,\n): LegacyIncrementalResult {\n const incrementalResult: LegacyIncrementalResult = originalIncrementalResult;\n if (errors !== undefined) {\n incrementalResult.errors = errors;\n }\n if (label !== undefined) {\n incrementalResult.label = label;\n }\n return incrementalResult;\n}\n"]}