@restatedev/restate-sdk-cloudflare-workers 1.10.1 → 1.10.2

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.
@@ -153,7 +153,8 @@ var ContextImpl = class {
153
153
  try {
154
154
  if (err !== void 0) if (err instanceof require_errors.TerminalError) this.coreVm.propose_run_completion_failure(handle, {
155
155
  code: err.code,
156
- message: err.message
156
+ message: err.message,
157
+ metadata: []
157
158
  });
158
159
  else if (err instanceof require_errors.RetryableError) {
159
160
  const maxRetryDuration = options?.maxRetryDuration ?? options?.maxRetryDurationMillis;
@@ -223,7 +224,8 @@ var ContextImpl = class {
223
224
  this.processNonCompletableEntry(require_sdk_shared_core_wasm_bindings.WasmCommandType.CompleteAwakeable, () => {}, (vm) => {
224
225
  vm.sys_complete_awakeable_failure(id, {
225
226
  code: require_errors.UNKNOWN_ERROR_CODE,
226
- message: reason
227
+ message: reason,
228
+ metadata: []
227
229
  });
228
230
  });
229
231
  }
@@ -337,7 +339,8 @@ var DurablePromiseImpl = class {
337
339
  reject(errorMsg) {
338
340
  return this.ctx.processCompletableEntry(require_sdk_shared_core_wasm_bindings.WasmCommandType.CompletePromise, () => {}, (vm) => vm.sys_complete_promise_failure(this.name, {
339
341
  code: require_errors.INTERNAL_ERROR_CODE,
340
- message: errorMsg
342
+ message: errorMsg,
343
+ metadata: []
341
344
  }), VoidAsUndefined, Failure);
342
345
  }
343
346
  };
@@ -151,7 +151,8 @@ var ContextImpl = class {
151
151
  try {
152
152
  if (err !== void 0) if (err instanceof TerminalError) this.coreVm.propose_run_completion_failure(handle, {
153
153
  code: err.code,
154
- message: err.message
154
+ message: err.message,
155
+ metadata: []
155
156
  });
156
157
  else if (err instanceof RetryableError) {
157
158
  const maxRetryDuration = options?.maxRetryDuration ?? options?.maxRetryDurationMillis;
@@ -221,7 +222,8 @@ var ContextImpl = class {
221
222
  this.processNonCompletableEntry(WasmCommandType.CompleteAwakeable, () => {}, (vm) => {
222
223
  vm.sys_complete_awakeable_failure(id, {
223
224
  code: UNKNOWN_ERROR_CODE,
224
- message: reason
225
+ message: reason,
226
+ metadata: []
225
227
  });
226
228
  });
227
229
  }
@@ -335,7 +337,8 @@ var DurablePromiseImpl = class {
335
337
  reject(errorMsg) {
336
338
  return this.ctx.processCompletableEntry(WasmCommandType.CompletePromise, () => {}, (vm) => vm.sys_complete_promise_failure(this.name, {
337
339
  code: INTERNAL_ERROR_CODE,
338
- message: errorMsg
340
+ message: errorMsg,
341
+ metadata: []
339
342
  }), VoidAsUndefined, Failure);
340
343
  }
341
344
  };
@@ -1 +1 @@
1
- {"version":3,"file":"context_impl.js","names":["coreVm: vm.WasmVM","input: vm.WasmInput","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: CompletablePromise<void>","journalValueCodec: JournalValueCodec","asTerminalError?: (error: any) => TerminalError | undefined","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","handle: number","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","castedPromises: InternalRestatePromise<any>[]","error","ctx: ContextImpl","name: string","cause: any","commandType: WasmCommandType","commandIndex: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n SendOptions,\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} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n logError,\n RestateError,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport type {\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from \"node:stream/web\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport type { AsyncResultValue, InternalRestatePromise } from \"./promises.js\";\nimport {\n extractContext,\n InvocationPendingPromise,\n pendingPromise,\n PromisesExecutor,\n RestateCombinatorPromise,\n RestateInvocationPromise,\n RestatePendingPromise,\n RestateSinglePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\n\nexport class ContextImpl implements ObjectContext, WorkflowContext {\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n readonly defaultSerde: Serde<any>;\n\n constructor(\n readonly coreVm: vm.WasmVM,\n readonly input: vm.WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n private readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n private readonly invocationEndPromise: CompletablePromise<void>,\n inputReader: ReadableStreamDefaultReader<Uint8Array>,\n outputWriter: WritableStreamDefaultWriter<Uint8Array>,\n readonly journalValueCodec: JournalValueCodec,\n defaultSerde?: Serde<any>,\n private readonly asTerminalError?: (error: any) => TerminalError | undefined\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n this.runClosuresTracker = new RunClosuresTracker();\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n new InputPump(\n coreVm,\n inputReader,\n this.handleInvocationEndError.bind(this)\n ),\n this.outputPump,\n this.runClosuresTracker,\n this.promiseExecutorErrorCallback.bind(this)\n );\n this.defaultSerde = defaultSerde ?? serde.json;\n }\n\n cancel(invocationId: InvocationId): 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.input.key;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n WasmCommandType.Call\n )\n );\n return new InvocationPendingPromise(this);\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 );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new RestateSinglePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n return new RestateInvocationPromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.handleInvocationEndError(e);\n // We return a pending promise to avoid the caller to see the error.\n return new InvocationPendingPromise(this);\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.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n WasmCommandType.OneWayCall\n )\n );\n return new InvocationPendingPromise(this);\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 );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new RestateSinglePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.handleInvocationEndError(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>(\n { name }: ServiceDefinitionFrom<D>,\n opts?: SendOptions\n ): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined,\n opts?.delay\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string,\n opts?: SendOptions\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key,\n opts?.delay\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string,\n opts?: SendOptions\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key,\n opts?.delay\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let handle: number;\n try {\n handle = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.handleInvocationEndError(e);\n return new RestatePendingPromise(this);\n }\n const commandIndex = this.coreVm.last_command_index();\n\n // Now prepare the run task\n const doRun: () => Promise<any> = async () => {\n // Execute the user code\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n res = await action();\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 });\n } else if (err instanceof RetryableError) {\n const maxRetryDuration =\n options?.maxRetryDuration ?? options?.maxRetryDurationMillis;\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 maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.initialRetryIntervalMillis !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryDurationMillis !== undefined ||\n options?.maxRetryInterval !== undefined ||\n options?.maxRetryIntervalMillis !== undefined\n ) {\n const maxRetryDuration =\n options?.maxRetryDuration ?? options?.maxRetryDurationMillis;\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ??\n options?.initialRetryIntervalMillis ??\n 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ??\n options?.maxRetryIntervalMillis ?? { 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.handleInvocationEndError(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n\n // TODO: here as well\n // Return the promise\n return new RestateSinglePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.handleInvocationEndError(e);\n return {\n id: \"invalid\",\n promise: new RestatePendingPromise(this),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new RestateSinglePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n });\n }\n );\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n // Used by static methods of RestatePromise\n public static createCombinator<T extends readonly RestatePromise<unknown>[]>(\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n promises: T\n ): RestatePromise<unknown> {\n // Extract context from first promise\n const self = extractContext(promises[0]);\n if (!self) {\n throw new Error(\"Not a combinable promise\");\n }\n\n // Collect first the promises downcasted to the internal promise type\n const castedPromises: InternalRestatePromise<any>[] = [];\n for (const promise of promises) {\n if (extractContext(promise) !== self) {\n self.handleInvocationEndError(\n new Error(\n \"You're mixing up RestatePromises from different RestateContext. This is not supported.\"\n )\n );\n return new RestatePendingPromise(self);\n }\n castedPromises.push(promise as InternalRestatePromise<any>);\n }\n return new RestateCombinatorPromise(\n self,\n combinatorConstructor,\n castedPromises\n );\n }\n\n // -- Various private methods\n\n private 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.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n commandType\n )\n );\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.handleInvocationEndError(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.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n commandType\n )\n );\n return new RestatePendingPromise(this);\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.handleInvocationEndError(e);\n return new RestatePendingPromise(this);\n }\n const commandIndex = this.coreVm.last_command_index();\n return new RestateSinglePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n promiseExecutorErrorCallback(e: unknown) {\n if (e instanceof AsyncCompleterError) {\n const cause = ensureError(e.cause);\n logError(this.vmLogger, e.cause);\n // Special handling for this one!\n this.coreVm.notify_error_for_specific_command(\n cause.message,\n cause.stack,\n e.commandType,\n e.commandIndex,\n null\n );\n } else {\n const error = ensureError(e);\n logError(this.vmLogger, error);\n if (!(error instanceof RestateError)) {\n // Notify error\n this.coreVm.notify_error(error.message, error.stack);\n }\n }\n\n // From now on, no progress will be made.\n this.invocationEndPromise.resolve();\n }\n\n handleInvocationEndError(\n e: unknown,\n notify_vm_error: (vm: vm.WasmVM, error: Error) => void = (vm, error) => {\n vm.notify_error(error.message, error.stack);\n }\n ) {\n const error = ensureError(e);\n logError(this.vmLogger, error);\n notify_vm_error(this.coreVm, error);\n\n // From now on, no progress will be made.\n this.invocationEndPromise.resolve();\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 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 }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private currentRunWaitPoint?: CompletablePromise<void>;\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => {\n this.unblockCurrentRunWaitPoint();\n })\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n\n awaitNextCompletedRun(): Promise<void> {\n if (this.currentRunWaitPoint === undefined) {\n this.currentRunWaitPoint = new CompletablePromise();\n }\n return this.currentRunWaitPoint.promise;\n }\n\n private unblockCurrentRunWaitPoint() {\n if (this.currentRunWaitPoint !== undefined) {\n const p = this.currentRunWaitPoint;\n this.currentRunWaitPoint = undefined;\n p.resolve();\n }\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: CompletablePromise<any>\n) => Promise<boolean>;\n\n// This is just a special type we use to propagate completer errors between this function and handleInvocationEndError\nclass AsyncCompleterError {\n constructor(\n readonly cause: any,\n readonly commandType: WasmCommandType,\n readonly commandIndex: number\n ) {}\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new AsyncCompleterError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\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: vm.WasmVM","input: vm.WasmInput","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: CompletablePromise<void>","journalValueCodec: JournalValueCodec","asTerminalError?: (error: any) => TerminalError | undefined","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","handle: number","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","castedPromises: InternalRestatePromise<any>[]","error","ctx: ContextImpl","name: string","cause: any","commandType: WasmCommandType","commandIndex: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n SendOptions,\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} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n logError,\n RestateError,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport type {\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from \"node:stream/web\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport type { AsyncResultValue, InternalRestatePromise } from \"./promises.js\";\nimport {\n extractContext,\n InvocationPendingPromise,\n pendingPromise,\n PromisesExecutor,\n RestateCombinatorPromise,\n RestateInvocationPromise,\n RestatePendingPromise,\n RestateSinglePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\n\nexport class ContextImpl implements ObjectContext, WorkflowContext {\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n readonly defaultSerde: Serde<any>;\n\n constructor(\n readonly coreVm: vm.WasmVM,\n readonly input: vm.WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n private readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n private readonly invocationEndPromise: CompletablePromise<void>,\n inputReader: ReadableStreamDefaultReader<Uint8Array>,\n outputWriter: WritableStreamDefaultWriter<Uint8Array>,\n readonly journalValueCodec: JournalValueCodec,\n defaultSerde?: Serde<any>,\n private readonly asTerminalError?: (error: any) => TerminalError | undefined\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n this.runClosuresTracker = new RunClosuresTracker();\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n new InputPump(\n coreVm,\n inputReader,\n this.handleInvocationEndError.bind(this)\n ),\n this.outputPump,\n this.runClosuresTracker,\n this.promiseExecutorErrorCallback.bind(this)\n );\n this.defaultSerde = defaultSerde ?? serde.json;\n }\n\n cancel(invocationId: InvocationId): 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.input.key;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n WasmCommandType.Call\n )\n );\n return new InvocationPendingPromise(this);\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 );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new RestateSinglePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n return new RestateInvocationPromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.handleInvocationEndError(e);\n // We return a pending promise to avoid the caller to see the error.\n return new InvocationPendingPromise(this);\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.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n WasmCommandType.OneWayCall\n )\n );\n return new InvocationPendingPromise(this);\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 );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new RestateSinglePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.handleInvocationEndError(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>(\n { name }: ServiceDefinitionFrom<D>,\n opts?: SendOptions\n ): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined,\n opts?.delay\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string,\n opts?: SendOptions\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key,\n opts?.delay\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string,\n opts?: SendOptions\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key,\n opts?.delay\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let handle: number;\n try {\n handle = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.handleInvocationEndError(e);\n return new RestatePendingPromise(this);\n }\n const commandIndex = this.coreVm.last_command_index();\n\n // Now prepare the run task\n const doRun: () => Promise<any> = async () => {\n // Execute the user code\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n res = await action();\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: [],\n });\n } else if (err instanceof RetryableError) {\n const maxRetryDuration =\n options?.maxRetryDuration ?? options?.maxRetryDurationMillis;\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 maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.initialRetryIntervalMillis !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryDurationMillis !== undefined ||\n options?.maxRetryInterval !== undefined ||\n options?.maxRetryIntervalMillis !== undefined\n ) {\n const maxRetryDuration =\n options?.maxRetryDuration ?? options?.maxRetryDurationMillis;\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ??\n options?.initialRetryIntervalMillis ??\n 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ??\n options?.maxRetryIntervalMillis ?? { 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.handleInvocationEndError(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n\n // TODO: here as well\n // Return the promise\n return new RestateSinglePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.handleInvocationEndError(e);\n return {\n id: \"invalid\",\n promise: new RestatePendingPromise(this),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new RestateSinglePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n metadata: [],\n });\n }\n );\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n // Used by static methods of RestatePromise\n public static createCombinator<T extends readonly RestatePromise<unknown>[]>(\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n promises: T\n ): RestatePromise<unknown> {\n // Extract context from first promise\n const self = extractContext(promises[0]);\n if (!self) {\n throw new Error(\"Not a combinable promise\");\n }\n\n // Collect first the promises downcasted to the internal promise type\n const castedPromises: InternalRestatePromise<any>[] = [];\n for (const promise of promises) {\n if (extractContext(promise) !== self) {\n self.handleInvocationEndError(\n new Error(\n \"You're mixing up RestatePromises from different RestateContext. This is not supported.\"\n )\n );\n return new RestatePendingPromise(self);\n }\n castedPromises.push(promise as InternalRestatePromise<any>);\n }\n return new RestateCombinatorPromise(\n self,\n combinatorConstructor,\n castedPromises\n );\n }\n\n // -- Various private methods\n\n private 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.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n commandType\n )\n );\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.handleInvocationEndError(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.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n commandType\n )\n );\n return new RestatePendingPromise(this);\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.handleInvocationEndError(e);\n return new RestatePendingPromise(this);\n }\n const commandIndex = this.coreVm.last_command_index();\n return new RestateSinglePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n promiseExecutorErrorCallback(e: unknown) {\n if (e instanceof AsyncCompleterError) {\n const cause = ensureError(e.cause);\n logError(this.vmLogger, e.cause);\n // Special handling for this one!\n this.coreVm.notify_error_for_specific_command(\n cause.message,\n cause.stack,\n e.commandType,\n e.commandIndex,\n null\n );\n } else {\n const error = ensureError(e);\n logError(this.vmLogger, error);\n if (!(error instanceof RestateError)) {\n // Notify error\n this.coreVm.notify_error(error.message, error.stack);\n }\n }\n\n // From now on, no progress will be made.\n this.invocationEndPromise.resolve();\n }\n\n handleInvocationEndError(\n e: unknown,\n notify_vm_error: (vm: vm.WasmVM, error: Error) => void = (vm, error) => {\n vm.notify_error(error.message, error.stack);\n }\n ) {\n const error = ensureError(e);\n logError(this.vmLogger, error);\n notify_vm_error(this.coreVm, error);\n\n // From now on, no progress will be made.\n this.invocationEndPromise.resolve();\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 DurablePromiseImpl<T> implements DurablePromise<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.get().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.get().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.get().finally(onfinally);\n }\n\n [Symbol.toStringTag] = \"DurablePromise\";\n\n get(): RestatePromise<T> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.GetPromise,\n () => {},\n (vm) => vm.sys_get_promise(this.name),\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n peek(): Promise<T | undefined> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.PeekPromise,\n () => {},\n (vm) => vm.sys_peek_promise(this.name),\n VoidAsUndefined,\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n resolve(value?: T): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => this.ctx.journalValueCodec.encode(this.serde.serialize(value as T)),\n (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes),\n VoidAsUndefined,\n Failure\n );\n }\n\n reject(errorMsg: string): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => {},\n (vm) =>\n vm.sys_complete_promise_failure(this.name, {\n code: INTERNAL_ERROR_CODE,\n message: errorMsg,\n metadata: [],\n }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private currentRunWaitPoint?: CompletablePromise<void>;\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => {\n this.unblockCurrentRunWaitPoint();\n })\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n\n awaitNextCompletedRun(): Promise<void> {\n if (this.currentRunWaitPoint === undefined) {\n this.currentRunWaitPoint = new CompletablePromise();\n }\n return this.currentRunWaitPoint.promise;\n }\n\n private unblockCurrentRunWaitPoint() {\n if (this.currentRunWaitPoint !== undefined) {\n const p = this.currentRunWaitPoint;\n this.currentRunWaitPoint = undefined;\n p.resolve();\n }\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: CompletablePromise<any>\n) => Promise<boolean>;\n\n// This is just a special type we use to propagate completer errors between this function and handleInvocationEndError\nclass AsyncCompleterError {\n constructor(\n readonly cause: any,\n readonly commandType: WasmCommandType,\n readonly commandIndex: number\n ) {}\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new AsyncCompleterError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\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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"}
@@ -182,7 +182,8 @@ var GenericHandler = class {
182
182
  if (error instanceof require_errors.TerminalError) {
183
183
  coreVm.sys_write_output_failure({
184
184
  code: error.code,
185
- message: error.message
185
+ message: error.message,
186
+ metadata: []
186
187
  });
187
188
  coreVm.sys_end();
188
189
  return;
@@ -179,7 +179,8 @@ var GenericHandler = class {
179
179
  if (error instanceof TerminalError) {
180
180
  coreVm.sys_write_output_failure({
181
181
  code: error.code,
182
- message: error.message
182
+ message: error.message,
183
+ metadata: []
183
184
  });
184
185
  coreVm.sys_end();
185
186
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"generic.js","names":["endpoint: Endpoint","protocolMode: ProtocolMode","additionalDiscoveryFields: Partial<EndpointManifest>","vm.WasmIdentityVerifier","vm.WasmHeader","journalValueCodec: JournalValueCodec","vm.WasmVM","headers","invocationRequest: Request","error","invocationLoggers: Map<number, Logger>"],"sources":["../../../src/endpoint/handlers/generic.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\nimport {\n ensureError,\n logError,\n RestateError,\n RetryableError,\n TerminalError,\n} from \"../../types/errors.js\";\nimport type {\n Endpoint as EndpointManifest,\n ProtocolMode,\n} from \"../discovery.js\";\nimport type { Component, ComponentHandler } from \"../components.js\";\nimport { parseUrlComponents } from \"../components.js\";\nimport { X_RESTATE_SERVER } from \"../../user_agent.js\";\nimport { type ReadableStream, TransformStream } from \"node:stream/web\";\nimport { OnceStream } from \"../../utils/streams.js\";\nimport { ContextImpl } from \"../../context_impl.js\";\nimport type { Request } from \"../../context.js\";\nimport * as vm from \"./vm/sdk_shared_core_wasm_bindings.js\";\nimport { CompletablePromise } from \"../../utils/completable_promise.js\";\nimport { HandlerKind } from \"../../types/rpc.js\";\nimport { createLogger, type Logger } from \"../../logging/logger.js\";\nimport {\n DEFAULT_CONSOLE_LOGGER_LOG_LEVEL,\n defaultLoggerTransport,\n} from \"../../logging/console_logger_transport.js\";\nimport {\n LoggerContext,\n type LoggerTransport,\n LogSource,\n RestateLogLevel,\n} from \"../../logging/logger_transport.js\";\nimport {\n type JournalValueCodec,\n millisOrDurationToMillis,\n} from \"@restatedev/restate-sdk-core\";\nimport type { Endpoint } from \"../endpoint.js\";\n\nexport interface Headers {\n [name: string]: string | string[] | undefined;\n}\n\nexport interface ResponseHeaders {\n [name: string]: string;\n}\n\nexport interface AdditionalContext {\n [name: string]: string;\n}\n\nexport interface RestateRequest {\n readonly url: string;\n readonly headers: Headers;\n readonly body: ReadableStream<Uint8Array> | null;\n readonly extraArgs: unknown[];\n readonly abortSignal: AbortSignal;\n}\n\nexport interface RestateResponse {\n readonly headers: ResponseHeaders;\n readonly statusCode: number;\n readonly body: ReadableStream<Uint8Array>;\n}\n\nexport interface RestateHandler {\n handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): Promise<RestateResponse>;\n}\n\nconst ENDPOINT_MANIFEST_V2 = \"application/vnd.restate.endpointmanifest.v2+json\";\nconst ENDPOINT_MANIFEST_V3 = \"application/vnd.restate.endpointmanifest.v3+json\";\nconst ENDPOINT_MANIFEST_V4 = \"application/vnd.restate.endpointmanifest.v4+json\";\n\nexport function tryCreateContextualLogger(\n loggerTransport: LoggerTransport,\n url: string,\n headers: Headers,\n additionalContext?: { [name: string]: string }\n): Logger | undefined {\n try {\n const path = new URL(url, \"https://example.com\").pathname;\n const parsed = parseUrlComponents(path);\n if (parsed.type !== \"invoke\") {\n return undefined;\n }\n const invocationId = invocationIdFromHeaders(headers);\n return createLogger(\n loggerTransport,\n LogSource.SYSTEM,\n new LoggerContext(\n invocationId,\n parsed.componentName,\n parsed.handlerName,\n undefined,\n undefined,\n additionalContext\n )\n );\n } catch {\n return undefined;\n }\n}\n\nfunction invocationIdFromHeaders(headers: Headers) {\n const invocationIdHeader = headers[\"x-restate-invocation-id\"];\n const invocationId =\n typeof invocationIdHeader === \"string\"\n ? invocationIdHeader\n : Array.isArray(invocationIdHeader)\n ? (invocationIdHeader[0] ?? \"unknown id\")\n : \"unknown id\";\n return invocationId;\n}\n\n/**\n * This is an internal API to support 'fetch' like handlers.\n * It supports both request-reply mode and bidirectional streaming mode.\n *\n * An individual handler will have to convert the shape of the incoming request\n * to a RestateRequest, and then pass it to this handler, and eventually convert back\n * the response.\n * Different runtimes have slightly different shapes of the incoming request, and responses.\n */\nexport class GenericHandler implements RestateHandler {\n private readonly identityVerifier?: vm.WasmIdentityVerifier;\n\n constructor(\n readonly endpoint: Endpoint,\n private readonly protocolMode: ProtocolMode,\n private readonly additionalDiscoveryFields: Partial<EndpointManifest>\n ) {\n // Setup identity verifier\n if (\n this.endpoint.keySet === undefined ||\n this.endpoint.keySet.length === 0\n ) {\n this.endpoint.rlog.warn(\n `Accepting requests without validating request signatures; handler access must be restricted`\n );\n } else {\n this.endpoint.rlog.info(\n `Validating requests using signing keys [${this.endpoint.keySet}]`\n );\n this.identityVerifier = new vm.WasmIdentityVerifier(this.endpoint.keySet);\n }\n\n // Set the logging level in the shared core too!\n vm.set_log_level(\n restateLogLevelToWasmLogLevel(DEFAULT_CONSOLE_LOGGER_LOG_LEVEL)\n );\n }\n\n // handle does not throw.\n public async handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): Promise<RestateResponse> {\n try {\n return await this._handle(request, context);\n } catch (e) {\n const error = ensureError(e);\n (\n tryCreateContextualLogger(\n this.endpoint.loggerTransport,\n request.url,\n request.headers\n ) ?? this.endpoint.rlog\n ).error(\n \"Error while handling request: \" + (error.stack ?? error.message)\n );\n return this.toErrorResponse(\n error instanceof RestateError ? error.code : 500,\n error.message\n );\n }\n }\n\n private async _handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): Promise<RestateResponse> {\n // this is the recommended way to get the relative path from a url that may be relative or absolute\n const path = new URL(request.url, \"https://example.com\").pathname;\n const parsed = parseUrlComponents(path);\n\n if (parsed.type === \"unknown\") {\n const msg = `Invalid path. Allowed are /health, or /discover, or /invoke/SvcName/handlerName, but was: ${path}`;\n this.endpoint.rlog.trace(msg);\n return this.toErrorResponse(404, msg);\n }\n\n if (parsed.type === \"health\") {\n return {\n body: OnceStream(new TextEncoder().encode(\"OK\")),\n headers: {\n \"content-type\": \"application/text\",\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n statusCode: 200,\n };\n }\n\n const error = this.validateConnectionSignature(path, request.headers);\n if (error !== null) {\n return error;\n }\n if (parsed.type === \"discover\") {\n return this.handleDiscovery(request.headers[\"accept\"]);\n }\n const serviceProtocolVersionString = request.headers[\"content-type\"];\n if (typeof serviceProtocolVersionString !== \"string\") {\n const errorMessage = \"Missing content-type header\";\n this.endpoint.rlog.warn(errorMessage);\n return this.toErrorResponse(415, errorMessage);\n }\n const service = this.endpoint.components.get(parsed.componentName);\n if (!service) {\n const msg = `No service found for URL: ${JSON.stringify(parsed)}`;\n this.endpoint.rlog.error(msg);\n return this.toErrorResponse(404, msg);\n }\n const handler = service?.handlerMatching(parsed);\n if (!handler) {\n const msg = `No service found for URL: ${JSON.stringify(parsed)}`;\n this.endpoint.rlog.error(msg);\n return this.toErrorResponse(404, msg);\n }\n if (!request.body) {\n const msg = \"The incoming message body was null\";\n this.endpoint.rlog.error(msg);\n return this.toErrorResponse(400, msg);\n }\n\n return this.handleInvoke(\n service,\n handler,\n request.body,\n request.headers,\n request.extraArgs,\n request.abortSignal,\n context ?? {}\n );\n }\n\n private validateConnectionSignature(\n path: string,\n headers: Headers\n ): RestateResponse | null {\n if (!this.identityVerifier) {\n // not validating\n return null;\n }\n\n const vmHeaders = Object.entries(headers)\n .filter(([, v]) => v !== undefined)\n .map(\n ([k, v]) =>\n new vm.WasmHeader(k, v instanceof Array ? v[0]! : (v as string))\n );\n\n try {\n this.identityVerifier.verify_identity(path, vmHeaders);\n return null;\n } catch (e) {\n this.endpoint.rlog.error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Rejecting request as its JWT did not validate: ${e}`\n );\n return this.toErrorResponse(401, \"Unauthorized\");\n }\n }\n\n private async handleInvoke(\n service: Component,\n handler: ComponentHandler,\n body: ReadableStream<Uint8Array>,\n headers: Headers,\n extraArgs: unknown[],\n abortSignal: AbortSignal,\n additionalContext: AdditionalContext\n ): Promise<RestateResponse> {\n const journalValueCodec: JournalValueCodec = this.endpoint.journalValueCodec\n ? await this.endpoint.journalValueCodec\n : {\n encode: (entry) => entry,\n decode: (entry) => Promise.resolve(entry),\n };\n const loggerId = Math.floor(Math.random() * 4_294_967_295 /* u32::MAX */);\n\n try {\n // Instantiate core vm and prepare response headers\n const vmHeaders = Object.entries(headers)\n .filter(([, v]) => v !== undefined)\n .map(\n ([k, v]) =>\n new vm.WasmHeader(k, v instanceof Array ? v[0]! : (v as string))\n );\n const coreVm = new vm.WasmVM(\n vmHeaders,\n restateLogLevelToWasmLogLevel(DEFAULT_CONSOLE_LOGGER_LOG_LEVEL),\n loggerId,\n this.endpoint.journalValueCodec !== undefined\n );\n const responseHead = coreVm.get_response_head();\n const responseHeaders = responseHead.headers.reduce(\n (headers, { key, value }) => ({\n [key]: value,\n ...headers,\n }),\n {\n \"x-restate-server\": X_RESTATE_SERVER,\n }\n );\n\n // Use a default logger that still respects the endpoint custom logger\n // We will override this later with a logger that has a LoggerContext\n // See vm_log below for more details\n invocationLoggers.set(\n loggerId,\n createLogger(\n this.endpoint.loggerTransport,\n LogSource.JOURNAL,\n new LoggerContext(\n invocationIdFromHeaders(headers),\n service.name(),\n handler.name(),\n undefined,\n undefined,\n additionalContext\n )\n )\n );\n\n const inputReader = body.getReader();\n abortSignal.addEventListener(\n \"abort\",\n () => {\n invocationLoggers.delete(loggerId);\n void inputReader.cancel();\n },\n { once: true }\n );\n\n // Now buffer input entries\n while (!coreVm.is_ready_to_execute()) {\n const nextValue = await inputReader.read();\n if (nextValue.value !== undefined) {\n coreVm.notify_input(nextValue.value);\n }\n if (nextValue.done) {\n coreVm.notify_input_closed();\n break;\n }\n }\n\n // Get input\n const input = coreVm.sys_input();\n\n const invocationRequest: Request = {\n id: input.invocation_id,\n headers: input.headers.reduce((headers, { key, value }) => {\n headers.set(key, value);\n return headers;\n }, new Map()),\n attemptHeaders: Object.entries(headers).reduce(\n (headers, [key, value]) => {\n if (value !== undefined) {\n headers.set(key, value instanceof Array ? value[0] : value);\n }\n return headers;\n },\n new Map()\n ),\n body: input.input,\n extraArgs,\n attemptCompletedSignal: abortSignal,\n };\n\n // Prepare logger\n const loggerContext = new LoggerContext(\n input.invocation_id,\n handler.component().name(),\n handler.name(),\n handler.kind() === HandlerKind.SERVICE ? undefined : input.key,\n invocationRequest,\n additionalContext\n );\n const ctxLogger = createLogger(\n this.endpoint.loggerTransport,\n LogSource.USER,\n loggerContext,\n () => !coreVm.is_processing()\n );\n const vmLogger = createLogger(\n this.endpoint.loggerTransport,\n LogSource.JOURNAL,\n loggerContext\n // Filtering is done within the shared core\n );\n // See vm_log below for more details\n invocationLoggers.set(loggerId, vmLogger);\n if (!coreVm.is_processing()) {\n vmLogger.info(\"Replaying invocation.\");\n } else {\n vmLogger.info(\"Starting invocation.\");\n }\n\n // This promise is used to signal the end of the computation,\n // which can be either the user returns a value,\n // or an exception gets catched, or the state machine fails/suspends.\n //\n // The last case is handled internally within the ContextImpl.\n const invocationEndPromise = new CompletablePromise<void>();\n\n // Prepare response stream\n const responseTransformStream = new TransformStream<Uint8Array>();\n const outputWriter = responseTransformStream.writable.getWriter();\n\n // Prepare context\n const ctx = new ContextImpl(\n coreVm,\n input,\n ctxLogger,\n handler.kind(),\n vmLogger,\n invocationRequest,\n invocationEndPromise,\n inputReader,\n outputWriter,\n journalValueCodec,\n service.options?.serde,\n service.options?.asTerminalError\n );\n\n journalValueCodec\n .decode(input.input)\n .catch((e) =>\n Promise.reject(\n new TerminalError(\n `Failed to decode input using journal value codec: ${\n ensureError(e).message\n }`,\n {\n errorCode: 400,\n }\n )\n )\n )\n .then((decodedInput) =>\n // Invoke user handler code\n handler.invoke(ctx, decodedInput)\n )\n .then((output) => {\n // Write output result\n coreVm.sys_write_output_success(journalValueCodec.encode(output));\n coreVm.sys_end();\n vmLogger.info(\"Invocation completed successfully.\");\n })\n .catch((e) => {\n // Convert to Error\n const error = ensureError(e, service.options?.asTerminalError);\n logError(vmLogger, error);\n\n // If TerminalError, handle it here.\n // NOTE: this can still fail!\n if (error instanceof TerminalError) {\n coreVm.sys_write_output_failure({\n code: error.code,\n message: error.message,\n });\n coreVm.sys_end();\n return;\n }\n\n // Not a terminal error, have the below catch handle it\n throw error;\n })\n .catch((e) => {\n // Handle any other error now (retryable errors)\n const error = ensureError(e);\n if (error instanceof RetryableError) {\n coreVm.notify_error_with_delay_override(\n error.message,\n error.stack,\n error.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(error.retryAfter))\n : undefined\n );\n } else {\n coreVm.notify_error(error.message, error.stack);\n }\n })\n .finally(() => {\n invocationEndPromise.resolve();\n });\n\n // Let's wire up invocationEndPromise with consuming all the output and closing the streams.\n invocationEndPromise.promise\n .then(async () => {\n // Consume output till the end, write it out, then close the stream\n let nextOutput = coreVm.take_output() as\n | Uint8Array\n | null\n | undefined;\n while (nextOutput !== null && nextOutput !== undefined) {\n await outputWriter.write(nextOutput);\n nextOutput = coreVm.take_output() as Uint8Array | null | undefined;\n }\n await outputWriter.close();\n // Let's cancel the input reader, if it's still here\n inputReader.cancel().catch(() => {});\n })\n .finally(() => {\n invocationLoggers.delete(loggerId);\n })\n .catch(() => {});\n\n return {\n headers: responseHeaders,\n statusCode: responseHead.status_code,\n body: responseTransformStream.readable as ReadableStream<Uint8Array>,\n };\n } catch (error) {\n invocationLoggers.delete(loggerId);\n throw error;\n }\n }\n\n private handleDiscovery(\n acceptVersionsString: string | string[] | undefined\n ): RestateResponse {\n if (typeof acceptVersionsString !== \"string\") {\n const errorMessage = \"Missing accept header\";\n this.endpoint.rlog.warn(errorMessage);\n return this.toErrorResponse(415, errorMessage);\n }\n\n // Negotiate version to use\n let manifestVersion;\n if (acceptVersionsString.includes(ENDPOINT_MANIFEST_V4)) {\n manifestVersion = 4;\n } else if (acceptVersionsString.includes(ENDPOINT_MANIFEST_V3)) {\n manifestVersion = 3;\n } else if (acceptVersionsString.includes(ENDPOINT_MANIFEST_V2)) {\n manifestVersion = 2;\n } else {\n const errorMessage = `Unsupported service discovery protocol version '${acceptVersionsString}'`;\n this.endpoint.rlog.warn(errorMessage);\n return this.toErrorResponse(415, errorMessage);\n }\n\n const discovery = {\n ...this.endpoint.discoveryMetadata,\n ...this.additionalDiscoveryFields,\n protocolMode: this.protocolMode,\n };\n\n const checkUnsupportedFeature = <T extends object>(\n obj: T,\n ...fields: Array<keyof T>\n ) => {\n for (const field of fields) {\n if (field in obj && obj[field] !== undefined) {\n return this.toErrorResponse(\n 500,\n `The code uses the new discovery feature '${String(\n field\n )}' but the runtime doesn't support it yet (discovery protocol negotiated version ${manifestVersion}). Either remove the usage of this feature, or upgrade the runtime.`\n );\n }\n }\n return;\n };\n\n // Verify none of the manifest v3 configuration options are used.\n if (manifestVersion < 3) {\n for (const service of discovery.services) {\n const error = checkUnsupportedFeature(\n service,\n \"journalRetention\",\n \"idempotencyRetention\",\n \"inactivityTimeout\",\n \"abortTimeout\",\n \"enableLazyState\",\n \"ingressPrivate\"\n );\n if (error !== undefined) {\n return error;\n }\n for (const handler of service.handlers) {\n const error = checkUnsupportedFeature(\n handler,\n \"journalRetention\",\n \"idempotencyRetention\",\n \"workflowCompletionRetention\",\n \"inactivityTimeout\",\n \"abortTimeout\",\n \"enableLazyState\",\n \"ingressPrivate\"\n );\n if (error !== undefined) {\n return error;\n }\n }\n }\n }\n\n if (manifestVersion < 4) {\n // Blank the lambda compression field. No need to fail in this case.\n discovery.lambdaCompression = undefined;\n for (const service of discovery.services) {\n const error = checkUnsupportedFeature(\n service,\n \"retryPolicyExponentiationFactor\",\n \"retryPolicyInitialInterval\",\n \"retryPolicyMaxAttempts\",\n \"retryPolicyMaxInterval\",\n \"retryPolicyOnMaxAttempts\"\n );\n if (error !== undefined) {\n return error;\n }\n for (const handler of service.handlers) {\n const error = checkUnsupportedFeature(\n handler,\n \"retryPolicyExponentiationFactor\",\n \"retryPolicyInitialInterval\",\n \"retryPolicyMaxAttempts\",\n \"retryPolicyMaxInterval\",\n \"retryPolicyOnMaxAttempts\"\n );\n if (error !== undefined) {\n return error;\n }\n }\n }\n }\n\n const body = JSON.stringify(discovery);\n return {\n headers: {\n \"content-type\":\n manifestVersion === 2\n ? ENDPOINT_MANIFEST_V2\n : manifestVersion === 3\n ? ENDPOINT_MANIFEST_V3\n : ENDPOINT_MANIFEST_V4,\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n statusCode: 200,\n body: OnceStream(new TextEncoder().encode(body)),\n };\n }\n\n private toErrorResponse(code: number, message: string): RestateResponse {\n return {\n headers: {\n \"content-type\": \"application/json\",\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n statusCode: code,\n body: OnceStream(new TextEncoder().encode(JSON.stringify({ message }))),\n };\n }\n}\n\n// See vm_log below for more details\nconst invocationLoggers: Map<number, Logger> = new Map<number, Logger>();\nconst logsTextDecoder = new TextDecoder(\"utf-8\", { fatal: false });\n\n/**\n * The shared core propagates logs to the SDK invoking this method.\n * When possible it provides an invocationId, which is used to access the registered invocationLoggers, that should contain the logger per invocation id.\n */\nexport function vm_log(\n level: vm.LogLevel,\n strBytes: Uint8Array,\n loggerId?: number\n) {\n try {\n const logger = (loggerId && invocationLoggers.get(loggerId)) || undefined;\n const str = logsTextDecoder.decode(strBytes);\n if (logger !== undefined) {\n logger.logForLevel(wasmLogLevelToRestateLogLevel(level), str);\n } else {\n defaultLoggerTransport(\n {\n level: wasmLogLevelToRestateLogLevel(level),\n replaying: false,\n source: LogSource.JOURNAL,\n },\n str\n );\n }\n } catch (e) {\n // This function CAN'T EVER propagate an error,\n // because otherwise it will cause an awesome error in the shared core due to concurrent usage of it.\n defaultLoggerTransport(\n {\n level: RestateLogLevel.ERROR,\n replaying: false,\n source: LogSource.SYSTEM,\n },\n \"Unexpected error thrown while trying to log: \" + e?.toString()\n );\n }\n}\n\nfunction wasmLogLevelToRestateLogLevel(level: vm.LogLevel): RestateLogLevel {\n switch (level) {\n case vm.LogLevel.TRACE:\n return RestateLogLevel.TRACE;\n case vm.LogLevel.DEBUG:\n return RestateLogLevel.DEBUG;\n case vm.LogLevel.INFO:\n return RestateLogLevel.INFO;\n case vm.LogLevel.WARN:\n return RestateLogLevel.WARN;\n case vm.LogLevel.ERROR:\n return RestateLogLevel.ERROR;\n }\n}\n\nfunction restateLogLevelToWasmLogLevel(level: RestateLogLevel): vm.LogLevel {\n switch (level) {\n case RestateLogLevel.TRACE:\n return vm.LogLevel.TRACE;\n case RestateLogLevel.DEBUG:\n return vm.LogLevel.DEBUG;\n case RestateLogLevel.INFO:\n return vm.LogLevel.INFO;\n case RestateLogLevel.WARN:\n return vm.LogLevel.WARN;\n case RestateLogLevel.ERROR:\n return vm.LogLevel.ERROR;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generic.js","names":["endpoint: Endpoint","protocolMode: ProtocolMode","additionalDiscoveryFields: Partial<EndpointManifest>","vm.WasmIdentityVerifier","vm.WasmHeader","journalValueCodec: JournalValueCodec","vm.WasmVM","headers","invocationRequest: Request","error","invocationLoggers: Map<number, Logger>"],"sources":["../../../src/endpoint/handlers/generic.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\nimport {\n ensureError,\n logError,\n RestateError,\n RetryableError,\n TerminalError,\n} from \"../../types/errors.js\";\nimport type {\n Endpoint as EndpointManifest,\n ProtocolMode,\n} from \"../discovery.js\";\nimport type { Component, ComponentHandler } from \"../components.js\";\nimport { parseUrlComponents } from \"../components.js\";\nimport { X_RESTATE_SERVER } from \"../../user_agent.js\";\nimport { type ReadableStream, TransformStream } from \"node:stream/web\";\nimport { OnceStream } from \"../../utils/streams.js\";\nimport { ContextImpl } from \"../../context_impl.js\";\nimport type { Request } from \"../../context.js\";\nimport * as vm from \"./vm/sdk_shared_core_wasm_bindings.js\";\nimport { CompletablePromise } from \"../../utils/completable_promise.js\";\nimport { HandlerKind } from \"../../types/rpc.js\";\nimport { createLogger, type Logger } from \"../../logging/logger.js\";\nimport {\n DEFAULT_CONSOLE_LOGGER_LOG_LEVEL,\n defaultLoggerTransport,\n} from \"../../logging/console_logger_transport.js\";\nimport {\n LoggerContext,\n type LoggerTransport,\n LogSource,\n RestateLogLevel,\n} from \"../../logging/logger_transport.js\";\nimport {\n type JournalValueCodec,\n millisOrDurationToMillis,\n} from \"@restatedev/restate-sdk-core\";\nimport type { Endpoint } from \"../endpoint.js\";\n\nexport interface Headers {\n [name: string]: string | string[] | undefined;\n}\n\nexport interface ResponseHeaders {\n [name: string]: string;\n}\n\nexport interface AdditionalContext {\n [name: string]: string;\n}\n\nexport interface RestateRequest {\n readonly url: string;\n readonly headers: Headers;\n readonly body: ReadableStream<Uint8Array> | null;\n readonly extraArgs: unknown[];\n readonly abortSignal: AbortSignal;\n}\n\nexport interface RestateResponse {\n readonly headers: ResponseHeaders;\n readonly statusCode: number;\n readonly body: ReadableStream<Uint8Array>;\n}\n\nexport interface RestateHandler {\n handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): Promise<RestateResponse>;\n}\n\nconst ENDPOINT_MANIFEST_V2 = \"application/vnd.restate.endpointmanifest.v2+json\";\nconst ENDPOINT_MANIFEST_V3 = \"application/vnd.restate.endpointmanifest.v3+json\";\nconst ENDPOINT_MANIFEST_V4 = \"application/vnd.restate.endpointmanifest.v4+json\";\n\nexport function tryCreateContextualLogger(\n loggerTransport: LoggerTransport,\n url: string,\n headers: Headers,\n additionalContext?: { [name: string]: string }\n): Logger | undefined {\n try {\n const path = new URL(url, \"https://example.com\").pathname;\n const parsed = parseUrlComponents(path);\n if (parsed.type !== \"invoke\") {\n return undefined;\n }\n const invocationId = invocationIdFromHeaders(headers);\n return createLogger(\n loggerTransport,\n LogSource.SYSTEM,\n new LoggerContext(\n invocationId,\n parsed.componentName,\n parsed.handlerName,\n undefined,\n undefined,\n additionalContext\n )\n );\n } catch {\n return undefined;\n }\n}\n\nfunction invocationIdFromHeaders(headers: Headers) {\n const invocationIdHeader = headers[\"x-restate-invocation-id\"];\n const invocationId =\n typeof invocationIdHeader === \"string\"\n ? invocationIdHeader\n : Array.isArray(invocationIdHeader)\n ? (invocationIdHeader[0] ?? \"unknown id\")\n : \"unknown id\";\n return invocationId;\n}\n\n/**\n * This is an internal API to support 'fetch' like handlers.\n * It supports both request-reply mode and bidirectional streaming mode.\n *\n * An individual handler will have to convert the shape of the incoming request\n * to a RestateRequest, and then pass it to this handler, and eventually convert back\n * the response.\n * Different runtimes have slightly different shapes of the incoming request, and responses.\n */\nexport class GenericHandler implements RestateHandler {\n private readonly identityVerifier?: vm.WasmIdentityVerifier;\n\n constructor(\n readonly endpoint: Endpoint,\n private readonly protocolMode: ProtocolMode,\n private readonly additionalDiscoveryFields: Partial<EndpointManifest>\n ) {\n // Setup identity verifier\n if (\n this.endpoint.keySet === undefined ||\n this.endpoint.keySet.length === 0\n ) {\n this.endpoint.rlog.warn(\n `Accepting requests without validating request signatures; handler access must be restricted`\n );\n } else {\n this.endpoint.rlog.info(\n `Validating requests using signing keys [${this.endpoint.keySet}]`\n );\n this.identityVerifier = new vm.WasmIdentityVerifier(this.endpoint.keySet);\n }\n\n // Set the logging level in the shared core too!\n vm.set_log_level(\n restateLogLevelToWasmLogLevel(DEFAULT_CONSOLE_LOGGER_LOG_LEVEL)\n );\n }\n\n // handle does not throw.\n public async handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): Promise<RestateResponse> {\n try {\n return await this._handle(request, context);\n } catch (e) {\n const error = ensureError(e);\n (\n tryCreateContextualLogger(\n this.endpoint.loggerTransport,\n request.url,\n request.headers\n ) ?? this.endpoint.rlog\n ).error(\n \"Error while handling request: \" + (error.stack ?? error.message)\n );\n return this.toErrorResponse(\n error instanceof RestateError ? error.code : 500,\n error.message\n );\n }\n }\n\n private async _handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): Promise<RestateResponse> {\n // this is the recommended way to get the relative path from a url that may be relative or absolute\n const path = new URL(request.url, \"https://example.com\").pathname;\n const parsed = parseUrlComponents(path);\n\n if (parsed.type === \"unknown\") {\n const msg = `Invalid path. Allowed are /health, or /discover, or /invoke/SvcName/handlerName, but was: ${path}`;\n this.endpoint.rlog.trace(msg);\n return this.toErrorResponse(404, msg);\n }\n\n if (parsed.type === \"health\") {\n return {\n body: OnceStream(new TextEncoder().encode(\"OK\")),\n headers: {\n \"content-type\": \"application/text\",\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n statusCode: 200,\n };\n }\n\n const error = this.validateConnectionSignature(path, request.headers);\n if (error !== null) {\n return error;\n }\n if (parsed.type === \"discover\") {\n return this.handleDiscovery(request.headers[\"accept\"]);\n }\n const serviceProtocolVersionString = request.headers[\"content-type\"];\n if (typeof serviceProtocolVersionString !== \"string\") {\n const errorMessage = \"Missing content-type header\";\n this.endpoint.rlog.warn(errorMessage);\n return this.toErrorResponse(415, errorMessage);\n }\n const service = this.endpoint.components.get(parsed.componentName);\n if (!service) {\n const msg = `No service found for URL: ${JSON.stringify(parsed)}`;\n this.endpoint.rlog.error(msg);\n return this.toErrorResponse(404, msg);\n }\n const handler = service?.handlerMatching(parsed);\n if (!handler) {\n const msg = `No service found for URL: ${JSON.stringify(parsed)}`;\n this.endpoint.rlog.error(msg);\n return this.toErrorResponse(404, msg);\n }\n if (!request.body) {\n const msg = \"The incoming message body was null\";\n this.endpoint.rlog.error(msg);\n return this.toErrorResponse(400, msg);\n }\n\n return this.handleInvoke(\n service,\n handler,\n request.body,\n request.headers,\n request.extraArgs,\n request.abortSignal,\n context ?? {}\n );\n }\n\n private validateConnectionSignature(\n path: string,\n headers: Headers\n ): RestateResponse | null {\n if (!this.identityVerifier) {\n // not validating\n return null;\n }\n\n const vmHeaders = Object.entries(headers)\n .filter(([, v]) => v !== undefined)\n .map(\n ([k, v]) =>\n new vm.WasmHeader(k, v instanceof Array ? v[0]! : (v as string))\n );\n\n try {\n this.identityVerifier.verify_identity(path, vmHeaders);\n return null;\n } catch (e) {\n this.endpoint.rlog.error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Rejecting request as its JWT did not validate: ${e}`\n );\n return this.toErrorResponse(401, \"Unauthorized\");\n }\n }\n\n private async handleInvoke(\n service: Component,\n handler: ComponentHandler,\n body: ReadableStream<Uint8Array>,\n headers: Headers,\n extraArgs: unknown[],\n abortSignal: AbortSignal,\n additionalContext: AdditionalContext\n ): Promise<RestateResponse> {\n const journalValueCodec: JournalValueCodec = this.endpoint.journalValueCodec\n ? await this.endpoint.journalValueCodec\n : {\n encode: (entry) => entry,\n decode: (entry) => Promise.resolve(entry),\n };\n const loggerId = Math.floor(Math.random() * 4_294_967_295 /* u32::MAX */);\n\n try {\n // Instantiate core vm and prepare response headers\n const vmHeaders = Object.entries(headers)\n .filter(([, v]) => v !== undefined)\n .map(\n ([k, v]) =>\n new vm.WasmHeader(k, v instanceof Array ? v[0]! : (v as string))\n );\n const coreVm = new vm.WasmVM(\n vmHeaders,\n restateLogLevelToWasmLogLevel(DEFAULT_CONSOLE_LOGGER_LOG_LEVEL),\n loggerId,\n this.endpoint.journalValueCodec !== undefined\n );\n const responseHead = coreVm.get_response_head();\n const responseHeaders = responseHead.headers.reduce(\n (headers, { key, value }) => ({\n [key]: value,\n ...headers,\n }),\n {\n \"x-restate-server\": X_RESTATE_SERVER,\n }\n );\n\n // Use a default logger that still respects the endpoint custom logger\n // We will override this later with a logger that has a LoggerContext\n // See vm_log below for more details\n invocationLoggers.set(\n loggerId,\n createLogger(\n this.endpoint.loggerTransport,\n LogSource.JOURNAL,\n new LoggerContext(\n invocationIdFromHeaders(headers),\n service.name(),\n handler.name(),\n undefined,\n undefined,\n additionalContext\n )\n )\n );\n\n const inputReader = body.getReader();\n abortSignal.addEventListener(\n \"abort\",\n () => {\n invocationLoggers.delete(loggerId);\n void inputReader.cancel();\n },\n { once: true }\n );\n\n // Now buffer input entries\n while (!coreVm.is_ready_to_execute()) {\n const nextValue = await inputReader.read();\n if (nextValue.value !== undefined) {\n coreVm.notify_input(nextValue.value);\n }\n if (nextValue.done) {\n coreVm.notify_input_closed();\n break;\n }\n }\n\n // Get input\n const input = coreVm.sys_input();\n\n const invocationRequest: Request = {\n id: input.invocation_id,\n headers: input.headers.reduce((headers, { key, value }) => {\n headers.set(key, value);\n return headers;\n }, new Map()),\n attemptHeaders: Object.entries(headers).reduce(\n (headers, [key, value]) => {\n if (value !== undefined) {\n headers.set(key, value instanceof Array ? value[0] : value);\n }\n return headers;\n },\n new Map()\n ),\n body: input.input,\n extraArgs,\n attemptCompletedSignal: abortSignal,\n };\n\n // Prepare logger\n const loggerContext = new LoggerContext(\n input.invocation_id,\n handler.component().name(),\n handler.name(),\n handler.kind() === HandlerKind.SERVICE ? undefined : input.key,\n invocationRequest,\n additionalContext\n );\n const ctxLogger = createLogger(\n this.endpoint.loggerTransport,\n LogSource.USER,\n loggerContext,\n () => !coreVm.is_processing()\n );\n const vmLogger = createLogger(\n this.endpoint.loggerTransport,\n LogSource.JOURNAL,\n loggerContext\n // Filtering is done within the shared core\n );\n // See vm_log below for more details\n invocationLoggers.set(loggerId, vmLogger);\n if (!coreVm.is_processing()) {\n vmLogger.info(\"Replaying invocation.\");\n } else {\n vmLogger.info(\"Starting invocation.\");\n }\n\n // This promise is used to signal the end of the computation,\n // which can be either the user returns a value,\n // or an exception gets catched, or the state machine fails/suspends.\n //\n // The last case is handled internally within the ContextImpl.\n const invocationEndPromise = new CompletablePromise<void>();\n\n // Prepare response stream\n const responseTransformStream = new TransformStream<Uint8Array>();\n const outputWriter = responseTransformStream.writable.getWriter();\n\n // Prepare context\n const ctx = new ContextImpl(\n coreVm,\n input,\n ctxLogger,\n handler.kind(),\n vmLogger,\n invocationRequest,\n invocationEndPromise,\n inputReader,\n outputWriter,\n journalValueCodec,\n service.options?.serde,\n service.options?.asTerminalError\n );\n\n journalValueCodec\n .decode(input.input)\n .catch((e) =>\n Promise.reject(\n new TerminalError(\n `Failed to decode input using journal value codec: ${\n ensureError(e).message\n }`,\n {\n errorCode: 400,\n }\n )\n )\n )\n .then((decodedInput) =>\n // Invoke user handler code\n handler.invoke(ctx, decodedInput)\n )\n .then((output) => {\n // Write output result\n coreVm.sys_write_output_success(journalValueCodec.encode(output));\n coreVm.sys_end();\n vmLogger.info(\"Invocation completed successfully.\");\n })\n .catch((e) => {\n // Convert to Error\n const error = ensureError(e, service.options?.asTerminalError);\n logError(vmLogger, error);\n\n // If TerminalError, handle it here.\n // NOTE: this can still fail!\n if (error instanceof TerminalError) {\n coreVm.sys_write_output_failure({\n code: error.code,\n message: error.message,\n metadata: [],\n });\n coreVm.sys_end();\n return;\n }\n\n // Not a terminal error, have the below catch handle it\n throw error;\n })\n .catch((e) => {\n // Handle any other error now (retryable errors)\n const error = ensureError(e);\n if (error instanceof RetryableError) {\n coreVm.notify_error_with_delay_override(\n error.message,\n error.stack,\n error.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(error.retryAfter))\n : undefined\n );\n } else {\n coreVm.notify_error(error.message, error.stack);\n }\n })\n .finally(() => {\n invocationEndPromise.resolve();\n });\n\n // Let's wire up invocationEndPromise with consuming all the output and closing the streams.\n invocationEndPromise.promise\n .then(async () => {\n // Consume output till the end, write it out, then close the stream\n let nextOutput = coreVm.take_output() as\n | Uint8Array\n | null\n | undefined;\n while (nextOutput !== null && nextOutput !== undefined) {\n await outputWriter.write(nextOutput);\n nextOutput = coreVm.take_output() as Uint8Array | null | undefined;\n }\n await outputWriter.close();\n // Let's cancel the input reader, if it's still here\n inputReader.cancel().catch(() => {});\n })\n .finally(() => {\n invocationLoggers.delete(loggerId);\n })\n .catch(() => {});\n\n return {\n headers: responseHeaders,\n statusCode: responseHead.status_code,\n body: responseTransformStream.readable as ReadableStream<Uint8Array>,\n };\n } catch (error) {\n invocationLoggers.delete(loggerId);\n throw error;\n }\n }\n\n private handleDiscovery(\n acceptVersionsString: string | string[] | undefined\n ): RestateResponse {\n if (typeof acceptVersionsString !== \"string\") {\n const errorMessage = \"Missing accept header\";\n this.endpoint.rlog.warn(errorMessage);\n return this.toErrorResponse(415, errorMessage);\n }\n\n // Negotiate version to use\n let manifestVersion;\n if (acceptVersionsString.includes(ENDPOINT_MANIFEST_V4)) {\n manifestVersion = 4;\n } else if (acceptVersionsString.includes(ENDPOINT_MANIFEST_V3)) {\n manifestVersion = 3;\n } else if (acceptVersionsString.includes(ENDPOINT_MANIFEST_V2)) {\n manifestVersion = 2;\n } else {\n const errorMessage = `Unsupported service discovery protocol version '${acceptVersionsString}'`;\n this.endpoint.rlog.warn(errorMessage);\n return this.toErrorResponse(415, errorMessage);\n }\n\n const discovery = {\n ...this.endpoint.discoveryMetadata,\n ...this.additionalDiscoveryFields,\n protocolMode: this.protocolMode,\n };\n\n const checkUnsupportedFeature = <T extends object>(\n obj: T,\n ...fields: Array<keyof T>\n ) => {\n for (const field of fields) {\n if (field in obj && obj[field] !== undefined) {\n return this.toErrorResponse(\n 500,\n `The code uses the new discovery feature '${String(\n field\n )}' but the runtime doesn't support it yet (discovery protocol negotiated version ${manifestVersion}). Either remove the usage of this feature, or upgrade the runtime.`\n );\n }\n }\n return;\n };\n\n // Verify none of the manifest v3 configuration options are used.\n if (manifestVersion < 3) {\n for (const service of discovery.services) {\n const error = checkUnsupportedFeature(\n service,\n \"journalRetention\",\n \"idempotencyRetention\",\n \"inactivityTimeout\",\n \"abortTimeout\",\n \"enableLazyState\",\n \"ingressPrivate\"\n );\n if (error !== undefined) {\n return error;\n }\n for (const handler of service.handlers) {\n const error = checkUnsupportedFeature(\n handler,\n \"journalRetention\",\n \"idempotencyRetention\",\n \"workflowCompletionRetention\",\n \"inactivityTimeout\",\n \"abortTimeout\",\n \"enableLazyState\",\n \"ingressPrivate\"\n );\n if (error !== undefined) {\n return error;\n }\n }\n }\n }\n\n if (manifestVersion < 4) {\n // Blank the lambda compression field. No need to fail in this case.\n discovery.lambdaCompression = undefined;\n for (const service of discovery.services) {\n const error = checkUnsupportedFeature(\n service,\n \"retryPolicyExponentiationFactor\",\n \"retryPolicyInitialInterval\",\n \"retryPolicyMaxAttempts\",\n \"retryPolicyMaxInterval\",\n \"retryPolicyOnMaxAttempts\"\n );\n if (error !== undefined) {\n return error;\n }\n for (const handler of service.handlers) {\n const error = checkUnsupportedFeature(\n handler,\n \"retryPolicyExponentiationFactor\",\n \"retryPolicyInitialInterval\",\n \"retryPolicyMaxAttempts\",\n \"retryPolicyMaxInterval\",\n \"retryPolicyOnMaxAttempts\"\n );\n if (error !== undefined) {\n return error;\n }\n }\n }\n }\n\n const body = JSON.stringify(discovery);\n return {\n headers: {\n \"content-type\":\n manifestVersion === 2\n ? ENDPOINT_MANIFEST_V2\n : manifestVersion === 3\n ? ENDPOINT_MANIFEST_V3\n : ENDPOINT_MANIFEST_V4,\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n statusCode: 200,\n body: OnceStream(new TextEncoder().encode(body)),\n };\n }\n\n private toErrorResponse(code: number, message: string): RestateResponse {\n return {\n headers: {\n \"content-type\": \"application/json\",\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n statusCode: code,\n body: OnceStream(new TextEncoder().encode(JSON.stringify({ message }))),\n };\n }\n}\n\n// See vm_log below for more details\nconst invocationLoggers: Map<number, Logger> = new Map<number, Logger>();\nconst logsTextDecoder = new TextDecoder(\"utf-8\", { fatal: false });\n\n/**\n * The shared core propagates logs to the SDK invoking this method.\n * When possible it provides an invocationId, which is used to access the registered invocationLoggers, that should contain the logger per invocation id.\n */\nexport function vm_log(\n level: vm.LogLevel,\n strBytes: Uint8Array,\n loggerId?: number\n) {\n try {\n const logger = (loggerId && invocationLoggers.get(loggerId)) || undefined;\n const str = logsTextDecoder.decode(strBytes);\n if (logger !== undefined) {\n logger.logForLevel(wasmLogLevelToRestateLogLevel(level), str);\n } else {\n defaultLoggerTransport(\n {\n level: wasmLogLevelToRestateLogLevel(level),\n replaying: false,\n source: LogSource.JOURNAL,\n },\n str\n );\n }\n } catch (e) {\n // This function CAN'T EVER propagate an error,\n // because otherwise it will cause an awesome error in the shared core due to concurrent usage of it.\n defaultLoggerTransport(\n {\n level: RestateLogLevel.ERROR,\n replaying: false,\n source: LogSource.SYSTEM,\n },\n \"Unexpected error thrown while trying to log: \" + e?.toString()\n );\n }\n}\n\nfunction wasmLogLevelToRestateLogLevel(level: vm.LogLevel): RestateLogLevel {\n switch (level) {\n case vm.LogLevel.TRACE:\n return RestateLogLevel.TRACE;\n case vm.LogLevel.DEBUG:\n return RestateLogLevel.DEBUG;\n case vm.LogLevel.INFO:\n return RestateLogLevel.INFO;\n case vm.LogLevel.WARN:\n return RestateLogLevel.WARN;\n case vm.LogLevel.ERROR:\n return RestateLogLevel.ERROR;\n }\n}\n\nfunction restateLogLevelToWasmLogLevel(level: RestateLogLevel): vm.LogLevel {\n switch (level) {\n case RestateLogLevel.TRACE:\n return vm.LogLevel.TRACE;\n case RestateLogLevel.DEBUG:\n return vm.LogLevel.DEBUG;\n case RestateLogLevel.INFO:\n return vm.LogLevel.INFO;\n case RestateLogLevel.WARN:\n return vm.LogLevel.WARN;\n case RestateLogLevel.ERROR:\n return vm.LogLevel.ERROR;\n }\n}\n"],"mappings":"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"}
@@ -37,9 +37,15 @@ export enum WasmCommandType {
37
37
  CompleteAwakeable = 17,
38
38
  CancelInvocation = 18,
39
39
  }
40
+ export interface WasmFailureMetadata {
41
+ key: string;
42
+ value: string;
43
+ }
44
+
40
45
  export interface WasmFailure {
41
46
  code: number;
42
47
  message: string;
48
+ metadata: WasmFailureMetadata[];
43
49
  }
44
50
 
45
51
  export interface WasmExponentialRetryConfig {
@@ -1093,6 +1093,11 @@ export function __wbg_crypto_ed58b8e10a292839(arg0) {
1093
1093
  return ret;
1094
1094
  };
1095
1095
 
1096
+ export function __wbg_done_769e5ede4b31c67b(arg0) {
1097
+ const ret = arg0.done;
1098
+ return ret;
1099
+ };
1100
+
1096
1101
  export function __wbg_error_7534b8e9a36f1ab4(arg0, arg1) {
1097
1102
  let deferred0_0;
1098
1103
  let deferred0_1;
@@ -1119,6 +1124,16 @@ export function __wbg_getTime_46267b1c24877e30(arg0) {
1119
1124
  return ret;
1120
1125
  };
1121
1126
 
1127
+ export function __wbg_get_67b2ba62fc30de12() { return handleError(function (arg0, arg1) {
1128
+ const ret = Reflect.get(arg0, arg1);
1129
+ return ret;
1130
+ }, arguments) };
1131
+
1132
+ export function __wbg_get_b9b93047fe3cf45b(arg0, arg1) {
1133
+ const ret = arg0[arg1 >>> 0];
1134
+ return ret;
1135
+ };
1136
+
1122
1137
  export function __wbg_getwithrefkey_6550b2c093d2eb18(arg0, arg1) {
1123
1138
  const ret = arg0[arg1];
1124
1139
  return ret;
@@ -1146,16 +1161,31 @@ export function __wbg_instanceof_Uint8Array_17156bcf118086a9(arg0) {
1146
1161
  return ret;
1147
1162
  };
1148
1163
 
1164
+ export function __wbg_isArray_a1eab7e0d067391b(arg0) {
1165
+ const ret = Array.isArray(arg0);
1166
+ return ret;
1167
+ };
1168
+
1149
1169
  export function __wbg_isSafeInteger_343e2beeeece1bb0(arg0) {
1150
1170
  const ret = Number.isSafeInteger(arg0);
1151
1171
  return ret;
1152
1172
  };
1153
1173
 
1174
+ export function __wbg_iterator_9a24c88df860dc65() {
1175
+ const ret = Symbol.iterator;
1176
+ return ret;
1177
+ };
1178
+
1154
1179
  export function __wbg_length_a446193dc22c12f8(arg0) {
1155
1180
  const ret = arg0.length;
1156
1181
  return ret;
1157
1182
  };
1158
1183
 
1184
+ export function __wbg_length_e2d2a49132c1b256(arg0) {
1185
+ const ret = arg0.length;
1186
+ return ret;
1187
+ };
1188
+
1159
1189
  export function __wbg_msCrypto_0a36e2ec3a343d26(arg0) {
1160
1190
  const ret = arg0.msCrypto;
1161
1191
  return ret;
@@ -1201,6 +1231,16 @@ export function __wbg_newwithlength_a381634e90c276d4(arg0) {
1201
1231
  return ret;
1202
1232
  };
1203
1233
 
1234
+ export function __wbg_next_25feadfc0913fea9(arg0) {
1235
+ const ret = arg0.next;
1236
+ return ret;
1237
+ };
1238
+
1239
+ export function __wbg_next_6574e1a8a62d1055() { return handleError(function (arg0) {
1240
+ const ret = arg0.next();
1241
+ return ret;
1242
+ }, arguments) };
1243
+
1204
1244
  export function __wbg_node_02999533c4ea02e3(arg0) {
1205
1245
  const ret = arg0.node;
1206
1246
  return ret;
@@ -1274,6 +1314,11 @@ export function __wbg_subarray_aa9065fa9dc5df96(arg0, arg1, arg2) {
1274
1314
  return ret;
1275
1315
  };
1276
1316
 
1317
+ export function __wbg_value_cd1ffa7b1ab794f1(arg0) {
1318
+ const ret = arg0.value;
1319
+ return ret;
1320
+ };
1321
+
1277
1322
  export function __wbg_versions_c71aa1626a93e0a1(arg0) {
1278
1323
  const ret = arg0.versions;
1279
1324
  return ret;
package/dist/package.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region package.json
3
- var version = "1.10.1";
3
+ var version = "1.10.2";
4
4
 
5
5
  //#endregion
6
6
  Object.defineProperty(exports, 'version', {
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.10.1";
2
+ var version = "1.10.2";
3
3
 
4
4
  //#endregion
5
5
  export { version };
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@restatedev/restate-sdk\",\n \"version\": \"1.10.1\",\n \"description\": \"Typescript SDK for Restate\",\n \"author\": \"Restate Developers\",\n \"email\": \"code@restate.dev\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/restatedev/sdk-typescript#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/restatedev/sdk-typescript.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/restatedev/sdk-typescript/issues\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./fetch\": {\n \"import\": \"./dist/fetch.js\",\n \"require\": \"./dist/fetch.cjs\"\n },\n \"./lambda\": {\n \"import\": \"./dist/lambda.js\",\n \"require\": \"./dist/lambda.cjs\"\n },\n \"./node\": {\n \"import\": \"./dist/node.js\",\n \"require\": \"./dist/node.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"test\": \"turbo run _test --filter={.}...\",\n \"_test\": \"vitest run\",\n \"build\": \"turbo run _build --filter={.}...\",\n \"_build\": \"tsc --noEmit && tsdown\",\n \"dev\": \"tsc --noEmit --watch\",\n \"clean\": \"rm -rf dist *.tsbuildinfo .turbo\",\n \"check:types\": \"turbo run _check:types --filter={.}...\",\n \"_check:types\": \"tsc --noEmit --project tsconfig.build.json\",\n \"lint\": \"eslint .\",\n \"check:exports\": \"turbo run _check:exports --filter={.}...\",\n \"_check:exports\": \"attw --pack .\",\n \"check:api\": \"turbo run _check:api --filter={.}...\",\n \"_check:api\": \"api-extractor run --local && api-extractor run --local --config api-extractor.fetch.json && api-extractor run --local --config api-extractor.lambda.json && api-extractor run --local --config api-extractor.node.json\",\n \"prepublishOnly\": \"pnpm -w verify\"\n },\n \"dependencies\": {\n \"@restatedev/restate-sdk-core\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/aws-lambda\": \"^8.10.115\"\n },\n \"typesVersions\": {\n \"*\": {\n \"fetch\": [\n \"./dist/fetch.d.ts\"\n ],\n \"lambda\": [\n \"./dist/lambda.d.ts\"\n ],\n \"node\": [\n \"./dist/node.d.ts\"\n ]\n }\n }\n}\n"],"mappings":";cAEa"}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@restatedev/restate-sdk\",\n \"version\": \"1.10.2\",\n \"description\": \"Typescript SDK for Restate\",\n \"author\": \"Restate Developers\",\n \"email\": \"code@restate.dev\",\n \"license\": \"MIT\",\n \"homepage\": \"https://github.com/restatedev/sdk-typescript#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/restatedev/sdk-typescript.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/restatedev/sdk-typescript/issues\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.cts\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./fetch\": {\n \"import\": \"./dist/fetch.js\",\n \"require\": \"./dist/fetch.cjs\"\n },\n \"./lambda\": {\n \"import\": \"./dist/lambda.js\",\n \"require\": \"./dist/lambda.cjs\"\n },\n \"./node\": {\n \"import\": \"./dist/node.js\",\n \"require\": \"./dist/node.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"test\": \"turbo run _test --filter={.}...\",\n \"_test\": \"vitest run\",\n \"build\": \"turbo run _build --filter={.}...\",\n \"_build\": \"tsc --noEmit && tsdown\",\n \"dev\": \"tsc --noEmit --watch\",\n \"clean\": \"rm -rf dist *.tsbuildinfo .turbo\",\n \"check:types\": \"turbo run _check:types --filter={.}...\",\n \"_check:types\": \"tsc --noEmit --project tsconfig.build.json\",\n \"lint\": \"eslint .\",\n \"check:exports\": \"turbo run _check:exports --filter={.}...\",\n \"_check:exports\": \"attw --pack .\",\n \"check:api\": \"turbo run _check:api --filter={.}...\",\n \"_check:api\": \"api-extractor run --local && api-extractor run --local --config api-extractor.fetch.json && api-extractor run --local --config api-extractor.lambda.json && api-extractor run --local --config api-extractor.node.json\",\n \"prepublishOnly\": \"pnpm -w verify\"\n },\n \"dependencies\": {\n \"@restatedev/restate-sdk-core\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@types/aws-lambda\": \"^8.10.115\"\n },\n \"typesVersions\": {\n \"*\": {\n \"fetch\": [\n \"./dist/fetch.d.ts\"\n ],\n \"lambda\": [\n \"./dist/lambda.d.ts\"\n ],\n \"node\": [\n \"./dist/node.d.ts\"\n ]\n }\n }\n}\n"],"mappings":";cAEa"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restatedev/restate-sdk-cloudflare-workers",
3
- "version": "1.10.1",
3
+ "version": "1.10.2",
4
4
  "description": "Typescript SDK for Restate",
5
5
  "author": "Restate Developers",
6
6
  "email": "code@restate.dev",
@@ -35,11 +35,11 @@
35
35
  "access": "public"
36
36
  },
37
37
  "dependencies": {
38
- "@restatedev/restate-sdk-core": "1.10.1"
38
+ "@restatedev/restate-sdk-core": "1.10.2"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/aws-lambda": "^8.10.115",
42
- "@restatedev/restate-sdk": "1.10.1"
42
+ "@restatedev/restate-sdk": "1.10.2"
43
43
  },
44
44
  "typesVersions": {
45
45
  "*": {