@restatedev/restate-sdk-cloudflare-workers 1.9.1 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/_virtual/rolldown_runtime.cjs +25 -0
- package/dist/common_api.cjs +25 -0
- package/dist/common_api.d.cts +30 -0
- package/dist/common_api.d.cts.map +1 -0
- package/dist/common_api.d.ts +30 -0
- package/dist/common_api.d.ts.map +1 -0
- package/dist/common_api.js +19 -0
- package/dist/common_api.js.map +1 -0
- package/dist/context.cjs +29 -0
- package/dist/context.d.cts +699 -0
- package/dist/context.d.cts.map +1 -0
- package/dist/context.d.ts +699 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +29 -0
- package/dist/context.js.map +1 -0
- package/dist/context_impl.cjs +441 -0
- package/dist/context_impl.js +440 -0
- package/dist/context_impl.js.map +1 -0
- package/dist/endpoint/components.cjs +257 -0
- package/dist/endpoint/components.js +253 -0
- package/dist/endpoint/components.js.map +1 -0
- package/dist/endpoint/endpoint.cjs +117 -0
- package/dist/endpoint/endpoint.js +118 -0
- package/dist/endpoint/endpoint.js.map +1 -0
- package/dist/endpoint/fetch_endpoint.cjs +41 -0
- package/dist/endpoint/fetch_endpoint.d.cts +39 -0
- package/dist/endpoint/fetch_endpoint.d.cts.map +1 -0
- package/dist/endpoint/fetch_endpoint.d.ts +39 -0
- package/dist/endpoint/fetch_endpoint.d.ts.map +1 -0
- package/dist/endpoint/fetch_endpoint.js +42 -0
- package/dist/endpoint/fetch_endpoint.js.map +1 -0
- package/dist/endpoint/handlers/fetch.cjs +21 -0
- package/dist/endpoint/handlers/fetch.js +21 -0
- package/dist/endpoint/handlers/fetch.js.map +1 -0
- package/dist/endpoint/handlers/generic.cjs +328 -0
- package/dist/endpoint/handlers/generic.js +324 -0
- package/dist/endpoint/handlers/generic.js.map +1 -0
- package/dist/endpoint/handlers/lambda.cjs +93 -0
- package/dist/endpoint/handlers/lambda.js +89 -0
- package/dist/endpoint/handlers/lambda.js.map +1 -0
- package/dist/endpoint/lambda_endpoint.cjs +36 -0
- package/dist/endpoint/lambda_endpoint.d.cts +26 -0
- package/dist/endpoint/lambda_endpoint.d.cts.map +1 -0
- package/dist/endpoint/lambda_endpoint.d.ts +26 -0
- package/dist/endpoint/lambda_endpoint.d.ts.map +1 -0
- package/dist/endpoint/lambda_endpoint.js +37 -0
- package/dist/endpoint/lambda_endpoint.js.map +1 -0
- package/dist/endpoint/node_endpoint.cjs +101 -0
- package/dist/endpoint/node_endpoint.js +99 -0
- package/dist/endpoint/node_endpoint.js.map +1 -0
- package/dist/endpoint/types.d.cts +61 -0
- package/dist/endpoint/types.d.cts.map +1 -0
- package/dist/endpoint/types.d.ts +61 -0
- package/dist/endpoint/types.d.ts.map +1 -0
- package/dist/endpoint/withOptions.cjs +15 -0
- package/dist/endpoint/withOptions.js +15 -0
- package/dist/endpoint/withOptions.js.map +1 -0
- package/dist/endpoint.d.cts +112 -0
- package/dist/endpoint.d.cts.map +1 -0
- package/dist/endpoint.d.ts +112 -0
- package/dist/endpoint.d.ts.map +1 -0
- package/dist/fetch.cjs +83 -0
- package/dist/fetch.d.cts +52 -0
- package/dist/fetch.d.cts.map +1 -0
- package/dist/fetch.d.ts +52 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/{esm/src/fetch.js → fetch.js} +15 -18
- package/dist/fetch.js.map +1 -0
- package/dist/index.cjs +48 -0
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +7 -0
- package/dist/io.cjs +48 -0
- package/dist/io.js +48 -0
- package/dist/io.js.map +1 -0
- package/dist/lambda.cjs +74 -0
- package/dist/lambda.d.cts +32 -0
- package/dist/lambda.d.cts.map +1 -0
- package/dist/lambda.d.ts +32 -0
- package/dist/lambda.d.ts.map +1 -0
- package/dist/lambda.js +35 -0
- package/dist/lambda.js.map +1 -0
- package/dist/logging/console_logger_transport.cjs +54 -0
- package/dist/logging/console_logger_transport.js +54 -0
- package/dist/logging/console_logger_transport.js.map +1 -0
- package/dist/logging/logger.cjs +43 -0
- package/dist/logging/logger.js +44 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/logger_transport.cjs +42 -0
- package/dist/logging/logger_transport.d.cts +57 -0
- package/dist/logging/logger_transport.d.cts.map +1 -0
- package/dist/logging/logger_transport.d.ts +57 -0
- package/dist/logging/logger_transport.d.ts.map +1 -0
- package/dist/logging/logger_transport.js +40 -0
- package/dist/logging/logger_transport.js.map +1 -0
- package/dist/node.cjs +90 -0
- package/dist/node.d.cts +51 -0
- package/dist/node.d.cts.map +1 -0
- package/dist/node.d.ts +51 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +50 -0
- package/dist/node.js.map +1 -0
- package/dist/package.cjs +11 -0
- package/dist/package.js +6 -0
- package/dist/package.js.map +1 -0
- package/dist/promises.cjs +234 -0
- package/dist/promises.js +226 -0
- package/dist/promises.js.map +1 -0
- package/dist/types/errors.cjs +110 -0
- package/dist/types/errors.d.cts +71 -0
- package/dist/types/errors.d.cts.map +1 -0
- package/dist/types/errors.d.ts +71 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +102 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/rpc.cjs +425 -0
- package/dist/types/rpc.d.cts +580 -0
- package/dist/types/rpc.d.cts.map +1 -0
- package/dist/types/rpc.d.ts +580 -0
- package/dist/types/rpc.d.ts.map +1 -0
- package/dist/types/rpc.js +406 -0
- package/dist/types/rpc.js.map +1 -0
- package/dist/user_agent.cjs +7 -0
- package/dist/user_agent.js +8 -0
- package/dist/user_agent.js.map +1 -0
- package/dist/utils/completable_promise.cjs +22 -0
- package/dist/utils/completable_promise.js +22 -0
- package/dist/utils/completable_promise.js.map +1 -0
- package/dist/utils/rand.cjs +72 -0
- package/dist/utils/rand.js +71 -0
- package/dist/utils/rand.js.map +1 -0
- package/dist/utils/streams.cjs +14 -0
- package/dist/utils/streams.js +13 -0
- package/dist/utils/streams.js.map +1 -0
- package/package.json +30 -52
- package/dist/esm/src/common_api.d.ts +0 -37
- package/dist/esm/src/common_api.d.ts.map +0 -1
- package/dist/esm/src/common_api.js +0 -32
- package/dist/esm/src/common_api.js.map +0 -1
- package/dist/esm/src/context.d.ts +0 -695
- package/dist/esm/src/context.d.ts.map +0 -1
- package/dist/esm/src/context.js +0 -87
- package/dist/esm/src/context.js.map +0 -1
- package/dist/esm/src/context_impl.d.ts +0 -69
- package/dist/esm/src/context_impl.d.ts.map +0 -1
- package/dist/esm/src/context_impl.js +0 -592
- package/dist/esm/src/context_impl.js.map +0 -1
- package/dist/esm/src/endpoint/components.d.ts +0 -97
- package/dist/esm/src/endpoint/components.d.ts.map +0 -1
- package/dist/esm/src/endpoint/components.js +0 -343
- package/dist/esm/src/endpoint/components.js.map +0 -1
- package/dist/esm/src/endpoint/discovery.d.ts +0 -184
- package/dist/esm/src/endpoint/discovery.d.ts.map +0 -1
- package/dist/esm/src/endpoint/discovery.js +0 -8
- package/dist/esm/src/endpoint/discovery.js.map +0 -1
- package/dist/esm/src/endpoint/endpoint.d.ts +0 -39
- package/dist/esm/src/endpoint/endpoint.d.ts.map +0 -1
- package/dist/esm/src/endpoint/endpoint.js +0 -155
- package/dist/esm/src/endpoint/endpoint.js.map +0 -1
- package/dist/esm/src/endpoint/fetch_endpoint.d.ts +0 -49
- package/dist/esm/src/endpoint/fetch_endpoint.d.ts.map +0 -1
- package/dist/esm/src/endpoint/fetch_endpoint.js +0 -49
- package/dist/esm/src/endpoint/fetch_endpoint.js.map +0 -1
- package/dist/esm/src/endpoint/handlers/fetch.d.ts +0 -5
- package/dist/esm/src/endpoint/handlers/fetch.d.ts.map +0 -1
- package/dist/esm/src/endpoint/handlers/fetch.js +0 -31
- package/dist/esm/src/endpoint/handlers/fetch.js.map +0 -1
- package/dist/esm/src/endpoint/handlers/generic.d.ts +0 -61
- package/dist/esm/src/endpoint/handlers/generic.d.ts.map +0 -1
- package/dist/esm/src/endpoint/handlers/generic.js +0 -470
- package/dist/esm/src/endpoint/handlers/generic.js.map +0 -1
- package/dist/esm/src/endpoint/handlers/lambda.d.ts +0 -10
- package/dist/esm/src/endpoint/handlers/lambda.d.ts.map +0 -1
- package/dist/esm/src/endpoint/handlers/lambda.js +0 -143
- package/dist/esm/src/endpoint/handlers/lambda.js.map +0 -1
- package/dist/esm/src/endpoint/lambda_endpoint.d.ts +0 -30
- package/dist/esm/src/endpoint/lambda_endpoint.d.ts.map +0 -1
- package/dist/esm/src/endpoint/lambda_endpoint.js +0 -48
- package/dist/esm/src/endpoint/lambda_endpoint.js.map +0 -1
- package/dist/esm/src/endpoint/node_endpoint.d.ts +0 -16
- package/dist/esm/src/endpoint/node_endpoint.d.ts.map +0 -1
- package/dist/esm/src/endpoint/node_endpoint.js +0 -124
- package/dist/esm/src/endpoint/node_endpoint.js.map +0 -1
- package/dist/esm/src/endpoint/types.d.ts +0 -55
- package/dist/esm/src/endpoint/types.d.ts.map +0 -1
- package/dist/esm/src/endpoint/types.js +0 -2
- package/dist/esm/src/endpoint/types.js.map +0 -1
- package/dist/esm/src/endpoint/withOptions.d.ts +0 -4
- package/dist/esm/src/endpoint/withOptions.d.ts.map +0 -1
- package/dist/esm/src/endpoint/withOptions.js +0 -19
- package/dist/esm/src/endpoint/withOptions.js.map +0 -1
- package/dist/esm/src/endpoint.d.ts +0 -108
- package/dist/esm/src/endpoint.d.ts.map +0 -1
- package/dist/esm/src/endpoint.js +0 -12
- package/dist/esm/src/endpoint.js.map +0 -1
- package/dist/esm/src/fetch.d.ts +0 -43
- package/dist/esm/src/fetch.d.ts.map +0 -1
- package/dist/esm/src/fetch.js.map +0 -1
- package/dist/esm/src/generated/version.d.ts +0 -2
- package/dist/esm/src/generated/version.d.ts.map +0 -1
- package/dist/esm/src/generated/version.js +0 -2
- package/dist/esm/src/generated/version.js.map +0 -1
- package/dist/esm/src/io.d.ts +0 -24
- package/dist/esm/src/io.d.ts.map +0 -1
- package/dist/esm/src/io.js +0 -73
- package/dist/esm/src/io.js.map +0 -1
- package/dist/esm/src/lambda.d.ts +0 -23
- package/dist/esm/src/lambda.d.ts.map +0 -1
- package/dist/esm/src/lambda.js +0 -37
- package/dist/esm/src/lambda.js.map +0 -1
- package/dist/esm/src/logging/console_logger_transport.d.ts +0 -5
- package/dist/esm/src/logging/console_logger_transport.d.ts.map +0 -1
- package/dist/esm/src/logging/console_logger_transport.js +0 -94
- package/dist/esm/src/logging/console_logger_transport.js.map +0 -1
- package/dist/esm/src/logging/logger.d.ts +0 -10
- package/dist/esm/src/logging/logger.d.ts.map +0 -1
- package/dist/esm/src/logging/logger.js +0 -57
- package/dist/esm/src/logging/logger.js.map +0 -1
- package/dist/esm/src/logging/logger_transport.d.ts +0 -52
- package/dist/esm/src/logging/logger_transport.d.ts.map +0 -1
- package/dist/esm/src/logging/logger_transport.js +0 -55
- package/dist/esm/src/logging/logger_transport.js.map +0 -1
- package/dist/esm/src/node.d.ts +0 -39
- package/dist/esm/src/node.d.ts.map +0 -1
- package/dist/esm/src/node.js +0 -52
- package/dist/esm/src/node.js.map +0 -1
- package/dist/esm/src/promises.d.ts +0 -111
- package/dist/esm/src/promises.d.ts.map +0 -1
- package/dist/esm/src/promises.js +0 -314
- package/dist/esm/src/promises.js.map +0 -1
- package/dist/esm/src/public_api.d.ts +0 -2
- package/dist/esm/src/public_api.d.ts.map +0 -1
- package/dist/esm/src/public_api.js +0 -12
- package/dist/esm/src/public_api.js.map +0 -1
- package/dist/esm/src/types/errors.d.ts +0 -74
- package/dist/esm/src/types/errors.d.ts.map +0 -1
- package/dist/esm/src/types/errors.js +0 -128
- package/dist/esm/src/types/errors.js.map +0 -1
- package/dist/esm/src/types/rpc.d.ts +0 -620
- package/dist/esm/src/types/rpc.d.ts.map +0 -1
- package/dist/esm/src/types/rpc.js +0 -577
- package/dist/esm/src/types/rpc.js.map +0 -1
- package/dist/esm/src/user_agent.d.ts +0 -2
- package/dist/esm/src/user_agent.d.ts.map +0 -1
- package/dist/esm/src/user_agent.js +0 -13
- package/dist/esm/src/user_agent.js.map +0 -1
- package/dist/esm/src/utils/completable_promise.d.ts +0 -9
- package/dist/esm/src/utils/completable_promise.d.ts.map +0 -1
- package/dist/esm/src/utils/completable_promise.js +0 -30
- package/dist/esm/src/utils/completable_promise.js.map +0 -1
- package/dist/esm/src/utils/rand.d.ts +0 -13
- package/dist/esm/src/utils/rand.d.ts.map +0 -1
- package/dist/esm/src/utils/rand.js +0 -109
- package/dist/esm/src/utils/rand.js.map +0 -1
- package/dist/esm/src/utils/streams.d.ts +0 -3
- package/dist/esm/src/utils/streams.d.ts.map +0 -1
- package/dist/esm/src/utils/streams.js +0 -20
- package/dist/esm/src/utils/streams.js.map +0 -1
- package/dist/esm/tsconfig.tsbuildinfo +0 -1
- /package/dist/{esm/src/endpoint → endpoint}/handlers/vm/sdk_shared_core_wasm_bindings.d.ts +0 -0
- /package/dist/{esm/src/endpoint → endpoint}/handlers/vm/sdk_shared_core_wasm_bindings.js +0 -0
- /package/dist/{esm/src/endpoint → endpoint}/handlers/vm/sdk_shared_core_wasm_bindings_bg.js +0 -0
- /package/dist/{esm/src/endpoint → endpoint}/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm +0 -0
- /package/dist/{esm/src/endpoint → endpoint}/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm.d.ts +0 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import { INTERNAL_ERROR_CODE, RestateError, RetryableError, TerminalError, UNKNOWN_ERROR_CODE, ensureError, logError } from "./types/errors.js";
|
|
2
|
+
import { HandlerKind, makeRpcCallProxy, makeRpcSendProxy } from "./types/rpc.js";
|
|
3
|
+
import { CompletablePromise } from "./utils/completable_promise.js";
|
|
4
|
+
import { WasmCommandType, WasmHeader } from "./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js";
|
|
5
|
+
import { RandImpl } from "./utils/rand.js";
|
|
6
|
+
import { InvocationPendingPromise, PromisesExecutor, RestateCombinatorPromise, RestateInvocationPromise, RestatePendingPromise, RestateSinglePromise, extractContext, pendingPromise } from "./promises.js";
|
|
7
|
+
import { InputPump, OutputPump } from "./io.js";
|
|
8
|
+
import { millisOrDurationToMillis, serde } from "@restatedev/restate-sdk-core";
|
|
9
|
+
|
|
10
|
+
//#region src/context_impl.ts
|
|
11
|
+
var ContextImpl = class {
|
|
12
|
+
rand;
|
|
13
|
+
date = {
|
|
14
|
+
now: () => {
|
|
15
|
+
return this.run(() => Date.now());
|
|
16
|
+
},
|
|
17
|
+
toJSON: () => {
|
|
18
|
+
return this.run(() => (/* @__PURE__ */ new Date()).toJSON());
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
outputPump;
|
|
22
|
+
runClosuresTracker;
|
|
23
|
+
promisesExecutor;
|
|
24
|
+
defaultSerde;
|
|
25
|
+
constructor(coreVm, input, console, handlerKind, vmLogger, invocationRequest, invocationEndPromise, inputReader, outputWriter, journalValueCodec, defaultSerde, asTerminalError) {
|
|
26
|
+
this.coreVm = coreVm;
|
|
27
|
+
this.input = input;
|
|
28
|
+
this.console = console;
|
|
29
|
+
this.handlerKind = handlerKind;
|
|
30
|
+
this.vmLogger = vmLogger;
|
|
31
|
+
this.invocationRequest = invocationRequest;
|
|
32
|
+
this.invocationEndPromise = invocationEndPromise;
|
|
33
|
+
this.journalValueCodec = journalValueCodec;
|
|
34
|
+
this.asTerminalError = asTerminalError;
|
|
35
|
+
this.rand = new RandImpl(input.random_seed, () => {});
|
|
36
|
+
this.outputPump = new OutputPump(coreVm, outputWriter);
|
|
37
|
+
this.runClosuresTracker = new RunClosuresTracker();
|
|
38
|
+
this.promisesExecutor = new PromisesExecutor(coreVm, new InputPump(coreVm, inputReader, this.handleInvocationEndError.bind(this)), this.outputPump, this.runClosuresTracker, this.promiseExecutorErrorCallback.bind(this));
|
|
39
|
+
this.defaultSerde = defaultSerde ?? serde.json;
|
|
40
|
+
}
|
|
41
|
+
cancel(invocationId) {
|
|
42
|
+
this.processNonCompletableEntry(WasmCommandType.CancelInvocation, () => {}, (vm) => vm.sys_cancel_invocation(invocationId));
|
|
43
|
+
}
|
|
44
|
+
attach(invocationId, serde$1) {
|
|
45
|
+
return this.processCompletableEntry(WasmCommandType.AttachInvocation, () => {}, (vm) => vm.sys_attach_invocation(invocationId), SuccessWithSerde(serde$1 ?? this.defaultSerde, this.journalValueCodec), Failure);
|
|
46
|
+
}
|
|
47
|
+
get key() {
|
|
48
|
+
switch (this.handlerKind) {
|
|
49
|
+
case HandlerKind.EXCLUSIVE:
|
|
50
|
+
case HandlerKind.SHARED:
|
|
51
|
+
case HandlerKind.WORKFLOW: return this.input.key;
|
|
52
|
+
default: throw new TerminalError("this handler type doesn't support key()");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
request() {
|
|
56
|
+
return this.invocationRequest;
|
|
57
|
+
}
|
|
58
|
+
get(name, serde$1) {
|
|
59
|
+
return this.processCompletableEntry(WasmCommandType.GetState, () => {}, (vm) => vm.sys_get_state(name), VoidAsNull, SuccessWithSerde(serde$1 ?? this.defaultSerde, this.journalValueCodec));
|
|
60
|
+
}
|
|
61
|
+
stateKeys() {
|
|
62
|
+
return this.processCompletableEntry(WasmCommandType.GetStateKeys, () => {}, (vm) => vm.sys_get_state_keys(), StateKeys);
|
|
63
|
+
}
|
|
64
|
+
set(name, value, serde$1) {
|
|
65
|
+
this.processNonCompletableEntry(WasmCommandType.SetState, () => this.journalValueCodec.encode((serde$1 ?? this.defaultSerde).serialize(value)), (vm, bytes) => vm.sys_set_state(name, bytes));
|
|
66
|
+
}
|
|
67
|
+
clear(name) {
|
|
68
|
+
this.processNonCompletableEntry(WasmCommandType.ClearState, () => {}, (vm) => vm.sys_clear_state(name));
|
|
69
|
+
}
|
|
70
|
+
clearAll() {
|
|
71
|
+
this.processNonCompletableEntry(WasmCommandType.ClearAllState, () => {}, (vm) => vm.sys_clear_all_state());
|
|
72
|
+
}
|
|
73
|
+
genericCall(call) {
|
|
74
|
+
const requestSerde = call.inputSerde ?? serde.binary;
|
|
75
|
+
const responseSerde = call.outputSerde ?? serde.binary;
|
|
76
|
+
let parameter;
|
|
77
|
+
try {
|
|
78
|
+
parameter = this.journalValueCodec.encode(requestSerde.serialize(call.parameter));
|
|
79
|
+
} catch (e) {
|
|
80
|
+
this.handleInvocationEndError(e, (vm, error) => vm.notify_error_for_next_command(error.message, error.stack, WasmCommandType.Call));
|
|
81
|
+
return new InvocationPendingPromise(this);
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const call_handles = this.coreVm.sys_call(call.service, call.method, parameter, call.key, call.headers ? Object.entries(call.headers).map(([key, value]) => new WasmHeader(key, value)) : [], call.idempotencyKey);
|
|
85
|
+
const commandIndex = this.coreVm.last_command_index();
|
|
86
|
+
const invocationIdPromise = new RestateSinglePromise(this, call_handles.invocation_id_completion_id, completeCommandPromiseUsing(WasmCommandType.Call, commandIndex, InvocationIdCompleter));
|
|
87
|
+
return new RestateInvocationPromise(this, call_handles.call_completion_id, completeCommandPromiseUsing(WasmCommandType.Call, commandIndex, SuccessWithSerde(responseSerde, this.journalValueCodec), Failure), invocationIdPromise);
|
|
88
|
+
} catch (e) {
|
|
89
|
+
this.handleInvocationEndError(e);
|
|
90
|
+
return new InvocationPendingPromise(this);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
genericSend(send) {
|
|
94
|
+
const requestSerde = send.inputSerde ?? serde.binary;
|
|
95
|
+
let parameter;
|
|
96
|
+
try {
|
|
97
|
+
parameter = this.journalValueCodec.encode(requestSerde.serialize(send.parameter));
|
|
98
|
+
} catch (e) {
|
|
99
|
+
this.handleInvocationEndError(e, (vm, error) => vm.notify_error_for_next_command(error.message, error.stack, WasmCommandType.OneWayCall));
|
|
100
|
+
return new InvocationPendingPromise(this);
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const delay = send.delay !== void 0 ? millisOrDurationToMillis(send.delay) : void 0;
|
|
104
|
+
const handles = this.coreVm.sys_send(send.service, send.method, parameter, send.key, send.headers ? Object.entries(send.headers).map(([key, value]) => new WasmHeader(key, value)) : [], delay !== void 0 && delay > 0 ? BigInt(delay) : void 0, send.idempotencyKey);
|
|
105
|
+
const commandIndex = this.coreVm.last_command_index();
|
|
106
|
+
return { invocationId: new RestateSinglePromise(this, handles.invocation_id_completion_id, completeCommandPromiseUsing(WasmCommandType.OneWayCall, commandIndex, InvocationIdCompleter)) };
|
|
107
|
+
} catch (e) {
|
|
108
|
+
this.handleInvocationEndError(e);
|
|
109
|
+
return { invocationId: pendingPromise() };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
serviceClient({ name }) {
|
|
113
|
+
return makeRpcCallProxy((call) => this.genericCall(call), this.defaultSerde, name);
|
|
114
|
+
}
|
|
115
|
+
objectClient({ name }, key) {
|
|
116
|
+
return makeRpcCallProxy((call) => this.genericCall(call), this.defaultSerde, name, key);
|
|
117
|
+
}
|
|
118
|
+
workflowClient({ name }, key) {
|
|
119
|
+
return makeRpcCallProxy((call) => this.genericCall(call), this.defaultSerde, name, key);
|
|
120
|
+
}
|
|
121
|
+
serviceSendClient({ name }, opts) {
|
|
122
|
+
return makeRpcSendProxy((send) => this.genericSend(send), this.defaultSerde, name, void 0, opts?.delay);
|
|
123
|
+
}
|
|
124
|
+
objectSendClient({ name }, key, opts) {
|
|
125
|
+
return makeRpcSendProxy((send) => this.genericSend(send), this.defaultSerde, name, key, opts?.delay);
|
|
126
|
+
}
|
|
127
|
+
workflowSendClient({ name }, key, opts) {
|
|
128
|
+
return makeRpcSendProxy((send) => this.genericSend(send), this.defaultSerde, name, key, opts?.delay);
|
|
129
|
+
}
|
|
130
|
+
run(nameOrAction, actionSecondParameter, options) {
|
|
131
|
+
const { name, action } = unpackRunParameters(nameOrAction, actionSecondParameter);
|
|
132
|
+
const serde$1 = options?.serde ?? this.defaultSerde;
|
|
133
|
+
let handle;
|
|
134
|
+
try {
|
|
135
|
+
handle = this.coreVm.sys_run(name ?? "");
|
|
136
|
+
} catch (e) {
|
|
137
|
+
this.handleInvocationEndError(e);
|
|
138
|
+
return new RestatePendingPromise(this);
|
|
139
|
+
}
|
|
140
|
+
const commandIndex = this.coreVm.last_command_index();
|
|
141
|
+
const doRun = async () => {
|
|
142
|
+
const startTime = Date.now();
|
|
143
|
+
let res;
|
|
144
|
+
let err;
|
|
145
|
+
try {
|
|
146
|
+
res = await action();
|
|
147
|
+
} catch (e) {
|
|
148
|
+
err = ensureError(e, this.asTerminalError);
|
|
149
|
+
}
|
|
150
|
+
const attemptDuration = Date.now() - startTime;
|
|
151
|
+
try {
|
|
152
|
+
if (err !== void 0) if (err instanceof TerminalError) this.coreVm.propose_run_completion_failure(handle, {
|
|
153
|
+
code: err.code,
|
|
154
|
+
message: err.message
|
|
155
|
+
});
|
|
156
|
+
else if (err instanceof RetryableError) {
|
|
157
|
+
const maxRetryDuration = options?.maxRetryDuration ?? options?.maxRetryDurationMillis;
|
|
158
|
+
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, maxRetryDuration !== void 0 ? BigInt(millisOrDurationToMillis(maxRetryDuration)) : void 0);
|
|
159
|
+
} else {
|
|
160
|
+
this.vmLogger.warn(`Error when processing ctx.run '${name}'.\n`, err);
|
|
161
|
+
let retryPolicy;
|
|
162
|
+
if (options?.retryIntervalFactor !== void 0 || options?.maxRetryAttempts !== void 0 || options?.initialRetryInterval !== void 0 || options?.initialRetryIntervalMillis !== void 0 || options?.maxRetryDuration !== void 0 || options?.maxRetryDurationMillis !== void 0 || options?.maxRetryInterval !== void 0 || options?.maxRetryIntervalMillis !== void 0) {
|
|
163
|
+
const maxRetryDuration = options?.maxRetryDuration ?? options?.maxRetryDurationMillis;
|
|
164
|
+
retryPolicy = {
|
|
165
|
+
factor: options?.retryIntervalFactor ?? 2,
|
|
166
|
+
initial_interval: millisOrDurationToMillis(options?.initialRetryInterval ?? options?.initialRetryIntervalMillis ?? 50),
|
|
167
|
+
max_attempts: options?.maxRetryAttempts,
|
|
168
|
+
max_duration: maxRetryDuration === void 0 ? void 0 : millisOrDurationToMillis(maxRetryDuration),
|
|
169
|
+
max_interval: millisOrDurationToMillis(options?.maxRetryInterval ?? options?.maxRetryIntervalMillis ?? { seconds: 10 })
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
this.coreVm.propose_run_completion_failure_transient(handle, err.message, err.stack, BigInt(attemptDuration), retryPolicy);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
const serializedRes = serde$1.serialize(res);
|
|
176
|
+
const encodedRes = this.journalValueCodec.encode(serializedRes);
|
|
177
|
+
this.coreVm.propose_run_completion_success(handle, encodedRes);
|
|
178
|
+
}
|
|
179
|
+
} catch (e) {
|
|
180
|
+
this.handleInvocationEndError(e);
|
|
181
|
+
return pendingPromise();
|
|
182
|
+
}
|
|
183
|
+
await this.outputPump.awaitNextProgress();
|
|
184
|
+
};
|
|
185
|
+
this.runClosuresTracker.registerRunClosure(handle, doRun);
|
|
186
|
+
return new RestateSinglePromise(this, handle, completeCommandPromiseUsing(WasmCommandType.Run, commandIndex, SuccessWithSerde(serde$1, this.journalValueCodec), Failure));
|
|
187
|
+
}
|
|
188
|
+
sleep(duration, name) {
|
|
189
|
+
return this.processCompletableEntry(WasmCommandType.Sleep, () => {
|
|
190
|
+
if (duration === void 0) throw new Error(`Duration is undefined.`);
|
|
191
|
+
const millis = millisOrDurationToMillis(duration);
|
|
192
|
+
if (millis < 0) throw new Error(`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()'.`);
|
|
193
|
+
return BigInt(millis);
|
|
194
|
+
}, (vm, millis) => vm.sys_sleep(millis, name), VoidAsUndefined);
|
|
195
|
+
}
|
|
196
|
+
awakeable(serde$1) {
|
|
197
|
+
let awakeable;
|
|
198
|
+
try {
|
|
199
|
+
awakeable = this.coreVm.sys_awakeable();
|
|
200
|
+
} catch (e) {
|
|
201
|
+
this.handleInvocationEndError(e);
|
|
202
|
+
return {
|
|
203
|
+
id: "invalid",
|
|
204
|
+
promise: new RestatePendingPromise(this)
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
id: awakeable.id,
|
|
209
|
+
promise: new RestateSinglePromise(this, awakeable.handle, completeSignalPromiseUsing(VoidAsUndefined, SuccessWithSerde(serde$1 ?? this.defaultSerde, this.journalValueCodec), Failure))
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
resolveAwakeable(id, payload, serde$1) {
|
|
213
|
+
this.processNonCompletableEntry(WasmCommandType.CompleteAwakeable, () => {
|
|
214
|
+
let value;
|
|
215
|
+
if (serde$1) value = payload === void 0 ? new Uint8Array() : serde$1.serialize(payload);
|
|
216
|
+
else value = payload !== void 0 ? this.defaultSerde.serialize(payload) : this.defaultSerde.serialize(null);
|
|
217
|
+
return this.journalValueCodec.encode(value);
|
|
218
|
+
}, (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes));
|
|
219
|
+
}
|
|
220
|
+
rejectAwakeable(id, reason) {
|
|
221
|
+
this.processNonCompletableEntry(WasmCommandType.CompleteAwakeable, () => {}, (vm) => {
|
|
222
|
+
vm.sys_complete_awakeable_failure(id, {
|
|
223
|
+
code: UNKNOWN_ERROR_CODE,
|
|
224
|
+
message: reason
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
promise(name, serde$1) {
|
|
229
|
+
return new DurablePromiseImpl(this, name, serde$1);
|
|
230
|
+
}
|
|
231
|
+
static createCombinator(combinatorConstructor, promises) {
|
|
232
|
+
const self = extractContext(promises[0]);
|
|
233
|
+
if (!self) throw new Error("Not a combinable promise");
|
|
234
|
+
const castedPromises = [];
|
|
235
|
+
for (const promise of promises) {
|
|
236
|
+
if (extractContext(promise) !== self) {
|
|
237
|
+
self.handleInvocationEndError(/* @__PURE__ */ new Error("You're mixing up RestatePromises from different RestateContext. This is not supported."));
|
|
238
|
+
return new RestatePendingPromise(self);
|
|
239
|
+
}
|
|
240
|
+
castedPromises.push(promise);
|
|
241
|
+
}
|
|
242
|
+
return new RestateCombinatorPromise(self, combinatorConstructor, castedPromises);
|
|
243
|
+
}
|
|
244
|
+
processNonCompletableEntry(commandType, prepare, vmCall) {
|
|
245
|
+
let input;
|
|
246
|
+
try {
|
|
247
|
+
input = prepare();
|
|
248
|
+
} catch (e) {
|
|
249
|
+
this.handleInvocationEndError(e, (vm, error) => vm.notify_error_for_next_command(error.message, error.stack, commandType));
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
vmCall(this.coreVm, input);
|
|
254
|
+
} catch (e) {
|
|
255
|
+
this.handleInvocationEndError(e);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
processCompletableEntry(commandType, prepare, vmCall, ...completers) {
|
|
259
|
+
let input;
|
|
260
|
+
try {
|
|
261
|
+
input = prepare();
|
|
262
|
+
} catch (e) {
|
|
263
|
+
this.handleInvocationEndError(e, (vm, error) => vm.notify_error_for_next_command(error.message, error.stack, commandType));
|
|
264
|
+
return new RestatePendingPromise(this);
|
|
265
|
+
}
|
|
266
|
+
let handle;
|
|
267
|
+
try {
|
|
268
|
+
handle = vmCall(this.coreVm, input);
|
|
269
|
+
} catch (e) {
|
|
270
|
+
this.handleInvocationEndError(e);
|
|
271
|
+
return new RestatePendingPromise(this);
|
|
272
|
+
}
|
|
273
|
+
const commandIndex = this.coreVm.last_command_index();
|
|
274
|
+
return new RestateSinglePromise(this, handle, completeCommandPromiseUsing(commandType, commandIndex, ...completers));
|
|
275
|
+
}
|
|
276
|
+
promiseExecutorErrorCallback(e) {
|
|
277
|
+
if (e instanceof AsyncCompleterError) {
|
|
278
|
+
const cause = ensureError(e.cause);
|
|
279
|
+
logError(this.vmLogger, e.cause);
|
|
280
|
+
this.coreVm.notify_error_for_specific_command(cause.message, cause.stack, e.commandType, e.commandIndex, null);
|
|
281
|
+
} else {
|
|
282
|
+
const error = ensureError(e);
|
|
283
|
+
logError(this.vmLogger, error);
|
|
284
|
+
if (!(error instanceof RestateError)) this.coreVm.notify_error(error.message, error.stack);
|
|
285
|
+
}
|
|
286
|
+
this.invocationEndPromise.resolve();
|
|
287
|
+
}
|
|
288
|
+
handleInvocationEndError(e, notify_vm_error = (vm, error$1) => {
|
|
289
|
+
vm.notify_error(error$1.message, error$1.stack);
|
|
290
|
+
}) {
|
|
291
|
+
const error = ensureError(e);
|
|
292
|
+
logError(this.vmLogger, error);
|
|
293
|
+
notify_vm_error(this.coreVm, error);
|
|
294
|
+
this.invocationEndPromise.resolve();
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
function unpackRunParameters(a, b) {
|
|
298
|
+
if (typeof a === "string") {
|
|
299
|
+
if (typeof b !== "function") throw new TypeError("");
|
|
300
|
+
return {
|
|
301
|
+
name: a,
|
|
302
|
+
action: b
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
if (typeof a !== "function") throw new TypeError("unexpected type at the first parameter");
|
|
306
|
+
if (b) throw new TypeError("unexpected a function as a second parameter.");
|
|
307
|
+
return { action: a };
|
|
308
|
+
}
|
|
309
|
+
var DurablePromiseImpl = class {
|
|
310
|
+
serde;
|
|
311
|
+
constructor(ctx, name, serde$1) {
|
|
312
|
+
this.ctx = ctx;
|
|
313
|
+
this.name = name;
|
|
314
|
+
this.serde = serde$1 ?? this.ctx.defaultSerde;
|
|
315
|
+
}
|
|
316
|
+
then(onfulfilled, onrejected) {
|
|
317
|
+
return this.get().then(onfulfilled, onrejected);
|
|
318
|
+
}
|
|
319
|
+
catch(onrejected) {
|
|
320
|
+
return this.get().catch(onrejected);
|
|
321
|
+
}
|
|
322
|
+
finally(onfinally) {
|
|
323
|
+
return this.get().finally(onfinally);
|
|
324
|
+
}
|
|
325
|
+
[Symbol.toStringTag] = "DurablePromise";
|
|
326
|
+
get() {
|
|
327
|
+
return this.ctx.processCompletableEntry(WasmCommandType.GetPromise, () => {}, (vm) => vm.sys_get_promise(this.name), SuccessWithSerde(this.serde, this.ctx.journalValueCodec), Failure);
|
|
328
|
+
}
|
|
329
|
+
peek() {
|
|
330
|
+
return this.ctx.processCompletableEntry(WasmCommandType.PeekPromise, () => {}, (vm) => vm.sys_peek_promise(this.name), VoidAsUndefined, SuccessWithSerde(this.serde, this.ctx.journalValueCodec), Failure);
|
|
331
|
+
}
|
|
332
|
+
resolve(value) {
|
|
333
|
+
return this.ctx.processCompletableEntry(WasmCommandType.CompletePromise, () => this.ctx.journalValueCodec.encode(this.serde.serialize(value)), (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes), VoidAsUndefined, Failure);
|
|
334
|
+
}
|
|
335
|
+
reject(errorMsg) {
|
|
336
|
+
return this.ctx.processCompletableEntry(WasmCommandType.CompletePromise, () => {}, (vm) => vm.sys_complete_promise_failure(this.name, {
|
|
337
|
+
code: INTERNAL_ERROR_CODE,
|
|
338
|
+
message: errorMsg
|
|
339
|
+
}), VoidAsUndefined, Failure);
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
var RunClosuresTracker = class {
|
|
343
|
+
currentRunWaitPoint;
|
|
344
|
+
runsToExecute = /* @__PURE__ */ new Map();
|
|
345
|
+
executeRun(handle) {
|
|
346
|
+
const runClosure = this.runsToExecute.get(handle);
|
|
347
|
+
if (runClosure === void 0) throw new Error(`Handle ${handle} doesn't exist`);
|
|
348
|
+
runClosure().finally(() => {
|
|
349
|
+
this.unblockCurrentRunWaitPoint();
|
|
350
|
+
}).catch(() => {});
|
|
351
|
+
}
|
|
352
|
+
registerRunClosure(handle, runClosure) {
|
|
353
|
+
this.runsToExecute.set(handle, runClosure);
|
|
354
|
+
}
|
|
355
|
+
awaitNextCompletedRun() {
|
|
356
|
+
if (this.currentRunWaitPoint === void 0) this.currentRunWaitPoint = new CompletablePromise();
|
|
357
|
+
return this.currentRunWaitPoint.promise;
|
|
358
|
+
}
|
|
359
|
+
unblockCurrentRunWaitPoint() {
|
|
360
|
+
if (this.currentRunWaitPoint !== void 0) {
|
|
361
|
+
const p = this.currentRunWaitPoint;
|
|
362
|
+
this.currentRunWaitPoint = void 0;
|
|
363
|
+
p.resolve();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
var AsyncCompleterError = class {
|
|
368
|
+
constructor(cause, commandType, commandIndex) {
|
|
369
|
+
this.cause = cause;
|
|
370
|
+
this.commandType = commandType;
|
|
371
|
+
this.commandIndex = commandIndex;
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
function completeCommandPromiseUsing(commandType, commandIndex, ...completers) {
|
|
375
|
+
return async (value, prom) => {
|
|
376
|
+
try {
|
|
377
|
+
for (const completer of completers) if (await completer(value, prom)) return;
|
|
378
|
+
} catch (e) {
|
|
379
|
+
throw new AsyncCompleterError(e, commandType, commandIndex);
|
|
380
|
+
}
|
|
381
|
+
throw new Error(`Unexpected variant in async result: ${JSON.stringify(value)}`);
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
function completeSignalPromiseUsing(...completers) {
|
|
385
|
+
return async (value, prom) => {
|
|
386
|
+
for (const completer of completers) if (await completer(value, prom)) return;
|
|
387
|
+
throw new Error(`Unexpected variant in async result: ${JSON.stringify(value)}`);
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
const VoidAsNull = (value, prom) => {
|
|
391
|
+
if (value === "Empty") {
|
|
392
|
+
prom.resolve(null);
|
|
393
|
+
return Promise.resolve(true);
|
|
394
|
+
}
|
|
395
|
+
return Promise.resolve(false);
|
|
396
|
+
};
|
|
397
|
+
const VoidAsUndefined = (value, prom) => {
|
|
398
|
+
if (value === "Empty") {
|
|
399
|
+
prom.resolve(void 0);
|
|
400
|
+
return Promise.resolve(true);
|
|
401
|
+
}
|
|
402
|
+
return Promise.resolve(false);
|
|
403
|
+
};
|
|
404
|
+
function SuccessWithSerde(serde$1, journalCodec, transform) {
|
|
405
|
+
return async (value, prom) => {
|
|
406
|
+
if (typeof value !== "object" || !("Success" in value)) return false;
|
|
407
|
+
let buffer;
|
|
408
|
+
if (journalCodec !== void 0) buffer = await journalCodec.decode(value.Success);
|
|
409
|
+
else buffer = value.Success;
|
|
410
|
+
let val = serde$1.deserialize(buffer);
|
|
411
|
+
if (transform) val = transform(val);
|
|
412
|
+
prom.resolve(val);
|
|
413
|
+
return true;
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
const Failure = (value, prom) => {
|
|
417
|
+
if (typeof value === "object" && "Failure" in value) {
|
|
418
|
+
prom.reject(new TerminalError(value.Failure.message, { errorCode: value.Failure.code }));
|
|
419
|
+
return Promise.resolve(true);
|
|
420
|
+
}
|
|
421
|
+
return Promise.resolve(false);
|
|
422
|
+
};
|
|
423
|
+
const StateKeys = (value, prom) => {
|
|
424
|
+
if (typeof value === "object" && "StateKeys" in value) {
|
|
425
|
+
prom.resolve(value.StateKeys);
|
|
426
|
+
return Promise.resolve(true);
|
|
427
|
+
}
|
|
428
|
+
return Promise.resolve(false);
|
|
429
|
+
};
|
|
430
|
+
const InvocationIdCompleter = (value, prom) => {
|
|
431
|
+
if (typeof value === "object" && "InvocationId" in value) {
|
|
432
|
+
prom.resolve(value.InvocationId);
|
|
433
|
+
return Promise.resolve(true);
|
|
434
|
+
}
|
|
435
|
+
return Promise.resolve(false);
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
//#endregion
|
|
439
|
+
export { ContextImpl };
|
|
440
|
+
//# sourceMappingURL=context_impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context_impl.js","names":["coreVm: vm.WasmVM","input: vm.WasmInput","console: Console","handlerKind: HandlerKind","vmLogger: Console","invocationRequest: Request","invocationEndPromise: CompletablePromise<void>","journalValueCodec: JournalValueCodec","asTerminalError?: (error: any) => TerminalError | undefined","serde","requestSerde: Serde<REQ>","responseSerde: Serde<RES>","parameter: Uint8Array","handle: number","doRun: () => Promise<any>","res: T","awakeable: vm.WasmAwakeable","value: Uint8Array","castedPromises: InternalRestatePromise<any>[]","error","ctx: ContextImpl","name: string","cause: any","commandType: WasmCommandType","commandIndex: number","VoidAsNull: Completer","VoidAsUndefined: Completer","buffer: Uint8Array","Failure: Completer","StateKeys: Completer","InvocationIdCompleter: Completer"],"sources":["../src/context_impl.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH\n *\n * This file is part of the Restate SDK for Node.js/TypeScript,\n * which is released under the MIT license.\n *\n * You can find a copy of the license in file LICENSE in the root\n * directory of this repository or package, or at\n * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ContextDate,\n DurablePromise,\n GenericCall,\n GenericSend,\n InvocationHandle,\n InvocationId,\n InvocationPromise,\n ObjectContext,\n Rand,\n Request,\n RestatePromise,\n RunAction,\n RunOptions,\n SendOptions,\n WorkflowContext,\n} from \"./context.js\";\nimport type * as vm from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n WasmCommandType,\n WasmHeader,\n} from \"./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js\";\nimport {\n ensureError,\n INTERNAL_ERROR_CODE,\n logError,\n RestateError,\n RetryableError,\n TerminalError,\n UNKNOWN_ERROR_CODE,\n} from \"./types/errors.js\";\nimport type { Client, SendClient } from \"./types/rpc.js\";\nimport {\n HandlerKind,\n makeRpcCallProxy,\n makeRpcSendProxy,\n} from \"./types/rpc.js\";\nimport type {\n Duration,\n JournalValueCodec,\n Serde,\n Service,\n ServiceDefinitionFrom,\n VirtualObject,\n VirtualObjectDefinitionFrom,\n Workflow,\n WorkflowDefinitionFrom,\n} from \"@restatedev/restate-sdk-core\";\nimport { millisOrDurationToMillis, serde } from \"@restatedev/restate-sdk-core\";\nimport { RandImpl } from \"./utils/rand.js\";\nimport type {\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from \"node:stream/web\";\nimport { CompletablePromise } from \"./utils/completable_promise.js\";\nimport type { AsyncResultValue, InternalRestatePromise } from \"./promises.js\";\nimport {\n extractContext,\n InvocationPendingPromise,\n pendingPromise,\n PromisesExecutor,\n RestateCombinatorPromise,\n RestateInvocationPromise,\n RestatePendingPromise,\n RestateSinglePromise,\n} from \"./promises.js\";\nimport { InputPump, OutputPump } from \"./io.js\";\n\nexport class ContextImpl implements ObjectContext, WorkflowContext {\n public readonly rand: Rand;\n\n public readonly date: ContextDate = {\n now: (): Promise<number> => {\n return this.run(() => Date.now());\n },\n\n toJSON: (): Promise<string> => {\n return this.run(() => new Date().toJSON());\n },\n };\n\n private readonly outputPump: OutputPump;\n private readonly runClosuresTracker: RunClosuresTracker;\n readonly promisesExecutor: PromisesExecutor;\n readonly defaultSerde: Serde<any>;\n\n constructor(\n readonly coreVm: vm.WasmVM,\n readonly input: vm.WasmInput,\n public readonly console: Console,\n public readonly handlerKind: HandlerKind,\n private readonly vmLogger: Console,\n private readonly invocationRequest: Request,\n private readonly invocationEndPromise: CompletablePromise<void>,\n inputReader: ReadableStreamDefaultReader<Uint8Array>,\n outputWriter: WritableStreamDefaultWriter<Uint8Array>,\n readonly journalValueCodec: JournalValueCodec,\n defaultSerde?: Serde<any>,\n private readonly asTerminalError?: (error: any) => TerminalError | undefined\n ) {\n this.rand = new RandImpl(input.random_seed, () => {\n // TODO reimplement this check with async context\n // if (coreVm.is_inside_run()) {\n // throw new Error(\n // \"Cannot generate random numbers within a run closure. Use the random object outside the run closure.\"\n // );\n // }\n });\n this.outputPump = new OutputPump(coreVm, outputWriter);\n this.runClosuresTracker = new RunClosuresTracker();\n this.promisesExecutor = new PromisesExecutor(\n coreVm,\n new InputPump(\n coreVm,\n inputReader,\n this.handleInvocationEndError.bind(this)\n ),\n this.outputPump,\n this.runClosuresTracker,\n this.promiseExecutorErrorCallback.bind(this)\n );\n this.defaultSerde = defaultSerde ?? serde.json;\n }\n\n cancel(invocationId: InvocationId): void {\n this.processNonCompletableEntry(\n WasmCommandType.CancelInvocation,\n () => {},\n (vm) => vm.sys_cancel_invocation(invocationId)\n );\n }\n\n attach<T>(invocationId: InvocationId, serde?: Serde<T>): RestatePromise<T> {\n return this.processCompletableEntry(\n WasmCommandType.AttachInvocation,\n () => {},\n (vm) => vm.sys_attach_invocation(invocationId),\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n );\n }\n\n public get key(): string {\n switch (this.handlerKind) {\n case HandlerKind.EXCLUSIVE:\n case HandlerKind.SHARED:\n case HandlerKind.WORKFLOW: {\n return this.input.key;\n }\n default:\n throw new TerminalError(\"this handler type doesn't support key()\");\n }\n }\n\n public request(): Request {\n return this.invocationRequest;\n }\n\n public get<T>(name: string, serde?: Serde<T>): RestatePromise<T | null> {\n return this.processCompletableEntry(\n WasmCommandType.GetState,\n () => {},\n (vm) => vm.sys_get_state(name),\n VoidAsNull,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec)\n );\n }\n\n public stateKeys(): RestatePromise<Array<string>> {\n return this.processCompletableEntry(\n WasmCommandType.GetStateKeys,\n () => {},\n (vm) => vm.sys_get_state_keys(),\n StateKeys\n );\n }\n\n public set<T>(name: string, value: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.SetState,\n () =>\n this.journalValueCodec.encode(\n (serde ?? this.defaultSerde).serialize(value)\n ),\n (vm, bytes) => vm.sys_set_state(name, bytes)\n );\n }\n\n public clear(name: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearState,\n () => {},\n (vm) => vm.sys_clear_state(name)\n );\n }\n\n public clearAll(): void {\n this.processNonCompletableEntry(\n WasmCommandType.ClearAllState,\n () => {},\n (vm) => vm.sys_clear_all_state()\n );\n }\n\n // --- Calls, background calls, etc\n //\n public genericCall<REQ = Uint8Array, RES = Uint8Array>(\n call: GenericCall<REQ, RES>\n ): InvocationPromise<RES> {\n const requestSerde: Serde<REQ> =\n call.inputSerde ?? (serde.binary as Serde<REQ>);\n const responseSerde: Serde<RES> =\n call.outputSerde ?? (serde.binary as Serde<RES>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(call.parameter)\n );\n } catch (e) {\n this.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n WasmCommandType.Call\n )\n );\n return new InvocationPendingPromise(this);\n }\n\n try {\n const call_handles = this.coreVm.sys_call(\n call.service,\n call.method,\n parameter,\n call.key,\n call.headers\n ? Object.entries(call.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n call.idempotencyKey\n );\n const commandIndex = this.coreVm.last_command_index();\n\n const invocationIdPromise = new RestateSinglePromise(\n this,\n call_handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n InvocationIdCompleter\n )\n );\n\n return new RestateInvocationPromise(\n this,\n call_handles.call_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.Call,\n commandIndex,\n SuccessWithSerde(responseSerde, this.journalValueCodec),\n Failure\n ),\n invocationIdPromise as RestatePromise<InvocationId>\n );\n } catch (e) {\n this.handleInvocationEndError(e);\n // We return a pending promise to avoid the caller to see the error.\n return new InvocationPendingPromise(this);\n }\n }\n\n public genericSend<REQ = Uint8Array>(\n send: GenericSend<REQ>\n ): InvocationHandle {\n const requestSerde = send.inputSerde ?? (serde.binary as Serde<REQ>);\n\n let parameter: Uint8Array;\n try {\n parameter = this.journalValueCodec.encode(\n requestSerde.serialize(send.parameter)\n );\n } catch (e) {\n this.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n WasmCommandType.OneWayCall\n )\n );\n return new InvocationPendingPromise(this);\n }\n\n try {\n const delay =\n send.delay !== undefined\n ? millisOrDurationToMillis(send.delay)\n : undefined;\n\n const handles = this.coreVm.sys_send(\n send.service,\n send.method,\n parameter,\n send.key,\n send.headers\n ? Object.entries(send.headers).map(\n ([key, value]) => new WasmHeader(key, value)\n )\n : [],\n delay !== undefined && delay > 0 ? BigInt(delay) : undefined,\n send.idempotencyKey\n );\n const commandIndex = this.coreVm.last_command_index();\n\n return {\n invocationId: new RestateSinglePromise(\n this,\n handles.invocation_id_completion_id,\n completeCommandPromiseUsing(\n WasmCommandType.OneWayCall,\n commandIndex,\n InvocationIdCompleter\n )\n ),\n };\n } catch (e) {\n this.handleInvocationEndError(e);\n return {\n invocationId: pendingPromise(),\n };\n }\n }\n\n serviceClient<D>({ name }: ServiceDefinitionFrom<D>): Client<Service<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n\n name\n );\n }\n\n objectClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string\n ): Client<VirtualObject<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n workflowClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string\n ): Client<Workflow<D>> {\n return makeRpcCallProxy(\n (call) => this.genericCall(call),\n this.defaultSerde,\n name,\n key\n );\n }\n\n public serviceSendClient<D>(\n { name }: ServiceDefinitionFrom<D>,\n opts?: SendOptions\n ): SendClient<Service<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n undefined,\n opts?.delay\n );\n }\n\n public objectSendClient<D>(\n { name }: VirtualObjectDefinitionFrom<D>,\n key: string,\n opts?: SendOptions\n ): SendClient<VirtualObject<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key,\n opts?.delay\n );\n }\n\n workflowSendClient<D>(\n { name }: WorkflowDefinitionFrom<D>,\n key: string,\n opts?: SendOptions\n ): SendClient<Workflow<D>> {\n return makeRpcSendProxy(\n (send) => this.genericSend(send),\n this.defaultSerde,\n name,\n key,\n opts?.delay\n );\n }\n\n // DON'T make this function async!!!\n // The reason is that we want the errors thrown by the initial checks to be propagated in the caller context,\n // and not in the promise context. To understand the semantic difference, make this function async and run the\n // UnawaitedSideEffectShouldFailSubsequentContextCall test.\n public run<T>(\n nameOrAction: string | RunAction<T>,\n actionSecondParameter?: RunAction<T>,\n options?: RunOptions<T>\n ): RestatePromise<T> {\n const { name, action } = unpackRunParameters(\n nameOrAction,\n actionSecondParameter\n );\n const serde = options?.serde ?? this.defaultSerde;\n\n // Prepare the handle\n let handle: number;\n try {\n handle = this.coreVm.sys_run(name ?? \"\");\n } catch (e) {\n this.handleInvocationEndError(e);\n return new RestatePendingPromise(this);\n }\n const commandIndex = this.coreVm.last_command_index();\n\n // Now prepare the run task\n const doRun: () => Promise<any> = async () => {\n // Execute the user code\n const startTime = Date.now();\n let res: T;\n let err;\n try {\n res = await action();\n } catch (e) {\n err = ensureError(e, this.asTerminalError);\n }\n const attemptDuration = Date.now() - startTime;\n\n // Propose the completion to the VM\n try {\n if (err !== undefined) {\n if (err instanceof TerminalError) {\n // Record failure, go ahead\n this.coreVm.propose_run_completion_failure(handle, {\n code: err.code,\n message: err.message,\n });\n } else if (err instanceof RetryableError) {\n const maxRetryDuration =\n options?.maxRetryDuration ?? options?.maxRetryDurationMillis;\n this.coreVm.propose_run_completion_failure_transient_with_delay_override(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n err.retryAfter !== undefined\n ? BigInt(millisOrDurationToMillis(err.retryAfter))\n : undefined,\n options?.maxRetryAttempts,\n maxRetryDuration !== undefined\n ? BigInt(millisOrDurationToMillis(maxRetryDuration))\n : undefined\n );\n } else {\n this.vmLogger.warn(\n `Error when processing ctx.run '${name}'.\\n`,\n err\n );\n\n // Configure the retry policy if any of the parameters are set.\n let retryPolicy;\n if (\n options?.retryIntervalFactor !== undefined ||\n options?.maxRetryAttempts !== undefined ||\n options?.initialRetryInterval !== undefined ||\n options?.initialRetryIntervalMillis !== undefined ||\n options?.maxRetryDuration !== undefined ||\n options?.maxRetryDurationMillis !== undefined ||\n options?.maxRetryInterval !== undefined ||\n options?.maxRetryIntervalMillis !== undefined\n ) {\n const maxRetryDuration =\n options?.maxRetryDuration ?? options?.maxRetryDurationMillis;\n retryPolicy = {\n factor: options?.retryIntervalFactor ?? 2.0,\n initial_interval: millisOrDurationToMillis(\n options?.initialRetryInterval ??\n options?.initialRetryIntervalMillis ??\n 50\n ),\n max_attempts: options?.maxRetryAttempts,\n max_duration:\n maxRetryDuration === undefined\n ? undefined\n : millisOrDurationToMillis(maxRetryDuration),\n max_interval: millisOrDurationToMillis(\n options?.maxRetryInterval ??\n options?.maxRetryIntervalMillis ?? { seconds: 10 }\n ),\n };\n }\n this.coreVm.propose_run_completion_failure_transient(\n handle,\n err.message,\n err.stack,\n BigInt(attemptDuration),\n retryPolicy\n );\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n const serializedRes = serde.serialize(res);\n const encodedRes = this.journalValueCodec.encode(serializedRes);\n this.coreVm.propose_run_completion_success(handle, encodedRes);\n }\n } catch (e) {\n this.handleInvocationEndError(e);\n return pendingPromise<T>();\n }\n await this.outputPump.awaitNextProgress();\n };\n\n // Register the run to execute\n this.runClosuresTracker.registerRunClosure(handle, doRun);\n\n // TODO: here as well\n // Return the promise\n return new RestateSinglePromise(\n this,\n handle,\n completeCommandPromiseUsing(\n WasmCommandType.Run,\n commandIndex,\n SuccessWithSerde(serde, this.journalValueCodec),\n Failure\n )\n );\n }\n\n public sleep(\n duration: number | Duration,\n name?: string\n ): RestatePromise<void> {\n return this.processCompletableEntry(\n WasmCommandType.Sleep,\n () => {\n if (duration === undefined) {\n throw new Error(`Duration is undefined.`);\n }\n const millis = millisOrDurationToMillis(duration);\n if (millis < 0) {\n throw new Error(\n `Invalid negative sleep duration: ${millis}ms.\\nIf this duration is computed from a desired wake up time, make sure to record 'now' using 'wakeUpTime - ctx.date.now()'.`\n );\n }\n return BigInt(millis);\n },\n (vm, millis) => vm.sys_sleep(millis, name),\n VoidAsUndefined\n );\n }\n\n // -- Awakeables\n\n public awakeable<T>(serde?: Serde<T>): {\n id: string;\n promise: RestatePromise<T>;\n } {\n let awakeable: vm.WasmAwakeable;\n try {\n awakeable = this.coreVm.sys_awakeable();\n } catch (e) {\n this.handleInvocationEndError(e);\n return {\n id: \"invalid\",\n promise: new RestatePendingPromise(this),\n };\n }\n\n return {\n id: awakeable.id,\n promise: new RestateSinglePromise(\n this,\n awakeable.handle,\n completeSignalPromiseUsing(\n VoidAsUndefined,\n SuccessWithSerde(serde ?? this.defaultSerde, this.journalValueCodec),\n Failure\n )\n ),\n };\n }\n\n public resolveAwakeable<T>(id: string, payload?: T, serde?: Serde<T>): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {\n // We coerce undefined to null as null can be stringified by JSON.stringify\n let value: Uint8Array;\n\n if (serde) {\n value =\n payload === undefined ? new Uint8Array() : serde.serialize(payload);\n } else {\n value =\n payload !== undefined\n ? this.defaultSerde.serialize(payload)\n : this.defaultSerde.serialize(null);\n }\n return this.journalValueCodec.encode(value);\n },\n (vm, bytes) => vm.sys_complete_awakeable_success(id, bytes)\n );\n }\n\n public rejectAwakeable(id: string, reason: string): void {\n this.processNonCompletableEntry(\n WasmCommandType.CompleteAwakeable,\n () => {},\n (vm) => {\n vm.sys_complete_awakeable_failure(id, {\n code: UNKNOWN_ERROR_CODE,\n message: reason,\n });\n }\n );\n }\n\n public promise<T>(name: string, serde?: Serde<T>): DurablePromise<T> {\n return new DurablePromiseImpl(this, name, serde);\n }\n\n // Used by static methods of RestatePromise\n public static createCombinator<T extends readonly RestatePromise<unknown>[]>(\n combinatorConstructor: (promises: Promise<any>[]) => Promise<any>,\n promises: T\n ): RestatePromise<unknown> {\n // Extract context from first promise\n const self = extractContext(promises[0]);\n if (!self) {\n throw new Error(\"Not a combinable promise\");\n }\n\n // Collect first the promises downcasted to the internal promise type\n const castedPromises: InternalRestatePromise<any>[] = [];\n for (const promise of promises) {\n if (extractContext(promise) !== self) {\n self.handleInvocationEndError(\n new Error(\n \"You're mixing up RestatePromises from different RestateContext. This is not supported.\"\n )\n );\n return new RestatePendingPromise(self);\n }\n castedPromises.push(promise as InternalRestatePromise<any>);\n }\n return new RestateCombinatorPromise(\n self,\n combinatorConstructor,\n castedPromises\n );\n }\n\n // -- Various private methods\n\n private processNonCompletableEntry<T>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, input: T) => void\n ) {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n commandType\n )\n );\n return;\n }\n\n try {\n vmCall(this.coreVm, input);\n } catch (e) {\n this.handleInvocationEndError(e);\n }\n }\n\n processCompletableEntry<T, U>(\n commandType: vm.WasmCommandType,\n prepare: () => T,\n vmCall: (vm: vm.WasmVM, t: T) => number,\n ...completers: Array<Completer>\n ): RestatePromise<U> {\n let input;\n try {\n input = prepare();\n } catch (e) {\n this.handleInvocationEndError(e, (vm, error) =>\n vm.notify_error_for_next_command(\n error.message,\n error.stack,\n commandType\n )\n );\n return new RestatePendingPromise(this);\n }\n\n let handle: number;\n try {\n handle = vmCall(this.coreVm, input);\n } catch (e) {\n this.handleInvocationEndError(e);\n return new RestatePendingPromise(this);\n }\n const commandIndex = this.coreVm.last_command_index();\n return new RestateSinglePromise(\n this,\n handle,\n completeCommandPromiseUsing(commandType, commandIndex, ...completers)\n );\n }\n\n promiseExecutorErrorCallback(e: unknown) {\n if (e instanceof AsyncCompleterError) {\n const cause = ensureError(e.cause);\n logError(this.vmLogger, e.cause);\n // Special handling for this one!\n this.coreVm.notify_error_for_specific_command(\n cause.message,\n cause.stack,\n e.commandType,\n e.commandIndex,\n null\n );\n } else {\n const error = ensureError(e);\n logError(this.vmLogger, error);\n if (!(error instanceof RestateError)) {\n // Notify error\n this.coreVm.notify_error(error.message, error.stack);\n }\n }\n\n // From now on, no progress will be made.\n this.invocationEndPromise.resolve();\n }\n\n handleInvocationEndError(\n e: unknown,\n notify_vm_error: (vm: vm.WasmVM, error: Error) => void = (vm, error) => {\n vm.notify_error(error.message, error.stack);\n }\n ) {\n const error = ensureError(e);\n logError(this.vmLogger, error);\n notify_vm_error(this.coreVm, error);\n\n // From now on, no progress will be made.\n this.invocationEndPromise.resolve();\n }\n}\n\nfunction unpackRunParameters<T>(\n a: string | RunAction<T>,\n b?: RunAction<T>\n): { name?: string; action: RunAction<T> } {\n if (typeof a === \"string\") {\n if (typeof b !== \"function\") {\n throw new TypeError(\"\");\n }\n return { name: a, action: b };\n }\n if (typeof a !== \"function\") {\n throw new TypeError(\"unexpected type at the first parameter\");\n }\n if (b) {\n throw new TypeError(\"unexpected a function as a second parameter.\");\n }\n return { action: a };\n}\n\nclass DurablePromiseImpl<T> implements DurablePromise<T> {\n private readonly serde: Serde<T>;\n\n constructor(\n private readonly ctx: ContextImpl,\n private readonly name: string,\n serde?: Serde<T>\n ) {\n this.serde = serde ?? (this.ctx.defaultSerde as unknown as Serde<T>);\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.get().then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n return this.get().catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.get().finally(onfinally);\n }\n\n [Symbol.toStringTag] = \"DurablePromise\";\n\n get(): RestatePromise<T> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.GetPromise,\n () => {},\n (vm) => vm.sys_get_promise(this.name),\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n peek(): Promise<T | undefined> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.PeekPromise,\n () => {},\n (vm) => vm.sys_peek_promise(this.name),\n VoidAsUndefined,\n SuccessWithSerde(this.serde, this.ctx.journalValueCodec),\n Failure\n );\n }\n\n resolve(value?: T): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => this.ctx.journalValueCodec.encode(this.serde.serialize(value as T)),\n (vm, bytes) => vm.sys_complete_promise_success(this.name, bytes),\n VoidAsUndefined,\n Failure\n );\n }\n\n reject(errorMsg: string): Promise<void> {\n return this.ctx.processCompletableEntry(\n WasmCommandType.CompletePromise,\n () => {},\n (vm) =>\n vm.sys_complete_promise_failure(this.name, {\n code: INTERNAL_ERROR_CODE,\n message: errorMsg,\n }),\n VoidAsUndefined,\n Failure\n );\n }\n}\n\n/// Tracker of run closures to run\nexport class RunClosuresTracker {\n private currentRunWaitPoint?: CompletablePromise<void>;\n private runsToExecute: Map<number, () => Promise<any>> = new Map<\n number,\n () => Promise<any>\n >();\n\n executeRun(handle: number) {\n const runClosure = this.runsToExecute.get(handle);\n if (runClosure === undefined) {\n throw new Error(`Handle ${handle} doesn't exist`);\n }\n runClosure()\n .finally(() => {\n this.unblockCurrentRunWaitPoint();\n })\n .catch(() => {});\n }\n\n registerRunClosure(handle: number, runClosure: () => Promise<any>) {\n this.runsToExecute.set(handle, runClosure);\n }\n\n awaitNextCompletedRun(): Promise<void> {\n if (this.currentRunWaitPoint === undefined) {\n this.currentRunWaitPoint = new CompletablePromise();\n }\n return this.currentRunWaitPoint.promise;\n }\n\n private unblockCurrentRunWaitPoint() {\n if (this.currentRunWaitPoint !== undefined) {\n const p = this.currentRunWaitPoint;\n this.currentRunWaitPoint = undefined;\n p.resolve();\n }\n }\n}\n\n// ---- Functions used to parse async results\n\ntype Completer = (\n value: AsyncResultValue,\n prom: CompletablePromise<any>\n) => Promise<boolean>;\n\n// This is just a special type we use to propagate completer errors between this function and handleInvocationEndError\nclass AsyncCompleterError {\n constructor(\n readonly cause: any,\n readonly commandType: WasmCommandType,\n readonly commandIndex: number\n ) {}\n}\n\nfunction completeCommandPromiseUsing<T>(\n commandType: WasmCommandType,\n commandIndex: number,\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n try {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n } catch (e) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw new AsyncCompleterError(e, commandType, commandIndex);\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\n// This is like the function above, but won't decorate the error with the command metadata\nfunction completeSignalPromiseUsing<T>(\n ...completers: Array<Completer>\n): (value: AsyncResultValue, prom: CompletablePromise<T>) => Promise<void> {\n return async (value: AsyncResultValue, prom: CompletablePromise<any>) => {\n for (const completer of completers) {\n if (await completer(value, prom)) {\n return;\n }\n }\n\n throw new Error(\n `Unexpected variant in async result: ${JSON.stringify(value)}`\n );\n };\n}\n\nconst VoidAsNull: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(null);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\nconst VoidAsUndefined: Completer = (value, prom) => {\n if (value === \"Empty\") {\n prom.resolve(undefined);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nfunction SuccessWithSerde<T>(\n serde: Serde<T>,\n journalCodec?: JournalValueCodec,\n transform?: <U>(success: T) => U\n): Completer {\n return async (value, prom) => {\n if (typeof value !== \"object\" || !(\"Success\" in value)) {\n return false;\n }\n let buffer: Uint8Array;\n if (journalCodec !== undefined) {\n buffer = await journalCodec.decode(value.Success);\n } else {\n buffer = value.Success;\n }\n let val = serde.deserialize(buffer);\n if (transform) {\n val = transform(val);\n }\n prom.resolve(val);\n return true;\n };\n}\n\nconst Failure: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"Failure\" in value) {\n prom.reject(\n new TerminalError(value.Failure.message, {\n errorCode: value.Failure.code,\n })\n );\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst StateKeys: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"StateKeys\" in value) {\n prom.resolve(value.StateKeys);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n\nconst InvocationIdCompleter: Completer = (value, prom) => {\n if (typeof value === \"object\" && \"InvocationId\" in value) {\n prom.resolve(value.InvocationId);\n return Promise.resolve(true);\n }\n return Promise.resolve(false);\n};\n"],"mappings":"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"}
|