@restatedev/restate-sdk 1.14.4 → 1.15.0-rc.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 (55) hide show
  1. package/dist/common_api.d.cts +1 -1
  2. package/dist/common_api.d.cts.map +1 -1
  3. package/dist/common_api.d.ts +1 -1
  4. package/dist/common_api.d.ts.map +1 -1
  5. package/dist/common_api.js.map +1 -1
  6. package/dist/context.cjs +4 -4
  7. package/dist/context.d.cts +73 -8
  8. package/dist/context.d.cts.map +1 -1
  9. package/dist/context.d.ts +73 -8
  10. package/dist/context.d.ts.map +1 -1
  11. package/dist/context.js +4 -4
  12. package/dist/context.js.map +1 -1
  13. package/dist/context_impl.cjs +50 -47
  14. package/dist/context_impl.d.ts.map +1 -1
  15. package/dist/context_impl.js +50 -47
  16. package/dist/context_impl.js.map +1 -1
  17. package/dist/endpoint/endpoint.cjs +1 -1
  18. package/dist/endpoint/endpoint.js +1 -1
  19. package/dist/endpoint/endpoint.js.map +1 -1
  20. package/dist/endpoint/handlers/generic.cjs +1 -2
  21. package/dist/endpoint/handlers/generic.d.ts.map +1 -1
  22. package/dist/endpoint/handlers/generic.js +1 -2
  23. package/dist/endpoint/handlers/generic.js.map +1 -1
  24. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.cjs +789 -1084
  25. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.d.ts +135 -135
  26. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.d.ts.map +1 -1
  27. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js +789 -1084
  28. package/dist/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js.map +1 -1
  29. package/dist/fetch.d.cts +2 -2
  30. package/dist/fetch.d.ts +2 -2
  31. package/dist/index.d.cts +2 -2
  32. package/dist/index.d.ts +2 -2
  33. package/dist/internal.d.cts +2 -89
  34. package/dist/internal.d.cts.map +1 -1
  35. package/dist/internal.d.ts +2 -89
  36. package/dist/internal.d.ts.map +1 -1
  37. package/dist/internal.js.map +1 -1
  38. package/dist/lambda.d.cts +2 -2
  39. package/dist/lambda.d.ts +2 -2
  40. package/dist/node.d.cts +2 -2
  41. package/dist/node.d.ts +2 -2
  42. package/dist/package.cjs +1 -1
  43. package/dist/package.js +1 -1
  44. package/dist/package.js.map +1 -1
  45. package/dist/promises.cjs +23 -19
  46. package/dist/promises.d.cts.map +1 -1
  47. package/dist/promises.d.ts.map +1 -1
  48. package/dist/promises.js +23 -19
  49. package/dist/promises.js.map +1 -1
  50. package/package.json +2 -2
  51. package/dist/utils/completable_promise.cjs +0 -22
  52. package/dist/utils/completable_promise.d.ts +0 -9
  53. package/dist/utils/completable_promise.d.ts.map +0 -1
  54. package/dist/utils/completable_promise.js +0 -22
  55. package/dist/utils/completable_promise.js.map +0 -1
@@ -152,60 +152,63 @@ var ContextImpl = class {
152
152
  run(nameOrAction, actionSecondParameter, options) {
153
153
  const { name, action } = unpackRunParameters(nameOrAction, actionSecondParameter);
154
154
  const serde$1 = options?.serde ?? this.defaultSerde;
155
- let handle;
155
+ let wasmRun;
156
156
  try {
157
- handle = this.coreVm.sys_run(name ?? "");
157
+ wasmRun = this.coreVm.sys_run(name ?? "");
158
158
  } catch (e) {
159
159
  this.abortAttempt(e);
160
160
  return require_promises.ConstRestatePromise.pending();
161
161
  }
162
+ const handle = wasmRun.handle;
162
163
  const commandIndex = this.coreVm.last_command_index();
163
- const doRun = async () => {
164
- const startTime = Date.now();
165
- let res;
166
- let err;
167
- try {
168
- await this.runInterceptor(name ?? "", async () => {
169
- res = await action();
170
- });
171
- } catch (e) {
172
- err = require_errors.ensureError(e, this.asTerminalError);
173
- }
174
- const attemptDuration = Date.now() - startTime;
175
- try {
176
- if (err !== void 0) if (err instanceof require_errors.TerminalError) this.coreVm.propose_run_completion_failure(handle, {
177
- code: err.code,
178
- message: err.message,
179
- metadata: Object.entries(err.metadata ?? {}).map(([key, value]) => ({
180
- key,
181
- value
182
- }))
183
- });
184
- else if (err instanceof require_errors.RetryableError) this.coreVm.propose_run_completion_failure_transient_with_delay_override(handle, err.message, err.stack, BigInt(attemptDuration), err.retryAfter !== void 0 ? BigInt((0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(err.retryAfter)) : void 0, options?.maxRetryAttempts, options?.maxRetryDuration !== void 0 ? BigInt((0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.maxRetryDuration)) : void 0);
185
- else {
186
- this.vmLogger.warn(`Error when processing ctx.run '${name}'.\n`, err);
187
- let retryPolicy;
188
- if (options?.retryIntervalFactor !== void 0 || options?.maxRetryAttempts !== void 0 || options?.initialRetryInterval !== void 0 || options?.maxRetryDuration !== void 0 || options?.maxRetryInterval !== void 0) retryPolicy = {
189
- factor: options?.retryIntervalFactor ?? 2,
190
- initial_interval: (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.initialRetryInterval ?? 50),
191
- max_attempts: options?.maxRetryAttempts,
192
- max_duration: options?.maxRetryDuration === void 0 ? void 0 : (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.maxRetryDuration),
193
- max_interval: (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.maxRetryInterval ?? { seconds: 10 })
194
- };
195
- this.coreVm.propose_run_completion_failure_transient(handle, err.message, err.stack, BigInt(attemptDuration), retryPolicy);
164
+ if (!wasmRun.replayed) {
165
+ const doRun = async () => {
166
+ const startTime = Date.now();
167
+ let res;
168
+ let err;
169
+ try {
170
+ await this.runInterceptor(name ?? "", async () => {
171
+ res = await action();
172
+ });
173
+ } catch (e) {
174
+ err = require_errors.ensureError(e, this.asTerminalError);
196
175
  }
197
- else {
198
- const serializedRes = serde$1.serialize(res);
199
- const encodedRes = this.journalValueCodec.encode(serializedRes);
200
- this.coreVm.propose_run_completion_success(handle, encodedRes);
176
+ const attemptDuration = Date.now() - startTime;
177
+ try {
178
+ if (err !== void 0) if (err instanceof require_errors.TerminalError) this.coreVm.propose_run_completion_failure(handle, {
179
+ code: err.code,
180
+ message: err.message,
181
+ metadata: Object.entries(err.metadata ?? {}).map(([key, value]) => ({
182
+ key,
183
+ value
184
+ }))
185
+ });
186
+ else if (err instanceof require_errors.RetryableError) this.coreVm.propose_run_completion_failure_transient_with_delay_override(handle, err.message, err.stack, BigInt(attemptDuration), err.retryAfter !== void 0 ? BigInt((0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(err.retryAfter)) : void 0, options?.maxRetryAttempts, options?.maxRetryDuration !== void 0 ? BigInt((0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.maxRetryDuration)) : void 0);
187
+ else {
188
+ this.vmLogger.warn(`Error when processing ctx.run '${name}'.\n`, err);
189
+ let retryPolicy;
190
+ if (options?.retryIntervalFactor !== void 0 || options?.maxRetryAttempts !== void 0 || options?.initialRetryInterval !== void 0 || options?.maxRetryDuration !== void 0 || options?.maxRetryInterval !== void 0) retryPolicy = {
191
+ factor: options?.retryIntervalFactor ?? 2,
192
+ initial_interval: (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.initialRetryInterval ?? 50),
193
+ max_attempts: options?.maxRetryAttempts,
194
+ max_duration: options?.maxRetryDuration === void 0 ? void 0 : (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.maxRetryDuration),
195
+ max_interval: (0, __restatedev_restate_sdk_core.millisOrDurationToMillis)(options?.maxRetryInterval ?? { seconds: 10 })
196
+ };
197
+ this.coreVm.propose_run_completion_failure_transient(handle, err.message, err.stack, BigInt(attemptDuration), retryPolicy);
198
+ }
199
+ else {
200
+ const serializedRes = serde$1.serialize(res);
201
+ const encodedRes = this.journalValueCodec.encode(serializedRes);
202
+ this.coreVm.propose_run_completion_success(handle, encodedRes);
203
+ }
204
+ } catch (e) {
205
+ this.abortAttempt(e);
206
+ return require_promises.pendingPromise();
201
207
  }
202
- } catch (e) {
203
- this.abortAttempt(e);
204
- return require_promises.pendingPromise();
205
- }
206
- await this.outputPump.awaitNextProgress();
207
- };
208
- this.runClosuresTracker.registerRunClosure(handle, doRun);
208
+ await this.outputPump.awaitNextProgress();
209
+ };
210
+ this.runClosuresTracker.registerRunClosure(handle, doRun);
211
+ }
209
212
  return new require_promises.SingleRestatePromise(this, handle, completeCommandPromiseUsing(require_sdk_shared_core_wasm_bindings.WasmCommandType.Run, commandIndex, SuccessWithSerde(serde$1, this.journalValueCodec), Failure));
210
213
  }
211
214
  sleep(duration, name) {
@@ -267,7 +270,7 @@ var ContextImpl = class {
267
270
  }
268
271
  cancelPreviousCalls() {
269
272
  if (!this.trackedInvocationIdPromises) return require_promises.ConstRestatePromise.resolve([]);
270
- return require_promises.CombinatorRestatePromise.fromPromises((p) => Promise.allSettled(p), this.trackedInvocationIdPromises.splice(0)).map((results, failure) => {
273
+ return require_promises.CombinatorRestatePromise.fromPromises("AllCompleted", (p) => Promise.allSettled(p), this.trackedInvocationIdPromises.splice(0)).map((results, failure) => {
271
274
  if (failure) throw failure;
272
275
  const cancelled = [];
273
276
  for (const result of results) if (result.status === "fulfilled") {
@@ -1 +1 @@
1
- {"version":3,"file":"context_impl.d.ts","sourceRoot":"","sources":["../src/context_impl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context_impl.d.ts","sourceRoot":"","sources":["../src/context_impl.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,IAAI,EACJ,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EAEV,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,KAAK,EAAE,MAAM,yDAAyD,CAAC;AACnF,OAAO,EACL,eAAe,EAEf,SAAS,EACT,MAAM,EACP,MAAM,yDAAyD,CAAC;AACjE,OAAO,EAIL,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,WAAW,EAGZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,QAAQ,EACR,iBAAiB,EACjB,KAAK,EACL,OAAO,EACP,qBAAqB,EACrB,aAAa,EACb,2BAA2B,EAC3B,QAAQ,EACR,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,gBAAgB,EAA4B,MAAM,eAAe,CAAC;AAC3E,OAAO,EAGL,gBAAgB,EAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,qBAAa,WACX,YAAW,aAAa,EAAE,eAAe,EAAE,eAAe;IA+BxD,QAAQ,CAAC,MAAM,EAAE,MAAM;aAEP,OAAO,EAAE,OAAO;aAChB,WAAW,EAAE,WAAW;IACxC,QAAQ,CAAC,QAAQ,EAAE,OAAO;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,CAAC;IAGzD,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAtC/C,SAAgB,IAAI,EAAE,IAAI,CAAC;IAE3B,SAAgB,IAAI,EAAE,WAAW,CAQ/B;IAEF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,cAAc,CAGH;IACnB,OAAO,CAAC,mBAAmB,CAAC,CAA6B;IACzD,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA4C;IAG7E,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAiC;gBAGnE,MAAM,EAAE,MAAM,EACvB,KAAK,EAAE,SAAS,EACA,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EAC/B,QAAQ,EAAE,OAAO,EACT,iBAAiB,EAAE,OAAO,EAClC,oBAAoB,EAAE,oBAAoB,CAAC,IAAI,CAAC,EACzD,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EACjB,iBAAiB,EAAE,iBAAiB,EAC7C,gBAAgB,CAAC,EAAE,gBAAgB;IAoCrC,iBAAiB,CACf,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC;IAK3E,YAAY,IAAI,OAAO;IAIvB,MAAM,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAIxC,OAAO,CAAC,OAAO;IAQf,MAAM,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAU1E,IAAW,GAAG,IAAI,MAAM,CAUvB;IAEM,OAAO,IAAI,OAAO;IAIlB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC;IAUhE,SAAS,IAAI,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAS1C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;IAWtD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQzB,QAAQ,IAAI,IAAI;IAUhB,WAAW,CAAC,GAAG,GAAG,UAAU,EAAE,GAAG,GAAG,UAAU,EACnD,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAC1B,iBAAiB,CAAC,GAAG,CAAC;IAoElB,WAAW,CAAC,GAAG,GAAG,UAAU,EACjC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,GACrB,gBAAgB;IAwDnB,aAAa,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IASxE,YAAY,CAAC,CAAC,EACZ,EAAE,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC,EACxC,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAS3B,cAAc,CAAC,CAAC,EACd,EAAE,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IASf,iBAAiB,CAAC,CAAC,EAAE,EAC1B,IAAI,GACL,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAS7C,gBAAgB,CAAC,CAAC,EACvB,EAAE,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC,EACxC,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAS/B,kBAAkB,CAAC,CAAC,EAClB,EAAE,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,GACV,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAanB,GAAG,CAAC,CAAC,EACV,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,EACnC,qBAAqB,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EACpC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GACtB,cAAc,CAAC,CAAC,CAAC;IAkIb,KAAK,CACV,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAC3B,IAAI,CAAC,EAAE,MAAM,GACZ,cAAc,CAAC,IAAI,CAAC;IAsBhB,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG;QACrC,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;KAC5B;IA0BM,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;IAsBpE,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAYjE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAoB5D,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,mBAAmB;IAI3D,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAIpE,YAAY,IAAI,cAAc,CAAC,IAAI,CAAC;IAYpC,mBAAmB,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;IA8BrD,0BAA0B,CAAC,CAAC,EAC1B,WAAW,EAAE,EAAE,CAAC,eAAe,EAC/B,OAAO,EAAE,MAAM,CAAC,EAChB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI;IAiB3C,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAC1B,WAAW,EAAE,EAAE,CAAC,eAAe,EAC/B,OAAO,EAAE,MAAM,CAAC,EAChB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,EACvC,GAAG,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,GAC9B,cAAc,CAAC,CAAC,CAAC;IAwBpB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,eAAe;CASvD;AA6KD,qBAAa,kBAAkB;IAMjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,aAAa,CAGjB;gBAEyB,OAAO,EAAE,uBAAuB;IAE7D,UAAU,CAAC,MAAM,EAAE,MAAM;IAUzB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC;CAGlE;AAID,KAAK,SAAS,GAAG,CACf,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,oBAAoB,CAAC,GAAG,CAAC,KAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;AAStB,qBAAa,YAAa,SAAQ,KAAK;aAQjB,KAAK,EAAE,OAAO;IAChC,QAAQ,CAAC,WAAW,EAAE,eAAe;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBATpB,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe;gBAEtD,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,eAAe,EAC5B,YAAY,EAAE,MAAM;IAWtB,gFAAgF;IAChF,IAAI,eAAe,IAAI,OAAO,CAE7B;CACF"}
@@ -150,60 +150,63 @@ var ContextImpl = class {
150
150
  run(nameOrAction, actionSecondParameter, options) {
151
151
  const { name, action } = unpackRunParameters(nameOrAction, actionSecondParameter);
152
152
  const serde$1 = options?.serde ?? this.defaultSerde;
153
- let handle;
153
+ let wasmRun;
154
154
  try {
155
- handle = this.coreVm.sys_run(name ?? "");
155
+ wasmRun = this.coreVm.sys_run(name ?? "");
156
156
  } catch (e) {
157
157
  this.abortAttempt(e);
158
158
  return ConstRestatePromise.pending();
159
159
  }
160
+ const handle = wasmRun.handle;
160
161
  const commandIndex = this.coreVm.last_command_index();
161
- const doRun = async () => {
162
- const startTime = Date.now();
163
- let res;
164
- let err;
165
- try {
166
- await this.runInterceptor(name ?? "", async () => {
167
- res = await action();
168
- });
169
- } catch (e) {
170
- err = ensureError(e, this.asTerminalError);
171
- }
172
- const attemptDuration = Date.now() - startTime;
173
- try {
174
- if (err !== void 0) if (err instanceof TerminalError) this.coreVm.propose_run_completion_failure(handle, {
175
- code: err.code,
176
- message: err.message,
177
- metadata: Object.entries(err.metadata ?? {}).map(([key, value]) => ({
178
- key,
179
- value
180
- }))
181
- });
182
- else if (err instanceof RetryableError) this.coreVm.propose_run_completion_failure_transient_with_delay_override(handle, err.message, err.stack, BigInt(attemptDuration), err.retryAfter !== void 0 ? BigInt(millisOrDurationToMillis(err.retryAfter)) : void 0, options?.maxRetryAttempts, options?.maxRetryDuration !== void 0 ? BigInt(millisOrDurationToMillis(options?.maxRetryDuration)) : void 0);
183
- else {
184
- this.vmLogger.warn(`Error when processing ctx.run '${name}'.\n`, err);
185
- let retryPolicy;
186
- if (options?.retryIntervalFactor !== void 0 || options?.maxRetryAttempts !== void 0 || options?.initialRetryInterval !== void 0 || options?.maxRetryDuration !== void 0 || options?.maxRetryInterval !== void 0) retryPolicy = {
187
- factor: options?.retryIntervalFactor ?? 2,
188
- initial_interval: millisOrDurationToMillis(options?.initialRetryInterval ?? 50),
189
- max_attempts: options?.maxRetryAttempts,
190
- max_duration: options?.maxRetryDuration === void 0 ? void 0 : millisOrDurationToMillis(options?.maxRetryDuration),
191
- max_interval: millisOrDurationToMillis(options?.maxRetryInterval ?? { seconds: 10 })
192
- };
193
- this.coreVm.propose_run_completion_failure_transient(handle, err.message, err.stack, BigInt(attemptDuration), retryPolicy);
162
+ if (!wasmRun.replayed) {
163
+ const doRun = async () => {
164
+ const startTime = Date.now();
165
+ let res;
166
+ let err;
167
+ try {
168
+ await this.runInterceptor(name ?? "", async () => {
169
+ res = await action();
170
+ });
171
+ } catch (e) {
172
+ err = ensureError(e, this.asTerminalError);
194
173
  }
195
- else {
196
- const serializedRes = serde$1.serialize(res);
197
- const encodedRes = this.journalValueCodec.encode(serializedRes);
198
- this.coreVm.propose_run_completion_success(handle, encodedRes);
174
+ const attemptDuration = Date.now() - startTime;
175
+ try {
176
+ if (err !== void 0) if (err instanceof TerminalError) this.coreVm.propose_run_completion_failure(handle, {
177
+ code: err.code,
178
+ message: err.message,
179
+ metadata: Object.entries(err.metadata ?? {}).map(([key, value]) => ({
180
+ key,
181
+ value
182
+ }))
183
+ });
184
+ else if (err instanceof RetryableError) this.coreVm.propose_run_completion_failure_transient_with_delay_override(handle, err.message, err.stack, BigInt(attemptDuration), err.retryAfter !== void 0 ? BigInt(millisOrDurationToMillis(err.retryAfter)) : void 0, options?.maxRetryAttempts, options?.maxRetryDuration !== void 0 ? BigInt(millisOrDurationToMillis(options?.maxRetryDuration)) : void 0);
185
+ else {
186
+ this.vmLogger.warn(`Error when processing ctx.run '${name}'.\n`, err);
187
+ let retryPolicy;
188
+ if (options?.retryIntervalFactor !== void 0 || options?.maxRetryAttempts !== void 0 || options?.initialRetryInterval !== void 0 || options?.maxRetryDuration !== void 0 || options?.maxRetryInterval !== void 0) retryPolicy = {
189
+ factor: options?.retryIntervalFactor ?? 2,
190
+ initial_interval: millisOrDurationToMillis(options?.initialRetryInterval ?? 50),
191
+ max_attempts: options?.maxRetryAttempts,
192
+ max_duration: options?.maxRetryDuration === void 0 ? void 0 : millisOrDurationToMillis(options?.maxRetryDuration),
193
+ max_interval: millisOrDurationToMillis(options?.maxRetryInterval ?? { seconds: 10 })
194
+ };
195
+ this.coreVm.propose_run_completion_failure_transient(handle, err.message, err.stack, BigInt(attemptDuration), retryPolicy);
196
+ }
197
+ else {
198
+ const serializedRes = serde$1.serialize(res);
199
+ const encodedRes = this.journalValueCodec.encode(serializedRes);
200
+ this.coreVm.propose_run_completion_success(handle, encodedRes);
201
+ }
202
+ } catch (e) {
203
+ this.abortAttempt(e);
204
+ return pendingPromise();
199
205
  }
200
- } catch (e) {
201
- this.abortAttempt(e);
202
- return pendingPromise();
203
- }
204
- await this.outputPump.awaitNextProgress();
205
- };
206
- this.runClosuresTracker.registerRunClosure(handle, doRun);
206
+ await this.outputPump.awaitNextProgress();
207
+ };
208
+ this.runClosuresTracker.registerRunClosure(handle, doRun);
209
+ }
207
210
  return new SingleRestatePromise(this, handle, completeCommandPromiseUsing(WasmCommandType.Run, commandIndex, SuccessWithSerde(serde$1, this.journalValueCodec), Failure));
208
211
  }
209
212
  sleep(duration, name) {
@@ -265,7 +268,7 @@ var ContextImpl = class {
265
268
  }
266
269
  cancelPreviousCalls() {
267
270
  if (!this.trackedInvocationIdPromises) return ConstRestatePromise.resolve([]);
268
- return CombinatorRestatePromise.fromPromises((p) => Promise.allSettled(p), this.trackedInvocationIdPromises.splice(0)).map((results, failure) => {
271
+ return CombinatorRestatePromise.fromPromises("AllCompleted", (p) => Promise.allSettled(p), this.trackedInvocationIdPromises.splice(0)).map((results, failure) => {
269
272
  if (failure) throw failure;
270
273
  const cancelled = [];
271
274
  for (const result of results) if (result.status === "fulfilled") {
@@ -1 +1 @@
1
- {"version":3,"file":"context_impl.js","names":["coreVm: WasmVM","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: CompletablePromise<void>","journalValueCodec: JournalValueCodec","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","handle: number","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","cancelled: InvocationId[]","ctx: ContextImpl","invocationId: InvocationId","name: string","channel: ExternalProgressChannel","cause: unknown","commandType: WasmCommandType","commandIndex?: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n WorkflowContext,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n WasmCommandType,\n WasmHeader,\n WasmInput,\n WasmVM,\n} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport { AsyncResultValue, CombinatorRestatePromise } from \"./promises.js\";\nimport {\n ConstRestatePromise,\n pendingPromise,\n PromisesExecutor,\n InvocationRestatePromise,\n SingleRestatePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\nimport { ExternalProgressChannel } from \"./utils/external_progress_channel.js\";\nimport type {\n ContextInternal,\n InvocationReference,\n SignalReference,\n} from \"./internal.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\nimport { ExecutionOptions } from \"./endpoint/components.js\";\n\nexport class ContextImpl\n implements ObjectContext, WorkflowContext, ContextInternal\n{\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n readonly inputPump: InputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n private readonly serviceKey: string;\n private runInterceptor: (\n name: string,\n runner: () => Promise<void>\n ) => Promise<void>;\n private cancellationPromise?: SingleRestatePromise<void>;\n readonly defaultSerde: Serde<any>;\n private readonly asTerminalError?: (error: any) => TerminalError | undefined;\n\n // If undefined, we're not tracking invocation id promises\n private readonly trackedInvocationIdPromises?: SingleRestatePromise<string>[];\n\n constructor(\n readonly coreVm: WasmVM,\n input: WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n readonly invocationEndPromise: CompletablePromise<void>,\n inputReader: InputReader,\n outputWriter: OutputWriter,\n readonly journalValueCodec: JournalValueCodec,\n executionOptions?: ExecutionOptions\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n const externalProgressChannel = new ExternalProgressChannel();\n this.runClosuresTracker = new RunClosuresTracker(externalProgressChannel);\n this.inputPump = new InputPump(\n coreVm,\n inputReader,\n externalProgressChannel,\n this.abortAttempt.bind(this)\n );\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n this.outputPump,\n this.runClosuresTracker,\n externalProgressChannel,\n this.abortAttempt.bind(this)\n );\n this.serviceKey = input.key;\n // Identity interceptor by default; replaced by startUserHandler after hooks are instantiated\n this.runInterceptor = (_name, runner) => runner();\n this.defaultSerde = executionOptions?.defaultSerde ?? serde.json;\n this.asTerminalError = executionOptions?.asTerminalError;\n this.trackedInvocationIdPromises = executionOptions?.explicitCancellation\n ? []\n : undefined;\n }\n\n setRunInterceptor(\n interceptor: (name: string, runner: () => Promise<void>) => Promise<void>\n ) {\n this.runInterceptor = interceptor;\n }\n\n isProcessing(): boolean {\n return this.coreVm.is_processing();\n }\n\n cancel(invocationId: InvocationId): void {\n this._cancel(invocationId);\n }\n\n private _cancel(invocationId: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CancelInvocation,\n () => {},\n (vm) => vm.sys_cancel_invocation(invocationId)\n );\n }\n\n attach<T>(invocationId: InvocationId, serde?: Serde<T>): RestatePromise<T> {\n return this.processCompletableEntry(\n WasmCommandType.AttachInvocation,\n () => {},\n (vm) => vm.sys_attach_invocation(invocationId),\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n );\n }\n\n public get key(): string {\n switch (this.handlerKind) {\n case HandlerKind.EXCLUSIVE:\n case HandlerKind.SHARED:\n case HandlerKind.WORKFLOW: {\n return this.serviceKey;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.Call);\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const call_handles = this.coreVm.sys_call(\n call.service,\n call.method,\n parameter,\n call.key,\n call.headers\n ? Object.entries(call.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n call.idempotencyKey,\n call.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new SingleRestatePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n this.trackedInvocationIdPromises?.push(\n invocationIdPromise as SingleRestatePromise<string>\n );\n\n return new InvocationRestatePromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.abortAttempt(e);\n // We return a pending promise to avoid the caller to see the error.\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n }\n\n public genericSend<REQ = Uint8Array>(\n send: GenericSend<REQ>\n ): InvocationHandle {\n const requestSerde = send.inputSerde ?? (serde.binary as Serde<REQ>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(send.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.OneWayCall);\n return Object.assign(ConstRestatePromise.pending<void>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const delay =\n send.delay !== undefined\n ? millisOrDurationToMillis(send.delay)\n : undefined;\n\n const handles = this.coreVm.sys_send(\n send.service,\n send.method,\n parameter,\n send.key,\n send.headers\n ? Object.entries(send.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n delay !== undefined && delay > 0 ? BigInt(delay) : undefined,\n send.idempotencyKey,\n send.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new SingleRestatePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.abortAttempt(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>({\n name,\n }: ServiceDefinitionFrom<D>): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let handle: number;\n try {\n handle = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n\n // Now prepare the run task\n const doRun: () => Promise<any> = async () => {\n // Execute the user code, wrapping with run interceptor hooks\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n await this.runInterceptor(name ?? \"\", async () => {\n res = await action();\n });\n } catch (e) {\n err = ensureError(e, this.asTerminalError);\n }\n const attemptDuration = Date.now() - startTime;\n\n // Propose the completion to the VM\n try {\n if (err !== undefined) {\n if (err instanceof TerminalError) {\n // Record failure, go ahead\n this.coreVm.propose_run_completion_failure(handle, {\n code: err.code,\n message: err.message,\n metadata: Object.entries(err.metadata ?? {}).map(\n ([key, value]) => ({ key, value })\n ),\n });\n } else if (err instanceof RetryableError) {\n this.coreVm.propose_run_completion_failure_transient_with_delay_override(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n err.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(err.retryAfter))\n : undefined,\n options?.maxRetryAttempts,\n options?.maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(options?.maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryInterval !== undefined\n ) {\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ?? 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n options?.maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(options?.maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ?? { seconds: 10 }\n ),\n };\n }\n this.coreVm.propose_run_completion_failure_transient(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n retryPolicy\n );\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n const serializedRes = serde.serialize(res);\n const encodedRes = this.journalValueCodec.encode(serializedRes);\n this.coreVm.propose_run_completion_success(handle, encodedRes);\n }\n } catch (e) {\n this.abortAttempt(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n\n // TODO: here as well\n // Return the promise\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.abortAttempt(e);\n return {\n id: \"invalid\",\n promise: ConstRestatePromise.pending(),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new SingleRestatePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string | TerminalError): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, toWasmFailure(reason));\n }\n );\n }\n\n // -- Signals\n\n public signal<T>(name: string, serde?: Serde<T>): RestatePromise<T> {\n let handle: number;\n try {\n handle = this.coreVm.sys_signal(name);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n\n return new SingleRestatePromise(\n this,\n handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public invocation(invocationId: InvocationId): InvocationReference {\n return new InvocationReferenceImpl(this, invocationId);\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n cancellation(): RestatePromise<void> {\n if (!this.cancellationPromise || this.cancellationPromise.isCompleted()) {\n this.cancellationPromise = new SingleRestatePromise(\n this,\n 1 /* HANDLE 1 is a hardcoded cancellation signal! */,\n completeSignalPromiseUsing(VoidAsUndefined)\n );\n }\n\n return this.cancellationPromise;\n }\n\n cancelPreviousCalls(): RestatePromise<InvocationId[]> {\n if (!this.trackedInvocationIdPromises) {\n return ConstRestatePromise.resolve([]);\n }\n\n return CombinatorRestatePromise.fromPromises(\n (p) => Promise.allSettled(p),\n this.trackedInvocationIdPromises.splice(0)\n ).map((results, failure) => {\n if (failure) {\n throw failure;\n }\n const cancelled: InvocationId[] = [];\n for (const result of results as PromiseSettledResult<string>[]) {\n if (result.status === \"fulfilled\") {\n this._cancel(result.value);\n cancelled.push(result.value as InvocationId);\n } else {\n this.console.warn(\n `Error when trying to get invocation id: ${result.reason}`\n );\n }\n }\n return cancelled;\n });\n }\n\n // -- Various private methods\n\n processNonCompletableEntry<T>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, input: T) => void\n ) {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n }\n }\n\n processCompletableEntry<T, U>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, t: T) => number,\n ...completers: Array<Completer>\n ): RestatePromise<U> {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return ConstRestatePromise.pending();\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n abortAttempt(e: unknown, commandType?: WasmCommandType) {\n // ensureError so interceptors always receive a proper Error,\n // not a raw VM object like { code, message }.\n this.invocationEndPromise.reject(\n commandType !== undefined\n ? new CommandError(e, commandType)\n : ensureError(e)\n );\n }\n}\n\nfunction toWasmFailure(reason: string | TerminalError): vm.WasmFailure {\n if (typeof reason === \"string\") {\n return {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n metadata: [],\n };\n }\n return {\n code: reason.code,\n message: reason.message,\n metadata: Object.entries(reason.metadata ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n };\n}\n\nfunction unpackRunParameters<T>(\n a: string | RunAction<T>,\n b?: RunAction<T>\n): { name?: string; action: RunAction<T> } {\n if (typeof a === \"string\") {\n if (typeof b !== \"function\") {\n throw new TypeError(\"\");\n }\n return { name: a, action: b };\n }\n if (typeof a !== \"function\") {\n throw new TypeError(\"unexpected type at the first parameter\");\n }\n if (b) {\n throw new TypeError(\"unexpected a function as a second parameter.\");\n }\n return { action: a };\n}\n\nclass InvocationReferenceImpl implements InvocationReference {\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId\n ) {}\n\n signal<T>(name: string, serde?: Serde<T>): SignalReference<T> {\n return new SignalReferenceImpl(this.ctx, this.invocationId, name, serde);\n }\n\n cancel(): void {\n this.ctx.cancel(this.invocationId);\n }\n\n attach<T>(serde?: Serde<T>): RestatePromise<T> {\n return this.ctx.attach(this.invocationId, serde);\n }\n}\n\nclass SignalReferenceImpl<T> implements SignalReference<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n resolve(payload?: T): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () =>\n this.ctx.journalValueCodec.encode(this.serde.serialize(payload as T)),\n (vm, bytes) =>\n vm.sys_complete_signal_success(this.invocationId, this.name, bytes)\n );\n }\n\n reject(reason: string | TerminalError): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () => {},\n (vm) => {\n vm.sys_complete_signal_failure(\n this.invocationId,\n this.name,\n toWasmFailure(reason)\n );\n }\n );\n }\n}\n\nclass DurablePromiseImpl<T> implements DurablePromise<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.get().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.get().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.get().finally(onfinally);\n }\n\n [Symbol.toStringTag] = \"DurablePromise\";\n\n get(): RestatePromise<T> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.GetPromise,\n () => {},\n (vm) => vm.sys_get_promise(this.name),\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n peek(): Promise<T | undefined> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.PeekPromise,\n () => {},\n (vm) => vm.sys_peek_promise(this.name),\n VoidAsUndefined,\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n resolve(value?: T): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => this.ctx.journalValueCodec.encode(this.serde.serialize(value as T)),\n (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes),\n VoidAsUndefined,\n Failure\n );\n }\n\n reject(errorMsg: string): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => {},\n (vm) =>\n vm.sys_complete_promise_failure(this.name, {\n code: INTERNAL_ERROR_CODE,\n message: errorMsg,\n metadata: [],\n }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n constructor(private readonly channel: ExternalProgressChannel) {}\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => this.channel.signal())\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: CompletablePromise<any>\n) => Promise<boolean>;\n\n// Wraps an error with command metadata so the centralized catch in\n// process() can call the right VM notification method.\n//\n// - Preparation failure (command not yet in journal): new CommandError(e, type)\n// → notify_error_for_next_command\n// - Completion failure (command exists): new CommandError(e, type, index)\n// → notify_error_for_specific_command\nexport class CommandError extends Error {\n constructor(cause: unknown, commandType: WasmCommandType);\n constructor(\n cause: unknown,\n commandType: WasmCommandType,\n commandIndex: number\n );\n constructor(\n override readonly cause: unknown,\n readonly commandType: WasmCommandType,\n readonly commandIndex?: number\n ) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n super(msg, { cause });\n }\n\n /** True when the error is for a specific command that exists in the journal. */\n get hasCommandIndex(): boolean {\n return this.commandIndex !== undefined;\n }\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new CommandError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n const metadata = (value.Failure.metadata ?? []).reduce(\n (\n acc: Record<string, string>,\n { key, value: v }: { key: string; value: string }\n ) => {\n acc[key] = v;\n return acc;\n },\n {} as Record<string, string>\n );\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\n metadata,\n })\n );\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst StateKeys: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"StateKeys\" in value) {\n prom.resolve(value.StateKeys);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst InvocationIdCompleter: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"InvocationId\" in value) {\n prom.resolve(value.InvocationId);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"context_impl.js","names":["coreVm: WasmVM","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: PromiseWithResolvers<void>","journalValueCodec: JournalValueCodec","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","wasmRun: vm.WasmRun","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","handle: number","cancelled: InvocationId[]","ctx: ContextImpl","invocationId: InvocationId","name: string","channel: ExternalProgressChannel","cause: unknown","commandType: WasmCommandType","commandIndex?: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n InvocationReference,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n SignalReference,\n WorkflowContext,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n WasmCommandType,\n WasmHeader,\n WasmInput,\n WasmVM,\n} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport { AsyncResultValue, CombinatorRestatePromise } from \"./promises.js\";\nimport {\n ConstRestatePromise,\n pendingPromise,\n PromisesExecutor,\n InvocationRestatePromise,\n SingleRestatePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\nimport { ExternalProgressChannel } from \"./utils/external_progress_channel.js\";\nimport type { ContextInternal } from \"./internal.js\";\nimport { InputReader, OutputWriter } from \"./endpoint/handlers/types.js\";\nimport { ExecutionOptions } from \"./endpoint/components.js\";\n\nexport class ContextImpl\n implements ObjectContext, WorkflowContext, ContextInternal\n{\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n readonly inputPump: InputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n private readonly serviceKey: string;\n private runInterceptor: (\n name: string,\n runner: () => Promise<void>\n ) => Promise<void>;\n private cancellationPromise?: SingleRestatePromise<void>;\n readonly defaultSerde: Serde<any>;\n private readonly asTerminalError?: (error: any) => TerminalError | undefined;\n\n // If undefined, we're not tracking invocation id promises\n private readonly trackedInvocationIdPromises?: SingleRestatePromise<string>[];\n\n constructor(\n readonly coreVm: WasmVM,\n input: WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n readonly invocationEndPromise: PromiseWithResolvers<void>,\n inputReader: InputReader,\n outputWriter: OutputWriter,\n readonly journalValueCodec: JournalValueCodec,\n executionOptions?: ExecutionOptions\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n const externalProgressChannel = new ExternalProgressChannel();\n this.runClosuresTracker = new RunClosuresTracker(externalProgressChannel);\n this.inputPump = new InputPump(\n coreVm,\n inputReader,\n externalProgressChannel,\n this.abortAttempt.bind(this)\n );\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n this.outputPump,\n this.runClosuresTracker,\n externalProgressChannel,\n this.abortAttempt.bind(this)\n );\n this.serviceKey = input.key;\n // Identity interceptor by default; replaced by startUserHandler after hooks are instantiated\n this.runInterceptor = (_name, runner) => runner();\n this.defaultSerde = executionOptions?.defaultSerde ?? serde.json;\n this.asTerminalError = executionOptions?.asTerminalError;\n this.trackedInvocationIdPromises = executionOptions?.explicitCancellation\n ? []\n : undefined;\n }\n\n setRunInterceptor(\n interceptor: (name: string, runner: () => Promise<void>) => Promise<void>\n ) {\n this.runInterceptor = interceptor;\n }\n\n isProcessing(): boolean {\n return this.coreVm.is_processing();\n }\n\n cancel(invocationId: InvocationId): void {\n this._cancel(invocationId);\n }\n\n private _cancel(invocationId: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CancelInvocation,\n () => {},\n (vm) => vm.sys_cancel_invocation(invocationId)\n );\n }\n\n attach<T>(invocationId: InvocationId, serde?: Serde<T>): RestatePromise<T> {\n return this.processCompletableEntry(\n WasmCommandType.AttachInvocation,\n () => {},\n (vm) => vm.sys_attach_invocation(invocationId),\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n );\n }\n\n public get key(): string {\n switch (this.handlerKind) {\n case HandlerKind.EXCLUSIVE:\n case HandlerKind.SHARED:\n case HandlerKind.WORKFLOW: {\n return this.serviceKey;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.Call);\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const call_handles = this.coreVm.sys_call(\n call.service,\n call.method,\n parameter,\n call.key,\n call.headers\n ? Object.entries(call.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n call.idempotencyKey,\n call.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new SingleRestatePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n this.trackedInvocationIdPromises?.push(\n invocationIdPromise as SingleRestatePromise<string>\n );\n\n return new InvocationRestatePromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.abortAttempt(e);\n // We return a pending promise to avoid the caller to see the error.\n return Object.assign(ConstRestatePromise.pending<RES>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n }\n\n public genericSend<REQ = Uint8Array>(\n send: GenericSend<REQ>\n ): InvocationHandle {\n const requestSerde = send.inputSerde ?? (serde.binary as Serde<REQ>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(send.parameter)\n );\n } catch (e) {\n this.abortAttempt(e, WasmCommandType.OneWayCall);\n return Object.assign(ConstRestatePromise.pending<void>(), {\n invocationId: pendingPromise<InvocationId>(),\n });\n }\n\n try {\n const delay =\n send.delay !== undefined\n ? millisOrDurationToMillis(send.delay)\n : undefined;\n\n const handles = this.coreVm.sys_send(\n send.service,\n send.method,\n parameter,\n send.key,\n send.headers\n ? Object.entries(send.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n delay !== undefined && delay > 0 ? BigInt(delay) : undefined,\n send.idempotencyKey,\n send.name\n );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new SingleRestatePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.abortAttempt(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>({\n name,\n }: ServiceDefinitionFrom<D>): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let wasmRun: vm.WasmRun;\n try {\n wasmRun = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const handle = wasmRun.handle;\n const commandIndex = this.coreVm.last_command_index();\n\n if (!wasmRun.replayed) {\n // Let's prepare the run task only if the run wasnt replayed.\n const doRun: () => Promise<any> = async () => {\n // Execute the user code, wrapping with run interceptor hooks\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n await this.runInterceptor(name ?? \"\", async () => {\n res = await action();\n });\n } catch (e) {\n err = ensureError(e, this.asTerminalError);\n }\n const attemptDuration = Date.now() - startTime;\n\n // Propose the completion to the VM\n try {\n if (err !== undefined) {\n if (err instanceof TerminalError) {\n // Record failure, go ahead\n this.coreVm.propose_run_completion_failure(handle, {\n code: err.code,\n message: err.message,\n metadata: Object.entries(err.metadata ?? {}).map(\n ([key, value]) => ({ key, value })\n ),\n });\n } else if (err instanceof RetryableError) {\n this.coreVm.propose_run_completion_failure_transient_with_delay_override(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n err.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(err.retryAfter))\n : undefined,\n options?.maxRetryAttempts,\n options?.maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(options?.maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryInterval !== undefined\n ) {\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ?? 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n options?.maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(options?.maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ?? { seconds: 10 }\n ),\n };\n }\n this.coreVm.propose_run_completion_failure_transient(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n retryPolicy\n );\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n const serializedRes = serde.serialize(res);\n const encodedRes = this.journalValueCodec.encode(serializedRes);\n this.coreVm.propose_run_completion_success(handle, encodedRes);\n }\n } catch (e) {\n this.abortAttempt(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n }\n\n // TODO: here as well\n // Return the promise\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.abortAttempt(e);\n return {\n id: \"invalid\",\n promise: ConstRestatePromise.pending(),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new SingleRestatePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string | TerminalError): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, toWasmFailure(reason));\n }\n );\n }\n\n // -- Signals\n\n public signal<T>(name: string, serde?: Serde<T>): RestatePromise<T> {\n let handle: number;\n try {\n handle = this.coreVm.sys_signal(name);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n\n return new SingleRestatePromise(\n this,\n handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public invocation(invocationId: InvocationId): InvocationReference {\n return new InvocationReferenceImpl(this, invocationId);\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n cancellation(): RestatePromise<void> {\n if (!this.cancellationPromise || this.cancellationPromise.isCompleted()) {\n this.cancellationPromise = new SingleRestatePromise(\n this,\n 1 /* HANDLE 1 is a hardcoded cancellation signal! */,\n completeSignalPromiseUsing(VoidAsUndefined)\n );\n }\n\n return this.cancellationPromise;\n }\n\n cancelPreviousCalls(): RestatePromise<InvocationId[]> {\n if (!this.trackedInvocationIdPromises) {\n return ConstRestatePromise.resolve([]);\n }\n\n return CombinatorRestatePromise.fromPromises(\n \"AllCompleted\",\n (p: Promise<any>[]) => Promise.allSettled(p),\n this.trackedInvocationIdPromises.splice(0)\n ).map((results, failure) => {\n if (failure) {\n throw failure;\n }\n const cancelled: InvocationId[] = [];\n for (const result of results as PromiseSettledResult<string>[]) {\n if (result.status === \"fulfilled\") {\n this._cancel(result.value);\n cancelled.push(result.value as InvocationId);\n } else {\n this.console.warn(\n `Error when trying to get invocation id: ${result.reason}`\n );\n }\n }\n return cancelled;\n });\n }\n\n // -- Various private methods\n\n processNonCompletableEntry<T>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, input: T) => void\n ) {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n }\n }\n\n processCompletableEntry<T, U>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, t: T) => number,\n ...completers: Array<Completer>\n ): RestatePromise<U> {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.abortAttempt(e, commandType);\n return ConstRestatePromise.pending();\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.abortAttempt(e);\n return ConstRestatePromise.pending();\n }\n const commandIndex = this.coreVm.last_command_index();\n return new SingleRestatePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n abortAttempt(e: unknown, commandType?: WasmCommandType) {\n // ensureError so interceptors always receive a proper Error,\n // not a raw VM object like { code, message }.\n this.invocationEndPromise.reject(\n commandType !== undefined\n ? new CommandError(e, commandType)\n : ensureError(e)\n );\n }\n}\n\nfunction toWasmFailure(reason: string | TerminalError): vm.WasmFailure {\n if (typeof reason === \"string\") {\n return {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n metadata: [],\n };\n }\n return {\n code: reason.code,\n message: reason.message,\n metadata: Object.entries(reason.metadata ?? {}).map(([key, value]) => ({\n key,\n value,\n })),\n };\n}\n\nfunction unpackRunParameters<T>(\n a: string | RunAction<T>,\n b?: RunAction<T>\n): { name?: string; action: RunAction<T> } {\n if (typeof a === \"string\") {\n if (typeof b !== \"function\") {\n throw new TypeError(\"\");\n }\n return { name: a, action: b };\n }\n if (typeof a !== \"function\") {\n throw new TypeError(\"unexpected type at the first parameter\");\n }\n if (b) {\n throw new TypeError(\"unexpected a function as a second parameter.\");\n }\n return { action: a };\n}\n\nclass InvocationReferenceImpl implements InvocationReference {\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId\n ) {}\n\n signal<T>(name: string, serde?: Serde<T>): SignalReference<T> {\n return new SignalReferenceImpl(this.ctx, this.invocationId, name, serde);\n }\n\n cancel(): void {\n this.ctx.cancel(this.invocationId);\n }\n\n attach<T>(serde?: Serde<T>): RestatePromise<T> {\n return this.ctx.attach(this.invocationId, serde);\n }\n}\n\nclass SignalReferenceImpl<T> implements SignalReference<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly invocationId: InvocationId,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n resolve(payload?: T): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () =>\n this.ctx.journalValueCodec.encode(this.serde.serialize(payload as T)),\n (vm, bytes) =>\n vm.sys_complete_signal_success(this.invocationId, this.name, bytes)\n );\n }\n\n reject(reason: string | TerminalError): void {\n this.ctx.processNonCompletableEntry(\n WasmCommandType.SendSignal,\n () => {},\n (vm) => {\n vm.sys_complete_signal_failure(\n this.invocationId,\n this.name,\n toWasmFailure(reason)\n );\n }\n );\n }\n}\n\nclass DurablePromiseImpl<T> implements DurablePromise<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.get().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.get().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.get().finally(onfinally);\n }\n\n [Symbol.toStringTag] = \"DurablePromise\";\n\n get(): RestatePromise<T> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.GetPromise,\n () => {},\n (vm) => vm.sys_get_promise(this.name),\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n peek(): Promise<T | undefined> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.PeekPromise,\n () => {},\n (vm) => vm.sys_peek_promise(this.name),\n VoidAsUndefined,\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n resolve(value?: T): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => this.ctx.journalValueCodec.encode(this.serde.serialize(value as T)),\n (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes),\n VoidAsUndefined,\n Failure\n );\n }\n\n reject(errorMsg: string): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => {},\n (vm) =>\n vm.sys_complete_promise_failure(this.name, {\n code: INTERNAL_ERROR_CODE,\n message: errorMsg,\n metadata: [],\n }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n constructor(private readonly channel: ExternalProgressChannel) {}\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => this.channel.signal())\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: PromiseWithResolvers<any>\n) => Promise<boolean>;\n\n// Wraps an error with command metadata so the centralized catch in\n// process() can call the right VM notification method.\n//\n// - Preparation failure (command not yet in journal): new CommandError(e, type)\n// → notify_error_for_next_command\n// - Completion failure (command exists): new CommandError(e, type, index)\n// → notify_error_for_specific_command\nexport class CommandError extends Error {\n constructor(cause: unknown, commandType: WasmCommandType);\n constructor(\n cause: unknown,\n commandType: WasmCommandType,\n commandIndex: number\n );\n constructor(\n override readonly cause: unknown,\n readonly commandType: WasmCommandType,\n readonly commandIndex?: number\n ) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n super(msg, { cause });\n }\n\n /** True when the error is for a specific command that exists in the journal. */\n get hasCommandIndex(): boolean {\n return this.commandIndex !== undefined;\n }\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: PromiseWithResolvers<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: PromiseWithResolvers<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new CommandError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: PromiseWithResolvers<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: PromiseWithResolvers<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n const metadata = (value.Failure.metadata ?? []).reduce(\n (\n acc: Record<string, string>,\n { key, value: v }: { key: string; value: string }\n ) => {\n acc[key] = v;\n return acc;\n },\n {} as Record<string, string>\n );\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\n metadata,\n })\n );\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst StateKeys: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"StateKeys\" in value) {\n prom.resolve(value.StateKeys);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst InvocationIdCompleter: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"InvocationId\" in value) {\n prom.resolve(value.InvocationId);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n"],"mappings":"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"}
@@ -66,7 +66,7 @@ var EndpointBuilder = class {
66
66
  function computeDiscovery(components) {
67
67
  return {
68
68
  minProtocolVersion: 5,
69
- maxProtocolVersion: 6,
69
+ maxProtocolVersion: 7,
70
70
  services: [...components.values()].map((c) => c.discovery())
71
71
  };
72
72
  }
@@ -66,7 +66,7 @@ var EndpointBuilder = class {
66
66
  function computeDiscovery(components) {
67
67
  return {
68
68
  minProtocolVersion: 5,
69
- maxProtocolVersion: 6,
69
+ maxProtocolVersion: 7,
70
70
  services: [...components.values()].map((c) => c.discovery())
71
71
  };
72
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"endpoint.js","names":["name"],"sources":["../../src/endpoint/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\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n JournalValueCodec,\n ServiceDefinition,\n VirtualObjectDefinition,\n WorkflowDefinition,\n} from \"@restatedev/restate-sdk-core\";\n\nimport type {\n ObjectOptions,\n ServiceOptions,\n WorkflowOptions,\n} from \"../types/rpc.js\";\nimport { HandlerWrapper } from \"../types/rpc.js\";\nimport type { Component } from \"./components.js\";\nimport {\n ServiceComponent,\n VirtualObjectComponent,\n WorkflowComponent,\n} from \"./components.js\";\nimport type * as discovery from \"./discovery.js\";\nimport { defaultLoggerTransport } from \"../logging/console_logger_transport.js\";\nimport {\n type LoggerTransport,\n LogSource,\n} from \"../logging/logger_transport.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { createLogger } from \"../logging/logger.js\";\nimport type { DefaultServiceOptions } from \"../endpoint.js\";\n\nfunction isServiceDefinition<P extends string, M>(\n m: Record<string, any>\n): m is ServiceDefinition<P, M> & { service: M } {\n return m && m.service !== undefined;\n}\n\nfunction isObjectDefinition<P extends string, M>(\n m: Record<string, any>\n): m is VirtualObjectDefinition<P, M> & { object: M } {\n return m && m.object !== undefined;\n}\n\nfunction isWorkflowDefinition<P extends string, M>(\n m: Record<string, any>\n): m is WorkflowDefinition<P, M> & { workflow: M } {\n return m && m.workflow !== undefined;\n}\n\n/**\n * Services can have additional information that is not part of the definition.\n * For example a description or metadata.\n */\ntype ServiceAuxInfo = {\n description?: string;\n metadata?: Record<string, any>;\n options?: ServiceOptions | ObjectOptions | WorkflowOptions;\n};\n\nexport type Endpoint = {\n loggerTransport: LoggerTransport;\n components: Map<string, Component>;\n keySet: string[];\n /**\n * This is a simple console without contextual info.\n *\n * This should be used only in cases where no contextual info is available.\n */\n rlog: Logger;\n /**\n * All discovery metadata, except protocol mode provided by the node/fetch/lambda endpoint implementations\n */\n discoveryMetadata: Omit<discovery.Endpoint, \"protocolMode\">;\n\n /**\n * Codec provider to use for journal values.\n */\n journalValueCodec?: Promise<JournalValueCodec>;\n};\n\nexport class EndpointBuilder {\n private readonly serviceDefinitions: Map<\n string,\n | ServiceDefinition<string, any>\n | VirtualObjectDefinition<string, any>\n | WorkflowDefinition<string, any>\n > = new Map();\n private loggerTransport: LoggerTransport = defaultLoggerTransport;\n private keySet: string[] = [];\n private defaultServiceOptions: DefaultServiceOptions = {};\n private journalValueCodecProvider?: () => Promise<JournalValueCodec>;\n\n public bind<P extends string, M>(\n definition:\n | ServiceDefinition<P, M>\n | VirtualObjectDefinition<P, M>\n | WorkflowDefinition<P, M>\n ) {\n // Validate service name\n if (definition.name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n\n this.serviceDefinitions.set(definition.name, definition);\n }\n\n public addIdentityKeys(...keys: string[]) {\n this.keySet.push(...keys);\n }\n\n public setDefaultServiceOptions(options: DefaultServiceOptions) {\n this.defaultServiceOptions = options;\n }\n\n public setLogger(newLogger: LoggerTransport) {\n this.loggerTransport = newLogger;\n }\n\n public setJournalValueCodecProvider(\n codecProvider: () => Promise<JournalValueCodec>\n ) {\n this.journalValueCodecProvider = codecProvider;\n }\n\n public build(): Endpoint {\n const rlog = createLogger(this.loggerTransport, LogSource.SYSTEM);\n\n // Build the components\n const components = new Map<string, Component>();\n for (const [name, definition] of this.serviceDefinitions) {\n if (isServiceDefinition(definition)) {\n const { name, service } = definition;\n if (!service) {\n throw new TypeError(`no service implementation found.`);\n }\n components.set(\n name,\n buildServiceComponent(\n name,\n service,\n definition as ServiceAuxInfo,\n this.defaultServiceOptions\n )\n );\n } else if (isObjectDefinition(definition)) {\n const { name, object } = definition;\n if (!object) {\n throw new TypeError(`no object implementation found.`);\n }\n components.set(\n name,\n buildVirtualObjectComponent(\n name,\n object,\n definition as ServiceAuxInfo,\n this.defaultServiceOptions\n )\n );\n } else if (isWorkflowDefinition(definition)) {\n const { name, workflow } = definition;\n if (!workflow) {\n throw new TypeError(`no workflow implementation found.`);\n }\n components.set(\n name,\n buildWorkflowComponent(\n name,\n workflow,\n definition as ServiceAuxInfo,\n this.defaultServiceOptions\n )\n );\n } else {\n throw new TypeError(\n `cannot bind ${name}, can only bind a service or a virtual object or a workflow definition`\n );\n }\n }\n\n // Compute discovery metadata\n const discoveryMetadata = computeDiscovery(components);\n\n return {\n keySet: this.keySet,\n loggerTransport: this.loggerTransport,\n rlog,\n components,\n discoveryMetadata,\n journalValueCodec: this.journalValueCodecProvider\n ? this.journalValueCodecProvider()\n : undefined,\n };\n }\n}\n\nfunction computeDiscovery(\n components: Map<string, Component>\n): discovery.Endpoint {\n return {\n minProtocolVersion: 5,\n maxProtocolVersion: 6,\n services: [...components.values()].map((c) => c.discovery()),\n };\n}\n\nfunction buildServiceComponent(\n name: string,\n router: any,\n definition: ServiceAuxInfo,\n defaultServiceOptions: DefaultServiceOptions\n): ServiceComponent {\n if (name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n const component = new ServiceComponent(\n name,\n definition.description,\n definition.metadata,\n {\n ...defaultServiceOptions,\n ...(definition?.options as ServiceOptions | undefined),\n }\n );\n\n for (const [route, handler] of Object.entries(\n router as { [s: string]: any }\n )) {\n const wrapper = HandlerWrapper.fromHandler(handler);\n if (!wrapper) {\n throw new TypeError(`${route} is not a restate handler.`);\n }\n wrapper.bindInstance(router);\n component.add(route, wrapper);\n }\n\n return component;\n}\n\nfunction buildVirtualObjectComponent(\n name: string,\n router: any,\n definition: ServiceAuxInfo,\n defaultServiceOptions: DefaultServiceOptions\n): VirtualObjectComponent {\n if (name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n const component = new VirtualObjectComponent(\n name,\n definition.description,\n definition.metadata,\n {\n ...defaultServiceOptions,\n ...(definition?.options as ObjectOptions | undefined),\n }\n );\n\n for (const [route, handler] of Object.entries(\n router as { [s: string]: any }\n )) {\n const wrapper = HandlerWrapper.fromHandler(handler);\n if (!wrapper) {\n throw new TypeError(`${route} is not a restate handler.`);\n }\n wrapper.bindInstance(router);\n component.add(route, wrapper);\n }\n return component;\n}\n\nfunction buildWorkflowComponent(\n name: string,\n workflow: any,\n definition: ServiceAuxInfo,\n defaultServiceOptions: DefaultServiceOptions\n): WorkflowComponent {\n if (name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n const component = new WorkflowComponent(\n name,\n definition.description,\n definition.metadata,\n {\n ...defaultServiceOptions,\n ...(definition?.options as WorkflowOptions | undefined),\n }\n );\n\n for (const [route, handler] of Object.entries(\n workflow as { [s: string]: any }\n )) {\n const wrapper = HandlerWrapper.fromHandler(handler);\n if (!wrapper) {\n throw new TypeError(`${route} is not a restate handler.`);\n }\n wrapper.bindInstance(workflow);\n component.add(route, wrapper);\n }\n return component;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"endpoint.js","names":["name"],"sources":["../../src/endpoint/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\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n JournalValueCodec,\n ServiceDefinition,\n VirtualObjectDefinition,\n WorkflowDefinition,\n} from \"@restatedev/restate-sdk-core\";\n\nimport type {\n ObjectOptions,\n ServiceOptions,\n WorkflowOptions,\n} from \"../types/rpc.js\";\nimport { HandlerWrapper } from \"../types/rpc.js\";\nimport type { Component } from \"./components.js\";\nimport {\n ServiceComponent,\n VirtualObjectComponent,\n WorkflowComponent,\n} from \"./components.js\";\nimport type * as discovery from \"./discovery.js\";\nimport { defaultLoggerTransport } from \"../logging/console_logger_transport.js\";\nimport {\n type LoggerTransport,\n LogSource,\n} from \"../logging/logger_transport.js\";\nimport type { Logger } from \"../logging/logger.js\";\nimport { createLogger } from \"../logging/logger.js\";\nimport type { DefaultServiceOptions } from \"../endpoint.js\";\n\nfunction isServiceDefinition<P extends string, M>(\n m: Record<string, any>\n): m is ServiceDefinition<P, M> & { service: M } {\n return m && m.service !== undefined;\n}\n\nfunction isObjectDefinition<P extends string, M>(\n m: Record<string, any>\n): m is VirtualObjectDefinition<P, M> & { object: M } {\n return m && m.object !== undefined;\n}\n\nfunction isWorkflowDefinition<P extends string, M>(\n m: Record<string, any>\n): m is WorkflowDefinition<P, M> & { workflow: M } {\n return m && m.workflow !== undefined;\n}\n\n/**\n * Services can have additional information that is not part of the definition.\n * For example a description or metadata.\n */\ntype ServiceAuxInfo = {\n description?: string;\n metadata?: Record<string, any>;\n options?: ServiceOptions | ObjectOptions | WorkflowOptions;\n};\n\nexport type Endpoint = {\n loggerTransport: LoggerTransport;\n components: Map<string, Component>;\n keySet: string[];\n /**\n * This is a simple console without contextual info.\n *\n * This should be used only in cases where no contextual info is available.\n */\n rlog: Logger;\n /**\n * All discovery metadata, except protocol mode provided by the node/fetch/lambda endpoint implementations\n */\n discoveryMetadata: Omit<discovery.Endpoint, \"protocolMode\">;\n\n /**\n * Codec provider to use for journal values.\n */\n journalValueCodec?: Promise<JournalValueCodec>;\n};\n\nexport class EndpointBuilder {\n private readonly serviceDefinitions: Map<\n string,\n | ServiceDefinition<string, any>\n | VirtualObjectDefinition<string, any>\n | WorkflowDefinition<string, any>\n > = new Map();\n private loggerTransport: LoggerTransport = defaultLoggerTransport;\n private keySet: string[] = [];\n private defaultServiceOptions: DefaultServiceOptions = {};\n private journalValueCodecProvider?: () => Promise<JournalValueCodec>;\n\n public bind<P extends string, M>(\n definition:\n | ServiceDefinition<P, M>\n | VirtualObjectDefinition<P, M>\n | WorkflowDefinition<P, M>\n ) {\n // Validate service name\n if (definition.name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n\n this.serviceDefinitions.set(definition.name, definition);\n }\n\n public addIdentityKeys(...keys: string[]) {\n this.keySet.push(...keys);\n }\n\n public setDefaultServiceOptions(options: DefaultServiceOptions) {\n this.defaultServiceOptions = options;\n }\n\n public setLogger(newLogger: LoggerTransport) {\n this.loggerTransport = newLogger;\n }\n\n public setJournalValueCodecProvider(\n codecProvider: () => Promise<JournalValueCodec>\n ) {\n this.journalValueCodecProvider = codecProvider;\n }\n\n public build(): Endpoint {\n const rlog = createLogger(this.loggerTransport, LogSource.SYSTEM);\n\n // Build the components\n const components = new Map<string, Component>();\n for (const [name, definition] of this.serviceDefinitions) {\n if (isServiceDefinition(definition)) {\n const { name, service } = definition;\n if (!service) {\n throw new TypeError(`no service implementation found.`);\n }\n components.set(\n name,\n buildServiceComponent(\n name,\n service,\n definition as ServiceAuxInfo,\n this.defaultServiceOptions\n )\n );\n } else if (isObjectDefinition(definition)) {\n const { name, object } = definition;\n if (!object) {\n throw new TypeError(`no object implementation found.`);\n }\n components.set(\n name,\n buildVirtualObjectComponent(\n name,\n object,\n definition as ServiceAuxInfo,\n this.defaultServiceOptions\n )\n );\n } else if (isWorkflowDefinition(definition)) {\n const { name, workflow } = definition;\n if (!workflow) {\n throw new TypeError(`no workflow implementation found.`);\n }\n components.set(\n name,\n buildWorkflowComponent(\n name,\n workflow,\n definition as ServiceAuxInfo,\n this.defaultServiceOptions\n )\n );\n } else {\n throw new TypeError(\n `cannot bind ${name}, can only bind a service or a virtual object or a workflow definition`\n );\n }\n }\n\n // Compute discovery metadata\n const discoveryMetadata = computeDiscovery(components);\n\n return {\n keySet: this.keySet,\n loggerTransport: this.loggerTransport,\n rlog,\n components,\n discoveryMetadata,\n journalValueCodec: this.journalValueCodecProvider\n ? this.journalValueCodecProvider()\n : undefined,\n };\n }\n}\n\nfunction computeDiscovery(\n components: Map<string, Component>\n): discovery.Endpoint {\n return {\n minProtocolVersion: 5,\n maxProtocolVersion: 7,\n services: [...components.values()].map((c) => c.discovery()),\n };\n}\n\nfunction buildServiceComponent(\n name: string,\n router: any,\n definition: ServiceAuxInfo,\n defaultServiceOptions: DefaultServiceOptions\n): ServiceComponent {\n if (name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n const component = new ServiceComponent(\n name,\n definition.description,\n definition.metadata,\n {\n ...defaultServiceOptions,\n ...(definition?.options as ServiceOptions | undefined),\n }\n );\n\n for (const [route, handler] of Object.entries(\n router as { [s: string]: any }\n )) {\n const wrapper = HandlerWrapper.fromHandler(handler);\n if (!wrapper) {\n throw new TypeError(`${route} is not a restate handler.`);\n }\n wrapper.bindInstance(router);\n component.add(route, wrapper);\n }\n\n return component;\n}\n\nfunction buildVirtualObjectComponent(\n name: string,\n router: any,\n definition: ServiceAuxInfo,\n defaultServiceOptions: DefaultServiceOptions\n): VirtualObjectComponent {\n if (name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n const component = new VirtualObjectComponent(\n name,\n definition.description,\n definition.metadata,\n {\n ...defaultServiceOptions,\n ...(definition?.options as ObjectOptions | undefined),\n }\n );\n\n for (const [route, handler] of Object.entries(\n router as { [s: string]: any }\n )) {\n const wrapper = HandlerWrapper.fromHandler(handler);\n if (!wrapper) {\n throw new TypeError(`${route} is not a restate handler.`);\n }\n wrapper.bindInstance(router);\n component.add(route, wrapper);\n }\n return component;\n}\n\nfunction buildWorkflowComponent(\n name: string,\n workflow: any,\n definition: ServiceAuxInfo,\n defaultServiceOptions: DefaultServiceOptions\n): WorkflowComponent {\n if (name.indexOf(\"/\") !== -1) {\n throw new Error(\"service name must not contain any slash '/'\");\n }\n const component = new WorkflowComponent(\n name,\n definition.description,\n definition.metadata,\n {\n ...defaultServiceOptions,\n ...(definition?.options as WorkflowOptions | undefined),\n }\n );\n\n for (const [route, handler] of Object.entries(\n workflow as { [s: string]: any }\n )) {\n const wrapper = HandlerWrapper.fromHandler(handler);\n if (!wrapper) {\n throw new TypeError(`${route} is not a restate handler.`);\n }\n wrapper.bindInstance(workflow);\n component.add(route, wrapper);\n }\n return component;\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
2
  const require_errors = require('../../types/errors.cjs');
3
- const require_completable_promise = require('../../utils/completable_promise.cjs');
4
3
  const require_rpc = require('../../types/rpc.cjs');
5
4
  const require_components = require('../components.cjs');
6
5
  const require_logger_transport = require('../../logging/logger_transport.cjs');
@@ -137,7 +136,7 @@ var RestateInvokeResponse = class {
137
136
  encode: (entry) => entry,
138
137
  decode: (entry) => Promise.resolve(entry)
139
138
  };
140
- const invocationEndPromise = new require_completable_promise.CompletablePromise();
139
+ const invocationEndPromise = Promise.withResolvers();
141
140
  let ctx;
142
141
  try {
143
142
  await bufferJournalReplayInCoreVm(this.coreVm, inputReader);
@@ -1 +1 @@
1
- {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/endpoint/handlers/generic.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,QAAQ,IAAI,gBAAgB,EAC5B,YAAY,EACb,MAAM,iBAAiB,CAAC;AA0BzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,KAAK,cAAc,EAQpB,MAAM,YAAY,CAAC;AAkBpB,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,yBAAyB,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACnD,cAAc,CAMhB"}
1
+ {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/endpoint/handlers/generic.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,QAAQ,IAAI,gBAAgB,EAC5B,YAAY,EACb,MAAM,iBAAiB,CAAC;AAyBzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,KAAK,cAAc,EAQpB,MAAM,YAAY,CAAC;AAkBpB,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,EAC1B,yBAAyB,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACnD,cAAc,CAMhB"}