{"version":3,"file":"BranchingIncrementalPublisher.js","sourceRoot":"","sources":["../../../src/execution/legacyIncremental/BranchingIncrementalPublisher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,+BAA8B;AAE7D,OAAO,EAAE,kBAAkB,EAAE,2CAA0C;AAWvE,OAAO,EAAE,eAAe,EAAE,qCAAoC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gCAA+B;AAC1D,OAAO,EAAE,yBAAyB,EAAE,yCAAwC;AAiB5E,MAAM,OAAO,6BAA6B;IAGxC;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC5B,CAAC;IAED,aAAa,CACX,IAAqB,EACrB,MAAmC,EACnC,IAAqB,EACrB,WAAoC,EACpC,UAAsB;QAEtB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,eAAe,CAKhD,IAAI,CAAC,CAAC;QAER,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QAED,SAAS,KAAK;YACZ,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAExD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,mBAAmB,GAAG,GAAG,EAAE;YAC/B,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC;QAEF,MAAM,aAAa,GAA4C,MAAM,CAAC,MAAM;YAC1E,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;YACjC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAE5B,MAAM,iBAAiB,GAAG,yBAAyB,CACjD,gBAAgB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CACjC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAC9C,EACD,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAC5B,CAAC;QAEF,OAAO;YACL,aAAa;YACb,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAEO,YAAY,CAClB,KAOC,EACD,mBAA6C;QAE7C,MAAM,OAAO,GAAgD;YAC3D,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEzC,MAAM,MAAM,GAA+C,EAAE,OAAO,EAAE,CAAC;QACvE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;QACnC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,qBAAqB,CAC3B,KAKC,EACD,OAAoD,EACpD,mBAA6C;QAE7C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC1B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,OAAO,CAAC,WAAW,CAAC,IAAI,CACtB,sBAAsB,CACpB;wBACE,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;qBAC9B,EACD,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,MAAM,CACb,CACF,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC1B,OAAO,CAAC,WAAW,CAAC,IAAI,CACtB,sBAAsB,CACpB;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;iBAC9B,EACD,KAAK,CAAC,KAAK,EACX,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAClC,CACF,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;gBACzB,MAAM,KAAK,GAAmB,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAwB,EAAE,CAAC;gBACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvB,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAC/B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;oBAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACnC,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;gBAChD,OAAO,CAAC,WAAW,CAAC,IAAI,CACtB,sBAAsB,CACpB;oBACE,KAAK;oBACL,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;iBAC1D,EACD,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CACvC,CACF,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC5B,OAAO,CAAC,WAAW,CAAC,IAAI,CACtB,sBAAsB,CACpB;oBACE,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;iBAC/B,EACD,MAAM,CAAC,KAAK,EACZ,CAAC,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAClC,CACF,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,wBAAwB,CAAC,CAAC,CAAC;gBAC9B,mBAAmB,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,sBAAsB,CAC7B,yBAE2D,EAC3D,KAAyB,EACzB,MAA+C;IAE/C,MAAM,iBAAiB,GAA4B,yBAAyB,CAAC;IAC7E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC;IACpC,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC","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"]}