@restatedev/restate-sdk 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -54,15 +54,18 @@ This library follows [Semantic Versioning](https://semver.org/).
54
54
 
55
55
  The compatibility with Restate is described in the following table:
56
56
 
57
- | Restate Server\sdk-typescript | <= 1.4 | 1.5 - 1.6 | 1.7 - 1.8 | 1.9 - 1.10 |
58
- |-------------------------------|------------------|-----------|------------------|------------------|
59
- | <= 1.2 | ✅ | ❌ | ❌ | ❌ |
60
- | 1.3 | ✅ | ✅ | ✅ <sup>(1)</sup> | ✅ <sup>(2)</sup> |
61
- | 1.4 | ✅ | ✅ | ✅ | ✅ <sup>(2)</sup> |
62
- | 1.5 | ⚠ <sup>(3)</sup> | ✅ | ✅ | ✅ |
57
+ | Restate Server\sdk-typescript | <= 1.4 | 1.5 - 1.6 | 1.7 - 1.8 | 1.9 - 1.10 | 1.11 - 1.13 |
58
+ |-------------------------------|------------------|-----------|------------------|---------------------|------------------------|
59
+ | <= 1.2 | ✅ | ❌ | ❌ | ❌ | ❌ |
60
+ | 1.3 | ✅ | ✅ | ✅ <sup>(1)</sup> | ✅ <sup>(1, 2)</sup> | ✅ <sup>(1, 2, 3)</sup> |
61
+ | 1.4 | ✅ | ✅ | ✅ | ✅ <sup>(2)</sup> | ✅ <sup>(2, 3)</sup> |
62
+ | 1.5 | ⚠ <sup>(4)</sup> | ✅ | ✅ | ✅ | ✅ <sup>(3)</sup> |
63
+ | 1.6 | ⚠ <sup>(4)</sup> | ✅ | ✅ | ✅ | ✅ |
63
64
 
64
- <sup>(1)</sup> **Note** the new `options` in service/object/workflow constructors, together with some of the new options in the `handler`s too, work only from Restate 1.4 onward. Check the in-code documentation for more details.
65
+ <sup>(1)</sup> **Note** `options` in service/object/workflow constructors, together with some options in the `handler`s too, work only from Restate 1.4 onward. Check the in-code documentation for more details.
65
66
 
66
- <sup>(2)</sup> **Note** the new `options.retryPolicy` work only from Restate 1.5 onward. Check the in-code documentation for more details.
67
+ <sup>(2)</sup> **Note** `options.retryPolicy` work only from Restate 1.5 onward. Check the in-code documentation for more details.
67
68
 
68
- <sup>(3)</sup> **Warning** SDK versions <= 1.4 are deprecated, and cannot be registered anymore. Check the [Restate 1.5 release notes](https://github.com/restatedev/restate/releases/tag/v1.5.0) for more info.
69
+ <sup>(3)</sup> **Note** `TerminalError.metadata` work only from Restate 1.6 onward. Check the in-code documentation for more details.
70
+
71
+ <sup>(4)</sup> **Warning** SDK versions <= 1.4 are deprecated, and cannot be registered anymore. Check the [Restate 1.5 release notes](https://github.com/restatedev/restate/releases/tag/v1.5.0) for more info.
@@ -22,15 +22,16 @@ function handlerInputDiscovery(handler, defaultSerde) {
22
22
  }
23
23
  function handlerOutputDiscovery(handler, defaultSerde) {
24
24
  const serde$1 = handler.options?.output ?? defaultSerde;
25
+ const setContentTypeIfEmpty = handler.options?.setOutputContentTypeIfEmpty ?? false;
25
26
  let contentType = void 0;
26
27
  let jsonSchema = void 0;
27
28
  if (serde$1.jsonSchema) {
28
29
  jsonSchema = serde$1.jsonSchema;
29
30
  contentType = serde$1.contentType ?? "application/json";
30
31
  } else if (serde$1.contentType) contentType = serde$1.contentType;
31
- else return { setContentTypeIfEmpty: false };
32
+ else return { setContentTypeIfEmpty };
32
33
  return {
33
- setContentTypeIfEmpty: false,
34
+ setContentTypeIfEmpty,
34
35
  jsonSchema,
35
36
  contentType
36
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/endpoint/components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/endpoint/components.ts"],"names":[],"mappings":"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"}
@@ -20,15 +20,16 @@ function handlerInputDiscovery(handler, defaultSerde) {
20
20
  }
21
21
  function handlerOutputDiscovery(handler, defaultSerde) {
22
22
  const serde$1 = handler.options?.output ?? defaultSerde;
23
+ const setContentTypeIfEmpty = handler.options?.setOutputContentTypeIfEmpty ?? false;
23
24
  let contentType = void 0;
24
25
  let jsonSchema = void 0;
25
26
  if (serde$1.jsonSchema) {
26
27
  jsonSchema = serde$1.jsonSchema;
27
28
  contentType = serde$1.contentType ?? "application/json";
28
29
  } else if (serde$1.contentType) contentType = serde$1.contentType;
29
- else return { setContentTypeIfEmpty: false };
30
+ else return { setContentTypeIfEmpty };
30
31
  return {
31
- setContentTypeIfEmpty: false,
32
+ setContentTypeIfEmpty,
32
33
  jsonSchema,
33
34
  contentType
34
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","names":["serde","componentName: string","description?: string","metadata?: Record<string, string>","options?: ServiceOptions","ServiceHandler","handlers: d.Handler[]","handlerName: string","handlerWrapper: HandlerWrapper","parent: ServiceComponent","options?: ObjectOptions","parent: VirtualObjectComponent","options?: WorkflowOptions","WorkflowHandler","parent: WorkflowComponent"],"sources":["../../src/endpoint/components.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 * as d from \"./discovery.js\";\nimport type { ContextImpl } from \"../context_impl.js\";\nimport type {\n HandlerWrapper,\n ObjectOptions,\n ServiceHandlerOpts,\n ServiceOptions,\n WorkflowOptions,\n} from \"../types/rpc.js\";\nimport { HandlerKind } from \"../types/rpc.js\";\nimport type { Serde } from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport type { HooksProvider } from \"../hooks.js\";\nimport type { TerminalError } from \"../types/errors.js\";\n\n//\n// Interfaces\n//\nexport interface Component {\n name(): string;\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined;\n discovery(): d.Service;\n}\n\n/**\n * Execution-related options\n */\nexport interface ExecutionOptions {\n asTerminalError?: (error: any) => TerminalError | undefined;\n /**\n * Default serde to use for requests, responses, state, side effects, awakeables, promises. Used when no other serde is specified.\n */\n defaultSerde?: Serde<any>;\n hooks?: HooksProvider[];\n explicitCancellation?: boolean;\n}\n\nexport interface ComponentHandler {\n name(): string;\n component(): Component;\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array>;\n kind(): HandlerKind;\n\n /**\n * Returns the execution options, already merged with different layers (endpoint -> service -> handler)\n */\n executionOptions: ExecutionOptions;\n}\n\n//\n// Service\n//\n\nfunction handlerInputDiscovery(\n handler: HandlerWrapper,\n defaultSerde: Serde<any>\n): d.InputPayload {\n const serde = handler.options?.input ?? defaultSerde;\n\n let contentType = undefined;\n let jsonSchema = undefined;\n\n if (serde.jsonSchema) {\n jsonSchema = serde.jsonSchema;\n contentType = handler.options?.accept ?? serde.contentType;\n } else if (handler.options?.accept) {\n contentType = handler.options?.accept;\n } else if (serde.contentType) {\n contentType = serde.contentType;\n } else {\n // no input information\n return {};\n }\n\n return {\n required: false,\n contentType,\n jsonSchema,\n };\n}\n\nfunction handlerOutputDiscovery(\n handler: HandlerWrapper,\n defaultSerde: Serde<any>\n): d.OutputPayload {\n const serde = handler.options?.output ?? defaultSerde;\n\n let contentType = undefined;\n let jsonSchema = undefined;\n\n if (serde.jsonSchema) {\n jsonSchema = serde.jsonSchema;\n contentType = serde.contentType ?? \"application/json\";\n } else if (serde.contentType) {\n contentType = serde.contentType;\n } else {\n // no input information\n return { setContentTypeIfEmpty: false };\n }\n\n return {\n setContentTypeIfEmpty: false,\n jsonSchema,\n contentType,\n };\n}\n\nfunction createExecutionOptions(\n serviceOptions?: ServiceOptions,\n handlerOptions?: ServiceHandlerOpts<unknown, unknown>\n): ExecutionOptions {\n // Service-level hooks run outermost, handler-level hooks run innermost.\n // Both are merged into a single list: service hooks first, then handler hooks.\n const hooks = [\n ...(serviceOptions?.hooks ?? []),\n ...(handlerOptions?.hooks ?? []),\n ];\n return {\n defaultSerde: handlerOptions?.serde ?? serviceOptions?.serde,\n asTerminalError:\n handlerOptions?.asTerminalError ?? serviceOptions?.asTerminalError,\n hooks: hooks.length > 0 ? hooks : undefined,\n explicitCancellation:\n handlerOptions?.explicitCancellation ??\n serviceOptions?.explicitCancellation,\n };\n}\n\nexport class ServiceComponent implements Component {\n private readonly handlers: Map<string, ServiceHandler> = new Map();\n\n constructor(\n private readonly componentName: string,\n public readonly description?: string,\n public readonly metadata?: Record<string, string>,\n public readonly options?: ServiceOptions\n ) {}\n\n name(): string {\n return this.componentName;\n }\n\n add(name: string, handlerWrapper: HandlerWrapper) {\n this.handlers.set(name, new ServiceHandler(name, handlerWrapper, this));\n }\n\n discovery(): d.Service {\n const handlers: d.Handler[] = [...this.handlers.entries()].map(\n ([name, handler]) => {\n return {\n name,\n ...commonHandlerOptions(\n handler.handlerWrapper,\n handler.executionOptions.defaultSerde ?? serde.json\n ),\n } satisfies d.Handler;\n }\n );\n\n return {\n name: this.componentName,\n ty: \"SERVICE\",\n handlers,\n documentation: this.description,\n metadata: this.metadata,\n ...commonServiceOptions(this.options),\n } satisfies d.Service;\n }\n\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined {\n return this.handlers.get(url.handlerName);\n }\n}\n\nexport class ServiceHandler implements ComponentHandler {\n readonly executionOptions: ExecutionOptions;\n\n constructor(\n private readonly handlerName: string,\n public readonly handlerWrapper: HandlerWrapper,\n private readonly parent: ServiceComponent\n ) {\n this.executionOptions = createExecutionOptions(\n this.parent.options,\n handlerWrapper.options\n );\n }\n\n name(): string {\n return this.handlerName;\n }\n\n component(): Component {\n return this.parent;\n }\n\n kind(): HandlerKind {\n return this.handlerWrapper.kind;\n }\n\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array> {\n return this.handlerWrapper.invoke(context, input);\n }\n}\n\n//\n// Virtual Object\n//\n\nexport class VirtualObjectComponent implements Component {\n private readonly handlers: Map<string, VirtualObjectHandler> = new Map();\n\n constructor(\n public readonly componentName: string,\n public readonly description?: string,\n public readonly metadata?: Record<string, string>,\n public readonly options?: ObjectOptions\n ) {}\n\n name(): string {\n return this.componentName;\n }\n\n add(name: string, wrapper: HandlerWrapper) {\n this.handlers.set(name, new VirtualObjectHandler(name, wrapper, this));\n }\n\n discovery(): d.Service {\n const handlers: d.Handler[] = [...this.handlers.entries()].map(\n ([name, handler]) => {\n return {\n name,\n ty: handler.kind() === HandlerKind.EXCLUSIVE ? \"EXCLUSIVE\" : \"SHARED\",\n ...commonHandlerOptions(\n handler.handlerWrapper,\n handler.executionOptions.defaultSerde ?? serde.json\n ),\n } satisfies d.Handler;\n }\n );\n\n return {\n name: this.componentName,\n ty: \"VIRTUAL_OBJECT\",\n handlers,\n documentation: this.description,\n metadata: this.metadata,\n ...commonServiceOptions(this.options),\n } satisfies d.Service;\n }\n\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined {\n return this.handlers.get(url.handlerName);\n }\n}\n\nexport class VirtualObjectHandler implements ComponentHandler {\n readonly executionOptions: ExecutionOptions;\n\n constructor(\n private readonly handlerName: string,\n public readonly handlerWrapper: HandlerWrapper,\n private readonly parent: VirtualObjectComponent\n ) {\n this.executionOptions = createExecutionOptions(\n this.parent.options,\n handlerWrapper.options\n );\n }\n\n name(): string {\n return this.handlerName;\n }\n\n component(): Component {\n return this.parent;\n }\n\n kind(): HandlerKind {\n return this.handlerWrapper.kind;\n }\n\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array> {\n return this.handlerWrapper.invoke(context, input);\n }\n}\n\n// Workflow\n\nexport class WorkflowComponent implements Component {\n private readonly handlers: Map<string, WorkflowHandler> = new Map();\n\n constructor(\n public readonly componentName: string,\n public readonly description?: string,\n public readonly metadata?: Record<string, string>,\n public readonly options?: WorkflowOptions\n ) {}\n\n name(): string {\n return this.componentName;\n }\n\n add(name: string, wrapper: HandlerWrapper) {\n this.handlers.set(name, new WorkflowHandler(name, wrapper, this));\n }\n\n discovery(): d.Service {\n const handlers: d.Handler[] = [...this.handlers.entries()].map(\n ([name, handler]) => {\n return {\n name,\n ty: handler.kind() === HandlerKind.WORKFLOW ? \"WORKFLOW\" : \"SHARED\",\n workflowCompletionRetention:\n handler.kind() === HandlerKind.WORKFLOW &&\n this.options?.workflowRetention !== undefined\n ? millisOrDurationToMillis(this.options?.workflowRetention)\n : undefined,\n ...commonHandlerOptions(\n handler.handlerWrapper,\n handler.executionOptions.defaultSerde ?? serde.json\n ),\n } satisfies d.Handler;\n }\n );\n\n return {\n name: this.componentName,\n ty: \"WORKFLOW\",\n handlers,\n documentation: this.description,\n metadata: this.metadata,\n ...commonServiceOptions(this.options),\n } satisfies d.Service;\n }\n\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined {\n return this.handlers.get(url.handlerName);\n }\n}\n\nexport class WorkflowHandler implements ComponentHandler {\n readonly executionOptions: ExecutionOptions;\n\n constructor(\n private readonly handlerName: string,\n public readonly handlerWrapper: HandlerWrapper,\n private readonly parent: WorkflowComponent\n ) {\n this.executionOptions = createExecutionOptions(\n this.parent.options,\n handlerWrapper.options\n );\n }\n\n name(): string {\n return this.handlerName;\n }\n component(): Component {\n return this.parent;\n }\n\n kind(): HandlerKind {\n return this.handlerWrapper.kind;\n }\n\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array> {\n return this.handlerWrapper.invoke(context, input);\n }\n}\n\nexport type PathComponents =\n | InvokePathComponents\n | { type: \"discover\" }\n | { type: \"health\" }\n | { type: \"unknown\"; path: string };\n\nexport type InvokePathComponents = {\n type: \"invoke\";\n componentName: string;\n handlerName: string;\n};\n\nexport function parseUrlComponents(urlPath?: string): PathComponents {\n if (!urlPath) {\n return { type: \"unknown\", path: \"\" };\n }\n const fragments = urlPath.split(\"/\");\n if (fragments.length >= 3 && fragments[fragments.length - 3] === \"invoke\") {\n return {\n type: \"invoke\",\n componentName: fragments[fragments.length - 2]!,\n handlerName: fragments[fragments.length - 1]!,\n };\n }\n if (fragments.length > 0 && fragments[fragments.length - 1] === \"discover\") {\n return { type: \"discover\" };\n }\n if (fragments.length > 0 && fragments[fragments.length - 1] === \"health\") {\n return { type: \"health\" };\n }\n return { type: \"unknown\", path: urlPath };\n}\n\nfunction commonServiceOptions(\n options?: ServiceOptions | ObjectOptions | WorkflowOptions\n): Partial<d.Service> {\n return {\n journalRetention:\n options?.journalRetention !== undefined\n ? millisOrDurationToMillis(options.journalRetention)\n : undefined,\n idempotencyRetention:\n options?.idempotencyRetention !== undefined\n ? millisOrDurationToMillis(options.idempotencyRetention)\n : undefined,\n inactivityTimeout:\n options?.inactivityTimeout !== undefined\n ? millisOrDurationToMillis(options.inactivityTimeout)\n : undefined,\n abortTimeout:\n options?.abortTimeout !== undefined\n ? millisOrDurationToMillis(options.abortTimeout)\n : undefined,\n ingressPrivate: options?.ingressPrivate,\n enableLazyState:\n options !== undefined && \"enableLazyState\" in options\n ? options.enableLazyState\n : undefined,\n retryPolicyExponentiationFactor: options?.retryPolicy?.exponentiationFactor,\n retryPolicyInitialInterval:\n options?.retryPolicy?.initialInterval !== undefined\n ? millisOrDurationToMillis(options?.retryPolicy?.initialInterval)\n : undefined,\n retryPolicyMaxInterval:\n options?.retryPolicy?.maxInterval !== undefined\n ? millisOrDurationToMillis(options?.retryPolicy?.maxInterval)\n : undefined,\n retryPolicyMaxAttempts: options?.retryPolicy?.maxAttempts,\n retryPolicyOnMaxAttempts: (options?.retryPolicy?.onMaxAttempts === \"kill\"\n ? \"KILL\"\n : options?.retryPolicy?.onMaxAttempts === \"pause\"\n ? \"PAUSE\"\n : undefined) as d.RetryPolicyOnMaxAttempts,\n };\n}\n\nfunction commonHandlerOptions(\n wrapper: HandlerWrapper,\n defaultSerde: Serde<any>\n) {\n return {\n input: handlerInputDiscovery(wrapper, defaultSerde),\n output: handlerOutputDiscovery(wrapper, defaultSerde),\n journalRetention:\n wrapper.options?.journalRetention !== undefined\n ? millisOrDurationToMillis(wrapper.options?.journalRetention)\n : undefined,\n idempotencyRetention:\n wrapper.options?.idempotencyRetention !== undefined\n ? millisOrDurationToMillis(wrapper.options?.idempotencyRetention)\n : undefined,\n inactivityTimeout:\n wrapper.options?.inactivityTimeout !== undefined\n ? millisOrDurationToMillis(wrapper.options?.inactivityTimeout)\n : undefined,\n abortTimeout:\n wrapper.options?.abortTimeout !== undefined\n ? millisOrDurationToMillis(wrapper.options?.abortTimeout)\n : undefined,\n ingressPrivate: wrapper.options?.ingressPrivate,\n enableLazyState:\n wrapper.options !== undefined && \"enableLazyState\" in wrapper.options\n ? wrapper.options?.enableLazyState\n : undefined,\n retryPolicyExponentiationFactor:\n wrapper.options?.retryPolicy?.exponentiationFactor,\n retryPolicyInitialInterval:\n wrapper.options?.retryPolicy?.initialInterval !== undefined\n ? millisOrDurationToMillis(\n wrapper.options?.retryPolicy?.initialInterval\n )\n : undefined,\n retryPolicyMaxInterval:\n wrapper.options?.retryPolicy?.maxInterval !== undefined\n ? millisOrDurationToMillis(wrapper.options?.retryPolicy?.maxInterval)\n : undefined,\n retryPolicyMaxAttempts: wrapper.options?.retryPolicy?.maxAttempts,\n retryPolicyOnMaxAttempts: (wrapper.options?.retryPolicy?.onMaxAttempts ===\n \"kill\"\n ? \"KILL\"\n : wrapper.options?.retryPolicy?.onMaxAttempts === \"pause\"\n ? \"PAUSE\"\n : undefined) as d.RetryPolicyOnMaxAttempts1,\n\n documentation: wrapper.options?.description,\n metadata: wrapper.options?.metadata,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"components.js","names":["serde","componentName: string","description?: string","metadata?: Record<string, string>","options?: ServiceOptions","ServiceHandler","handlers: d.Handler[]","handlerName: string","handlerWrapper: HandlerWrapper","parent: ServiceComponent","options?: ObjectOptions","parent: VirtualObjectComponent","options?: WorkflowOptions","WorkflowHandler","parent: WorkflowComponent"],"sources":["../../src/endpoint/components.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 * as d from \"./discovery.js\";\nimport type { ContextImpl } from \"../context_impl.js\";\nimport type {\n HandlerWrapper,\n ObjectOptions,\n ServiceHandlerOpts,\n ServiceOptions,\n WorkflowOptions,\n} from \"../types/rpc.js\";\nimport { HandlerKind } from \"../types/rpc.js\";\nimport type { Serde } from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport type { HooksProvider } from \"../hooks.js\";\nimport type { TerminalError } from \"../types/errors.js\";\n\n//\n// Interfaces\n//\nexport interface Component {\n name(): string;\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined;\n discovery(): d.Service;\n}\n\n/**\n * Execution-related options\n */\nexport interface ExecutionOptions {\n asTerminalError?: (error: any) => TerminalError | undefined;\n /**\n * Default serde to use for requests, responses, state, side effects, awakeables, promises. Used when no other serde is specified.\n */\n defaultSerde?: Serde<any>;\n hooks?: HooksProvider[];\n explicitCancellation?: boolean;\n}\n\nexport interface ComponentHandler {\n name(): string;\n component(): Component;\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array>;\n kind(): HandlerKind;\n\n /**\n * Returns the execution options, already merged with different layers (endpoint -> service -> handler)\n */\n executionOptions: ExecutionOptions;\n}\n\n//\n// Service\n//\n\nfunction handlerInputDiscovery(\n handler: HandlerWrapper,\n defaultSerde: Serde<any>\n): d.InputPayload {\n const serde = handler.options?.input ?? defaultSerde;\n\n let contentType = undefined;\n let jsonSchema = undefined;\n\n if (serde.jsonSchema) {\n jsonSchema = serde.jsonSchema;\n contentType = handler.options?.accept ?? serde.contentType;\n } else if (handler.options?.accept) {\n contentType = handler.options?.accept;\n } else if (serde.contentType) {\n contentType = serde.contentType;\n } else {\n // no input information\n return {};\n }\n\n return {\n required: false,\n contentType,\n jsonSchema,\n };\n}\n\nfunction handlerOutputDiscovery(\n handler: HandlerWrapper,\n defaultSerde: Serde<any>\n): d.OutputPayload {\n const serde = handler.options?.output ?? defaultSerde;\n const setContentTypeIfEmpty =\n handler.options?.setOutputContentTypeIfEmpty ?? false;\n\n let contentType = undefined;\n let jsonSchema = undefined;\n\n if (serde.jsonSchema) {\n jsonSchema = serde.jsonSchema;\n contentType = serde.contentType ?? \"application/json\";\n } else if (serde.contentType) {\n contentType = serde.contentType;\n } else {\n // no input information\n return { setContentTypeIfEmpty };\n }\n\n return {\n setContentTypeIfEmpty,\n jsonSchema,\n contentType,\n };\n}\n\nfunction createExecutionOptions(\n serviceOptions?: ServiceOptions,\n handlerOptions?: ServiceHandlerOpts<unknown, unknown>\n): ExecutionOptions {\n // Service-level hooks run outermost, handler-level hooks run innermost.\n // Both are merged into a single list: service hooks first, then handler hooks.\n const hooks = [\n ...(serviceOptions?.hooks ?? []),\n ...(handlerOptions?.hooks ?? []),\n ];\n return {\n defaultSerde: handlerOptions?.serde ?? serviceOptions?.serde,\n asTerminalError:\n handlerOptions?.asTerminalError ?? serviceOptions?.asTerminalError,\n hooks: hooks.length > 0 ? hooks : undefined,\n explicitCancellation:\n handlerOptions?.explicitCancellation ??\n serviceOptions?.explicitCancellation,\n };\n}\n\nexport class ServiceComponent implements Component {\n private readonly handlers: Map<string, ServiceHandler> = new Map();\n\n constructor(\n private readonly componentName: string,\n public readonly description?: string,\n public readonly metadata?: Record<string, string>,\n public readonly options?: ServiceOptions\n ) {}\n\n name(): string {\n return this.componentName;\n }\n\n add(name: string, handlerWrapper: HandlerWrapper) {\n this.handlers.set(name, new ServiceHandler(name, handlerWrapper, this));\n }\n\n discovery(): d.Service {\n const handlers: d.Handler[] = [...this.handlers.entries()].map(\n ([name, handler]) => {\n return {\n name,\n ...commonHandlerOptions(\n handler.handlerWrapper,\n handler.executionOptions.defaultSerde ?? serde.json\n ),\n } satisfies d.Handler;\n }\n );\n\n return {\n name: this.componentName,\n ty: \"SERVICE\",\n handlers,\n documentation: this.description,\n metadata: this.metadata,\n ...commonServiceOptions(this.options),\n } satisfies d.Service;\n }\n\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined {\n return this.handlers.get(url.handlerName);\n }\n}\n\nexport class ServiceHandler implements ComponentHandler {\n readonly executionOptions: ExecutionOptions;\n\n constructor(\n private readonly handlerName: string,\n public readonly handlerWrapper: HandlerWrapper,\n private readonly parent: ServiceComponent\n ) {\n this.executionOptions = createExecutionOptions(\n this.parent.options,\n handlerWrapper.options\n );\n }\n\n name(): string {\n return this.handlerName;\n }\n\n component(): Component {\n return this.parent;\n }\n\n kind(): HandlerKind {\n return this.handlerWrapper.kind;\n }\n\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array> {\n return this.handlerWrapper.invoke(context, input);\n }\n}\n\n//\n// Virtual Object\n//\n\nexport class VirtualObjectComponent implements Component {\n private readonly handlers: Map<string, VirtualObjectHandler> = new Map();\n\n constructor(\n public readonly componentName: string,\n public readonly description?: string,\n public readonly metadata?: Record<string, string>,\n public readonly options?: ObjectOptions\n ) {}\n\n name(): string {\n return this.componentName;\n }\n\n add(name: string, wrapper: HandlerWrapper) {\n this.handlers.set(name, new VirtualObjectHandler(name, wrapper, this));\n }\n\n discovery(): d.Service {\n const handlers: d.Handler[] = [...this.handlers.entries()].map(\n ([name, handler]) => {\n return {\n name,\n ty: handler.kind() === HandlerKind.EXCLUSIVE ? \"EXCLUSIVE\" : \"SHARED\",\n ...commonHandlerOptions(\n handler.handlerWrapper,\n handler.executionOptions.defaultSerde ?? serde.json\n ),\n } satisfies d.Handler;\n }\n );\n\n return {\n name: this.componentName,\n ty: \"VIRTUAL_OBJECT\",\n handlers,\n documentation: this.description,\n metadata: this.metadata,\n ...commonServiceOptions(this.options),\n } satisfies d.Service;\n }\n\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined {\n return this.handlers.get(url.handlerName);\n }\n}\n\nexport class VirtualObjectHandler implements ComponentHandler {\n readonly executionOptions: ExecutionOptions;\n\n constructor(\n private readonly handlerName: string,\n public readonly handlerWrapper: HandlerWrapper,\n private readonly parent: VirtualObjectComponent\n ) {\n this.executionOptions = createExecutionOptions(\n this.parent.options,\n handlerWrapper.options\n );\n }\n\n name(): string {\n return this.handlerName;\n }\n\n component(): Component {\n return this.parent;\n }\n\n kind(): HandlerKind {\n return this.handlerWrapper.kind;\n }\n\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array> {\n return this.handlerWrapper.invoke(context, input);\n }\n}\n\n// Workflow\n\nexport class WorkflowComponent implements Component {\n private readonly handlers: Map<string, WorkflowHandler> = new Map();\n\n constructor(\n public readonly componentName: string,\n public readonly description?: string,\n public readonly metadata?: Record<string, string>,\n public readonly options?: WorkflowOptions\n ) {}\n\n name(): string {\n return this.componentName;\n }\n\n add(name: string, wrapper: HandlerWrapper) {\n this.handlers.set(name, new WorkflowHandler(name, wrapper, this));\n }\n\n discovery(): d.Service {\n const handlers: d.Handler[] = [...this.handlers.entries()].map(\n ([name, handler]) => {\n return {\n name,\n ty: handler.kind() === HandlerKind.WORKFLOW ? \"WORKFLOW\" : \"SHARED\",\n workflowCompletionRetention:\n handler.kind() === HandlerKind.WORKFLOW &&\n this.options?.workflowRetention !== undefined\n ? millisOrDurationToMillis(this.options?.workflowRetention)\n : undefined,\n ...commonHandlerOptions(\n handler.handlerWrapper,\n handler.executionOptions.defaultSerde ?? serde.json\n ),\n } satisfies d.Handler;\n }\n );\n\n return {\n name: this.componentName,\n ty: \"WORKFLOW\",\n handlers,\n documentation: this.description,\n metadata: this.metadata,\n ...commonServiceOptions(this.options),\n } satisfies d.Service;\n }\n\n handlerMatching(url: InvokePathComponents): ComponentHandler | undefined {\n return this.handlers.get(url.handlerName);\n }\n}\n\nexport class WorkflowHandler implements ComponentHandler {\n readonly executionOptions: ExecutionOptions;\n\n constructor(\n private readonly handlerName: string,\n public readonly handlerWrapper: HandlerWrapper,\n private readonly parent: WorkflowComponent\n ) {\n this.executionOptions = createExecutionOptions(\n this.parent.options,\n handlerWrapper.options\n );\n }\n\n name(): string {\n return this.handlerName;\n }\n component(): Component {\n return this.parent;\n }\n\n kind(): HandlerKind {\n return this.handlerWrapper.kind;\n }\n\n invoke(context: ContextImpl, input: Uint8Array): Promise<Uint8Array> {\n return this.handlerWrapper.invoke(context, input);\n }\n}\n\nexport type PathComponents =\n | InvokePathComponents\n | { type: \"discover\" }\n | { type: \"health\" }\n | { type: \"unknown\"; path: string };\n\nexport type InvokePathComponents = {\n type: \"invoke\";\n componentName: string;\n handlerName: string;\n};\n\nexport function parseUrlComponents(urlPath?: string): PathComponents {\n if (!urlPath) {\n return { type: \"unknown\", path: \"\" };\n }\n const fragments = urlPath.split(\"/\");\n if (fragments.length >= 3 && fragments[fragments.length - 3] === \"invoke\") {\n return {\n type: \"invoke\",\n componentName: fragments[fragments.length - 2]!,\n handlerName: fragments[fragments.length - 1]!,\n };\n }\n if (fragments.length > 0 && fragments[fragments.length - 1] === \"discover\") {\n return { type: \"discover\" };\n }\n if (fragments.length > 0 && fragments[fragments.length - 1] === \"health\") {\n return { type: \"health\" };\n }\n return { type: \"unknown\", path: urlPath };\n}\n\nfunction commonServiceOptions(\n options?: ServiceOptions | ObjectOptions | WorkflowOptions\n): Partial<d.Service> {\n return {\n journalRetention:\n options?.journalRetention !== undefined\n ? millisOrDurationToMillis(options.journalRetention)\n : undefined,\n idempotencyRetention:\n options?.idempotencyRetention !== undefined\n ? millisOrDurationToMillis(options.idempotencyRetention)\n : undefined,\n inactivityTimeout:\n options?.inactivityTimeout !== undefined\n ? millisOrDurationToMillis(options.inactivityTimeout)\n : undefined,\n abortTimeout:\n options?.abortTimeout !== undefined\n ? millisOrDurationToMillis(options.abortTimeout)\n : undefined,\n ingressPrivate: options?.ingressPrivate,\n enableLazyState:\n options !== undefined && \"enableLazyState\" in options\n ? options.enableLazyState\n : undefined,\n retryPolicyExponentiationFactor: options?.retryPolicy?.exponentiationFactor,\n retryPolicyInitialInterval:\n options?.retryPolicy?.initialInterval !== undefined\n ? millisOrDurationToMillis(options?.retryPolicy?.initialInterval)\n : undefined,\n retryPolicyMaxInterval:\n options?.retryPolicy?.maxInterval !== undefined\n ? millisOrDurationToMillis(options?.retryPolicy?.maxInterval)\n : undefined,\n retryPolicyMaxAttempts: options?.retryPolicy?.maxAttempts,\n retryPolicyOnMaxAttempts: (options?.retryPolicy?.onMaxAttempts === \"kill\"\n ? \"KILL\"\n : options?.retryPolicy?.onMaxAttempts === \"pause\"\n ? \"PAUSE\"\n : undefined) as d.RetryPolicyOnMaxAttempts,\n };\n}\n\nfunction commonHandlerOptions(\n wrapper: HandlerWrapper,\n defaultSerde: Serde<any>\n) {\n return {\n input: handlerInputDiscovery(wrapper, defaultSerde),\n output: handlerOutputDiscovery(wrapper, defaultSerde),\n journalRetention:\n wrapper.options?.journalRetention !== undefined\n ? millisOrDurationToMillis(wrapper.options?.journalRetention)\n : undefined,\n idempotencyRetention:\n wrapper.options?.idempotencyRetention !== undefined\n ? millisOrDurationToMillis(wrapper.options?.idempotencyRetention)\n : undefined,\n inactivityTimeout:\n wrapper.options?.inactivityTimeout !== undefined\n ? millisOrDurationToMillis(wrapper.options?.inactivityTimeout)\n : undefined,\n abortTimeout:\n wrapper.options?.abortTimeout !== undefined\n ? millisOrDurationToMillis(wrapper.options?.abortTimeout)\n : undefined,\n ingressPrivate: wrapper.options?.ingressPrivate,\n enableLazyState:\n wrapper.options !== undefined && \"enableLazyState\" in wrapper.options\n ? wrapper.options?.enableLazyState\n : undefined,\n retryPolicyExponentiationFactor:\n wrapper.options?.retryPolicy?.exponentiationFactor,\n retryPolicyInitialInterval:\n wrapper.options?.retryPolicy?.initialInterval !== undefined\n ? millisOrDurationToMillis(\n wrapper.options?.retryPolicy?.initialInterval\n )\n : undefined,\n retryPolicyMaxInterval:\n wrapper.options?.retryPolicy?.maxInterval !== undefined\n ? millisOrDurationToMillis(wrapper.options?.retryPolicy?.maxInterval)\n : undefined,\n retryPolicyMaxAttempts: wrapper.options?.retryPolicy?.maxAttempts,\n retryPolicyOnMaxAttempts: (wrapper.options?.retryPolicy?.onMaxAttempts ===\n \"kill\"\n ? \"KILL\"\n : wrapper.options?.retryPolicy?.onMaxAttempts === \"pause\"\n ? \"PAUSE\"\n : undefined) as d.RetryPolicyOnMaxAttempts1,\n\n documentation: wrapper.options?.description,\n metadata: wrapper.options?.metadata,\n };\n}\n"],"mappings":"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"}
@@ -124,6 +124,10 @@ var RestateInvokeResponse = class {
124
124
  async process({ inputReader, outputWriter, abortSignal }) {
125
125
  abortSignal.addEventListener("abort", () => {
126
126
  require_core_logging.destroyLogger(this.loggerId);
127
+ setImmediate(() => {
128
+ const msg = "Connection closed";
129
+ this.coreVm.notify_error(msg, msg);
130
+ });
127
131
  }, { once: true });
128
132
  require_core_logging.registerLogger(this.loggerId, this.vmLogger);
129
133
  const journalValueCodec = this.journalValueCodecInit ? await this.journalValueCodecInit : {
@@ -170,12 +174,6 @@ var RestateInvokeResponse = class {
170
174
  await flushAndClose(this.coreVm, this.vmLogger, inputReader, outputWriter);
171
175
  return;
172
176
  }
173
- abortSignal.addEventListener("abort", () => {
174
- setImmediate(() => {
175
- const msg = "Connection closed";
176
- this.coreVm.notify_error(msg, msg);
177
- });
178
- }, { once: true });
179
177
  try {
180
178
  await startUserHandler(ctx, this.service, this.handler, journalValueCodec);
181
179
  } catch (e) {
@@ -122,6 +122,10 @@ var RestateInvokeResponse = class {
122
122
  async process({ inputReader, outputWriter, abortSignal }) {
123
123
  abortSignal.addEventListener("abort", () => {
124
124
  destroyLogger(this.loggerId);
125
+ setImmediate(() => {
126
+ const msg = "Connection closed";
127
+ this.coreVm.notify_error(msg, msg);
128
+ });
125
129
  }, { once: true });
126
130
  registerLogger(this.loggerId, this.vmLogger);
127
131
  const journalValueCodec = this.journalValueCodecInit ? await this.journalValueCodecInit : {
@@ -168,12 +172,6 @@ var RestateInvokeResponse = class {
168
172
  await flushAndClose(this.coreVm, this.vmLogger, inputReader, outputWriter);
169
173
  return;
170
174
  }
171
- abortSignal.addEventListener("abort", () => {
172
- setImmediate(() => {
173
- const msg = "Connection closed";
174
- this.coreVm.notify_error(msg, msg);
175
- });
176
- }, { once: true });
177
175
  try {
178
176
  await startUserHandler(ctx, this.service, this.handler, journalValueCodec);
179
177
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"generic.js","names":["endpoint: Endpoint","protocolMode: ProtocolMode","additionalDiscoveryFields: Partial<EndpointManifest>","vm.WasmIdentityVerifier","vm.WasmHeader","service: Component","handler: ComponentHandler","attemptHeaders: Headers","extraArgs: unknown[]","additionalContext: AdditionalContext","journalValueCodecInit:\n | Promise<JournalValueCodec>\n | undefined","loggerTransport: LoggerTransport","vm.WasmVM","journalValueCodec: JournalValueCodec","ctx: ContextImpl","invocationRequest: Request","hooks: Hooks[]","hookContext: { request: Request }","encodedOutput: Uint8Array | undefined","originalError: unknown"],"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 {\n Component,\n ComponentHandler,\n InvokePathComponents,\n} from \"../components.js\";\nimport { parseUrlComponents } from \"../components.js\";\nimport { X_RESTATE_SERVER } from \"../../user_agent.js\";\nimport { CommandError, ContextImpl } from \"../../context_impl.js\";\nimport { restoreError, sanitizeError } from \"../../error_sanitization.js\";\nimport type { InvocationId, 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 { DEFAULT_CONSOLE_LOGGER_LOG_LEVEL } from \"../../logging/console_logger_transport.js\";\nimport {\n LoggerContext,\n 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\";\nimport {\n type RestateHandler,\n type Headers,\n type RestateRequest,\n type AdditionalContext,\n type RestateResponse,\n ResponseHeaders,\n InputReader,\n OutputWriter,\n} from \"./types.js\";\nimport { handleDiscovery } from \"./discovery.js\";\nimport {\n errorResponse,\n invocationIdFromHeaders,\n simpleResponse,\n tryCreateContextualLogger,\n} from \"./utils.js\";\nimport { destroyLogger, registerLogger } from \"./core_logging.js\";\nimport type { Hooks } from \"../../hooks.js\";\n\n// Hidden symbol key used by first-party hooks to read the live\n// replay/processing phase without widening the public HooksProvider API.\nconst HOOK_CONTEXT_IS_PROCESSING_SYMBOL = Symbol.for(\n \"@restatedev/restate-sdk/hooks.isProcessing\"\n);\n\nexport function createRestateHandler(\n endpoint: Endpoint,\n protocolMode: ProtocolMode,\n additionalDiscoveryFields: Partial<EndpointManifest>\n): RestateHandler {\n return new RestateHandlerImpl(\n endpoint,\n protocolMode,\n additionalDiscoveryFields\n );\n}\n\n/**\n * This is the RestateHandler implementation\n */\nclass RestateHandlerImpl 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 handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): RestateResponse {\n try {\n return 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 errorResponse(\n error instanceof RestateError ? error.code : 500,\n error.message\n );\n }\n }\n\n private _handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): 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 errorResponse(404, msg);\n }\n if (parsed.type === \"health\") {\n return simpleResponse(\n 200,\n {\n \"content-type\": \"application/text\",\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n new TextEncoder().encode(\"OK\")\n );\n }\n\n // Discovery and handling invocations require identity verification\n const error = this.validateConnectionSignature(path, request.headers);\n if (error !== null) {\n return error;\n }\n if (parsed.type === \"discover\") {\n return handleDiscovery(\n this.endpoint,\n this.protocolMode,\n this.additionalDiscoveryFields,\n request.headers[\"accept\"]\n );\n }\n\n return this.handleInvoke(\n parsed,\n request.headers,\n request.extraArgs,\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 errorResponse(401, \"Unauthorized\");\n }\n }\n\n private handleInvoke(\n invokePathComponent: InvokePathComponents,\n headers: Headers,\n extraArgs: unknown[],\n additionalContext: AdditionalContext\n ): RestateResponse {\n // Check if we support this protocol version\n const serviceProtocolVersionString = headers[\"content-type\"];\n if (typeof serviceProtocolVersionString !== \"string\") {\n const errorMessage = \"Missing content-type header\";\n this.endpoint.rlog.warn(errorMessage);\n return errorResponse(415, errorMessage);\n }\n\n // Resolve service and handler\n const service = this.endpoint.components.get(\n invokePathComponent.componentName\n );\n if (!service) {\n const msg = `No service found for URL: ${JSON.stringify(invokePathComponent)}`;\n this.endpoint.rlog.error(msg);\n return errorResponse(404, msg);\n }\n const handler = service?.handlerMatching(invokePathComponent);\n if (!handler) {\n const msg = `No service found for URL: ${JSON.stringify(invokePathComponent)}`;\n this.endpoint.rlog.error(msg);\n return errorResponse(404, msg);\n }\n\n return new RestateInvokeResponse(\n service,\n handler,\n headers,\n extraArgs,\n additionalContext,\n this.endpoint.journalValueCodec,\n this.endpoint.loggerTransport\n );\n }\n}\n\nclass RestateInvokeResponse implements RestateResponse {\n public headers: ResponseHeaders;\n public statusCode: number;\n\n private readonly loggerId: number;\n private vmLogger: Logger;\n private readonly coreVm: vm.WasmVM;\n\n constructor(\n private readonly service: Component,\n private readonly handler: ComponentHandler,\n private readonly attemptHeaders: Headers,\n private readonly extraArgs: unknown[],\n private readonly additionalContext: AdditionalContext,\n private readonly journalValueCodecInit:\n | Promise<JournalValueCodec>\n | undefined,\n private readonly loggerTransport: LoggerTransport\n ) {\n this.loggerId = Math.floor(Math.random() * 4_294_967_295 /* u32::MAX */);\n const isJournalCodecDefined = this.journalValueCodecInit !== undefined;\n\n // Instantiate core vm and prepare response headers\n const vmHeaders = Object.entries(this.attemptHeaders)\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 this.coreVm = new vm.WasmVM(\n vmHeaders,\n restateLogLevelToWasmLogLevel(DEFAULT_CONSOLE_LOGGER_LOG_LEVEL),\n this.loggerId,\n isJournalCodecDefined,\n handler.executionOptions.explicitCancellation ?? false\n );\n const responseHead = this.coreVm.get_response_head();\n this.statusCode = responseHead.status_code;\n this.headers = responseHead.headers.reduce(\n (headers, { key, value }) => ({\n [key]: value,\n ...headers,\n }),\n {\n \"x-restate-server\": X_RESTATE_SERVER,\n }\n );\n this.vmLogger = createLogger(\n this.loggerTransport,\n LogSource.JOURNAL,\n new LoggerContext(\n invocationIdFromHeaders(this.attemptHeaders),\n this.service.name(),\n this.handler.name(),\n undefined,\n undefined,\n this.additionalContext\n )\n );\n }\n\n async process({\n inputReader,\n outputWriter,\n abortSignal,\n }: {\n inputReader: InputReader;\n outputWriter: OutputWriter;\n abortSignal: AbortSignal;\n }): Promise<void> {\n abortSignal.addEventListener(\n \"abort\",\n () => {\n // In any case, on abort remove the invocation logger to avoid memory leaks\n destroyLogger(this.loggerId);\n },\n { once: true }\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 registerLogger(this.loggerId, this.vmLogger);\n\n const journalValueCodec: JournalValueCodec = this.journalValueCodecInit\n ? await this.journalValueCodecInit\n : {\n encode: (entry) => entry,\n decode: (entry) => Promise.resolve(entry),\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 caught, or the state machine fails/suspends.\n //\n // The last case is handled internally within the ContextImpl.\n const invocationEndPromise = new CompletablePromise<void>();\n let ctx: ContextImpl;\n\n // Initial phase before running user code\n // -> Buffer in shared core the journal entries\n // -> Initiate loggers\n // -> Initialize the ContextImpl\n try {\n // Buffer journal inside shared core\n await bufferJournalReplayInCoreVm(this.coreVm, inputReader);\n\n // Get input from coreVm to build the request object\n const input = this.coreVm.sys_input();\n const invocationRequest: Request = {\n target: {\n service: this.service.name(),\n handler: this.handler.name(),\n key: input.key || undefined,\n toString() {\n return this.key !== undefined\n ? `${this.service}/${this.key}/${this.handler}`\n : `${this.service}/${this.handler}`;\n },\n },\n id: input.invocation_id as InvocationId,\n headers: input.headers.reduce((headers, { key, value }) => {\n headers.set(key, value);\n return headers;\n }, new Map()),\n attemptHeaders: Object.entries(this.attemptHeaders).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: this.extraArgs,\n attemptCompletedSignal: abortSignal,\n };\n\n // Prepare logger\n const loggerContext = new LoggerContext(\n input.invocation_id,\n this.handler.component().name(),\n this.handler.name(),\n this.handler.kind() === HandlerKind.SERVICE ? undefined : input.key,\n invocationRequest,\n this.additionalContext\n );\n const ctxLogger = createLogger(\n this.loggerTransport,\n LogSource.USER,\n loggerContext,\n () => !this.coreVm.is_processing()\n );\n // Override the vmLogger created before with more info!\n this.vmLogger = createLogger(\n this.loggerTransport,\n LogSource.JOURNAL,\n loggerContext\n // Filtering is done within the shared core\n );\n\n // See vm_log below for more details\n registerLogger(this.loggerId, this.vmLogger);\n if (!this.coreVm.is_processing()) {\n this.vmLogger.info(\"Replaying invocation.\");\n } else {\n this.vmLogger.info(\"Starting invocation.\");\n }\n\n // Prepare context\n ctx = new ContextImpl(\n this.coreVm,\n input,\n ctxLogger,\n this.handler.kind(),\n this.vmLogger,\n invocationRequest,\n invocationEndPromise,\n inputReader,\n outputWriter,\n journalValueCodec,\n this.handler.executionOptions\n );\n } catch (e) {\n // That's \"preflight\" failure cases, where stuff fails before running user code\n // In this scenario, we close the coreVm, then flush and close\n const error = ensureError(e);\n this.coreVm.notify_error(error.message, error.message);\n await flushAndClose(\n this.coreVm,\n this.vmLogger,\n inputReader,\n outputWriter\n );\n return;\n }\n\n // When the HTTP connection closes (e.g. abort timeout), poison the VM.\n // We only read new input from the server when a Restate command is\n // waiting for a response. If no command has been issued, the server's\n // abort signal is never read. Poisoning the VM ensures the handler\n // fails on the next VM call (e.g. ctx.run, ctx.sleep).\n abortSignal.addEventListener(\n \"abort\",\n () => {\n setImmediate(() => {\n const msg = \"Connection closed\";\n this.coreVm.notify_error(msg, msg);\n });\n },\n { once: true }\n );\n\n // Run user code. Errors that reach the handler or interceptor code\n // (handler throws, interceptor throws, entry completes with terminal\n // failure) propagate naturally. Errors where the handler is stuck on\n // an await that will never settle (e.g. suspension, retryable run\n // error) are broken out by raceWithAttemptEnd, which races against\n // invocationEndPromise — rejected by ContextImpl when the attempt ends.\n try {\n await startUserHandler(\n ctx,\n this.service,\n this.handler,\n journalValueCodec\n );\n } catch (e) {\n notifyError(e, ctx, this.handler.executionOptions.asTerminalError);\n } finally {\n await flushAndClose(\n this.coreVm,\n this.vmLogger,\n inputReader,\n outputWriter\n );\n }\n }\n}\n\nasync function bufferJournalReplayInCoreVm(\n coreVm: vm.WasmVM,\n inputReader: InputReader\n) {\n while (!coreVm.is_ready_to_execute()) {\n const nextValue = await inputReader.next();\n if (nextValue.done) {\n coreVm.notify_input_closed();\n break;\n }\n if (nextValue.value !== undefined) {\n coreVm.notify_input(nextValue.value);\n }\n }\n}\n\nasync function startUserHandler(\n ctx: ContextImpl,\n service: Component,\n handler: ComponentHandler,\n journalValueCodec: JournalValueCodec\n) {\n // Instantiate hooks from providers.\n // If a provider throws, the same rules as handler failures apply:\n // TerminalError → terminate invocation, other errors → retry.\n const hooks: Hooks[] = [];\n for (const provider of handler.executionOptions.hooks ?? []) {\n const hookContext: { request: Request } = {\n request: ctx.request(),\n };\n Object.defineProperty(hookContext, HOOK_CONTEXT_IS_PROCESSING_SYMBOL, {\n value: () => ctx.isProcessing(),\n enumerable: false,\n });\n hooks.push(provider(hookContext));\n }\n\n // Compose interceptor.handler into a single interceptor (first = outermost)\n const handlerInterceptor = composeInterceptors(\n hooks.map((h) => h.interceptor?.handler).filter(isDefined)\n );\n\n ctx.setRunInterceptor(\n composeInterceptors(hooks.map((h) => h.interceptor?.run).filter(isDefined))\n );\n\n let encodedOutput: Uint8Array | undefined;\n await raceWithAttemptEnd(\n ctx,\n handlerInterceptor\n )(async () => {\n const decodedInput = await journalValueCodec\n .decode(ctx.request().body)\n .catch((e) =>\n // Re-throw as terminal error, to fail on input errors\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\n // Then run user code\n const output = await handler.invoke(ctx, decodedInput);\n\n // Encode user code output\n encodedOutput = journalValueCodec.encode(output);\n });\n\n // Interceptor chain completed without error — commit the result.\n // sys_end() is called here (after interceptors) so that interceptor\n // errors after next() correctly prevent the invocation from succeeding.\n ctx.coreVm.sys_write_output_success(encodedOutput!);\n ctx.coreVm.sys_end();\n ctx.vmLogger.info(\"Invocation completed successfully.\");\n}\n\n/**\n * Classifies the error and notifies the VM. Called from the process() catch\n * block — the single place that decides how to report errors to the VM.\n */\nfunction notifyError(\n e: unknown,\n ctx: ContextImpl,\n asTerminalError?: (error: unknown) => TerminalError | undefined\n) {\n // Command-specific errors from ContextImpl carry metadata the VM needs\n // for command correlation. Check before ensureError to preserve the type.\n if (e instanceof CommandError) {\n const cause = ensureError(e.cause);\n logError(ctx.vmLogger, cause);\n if (e.hasCommandIndex) {\n // Completion failure — command exists in the journal\n ctx.coreVm.notify_error_for_specific_command(\n cause.message,\n cause.stack,\n e.commandType,\n e.commandIndex!,\n null\n );\n } else {\n // Preparation failure — command not yet issued\n ctx.coreVm.notify_error_for_next_command(\n cause.message,\n cause.stack,\n e.commandType\n );\n }\n return;\n }\n\n // Handler/interceptor errors\n const error = ensureError(e, asTerminalError);\n logError(ctx.vmLogger, error);\n\n try {\n if (error instanceof TerminalError) {\n // Terminal: write the failure as the invocation output\n ctx.coreVm.sys_write_output_failure({\n code: error.code,\n message: error.message,\n metadata: Object.entries(error.metadata ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n });\n ctx.coreVm.sys_end();\n } else if (error instanceof RetryableError) {\n // Retryable with explicit delay\n ctx.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 // Transient error — VM decides retry policy\n ctx.coreVm.notify_error(error.message, error.stack);\n }\n } catch (vmError) {\n // Safety net: if sys_write_output_failure or other VM calls fail,\n // fall back to notify_error.\n const inner = ensureError(vmError);\n ctx.coreVm.notify_error(inner.message, inner.stack);\n }\n}\n\nasync function flushAndClose(\n coreVm: vm.WasmVM,\n vmLogger: Logger,\n inputReader: InputReader,\n outputWriter: OutputWriter\n): Promise<void> {\n let inputClosed = false;\n try {\n // Consume output till the end, write it out, then close the stream\n let nextOutput = coreVm.take_output() as Uint8Array | null | undefined;\n while (nextOutput !== null && nextOutput !== undefined) {\n await outputWriter.write(nextOutput);\n nextOutput = coreVm.take_output() as Uint8Array | null | undefined;\n }\n\n // --- After this point, we should have flushed the shared core internal buffer\n\n // Let's make sure we properly close the request stream before closing the response stream\n while (!inputClosed) {\n try {\n const res = await inputReader.next();\n inputClosed = res.done ?? false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n inputClosed = true;\n }\n }\n\n // Close the response stream\n await outputWriter.close();\n } catch (e) {\n // In case of failure, we can do little here except just logging stuff out,\n // because outputWriter is not usable here.\n const error = ensureError(e);\n const abortErrorOnWrite = isAbortErrorOnWrite(error);\n\n if (inputClosed && abortErrorOnWrite) {\n // Because we closed the input already,\n // these errors are benign and are caused by\n // synchronization issues wrt closing the response stream in the runtime\n // This will be fixed in the runtime with https://github.com/restatedev/restate/issues/4456\n return;\n }\n\n if (abortErrorOnWrite) {\n vmLogger.error(\n \"Got abort error from connection: \" +\n error.message +\n \"\\n\" +\n \"This might indicate that:\\n\" +\n \"* The restate-server aborted the connection after hitting the 'abort-timeout'\\n\" +\n \"* The connection with the restate-server was lost\\n\" +\n \"\\n\" +\n \"Please check the invocation in the Restate UI for more details.\"\n );\n } else {\n vmLogger.error(\n \"Error while handling request: \" + (error.stack ?? error.message)\n );\n }\n }\n}\n\nfunction isAbortErrorOnWrite(error: Error) {\n return (\n error.name === \"AbortError\" ||\n error.message === \"Invalid state: WritableStream is closed\" ||\n /**\n * Node stream closed error thrown on writes\n */\n (error as { code?: string }).code === \"ERR_HTTP2_INVALID_STREAM\"\n );\n}\n\n// -- Hook composition utils --------------------------------------------------\n\ntype InterceptorFn<Args extends unknown[]> = (\n ...args: [...Args, () => Promise<void>]\n) => Promise<void>;\n\nfunction composeInterceptors<Args extends unknown[]>(\n interceptors: InterceptorFn<Args>[]\n): InterceptorFn<Args> {\n return interceptors.reduceRight<InterceptorFn<Args>>(\n (innerInterceptor, interceptor) =>\n (...args) => {\n const context = args.slice(0, -1) as unknown as Args;\n const callback = args.at(-1) as () => Promise<void>;\n return interceptor(...context, () =>\n innerInterceptor(...context, callback)\n );\n },\n (...args) => (args.at(-1) as () => Promise<void>)()\n );\n}\n\n/**\n * Wraps an interceptor so that both `next()` and the interceptor body race\n * against `invocationEndPromise`. When the attempt ends (suspension, retryable\n * error, etc.), the promise rejects and the interceptor chain unwinds through\n * catch/finally blocks — preventing interceptors from hanging on a `next()`\n * that will never settle.\n *\n * SDK-internal metadata (CommandError, retryAfter) is stripped before the\n * interceptor sees the error and restored after the chain exits.\n */\nfunction raceWithAttemptEnd<Args extends unknown[]>(\n ctx: ContextImpl,\n interceptor: InterceptorFn<Args>\n): InterceptorFn<Args> {\n return (...args) => {\n let originalError: unknown;\n\n // Strip SDK metadata before interceptors see the error.\n // Store the original in the closure for restoration after the chain.\n const signal = ctx.invocationEndPromise.promise.catch((e) => {\n originalError = e;\n throw sanitizeError(e);\n }) as Promise<never>;\n\n const originalNext = args.at(-1) as () => Promise<void>;\n const racingNext = () => Promise.race([originalNext(), signal]);\n const newArgs = [...args.slice(0, -1), racingNext] as unknown as [\n ...Args,\n () => Promise<void>,\n ];\n\n return Promise.race([interceptor(...newArgs), signal]).catch((e) => {\n // Restore SDK metadata after the interceptor chain exits.\n if (originalError !== undefined) {\n throw restoreError(e, originalError);\n }\n throw e;\n });\n };\n}\n\nfunction isDefined<T>(value: T | undefined | null): value is T {\n return value != null;\n}\n\n// -- Logging utils -----------------------------------------------------------\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","service: Component","handler: ComponentHandler","attemptHeaders: Headers","extraArgs: unknown[]","additionalContext: AdditionalContext","journalValueCodecInit:\n | Promise<JournalValueCodec>\n | undefined","loggerTransport: LoggerTransport","vm.WasmVM","journalValueCodec: JournalValueCodec","ctx: ContextImpl","invocationRequest: Request","hooks: Hooks[]","hookContext: { request: Request }","encodedOutput: Uint8Array | undefined","originalError: unknown"],"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 {\n Component,\n ComponentHandler,\n InvokePathComponents,\n} from \"../components.js\";\nimport { parseUrlComponents } from \"../components.js\";\nimport { X_RESTATE_SERVER } from \"../../user_agent.js\";\nimport { CommandError, ContextImpl } from \"../../context_impl.js\";\nimport { restoreError, sanitizeError } from \"../../error_sanitization.js\";\nimport type { InvocationId, 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 { DEFAULT_CONSOLE_LOGGER_LOG_LEVEL } from \"../../logging/console_logger_transport.js\";\nimport {\n LoggerContext,\n 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\";\nimport {\n type RestateHandler,\n type Headers,\n type RestateRequest,\n type AdditionalContext,\n type RestateResponse,\n ResponseHeaders,\n InputReader,\n OutputWriter,\n} from \"./types.js\";\nimport { handleDiscovery } from \"./discovery.js\";\nimport {\n errorResponse,\n invocationIdFromHeaders,\n simpleResponse,\n tryCreateContextualLogger,\n} from \"./utils.js\";\nimport { destroyLogger, registerLogger } from \"./core_logging.js\";\nimport type { Hooks } from \"../../hooks.js\";\n\n// Hidden symbol key used by first-party hooks to read the live\n// replay/processing phase without widening the public HooksProvider API.\nconst HOOK_CONTEXT_IS_PROCESSING_SYMBOL = Symbol.for(\n \"@restatedev/restate-sdk/hooks.isProcessing\"\n);\n\nexport function createRestateHandler(\n endpoint: Endpoint,\n protocolMode: ProtocolMode,\n additionalDiscoveryFields: Partial<EndpointManifest>\n): RestateHandler {\n return new RestateHandlerImpl(\n endpoint,\n protocolMode,\n additionalDiscoveryFields\n );\n}\n\n/**\n * This is the RestateHandler implementation\n */\nclass RestateHandlerImpl 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 handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): RestateResponse {\n try {\n return 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 errorResponse(\n error instanceof RestateError ? error.code : 500,\n error.message\n );\n }\n }\n\n private _handle(\n request: RestateRequest,\n context?: AdditionalContext\n ): 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 errorResponse(404, msg);\n }\n if (parsed.type === \"health\") {\n return simpleResponse(\n 200,\n {\n \"content-type\": \"application/text\",\n \"x-restate-server\": X_RESTATE_SERVER,\n },\n new TextEncoder().encode(\"OK\")\n );\n }\n\n // Discovery and handling invocations require identity verification\n const error = this.validateConnectionSignature(path, request.headers);\n if (error !== null) {\n return error;\n }\n if (parsed.type === \"discover\") {\n return handleDiscovery(\n this.endpoint,\n this.protocolMode,\n this.additionalDiscoveryFields,\n request.headers[\"accept\"]\n );\n }\n\n return this.handleInvoke(\n parsed,\n request.headers,\n request.extraArgs,\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 errorResponse(401, \"Unauthorized\");\n }\n }\n\n private handleInvoke(\n invokePathComponent: InvokePathComponents,\n headers: Headers,\n extraArgs: unknown[],\n additionalContext: AdditionalContext\n ): RestateResponse {\n // Check if we support this protocol version\n const serviceProtocolVersionString = headers[\"content-type\"];\n if (typeof serviceProtocolVersionString !== \"string\") {\n const errorMessage = \"Missing content-type header\";\n this.endpoint.rlog.warn(errorMessage);\n return errorResponse(415, errorMessage);\n }\n\n // Resolve service and handler\n const service = this.endpoint.components.get(\n invokePathComponent.componentName\n );\n if (!service) {\n const msg = `No service found for URL: ${JSON.stringify(invokePathComponent)}`;\n this.endpoint.rlog.error(msg);\n return errorResponse(404, msg);\n }\n const handler = service?.handlerMatching(invokePathComponent);\n if (!handler) {\n const msg = `No service found for URL: ${JSON.stringify(invokePathComponent)}`;\n this.endpoint.rlog.error(msg);\n return errorResponse(404, msg);\n }\n\n return new RestateInvokeResponse(\n service,\n handler,\n headers,\n extraArgs,\n additionalContext,\n this.endpoint.journalValueCodec,\n this.endpoint.loggerTransport\n );\n }\n}\n\nclass RestateInvokeResponse implements RestateResponse {\n public headers: ResponseHeaders;\n public statusCode: number;\n\n private readonly loggerId: number;\n private vmLogger: Logger;\n private readonly coreVm: vm.WasmVM;\n\n constructor(\n private readonly service: Component,\n private readonly handler: ComponentHandler,\n private readonly attemptHeaders: Headers,\n private readonly extraArgs: unknown[],\n private readonly additionalContext: AdditionalContext,\n private readonly journalValueCodecInit:\n | Promise<JournalValueCodec>\n | undefined,\n private readonly loggerTransport: LoggerTransport\n ) {\n this.loggerId = Math.floor(Math.random() * 4_294_967_295 /* u32::MAX */);\n const isJournalCodecDefined = this.journalValueCodecInit !== undefined;\n\n // Instantiate core vm and prepare response headers\n const vmHeaders = Object.entries(this.attemptHeaders)\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 this.coreVm = new vm.WasmVM(\n vmHeaders,\n restateLogLevelToWasmLogLevel(DEFAULT_CONSOLE_LOGGER_LOG_LEVEL),\n this.loggerId,\n isJournalCodecDefined,\n handler.executionOptions.explicitCancellation ?? false\n );\n const responseHead = this.coreVm.get_response_head();\n this.statusCode = responseHead.status_code;\n this.headers = responseHead.headers.reduce(\n (headers, { key, value }) => ({\n [key]: value,\n ...headers,\n }),\n {\n \"x-restate-server\": X_RESTATE_SERVER,\n }\n );\n this.vmLogger = createLogger(\n this.loggerTransport,\n LogSource.JOURNAL,\n new LoggerContext(\n invocationIdFromHeaders(this.attemptHeaders),\n this.service.name(),\n this.handler.name(),\n undefined,\n undefined,\n this.additionalContext\n )\n );\n }\n\n async process({\n inputReader,\n outputWriter,\n abortSignal,\n }: {\n inputReader: InputReader;\n outputWriter: OutputWriter;\n abortSignal: AbortSignal;\n }): Promise<void> {\n abortSignal.addEventListener(\n \"abort\",\n () => {\n // In any case, on abort remove the invocation logger to avoid memory leaks\n destroyLogger(this.loggerId);\n\n // When the HTTP connection closes (e.g. abort timeout), poison the VM.\n // We only read new input from the server when a Restate command is\n // waiting for a response. If no command has been issued, the server's\n // abort signal is never read. Poisoning the VM ensures the handler\n // fails on the next VM call (e.g. ctx.run, ctx.sleep).\n setImmediate(() => {\n const msg = \"Connection closed\";\n this.coreVm.notify_error(msg, msg);\n });\n },\n { once: true }\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 registerLogger(this.loggerId, this.vmLogger);\n\n const journalValueCodec: JournalValueCodec = this.journalValueCodecInit\n ? await this.journalValueCodecInit\n : {\n encode: (entry) => entry,\n decode: (entry) => Promise.resolve(entry),\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 caught, or the state machine fails/suspends.\n //\n // The last case is handled internally within the ContextImpl.\n const invocationEndPromise = new CompletablePromise<void>();\n let ctx: ContextImpl;\n\n // Initial phase before running user code\n // -> Buffer in shared core the journal entries\n // -> Initiate loggers\n // -> Initialize the ContextImpl\n try {\n // Buffer journal inside shared core\n await bufferJournalReplayInCoreVm(this.coreVm, inputReader);\n\n // Get input from coreVm to build the request object\n const input = this.coreVm.sys_input();\n const invocationRequest: Request = {\n target: {\n service: this.service.name(),\n handler: this.handler.name(),\n key: input.key || undefined,\n toString() {\n return this.key !== undefined\n ? `${this.service}/${this.key}/${this.handler}`\n : `${this.service}/${this.handler}`;\n },\n },\n id: input.invocation_id as InvocationId,\n headers: input.headers.reduce((headers, { key, value }) => {\n headers.set(key, value);\n return headers;\n }, new Map()),\n attemptHeaders: Object.entries(this.attemptHeaders).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: this.extraArgs,\n attemptCompletedSignal: abortSignal,\n };\n\n // Prepare logger\n const loggerContext = new LoggerContext(\n input.invocation_id,\n this.handler.component().name(),\n this.handler.name(),\n this.handler.kind() === HandlerKind.SERVICE ? undefined : input.key,\n invocationRequest,\n this.additionalContext\n );\n const ctxLogger = createLogger(\n this.loggerTransport,\n LogSource.USER,\n loggerContext,\n () => !this.coreVm.is_processing()\n );\n // Override the vmLogger created before with more info!\n this.vmLogger = createLogger(\n this.loggerTransport,\n LogSource.JOURNAL,\n loggerContext\n // Filtering is done within the shared core\n );\n\n // See vm_log below for more details\n registerLogger(this.loggerId, this.vmLogger);\n if (!this.coreVm.is_processing()) {\n this.vmLogger.info(\"Replaying invocation.\");\n } else {\n this.vmLogger.info(\"Starting invocation.\");\n }\n\n // Prepare context\n ctx = new ContextImpl(\n this.coreVm,\n input,\n ctxLogger,\n this.handler.kind(),\n this.vmLogger,\n invocationRequest,\n invocationEndPromise,\n inputReader,\n outputWriter,\n journalValueCodec,\n this.handler.executionOptions\n );\n } catch (e) {\n // That's \"preflight\" failure cases, where stuff fails before running user code\n // In this scenario, we close the coreVm, then flush and close\n const error = ensureError(e);\n this.coreVm.notify_error(error.message, error.message);\n await flushAndClose(\n this.coreVm,\n this.vmLogger,\n inputReader,\n outputWriter\n );\n return;\n }\n\n // Run user code. Errors that reach the handler or interceptor code\n // (handler throws, interceptor throws, entry completes with terminal\n // failure) propagate naturally. Errors where the handler is stuck on\n // an await that will never settle (e.g. suspension, retryable run\n // error) are broken out by raceWithAttemptEnd, which races against\n // invocationEndPromise — rejected by ContextImpl when the attempt ends.\n try {\n await startUserHandler(\n ctx,\n this.service,\n this.handler,\n journalValueCodec\n );\n } catch (e) {\n notifyError(e, ctx, this.handler.executionOptions.asTerminalError);\n } finally {\n await flushAndClose(\n this.coreVm,\n this.vmLogger,\n inputReader,\n outputWriter\n );\n }\n }\n}\n\nasync function bufferJournalReplayInCoreVm(\n coreVm: vm.WasmVM,\n inputReader: InputReader\n) {\n while (!coreVm.is_ready_to_execute()) {\n const nextValue = await inputReader.next();\n if (nextValue.done) {\n coreVm.notify_input_closed();\n break;\n }\n if (nextValue.value !== undefined) {\n coreVm.notify_input(nextValue.value);\n }\n }\n}\n\nasync function startUserHandler(\n ctx: ContextImpl,\n service: Component,\n handler: ComponentHandler,\n journalValueCodec: JournalValueCodec\n) {\n // Instantiate hooks from providers.\n // If a provider throws, the same rules as handler failures apply:\n // TerminalError → terminate invocation, other errors → retry.\n const hooks: Hooks[] = [];\n for (const provider of handler.executionOptions.hooks ?? []) {\n const hookContext: { request: Request } = {\n request: ctx.request(),\n };\n Object.defineProperty(hookContext, HOOK_CONTEXT_IS_PROCESSING_SYMBOL, {\n value: () => ctx.isProcessing(),\n enumerable: false,\n });\n hooks.push(provider(hookContext));\n }\n\n // Compose interceptor.handler into a single interceptor (first = outermost)\n const handlerInterceptor = composeInterceptors(\n hooks.map((h) => h.interceptor?.handler).filter(isDefined)\n );\n\n ctx.setRunInterceptor(\n composeInterceptors(hooks.map((h) => h.interceptor?.run).filter(isDefined))\n );\n\n let encodedOutput: Uint8Array | undefined;\n await raceWithAttemptEnd(\n ctx,\n handlerInterceptor\n )(async () => {\n const decodedInput = await journalValueCodec\n .decode(ctx.request().body)\n .catch((e) =>\n // Re-throw as terminal error, to fail on input errors\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\n // Then run user code\n const output = await handler.invoke(ctx, decodedInput);\n\n // Encode user code output\n encodedOutput = journalValueCodec.encode(output);\n });\n\n // Interceptor chain completed without error — commit the result.\n // sys_end() is called here (after interceptors) so that interceptor\n // errors after next() correctly prevent the invocation from succeeding.\n ctx.coreVm.sys_write_output_success(encodedOutput!);\n ctx.coreVm.sys_end();\n ctx.vmLogger.info(\"Invocation completed successfully.\");\n}\n\n/**\n * Classifies the error and notifies the VM. Called from the process() catch\n * block — the single place that decides how to report errors to the VM.\n */\nfunction notifyError(\n e: unknown,\n ctx: ContextImpl,\n asTerminalError?: (error: unknown) => TerminalError | undefined\n) {\n // Command-specific errors from ContextImpl carry metadata the VM needs\n // for command correlation. Check before ensureError to preserve the type.\n if (e instanceof CommandError) {\n const cause = ensureError(e.cause);\n logError(ctx.vmLogger, cause);\n if (e.hasCommandIndex) {\n // Completion failure — command exists in the journal\n ctx.coreVm.notify_error_for_specific_command(\n cause.message,\n cause.stack,\n e.commandType,\n e.commandIndex!,\n null\n );\n } else {\n // Preparation failure — command not yet issued\n ctx.coreVm.notify_error_for_next_command(\n cause.message,\n cause.stack,\n e.commandType\n );\n }\n return;\n }\n\n // Handler/interceptor errors\n const error = ensureError(e, asTerminalError);\n logError(ctx.vmLogger, error);\n\n try {\n if (error instanceof TerminalError) {\n // Terminal: write the failure as the invocation output\n ctx.coreVm.sys_write_output_failure({\n code: error.code,\n message: error.message,\n metadata: Object.entries(error.metadata ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n });\n ctx.coreVm.sys_end();\n } else if (error instanceof RetryableError) {\n // Retryable with explicit delay\n ctx.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 // Transient error — VM decides retry policy\n ctx.coreVm.notify_error(error.message, error.stack);\n }\n } catch (vmError) {\n // Safety net: if sys_write_output_failure or other VM calls fail,\n // fall back to notify_error.\n const inner = ensureError(vmError);\n ctx.coreVm.notify_error(inner.message, inner.stack);\n }\n}\n\nasync function flushAndClose(\n coreVm: vm.WasmVM,\n vmLogger: Logger,\n inputReader: InputReader,\n outputWriter: OutputWriter\n): Promise<void> {\n let inputClosed = false;\n try {\n // Consume output till the end, write it out, then close the stream\n let nextOutput = coreVm.take_output() as Uint8Array | null | undefined;\n while (nextOutput !== null && nextOutput !== undefined) {\n await outputWriter.write(nextOutput);\n nextOutput = coreVm.take_output() as Uint8Array | null | undefined;\n }\n\n // --- After this point, we should have flushed the shared core internal buffer\n\n // Let's make sure we properly close the request stream before closing the response stream\n while (!inputClosed) {\n try {\n const res = await inputReader.next();\n inputClosed = res.done ?? false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n inputClosed = true;\n }\n }\n\n // Close the response stream\n await outputWriter.close();\n } catch (e) {\n // In case of failure, we can do little here except just logging stuff out,\n // because outputWriter is not usable here.\n const error = ensureError(e);\n const abortErrorOnWrite = isAbortErrorOnWrite(error);\n\n if (inputClosed && abortErrorOnWrite) {\n // Because we closed the input already,\n // these errors are benign and are caused by\n // synchronization issues wrt closing the response stream in the runtime\n // This will be fixed in the runtime with https://github.com/restatedev/restate/issues/4456\n return;\n }\n\n if (abortErrorOnWrite) {\n vmLogger.error(\n \"Got abort error from connection: \" +\n error.message +\n \"\\n\" +\n \"This might indicate that:\\n\" +\n \"* The restate-server aborted the connection after hitting the 'abort-timeout'\\n\" +\n \"* The connection with the restate-server was lost\\n\" +\n \"\\n\" +\n \"Please check the invocation in the Restate UI for more details.\"\n );\n } else {\n vmLogger.error(\n \"Error while handling request: \" + (error.stack ?? error.message)\n );\n }\n }\n}\n\nfunction isAbortErrorOnWrite(error: Error) {\n return (\n error.name === \"AbortError\" ||\n error.message === \"Invalid state: WritableStream is closed\" ||\n /**\n * Node stream closed error thrown on writes\n */\n (error as { code?: string }).code === \"ERR_HTTP2_INVALID_STREAM\"\n );\n}\n\n// -- Hook composition utils --------------------------------------------------\n\ntype InterceptorFn<Args extends unknown[]> = (\n ...args: [...Args, () => Promise<void>]\n) => Promise<void>;\n\nfunction composeInterceptors<Args extends unknown[]>(\n interceptors: InterceptorFn<Args>[]\n): InterceptorFn<Args> {\n return interceptors.reduceRight<InterceptorFn<Args>>(\n (innerInterceptor, interceptor) =>\n (...args) => {\n const context = args.slice(0, -1) as unknown as Args;\n const callback = args.at(-1) as () => Promise<void>;\n return interceptor(...context, () =>\n innerInterceptor(...context, callback)\n );\n },\n (...args) => (args.at(-1) as () => Promise<void>)()\n );\n}\n\n/**\n * Wraps an interceptor so that both `next()` and the interceptor body race\n * against `invocationEndPromise`. When the attempt ends (suspension, retryable\n * error, etc.), the promise rejects and the interceptor chain unwinds through\n * catch/finally blocks — preventing interceptors from hanging on a `next()`\n * that will never settle.\n *\n * SDK-internal metadata (CommandError, retryAfter) is stripped before the\n * interceptor sees the error and restored after the chain exits.\n */\nfunction raceWithAttemptEnd<Args extends unknown[]>(\n ctx: ContextImpl,\n interceptor: InterceptorFn<Args>\n): InterceptorFn<Args> {\n return (...args) => {\n let originalError: unknown;\n\n // Strip SDK metadata before interceptors see the error.\n // Store the original in the closure for restoration after the chain.\n const signal = ctx.invocationEndPromise.promise.catch((e) => {\n originalError = e;\n throw sanitizeError(e);\n }) as Promise<never>;\n\n const originalNext = args.at(-1) as () => Promise<void>;\n const racingNext = () => Promise.race([originalNext(), signal]);\n const newArgs = [...args.slice(0, -1), racingNext] as unknown as [\n ...Args,\n () => Promise<void>,\n ];\n\n return Promise.race([interceptor(...newArgs), signal]).catch((e) => {\n // Restore SDK metadata after the interceptor chain exits.\n if (originalError !== undefined) {\n throw restoreError(e, originalError);\n }\n throw e;\n });\n };\n}\n\nfunction isDefined<T>(value: T | undefined | null): value is T {\n return value != null;\n}\n\n// -- Logging utils -----------------------------------------------------------\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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"}
package/dist/package.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region package.json
3
- var version = "1.12.0";
3
+ var version = "1.13.0";
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.12.0";
2
+ var version = "1.13.0";
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.12.0\",\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.13.0\",\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/dist/promises.cjs CHANGED
@@ -140,6 +140,7 @@ var CombinatorRestatePromise = class CombinatorRestatePromise extends BaseRestat
140
140
  };
141
141
  var MappedRestatePromise = class extends BaseRestatePromise {
142
142
  publicPromiseMapper;
143
+ _mappedPromise;
143
144
  constructor(ctx, inner, mapper) {
144
145
  super(ctx);
145
146
  this.inner = inner;
@@ -162,6 +163,9 @@ var MappedRestatePromise = class extends BaseRestatePromise {
162
163
  return this.inner.uncompletedLeaves();
163
164
  }
164
165
  publicPromise() {
166
+ return this._mappedPromise ??= this.buildMappedPromise();
167
+ }
168
+ buildMappedPromise() {
165
169
  const promiseMapper = this.publicPromiseMapper;
166
170
  return this.inner.publicPromise().then((t) => promiseMapper(t, void 0), (error) => {
167
171
  if (error instanceof require_errors.RestateError) return promiseMapper(void 0, error);
@@ -171,22 +175,26 @@ var MappedRestatePromise = class extends BaseRestatePromise {
171
175
  [Symbol.toStringTag] = "RestateMappedPromise";
172
176
  };
173
177
  var ConstRestatePromise = class ConstRestatePromise extends InternalRestatePromise {
174
- constructor(constPromise, settled) {
178
+ _constPromise;
179
+ constructor(promiseFactory, settled) {
175
180
  super();
176
- this.constPromise = constPromise;
181
+ this.promiseFactory = promiseFactory;
177
182
  this.settled = settled;
178
183
  }
184
+ get constPromise() {
185
+ return this._constPromise ??= this.promiseFactory();
186
+ }
179
187
  static resolve(value) {
180
- return new ConstRestatePromise(Promise.resolve(value), true);
188
+ return new ConstRestatePromise(() => Promise.resolve(value), true);
181
189
  }
182
190
  static reject(reason) {
183
- return new ConstRestatePromise(Promise.reject(reason), true);
191
+ return new ConstRestatePromise(() => Promise.reject(reason), true);
184
192
  }
185
193
  static pending() {
186
- return new ConstRestatePromise(pendingPromise(), false);
194
+ return new ConstRestatePromise(() => pendingPromise(), false);
187
195
  }
188
196
  static fromPromise(promise, settled) {
189
- return new ConstRestatePromise(promise, settled);
197
+ return new ConstRestatePromise(() => promise, settled);
190
198
  }
191
199
  then(onfulfilled, onrejected) {
192
200
  return this.constPromise.then(onfulfilled, onrejected);
@@ -202,7 +210,9 @@ var ConstRestatePromise = class ConstRestatePromise extends InternalRestatePromi
202
210
  return ConstRestatePromise.reject(new require_errors.TimeoutError());
203
211
  }
204
212
  map(mapper) {
205
- return ConstRestatePromise.fromPromise(this.constPromise.then((value) => mapper(value, void 0), (reason) => mapper(void 0, reason)), this.settled);
213
+ if (!this.settled) return this;
214
+ const selfConstPromise = this.constPromise;
215
+ return new ConstRestatePromise(() => selfConstPromise.then((value) => mapper(value, void 0), (reason) => mapper(void 0, reason)), this.settled);
206
216
  }
207
217
  tryCancel() {}
208
218
  publicPromise() {
package/dist/promises.js CHANGED
@@ -138,6 +138,7 @@ var CombinatorRestatePromise = class CombinatorRestatePromise extends BaseRestat
138
138
  };
139
139
  var MappedRestatePromise = class extends BaseRestatePromise {
140
140
  publicPromiseMapper;
141
+ _mappedPromise;
141
142
  constructor(ctx, inner, mapper) {
142
143
  super(ctx);
143
144
  this.inner = inner;
@@ -160,6 +161,9 @@ var MappedRestatePromise = class extends BaseRestatePromise {
160
161
  return this.inner.uncompletedLeaves();
161
162
  }
162
163
  publicPromise() {
164
+ return this._mappedPromise ??= this.buildMappedPromise();
165
+ }
166
+ buildMappedPromise() {
163
167
  const promiseMapper = this.publicPromiseMapper;
164
168
  return this.inner.publicPromise().then((t) => promiseMapper(t, void 0), (error) => {
165
169
  if (error instanceof RestateError) return promiseMapper(void 0, error);
@@ -169,22 +173,26 @@ var MappedRestatePromise = class extends BaseRestatePromise {
169
173
  [Symbol.toStringTag] = "RestateMappedPromise";
170
174
  };
171
175
  var ConstRestatePromise = class ConstRestatePromise extends InternalRestatePromise {
172
- constructor(constPromise, settled) {
176
+ _constPromise;
177
+ constructor(promiseFactory, settled) {
173
178
  super();
174
- this.constPromise = constPromise;
179
+ this.promiseFactory = promiseFactory;
175
180
  this.settled = settled;
176
181
  }
182
+ get constPromise() {
183
+ return this._constPromise ??= this.promiseFactory();
184
+ }
177
185
  static resolve(value) {
178
- return new ConstRestatePromise(Promise.resolve(value), true);
186
+ return new ConstRestatePromise(() => Promise.resolve(value), true);
179
187
  }
180
188
  static reject(reason) {
181
- return new ConstRestatePromise(Promise.reject(reason), true);
189
+ return new ConstRestatePromise(() => Promise.reject(reason), true);
182
190
  }
183
191
  static pending() {
184
- return new ConstRestatePromise(pendingPromise(), false);
192
+ return new ConstRestatePromise(() => pendingPromise(), false);
185
193
  }
186
194
  static fromPromise(promise, settled) {
187
- return new ConstRestatePromise(promise, settled);
195
+ return new ConstRestatePromise(() => promise, settled);
188
196
  }
189
197
  then(onfulfilled, onrejected) {
190
198
  return this.constPromise.then(onfulfilled, onrejected);
@@ -200,7 +208,9 @@ var ConstRestatePromise = class ConstRestatePromise extends InternalRestatePromi
200
208
  return ConstRestatePromise.reject(new TimeoutError());
201
209
  }
202
210
  map(mapper) {
203
- return ConstRestatePromise.fromPromise(this.constPromise.then((value) => mapper(value, void 0), (reason) => mapper(void 0, reason)), this.settled);
211
+ if (!this.settled) return this;
212
+ const selfConstPromise = this.constPromise;
213
+ return new ConstRestatePromise(() => selfConstPromise.then((value) => mapper(value, void 0), (reason) => mapper(void 0, reason)), this.settled);
204
214
  }
205
215
  tryCancel() {}
206
216
  publicPromise() {
@@ -1 +1 @@
1
- {"version":3,"file":"promises.js","names":["handle: number","completer: (\n value: AsyncResultValue,\n prom: CompletablePromise<T>\n ) => Promise<void>","invocationIdPromise: Promise<InvocationId>","childs: Array<InternalRestatePromise<any>>","castedPromises: InternalRestatePromise<any>[]","foundContext: ContextImpl | undefined","inner: InternalRestatePromise<T>","constPromise: Promise<T>","settled: boolean","coreVm: vm.WasmVM","inputPump: InputPump","outputPump: OutputPump","runClosuresTracker: RunClosuresTracker","errorCallback: (e: any) => void"],"sources":["../src/promises.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2025 - 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 RestatePromise,\n InvocationId,\n InvocationPromise,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n CancelledError,\n RestateError,\n TerminalError,\n TimeoutError,\n} from \"./types/errors.js\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport type { ContextImpl, RunClosuresTracker } from \"./context_impl.js\";\nimport { setImmediate } from \"node:timers/promises\";\nimport type { InputPump, OutputPump } from \"./io.js\";\nimport type { Duration } from \"@restatedev/restate-sdk-core\";\n\n// A promise that is never completed\nexport function pendingPromise<T>(): Promise<T> {\n return new Promise<T>(() => {});\n}\n\n// ------ Restate promises ------\n// These promises are \"proxy promises\" that will be handed over to the user,\n// and moved forward by the PromiseExecutor below when the user awaits on them.\n\n/**\n * Returns `true` if the given value is a {@link RestatePromise}.\n *\n * Use this for runtime type detection when you need to distinguish Restate promises\n * from regular promises, e.g. for overload resolution.\n */\nexport function isRestatePromise<T>(p: Promise<T>): p is RestatePromise<T> {\n return p instanceof InternalRestatePromise;\n}\n\nenum PromiseState {\n COMPLETED,\n NOT_COMPLETED,\n}\n\nexport abstract class InternalRestatePromise<T> implements RestatePromise<T> {\n abstract then<TResult1, TResult2>(\n onfulfilled:\n | ((value: T) => PromiseLike<TResult1> | TResult1)\n | undefined\n | null,\n onrejected:\n | ((reason: any) => PromiseLike<TResult2> | TResult2)\n | undefined\n | null\n ): Promise<TResult1 | TResult2>;\n abstract catch<TResult>(\n onrejected:\n | ((reason: any) => PromiseLike<TResult> | TResult)\n | undefined\n | null\n ): Promise<T | TResult>;\n abstract finally(onfinally: (() => void) | undefined | null): Promise<T>;\n\n abstract map<U>(\n mapper: (value?: T, failure?: TerminalError) => U\n ): RestatePromise<U>;\n abstract orTimeout(millis: Duration | number): RestatePromise<T>;\n\n abstract tryCancel(): void;\n abstract tryComplete(): Promise<void>;\n abstract uncompletedLeaves(): Array<number>;\n abstract publicPromise(): Promise<T>;\n\n abstract readonly [Symbol.toStringTag]: string;\n}\n\nexport type AsyncResultValue =\n | \"Empty\"\n | { Success: Uint8Array }\n | { Failure: vm.WasmFailure }\n | { StateKeys: string[] }\n | { InvocationId: string };\n\nconst RESTATE_CTX_SYMBOL = Symbol(\"restateContext\");\n\nfunction extractContext(n: any): ContextImpl | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return n[RESTATE_CTX_SYMBOL] as ContextImpl | undefined;\n}\n\nabstract class BaseRestatePromise<T> extends InternalRestatePromise<T> {\n [RESTATE_CTX_SYMBOL]: ContextImpl;\n private pollingPromise?: Promise<any>;\n private cancelPromise: CompletablePromise<any> = new CompletablePromise();\n\n protected constructor(ctx: ContextImpl) {\n super();\n this[RESTATE_CTX_SYMBOL] = ctx;\n }\n\n // --- Promise methods\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 this.pollingPromise =\n this.pollingPromise ||\n this[RESTATE_CTX_SYMBOL].promisesExecutor\n .doProgress(this)\n .catch(() => {});\n return this.publicPromiseOrCancelPromise().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n this.pollingPromise =\n this.pollingPromise ||\n this[RESTATE_CTX_SYMBOL].promisesExecutor\n .doProgress(this)\n .catch(() => {});\n return this.publicPromiseOrCancelPromise().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n this.pollingPromise =\n this.pollingPromise ||\n this[RESTATE_CTX_SYMBOL].promisesExecutor\n .doProgress(this)\n .catch(() => {});\n return this.publicPromiseOrCancelPromise().finally(onfinally);\n }\n\n private publicPromiseOrCancelPromise(): Promise<T> {\n return Promise.race([\n this.cancelPromise.promise as Promise<T>,\n this.publicPromise(),\n ]);\n }\n\n // --- RestatePromise methods\n\n orTimeout(duration: number | Duration): RestatePromise<T> {\n return new CombinatorRestatePromise(\n this[RESTATE_CTX_SYMBOL],\n ([thisPromise, sleepPromise]) => {\n return new Promise((resolve, reject) => {\n thisPromise!.then(resolve, reject);\n sleepPromise!.then(() => {\n reject(new TimeoutError());\n }, reject);\n });\n },\n [\n this,\n this[RESTATE_CTX_SYMBOL].sleep(duration) as InternalRestatePromise<any>,\n ]\n ) as RestatePromise<T>;\n }\n\n map<U>(mapper: (value?: T, failure?: TerminalError) => U): RestatePromise<U> {\n return new MappedRestatePromise(this[RESTATE_CTX_SYMBOL], this, mapper);\n }\n\n tryCancel() {\n this.cancelPromise.reject(new CancelledError());\n }\n\n abstract override tryComplete(): Promise<void>;\n\n abstract override uncompletedLeaves(): Array<number>;\n\n abstract override publicPromise(): Promise<T>;\n\n abstract override [Symbol.toStringTag]: string;\n}\n\nexport class SingleRestatePromise<T> extends BaseRestatePromise<T> {\n private state: PromiseState = PromiseState.NOT_COMPLETED;\n private completablePromise: CompletablePromise<T> = new CompletablePromise();\n\n constructor(\n ctx: ContextImpl,\n readonly handle: number,\n private readonly completer: (\n value: AsyncResultValue,\n prom: CompletablePromise<T>\n ) => Promise<void>\n ) {\n super(ctx);\n }\n\n uncompletedLeaves(): number[] {\n return this.state === PromiseState.COMPLETED ? [] : [this.handle];\n }\n\n async tryComplete(): Promise<void> {\n if (this.state === PromiseState.COMPLETED) {\n return;\n }\n const notification = this[RESTATE_CTX_SYMBOL].coreVm.take_notification(\n this.handle\n );\n if (notification === \"NotReady\") {\n return;\n }\n this.state = PromiseState.COMPLETED;\n await this.completer(notification, this.completablePromise);\n }\n\n publicPromise(): Promise<T> {\n return this.completablePromise.promise;\n }\n\n isCompleted(): boolean {\n return this.state === PromiseState.COMPLETED;\n }\n\n readonly [Symbol.toStringTag] = \"RestateSinglePromise\";\n}\n\nexport class InvocationRestatePromise<T>\n extends SingleRestatePromise<T>\n implements InvocationPromise<T>\n{\n constructor(\n ctx: ContextImpl,\n handle: number,\n completer: (\n value: AsyncResultValue,\n prom: CompletablePromise<T>\n ) => Promise<void>,\n private readonly invocationIdPromise: Promise<InvocationId>\n ) {\n super(ctx, handle, completer);\n }\n\n get invocationId(): Promise<InvocationId> {\n return this.invocationIdPromise;\n }\n}\n\nexport class CombinatorRestatePromise extends BaseRestatePromise<any> {\n private state: PromiseState = PromiseState.NOT_COMPLETED;\n private readonly combinatorPromise: Promise<any>;\n\n constructor(\n ctx: ContextImpl,\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n readonly childs: Array<InternalRestatePromise<any>>\n ) {\n super(ctx);\n this.combinatorPromise = combinatorConstructor(\n childs.map((p) => p.publicPromise())\n ).finally(() => {\n this.state = PromiseState.COMPLETED;\n });\n }\n\n // Used by static methods of RestatePromise\n public static fromPromises<T extends readonly RestatePromise<unknown>[]>(\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n promises: T\n ): RestatePromise<unknown> {\n const castedPromises: InternalRestatePromise<any>[] = [];\n let foundContext: ContextImpl | undefined = undefined;\n\n for (const [idx, promise] of promises.entries()) {\n if (!isRestatePromise(promise)) {\n throw new Error(\n `Promise index ${idx} used inside the combinator is not an instance of RestatePromise. This is not supported.`\n );\n } else if (foundContext === undefined) {\n foundContext = extractContext(promise);\n } else {\n const thisContext = extractContext(promise);\n if (thisContext !== undefined && thisContext !== foundContext) {\n throw new Error(\n \"You're mixing up RestatePromises from different RestateContext. This is not supported.\"\n );\n }\n }\n castedPromises.push(promise as InternalRestatePromise<any>);\n }\n\n if (foundContext === undefined) {\n // The only situation where this can happen is when the combined promise contains only ConstRestatePromise as children.\n // In this case, just return back a nice and clean ConstRestatePromise.\n // There is a specific workaround for the funky interface of Promise.race, inside the RestatePromise.race factory method.\n return ConstRestatePromise.fromPromise(\n combinatorConstructor(castedPromises),\n true\n );\n }\n\n return new CombinatorRestatePromise(\n foundContext,\n combinatorConstructor,\n castedPromises\n );\n }\n\n uncompletedLeaves(): number[] {\n return this.state === PromiseState.COMPLETED\n ? []\n : this.childs.flatMap((p) => p.uncompletedLeaves());\n }\n\n async tryComplete(): Promise<void> {\n await Promise.allSettled(this.childs.map((c) => c.tryComplete()));\n }\n\n publicPromise(): Promise<unknown> {\n return this.combinatorPromise;\n }\n\n readonly [Symbol.toStringTag] = \"RestateCombinatorPromise\";\n}\n\nexport class MappedRestatePromise<T, U> extends BaseRestatePromise<U> {\n private publicPromiseMapper: (\n value?: T,\n failure?: TerminalError\n ) => Promise<U>;\n\n constructor(\n ctx: ContextImpl,\n readonly inner: InternalRestatePromise<T>,\n mapper: (value?: T, failure?: TerminalError) => U\n ) {\n super(ctx);\n this.publicPromiseMapper = (value?: T, failure?: TerminalError) => {\n try {\n return Promise.resolve(mapper(value, failure));\n } catch (e) {\n if (e instanceof TerminalError) {\n return Promise.reject(e);\n } else {\n ctx.abortAttempt(e);\n return pendingPromise();\n }\n }\n };\n }\n\n async tryComplete(): Promise<void> {\n await this.inner.tryComplete();\n }\n\n uncompletedLeaves(): number[] {\n return this.inner.uncompletedLeaves();\n }\n\n publicPromise(): Promise<U> {\n const promiseMapper = this.publicPromiseMapper;\n return this.inner.publicPromise().then(\n (t) => promiseMapper(t, undefined),\n (error) => {\n if (error instanceof RestateError) {\n return promiseMapper(undefined, error);\n } else {\n // Something else, just re-throw it\n throw error;\n }\n }\n );\n }\n\n readonly [Symbol.toStringTag] = \"RestateMappedPromise\";\n}\n\nexport class ConstRestatePromise<T> extends InternalRestatePromise<T> {\n private constructor(\n private readonly constPromise: Promise<T>,\n private readonly settled: boolean\n ) {\n super();\n }\n\n static resolve<T>(value: T): ConstRestatePromise<Awaited<T>> {\n return new ConstRestatePromise(Promise.resolve(value), true);\n }\n\n static reject<T = never>(reason: TerminalError): ConstRestatePromise<T> {\n return new ConstRestatePromise<T>(Promise.reject(reason), true);\n }\n\n static pending<T>(): ConstRestatePromise<T> {\n return new ConstRestatePromise<T>(pendingPromise(), false);\n }\n\n static fromPromise<T>(\n promise: Promise<T>,\n settled: boolean\n ): ConstRestatePromise<T> {\n return new ConstRestatePromise(promise, settled);\n }\n\n // --- Promise methods\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.constPromise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.constPromise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.constPromise.finally(onfinally);\n }\n\n // --- RestatePromise methods\n\n orTimeout(): RestatePromise<T> {\n if (this.settled) return this;\n return ConstRestatePromise.reject(new TimeoutError());\n }\n\n map<U>(mapper: (value?: T, failure?: TerminalError) => U): RestatePromise<U> {\n return ConstRestatePromise.fromPromise(\n this.constPromise.then(\n (value) => mapper(value, undefined),\n (reason) => mapper(undefined, reason as TerminalError)\n ),\n this.settled\n );\n }\n\n tryCancel() {}\n\n publicPromise(): Promise<T> {\n return this.constPromise;\n }\n\n tryComplete(): Promise<void> {\n return Promise.resolve();\n }\n\n uncompletedLeaves(): Array<number> {\n return [];\n }\n\n readonly [Symbol.toStringTag] = \"ConstRestatePromise\";\n}\n\n/**\n * Promises executor, gluing VM with I/O and Promises given to user space.\n */\nexport class PromisesExecutor {\n constructor(\n private readonly coreVm: vm.WasmVM,\n private readonly inputPump: InputPump,\n private readonly outputPump: OutputPump,\n private readonly runClosuresTracker: RunClosuresTracker,\n private readonly errorCallback: (e: any) => void\n ) {}\n\n async doProgress(restatePromise: InternalRestatePromise<unknown>) {\n // Only the first time try process output\n await this.outputPump.awaitNextProgress();\n await this.doProgressInner(restatePromise);\n }\n\n private async doProgressInner(\n restatePromise: InternalRestatePromise<unknown>\n ) {\n // Try complete the promise\n try {\n await restatePromise.tryComplete();\n } catch (e) {\n // This can happen if either take_notification throws an exception or completer throws an exception.\n // This could either happen for a deserialization issue, or for an SDK bug, but we cover them here.\n this.errorCallback(e);\n return Promise.resolve();\n }\n\n // tl;dr don't touch this, or you can break combineable promises,\n // slinkydeveloper won't be happy about it\n //\n // The reason for this setTimeout is that we need to enqueue the polling after\n // we eventually resolve some promises. This is especially crucial for RestateCombinatorPromise\n // as it flips the completed state using .finally() on the combinator.\n return setImmediate().then(async () => {\n try {\n // Invoke do progress on the vm\n const handles = restatePromise.uncompletedLeaves();\n if (handles.length === 0) {\n // Completed, we're good!\n return;\n }\n const doProgressResult = this.coreVm.do_progress(\n new Uint32Array(handles)\n );\n\n if (doProgressResult === \"AnyCompleted\") {\n // Next recursion will cause the promise to do some progress\n } else if (doProgressResult === \"ReadFromInput\") {\n // Read from input\n await this.inputPump.awaitNextProgress();\n } else if (doProgressResult === \"WaitingPendingRun\") {\n // Wait for any of the pending run to complete\n await this.runClosuresTracker.awaitNextCompletedRun();\n } else if (doProgressResult === \"CancelSignalReceived\") {\n restatePromise.tryCancel();\n return;\n } else {\n // We need to execute a run closure\n this.runClosuresTracker.executeRun(doProgressResult.ExecuteRun);\n // Let the run context switch, then come back to this flow.\n await setImmediate();\n }\n\n // Recursion\n await this.doProgressInner(restatePromise);\n } catch (e) {\n // Not good, this is a retryable error.\n this.errorCallback(e);\n }\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"promises.js","names":["handle: number","completer: (\n value: AsyncResultValue,\n prom: CompletablePromise<T>\n ) => Promise<void>","invocationIdPromise: Promise<InvocationId>","childs: Array<InternalRestatePromise<any>>","castedPromises: InternalRestatePromise<any>[]","foundContext: ContextImpl | undefined","inner: InternalRestatePromise<T>","promiseFactory: () => Promise<T>","settled: boolean","coreVm: vm.WasmVM","inputPump: InputPump","outputPump: OutputPump","runClosuresTracker: RunClosuresTracker","errorCallback: (e: any) => void"],"sources":["../src/promises.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2025 - 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 RestatePromise,\n InvocationId,\n InvocationPromise,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n CancelledError,\n RestateError,\n TerminalError,\n TimeoutError,\n} from \"./types/errors.js\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport type { ContextImpl, RunClosuresTracker } from \"./context_impl.js\";\nimport { setImmediate } from \"node:timers/promises\";\nimport type { InputPump, OutputPump } from \"./io.js\";\nimport type { Duration } from \"@restatedev/restate-sdk-core\";\n\n// A promise that is never completed\nexport function pendingPromise<T>(): Promise<T> {\n return new Promise<T>(() => {});\n}\n\n// ------ Restate promises ------\n// These promises are \"proxy promises\" that will be handed over to the user,\n// and moved forward by the PromiseExecutor below when the user awaits on them.\n\n/**\n * Returns `true` if the given value is a {@link RestatePromise}.\n *\n * Use this for runtime type detection when you need to distinguish Restate promises\n * from regular promises, e.g. for overload resolution.\n */\nexport function isRestatePromise<T>(p: Promise<T>): p is RestatePromise<T> {\n return p instanceof InternalRestatePromise;\n}\n\nenum PromiseState {\n COMPLETED,\n NOT_COMPLETED,\n}\n\nexport abstract class InternalRestatePromise<T> implements RestatePromise<T> {\n abstract then<TResult1, TResult2>(\n onfulfilled:\n | ((value: T) => PromiseLike<TResult1> | TResult1)\n | undefined\n | null,\n onrejected:\n | ((reason: any) => PromiseLike<TResult2> | TResult2)\n | undefined\n | null\n ): Promise<TResult1 | TResult2>;\n abstract catch<TResult>(\n onrejected:\n | ((reason: any) => PromiseLike<TResult> | TResult)\n | undefined\n | null\n ): Promise<T | TResult>;\n abstract finally(onfinally: (() => void) | undefined | null): Promise<T>;\n\n abstract map<U>(\n mapper: (value?: T, failure?: TerminalError) => U\n ): RestatePromise<U>;\n abstract orTimeout(millis: Duration | number): RestatePromise<T>;\n\n abstract tryCancel(): void;\n abstract tryComplete(): Promise<void>;\n abstract uncompletedLeaves(): Array<number>;\n abstract publicPromise(): Promise<T>;\n\n abstract readonly [Symbol.toStringTag]: string;\n}\n\nexport type AsyncResultValue =\n | \"Empty\"\n | { Success: Uint8Array }\n | { Failure: vm.WasmFailure }\n | { StateKeys: string[] }\n | { InvocationId: string };\n\nconst RESTATE_CTX_SYMBOL = Symbol(\"restateContext\");\n\nfunction extractContext(n: any): ContextImpl | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return n[RESTATE_CTX_SYMBOL] as ContextImpl | undefined;\n}\n\nabstract class BaseRestatePromise<T> extends InternalRestatePromise<T> {\n [RESTATE_CTX_SYMBOL]: ContextImpl;\n private pollingPromise?: Promise<any>;\n private cancelPromise: CompletablePromise<any> = new CompletablePromise();\n\n protected constructor(ctx: ContextImpl) {\n super();\n this[RESTATE_CTX_SYMBOL] = ctx;\n }\n\n // --- Promise methods\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 this.pollingPromise =\n this.pollingPromise ||\n this[RESTATE_CTX_SYMBOL].promisesExecutor\n .doProgress(this)\n .catch(() => {});\n return this.publicPromiseOrCancelPromise().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n this.pollingPromise =\n this.pollingPromise ||\n this[RESTATE_CTX_SYMBOL].promisesExecutor\n .doProgress(this)\n .catch(() => {});\n return this.publicPromiseOrCancelPromise().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n this.pollingPromise =\n this.pollingPromise ||\n this[RESTATE_CTX_SYMBOL].promisesExecutor\n .doProgress(this)\n .catch(() => {});\n return this.publicPromiseOrCancelPromise().finally(onfinally);\n }\n\n private publicPromiseOrCancelPromise(): Promise<T> {\n return Promise.race([\n this.cancelPromise.promise as Promise<T>,\n this.publicPromise(),\n ]);\n }\n\n // --- RestatePromise methods\n\n orTimeout(duration: number | Duration): RestatePromise<T> {\n return new CombinatorRestatePromise(\n this[RESTATE_CTX_SYMBOL],\n ([thisPromise, sleepPromise]) => {\n return new Promise((resolve, reject) => {\n thisPromise!.then(resolve, reject);\n sleepPromise!.then(() => {\n reject(new TimeoutError());\n }, reject);\n });\n },\n [\n this,\n this[RESTATE_CTX_SYMBOL].sleep(duration) as InternalRestatePromise<any>,\n ]\n ) as RestatePromise<T>;\n }\n\n map<U>(mapper: (value?: T, failure?: TerminalError) => U): RestatePromise<U> {\n return new MappedRestatePromise(this[RESTATE_CTX_SYMBOL], this, mapper);\n }\n\n tryCancel() {\n this.cancelPromise.reject(new CancelledError());\n }\n\n abstract override tryComplete(): Promise<void>;\n\n abstract override uncompletedLeaves(): Array<number>;\n\n abstract override publicPromise(): Promise<T>;\n\n abstract override [Symbol.toStringTag]: string;\n}\n\nexport class SingleRestatePromise<T> extends BaseRestatePromise<T> {\n private state: PromiseState = PromiseState.NOT_COMPLETED;\n private completablePromise: CompletablePromise<T> = new CompletablePromise();\n\n constructor(\n ctx: ContextImpl,\n readonly handle: number,\n private readonly completer: (\n value: AsyncResultValue,\n prom: CompletablePromise<T>\n ) => Promise<void>\n ) {\n super(ctx);\n }\n\n uncompletedLeaves(): number[] {\n return this.state === PromiseState.COMPLETED ? [] : [this.handle];\n }\n\n async tryComplete(): Promise<void> {\n if (this.state === PromiseState.COMPLETED) {\n return;\n }\n const notification = this[RESTATE_CTX_SYMBOL].coreVm.take_notification(\n this.handle\n );\n if (notification === \"NotReady\") {\n return;\n }\n this.state = PromiseState.COMPLETED;\n await this.completer(notification, this.completablePromise);\n }\n\n publicPromise(): Promise<T> {\n return this.completablePromise.promise;\n }\n\n isCompleted(): boolean {\n return this.state === PromiseState.COMPLETED;\n }\n\n readonly [Symbol.toStringTag] = \"RestateSinglePromise\";\n}\n\nexport class InvocationRestatePromise<T>\n extends SingleRestatePromise<T>\n implements InvocationPromise<T>\n{\n constructor(\n ctx: ContextImpl,\n handle: number,\n completer: (\n value: AsyncResultValue,\n prom: CompletablePromise<T>\n ) => Promise<void>,\n private readonly invocationIdPromise: Promise<InvocationId>\n ) {\n super(ctx, handle, completer);\n }\n\n get invocationId(): Promise<InvocationId> {\n return this.invocationIdPromise;\n }\n}\n\nexport class CombinatorRestatePromise extends BaseRestatePromise<any> {\n private state: PromiseState = PromiseState.NOT_COMPLETED;\n private readonly combinatorPromise: Promise<any>;\n\n constructor(\n ctx: ContextImpl,\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n readonly childs: Array<InternalRestatePromise<any>>\n ) {\n super(ctx);\n this.combinatorPromise = combinatorConstructor(\n childs.map((p) => p.publicPromise())\n ).finally(() => {\n this.state = PromiseState.COMPLETED;\n });\n }\n\n // Used by static methods of RestatePromise\n public static fromPromises<T extends readonly RestatePromise<unknown>[]>(\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n promises: T\n ): RestatePromise<unknown> {\n const castedPromises: InternalRestatePromise<any>[] = [];\n let foundContext: ContextImpl | undefined = undefined;\n\n for (const [idx, promise] of promises.entries()) {\n if (!isRestatePromise(promise)) {\n throw new Error(\n `Promise index ${idx} used inside the combinator is not an instance of RestatePromise. This is not supported.`\n );\n } else if (foundContext === undefined) {\n foundContext = extractContext(promise);\n } else {\n const thisContext = extractContext(promise);\n if (thisContext !== undefined && thisContext !== foundContext) {\n throw new Error(\n \"You're mixing up RestatePromises from different RestateContext. This is not supported.\"\n );\n }\n }\n castedPromises.push(promise as InternalRestatePromise<any>);\n }\n\n if (foundContext === undefined) {\n // The only situation where this can happen is when the combined promise contains only ConstRestatePromise as children.\n // In this case, just return back a nice and clean ConstRestatePromise.\n // There is a specific workaround for the funky interface of Promise.race, inside the RestatePromise.race factory method.\n return ConstRestatePromise.fromPromise(\n combinatorConstructor(castedPromises),\n true\n );\n }\n\n return new CombinatorRestatePromise(\n foundContext,\n combinatorConstructor,\n castedPromises\n );\n }\n\n uncompletedLeaves(): number[] {\n return this.state === PromiseState.COMPLETED\n ? []\n : this.childs.flatMap((p) => p.uncompletedLeaves());\n }\n\n async tryComplete(): Promise<void> {\n await Promise.allSettled(this.childs.map((c) => c.tryComplete()));\n }\n\n publicPromise(): Promise<unknown> {\n return this.combinatorPromise;\n }\n\n readonly [Symbol.toStringTag] = \"RestateCombinatorPromise\";\n}\n\nexport class MappedRestatePromise<T, U> extends BaseRestatePromise<U> {\n private publicPromiseMapper: (\n value?: T,\n failure?: TerminalError\n ) => Promise<U>;\n // Memoized so the mapper fires at most once regardless of how many times\n // the promise is awaited / consumed via then/catch/finally/publicPromise.\n private _mappedPromise?: Promise<U>;\n\n constructor(\n ctx: ContextImpl,\n readonly inner: InternalRestatePromise<T>,\n mapper: (value?: T, failure?: TerminalError) => U\n ) {\n super(ctx);\n this.publicPromiseMapper = (value?: T, failure?: TerminalError) => {\n try {\n return Promise.resolve(mapper(value, failure));\n } catch (e) {\n if (e instanceof TerminalError) {\n return Promise.reject(e);\n } else {\n ctx.abortAttempt(e);\n return pendingPromise();\n }\n }\n };\n }\n\n async tryComplete(): Promise<void> {\n await this.inner.tryComplete();\n }\n\n uncompletedLeaves(): number[] {\n return this.inner.uncompletedLeaves();\n }\n\n publicPromise(): Promise<U> {\n return (this._mappedPromise ??= this.buildMappedPromise());\n }\n\n private buildMappedPromise(): Promise<U> {\n const promiseMapper = this.publicPromiseMapper;\n return this.inner.publicPromise().then(\n (t) => promiseMapper(t, undefined),\n (error) => {\n if (error instanceof RestateError) {\n return promiseMapper(undefined, error);\n } else {\n // Something else, just re-throw it\n throw error;\n }\n }\n );\n }\n\n readonly [Symbol.toStringTag] = \"RestateMappedPromise\";\n}\n\nexport class ConstRestatePromise<T> extends InternalRestatePromise<T> {\n private _constPromise?: Promise<T>;\n\n private constructor(\n // Factory for the underlying promise. Called at most once, memoized in\n // `_constPromise`.\n //\n // This way `map` is lazy, making it deterministically invoked on await points.\n private readonly promiseFactory: () => Promise<T>,\n private readonly settled: boolean\n ) {\n super();\n }\n\n private get constPromise(): Promise<T> {\n return (this._constPromise ??= this.promiseFactory());\n }\n\n static resolve<T>(value: T): ConstRestatePromise<Awaited<T>> {\n return new ConstRestatePromise(() => Promise.resolve(value), true);\n }\n\n static reject<T = never>(reason: TerminalError): ConstRestatePromise<T> {\n return new ConstRestatePromise<T>(() => Promise.reject(reason), true);\n }\n\n static pending<T>(): ConstRestatePromise<T> {\n return new ConstRestatePromise<T>(() => pendingPromise<T>(), false);\n }\n\n static fromPromise<T>(\n promise: Promise<T>,\n settled: boolean\n ): ConstRestatePromise<T> {\n return new ConstRestatePromise(() => promise, settled);\n }\n\n // --- Promise methods\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.constPromise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.constPromise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.constPromise.finally(onfinally);\n }\n\n // --- RestatePromise methods\n\n orTimeout(): RestatePromise<T> {\n if (this.settled) return this;\n return ConstRestatePromise.reject(new TimeoutError());\n }\n\n map<U>(mapper: (value?: T, failure?: TerminalError) => U): RestatePromise<U> {\n if (!this.settled) return this as unknown as RestatePromise<U>;\n const selfConstPromise = this.constPromise;\n return new ConstRestatePromise<U>(\n () =>\n selfConstPromise.then(\n (value) => mapper(value, undefined),\n (reason) => mapper(undefined, reason as TerminalError)\n ),\n this.settled\n );\n }\n\n tryCancel() {}\n\n publicPromise(): Promise<T> {\n return this.constPromise;\n }\n\n tryComplete(): Promise<void> {\n return Promise.resolve();\n }\n\n uncompletedLeaves(): Array<number> {\n return [];\n }\n\n readonly [Symbol.toStringTag] = \"ConstRestatePromise\";\n}\n\n/**\n * Promises executor, gluing VM with I/O and Promises given to user space.\n */\nexport class PromisesExecutor {\n constructor(\n private readonly coreVm: vm.WasmVM,\n private readonly inputPump: InputPump,\n private readonly outputPump: OutputPump,\n private readonly runClosuresTracker: RunClosuresTracker,\n private readonly errorCallback: (e: any) => void\n ) {}\n\n async doProgress(restatePromise: InternalRestatePromise<unknown>) {\n // Only the first time try process output\n await this.outputPump.awaitNextProgress();\n await this.doProgressInner(restatePromise);\n }\n\n private async doProgressInner(\n restatePromise: InternalRestatePromise<unknown>\n ) {\n // Try complete the promise\n try {\n await restatePromise.tryComplete();\n } catch (e) {\n // This can happen if either take_notification throws an exception or completer throws an exception.\n // This could either happen for a deserialization issue, or for an SDK bug, but we cover them here.\n this.errorCallback(e);\n return Promise.resolve();\n }\n\n // tl;dr don't touch this, or you can break combineable promises,\n // slinkydeveloper won't be happy about it\n //\n // The reason for this setTimeout is that we need to enqueue the polling after\n // we eventually resolve some promises. This is especially crucial for RestateCombinatorPromise\n // as it flips the completed state using .finally() on the combinator.\n return setImmediate().then(async () => {\n try {\n // Invoke do progress on the vm\n const handles = restatePromise.uncompletedLeaves();\n if (handles.length === 0) {\n // Completed, we're good!\n return;\n }\n const doProgressResult = this.coreVm.do_progress(\n new Uint32Array(handles)\n );\n\n if (doProgressResult === \"AnyCompleted\") {\n // Next recursion will cause the promise to do some progress\n } else if (doProgressResult === \"ReadFromInput\") {\n // Read from input\n await this.inputPump.awaitNextProgress();\n } else if (doProgressResult === \"WaitingPendingRun\") {\n // Wait for any of the pending run to complete\n await this.runClosuresTracker.awaitNextCompletedRun();\n } else if (doProgressResult === \"CancelSignalReceived\") {\n restatePromise.tryCancel();\n return;\n } else {\n // We need to execute a run closure\n this.runClosuresTracker.executeRun(doProgressResult.ExecuteRun);\n // Let the run context switch, then come back to this flow.\n await setImmediate();\n }\n\n // Recursion\n await this.doProgressInner(restatePromise);\n } catch (e) {\n // Not good, this is a retryable error.\n this.errorCallback(e);\n }\n });\n }\n}\n"],"mappings":"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"}
@@ -102,6 +102,17 @@ type ServiceHandlerOpts<I, O$1> = {
102
102
  * in that case the output value is a `Uint8Array`.
103
103
  */
104
104
  output?: Serde<O$1>;
105
+ /**
106
+ * If `true`, the output `Content-Type` declared by the output `Serde` is set
107
+ * on the response even when the serialized output is an empty byte array.
108
+ *
109
+ * This is needed for serialization formats where an empty byte array is a
110
+ * valid value (for example Protobuf, where an empty message serializes to
111
+ * zero bytes).
112
+ *
113
+ * Defaults to `false`: when the serialized output is empty, no `Content-Type` header is sent.
114
+ */
115
+ setOutputContentTypeIfEmpty?: boolean;
105
116
  /**
106
117
  * Human-readable description of the handler, shown in documentation/admin tools.
107
118
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.cts","names":[],"sources":["../../src/types/rpc.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"rpc.d.cts","names":[],"sources":["../../src/types/rpc.ts"],"sourcesContent":[],"mappings":"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"}
@@ -102,6 +102,17 @@ type ServiceHandlerOpts<I, O$1> = {
102
102
  * in that case the output value is a `Uint8Array`.
103
103
  */
104
104
  output?: Serde<O$1>;
105
+ /**
106
+ * If `true`, the output `Content-Type` declared by the output `Serde` is set
107
+ * on the response even when the serialized output is an empty byte array.
108
+ *
109
+ * This is needed for serialization formats where an empty byte array is a
110
+ * valid value (for example Protobuf, where an empty message serializes to
111
+ * zero bytes).
112
+ *
113
+ * Defaults to `false`: when the serialized output is empty, no `Content-Type` header is sent.
114
+ */
115
+ setOutputContentTypeIfEmpty?: boolean;
105
116
  /**
106
117
  * Human-readable description of the handler, shown in documentation/admin tools.
107
118
  */
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.ts","names":[],"sources":["../../src/types/rpc.ts"],"sourcesContent":[],"mappings":";;;;;;KA8CY;UACF,MAAM;EADJ,MAAA,CAAA,EAED,KAFC,CAEK,GAFL,CAAA;EACI,OAAA,CAAA,EAEJ,MAFI,CAAA,MAAA,EAAA,MAAA,CAAA;EAAN,cAAA,CAAA,EAAA,MAAA;EACO;;;EACC,IAAA,CAAA,EAAA,MAAA;AASlB,CAAA;AAMmD,cANtC,IAMsC,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA;EAAG,iBAAA,IAAA;EAArB;;;;;EAMQ,OAAA,IAAA,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,IAAA,EANR,iBAMQ,CANU,CAMV,EANa,GAMb,CAAA,CAAA,EANkB,IAMlB,CANuB,CAMvB,EAN0B,GAM1B,CAAA;EAArB,QAAA,WAAA,CAAA;EAAiB,OAAA,CAAA,CAAA,EAAjB,iBAAiB,CAAC,CAAD,EAAI,GAAJ,CAAA;AAKrC;AACgB,KADJ,iBACI,CAAA,CAAA,CAAA,GAAA;EAAN,KAAA,CAAA,EAAA,KAAA,CAAM,CAAN,CAAA;EA0BA;;;AAUV;;;;;;;;AAYA;;;;;;;;;;;;AA8HA;AAEA;EACc,KAAA,CAAA,EAvJJ,QAuJI,GAAA,MAAA;EAAK,OAAA,CAAA,EAtJP,MAsJO,CAAA,MAAA,EAAA,MAAA,CAAA;EAAE,cAAA,CAAA,EAAA,MAAA;EAA2B;;;EAGzC,IAAA,CAAA,EAAA,MAAA;CAEc;AAA4B,cAlJpC,QAkJoC,CAAA,CAAA,CAAA,CAAA;EAAT,iBAAA,IAAA;EAAa,OAAA,IAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAjJvB,iBAiJuB,CAjJL,CAiJK,CAAA,CAAA,EAjJA,QAiJA,CAjJS,CAiJT,CAAA;EAAlB,OAAA,CAAA,CAAA,EA7If,iBA6Ie,CA7IG,CA6IH,CAAA;EACN,QAAA,WAAA,CAAA;;AAAD,kBAvIX,GAAA,CAuIW;EAIhB,MAAA,IAAA,EAAA,CAAU,CAAA,EAAA,GAAA,CAAA,CAAA,IAAA,EA1Ia,iBA0Ib,CA1I+B,CA0I/B,EA1IkC,GA0IlC,CAAA,EAAA,GA1IoC,IA0IpC,CA1IoC,CA0IpC,EA1IoC,GA0IpC,CAAA;EACR,MAAA,QAAA,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAzIsB,iBAyItB,CAzIwC,CAyIxC,CAAA,EAAA,GAzI0C,QAyI1C,CAzI0C,CAyI1C,CAAA;;AAAsC,KAdxC,QAcwC,CAAA,GAAA,CAAA,GAd1B,GAc0B,SAAA,CAAA,KAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,GAdM,CAcN,GAAA,OAAA;AAAE,KAZ1C,MAY0C,CAAA,CAAA,CAAA,GAAA,QAIlC,MAfN,CAeM,IAfD,CAeC,CAfC,CAeD,CAAA,SAAA,KAAA,GAAA,KAAA,GAf4B,CAe5B,GAfgC,CAehC,CAfkC,CAelC,CAAA,UAAA,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,EAAA,KAAA,EAAA,EAAA,GAZb,WAYa,CAAA,KAAA,EAAA,CAAA,IAAA,CAAA,GAAA,IAAA,EAAA,CAAA,GAVC,CAUD,EAAA,GAAA,CAAA,IAAA,GAVe,IAUf,CAVoB,QAUpB,CAV6B,CAU7B,CAAA,EAViC,CAUjC,CAAA,CAAA,CAAA,EAAA,GATT,iBASS,CATS,CAST,CAAA,GAAA,KAAA,EAAgC;AAAT,KAL/B,UAK+B,CAAA,CAAA,CAAA,GAAA,QAAT,MAJpB,CAIoB,IAJf,CAIe,CAJb,CAIa,CAAA,SAAA,KAAA,GAAA,KAAA,GAJc,CAId,GAJkB,CAIlB,CAJoB,CAIpB,CAAA,UAAA,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,IAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAAA,IAAA,CAAA,GAAA,IAAA,EAAA,CAAA,GAAd,CAAc,EAAA,GAAA,CAAA,IAAA,GAAA,QAAA,CAAS,QAAT,CAAkB,CAAlB,CAAA,CAAA,CAAA,CAAA,EAAA,GAA4B,gBAA5B,GAAA,KAAA,EAA4B;AAqDjD,KAxCD,kBAwCC,CAAA,CAAA,EAAA,GAAA,CAAA,GAAA;EAOY;;;;;;;;;EAqKb,MAAA,CAAA,EAAA,MAAA;EAA6C;;;;AAUzD;;;;EAA0D,KAAA,CAAA,EA1MhD,KA0MgD,CA1M1C,CA0M0C,CAAA;EAmF9C;;;;;;;;EASK,MAAA,CAAA,EA5RN,KA4Rc,CA5RR,GA4RQ,CAAA;EAQI;;;EACf,WAAA,CAAA,EAAA,MAAA;EAAgB;;;EACC,QAAA,CAAA,EA5RlB,MA4RkB,CAAA,MAAA,EAAA,MAAA,CAAA;EAA1B;;;;;EAUO,oBAAA,CAAA,EA/Ra,QA+Rb,GAAA,MAAA;EACoB;;;;;;;EAMX,gBAAA,CAAA,EA7RA,QA6RA,GAAA,MAAA;EAAa;;;;;;;;;;EAmCF,iBAAA,CAAA,EApTV,QAoTU,GAAA,MAAA;EAAG;;;;;;;;;;;EAkBG,YAAA,CAAA,EAzTrB,QAyTqB,GAAA,MAAA;EAAtB;;;;;;EAyCK,cAAA,CAAA,EAAA,OAAA;EAAa;;;EAEtB,WAAA,CAAA,EAvVI,WAuVJ;EACkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyFvB,eAAA,CAAA,EAAA,CAAA,KAAA,EAAA,GAAA,EAAA,GA3Y6B,aA2Y7B,GAAA,SAAA;EAAkB;AAiCzB;;;;;;EACoD,KAAA,CAAA,EApa1C,KAoa0C,CAAA,GAAA,CAAA;EAArB;;;;;;;;AAK/B;AAsCA;;;;;;;;;;AAoNA;;;;;;;;;;;;AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;EAOyB,KAAA,CAAA,EAjpBf,aAipBe,EAAA;EAGb;AAgEZ;;;;;;EAIa,oBAAA,CAAA,EAAA,OAAA;CACD;AACgB,KA9sBhB,iBA8sBgB,CAAA,CAAA,EAAA,GAAA,CAAA,GA9sBU,kBA8sBV,CA9sB6B,CA8sB7B,EA9sBgC,GA8sBhC,CAAA,GAAA;EAAG;;;AAqC/B;;;EAGc,eAAA,CAAA,EAAA,OAAA;CAAI;AAIT,KAhvBG,mBAgvBH,CAAA,CAAA,EAAA,GAAA,CAAA,GAhvB+B,kBAgvB/B,CAhvBkD,CAgvBlD,EAhvBqD,GAgvBrD,CAAA,GAAA;EACH;;;;;;EACe,eAAA,CAAA,EAAA,OAAA;CACX;AAsEgB,KAtuBd,kBAsuBc,CAAA,CAAA,CAAA,GAtuBU,CAsuBV,UAAA,CAAA,GAAA,EAAA,KAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,EAAA,GAAA,KAAA,EAAA,IAluBtB,CAkuBsB,SAAA,IAAA,GAAA,CAAA,GAAA,EAjuBd,CAiuBc,EAAA,GAjuBR,CAiuBQ,GAhuBpB,CAguBoB,GA/tBtB,CA+tBsB;AAAtB,kBA7tBa,QAAA,CA6tBb;EAAkB;;;;;;wCArtBZ,mBAAmB,GAAG,gBAClB,gBAAgB,MAAM,QAAQ,OACvC,0BAA0B;;oDAQV,aAAa,oBAEtB,oBAAoB,GAAG,gBACnB,gBAAgB,gBAAgB,MAAM,QAAQ,OACvD,0BAA0B;oDAKZ,aAAa,wBAElB,gBAAgB,gBAAgB,MAAM,QAAQ,OACvD,0BAA0B;;;;;;;;;;kDA8BZ,aAAa,oBAEtB,oBAAoB,GAAG,gBACnB,sBAAsB,gBAAgB,MAAM,QAAQ,OAC7D,0BAA0B;;;;;;;;;;kDAcZ,aAAa,wBAElB,sBAAsB,gBAAgB,MAAM,QAAQ,OAC7D,0BAA0B;;;;;;;;;;;qDAwCZ,aAAa,oBAEtB,kBAAkB,GAAG,gBACjB,cAAc,gBAAgB,MAAM,QAAQ,OACrD,0BAA0B;;;;;;;;;;;;;qDAiBZ,aAAa,wBAElB,cAAc,gBAAgB,MAAM,QAAQ,OACrD,0BAA0B;;;;;;;;;;;;kDA6CZ,aAAa,oBAEtB,kBAAkB,GAAG,gBACjB,oBAAoB,gBAAgB,MAAM,QAAQ,OAC3D,0BAA0B;;;;;;;;;;;;kDAgBZ,aAAa,wBAElB,oBAAoB,gBAAgB,MAAM,QAAQ,OAC3D,0BAA0B;;;KAiCrB,+BACE,IAAI,EAAE,WAAW,eAAe,EAAE,IAAI,WAC9C,EAAE,KACF,eAAe,EAAE,IAAI;KAGf,WAAA;;;;;;;;;;;;;;;;;;;;oBAsBQ;;;;;;;gBAQJ;;;;;;KAQJ,cAAA;;;;;;yBAMa;;;;;;;;qBASJ;;;;;;;;;;;sBAYC;;;;;;;;;;;;iBAaL;;;;;;;;;;;gBAaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAsCoB;;;;;;UAO1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAuDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2DG;QACL;YACI,YAAY,KAAK,SAAS;;aAEzB;YACD;MACR,kBAAkB,KAAG;KA4Bb,8BACE,IAAI,EAAE,WAAW,cAAc,EAAE,IAAI,sBAC7C,EAAE,KACF,EAAE,WAAW,cAAc,EAAE,IAAI,4BAC/B,EAAE,KAEE,cAAc,EAAE,IAAI,sBACpB,cAAc,EAAE,IAAI;KAGpB,aAAA,GAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgEf;QACL;YACI,WAAW,KAAK,SAAS;;aAExB;YACD;MACR,wBAAwB,KAAG;;;;;;;;KAqCnB;aACC,wCAAwC;kBAEvC,IAAI,sEAIT,4BACH,kBACE,EAAE,WAAW,gBAAgB,EAAE,IAAI,wBACjC,EAAE,2GAEJ,EAAE,WAAW,sBAAsB,EAAE,IAAI,8BACvC,EAAE;KAIA,eAAA,GAAkB;;;;;;;sBAOR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAkDT;QACL;YACI,aAAa,KAAK,SAAS;;aAE1B;YACD;MACR,mBAAmB,KAAG"}
1
+ {"version":3,"file":"rpc.d.ts","names":[],"sources":["../../src/types/rpc.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.js","names":["opts: ClientCallOptions<I, O>","opts: ClientSendOptions<I>","parameter: unknown","opts:\n | ClientCallOptions<unknown, unknown>\n | ClientSendOptions<unknown>\n | undefined","kind: HandlerKind","handler: Function","options?:\n | ServiceHandlerOpts<unknown, unknown>\n | ObjectHandlerOpts<unknown, unknown>\n | WorkflowHandlerOpts<unknown, unknown>","req: unknown","res: unknown","workflow","service","handlers","object","runWrapper: HandlerWrapper","wrapper: HandlerWrapper"],"sources":["../../src/types/rpc.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/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-namespace */\n\nimport type {\n Context,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationPromise,\n ObjectContext,\n ObjectSharedContext,\n TypedState,\n UntypedState,\n WorkflowContext,\n WorkflowSharedContext,\n} from \"../context.js\";\n\nimport {\n type ServiceHandler,\n type ServiceDefinition,\n type ObjectHandler,\n type VirtualObjectDefinition,\n type WorkflowHandler,\n type WorkflowDefinition,\n type WorkflowSharedHandler,\n type Serde,\n type Duration,\n} from \"@restatedev/restate-sdk-core\";\nimport { ensureError, TerminalError } from \"./errors.js\";\nimport type { HooksProvider } from \"../hooks.js\";\n\n// ----------- rpc clients -------------------------------------------------------\n\nexport type ClientCallOptions<I, O> = {\n input?: Serde<I>;\n output?: Serde<O>;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n\n /**\n * Observability name, recorded in the Restate journal.\n */\n name?: string;\n};\n\nexport class Opts<I, O> {\n /**\n * Create a call configuration from the provided options.\n *\n * @param opts the call configuration\n */\n public static from<I, O>(opts: ClientCallOptions<I, O>): Opts<I, O> {\n return new Opts<I, O>(opts);\n }\n\n private constructor(private readonly opts: ClientCallOptions<I, O>) {}\n\n public getOpts(): ClientCallOptions<I, O> {\n return this.opts;\n }\n}\n\nexport type ClientSendOptions<I> = {\n input?: Serde<I>;\n /**\n * Makes a type-safe one-way RPC to the specified target service, after a delay specified by the\n * milliseconds' argument.\n * This method is like setting up a fault-tolerant cron job that enqueues the message in a\n * message queue.\n * The handler calling this function does not have to stay active for the delay time.\n *\n * Both the delay timer and the message are durably stored in Restate and guaranteed to be reliably\n * delivered. The delivery happens no earlier than specified through the delay, but may happen\n * later, if the target service is down, or backpressuring the system.\n *\n * The delay message is journaled for durable execution and will thus not be duplicated when the\n * handler is re-invoked for retries or after suspending.\n *\n * This call will return immediately; the message sending happens asynchronously in the background.\n * Despite that, the message is guaranteed to be sent, because the completion of the invocation that\n * triggers the send (calls this function) happens logically after the sending. That means that any\n * failure where the message does not reach Restate also cannot complete this invocation, and will\n * hence recover this handler and (through the durable execution) recover the message to be sent.\n *\n * @example\n * ```ts\n * ctx.serviceSendClient(Service).anotherAction(1337, { delay: { seconds: 60 } });\n * ```\n */\n delay?: Duration | number;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n\n /**\n * Observability name, recorded in the Restate journal.\n */\n name?: string;\n};\n\nexport class SendOpts<I> {\n public static from<I>(opts: ClientSendOptions<I>): SendOpts<I> {\n return new SendOpts<I>(opts);\n }\n\n public getOpts(): ClientSendOptions<I> {\n return this.opts;\n }\n\n private constructor(private readonly opts: ClientSendOptions<I>) {}\n}\n\nexport namespace rpc {\n export const opts = <I, O>(opts: ClientCallOptions<I, O>) => Opts.from(opts);\n\n export const sendOpts = <I>(opts: ClientSendOptions<I>) =>\n SendOpts.from(opts);\n}\n\nfunction optsFromArgs(args: unknown[]): {\n parameter?: unknown;\n opts?:\n | ClientCallOptions<unknown, unknown>\n | ClientSendOptions<unknown>\n | undefined;\n} {\n let parameter: unknown;\n let opts:\n | ClientCallOptions<unknown, unknown>\n | ClientSendOptions<unknown>\n | undefined;\n switch (args.length) {\n case 0: {\n break;\n }\n case 1: {\n if (args[0] instanceof Opts) {\n opts = args[0].getOpts();\n } else if (args[0] instanceof SendOpts) {\n opts = args[0].getOpts();\n } else {\n parameter = args[0];\n }\n break;\n }\n case 2: {\n parameter = args[0];\n if (args[1] instanceof Opts) {\n opts = args[1].getOpts();\n } else if (args[1] instanceof SendOpts) {\n opts = args[1].getOpts();\n } else {\n throw new TypeError(\n \"The second argument must be either Opts or SendOpts\"\n );\n }\n break;\n }\n default: {\n throw new TypeError(\"unexpected number of arguments\");\n }\n }\n return {\n parameter,\n opts,\n };\n}\n\nexport const makeRpcCallProxy = <T>(\n genericCall: (call: GenericCall<unknown, unknown>) => Promise<unknown>,\n defaultSerde: Serde<any>,\n service: string,\n key?: string\n): T => {\n const clientProxy = new Proxy(\n {},\n {\n get: (_target, prop) => {\n const method = prop as string;\n return (...args: unknown[]) => {\n const { parameter, opts } = optsFromArgs(args);\n const requestSerde = opts?.input ?? defaultSerde;\n const responseSerde =\n (opts as ClientCallOptions<unknown, unknown> | undefined)?.output ??\n defaultSerde;\n return genericCall({\n service,\n method,\n parameter,\n key,\n headers: opts?.headers,\n inputSerde: requestSerde,\n outputSerde: responseSerde,\n idempotencyKey: opts?.idempotencyKey,\n name: opts?.name,\n });\n };\n },\n }\n );\n\n return clientProxy as T;\n};\n\nexport const makeRpcSendProxy = <T>(\n genericSend: (send: GenericSend<unknown>) => void,\n defaultSerde: Serde<any>,\n service: string,\n key?: string\n): T => {\n const clientProxy = new Proxy(\n {},\n {\n get: (_target, prop) => {\n const method = prop as string;\n return (...args: unknown[]) => {\n const { parameter, opts } = optsFromArgs(args);\n const requestSerde = opts?.input ?? defaultSerde;\n const delay = (opts as ClientSendOptions<unknown> | undefined)?.delay;\n return genericSend({\n service,\n method,\n parameter,\n key,\n headers: opts?.headers,\n delay,\n inputSerde: requestSerde,\n idempotencyKey: opts?.idempotencyKey,\n name: opts?.name,\n });\n };\n },\n }\n );\n\n return clientProxy as T;\n};\n\nexport type InferArg<P> = P extends [infer A, ...any[]] ? A : unknown;\n\nexport type Client<M> = {\n [K in keyof M as M[K] extends never ? never : K]: M[K] extends (\n arg: any,\n ...args: infer P\n ) => PromiseLike<infer O>\n ? (\n ...args: [...P, ...[opts?: Opts<InferArg<P>, O>]]\n ) => InvocationPromise<O>\n : never;\n};\n\nexport type SendClient<M> = {\n [K in keyof M as M[K] extends never ? never : K]: M[K] extends (\n arg: any,\n ...args: infer P\n ) => void\n ? (...args: [...P, ...[opts?: SendOpts<InferArg<P>>]]) => InvocationHandle\n : never;\n};\n\n// ----------- handlers ----------------------------------------------\n\nexport enum HandlerKind {\n SERVICE,\n EXCLUSIVE,\n SHARED,\n WORKFLOW,\n}\n\nexport type ServiceHandlerOpts<I, O> = {\n /**\n * Defines which Content-Type values are accepted when this handler is invoked via the ingress.\n * Wildcards are supported, for example `application/*` or `* / *`.\n *\n * If unset, `input.contentType` will be used as the default.\n *\n * This setting does not affect deserialization. To customize how the input is deserialized,\n * provide an `input` Serde.\n */\n accept?: string;\n\n /**\n * Serde used to deserialize the input parameter.\n * Defaults to `restate.serde.json`.\n *\n * Provide a custom Serde if the input is not JSON, or use\n * `restate.serde.binary` to skip serialization/deserialization altogether;\n * in that case the input parameter is a `Uint8Array`.\n */\n input?: Serde<I>;\n\n /**\n * Serde used to serialize the output value.\n * Defaults to `restate.serde.json`.\n *\n * Provide a custom Serde if the output is not JSON, or use\n * `restate.serde.binary` to skip serialization/deserialization altogether;\n * in that case the output value is a `Uint8Array`.\n */\n output?: Serde<O>;\n\n /**\n * Human-readable description of the handler, shown in documentation/admin tools.\n */\n description?: string;\n\n /**\n * Arbitrary key/value metadata for the handler. Exposed via the Admin API.\n */\n metadata?: Record<string, string>;\n\n /**\n * The retention duration of idempotent requests to this handler.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n idempotencyRetention?: Duration | number;\n\n /**\n * The journal retention for invocations to this handler.\n *\n * When a request has an idempotency key, `idempotencyRetention` caps the journal retention time.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n journalRetention?: Duration | number;\n\n /**\n * Guards against stalled invocations. Once this timeout expires, Restate requests a graceful\n * suspension of the invocation (preserving intermediate progress).\n *\n * If the invocation does not react to the suspension request, `abortTimeout` is used to abort it.\n *\n * Overrides the inactivity timeout set at the service level and the default configured in the Restate server.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n inactivityTimeout?: Duration | number;\n\n /**\n * Guards against invocations that fail to terminate after inactivity.\n * The abort timeout starts after `inactivityTimeout` expires and a graceful termination was requested.\n * When this timer expires, the invocation is aborted.\n *\n * This timer may interrupt user code. If more time is needed for graceful termination, increase this value.\n *\n * Overrides the abort timeout set at the service level and the default configured in the Restate server.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n abortTimeout?: Duration | number;\n\n /**\n * When set to `true`, this handler cannot be invoked via the Restate server HTTP or Kafka ingress;\n * it can only be called from other services.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n ingressPrivate?: boolean;\n\n /**\n * Retry policy to apply to all requests to this handler. For each unspecified field, the default value configured in the service or, if absent, in the restate-server configuration file, will be applied instead.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * By default, Restate treats errors as terminal (non-retryable) only when they are instances of `TerminalError`.\n *\n * Use this hook to map domain-specific errors to `TerminalError` (or return `undefined` to keep them retryable).\n * When mapped to `TerminalError`, the error will not be retried.\n *\n * Note: This applies to errors thrown inside `ctx.run` closures as well as errors thrown by Restate handlers.\n *\n * Example:\n *\n * ```ts\n * class MyValidationError extends Error {}\n *\n * const greeter = restate.service({\n * name: \"greeter\",\n * handlers: {\n * greet: async (ctx: restate.Context, name: string) => {\n * if (name.length === 0) {\n * throw new MyValidationError(\"Length too short\");\n * }\n * return `Hello ${name}`;\n * }\n * },\n * options: {\n * asTerminalError: (err) => {\n * if (err instanceof MyValidationError) {\n * // My validation error is terminal\n * return new restate.TerminalError(err.message, { errorCode: 400 });\n * }\n *\n * // Any other error is retryable\n * }\n * }\n * });\n * ```\n */\n asTerminalError?: (error: any) => TerminalError | undefined;\n\n /**\n * Default serde to use for requests, responses, state, side effects, awakeables, promises. Used when no other serde is specified.\n *\n * If not provided, defaults to `serde.json`.\n *\n * The input or output of this handler can be overridden using the `input`/`output` fields\n */\n serde?: Serde<any>;\n\n /**\n * Hooks providers for this handler. Handler-level hooks wrap innermost —\n * they run after service-level hooks. Both levels are merged: service\n * hooks first, then handler hooks. Within each level, hooks execute in\n * array order: for `[A, B]`: A before → B before → handler → B after → A after.\n *\n * The `handler` interceptor fires on every attempt. The `run` interceptor\n * fires only when the `ctx.run()` closure actually executes — replayed\n * runs (already in the journal) are skipped.\n *\n * Errors thrown at any point (before or after `next()`) affect the invocation:\n * {@link TerminalError} fails immediately, any other error triggers a retry.\n * On suspension or pause, `next()` also rejects — do any cleanup and rethrow.\n *\n * @example\n * ```ts\n * const myService = restate.service({\n * name: \"MyService\",\n * handlers: {\n * greet: restate.createServiceHandler(\n * {\n * hooks: [\n * (ctx) => ({\n * interceptor: {\n * handler: async (next) => {\n * console.log(`before ${ctx.request.target}`);\n * try {\n * await next();\n * console.log(`after ${ctx.request.target}`);\n * } catch (e) {\n * console.log(`error ${ctx.request.target}: ${e}`);\n * // Always rethrow — swallowing the error changes the\n * // invocation outcome. You can also throw a different\n * // error (e.g. TerminalError to fail immediately).\n * throw e;\n * }\n * },\n * run: async (name, next) => {\n * console.log(` before run \"${name}\"`);\n * try {\n * await next();\n * console.log(` after run \"${name}\"`);\n * } catch (e) {\n * console.log(` error run \"${name}\": ${e}`);\n * throw e;\n * }\n * },\n * },\n * }),\n * ],\n * },\n * async (ctx, name) => `Hello, ${name}!`\n * ),\n * },\n * });\n * ```\n */\n hooks?: HooksProvider[];\n\n /**\n * When set to `true`, the SDK will stop automatically propagating cancellations when awaiting {@link RestatePromise}s.\n *\n * Instead, the user code must explicitly listen to cancellations using the `ctx.cancellation()` API in {@link ContextInternal}.\n *\n * @experimental\n */\n explicitCancellation?: boolean;\n};\n\nexport type ObjectHandlerOpts<I, O> = ServiceHandlerOpts<I, O> & {\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this handler.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\nexport type WorkflowHandlerOpts<I, O> = ServiceHandlerOpts<I, O> & {\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this handler.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\nconst HANDLER_SYMBOL = Symbol(\"Handler\");\n\nexport class HandlerWrapper {\n public static from(\n kind: HandlerKind,\n handler: Function,\n opts?:\n | ServiceHandlerOpts<unknown, unknown>\n | ObjectHandlerOpts<unknown, unknown>\n | WorkflowHandlerOpts<unknown, unknown>\n ): HandlerWrapper {\n // we must create here a copy of the handler\n // to be able to reuse the original handler in other places.\n // like for example the same logic but under different routes.\n const handlerCopy = function (this: any, ...args: any[]): any {\n return handler.apply(this, args);\n };\n\n return new HandlerWrapper(kind, handlerCopy, opts);\n }\n\n public static fromHandler(handler: any): HandlerWrapper | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return handler[HANDLER_SYMBOL] as HandlerWrapper | undefined;\n }\n\n private constructor(\n public readonly kind: HandlerKind,\n private handler: Function,\n public readonly options?:\n | ServiceHandlerOpts<unknown, unknown>\n | ObjectHandlerOpts<unknown, unknown>\n | WorkflowHandlerOpts<unknown, unknown>\n ) {}\n\n bindInstance(t: unknown) {\n this.handler = this.handler.bind(t) as Function;\n }\n\n async invoke(context: { defaultSerde: Serde<any> }, input: Uint8Array) {\n let req: unknown;\n try {\n req = (this.options?.input ?? context.defaultSerde).deserialize(input);\n } catch (e) {\n const error = ensureError(e);\n throw new TerminalError(`Failed to deserialize input: ${error.message}`, {\n errorCode: 400,\n });\n }\n\n const res: unknown = await this.handler(context, req);\n return (this.options?.output ?? context.defaultSerde).serialize(res);\n }\n\n /**\n * Instead of a HandlerWrapper with a handler property,\n * return the original handler with a HandlerWrapper property.\n * This is needed to keep the appearance of regular functions\n * bound to an object, so that for example, `this.foo(ctx, arg)` would\n * work.\n */\n transpose<F>(): F {\n const handler = this.handler;\n const existing = HandlerWrapper.fromHandler(handler);\n if (existing !== undefined) {\n return handler as F;\n }\n Object.defineProperty(handler, HANDLER_SYMBOL, { value: this });\n return handler as F;\n }\n}\n\n// ----------- handler decorators ----------------------------------------------\nexport type RemoveVoidArgument<F> = F extends (\n ctx: infer C,\n arg: infer A\n) => infer R\n ? A extends void\n ? (ctx: C) => R\n : F\n : F;\n\nexport namespace handlers {\n /**\n * Create a service handler.\n *\n * @param opts additional configuration\n * @param fn the actual handler code to execute\n */\n export function handler<O, I = void>(\n opts: ServiceHandlerOpts<I, O>,\n fn: (ctx: Context, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn> {\n return HandlerWrapper.from(HandlerKind.SERVICE, fn, opts).transpose();\n }\n\n export namespace workflow {\n export function workflow<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: WorkflowHandlerOpts<I, O>,\n fn: (ctx: WorkflowContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n export function workflow<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: WorkflowContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n export function workflow<O, I = void>(\n optsOrFn:\n | WorkflowHandlerOpts<I, O>\n | ((ctx: WorkflowContext, input: I) => Promise<O>),\n fn?: (ctx: WorkflowContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.WORKFLOW, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies WorkflowHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.WORKFLOW, fn, opts).transpose();\n }\n\n /**\n * Creates a shared handler for a workflow.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: WorkflowHandlerOpts<I, O>,\n fn: (ctx: WorkflowSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a workflow.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: WorkflowSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a workflow\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<O, I = void>(\n optsOrFn:\n | WorkflowHandlerOpts<I, O>\n | ((ctx: WorkflowSharedContext, input: I) => Promise<O>),\n fn?: (ctx: WorkflowSharedContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.SHARED, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies ObjectHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.SHARED, fn, opts).transpose();\n }\n }\n\n export namespace object {\n /**\n * Creates an exclusive handler for a virtual Object.\n *\n * note : This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function exclusive<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: ObjectHandlerOpts<I, O>,\n fn: (ctx: ObjectContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates an exclusive handler for a virtual Object.\n *\n *\n * note 1: This applies only to a virtual object.\n * note 2: This is the default for virtual objects, so if no\n * additional reconfiguration is needed, you can simply\n * use the handler directly (no need to use exclusive).\n * This variant here is only for symmetry/convenance.\n *\n * @param fn the handler to execute\n */\n export function exclusive<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: ObjectContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates an exclusive handler for a virtual Object.\n *\n *\n * note 1: This applies only to a virtual object.\n * note 2: This is the default for virtual objects, so if no\n * additional reconfiguration is needed, you can simply\n * use the handler directly (no need to use exclusive).\n * This variant here is only for symmetry/convenance.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function exclusive<O, I = void>(\n optsOrFn:\n | ObjectHandlerOpts<I, O>\n | ((ctx: ObjectContext, input: I) => Promise<O>),\n fn?: (ctx: ObjectContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.EXCLUSIVE, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies ObjectHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.EXCLUSIVE, fn, opts).transpose();\n }\n\n /**\n * Creates a shared handler for a virtual Object.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * note: This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: ObjectHandlerOpts<I, O>,\n fn: (ctx: ObjectSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a virtual Object.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * note: This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: ObjectSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a virtual Object.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * note: This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<I, O>(\n optsOrFn:\n | ObjectHandlerOpts<I, O>\n | ((ctx: ObjectSharedContext, input: I) => Promise<O>),\n fn?: (ctx: ObjectSharedContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.SHARED, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies ObjectHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.SHARED, fn, opts).transpose();\n }\n }\n}\n\n// ----------- services ----------------------------------------------\n\nexport type ServiceOpts<U> = {\n [K in keyof U]: U[K] extends ServiceHandler<U[K], Context>\n ? U[K]\n : ServiceHandler<U[K], Context>;\n};\n\nexport type RetryPolicy = {\n /**\n * Max number of retry attempts (including the initial).\n * When reached, the behavior specified in {@link onMaxAttempts} will be applied.\n */\n maxAttempts?: number;\n\n /**\n * What to do when max attempts are reached.\n *\n * If `pause`, the invocation will enter the paused state and can be manually resumed from the CLI/UI.\n *\n * If `kill`, the invocation will get automatically killed.\n */\n onMaxAttempts?: \"pause\" | \"kill\";\n\n /**\n * Initial interval for the first retry attempt.\n * Retry interval will grow by a factor specified in `exponentiationFactor`.\n *\n * If a number is provided, it will be interpreted as milliseconds.\n */\n initialInterval?: Duration | number;\n\n /**\n * Max interval between retries.\n * Retry interval will grow by a factor specified in `exponentiationFactor`.\n *\n * If a number is provided, it will be interpreted as milliseconds.\n */\n maxInterval?: Duration | number;\n\n /**\n * Exponentiation factor to use when computing the next retry delay.\n */\n exponentiationFactor?: number;\n};\n\nexport type ServiceOptions = {\n /**\n * The retention duration of idempotent requests to this service.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n idempotencyRetention?: Duration | number;\n\n /**\n * Journal retention applied to all requests to all handlers of this service.\n *\n * When a request includes an idempotency key, `idempotencyRetention` caps the journal retention time.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n journalRetention?: Duration | number;\n\n /**\n * Guards against stalled invocations. Once this timeout expires, Restate requests a graceful\n * suspension of the invocation (preserving intermediate progress).\n *\n * If the invocation does not react to the suspension request, `abortTimeout` is used to abort it.\n *\n * Overrides the default inactivity timeout configured in the Restate server for all invocations to this service.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n inactivityTimeout?: Duration | number;\n\n /**\n * Guards against invocations that fail to terminate after inactivity.\n * The abort timeout starts after `inactivityTimeout` expires and a graceful termination was requested.\n * When this timer expires, the invocation is aborted.\n *\n * This timer may interrupt user code. If more time is needed for graceful termination, increase this value.\n *\n * Overrides the default abort timeout configured in the Restate server for invocations to this service.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n abortTimeout?: Duration | number;\n\n /**\n * When set to `true`, this service (and all its handlers) cannot be invoked via the Restate server\n * HTTP or Kafka ingress; it can only be called from other services.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n ingressPrivate?: boolean;\n\n /**\n * Retry policy to apply to all requests to this service. For each unspecified field, the default value configured in the restate-server configuration file will be applied instead.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * By default, Restate treats errors as terminal (non-retryable) only when they are instances of `TerminalError`.\n *\n * Use this hook to map domain-specific errors to `TerminalError` (or return `undefined` to keep them retryable).\n * When mapped to `TerminalError`, the error will not be retried.\n *\n * Note: This applies to errors thrown inside `ctx.run` closures as well as errors thrown by Restate handlers.\n *\n * Example:\n *\n * ```ts\n * class MyValidationError extends Error {}\n *\n * const greeter = restate.service({\n * name: \"greeter\",\n * handlers: {\n * greet: async (ctx: restate.Context, name: string) => {\n * if (name.length === 0) {\n * throw new MyValidationError(\"Length too short\");\n * }\n * return `Hello ${name}`;\n * }\n * },\n * options: {\n * asTerminalError: (err) => {\n * if (err instanceof MyValidationError) {\n * // My validation error is terminal\n * return new restate.TerminalError(err.message, { errorCode: 400 });\n * }\n *\n * // Any other error is retryable\n * }\n * }\n * });\n * ```\n */\n asTerminalError?: (error: any) => TerminalError | undefined;\n\n /**\n * Default serde to use for requests, responses, state, side effects, awakeables, promises. Used when no other serde is specified.\n *\n * If not provided, defaults to `serde.json`.\n */\n serde?: Serde<any>;\n\n /**\n * Hooks providers for this service. Service-level hooks wrap outermost —\n * they run before handler-level hooks. Both levels are merged: service\n * hooks first, then handler hooks. Within each level, hooks execute in\n * array order: for `[A, B]`: A before → B before → handler → B after → A after.\n *\n * The `handler` interceptor fires on every attempt. The `run` interceptor\n * fires only when the `ctx.run()` closure actually executes — replayed\n * runs (already in the journal) are skipped.\n *\n * Errors thrown at any point (before or after `next()`) affect the invocation:\n * {@link TerminalError} fails immediately, any other error triggers a retry.\n * On suspension or pause, `next()` also rejects — do any cleanup and rethrow.\n *\n * @example\n * ```ts\n * const myService = restate.service({\n * name: \"MyService\",\n * handlers: { greet: async (ctx, name) => `Hello, ${name}!` },\n * options: {\n * hooks: [\n * (ctx) => ({\n * interceptor: {\n * handler: async (next) => {\n * console.log(`before ${ctx.request.target}`);\n * try {\n * await next();\n * console.log(`after ${ctx.request.target}`);\n * } catch (e) {\n * console.log(`error ${ctx.request.target}: ${e}`);\n * // Always rethrow — swallowing the error changes the\n * // invocation outcome. You can also throw a different\n * // error (e.g. TerminalError to fail immediately).\n * throw e;\n * }\n * },\n * run: async (name, next) => {\n * console.log(` before run \"${name}\"`);\n * try {\n * await next();\n * console.log(` after run \"${name}\"`);\n * } catch (e) {\n * console.log(` error run \"${name}\": ${e}`);\n * throw e;\n * }\n * },\n * },\n * }),\n * ],\n * },\n * });\n * ```\n */\n hooks?: HooksProvider[];\n\n /**\n * When set to `true`, the SDK will stop automatically propagating cancellations when awaiting {@link RestatePromise}s.\n *\n * Instead, the user code must explicitly listen to cancellations using the `ctx.cancellation()` API in {@link ContextInternal}.\n *\n * @experimental\n */\n explicitCancellation?: boolean;\n};\n\n/**\n * Define a Restate service.\n *\n * @example Here is an example of how to define a service:\n *\n * ```ts\n * const greeter = service({\n * name: \"greeter\",\n * handlers: {\n * greet: async (ctx: Context, name: string) => {\n * return `Hello ${name}`;\n * }\n * }\n * });\n * ```\n *\n * To use the service, you can bind it to an endpoint:\n * ```\n * ...\n * endpoint.bind(greeter)\n * ```\n * @example To use a service, you can export its type to be used in a client:\n * ```\n * export type Greeter = typeof greeter;\n * ...\n * ...\n * import type { Greeter } from \"./greeter\";\n * const client = ctx.serviceClient<Greeter>({ name : \"greeter\"});\n * client.greet(\"World\").then(console.log);\n * ```\n *\n * @example Alternatively to avoid repeating the service name, you can:\n * ```\n * import type {Greeter} from \"./greeter\";\n * const Greeter: Greeter = { name : \"greeter\"};\n *\n * // now you can reference the service like this:\n * const client = ctx.serviceClient(Greeter);\n * ```\n *\n * @param name the service name\n * @param handlers the handlers for the service\n * @param description an optional description for the service\n * @param metadata an optional metadata for the service\n * @type P the name of the service\n * @type M the handlers for the service\n */\nexport const service = <P extends string, M>(service: {\n name: P;\n handlers: ServiceOpts<M> & ThisType<M>;\n description?: string;\n metadata?: Record<string, string>;\n options?: ServiceOptions;\n}): ServiceDefinition<P, M> => {\n if (!service.handlers) {\n throw new Error(\"service must be defined\");\n }\n const handlers = Object.entries(service.handlers).map(([name, handler]) => {\n if (handler instanceof Function) {\n if (HandlerWrapper.fromHandler(handler) !== undefined) {\n return [name, handler];\n }\n return [\n name,\n HandlerWrapper.from(HandlerKind.SERVICE, handler).transpose(),\n ];\n }\n throw new TypeError(`Unexpected handler type ${name}`);\n });\n\n return {\n name: service.name,\n service: Object.fromEntries(handlers) as object,\n metadata: service.metadata,\n description: service.description,\n options: service.options,\n } as ServiceDefinition<P, M>;\n};\n\n// ----------- objects ----------------------------------------------\n\nexport type ObjectOpts<U> = {\n [K in keyof U]: U[K] extends ObjectHandler<U[K], ObjectContext<any>>\n ? U[K]\n : U[K] extends ObjectHandler<U[K], ObjectSharedContext<any>>\n ? U[K]\n :\n | ObjectHandler<U[K], ObjectContext<any>>\n | ObjectHandler<U[K], ObjectSharedContext<any>>;\n};\n\nexport type ObjectOptions = ServiceOptions & {\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this service.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\n/**\n * Define a Restate virtual object.\n *\n * @example Here is an example of how to define a virtual object:\n * ```ts\n * const counter = object({\n * name: \"counter\",\n * handlers: {\n * add: async (ctx: ObjectContext, amount: number) => {},\n * get: async (ctx: ObjectContext) => {}\n * }\n * })\n * ```\n *\n * @example To use the object, you can bind it to an endpoint:\n * ```ts\n * ...\n * endpoint.bind(counter)\n * ```\n *\n * @see to interact with the object, you can use the object client:\n * ```ts\n * ...\n * const client = ctx.objectClient<typeof counter>({ name: \"counter\"});\n * const res = await client.add(1)\n * ```\n *\n * ### Shared handlers\n *\n * Shared handlers are used to allow concurrent read-only access to the object.\n * This is useful when you want to allow multiple clients to read the object's state at the same time.\n * To define a shared handler, you can use the `shared` decorator as shown below:\n *\n * ```ts\n * const counter = object({\n * name: \"counter\",\n * handlers: {\n *\n * add: async (ctx: ObjectContext, amount: number) => { .. },\n *\n * get: handlers.object.shared(async (ctx: ObjectSharedContext) => {\n * return ctx.get<number>(\"count\");\n * })\n * }\n * });\n * ```\n *\n * @param name the name of the object\n * @param handlers the handlers for the object\n * @param description an optional description for the object\n * @param metadata an optional metadata for the object\n * @type P the name of the object\n * @type M the handlers for the object\n */\nexport const object = <P extends string, M>(object: {\n name: P;\n handlers: ObjectOpts<M> & ThisType<M>;\n description?: string;\n metadata?: Record<string, string>;\n options?: ObjectOptions;\n}): VirtualObjectDefinition<P, M> => {\n if (!object.handlers) {\n throw new Error(\"object options must be defined\");\n }\n\n const handlers = Object.entries(object.handlers).map(([name, handler]) => {\n if (handler instanceof Function) {\n if (HandlerWrapper.fromHandler(handler) !== undefined) {\n return [name, handler];\n }\n\n return [\n name,\n HandlerWrapper.from(HandlerKind.EXCLUSIVE, handler).transpose(),\n ];\n }\n throw new TypeError(`Unexpected handler type ${name}`);\n });\n\n return {\n name: object.name,\n object: Object.fromEntries(handlers) as object,\n metadata: object.metadata,\n description: object.description,\n options: object.options,\n } as VirtualObjectDefinition<P, M>;\n};\n\n// ----------- workflows ----------------------------------------------\n\n/**\n * A workflow handlers is a type that describes the handlers for a workflow.\n * The handlers must contain exactly one handler named 'run', and this handler must accept as a first argument a WorkflowContext.\n * It can contain any number of additional handlers, which must accept as a first argument a WorkflowSharedContext.\n * The handlers can not be named 'workflowSubmit', 'workflowAttach', 'workflowOutput' - as these are reserved.\n * @see {@link workflow} for an example.\n */\nexport type WorkflowOpts<U> = {\n run: (ctx: WorkflowContext<any>, argument: any) => Promise<any>;\n} & {\n [K in keyof U]: K extends\n | \"workflowSubmit\"\n | \"workflowAttach\"\n | \"workflowOutput\"\n ? `${K} is a reserved keyword`\n : K extends \"run\"\n ? U[K] extends WorkflowHandler<U[K], WorkflowContext<any>>\n ? U[K]\n : \"An handler named 'run' must take as a first argument a WorkflowContext, and must return a Promise\"\n : U[K] extends WorkflowSharedHandler<U[K], WorkflowSharedContext<any>>\n ? U[K]\n : \"An handler other then 'run' must accept as a first argument a WorkflowSharedContext\";\n};\n\nexport type WorkflowOptions = ServiceOptions & {\n /**\n * The retention duration for this workflow.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n workflowRetention?: Duration | number;\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this service.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\n/**\n * Define a Restate workflow.\n *\n *\n * @example Here is an example of how to define a workflow:\n * ```ts\n * const mywf = workflow({\n * name: \"mywf\",\n * handlers: {\n * run: async (ctx: WorkflowContext, argument: any) => {\n * return \"Hello World\";\n * }\n * }\n * });\n * ```\n *\n * ### Note:\n * * That a workflow must contain exactly one handler named 'run', and this handler must accept as a first argument a WorkflowContext.\n * * The workflow handlers other than 'run' must accept as a first argument a WorkflowSharedContext.\n * * The workflow handlers can not be named 'workflowSubmit', 'workflowAttach', 'workflowOutput' - as these are reserved keywords.\n *\n * @example To use the workflow, you can bind it to an endpoint:\n * ```ts\n * endpoint.bind(mywf)\n * ```\n *\n * @example To interact with the workflow, you can use the workflow client:\n * ```ts\n * const client = ctx.workflowClient<typeof mywf>({ name: \"mywf\"});\n * const res = await client.run(\"Hello\");\n * ```\n *\n * To use the workflow client from any other environment (like a browser), please refer to the documentation.\n * https://docs.restate.dev\n *\n *\n *\n * @param name the workflow name\n * @param handlers the handlers for the workflow.\n */\nexport const workflow = <P extends string, M>(workflow: {\n name: P;\n handlers: WorkflowOpts<M> & ThisType<M>;\n description?: string;\n metadata?: Record<string, string>;\n options?: WorkflowOptions;\n}): WorkflowDefinition<P, M> => {\n if (!workflow.handlers) {\n throw new Error(\"workflow must contain handlers\");\n }\n\n //\n // Add the main 'run' handler\n //\n const runHandler = workflow.handlers[\"run\"];\n let runWrapper: HandlerWrapper;\n\n if (runHandler instanceof HandlerWrapper) {\n runWrapper = runHandler;\n } else if (runHandler instanceof Function) {\n runWrapper =\n HandlerWrapper.fromHandler(runHandler) ??\n HandlerWrapper.from(HandlerKind.WORKFLOW, runHandler);\n } else {\n throw new TypeError(`Missing main workflow handler, named 'run'`);\n }\n if (runWrapper.kind !== HandlerKind.WORKFLOW) {\n throw new TypeError(\n `Workflow's main handler handler run, must be of type workflow'`\n );\n }\n\n const handlers = [[\"run\", runWrapper.transpose()]];\n\n //\n // Add all the shared handlers now\n //\n\n for (const [name, handler] of Object.entries(workflow.handlers)) {\n if (name === \"run\") {\n continue;\n }\n let wrapper: HandlerWrapper;\n\n if (handler instanceof HandlerWrapper) {\n wrapper = handler;\n } else if (handler instanceof Function) {\n wrapper =\n HandlerWrapper.fromHandler(handler) ??\n HandlerWrapper.from(HandlerKind.SHARED, handler);\n } else {\n throw new TypeError(`Unexpected handler type ${name}`);\n }\n if (wrapper.kind === HandlerKind.WORKFLOW) {\n throw new TypeError(\n `A workflow must contain exactly one handler annotated as workflow, named 'run'. Please use a shared handler for any additional handlers`\n );\n }\n handlers.push([name, wrapper.transpose()]);\n }\n\n return {\n name: workflow.name,\n workflow: Object.fromEntries(handlers) as object,\n metadata: workflow.metadata,\n description: workflow.description,\n options: workflow.options,\n } as WorkflowDefinition<P, M>;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"rpc.js","names":["opts: ClientCallOptions<I, O>","opts: ClientSendOptions<I>","parameter: unknown","opts:\n | ClientCallOptions<unknown, unknown>\n | ClientSendOptions<unknown>\n | undefined","kind: HandlerKind","handler: Function","options?:\n | ServiceHandlerOpts<unknown, unknown>\n | ObjectHandlerOpts<unknown, unknown>\n | WorkflowHandlerOpts<unknown, unknown>","req: unknown","res: unknown","workflow","service","handlers","object","runWrapper: HandlerWrapper","wrapper: HandlerWrapper"],"sources":["../../src/types/rpc.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/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-namespace */\n\nimport type {\n Context,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationPromise,\n ObjectContext,\n ObjectSharedContext,\n TypedState,\n UntypedState,\n WorkflowContext,\n WorkflowSharedContext,\n} from \"../context.js\";\n\nimport {\n type ServiceHandler,\n type ServiceDefinition,\n type ObjectHandler,\n type VirtualObjectDefinition,\n type WorkflowHandler,\n type WorkflowDefinition,\n type WorkflowSharedHandler,\n type Serde,\n type Duration,\n} from \"@restatedev/restate-sdk-core\";\nimport { ensureError, TerminalError } from \"./errors.js\";\nimport type { HooksProvider } from \"../hooks.js\";\n\n// ----------- rpc clients -------------------------------------------------------\n\nexport type ClientCallOptions<I, O> = {\n input?: Serde<I>;\n output?: Serde<O>;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n\n /**\n * Observability name, recorded in the Restate journal.\n */\n name?: string;\n};\n\nexport class Opts<I, O> {\n /**\n * Create a call configuration from the provided options.\n *\n * @param opts the call configuration\n */\n public static from<I, O>(opts: ClientCallOptions<I, O>): Opts<I, O> {\n return new Opts<I, O>(opts);\n }\n\n private constructor(private readonly opts: ClientCallOptions<I, O>) {}\n\n public getOpts(): ClientCallOptions<I, O> {\n return this.opts;\n }\n}\n\nexport type ClientSendOptions<I> = {\n input?: Serde<I>;\n /**\n * Makes a type-safe one-way RPC to the specified target service, after a delay specified by the\n * milliseconds' argument.\n * This method is like setting up a fault-tolerant cron job that enqueues the message in a\n * message queue.\n * The handler calling this function does not have to stay active for the delay time.\n *\n * Both the delay timer and the message are durably stored in Restate and guaranteed to be reliably\n * delivered. The delivery happens no earlier than specified through the delay, but may happen\n * later, if the target service is down, or backpressuring the system.\n *\n * The delay message is journaled for durable execution and will thus not be duplicated when the\n * handler is re-invoked for retries or after suspending.\n *\n * This call will return immediately; the message sending happens asynchronously in the background.\n * Despite that, the message is guaranteed to be sent, because the completion of the invocation that\n * triggers the send (calls this function) happens logically after the sending. That means that any\n * failure where the message does not reach Restate also cannot complete this invocation, and will\n * hence recover this handler and (through the durable execution) recover the message to be sent.\n *\n * @example\n * ```ts\n * ctx.serviceSendClient(Service).anotherAction(1337, { delay: { seconds: 60 } });\n * ```\n */\n delay?: Duration | number;\n headers?: Record<string, string>;\n idempotencyKey?: string;\n\n /**\n * Observability name, recorded in the Restate journal.\n */\n name?: string;\n};\n\nexport class SendOpts<I> {\n public static from<I>(opts: ClientSendOptions<I>): SendOpts<I> {\n return new SendOpts<I>(opts);\n }\n\n public getOpts(): ClientSendOptions<I> {\n return this.opts;\n }\n\n private constructor(private readonly opts: ClientSendOptions<I>) {}\n}\n\nexport namespace rpc {\n export const opts = <I, O>(opts: ClientCallOptions<I, O>) => Opts.from(opts);\n\n export const sendOpts = <I>(opts: ClientSendOptions<I>) =>\n SendOpts.from(opts);\n}\n\nfunction optsFromArgs(args: unknown[]): {\n parameter?: unknown;\n opts?:\n | ClientCallOptions<unknown, unknown>\n | ClientSendOptions<unknown>\n | undefined;\n} {\n let parameter: unknown;\n let opts:\n | ClientCallOptions<unknown, unknown>\n | ClientSendOptions<unknown>\n | undefined;\n switch (args.length) {\n case 0: {\n break;\n }\n case 1: {\n if (args[0] instanceof Opts) {\n opts = args[0].getOpts();\n } else if (args[0] instanceof SendOpts) {\n opts = args[0].getOpts();\n } else {\n parameter = args[0];\n }\n break;\n }\n case 2: {\n parameter = args[0];\n if (args[1] instanceof Opts) {\n opts = args[1].getOpts();\n } else if (args[1] instanceof SendOpts) {\n opts = args[1].getOpts();\n } else {\n throw new TypeError(\n \"The second argument must be either Opts or SendOpts\"\n );\n }\n break;\n }\n default: {\n throw new TypeError(\"unexpected number of arguments\");\n }\n }\n return {\n parameter,\n opts,\n };\n}\n\nexport const makeRpcCallProxy = <T>(\n genericCall: (call: GenericCall<unknown, unknown>) => Promise<unknown>,\n defaultSerde: Serde<any>,\n service: string,\n key?: string\n): T => {\n const clientProxy = new Proxy(\n {},\n {\n get: (_target, prop) => {\n const method = prop as string;\n return (...args: unknown[]) => {\n const { parameter, opts } = optsFromArgs(args);\n const requestSerde = opts?.input ?? defaultSerde;\n const responseSerde =\n (opts as ClientCallOptions<unknown, unknown> | undefined)?.output ??\n defaultSerde;\n return genericCall({\n service,\n method,\n parameter,\n key,\n headers: opts?.headers,\n inputSerde: requestSerde,\n outputSerde: responseSerde,\n idempotencyKey: opts?.idempotencyKey,\n name: opts?.name,\n });\n };\n },\n }\n );\n\n return clientProxy as T;\n};\n\nexport const makeRpcSendProxy = <T>(\n genericSend: (send: GenericSend<unknown>) => void,\n defaultSerde: Serde<any>,\n service: string,\n key?: string\n): T => {\n const clientProxy = new Proxy(\n {},\n {\n get: (_target, prop) => {\n const method = prop as string;\n return (...args: unknown[]) => {\n const { parameter, opts } = optsFromArgs(args);\n const requestSerde = opts?.input ?? defaultSerde;\n const delay = (opts as ClientSendOptions<unknown> | undefined)?.delay;\n return genericSend({\n service,\n method,\n parameter,\n key,\n headers: opts?.headers,\n delay,\n inputSerde: requestSerde,\n idempotencyKey: opts?.idempotencyKey,\n name: opts?.name,\n });\n };\n },\n }\n );\n\n return clientProxy as T;\n};\n\nexport type InferArg<P> = P extends [infer A, ...any[]] ? A : unknown;\n\nexport type Client<M> = {\n [K in keyof M as M[K] extends never ? never : K]: M[K] extends (\n arg: any,\n ...args: infer P\n ) => PromiseLike<infer O>\n ? (\n ...args: [...P, ...[opts?: Opts<InferArg<P>, O>]]\n ) => InvocationPromise<O>\n : never;\n};\n\nexport type SendClient<M> = {\n [K in keyof M as M[K] extends never ? never : K]: M[K] extends (\n arg: any,\n ...args: infer P\n ) => void\n ? (...args: [...P, ...[opts?: SendOpts<InferArg<P>>]]) => InvocationHandle\n : never;\n};\n\n// ----------- handlers ----------------------------------------------\n\nexport enum HandlerKind {\n SERVICE,\n EXCLUSIVE,\n SHARED,\n WORKFLOW,\n}\n\nexport type ServiceHandlerOpts<I, O> = {\n /**\n * Defines which Content-Type values are accepted when this handler is invoked via the ingress.\n * Wildcards are supported, for example `application/*` or `* / *`.\n *\n * If unset, `input.contentType` will be used as the default.\n *\n * This setting does not affect deserialization. To customize how the input is deserialized,\n * provide an `input` Serde.\n */\n accept?: string;\n\n /**\n * Serde used to deserialize the input parameter.\n * Defaults to `restate.serde.json`.\n *\n * Provide a custom Serde if the input is not JSON, or use\n * `restate.serde.binary` to skip serialization/deserialization altogether;\n * in that case the input parameter is a `Uint8Array`.\n */\n input?: Serde<I>;\n\n /**\n * Serde used to serialize the output value.\n * Defaults to `restate.serde.json`.\n *\n * Provide a custom Serde if the output is not JSON, or use\n * `restate.serde.binary` to skip serialization/deserialization altogether;\n * in that case the output value is a `Uint8Array`.\n */\n output?: Serde<O>;\n\n /**\n * If `true`, the output `Content-Type` declared by the output `Serde` is set\n * on the response even when the serialized output is an empty byte array.\n *\n * This is needed for serialization formats where an empty byte array is a\n * valid value (for example Protobuf, where an empty message serializes to\n * zero bytes).\n *\n * Defaults to `false`: when the serialized output is empty, no `Content-Type` header is sent.\n */\n setOutputContentTypeIfEmpty?: boolean;\n\n /**\n * Human-readable description of the handler, shown in documentation/admin tools.\n */\n description?: string;\n\n /**\n * Arbitrary key/value metadata for the handler. Exposed via the Admin API.\n */\n metadata?: Record<string, string>;\n\n /**\n * The retention duration of idempotent requests to this handler.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n idempotencyRetention?: Duration | number;\n\n /**\n * The journal retention for invocations to this handler.\n *\n * When a request has an idempotency key, `idempotencyRetention` caps the journal retention time.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n journalRetention?: Duration | number;\n\n /**\n * Guards against stalled invocations. Once this timeout expires, Restate requests a graceful\n * suspension of the invocation (preserving intermediate progress).\n *\n * If the invocation does not react to the suspension request, `abortTimeout` is used to abort it.\n *\n * Overrides the inactivity timeout set at the service level and the default configured in the Restate server.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n inactivityTimeout?: Duration | number;\n\n /**\n * Guards against invocations that fail to terminate after inactivity.\n * The abort timeout starts after `inactivityTimeout` expires and a graceful termination was requested.\n * When this timer expires, the invocation is aborted.\n *\n * This timer may interrupt user code. If more time is needed for graceful termination, increase this value.\n *\n * Overrides the abort timeout set at the service level and the default configured in the Restate server.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n abortTimeout?: Duration | number;\n\n /**\n * When set to `true`, this handler cannot be invoked via the Restate server HTTP or Kafka ingress;\n * it can only be called from other services.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n ingressPrivate?: boolean;\n\n /**\n * Retry policy to apply to all requests to this handler. For each unspecified field, the default value configured in the service or, if absent, in the restate-server configuration file, will be applied instead.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * By default, Restate treats errors as terminal (non-retryable) only when they are instances of `TerminalError`.\n *\n * Use this hook to map domain-specific errors to `TerminalError` (or return `undefined` to keep them retryable).\n * When mapped to `TerminalError`, the error will not be retried.\n *\n * Note: This applies to errors thrown inside `ctx.run` closures as well as errors thrown by Restate handlers.\n *\n * Example:\n *\n * ```ts\n * class MyValidationError extends Error {}\n *\n * const greeter = restate.service({\n * name: \"greeter\",\n * handlers: {\n * greet: async (ctx: restate.Context, name: string) => {\n * if (name.length === 0) {\n * throw new MyValidationError(\"Length too short\");\n * }\n * return `Hello ${name}`;\n * }\n * },\n * options: {\n * asTerminalError: (err) => {\n * if (err instanceof MyValidationError) {\n * // My validation error is terminal\n * return new restate.TerminalError(err.message, { errorCode: 400 });\n * }\n *\n * // Any other error is retryable\n * }\n * }\n * });\n * ```\n */\n asTerminalError?: (error: any) => TerminalError | undefined;\n\n /**\n * Default serde to use for requests, responses, state, side effects, awakeables, promises. Used when no other serde is specified.\n *\n * If not provided, defaults to `serde.json`.\n *\n * The input or output of this handler can be overridden using the `input`/`output` fields\n */\n serde?: Serde<any>;\n\n /**\n * Hooks providers for this handler. Handler-level hooks wrap innermost —\n * they run after service-level hooks. Both levels are merged: service\n * hooks first, then handler hooks. Within each level, hooks execute in\n * array order: for `[A, B]`: A before → B before → handler → B after → A after.\n *\n * The `handler` interceptor fires on every attempt. The `run` interceptor\n * fires only when the `ctx.run()` closure actually executes — replayed\n * runs (already in the journal) are skipped.\n *\n * Errors thrown at any point (before or after `next()`) affect the invocation:\n * {@link TerminalError} fails immediately, any other error triggers a retry.\n * On suspension or pause, `next()` also rejects — do any cleanup and rethrow.\n *\n * @example\n * ```ts\n * const myService = restate.service({\n * name: \"MyService\",\n * handlers: {\n * greet: restate.createServiceHandler(\n * {\n * hooks: [\n * (ctx) => ({\n * interceptor: {\n * handler: async (next) => {\n * console.log(`before ${ctx.request.target}`);\n * try {\n * await next();\n * console.log(`after ${ctx.request.target}`);\n * } catch (e) {\n * console.log(`error ${ctx.request.target}: ${e}`);\n * // Always rethrow — swallowing the error changes the\n * // invocation outcome. You can also throw a different\n * // error (e.g. TerminalError to fail immediately).\n * throw e;\n * }\n * },\n * run: async (name, next) => {\n * console.log(` before run \"${name}\"`);\n * try {\n * await next();\n * console.log(` after run \"${name}\"`);\n * } catch (e) {\n * console.log(` error run \"${name}\": ${e}`);\n * throw e;\n * }\n * },\n * },\n * }),\n * ],\n * },\n * async (ctx, name) => `Hello, ${name}!`\n * ),\n * },\n * });\n * ```\n */\n hooks?: HooksProvider[];\n\n /**\n * When set to `true`, the SDK will stop automatically propagating cancellations when awaiting {@link RestatePromise}s.\n *\n * Instead, the user code must explicitly listen to cancellations using the `ctx.cancellation()` API in {@link ContextInternal}.\n *\n * @experimental\n */\n explicitCancellation?: boolean;\n};\n\nexport type ObjectHandlerOpts<I, O> = ServiceHandlerOpts<I, O> & {\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this handler.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\nexport type WorkflowHandlerOpts<I, O> = ServiceHandlerOpts<I, O> & {\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this handler.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\nconst HANDLER_SYMBOL = Symbol(\"Handler\");\n\nexport class HandlerWrapper {\n public static from(\n kind: HandlerKind,\n handler: Function,\n opts?:\n | ServiceHandlerOpts<unknown, unknown>\n | ObjectHandlerOpts<unknown, unknown>\n | WorkflowHandlerOpts<unknown, unknown>\n ): HandlerWrapper {\n // we must create here a copy of the handler\n // to be able to reuse the original handler in other places.\n // like for example the same logic but under different routes.\n const handlerCopy = function (this: any, ...args: any[]): any {\n return handler.apply(this, args);\n };\n\n return new HandlerWrapper(kind, handlerCopy, opts);\n }\n\n public static fromHandler(handler: any): HandlerWrapper | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return handler[HANDLER_SYMBOL] as HandlerWrapper | undefined;\n }\n\n private constructor(\n public readonly kind: HandlerKind,\n private handler: Function,\n public readonly options?:\n | ServiceHandlerOpts<unknown, unknown>\n | ObjectHandlerOpts<unknown, unknown>\n | WorkflowHandlerOpts<unknown, unknown>\n ) {}\n\n bindInstance(t: unknown) {\n this.handler = this.handler.bind(t) as Function;\n }\n\n async invoke(context: { defaultSerde: Serde<any> }, input: Uint8Array) {\n let req: unknown;\n try {\n req = (this.options?.input ?? context.defaultSerde).deserialize(input);\n } catch (e) {\n const error = ensureError(e);\n throw new TerminalError(`Failed to deserialize input: ${error.message}`, {\n errorCode: 400,\n });\n }\n\n const res: unknown = await this.handler(context, req);\n return (this.options?.output ?? context.defaultSerde).serialize(res);\n }\n\n /**\n * Instead of a HandlerWrapper with a handler property,\n * return the original handler with a HandlerWrapper property.\n * This is needed to keep the appearance of regular functions\n * bound to an object, so that for example, `this.foo(ctx, arg)` would\n * work.\n */\n transpose<F>(): F {\n const handler = this.handler;\n const existing = HandlerWrapper.fromHandler(handler);\n if (existing !== undefined) {\n return handler as F;\n }\n Object.defineProperty(handler, HANDLER_SYMBOL, { value: this });\n return handler as F;\n }\n}\n\n// ----------- handler decorators ----------------------------------------------\nexport type RemoveVoidArgument<F> = F extends (\n ctx: infer C,\n arg: infer A\n) => infer R\n ? A extends void\n ? (ctx: C) => R\n : F\n : F;\n\nexport namespace handlers {\n /**\n * Create a service handler.\n *\n * @param opts additional configuration\n * @param fn the actual handler code to execute\n */\n export function handler<O, I = void>(\n opts: ServiceHandlerOpts<I, O>,\n fn: (ctx: Context, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn> {\n return HandlerWrapper.from(HandlerKind.SERVICE, fn, opts).transpose();\n }\n\n export namespace workflow {\n export function workflow<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: WorkflowHandlerOpts<I, O>,\n fn: (ctx: WorkflowContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n export function workflow<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: WorkflowContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n export function workflow<O, I = void>(\n optsOrFn:\n | WorkflowHandlerOpts<I, O>\n | ((ctx: WorkflowContext, input: I) => Promise<O>),\n fn?: (ctx: WorkflowContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.WORKFLOW, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies WorkflowHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.WORKFLOW, fn, opts).transpose();\n }\n\n /**\n * Creates a shared handler for a workflow.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: WorkflowHandlerOpts<I, O>,\n fn: (ctx: WorkflowSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a workflow.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: WorkflowSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a workflow\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<O, I = void>(\n optsOrFn:\n | WorkflowHandlerOpts<I, O>\n | ((ctx: WorkflowSharedContext, input: I) => Promise<O>),\n fn?: (ctx: WorkflowSharedContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.SHARED, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies ObjectHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.SHARED, fn, opts).transpose();\n }\n }\n\n export namespace object {\n /**\n * Creates an exclusive handler for a virtual Object.\n *\n * note : This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function exclusive<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: ObjectHandlerOpts<I, O>,\n fn: (ctx: ObjectContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates an exclusive handler for a virtual Object.\n *\n *\n * note 1: This applies only to a virtual object.\n * note 2: This is the default for virtual objects, so if no\n * additional reconfiguration is needed, you can simply\n * use the handler directly (no need to use exclusive).\n * This variant here is only for symmetry/convenance.\n *\n * @param fn the handler to execute\n */\n export function exclusive<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: ObjectContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates an exclusive handler for a virtual Object.\n *\n *\n * note 1: This applies only to a virtual object.\n * note 2: This is the default for virtual objects, so if no\n * additional reconfiguration is needed, you can simply\n * use the handler directly (no need to use exclusive).\n * This variant here is only for symmetry/convenance.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function exclusive<O, I = void>(\n optsOrFn:\n | ObjectHandlerOpts<I, O>\n | ((ctx: ObjectContext, input: I) => Promise<O>),\n fn?: (ctx: ObjectContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.EXCLUSIVE, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies ObjectHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.EXCLUSIVE, fn, opts).transpose();\n }\n\n /**\n * Creates a shared handler for a virtual Object.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * note: This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n opts: ObjectHandlerOpts<I, O>,\n fn: (ctx: ObjectSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a virtual Object.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * note: This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<\n O,\n I = void,\n TState extends TypedState = UntypedState,\n >(\n fn: (ctx: ObjectSharedContext<TState>, input: I) => Promise<O>\n ): RemoveVoidArgument<typeof fn>;\n\n /**\n * Creates a shared handler for a virtual Object.\n *\n * A shared handler allows a read-only concurrent execution\n * for a given key.\n *\n * note: This applies only to a virtual object.\n *\n * @param opts additional configurations\n * @param fn the handler to execute\n */\n export function shared<I, O>(\n optsOrFn:\n | ObjectHandlerOpts<I, O>\n | ((ctx: ObjectSharedContext, input: I) => Promise<O>),\n fn?: (ctx: ObjectSharedContext, input: I) => Promise<O>\n ) {\n if (typeof optsOrFn === \"function\") {\n return HandlerWrapper.from(HandlerKind.SHARED, optsOrFn).transpose();\n }\n const opts = optsOrFn satisfies ObjectHandlerOpts<I, O>;\n if (typeof fn !== \"function\") {\n throw new TypeError(\"The second argument must be a function\");\n }\n return HandlerWrapper.from(HandlerKind.SHARED, fn, opts).transpose();\n }\n }\n}\n\n// ----------- services ----------------------------------------------\n\nexport type ServiceOpts<U> = {\n [K in keyof U]: U[K] extends ServiceHandler<U[K], Context>\n ? U[K]\n : ServiceHandler<U[K], Context>;\n};\n\nexport type RetryPolicy = {\n /**\n * Max number of retry attempts (including the initial).\n * When reached, the behavior specified in {@link onMaxAttempts} will be applied.\n */\n maxAttempts?: number;\n\n /**\n * What to do when max attempts are reached.\n *\n * If `pause`, the invocation will enter the paused state and can be manually resumed from the CLI/UI.\n *\n * If `kill`, the invocation will get automatically killed.\n */\n onMaxAttempts?: \"pause\" | \"kill\";\n\n /**\n * Initial interval for the first retry attempt.\n * Retry interval will grow by a factor specified in `exponentiationFactor`.\n *\n * If a number is provided, it will be interpreted as milliseconds.\n */\n initialInterval?: Duration | number;\n\n /**\n * Max interval between retries.\n * Retry interval will grow by a factor specified in `exponentiationFactor`.\n *\n * If a number is provided, it will be interpreted as milliseconds.\n */\n maxInterval?: Duration | number;\n\n /**\n * Exponentiation factor to use when computing the next retry delay.\n */\n exponentiationFactor?: number;\n};\n\nexport type ServiceOptions = {\n /**\n * The retention duration of idempotent requests to this service.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n idempotencyRetention?: Duration | number;\n\n /**\n * Journal retention applied to all requests to all handlers of this service.\n *\n * When a request includes an idempotency key, `idempotencyRetention` caps the journal retention time.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n journalRetention?: Duration | number;\n\n /**\n * Guards against stalled invocations. Once this timeout expires, Restate requests a graceful\n * suspension of the invocation (preserving intermediate progress).\n *\n * If the invocation does not react to the suspension request, `abortTimeout` is used to abort it.\n *\n * Overrides the default inactivity timeout configured in the Restate server for all invocations to this service.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n inactivityTimeout?: Duration | number;\n\n /**\n * Guards against invocations that fail to terminate after inactivity.\n * The abort timeout starts after `inactivityTimeout` expires and a graceful termination was requested.\n * When this timer expires, the invocation is aborted.\n *\n * This timer may interrupt user code. If more time is needed for graceful termination, increase this value.\n *\n * Overrides the default abort timeout configured in the Restate server for invocations to this service.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n abortTimeout?: Duration | number;\n\n /**\n * When set to `true`, this service (and all its handlers) cannot be invoked via the Restate server\n * HTTP or Kafka ingress; it can only be called from other services.\n *\n * Note: Available only when registering this endpoint with restate-server v1.4 or newer; otherwise service discovery will fail.\n */\n ingressPrivate?: boolean;\n\n /**\n * Retry policy to apply to all requests to this service. For each unspecified field, the default value configured in the restate-server configuration file will be applied instead.\n */\n retryPolicy?: RetryPolicy;\n\n /**\n * By default, Restate treats errors as terminal (non-retryable) only when they are instances of `TerminalError`.\n *\n * Use this hook to map domain-specific errors to `TerminalError` (or return `undefined` to keep them retryable).\n * When mapped to `TerminalError`, the error will not be retried.\n *\n * Note: This applies to errors thrown inside `ctx.run` closures as well as errors thrown by Restate handlers.\n *\n * Example:\n *\n * ```ts\n * class MyValidationError extends Error {}\n *\n * const greeter = restate.service({\n * name: \"greeter\",\n * handlers: {\n * greet: async (ctx: restate.Context, name: string) => {\n * if (name.length === 0) {\n * throw new MyValidationError(\"Length too short\");\n * }\n * return `Hello ${name}`;\n * }\n * },\n * options: {\n * asTerminalError: (err) => {\n * if (err instanceof MyValidationError) {\n * // My validation error is terminal\n * return new restate.TerminalError(err.message, { errorCode: 400 });\n * }\n *\n * // Any other error is retryable\n * }\n * }\n * });\n * ```\n */\n asTerminalError?: (error: any) => TerminalError | undefined;\n\n /**\n * Default serde to use for requests, responses, state, side effects, awakeables, promises. Used when no other serde is specified.\n *\n * If not provided, defaults to `serde.json`.\n */\n serde?: Serde<any>;\n\n /**\n * Hooks providers for this service. Service-level hooks wrap outermost —\n * they run before handler-level hooks. Both levels are merged: service\n * hooks first, then handler hooks. Within each level, hooks execute in\n * array order: for `[A, B]`: A before → B before → handler → B after → A after.\n *\n * The `handler` interceptor fires on every attempt. The `run` interceptor\n * fires only when the `ctx.run()` closure actually executes — replayed\n * runs (already in the journal) are skipped.\n *\n * Errors thrown at any point (before or after `next()`) affect the invocation:\n * {@link TerminalError} fails immediately, any other error triggers a retry.\n * On suspension or pause, `next()` also rejects — do any cleanup and rethrow.\n *\n * @example\n * ```ts\n * const myService = restate.service({\n * name: \"MyService\",\n * handlers: { greet: async (ctx, name) => `Hello, ${name}!` },\n * options: {\n * hooks: [\n * (ctx) => ({\n * interceptor: {\n * handler: async (next) => {\n * console.log(`before ${ctx.request.target}`);\n * try {\n * await next();\n * console.log(`after ${ctx.request.target}`);\n * } catch (e) {\n * console.log(`error ${ctx.request.target}: ${e}`);\n * // Always rethrow — swallowing the error changes the\n * // invocation outcome. You can also throw a different\n * // error (e.g. TerminalError to fail immediately).\n * throw e;\n * }\n * },\n * run: async (name, next) => {\n * console.log(` before run \"${name}\"`);\n * try {\n * await next();\n * console.log(` after run \"${name}\"`);\n * } catch (e) {\n * console.log(` error run \"${name}\": ${e}`);\n * throw e;\n * }\n * },\n * },\n * }),\n * ],\n * },\n * });\n * ```\n */\n hooks?: HooksProvider[];\n\n /**\n * When set to `true`, the SDK will stop automatically propagating cancellations when awaiting {@link RestatePromise}s.\n *\n * Instead, the user code must explicitly listen to cancellations using the `ctx.cancellation()` API in {@link ContextInternal}.\n *\n * @experimental\n */\n explicitCancellation?: boolean;\n};\n\n/**\n * Define a Restate service.\n *\n * @example Here is an example of how to define a service:\n *\n * ```ts\n * const greeter = service({\n * name: \"greeter\",\n * handlers: {\n * greet: async (ctx: Context, name: string) => {\n * return `Hello ${name}`;\n * }\n * }\n * });\n * ```\n *\n * To use the service, you can bind it to an endpoint:\n * ```\n * ...\n * endpoint.bind(greeter)\n * ```\n * @example To use a service, you can export its type to be used in a client:\n * ```\n * export type Greeter = typeof greeter;\n * ...\n * ...\n * import type { Greeter } from \"./greeter\";\n * const client = ctx.serviceClient<Greeter>({ name : \"greeter\"});\n * client.greet(\"World\").then(console.log);\n * ```\n *\n * @example Alternatively to avoid repeating the service name, you can:\n * ```\n * import type {Greeter} from \"./greeter\";\n * const Greeter: Greeter = { name : \"greeter\"};\n *\n * // now you can reference the service like this:\n * const client = ctx.serviceClient(Greeter);\n * ```\n *\n * @param name the service name\n * @param handlers the handlers for the service\n * @param description an optional description for the service\n * @param metadata an optional metadata for the service\n * @type P the name of the service\n * @type M the handlers for the service\n */\nexport const service = <P extends string, M>(service: {\n name: P;\n handlers: ServiceOpts<M> & ThisType<M>;\n description?: string;\n metadata?: Record<string, string>;\n options?: ServiceOptions;\n}): ServiceDefinition<P, M> => {\n if (!service.handlers) {\n throw new Error(\"service must be defined\");\n }\n const handlers = Object.entries(service.handlers).map(([name, handler]) => {\n if (handler instanceof Function) {\n if (HandlerWrapper.fromHandler(handler) !== undefined) {\n return [name, handler];\n }\n return [\n name,\n HandlerWrapper.from(HandlerKind.SERVICE, handler).transpose(),\n ];\n }\n throw new TypeError(`Unexpected handler type ${name}`);\n });\n\n return {\n name: service.name,\n service: Object.fromEntries(handlers) as object,\n metadata: service.metadata,\n description: service.description,\n options: service.options,\n } as ServiceDefinition<P, M>;\n};\n\n// ----------- objects ----------------------------------------------\n\nexport type ObjectOpts<U> = {\n [K in keyof U]: U[K] extends ObjectHandler<U[K], ObjectContext<any>>\n ? U[K]\n : U[K] extends ObjectHandler<U[K], ObjectSharedContext<any>>\n ? U[K]\n :\n | ObjectHandler<U[K], ObjectContext<any>>\n | ObjectHandler<U[K], ObjectSharedContext<any>>;\n};\n\nexport type ObjectOptions = ServiceOptions & {\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this service.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\n/**\n * Define a Restate virtual object.\n *\n * @example Here is an example of how to define a virtual object:\n * ```ts\n * const counter = object({\n * name: \"counter\",\n * handlers: {\n * add: async (ctx: ObjectContext, amount: number) => {},\n * get: async (ctx: ObjectContext) => {}\n * }\n * })\n * ```\n *\n * @example To use the object, you can bind it to an endpoint:\n * ```ts\n * ...\n * endpoint.bind(counter)\n * ```\n *\n * @see to interact with the object, you can use the object client:\n * ```ts\n * ...\n * const client = ctx.objectClient<typeof counter>({ name: \"counter\"});\n * const res = await client.add(1)\n * ```\n *\n * ### Shared handlers\n *\n * Shared handlers are used to allow concurrent read-only access to the object.\n * This is useful when you want to allow multiple clients to read the object's state at the same time.\n * To define a shared handler, you can use the `shared` decorator as shown below:\n *\n * ```ts\n * const counter = object({\n * name: \"counter\",\n * handlers: {\n *\n * add: async (ctx: ObjectContext, amount: number) => { .. },\n *\n * get: handlers.object.shared(async (ctx: ObjectSharedContext) => {\n * return ctx.get<number>(\"count\");\n * })\n * }\n * });\n * ```\n *\n * @param name the name of the object\n * @param handlers the handlers for the object\n * @param description an optional description for the object\n * @param metadata an optional metadata for the object\n * @type P the name of the object\n * @type M the handlers for the object\n */\nexport const object = <P extends string, M>(object: {\n name: P;\n handlers: ObjectOpts<M> & ThisType<M>;\n description?: string;\n metadata?: Record<string, string>;\n options?: ObjectOptions;\n}): VirtualObjectDefinition<P, M> => {\n if (!object.handlers) {\n throw new Error(\"object options must be defined\");\n }\n\n const handlers = Object.entries(object.handlers).map(([name, handler]) => {\n if (handler instanceof Function) {\n if (HandlerWrapper.fromHandler(handler) !== undefined) {\n return [name, handler];\n }\n\n return [\n name,\n HandlerWrapper.from(HandlerKind.EXCLUSIVE, handler).transpose(),\n ];\n }\n throw new TypeError(`Unexpected handler type ${name}`);\n });\n\n return {\n name: object.name,\n object: Object.fromEntries(handlers) as object,\n metadata: object.metadata,\n description: object.description,\n options: object.options,\n } as VirtualObjectDefinition<P, M>;\n};\n\n// ----------- workflows ----------------------------------------------\n\n/**\n * A workflow handlers is a type that describes the handlers for a workflow.\n * The handlers must contain exactly one handler named 'run', and this handler must accept as a first argument a WorkflowContext.\n * It can contain any number of additional handlers, which must accept as a first argument a WorkflowSharedContext.\n * The handlers can not be named 'workflowSubmit', 'workflowAttach', 'workflowOutput' - as these are reserved.\n * @see {@link workflow} for an example.\n */\nexport type WorkflowOpts<U> = {\n run: (ctx: WorkflowContext<any>, argument: any) => Promise<any>;\n} & {\n [K in keyof U]: K extends\n | \"workflowSubmit\"\n | \"workflowAttach\"\n | \"workflowOutput\"\n ? `${K} is a reserved keyword`\n : K extends \"run\"\n ? U[K] extends WorkflowHandler<U[K], WorkflowContext<any>>\n ? U[K]\n : \"An handler named 'run' must take as a first argument a WorkflowContext, and must return a Promise\"\n : U[K] extends WorkflowSharedHandler<U[K], WorkflowSharedContext<any>>\n ? U[K]\n : \"An handler other then 'run' must accept as a first argument a WorkflowSharedContext\";\n};\n\nexport type WorkflowOptions = ServiceOptions & {\n /**\n * The retention duration for this workflow.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n workflowRetention?: Duration | number;\n /**\n * When set to `true`, lazy state will be enabled for all invocations to this service.\n *\n * *NOTE:* You can set this field only if you register this endpoint against restate-server >= 1.4,\n * otherwise the service discovery will fail.\n */\n enableLazyState?: boolean;\n};\n\n/**\n * Define a Restate workflow.\n *\n *\n * @example Here is an example of how to define a workflow:\n * ```ts\n * const mywf = workflow({\n * name: \"mywf\",\n * handlers: {\n * run: async (ctx: WorkflowContext, argument: any) => {\n * return \"Hello World\";\n * }\n * }\n * });\n * ```\n *\n * ### Note:\n * * That a workflow must contain exactly one handler named 'run', and this handler must accept as a first argument a WorkflowContext.\n * * The workflow handlers other than 'run' must accept as a first argument a WorkflowSharedContext.\n * * The workflow handlers can not be named 'workflowSubmit', 'workflowAttach', 'workflowOutput' - as these are reserved keywords.\n *\n * @example To use the workflow, you can bind it to an endpoint:\n * ```ts\n * endpoint.bind(mywf)\n * ```\n *\n * @example To interact with the workflow, you can use the workflow client:\n * ```ts\n * const client = ctx.workflowClient<typeof mywf>({ name: \"mywf\"});\n * const res = await client.run(\"Hello\");\n * ```\n *\n * To use the workflow client from any other environment (like a browser), please refer to the documentation.\n * https://docs.restate.dev\n *\n *\n *\n * @param name the workflow name\n * @param handlers the handlers for the workflow.\n */\nexport const workflow = <P extends string, M>(workflow: {\n name: P;\n handlers: WorkflowOpts<M> & ThisType<M>;\n description?: string;\n metadata?: Record<string, string>;\n options?: WorkflowOptions;\n}): WorkflowDefinition<P, M> => {\n if (!workflow.handlers) {\n throw new Error(\"workflow must contain handlers\");\n }\n\n //\n // Add the main 'run' handler\n //\n const runHandler = workflow.handlers[\"run\"];\n let runWrapper: HandlerWrapper;\n\n if (runHandler instanceof HandlerWrapper) {\n runWrapper = runHandler;\n } else if (runHandler instanceof Function) {\n runWrapper =\n HandlerWrapper.fromHandler(runHandler) ??\n HandlerWrapper.from(HandlerKind.WORKFLOW, runHandler);\n } else {\n throw new TypeError(`Missing main workflow handler, named 'run'`);\n }\n if (runWrapper.kind !== HandlerKind.WORKFLOW) {\n throw new TypeError(\n `Workflow's main handler handler run, must be of type workflow'`\n );\n }\n\n const handlers = [[\"run\", runWrapper.transpose()]];\n\n //\n // Add all the shared handlers now\n //\n\n for (const [name, handler] of Object.entries(workflow.handlers)) {\n if (name === \"run\") {\n continue;\n }\n let wrapper: HandlerWrapper;\n\n if (handler instanceof HandlerWrapper) {\n wrapper = handler;\n } else if (handler instanceof Function) {\n wrapper =\n HandlerWrapper.fromHandler(handler) ??\n HandlerWrapper.from(HandlerKind.SHARED, handler);\n } else {\n throw new TypeError(`Unexpected handler type ${name}`);\n }\n if (wrapper.kind === HandlerKind.WORKFLOW) {\n throw new TypeError(\n `A workflow must contain exactly one handler annotated as workflow, named 'run'. Please use a shared handler for any additional handlers`\n );\n }\n handlers.push([name, wrapper.transpose()]);\n }\n\n return {\n name: workflow.name,\n workflow: Object.fromEntries(handlers) as object,\n metadata: workflow.metadata,\n description: workflow.description,\n options: workflow.options,\n } as WorkflowDefinition<P, M>;\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restatedev/restate-sdk",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "Typescript SDK for Restate",
5
5
  "author": "Restate Developers",
6
6
  "email": "code@restate.dev",
@@ -44,7 +44,7 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
- "@restatedev/restate-sdk-core": "1.12.0"
47
+ "@restatedev/restate-sdk-core": "1.13.0"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/aws-lambda": "^8.10.115"