@restatedev/restate-sdk-cloudflare-workers 1.10.4 → 1.11.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.
Files changed (52) hide show
  1. package/dist/context_impl.cjs +17 -6
  2. package/dist/context_impl.js +17 -6
  3. package/dist/context_impl.js.map +1 -1
  4. package/dist/endpoint/endpoint.cjs +2 -2
  5. package/dist/endpoint/endpoint.js +2 -2
  6. package/dist/endpoint/fetch_endpoint.cjs +2 -2
  7. package/dist/endpoint/fetch_endpoint.js +2 -2
  8. package/dist/endpoint/fetch_endpoint.js.map +1 -1
  9. package/dist/endpoint/handlers/core_logging.cjs +52 -0
  10. package/dist/endpoint/handlers/core_logging.js +51 -0
  11. package/dist/endpoint/handlers/core_logging.js.map +1 -0
  12. package/dist/endpoint/handlers/discovery.cjs +58 -0
  13. package/dist/endpoint/handlers/discovery.js +59 -0
  14. package/dist/endpoint/handlers/discovery.js.map +1 -0
  15. package/dist/endpoint/handlers/fetch.cjs +23 -11
  16. package/dist/endpoint/handlers/fetch.js +24 -11
  17. package/dist/endpoint/handlers/fetch.js.map +1 -1
  18. package/dist/endpoint/handlers/generic.cjs +167 -253
  19. package/dist/endpoint/handlers/generic.js +166 -249
  20. package/dist/endpoint/handlers/generic.js.map +1 -1
  21. package/dist/endpoint/handlers/lambda.cjs +64 -61
  22. package/dist/endpoint/handlers/lambda.js +64 -60
  23. package/dist/endpoint/handlers/lambda.js.map +1 -1
  24. package/dist/endpoint/handlers/utils.cjs +51 -0
  25. package/dist/endpoint/handlers/utils.js +48 -0
  26. package/dist/endpoint/handlers/utils.js.map +1 -0
  27. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.d.ts +13 -13
  28. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.js +20 -20
  29. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm +0 -0
  30. package/dist/endpoint/lambda_endpoint.cjs +2 -2
  31. package/dist/endpoint/lambda_endpoint.js +2 -2
  32. package/dist/endpoint/lambda_endpoint.js.map +1 -1
  33. package/dist/endpoint/node_endpoint.cjs +41 -41
  34. package/dist/endpoint/node_endpoint.js +41 -40
  35. package/dist/endpoint/node_endpoint.js.map +1 -1
  36. package/dist/io.cjs +2 -2
  37. package/dist/io.js +2 -2
  38. package/dist/io.js.map +1 -1
  39. package/dist/package.cjs +1 -1
  40. package/dist/package.js +1 -1
  41. package/dist/package.js.map +1 -1
  42. package/dist/types/errors.cjs +2 -0
  43. package/dist/types/errors.d.cts +8 -0
  44. package/dist/types/errors.d.cts.map +1 -1
  45. package/dist/types/errors.d.ts +8 -0
  46. package/dist/types/errors.d.ts.map +1 -1
  47. package/dist/types/errors.js +2 -0
  48. package/dist/types/errors.js.map +1 -1
  49. package/package.json +3 -3
  50. package/dist/utils/streams.cjs +0 -14
  51. package/dist/utils/streams.js +0 -13
  52. package/dist/utils/streams.js.map +0 -1
@@ -1,11 +1,10 @@
1
1
  const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
2
  const require_errors = require('../types/errors.cjs');
3
- const require_generic = require('./handlers/generic.cjs');
4
3
  const require_endpoint = require('./endpoint.cjs');
4
+ const require_utils = require('./handlers/utils.cjs');
5
+ const require_generic = require('./handlers/generic.cjs');
5
6
  let http2 = require("http2");
6
7
  http2 = require_rolldown_runtime.__toESM(http2);
7
- let node_stream = require("node:stream");
8
- node_stream = require_rolldown_runtime.__toESM(node_stream);
9
8
 
10
9
  //#region src/endpoint/node_endpoint.ts
11
10
  var NodeEndpoint = class {
@@ -54,46 +53,47 @@ var NodeEndpoint = class {
54
53
  }
55
54
  };
56
55
  function nodeHttp2Handler(endpoint) {
57
- const handler = new require_generic.GenericHandler(endpoint, "BIDI_STREAM", {});
58
- return (request, response) => {
59
- (async () => {
60
- const abortController = new AbortController();
61
- request.once("aborted", () => {
62
- abortController.abort();
63
- });
64
- request.once("close", () => {
65
- abortController.abort();
56
+ const handler = require_generic.createRestateHandler(endpoint, "BIDI_STREAM", {});
57
+ return (httpRequest, httpResponse) => {
58
+ const url = httpRequest.url;
59
+ const abortController = new AbortController();
60
+ httpRequest.on("close", () => {
61
+ abortController.abort();
62
+ });
63
+ const restateResponse = handler.handle({
64
+ url,
65
+ headers: httpRequest.headers,
66
+ extraArgs: []
67
+ });
68
+ httpResponse.writeHead(restateResponse.statusCode, restateResponse.headers);
69
+ restateResponse.process({
70
+ inputReader: inputReaderAdapter(httpRequest),
71
+ outputWriter: outputWriterAdapter(httpResponse),
72
+ abortSignal: abortController.signal
73
+ }).catch((e) => {
74
+ const error = require_errors.ensureError(e);
75
+ (require_utils.tryCreateContextualLogger(endpoint.loggerTransport, url, httpRequest.headers) ?? endpoint.rlog).error("Unexpected error: " + (error.stack ?? error.message));
76
+ });
77
+ };
78
+ }
79
+ function inputReaderAdapter(request) {
80
+ return request[Symbol.asyncIterator]();
81
+ }
82
+ function outputWriterAdapter(response) {
83
+ return {
84
+ write: function(value) {
85
+ return new Promise((resolve, reject) => {
86
+ response.write(value, (err) => {
87
+ if (err) reject(err);
88
+ else resolve();
89
+ });
66
90
  });
67
- request.once("error", () => {
68
- abortController.abort();
91
+ },
92
+ close: function() {
93
+ return new Promise((resolve) => {
94
+ response.end(() => resolve());
69
95
  });
70
- if (request.destroyed || request.aborted) {
71
- endpoint.rlog.error("Client disconnected");
72
- abortController.abort();
73
- }
74
- try {
75
- const url = request.url;
76
- const webRequestBody = node_stream.Readable.toWeb(request);
77
- const resp = await handler.handle({
78
- url,
79
- headers: request.headers,
80
- body: webRequestBody,
81
- extraArgs: [],
82
- abortSignal: abortController.signal
83
- });
84
- if (response.destroyed) return;
85
- response.writeHead(resp.statusCode, resp.headers);
86
- const responseWeb = node_stream.Writable.toWeb(response);
87
- await resp.body.pipeTo(responseWeb);
88
- } catch (e) {
89
- const error = require_errors.ensureError(e);
90
- const logger = require_generic.tryCreateContextualLogger(endpoint.loggerTransport, request.url, request.headers) ?? endpoint.rlog;
91
- if (error.name === "AbortError") logger.error("Got abort error from connection: " + error.message + "\nThis might indicate that:\n* The restate-server aborted the connection after hitting the 'abort-timeout'\n* The connection with the restate-server was lost\n\nPlease check the invocation in the Restate UI for more details.");
92
- else logger.error("Error while handling request: " + (error.stack ?? error.message));
93
- response.destroy(error);
94
- abortController.abort();
95
- }
96
- })().catch(() => {});
96
+ }
97
97
  };
98
98
  }
99
99
 
@@ -1,8 +1,8 @@
1
1
  import { ensureError } from "../types/errors.js";
2
- import { GenericHandler, tryCreateContextualLogger } from "./handlers/generic.js";
3
2
  import { EndpointBuilder } from "./endpoint.js";
3
+ import { tryCreateContextualLogger } from "./handlers/utils.js";
4
+ import { createRestateHandler } from "./handlers/generic.js";
4
5
  import * as http2 from "http2";
5
- import { Readable, Writable } from "node:stream";
6
6
 
7
7
  //#region src/endpoint/node_endpoint.ts
8
8
  var NodeEndpoint = class {
@@ -51,46 +51,47 @@ var NodeEndpoint = class {
51
51
  }
52
52
  };
53
53
  function nodeHttp2Handler(endpoint) {
54
- const handler = new GenericHandler(endpoint, "BIDI_STREAM", {});
55
- return (request, response) => {
56
- (async () => {
57
- const abortController = new AbortController();
58
- request.once("aborted", () => {
59
- abortController.abort();
60
- });
61
- request.once("close", () => {
62
- abortController.abort();
54
+ const handler = createRestateHandler(endpoint, "BIDI_STREAM", {});
55
+ return (httpRequest, httpResponse) => {
56
+ const url = httpRequest.url;
57
+ const abortController = new AbortController();
58
+ httpRequest.on("close", () => {
59
+ abortController.abort();
60
+ });
61
+ const restateResponse = handler.handle({
62
+ url,
63
+ headers: httpRequest.headers,
64
+ extraArgs: []
65
+ });
66
+ httpResponse.writeHead(restateResponse.statusCode, restateResponse.headers);
67
+ restateResponse.process({
68
+ inputReader: inputReaderAdapter(httpRequest),
69
+ outputWriter: outputWriterAdapter(httpResponse),
70
+ abortSignal: abortController.signal
71
+ }).catch((e) => {
72
+ const error = ensureError(e);
73
+ (tryCreateContextualLogger(endpoint.loggerTransport, url, httpRequest.headers) ?? endpoint.rlog).error("Unexpected error: " + (error.stack ?? error.message));
74
+ });
75
+ };
76
+ }
77
+ function inputReaderAdapter(request) {
78
+ return request[Symbol.asyncIterator]();
79
+ }
80
+ function outputWriterAdapter(response) {
81
+ return {
82
+ write: function(value) {
83
+ return new Promise((resolve, reject) => {
84
+ response.write(value, (err) => {
85
+ if (err) reject(err);
86
+ else resolve();
87
+ });
63
88
  });
64
- request.once("error", () => {
65
- abortController.abort();
89
+ },
90
+ close: function() {
91
+ return new Promise((resolve) => {
92
+ response.end(() => resolve());
66
93
  });
67
- if (request.destroyed || request.aborted) {
68
- endpoint.rlog.error("Client disconnected");
69
- abortController.abort();
70
- }
71
- try {
72
- const url = request.url;
73
- const webRequestBody = Readable.toWeb(request);
74
- const resp = await handler.handle({
75
- url,
76
- headers: request.headers,
77
- body: webRequestBody,
78
- extraArgs: [],
79
- abortSignal: abortController.signal
80
- });
81
- if (response.destroyed) return;
82
- response.writeHead(resp.statusCode, resp.headers);
83
- const responseWeb = Writable.toWeb(response);
84
- await resp.body.pipeTo(responseWeb);
85
- } catch (e) {
86
- const error = ensureError(e);
87
- const logger = tryCreateContextualLogger(endpoint.loggerTransport, request.url, request.headers) ?? endpoint.rlog;
88
- if (error.name === "AbortError") logger.error("Got abort error from connection: " + error.message + "\nThis might indicate that:\n* The restate-server aborted the connection after hitting the 'abort-timeout'\n* The connection with the restate-server was lost\n\nPlease check the invocation in the Restate UI for more details.");
89
- else logger.error("Error while handling request: " + (error.stack ?? error.message));
90
- response.destroy(error);
91
- abortController.abort();
92
- }
93
- })().catch(() => {});
94
+ }
94
95
  };
95
96
  }
96
97
 
@@ -1 +1 @@
1
- {"version":3,"file":"node_endpoint.js","names":[],"sources":["../../src/endpoint/node_endpoint.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 type { RestateEndpoint } from \"../index.js\";\nimport type {\n JournalValueCodec,\n ServiceDefinition,\n VirtualObjectDefinition,\n WorkflowDefinition,\n} from \"@restatedev/restate-sdk-core\";\n\nimport type { Http2ServerRequest, Http2ServerResponse } from \"http2\";\nimport * as http2 from \"http2\";\nimport type { Endpoint } from \"./endpoint.js\";\nimport { EndpointBuilder } from \"./endpoint.js\";\nimport {\n GenericHandler,\n tryCreateContextualLogger,\n} from \"./handlers/generic.js\";\nimport { Readable, Writable } from \"node:stream\";\nimport type { WritableStream } from \"node:stream/web\";\nimport { ensureError } from \"../types/errors.js\";\nimport type { LoggerTransport } from \"../logging/logger_transport.js\";\nimport type { DefaultServiceOptions } from \"../endpoint.js\";\n\nexport class NodeEndpoint implements RestateEndpoint {\n private builder: EndpointBuilder = new EndpointBuilder();\n\n public bind<P extends string, M>(\n definition:\n | ServiceDefinition<P, M>\n | VirtualObjectDefinition<P, M>\n | WorkflowDefinition<P, M>\n ): RestateEndpoint {\n this.builder.bind(definition);\n return this;\n }\n\n public withIdentityV1(...keys: string[]): RestateEndpoint {\n this.builder.addIdentityKeys(...keys);\n return this;\n }\n\n public defaultServiceOptions(\n options: DefaultServiceOptions\n ): RestateEndpoint {\n this.builder.setDefaultServiceOptions(options);\n return this;\n }\n\n public setLogger(logger: LoggerTransport): RestateEndpoint {\n this.builder.setLogger(logger);\n return this;\n }\n\n public journalValueCodecProvider(\n codecProvider: () => Promise<JournalValueCodec>\n ): RestateEndpoint {\n this.builder.setJournalValueCodecProvider(codecProvider);\n return this;\n }\n\n http2Handler(): (\n request: Http2ServerRequest,\n response: Http2ServerResponse\n ) => void {\n return nodeHttp2Handler(this.builder.build());\n }\n\n listen(port?: number): Promise<number> {\n const endpoint = this.builder.build();\n\n const actualPort = port ?? parseInt(process.env.PORT ?? \"9080\");\n endpoint.rlog.info(`Restate SDK started listening on ${actualPort}...`);\n\n const server = http2.createServer(nodeHttp2Handler(endpoint));\n\n return new Promise((resolve, reject) => {\n let failed = false;\n server.once(\"error\", (e: Error) => {\n failed = true;\n reject(e);\n });\n server.listen(actualPort, () => {\n if (failed) {\n return;\n }\n const address = server.address();\n if (address === null || typeof address === \"string\") {\n reject(\n new TypeError(\n \"endpoint.listen() currently supports only binding to a PORT\"\n )\n );\n } else {\n resolve(address.port);\n }\n });\n });\n }\n}\n\nfunction nodeHttp2Handler(\n endpoint: Endpoint\n): (request: Http2ServerRequest, response: Http2ServerResponse) => void {\n const handler = new GenericHandler(endpoint, \"BIDI_STREAM\", {});\n\n return (request, response) => {\n (async () => {\n const abortController = new AbortController();\n\n request.once(\"aborted\", () => {\n abortController.abort();\n });\n request.once(\"close\", () => {\n abortController.abort();\n });\n request.once(\"error\", () => {\n abortController.abort();\n });\n\n if (request.destroyed || request.aborted) {\n endpoint.rlog.error(\"Client disconnected\");\n abortController.abort();\n }\n\n try {\n const url = request.url;\n const webRequestBody = Readable.toWeb(request);\n\n const resp = await handler.handle({\n url,\n headers: request.headers,\n body: webRequestBody,\n extraArgs: [],\n abortSignal: abortController.signal,\n });\n\n if (response.destroyed) {\n return;\n }\n\n response.writeHead(resp.statusCode, resp.headers);\n const responseWeb = Writable.toWeb(\n response\n ) as WritableStream<Uint8Array>;\n await resp.body.pipeTo(responseWeb);\n } catch (e) {\n const error = ensureError(e);\n\n const logger =\n tryCreateContextualLogger(\n endpoint.loggerTransport,\n request.url,\n request.headers\n ) ?? endpoint.rlog;\n if (error.name === \"AbortError\") {\n logger.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 logger.error(\n \"Error while handling request: \" + (error.stack ?? error.message)\n );\n }\n\n response.destroy(error);\n abortController.abort();\n }\n })().catch(() => {});\n };\n}\n"],"mappings":";;;;;;;AAiCA,IAAa,eAAb,MAAqD;CACnD,AAAQ,UAA2B,IAAI,iBAAiB;CAExD,AAAO,KACL,YAIiB;AACjB,OAAK,QAAQ,KAAK,WAAW;AAC7B,SAAO;;CAGT,AAAO,eAAe,GAAG,MAAiC;AACxD,OAAK,QAAQ,gBAAgB,GAAG,KAAK;AACrC,SAAO;;CAGT,AAAO,sBACL,SACiB;AACjB,OAAK,QAAQ,yBAAyB,QAAQ;AAC9C,SAAO;;CAGT,AAAO,UAAU,QAA0C;AACzD,OAAK,QAAQ,UAAU,OAAO;AAC9B,SAAO;;CAGT,AAAO,0BACL,eACiB;AACjB,OAAK,QAAQ,6BAA6B,cAAc;AACxD,SAAO;;CAGT,eAGU;AACR,SAAO,iBAAiB,KAAK,QAAQ,OAAO,CAAC;;CAG/C,OAAO,MAAgC;EACrC,MAAM,WAAW,KAAK,QAAQ,OAAO;EAErC,MAAM,aAAa,QAAQ,SAAS,QAAQ,IAAI,QAAQ,OAAO;AAC/D,WAAS,KAAK,KAAK,oCAAoC,WAAW,KAAK;EAEvE,MAAM,SAAS,MAAM,aAAa,iBAAiB,SAAS,CAAC;AAE7D,SAAO,IAAI,SAAS,SAAS,WAAW;GACtC,IAAI,SAAS;AACb,UAAO,KAAK,UAAU,MAAa;AACjC,aAAS;AACT,WAAO,EAAE;KACT;AACF,UAAO,OAAO,kBAAkB;AAC9B,QAAI,OACF;IAEF,MAAM,UAAU,OAAO,SAAS;AAChC,QAAI,YAAY,QAAQ,OAAO,YAAY,SACzC,wBACE,IAAI,UACF,8DACD,CACF;QAED,SAAQ,QAAQ,KAAK;KAEvB;IACF;;;AAIN,SAAS,iBACP,UACsE;CACtE,MAAM,UAAU,IAAI,eAAe,UAAU,eAAe,EAAE,CAAC;AAE/D,SAAQ,SAAS,aAAa;AAC5B,GAAC,YAAY;GACX,MAAM,kBAAkB,IAAI,iBAAiB;AAE7C,WAAQ,KAAK,iBAAiB;AAC5B,oBAAgB,OAAO;KACvB;AACF,WAAQ,KAAK,eAAe;AAC1B,oBAAgB,OAAO;KACvB;AACF,WAAQ,KAAK,eAAe;AAC1B,oBAAgB,OAAO;KACvB;AAEF,OAAI,QAAQ,aAAa,QAAQ,SAAS;AACxC,aAAS,KAAK,MAAM,sBAAsB;AAC1C,oBAAgB,OAAO;;AAGzB,OAAI;IACF,MAAM,MAAM,QAAQ;IACpB,MAAM,iBAAiB,SAAS,MAAM,QAAQ;IAE9C,MAAM,OAAO,MAAM,QAAQ,OAAO;KAChC;KACA,SAAS,QAAQ;KACjB,MAAM;KACN,WAAW,EAAE;KACb,aAAa,gBAAgB;KAC9B,CAAC;AAEF,QAAI,SAAS,UACX;AAGF,aAAS,UAAU,KAAK,YAAY,KAAK,QAAQ;IACjD,MAAM,cAAc,SAAS,MAC3B,SACD;AACD,UAAM,KAAK,KAAK,OAAO,YAAY;YAC5B,GAAG;IACV,MAAM,QAAQ,YAAY,EAAE;IAE5B,MAAM,SACJ,0BACE,SAAS,iBACT,QAAQ,KACR,QAAQ,QACT,IAAI,SAAS;AAChB,QAAI,MAAM,SAAS,aACjB,QAAO,MACL,sCACE,MAAM,UACN,mOAMH;QAED,QAAO,MACL,oCAAoC,MAAM,SAAS,MAAM,SAC1D;AAGH,aAAS,QAAQ,MAAM;AACvB,oBAAgB,OAAO;;MAEvB,CAAC,YAAY,GAAG"}
1
+ {"version":3,"file":"node_endpoint.js","names":[],"sources":["../../src/endpoint/node_endpoint.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 type { RestateEndpoint } from \"../index.js\";\nimport type {\n JournalValueCodec,\n ServiceDefinition,\n VirtualObjectDefinition,\n WorkflowDefinition,\n} from \"@restatedev/restate-sdk-core\";\nimport { Http2ServerRequest, Http2ServerResponse } from \"http2\";\nimport * as http2 from \"http2\";\nimport type { Endpoint } from \"./endpoint.js\";\nimport { EndpointBuilder } from \"./endpoint.js\";\nimport { createRestateHandler } from \"./handlers/generic.js\";\nimport { ensureError } from \"../types/errors.js\";\nimport type { LoggerTransport } from \"../logging/logger_transport.js\";\nimport type { DefaultServiceOptions } from \"../endpoint.js\";\nimport { tryCreateContextualLogger } from \"./handlers/utils.js\";\nimport { InputReader, OutputWriter } from \"./handlers/types.js\";\n\nexport class NodeEndpoint implements RestateEndpoint {\n private builder: EndpointBuilder = new EndpointBuilder();\n\n public bind<P extends string, M>(\n definition:\n | ServiceDefinition<P, M>\n | VirtualObjectDefinition<P, M>\n | WorkflowDefinition<P, M>\n ): RestateEndpoint {\n this.builder.bind(definition);\n return this;\n }\n\n public withIdentityV1(...keys: string[]): RestateEndpoint {\n this.builder.addIdentityKeys(...keys);\n return this;\n }\n\n public defaultServiceOptions(\n options: DefaultServiceOptions\n ): RestateEndpoint {\n this.builder.setDefaultServiceOptions(options);\n return this;\n }\n\n public setLogger(logger: LoggerTransport): RestateEndpoint {\n this.builder.setLogger(logger);\n return this;\n }\n\n public journalValueCodecProvider(\n codecProvider: () => Promise<JournalValueCodec>\n ): RestateEndpoint {\n this.builder.setJournalValueCodecProvider(codecProvider);\n return this;\n }\n\n http2Handler(): (\n request: Http2ServerRequest,\n response: Http2ServerResponse\n ) => void {\n return nodeHttp2Handler(this.builder.build());\n }\n\n listen(port?: number): Promise<number> {\n const endpoint = this.builder.build();\n\n const actualPort = port ?? parseInt(process.env.PORT ?? \"9080\");\n endpoint.rlog.info(`Restate SDK started listening on ${actualPort}...`);\n\n const server = http2.createServer(nodeHttp2Handler(endpoint));\n\n return new Promise((resolve, reject) => {\n let failed = false;\n server.once(\"error\", (e: Error) => {\n failed = true;\n reject(e);\n });\n server.listen(actualPort, () => {\n if (failed) {\n return;\n }\n const address = server.address();\n if (address === null || typeof address === \"string\") {\n reject(\n new TypeError(\n \"endpoint.listen() currently supports only binding to a PORT\"\n )\n );\n } else {\n resolve(address.port);\n }\n });\n });\n }\n}\n\nfunction nodeHttp2Handler(\n endpoint: Endpoint\n): (request: Http2ServerRequest, response: Http2ServerResponse) => void {\n const handler = createRestateHandler(endpoint, \"BIDI_STREAM\", {});\n\n return (httpRequest, httpResponse) => {\n const url = httpRequest.url;\n\n // Abort controller used to cleanup resources at the end of this stream lifecycle\n const abortController = new AbortController();\n httpRequest.on(\"close\", () => {\n // The 'close' event is emitted when the Http2Stream is destroyed.\n abortController.abort();\n });\n\n const restateResponse = handler.handle({\n url,\n headers: httpRequest.headers,\n extraArgs: [],\n });\n\n httpResponse.writeHead(restateResponse.statusCode, restateResponse.headers);\n\n restateResponse\n .process({\n inputReader: inputReaderAdapter(httpRequest),\n outputWriter: outputWriterAdapter(httpResponse),\n abortSignal: abortController.signal,\n })\n .catch((e) => {\n // handle should never throw\n const error = ensureError(e);\n const logger =\n tryCreateContextualLogger(\n endpoint.loggerTransport,\n url,\n httpRequest.headers\n ) ?? endpoint.rlog;\n logger.error(\"Unexpected error: \" + (error.stack ?? error.message));\n });\n };\n}\n\nfunction inputReaderAdapter(request: Http2ServerRequest): InputReader {\n return request[Symbol.asyncIterator]();\n}\n\nfunction outputWriterAdapter(response: Http2ServerResponse): OutputWriter {\n return {\n write: function (value: Uint8Array): Promise<void> {\n return new Promise((resolve, reject) => {\n response.write(value, (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n },\n close: function (): Promise<void> {\n return new Promise((resolve) => {\n response.end(() => resolve());\n });\n },\n };\n}\n"],"mappings":";;;;;;;AA6BA,IAAa,eAAb,MAAqD;CACnD,AAAQ,UAA2B,IAAI,iBAAiB;CAExD,AAAO,KACL,YAIiB;AACjB,OAAK,QAAQ,KAAK,WAAW;AAC7B,SAAO;;CAGT,AAAO,eAAe,GAAG,MAAiC;AACxD,OAAK,QAAQ,gBAAgB,GAAG,KAAK;AACrC,SAAO;;CAGT,AAAO,sBACL,SACiB;AACjB,OAAK,QAAQ,yBAAyB,QAAQ;AAC9C,SAAO;;CAGT,AAAO,UAAU,QAA0C;AACzD,OAAK,QAAQ,UAAU,OAAO;AAC9B,SAAO;;CAGT,AAAO,0BACL,eACiB;AACjB,OAAK,QAAQ,6BAA6B,cAAc;AACxD,SAAO;;CAGT,eAGU;AACR,SAAO,iBAAiB,KAAK,QAAQ,OAAO,CAAC;;CAG/C,OAAO,MAAgC;EACrC,MAAM,WAAW,KAAK,QAAQ,OAAO;EAErC,MAAM,aAAa,QAAQ,SAAS,QAAQ,IAAI,QAAQ,OAAO;AAC/D,WAAS,KAAK,KAAK,oCAAoC,WAAW,KAAK;EAEvE,MAAM,SAAS,MAAM,aAAa,iBAAiB,SAAS,CAAC;AAE7D,SAAO,IAAI,SAAS,SAAS,WAAW;GACtC,IAAI,SAAS;AACb,UAAO,KAAK,UAAU,MAAa;AACjC,aAAS;AACT,WAAO,EAAE;KACT;AACF,UAAO,OAAO,kBAAkB;AAC9B,QAAI,OACF;IAEF,MAAM,UAAU,OAAO,SAAS;AAChC,QAAI,YAAY,QAAQ,OAAO,YAAY,SACzC,wBACE,IAAI,UACF,8DACD,CACF;QAED,SAAQ,QAAQ,KAAK;KAEvB;IACF;;;AAIN,SAAS,iBACP,UACsE;CACtE,MAAM,UAAU,qBAAqB,UAAU,eAAe,EAAE,CAAC;AAEjE,SAAQ,aAAa,iBAAiB;EACpC,MAAM,MAAM,YAAY;EAGxB,MAAM,kBAAkB,IAAI,iBAAiB;AAC7C,cAAY,GAAG,eAAe;AAE5B,mBAAgB,OAAO;IACvB;EAEF,MAAM,kBAAkB,QAAQ,OAAO;GACrC;GACA,SAAS,YAAY;GACrB,WAAW,EAAE;GACd,CAAC;AAEF,eAAa,UAAU,gBAAgB,YAAY,gBAAgB,QAAQ;AAE3E,kBACG,QAAQ;GACP,aAAa,mBAAmB,YAAY;GAC5C,cAAc,oBAAoB,aAAa;GAC/C,aAAa,gBAAgB;GAC9B,CAAC,CACD,OAAO,MAAM;GAEZ,MAAM,QAAQ,YAAY,EAAE;AAO5B,IALE,0BACE,SAAS,iBACT,KACA,YAAY,QACb,IAAI,SAAS,MACT,MAAM,wBAAwB,MAAM,SAAS,MAAM,SAAS;IACnE;;;AAIR,SAAS,mBAAmB,SAA0C;AACpE,QAAO,QAAQ,OAAO,gBAAgB;;AAGxC,SAAS,oBAAoB,UAA6C;AACxE,QAAO;EACL,OAAO,SAAU,OAAkC;AACjD,UAAO,IAAI,SAAS,SAAS,WAAW;AACtC,aAAS,MAAM,QAAQ,QAAQ;AAC7B,SAAI,IACF,QAAO,IAAI;SAEX,UAAS;MAEX;KACF;;EAEJ,OAAO,WAA2B;AAChC,UAAO,IAAI,SAAS,YAAY;AAC9B,aAAS,UAAU,SAAS,CAAC;KAC7B;;EAEL"}
package/dist/io.cjs CHANGED
@@ -20,13 +20,13 @@ var InputPump = class {
20
20
  async readNext() {
21
21
  let nextValue;
22
22
  try {
23
- nextValue = await this.inputReader.read();
23
+ nextValue = await this.inputReader.next();
24
24
  } catch (e) {
25
25
  this.errorCallback(e);
26
26
  return require_promises.pendingPromise();
27
27
  }
28
- if (nextValue.value !== void 0) this.coreVm.notify_input(nextValue.value);
29
28
  if (nextValue.done) this.coreVm.notify_input_closed();
29
+ else if (nextValue.value !== void 0) this.coreVm.notify_input(nextValue.value);
30
30
  }
31
31
  };
32
32
  /**
package/dist/io.js CHANGED
@@ -20,13 +20,13 @@ var InputPump = class {
20
20
  async readNext() {
21
21
  let nextValue;
22
22
  try {
23
- nextValue = await this.inputReader.read();
23
+ nextValue = await this.inputReader.next();
24
24
  } catch (e) {
25
25
  this.errorCallback(e);
26
26
  return pendingPromise();
27
27
  }
28
- if (nextValue.value !== void 0) this.coreVm.notify_input(nextValue.value);
29
28
  if (nextValue.done) this.coreVm.notify_input_closed();
29
+ else if (nextValue.value !== void 0) this.coreVm.notify_input(nextValue.value);
30
30
  }
31
31
  };
32
32
  /**
package/dist/io.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"io.js","names":["coreVm: vm.WasmVM","inputReader: ReadableStreamDefaultReader<Uint8Array>","errorCallback: (e: any) => void","nextValue: ReadableStreamReadResult<Uint8Array>","outputWriter: WritableStreamDefaultWriter<Uint8Array>"],"sources":["../src/io.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 * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport type {\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from \"node:stream/web\";\nimport type { ReadableStreamReadResult } from \"stream/web\";\nimport { pendingPromise } from \"./promises.js\";\n\n/**\n * Adapter between input stream and vm. It moves forward when [awaitNextProgress] is invoked.\n */\nexport class InputPump {\n private currentRead?: Promise<void>;\n\n constructor(\n private readonly coreVm: vm.WasmVM,\n private readonly inputReader: ReadableStreamDefaultReader<Uint8Array>,\n private readonly errorCallback: (e: any) => void\n ) {}\n\n // This function triggers a read on the input reader,\n // and will notify the caller that a read was executed\n // and the result was piped in the state machine.\n awaitNextProgress(): Promise<void> {\n if (this.currentRead === undefined) {\n // Register a new read\n this.currentRead = this.readNext().finally(() => {\n this.currentRead = undefined;\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return new Promise<void>((resolve) => this.currentRead?.finally(resolve));\n }\n\n private async readNext(): Promise<void> {\n // Take input, and notify it to the vm\n let nextValue: ReadableStreamReadResult<Uint8Array>;\n try {\n nextValue = await this.inputReader.read();\n } catch (e) {\n this.errorCallback(e);\n return pendingPromise<void>();\n }\n if (nextValue.value !== undefined) {\n this.coreVm.notify_input(nextValue.value);\n }\n if (nextValue.done) {\n this.coreVm.notify_input_closed();\n }\n }\n}\n\n/**\n * Adapter between output stream and vm. It moves forward when [awaitNextProgress] is invoked.\n */\nexport class OutputPump {\n constructor(\n private readonly coreVm: vm.WasmVM,\n private readonly outputWriter: WritableStreamDefaultWriter<Uint8Array>\n ) {}\n\n async awaitNextProgress() {\n const nextOutput = this.coreVm.take_output() as\n | Uint8Array\n | null\n | undefined;\n if (nextOutput instanceof Uint8Array) {\n await this.outputWriter.write(nextOutput);\n }\n }\n}\n"],"mappings":";;;;;;AAwBA,IAAa,YAAb,MAAuB;CACrB,AAAQ;CAER,YACE,AAAiBA,QACjB,AAAiBC,aACjB,AAAiBC,eACjB;EAHiB;EACA;EACA;;CAMnB,oBAAmC;AACjC,MAAI,KAAK,gBAAgB,OAEvB,MAAK,cAAc,KAAK,UAAU,CAAC,cAAc;AAC/C,QAAK,cAAc;IACnB;AAIJ,SAAO,IAAI,SAAe,YAAY,KAAK,aAAa,QAAQ,QAAQ,CAAC;;CAG3E,MAAc,WAA0B;EAEtC,IAAIC;AACJ,MAAI;AACF,eAAY,MAAM,KAAK,YAAY,MAAM;WAClC,GAAG;AACV,QAAK,cAAc,EAAE;AACrB,UAAO,gBAAsB;;AAE/B,MAAI,UAAU,UAAU,OACtB,MAAK,OAAO,aAAa,UAAU,MAAM;AAE3C,MAAI,UAAU,KACZ,MAAK,OAAO,qBAAqB;;;;;;AAQvC,IAAa,aAAb,MAAwB;CACtB,YACE,AAAiBH,QACjB,AAAiBI,cACjB;EAFiB;EACA;;CAGnB,MAAM,oBAAoB;EACxB,MAAM,aAAa,KAAK,OAAO,aAAa;AAI5C,MAAI,sBAAsB,WACxB,OAAM,KAAK,aAAa,MAAM,WAAW"}
1
+ {"version":3,"file":"io.js","names":["coreVm: vm.WasmVM","inputReader: InputReader","errorCallback: (e: any) => void","outputWriter: OutputWriter"],"sources":["../src/io.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 * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport { pendingPromise } from \"./promises.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\n\n/**\n * Adapter between input stream and vm. It moves forward when [awaitNextProgress] is invoked.\n */\nexport class InputPump {\n private currentRead?: Promise<void>;\n\n constructor(\n private readonly coreVm: vm.WasmVM,\n private readonly inputReader: InputReader,\n private readonly errorCallback: (e: any) => void\n ) {}\n\n // This function triggers a read on the input reader,\n // and will notify the caller that a read was executed\n // and the result was piped in the state machine.\n awaitNextProgress(): Promise<void> {\n if (this.currentRead === undefined) {\n // Register a new read\n this.currentRead = this.readNext().finally(() => {\n this.currentRead = undefined;\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return new Promise<void>((resolve) => this.currentRead?.finally(resolve));\n }\n\n private async readNext(): Promise<void> {\n // Take input, and notify it to the vm\n let nextValue;\n try {\n nextValue = await this.inputReader.next();\n } catch (e) {\n this.errorCallback(e);\n return pendingPromise<void>();\n }\n if (nextValue.done) {\n this.coreVm.notify_input_closed();\n } else if (nextValue.value !== undefined) {\n this.coreVm.notify_input(nextValue.value);\n }\n }\n}\n\n/**\n * Adapter between output stream and vm. It moves forward when [awaitNextProgress] is invoked.\n */\nexport class OutputPump {\n constructor(\n private readonly coreVm: vm.WasmVM,\n private readonly outputWriter: OutputWriter\n ) {}\n\n async awaitNextProgress() {\n const nextOutput = this.coreVm.take_output() as\n | Uint8Array\n | null\n | undefined;\n if (nextOutput instanceof Uint8Array) {\n await this.outputWriter.write(nextOutput);\n }\n }\n}\n"],"mappings":";;;;;;AAoBA,IAAa,YAAb,MAAuB;CACrB,AAAQ;CAER,YACE,AAAiBA,QACjB,AAAiBC,aACjB,AAAiBC,eACjB;EAHiB;EACA;EACA;;CAMnB,oBAAmC;AACjC,MAAI,KAAK,gBAAgB,OAEvB,MAAK,cAAc,KAAK,UAAU,CAAC,cAAc;AAC/C,QAAK,cAAc;IACnB;AAIJ,SAAO,IAAI,SAAe,YAAY,KAAK,aAAa,QAAQ,QAAQ,CAAC;;CAG3E,MAAc,WAA0B;EAEtC,IAAI;AACJ,MAAI;AACF,eAAY,MAAM,KAAK,YAAY,MAAM;WAClC,GAAG;AACV,QAAK,cAAc,EAAE;AACrB,UAAO,gBAAsB;;AAE/B,MAAI,UAAU,KACZ,MAAK,OAAO,qBAAqB;WACxB,UAAU,UAAU,OAC7B,MAAK,OAAO,aAAa,UAAU,MAAM;;;;;;AAQ/C,IAAa,aAAb,MAAwB;CACtB,YACE,AAAiBF,QACjB,AAAiBG,cACjB;EAFiB;EACA;;CAGnB,MAAM,oBAAoB;EACxB,MAAM,aAAa,KAAK,OAAO,aAAa;AAI5C,MAAI,sBAAsB,WACxB,OAAM,KAAK,aAAa,MAAM,WAAW"}
package/dist/package.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  //#region package.json
3
- var version = "1.10.4";
3
+ var version = "1.11.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.10.4";
2
+ var version = "1.11.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.10.4\",\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.11.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"}
@@ -47,8 +47,10 @@ var RestateError = class extends Error {
47
47
  */
48
48
  var TerminalError = class extends RestateError {
49
49
  name = "TerminalError";
50
+ metadata;
50
51
  constructor(message, options) {
51
52
  super(message, options);
53
+ this.metadata = options?.metadata ?? {};
52
54
  }
53
55
  };
54
56
  /**
@@ -17,6 +17,7 @@ declare class RestateError extends Error {
17
17
  */
18
18
  declare class TerminalError extends RestateError {
19
19
  name: string;
20
+ readonly metadata?: Record<string, string>;
20
21
  constructor(message: string, options?: {
21
22
  /**
22
23
  * Error code. This should be an HTTP status code, and in case the service was invoked from the ingress, this will be propagated back to the caller.
@@ -26,6 +27,13 @@ declare class TerminalError extends RestateError {
26
27
  * @deprecated YOU MUST NOT USE THIS FIELD, AS IT WON'T BE RECORDED AND CAN LEAD TO NON-DETERMINISM! From the next SDK version, the constructor won't accept this field anymore.
27
28
  */
28
29
  cause?: any;
30
+ /**
31
+ * Metadata key-value pairs to attach to the terminal error.
32
+ * These will be recorded together with error message and code.
33
+ *
34
+ * **Note **: requires Restate 1.6+.
35
+ */
36
+ metadata?: Record<string, string>;
29
37
  });
30
38
  }
31
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.cts","names":[],"sources":["../../src/types/errors.ts"],"sourcesContent":[],"mappings":";;;;AAsJwB,cAzEX,YAAA,SAAqB,KAAA,CAyEV;EAIV,SAAA,IAAA,EAAA,MAAA;EAgBsB,IAAA,EAAA,MAAA;EAAwB,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA;IAvBxB,SAAA,CAAA,EAAA,MAAA;IAAY,KAAA,CAAA,EAAA,GAAA;;;;;;;;cAvDnC,aAAA,SAAsB,YAAA;;;;;;;;;;;;;;;;cAuBtB,YAAA,SAAqB,aAAA;;;;;;;cAWrB,cAAA,SAAuB,aAAA;;;;UAQnB,qBAAA;;;;eAIF;;;;;;;;cASF,cAAA,SAAuB,YAAA;;wBAGZ;yCAIV;;;;;;;oCAgBsB,wBAAwB"}
1
+ {"version":3,"file":"errors.d.cts","names":[],"sources":["../../src/types/errors.ts"],"sourcesContent":[],"mappings":";;;;AA4Ha,cA/CA,YAAA,SAAqB,KAAA,CA+Ca;EAWlC,SAAA,IAAA,EAAA,MAAe;EAQX,IAAA,EAAA,MAAA;EAaJ,WAAA,CAAA,OAAe,EAAA,MAAA,EAAA,OAuBQ,CAvBR,EAAA;IAGJ,SAAA,CAAA,EAAA,MAAA;IAIV,KAAA,CAAA,EAAA,GAAA;EAgBsB,CAAA;;;;;;;cAvFvB,aAAA,SAAsB,YAAA;;sBAEN;;;;;;;;;;;;;;;;eAmBZ;;;;;;cAWJ,YAAA,SAAqB,aAAA;;;;;;;cAWrB,cAAA,SAAuB,aAAA;;;;UAQnB,qBAAA;;;;eAIF;;;;;;;;cASF,cAAA,SAAuB,YAAA;;wBAGZ;yCAIV;;;;;;;oCAgBsB,wBAAwB"}
@@ -17,6 +17,7 @@ declare class RestateError extends Error {
17
17
  */
18
18
  declare class TerminalError extends RestateError {
19
19
  name: string;
20
+ readonly metadata?: Record<string, string>;
20
21
  constructor(message: string, options?: {
21
22
  /**
22
23
  * Error code. This should be an HTTP status code, and in case the service was invoked from the ingress, this will be propagated back to the caller.
@@ -26,6 +27,13 @@ declare class TerminalError extends RestateError {
26
27
  * @deprecated YOU MUST NOT USE THIS FIELD, AS IT WON'T BE RECORDED AND CAN LEAD TO NON-DETERMINISM! From the next SDK version, the constructor won't accept this field anymore.
27
28
  */
28
29
  cause?: any;
30
+ /**
31
+ * Metadata key-value pairs to attach to the terminal error.
32
+ * These will be recorded together with error message and code.
33
+ *
34
+ * **Note **: requires Restate 1.6+.
35
+ */
36
+ metadata?: Record<string, string>;
29
37
  });
30
38
  }
31
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/types/errors.ts"],"sourcesContent":[],"mappings":";;;;AAsJwB,cAzEX,YAAA,SAAqB,KAAA,CAyEV;EAIV,SAAA,IAAA,EAAA,MAAA;EAgBsB,IAAA,EAAA,MAAA;EAAwB,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA;IAvBxB,SAAA,CAAA,EAAA,MAAA;IAAY,KAAA,CAAA,EAAA,GAAA;;;;;;;;cAvDnC,aAAA,SAAsB,YAAA;;;;;;;;;;;;;;;;cAuBtB,YAAA,SAAqB,aAAA;;;;;;;cAWrB,cAAA,SAAuB,aAAA;;;;UAQnB,qBAAA;;;;eAIF;;;;;;;;cASF,cAAA,SAAuB,YAAA;;wBAGZ;yCAIV;;;;;;;oCAgBsB,wBAAwB"}
1
+ {"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/types/errors.ts"],"sourcesContent":[],"mappings":";;;;AA4Ha,cA/CA,YAAA,SAAqB,KAAA,CA+Ca;EAWlC,SAAA,IAAA,EAAA,MAAe;EAQX,IAAA,EAAA,MAAA;EAaJ,WAAA,CAAA,OAAe,EAAA,MAAA,EAAA,OAuBQ,CAvBR,EAAA;IAGJ,SAAA,CAAA,EAAA,MAAA;IAIV,KAAA,CAAA,EAAA,GAAA;EAgBsB,CAAA;;;;;;;cAvFvB,aAAA,SAAsB,YAAA;;sBAEN;;;;;;;;;;;;;;;;eAmBZ;;;;;;cAWJ,YAAA,SAAqB,aAAA;;;;;;;cAWrB,cAAA,SAAuB,aAAA;;;;UAQnB,qBAAA;;;;eAIF;;;;;;;;cASF,cAAA,SAAuB,YAAA;;wBAGZ;yCAIV;;;;;;;oCAgBsB,wBAAwB"}
@@ -46,8 +46,10 @@ var RestateError = class extends Error {
46
46
  */
47
47
  var TerminalError = class extends RestateError {
48
48
  name = "TerminalError";
49
+ metadata;
49
50
  constructor(message, options) {
50
51
  super(message, options);
52
+ this.metadata = options?.metadata ?? {};
51
53
  }
52
54
  };
53
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../../src/types/errors.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 { Duration } from \"@restatedev/restate-sdk-core\";\n\nexport const INTERNAL_ERROR_CODE = 500;\nexport const TIMEOUT_ERROR_CODE = 408;\nexport const CANCEL_ERROR_CODE = 409;\nexport const UNKNOWN_ERROR_CODE = 500;\n\n// From shared core!\nexport const CLOSED_ERROR_CODE = 598;\nexport const SUSPENDED_ERROR_CODE = 599;\n\nexport function ensureError(\n e: unknown,\n asTerminalError?: (error: any) => TerminalError | undefined\n): Error {\n if (e instanceof TerminalError) {\n return e;\n }\n // Try convert to terminal error\n const maybeTerminalError = asTerminalError ? asTerminalError(e) : undefined;\n if (maybeTerminalError) {\n return maybeTerminalError;\n }\n\n if (e instanceof Error) {\n return e;\n }\n if (typeof e === \"object\" && e !== null && \"code\" in e && \"message\" in e) {\n // This is an error from the VM\n return new RestateError(e.message as string, {\n errorCode: e.code as number,\n });\n }\n\n // None of the types we know\n let msg;\n try {\n msg = JSON.stringify(e);\n } catch {\n msg = \"(no JSON representation)\";\n }\n\n return new Error(\"Non-Error value: \" + msg);\n}\n\nexport function logError(log: Console, e: unknown) {\n if (e instanceof RestateError) {\n if (e.code === SUSPENDED_ERROR_CODE) {\n log.info(\"Invocation suspended\");\n return;\n } else if (e.code === CLOSED_ERROR_CODE) {\n log.error(\n \"DANGER! The invocation is closed, but some related operation is still running. \\n\" +\n \"This might indicate that a RestatePromise is being awaited on an asynchronous task, outside the handler, or you're awaiting a RestatePromise inside a ctx.run.\\n\" +\n \"This is dangerous, and can lead the service to deadlock. Please fix the issue.\\n\" +\n \"Diagnostic: \",\n e\n );\n return;\n }\n }\n log.warn(\"Error when processing a Restate context operation.\\n\", e);\n}\n\nexport class RestateError extends Error {\n public readonly code: number;\n public override name = \"RestateError\";\n\n constructor(message: string, options?: { errorCode?: number; cause?: any }) {\n super(message, { cause: options?.cause });\n this.code = options?.errorCode ?? INTERNAL_ERROR_CODE;\n }\n}\n\n/**\n * Does not lead to Restate retries.\n *\n * Leads to an output message with a failure defined.\n */\nexport class TerminalError extends RestateError {\n public override name = \"TerminalError\";\n\n constructor(\n message: string,\n options?: {\n /**\n * Error code. This should be an HTTP status code, and in case the service was invoked from the ingress, this will be propagated back to the caller.\n */\n errorCode?: number;\n /**\n * @deprecated YOU MUST NOT USE THIS FIELD, AS IT WON'T BE RECORDED AND CAN LEAD TO NON-DETERMINISM! From the next SDK version, the constructor won't accept this field anymore.\n */\n cause?: any;\n }\n ) {\n super(message, options);\n }\n}\n\n/**\n * Returned by `RestatePromise.withTimeout` when the timeout is reached.\n */\nexport class TimeoutError extends TerminalError {\n public override name = \"TimeoutError\";\n\n constructor() {\n super(\"Timeout occurred\", { errorCode: TIMEOUT_ERROR_CODE });\n }\n}\n\n/**\n * Returned when the invocation was cancelled.\n */\nexport class CancelledError extends TerminalError {\n public override name = \"CancelledError\";\n\n constructor() {\n super(\"Cancelled\", { errorCode: CANCEL_ERROR_CODE });\n }\n}\n\nexport interface RetryableErrorOptions {\n /**\n * In how long it should retry.\n */\n retryAfter?: Duration | number;\n}\n\n/**\n * Error that Restate will retry. By using this error type within a `ctx.run` closure,\n * you can dynamically provide the retry delay specified in {@link RetryableErrorOptions}.\n *\n * You can wrap another error using {@link from}.\n */\nexport class RetryableError extends RestateError {\n public override name = \"RetryableError\";\n\n readonly retryAfter?: Duration | number;\n\n constructor(\n message: string,\n options?: RetryableErrorOptions & {\n errorCode?: number;\n cause?: any;\n }\n ) {\n super(message, {\n errorCode: options?.errorCode,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n cause: options?.cause,\n });\n this.retryAfter = options?.retryAfter;\n }\n\n /**\n * Create a `RetryableError` from the given cause.\n */\n static from(cause: any, options?: RetryableErrorOptions): RetryableError {\n const error = ensureError(cause);\n return new RetryableError(error.message, {\n errorCode: error[\"errorCode\" as keyof typeof error] as number,\n cause: cause,\n ...options,\n });\n }\n}\n"],"mappings":";AAeA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAClC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAGlC,MAAa,oBAAoB;AACjC,MAAa,uBAAuB;AAEpC,SAAgB,YACd,GACA,iBACO;AACP,KAAI,aAAa,cACf,QAAO;CAGT,MAAM,qBAAqB,kBAAkB,gBAAgB,EAAE,GAAG;AAClE,KAAI,mBACF,QAAO;AAGT,KAAI,aAAa,MACf,QAAO;AAET,KAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,UAAU,KAAK,aAAa,EAErE,QAAO,IAAI,aAAa,EAAE,SAAmB,EAC3C,WAAW,EAAE,MACd,CAAC;CAIJ,IAAI;AACJ,KAAI;AACF,QAAM,KAAK,UAAU,EAAE;SACjB;AACN,QAAM;;AAGR,wBAAO,IAAI,MAAM,sBAAsB,IAAI;;AAG7C,SAAgB,SAAS,KAAc,GAAY;AACjD,KAAI,aAAa,cACf;MAAI,EAAE,SAAS,sBAAsB;AACnC,OAAI,KAAK,uBAAuB;AAChC;aACS,EAAE,SAAS,mBAAmB;AACvC,OAAI,MACF,iVAIA,EACD;AACD;;;AAGJ,KAAI,KAAK,wDAAwD,EAAE;;AAGrE,IAAa,eAAb,cAAkC,MAAM;CACtC,AAAgB;CAChB,AAAgB,OAAO;CAEvB,YAAY,SAAiB,SAA+C;AAC1E,QAAM,SAAS,EAAE,OAAO,SAAS,OAAO,CAAC;AACzC,OAAK,OAAO,SAAS,aAAa;;;;;;;;AAStC,IAAa,gBAAb,cAAmC,aAAa;CAC9C,AAAgB,OAAO;CAEvB,YACE,SACA,SAUA;AACA,QAAM,SAAS,QAAQ;;;;;;AAO3B,IAAa,eAAb,cAAkC,cAAc;CAC9C,AAAgB,OAAO;CAEvB,cAAc;AACZ,QAAM,oBAAoB,EAAE,WAAW,oBAAoB,CAAC;;;;;;AAOhE,IAAa,iBAAb,cAAoC,cAAc;CAChD,AAAgB,OAAO;CAEvB,cAAc;AACZ,QAAM,aAAa,EAAE,WAAW,mBAAmB,CAAC;;;;;;;;;AAiBxD,IAAa,iBAAb,MAAa,uBAAuB,aAAa;CAC/C,AAAgB,OAAO;CAEvB,AAAS;CAET,YACE,SACA,SAIA;AACA,QAAM,SAAS;GACb,WAAW,SAAS;GAEpB,OAAO,SAAS;GACjB,CAAC;AACF,OAAK,aAAa,SAAS;;;;;CAM7B,OAAO,KAAK,OAAY,SAAiD;EACvE,MAAM,QAAQ,YAAY,MAAM;AAChC,SAAO,IAAI,eAAe,MAAM,SAAS;GACvC,WAAW,MAAM;GACV;GACP,GAAG;GACJ,CAAC"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../../src/types/errors.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 { Duration } from \"@restatedev/restate-sdk-core\";\n\nexport const INTERNAL_ERROR_CODE = 500;\nexport const TIMEOUT_ERROR_CODE = 408;\nexport const CANCEL_ERROR_CODE = 409;\nexport const UNKNOWN_ERROR_CODE = 500;\n\n// From shared core!\nexport const CLOSED_ERROR_CODE = 598;\nexport const SUSPENDED_ERROR_CODE = 599;\n\nexport function ensureError(\n e: unknown,\n asTerminalError?: (error: any) => TerminalError | undefined\n): Error {\n if (e instanceof TerminalError) {\n return e;\n }\n // Try convert to terminal error\n const maybeTerminalError = asTerminalError ? asTerminalError(e) : undefined;\n if (maybeTerminalError) {\n return maybeTerminalError;\n }\n\n if (e instanceof Error) {\n return e;\n }\n if (typeof e === \"object\" && e !== null && \"code\" in e && \"message\" in e) {\n // This is an error from the VM\n return new RestateError(e.message as string, {\n errorCode: e.code as number,\n });\n }\n\n // None of the types we know\n let msg;\n try {\n msg = JSON.stringify(e);\n } catch {\n msg = \"(no JSON representation)\";\n }\n\n return new Error(\"Non-Error value: \" + msg);\n}\n\nexport function logError(log: Console, e: unknown) {\n if (e instanceof RestateError) {\n if (e.code === SUSPENDED_ERROR_CODE) {\n log.info(\"Invocation suspended\");\n return;\n } else if (e.code === CLOSED_ERROR_CODE) {\n log.error(\n \"DANGER! The invocation is closed, but some related operation is still running. \\n\" +\n \"This might indicate that a RestatePromise is being awaited on an asynchronous task, outside the handler, or you're awaiting a RestatePromise inside a ctx.run.\\n\" +\n \"This is dangerous, and can lead the service to deadlock. Please fix the issue.\\n\" +\n \"Diagnostic: \",\n e\n );\n return;\n }\n }\n log.warn(\"Error when processing a Restate context operation.\\n\", e);\n}\n\nexport class RestateError extends Error {\n public readonly code: number;\n public override name = \"RestateError\";\n\n constructor(message: string, options?: { errorCode?: number; cause?: any }) {\n super(message, { cause: options?.cause });\n this.code = options?.errorCode ?? INTERNAL_ERROR_CODE;\n }\n}\n\n/**\n * Does not lead to Restate retries.\n *\n * Leads to an output message with a failure defined.\n */\nexport class TerminalError extends RestateError {\n public override name = \"TerminalError\";\n public readonly metadata?: Record<string, string>;\n\n constructor(\n message: string,\n options?: {\n /**\n * Error code. This should be an HTTP status code, and in case the service was invoked from the ingress, this will be propagated back to the caller.\n */\n errorCode?: number;\n /**\n * @deprecated YOU MUST NOT USE THIS FIELD, AS IT WON'T BE RECORDED AND CAN LEAD TO NON-DETERMINISM! From the next SDK version, the constructor won't accept this field anymore.\n */\n cause?: any;\n /**\n * Metadata key-value pairs to attach to the terminal error.\n * These will be recorded together with error message and code.\n *\n * **Note **: requires Restate 1.6+.\n */\n metadata?: Record<string, string>;\n }\n ) {\n super(message, options);\n this.metadata = options?.metadata ?? {};\n }\n}\n\n/**\n * Returned by `RestatePromise.withTimeout` when the timeout is reached.\n */\nexport class TimeoutError extends TerminalError {\n public override name = \"TimeoutError\";\n\n constructor() {\n super(\"Timeout occurred\", { errorCode: TIMEOUT_ERROR_CODE });\n }\n}\n\n/**\n * Returned when the invocation was cancelled.\n */\nexport class CancelledError extends TerminalError {\n public override name = \"CancelledError\";\n\n constructor() {\n super(\"Cancelled\", { errorCode: CANCEL_ERROR_CODE });\n }\n}\n\nexport interface RetryableErrorOptions {\n /**\n * In how long it should retry.\n */\n retryAfter?: Duration | number;\n}\n\n/**\n * Error that Restate will retry. By using this error type within a `ctx.run` closure,\n * you can dynamically provide the retry delay specified in {@link RetryableErrorOptions}.\n *\n * You can wrap another error using {@link from}.\n */\nexport class RetryableError extends RestateError {\n public override name = \"RetryableError\";\n\n readonly retryAfter?: Duration | number;\n\n constructor(\n message: string,\n options?: RetryableErrorOptions & {\n errorCode?: number;\n cause?: any;\n }\n ) {\n super(message, {\n errorCode: options?.errorCode,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n cause: options?.cause,\n });\n this.retryAfter = options?.retryAfter;\n }\n\n /**\n * Create a `RetryableError` from the given cause.\n */\n static from(cause: any, options?: RetryableErrorOptions): RetryableError {\n const error = ensureError(cause);\n return new RetryableError(error.message, {\n errorCode: error[\"errorCode\" as keyof typeof error] as number,\n cause: cause,\n ...options,\n });\n }\n}\n"],"mappings":";AAeA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAClC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAGlC,MAAa,oBAAoB;AACjC,MAAa,uBAAuB;AAEpC,SAAgB,YACd,GACA,iBACO;AACP,KAAI,aAAa,cACf,QAAO;CAGT,MAAM,qBAAqB,kBAAkB,gBAAgB,EAAE,GAAG;AAClE,KAAI,mBACF,QAAO;AAGT,KAAI,aAAa,MACf,QAAO;AAET,KAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,UAAU,KAAK,aAAa,EAErE,QAAO,IAAI,aAAa,EAAE,SAAmB,EAC3C,WAAW,EAAE,MACd,CAAC;CAIJ,IAAI;AACJ,KAAI;AACF,QAAM,KAAK,UAAU,EAAE;SACjB;AACN,QAAM;;AAGR,wBAAO,IAAI,MAAM,sBAAsB,IAAI;;AAG7C,SAAgB,SAAS,KAAc,GAAY;AACjD,KAAI,aAAa,cACf;MAAI,EAAE,SAAS,sBAAsB;AACnC,OAAI,KAAK,uBAAuB;AAChC;aACS,EAAE,SAAS,mBAAmB;AACvC,OAAI,MACF,iVAIA,EACD;AACD;;;AAGJ,KAAI,KAAK,wDAAwD,EAAE;;AAGrE,IAAa,eAAb,cAAkC,MAAM;CACtC,AAAgB;CAChB,AAAgB,OAAO;CAEvB,YAAY,SAAiB,SAA+C;AAC1E,QAAM,SAAS,EAAE,OAAO,SAAS,OAAO,CAAC;AACzC,OAAK,OAAO,SAAS,aAAa;;;;;;;;AAStC,IAAa,gBAAb,cAAmC,aAAa;CAC9C,AAAgB,OAAO;CACvB,AAAgB;CAEhB,YACE,SACA,SAiBA;AACA,QAAM,SAAS,QAAQ;AACvB,OAAK,WAAW,SAAS,YAAY,EAAE;;;;;;AAO3C,IAAa,eAAb,cAAkC,cAAc;CAC9C,AAAgB,OAAO;CAEvB,cAAc;AACZ,QAAM,oBAAoB,EAAE,WAAW,oBAAoB,CAAC;;;;;;AAOhE,IAAa,iBAAb,cAAoC,cAAc;CAChD,AAAgB,OAAO;CAEvB,cAAc;AACZ,QAAM,aAAa,EAAE,WAAW,mBAAmB,CAAC;;;;;;;;;AAiBxD,IAAa,iBAAb,MAAa,uBAAuB,aAAa;CAC/C,AAAgB,OAAO;CAEvB,AAAS;CAET,YACE,SACA,SAIA;AACA,QAAM,SAAS;GACb,WAAW,SAAS;GAEpB,OAAO,SAAS;GACjB,CAAC;AACF,OAAK,aAAa,SAAS;;;;;CAM7B,OAAO,KAAK,OAAY,SAAiD;EACvE,MAAM,QAAQ,YAAY,MAAM;AAChC,SAAO,IAAI,eAAe,MAAM,SAAS;GACvC,WAAW,MAAM;GACV;GACP,GAAG;GACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restatedev/restate-sdk-cloudflare-workers",
3
- "version": "1.10.4",
3
+ "version": "1.11.0",
4
4
  "description": "Typescript SDK for Restate",
5
5
  "author": "Restate Developers",
6
6
  "email": "code@restate.dev",
@@ -35,11 +35,11 @@
35
35
  "access": "public"
36
36
  },
37
37
  "dependencies": {
38
- "@restatedev/restate-sdk-core": "1.10.4"
38
+ "@restatedev/restate-sdk-core": "1.11.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/aws-lambda": "^8.10.115",
42
- "@restatedev/restate-sdk": "1.10.4"
42
+ "@restatedev/restate-sdk": "1.11.0"
43
43
  },
44
44
  "typesVersions": {
45
45
  "*": {
@@ -1,14 +0,0 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- let node_stream_web = require("node:stream/web");
3
- node_stream_web = require_rolldown_runtime.__toESM(node_stream_web);
4
-
5
- //#region src/utils/streams.ts
6
- function OnceStream(once) {
7
- return new node_stream_web.ReadableStream({ pull: (controller) => {
8
- controller.enqueue(once);
9
- controller.close();
10
- } });
11
- }
12
-
13
- //#endregion
14
- exports.OnceStream = OnceStream;
@@ -1,13 +0,0 @@
1
- import { ReadableStream } from "node:stream/web";
2
-
3
- //#region src/utils/streams.ts
4
- function OnceStream(once) {
5
- return new ReadableStream({ pull: (controller) => {
6
- controller.enqueue(once);
7
- controller.close();
8
- } });
9
- }
10
-
11
- //#endregion
12
- export { OnceStream };
13
- //# sourceMappingURL=streams.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streams.js","names":[],"sources":["../../src/utils/streams.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 { ReadableStream } from \"node:stream/web\";\n\nexport function OnceStream<T>(once: T): ReadableStream<T> {\n return new ReadableStream<T>({\n pull: (controller) => {\n controller.enqueue(once);\n controller.close();\n },\n });\n}\n"],"mappings":";;;AAaA,SAAgB,WAAc,MAA4B;AACxD,QAAO,IAAI,eAAkB,EAC3B,OAAO,eAAe;AACpB,aAAW,QAAQ,KAAK;AACxB,aAAW,OAAO;IAErB,CAAC"}