@restatedev/restate-sdk 1.14.3 → 1.14.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,9 +2,9 @@ import { CancelledError, RestateError, RetryableError, RetryableErrorOptions, Te
2
2
  import { Hooks, HooksProvider, Interceptor } from "./hooks.cjs";
3
3
  import { Client, ClientCallOptions, ClientSendOptions, InferArg, ObjectHandlerOpts, ObjectOptions, ObjectOpts, Opts, RemoveVoidArgument, RetryPolicy, SendClient, SendOpts, ServiceHandlerOpts, ServiceOptions, ServiceOpts, WorkflowHandlerOpts, WorkflowOptions, WorkflowOpts, handlers, object, rpc, service, workflow } from "./types/rpc.cjs";
4
4
  import { Context, ContextDate, DurablePromise, GenericCall, GenericSend, InvocationHandle, InvocationId, InvocationIdParser, InvocationPromise, KeyValueStore, ObjectContext, ObjectSharedContext, Rand, Request, RestatePromise, RunAction, RunOptions, Target, TypedState, UntypedState, WorkflowContext, WorkflowSharedContext } from "./context.cjs";
5
- import { internal_d_exports } from "./internal.cjs";
6
5
  import { LogMetadata, LogSource, LoggerContext, LoggerTransport, RestateLogLevel } from "./logging/logger_transport.cjs";
7
6
  import { DefaultServiceOptions, RestateEndpoint, RestateEndpointBase } from "./endpoint.cjs";
7
+ import { internal_d_exports } from "./internal.cjs";
8
8
  import { isRestatePromise } from "./promises.cjs";
9
9
  import { EndpointOptions } from "./endpoint/types.cjs";
10
10
  import { Duration as Duration$1, JournalValueCodec as JournalValueCodec$1, ObjectHandler as ObjectHandler$1, RestateContext as RestateContext$1, RestateObjectContext as RestateObjectContext$1, RestateObjectSharedContext as RestateObjectSharedContext$1, RestateWorkflowContext as RestateWorkflowContext$1, RestateWorkflowSharedContext as RestateWorkflowSharedContext$1, Serde as Serde$1, Service as Service$1, ServiceDefinition as ServiceDefinition$1, ServiceDefinitionFrom as ServiceDefinitionFrom$1, ServiceHandler as ServiceHandler$1, VirtualObject as VirtualObject$1, VirtualObjectDefinition as VirtualObjectDefinition$1, VirtualObjectDefinitionFrom as VirtualObjectDefinitionFrom$1, Workflow as Workflow$1, WorkflowDefinition as WorkflowDefinition$1, WorkflowDefinitionFrom as WorkflowDefinitionFrom$1, WorkflowHandler as WorkflowHandler$1, WorkflowSharedHandler as WorkflowSharedHandler$1, serde } from "@restatedev/restate-sdk-core";
@@ -2,9 +2,9 @@ import { CancelledError, RestateError, RetryableError, RetryableErrorOptions, Te
2
2
  import { Hooks, HooksProvider, Interceptor } from "./hooks.js";
3
3
  import { Client, ClientCallOptions, ClientSendOptions, InferArg, ObjectHandlerOpts, ObjectOptions, ObjectOpts, Opts, RemoveVoidArgument, RetryPolicy, SendClient, SendOpts, ServiceHandlerOpts, ServiceOptions, ServiceOpts, WorkflowHandlerOpts, WorkflowOptions, WorkflowOpts, handlers, object, rpc, service, workflow } from "./types/rpc.js";
4
4
  import { Context, ContextDate, DurablePromise, GenericCall, GenericSend, InvocationHandle, InvocationId, InvocationIdParser, InvocationPromise, KeyValueStore, ObjectContext, ObjectSharedContext, Rand, Request, RestatePromise, RunAction, RunOptions, Target, TypedState, UntypedState, WorkflowContext, WorkflowSharedContext } from "./context.js";
5
- import { internal_d_exports } from "./internal.js";
6
5
  import { LogMetadata, LogSource, LoggerContext, LoggerTransport, RestateLogLevel } from "./logging/logger_transport.js";
7
6
  import { DefaultServiceOptions, RestateEndpoint, RestateEndpointBase } from "./endpoint.js";
7
+ import { internal_d_exports } from "./internal.js";
8
8
  import { isRestatePromise } from "./promises.js";
9
9
  import { EndpointOptions } from "./endpoint/types.js";
10
10
  import { Duration as Duration$1, JournalValueCodec as JournalValueCodec$1, ObjectHandler as ObjectHandler$1, RestateContext as RestateContext$1, RestateObjectContext as RestateObjectContext$1, RestateObjectSharedContext as RestateObjectSharedContext$1, RestateWorkflowContext as RestateWorkflowContext$1, RestateWorkflowSharedContext as RestateWorkflowSharedContext$1, Serde as Serde$1, Service as Service$1, ServiceDefinition as ServiceDefinition$1, ServiceDefinitionFrom as ServiceDefinitionFrom$1, ServiceHandler as ServiceHandler$1, VirtualObject as VirtualObject$1, VirtualObjectDefinition as VirtualObjectDefinition$1, VirtualObjectDefinitionFrom as VirtualObjectDefinitionFrom$1, Workflow as Workflow$1, WorkflowDefinition as WorkflowDefinition$1, WorkflowDefinitionFrom as WorkflowDefinitionFrom$1, WorkflowHandler as WorkflowHandler$1, WorkflowSharedHandler as WorkflowSharedHandler$1, serde as serde$1 } from "@restatedev/restate-sdk-core";
@@ -1,11 +1,11 @@
1
1
  const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
2
  const require_errors = require('./types/errors.cjs');
3
- const require_completable_promise = require('./utils/completable_promise.cjs');
4
3
  const require_promises = require('./promises.cjs');
5
4
  const require_rpc = require('./types/rpc.cjs');
6
5
  const require_sdk_shared_core_wasm_bindings = require('./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.cjs');
7
6
  const require_rand = require('./utils/rand.cjs');
8
7
  const require_io = require('./io.cjs');
8
+ const require_external_progress_channel = require('./utils/external_progress_channel.cjs');
9
9
  let __restatedev_restate_sdk_core = require("@restatedev/restate-sdk-core");
10
10
  __restatedev_restate_sdk_core = require_rolldown_runtime.__toESM(__restatedev_restate_sdk_core);
11
11
 
@@ -21,6 +21,7 @@ var ContextImpl = class {
21
21
  }
22
22
  };
23
23
  outputPump;
24
+ inputPump;
24
25
  runClosuresTracker;
25
26
  promisesExecutor;
26
27
  serviceKey;
@@ -39,8 +40,10 @@ var ContextImpl = class {
39
40
  this.journalValueCodec = journalValueCodec;
40
41
  this.rand = new require_rand.RandImpl(input.random_seed, () => {});
41
42
  this.outputPump = new require_io.OutputPump(coreVm, outputWriter);
42
- this.runClosuresTracker = new RunClosuresTracker();
43
- this.promisesExecutor = new require_promises.PromisesExecutor(coreVm, new require_io.InputPump(coreVm, inputReader, this.abortAttempt.bind(this)), this.outputPump, this.runClosuresTracker, this.abortAttempt.bind(this));
43
+ const externalProgressChannel = new require_external_progress_channel.ExternalProgressChannel();
44
+ this.runClosuresTracker = new RunClosuresTracker(externalProgressChannel);
45
+ this.inputPump = new require_io.InputPump(coreVm, inputReader, externalProgressChannel, this.abortAttempt.bind(this));
46
+ this.promisesExecutor = new require_promises.PromisesExecutor(coreVm, this.outputPump, this.runClosuresTracker, externalProgressChannel, this.abortAttempt.bind(this));
44
47
  this.serviceKey = input.key;
45
48
  this.runInterceptor = (_name, runner) => runner();
46
49
  this.defaultSerde = executionOptions?.defaultSerde ?? __restatedev_restate_sdk_core.serde.json;
@@ -404,29 +407,18 @@ var DurablePromiseImpl = class {
404
407
  }
405
408
  };
406
409
  var RunClosuresTracker = class {
407
- currentRunWaitPoint;
408
410
  runsToExecute = /* @__PURE__ */ new Map();
411
+ constructor(channel) {
412
+ this.channel = channel;
413
+ }
409
414
  executeRun(handle) {
410
415
  const runClosure = this.runsToExecute.get(handle);
411
416
  if (runClosure === void 0) throw new Error(`Handle ${handle} doesn't exist`);
412
- runClosure().finally(() => {
413
- this.unblockCurrentRunWaitPoint();
414
- }).catch(() => {});
417
+ runClosure().finally(() => this.channel.signal()).catch(() => {});
415
418
  }
416
419
  registerRunClosure(handle, runClosure) {
417
420
  this.runsToExecute.set(handle, runClosure);
418
421
  }
419
- awaitNextCompletedRun() {
420
- if (this.currentRunWaitPoint === void 0) this.currentRunWaitPoint = new require_completable_promise.CompletablePromise();
421
- return this.currentRunWaitPoint.promise;
422
- }
423
- unblockCurrentRunWaitPoint() {
424
- if (this.currentRunWaitPoint !== void 0) {
425
- const p = this.currentRunWaitPoint;
426
- this.currentRunWaitPoint = void 0;
427
- p.resolve();
428
- }
429
- }
430
422
  };
431
423
  var CommandError = class extends Error {
432
424
  constructor(cause, commandType, commandIndex) {
@@ -1,8 +1,9 @@
1
1
  import "./types/errors.cjs";
2
2
  import "./types/rpc.cjs";
3
3
  import "./context.cjs";
4
- import "./internal.cjs";
5
4
  import "./endpoint/components.cjs";
6
5
  import "./endpoint/handlers/types.cjs";
6
+ import "./io.cjs";
7
+ import "./internal.cjs";
7
8
  import "./promises.cjs";
8
9
  import { Duration, JournalValueCodec, Serde, Service, ServiceDefinitionFrom, VirtualObject, VirtualObjectDefinitionFrom, Workflow, WorkflowDefinitionFrom } from "@restatedev/restate-sdk-core";
@@ -1,8 +1,9 @@
1
1
  import "./types/errors.js";
2
2
  import "./types/rpc.js";
3
3
  import "./context.js";
4
- import "./internal.js";
5
4
  import "./endpoint/components.js";
6
5
  import "./endpoint/handlers/types.js";
6
+ import "./io.js";
7
+ import "./internal.js";
7
8
  import "./promises.js";
8
9
  import { Duration, JournalValueCodec, Serde, Service, ServiceDefinitionFrom, VirtualObject, VirtualObjectDefinitionFrom, Workflow, WorkflowDefinitionFrom } from "@restatedev/restate-sdk-core";
@@ -1 +1 @@
1
- {"version":3,"file":"context_impl.d.ts","sourceRoot":"","sources":["../src/context_impl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context_impl.d.ts","sourceRoot":"","sources":["../src/context_impl.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { INTERNAL_ERROR_CODE, RetryableError, TerminalError, UNKNOWN_ERROR_CODE, ensureError } from "./types/errors.js";
2
- import { CompletablePromise } from "./utils/completable_promise.js";
3
2
  import { CombinatorRestatePromise, ConstRestatePromise, InvocationRestatePromise, PromisesExecutor, SingleRestatePromise, pendingPromise } from "./promises.js";
4
3
  import { HandlerKind, makeRpcCallProxy, makeRpcSendProxy } from "./types/rpc.js";
5
4
  import { WasmCommandType, WasmHeader } from "./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js";
6
5
  import { RandImpl } from "./utils/rand.js";
7
6
  import { InputPump, OutputPump } from "./io.js";
7
+ import { ExternalProgressChannel } from "./utils/external_progress_channel.js";
8
8
  import { millisOrDurationToMillis, serde } from "@restatedev/restate-sdk-core";
9
9
 
10
10
  //#region src/context_impl.ts
@@ -19,6 +19,7 @@ var ContextImpl = class {
19
19
  }
20
20
  };
21
21
  outputPump;
22
+ inputPump;
22
23
  runClosuresTracker;
23
24
  promisesExecutor;
24
25
  serviceKey;
@@ -37,8 +38,10 @@ var ContextImpl = class {
37
38
  this.journalValueCodec = journalValueCodec;
38
39
  this.rand = new RandImpl(input.random_seed, () => {});
39
40
  this.outputPump = new OutputPump(coreVm, outputWriter);
40
- this.runClosuresTracker = new RunClosuresTracker();
41
- this.promisesExecutor = new PromisesExecutor(coreVm, new InputPump(coreVm, inputReader, this.abortAttempt.bind(this)), this.outputPump, this.runClosuresTracker, this.abortAttempt.bind(this));
41
+ const externalProgressChannel = new ExternalProgressChannel();
42
+ this.runClosuresTracker = new RunClosuresTracker(externalProgressChannel);
43
+ this.inputPump = new InputPump(coreVm, inputReader, externalProgressChannel, this.abortAttempt.bind(this));
44
+ this.promisesExecutor = new PromisesExecutor(coreVm, this.outputPump, this.runClosuresTracker, externalProgressChannel, this.abortAttempt.bind(this));
42
45
  this.serviceKey = input.key;
43
46
  this.runInterceptor = (_name, runner) => runner();
44
47
  this.defaultSerde = executionOptions?.defaultSerde ?? serde.json;
@@ -402,29 +405,18 @@ var DurablePromiseImpl = class {
402
405
  }
403
406
  };
404
407
  var RunClosuresTracker = class {
405
- currentRunWaitPoint;
406
408
  runsToExecute = /* @__PURE__ */ new Map();
409
+ constructor(channel) {
410
+ this.channel = channel;
411
+ }
407
412
  executeRun(handle) {
408
413
  const runClosure = this.runsToExecute.get(handle);
409
414
  if (runClosure === void 0) throw new Error(`Handle ${handle} doesn't exist`);
410
- runClosure().finally(() => {
411
- this.unblockCurrentRunWaitPoint();
412
- }).catch(() => {});
415
+ runClosure().finally(() => this.channel.signal()).catch(() => {});
413
416
  }
414
417
  registerRunClosure(handle, runClosure) {
415
418
  this.runsToExecute.set(handle, runClosure);
416
419
  }
417
- awaitNextCompletedRun() {
418
- if (this.currentRunWaitPoint === void 0) this.currentRunWaitPoint = new CompletablePromise();
419
- return this.currentRunWaitPoint.promise;
420
- }
421
- unblockCurrentRunWaitPoint() {
422
- if (this.currentRunWaitPoint !== void 0) {
423
- const p = this.currentRunWaitPoint;
424
- this.currentRunWaitPoint = void 0;
425
- p.resolve();
426
- }
427
- }
428
420
  };
429
421
  var CommandError = class extends Error {
430
422
  constructor(cause, commandType, commandIndex) {
@@ -1 +1 @@
1
- {"version":3,"file":"context_impl.js","names":["coreVm: WasmVM","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: CompletablePromise<void>","journalValueCodec: JournalValueCodec","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","handle: number","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","cancelled: InvocationId[]","ctx: ContextImpl","invocationId: InvocationId","name: string","cause: unknown","commandType: WasmCommandType","commandIndex?: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n WorkflowContext,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n WasmCommandType,\n WasmHeader,\n WasmInput,\n WasmVM,\n} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport { AsyncResultValue, CombinatorRestatePromise } from \"./promises.js\";\nimport {\n ConstRestatePromise,\n pendingPromise,\n PromisesExecutor,\n InvocationRestatePromise,\n SingleRestatePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\nimport type {\n ContextInternal,\n InvocationReference,\n SignalReference,\n} from \"./internal.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\nimport { ExecutionOptions } from \"./endpoint/components.js\";\n\nexport class ContextImpl\n implements ObjectContext, WorkflowContext, ContextInternal\n{\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n private readonly serviceKey: string;\n private runInterceptor: (\n name: string,\n runner: () => Promise<void>\n ) => Promise<void>;\n private cancellationPromise?: SingleRestatePromise<void>;\n readonly defaultSerde: Serde<any>;\n private readonly asTerminalError?: (error: any) => TerminalError | undefined;\n\n // If undefined, we're not tracking invocation id promises\n private readonly trackedInvocationIdPromises?: SingleRestatePromise<string>[];\n\n constructor(\n readonly coreVm: WasmVM,\n input: WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n readonly invocationEndPromise: CompletablePromise<void>,\n inputReader: InputReader,\n outputWriter: OutputWriter,\n readonly journalValueCodec: JournalValueCodec,\n executionOptions?: ExecutionOptions\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n this.runClosuresTracker = new RunClosuresTracker();\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n new InputPump(coreVm, inputReader, this.abortAttempt.bind(this)),\n this.outputPump,\n this.runClosuresTracker,\n this.abortAttempt.bind(this)\n );\n this.serviceKey = input.key;\n // Identity interceptor by default; replaced by startUserHandler after hooks are instantiated\n this.runInterceptor = (_name, runner) => runner();\n this.defaultSerde = executionOptions?.defaultSerde ?? serde.json;\n this.asTerminalError = executionOptions?.asTerminalError;\n this.trackedInvocationIdPromises = executionOptions?.explicitCancellation\n ? []\n : undefined;\n }\n\n setRunInterceptor(\n interceptor: (name: string, runner: () => Promise<void>) => Promise<void>\n ) {\n this.runInterceptor = interceptor;\n }\n\n isProcessing(): boolean {\n return this.coreVm.is_processing();\n }\n\n cancel(invocationId: InvocationId): void {\n this._cancel(invocationId);\n }\n\n private _cancel(invocationId: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CancelInvocation,\n () => {},\n (vm) => vm.sys_cancel_invocation(invocationId)\n );\n }\n\n attach<T>(invocationId: InvocationId, serde?: Serde<T>): RestatePromise<T> {\n return this.processCompletableEntry(\n WasmCommandType.AttachInvocation,\n () => {},\n (vm) => vm.sys_attach_invocation(invocationId),\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n );\n }\n\n public get key(): string {\n switch (this.handlerKind) {\n case HandlerKind.EXCLUSIVE:\n case HandlerKind.SHARED:\n case HandlerKind.WORKFLOW: {\n return this.serviceKey;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.Call);\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const call_handles = this.coreVm.sys_call(\n call.service,\n call.method,\n parameter,\n call.key,\n call.headers\n ? Object.entries(call.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n call.idempotencyKey,\n call.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new SingleRestatePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n this.trackedInvocationIdPromises?.push(\n invocationIdPromise as SingleRestatePromise<string>\n );\n\n return new InvocationRestatePromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.abortAttempt(e);\n // We return a pending promise to avoid the caller to see the error.\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n }\n\n public genericSend<REQ = Uint8Array>(\n send: GenericSend<REQ>\n ): InvocationHandle {\n const requestSerde = send.inputSerde ?? (serde.binary as Serde<REQ>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(send.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.OneWayCall);\n return Object.assign(ConstRestatePromise.pending<void>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const delay =\n send.delay !== undefined\n ? millisOrDurationToMillis(send.delay)\n : undefined;\n\n const handles = this.coreVm.sys_send(\n send.service,\n send.method,\n parameter,\n send.key,\n send.headers\n ? Object.entries(send.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n delay !== undefined && delay > 0 ? BigInt(delay) : undefined,\n send.idempotencyKey,\n send.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new SingleRestatePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.abortAttempt(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>({\n name,\n }: ServiceDefinitionFrom<D>): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let handle: number;\n try {\n handle = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n\n // Now prepare the run task\n const doRun: () => Promise<any> = async () => {\n // Execute the user code, wrapping with run interceptor hooks\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n await this.runInterceptor(name ?? \"\", async () => {\n res = await action();\n });\n } catch (e) {\n err = ensureError(e, this.asTerminalError);\n }\n const attemptDuration = Date.now() - startTime;\n\n // Propose the completion to the VM\n try {\n if (err !== undefined) {\n if (err instanceof TerminalError) {\n // Record failure, go ahead\n this.coreVm.propose_run_completion_failure(handle, {\n code: err.code,\n message: err.message,\n metadata: Object.entries(err.metadata ?? {}).map(\n ([key, value]) => ({ key, value })\n ),\n });\n } else if (err instanceof RetryableError) {\n this.coreVm.propose_run_completion_failure_transient_with_delay_override(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n err.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(err.retryAfter))\n : undefined,\n options?.maxRetryAttempts,\n options?.maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(options?.maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryInterval !== undefined\n ) {\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ?? 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n options?.maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(options?.maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ?? { seconds: 10 }\n ),\n };\n }\n this.coreVm.propose_run_completion_failure_transient(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n retryPolicy\n );\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n const serializedRes = serde.serialize(res);\n const encodedRes = this.journalValueCodec.encode(serializedRes);\n this.coreVm.propose_run_completion_success(handle, encodedRes);\n }\n } catch (e) {\n this.abortAttempt(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n\n // TODO: here as well\n // Return the promise\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.abortAttempt(e);\n return {\n id: \"invalid\",\n promise: ConstRestatePromise.pending(),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new SingleRestatePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string | TerminalError): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, toWasmFailure(reason));\n }\n );\n }\n\n // -- Signals\n\n public signal<T>(name: string, serde?: Serde<T>): RestatePromise<T> {\n let handle: number;\n try {\n handle = this.coreVm.sys_signal(name);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n\n return new SingleRestatePromise(\n this,\n handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public invocation(invocationId: InvocationId): InvocationReference {\n return new InvocationReferenceImpl(this, invocationId);\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n cancellation(): RestatePromise<void> {\n if (!this.cancellationPromise || this.cancellationPromise.isCompleted()) {\n this.cancellationPromise = new SingleRestatePromise(\n this,\n 1 /* HANDLE 1 is a hardcoded cancellation signal! */,\n completeSignalPromiseUsing(VoidAsUndefined)\n );\n }\n\n return this.cancellationPromise;\n }\n\n cancelPreviousCalls(): RestatePromise<InvocationId[]> {\n if (!this.trackedInvocationIdPromises) {\n return ConstRestatePromise.resolve([]);\n }\n\n return CombinatorRestatePromise.fromPromises(\n (p) => Promise.allSettled(p),\n this.trackedInvocationIdPromises.splice(0)\n ).map((results, failure) => {\n if (failure) {\n throw failure;\n }\n const cancelled: InvocationId[] = [];\n for (const result of results as PromiseSettledResult<string>[]) {\n if (result.status === \"fulfilled\") {\n this._cancel(result.value);\n cancelled.push(result.value as InvocationId);\n } else {\n this.console.warn(\n `Error when trying to get invocation id: ${result.reason}`\n );\n }\n }\n return cancelled;\n });\n }\n\n // -- Various private methods\n\n processNonCompletableEntry<T>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, input: T) => void\n ) {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n }\n }\n\n processCompletableEntry<T, U>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, t: T) => number,\n ...completers: Array<Completer>\n ): RestatePromise<U> {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return ConstRestatePromise.pending();\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n abortAttempt(e: unknown, commandType?: WasmCommandType) {\n // ensureError so interceptors always receive a proper Error,\n // not a raw VM object like { code, message }.\n this.invocationEndPromise.reject(\n commandType !== undefined\n ? new CommandError(e, commandType)\n : ensureError(e)\n );\n }\n}\n\nfunction toWasmFailure(reason: string | TerminalError): vm.WasmFailure {\n if (typeof reason === \"string\") {\n return {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n metadata: [],\n };\n }\n return {\n code: reason.code,\n message: reason.message,\n metadata: Object.entries(reason.metadata ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n };\n}\n\nfunction unpackRunParameters<T>(\n a: string | RunAction<T>,\n b?: RunAction<T>\n): { name?: string; action: RunAction<T> } {\n if (typeof a === \"string\") {\n if (typeof b !== \"function\") {\n throw new TypeError(\"\");\n }\n return { name: a, action: b };\n }\n if (typeof a !== \"function\") {\n throw new TypeError(\"unexpected type at the first parameter\");\n }\n if (b) {\n throw new TypeError(\"unexpected a function as a second parameter.\");\n }\n return { action: a };\n}\n\nclass InvocationReferenceImpl implements InvocationReference {\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId\n ) {}\n\n signal<T>(name: string, serde?: Serde<T>): SignalReference<T> {\n return new SignalReferenceImpl(this.ctx, this.invocationId, name, serde);\n }\n\n cancel(): void {\n this.ctx.cancel(this.invocationId);\n }\n\n attach<T>(serde?: Serde<T>): RestatePromise<T> {\n return this.ctx.attach(this.invocationId, serde);\n }\n}\n\nclass SignalReferenceImpl<T> implements SignalReference<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n resolve(payload?: T): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () =>\n this.ctx.journalValueCodec.encode(this.serde.serialize(payload as T)),\n (vm, bytes) =>\n vm.sys_complete_signal_success(this.invocationId, this.name, bytes)\n );\n }\n\n reject(reason: string | TerminalError): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () => {},\n (vm) => {\n vm.sys_complete_signal_failure(\n this.invocationId,\n this.name,\n toWasmFailure(reason)\n );\n }\n );\n }\n}\n\nclass DurablePromiseImpl<T> implements DurablePromise<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.get().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.get().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.get().finally(onfinally);\n }\n\n [Symbol.toStringTag] = \"DurablePromise\";\n\n get(): RestatePromise<T> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.GetPromise,\n () => {},\n (vm) => vm.sys_get_promise(this.name),\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n peek(): Promise<T | undefined> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.PeekPromise,\n () => {},\n (vm) => vm.sys_peek_promise(this.name),\n VoidAsUndefined,\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n resolve(value?: T): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => this.ctx.journalValueCodec.encode(this.serde.serialize(value as T)),\n (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes),\n VoidAsUndefined,\n Failure\n );\n }\n\n reject(errorMsg: string): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => {},\n (vm) =>\n vm.sys_complete_promise_failure(this.name, {\n code: INTERNAL_ERROR_CODE,\n message: errorMsg,\n metadata: [],\n }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private currentRunWaitPoint?: CompletablePromise<void>;\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => {\n this.unblockCurrentRunWaitPoint();\n })\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n\n awaitNextCompletedRun(): Promise<void> {\n if (this.currentRunWaitPoint === undefined) {\n this.currentRunWaitPoint = new CompletablePromise();\n }\n return this.currentRunWaitPoint.promise;\n }\n\n private unblockCurrentRunWaitPoint() {\n if (this.currentRunWaitPoint !== undefined) {\n const p = this.currentRunWaitPoint;\n this.currentRunWaitPoint = undefined;\n p.resolve();\n }\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: CompletablePromise<any>\n) => Promise<boolean>;\n\n// Wraps an error with command metadata so the centralized catch in\n// process() can call the right VM notification method.\n//\n// - Preparation failure (command not yet in journal): new CommandError(e, type)\n// → notify_error_for_next_command\n// - Completion failure (command exists): new CommandError(e, type, index)\n// → notify_error_for_specific_command\nexport class CommandError extends Error {\n constructor(cause: unknown, commandType: WasmCommandType);\n constructor(\n cause: unknown,\n commandType: WasmCommandType,\n commandIndex: number\n );\n constructor(\n override readonly cause: unknown,\n readonly commandType: WasmCommandType,\n readonly commandIndex?: number\n ) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n super(msg, { cause });\n }\n\n /** True when the error is for a specific command that exists in the journal. */\n get hasCommandIndex(): boolean {\n return this.commandIndex !== undefined;\n }\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new CommandError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n const metadata = (value.Failure.metadata ?? []).reduce(\n (\n acc: Record<string, string>,\n { key, value: v }: { key: string; value: string }\n ) => {\n acc[key] = v;\n return acc;\n },\n {} as Record<string, string>\n );\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\n metadata,\n })\n );\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst StateKeys: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"StateKeys\" in value) {\n prom.resolve(value.StateKeys);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst InvocationIdCompleter: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"InvocationId\" in value) {\n prom.resolve(value.InvocationId);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n"],"mappings":";;;;;;;;;;AAgFA,IAAa,cAAb,MAEA;CACE,AAAgB;CAEhB,AAAgB,OAAoB;EAClC,WAA4B;AAC1B,UAAO,KAAK,UAAU,KAAK,KAAK,CAAC;;EAGnC,cAA+B;AAC7B,UAAO,KAAK,2BAAU,IAAI,MAAM,EAAC,QAAQ,CAAC;;EAE7C;CAED,AAAiB;CACjB,AAAiB;CACjB,AAAS;CACT,AAAiB;CACjB,AAAQ;CAIR,AAAQ;CACR,AAAS;CACT,AAAiB;CAGjB,AAAiB;CAEjB,YACE,AAASA,QACT,OACA,AAAgBC,SAChB,AAAgBC,aAChB,AAASC,UACT,AAAiBC,mBACjB,AAASC,sBACT,aACA,cACA,AAASC,mBACT,kBACA;EAXS;EAEO;EACA;EACP;EACQ;EACR;EAGA;AAGT,OAAK,OAAO,IAAI,SAAS,MAAM,mBAAmB,GAOhD;AACF,OAAK,aAAa,IAAI,WAAW,QAAQ,aAAa;AACtD,OAAK,qBAAqB,IAAI,oBAAoB;AAClD,OAAK,mBAAmB,IAAI,iBAC1B,QACA,IAAI,UAAU,QAAQ,aAAa,KAAK,aAAa,KAAK,KAAK,CAAC,EAChE,KAAK,YACL,KAAK,oBACL,KAAK,aAAa,KAAK,KAAK,CAC7B;AACD,OAAK,aAAa,MAAM;AAExB,OAAK,kBAAkB,OAAO,WAAW,QAAQ;AACjD,OAAK,eAAe,kBAAkB,gBAAgB,MAAM;AAC5D,OAAK,kBAAkB,kBAAkB;AACzC,OAAK,8BAA8B,kBAAkB,uBACjD,EAAE,GACF;;CAGN,kBACE,aACA;AACA,OAAK,iBAAiB;;CAGxB,eAAwB;AACtB,SAAO,KAAK,OAAO,eAAe;;CAGpC,OAAO,cAAkC;AACvC,OAAK,QAAQ,aAAa;;CAG5B,AAAQ,QAAQ,cAA4B;AAC1C,OAAK,2BACH,gBAAgB,wBACV,KACL,OAAO,GAAG,sBAAsB,aAAa,CAC/C;;CAGH,OAAU,cAA4B,SAAqC;AACzE,SAAO,KAAK,wBACV,gBAAgB,wBACV,KACL,OAAO,GAAG,sBAAsB,aAAa,EAC9C,iBAAiBC,WAAS,KAAK,cAAc,KAAK,kBAAkB,EACpE,QACD;;CAGH,IAAW,MAAc;AACvB,UAAQ,KAAK,aAAb;GACE,KAAK,YAAY;GACjB,KAAK,YAAY;GACjB,KAAK,YAAY,SACf,QAAO,KAAK;GAEd,QACE,OAAM,IAAI,cAAc,0CAA0C;;;CAIxE,AAAO,UAAmB;AACxB,SAAO,KAAK;;CAGd,AAAO,IAAO,MAAc,SAA4C;AACtE,SAAO,KAAK,wBACV,gBAAgB,gBACV,KACL,OAAO,GAAG,cAAc,KAAK,EAC9B,YACA,iBAAiBA,WAAS,KAAK,cAAc,KAAK,kBAAkB,CACrE;;CAGH,AAAO,YAA2C;AAChD,SAAO,KAAK,wBACV,gBAAgB,oBACV,KACL,OAAO,GAAG,oBAAoB,EAC/B,UACD;;CAGH,AAAO,IAAO,MAAc,OAAU,SAAwB;AAC5D,OAAK,2BACH,gBAAgB,gBAEd,KAAK,kBAAkB,QACpBA,WAAS,KAAK,cAAc,UAAU,MAAM,CAC9C,GACF,IAAI,UAAU,GAAG,cAAc,MAAM,MAAM,CAC7C;;CAGH,AAAO,MAAM,MAAoB;AAC/B,OAAK,2BACH,gBAAgB,kBACV,KACL,OAAO,GAAG,gBAAgB,KAAK,CACjC;;CAGH,AAAO,WAAiB;AACtB,OAAK,2BACH,gBAAgB,qBACV,KACL,OAAO,GAAG,qBAAqB,CACjC;;CAKH,AAAO,YACL,MACwB;EACxB,MAAMC,eACJ,KAAK,cAAe,MAAM;EAC5B,MAAMC,gBACJ,KAAK,eAAgB,MAAM;EAE7B,IAAIC;AACJ,MAAI;AACF,eAAY,KAAK,kBAAkB,OACjC,aAAa,UAAU,KAAK,UAAU,CACvC;WACM,GAAG;AACV,QAAK,aAAa,GAAG,gBAAgB,KAAK;AAC1C,UAAO,OAAO,OAAO,oBAAoB,SAAc,EAAE,EACvD,cAAc,gBAA8B,EAC7C,CAAC;;AAGJ,MAAI;GACF,MAAM,eAAe,KAAK,OAAO,SAC/B,KAAK,SACL,KAAK,QACL,WACA,KAAK,KACL,KAAK,UACD,OAAO,QAAQ,KAAK,QAAQ,CAAC,KAC1B,CAAC,KAAK,WAAW,IAAI,WAAW,KAAK,MAAM,CAC7C,GACD,EAAE,EACN,KAAK,gBACL,KAAK,KACN;GACD,MAAM,eAAe,KAAK,OAAO,oBAAoB;GAErD,MAAM,sBAAsB,IAAI,qBAC9B,MACA,aAAa,6BACb,4BACE,gBAAgB,MAChB,cACA,sBACD,CACF;AAED,QAAK,6BAA6B,KAChC,oBACD;AAED,UAAO,IAAI,yBACT,MACA,aAAa,oBACb,4BACE,gBAAgB,MAChB,cACA,iBAAiB,eAAe,KAAK,kBAAkB,EACvD,QACD,EACD,oBACD;WACM,GAAG;AACV,QAAK,aAAa,EAAE;AAEpB,UAAO,OAAO,OAAO,oBAAoB,SAAc,EAAE,EACvD,cAAc,gBAA8B,EAC7C,CAAC;;;CAIN,AAAO,YACL,MACkB;EAClB,MAAM,eAAe,KAAK,cAAe,MAAM;EAE/C,IAAIA;AACJ,MAAI;AACF,eAAY,KAAK,kBAAkB,OACjC,aAAa,UAAU,KAAK,UAAU,CACvC;WACM,GAAG;AACV,QAAK,aAAa,GAAG,gBAAgB,WAAW;AAChD,UAAO,OAAO,OAAO,oBAAoB,SAAe,EAAE,EACxD,cAAc,gBAA8B,EAC7C,CAAC;;AAGJ,MAAI;GACF,MAAM,QACJ,KAAK,UAAU,SACX,yBAAyB,KAAK,MAAM,GACpC;GAEN,MAAM,UAAU,KAAK,OAAO,SAC1B,KAAK,SACL,KAAK,QACL,WACA,KAAK,KACL,KAAK,UACD,OAAO,QAAQ,KAAK,QAAQ,CAAC,KAC1B,CAAC,KAAK,WAAW,IAAI,WAAW,KAAK,MAAM,CAC7C,GACD,EAAE,EACN,UAAU,UAAa,QAAQ,IAAI,OAAO,MAAM,GAAG,QACnD,KAAK,gBACL,KAAK,KACN;GACD,MAAM,eAAe,KAAK,OAAO,oBAAoB;AAErD,UAAO,EACL,cAAc,IAAI,qBAChB,MACA,QAAQ,6BACR,4BACE,gBAAgB,YAChB,cACA,sBACD,CACF,EACF;WACM,GAAG;AACV,QAAK,aAAa,EAAE;AACpB,UAAO,EACL,cAAc,gBAAgB,EAC/B;;;CAIL,cAAiB,EAAE,QAAsD;AACvE,SAAO,kBACJ,SAAS,KAAK,YAAY,KAAK,EAChC,KAAK,cAEL,KACD;;CAGH,aACE,EAAE,QACF,KAC0B;AAC1B,SAAO,kBACJ,SAAS,KAAK,YAAY,KAAK,EAChC,KAAK,cACL,MACA,IACD;;CAGH,eACE,EAAE,QACF,KACqB;AACrB,SAAO,kBACJ,SAAS,KAAK,YAAY,KAAK,EAChC,KAAK,cACL,MACA,IACD;;CAGH,AAAO,kBAAqB,EAC1B,QACmD;AACnD,SAAO,kBACJ,SAAS,KAAK,YAAY,KAAK,EAChC,KAAK,cACL,MACA,OACD;;CAGH,AAAO,iBACL,EAAE,QACF,KAC8B;AAC9B,SAAO,kBACJ,SAAS,KAAK,YAAY,KAAK,EAChC,KAAK,cACL,MACA,IACD;;CAGH,mBACE,EAAE,QACF,KACyB;AACzB,SAAO,kBACJ,SAAS,KAAK,YAAY,KAAK,EAChC,KAAK,cACL,MACA,IACD;;CAOH,AAAO,IACL,cACA,uBACA,SACmB;EACnB,MAAM,EAAE,MAAM,WAAW,oBACvB,cACA,sBACD;EACD,MAAMH,UAAQ,SAAS,SAAS,KAAK;EAGrC,IAAII;AACJ,MAAI;AACF,YAAS,KAAK,OAAO,QAAQ,QAAQ,GAAG;WACjC,GAAG;AACV,QAAK,aAAa,EAAE;AACpB,UAAO,oBAAoB,SAAS;;EAEtC,MAAM,eAAe,KAAK,OAAO,oBAAoB;EAGrD,MAAMC,QAA4B,YAAY;GAE5C,MAAM,YAAY,KAAK,KAAK;GAC5B,IAAIC;GACJ,IAAI;AACJ,OAAI;AACF,UAAM,KAAK,eAAe,QAAQ,IAAI,YAAY;AAChD,WAAM,MAAM,QAAQ;MACpB;YACK,GAAG;AACV,UAAM,YAAY,GAAG,KAAK,gBAAgB;;GAE5C,MAAM,kBAAkB,KAAK,KAAK,GAAG;AAGrC,OAAI;AACF,QAAI,QAAQ,OACV,KAAI,eAAe,cAEjB,MAAK,OAAO,+BAA+B,QAAQ;KACjD,MAAM,IAAI;KACV,SAAS,IAAI;KACb,UAAU,OAAO,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC,KAC1C,CAAC,KAAK,YAAY;MAAE;MAAK;MAAO,EAClC;KACF,CAAC;aACO,eAAe,eACxB,MAAK,OAAO,6DACV,QACA,IAAI,SACJ,IAAI,OACJ,OAAO,gBAAgB,EACvB,IAAI,eAAe,SACf,OAAO,yBAAyB,IAAI,WAAW,CAAC,GAChD,QACJ,SAAS,kBACT,SAAS,qBAAqB,SAC1B,OAAO,yBAAyB,SAAS,iBAAiB,CAAC,GAC3D,OACL;SACI;AACL,UAAK,SAAS,KACZ,kCAAkC,KAAK,OACvC,IACD;KAGD,IAAI;AACJ,SACE,SAAS,wBAAwB,UACjC,SAAS,qBAAqB,UAC9B,SAAS,yBAAyB,UAClC,SAAS,qBAAqB,UAC9B,SAAS,qBAAqB,OAE9B,eAAc;MACZ,QAAQ,SAAS,uBAAuB;MACxC,kBAAkB,yBAChB,SAAS,wBAAwB,GAClC;MACD,cAAc,SAAS;MACvB,cACE,SAAS,qBAAqB,SAC1B,SACA,yBAAyB,SAAS,iBAAiB;MACzD,cAAc,yBACZ,SAAS,oBAAoB,EAAE,SAAS,IAAI,CAC7C;MACF;AAEH,UAAK,OAAO,yCACV,QACA,IAAI,SACJ,IAAI,OACJ,OAAO,gBAAgB,EACvB,YACD;;SAEE;KAGL,MAAM,gBAAgBN,QAAM,UAAU,IAAI;KAC1C,MAAM,aAAa,KAAK,kBAAkB,OAAO,cAAc;AAC/D,UAAK,OAAO,+BAA+B,QAAQ,WAAW;;YAEzD,GAAG;AACV,SAAK,aAAa,EAAE;AACpB,WAAO,gBAAmB;;AAE5B,SAAM,KAAK,WAAW,mBAAmB;;AAI3C,OAAK,mBAAmB,mBAAmB,QAAQ,MAAM;AAIzD,SAAO,IAAI,qBACT,MACA,QACA,4BACE,gBAAgB,KAChB,cACA,iBAAiBA,SAAO,KAAK,kBAAkB,EAC/C,QACD,CACF;;CAGH,AAAO,MACL,UACA,MACsB;AACtB,SAAO,KAAK,wBACV,gBAAgB,aACV;AACJ,OAAI,aAAa,OACf,OAAM,IAAI,MAAM,yBAAyB;GAE3C,MAAM,SAAS,yBAAyB,SAAS;AACjD,OAAI,SAAS,EACX,OAAM,IAAI,MACR,oCAAoC,OAAO,+HAC5C;AAEH,UAAO,OAAO,OAAO;MAEtB,IAAI,WAAW,GAAG,UAAU,QAAQ,KAAK,EAC1C,gBACD;;CAKH,AAAO,UAAa,SAGlB;EACA,IAAIO;AACJ,MAAI;AACF,eAAY,KAAK,OAAO,eAAe;WAChC,GAAG;AACV,QAAK,aAAa,EAAE;AACpB,UAAO;IACL,IAAI;IACJ,SAAS,oBAAoB,SAAS;IACvC;;AAGH,SAAO;GACL,IAAI,UAAU;GACd,SAAS,IAAI,qBACX,MACA,UAAU,QACV,2BACE,iBACA,iBAAiBP,WAAS,KAAK,cAAc,KAAK,kBAAkB,EACpE,QACD,CACF;GACF;;CAGH,AAAO,iBAAoB,IAAY,SAAa,SAAwB;AAC1E,OAAK,2BACH,gBAAgB,yBACV;GAEJ,IAAIQ;AAEJ,OAAIR,QACF,SACE,YAAY,SAAY,IAAI,YAAY,GAAGA,QAAM,UAAU,QAAQ;OAErE,SACE,YAAY,SACR,KAAK,aAAa,UAAU,QAAQ,GACpC,KAAK,aAAa,UAAU,KAAK;AAEzC,UAAO,KAAK,kBAAkB,OAAO,MAAM;MAE5C,IAAI,UAAU,GAAG,+BAA+B,IAAI,MAAM,CAC5D;;CAGH,AAAO,gBAAgB,IAAY,QAAsC;AACvE,OAAK,2BACH,gBAAgB,yBACV,KACL,OAAO;AACN,MAAG,+BAA+B,IAAI,cAAc,OAAO,CAAC;IAE/D;;CAKH,AAAO,OAAU,MAAc,SAAqC;EAClE,IAAII;AACJ,MAAI;AACF,YAAS,KAAK,OAAO,WAAW,KAAK;WAC9B,GAAG;AACV,QAAK,aAAa,EAAE;AACpB,UAAO,oBAAoB,SAAS;;AAGtC,SAAO,IAAI,qBACT,MACA,QACA,2BACE,iBACA,iBAAiBJ,WAAS,KAAK,cAAc,KAAK,kBAAkB,EACpE,QACD,CACF;;CAGH,AAAO,WAAW,cAAiD;AACjE,SAAO,IAAI,wBAAwB,MAAM,aAAa;;CAGxD,AAAO,QAAW,MAAc,SAAqC;AACnE,SAAO,IAAI,mBAAmB,MAAM,MAAMA,QAAM;;CAGlD,eAAqC;AACnC,MAAI,CAAC,KAAK,uBAAuB,KAAK,oBAAoB,aAAa,CACrE,MAAK,sBAAsB,IAAI,qBAC7B,MACA,GACA,2BAA2B,gBAAgB,CAC5C;AAGH,SAAO,KAAK;;CAGd,sBAAsD;AACpD,MAAI,CAAC,KAAK,4BACR,QAAO,oBAAoB,QAAQ,EAAE,CAAC;AAGxC,SAAO,yBAAyB,cAC7B,MAAM,QAAQ,WAAW,EAAE,EAC5B,KAAK,4BAA4B,OAAO,EAAE,CAC3C,CAAC,KAAK,SAAS,YAAY;AAC1B,OAAI,QACF,OAAM;GAER,MAAMS,YAA4B,EAAE;AACpC,QAAK,MAAM,UAAU,QACnB,KAAI,OAAO,WAAW,aAAa;AACjC,SAAK,QAAQ,OAAO,MAAM;AAC1B,cAAU,KAAK,OAAO,MAAsB;SAE5C,MAAK,QAAQ,KACX,2CAA2C,OAAO,SACnD;AAGL,UAAO;IACP;;CAKJ,2BACE,aACA,SACA,QACA;EACA,IAAI;AACJ,MAAI;AACF,WAAQ,SAAS;WACV,GAAG;AACV,QAAK,aAAa,GAAG,YAAY;AACjC;;AAGF,MAAI;AACF,UAAO,KAAK,QAAQ,MAAM;WACnB,GAAG;AACV,QAAK,aAAa,EAAE;;;CAIxB,wBACE,aACA,SACA,QACA,GAAG,YACgB;EACnB,IAAI;AACJ,MAAI;AACF,WAAQ,SAAS;WACV,GAAG;AACV,QAAK,aAAa,GAAG,YAAY;AACjC,UAAO,oBAAoB,SAAS;;EAGtC,IAAIL;AACJ,MAAI;AACF,YAAS,OAAO,KAAK,QAAQ,MAAM;WAC5B,GAAG;AACV,QAAK,aAAa,EAAE;AACpB,UAAO,oBAAoB,SAAS;;EAEtC,MAAM,eAAe,KAAK,OAAO,oBAAoB;AACrD,SAAO,IAAI,qBACT,MACA,QACA,4BAA4B,aAAa,cAAc,GAAG,WAAW,CACtE;;CAGH,aAAa,GAAY,aAA+B;AAGtD,OAAK,qBAAqB,OACxB,gBAAgB,SACZ,IAAI,aAAa,GAAG,YAAY,GAChC,YAAY,EAAE,CACnB;;;AAIL,SAAS,cAAc,QAAgD;AACrE,KAAI,OAAO,WAAW,SACpB,QAAO;EACL,MAAM;EACN,SAAS;EACT,UAAU,EAAE;EACb;AAEH,QAAO;EACL,MAAM,OAAO;EACb,SAAS,OAAO;EAChB,UAAU,OAAO,QAAQ,OAAO,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY;GACrE;GACA;GACD,EAAE;EACJ;;AAGH,SAAS,oBACP,GACA,GACyC;AACzC,KAAI,OAAO,MAAM,UAAU;AACzB,MAAI,OAAO,MAAM,WACf,OAAM,IAAI,UAAU,GAAG;AAEzB,SAAO;GAAE,MAAM;GAAG,QAAQ;GAAG;;AAE/B,KAAI,OAAO,MAAM,WACf,OAAM,IAAI,UAAU,yCAAyC;AAE/D,KAAI,EACF,OAAM,IAAI,UAAU,+CAA+C;AAErE,QAAO,EAAE,QAAQ,GAAG;;AAGtB,IAAM,0BAAN,MAA6D;CAC3D,YACE,AAAiBM,KACjB,AAAiBC,cACjB;EAFiB;EACA;;CAGnB,OAAU,MAAc,SAAsC;AAC5D,SAAO,IAAI,oBAAoB,KAAK,KAAK,KAAK,cAAc,MAAMX,QAAM;;CAG1E,SAAe;AACb,OAAK,IAAI,OAAO,KAAK,aAAa;;CAGpC,OAAU,SAAqC;AAC7C,SAAO,KAAK,IAAI,OAAO,KAAK,cAAcA,QAAM;;;AAIpD,IAAM,sBAAN,MAA2D;CACzD,AAAiB;CAEjB,YACE,AAAiBU,KACjB,AAAiBC,cACjB,AAAiBC,MACjB,SACA;EAJiB;EACA;EACA;AAGjB,OAAK,QAAQZ,WAAU,KAAK,IAAI;;CAGlC,QAAQ,SAAmB;AACzB,OAAK,IAAI,2BACP,gBAAgB,kBAEd,KAAK,IAAI,kBAAkB,OAAO,KAAK,MAAM,UAAU,QAAa,CAAC,GACtE,IAAI,UACH,GAAG,4BAA4B,KAAK,cAAc,KAAK,MAAM,MAAM,CACtE;;CAGH,OAAO,QAAsC;AAC3C,OAAK,IAAI,2BACP,gBAAgB,kBACV,KACL,OAAO;AACN,MAAG,4BACD,KAAK,cACL,KAAK,MACL,cAAc,OAAO,CACtB;IAEJ;;;AAIL,IAAM,qBAAN,MAAyD;CACvD,AAAiB;CAEjB,YACE,AAAiBU,KACjB,AAAiBE,MACjB,SACA;EAHiB;EACA;AAGjB,OAAK,QAAQZ,WAAU,KAAK,IAAI;;CAGlC,KACE,aACA,YAC8B;AAC9B,SAAO,KAAK,KAAK,CAAC,KAAK,aAAa,WAAW;;CAGjD,MACE,YACsB;AACtB,SAAO,KAAK,KAAK,CAAC,MAAM,WAAW;;CAGrC,QAAQ,WAA6C;AACnD,SAAO,KAAK,KAAK,CAAC,QAAQ,UAAU;;CAGtC,CAAC,OAAO,eAAe;CAEvB,MAAyB;AACvB,SAAO,KAAK,IAAI,wBACd,gBAAgB,kBACV,KACL,OAAO,GAAG,gBAAgB,KAAK,KAAK,EACrC,iBAAiB,KAAK,OAAO,KAAK,IAAI,kBAAkB,EACxD,QACD;;CAGH,OAA+B;AAC7B,SAAO,KAAK,IAAI,wBACd,gBAAgB,mBACV,KACL,OAAO,GAAG,iBAAiB,KAAK,KAAK,EACtC,iBACA,iBAAiB,KAAK,OAAO,KAAK,IAAI,kBAAkB,EACxD,QACD;;CAGH,QAAQ,OAA0B;AAChC,SAAO,KAAK,IAAI,wBACd,gBAAgB,uBACV,KAAK,IAAI,kBAAkB,OAAO,KAAK,MAAM,UAAU,MAAW,CAAC,GACxE,IAAI,UAAU,GAAG,6BAA6B,KAAK,MAAM,MAAM,EAChE,iBACA,QACD;;CAGH,OAAO,UAAiC;AACtC,SAAO,KAAK,IAAI,wBACd,gBAAgB,uBACV,KACL,OACC,GAAG,6BAA6B,KAAK,MAAM;GACzC,MAAM;GACN,SAAS;GACT,UAAU,EAAE;GACb,CAAC,EACJ,iBACA,QACD;;;AAKL,IAAa,qBAAb,MAAgC;CAC9B,AAAQ;CACR,AAAQ,gCAAiD,IAAI,KAG1D;CAEH,WAAW,QAAgB;EACzB,MAAM,aAAa,KAAK,cAAc,IAAI,OAAO;AACjD,MAAI,eAAe,OACjB,OAAM,IAAI,MAAM,UAAU,OAAO,gBAAgB;AAEnD,cAAY,CACT,cAAc;AACb,QAAK,4BAA4B;IACjC,CACD,YAAY,GAAG;;CAGpB,mBAAmB,QAAgB,YAAgC;AACjE,OAAK,cAAc,IAAI,QAAQ,WAAW;;CAG5C,wBAAuC;AACrC,MAAI,KAAK,wBAAwB,OAC/B,MAAK,sBAAsB,IAAI,oBAAoB;AAErD,SAAO,KAAK,oBAAoB;;CAGlC,AAAQ,6BAA6B;AACnC,MAAI,KAAK,wBAAwB,QAAW;GAC1C,MAAM,IAAI,KAAK;AACf,QAAK,sBAAsB;AAC3B,KAAE,SAAS;;;;AAmBjB,IAAa,eAAb,cAAkC,MAAM;CAOtC,YACE,AAAkBa,OAClB,AAASC,aACT,AAASC,cACT;EACA,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAClE,QAAM,KAAK,EAAE,OAAO,CAAC;EALH;EACT;EACA;;;CAOX,IAAI,kBAA2B;AAC7B,SAAO,KAAK,iBAAiB;;;AAIjC,SAAS,4BACP,aACA,cACA,GAAG,YACsE;AACzE,QAAO,OAAO,OAAyB,SAAkC;AACvE,MAAI;AACF,QAAK,MAAM,aAAa,WACtB,KAAI,MAAM,UAAU,OAAO,KAAK,CAC9B;WAGG,GAAG;AAEV,SAAM,IAAI,aAAa,GAAG,aAAa,aAAa;;AAGtD,QAAM,IAAI,MACR,uCAAuC,KAAK,UAAU,MAAM,GAC7D;;;AAKL,SAAS,2BACP,GAAG,YACsE;AACzE,QAAO,OAAO,OAAyB,SAAkC;AACvE,OAAK,MAAM,aAAa,WACtB,KAAI,MAAM,UAAU,OAAO,KAAK,CAC9B;AAIJ,QAAM,IAAI,MACR,uCAAuC,KAAK,UAAU,MAAM,GAC7D;;;AAIL,MAAMC,cAAyB,OAAO,SAAS;AAC7C,KAAI,UAAU,SAAS;AACrB,OAAK,QAAQ,KAAK;AAClB,SAAO,QAAQ,QAAQ,KAAK;;AAE9B,QAAO,QAAQ,QAAQ,MAAM;;AAE/B,MAAMC,mBAA8B,OAAO,SAAS;AAClD,KAAI,UAAU,SAAS;AACrB,OAAK,QAAQ,OAAU;AACvB,SAAO,QAAQ,QAAQ,KAAK;;AAE9B,QAAO,QAAQ,QAAQ,MAAM;;AAG/B,SAAS,iBACP,SACA,cACA,WACW;AACX,QAAO,OAAO,OAAO,SAAS;AAC5B,MAAI,OAAO,UAAU,YAAY,EAAE,aAAa,OAC9C,QAAO;EAET,IAAIC;AACJ,MAAI,iBAAiB,OACnB,UAAS,MAAM,aAAa,OAAO,MAAM,QAAQ;MAEjD,UAAS,MAAM;EAEjB,IAAI,MAAMlB,QAAM,YAAY,OAAO;AACnC,MAAI,UACF,OAAM,UAAU,IAAI;AAEtB,OAAK,QAAQ,IAAI;AACjB,SAAO;;;AAIX,MAAMmB,WAAsB,OAAO,SAAS;AAC1C,KAAI,OAAO,UAAU,YAAY,aAAa,OAAO;EACnD,MAAM,YAAY,MAAM,QAAQ,YAAY,EAAE,EAAE,QAE5C,KACA,EAAE,KAAK,OAAO,QACX;AACH,OAAI,OAAO;AACX,UAAO;KAET,EAAE,CACH;AACD,OAAK,OACH,IAAI,cAAc,MAAM,QAAQ,SAAS;GACvC,WAAW,MAAM,QAAQ;GACzB;GACD,CAAC,CACH;AACD,SAAO,QAAQ,QAAQ,KAAK;;AAE9B,QAAO,QAAQ,QAAQ,MAAM;;AAG/B,MAAMC,aAAwB,OAAO,SAAS;AAC5C,KAAI,OAAO,UAAU,YAAY,eAAe,OAAO;AACrD,OAAK,QAAQ,MAAM,UAAU;AAC7B,SAAO,QAAQ,QAAQ,KAAK;;AAE9B,QAAO,QAAQ,QAAQ,MAAM;;AAG/B,MAAMC,yBAAoC,OAAO,SAAS;AACxD,KAAI,OAAO,UAAU,YAAY,kBAAkB,OAAO;AACxD,OAAK,QAAQ,MAAM,aAAa;AAChC,SAAO,QAAQ,QAAQ,KAAK;;AAE9B,QAAO,QAAQ,QAAQ,MAAM"}
1
+ {"version":3,"file":"context_impl.js","names":["coreVm: WasmVM","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: CompletablePromise<void>","journalValueCodec: JournalValueCodec","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","handle: number","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","cancelled: InvocationId[]","ctx: ContextImpl","invocationId: InvocationId","name: string","channel: ExternalProgressChannel","cause: unknown","commandType: WasmCommandType","commandIndex?: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n WorkflowContext,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n WasmCommandType,\n WasmHeader,\n WasmInput,\n WasmVM,\n} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport { AsyncResultValue, CombinatorRestatePromise } from \"./promises.js\";\nimport {\n ConstRestatePromise,\n pendingPromise,\n PromisesExecutor,\n InvocationRestatePromise,\n SingleRestatePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\nimport { ExternalProgressChannel } from \"./utils/external_progress_channel.js\";\nimport type {\n ContextInternal,\n InvocationReference,\n SignalReference,\n} from \"./internal.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\nimport { ExecutionOptions } from \"./endpoint/components.js\";\n\nexport class ContextImpl\n implements ObjectContext, WorkflowContext, ContextInternal\n{\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n readonly inputPump: InputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n private readonly serviceKey: string;\n private runInterceptor: (\n name: string,\n runner: () => Promise<void>\n ) => Promise<void>;\n private cancellationPromise?: SingleRestatePromise<void>;\n readonly defaultSerde: Serde<any>;\n private readonly asTerminalError?: (error: any) => TerminalError | undefined;\n\n // If undefined, we're not tracking invocation id promises\n private readonly trackedInvocationIdPromises?: SingleRestatePromise<string>[];\n\n constructor(\n readonly coreVm: WasmVM,\n input: WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n readonly invocationEndPromise: CompletablePromise<void>,\n inputReader: InputReader,\n outputWriter: OutputWriter,\n readonly journalValueCodec: JournalValueCodec,\n executionOptions?: ExecutionOptions\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n const externalProgressChannel = new ExternalProgressChannel();\n this.runClosuresTracker = new RunClosuresTracker(externalProgressChannel);\n this.inputPump = new InputPump(\n coreVm,\n inputReader,\n externalProgressChannel,\n this.abortAttempt.bind(this)\n );\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n this.outputPump,\n this.runClosuresTracker,\n externalProgressChannel,\n this.abortAttempt.bind(this)\n );\n this.serviceKey = input.key;\n // Identity interceptor by default; replaced by startUserHandler after hooks are instantiated\n this.runInterceptor = (_name, runner) => runner();\n this.defaultSerde = executionOptions?.defaultSerde ?? serde.json;\n this.asTerminalError = executionOptions?.asTerminalError;\n this.trackedInvocationIdPromises = executionOptions?.explicitCancellation\n ? []\n : undefined;\n }\n\n setRunInterceptor(\n interceptor: (name: string, runner: () => Promise<void>) => Promise<void>\n ) {\n this.runInterceptor = interceptor;\n }\n\n isProcessing(): boolean {\n return this.coreVm.is_processing();\n }\n\n cancel(invocationId: InvocationId): void {\n this._cancel(invocationId);\n }\n\n private _cancel(invocationId: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CancelInvocation,\n () => {},\n (vm) => vm.sys_cancel_invocation(invocationId)\n );\n }\n\n attach<T>(invocationId: InvocationId, serde?: Serde<T>): RestatePromise<T> {\n return this.processCompletableEntry(\n WasmCommandType.AttachInvocation,\n () => {},\n (vm) => vm.sys_attach_invocation(invocationId),\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n );\n }\n\n public get key(): string {\n switch (this.handlerKind) {\n case HandlerKind.EXCLUSIVE:\n case HandlerKind.SHARED:\n case HandlerKind.WORKFLOW: {\n return this.serviceKey;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.Call);\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const call_handles = this.coreVm.sys_call(\n call.service,\n call.method,\n parameter,\n call.key,\n call.headers\n ? Object.entries(call.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n call.idempotencyKey,\n call.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new SingleRestatePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n this.trackedInvocationIdPromises?.push(\n invocationIdPromise as SingleRestatePromise<string>\n );\n\n return new InvocationRestatePromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.abortAttempt(e);\n // We return a pending promise to avoid the caller to see the error.\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n }\n\n public genericSend<REQ = Uint8Array>(\n send: GenericSend<REQ>\n ): InvocationHandle {\n const requestSerde = send.inputSerde ?? (serde.binary as Serde<REQ>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(send.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.OneWayCall);\n return Object.assign(ConstRestatePromise.pending<void>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const delay =\n send.delay !== undefined\n ? millisOrDurationToMillis(send.delay)\n : undefined;\n\n const handles = this.coreVm.sys_send(\n send.service,\n send.method,\n parameter,\n send.key,\n send.headers\n ? Object.entries(send.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n delay !== undefined && delay > 0 ? BigInt(delay) : undefined,\n send.idempotencyKey,\n send.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new SingleRestatePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.abortAttempt(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>({\n name,\n }: ServiceDefinitionFrom<D>): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let handle: number;\n try {\n handle = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n\n // Now prepare the run task\n const doRun: () => Promise<any> = async () => {\n // Execute the user code, wrapping with run interceptor hooks\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n await this.runInterceptor(name ?? \"\", async () => {\n res = await action();\n });\n } catch (e) {\n err = ensureError(e, this.asTerminalError);\n }\n const attemptDuration = Date.now() - startTime;\n\n // Propose the completion to the VM\n try {\n if (err !== undefined) {\n if (err instanceof TerminalError) {\n // Record failure, go ahead\n this.coreVm.propose_run_completion_failure(handle, {\n code: err.code,\n message: err.message,\n metadata: Object.entries(err.metadata ?? {}).map(\n ([key, value]) => ({ key, value })\n ),\n });\n } else if (err instanceof RetryableError) {\n this.coreVm.propose_run_completion_failure_transient_with_delay_override(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n err.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(err.retryAfter))\n : undefined,\n options?.maxRetryAttempts,\n options?.maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(options?.maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryInterval !== undefined\n ) {\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ?? 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n options?.maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(options?.maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ?? { seconds: 10 }\n ),\n };\n }\n this.coreVm.propose_run_completion_failure_transient(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n retryPolicy\n );\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n const serializedRes = serde.serialize(res);\n const encodedRes = this.journalValueCodec.encode(serializedRes);\n this.coreVm.propose_run_completion_success(handle, encodedRes);\n }\n } catch (e) {\n this.abortAttempt(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n\n // TODO: here as well\n // Return the promise\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.abortAttempt(e);\n return {\n id: \"invalid\",\n promise: ConstRestatePromise.pending(),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new SingleRestatePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string | TerminalError): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, toWasmFailure(reason));\n }\n );\n }\n\n // -- Signals\n\n public signal<T>(name: string, serde?: Serde<T>): RestatePromise<T> {\n let handle: number;\n try {\n handle = this.coreVm.sys_signal(name);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n\n return new SingleRestatePromise(\n this,\n handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public invocation(invocationId: InvocationId): InvocationReference {\n return new InvocationReferenceImpl(this, invocationId);\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n cancellation(): RestatePromise<void> {\n if (!this.cancellationPromise || this.cancellationPromise.isCompleted()) {\n this.cancellationPromise = new SingleRestatePromise(\n this,\n 1 /* HANDLE 1 is a hardcoded cancellation signal! */,\n completeSignalPromiseUsing(VoidAsUndefined)\n );\n }\n\n return this.cancellationPromise;\n }\n\n cancelPreviousCalls(): RestatePromise<InvocationId[]> {\n if (!this.trackedInvocationIdPromises) {\n return ConstRestatePromise.resolve([]);\n }\n\n return CombinatorRestatePromise.fromPromises(\n (p) => Promise.allSettled(p),\n this.trackedInvocationIdPromises.splice(0)\n ).map((results, failure) => {\n if (failure) {\n throw failure;\n }\n const cancelled: InvocationId[] = [];\n for (const result of results as PromiseSettledResult<string>[]) {\n if (result.status === \"fulfilled\") {\n this._cancel(result.value);\n cancelled.push(result.value as InvocationId);\n } else {\n this.console.warn(\n `Error when trying to get invocation id: ${result.reason}`\n );\n }\n }\n return cancelled;\n });\n }\n\n // -- Various private methods\n\n processNonCompletableEntry<T>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, input: T) => void\n ) {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n }\n }\n\n processCompletableEntry<T, U>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, t: T) => number,\n ...completers: Array<Completer>\n ): RestatePromise<U> {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return ConstRestatePromise.pending();\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n abortAttempt(e: unknown, commandType?: WasmCommandType) {\n // ensureError so interceptors always receive a proper Error,\n // not a raw VM object like { code, message }.\n this.invocationEndPromise.reject(\n commandType !== undefined\n ? new CommandError(e, commandType)\n : ensureError(e)\n );\n }\n}\n\nfunction toWasmFailure(reason: string | TerminalError): vm.WasmFailure {\n if (typeof reason === \"string\") {\n return {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n metadata: [],\n };\n }\n return {\n code: reason.code,\n message: reason.message,\n metadata: Object.entries(reason.metadata ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n };\n}\n\nfunction unpackRunParameters<T>(\n a: string | RunAction<T>,\n b?: RunAction<T>\n): { name?: string; action: RunAction<T> } {\n if (typeof a === \"string\") {\n if (typeof b !== \"function\") {\n throw new TypeError(\"\");\n }\n return { name: a, action: b };\n }\n if (typeof a !== \"function\") {\n throw new TypeError(\"unexpected type at the first parameter\");\n }\n if (b) {\n throw new TypeError(\"unexpected a function as a second parameter.\");\n }\n return { action: a };\n}\n\nclass InvocationReferenceImpl implements InvocationReference {\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId\n ) {}\n\n signal<T>(name: string, serde?: Serde<T>): SignalReference<T> {\n return new SignalReferenceImpl(this.ctx, this.invocationId, name, serde);\n }\n\n cancel(): void {\n this.ctx.cancel(this.invocationId);\n }\n\n attach<T>(serde?: Serde<T>): RestatePromise<T> {\n return this.ctx.attach(this.invocationId, serde);\n }\n}\n\nclass SignalReferenceImpl<T> implements SignalReference<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n resolve(payload?: T): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () =>\n this.ctx.journalValueCodec.encode(this.serde.serialize(payload as T)),\n (vm, bytes) =>\n vm.sys_complete_signal_success(this.invocationId, this.name, bytes)\n );\n }\n\n reject(reason: string | TerminalError): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () => {},\n (vm) => {\n vm.sys_complete_signal_failure(\n this.invocationId,\n this.name,\n toWasmFailure(reason)\n );\n }\n );\n }\n}\n\nclass DurablePromiseImpl<T> implements DurablePromise<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.get().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.get().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.get().finally(onfinally);\n }\n\n [Symbol.toStringTag] = \"DurablePromise\";\n\n get(): RestatePromise<T> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.GetPromise,\n () => {},\n (vm) => vm.sys_get_promise(this.name),\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n peek(): Promise<T | undefined> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.PeekPromise,\n () => {},\n (vm) => vm.sys_peek_promise(this.name),\n VoidAsUndefined,\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n resolve(value?: T): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => this.ctx.journalValueCodec.encode(this.serde.serialize(value as T)),\n (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes),\n VoidAsUndefined,\n Failure\n );\n }\n\n reject(errorMsg: string): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => {},\n (vm) =>\n vm.sys_complete_promise_failure(this.name, {\n code: INTERNAL_ERROR_CODE,\n message: errorMsg,\n metadata: [],\n }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n constructor(private readonly channel: ExternalProgressChannel) {}\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => this.channel.signal())\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: CompletablePromise<any>\n) => Promise<boolean>;\n\n// Wraps an error with command metadata so the centralized catch in\n// process() can call the right VM notification method.\n//\n// - Preparation failure (command not yet in journal): new CommandError(e, type)\n// → notify_error_for_next_command\n// - Completion failure (command exists): new CommandError(e, type, index)\n// → notify_error_for_specific_command\nexport class CommandError extends Error {\n constructor(cause: unknown, commandType: WasmCommandType);\n constructor(\n cause: unknown,\n commandType: WasmCommandType,\n commandIndex: number\n );\n constructor(\n override readonly cause: unknown,\n readonly commandType: WasmCommandType,\n readonly commandIndex?: number\n ) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n super(msg, { cause });\n }\n\n /** True when the error is for a specific command that exists in the journal. */\n get hasCommandIndex(): boolean {\n return this.commandIndex !== undefined;\n }\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new CommandError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n const metadata = (value.Failure.metadata ?? []).reduce(\n (\n acc: Record<string, string>,\n { key, value: v }: { key: string; value: string }\n ) => {\n acc[key] = v;\n return acc;\n },\n {} as Record<string, string>\n );\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\n metadata,\n })\n );\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst StateKeys: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"StateKeys\" in value) {\n prom.resolve(value.StateKeys);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst InvocationIdCompleter: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"InvocationId\" in value) {\n prom.resolve(value.InvocationId);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n"],"mappings":"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"}
@@ -175,7 +175,7 @@ var RestateInvokeResponse = class {
175
175
  const error = require_errors.ensureError(e);
176
176
  this.coreVm.notify_error(error.message, error.message);
177
177
  try {
178
- await flushAndClose(this.coreVm, this.vmLogger, inputReader, outputWriter);
178
+ await flushAndClose(this.coreVm, this.vmLogger, Promise.resolve(inputReader), outputWriter);
179
179
  } finally {
180
180
  require_core_logging.destroyLogger(this.loggerId);
181
181
  }
@@ -187,7 +187,7 @@ var RestateInvokeResponse = class {
187
187
  notifyError(e, ctx, this.handler.executionOptions.asTerminalError);
188
188
  } finally {
189
189
  try {
190
- await flushAndClose(this.coreVm, this.vmLogger, inputReader, outputWriter);
190
+ await flushAndClose(this.coreVm, this.vmLogger, ctx.inputPump.stop(), outputWriter);
191
191
  } finally {
192
192
  require_core_logging.destroyLogger(this.loggerId);
193
193
  }
@@ -258,7 +258,7 @@ function notifyError(e, ctx, asTerminalError) {
258
258
  ctx.coreVm.notify_error(inner.message, inner.stack);
259
259
  }
260
260
  }
261
- async function flushAndClose(coreVm, vmLogger, inputReader, outputWriter) {
261
+ async function flushAndClose(coreVm, vmLogger, inputReaderGetter, outputWriter) {
262
262
  let inputClosed = false;
263
263
  try {
264
264
  let nextOutput = coreVm.take_output();
@@ -266,6 +266,7 @@ async function flushAndClose(coreVm, vmLogger, inputReader, outputWriter) {
266
266
  await outputWriter.write(nextOutput);
267
267
  nextOutput = coreVm.take_output();
268
268
  }
269
+ const inputReader = await inputReaderGetter;
269
270
  while (!inputClosed) try {
270
271
  inputClosed = (await inputReader.next()).done ?? false;
271
272
  } catch (e) {
@@ -173,7 +173,7 @@ var RestateInvokeResponse = class {
173
173
  const error = ensureError(e);
174
174
  this.coreVm.notify_error(error.message, error.message);
175
175
  try {
176
- await flushAndClose(this.coreVm, this.vmLogger, inputReader, outputWriter);
176
+ await flushAndClose(this.coreVm, this.vmLogger, Promise.resolve(inputReader), outputWriter);
177
177
  } finally {
178
178
  destroyLogger(this.loggerId);
179
179
  }
@@ -185,7 +185,7 @@ var RestateInvokeResponse = class {
185
185
  notifyError(e, ctx, this.handler.executionOptions.asTerminalError);
186
186
  } finally {
187
187
  try {
188
- await flushAndClose(this.coreVm, this.vmLogger, inputReader, outputWriter);
188
+ await flushAndClose(this.coreVm, this.vmLogger, ctx.inputPump.stop(), outputWriter);
189
189
  } finally {
190
190
  destroyLogger(this.loggerId);
191
191
  }
@@ -256,7 +256,7 @@ function notifyError(e, ctx, asTerminalError) {
256
256
  ctx.coreVm.notify_error(inner.message, inner.stack);
257
257
  }
258
258
  }
259
- async function flushAndClose(coreVm, vmLogger, inputReader, outputWriter) {
259
+ async function flushAndClose(coreVm, vmLogger, inputReaderGetter, outputWriter) {
260
260
  let inputClosed = false;
261
261
  try {
262
262
  let nextOutput = coreVm.take_output();
@@ -264,6 +264,7 @@ async function flushAndClose(coreVm, vmLogger, inputReader, outputWriter) {
264
264
  await outputWriter.write(nextOutput);
265
265
  nextOutput = coreVm.take_output();
266
266
  }
267
+ const inputReader = await inputReaderGetter;
267
268
  while (!inputClosed) try {
268
269
  inputClosed = (await inputReader.next()).done ?? false;
269
270
  } catch (e) {