rivetkit 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/dist/schemas/actor-persist/v1.ts +21 -24
- package/dist/schemas/client-protocol/v1.ts +6 -0
- package/dist/tsup/actor/errors.cjs +10 -2
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +17 -4
- package/dist/tsup/actor/errors.d.ts +17 -4
- package/dist/tsup/actor/errors.js +11 -3
- package/dist/tsup/{chunk-6PDXBYI5.js → chunk-3F2YSRJL.js} +8 -23
- package/dist/tsup/chunk-3F2YSRJL.js.map +1 -0
- package/dist/tsup/chunk-4CXBCT26.cjs +250 -0
- package/dist/tsup/chunk-4CXBCT26.cjs.map +1 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +20 -0
- package/dist/tsup/chunk-4R73YDN3.cjs.map +1 -0
- package/dist/tsup/{chunk-OGAPU3UG.cjs → chunk-6LJT3QRL.cjs} +39 -25
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +1 -0
- package/dist/tsup/{chunk-6WKQDDUD.cjs → chunk-GICQ3YCU.cjs} +143 -141
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +1 -0
- package/dist/tsup/{chunk-FLMTTN27.js → chunk-H26RP6GD.js} +15 -8
- package/dist/tsup/chunk-H26RP6GD.js.map +1 -0
- package/dist/tsup/chunk-HI3HWJRC.js +20 -0
- package/dist/tsup/chunk-HI3HWJRC.js.map +1 -0
- package/dist/tsup/{chunk-4NSUQZ2H.js → chunk-HLLF4B4Q.js} +116 -114
- package/dist/tsup/chunk-HLLF4B4Q.js.map +1 -0
- package/dist/tsup/{chunk-FCCPJNMA.cjs → chunk-IH6CKNDW.cjs} +12 -27
- package/dist/tsup/chunk-IH6CKNDW.cjs.map +1 -0
- package/dist/tsup/chunk-LV2S3OU3.js +250 -0
- package/dist/tsup/chunk-LV2S3OU3.js.map +1 -0
- package/dist/tsup/{chunk-R2OPSKIV.cjs → chunk-LWNKVZG5.cjs} +20 -13
- package/dist/tsup/chunk-LWNKVZG5.cjs.map +1 -0
- package/dist/tsup/{chunk-INGJP237.js → chunk-NFU2BBT5.js} +102 -43
- package/dist/tsup/chunk-NFU2BBT5.js.map +1 -0
- package/dist/tsup/{chunk-3H7O2A7I.js → chunk-PQY7KKTL.js} +33 -19
- package/dist/tsup/chunk-PQY7KKTL.js.map +1 -0
- package/dist/tsup/{chunk-PO4VLDWA.js → chunk-QK72M5JB.js} +3 -5
- package/dist/tsup/chunk-QK72M5JB.js.map +1 -0
- package/dist/tsup/{chunk-TZJKSBUQ.cjs → chunk-QNNXFOQV.cjs} +3 -5
- package/dist/tsup/chunk-QNNXFOQV.cjs.map +1 -0
- package/dist/tsup/{chunk-GIR3AFFI.cjs → chunk-SBHHJ6QS.cjs} +102 -43
- package/dist/tsup/chunk-SBHHJ6QS.cjs.map +1 -0
- package/dist/tsup/chunk-TQ62L3X7.js +325 -0
- package/dist/tsup/chunk-TQ62L3X7.js.map +1 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs +6293 -0
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +1 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs +325 -0
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +1 -0
- package/dist/tsup/chunk-XJQHKJ4P.js +6293 -0
- package/dist/tsup/chunk-XJQHKJ4P.js.map +1 -0
- package/dist/tsup/client/mod.cjs +10 -10
- package/dist/tsup/client/mod.d.cts +7 -13
- package/dist/tsup/client/mod.d.ts +7 -13
- package/dist/tsup/client/mod.js +9 -9
- package/dist/tsup/common/log.cjs +12 -4
- package/dist/tsup/common/log.cjs.map +1 -1
- package/dist/tsup/common/log.d.cts +23 -17
- package/dist/tsup/common/log.d.ts +23 -17
- package/dist/tsup/common/log.js +15 -7
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -4
- package/dist/tsup/{common-CpqORuCq.d.cts → common-CXCe7s6i.d.cts} +2 -2
- package/dist/tsup/{common-CpqORuCq.d.ts → common-CXCe7s6i.d.ts} +2 -2
- package/dist/tsup/{connection-BwUMoe6n.d.ts → connection-BI-6UIBJ.d.ts} +196 -226
- package/dist/tsup/{connection-BR_Ve4ku.d.cts → connection-Dyd4NLGW.d.cts} +196 -226
- package/dist/tsup/driver-helpers/mod.cjs +6 -9
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +5 -6
- package/dist/tsup/driver-helpers/mod.d.ts +5 -6
- package/dist/tsup/driver-helpers/mod.js +6 -9
- package/dist/tsup/driver-test-suite/mod.cjs +155 -1363
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +11 -5
- package/dist/tsup/driver-test-suite/mod.d.ts +11 -5
- package/dist/tsup/driver-test-suite/mod.js +876 -2084
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -8
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +3 -3
- package/dist/tsup/inspector/mod.d.ts +3 -3
- package/dist/tsup/inspector/mod.js +8 -10
- package/dist/tsup/mod.cjs +9 -15
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +47 -42
- package/dist/tsup/mod.d.ts +47 -42
- package/dist/tsup/mod.js +10 -16
- package/dist/tsup/{router-endpoints-DAbqVFx2.d.ts → router-endpoints-BTe_Rsdn.d.cts} +2 -3
- package/dist/tsup/{router-endpoints-AYkXG8Tl.d.cts → router-endpoints-CBSrKHmo.d.ts} +2 -3
- package/dist/tsup/test/mod.cjs +10 -14
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +4 -5
- package/dist/tsup/test/mod.d.ts +4 -5
- package/dist/tsup/test/mod.js +9 -13
- package/dist/tsup/{utils-CT0cv4jd.d.ts → utils-fwx3o3K9.d.cts} +1 -0
- package/dist/tsup/{utils-CT0cv4jd.d.cts → utils-fwx3o3K9.d.ts} +1 -0
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.d.cts +1 -1
- package/dist/tsup/utils.d.ts +1 -1
- package/dist/tsup/utils.js +2 -2
- package/package.json +4 -4
- package/src/actor/action.ts +1 -5
- package/src/actor/config.ts +27 -295
- package/src/actor/connection.ts +9 -12
- package/src/actor/context.ts +1 -4
- package/src/actor/definition.ts +7 -11
- package/src/actor/errors.ts +97 -35
- package/src/actor/generic-conn-driver.ts +28 -16
- package/src/actor/instance.ts +177 -133
- package/src/actor/log.ts +4 -13
- package/src/actor/mod.ts +0 -5
- package/src/actor/protocol/old.ts +42 -26
- package/src/actor/protocol/serde.ts +1 -1
- package/src/actor/router-endpoints.ts +41 -38
- package/src/actor/router.ts +20 -18
- package/src/actor/unstable-react.ts +1 -1
- package/src/actor/utils.ts +6 -2
- package/src/client/actor-common.ts +1 -1
- package/src/client/actor-conn.ts +152 -91
- package/src/client/actor-handle.ts +85 -25
- package/src/client/actor-query.ts +65 -0
- package/src/client/client.ts +29 -98
- package/src/client/config.ts +44 -0
- package/src/client/errors.ts +1 -0
- package/src/client/log.ts +2 -4
- package/src/client/mod.ts +16 -12
- package/src/client/raw-utils.ts +82 -25
- package/src/client/utils.ts +5 -3
- package/src/common/fake-event-source.ts +10 -9
- package/src/common/inline-websocket-adapter2.ts +39 -30
- package/src/common/log.ts +176 -101
- package/src/common/logfmt.ts +21 -30
- package/src/common/router.ts +12 -19
- package/src/common/utils.ts +27 -13
- package/src/common/websocket.ts +0 -1
- package/src/driver-helpers/mod.ts +1 -1
- package/src/driver-test-suite/log.ts +1 -3
- package/src/driver-test-suite/mod.ts +86 -60
- package/src/driver-test-suite/tests/actor-handle.ts +33 -0
- package/src/driver-test-suite/tests/manager-driver.ts +5 -3
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +227 -226
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +393 -392
- package/src/driver-test-suite/tests/request-access.ts +112 -126
- package/src/driver-test-suite/utils.ts +13 -10
- package/src/drivers/default.ts +7 -4
- package/src/drivers/engine/actor-driver.ts +22 -13
- package/src/drivers/engine/config.ts +2 -10
- package/src/drivers/engine/kv.ts +1 -1
- package/src/drivers/engine/log.ts +1 -3
- package/src/drivers/engine/mod.ts +2 -3
- package/src/drivers/file-system/actor.ts +1 -1
- package/src/drivers/file-system/global-state.ts +33 -20
- package/src/drivers/file-system/log.ts +1 -3
- package/src/drivers/file-system/manager.ts +31 -8
- package/src/inspector/config.ts +9 -4
- package/src/inspector/log.ts +1 -1
- package/src/inspector/manager.ts +2 -2
- package/src/inspector/utils.ts +1 -1
- package/src/manager/driver.ts +10 -2
- package/src/manager/hono-websocket-adapter.ts +21 -12
- package/src/manager/log.ts +2 -4
- package/src/manager/mod.ts +1 -1
- package/src/manager/router.ts +277 -1657
- package/src/manager-api/routes/actors-create.ts +16 -0
- package/src/manager-api/routes/actors-delete.ts +4 -0
- package/src/manager-api/routes/actors-get-by-id.ts +7 -0
- package/src/manager-api/routes/actors-get-or-create-by-id.ts +29 -0
- package/src/manager-api/routes/actors-get.ts +7 -0
- package/src/manager-api/routes/common.ts +18 -0
- package/src/mod.ts +0 -2
- package/src/registry/config.ts +1 -1
- package/src/registry/log.ts +2 -4
- package/src/registry/mod.ts +57 -24
- package/src/registry/run-config.ts +31 -33
- package/src/registry/serve.ts +4 -5
- package/src/remote-manager-driver/actor-http-client.ts +72 -0
- package/src/remote-manager-driver/actor-websocket-client.ts +63 -0
- package/src/remote-manager-driver/api-endpoints.ts +79 -0
- package/src/remote-manager-driver/api-utils.ts +43 -0
- package/src/remote-manager-driver/log.ts +5 -0
- package/src/remote-manager-driver/mod.ts +274 -0
- package/src/{drivers/engine → remote-manager-driver}/ws-proxy.ts +24 -14
- package/src/serde.ts +8 -2
- package/src/test/log.ts +1 -3
- package/src/test/mod.ts +17 -16
- package/dist/tsup/chunk-2CRLFV6Z.cjs +0 -202
- package/dist/tsup/chunk-2CRLFV6Z.cjs.map +0 -1
- package/dist/tsup/chunk-3H7O2A7I.js.map +0 -1
- package/dist/tsup/chunk-42I3OZ3Q.js +0 -15
- package/dist/tsup/chunk-42I3OZ3Q.js.map +0 -1
- package/dist/tsup/chunk-4NSUQZ2H.js.map +0 -1
- package/dist/tsup/chunk-6PDXBYI5.js.map +0 -1
- package/dist/tsup/chunk-6WKQDDUD.cjs.map +0 -1
- package/dist/tsup/chunk-CTBOSFUH.cjs +0 -116
- package/dist/tsup/chunk-CTBOSFUH.cjs.map +0 -1
- package/dist/tsup/chunk-EGVZZFE2.js +0 -2857
- package/dist/tsup/chunk-EGVZZFE2.js.map +0 -1
- package/dist/tsup/chunk-FCCPJNMA.cjs.map +0 -1
- package/dist/tsup/chunk-FLMTTN27.js.map +0 -1
- package/dist/tsup/chunk-GIR3AFFI.cjs.map +0 -1
- package/dist/tsup/chunk-INGJP237.js.map +0 -1
- package/dist/tsup/chunk-KJCJLKRM.js +0 -116
- package/dist/tsup/chunk-KJCJLKRM.js.map +0 -1
- package/dist/tsup/chunk-KUPQZYUQ.cjs +0 -15
- package/dist/tsup/chunk-KUPQZYUQ.cjs.map +0 -1
- package/dist/tsup/chunk-O2MBYIXO.cjs +0 -2857
- package/dist/tsup/chunk-O2MBYIXO.cjs.map +0 -1
- package/dist/tsup/chunk-OGAPU3UG.cjs.map +0 -1
- package/dist/tsup/chunk-OV6AYD4S.js +0 -4406
- package/dist/tsup/chunk-OV6AYD4S.js.map +0 -1
- package/dist/tsup/chunk-PO4VLDWA.js.map +0 -1
- package/dist/tsup/chunk-R2OPSKIV.cjs.map +0 -1
- package/dist/tsup/chunk-TZJKSBUQ.cjs.map +0 -1
- package/dist/tsup/chunk-UBUC5C3G.cjs +0 -189
- package/dist/tsup/chunk-UBUC5C3G.cjs.map +0 -1
- package/dist/tsup/chunk-UIM22YJL.cjs +0 -4406
- package/dist/tsup/chunk-UIM22YJL.cjs.map +0 -1
- package/dist/tsup/chunk-URVFQMYI.cjs +0 -230
- package/dist/tsup/chunk-URVFQMYI.cjs.map +0 -1
- package/dist/tsup/chunk-UVUPOS46.js +0 -230
- package/dist/tsup/chunk-UVUPOS46.js.map +0 -1
- package/dist/tsup/chunk-VRRHBNJC.js +0 -189
- package/dist/tsup/chunk-VRRHBNJC.js.map +0 -1
- package/dist/tsup/chunk-XFSS33EQ.js +0 -202
- package/dist/tsup/chunk-XFSS33EQ.js.map +0 -1
- package/src/client/http-client-driver.ts +0 -326
- package/src/driver-test-suite/test-inline-client-driver.ts +0 -402
- package/src/driver-test-suite/tests/actor-auth.ts +0 -591
- package/src/drivers/engine/api-endpoints.ts +0 -128
- package/src/drivers/engine/api-utils.ts +0 -70
- package/src/drivers/engine/manager-driver.ts +0 -391
- package/src/inline-client-driver/log.ts +0 -7
- package/src/inline-client-driver/mod.ts +0 -385
- package/src/manager/auth.ts +0 -121
- /package/src/{drivers/engine → actor}/keys.test.ts +0 -0
- /package/src/{drivers/engine → actor}/keys.ts +0 -0
|
@@ -1,2857 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class; var _class2; var _class3;
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var _chunkR2OPSKIVcjs = require('./chunk-R2OPSKIV.cjs');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var _chunkTZJKSBUQcjs = require('./chunk-TZJKSBUQ.cjs');
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var _chunkUBUC5C3Gcjs = require('./chunk-UBUC5C3G.cjs');
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
var _chunk6WKQDDUDcjs = require('./chunk-6WKQDDUD.cjs');
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
var _chunkOGAPU3UGcjs = require('./chunk-OGAPU3UG.cjs');
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
var _chunkGIR3AFFIcjs = require('./chunk-GIR3AFFI.cjs');
|
|
53
|
-
|
|
54
|
-
// src/actor/instance.ts
|
|
55
|
-
var _cborx = require('cbor-x'); var cbor = _interopRequireWildcard(_cborx); var cbor3 = _interopRequireWildcard(_cborx); var cbor2 = _interopRequireWildcard(_cborx);
|
|
56
|
-
var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
|
|
57
|
-
var _onchange = require('on-change'); var _onchange2 = _interopRequireDefault(_onchange);
|
|
58
|
-
|
|
59
|
-
// src/inspector/actor.ts
|
|
60
|
-
var _standardvalidator = require('@hono/standard-validator');
|
|
61
|
-
var _fastjsonpatch = require('@rivetkit/fast-json-patch'); var _fastjsonpatch2 = _interopRequireDefault(_fastjsonpatch);
|
|
62
|
-
var _hono = require('hono');
|
|
63
|
-
var _streaming = require('hono/streaming');
|
|
64
|
-
var _nanoevents = require('nanoevents');
|
|
65
|
-
var _v4 = require('zod/v4'); var _v42 = _interopRequireDefault(_v4);
|
|
66
|
-
function createActorInspectorRouter() {
|
|
67
|
-
return new (0, _hono.Hono)().get("/ping", (c) => {
|
|
68
|
-
return c.json({ message: "pong" }, 200);
|
|
69
|
-
}).get("/state", async (c) => {
|
|
70
|
-
if (await c.var.inspector.accessors.isStateEnabled()) {
|
|
71
|
-
return c.json(
|
|
72
|
-
{
|
|
73
|
-
enabled: true,
|
|
74
|
-
state: await c.var.inspector.accessors.getState()
|
|
75
|
-
},
|
|
76
|
-
200
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
return c.json({ enabled: false, state: null }, 200);
|
|
80
|
-
}).patch(
|
|
81
|
-
"/state",
|
|
82
|
-
_standardvalidator.sValidator.call(void 0,
|
|
83
|
-
"json",
|
|
84
|
-
_v42.default.object({ patch: _chunkR2OPSKIVcjs.PatchSchema }).or(_v42.default.object({ replace: _v42.default.any() }))
|
|
85
|
-
),
|
|
86
|
-
async (c) => {
|
|
87
|
-
if (!await c.var.inspector.accessors.isStateEnabled()) {
|
|
88
|
-
return c.json({ enabled: false }, 200);
|
|
89
|
-
}
|
|
90
|
-
const body = c.req.valid("json");
|
|
91
|
-
if ("replace" in body) {
|
|
92
|
-
await c.var.inspector.accessors.setState(body.replace);
|
|
93
|
-
return c.json(
|
|
94
|
-
{
|
|
95
|
-
enabled: true,
|
|
96
|
-
state: await c.var.inspector.accessors.getState()
|
|
97
|
-
},
|
|
98
|
-
200
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
const state = await c.var.inspector.accessors.getState();
|
|
102
|
-
const { newDocument: newState } = _fastjsonpatch2.default.applyPatch(
|
|
103
|
-
state,
|
|
104
|
-
body.patch
|
|
105
|
-
);
|
|
106
|
-
await c.var.inspector.accessors.setState(newState);
|
|
107
|
-
return c.json(
|
|
108
|
-
{ enabled: true, state: await c.var.inspector.accessors.getState() },
|
|
109
|
-
200
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
).get("/state/stream", async (c) => {
|
|
113
|
-
if (!await c.var.inspector.accessors.isStateEnabled()) {
|
|
114
|
-
return c.json({ enabled: false }, 200);
|
|
115
|
-
}
|
|
116
|
-
let id = 0;
|
|
117
|
-
let unsub;
|
|
118
|
-
return _streaming.streamSSE.call(void 0,
|
|
119
|
-
c,
|
|
120
|
-
async (stream) => {
|
|
121
|
-
unsub = c.var.inspector.emitter.on("stateUpdated", async (state) => {
|
|
122
|
-
stream.writeSSE({
|
|
123
|
-
data: JSON.stringify(state) || "",
|
|
124
|
-
event: "state-update",
|
|
125
|
-
id: String(id++)
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
const { promise } = Promise.withResolvers();
|
|
129
|
-
return promise;
|
|
130
|
-
},
|
|
131
|
-
async () => {
|
|
132
|
-
unsub == null ? void 0 : unsub();
|
|
133
|
-
}
|
|
134
|
-
);
|
|
135
|
-
}).get("/connections", async (c) => {
|
|
136
|
-
const connections = await c.var.inspector.accessors.getConnections();
|
|
137
|
-
return c.json({ connections }, 200);
|
|
138
|
-
}).get("/connections/stream", async (c) => {
|
|
139
|
-
let id = 0;
|
|
140
|
-
let unsub;
|
|
141
|
-
return _streaming.streamSSE.call(void 0,
|
|
142
|
-
c,
|
|
143
|
-
async (stream) => {
|
|
144
|
-
unsub = c.var.inspector.emitter.on("connectionUpdated", async () => {
|
|
145
|
-
stream.writeSSE({
|
|
146
|
-
data: JSON.stringify(
|
|
147
|
-
await c.var.inspector.accessors.getConnections()
|
|
148
|
-
),
|
|
149
|
-
event: "connection-update",
|
|
150
|
-
id: String(id++)
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
const { promise } = Promise.withResolvers();
|
|
154
|
-
return promise;
|
|
155
|
-
},
|
|
156
|
-
async () => {
|
|
157
|
-
unsub == null ? void 0 : unsub();
|
|
158
|
-
}
|
|
159
|
-
);
|
|
160
|
-
}).get("/events", async (c) => {
|
|
161
|
-
const events = c.var.inspector.lastRealtimeEvents;
|
|
162
|
-
return c.json({ events }, 200);
|
|
163
|
-
}).post("/events/clear", async (c) => {
|
|
164
|
-
c.var.inspector.lastRealtimeEvents.length = 0;
|
|
165
|
-
return c.json({ message: "Events cleared" }, 200);
|
|
166
|
-
}).get("/events/stream", async (c) => {
|
|
167
|
-
let id = 0;
|
|
168
|
-
let unsub;
|
|
169
|
-
return _streaming.streamSSE.call(void 0,
|
|
170
|
-
c,
|
|
171
|
-
async (stream) => {
|
|
172
|
-
unsub = c.var.inspector.emitter.on("eventFired", () => {
|
|
173
|
-
stream.writeSSE({
|
|
174
|
-
data: JSON.stringify(c.var.inspector.lastRealtimeEvents),
|
|
175
|
-
event: "realtime-event",
|
|
176
|
-
id: String(id++)
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
const { promise } = Promise.withResolvers();
|
|
180
|
-
return promise;
|
|
181
|
-
},
|
|
182
|
-
async () => {
|
|
183
|
-
unsub == null ? void 0 : unsub();
|
|
184
|
-
}
|
|
185
|
-
);
|
|
186
|
-
}).get("/rpcs", async (c) => {
|
|
187
|
-
const rpcs = await c.var.inspector.accessors.getRpcs();
|
|
188
|
-
return c.json({ rpcs }, 200);
|
|
189
|
-
}).get("/db", async (c) => {
|
|
190
|
-
if (!await c.var.inspector.accessors.isDbEnabled()) {
|
|
191
|
-
return c.json({ enabled: false, db: null }, 200);
|
|
192
|
-
}
|
|
193
|
-
const db = await c.var.inspector.accessors.getDb();
|
|
194
|
-
const rows = await db.execute(`PRAGMA table_list`);
|
|
195
|
-
const tables = _chunkR2OPSKIVcjs.TablesSchema.parse(rows).filter(
|
|
196
|
-
(table) => table.schema !== "temp" && !table.name.startsWith("sqlite_")
|
|
197
|
-
);
|
|
198
|
-
const tablesInfo = await Promise.all(
|
|
199
|
-
tables.map((table) => db.execute(`PRAGMA table_info(${table.name})`))
|
|
200
|
-
);
|
|
201
|
-
const columns = tablesInfo.map((def) => _chunkR2OPSKIVcjs.ColumnsSchema.parse(def));
|
|
202
|
-
const foreignKeysList = await Promise.all(
|
|
203
|
-
tables.map(
|
|
204
|
-
(table) => db.execute(`PRAGMA foreign_key_list(${table.name})`)
|
|
205
|
-
)
|
|
206
|
-
);
|
|
207
|
-
const foreignKeys = foreignKeysList.map(
|
|
208
|
-
(def) => _chunkR2OPSKIVcjs.ForeignKeysSchema.parse(def)
|
|
209
|
-
);
|
|
210
|
-
const countInfo = await Promise.all(
|
|
211
|
-
tables.map(
|
|
212
|
-
(table) => db.execute(`SELECT COUNT(*) as count FROM ${table.name}`)
|
|
213
|
-
)
|
|
214
|
-
);
|
|
215
|
-
const counts = countInfo.map((def) => {
|
|
216
|
-
return def[0].count || 0;
|
|
217
|
-
});
|
|
218
|
-
return c.json(
|
|
219
|
-
{
|
|
220
|
-
enabled: true,
|
|
221
|
-
db: tablesInfo.map((_, index) => {
|
|
222
|
-
return {
|
|
223
|
-
table: tables[index],
|
|
224
|
-
columns: columns[index],
|
|
225
|
-
foreignKeys: foreignKeys[index],
|
|
226
|
-
records: counts[index]
|
|
227
|
-
};
|
|
228
|
-
})
|
|
229
|
-
},
|
|
230
|
-
200
|
|
231
|
-
);
|
|
232
|
-
}).post(
|
|
233
|
-
"/db",
|
|
234
|
-
_standardvalidator.sValidator.call(void 0,
|
|
235
|
-
"json",
|
|
236
|
-
_v42.default.object({ query: _v42.default.string(), params: _v42.default.array(_v42.default.any()).optional() })
|
|
237
|
-
),
|
|
238
|
-
async (c) => {
|
|
239
|
-
if (!await c.var.inspector.accessors.isDbEnabled()) {
|
|
240
|
-
return c.json({ enabled: false }, 200);
|
|
241
|
-
}
|
|
242
|
-
const db = await c.var.inspector.accessors.getDb();
|
|
243
|
-
try {
|
|
244
|
-
const result = await db.execute(
|
|
245
|
-
c.req.valid("json").query,
|
|
246
|
-
...c.req.valid("json").params || []
|
|
247
|
-
);
|
|
248
|
-
return c.json({ result }, 200);
|
|
249
|
-
} catch (error) {
|
|
250
|
-
c;
|
|
251
|
-
return c.json({ error: error.message }, 500);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
);
|
|
255
|
-
}
|
|
256
|
-
var ActorInspector = (_class = class {
|
|
257
|
-
|
|
258
|
-
__init() {this.emitter = _nanoevents.createNanoEvents.call(void 0, )}
|
|
259
|
-
#lastRealtimeEvents = [];
|
|
260
|
-
get lastRealtimeEvents() {
|
|
261
|
-
return this.#lastRealtimeEvents;
|
|
262
|
-
}
|
|
263
|
-
constructor(accessors) {;_class.prototype.__init.call(this);
|
|
264
|
-
this.accessors = accessors();
|
|
265
|
-
this.emitter.on("eventFired", (event) => {
|
|
266
|
-
this.#lastRealtimeEvents.push({
|
|
267
|
-
id: crypto.randomUUID(),
|
|
268
|
-
timestamp: Date.now(),
|
|
269
|
-
...event
|
|
270
|
-
});
|
|
271
|
-
if (this.#lastRealtimeEvents.length > 100) {
|
|
272
|
-
this.#lastRealtimeEvents = this.#lastRealtimeEvents.slice(-100);
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
}, _class);
|
|
277
|
-
|
|
278
|
-
// src/actor/context.ts
|
|
279
|
-
var ActorContext = class {
|
|
280
|
-
#actor;
|
|
281
|
-
constructor(actor) {
|
|
282
|
-
this.#actor = actor;
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Get the actor state
|
|
286
|
-
*/
|
|
287
|
-
get state() {
|
|
288
|
-
return this.#actor.state;
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Get the actor variables
|
|
292
|
-
*/
|
|
293
|
-
get vars() {
|
|
294
|
-
return this.#actor.vars;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Broadcasts an event to all connected clients.
|
|
298
|
-
* @param name - The name of the event.
|
|
299
|
-
* @param args - The arguments to send with the event.
|
|
300
|
-
*/
|
|
301
|
-
broadcast(name, ...args) {
|
|
302
|
-
this.#actor._broadcast(name, ...args);
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Gets the logger instance.
|
|
307
|
-
*/
|
|
308
|
-
get log() {
|
|
309
|
-
return this.#actor.log;
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Gets actor ID.
|
|
313
|
-
*/
|
|
314
|
-
get actorId() {
|
|
315
|
-
return this.#actor.id;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Gets the actor name.
|
|
319
|
-
*/
|
|
320
|
-
get name() {
|
|
321
|
-
return this.#actor.name;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Gets the actor key.
|
|
325
|
-
*/
|
|
326
|
-
get key() {
|
|
327
|
-
return this.#actor.key;
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Gets the region.
|
|
331
|
-
*/
|
|
332
|
-
get region() {
|
|
333
|
-
return this.#actor.region;
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Gets the scheduler.
|
|
337
|
-
*/
|
|
338
|
-
get schedule() {
|
|
339
|
-
return this.#actor.schedule;
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Gets the map of connections.
|
|
343
|
-
*/
|
|
344
|
-
get conns() {
|
|
345
|
-
return this.#actor.conns;
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Returns the client for the given registry.
|
|
349
|
-
*/
|
|
350
|
-
client() {
|
|
351
|
-
return this.#actor.inlineClient;
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Gets the database.
|
|
355
|
-
* @experimental
|
|
356
|
-
* @throws {DatabaseNotEnabled} If the database is not enabled.
|
|
357
|
-
*/
|
|
358
|
-
get db() {
|
|
359
|
-
return this.#actor.db;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Forces the state to get saved.
|
|
363
|
-
*
|
|
364
|
-
* @param opts - Options for saving the state.
|
|
365
|
-
*/
|
|
366
|
-
async saveState(opts) {
|
|
367
|
-
return this.#actor.saveState(opts);
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Prevents the actor from sleeping until promise is complete.
|
|
371
|
-
*/
|
|
372
|
-
waitUntil(promise) {
|
|
373
|
-
this.#actor._waitUntil(promise);
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* AbortSignal that fires when the actor is stopping.
|
|
377
|
-
*/
|
|
378
|
-
get abortSignal() {
|
|
379
|
-
return this.#actor.abortSignal;
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* Forces the actor to sleep.
|
|
383
|
-
*
|
|
384
|
-
* Not supported on all drivers.
|
|
385
|
-
*
|
|
386
|
-
* @experimental
|
|
387
|
-
*/
|
|
388
|
-
sleep() {
|
|
389
|
-
this.#actor._sleep();
|
|
390
|
-
}
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
// src/actor/schedule.ts
|
|
394
|
-
var Schedule = class {
|
|
395
|
-
#actor;
|
|
396
|
-
constructor(actor) {
|
|
397
|
-
this.#actor = actor;
|
|
398
|
-
}
|
|
399
|
-
async after(duration, fn, ...args) {
|
|
400
|
-
await this.#actor.scheduleEvent(Date.now() + duration, fn, args);
|
|
401
|
-
}
|
|
402
|
-
async at(timestamp, fn, ...args) {
|
|
403
|
-
await this.#actor.scheduleEvent(timestamp, fn, args);
|
|
404
|
-
}
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
// src/actor/instance.ts
|
|
408
|
-
var ActorInstance = class {
|
|
409
|
-
// Shared actor context for this instance
|
|
410
|
-
|
|
411
|
-
#sleepCalled = false;
|
|
412
|
-
#stopCalled = false;
|
|
413
|
-
get isStopping() {
|
|
414
|
-
return this.#stopCalled || this.#sleepCalled;
|
|
415
|
-
}
|
|
416
|
-
#persistChanged = false;
|
|
417
|
-
#isInOnStateChange = false;
|
|
418
|
-
/**
|
|
419
|
-
* The proxied state that notifies of changes automatically.
|
|
420
|
-
*
|
|
421
|
-
* Any data that should be stored indefinitely should be held within this object.
|
|
422
|
-
*/
|
|
423
|
-
#persist;
|
|
424
|
-
/** Raw state without the proxy wrapper */
|
|
425
|
-
#persistRaw;
|
|
426
|
-
#persistWriteQueue = new (0, _chunkOGAPU3UGcjs.SinglePromiseQueue)();
|
|
427
|
-
#alarmWriteQueue = new (0, _chunkOGAPU3UGcjs.SinglePromiseQueue)();
|
|
428
|
-
#lastSaveTime = 0;
|
|
429
|
-
#pendingSaveTimeout;
|
|
430
|
-
#vars;
|
|
431
|
-
#backgroundPromises = [];
|
|
432
|
-
#abortController = new AbortController();
|
|
433
|
-
#config;
|
|
434
|
-
#connectionDrivers;
|
|
435
|
-
#actorDriver;
|
|
436
|
-
#inlineClient;
|
|
437
|
-
#actorId;
|
|
438
|
-
#name;
|
|
439
|
-
#key;
|
|
440
|
-
#region;
|
|
441
|
-
#ready = false;
|
|
442
|
-
#connections = /* @__PURE__ */ new Map();
|
|
443
|
-
#subscriptionIndex = /* @__PURE__ */ new Map();
|
|
444
|
-
#checkConnLivenessInterval;
|
|
445
|
-
#sleepTimeout;
|
|
446
|
-
// Track active raw requests so sleep logic can account for them
|
|
447
|
-
#activeRawFetchCount = 0;
|
|
448
|
-
#activeRawWebSockets = /* @__PURE__ */ new Set();
|
|
449
|
-
#schedule;
|
|
450
|
-
#db;
|
|
451
|
-
#inspector = new ActorInspector(() => {
|
|
452
|
-
return {
|
|
453
|
-
isDbEnabled: async () => {
|
|
454
|
-
return this.#db !== void 0;
|
|
455
|
-
},
|
|
456
|
-
getDb: async () => {
|
|
457
|
-
return this.db;
|
|
458
|
-
},
|
|
459
|
-
isStateEnabled: async () => {
|
|
460
|
-
return this.stateEnabled;
|
|
461
|
-
},
|
|
462
|
-
getState: async () => {
|
|
463
|
-
this.#validateStateEnabled();
|
|
464
|
-
return this.#persistRaw.state;
|
|
465
|
-
},
|
|
466
|
-
getRpcs: async () => {
|
|
467
|
-
return Object.keys(this.#config.actions);
|
|
468
|
-
},
|
|
469
|
-
getConnections: async () => {
|
|
470
|
-
return Array.from(this.#connections.entries()).map(([id, conn]) => ({
|
|
471
|
-
id,
|
|
472
|
-
stateEnabled: conn._stateEnabled,
|
|
473
|
-
params: conn.params,
|
|
474
|
-
state: conn._stateEnabled ? conn.state : void 0,
|
|
475
|
-
auth: conn.auth
|
|
476
|
-
}));
|
|
477
|
-
},
|
|
478
|
-
setState: async (state) => {
|
|
479
|
-
this.#validateStateEnabled();
|
|
480
|
-
this.#persist.state = { ...state };
|
|
481
|
-
await this.saveState({ immediate: true });
|
|
482
|
-
}
|
|
483
|
-
};
|
|
484
|
-
});
|
|
485
|
-
get id() {
|
|
486
|
-
return this.#actorId;
|
|
487
|
-
}
|
|
488
|
-
get inlineClient() {
|
|
489
|
-
return this.#inlineClient;
|
|
490
|
-
}
|
|
491
|
-
get inspector() {
|
|
492
|
-
return this.#inspector;
|
|
493
|
-
}
|
|
494
|
-
get #sleepingSupported() {
|
|
495
|
-
return this.#actorDriver.sleep !== void 0;
|
|
496
|
-
}
|
|
497
|
-
/**
|
|
498
|
-
* This constructor should never be used directly.
|
|
499
|
-
*
|
|
500
|
-
* Constructed in {@link ActorInstance.start}.
|
|
501
|
-
*
|
|
502
|
-
* @private
|
|
503
|
-
*/
|
|
504
|
-
constructor(config) {
|
|
505
|
-
this.#config = config;
|
|
506
|
-
this.actorContext = new ActorContext(this);
|
|
507
|
-
}
|
|
508
|
-
async start(connectionDrivers, actorDriver, inlineClient, actorId, name, key, region) {
|
|
509
|
-
var _a, _b;
|
|
510
|
-
this.#connectionDrivers = connectionDrivers;
|
|
511
|
-
this.#actorDriver = actorDriver;
|
|
512
|
-
this.#inlineClient = inlineClient;
|
|
513
|
-
this.#actorId = actorId;
|
|
514
|
-
this.#name = name;
|
|
515
|
-
this.#key = key;
|
|
516
|
-
this.#region = region;
|
|
517
|
-
this.#schedule = new Schedule(this);
|
|
518
|
-
await this.#initialize();
|
|
519
|
-
if (this.#varsEnabled) {
|
|
520
|
-
let vars;
|
|
521
|
-
if ("createVars" in this.#config) {
|
|
522
|
-
const dataOrPromise = this.#config.createVars(
|
|
523
|
-
this.actorContext,
|
|
524
|
-
this.#actorDriver.getContext(this.#actorId)
|
|
525
|
-
);
|
|
526
|
-
if (dataOrPromise instanceof Promise) {
|
|
527
|
-
vars = await _chunk6WKQDDUDcjs.deadline.call(void 0,
|
|
528
|
-
dataOrPromise,
|
|
529
|
-
this.#config.options.createVarsTimeout
|
|
530
|
-
);
|
|
531
|
-
} else {
|
|
532
|
-
vars = dataOrPromise;
|
|
533
|
-
}
|
|
534
|
-
} else if ("vars" in this.#config) {
|
|
535
|
-
vars = structuredClone(this.#config.vars);
|
|
536
|
-
} else {
|
|
537
|
-
throw new Error("Could not variables from 'createVars' or 'vars'");
|
|
538
|
-
}
|
|
539
|
-
this.#vars = vars;
|
|
540
|
-
}
|
|
541
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor starting");
|
|
542
|
-
if (this.#config.onStart) {
|
|
543
|
-
const result = this.#config.onStart(this.actorContext);
|
|
544
|
-
if (result instanceof Promise) {
|
|
545
|
-
await result;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
if ("db" in this.#config && this.#config.db) {
|
|
549
|
-
const client = await this.#config.db.createClient({
|
|
550
|
-
getDatabase: () => actorDriver.getDatabase(this.#actorId)
|
|
551
|
-
});
|
|
552
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("database migration starting");
|
|
553
|
-
await ((_b = (_a = this.#config.db).onMigrate) == null ? void 0 : _b.call(_a, client));
|
|
554
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("database migration complete");
|
|
555
|
-
this.#db = client;
|
|
556
|
-
}
|
|
557
|
-
if (this.#persist.scheduledEvents.length > 0) {
|
|
558
|
-
await this.#queueSetAlarm(this.#persist.scheduledEvents[0].timestamp);
|
|
559
|
-
}
|
|
560
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor ready");
|
|
561
|
-
this.#ready = true;
|
|
562
|
-
this.#resetSleepTimer();
|
|
563
|
-
this.#checkConnLivenessInterval = setInterval(
|
|
564
|
-
this.#checkConnectionsLiveness.bind(this),
|
|
565
|
-
this.#config.options.connectionLivenessInterval
|
|
566
|
-
);
|
|
567
|
-
this.#checkConnectionsLiveness();
|
|
568
|
-
}
|
|
569
|
-
async #scheduleEventInner(newEvent) {
|
|
570
|
-
this.actorContext.log.info("scheduling event", newEvent);
|
|
571
|
-
const insertIndex = this.#persist.scheduledEvents.findIndex(
|
|
572
|
-
(x) => x.timestamp > newEvent.timestamp
|
|
573
|
-
);
|
|
574
|
-
if (insertIndex === -1) {
|
|
575
|
-
this.#persist.scheduledEvents.push(newEvent);
|
|
576
|
-
} else {
|
|
577
|
-
this.#persist.scheduledEvents.splice(insertIndex, 0, newEvent);
|
|
578
|
-
}
|
|
579
|
-
if (insertIndex === 0 || this.#persist.scheduledEvents.length === 1) {
|
|
580
|
-
this.actorContext.log.info("setting alarm", {
|
|
581
|
-
timestamp: newEvent.timestamp,
|
|
582
|
-
eventCount: this.#persist.scheduledEvents.length
|
|
583
|
-
});
|
|
584
|
-
await this.#queueSetAlarm(newEvent.timestamp);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
async _onAlarm() {
|
|
588
|
-
const now = Date.now();
|
|
589
|
-
this.actorContext.log.debug("alarm triggered", {
|
|
590
|
-
now,
|
|
591
|
-
events: this.#persist.scheduledEvents.length
|
|
592
|
-
});
|
|
593
|
-
this.#resetSleepTimer();
|
|
594
|
-
const runIndex = this.#persist.scheduledEvents.findIndex(
|
|
595
|
-
(x) => x.timestamp <= now
|
|
596
|
-
);
|
|
597
|
-
if (runIndex === -1) {
|
|
598
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("no events are due yet, time may have broken");
|
|
599
|
-
if (this.#persist.scheduledEvents.length > 0) {
|
|
600
|
-
const nextTs = this.#persist.scheduledEvents[0].timestamp;
|
|
601
|
-
this.actorContext.log.warn(
|
|
602
|
-
"alarm fired early, rescheduling for next event",
|
|
603
|
-
{
|
|
604
|
-
now,
|
|
605
|
-
nextTs,
|
|
606
|
-
delta: nextTs - now
|
|
607
|
-
}
|
|
608
|
-
);
|
|
609
|
-
await this.#queueSetAlarm(nextTs);
|
|
610
|
-
}
|
|
611
|
-
this.actorContext.log.debug("no events to run", { now });
|
|
612
|
-
return;
|
|
613
|
-
}
|
|
614
|
-
const scheduleEvents = this.#persist.scheduledEvents.splice(
|
|
615
|
-
0,
|
|
616
|
-
runIndex + 1
|
|
617
|
-
);
|
|
618
|
-
this.actorContext.log.debug("running events", {
|
|
619
|
-
count: scheduleEvents.length
|
|
620
|
-
});
|
|
621
|
-
if (this.#persist.scheduledEvents.length > 0) {
|
|
622
|
-
const nextTs = this.#persist.scheduledEvents[0].timestamp;
|
|
623
|
-
this.actorContext.log.info("setting next alarm", {
|
|
624
|
-
nextTs,
|
|
625
|
-
remainingEvents: this.#persist.scheduledEvents.length
|
|
626
|
-
});
|
|
627
|
-
await this.#queueSetAlarm(nextTs);
|
|
628
|
-
}
|
|
629
|
-
for (const event of scheduleEvents) {
|
|
630
|
-
try {
|
|
631
|
-
this.actorContext.log.info("running action for event", {
|
|
632
|
-
event: event.eventId,
|
|
633
|
-
timestamp: event.timestamp,
|
|
634
|
-
action: event.kind.generic.actionName
|
|
635
|
-
});
|
|
636
|
-
const fn = this.#config.actions[event.kind.generic.actionName];
|
|
637
|
-
if (!fn)
|
|
638
|
-
throw new Error(
|
|
639
|
-
`Missing action for alarm ${event.kind.generic.actionName}`
|
|
640
|
-
);
|
|
641
|
-
if (typeof fn !== "function")
|
|
642
|
-
throw new Error(
|
|
643
|
-
`Alarm function lookup for ${event.kind.generic.actionName} returned ${typeof fn}`
|
|
644
|
-
);
|
|
645
|
-
try {
|
|
646
|
-
const args = event.kind.generic.args ? cbor.decode(new Uint8Array(event.kind.generic.args)) : [];
|
|
647
|
-
await fn.call(void 0, this.actorContext, ...args);
|
|
648
|
-
} catch (error) {
|
|
649
|
-
this.actorContext.log.error("error while running event", {
|
|
650
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error),
|
|
651
|
-
event: event.eventId,
|
|
652
|
-
timestamp: event.timestamp,
|
|
653
|
-
action: event.kind.generic.actionName
|
|
654
|
-
});
|
|
655
|
-
}
|
|
656
|
-
} catch (error) {
|
|
657
|
-
this.actorContext.log.error("internal error while running event", {
|
|
658
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error),
|
|
659
|
-
...event
|
|
660
|
-
});
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
async scheduleEvent(timestamp, action, args) {
|
|
665
|
-
return this.#scheduleEventInner({
|
|
666
|
-
eventId: crypto.randomUUID(),
|
|
667
|
-
timestamp,
|
|
668
|
-
kind: {
|
|
669
|
-
generic: {
|
|
670
|
-
actionName: action,
|
|
671
|
-
args: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(args))
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
});
|
|
675
|
-
}
|
|
676
|
-
get stateEnabled() {
|
|
677
|
-
return "createState" in this.#config || "state" in this.#config;
|
|
678
|
-
}
|
|
679
|
-
#validateStateEnabled() {
|
|
680
|
-
if (!this.stateEnabled) {
|
|
681
|
-
throw new (0, _chunkGIR3AFFIcjs.StateNotEnabled)();
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
get #connStateEnabled() {
|
|
685
|
-
return "createConnState" in this.#config || "connState" in this.#config;
|
|
686
|
-
}
|
|
687
|
-
get #varsEnabled() {
|
|
688
|
-
return "createVars" in this.#config || "vars" in this.#config;
|
|
689
|
-
}
|
|
690
|
-
#validateVarsEnabled() {
|
|
691
|
-
if (!this.#varsEnabled) {
|
|
692
|
-
throw new (0, _chunkGIR3AFFIcjs.VarsNotEnabled)();
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
/** Promise used to wait for a save to complete. This is required since you cannot await `#saveStateThrottled`. */
|
|
696
|
-
#onPersistSavedPromise;
|
|
697
|
-
/** Throttled save state method. Used to write to KV at a reasonable cadence. */
|
|
698
|
-
#savePersistThrottled() {
|
|
699
|
-
const now = Date.now();
|
|
700
|
-
const timeSinceLastSave = now - this.#lastSaveTime;
|
|
701
|
-
const saveInterval = this.#config.options.stateSaveInterval;
|
|
702
|
-
if (timeSinceLastSave < saveInterval) {
|
|
703
|
-
if (this.#pendingSaveTimeout === void 0) {
|
|
704
|
-
this.#pendingSaveTimeout = setTimeout(() => {
|
|
705
|
-
this.#pendingSaveTimeout = void 0;
|
|
706
|
-
this.#savePersistInner();
|
|
707
|
-
}, saveInterval - timeSinceLastSave);
|
|
708
|
-
}
|
|
709
|
-
} else {
|
|
710
|
-
this.#savePersistInner();
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
/** Saves the state to KV. You probably want to use #saveStateThrottled instead except for a few edge cases. */
|
|
714
|
-
async #savePersistInner() {
|
|
715
|
-
var _a, _b;
|
|
716
|
-
try {
|
|
717
|
-
this.#lastSaveTime = Date.now();
|
|
718
|
-
if (this.#persistChanged) {
|
|
719
|
-
const finished = this.#persistWriteQueue.enqueue(async () => {
|
|
720
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("saving persist");
|
|
721
|
-
this.#persistChanged = false;
|
|
722
|
-
const bareData = this.#convertToBarePersisted(this.#persistRaw);
|
|
723
|
-
await this.#actorDriver.writePersistedData(
|
|
724
|
-
this.#actorId,
|
|
725
|
-
_chunkUBUC5C3Gcjs.PERSISTED_ACTOR_VERSIONED.serializeWithEmbeddedVersion(bareData)
|
|
726
|
-
);
|
|
727
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("persist saved");
|
|
728
|
-
});
|
|
729
|
-
await finished;
|
|
730
|
-
}
|
|
731
|
-
(_a = this.#onPersistSavedPromise) == null ? void 0 : _a.resolve();
|
|
732
|
-
} catch (error) {
|
|
733
|
-
(_b = this.#onPersistSavedPromise) == null ? void 0 : _b.reject(error);
|
|
734
|
-
throw error;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
async #queueSetAlarm(timestamp) {
|
|
738
|
-
await this.#alarmWriteQueue.enqueue(async () => {
|
|
739
|
-
await this.#actorDriver.setAlarm(this, timestamp);
|
|
740
|
-
});
|
|
741
|
-
}
|
|
742
|
-
/**
|
|
743
|
-
* Creates proxy for `#persist` that handles automatically flagging when state needs to be updated.
|
|
744
|
-
*/
|
|
745
|
-
#setPersist(target) {
|
|
746
|
-
this.#persistRaw = target;
|
|
747
|
-
if (target === null || typeof target !== "object") {
|
|
748
|
-
let invalidPath = "";
|
|
749
|
-
if (!_chunkOGAPU3UGcjs.isCborSerializable.call(void 0,
|
|
750
|
-
target,
|
|
751
|
-
(path) => {
|
|
752
|
-
invalidPath = path;
|
|
753
|
-
},
|
|
754
|
-
""
|
|
755
|
-
)) {
|
|
756
|
-
throw new (0, _chunkGIR3AFFIcjs.InvalidStateType)({ path: invalidPath });
|
|
757
|
-
}
|
|
758
|
-
return target;
|
|
759
|
-
}
|
|
760
|
-
if (this.#persist) {
|
|
761
|
-
_onchange2.default.unsubscribe(this.#persist);
|
|
762
|
-
}
|
|
763
|
-
this.#persist = _onchange2.default.call(void 0,
|
|
764
|
-
target,
|
|
765
|
-
// biome-ignore lint/suspicious/noExplicitAny: Don't know types in proxy
|
|
766
|
-
(path, value, _previousValue, _applyData) => {
|
|
767
|
-
if (path !== "state" && !path.startsWith("state.")) {
|
|
768
|
-
return;
|
|
769
|
-
}
|
|
770
|
-
let invalidPath = "";
|
|
771
|
-
if (!_chunkOGAPU3UGcjs.isCborSerializable.call(void 0,
|
|
772
|
-
value,
|
|
773
|
-
(invalidPathPart) => {
|
|
774
|
-
invalidPath = invalidPathPart;
|
|
775
|
-
},
|
|
776
|
-
""
|
|
777
|
-
)) {
|
|
778
|
-
throw new (0, _chunkGIR3AFFIcjs.InvalidStateType)({
|
|
779
|
-
path: path + (invalidPath ? `.${invalidPath}` : "")
|
|
780
|
-
});
|
|
781
|
-
}
|
|
782
|
-
this.#persistChanged = true;
|
|
783
|
-
this.inspector.emitter.emit("stateUpdated", this.#persist.state);
|
|
784
|
-
if (this.#config.onStateChange && this.#ready && !this.#isInOnStateChange) {
|
|
785
|
-
try {
|
|
786
|
-
this.#isInOnStateChange = true;
|
|
787
|
-
this.#config.onStateChange(
|
|
788
|
-
this.actorContext,
|
|
789
|
-
this.#persistRaw.state
|
|
790
|
-
);
|
|
791
|
-
} catch (error) {
|
|
792
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in `_onStateChange`", {
|
|
793
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
794
|
-
});
|
|
795
|
-
} finally {
|
|
796
|
-
this.#isInOnStateChange = false;
|
|
797
|
-
}
|
|
798
|
-
}
|
|
799
|
-
},
|
|
800
|
-
{ ignoreDetached: true }
|
|
801
|
-
);
|
|
802
|
-
}
|
|
803
|
-
async #initialize() {
|
|
804
|
-
const persistDataBuffer = await this.#actorDriver.readPersistedData(
|
|
805
|
-
this.#actorId
|
|
806
|
-
);
|
|
807
|
-
_invariant2.default.call(void 0,
|
|
808
|
-
persistDataBuffer !== void 0,
|
|
809
|
-
"persist data has not been set, it should be set when initialized"
|
|
810
|
-
);
|
|
811
|
-
const bareData = _chunkUBUC5C3Gcjs.PERSISTED_ACTOR_VERSIONED.deserializeWithEmbeddedVersion(
|
|
812
|
-
persistDataBuffer
|
|
813
|
-
);
|
|
814
|
-
const persistData = this.#convertFromBarePersisted(bareData);
|
|
815
|
-
if (persistData.hasInitiated) {
|
|
816
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor restoring", {
|
|
817
|
-
connections: persistData.connections.length
|
|
818
|
-
});
|
|
819
|
-
this.#setPersist(persistData);
|
|
820
|
-
for (const connPersist of this.#persist.connections) {
|
|
821
|
-
const driver = this.__getConnDriver(connPersist.connDriver);
|
|
822
|
-
const conn = new (0, _chunk6WKQDDUDcjs.Conn)(
|
|
823
|
-
this,
|
|
824
|
-
connPersist,
|
|
825
|
-
driver,
|
|
826
|
-
this.#connStateEnabled
|
|
827
|
-
);
|
|
828
|
-
this.#connections.set(conn.id, conn);
|
|
829
|
-
for (const sub of connPersist.subscriptions) {
|
|
830
|
-
this.#addSubscription(sub.eventName, conn, true);
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
} else {
|
|
834
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor creating");
|
|
835
|
-
let stateData;
|
|
836
|
-
if (this.stateEnabled) {
|
|
837
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor state initializing");
|
|
838
|
-
if ("createState" in this.#config) {
|
|
839
|
-
this.#config.createState;
|
|
840
|
-
stateData = await this.#config.createState(
|
|
841
|
-
this.actorContext,
|
|
842
|
-
persistData.input
|
|
843
|
-
);
|
|
844
|
-
} else if ("state" in this.#config) {
|
|
845
|
-
stateData = structuredClone(this.#config.state);
|
|
846
|
-
} else {
|
|
847
|
-
throw new Error("Both 'createState' or 'state' were not defined");
|
|
848
|
-
}
|
|
849
|
-
} else {
|
|
850
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("state not enabled");
|
|
851
|
-
}
|
|
852
|
-
persistData.state = stateData;
|
|
853
|
-
persistData.hasInitiated = true;
|
|
854
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("writing state");
|
|
855
|
-
const bareData2 = this.#convertToBarePersisted(persistData);
|
|
856
|
-
await this.#actorDriver.writePersistedData(
|
|
857
|
-
this.#actorId,
|
|
858
|
-
_chunkUBUC5C3Gcjs.PERSISTED_ACTOR_VERSIONED.serializeWithEmbeddedVersion(bareData2)
|
|
859
|
-
);
|
|
860
|
-
this.#setPersist(persistData);
|
|
861
|
-
if (this.#config.onCreate) {
|
|
862
|
-
await this.#config.onCreate(this.actorContext, persistData.input);
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
__getConnForId(id) {
|
|
867
|
-
return this.#connections.get(id);
|
|
868
|
-
}
|
|
869
|
-
/**
|
|
870
|
-
* Removes a connection and cleans up its resources.
|
|
871
|
-
*/
|
|
872
|
-
__removeConn(conn) {
|
|
873
|
-
if (!conn) {
|
|
874
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("`conn` does not exist");
|
|
875
|
-
return;
|
|
876
|
-
}
|
|
877
|
-
const connIdx = this.#persist.connections.findIndex(
|
|
878
|
-
(c) => c.connId === conn.id
|
|
879
|
-
);
|
|
880
|
-
if (connIdx !== -1) {
|
|
881
|
-
this.#persist.connections.splice(connIdx, 1);
|
|
882
|
-
this.saveState({ immediate: true, allowStoppingState: true });
|
|
883
|
-
} else {
|
|
884
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("could not find persisted connection to remove", {
|
|
885
|
-
connId: conn.id
|
|
886
|
-
});
|
|
887
|
-
}
|
|
888
|
-
this.#connections.delete(conn.id);
|
|
889
|
-
for (const eventName of [...conn.subscriptions.values()]) {
|
|
890
|
-
this.#removeSubscription(eventName, conn, true);
|
|
891
|
-
}
|
|
892
|
-
this.inspector.emitter.emit("connectionUpdated");
|
|
893
|
-
if (this.#config.onDisconnect) {
|
|
894
|
-
try {
|
|
895
|
-
const result = this.#config.onDisconnect(this.actorContext, conn);
|
|
896
|
-
if (result instanceof Promise) {
|
|
897
|
-
result.catch((error) => {
|
|
898
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in `onDisconnect`", {
|
|
899
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
900
|
-
});
|
|
901
|
-
});
|
|
902
|
-
}
|
|
903
|
-
} catch (error) {
|
|
904
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in `onDisconnect`", {
|
|
905
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
906
|
-
});
|
|
907
|
-
}
|
|
908
|
-
}
|
|
909
|
-
this.#resetSleepTimer();
|
|
910
|
-
}
|
|
911
|
-
async prepareConn(params, request) {
|
|
912
|
-
let connState;
|
|
913
|
-
const onBeforeConnectOpts = {
|
|
914
|
-
request
|
|
915
|
-
};
|
|
916
|
-
if (this.#config.onBeforeConnect) {
|
|
917
|
-
await this.#config.onBeforeConnect(
|
|
918
|
-
this.actorContext,
|
|
919
|
-
onBeforeConnectOpts,
|
|
920
|
-
params
|
|
921
|
-
);
|
|
922
|
-
}
|
|
923
|
-
if (this.#connStateEnabled) {
|
|
924
|
-
if ("createConnState" in this.#config) {
|
|
925
|
-
const dataOrPromise = this.#config.createConnState(
|
|
926
|
-
this.actorContext,
|
|
927
|
-
onBeforeConnectOpts,
|
|
928
|
-
params
|
|
929
|
-
);
|
|
930
|
-
if (dataOrPromise instanceof Promise) {
|
|
931
|
-
connState = await _chunk6WKQDDUDcjs.deadline.call(void 0,
|
|
932
|
-
dataOrPromise,
|
|
933
|
-
this.#config.options.createConnStateTimeout
|
|
934
|
-
);
|
|
935
|
-
} else {
|
|
936
|
-
connState = dataOrPromise;
|
|
937
|
-
}
|
|
938
|
-
} else if ("connState" in this.#config) {
|
|
939
|
-
connState = structuredClone(this.#config.connState);
|
|
940
|
-
} else {
|
|
941
|
-
throw new Error(
|
|
942
|
-
"Could not create connection state from 'createConnState' or 'connState'"
|
|
943
|
-
);
|
|
944
|
-
}
|
|
945
|
-
}
|
|
946
|
-
return connState;
|
|
947
|
-
}
|
|
948
|
-
__getConnDriver(driverId) {
|
|
949
|
-
const driver = this.#connectionDrivers[driverId];
|
|
950
|
-
if (!driver) throw new Error(`No connection driver: ${driverId}`);
|
|
951
|
-
return driver;
|
|
952
|
-
}
|
|
953
|
-
/**
|
|
954
|
-
* Called after establishing a connection handshake.
|
|
955
|
-
*/
|
|
956
|
-
async createConn(connectionId, connectionToken, params, state, driverId, driverState, authData) {
|
|
957
|
-
this.#assertReady();
|
|
958
|
-
if (this.#connections.has(connectionId)) {
|
|
959
|
-
throw new Error(`Connection already exists: ${connectionId}`);
|
|
960
|
-
}
|
|
961
|
-
const driver = this.__getConnDriver(driverId);
|
|
962
|
-
const persist = {
|
|
963
|
-
connId: connectionId,
|
|
964
|
-
token: connectionToken,
|
|
965
|
-
connDriver: driverId,
|
|
966
|
-
connDriverState: driverState,
|
|
967
|
-
params,
|
|
968
|
-
state,
|
|
969
|
-
authData,
|
|
970
|
-
lastSeen: Date.now(),
|
|
971
|
-
subscriptions: []
|
|
972
|
-
};
|
|
973
|
-
const conn = new (0, _chunk6WKQDDUDcjs.Conn)(
|
|
974
|
-
this,
|
|
975
|
-
persist,
|
|
976
|
-
driver,
|
|
977
|
-
this.#connStateEnabled
|
|
978
|
-
);
|
|
979
|
-
this.#connections.set(conn.id, conn);
|
|
980
|
-
this.#resetSleepTimer();
|
|
981
|
-
this.#persist.connections.push(persist);
|
|
982
|
-
this.saveState({ immediate: true });
|
|
983
|
-
if (this.#config.onConnect) {
|
|
984
|
-
try {
|
|
985
|
-
const result = this.#config.onConnect(this.actorContext, conn);
|
|
986
|
-
if (result instanceof Promise) {
|
|
987
|
-
_chunk6WKQDDUDcjs.deadline.call(void 0, result, this.#config.options.onConnectTimeout).catch(
|
|
988
|
-
(error) => {
|
|
989
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in `onConnect`, closing socket", {
|
|
990
|
-
error
|
|
991
|
-
});
|
|
992
|
-
conn == null ? void 0 : conn.disconnect("`onConnect` failed");
|
|
993
|
-
}
|
|
994
|
-
);
|
|
995
|
-
}
|
|
996
|
-
} catch (error) {
|
|
997
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in `onConnect`", {
|
|
998
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
999
|
-
});
|
|
1000
|
-
conn == null ? void 0 : conn.disconnect("`onConnect` failed");
|
|
1001
|
-
}
|
|
1002
|
-
}
|
|
1003
|
-
this.inspector.emitter.emit("connectionUpdated");
|
|
1004
|
-
conn._sendMessage(
|
|
1005
|
-
new (0, _chunk6WKQDDUDcjs.CachedSerializer)(
|
|
1006
|
-
{
|
|
1007
|
-
body: {
|
|
1008
|
-
tag: "Init",
|
|
1009
|
-
val: {
|
|
1010
|
-
actorId: this.id,
|
|
1011
|
-
connectionId: conn.id,
|
|
1012
|
-
connectionToken: conn._token
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
|
-
},
|
|
1016
|
-
_chunk6WKQDDUDcjs.TO_CLIENT_VERSIONED
|
|
1017
|
-
)
|
|
1018
|
-
);
|
|
1019
|
-
return conn;
|
|
1020
|
-
}
|
|
1021
|
-
// MARK: Messages
|
|
1022
|
-
async processMessage(message, conn) {
|
|
1023
|
-
await _chunk6WKQDDUDcjs.processMessage.call(void 0, message, this, conn, {
|
|
1024
|
-
onExecuteAction: async (ctx, name, args) => {
|
|
1025
|
-
this.inspector.emitter.emit("eventFired", {
|
|
1026
|
-
type: "action",
|
|
1027
|
-
name,
|
|
1028
|
-
args,
|
|
1029
|
-
connId: conn.id
|
|
1030
|
-
});
|
|
1031
|
-
return await this.executeAction(ctx, name, args);
|
|
1032
|
-
},
|
|
1033
|
-
onSubscribe: async (eventName, conn2) => {
|
|
1034
|
-
this.inspector.emitter.emit("eventFired", {
|
|
1035
|
-
type: "subscribe",
|
|
1036
|
-
eventName,
|
|
1037
|
-
connId: conn2.id
|
|
1038
|
-
});
|
|
1039
|
-
this.#addSubscription(eventName, conn2, false);
|
|
1040
|
-
},
|
|
1041
|
-
onUnsubscribe: async (eventName, conn2) => {
|
|
1042
|
-
this.inspector.emitter.emit("eventFired", {
|
|
1043
|
-
type: "unsubscribe",
|
|
1044
|
-
eventName,
|
|
1045
|
-
connId: conn2.id
|
|
1046
|
-
});
|
|
1047
|
-
this.#removeSubscription(eventName, conn2, false);
|
|
1048
|
-
}
|
|
1049
|
-
});
|
|
1050
|
-
}
|
|
1051
|
-
// MARK: Events
|
|
1052
|
-
#addSubscription(eventName, connection, fromPersist) {
|
|
1053
|
-
if (connection.subscriptions.has(eventName)) {
|
|
1054
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("connection already has subscription", { eventName });
|
|
1055
|
-
return;
|
|
1056
|
-
}
|
|
1057
|
-
if (!fromPersist) {
|
|
1058
|
-
connection.__persist.subscriptions.push({ eventName });
|
|
1059
|
-
this.saveState({ immediate: true });
|
|
1060
|
-
}
|
|
1061
|
-
connection.subscriptions.add(eventName);
|
|
1062
|
-
let subscribers = this.#subscriptionIndex.get(eventName);
|
|
1063
|
-
if (!subscribers) {
|
|
1064
|
-
subscribers = /* @__PURE__ */ new Set();
|
|
1065
|
-
this.#subscriptionIndex.set(eventName, subscribers);
|
|
1066
|
-
}
|
|
1067
|
-
subscribers.add(connection);
|
|
1068
|
-
}
|
|
1069
|
-
#removeSubscription(eventName, connection, fromRemoveConn) {
|
|
1070
|
-
if (!connection.subscriptions.has(eventName)) {
|
|
1071
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("connection does not have subscription", { eventName });
|
|
1072
|
-
return;
|
|
1073
|
-
}
|
|
1074
|
-
if (!fromRemoveConn) {
|
|
1075
|
-
connection.subscriptions.delete(eventName);
|
|
1076
|
-
const subIdx = connection.__persist.subscriptions.findIndex(
|
|
1077
|
-
(s) => s.eventName === eventName
|
|
1078
|
-
);
|
|
1079
|
-
if (subIdx !== -1) {
|
|
1080
|
-
connection.__persist.subscriptions.splice(subIdx, 1);
|
|
1081
|
-
} else {
|
|
1082
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("subscription does not exist with name", { eventName });
|
|
1083
|
-
}
|
|
1084
|
-
this.saveState({ immediate: true });
|
|
1085
|
-
}
|
|
1086
|
-
const subscribers = this.#subscriptionIndex.get(eventName);
|
|
1087
|
-
if (subscribers) {
|
|
1088
|
-
subscribers.delete(connection);
|
|
1089
|
-
if (subscribers.size === 0) {
|
|
1090
|
-
this.#subscriptionIndex.delete(eventName);
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
}
|
|
1094
|
-
#assertReady(allowStoppingState = false) {
|
|
1095
|
-
if (!this.#ready) throw new (0, _chunkGIR3AFFIcjs.InternalError)("Actor not ready");
|
|
1096
|
-
if (!allowStoppingState && this.#sleepCalled)
|
|
1097
|
-
throw new (0, _chunkGIR3AFFIcjs.InternalError)("Actor is going to sleep");
|
|
1098
|
-
if (!allowStoppingState && this.#stopCalled)
|
|
1099
|
-
throw new (0, _chunkGIR3AFFIcjs.InternalError)("Actor is stopping");
|
|
1100
|
-
}
|
|
1101
|
-
/**
|
|
1102
|
-
* Check the liveness of all connections.
|
|
1103
|
-
* Sets up a recurring check based on the configured interval.
|
|
1104
|
-
*/
|
|
1105
|
-
#checkConnectionsLiveness() {
|
|
1106
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("checking connections liveness");
|
|
1107
|
-
for (const conn of this.#connections.values()) {
|
|
1108
|
-
const liveness = conn[_chunk6WKQDDUDcjs.CONNECTION_CHECK_LIVENESS_SYMBOL]();
|
|
1109
|
-
if (liveness.status === "connected") {
|
|
1110
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("connection is alive", { connId: conn.id });
|
|
1111
|
-
} else {
|
|
1112
|
-
const lastSeen = liveness.lastSeen;
|
|
1113
|
-
const sinceLastSeen = Date.now() - lastSeen;
|
|
1114
|
-
if (sinceLastSeen < this.#config.options.connectionLivenessTimeout) {
|
|
1115
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("connection might be alive, will check later", {
|
|
1116
|
-
connId: conn.id,
|
|
1117
|
-
lastSeen,
|
|
1118
|
-
sinceLastSeen
|
|
1119
|
-
});
|
|
1120
|
-
continue;
|
|
1121
|
-
}
|
|
1122
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("connection is dead, removing", {
|
|
1123
|
-
connId: conn.id,
|
|
1124
|
-
lastSeen
|
|
1125
|
-
});
|
|
1126
|
-
this.__removeConn(conn);
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
}
|
|
1130
|
-
/**
|
|
1131
|
-
* Check if the actor is ready to handle requests.
|
|
1132
|
-
*/
|
|
1133
|
-
isReady() {
|
|
1134
|
-
return this.#ready;
|
|
1135
|
-
}
|
|
1136
|
-
/**
|
|
1137
|
-
* Execute an action call from a client.
|
|
1138
|
-
*
|
|
1139
|
-
* This method handles:
|
|
1140
|
-
* 1. Validating the action name
|
|
1141
|
-
* 2. Executing the action function
|
|
1142
|
-
* 3. Processing the result through onBeforeActionResponse (if configured)
|
|
1143
|
-
* 4. Handling timeouts and errors
|
|
1144
|
-
* 5. Saving state changes
|
|
1145
|
-
*
|
|
1146
|
-
* @param ctx The action context
|
|
1147
|
-
* @param actionName The name of the action being called
|
|
1148
|
-
* @param args The arguments passed to the action
|
|
1149
|
-
* @returns The result of the action call
|
|
1150
|
-
* @throws {ActionNotFound} If the action doesn't exist
|
|
1151
|
-
* @throws {ActionTimedOut} If the action times out
|
|
1152
|
-
* @internal
|
|
1153
|
-
*/
|
|
1154
|
-
async executeAction(ctx, actionName, args) {
|
|
1155
|
-
_invariant2.default.call(void 0, this.#ready, "executing action before ready");
|
|
1156
|
-
if (!(actionName in this.#config.actions)) {
|
|
1157
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("action does not exist", { actionName });
|
|
1158
|
-
throw new (0, _chunkGIR3AFFIcjs.ActionNotFound)(actionName);
|
|
1159
|
-
}
|
|
1160
|
-
const actionFunction = this.#config.actions[actionName];
|
|
1161
|
-
if (typeof actionFunction !== "function") {
|
|
1162
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("action is not a function", {
|
|
1163
|
-
actionName,
|
|
1164
|
-
type: typeof actionFunction
|
|
1165
|
-
});
|
|
1166
|
-
throw new (0, _chunkGIR3AFFIcjs.ActionNotFound)(actionName);
|
|
1167
|
-
}
|
|
1168
|
-
try {
|
|
1169
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("executing action", { actionName, args });
|
|
1170
|
-
const outputOrPromise = actionFunction.call(void 0, ctx, ...args);
|
|
1171
|
-
let output;
|
|
1172
|
-
if (outputOrPromise instanceof Promise) {
|
|
1173
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("awaiting async action", { actionName });
|
|
1174
|
-
output = await _chunk6WKQDDUDcjs.deadline.call(void 0,
|
|
1175
|
-
outputOrPromise,
|
|
1176
|
-
this.#config.options.actionTimeout
|
|
1177
|
-
);
|
|
1178
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("async action completed", { actionName });
|
|
1179
|
-
} else {
|
|
1180
|
-
output = outputOrPromise;
|
|
1181
|
-
}
|
|
1182
|
-
if (this.#config.onBeforeActionResponse) {
|
|
1183
|
-
try {
|
|
1184
|
-
const processedOutput = this.#config.onBeforeActionResponse(
|
|
1185
|
-
this.actorContext,
|
|
1186
|
-
actionName,
|
|
1187
|
-
args,
|
|
1188
|
-
output
|
|
1189
|
-
);
|
|
1190
|
-
if (processedOutput instanceof Promise) {
|
|
1191
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("awaiting onBeforeActionResponse", {
|
|
1192
|
-
actionName
|
|
1193
|
-
});
|
|
1194
|
-
output = await processedOutput;
|
|
1195
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("onBeforeActionResponse completed", {
|
|
1196
|
-
actionName
|
|
1197
|
-
});
|
|
1198
|
-
} else {
|
|
1199
|
-
output = processedOutput;
|
|
1200
|
-
}
|
|
1201
|
-
} catch (error) {
|
|
1202
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in `onBeforeActionResponse`", {
|
|
1203
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1204
|
-
});
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("action completed", {
|
|
1208
|
-
actionName,
|
|
1209
|
-
outputType: typeof output,
|
|
1210
|
-
isPromise: output instanceof Promise
|
|
1211
|
-
});
|
|
1212
|
-
return output;
|
|
1213
|
-
} catch (error) {
|
|
1214
|
-
if (error instanceof _chunk6WKQDDUDcjs.DeadlineError) {
|
|
1215
|
-
throw new (0, _chunkGIR3AFFIcjs.ActionTimedOut)();
|
|
1216
|
-
}
|
|
1217
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("action error", {
|
|
1218
|
-
actionName,
|
|
1219
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1220
|
-
});
|
|
1221
|
-
throw error;
|
|
1222
|
-
} finally {
|
|
1223
|
-
this.#savePersistThrottled();
|
|
1224
|
-
}
|
|
1225
|
-
}
|
|
1226
|
-
/**
|
|
1227
|
-
* Returns a list of action methods available on this actor.
|
|
1228
|
-
*/
|
|
1229
|
-
get actions() {
|
|
1230
|
-
return Object.keys(this.#config.actions);
|
|
1231
|
-
}
|
|
1232
|
-
/**
|
|
1233
|
-
* Handles raw HTTP requests to the actor.
|
|
1234
|
-
*/
|
|
1235
|
-
async handleFetch(request, opts) {
|
|
1236
|
-
this.#assertReady();
|
|
1237
|
-
if (!this.#config.onFetch) {
|
|
1238
|
-
throw new (0, _chunkGIR3AFFIcjs.FetchHandlerNotDefined)();
|
|
1239
|
-
}
|
|
1240
|
-
this.#activeRawFetchCount++;
|
|
1241
|
-
this.#resetSleepTimer();
|
|
1242
|
-
try {
|
|
1243
|
-
const response = await this.#config.onFetch(
|
|
1244
|
-
this.actorContext,
|
|
1245
|
-
request,
|
|
1246
|
-
opts
|
|
1247
|
-
);
|
|
1248
|
-
if (!response) {
|
|
1249
|
-
throw new (0, _chunkGIR3AFFIcjs.InvalidFetchResponse)();
|
|
1250
|
-
}
|
|
1251
|
-
return response;
|
|
1252
|
-
} catch (error) {
|
|
1253
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("onFetch error", {
|
|
1254
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1255
|
-
});
|
|
1256
|
-
throw error;
|
|
1257
|
-
} finally {
|
|
1258
|
-
this.#activeRawFetchCount = Math.max(0, this.#activeRawFetchCount - 1);
|
|
1259
|
-
this.#resetSleepTimer();
|
|
1260
|
-
this.#savePersistThrottled();
|
|
1261
|
-
}
|
|
1262
|
-
}
|
|
1263
|
-
/**
|
|
1264
|
-
* Handles raw WebSocket connections to the actor.
|
|
1265
|
-
*/
|
|
1266
|
-
async handleWebSocket(websocket, opts) {
|
|
1267
|
-
this.#assertReady();
|
|
1268
|
-
if (!this.#config.onWebSocket) {
|
|
1269
|
-
throw new (0, _chunkGIR3AFFIcjs.InternalError)("onWebSocket handler not defined");
|
|
1270
|
-
}
|
|
1271
|
-
try {
|
|
1272
|
-
const stateBeforeHandler = this.#persistChanged;
|
|
1273
|
-
this.#activeRawWebSockets.add(websocket);
|
|
1274
|
-
this.#resetSleepTimer();
|
|
1275
|
-
const onSocketClosed = () => {
|
|
1276
|
-
try {
|
|
1277
|
-
websocket.removeEventListener("close", onSocketClosed);
|
|
1278
|
-
websocket.removeEventListener("error", onSocketClosed);
|
|
1279
|
-
} catch (e) {
|
|
1280
|
-
}
|
|
1281
|
-
this.#activeRawWebSockets.delete(websocket);
|
|
1282
|
-
this.#resetSleepTimer();
|
|
1283
|
-
};
|
|
1284
|
-
try {
|
|
1285
|
-
websocket.addEventListener("close", onSocketClosed);
|
|
1286
|
-
websocket.addEventListener("error", onSocketClosed);
|
|
1287
|
-
} catch (e2) {
|
|
1288
|
-
}
|
|
1289
|
-
await this.#config.onWebSocket(this.actorContext, websocket, opts);
|
|
1290
|
-
if (this.#persistChanged && !stateBeforeHandler) {
|
|
1291
|
-
await this.saveState({ immediate: true });
|
|
1292
|
-
}
|
|
1293
|
-
} catch (error) {
|
|
1294
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("onWebSocket error", {
|
|
1295
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1296
|
-
});
|
|
1297
|
-
throw error;
|
|
1298
|
-
} finally {
|
|
1299
|
-
this.#savePersistThrottled();
|
|
1300
|
-
}
|
|
1301
|
-
}
|
|
1302
|
-
// MARK: Lifecycle hooks
|
|
1303
|
-
// MARK: Exposed methods
|
|
1304
|
-
/**
|
|
1305
|
-
* Gets the logger instance.
|
|
1306
|
-
*/
|
|
1307
|
-
get log() {
|
|
1308
|
-
return _chunk6WKQDDUDcjs.instanceLogger.call(void 0, );
|
|
1309
|
-
}
|
|
1310
|
-
/**
|
|
1311
|
-
* Gets the name.
|
|
1312
|
-
*/
|
|
1313
|
-
get name() {
|
|
1314
|
-
return this.#name;
|
|
1315
|
-
}
|
|
1316
|
-
/**
|
|
1317
|
-
* Gets the key.
|
|
1318
|
-
*/
|
|
1319
|
-
get key() {
|
|
1320
|
-
return this.#key;
|
|
1321
|
-
}
|
|
1322
|
-
/**
|
|
1323
|
-
* Gets the region.
|
|
1324
|
-
*/
|
|
1325
|
-
get region() {
|
|
1326
|
-
return this.#region;
|
|
1327
|
-
}
|
|
1328
|
-
/**
|
|
1329
|
-
* Gets the scheduler.
|
|
1330
|
-
*/
|
|
1331
|
-
get schedule() {
|
|
1332
|
-
return this.#schedule;
|
|
1333
|
-
}
|
|
1334
|
-
/**
|
|
1335
|
-
* Gets the map of connections.
|
|
1336
|
-
*/
|
|
1337
|
-
get conns() {
|
|
1338
|
-
return this.#connections;
|
|
1339
|
-
}
|
|
1340
|
-
/**
|
|
1341
|
-
* Gets the current state.
|
|
1342
|
-
*
|
|
1343
|
-
* Changing properties of this value will automatically be persisted.
|
|
1344
|
-
*/
|
|
1345
|
-
get state() {
|
|
1346
|
-
this.#validateStateEnabled();
|
|
1347
|
-
return this.#persist.state;
|
|
1348
|
-
}
|
|
1349
|
-
/**
|
|
1350
|
-
* Gets the database.
|
|
1351
|
-
* @experimental
|
|
1352
|
-
* @throws {DatabaseNotEnabled} If the database is not enabled.
|
|
1353
|
-
*/
|
|
1354
|
-
get db() {
|
|
1355
|
-
if (!this.#db) {
|
|
1356
|
-
throw new (0, _chunkGIR3AFFIcjs.DatabaseNotEnabled)();
|
|
1357
|
-
}
|
|
1358
|
-
return this.#db;
|
|
1359
|
-
}
|
|
1360
|
-
/**
|
|
1361
|
-
* Sets the current state.
|
|
1362
|
-
*
|
|
1363
|
-
* This property will automatically be persisted.
|
|
1364
|
-
*/
|
|
1365
|
-
set state(value) {
|
|
1366
|
-
this.#validateStateEnabled();
|
|
1367
|
-
this.#persist.state = value;
|
|
1368
|
-
}
|
|
1369
|
-
get vars() {
|
|
1370
|
-
this.#validateVarsEnabled();
|
|
1371
|
-
_invariant2.default.call(void 0, this.#vars !== void 0, "vars not enabled");
|
|
1372
|
-
return this.#vars;
|
|
1373
|
-
}
|
|
1374
|
-
/**
|
|
1375
|
-
* Broadcasts an event to all connected clients.
|
|
1376
|
-
* @param name - The name of the event.
|
|
1377
|
-
* @param args - The arguments to send with the event.
|
|
1378
|
-
*/
|
|
1379
|
-
_broadcast(name, ...args) {
|
|
1380
|
-
this.#assertReady();
|
|
1381
|
-
this.inspector.emitter.emit("eventFired", {
|
|
1382
|
-
type: "broadcast",
|
|
1383
|
-
eventName: name,
|
|
1384
|
-
args
|
|
1385
|
-
});
|
|
1386
|
-
const subscriptions = this.#subscriptionIndex.get(name);
|
|
1387
|
-
if (!subscriptions) return;
|
|
1388
|
-
const toClientSerializer = new (0, _chunk6WKQDDUDcjs.CachedSerializer)(
|
|
1389
|
-
{
|
|
1390
|
-
body: {
|
|
1391
|
-
tag: "Event",
|
|
1392
|
-
val: {
|
|
1393
|
-
name,
|
|
1394
|
-
args: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(args))
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
},
|
|
1398
|
-
_chunk6WKQDDUDcjs.TO_CLIENT_VERSIONED
|
|
1399
|
-
);
|
|
1400
|
-
for (const connection of subscriptions) {
|
|
1401
|
-
connection._sendMessage(toClientSerializer);
|
|
1402
|
-
}
|
|
1403
|
-
}
|
|
1404
|
-
/**
|
|
1405
|
-
* Prevents the actor from sleeping until promise is complete.
|
|
1406
|
-
*
|
|
1407
|
-
* This allows the actor runtime to ensure that a promise completes while
|
|
1408
|
-
* returning from an action request early.
|
|
1409
|
-
*
|
|
1410
|
-
* @param promise - The promise to run in the background.
|
|
1411
|
-
*/
|
|
1412
|
-
_waitUntil(promise) {
|
|
1413
|
-
this.#assertReady();
|
|
1414
|
-
const nonfailablePromise = promise.then(() => {
|
|
1415
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("wait until promise complete");
|
|
1416
|
-
}).catch((error) => {
|
|
1417
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("wait until promise failed", {
|
|
1418
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1419
|
-
});
|
|
1420
|
-
});
|
|
1421
|
-
this.#backgroundPromises.push(nonfailablePromise);
|
|
1422
|
-
}
|
|
1423
|
-
/**
|
|
1424
|
-
* Forces the state to get saved.
|
|
1425
|
-
*
|
|
1426
|
-
* This is helpful if running a long task that may fail later or when
|
|
1427
|
-
* running a background job that updates the state.
|
|
1428
|
-
*
|
|
1429
|
-
* @param opts - Options for saving the state.
|
|
1430
|
-
*/
|
|
1431
|
-
async saveState(opts) {
|
|
1432
|
-
this.#assertReady(opts.allowStoppingState);
|
|
1433
|
-
if (this.#persistChanged) {
|
|
1434
|
-
if (opts.immediate) {
|
|
1435
|
-
await this.#savePersistInner();
|
|
1436
|
-
} else {
|
|
1437
|
-
if (!this.#onPersistSavedPromise) {
|
|
1438
|
-
this.#onPersistSavedPromise = Promise.withResolvers();
|
|
1439
|
-
}
|
|
1440
|
-
this.#savePersistThrottled();
|
|
1441
|
-
await this.#onPersistSavedPromise.promise;
|
|
1442
|
-
}
|
|
1443
|
-
}
|
|
1444
|
-
}
|
|
1445
|
-
// MARK: Sleep
|
|
1446
|
-
/**
|
|
1447
|
-
* Reset timer from the last actor interaction that allows it to be put to sleep.
|
|
1448
|
-
*
|
|
1449
|
-
* This should be called any time a sleep-related event happens:
|
|
1450
|
-
* - Connection opens (will clear timer)
|
|
1451
|
-
* - Connection closes (will schedule timer if there are no open connections)
|
|
1452
|
-
* - Alarm triggers (will reset timer)
|
|
1453
|
-
*
|
|
1454
|
-
* We don't need to call this on events like individual action calls, since there will always be a connection open for these.
|
|
1455
|
-
**/
|
|
1456
|
-
#resetSleepTimer() {
|
|
1457
|
-
if (this.#config.options.noSleep || !this.#sleepingSupported) return;
|
|
1458
|
-
const canSleep = this.#canSleep();
|
|
1459
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("resetting sleep timer", {
|
|
1460
|
-
canSleep,
|
|
1461
|
-
existingTimeout: !!this.#sleepTimeout
|
|
1462
|
-
});
|
|
1463
|
-
if (this.#sleepTimeout) {
|
|
1464
|
-
clearTimeout(this.#sleepTimeout);
|
|
1465
|
-
this.#sleepTimeout = void 0;
|
|
1466
|
-
}
|
|
1467
|
-
if (this.#sleepCalled) return;
|
|
1468
|
-
if (canSleep) {
|
|
1469
|
-
this.#sleepTimeout = setTimeout(() => {
|
|
1470
|
-
this._sleep().catch((error) => {
|
|
1471
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error during sleep", {
|
|
1472
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1473
|
-
});
|
|
1474
|
-
});
|
|
1475
|
-
}, this.#config.options.sleepTimeout);
|
|
1476
|
-
}
|
|
1477
|
-
}
|
|
1478
|
-
/** If this actor can be put in a sleeping state. */
|
|
1479
|
-
#canSleep() {
|
|
1480
|
-
if (!this.#ready) return false;
|
|
1481
|
-
for (const conn of this.#connections.values()) {
|
|
1482
|
-
if (conn.status === "connected") return false;
|
|
1483
|
-
}
|
|
1484
|
-
if (this.#activeRawFetchCount > 0) return false;
|
|
1485
|
-
if (this.#activeRawWebSockets.size > 0) return false;
|
|
1486
|
-
return true;
|
|
1487
|
-
}
|
|
1488
|
-
/** Puts an actor to sleep. This should just start the sleep sequence, most shutdown logic should be in _stop (which is called by the ActorDriver when sleeping). */
|
|
1489
|
-
async _sleep() {
|
|
1490
|
-
var _a;
|
|
1491
|
-
const sleep = (_a = this.#actorDriver.sleep) == null ? void 0 : _a.bind(
|
|
1492
|
-
this.#actorDriver,
|
|
1493
|
-
this.#actorId
|
|
1494
|
-
);
|
|
1495
|
-
_invariant2.default.call(void 0, this.#sleepingSupported, "sleeping not supported");
|
|
1496
|
-
_invariant2.default.call(void 0, sleep, "no sleep on driver");
|
|
1497
|
-
if (this.#sleepCalled) {
|
|
1498
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("already sleeping actor");
|
|
1499
|
-
return;
|
|
1500
|
-
}
|
|
1501
|
-
this.#sleepCalled = true;
|
|
1502
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor sleeping");
|
|
1503
|
-
setImmediate(async () => {
|
|
1504
|
-
await sleep();
|
|
1505
|
-
});
|
|
1506
|
-
}
|
|
1507
|
-
// MARK: Stop
|
|
1508
|
-
async _stop() {
|
|
1509
|
-
if (this.#stopCalled) {
|
|
1510
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn("already stopping actor");
|
|
1511
|
-
return;
|
|
1512
|
-
}
|
|
1513
|
-
this.#stopCalled = true;
|
|
1514
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).info("actor stopping");
|
|
1515
|
-
try {
|
|
1516
|
-
this.#abortController.abort();
|
|
1517
|
-
} catch (e3) {
|
|
1518
|
-
}
|
|
1519
|
-
if (this.#config.onStop) {
|
|
1520
|
-
try {
|
|
1521
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("calling onStop");
|
|
1522
|
-
const result = this.#config.onStop(this.actorContext);
|
|
1523
|
-
if (result instanceof Promise) {
|
|
1524
|
-
await _chunk6WKQDDUDcjs.deadline.call(void 0, result, this.#config.options.onStopTimeout);
|
|
1525
|
-
}
|
|
1526
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("onStop completed");
|
|
1527
|
-
} catch (error) {
|
|
1528
|
-
if (error instanceof _chunk6WKQDDUDcjs.DeadlineError) {
|
|
1529
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("onStop timed out");
|
|
1530
|
-
} else {
|
|
1531
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error("error in onStop", {
|
|
1532
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
1533
|
-
});
|
|
1534
|
-
}
|
|
1535
|
-
}
|
|
1536
|
-
}
|
|
1537
|
-
const promises = [];
|
|
1538
|
-
for (const connection of this.#connections.values()) {
|
|
1539
|
-
promises.push(connection.disconnect());
|
|
1540
|
-
}
|
|
1541
|
-
await this.#waitBackgroundPromises(this.#config.options.waitUntilTimeout);
|
|
1542
|
-
if (this.#pendingSaveTimeout) clearTimeout(this.#pendingSaveTimeout);
|
|
1543
|
-
if (this.#sleepTimeout) clearTimeout(this.#sleepTimeout);
|
|
1544
|
-
if (this.#checkConnLivenessInterval)
|
|
1545
|
-
clearInterval(this.#checkConnLivenessInterval);
|
|
1546
|
-
await this.saveState({ immediate: true, allowStoppingState: true });
|
|
1547
|
-
const res = Promise.race([
|
|
1548
|
-
Promise.all(promises).then(() => false),
|
|
1549
|
-
new Promise(
|
|
1550
|
-
(res2) => globalThis.setTimeout(() => res2(true), 1500)
|
|
1551
|
-
)
|
|
1552
|
-
]);
|
|
1553
|
-
if (await res) {
|
|
1554
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).warn(
|
|
1555
|
-
"timed out waiting for connections to close, shutting down anyway"
|
|
1556
|
-
);
|
|
1557
|
-
}
|
|
1558
|
-
if (this.#persistWriteQueue.runningDrainLoop)
|
|
1559
|
-
await this.#persistWriteQueue.runningDrainLoop;
|
|
1560
|
-
if (this.#alarmWriteQueue.runningDrainLoop)
|
|
1561
|
-
await this.#alarmWriteQueue.runningDrainLoop;
|
|
1562
|
-
}
|
|
1563
|
-
/** Abort signal that fires when the actor is stopping. */
|
|
1564
|
-
get abortSignal() {
|
|
1565
|
-
return this.#abortController.signal;
|
|
1566
|
-
}
|
|
1567
|
-
/** Wait for background waitUntil promises with a timeout. */
|
|
1568
|
-
async #waitBackgroundPromises(timeoutMs) {
|
|
1569
|
-
const pending = this.#backgroundPromises;
|
|
1570
|
-
if (pending.length === 0) {
|
|
1571
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("no background promises");
|
|
1572
|
-
return;
|
|
1573
|
-
}
|
|
1574
|
-
const timedOut = await Promise.race([
|
|
1575
|
-
Promise.allSettled(pending).then(() => false),
|
|
1576
|
-
new Promise(
|
|
1577
|
-
(resolve) => setTimeout(() => resolve(true), timeoutMs)
|
|
1578
|
-
)
|
|
1579
|
-
]);
|
|
1580
|
-
if (timedOut) {
|
|
1581
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).error(
|
|
1582
|
-
"timed out waiting for background tasks, background promises may have leaked",
|
|
1583
|
-
{
|
|
1584
|
-
count: pending.length,
|
|
1585
|
-
timeoutMs
|
|
1586
|
-
}
|
|
1587
|
-
);
|
|
1588
|
-
} else {
|
|
1589
|
-
_chunk6WKQDDUDcjs.logger.call(void 0, ).debug("background promises finished");
|
|
1590
|
-
}
|
|
1591
|
-
}
|
|
1592
|
-
// MARK: BARE Conversion Helpers
|
|
1593
|
-
#convertToBarePersisted(persist) {
|
|
1594
|
-
return {
|
|
1595
|
-
input: persist.input !== void 0 ? _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(persist.input)) : null,
|
|
1596
|
-
hasInitialized: persist.hasInitiated,
|
|
1597
|
-
state: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(persist.state)),
|
|
1598
|
-
connections: persist.connections.map((conn) => ({
|
|
1599
|
-
id: conn.connId,
|
|
1600
|
-
token: conn.token,
|
|
1601
|
-
driver: conn.connDriver,
|
|
1602
|
-
driverState: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0,
|
|
1603
|
-
cbor.encode(conn.connDriverState || {})
|
|
1604
|
-
),
|
|
1605
|
-
parameters: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(conn.params || {})),
|
|
1606
|
-
state: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(conn.state || {})),
|
|
1607
|
-
auth: conn.authData !== void 0 ? _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor.encode(conn.authData)) : null,
|
|
1608
|
-
subscriptions: conn.subscriptions.map((sub) => ({
|
|
1609
|
-
eventName: sub.eventName
|
|
1610
|
-
})),
|
|
1611
|
-
lastSeen: BigInt(conn.lastSeen)
|
|
1612
|
-
})),
|
|
1613
|
-
scheduledEvents: persist.scheduledEvents.map((event) => ({
|
|
1614
|
-
eventId: event.eventId,
|
|
1615
|
-
timestamp: BigInt(event.timestamp),
|
|
1616
|
-
kind: {
|
|
1617
|
-
tag: "GenericPersistedScheduleEvent",
|
|
1618
|
-
val: {
|
|
1619
|
-
action: event.kind.generic.actionName,
|
|
1620
|
-
args: _nullishCoalesce(event.kind.generic.args, () => ( null))
|
|
1621
|
-
}
|
|
1622
|
-
}
|
|
1623
|
-
}))
|
|
1624
|
-
};
|
|
1625
|
-
}
|
|
1626
|
-
#convertFromBarePersisted(bareData) {
|
|
1627
|
-
return {
|
|
1628
|
-
input: bareData.input ? cbor.decode(new Uint8Array(bareData.input)) : void 0,
|
|
1629
|
-
hasInitiated: bareData.hasInitialized,
|
|
1630
|
-
state: cbor.decode(new Uint8Array(bareData.state)),
|
|
1631
|
-
connections: bareData.connections.map((conn) => ({
|
|
1632
|
-
connId: conn.id,
|
|
1633
|
-
token: conn.token,
|
|
1634
|
-
connDriver: conn.driver,
|
|
1635
|
-
connDriverState: cbor.decode(new Uint8Array(conn.driverState)),
|
|
1636
|
-
params: cbor.decode(new Uint8Array(conn.parameters)),
|
|
1637
|
-
state: cbor.decode(new Uint8Array(conn.state)),
|
|
1638
|
-
authData: conn.auth ? cbor.decode(new Uint8Array(conn.auth)) : void 0,
|
|
1639
|
-
subscriptions: conn.subscriptions.map((sub) => ({
|
|
1640
|
-
eventName: sub.eventName
|
|
1641
|
-
})),
|
|
1642
|
-
lastSeen: Number(conn.lastSeen)
|
|
1643
|
-
})),
|
|
1644
|
-
scheduledEvents: bareData.scheduledEvents.map((event) => ({
|
|
1645
|
-
eventId: event.eventId,
|
|
1646
|
-
timestamp: Number(event.timestamp),
|
|
1647
|
-
kind: {
|
|
1648
|
-
generic: {
|
|
1649
|
-
actionName: event.kind.val.action,
|
|
1650
|
-
args: event.kind.val.args
|
|
1651
|
-
}
|
|
1652
|
-
}
|
|
1653
|
-
}))
|
|
1654
|
-
};
|
|
1655
|
-
}
|
|
1656
|
-
};
|
|
1657
|
-
|
|
1658
|
-
// src/actor/definition.ts
|
|
1659
|
-
var ActorDefinition = class {
|
|
1660
|
-
#config;
|
|
1661
|
-
constructor(config) {
|
|
1662
|
-
this.#config = config;
|
|
1663
|
-
}
|
|
1664
|
-
get config() {
|
|
1665
|
-
return this.#config;
|
|
1666
|
-
}
|
|
1667
|
-
instantiate() {
|
|
1668
|
-
return new ActorInstance(this.#config);
|
|
1669
|
-
}
|
|
1670
|
-
};
|
|
1671
|
-
function lookupInRegistry(registryConfig, name) {
|
|
1672
|
-
const definition = registryConfig.use[name];
|
|
1673
|
-
if (!definition) throw new Error(`no actor in registry for name ${name}`);
|
|
1674
|
-
return definition;
|
|
1675
|
-
}
|
|
1676
|
-
|
|
1677
|
-
// src/client/errors.ts
|
|
1678
|
-
var ActorClientError = class extends Error {
|
|
1679
|
-
};
|
|
1680
|
-
var InternalError2 = class extends ActorClientError {
|
|
1681
|
-
};
|
|
1682
|
-
var ManagerError = class extends ActorClientError {
|
|
1683
|
-
constructor(error, opts) {
|
|
1684
|
-
super(`Manager error: ${error}`, opts);
|
|
1685
|
-
}
|
|
1686
|
-
};
|
|
1687
|
-
var MalformedResponseMessage = class extends ActorClientError {
|
|
1688
|
-
constructor(cause) {
|
|
1689
|
-
super(`Malformed response message: ${cause}`, { cause });
|
|
1690
|
-
}
|
|
1691
|
-
};
|
|
1692
|
-
var ActorError = (_class2 = class extends ActorClientError {
|
|
1693
|
-
constructor(code, message, metadata) {
|
|
1694
|
-
super(message);_class2.prototype.__init2.call(this);;
|
|
1695
|
-
this.code = code;
|
|
1696
|
-
this.metadata = metadata;
|
|
1697
|
-
}
|
|
1698
|
-
__init2() {this.__type = "ActorError"}
|
|
1699
|
-
}, _class2);
|
|
1700
|
-
var HttpRequestError = class extends ActorClientError {
|
|
1701
|
-
constructor(message, opts) {
|
|
1702
|
-
super(`HTTP request error: ${message}`, { cause: opts == null ? void 0 : opts.cause });
|
|
1703
|
-
}
|
|
1704
|
-
};
|
|
1705
|
-
var ActorConnDisposed = class extends ActorClientError {
|
|
1706
|
-
constructor() {
|
|
1707
|
-
super("Attempting to interact with a disposed actor connection.");
|
|
1708
|
-
}
|
|
1709
|
-
};
|
|
1710
|
-
|
|
1711
|
-
// src/client/actor-conn.ts
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
var _pretry = require('p-retry'); var _pretry2 = _interopRequireDefault(_pretry);
|
|
1715
|
-
|
|
1716
|
-
// src/client/actor-handle.ts
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
// src/client/raw-utils.ts
|
|
1720
|
-
async function rawHttpFetch(driver, actorQuery, params, input, init) {
|
|
1721
|
-
let path;
|
|
1722
|
-
let mergedInit = init || {};
|
|
1723
|
-
if (typeof input === "string") {
|
|
1724
|
-
path = input;
|
|
1725
|
-
} else if (input instanceof URL) {
|
|
1726
|
-
path = input.pathname + input.search;
|
|
1727
|
-
} else if (input instanceof Request) {
|
|
1728
|
-
const url = new URL(input.url);
|
|
1729
|
-
path = url.pathname + url.search;
|
|
1730
|
-
const requestHeaders = new Headers(input.headers);
|
|
1731
|
-
const initHeaders = new Headers((init == null ? void 0 : init.headers) || {});
|
|
1732
|
-
const mergedHeaders = new Headers(requestHeaders);
|
|
1733
|
-
for (const [key, value] of initHeaders) {
|
|
1734
|
-
mergedHeaders.set(key, value);
|
|
1735
|
-
}
|
|
1736
|
-
mergedInit = {
|
|
1737
|
-
method: input.method,
|
|
1738
|
-
body: input.body,
|
|
1739
|
-
mode: input.mode,
|
|
1740
|
-
credentials: input.credentials,
|
|
1741
|
-
redirect: input.redirect,
|
|
1742
|
-
referrer: input.referrer,
|
|
1743
|
-
referrerPolicy: input.referrerPolicy,
|
|
1744
|
-
integrity: input.integrity,
|
|
1745
|
-
keepalive: input.keepalive,
|
|
1746
|
-
signal: input.signal,
|
|
1747
|
-
...mergedInit,
|
|
1748
|
-
// init overrides Request properties
|
|
1749
|
-
headers: mergedHeaders
|
|
1750
|
-
// headers must be set after spread to ensure proper merge
|
|
1751
|
-
};
|
|
1752
|
-
if (mergedInit.body) {
|
|
1753
|
-
mergedInit.duplex = "half";
|
|
1754
|
-
}
|
|
1755
|
-
} else {
|
|
1756
|
-
throw new TypeError("Invalid input type for fetch");
|
|
1757
|
-
}
|
|
1758
|
-
return await driver.rawHttpRequest(
|
|
1759
|
-
void 0,
|
|
1760
|
-
actorQuery,
|
|
1761
|
-
// Force JSON so it's readable by the user
|
|
1762
|
-
"json",
|
|
1763
|
-
params,
|
|
1764
|
-
path,
|
|
1765
|
-
mergedInit,
|
|
1766
|
-
void 0
|
|
1767
|
-
);
|
|
1768
|
-
}
|
|
1769
|
-
async function rawWebSocket(driver, actorQuery, params, path, protocols) {
|
|
1770
|
-
return await driver.rawWebSocket(
|
|
1771
|
-
void 0,
|
|
1772
|
-
actorQuery,
|
|
1773
|
-
// Force JSON so it's readable by the user
|
|
1774
|
-
"json",
|
|
1775
|
-
params,
|
|
1776
|
-
path || "",
|
|
1777
|
-
protocols,
|
|
1778
|
-
void 0
|
|
1779
|
-
);
|
|
1780
|
-
}
|
|
1781
|
-
|
|
1782
|
-
// src/client/actor-handle.ts
|
|
1783
|
-
var ActorHandleRaw = class {
|
|
1784
|
-
#client;
|
|
1785
|
-
#driver;
|
|
1786
|
-
#encodingKind;
|
|
1787
|
-
#actorQuery;
|
|
1788
|
-
#params;
|
|
1789
|
-
/**
|
|
1790
|
-
* Do not call this directly.
|
|
1791
|
-
*
|
|
1792
|
-
* Creates an instance of ActorHandleRaw.
|
|
1793
|
-
*
|
|
1794
|
-
* @protected
|
|
1795
|
-
*/
|
|
1796
|
-
constructor(client, driver, params, encodingKind, actorQuery) {
|
|
1797
|
-
this.#client = client;
|
|
1798
|
-
this.#driver = driver;
|
|
1799
|
-
this.#encodingKind = encodingKind;
|
|
1800
|
-
this.#actorQuery = actorQuery;
|
|
1801
|
-
this.#params = params;
|
|
1802
|
-
}
|
|
1803
|
-
/**
|
|
1804
|
-
* Call a raw action. This method sends an HTTP request to invoke the named action.
|
|
1805
|
-
*
|
|
1806
|
-
* @see {@link ActorHandle}
|
|
1807
|
-
* @template Args - The type of arguments to pass to the action function.
|
|
1808
|
-
* @template Response - The type of the response returned by the action function.
|
|
1809
|
-
*/
|
|
1810
|
-
async action(opts) {
|
|
1811
|
-
return await this.#driver.action(
|
|
1812
|
-
void 0,
|
|
1813
|
-
this.#actorQuery,
|
|
1814
|
-
this.#encodingKind,
|
|
1815
|
-
this.#params,
|
|
1816
|
-
opts.name,
|
|
1817
|
-
opts.args,
|
|
1818
|
-
{ signal: opts.signal }
|
|
1819
|
-
);
|
|
1820
|
-
}
|
|
1821
|
-
/**
|
|
1822
|
-
* Establishes a persistent connection to the actor.
|
|
1823
|
-
*
|
|
1824
|
-
* @template AD The actor class that this connection is for.
|
|
1825
|
-
* @returns {ActorConn<AD>} A connection to the actor.
|
|
1826
|
-
*/
|
|
1827
|
-
connect() {
|
|
1828
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("establishing connection from handle", {
|
|
1829
|
-
query: this.#actorQuery
|
|
1830
|
-
});
|
|
1831
|
-
const conn = new ActorConnRaw(
|
|
1832
|
-
this.#client,
|
|
1833
|
-
this.#driver,
|
|
1834
|
-
this.#params,
|
|
1835
|
-
this.#encodingKind,
|
|
1836
|
-
this.#actorQuery
|
|
1837
|
-
);
|
|
1838
|
-
return this.#client[CREATE_ACTOR_CONN_PROXY](
|
|
1839
|
-
conn
|
|
1840
|
-
);
|
|
1841
|
-
}
|
|
1842
|
-
/**
|
|
1843
|
-
* Makes a raw HTTP request to the actor.
|
|
1844
|
-
*
|
|
1845
|
-
* @param input - The URL, path, or Request object
|
|
1846
|
-
* @param init - Standard fetch RequestInit options
|
|
1847
|
-
* @returns Promise<Response> - The raw HTTP response
|
|
1848
|
-
*/
|
|
1849
|
-
async fetch(input, init) {
|
|
1850
|
-
return rawHttpFetch(
|
|
1851
|
-
this.#driver,
|
|
1852
|
-
this.#actorQuery,
|
|
1853
|
-
this.#params,
|
|
1854
|
-
input,
|
|
1855
|
-
init
|
|
1856
|
-
);
|
|
1857
|
-
}
|
|
1858
|
-
/**
|
|
1859
|
-
* Creates a raw WebSocket connection to the actor.
|
|
1860
|
-
*
|
|
1861
|
-
* @param path - The path for the WebSocket connection (e.g., "stream")
|
|
1862
|
-
* @param protocols - Optional WebSocket subprotocols
|
|
1863
|
-
* @returns WebSocket - A raw WebSocket connection
|
|
1864
|
-
*/
|
|
1865
|
-
async websocket(path, protocols) {
|
|
1866
|
-
return rawWebSocket(
|
|
1867
|
-
this.#driver,
|
|
1868
|
-
this.#actorQuery,
|
|
1869
|
-
this.#params,
|
|
1870
|
-
path,
|
|
1871
|
-
protocols
|
|
1872
|
-
);
|
|
1873
|
-
}
|
|
1874
|
-
/**
|
|
1875
|
-
* Resolves the actor to get its unique actor ID
|
|
1876
|
-
*
|
|
1877
|
-
* @returns {Promise<string>} - A promise that resolves to the actor's ID
|
|
1878
|
-
*/
|
|
1879
|
-
async resolve({ signal } = {}) {
|
|
1880
|
-
if ("getForKey" in this.#actorQuery || "getOrCreateForKey" in this.#actorQuery) {
|
|
1881
|
-
let name;
|
|
1882
|
-
if ("getForKey" in this.#actorQuery) {
|
|
1883
|
-
name = this.#actorQuery.getForKey.name;
|
|
1884
|
-
} else if ("getOrCreateForKey" in this.#actorQuery) {
|
|
1885
|
-
name = this.#actorQuery.getOrCreateForKey.name;
|
|
1886
|
-
} else {
|
|
1887
|
-
_chunk6WKQDDUDcjs.assertUnreachable.call(void 0, this.#actorQuery);
|
|
1888
|
-
}
|
|
1889
|
-
const actorId = await this.#driver.resolveActorId(
|
|
1890
|
-
void 0,
|
|
1891
|
-
this.#actorQuery,
|
|
1892
|
-
this.#encodingKind,
|
|
1893
|
-
this.#params,
|
|
1894
|
-
signal ? { signal } : void 0
|
|
1895
|
-
);
|
|
1896
|
-
this.#actorQuery = { getForId: { actorId, name } };
|
|
1897
|
-
return actorId;
|
|
1898
|
-
} else if ("getForId" in this.#actorQuery) {
|
|
1899
|
-
return this.#actorQuery.getForId.actorId;
|
|
1900
|
-
} else if ("create" in this.#actorQuery) {
|
|
1901
|
-
_invariant2.default.call(void 0, false, "actorQuery cannot be create");
|
|
1902
|
-
} else {
|
|
1903
|
-
_chunk6WKQDDUDcjs.assertUnreachable.call(void 0, this.#actorQuery);
|
|
1904
|
-
}
|
|
1905
|
-
}
|
|
1906
|
-
};
|
|
1907
|
-
|
|
1908
|
-
// src/client/client.ts
|
|
1909
|
-
var ACTOR_CONNS_SYMBOL = Symbol("actorConns");
|
|
1910
|
-
var CREATE_ACTOR_CONN_PROXY = Symbol("createActorConnProxy");
|
|
1911
|
-
var TRANSPORT_SYMBOL = Symbol("transport");
|
|
1912
|
-
var ClientRaw = (_class3 = class {
|
|
1913
|
-
#disposed = false;
|
|
1914
|
-
__init3() {this[ACTOR_CONNS_SYMBOL] = /* @__PURE__ */ new Set()}
|
|
1915
|
-
#driver;
|
|
1916
|
-
#encodingKind;
|
|
1917
|
-
|
|
1918
|
-
/**
|
|
1919
|
-
* Creates an instance of Client.
|
|
1920
|
-
*
|
|
1921
|
-
* @param {string} managerEndpoint - The manager endpoint. See {@link https://rivet.gg/docs/setup|Initial Setup} for instructions on getting the manager endpoint.
|
|
1922
|
-
* @param {ClientOptions} [opts] - Options for configuring the client.
|
|
1923
|
-
* @see {@link https://rivet.gg/docs/setup|Initial Setup}
|
|
1924
|
-
*/
|
|
1925
|
-
constructor(driver, opts) {;_class3.prototype.__init3.call(this);
|
|
1926
|
-
this.#driver = driver;
|
|
1927
|
-
this.#encodingKind = _nullishCoalesce((opts == null ? void 0 : opts.encoding), () => ( "bare"));
|
|
1928
|
-
this[TRANSPORT_SYMBOL] = _nullishCoalesce((opts == null ? void 0 : opts.transport), () => ( "websocket"));
|
|
1929
|
-
}
|
|
1930
|
-
/**
|
|
1931
|
-
* Gets a stateless handle to a actor by its ID.
|
|
1932
|
-
*
|
|
1933
|
-
* @template AD The actor class that this handle is for.
|
|
1934
|
-
* @param {string} name - The name of the actor.
|
|
1935
|
-
* @param {string} actorId - The ID of the actor.
|
|
1936
|
-
* @param {GetWithIdOptions} [opts] - Options for getting the actor.
|
|
1937
|
-
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
1938
|
-
*/
|
|
1939
|
-
getForId(name, actorId, opts) {
|
|
1940
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("get handle to actor with id", {
|
|
1941
|
-
name,
|
|
1942
|
-
actorId,
|
|
1943
|
-
params: opts == null ? void 0 : opts.params
|
|
1944
|
-
});
|
|
1945
|
-
const actorQuery = {
|
|
1946
|
-
getForId: {
|
|
1947
|
-
name,
|
|
1948
|
-
actorId
|
|
1949
|
-
}
|
|
1950
|
-
};
|
|
1951
|
-
const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
|
|
1952
|
-
return createActorProxy(handle);
|
|
1953
|
-
}
|
|
1954
|
-
/**
|
|
1955
|
-
* Gets a stateless handle to a actor by its key, but does not create the actor if it doesn't exist.
|
|
1956
|
-
*
|
|
1957
|
-
* @template AD The actor class that this handle is for.
|
|
1958
|
-
* @param {string} name - The name of the actor.
|
|
1959
|
-
* @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
|
|
1960
|
-
* @param {GetWithIdOptions} [opts] - Options for getting the actor.
|
|
1961
|
-
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
1962
|
-
*/
|
|
1963
|
-
get(name, key, opts) {
|
|
1964
|
-
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
1965
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("get handle to actor", {
|
|
1966
|
-
name,
|
|
1967
|
-
key: keyArray,
|
|
1968
|
-
parameters: opts == null ? void 0 : opts.params
|
|
1969
|
-
});
|
|
1970
|
-
const actorQuery = {
|
|
1971
|
-
getForKey: {
|
|
1972
|
-
name,
|
|
1973
|
-
key: keyArray
|
|
1974
|
-
}
|
|
1975
|
-
};
|
|
1976
|
-
const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
|
|
1977
|
-
return createActorProxy(handle);
|
|
1978
|
-
}
|
|
1979
|
-
/**
|
|
1980
|
-
* Gets a stateless handle to a actor by its key, creating it if necessary.
|
|
1981
|
-
*
|
|
1982
|
-
* @template AD The actor class that this handle is for.
|
|
1983
|
-
* @param {string} name - The name of the actor.
|
|
1984
|
-
* @param {string | string[]} [key=[]] - The key to identify the actor. Can be a single string or an array of strings.
|
|
1985
|
-
* @param {GetOptions} [opts] - Options for getting the actor.
|
|
1986
|
-
* @returns {ActorHandle<AD>} - A handle to the actor.
|
|
1987
|
-
*/
|
|
1988
|
-
getOrCreate(name, key, opts) {
|
|
1989
|
-
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
1990
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("get or create handle to actor", {
|
|
1991
|
-
name,
|
|
1992
|
-
key: keyArray,
|
|
1993
|
-
parameters: opts == null ? void 0 : opts.params,
|
|
1994
|
-
createInRegion: opts == null ? void 0 : opts.createInRegion
|
|
1995
|
-
});
|
|
1996
|
-
const actorQuery = {
|
|
1997
|
-
getOrCreateForKey: {
|
|
1998
|
-
name,
|
|
1999
|
-
key: keyArray,
|
|
2000
|
-
input: opts == null ? void 0 : opts.createWithInput,
|
|
2001
|
-
region: opts == null ? void 0 : opts.createInRegion
|
|
2002
|
-
}
|
|
2003
|
-
};
|
|
2004
|
-
const handle = this.#createHandle(opts == null ? void 0 : opts.params, actorQuery);
|
|
2005
|
-
return createActorProxy(handle);
|
|
2006
|
-
}
|
|
2007
|
-
/**
|
|
2008
|
-
* Creates a new actor with the provided key and returns a stateless handle to it.
|
|
2009
|
-
* Resolves the actor ID and returns a handle with getForId query.
|
|
2010
|
-
*
|
|
2011
|
-
* @template AD The actor class that this handle is for.
|
|
2012
|
-
* @param {string} name - The name of the actor.
|
|
2013
|
-
* @param {string | string[]} key - The key to identify the actor. Can be a single string or an array of strings.
|
|
2014
|
-
* @param {CreateOptions} [opts] - Options for creating the actor (excluding name and key).
|
|
2015
|
-
* @returns {Promise<ActorHandle<AD>>} - A promise that resolves to a handle to the actor.
|
|
2016
|
-
*/
|
|
2017
|
-
async create(name, key, opts) {
|
|
2018
|
-
const keyArray = typeof key === "string" ? [key] : key || [];
|
|
2019
|
-
const createQuery = {
|
|
2020
|
-
create: {
|
|
2021
|
-
...opts,
|
|
2022
|
-
// Do these last to override `opts`
|
|
2023
|
-
name,
|
|
2024
|
-
key: keyArray
|
|
2025
|
-
}
|
|
2026
|
-
};
|
|
2027
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("create actor handle", {
|
|
2028
|
-
name,
|
|
2029
|
-
key: keyArray,
|
|
2030
|
-
parameters: opts == null ? void 0 : opts.params,
|
|
2031
|
-
create: createQuery.create
|
|
2032
|
-
});
|
|
2033
|
-
const actorId = await this.#driver.resolveActorId(
|
|
2034
|
-
void 0,
|
|
2035
|
-
createQuery,
|
|
2036
|
-
this.#encodingKind,
|
|
2037
|
-
opts == null ? void 0 : opts.params,
|
|
2038
|
-
(opts == null ? void 0 : opts.signal) ? { signal: opts.signal } : void 0
|
|
2039
|
-
);
|
|
2040
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("created actor with ID", {
|
|
2041
|
-
name,
|
|
2042
|
-
key: keyArray,
|
|
2043
|
-
actorId
|
|
2044
|
-
});
|
|
2045
|
-
const getForIdQuery = {
|
|
2046
|
-
getForId: {
|
|
2047
|
-
name,
|
|
2048
|
-
actorId
|
|
2049
|
-
}
|
|
2050
|
-
};
|
|
2051
|
-
const handle = this.#createHandle(opts == null ? void 0 : opts.params, getForIdQuery);
|
|
2052
|
-
const proxy = createActorProxy(handle);
|
|
2053
|
-
return proxy;
|
|
2054
|
-
}
|
|
2055
|
-
#createHandle(params, actorQuery) {
|
|
2056
|
-
return new ActorHandleRaw(
|
|
2057
|
-
this,
|
|
2058
|
-
this.#driver,
|
|
2059
|
-
params,
|
|
2060
|
-
this.#encodingKind,
|
|
2061
|
-
actorQuery
|
|
2062
|
-
);
|
|
2063
|
-
}
|
|
2064
|
-
[CREATE_ACTOR_CONN_PROXY](conn) {
|
|
2065
|
-
this[ACTOR_CONNS_SYMBOL].add(conn);
|
|
2066
|
-
conn[CONNECT_SYMBOL]();
|
|
2067
|
-
return createActorProxy(conn);
|
|
2068
|
-
}
|
|
2069
|
-
/**
|
|
2070
|
-
* Disconnects from all actors.
|
|
2071
|
-
*
|
|
2072
|
-
* @returns {Promise<void>} A promise that resolves when all connections are closed.
|
|
2073
|
-
*/
|
|
2074
|
-
async dispose() {
|
|
2075
|
-
if (this.#disposed) {
|
|
2076
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("client already disconnected");
|
|
2077
|
-
return;
|
|
2078
|
-
}
|
|
2079
|
-
this.#disposed = true;
|
|
2080
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("disposing client");
|
|
2081
|
-
const disposePromises = [];
|
|
2082
|
-
for (const conn of this[ACTOR_CONNS_SYMBOL].values()) {
|
|
2083
|
-
disposePromises.push(conn.dispose());
|
|
2084
|
-
}
|
|
2085
|
-
await Promise.all(disposePromises);
|
|
2086
|
-
}
|
|
2087
|
-
}, _class3);
|
|
2088
|
-
function createClientWithDriver(driver, opts) {
|
|
2089
|
-
const client = new ClientRaw(driver, opts);
|
|
2090
|
-
return new Proxy(client, {
|
|
2091
|
-
get: (target, prop, receiver) => {
|
|
2092
|
-
if (typeof prop === "symbol" || prop in target) {
|
|
2093
|
-
const value = Reflect.get(target, prop, receiver);
|
|
2094
|
-
if (typeof value === "function") {
|
|
2095
|
-
return value.bind(target);
|
|
2096
|
-
}
|
|
2097
|
-
return value;
|
|
2098
|
-
}
|
|
2099
|
-
if (typeof prop === "string") {
|
|
2100
|
-
return {
|
|
2101
|
-
// Handle methods (stateless action)
|
|
2102
|
-
get: (key, opts2) => {
|
|
2103
|
-
return target.get(
|
|
2104
|
-
prop,
|
|
2105
|
-
key,
|
|
2106
|
-
opts2
|
|
2107
|
-
);
|
|
2108
|
-
},
|
|
2109
|
-
getOrCreate: (key, opts2) => {
|
|
2110
|
-
return target.getOrCreate(prop, key, opts2);
|
|
2111
|
-
},
|
|
2112
|
-
getForId: (actorId, opts2) => {
|
|
2113
|
-
return target.getForId(
|
|
2114
|
-
prop,
|
|
2115
|
-
actorId,
|
|
2116
|
-
opts2
|
|
2117
|
-
);
|
|
2118
|
-
},
|
|
2119
|
-
create: async (key, opts2 = {}) => {
|
|
2120
|
-
return await target.create(prop, key, opts2);
|
|
2121
|
-
}
|
|
2122
|
-
};
|
|
2123
|
-
}
|
|
2124
|
-
return void 0;
|
|
2125
|
-
}
|
|
2126
|
-
});
|
|
2127
|
-
}
|
|
2128
|
-
function createActorProxy(handle) {
|
|
2129
|
-
const methodCache = /* @__PURE__ */ new Map();
|
|
2130
|
-
return new Proxy(handle, {
|
|
2131
|
-
get(target, prop, receiver) {
|
|
2132
|
-
if (typeof prop === "symbol") {
|
|
2133
|
-
return Reflect.get(target, prop, receiver);
|
|
2134
|
-
}
|
|
2135
|
-
if (prop === "constructor" || prop in target) {
|
|
2136
|
-
const value = Reflect.get(target, prop, receiver);
|
|
2137
|
-
if (typeof value === "function") {
|
|
2138
|
-
return value.bind(target);
|
|
2139
|
-
}
|
|
2140
|
-
return value;
|
|
2141
|
-
}
|
|
2142
|
-
if (typeof prop === "string") {
|
|
2143
|
-
if (prop === "then") return void 0;
|
|
2144
|
-
let method = methodCache.get(prop);
|
|
2145
|
-
if (!method) {
|
|
2146
|
-
method = (...args) => target.action({ name: prop, args });
|
|
2147
|
-
methodCache.set(prop, method);
|
|
2148
|
-
}
|
|
2149
|
-
return method;
|
|
2150
|
-
}
|
|
2151
|
-
},
|
|
2152
|
-
// Support for 'in' operator
|
|
2153
|
-
has(target, prop) {
|
|
2154
|
-
if (typeof prop === "string") {
|
|
2155
|
-
return true;
|
|
2156
|
-
}
|
|
2157
|
-
return Reflect.has(target, prop);
|
|
2158
|
-
},
|
|
2159
|
-
// Support instanceof checks
|
|
2160
|
-
getPrototypeOf(target) {
|
|
2161
|
-
return Reflect.getPrototypeOf(target);
|
|
2162
|
-
},
|
|
2163
|
-
// Prevent property enumeration of non-existent action methods
|
|
2164
|
-
ownKeys(target) {
|
|
2165
|
-
return Reflect.ownKeys(target);
|
|
2166
|
-
},
|
|
2167
|
-
// Support proper property descriptors
|
|
2168
|
-
getOwnPropertyDescriptor(target, prop) {
|
|
2169
|
-
const targetDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);
|
|
2170
|
-
if (targetDescriptor) {
|
|
2171
|
-
return targetDescriptor;
|
|
2172
|
-
}
|
|
2173
|
-
if (typeof prop === "string") {
|
|
2174
|
-
return {
|
|
2175
|
-
configurable: true,
|
|
2176
|
-
enumerable: false,
|
|
2177
|
-
writable: false,
|
|
2178
|
-
value: (...args) => target.action({ name: prop, args })
|
|
2179
|
-
};
|
|
2180
|
-
}
|
|
2181
|
-
return void 0;
|
|
2182
|
-
}
|
|
2183
|
-
});
|
|
2184
|
-
}
|
|
2185
|
-
|
|
2186
|
-
// src/client/utils.ts
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
function messageLength(message) {
|
|
2190
|
-
if (message instanceof Blob) {
|
|
2191
|
-
return message.size;
|
|
2192
|
-
}
|
|
2193
|
-
if (message instanceof ArrayBuffer) {
|
|
2194
|
-
return message.byteLength;
|
|
2195
|
-
}
|
|
2196
|
-
if (message instanceof Uint8Array) {
|
|
2197
|
-
return message.byteLength;
|
|
2198
|
-
}
|
|
2199
|
-
if (typeof message === "string") {
|
|
2200
|
-
return message.length;
|
|
2201
|
-
}
|
|
2202
|
-
_chunkOGAPU3UGcjs.assertUnreachable.call(void 0, message);
|
|
2203
|
-
}
|
|
2204
|
-
async function sendHttpRequest(opts) {
|
|
2205
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("sending http request", {
|
|
2206
|
-
url: opts.url,
|
|
2207
|
-
encoding: opts.encoding
|
|
2208
|
-
});
|
|
2209
|
-
let contentType;
|
|
2210
|
-
let bodyData;
|
|
2211
|
-
if (opts.method === "POST" || opts.method === "PUT") {
|
|
2212
|
-
_invariant2.default.call(void 0, opts.body !== void 0, "missing body");
|
|
2213
|
-
contentType = _chunk6WKQDDUDcjs.contentTypeForEncoding.call(void 0, opts.encoding);
|
|
2214
|
-
bodyData = _chunk6WKQDDUDcjs.serializeWithEncoding.call(void 0,
|
|
2215
|
-
opts.encoding,
|
|
2216
|
-
opts.body,
|
|
2217
|
-
opts.requestVersionedDataHandler
|
|
2218
|
-
);
|
|
2219
|
-
}
|
|
2220
|
-
let response;
|
|
2221
|
-
try {
|
|
2222
|
-
response = await (_nullishCoalesce(opts.customFetch, () => ( fetch)))(
|
|
2223
|
-
new Request(opts.url, {
|
|
2224
|
-
method: opts.method,
|
|
2225
|
-
headers: {
|
|
2226
|
-
...opts.headers,
|
|
2227
|
-
...contentType ? {
|
|
2228
|
-
"Content-Type": contentType
|
|
2229
|
-
} : {},
|
|
2230
|
-
"User-Agent": _chunkOGAPU3UGcjs.httpUserAgent.call(void 0, )
|
|
2231
|
-
},
|
|
2232
|
-
body: bodyData,
|
|
2233
|
-
credentials: "include",
|
|
2234
|
-
signal: opts.signal
|
|
2235
|
-
})
|
|
2236
|
-
);
|
|
2237
|
-
} catch (error) {
|
|
2238
|
-
throw new HttpRequestError(`Request failed: ${error}`, {
|
|
2239
|
-
cause: error
|
|
2240
|
-
});
|
|
2241
|
-
}
|
|
2242
|
-
if (!response.ok) {
|
|
2243
|
-
const bufferResponse = await response.arrayBuffer();
|
|
2244
|
-
let responseData;
|
|
2245
|
-
try {
|
|
2246
|
-
responseData = _chunk6WKQDDUDcjs.deserializeWithEncoding.call(void 0,
|
|
2247
|
-
opts.encoding,
|
|
2248
|
-
new Uint8Array(bufferResponse),
|
|
2249
|
-
_chunk6WKQDDUDcjs.HTTP_RESPONSE_ERROR_VERSIONED
|
|
2250
|
-
);
|
|
2251
|
-
} catch (error) {
|
|
2252
|
-
const textResponse = new TextDecoder("utf-8", { fatal: false }).decode(
|
|
2253
|
-
bufferResponse
|
|
2254
|
-
);
|
|
2255
|
-
throw new HttpRequestError(
|
|
2256
|
-
`${response.statusText} (${response.status}):
|
|
2257
|
-
${textResponse}`
|
|
2258
|
-
);
|
|
2259
|
-
}
|
|
2260
|
-
throw new ActorError(
|
|
2261
|
-
responseData.code,
|
|
2262
|
-
responseData.message,
|
|
2263
|
-
responseData.metadata ? cbor2.decode(new Uint8Array(responseData.metadata)) : void 0
|
|
2264
|
-
);
|
|
2265
|
-
}
|
|
2266
|
-
if (opts.skipParseResponse) {
|
|
2267
|
-
return void 0;
|
|
2268
|
-
}
|
|
2269
|
-
try {
|
|
2270
|
-
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
2271
|
-
return _chunk6WKQDDUDcjs.deserializeWithEncoding.call(void 0,
|
|
2272
|
-
opts.encoding,
|
|
2273
|
-
buffer,
|
|
2274
|
-
opts.responseVersionedDataHandler
|
|
2275
|
-
);
|
|
2276
|
-
} catch (error) {
|
|
2277
|
-
throw new HttpRequestError(`Failed to parse response: ${error}`, {
|
|
2278
|
-
cause: error
|
|
2279
|
-
});
|
|
2280
|
-
}
|
|
2281
|
-
}
|
|
2282
|
-
|
|
2283
|
-
// src/client/actor-conn.ts
|
|
2284
|
-
var CONNECT_SYMBOL = Symbol("connect");
|
|
2285
|
-
var ActorConnRaw = class {
|
|
2286
|
-
#disposed = false;
|
|
2287
|
-
/* Will be aborted on dispose. */
|
|
2288
|
-
#abortController = new AbortController();
|
|
2289
|
-
/** If attempting to connect. Helpful for knowing if in a retry loop when reconnecting. */
|
|
2290
|
-
#connecting = false;
|
|
2291
|
-
// These will only be set on SSE driver
|
|
2292
|
-
#actorId;
|
|
2293
|
-
#connectionId;
|
|
2294
|
-
#connectionToken;
|
|
2295
|
-
#transport;
|
|
2296
|
-
#messageQueue = [];
|
|
2297
|
-
#actionsInFlight = /* @__PURE__ */ new Map();
|
|
2298
|
-
// biome-ignore lint/suspicious/noExplicitAny: Unknown subscription type
|
|
2299
|
-
#eventSubscriptions = /* @__PURE__ */ new Map();
|
|
2300
|
-
#errorHandlers = /* @__PURE__ */ new Set();
|
|
2301
|
-
#actionIdCounter = 0;
|
|
2302
|
-
/**
|
|
2303
|
-
* Interval that keeps the NodeJS process alive if this is the only thing running.
|
|
2304
|
-
*
|
|
2305
|
-
* See ttps://github.com/nodejs/node/issues/22088
|
|
2306
|
-
*/
|
|
2307
|
-
#keepNodeAliveInterval;
|
|
2308
|
-
/** Promise used to indicate the socket has connected successfully. This will be rejected if the connection fails. */
|
|
2309
|
-
#onOpenPromise;
|
|
2310
|
-
#client;
|
|
2311
|
-
#driver;
|
|
2312
|
-
#params;
|
|
2313
|
-
#encodingKind;
|
|
2314
|
-
#actorQuery;
|
|
2315
|
-
// TODO: ws message queue
|
|
2316
|
-
/**
|
|
2317
|
-
* Do not call this directly.
|
|
2318
|
-
*
|
|
2319
|
-
* Creates an instance of ActorConnRaw.
|
|
2320
|
-
*
|
|
2321
|
-
* @protected
|
|
2322
|
-
*/
|
|
2323
|
-
constructor(client, driver, params, encodingKind, actorQuery) {
|
|
2324
|
-
this.#client = client;
|
|
2325
|
-
this.#driver = driver;
|
|
2326
|
-
this.#params = params;
|
|
2327
|
-
this.#encodingKind = encodingKind;
|
|
2328
|
-
this.#actorQuery = actorQuery;
|
|
2329
|
-
this.#keepNodeAliveInterval = setInterval(() => 6e4);
|
|
2330
|
-
}
|
|
2331
|
-
/**
|
|
2332
|
-
* Call a raw action connection. See {@link ActorConn} for type-safe action calls.
|
|
2333
|
-
*
|
|
2334
|
-
* @see {@link ActorConn}
|
|
2335
|
-
* @template Args - The type of arguments to pass to the action function.
|
|
2336
|
-
* @template Response - The type of the response returned by the action function.
|
|
2337
|
-
* @param {string} name - The name of the action function to call.
|
|
2338
|
-
* @param {...Args} args - The arguments to pass to the action function.
|
|
2339
|
-
* @returns {Promise<Response>} - A promise that resolves to the response of the action function.
|
|
2340
|
-
*/
|
|
2341
|
-
async action(opts) {
|
|
2342
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("action", { name: opts.name, args: opts.args });
|
|
2343
|
-
const actionId = this.#actionIdCounter;
|
|
2344
|
-
this.#actionIdCounter += 1;
|
|
2345
|
-
const { promise, resolve, reject } = Promise.withResolvers();
|
|
2346
|
-
this.#actionsInFlight.set(actionId, { name: opts.name, resolve, reject });
|
|
2347
|
-
this.#sendMessage({
|
|
2348
|
-
body: {
|
|
2349
|
-
tag: "ActionRequest",
|
|
2350
|
-
val: {
|
|
2351
|
-
id: BigInt(actionId),
|
|
2352
|
-
name: opts.name,
|
|
2353
|
-
args: _chunkOGAPU3UGcjs.bufferToArrayBuffer.call(void 0, cbor3.encode(opts.args))
|
|
2354
|
-
}
|
|
2355
|
-
}
|
|
2356
|
-
});
|
|
2357
|
-
const { id: responseId, output } = await promise;
|
|
2358
|
-
if (responseId !== BigInt(actionId))
|
|
2359
|
-
throw new Error(
|
|
2360
|
-
`Request ID ${actionId} does not match response ID ${responseId}`
|
|
2361
|
-
);
|
|
2362
|
-
return cbor3.decode(new Uint8Array(output));
|
|
2363
|
-
}
|
|
2364
|
-
/**
|
|
2365
|
-
* Do not call this directly.
|
|
2366
|
-
enc
|
|
2367
|
-
* Establishes a connection to the server using the specified endpoint & encoding & driver.
|
|
2368
|
-
*
|
|
2369
|
-
* @protected
|
|
2370
|
-
*/
|
|
2371
|
-
[CONNECT_SYMBOL]() {
|
|
2372
|
-
this.#connectWithRetry();
|
|
2373
|
-
}
|
|
2374
|
-
async #connectWithRetry() {
|
|
2375
|
-
this.#connecting = true;
|
|
2376
|
-
try {
|
|
2377
|
-
await _pretry2.default.call(void 0, this.#connectAndWait.bind(this), {
|
|
2378
|
-
forever: true,
|
|
2379
|
-
minTimeout: 250,
|
|
2380
|
-
maxTimeout: 3e4,
|
|
2381
|
-
onFailedAttempt: (error) => {
|
|
2382
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("failed to reconnect", {
|
|
2383
|
-
attempt: error.attemptNumber,
|
|
2384
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, error)
|
|
2385
|
-
});
|
|
2386
|
-
},
|
|
2387
|
-
// Cancel retry if aborted
|
|
2388
|
-
signal: this.#abortController.signal
|
|
2389
|
-
});
|
|
2390
|
-
} catch (err) {
|
|
2391
|
-
if (err.name === "AbortError") {
|
|
2392
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).info("connection retry aborted");
|
|
2393
|
-
return;
|
|
2394
|
-
} else {
|
|
2395
|
-
throw err;
|
|
2396
|
-
}
|
|
2397
|
-
}
|
|
2398
|
-
this.#connecting = false;
|
|
2399
|
-
}
|
|
2400
|
-
async #connectAndWait() {
|
|
2401
|
-
try {
|
|
2402
|
-
if (this.#onOpenPromise)
|
|
2403
|
-
throw new Error("#onOpenPromise already defined");
|
|
2404
|
-
this.#onOpenPromise = Promise.withResolvers();
|
|
2405
|
-
if (this.#client[TRANSPORT_SYMBOL] === "websocket") {
|
|
2406
|
-
await this.#connectWebSocket();
|
|
2407
|
-
} else if (this.#client[TRANSPORT_SYMBOL] === "sse") {
|
|
2408
|
-
await this.#connectSse();
|
|
2409
|
-
} else {
|
|
2410
|
-
_chunkOGAPU3UGcjs.assertUnreachable.call(void 0, this.#client[TRANSPORT_SYMBOL]);
|
|
2411
|
-
}
|
|
2412
|
-
await this.#onOpenPromise.promise;
|
|
2413
|
-
} finally {
|
|
2414
|
-
this.#onOpenPromise = void 0;
|
|
2415
|
-
}
|
|
2416
|
-
}
|
|
2417
|
-
async #connectWebSocket({ signal } = {}) {
|
|
2418
|
-
const ws = await this.#driver.connectWebSocket(
|
|
2419
|
-
void 0,
|
|
2420
|
-
this.#actorQuery,
|
|
2421
|
-
this.#encodingKind,
|
|
2422
|
-
this.#params,
|
|
2423
|
-
signal ? { signal } : void 0
|
|
2424
|
-
);
|
|
2425
|
-
this.#transport = { websocket: ws };
|
|
2426
|
-
ws.addEventListener("open", () => {
|
|
2427
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("websocket open");
|
|
2428
|
-
});
|
|
2429
|
-
ws.addEventListener("message", async (ev) => {
|
|
2430
|
-
this.#handleOnMessage(ev.data);
|
|
2431
|
-
});
|
|
2432
|
-
ws.addEventListener("close", (ev) => {
|
|
2433
|
-
this.#handleOnClose(ev);
|
|
2434
|
-
});
|
|
2435
|
-
ws.addEventListener("error", (_ev) => {
|
|
2436
|
-
this.#handleOnError();
|
|
2437
|
-
});
|
|
2438
|
-
}
|
|
2439
|
-
async #connectSse({ signal } = {}) {
|
|
2440
|
-
const eventSource = await this.#driver.connectSse(
|
|
2441
|
-
void 0,
|
|
2442
|
-
this.#actorQuery,
|
|
2443
|
-
this.#encodingKind,
|
|
2444
|
-
this.#params,
|
|
2445
|
-
signal ? { signal } : void 0
|
|
2446
|
-
);
|
|
2447
|
-
this.#transport = { sse: eventSource };
|
|
2448
|
-
eventSource.onopen = () => {
|
|
2449
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("eventsource open");
|
|
2450
|
-
};
|
|
2451
|
-
eventSource.onmessage = (ev) => {
|
|
2452
|
-
this.#handleOnMessage(ev.data);
|
|
2453
|
-
};
|
|
2454
|
-
eventSource.onerror = (_ev) => {
|
|
2455
|
-
if (eventSource.readyState === eventSource.CLOSED) {
|
|
2456
|
-
this.#handleOnClose(new Event("error"));
|
|
2457
|
-
} else {
|
|
2458
|
-
this.#handleOnError();
|
|
2459
|
-
}
|
|
2460
|
-
};
|
|
2461
|
-
}
|
|
2462
|
-
/** Called by the onopen event from drivers. */
|
|
2463
|
-
#handleOnOpen() {
|
|
2464
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("socket open", {
|
|
2465
|
-
messageQueueLength: this.#messageQueue.length
|
|
2466
|
-
});
|
|
2467
|
-
if (this.#onOpenPromise) {
|
|
2468
|
-
this.#onOpenPromise.resolve(void 0);
|
|
2469
|
-
} else {
|
|
2470
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("#onOpenPromise is undefined");
|
|
2471
|
-
}
|
|
2472
|
-
for (const eventName of this.#eventSubscriptions.keys()) {
|
|
2473
|
-
this.#sendSubscription(eventName, true);
|
|
2474
|
-
}
|
|
2475
|
-
const queue = this.#messageQueue;
|
|
2476
|
-
this.#messageQueue = [];
|
|
2477
|
-
for (const msg of queue) {
|
|
2478
|
-
this.#sendMessage(msg);
|
|
2479
|
-
}
|
|
2480
|
-
}
|
|
2481
|
-
/** Called by the onmessage event from drivers. */
|
|
2482
|
-
async #handleOnMessage(data) {
|
|
2483
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace("received message", {
|
|
2484
|
-
dataType: typeof data,
|
|
2485
|
-
isBlob: data instanceof Blob,
|
|
2486
|
-
isArrayBuffer: data instanceof ArrayBuffer
|
|
2487
|
-
});
|
|
2488
|
-
const response = await this.#parseMessage(data);
|
|
2489
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace(
|
|
2490
|
-
"parsed message",
|
|
2491
|
-
_chunkOGAPU3UGcjs.getEnvUniversal.call(void 0, "_RIVETKIT_LOG_MESSAGE") ? {
|
|
2492
|
-
message: _chunk6WKQDDUDcjs.jsonStringifyCompat.call(void 0, response).substring(0, 100) + "..."
|
|
2493
|
-
} : {}
|
|
2494
|
-
);
|
|
2495
|
-
if (response.body.tag === "Init") {
|
|
2496
|
-
this.#actorId = response.body.val.actorId;
|
|
2497
|
-
this.#connectionId = response.body.val.connectionId;
|
|
2498
|
-
this.#connectionToken = response.body.val.connectionToken;
|
|
2499
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace("received init message", {
|
|
2500
|
-
actorId: this.#actorId,
|
|
2501
|
-
connectionId: this.#connectionId
|
|
2502
|
-
});
|
|
2503
|
-
this.#handleOnOpen();
|
|
2504
|
-
} else if (response.body.tag === "Error") {
|
|
2505
|
-
const { code, message, metadata, actionId } = response.body.val;
|
|
2506
|
-
if (actionId) {
|
|
2507
|
-
const inFlight = this.#takeActionInFlight(Number(actionId));
|
|
2508
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("action error", {
|
|
2509
|
-
actionId,
|
|
2510
|
-
actionName: inFlight == null ? void 0 : inFlight.name,
|
|
2511
|
-
code,
|
|
2512
|
-
message,
|
|
2513
|
-
metadata
|
|
2514
|
-
});
|
|
2515
|
-
inFlight.reject(new ActorError(code, message, metadata));
|
|
2516
|
-
} else {
|
|
2517
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("connection error", {
|
|
2518
|
-
code,
|
|
2519
|
-
message,
|
|
2520
|
-
metadata
|
|
2521
|
-
});
|
|
2522
|
-
const actorError = new ActorError(code, message, metadata);
|
|
2523
|
-
if (this.#onOpenPromise) {
|
|
2524
|
-
this.#onOpenPromise.reject(actorError);
|
|
2525
|
-
}
|
|
2526
|
-
for (const [id, inFlight] of this.#actionsInFlight.entries()) {
|
|
2527
|
-
inFlight.reject(actorError);
|
|
2528
|
-
this.#actionsInFlight.delete(id);
|
|
2529
|
-
}
|
|
2530
|
-
this.#dispatchActorError(actorError);
|
|
2531
|
-
}
|
|
2532
|
-
} else if (response.body.tag === "ActionResponse") {
|
|
2533
|
-
const { id: actionId } = response.body.val;
|
|
2534
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace("received action response", {
|
|
2535
|
-
actionId
|
|
2536
|
-
});
|
|
2537
|
-
const inFlight = this.#takeActionInFlight(Number(actionId));
|
|
2538
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace("resolving action promise", {
|
|
2539
|
-
actionId,
|
|
2540
|
-
actionName: inFlight == null ? void 0 : inFlight.name
|
|
2541
|
-
});
|
|
2542
|
-
inFlight.resolve(response.body.val);
|
|
2543
|
-
} else if (response.body.tag === "Event") {
|
|
2544
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace("received event", { name: response.body.val.name });
|
|
2545
|
-
this.#dispatchEvent(response.body.val);
|
|
2546
|
-
} else {
|
|
2547
|
-
_chunkOGAPU3UGcjs.assertUnreachable.call(void 0, response.body);
|
|
2548
|
-
}
|
|
2549
|
-
}
|
|
2550
|
-
/** Called by the onclose event from drivers. */
|
|
2551
|
-
#handleOnClose(event) {
|
|
2552
|
-
if (this.#onOpenPromise) {
|
|
2553
|
-
this.#onOpenPromise.reject(new Error("Closed"));
|
|
2554
|
-
}
|
|
2555
|
-
const closeEvent = event;
|
|
2556
|
-
if (closeEvent.wasClean) {
|
|
2557
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).info("socket closed", {
|
|
2558
|
-
code: closeEvent.code,
|
|
2559
|
-
reason: closeEvent.reason,
|
|
2560
|
-
wasClean: closeEvent.wasClean
|
|
2561
|
-
});
|
|
2562
|
-
} else {
|
|
2563
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("socket closed", {
|
|
2564
|
-
code: closeEvent.code,
|
|
2565
|
-
reason: closeEvent.reason,
|
|
2566
|
-
wasClean: closeEvent.wasClean
|
|
2567
|
-
});
|
|
2568
|
-
}
|
|
2569
|
-
this.#transport = void 0;
|
|
2570
|
-
if (!this.#disposed && !this.#connecting) {
|
|
2571
|
-
this.#connectWithRetry();
|
|
2572
|
-
}
|
|
2573
|
-
}
|
|
2574
|
-
/** Called by the onerror event from drivers. */
|
|
2575
|
-
#handleOnError() {
|
|
2576
|
-
if (this.#disposed) return;
|
|
2577
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("socket error");
|
|
2578
|
-
}
|
|
2579
|
-
#takeActionInFlight(id) {
|
|
2580
|
-
const inFlight = this.#actionsInFlight.get(id);
|
|
2581
|
-
if (!inFlight) {
|
|
2582
|
-
throw new InternalError2(`No in flight response for ${id}`);
|
|
2583
|
-
}
|
|
2584
|
-
this.#actionsInFlight.delete(id);
|
|
2585
|
-
return inFlight;
|
|
2586
|
-
}
|
|
2587
|
-
#dispatchEvent(event) {
|
|
2588
|
-
const { name, args: argsRaw } = event;
|
|
2589
|
-
const args = cbor3.decode(new Uint8Array(argsRaw));
|
|
2590
|
-
const listeners = this.#eventSubscriptions.get(name);
|
|
2591
|
-
if (!listeners) return;
|
|
2592
|
-
for (const listener of [...listeners]) {
|
|
2593
|
-
listener.callback(...args);
|
|
2594
|
-
if (listener.once) {
|
|
2595
|
-
listeners.delete(listener);
|
|
2596
|
-
}
|
|
2597
|
-
}
|
|
2598
|
-
if (listeners.size === 0) {
|
|
2599
|
-
this.#eventSubscriptions.delete(name);
|
|
2600
|
-
}
|
|
2601
|
-
}
|
|
2602
|
-
#dispatchActorError(error) {
|
|
2603
|
-
for (const handler of [...this.#errorHandlers]) {
|
|
2604
|
-
try {
|
|
2605
|
-
handler(error);
|
|
2606
|
-
} catch (err) {
|
|
2607
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).error("Error in connection error handler", {
|
|
2608
|
-
error: _chunkOGAPU3UGcjs.stringifyError.call(void 0, err)
|
|
2609
|
-
});
|
|
2610
|
-
}
|
|
2611
|
-
}
|
|
2612
|
-
}
|
|
2613
|
-
#addEventSubscription(eventName, callback, once) {
|
|
2614
|
-
const listener = {
|
|
2615
|
-
callback,
|
|
2616
|
-
once
|
|
2617
|
-
};
|
|
2618
|
-
let subscriptionSet = this.#eventSubscriptions.get(eventName);
|
|
2619
|
-
if (subscriptionSet === void 0) {
|
|
2620
|
-
subscriptionSet = /* @__PURE__ */ new Set();
|
|
2621
|
-
this.#eventSubscriptions.set(eventName, subscriptionSet);
|
|
2622
|
-
this.#sendSubscription(eventName, true);
|
|
2623
|
-
}
|
|
2624
|
-
subscriptionSet.add(listener);
|
|
2625
|
-
return () => {
|
|
2626
|
-
const listeners = this.#eventSubscriptions.get(eventName);
|
|
2627
|
-
if (listeners) {
|
|
2628
|
-
listeners.delete(listener);
|
|
2629
|
-
if (listeners.size === 0) {
|
|
2630
|
-
this.#eventSubscriptions.delete(eventName);
|
|
2631
|
-
this.#sendSubscription(eventName, false);
|
|
2632
|
-
}
|
|
2633
|
-
}
|
|
2634
|
-
};
|
|
2635
|
-
}
|
|
2636
|
-
/**
|
|
2637
|
-
* Subscribes to an event that will happen repeatedly.
|
|
2638
|
-
*
|
|
2639
|
-
* @template Args - The type of arguments the event callback will receive.
|
|
2640
|
-
* @param {string} eventName - The name of the event to subscribe to.
|
|
2641
|
-
* @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.
|
|
2642
|
-
* @returns {EventUnsubscribe} - A function to unsubscribe from the event.
|
|
2643
|
-
* @see {@link https://rivet.gg/docs/events|Events Documentation}
|
|
2644
|
-
*/
|
|
2645
|
-
on(eventName, callback) {
|
|
2646
|
-
return this.#addEventSubscription(eventName, callback, false);
|
|
2647
|
-
}
|
|
2648
|
-
/**
|
|
2649
|
-
* Subscribes to an event that will be triggered only once.
|
|
2650
|
-
*
|
|
2651
|
-
* @template Args - The type of arguments the event callback will receive.
|
|
2652
|
-
* @param {string} eventName - The name of the event to subscribe to.
|
|
2653
|
-
* @param {(...args: Args) => void} callback - The callback function to execute when the event is triggered.
|
|
2654
|
-
* @returns {EventUnsubscribe} - A function to unsubscribe from the event.
|
|
2655
|
-
* @see {@link https://rivet.gg/docs/events|Events Documentation}
|
|
2656
|
-
*/
|
|
2657
|
-
once(eventName, callback) {
|
|
2658
|
-
return this.#addEventSubscription(eventName, callback, true);
|
|
2659
|
-
}
|
|
2660
|
-
/**
|
|
2661
|
-
* Subscribes to connection errors.
|
|
2662
|
-
*
|
|
2663
|
-
* @param {ActorErrorCallback} callback - The callback function to execute when a connection error occurs.
|
|
2664
|
-
* @returns {() => void} - A function to unsubscribe from the error handler.
|
|
2665
|
-
*/
|
|
2666
|
-
onError(callback) {
|
|
2667
|
-
this.#errorHandlers.add(callback);
|
|
2668
|
-
return () => {
|
|
2669
|
-
this.#errorHandlers.delete(callback);
|
|
2670
|
-
};
|
|
2671
|
-
}
|
|
2672
|
-
#sendMessage(message, opts) {
|
|
2673
|
-
if (this.#disposed) {
|
|
2674
|
-
throw new ActorConnDisposed();
|
|
2675
|
-
}
|
|
2676
|
-
let queueMessage = false;
|
|
2677
|
-
if (!this.#transport) {
|
|
2678
|
-
queueMessage = true;
|
|
2679
|
-
} else if ("websocket" in this.#transport) {
|
|
2680
|
-
if (this.#transport.websocket.readyState === 1) {
|
|
2681
|
-
try {
|
|
2682
|
-
const messageSerialized = _chunk6WKQDDUDcjs.serializeWithEncoding.call(void 0,
|
|
2683
|
-
this.#encodingKind,
|
|
2684
|
-
message,
|
|
2685
|
-
_chunk6WKQDDUDcjs.TO_SERVER_VERSIONED
|
|
2686
|
-
);
|
|
2687
|
-
this.#transport.websocket.send(messageSerialized);
|
|
2688
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace("sent websocket message", {
|
|
2689
|
-
len: messageLength(messageSerialized)
|
|
2690
|
-
});
|
|
2691
|
-
} catch (error) {
|
|
2692
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("failed to send message, added to queue", {
|
|
2693
|
-
error
|
|
2694
|
-
});
|
|
2695
|
-
queueMessage = true;
|
|
2696
|
-
}
|
|
2697
|
-
} else {
|
|
2698
|
-
queueMessage = true;
|
|
2699
|
-
}
|
|
2700
|
-
} else if ("sse" in this.#transport) {
|
|
2701
|
-
if (this.#transport.sse.readyState === 1) {
|
|
2702
|
-
this.#sendHttpMessage(message, opts);
|
|
2703
|
-
} else {
|
|
2704
|
-
queueMessage = true;
|
|
2705
|
-
}
|
|
2706
|
-
} else {
|
|
2707
|
-
_chunkOGAPU3UGcjs.assertUnreachable.call(void 0, this.#transport);
|
|
2708
|
-
}
|
|
2709
|
-
if (!(opts == null ? void 0 : opts.ephemeral) && queueMessage) {
|
|
2710
|
-
this.#messageQueue.push(message);
|
|
2711
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("queued connection message");
|
|
2712
|
-
}
|
|
2713
|
-
}
|
|
2714
|
-
async #sendHttpMessage(message, opts) {
|
|
2715
|
-
try {
|
|
2716
|
-
if (!this.#actorId || !this.#connectionId || !this.#connectionToken)
|
|
2717
|
-
throw new InternalError2("Missing connection ID or token.");
|
|
2718
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).trace(
|
|
2719
|
-
"sent http message",
|
|
2720
|
-
_chunkOGAPU3UGcjs.getEnvUniversal.call(void 0, "_RIVETKIT_LOG_MESSAGE") ? {
|
|
2721
|
-
message: _chunk6WKQDDUDcjs.jsonStringifyCompat.call(void 0, message).substring(0, 100) + "..."
|
|
2722
|
-
} : {}
|
|
2723
|
-
);
|
|
2724
|
-
await this.#driver.sendHttpMessage(
|
|
2725
|
-
void 0,
|
|
2726
|
-
this.#actorId,
|
|
2727
|
-
this.#encodingKind,
|
|
2728
|
-
this.#connectionId,
|
|
2729
|
-
this.#connectionToken,
|
|
2730
|
-
message,
|
|
2731
|
-
(opts == null ? void 0 : opts.signal) ? { signal: opts.signal } : void 0
|
|
2732
|
-
);
|
|
2733
|
-
} catch (error) {
|
|
2734
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("failed to send message, added to queue", {
|
|
2735
|
-
error
|
|
2736
|
-
});
|
|
2737
|
-
if (!(opts == null ? void 0 : opts.ephemeral)) {
|
|
2738
|
-
this.#messageQueue.unshift(message);
|
|
2739
|
-
}
|
|
2740
|
-
}
|
|
2741
|
-
}
|
|
2742
|
-
async #parseMessage(data) {
|
|
2743
|
-
_invariant2.default.call(void 0, this.#transport, "transport must be defined");
|
|
2744
|
-
if (_chunk6WKQDDUDcjs.encodingIsBinary.call(void 0, this.#encodingKind) && "sse" in this.#transport) {
|
|
2745
|
-
if (typeof data === "string") {
|
|
2746
|
-
const binaryString = atob(data);
|
|
2747
|
-
data = new Uint8Array(
|
|
2748
|
-
[...binaryString].map((char) => char.charCodeAt(0))
|
|
2749
|
-
);
|
|
2750
|
-
} else {
|
|
2751
|
-
throw new InternalError2(
|
|
2752
|
-
`Expected data to be a string for SSE, got ${data}.`
|
|
2753
|
-
);
|
|
2754
|
-
}
|
|
2755
|
-
}
|
|
2756
|
-
const buffer = await _chunk6WKQDDUDcjs.inputDataToBuffer.call(void 0, data);
|
|
2757
|
-
return _chunk6WKQDDUDcjs.deserializeWithEncoding.call(void 0,
|
|
2758
|
-
this.#encodingKind,
|
|
2759
|
-
buffer,
|
|
2760
|
-
_chunk6WKQDDUDcjs.TO_CLIENT_VERSIONED
|
|
2761
|
-
);
|
|
2762
|
-
}
|
|
2763
|
-
/**
|
|
2764
|
-
* Disconnects from the actor.
|
|
2765
|
-
*
|
|
2766
|
-
* @returns {Promise<void>} A promise that resolves when the socket is gracefully closed.
|
|
2767
|
-
*/
|
|
2768
|
-
async dispose() {
|
|
2769
|
-
if (this.#disposed) {
|
|
2770
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).warn("connection already disconnected");
|
|
2771
|
-
return;
|
|
2772
|
-
}
|
|
2773
|
-
this.#disposed = true;
|
|
2774
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("disposing actor conn");
|
|
2775
|
-
clearInterval(this.#keepNodeAliveInterval);
|
|
2776
|
-
this.#abortController.abort();
|
|
2777
|
-
this.#client[ACTOR_CONNS_SYMBOL].delete(this);
|
|
2778
|
-
if (!this.#transport) {
|
|
2779
|
-
} else if ("websocket" in this.#transport) {
|
|
2780
|
-
const ws = this.#transport.websocket;
|
|
2781
|
-
if (ws.readyState === 2 || ws.readyState === 3) {
|
|
2782
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("ws already closed or closing");
|
|
2783
|
-
} else {
|
|
2784
|
-
const { promise, resolve } = Promise.withResolvers();
|
|
2785
|
-
ws.addEventListener("close", () => {
|
|
2786
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("ws closed");
|
|
2787
|
-
resolve(void 0);
|
|
2788
|
-
});
|
|
2789
|
-
ws.close();
|
|
2790
|
-
await promise;
|
|
2791
|
-
}
|
|
2792
|
-
} else if ("sse" in this.#transport) {
|
|
2793
|
-
this.#transport.sse.close();
|
|
2794
|
-
} else {
|
|
2795
|
-
_chunkOGAPU3UGcjs.assertUnreachable.call(void 0, this.#transport);
|
|
2796
|
-
}
|
|
2797
|
-
this.#transport = void 0;
|
|
2798
|
-
}
|
|
2799
|
-
#sendSubscription(eventName, subscribe) {
|
|
2800
|
-
this.#sendMessage(
|
|
2801
|
-
{
|
|
2802
|
-
body: {
|
|
2803
|
-
tag: "SubscriptionRequest",
|
|
2804
|
-
val: {
|
|
2805
|
-
eventName,
|
|
2806
|
-
subscribe
|
|
2807
|
-
}
|
|
2808
|
-
}
|
|
2809
|
-
},
|
|
2810
|
-
{ ephemeral: true }
|
|
2811
|
-
);
|
|
2812
|
-
}
|
|
2813
|
-
};
|
|
2814
|
-
|
|
2815
|
-
// src/common/eventsource.ts
|
|
2816
|
-
var eventSourcePromise = null;
|
|
2817
|
-
async function importEventSource() {
|
|
2818
|
-
if (eventSourcePromise !== null) {
|
|
2819
|
-
return eventSourcePromise;
|
|
2820
|
-
}
|
|
2821
|
-
eventSourcePromise = (async () => {
|
|
2822
|
-
let _EventSource;
|
|
2823
|
-
try {
|
|
2824
|
-
const es = await Promise.resolve().then(() => _interopRequireWildcard(require("eventsource")));
|
|
2825
|
-
_EventSource = es.EventSource;
|
|
2826
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("using eventsource from npm");
|
|
2827
|
-
} catch (err) {
|
|
2828
|
-
_EventSource = class MockEventSource {
|
|
2829
|
-
constructor() {
|
|
2830
|
-
throw new Error(
|
|
2831
|
-
'EventSource support requires installing the "eventsource" peer dependency.'
|
|
2832
|
-
);
|
|
2833
|
-
}
|
|
2834
|
-
};
|
|
2835
|
-
_chunkTZJKSBUQcjs.logger.call(void 0, ).debug("using mock eventsource");
|
|
2836
|
-
}
|
|
2837
|
-
return _EventSource;
|
|
2838
|
-
})();
|
|
2839
|
-
return eventSourcePromise;
|
|
2840
|
-
}
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
exports.createActorInspectorRouter = createActorInspectorRouter; exports.ActorDefinition = ActorDefinition; exports.lookupInRegistry = lookupInRegistry; exports.ActorClientError = ActorClientError; exports.InternalError = InternalError2; exports.ManagerError = ManagerError; exports.MalformedResponseMessage = MalformedResponseMessage; exports.ActorError = ActorError; exports.sendHttpRequest = sendHttpRequest; exports.ActorConnRaw = ActorConnRaw; exports.ActorHandleRaw = ActorHandleRaw; exports.createClientWithDriver = createClientWithDriver; exports.importEventSource = importEventSource;
|
|
2857
|
-
//# sourceMappingURL=chunk-O2MBYIXO.cjs.map
|