{"version":3,"sources":["../src/context.ts"],"names":["Run","LazyPromise","tasks","constructor","handler","runContext","Symbol","toStringTag","observe","fn","push","emitter","context","value","Object","assign","middleware","before","executeSequentially","splice","Infinity","RunContext","Serializable","AsyncLocalStorage","controller","runId","groupId","parentId","runParams","createdAt","signal","abort","reason","instance","input","parent","Date","params","createRandomHash","omit","AbortController","registerSignals","child","trace","id","parentRunId","pipe","destroy","FrameworkError","enter","getStore","namespace","creator","internal","emit","result","Promise","race","run","_","reject","addEventListener","setTimeout","_e","e","ensure","register","createSnapshot","shallowCopy","loadSnapshot","snapshot"],"mappings":";;;;;;;;;;;;;AAyCO,MAAMA,YAA+CC,uBAAAA,CAAAA;EAzC5D;;;;AA0CqBC,EAAAA,KAAAA;AAEnBC,EAAAA,WAAAA,CACEC,SACmBC,UACnB,EAAA;AACA,IAAMD,KAAAA,CAAAA,OAAAA,CAAAA,EAAAA,IAAAA,CAFaC,UAAAA,GAAAA,UAAAA,EAAAA,IAJFH,CAAAA,KAAAA,GAAiC,EAAA,EAAE,IAS5CI,CAAAA,mBAAAA,CAAsB,GAAA,SAAA;AAFhC;EAES,CAACA,mBAAAA,GAAAA,OAAOC,WAAW;AAE5BC,EAAAA,OAAAA,CAAQC,EAAmD,EAAA;AACzD,IAAA,IAAA,CAAKP,MAAMQ,IAAK,CAAA,YAAYD,GAAG,IAAKJ,CAAAA,UAAAA,CAAWM,OAAO,CAAA,CAAA;AACtD,IAAO,OAAA,IAAA;AACT;AAEAC,EAAAA,OAAAA,CAAQC,KAAe,EAAA;AACrB,IAAKX,IAAAA,CAAAA,KAAAA,CAAMQ,KAAK,YAAA;AACdI,MAAAA,MAAAA,CAAOC,MAAO,CAAA,IAAA,CAAKV,UAAWO,CAAAA,OAAAA,EAASC,KAAAA,CAAAA;AACvCC,MAAAA,MAAAA,CAAOC,MAAO,CAAA,IAAA,CAAKV,UAAWM,CAAAA,OAAAA,CAAQC,SAASC,KAAAA,CAAAA;KACjD,CAAA;AACA,IAAO,OAAA,IAAA;AACT;AAEAG,EAAAA,UAAAA,CAAWP,EAA4C,EAAA;AACrD,IAAA,IAAA,CAAKP,MAAMQ,IAAK,CAAA,YAAYD,EAAG,CAAA,IAAA,CAAKJ,UAAU,CAAA,CAAA;AAC9C,IAAO,OAAA,IAAA;AACT;AAEA,EAAA,MAAgBY,MAAwB,GAAA;AACtC,IAAA,MAAM,MAAMA,MAAAA,EAAAA;AACZ,IAAA,MAAMC,gCAAoB,IAAKhB,CAAAA,KAAAA,CAAMiB,MAAO,CAAA,CAAA,EAAGC,QAAAA,CAAAA,CAAAA;AACjD;AACF;AAOO,MAAMC,mBAAmDC,6BAAAA,CAAAA;EAlFhE;;;;;EAmFE,OAAO,QAAA,GAAW,IAAIC,kCAAAA,EAAAA;AAEHC,EAAAA,UAAAA;AACHC,EAAAA,KAAAA;AACAC,EAAAA,OAAAA;AACAC,EAAAA,QAAAA;AACAhB,EAAAA,OAAAA;AACAC,EAAAA,OAAAA;AACAgB,EAAAA,SAAAA;AACAC,EAAAA,SAAAA;AAEhB,EAAA,IAAIC,MAAS,GAAA;AACX,IAAA,OAAO,KAAKN,UAAWM,CAAAA,MAAAA;AACzB;AAEAC,EAAAA,KAAAA,CAAMC,MAAgB,EAAA;AACpB,IAAKR,IAAAA,CAAAA,UAAAA,CAAWO,MAAMC,MAAAA,CAAAA;AACxB;EAEA7B,WACkB8B,CAAAA,QAAAA,EACGC,OACnBC,MACA,EAAA;AACA,IAAA,KAAA,EAAK,EAAA,IAAA,CAJWF,QAAAA,GAAAA,QAAAA,EAAAA,KACGC,KAAAA,GAAAA,KAAAA;AAInB,IAAKL,IAAAA,CAAAA,SAAAA,uBAAgBO,IAAAA,EAAAA;AACrB,IAAA,IAAA,CAAKR,YAAYM,KAAMG,CAAAA,MAAAA;AACvB,IAAKZ,IAAAA,CAAAA,KAAAA,GAAQa,0BAAiB,CAAA,CAAA;AAC9B,IAAA,IAAA,CAAKX,WAAWQ,MAAQV,EAAAA,KAAAA;AACxB,IAAKC,IAAAA,CAAAA,OAAAA,GAAUS,MAAQT,EAAAA,OAAAA,IAAWY,yBAAAA,EAAAA;AAClC,IAAA,IAAA,CAAK1B,OAAU2B,GAAAA,WAAAA,CAAMJ,MAAQvB,EAAAA,OAAAA,IAAW,EAAY,EAAA;AAAC,MAAA,IAAA;AAAM,MAAA;AAAW,KAAA,CAAA;AAEtE,IAAKY,IAAAA,CAAAA,UAAAA,GAAa,IAAIgB,eAAAA,EAAAA;AACtBC,IAAAA,gCAAAA,CAAgB,KAAKjB,UAAY,EAAA;MAACU,KAAMJ,CAAAA,MAAAA;MAAQK,MAAQL,EAAAA;AAAO,KAAA,CAAA;AAE/D,IAAKnB,IAAAA,CAAAA,OAAAA,GAAUsB,QAAStB,CAAAA,OAAAA,CAAQ+B,KAAyB,CAAA;AACvD9B,MAAAA,OAAAA,EAAS,IAAKA,CAAAA,OAAAA;MACd+B,KAAO,EAAA;AACLC,QAAAA,EAAAA,EAAI,IAAKlB,CAAAA,OAAAA;AACTD,QAAAA,KAAAA,EAAO,IAAKA,CAAAA,KAAAA;AACZoB,QAAAA,WAAAA,EAAaV,MAAQV,EAAAA;AACvB;KACF,CAAA;AACA,IAAA,IAAIU,MAAQ,EAAA;AACV,MAAKxB,IAAAA,CAAAA,OAAAA,CAAQmC,IAAKX,CAAAA,MAAAA,CAAOxB,OAAO,CAAA;AAClC;AACF;EAEAoC,OAAU,GAAA;AACR,IAAA,IAAA,CAAKpC,QAAQoC,OAAO,EAAA;AACpB,IAAA,IAAA,CAAKvB,UAAWO,CAAAA,KAAAA,CAAM,IAAIiB,yBAAAA,CAAe,oBAAA,CAAA,CAAA;AAC3C;EAEA,OAAOC,KAAAA,CACLhB,QACAC,EAAAA,KAAAA,EACAzB,EACA,EAAA;AACA,IAAM0B,MAAAA,MAAAA,GAASd,UAAW,CAAA,QAAA,CAAS6B,QAAQ,EAAA;AAC3C,IAAA,MAAM7C,UAAa,GAAA,IAAIgB,UAAWY,CAAAA,QAAAA,EAAUC,OAAOC,MAAAA,CAAAA;AAEnD,IAAO,OAAA,IAAInC,IAAI,YAAA;AACb,MAAMW,MAAAA,OAAAA,GAAUN,UAAWM,CAAAA,OAAAA,CAAQ+B,KAA2B,CAAA;QAC5DS,SAAW,EAAA;AAAC,UAAA;;QACZC,OAAS/C,EAAAA,UAAAA;QACTO,OAAS,EAAA;UAAEyC,QAAU,EAAA;AAAK;OAC5B,CAAA;AAEA,MAAI,IAAA;AACF,QAAM1C,MAAAA,OAAAA,CAAQ2C,IAAK,CAAA,OAAA,EAAS,IAAA,CAAA;AAC5B,QAAMC,MAAAA,MAAAA,GAAS,MAAMC,OAAAA,CAAQC,IAAK,CAAA;AAChCpC,UAAAA,UAAAA,CAAW,QAASqC,CAAAA,GAAAA,CAAIrD,UAAYI,EAAAA,EAAAA,EAAIJ,UAAAA,CAAAA;AACxC,UAAA,IAAImD,QAAe,CAACG,CAAAA,EAAGC,WACrBvD,UAAWyB,CAAAA,MAAAA,CAAO+B,iBAAiB,OAAS,EAAA,MAC1CC,UAAW,CAAA,MAAMF,OAAOvD,UAAWyB,CAAAA,MAAAA,CAAOE,MAAM,CAAG,EAAA,CAAA,CAAA,CAAA;AAGxD,SAAA,CAAA;AACD,QAAMrB,MAAAA,OAAAA,CAAQ2C,IAAK,CAAA,SAAA,EAAWC,MAAAA,CAAAA;AAC9B,QAAOA,OAAAA,MAAAA;AACT,OAAA,CAAA,OAASQ,EAAI,EAAA;AACX,QAAMC,MAAAA,CAAAA,GAAIhB,yBAAeiB,CAAAA,MAAAA,CAAOF,EAAAA,CAAAA;AAChC,QAAMpD,MAAAA,OAAAA,CAAQ2C,IAAK,CAAA,OAAA,EAASU,CAAAA,CAAAA;AAC5B,QAAMA,MAAAA,CAAAA;OACR,SAAA;AACE,QAAMrD,MAAAA,OAAAA,CAAQ2C,IAAK,CAAA,QAAA,EAAU,IAAA,CAAA;AAC7BjD,QAAAA,UAAAA,CAAW0C,OAAO,EAAA;AACpB;AACF,KAAA,EAAG1C,UAAAA,CAAAA;AACL;EAEA;AACE,IAAA,IAAA,CAAK6D,QAAQ,EAAA;AACf;EAEAC,cAAiB,GAAA;AACf,IAAO,OAAA;AACL3C,MAAAA,UAAAA,EAAY,IAAKA,CAAAA,UAAAA;AACjBC,MAAAA,KAAAA,EAAO,IAAKA,CAAAA,KAAAA;AACZC,MAAAA,OAAAA,EAAS,IAAKA,CAAAA,OAAAA;AACdC,MAAAA,QAAAA,EAAU,IAAKA,CAAAA,QAAAA;AACfhB,MAAAA,OAAAA,EAAS,IAAKA,CAAAA,OAAAA;MACdC,OAASwD,EAAAA,qBAAAA,CAAY,KAAKxD,OAAO,CAAA;MACjCgB,SAAWwC,EAAAA,qBAAAA,CAAY,KAAKxC,SAAS,CAAA;MACrCC,SAAW,EAAA,IAAIO,IAAK,CAAA,IAAA,CAAKP,SAAS;AACpC,KAAA;AACF;AAEAwC,EAAAA,YAAAA,CAAaC,QAAkD,EAAA;AAC7DxD,IAAOC,MAAAA,CAAAA,MAAAA,CAAO,MAAMuD,QAAAA,CAAAA;AACtB;AACF","file":"context.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Emitter } from \"@/emitter/emitter.js\";\nimport { createRandomHash } from \"@/internals/helpers/hash.js\";\nimport { omit } from \"remeda\";\nimport { Callback } from \"@/emitter/types.js\";\nimport { registerSignals } from \"@/internals/helpers/cancellation.js\";\nimport { Serializable } from \"@/internals/serializable.js\";\nimport { executeSequentially, LazyPromise } from \"@/internals/helpers/promise.js\";\nimport { FrameworkError } from \"@/errors.js\";\nimport { shallowCopy } from \"@/serializer/utils.js\";\n\nexport interface RunInstance<T = any> {\n  emitter: Emitter<T>;\n}\n\nexport interface RunContextCallbacks {\n  start: Callback<null>;\n  success: Callback<unknown>;\n  error: Callback<Error>;\n  finish: Callback<null>;\n}\n\nexport type GetRunContext<T, P = any> = T extends RunInstance ? RunContext<T, P> : never;\nexport type GetRunInstance<T> = T extends RunInstance<infer P> ? P : never;\n\nexport class Run<R, I extends RunInstance, P = any> extends LazyPromise<R> {\n  protected readonly tasks: (() => Promise<void>)[] = [];\n\n  constructor(\n    handler: () => Promise<R>,\n    protected readonly runContext: GetRunContext<I, P>,\n  ) {\n    super(handler);\n  }\n\n  readonly [Symbol.toStringTag] = \"Promise\";\n\n  observe(fn: (emitter: Emitter<GetRunInstance<I>>) => void) {\n    this.tasks.push(async () => fn(this.runContext.emitter));\n    return this;\n  }\n\n  context(value: object) {\n    this.tasks.push(async () => {\n      Object.assign(this.runContext.context, value);\n      Object.assign(this.runContext.emitter.context, value);\n    });\n    return this;\n  }\n\n  middleware(fn: (context: GetRunContext<I, P>) => void) {\n    this.tasks.push(async () => fn(this.runContext));\n    return this;\n  }\n\n  protected async before(): Promise<void> {\n    await super.before();\n    await executeSequentially(this.tasks.splice(0, Infinity));\n  }\n}\n\nexport interface RunContextInput<P> {\n  params: P;\n  signal?: AbortSignal;\n}\n\nexport class RunContext<T extends RunInstance, P = any> extends Serializable {\n  static #storage = new AsyncLocalStorage<RunContext<any>>();\n\n  protected readonly controller: AbortController;\n  public readonly runId: string;\n  public readonly groupId: string;\n  public readonly parentId?: string;\n  public readonly emitter;\n  public readonly context: object;\n  public readonly runParams: P;\n  public readonly createdAt: Date;\n\n  get signal() {\n    return this.controller.signal;\n  }\n\n  abort(reason?: Error) {\n    this.controller.abort(reason);\n  }\n\n  constructor(\n    public readonly instance: T,\n    protected readonly input: RunContextInput<P>,\n    parent?: RunContext<any>,\n  ) {\n    super();\n    this.createdAt = new Date();\n    this.runParams = input.params;\n    this.runId = createRandomHash(5);\n    this.parentId = parent?.runId;\n    this.groupId = parent?.groupId ?? createRandomHash();\n    this.context = omit((parent?.context ?? {}) as any, [\"id\", \"parentId\"]);\n\n    this.controller = new AbortController();\n    registerSignals(this.controller, [input.signal, parent?.signal]);\n\n    this.emitter = instance.emitter.child<GetRunInstance<T>>({\n      context: this.context,\n      trace: {\n        id: this.groupId,\n        runId: this.runId,\n        parentRunId: parent?.runId,\n      },\n    });\n    if (parent) {\n      this.emitter.pipe(parent.emitter);\n    }\n  }\n\n  destroy() {\n    this.emitter.destroy();\n    this.controller.abort(new FrameworkError(\"Context destroyed.\"));\n  }\n\n  static enter<C2 extends RunInstance, R2, P2>(\n    instance: C2,\n    input: RunContextInput<P2>,\n    fn: (context: GetRunContext<C2, P2>) => Promise<R2>,\n  ) {\n    const parent = RunContext.#storage.getStore();\n    const runContext = new RunContext(instance, input, parent) as GetRunContext<C2, P2>;\n\n    return new Run(async () => {\n      const emitter = runContext.emitter.child<RunContextCallbacks>({\n        namespace: [\"run\"],\n        creator: runContext,\n        context: { internal: true },\n      });\n\n      try {\n        await emitter.emit(\"start\", null);\n        const result = await Promise.race([\n          RunContext.#storage.run(runContext, fn, runContext),\n          new Promise<never>((_, reject) =>\n            runContext.signal.addEventListener(\"abort\", () =>\n              setTimeout(() => reject(runContext.signal.reason), 0),\n            ),\n          ),\n        ]);\n        await emitter.emit(\"success\", result);\n        return result;\n      } catch (_e) {\n        const e = FrameworkError.ensure(_e);\n        await emitter.emit(\"error\", e);\n        throw e;\n      } finally {\n        await emitter.emit(\"finish\", null);\n        runContext.destroy();\n      }\n    }, runContext);\n  }\n\n  static {\n    this.register();\n  }\n\n  createSnapshot() {\n    return {\n      controller: this.controller,\n      runId: this.runId,\n      groupId: this.groupId,\n      parentId: this.parentId,\n      emitter: this.emitter,\n      context: shallowCopy(this.context),\n      runParams: shallowCopy(this.runParams),\n      createdAt: new Date(this.createdAt),\n    };\n  }\n\n  loadSnapshot(snapshot: ReturnType<typeof this.createSnapshot>) {\n    Object.assign(this, snapshot);\n  }\n}\n"]}