@restatedev/restate-sdk-cloudflare-workers 1.17.3 → 1.18.0
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.
- package/dist/common_api.d.cts +2 -2
- package/dist/common_api.d.cts.map +1 -1
- package/dist/common_api.d.ts +2 -2
- package/dist/common_api.d.ts.map +1 -1
- package/dist/common_api.js.map +1 -1
- package/dist/context.d.cts +25 -8
- package/dist/context.d.cts.map +1 -1
- package/dist/context.d.ts +25 -8
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/context_impl.cjs +10 -10
- package/dist/context_impl.js +10 -10
- package/dist/context_impl.js.map +1 -1
- package/dist/endpoint/components.cjs +39 -7
- package/dist/endpoint/components.js +39 -8
- package/dist/endpoint/components.js.map +1 -1
- package/dist/endpoint/handlers/discovery.cjs +12 -2
- package/dist/endpoint/handlers/discovery.js +12 -2
- package/dist/endpoint/handlers/discovery.js.map +1 -1
- package/dist/endpoint/handlers/generic.cjs +1 -1
- package/dist/endpoint/handlers/generic.js +1 -1
- package/dist/endpoint/handlers/generic.js.map +1 -1
- package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.d.ts +6 -6
- package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.js +30 -12
- package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm +0 -0
- package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm.d.ts +6 -6
- package/dist/fetch.d.cts +3 -3
- package/dist/fetch.d.ts +3 -3
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/internal.cjs +27 -0
- package/dist/internal.d.cts +30 -1
- package/dist/internal.d.cts.map +1 -1
- package/dist/internal.d.ts +30 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +27 -0
- package/dist/internal.js.map +1 -1
- package/dist/lambda.d.cts +3 -3
- package/dist/lambda.d.ts +3 -3
- package/dist/node.d.cts +3 -3
- package/dist/node.d.ts +3 -3
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/types/errors.cjs +4 -2
- package/dist/types/errors.d.cts.map +1 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +4 -2
- package/dist/types/errors.js.map +1 -1
- package/dist/types/rpc.d.cts +45 -28
- package/dist/types/rpc.d.cts.map +1 -1
- package/dist/types/rpc.d.ts +45 -28
- package/dist/types/rpc.d.ts.map +1 -1
- package/dist/types/rpc.js.map +1 -1
- package/package.json +3 -3
package/dist/context_impl.js
CHANGED
|
@@ -76,8 +76,8 @@ var ContextImpl = class {
|
|
|
76
76
|
request() {
|
|
77
77
|
return this.invocationRequest;
|
|
78
78
|
}
|
|
79
|
-
get(name, serde$1) {
|
|
80
|
-
return this.processCompletableEntry(WasmCommandType.GetState, () => {}, (vm) => vm.sys_get_state(name), VoidAsNull, SuccessWithSerde(serde$1 ?? this.defaultSerde, this.journalValueCodec));
|
|
79
|
+
get(name, serde$1, options) {
|
|
80
|
+
return this.processCompletableEntry(WasmCommandType.GetState, () => {}, (vm) => vm.sys_get_state(name, options?.name), VoidAsNull, SuccessWithSerde(serde$1 ?? this.defaultSerde, this.journalValueCodec));
|
|
81
81
|
}
|
|
82
82
|
getProject(name, projection, options) {
|
|
83
83
|
const stateSerde = options?.serde ?? this.defaultSerde;
|
|
@@ -99,17 +99,17 @@ var ContextImpl = class {
|
|
|
99
99
|
}
|
|
100
100
|
return this.ephemeralRequestTracker.register(ephemeralCompletionId, completeUsing({}, VoidAsNull, SuccessWithSerde(serde$1, this.journalValueCodec)));
|
|
101
101
|
}
|
|
102
|
-
stateKeys() {
|
|
103
|
-
return this.processCompletableEntry(WasmCommandType.GetStateKeys, () => {}, (vm) => vm.sys_get_state_keys(), StateKeys);
|
|
102
|
+
stateKeys(options) {
|
|
103
|
+
return this.processCompletableEntry(WasmCommandType.GetStateKeys, () => {}, (vm) => vm.sys_get_state_keys(options?.name), StateKeys);
|
|
104
104
|
}
|
|
105
|
-
set(name, value, serde$1) {
|
|
106
|
-
this.processNonCompletableEntry(WasmCommandType.SetState, () => this.journalValueCodec.encode((serde$1 ?? this.defaultSerde).serialize(value)), (vm, bytes) => vm.sys_set_state(name, bytes));
|
|
105
|
+
set(name, value, serde$1, options) {
|
|
106
|
+
this.processNonCompletableEntry(WasmCommandType.SetState, () => this.journalValueCodec.encode((serde$1 ?? this.defaultSerde).serialize(value)), (vm, bytes) => vm.sys_set_state(name, bytes, options?.name));
|
|
107
107
|
}
|
|
108
|
-
clear(name) {
|
|
109
|
-
this.processNonCompletableEntry(WasmCommandType.ClearState, () => {}, (vm) => vm.sys_clear_state(name));
|
|
108
|
+
clear(name, options) {
|
|
109
|
+
this.processNonCompletableEntry(WasmCommandType.ClearState, () => {}, (vm) => vm.sys_clear_state(name, options?.name));
|
|
110
110
|
}
|
|
111
|
-
clearAll() {
|
|
112
|
-
this.processNonCompletableEntry(WasmCommandType.ClearAllState, () => {}, (vm) => vm.sys_clear_all_state());
|
|
111
|
+
clearAll(options) {
|
|
112
|
+
this.processNonCompletableEntry(WasmCommandType.ClearAllState, () => {}, (vm) => vm.sys_clear_all_state(options?.name));
|
|
113
113
|
}
|
|
114
114
|
genericCall(call) {
|
|
115
115
|
const requestSerde = call.inputSerde ?? serde.binary;
|
package/dist/context_impl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context_impl.js","names":["coreVm: WasmVM","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: PromiseWithResolvers<void>","journalValueCodec: JournalValueCodec","serde","stateSerde: Serde<TValue>","ephemeralCompletionId: number","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","wasmRun: vm.WasmRun","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","handle: number","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 InvocationReference,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n SignalReference,\n ScopedContext,\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 PauseError,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n HandlerDescriptor,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.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 { ContextInternal, GetProjectOptions } from \"./internal.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\nimport { ExecutionOptions } from \"./endpoint/components.js\";\n\n/**\n * The runtime shape a client method needs. implement() and type manipulations respect this.\n */\ntype ClientTarget = {\n name: string;\n _handlers?: Record<string, HandlerDescriptor>;\n _kind?: \"service\" | \"object\" | \"workflow\";\n};\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 private readonly ephemeralRequestTracker: EphemeralRequestTracker;\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: PromiseWithResolvers<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.ephemeralRequestTracker = new EphemeralRequestTracker(\n externalProgressChannel\n );\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 this.ephemeralRequestTracker,\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 // DON'T make this function async, for the same reasons of run.\n public getProject<TValue, TResult>(\n name: string,\n projection: (value: TValue | null) => TResult | Promise<TResult>,\n options?: GetProjectOptions<TValue, TResult>\n ): RestatePromise<TResult> {\n const stateSerde: Serde<TValue> =\n options?.serde ?? (this.defaultSerde as Serde<TValue>);\n // The state value is read without recording it in the journal,\n // only the projection result is recorded, as a regular run.\n return this.run(\n `project:${name}`,\n async () => projection(await this.ephemeralStateGet(name, stateSerde)),\n {\n // If only the state serde is set, use it for the projection result too.\n serde:\n options?.resultSerde ??\n (options?.serde as Serde<TResult> | undefined),\n }\n );\n }\n\n /**\n * Get the state value with an ephemeral command: neither the command nor its notification are recorded in the journal.\n * Because of this, the returned value MUST be used only within a run closure.\n *\n * The returned promise is completed only if a Restate's DurablePromise is being awaited.\n */\n private ephemeralStateGet<T>(\n name: string,\n serde: Serde<T>\n ): Promise<T | null> {\n let ephemeralCompletionId: number;\n try {\n ephemeralCompletionId = this.coreVm.ephemeral_state_get(name);\n } catch (e) {\n this.abortAttempt(e);\n return pendingPromise();\n }\n return this.ephemeralRequestTracker.register(\n ephemeralCompletionId,\n completeUsing<T | null>(\n {},\n VoidAsNull,\n SuccessWithSerde(serde, this.journalValueCodec)\n )\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.scope,\n call.limitKey,\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 completeUsing(\n {\n command: {\n type: WasmCommandType.Call,\n index: commandIndex,\n },\n },\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 completeUsing(\n {\n command: {\n type: WasmCommandType.Call,\n index: commandIndex,\n },\n },\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.scope,\n send.limitKey,\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 completeUsing(\n {\n command: {\n type: WasmCommandType.OneWayCall,\n index: commandIndex,\n },\n },\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.abortAttempt(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n // The public overloaded signatures (classic definition OR service interface)\n // live on the Context interface; these implementations are permissive and\n // forward `def._handlers` (present on interface / implement() values, absent\n // on classic definitions → serde reuse is a no-op there).\n serviceClient(def: ClientTarget): any {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n undefined,\n undefined,\n def._handlers\n );\n }\n\n objectClient(def: ClientTarget, key: string): any {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n workflowClient(def: ClientTarget, key: string): any {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n public serviceSendClient(def: ClientTarget): any {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n undefined,\n undefined,\n def._handlers\n );\n }\n\n public objectSendClient(def: ClientTarget, key: string): any {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n workflowSendClient(def: ClientTarget, key: string): any {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n // Factory that dispatches on the interface's kind — mirrors the ingress\n // client's `client(def)` / `sendClient(def)` ergonomics.\n client(def: ClientTarget, key?: string): any {\n return def._kind === \"service\"\n ? this.serviceClient(def)\n : this.objectClient(def, key as string);\n }\n\n sendClient(def: ClientTarget, key?: string): any {\n return def._kind === \"service\"\n ? this.serviceSendClient(def)\n : this.objectSendClient(def, key as string);\n }\n\n scope(scopeKey: string): ScopedContext {\n return {\n serviceClient: (def: ClientTarget): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n undefined,\n scopeKey,\n def._handlers\n ),\n serviceSendClient: (def: ClientTarget): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n undefined,\n scopeKey,\n def._handlers\n ),\n objectClient: (def: ClientTarget, key: string): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n objectSendClient: (def: ClientTarget, key: string): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n workflowClient: (def: ClientTarget, key: string): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n workflowSendClient: (def: ClientTarget, key: string): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n client: (def: ClientTarget, key?: string): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n def._kind === \"service\" ? undefined : key,\n scopeKey,\n def._handlers\n ),\n sendClient: (def: ClientTarget, key?: string): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n def._kind === \"service\" ? undefined : key,\n scopeKey,\n def._handlers\n ),\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 wasmRun: vm.WasmRun;\n try {\n wasmRun = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const handle = wasmRun.handle;\n const commandIndex = this.coreVm.last_command_index();\n\n if (!wasmRun.replayed) {\n // Let's prepare the run task only if the run wasnt replayed.\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 if (err instanceof PauseError) {\n this.coreVm.propose_run_completion_failure_transient_with_pause(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration)\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\n // TODO: here as well\n // Return the promise\n return new SingleRestatePromise(\n this,\n handle,\n completeUsing(\n { command: { type: WasmCommandType.Run, index: 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 completeUsing(\n {},\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 completeUsing(\n {},\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 completeUsing({}, 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 \"AllCompleted\",\n (p: Promise<any>[]) => 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 completeUsing(\n {\n command: {\n type: commandType,\n index: commandIndex,\n },\n },\n ...completers\n )\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 the promises of ephemeral commands, e.g. ephemeral state get, keyed by ephemeral completion id.\n/// The promises are completed only by the PromisesExecutor loop, when the related ephemeral notification is ready.\nexport class EphemeralRequestTracker {\n private readonly pending = new Map<\n number,\n (value: AsyncResultValue) => Promise<void>\n >();\n\n constructor(private readonly channel: ExternalProgressChannel) {}\n\n register<T>(\n completionId: number,\n completer: (\n value: AsyncResultValue,\n prom: PromiseWithResolvers<T>\n ) => Promise<void>\n ): Promise<T> {\n const prom = Promise.withResolvers<T>();\n this.pending.set(completionId, async (value) => {\n try {\n await completer(value, prom);\n } catch (e) {\n // Ephemeral results are used within run closures, propagate the error there.\n prom.reject(e);\n }\n });\n // Wake up the progress loop: it will either pick up the notification, if the VM could answer it locally,\n // or flush the output containing the ephemeral command before waiting again for input.\n this.channel.signal();\n return prom.promise;\n }\n\n async complete(\n completionId: number,\n value: vm.WasmAsyncResultValue\n ): Promise<void> {\n const complete = this.pending.get(completionId);\n if (complete === undefined) {\n throw new Error(\n `Ephemeral request with completion id ${completionId} doesn't exist`\n );\n }\n if (value === \"NotReady\") {\n throw new Error(\n `Notification for ephemeral request with completion id ${completionId} is not ready. This is unexpected behavior.`\n );\n }\n this.pending.delete(completionId);\n await complete(value);\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 this.runsToExecute.delete(handle);\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: PromiseWithResolvers<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 completeUsing<T>(\n meta: {\n command?: {\n type: WasmCommandType;\n index: number;\n };\n },\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: PromiseWithResolvers<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: PromiseWithResolvers<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n if (meta.command !== undefined) {\n throw new CommandError(e, meta.command.type, meta.command.index);\n }\n // No meta to use for decoration\n throw e;\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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"}
|
|
1
|
+
{"version":3,"file":"context_impl.js","names":["coreVm: WasmVM","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: PromiseWithResolvers<void>","journalValueCodec: JournalValueCodec","serde","stateSerde: Serde<TValue>","ephemeralCompletionId: number","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","wasmRun: vm.WasmRun","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","handle: number","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 InvocationReference,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n SignalReference,\n EntryOptions,\n ScopedContext,\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 PauseError,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n HandlerDescriptor,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.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 { ContextInternal, GetProjectOptions } from \"./internal.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\nimport { ExecutionOptions } from \"./endpoint/components.js\";\n\n/**\n * The runtime shape a client method needs. implement() and type manipulations respect this.\n */\ntype ClientTarget = {\n name: string;\n _handlers?: Record<string, HandlerDescriptor>;\n _kind?: \"service\" | \"object\" | \"workflow\";\n};\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 private readonly ephemeralRequestTracker: EphemeralRequestTracker;\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: PromiseWithResolvers<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.ephemeralRequestTracker = new EphemeralRequestTracker(\n externalProgressChannel\n );\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 this.ephemeralRequestTracker,\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>(\n name: string,\n serde?: Serde<T>,\n options?: EntryOptions\n ): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name, options?.name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n // DON'T make this function async, for the same reasons of run.\n public getProject<TValue, TResult>(\n name: string,\n projection: (value: TValue | null) => TResult | Promise<TResult>,\n options?: GetProjectOptions<TValue, TResult>\n ): RestatePromise<TResult> {\n const stateSerde: Serde<TValue> =\n options?.serde ?? (this.defaultSerde as Serde<TValue>);\n // The state value is read without recording it in the journal,\n // only the projection result is recorded, as a regular run.\n return this.run(\n `project:${name}`,\n async () => projection(await this.ephemeralStateGet(name, stateSerde)),\n {\n // If only the state serde is set, use it for the projection result too.\n serde:\n options?.resultSerde ??\n (options?.serde as Serde<TResult> | undefined),\n }\n );\n }\n\n /**\n * Get the state value with an ephemeral command: neither the command nor its notification are recorded in the journal.\n * Because of this, the returned value MUST be used only within a run closure.\n *\n * The returned promise is completed only if a Restate's DurablePromise is being awaited.\n */\n private ephemeralStateGet<T>(\n name: string,\n serde: Serde<T>\n ): Promise<T | null> {\n let ephemeralCompletionId: number;\n try {\n ephemeralCompletionId = this.coreVm.ephemeral_state_get(name);\n } catch (e) {\n this.abortAttempt(e);\n return pendingPromise();\n }\n return this.ephemeralRequestTracker.register(\n ephemeralCompletionId,\n completeUsing<T | null>(\n {},\n VoidAsNull,\n SuccessWithSerde(serde, this.journalValueCodec)\n )\n );\n }\n\n public stateKeys(options?: EntryOptions): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(options?.name),\n StateKeys\n );\n }\n\n public set<T>(\n name: string,\n value: T,\n serde?: Serde<T>,\n options?: EntryOptions\n ): 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, options?.name)\n );\n }\n\n public clear(name: string, options?: EntryOptions): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name, options?.name)\n );\n }\n\n public clearAll(options?: EntryOptions): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state(options?.name)\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.scope,\n call.limitKey,\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 completeUsing(\n {\n command: {\n type: WasmCommandType.Call,\n index: commandIndex,\n },\n },\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 completeUsing(\n {\n command: {\n type: WasmCommandType.Call,\n index: commandIndex,\n },\n },\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.scope,\n send.limitKey,\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 completeUsing(\n {\n command: {\n type: WasmCommandType.OneWayCall,\n index: commandIndex,\n },\n },\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.abortAttempt(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n // The public overloaded signatures (classic definition OR service interface)\n // live on the Context interface; these implementations are permissive and\n // forward `def._handlers` (present on interface / implement() values, absent\n // on classic definitions → serde reuse is a no-op there).\n serviceClient(def: ClientTarget): any {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n undefined,\n undefined,\n def._handlers\n );\n }\n\n objectClient(def: ClientTarget, key: string): any {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n workflowClient(def: ClientTarget, key: string): any {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n public serviceSendClient(def: ClientTarget): any {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n undefined,\n undefined,\n def._handlers\n );\n }\n\n public objectSendClient(def: ClientTarget, key: string): any {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n workflowSendClient(def: ClientTarget, key: string): any {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n undefined,\n def._handlers\n );\n }\n\n // Factory that dispatches on the interface's kind — mirrors the ingress\n // client's `client(def)` / `sendClient(def)` ergonomics.\n client(def: ClientTarget, key?: string): any {\n return def._kind === \"service\"\n ? this.serviceClient(def)\n : this.objectClient(def, key as string);\n }\n\n sendClient(def: ClientTarget, key?: string): any {\n return def._kind === \"service\"\n ? this.serviceSendClient(def)\n : this.objectSendClient(def, key as string);\n }\n\n scope(scopeKey: string): ScopedContext {\n return {\n serviceClient: (def: ClientTarget): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n undefined,\n scopeKey,\n def._handlers\n ),\n serviceSendClient: (def: ClientTarget): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n undefined,\n scopeKey,\n def._handlers\n ),\n objectClient: (def: ClientTarget, key: string): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n objectSendClient: (def: ClientTarget, key: string): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n workflowClient: (def: ClientTarget, key: string): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n workflowSendClient: (def: ClientTarget, key: string): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n key,\n scopeKey,\n def._handlers\n ),\n client: (def: ClientTarget, key?: string): any =>\n makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n def.name,\n def._kind === \"service\" ? undefined : key,\n scopeKey,\n def._handlers\n ),\n sendClient: (def: ClientTarget, key?: string): any =>\n makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n def.name,\n def._kind === \"service\" ? undefined : key,\n scopeKey,\n def._handlers\n ),\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 wasmRun: vm.WasmRun;\n try {\n wasmRun = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const handle = wasmRun.handle;\n const commandIndex = this.coreVm.last_command_index();\n\n if (!wasmRun.replayed) {\n // Let's prepare the run task only if the run wasnt replayed.\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 if (err instanceof PauseError) {\n this.coreVm.propose_run_completion_failure_transient_with_pause(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration)\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\n // TODO: here as well\n // Return the promise\n return new SingleRestatePromise(\n this,\n handle,\n completeUsing(\n { command: { type: WasmCommandType.Run, index: 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 completeUsing(\n {},\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 completeUsing(\n {},\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 completeUsing({}, 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 \"AllCompleted\",\n (p: Promise<any>[]) => 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 completeUsing(\n {\n command: {\n type: commandType,\n index: commandIndex,\n },\n },\n ...completers\n )\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 the promises of ephemeral commands, e.g. ephemeral state get, keyed by ephemeral completion id.\n/// The promises are completed only by the PromisesExecutor loop, when the related ephemeral notification is ready.\nexport class EphemeralRequestTracker {\n private readonly pending = new Map<\n number,\n (value: AsyncResultValue) => Promise<void>\n >();\n\n constructor(private readonly channel: ExternalProgressChannel) {}\n\n register<T>(\n completionId: number,\n completer: (\n value: AsyncResultValue,\n prom: PromiseWithResolvers<T>\n ) => Promise<void>\n ): Promise<T> {\n const prom = Promise.withResolvers<T>();\n this.pending.set(completionId, async (value) => {\n try {\n await completer(value, prom);\n } catch (e) {\n // Ephemeral results are used within run closures, propagate the error there.\n prom.reject(e);\n }\n });\n // Wake up the progress loop: it will either pick up the notification, if the VM could answer it locally,\n // or flush the output containing the ephemeral command before waiting again for input.\n this.channel.signal();\n return prom.promise;\n }\n\n async complete(\n completionId: number,\n value: vm.WasmAsyncResultValue\n ): Promise<void> {\n const complete = this.pending.get(completionId);\n if (complete === undefined) {\n throw new Error(\n `Ephemeral request with completion id ${completionId} doesn't exist`\n );\n }\n if (value === \"NotReady\") {\n throw new Error(\n `Notification for ephemeral request with completion id ${completionId} is not ready. This is unexpected behavior.`\n );\n }\n this.pending.delete(completionId);\n await complete(value);\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 this.runsToExecute.delete(handle);\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: PromiseWithResolvers<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 completeUsing<T>(\n meta: {\n command?: {\n type: WasmCommandType;\n index: number;\n };\n },\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: PromiseWithResolvers<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: PromiseWithResolvers<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n if (meta.command !== undefined) {\n throw new CommandError(e, meta.command.type, meta.command.index);\n }\n // No meta to use for decoration\n throw e;\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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"}
|
|
@@ -4,6 +4,14 @@ let __restatedev_restate_sdk_core = require("@restatedev/restate-sdk-core");
|
|
|
4
4
|
__restatedev_restate_sdk_core = require_rolldown_runtime.__toESM(__restatedev_restate_sdk_core);
|
|
5
5
|
|
|
6
6
|
//#region src/endpoint/components.ts
|
|
7
|
+
/**
|
|
8
|
+
* Key of the option set by `restate.internal.explicitRecovery()`: a symbol, to
|
|
9
|
+
* keep it out of the service and handler option types.
|
|
10
|
+
*/
|
|
11
|
+
const EXPLICIT_RECOVERY = Symbol("ExplicitRecovery");
|
|
12
|
+
function explicitRecoveryOf(options) {
|
|
13
|
+
return options?.[EXPLICIT_RECOVERY];
|
|
14
|
+
}
|
|
7
15
|
function handlerInputDiscovery(handler, defaultSerde) {
|
|
8
16
|
const serde$1 = handler.options?.input ?? defaultSerde;
|
|
9
17
|
let contentType = void 0;
|
|
@@ -44,7 +52,8 @@ function createExecutionOptions(serviceOptions, handlerOptions) {
|
|
|
44
52
|
asTerminalError: handlerOptions?.asTerminalError ?? serviceOptions?.asTerminalError,
|
|
45
53
|
hooks: hooks.length > 0 ? hooks : void 0,
|
|
46
54
|
explicitCancellation: handlerOptions?.explicitCancellation ?? serviceOptions?.explicitCancellation,
|
|
47
|
-
onJournalMismatchErrors: handlerOptions?.onJournalMismatchErrors ?? serviceOptions?.onJournalMismatchErrors
|
|
55
|
+
onJournalMismatchErrors: handlerOptions?.onJournalMismatchErrors ?? serviceOptions?.onJournalMismatchErrors,
|
|
56
|
+
explicitRecovery: explicitRecoveryOf(handlerOptions) ?? explicitRecoveryOf(serviceOptions)
|
|
48
57
|
};
|
|
49
58
|
}
|
|
50
59
|
const PREVIEW_METADATA_KEY_PREFIX = "dev.restate.serde.preview";
|
|
@@ -107,7 +116,7 @@ var ServiceComponent = class {
|
|
|
107
116
|
handlers,
|
|
108
117
|
documentation: this.description,
|
|
109
118
|
metadata: mergeMetadata(this.metadata, this.serdeRegistry.previewMetadata()),
|
|
110
|
-
...commonServiceOptions(this.options)
|
|
119
|
+
...commonServiceOptions(this.options, false)
|
|
111
120
|
};
|
|
112
121
|
}
|
|
113
122
|
handlerMatching(url) {
|
|
@@ -169,7 +178,7 @@ var VirtualObjectComponent = class {
|
|
|
169
178
|
handlers,
|
|
170
179
|
documentation: this.description,
|
|
171
180
|
metadata: mergeMetadata(this.metadata, this.serdeRegistry.previewMetadata()),
|
|
172
|
-
...commonServiceOptions(this.options)
|
|
181
|
+
...commonServiceOptions(this.options, true)
|
|
173
182
|
};
|
|
174
183
|
}
|
|
175
184
|
handlerMatching(url) {
|
|
@@ -232,7 +241,7 @@ var WorkflowComponent = class {
|
|
|
232
241
|
handlers,
|
|
233
242
|
documentation: this.description,
|
|
234
243
|
metadata: mergeMetadata(this.metadata, this.serdeRegistry.previewMetadata()),
|
|
235
|
-
...commonServiceOptions(this.options)
|
|
244
|
+
...commonServiceOptions(this.options, true)
|
|
236
245
|
};
|
|
237
246
|
}
|
|
238
247
|
handlerMatching(url) {
|
|
@@ -289,14 +298,34 @@ function parseUrlComponents(urlPath) {
|
|
|
289
298
|
path: urlPath
|
|
290
299
|
};
|
|
291
300
|
}
|
|
292
|
-
function
|
|
301
|
+
function resolveStatePreload(options) {
|
|
302
|
+
const state = options !== void 0 && "state" in options ? options.state : void 0;
|
|
303
|
+
const legacyEnableLazyState = options !== void 0 && "enableLazyState" in options ? options.enableLazyState : void 0;
|
|
304
|
+
if (state !== void 0 && legacyEnableLazyState !== void 0) throw new Error("Cannot set both the 'state' option and the deprecated 'enableLazyState' option at the same time. Use only 'state'.");
|
|
305
|
+
if (state === void 0) return {
|
|
306
|
+
enableLazyState: legacyEnableLazyState,
|
|
307
|
+
eagerStateKeysWhitelist: void 0
|
|
308
|
+
};
|
|
309
|
+
const preload = state.preload;
|
|
310
|
+
if (typeof preload === "boolean") return {
|
|
311
|
+
enableLazyState: !preload,
|
|
312
|
+
eagerStateKeysWhitelist: void 0
|
|
313
|
+
};
|
|
314
|
+
return {
|
|
315
|
+
enableLazyState: true,
|
|
316
|
+
eagerStateKeysWhitelist: preload.length > 0 ? [...preload] : void 0
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function commonServiceOptions(options, stateful) {
|
|
320
|
+
const statePreload = stateful ? resolveStatePreload(options) : {};
|
|
293
321
|
return {
|
|
294
322
|
journalRetention: options?.journalRetention !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options.journalRetention) : void 0,
|
|
295
323
|
idempotencyRetention: options?.idempotencyRetention !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options.idempotencyRetention) : void 0,
|
|
296
324
|
inactivityTimeout: options?.inactivityTimeout !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options.inactivityTimeout) : void 0,
|
|
297
325
|
abortTimeout: options?.abortTimeout !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options.abortTimeout) : void 0,
|
|
298
326
|
ingressPrivate: options?.ingressPrivate,
|
|
299
|
-
enableLazyState:
|
|
327
|
+
enableLazyState: statePreload.enableLazyState,
|
|
328
|
+
eagerStateKeysWhitelist: statePreload.eagerStateKeysWhitelist,
|
|
300
329
|
retryPolicyExponentiationFactor: options?.retryPolicy?.exponentiationFactor,
|
|
301
330
|
retryPolicyInitialInterval: options?.retryPolicy?.initialInterval !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.retryPolicy?.initialInterval) : void 0,
|
|
302
331
|
retryPolicyMaxInterval: options?.retryPolicy?.maxInterval !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.retryPolicy?.maxInterval) : void 0,
|
|
@@ -305,6 +334,7 @@ function commonServiceOptions(options) {
|
|
|
305
334
|
};
|
|
306
335
|
}
|
|
307
336
|
function commonHandlerOptions(wrapper, defaultSerde) {
|
|
337
|
+
const statePreload = resolveStatePreload(wrapper.options);
|
|
308
338
|
return {
|
|
309
339
|
input: handlerInputDiscovery(wrapper, defaultSerde),
|
|
310
340
|
output: handlerOutputDiscovery(wrapper, defaultSerde),
|
|
@@ -313,7 +343,8 @@ function commonHandlerOptions(wrapper, defaultSerde) {
|
|
|
313
343
|
inactivityTimeout: wrapper.options?.inactivityTimeout !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(wrapper.options?.inactivityTimeout) : void 0,
|
|
314
344
|
abortTimeout: wrapper.options?.abortTimeout !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(wrapper.options?.abortTimeout) : void 0,
|
|
315
345
|
ingressPrivate: wrapper.options?.ingressPrivate,
|
|
316
|
-
enableLazyState:
|
|
346
|
+
enableLazyState: statePreload.enableLazyState,
|
|
347
|
+
eagerStateKeysWhitelist: statePreload.eagerStateKeysWhitelist,
|
|
317
348
|
retryPolicyExponentiationFactor: wrapper.options?.retryPolicy?.exponentiationFactor,
|
|
318
349
|
retryPolicyInitialInterval: wrapper.options?.retryPolicy?.initialInterval !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(wrapper.options?.retryPolicy?.initialInterval) : void 0,
|
|
319
350
|
retryPolicyMaxInterval: wrapper.options?.retryPolicy?.maxInterval !== void 0 ? (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(wrapper.options?.retryPolicy?.maxInterval) : void 0,
|
|
@@ -325,6 +356,7 @@ function commonHandlerOptions(wrapper, defaultSerde) {
|
|
|
325
356
|
}
|
|
326
357
|
|
|
327
358
|
//#endregion
|
|
359
|
+
exports.EXPLICIT_RECOVERY = EXPLICIT_RECOVERY;
|
|
328
360
|
exports.ServiceComponent = ServiceComponent;
|
|
329
361
|
exports.VirtualObjectComponent = VirtualObjectComponent;
|
|
330
362
|
exports.WorkflowComponent = WorkflowComponent;
|
|
@@ -2,6 +2,14 @@ import { HandlerKind } from "../types/rpc.js";
|
|
|
2
2
|
import { millisOrDurationToMillis, serde } from "@restatedev/restate-sdk-core";
|
|
3
3
|
|
|
4
4
|
//#region src/endpoint/components.ts
|
|
5
|
+
/**
|
|
6
|
+
* Key of the option set by `restate.internal.explicitRecovery()`: a symbol, to
|
|
7
|
+
* keep it out of the service and handler option types.
|
|
8
|
+
*/
|
|
9
|
+
const EXPLICIT_RECOVERY = Symbol("ExplicitRecovery");
|
|
10
|
+
function explicitRecoveryOf(options) {
|
|
11
|
+
return options?.[EXPLICIT_RECOVERY];
|
|
12
|
+
}
|
|
5
13
|
function handlerInputDiscovery(handler, defaultSerde) {
|
|
6
14
|
const serde$1 = handler.options?.input ?? defaultSerde;
|
|
7
15
|
let contentType = void 0;
|
|
@@ -42,7 +50,8 @@ function createExecutionOptions(serviceOptions, handlerOptions) {
|
|
|
42
50
|
asTerminalError: handlerOptions?.asTerminalError ?? serviceOptions?.asTerminalError,
|
|
43
51
|
hooks: hooks.length > 0 ? hooks : void 0,
|
|
44
52
|
explicitCancellation: handlerOptions?.explicitCancellation ?? serviceOptions?.explicitCancellation,
|
|
45
|
-
onJournalMismatchErrors: handlerOptions?.onJournalMismatchErrors ?? serviceOptions?.onJournalMismatchErrors
|
|
53
|
+
onJournalMismatchErrors: handlerOptions?.onJournalMismatchErrors ?? serviceOptions?.onJournalMismatchErrors,
|
|
54
|
+
explicitRecovery: explicitRecoveryOf(handlerOptions) ?? explicitRecoveryOf(serviceOptions)
|
|
46
55
|
};
|
|
47
56
|
}
|
|
48
57
|
const PREVIEW_METADATA_KEY_PREFIX = "dev.restate.serde.preview";
|
|
@@ -105,7 +114,7 @@ var ServiceComponent = class {
|
|
|
105
114
|
handlers,
|
|
106
115
|
documentation: this.description,
|
|
107
116
|
metadata: mergeMetadata(this.metadata, this.serdeRegistry.previewMetadata()),
|
|
108
|
-
...commonServiceOptions(this.options)
|
|
117
|
+
...commonServiceOptions(this.options, false)
|
|
109
118
|
};
|
|
110
119
|
}
|
|
111
120
|
handlerMatching(url) {
|
|
@@ -167,7 +176,7 @@ var VirtualObjectComponent = class {
|
|
|
167
176
|
handlers,
|
|
168
177
|
documentation: this.description,
|
|
169
178
|
metadata: mergeMetadata(this.metadata, this.serdeRegistry.previewMetadata()),
|
|
170
|
-
...commonServiceOptions(this.options)
|
|
179
|
+
...commonServiceOptions(this.options, true)
|
|
171
180
|
};
|
|
172
181
|
}
|
|
173
182
|
handlerMatching(url) {
|
|
@@ -230,7 +239,7 @@ var WorkflowComponent = class {
|
|
|
230
239
|
handlers,
|
|
231
240
|
documentation: this.description,
|
|
232
241
|
metadata: mergeMetadata(this.metadata, this.serdeRegistry.previewMetadata()),
|
|
233
|
-
...commonServiceOptions(this.options)
|
|
242
|
+
...commonServiceOptions(this.options, true)
|
|
234
243
|
};
|
|
235
244
|
}
|
|
236
245
|
handlerMatching(url) {
|
|
@@ -287,14 +296,34 @@ function parseUrlComponents(urlPath) {
|
|
|
287
296
|
path: urlPath
|
|
288
297
|
};
|
|
289
298
|
}
|
|
290
|
-
function
|
|
299
|
+
function resolveStatePreload(options) {
|
|
300
|
+
const state = options !== void 0 && "state" in options ? options.state : void 0;
|
|
301
|
+
const legacyEnableLazyState = options !== void 0 && "enableLazyState" in options ? options.enableLazyState : void 0;
|
|
302
|
+
if (state !== void 0 && legacyEnableLazyState !== void 0) throw new Error("Cannot set both the 'state' option and the deprecated 'enableLazyState' option at the same time. Use only 'state'.");
|
|
303
|
+
if (state === void 0) return {
|
|
304
|
+
enableLazyState: legacyEnableLazyState,
|
|
305
|
+
eagerStateKeysWhitelist: void 0
|
|
306
|
+
};
|
|
307
|
+
const preload = state.preload;
|
|
308
|
+
if (typeof preload === "boolean") return {
|
|
309
|
+
enableLazyState: !preload,
|
|
310
|
+
eagerStateKeysWhitelist: void 0
|
|
311
|
+
};
|
|
312
|
+
return {
|
|
313
|
+
enableLazyState: true,
|
|
314
|
+
eagerStateKeysWhitelist: preload.length > 0 ? [...preload] : void 0
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function commonServiceOptions(options, stateful) {
|
|
318
|
+
const statePreload = stateful ? resolveStatePreload(options) : {};
|
|
291
319
|
return {
|
|
292
320
|
journalRetention: options?.journalRetention !== void 0 ? millisOrDurationToMillis(options.journalRetention) : void 0,
|
|
293
321
|
idempotencyRetention: options?.idempotencyRetention !== void 0 ? millisOrDurationToMillis(options.idempotencyRetention) : void 0,
|
|
294
322
|
inactivityTimeout: options?.inactivityTimeout !== void 0 ? millisOrDurationToMillis(options.inactivityTimeout) : void 0,
|
|
295
323
|
abortTimeout: options?.abortTimeout !== void 0 ? millisOrDurationToMillis(options.abortTimeout) : void 0,
|
|
296
324
|
ingressPrivate: options?.ingressPrivate,
|
|
297
|
-
enableLazyState:
|
|
325
|
+
enableLazyState: statePreload.enableLazyState,
|
|
326
|
+
eagerStateKeysWhitelist: statePreload.eagerStateKeysWhitelist,
|
|
298
327
|
retryPolicyExponentiationFactor: options?.retryPolicy?.exponentiationFactor,
|
|
299
328
|
retryPolicyInitialInterval: options?.retryPolicy?.initialInterval !== void 0 ? millisOrDurationToMillis(options?.retryPolicy?.initialInterval) : void 0,
|
|
300
329
|
retryPolicyMaxInterval: options?.retryPolicy?.maxInterval !== void 0 ? millisOrDurationToMillis(options?.retryPolicy?.maxInterval) : void 0,
|
|
@@ -303,6 +332,7 @@ function commonServiceOptions(options) {
|
|
|
303
332
|
};
|
|
304
333
|
}
|
|
305
334
|
function commonHandlerOptions(wrapper, defaultSerde) {
|
|
335
|
+
const statePreload = resolveStatePreload(wrapper.options);
|
|
306
336
|
return {
|
|
307
337
|
input: handlerInputDiscovery(wrapper, defaultSerde),
|
|
308
338
|
output: handlerOutputDiscovery(wrapper, defaultSerde),
|
|
@@ -311,7 +341,8 @@ function commonHandlerOptions(wrapper, defaultSerde) {
|
|
|
311
341
|
inactivityTimeout: wrapper.options?.inactivityTimeout !== void 0 ? millisOrDurationToMillis(wrapper.options?.inactivityTimeout) : void 0,
|
|
312
342
|
abortTimeout: wrapper.options?.abortTimeout !== void 0 ? millisOrDurationToMillis(wrapper.options?.abortTimeout) : void 0,
|
|
313
343
|
ingressPrivate: wrapper.options?.ingressPrivate,
|
|
314
|
-
enableLazyState:
|
|
344
|
+
enableLazyState: statePreload.enableLazyState,
|
|
345
|
+
eagerStateKeysWhitelist: statePreload.eagerStateKeysWhitelist,
|
|
315
346
|
retryPolicyExponentiationFactor: wrapper.options?.retryPolicy?.exponentiationFactor,
|
|
316
347
|
retryPolicyInitialInterval: wrapper.options?.retryPolicy?.initialInterval !== void 0 ? millisOrDurationToMillis(wrapper.options?.retryPolicy?.initialInterval) : void 0,
|
|
317
348
|
retryPolicyMaxInterval: wrapper.options?.retryPolicy?.maxInterval !== void 0 ? millisOrDurationToMillis(wrapper.options?.retryPolicy?.maxInterval) : void 0,
|
|
@@ -323,5 +354,5 @@ function commonHandlerOptions(wrapper, defaultSerde) {
|
|
|
323
354
|
}
|
|
324
355
|
|
|
325
356
|
//#endregion
|
|
326
|
-
export { ServiceComponent, VirtualObjectComponent, WorkflowComponent, parseUrlComponents };
|
|
357
|
+
export { EXPLICIT_RECOVERY, ServiceComponent, VirtualObjectComponent, WorkflowComponent, parseUrlComponents };
|
|
327
358
|
//# sourceMappingURL=components.js.map
|