rivetkit 2.0.42 → 2.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{tsup/config-CLnylLYY.d.ts → browser/client.d.ts} +2127 -1910
- package/dist/browser/client.js +5182 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/inspector/client.d.ts +130 -0
- package/dist/browser/inspector/client.js +2854 -0
- package/dist/browser/inspector/client.js.map +1 -0
- package/dist/browser/v3-DnYObHH3.d.ts +279 -0
- package/dist/schemas/actor-inspector/v2.ts +796 -0
- package/dist/schemas/actor-inspector/v3.ts +899 -0
- package/dist/schemas/actor-persist/v4.ts +406 -0
- package/dist/schemas/client-protocol/v3.ts +554 -0
- package/dist/schemas/persist/v1.ts +781 -0
- package/dist/schemas/transport/v1.ts +697 -0
- package/dist/tsup/actor/errors.cjs +27 -3
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +37 -1
- package/dist/tsup/actor/errors.d.ts +37 -1
- package/dist/tsup/actor/errors.js +26 -1
- package/dist/tsup/{actor-router-consts-DzI2szci.d.cts → actor-router-consts-D29T1Z-K.d.cts} +1 -1
- package/dist/tsup/{actor-router-consts-DzI2szci.d.ts → actor-router-consts-D29T1Z-K.d.ts} +1 -1
- package/dist/tsup/chunk-424PT5DM.js +23 -0
- package/dist/tsup/chunk-424PT5DM.js.map +1 -0
- package/dist/tsup/{chunk-JDAD2YFA.js → chunk-5ESWDTHJ.js} +148 -273
- package/dist/tsup/chunk-5ESWDTHJ.js.map +1 -0
- package/dist/tsup/{chunk-FJ3KTN4V.js → chunk-6LIBPELE.js} +119 -11
- package/dist/tsup/chunk-6LIBPELE.js.map +1 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs +96 -0
- package/dist/tsup/chunk-6LJAZ5R4.cjs.map +1 -0
- package/dist/tsup/{chunk-LFVF5SCU.js → chunk-7HTNH26M.js} +126 -1
- package/dist/tsup/chunk-7HTNH26M.js.map +1 -0
- package/dist/tsup/chunk-7K4CYDGD.js +630 -0
- package/dist/tsup/chunk-7K4CYDGD.js.map +1 -0
- package/dist/tsup/{chunk-XXGJCOL6.js → chunk-A6YIZWTK.js} +2 -2
- package/dist/tsup/chunk-AIYEYMX5.cjs +630 -0
- package/dist/tsup/chunk-AIYEYMX5.cjs.map +1 -0
- package/dist/tsup/{chunk-Q6W7RJJP.js → chunk-DIGBC2VI.js} +211 -2316
- package/dist/tsup/chunk-DIGBC2VI.js.map +1 -0
- package/dist/tsup/{chunk-RZW2DNND.cjs → chunk-F6JYU5IK.cjs} +1957 -1039
- package/dist/tsup/chunk-F6JYU5IK.cjs.map +1 -0
- package/dist/tsup/chunk-HAZL2EPK.cjs +534 -0
- package/dist/tsup/chunk-HAZL2EPK.cjs.map +1 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs +23 -0
- package/dist/tsup/chunk-HDQ2JUQT.cjs.map +1 -0
- package/dist/tsup/chunk-HIDX4C5Y.cjs +1036 -0
- package/dist/tsup/chunk-HIDX4C5Y.cjs.map +1 -0
- package/dist/tsup/chunk-IVG73YCW.js +534 -0
- package/dist/tsup/chunk-IVG73YCW.js.map +1 -0
- package/dist/tsup/chunk-KJSYAUOM.js +96 -0
- package/dist/tsup/chunk-KJSYAUOM.js.map +1 -0
- package/dist/tsup/{chunk-2XQS746M.cjs → chunk-L47L3ZWJ.cjs} +127 -2
- package/dist/tsup/chunk-L47L3ZWJ.cjs.map +1 -0
- package/dist/tsup/{chunk-H4TB4X25.cjs → chunk-LW6KLR7A.cjs} +126 -18
- package/dist/tsup/chunk-LW6KLR7A.cjs.map +1 -0
- package/dist/tsup/chunk-LXUQ667X.js +2006 -0
- package/dist/tsup/chunk-LXUQ667X.js.map +1 -0
- package/dist/tsup/{chunk-GMAVRZSF.js → chunk-M2T62AZQ.js} +1790 -872
- package/dist/tsup/chunk-M2T62AZQ.js.map +1 -0
- package/dist/tsup/chunk-MZ37VV3P.js +5974 -0
- package/dist/tsup/chunk-MZ37VV3P.js.map +1 -0
- package/dist/tsup/chunk-N4KRDJ56.js +72 -0
- package/dist/tsup/chunk-N4KRDJ56.js.map +1 -0
- package/dist/tsup/chunk-NIYZDWMW.cjs +2006 -0
- package/dist/tsup/chunk-NIYZDWMW.cjs.map +1 -0
- package/dist/tsup/chunk-OMEPCQK2.js +649 -0
- package/dist/tsup/chunk-OMEPCQK2.js.map +1 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs +72 -0
- package/dist/tsup/chunk-SR3KQE7Q.cjs.map +1 -0
- package/dist/tsup/chunk-SSEP6DHP.cjs +2657 -0
- package/dist/tsup/chunk-SSEP6DHP.cjs.map +1 -0
- package/dist/tsup/chunk-T5YCUGVS.js +1036 -0
- package/dist/tsup/chunk-T5YCUGVS.js.map +1 -0
- package/dist/tsup/{chunk-EJVBH5VF.cjs → chunk-TPGXWFQT.cjs} +3 -3
- package/dist/tsup/{chunk-EJVBH5VF.cjs.map → chunk-TPGXWFQT.cjs.map} +1 -1
- package/dist/tsup/{chunk-X35U3YNX.cjs → chunk-TYLXNCA5.cjs} +214 -339
- package/dist/tsup/chunk-TYLXNCA5.cjs.map +1 -0
- package/dist/tsup/chunk-VKVNIQRQ.js +257 -0
- package/dist/tsup/chunk-VKVNIQRQ.js.map +1 -0
- package/dist/tsup/chunk-XWBAQO5H.cjs +649 -0
- package/dist/tsup/chunk-XWBAQO5H.cjs.map +1 -0
- package/dist/tsup/chunk-YQ4LDVD6.cjs +5974 -0
- package/dist/tsup/chunk-YQ4LDVD6.cjs.map +1 -0
- package/dist/tsup/chunk-ZFY5J2EP.cjs +257 -0
- package/dist/tsup/chunk-ZFY5J2EP.cjs.map +1 -0
- package/dist/tsup/client/mod.cjs +9 -10
- package/dist/tsup/client/mod.cjs.map +1 -1
- package/dist/tsup/client/mod.d.cts +11 -5
- package/dist/tsup/client/mod.d.ts +11 -5
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +4 -4
- package/dist/tsup/common/log.d.cts +2 -2
- package/dist/tsup/common/log.d.ts +2 -2
- package/dist/tsup/common/log.js +3 -2
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -3
- package/dist/tsup/config-BFqid9Gr.d.ts +2574 -0
- package/dist/tsup/config-BiNoIHRs.d.cts +80 -0
- package/dist/tsup/config-BiNoIHRs.d.ts +80 -0
- package/dist/tsup/{config-CZB2-W8x.d.cts → config-CAZphOS1.d.cts} +681 -355
- package/dist/tsup/db/drizzle/mod.cjs +49 -0
- package/dist/tsup/db/drizzle/mod.cjs.map +1 -0
- package/dist/tsup/db/drizzle/mod.d.cts +17 -0
- package/dist/tsup/db/drizzle/mod.d.ts +17 -0
- package/dist/tsup/db/drizzle/mod.js +49 -0
- package/dist/tsup/db/drizzle/mod.js.map +1 -0
- package/dist/tsup/db/mod.cjs +9 -0
- package/dist/tsup/db/mod.cjs.map +1 -0
- package/dist/tsup/db/mod.d.cts +9 -0
- package/dist/tsup/db/mod.d.ts +9 -0
- package/dist/tsup/db/mod.js +9 -0
- package/dist/tsup/db/mod.js.map +1 -0
- package/dist/tsup/{driver-D0QX9M11.d.ts → driver-Bxv62E2p.d.ts} +2 -2
- package/dist/tsup/{driver-q-zqG7fc.d.cts → driver-DYXwJR5D.d.cts} +2 -2
- package/dist/tsup/driver-helpers/mod.cjs +12 -6
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +12 -5
- package/dist/tsup/driver-helpers/mod.d.ts +12 -5
- package/dist/tsup/driver-helpers/mod.js +12 -5
- package/dist/tsup/driver-test-suite/mod.cjs +1370 -116
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +10 -4
- package/dist/tsup/driver-test-suite/mod.d.ts +10 -4
- package/dist/tsup/driver-test-suite/mod.js +2093 -838
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +29 -3
- package/dist/tsup/inspector/mod.cjs.map +1 -1
- package/dist/tsup/inspector/mod.d.cts +124 -3
- package/dist/tsup/inspector/mod.d.ts +124 -3
- package/dist/tsup/inspector/mod.js +72 -45
- package/dist/tsup/keys-CydblqMh.d.cts +13 -0
- package/dist/tsup/keys-CydblqMh.d.ts +13 -0
- package/dist/tsup/mod.cjs +16 -10
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +26 -14
- package/dist/tsup/mod.d.ts +26 -14
- package/dist/tsup/mod.js +20 -13
- package/dist/tsup/serve-test-suite/mod.cjs +1165 -83
- package/dist/tsup/serve-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/serve-test-suite/mod.js +1114 -29
- package/dist/tsup/serve-test-suite/mod.js.map +1 -1
- package/dist/tsup/test/mod.cjs +84 -11
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +10 -5
- package/dist/tsup/test/mod.d.ts +10 -5
- package/dist/tsup/test/mod.js +85 -11
- package/dist/tsup/test/mod.js.map +1 -1
- package/dist/tsup/utils.cjs +10 -4
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +72 -2
- package/dist/tsup/utils.d.ts +72 -2
- package/dist/tsup/utils.js +9 -2
- package/dist/tsup/v3-DnYObHH3.d.cts +279 -0
- package/dist/tsup/v3-DnYObHH3.d.ts +279 -0
- package/dist/tsup/workflow/mod.cjs +16 -0
- package/dist/tsup/workflow/mod.cjs.map +1 -0
- package/dist/tsup/workflow/mod.d.cts +83 -0
- package/dist/tsup/workflow/mod.d.ts +83 -0
- package/dist/tsup/workflow/mod.js +16 -0
- package/dist/tsup/workflow/mod.js.map +1 -0
- package/package.json +62 -5
- package/src/actor/config.ts +478 -68
- package/src/actor/conn/mod.ts +68 -16
- package/src/actor/conn/state-manager.ts +2 -2
- package/src/actor/contexts/action.ts +20 -12
- package/src/actor/contexts/base/actor.ts +137 -7
- package/src/actor/contexts/base/conn-init.ts +27 -7
- package/src/actor/contexts/base/conn.ts +27 -18
- package/src/actor/contexts/before-action-response.ts +9 -2
- package/src/actor/contexts/before-connect.ts +7 -2
- package/src/actor/contexts/connect.ts +9 -2
- package/src/actor/contexts/create-conn-state.ts +7 -2
- package/src/actor/contexts/create-vars.ts +16 -3
- package/src/actor/contexts/create.ts +16 -3
- package/src/actor/contexts/destroy.ts +9 -3
- package/src/actor/contexts/disconnect.ts +10 -4
- package/src/actor/contexts/index.ts +4 -3
- package/src/actor/contexts/request.ts +23 -6
- package/src/actor/contexts/run.ts +47 -0
- package/src/actor/contexts/sleep.ts +9 -3
- package/src/actor/contexts/state-change.ts +9 -3
- package/src/actor/contexts/wake.ts +9 -3
- package/src/actor/contexts/websocket.ts +23 -6
- package/src/actor/database.ts +8 -18
- package/src/actor/definition.ts +20 -6
- package/src/actor/driver.ts +32 -3
- package/src/actor/errors.ts +127 -0
- package/src/actor/instance/connection-manager.ts +183 -80
- package/src/actor/instance/event-manager.ts +26 -15
- package/src/actor/instance/keys.ts +117 -0
- package/src/actor/instance/mod.ts +784 -174
- package/src/actor/instance/queue-manager.ts +603 -0
- package/src/actor/instance/queue.ts +287 -0
- package/src/actor/instance/schedule-manager.ts +49 -7
- package/src/actor/instance/state-manager.ts +35 -11
- package/src/actor/instance/traces-driver.ts +128 -0
- package/src/actor/mod.ts +26 -2
- package/src/actor/protocol/old.ts +28 -13
- package/src/actor/protocol/serde.ts +1 -1
- package/src/actor/router-endpoints.ts +177 -21
- package/src/actor/router-websocket-endpoints.ts +18 -29
- package/src/actor/router.ts +177 -0
- package/src/actor/schema.ts +291 -0
- package/src/actor/utils.ts +40 -0
- package/src/client/actor-common.ts +1 -1
- package/src/client/actor-conn.ts +100 -33
- package/src/client/actor-handle.ts +61 -33
- package/src/client/client.ts +2 -4
- package/src/client/config.ts +1 -1
- package/src/client/mod.browser.ts +2 -0
- package/src/client/mod.ts +1 -4
- package/src/client/queue.ts +146 -0
- package/src/client/utils.ts +1 -1
- package/src/common/log.ts +1 -1
- package/src/common/utils.ts +3 -3
- package/src/db/config.ts +100 -0
- package/src/db/drizzle/mod.ts +226 -0
- package/src/db/drizzle/sqlite-core.ts +22 -0
- package/src/db/mod.ts +125 -0
- package/src/db/shared.ts +92 -0
- package/src/db/sqlite-vfs.ts +12 -0
- package/src/driver-helpers/mod.ts +1 -0
- package/src/driver-test-suite/mod.ts +69 -43
- package/src/driver-test-suite/tests/access-control.ts +218 -0
- package/src/driver-test-suite/tests/actor-db-raw.ts +73 -0
- package/src/driver-test-suite/tests/actor-db.ts +394 -0
- package/src/driver-test-suite/tests/actor-inspector.ts +259 -358
- package/src/driver-test-suite/tests/actor-kv.ts +41 -20
- package/src/driver-test-suite/tests/actor-queue.ts +324 -0
- package/src/driver-test-suite/tests/actor-run.ts +181 -0
- package/src/driver-test-suite/tests/actor-schedule.ts +5 -2
- package/src/driver-test-suite/tests/actor-sleep.ts +3 -3
- package/src/driver-test-suite/tests/actor-stateless.ts +70 -0
- package/src/driver-test-suite/tests/actor-workflow.ts +108 -0
- package/src/driver-test-suite/tests/manager-driver.ts +11 -0
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +1 -1
- package/src/driver-test-suite/tests/raw-websocket.ts +12 -12
- package/src/drivers/default.ts +7 -2
- package/src/drivers/engine/actor-driver.ts +45 -37
- package/src/drivers/engine/config.ts +1 -1
- package/src/drivers/file-system/actor.ts +20 -2
- package/src/drivers/file-system/global-state.ts +569 -258
- package/src/drivers/file-system/kv-limits.ts +70 -0
- package/src/drivers/file-system/manager.ts +22 -6
- package/src/drivers/file-system/mod.ts +39 -16
- package/src/drivers/file-system/sqlite-runtime.ts +210 -0
- package/src/inspector/actor-inspector.ts +224 -102
- package/src/inspector/config.ts +1 -1
- package/src/inspector/handler.ts +102 -20
- package/src/inspector/mod.browser.ts +8 -0
- package/src/inspector/mod.ts +2 -0
- package/src/inspector/serve-ui.ts +40 -0
- package/src/inspector/transport.ts +18 -0
- package/src/inspector/utils.ts +5 -39
- package/src/manager/gateway.ts +1 -1
- package/src/manager/protocol/mod.ts +1 -1
- package/src/manager/protocol/query.ts +1 -1
- package/src/manager/router-schema.ts +1 -1
- package/src/manager/router.ts +38 -12
- package/src/manager-api/actors.ts +1 -1
- package/src/manager-api/common.ts +1 -1
- package/src/registry/config/driver.ts +1 -1
- package/src/registry/config/index.ts +212 -43
- package/src/registry/config/legacy-runner.ts +1 -1
- package/src/registry/config/runner.ts +1 -1
- package/src/registry/config/serverless.ts +1 -1
- package/src/registry/index.ts +7 -5
- package/src/remote-manager-driver/api-utils.ts +1 -1
- package/src/schemas/actor-inspector/mod.ts +1 -1
- package/src/schemas/actor-inspector/versioned.ts +195 -8
- package/src/schemas/actor-persist/versioned.ts +87 -7
- package/src/schemas/client-protocol/mod.ts +1 -1
- package/src/schemas/client-protocol/versioned.ts +127 -11
- package/src/schemas/client-protocol-zod/mod.ts +16 -1
- package/src/schemas/persist/mod.ts +1 -0
- package/src/schemas/transport/mod.ts +1 -0
- package/src/serde.ts +1 -1
- package/src/serve-test-suite/mod.ts +10 -9
- package/src/test/mod.ts +15 -56
- package/src/utils/endpoint-parser.test.ts +1 -1
- package/src/utils/endpoint-parser.ts +1 -1
- package/src/utils/env-vars.ts +12 -1
- package/src/utils/node.ts +15 -2
- package/src/utils.test.ts +34 -0
- package/src/utils.ts +140 -6
- package/src/workflow/constants.ts +2 -0
- package/src/workflow/context.ts +532 -0
- package/src/workflow/driver.ts +191 -0
- package/src/workflow/inspector.ts +268 -0
- package/src/workflow/mod.ts +122 -0
- package/dist/tsup/chunk-2IJTYN6K.cjs +0 -278
- package/dist/tsup/chunk-2IJTYN6K.cjs.map +0 -1
- package/dist/tsup/chunk-2XQS746M.cjs.map +0 -1
- package/dist/tsup/chunk-3VP5CSHV.cjs +0 -114
- package/dist/tsup/chunk-3VP5CSHV.cjs.map +0 -1
- package/dist/tsup/chunk-AQFSQMBG.js +0 -114
- package/dist/tsup/chunk-AQFSQMBG.js.map +0 -1
- package/dist/tsup/chunk-E6ZE2YEA.js +0 -664
- package/dist/tsup/chunk-E6ZE2YEA.js.map +0 -1
- package/dist/tsup/chunk-FJ3KTN4V.js.map +0 -1
- package/dist/tsup/chunk-GBENOENJ.cjs +0 -8
- package/dist/tsup/chunk-GBENOENJ.cjs.map +0 -1
- package/dist/tsup/chunk-GD7UXGOE.cjs +0 -4762
- package/dist/tsup/chunk-GD7UXGOE.cjs.map +0 -1
- package/dist/tsup/chunk-GMAVRZSF.js.map +0 -1
- package/dist/tsup/chunk-H4TB4X25.cjs.map +0 -1
- package/dist/tsup/chunk-JDAD2YFA.js.map +0 -1
- package/dist/tsup/chunk-KCOVZOPS.js +0 -1946
- package/dist/tsup/chunk-KCOVZOPS.js.map +0 -1
- package/dist/tsup/chunk-KDFWJKMJ.cjs +0 -664
- package/dist/tsup/chunk-KDFWJKMJ.cjs.map +0 -1
- package/dist/tsup/chunk-LFVF5SCU.js.map +0 -1
- package/dist/tsup/chunk-Q6W7RJJP.js.map +0 -1
- package/dist/tsup/chunk-RUW5CZ5Z.cjs +0 -1949
- package/dist/tsup/chunk-RUW5CZ5Z.cjs.map +0 -1
- package/dist/tsup/chunk-RZW2DNND.cjs.map +0 -1
- package/dist/tsup/chunk-TCOEBUUE.js +0 -278
- package/dist/tsup/chunk-TCOEBUUE.js.map +0 -1
- package/dist/tsup/chunk-X35U3YNX.cjs.map +0 -1
- package/dist/tsup/keys-Chhy4ylv.d.cts +0 -8
- package/dist/tsup/keys-Chhy4ylv.d.ts +0 -8
- package/dist/tsup/v1-Gq4avTK3.d.cts +0 -240
- package/dist/tsup/v1-Gq4avTK3.d.ts +0 -240
- /package/dist/tsup/{chunk-XXGJCOL6.js.map → chunk-A6YIZWTK.js.map} +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import * as errors from "../errors";
|
|
2
|
+
import type { AnyDatabaseProvider } from "../database";
|
|
3
|
+
import type {
|
|
4
|
+
EventSchemaConfig,
|
|
5
|
+
InferQueueCompleteMap,
|
|
6
|
+
InferSchemaMap,
|
|
7
|
+
QueueSchemaConfig,
|
|
8
|
+
} from "../schema";
|
|
9
|
+
import { joinAbortSignals } from "../utils";
|
|
10
|
+
import type { QueueManager, QueueMessage } from "./queue-manager";
|
|
11
|
+
|
|
12
|
+
export type QueueMessageOf<Name extends string, Body> = Omit<
|
|
13
|
+
QueueMessage,
|
|
14
|
+
"name" | "body"
|
|
15
|
+
> & {
|
|
16
|
+
name: Name;
|
|
17
|
+
body: Body;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type QueueName<TQueues extends QueueSchemaConfig> = keyof TQueues & string;
|
|
21
|
+
export type QueueFilterName<TQueues extends QueueSchemaConfig> =
|
|
22
|
+
keyof TQueues extends never ? string : QueueName<TQueues>;
|
|
23
|
+
|
|
24
|
+
type QueueMessageForName<
|
|
25
|
+
TQueues extends QueueSchemaConfig,
|
|
26
|
+
TName extends QueueFilterName<TQueues>,
|
|
27
|
+
> = keyof TQueues extends never
|
|
28
|
+
? QueueMessage
|
|
29
|
+
: TName extends QueueName<TQueues>
|
|
30
|
+
? QueueMessageOf<TName, InferSchemaMap<TQueues>[TName]>
|
|
31
|
+
: never;
|
|
32
|
+
|
|
33
|
+
type QueueCompleteArgs<T> = undefined extends T
|
|
34
|
+
? [response?: T]
|
|
35
|
+
: [response: T];
|
|
36
|
+
|
|
37
|
+
type QueueCompleteArgsForName<
|
|
38
|
+
TQueues extends QueueSchemaConfig,
|
|
39
|
+
TName extends QueueFilterName<TQueues>,
|
|
40
|
+
> = keyof TQueues extends never
|
|
41
|
+
? [response?: unknown]
|
|
42
|
+
: TName extends QueueName<TQueues>
|
|
43
|
+
? [InferQueueCompleteMap<TQueues>[TName]] extends [never]
|
|
44
|
+
? [response?: unknown]
|
|
45
|
+
: QueueCompleteArgs<InferQueueCompleteMap<TQueues>[TName]>
|
|
46
|
+
: [response?: unknown];
|
|
47
|
+
|
|
48
|
+
type QueueCompletableMessageForName<
|
|
49
|
+
TQueues extends QueueSchemaConfig,
|
|
50
|
+
TName extends QueueFilterName<TQueues>,
|
|
51
|
+
> = QueueMessageForName<TQueues, TName> & {
|
|
52
|
+
complete(
|
|
53
|
+
...args: QueueCompleteArgsForName<TQueues, TName>
|
|
54
|
+
): Promise<void>;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export type QueueResultMessageForName<
|
|
58
|
+
TQueues extends QueueSchemaConfig,
|
|
59
|
+
TName extends QueueFilterName<TQueues>,
|
|
60
|
+
TCompletable extends boolean,
|
|
61
|
+
> = TCompletable extends true
|
|
62
|
+
? QueueCompletableMessageForName<TQueues, TName>
|
|
63
|
+
: QueueMessageForName<TQueues, TName>;
|
|
64
|
+
|
|
65
|
+
/** Options for receiving queue messages. */
|
|
66
|
+
export interface QueueNextOptions<
|
|
67
|
+
TName extends string = string,
|
|
68
|
+
TCompletable extends boolean = boolean,
|
|
69
|
+
> {
|
|
70
|
+
/** Queue names to receive from. If omitted, reads from all queue names. */
|
|
71
|
+
names?: readonly TName[];
|
|
72
|
+
/** Maximum number of messages to receive. Defaults to 1. */
|
|
73
|
+
count?: number;
|
|
74
|
+
/** Timeout in milliseconds. Omit to wait indefinitely. */
|
|
75
|
+
timeout?: number;
|
|
76
|
+
/** Optional abort signal for this receive call. */
|
|
77
|
+
signal?: AbortSignal;
|
|
78
|
+
/** Whether to return completable messages. */
|
|
79
|
+
completable?: TCompletable;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Options for non-blocking queue reads. */
|
|
83
|
+
export interface QueueTryNextOptions<
|
|
84
|
+
TName extends string = string,
|
|
85
|
+
TCompletable extends boolean = boolean,
|
|
86
|
+
> {
|
|
87
|
+
/** Queue names to receive from. If omitted, reads from all queue names. */
|
|
88
|
+
names?: readonly TName[];
|
|
89
|
+
/** Maximum number of messages to receive. Defaults to 1. */
|
|
90
|
+
count?: number;
|
|
91
|
+
/** Whether to return completable messages. */
|
|
92
|
+
completable?: TCompletable;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Options for queue async iteration. */
|
|
96
|
+
export interface QueueIterOptions<
|
|
97
|
+
TName extends string = string,
|
|
98
|
+
TCompletable extends boolean = boolean,
|
|
99
|
+
> {
|
|
100
|
+
/** Queue names to receive from. If omitted, reads from all queue names. */
|
|
101
|
+
names?: readonly TName[];
|
|
102
|
+
/** Optional abort signal for this iterator. */
|
|
103
|
+
signal?: AbortSignal;
|
|
104
|
+
/** Whether to return completable messages. */
|
|
105
|
+
completable?: TCompletable;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** User-facing queue interface exposed on ActorContext. */
|
|
109
|
+
export class ActorQueue<
|
|
110
|
+
S,
|
|
111
|
+
CP,
|
|
112
|
+
CS,
|
|
113
|
+
V,
|
|
114
|
+
I,
|
|
115
|
+
DB extends AnyDatabaseProvider,
|
|
116
|
+
TEvents extends EventSchemaConfig = Record<never, never>,
|
|
117
|
+
TQueues extends QueueSchemaConfig = Record<never, never>,
|
|
118
|
+
> {
|
|
119
|
+
#queueManager: QueueManager<S, CP, CS, V, I, DB, TEvents, TQueues>;
|
|
120
|
+
#abortSignal: AbortSignal;
|
|
121
|
+
#pendingCompletableMessageIds = new Set<string>();
|
|
122
|
+
|
|
123
|
+
constructor(
|
|
124
|
+
queueManager: QueueManager<S, CP, CS, V, I, DB, TEvents, TQueues>,
|
|
125
|
+
abortSignal: AbortSignal,
|
|
126
|
+
) {
|
|
127
|
+
this.#queueManager = queueManager;
|
|
128
|
+
this.#abortSignal = abortSignal;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async next<
|
|
132
|
+
const TName extends QueueFilterName<TQueues>,
|
|
133
|
+
const TCompletable extends boolean = false,
|
|
134
|
+
>(
|
|
135
|
+
opts?: QueueNextOptions<TName, TCompletable>,
|
|
136
|
+
): Promise<Array<QueueResultMessageForName<TQueues, TName, TCompletable>>> {
|
|
137
|
+
const resolvedOpts = (opts ?? {}) as QueueNextOptions<
|
|
138
|
+
TName,
|
|
139
|
+
TCompletable
|
|
140
|
+
>;
|
|
141
|
+
const completable = resolvedOpts.completable === true;
|
|
142
|
+
|
|
143
|
+
if (this.#pendingCompletableMessageIds.size > 0) {
|
|
144
|
+
throw new errors.QueuePreviousMessageNotCompleted();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const names = this.#normalizeNames(resolvedOpts.names);
|
|
148
|
+
const count = Math.max(1, resolvedOpts.count ?? 1);
|
|
149
|
+
const { signal, cleanup } = joinAbortSignals(
|
|
150
|
+
this.#abortSignal,
|
|
151
|
+
resolvedOpts.signal,
|
|
152
|
+
);
|
|
153
|
+
const messages = await this.#queueManager
|
|
154
|
+
.receive(
|
|
155
|
+
names,
|
|
156
|
+
count,
|
|
157
|
+
resolvedOpts.timeout,
|
|
158
|
+
signal,
|
|
159
|
+
completable,
|
|
160
|
+
)
|
|
161
|
+
.finally(cleanup);
|
|
162
|
+
if (!completable) {
|
|
163
|
+
return messages as Array<
|
|
164
|
+
QueueResultMessageForName<TQueues, TName, TCompletable>
|
|
165
|
+
>;
|
|
166
|
+
}
|
|
167
|
+
return messages.map((message) => this.#makeCompletableMessage(message)) as unknown as Array<
|
|
168
|
+
QueueResultMessageForName<TQueues, TName, TCompletable>
|
|
169
|
+
>;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async tryNext<
|
|
173
|
+
const TName extends QueueFilterName<TQueues>,
|
|
174
|
+
const TCompletable extends boolean = false,
|
|
175
|
+
>(
|
|
176
|
+
opts?: QueueTryNextOptions<TName, TCompletable>,
|
|
177
|
+
): Promise<Array<QueueResultMessageForName<TQueues, TName, TCompletable>>> {
|
|
178
|
+
const resolvedOpts = (opts ?? {}) as QueueTryNextOptions<
|
|
179
|
+
TName,
|
|
180
|
+
TCompletable
|
|
181
|
+
>;
|
|
182
|
+
if (resolvedOpts.completable === true) {
|
|
183
|
+
return (await this.next<TName, true>({
|
|
184
|
+
names: resolvedOpts.names,
|
|
185
|
+
count: resolvedOpts.count,
|
|
186
|
+
timeout: 0,
|
|
187
|
+
completable: true,
|
|
188
|
+
})) as Array<QueueResultMessageForName<TQueues, TName, TCompletable>>;
|
|
189
|
+
}
|
|
190
|
+
return (await this.next<TName, false>({
|
|
191
|
+
names: resolvedOpts.names,
|
|
192
|
+
count: resolvedOpts.count,
|
|
193
|
+
timeout: 0,
|
|
194
|
+
})) as Array<QueueResultMessageForName<TQueues, TName, TCompletable>>;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async *iter<
|
|
198
|
+
const TName extends QueueFilterName<TQueues>,
|
|
199
|
+
const TCompletable extends boolean = false,
|
|
200
|
+
>(
|
|
201
|
+
opts?: QueueIterOptions<TName, TCompletable>,
|
|
202
|
+
): AsyncIterableIterator<
|
|
203
|
+
QueueResultMessageForName<TQueues, TName, TCompletable>
|
|
204
|
+
> {
|
|
205
|
+
const resolvedOpts = (opts ?? {}) as QueueIterOptions<
|
|
206
|
+
TName,
|
|
207
|
+
TCompletable
|
|
208
|
+
>;
|
|
209
|
+
while (!this.#abortSignal.aborted) {
|
|
210
|
+
try {
|
|
211
|
+
const messages = resolvedOpts.completable === true
|
|
212
|
+
? await this.next<TName, true>({
|
|
213
|
+
names: resolvedOpts.names,
|
|
214
|
+
count: 1,
|
|
215
|
+
signal: resolvedOpts.signal,
|
|
216
|
+
completable: true,
|
|
217
|
+
})
|
|
218
|
+
: await this.next<TName, false>({
|
|
219
|
+
names: resolvedOpts.names,
|
|
220
|
+
count: 1,
|
|
221
|
+
signal: resolvedOpts.signal,
|
|
222
|
+
});
|
|
223
|
+
if (messages.length === 0) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
yield messages[0] as QueueResultMessageForName<
|
|
227
|
+
TQueues,
|
|
228
|
+
TName,
|
|
229
|
+
TCompletable
|
|
230
|
+
>;
|
|
231
|
+
} catch (error) {
|
|
232
|
+
if (error instanceof errors.ActorAborted) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Sends a message to the specified queue. */
|
|
241
|
+
send<K extends keyof TQueues & string>(
|
|
242
|
+
name: K,
|
|
243
|
+
body: InferSchemaMap<TQueues>[K],
|
|
244
|
+
): Promise<QueueMessage>;
|
|
245
|
+
send(
|
|
246
|
+
name: keyof TQueues extends never ? string : never,
|
|
247
|
+
body: unknown,
|
|
248
|
+
): Promise<QueueMessage>;
|
|
249
|
+
async send(name: string, body: unknown): Promise<QueueMessage> {
|
|
250
|
+
return await this.#queueManager.enqueue(name, body);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
#normalizeNames(names: readonly string[] | undefined): string[] | undefined {
|
|
254
|
+
if (!names || names.length === 0) {
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
return [...new Set(names)];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
#makeCompletableMessage(
|
|
261
|
+
message: QueueMessage,
|
|
262
|
+
): QueueMessage & {
|
|
263
|
+
complete: (response?: unknown) => Promise<void>;
|
|
264
|
+
} {
|
|
265
|
+
const messageId = message.id.toString();
|
|
266
|
+
this.#pendingCompletableMessageIds.add(messageId);
|
|
267
|
+
|
|
268
|
+
let completed = false;
|
|
269
|
+
const completableMessage = {
|
|
270
|
+
...message,
|
|
271
|
+
complete: async (response?: unknown) => {
|
|
272
|
+
if (completed) {
|
|
273
|
+
throw new errors.QueueAlreadyCompleted();
|
|
274
|
+
}
|
|
275
|
+
completed = true;
|
|
276
|
+
try {
|
|
277
|
+
await this.#queueManager.completeMessage(message, response);
|
|
278
|
+
this.#pendingCompletableMessageIds.delete(messageId);
|
|
279
|
+
} catch (error) {
|
|
280
|
+
completed = false;
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
return completableMessage;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
} from "@/utils";
|
|
7
7
|
import type { AnyDatabaseProvider } from "../database";
|
|
8
8
|
import type { ActorDriver } from "../driver";
|
|
9
|
+
import type { EventSchemaConfig, QueueSchemaConfig } from "../schema";
|
|
9
10
|
import type { ActorInstance } from "./mod";
|
|
10
11
|
import type { PersistedScheduleEvent } from "./persisted";
|
|
11
12
|
|
|
@@ -13,15 +14,24 @@ import type { PersistedScheduleEvent } from "./persisted";
|
|
|
13
14
|
* Manages scheduled events and alarms for actor instances.
|
|
14
15
|
* Handles event scheduling, alarm triggers, and automatic event execution.
|
|
15
16
|
*/
|
|
16
|
-
export class ScheduleManager<
|
|
17
|
-
|
|
17
|
+
export class ScheduleManager<
|
|
18
|
+
S,
|
|
19
|
+
CP,
|
|
20
|
+
CS,
|
|
21
|
+
V,
|
|
22
|
+
I,
|
|
23
|
+
DB extends AnyDatabaseProvider,
|
|
24
|
+
E extends EventSchemaConfig = Record<never, never>,
|
|
25
|
+
Q extends QueueSchemaConfig = Record<never, never>,
|
|
26
|
+
> {
|
|
27
|
+
#actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>;
|
|
18
28
|
#actorDriver: ActorDriver;
|
|
19
29
|
#alarmWriteQueue = new SinglePromiseQueue();
|
|
20
30
|
#config: any; // ActorConfig type
|
|
21
31
|
#persist: any; // Reference to PersistedActor
|
|
22
32
|
|
|
23
33
|
constructor(
|
|
24
|
-
actor: ActorInstance<S, CP, CS, V, I, DB>,
|
|
34
|
+
actor: ActorInstance<S, CP, CS, V, I, DB, E, Q>,
|
|
25
35
|
actorDriver: ActorDriver,
|
|
26
36
|
config: any,
|
|
27
37
|
) {
|
|
@@ -59,6 +69,12 @@ export class ScheduleManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
|
|
|
59
69
|
args: bufferToArrayBuffer(cbor.encode(args)),
|
|
60
70
|
};
|
|
61
71
|
|
|
72
|
+
this.#actor.emitTraceEvent("schedule.created", {
|
|
73
|
+
"rivet.schedule.event_id": newEvent.eventId,
|
|
74
|
+
"rivet.schedule.action": newEvent.action,
|
|
75
|
+
"rivet.schedule.timestamp_ms": newEvent.timestamp,
|
|
76
|
+
});
|
|
77
|
+
|
|
62
78
|
await this.#scheduleEventInner(newEvent);
|
|
63
79
|
}
|
|
64
80
|
|
|
@@ -252,7 +268,25 @@ export class ScheduleManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
|
|
|
252
268
|
|
|
253
269
|
async #executeDueEvents(events: PersistedScheduleEvent[]): Promise<void> {
|
|
254
270
|
for (const event of events) {
|
|
271
|
+
const span = this.#actor.startTraceSpan(
|
|
272
|
+
`actor.action.${event.action}`,
|
|
273
|
+
{
|
|
274
|
+
"rivet.action.name": event.action,
|
|
275
|
+
"rivet.action.scheduled": true,
|
|
276
|
+
"rivet.schedule.event_id": event.eventId,
|
|
277
|
+
"rivet.schedule.timestamp_ms": event.timestamp,
|
|
278
|
+
},
|
|
279
|
+
);
|
|
255
280
|
try {
|
|
281
|
+
this.#actor.emitTraceEvent(
|
|
282
|
+
"schedule.triggered",
|
|
283
|
+
{
|
|
284
|
+
"rivet.schedule.event_id": event.eventId,
|
|
285
|
+
"rivet.schedule.action": event.action,
|
|
286
|
+
"rivet.schedule.timestamp_ms": event.timestamp,
|
|
287
|
+
},
|
|
288
|
+
span,
|
|
289
|
+
);
|
|
256
290
|
this.#actor.log.info({
|
|
257
291
|
msg: "executing scheduled event",
|
|
258
292
|
eventId: event.eventId,
|
|
@@ -281,10 +315,8 @@ export class ScheduleManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
|
|
|
281
315
|
? cbor.decode(new Uint8Array(event.args))
|
|
282
316
|
: [];
|
|
283
317
|
|
|
284
|
-
const result =
|
|
285
|
-
undefined,
|
|
286
|
-
this.#actor.actorContext,
|
|
287
|
-
...args,
|
|
318
|
+
const result = this.#actor.traces.withSpan(span, () =>
|
|
319
|
+
fn.call(undefined, this.#actor.actorContext, ...args),
|
|
288
320
|
);
|
|
289
321
|
|
|
290
322
|
// Handle async actions
|
|
@@ -292,12 +324,22 @@ export class ScheduleManager<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
|
|
|
292
324
|
await result;
|
|
293
325
|
}
|
|
294
326
|
|
|
327
|
+
this.#actor.endTraceSpan(span, { code: "OK" });
|
|
295
328
|
this.#actor.log.debug({
|
|
296
329
|
msg: "scheduled event completed",
|
|
297
330
|
eventId: event.eventId,
|
|
298
331
|
action: event.action,
|
|
299
332
|
});
|
|
300
333
|
} catch (error) {
|
|
334
|
+
this.#actor.traces.setAttributes(span, {
|
|
335
|
+
"error.message": stringifyError(error),
|
|
336
|
+
"error.type":
|
|
337
|
+
error instanceof Error ? error.name : typeof error,
|
|
338
|
+
});
|
|
339
|
+
this.#actor.endTraceSpan(span, {
|
|
340
|
+
code: "ERROR",
|
|
341
|
+
message: stringifyError(error),
|
|
342
|
+
});
|
|
301
343
|
this.#actor.log.error({
|
|
302
344
|
msg: "error executing scheduled event",
|
|
303
345
|
error: stringifyError(error),
|
|
@@ -7,10 +7,12 @@ import {
|
|
|
7
7
|
CONN_VERSIONED,
|
|
8
8
|
} from "@/schemas/actor-persist/versioned";
|
|
9
9
|
import { promiseWithResolvers, SinglePromiseQueue } from "@/utils";
|
|
10
|
+
import { loggerWithoutContext } from "@/actor/log";
|
|
10
11
|
import { type AnyConn, CONN_STATE_MANAGER_SYMBOL } from "../conn/mod";
|
|
11
12
|
import { convertConnToBarePersistedConn } from "../conn/persisted";
|
|
12
13
|
import type { ActorDriver } from "../driver";
|
|
13
14
|
import * as errors from "../errors";
|
|
15
|
+
import type { EventSchemaConfig, QueueSchemaConfig } from "../schema";
|
|
14
16
|
import { isConnStatePath, isStatePath } from "../utils";
|
|
15
17
|
import { KEYS, makeConnKey } from "./keys";
|
|
16
18
|
import type { ActorInstance } from "./mod";
|
|
@@ -35,8 +37,15 @@ export interface SaveStateOptions {
|
|
|
35
37
|
* Manages actor state persistence, proxying, and synchronization.
|
|
36
38
|
* Handles automatic state change detection and throttled persistence to KV storage.
|
|
37
39
|
*/
|
|
38
|
-
export class StateManager<
|
|
39
|
-
|
|
40
|
+
export class StateManager<
|
|
41
|
+
S,
|
|
42
|
+
CP,
|
|
43
|
+
CS,
|
|
44
|
+
I,
|
|
45
|
+
E extends EventSchemaConfig = Record<never, never>,
|
|
46
|
+
Q extends QueueSchemaConfig = Record<never, never>,
|
|
47
|
+
> {
|
|
48
|
+
#actor: ActorInstance<S, CP, CS, any, I, any, E, Q>;
|
|
40
49
|
#actorDriver: ActorDriver;
|
|
41
50
|
|
|
42
51
|
// State tracking
|
|
@@ -57,7 +66,7 @@ export class StateManager<S, CP, CS, I> {
|
|
|
57
66
|
#stateSaveInterval: number;
|
|
58
67
|
|
|
59
68
|
constructor(
|
|
60
|
-
actor: ActorInstance<S, CP, CS, any, I, any>,
|
|
69
|
+
actor: ActorInstance<S, CP, CS, any, I, any, E, Q>,
|
|
61
70
|
actorDriver: ActorDriver,
|
|
62
71
|
config: any,
|
|
63
72
|
) {
|
|
@@ -108,9 +117,14 @@ export class StateManager<S, CP, CS, I> {
|
|
|
108
117
|
this.#actor.rLog.info({ msg: "actor state initializing" });
|
|
109
118
|
|
|
110
119
|
if ("createState" in this.#config) {
|
|
111
|
-
stateData = await this.#
|
|
112
|
-
|
|
113
|
-
|
|
120
|
+
stateData = await this.#actor.runInTraceSpan(
|
|
121
|
+
"actor.createState",
|
|
122
|
+
undefined,
|
|
123
|
+
() =>
|
|
124
|
+
this.#config.createState!(
|
|
125
|
+
this.#actor.actorContext,
|
|
126
|
+
persistData.input!,
|
|
127
|
+
),
|
|
114
128
|
);
|
|
115
129
|
} else if ("state" in this.#config) {
|
|
116
130
|
stateData = structuredClone(this.#config.state);
|
|
@@ -205,7 +219,7 @@ export class StateManager<S, CP, CS, I> {
|
|
|
205
219
|
} else {
|
|
206
220
|
// Create promise for waiting
|
|
207
221
|
if (!this.#onPersistSavedPromise) {
|
|
208
|
-
this.#onPersistSavedPromise = promiseWithResolvers();
|
|
222
|
+
this.#onPersistSavedPromise = promiseWithResolvers((reason) => loggerWithoutContext().warn({ msg: "unhandled persist saved promise rejection", reason }));
|
|
209
223
|
}
|
|
210
224
|
|
|
211
225
|
// Save throttled
|
|
@@ -349,13 +363,23 @@ export class StateManager<S, CP, CS, I> {
|
|
|
349
363
|
this.#actor.isReady() &&
|
|
350
364
|
!this.#isInOnStateChange
|
|
351
365
|
) {
|
|
366
|
+
const span = this.#actor.startTraceSpan("actor.onStateChange", {
|
|
367
|
+
"rivet.state.path": path,
|
|
368
|
+
});
|
|
352
369
|
try {
|
|
353
370
|
this.#isInOnStateChange = true;
|
|
354
|
-
this.#
|
|
355
|
-
this.#
|
|
356
|
-
|
|
371
|
+
this.#actor.traces.withSpan(span, () =>
|
|
372
|
+
this.#config.onStateChange!(
|
|
373
|
+
this.#actor.actorContext,
|
|
374
|
+
this.#persistRaw.state,
|
|
375
|
+
),
|
|
357
376
|
);
|
|
377
|
+
this.#actor.endTraceSpan(span, { code: "OK" });
|
|
358
378
|
} catch (error) {
|
|
379
|
+
this.#actor.endTraceSpan(span, {
|
|
380
|
+
code: "ERROR",
|
|
381
|
+
message: stringifyError(error),
|
|
382
|
+
});
|
|
359
383
|
this.#actor.rLog.error({
|
|
360
384
|
msg: "error in `_onStateChange`",
|
|
361
385
|
error: stringifyError(error),
|
|
@@ -440,7 +464,7 @@ export class StateManager<S, CP, CS, I> {
|
|
|
440
464
|
this.#actor.rLog.info({
|
|
441
465
|
msg: "persisting connection",
|
|
442
466
|
connId,
|
|
443
|
-
gatewayId: idToStr(hibernatableDataRaw.
|
|
467
|
+
gatewayId: idToStr(hibernatableDataRaw.gatewayId),
|
|
444
468
|
requestId: idToStr(hibernatableDataRaw.requestId),
|
|
445
469
|
serverMessageIndex:
|
|
446
470
|
hibernatableDataRaw.serverMessageIndex,
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { TracesDriver } from "@rivetkit/traces";
|
|
2
|
+
import type { ActorDriver } from "../driver";
|
|
3
|
+
import { tracesStoragePrefix } from "./keys";
|
|
4
|
+
|
|
5
|
+
function concatPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {
|
|
6
|
+
const merged = new Uint8Array(prefix.length + key.length);
|
|
7
|
+
merged.set(prefix, 0);
|
|
8
|
+
merged.set(key, prefix.length);
|
|
9
|
+
return merged;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function stripPrefix(prefix: Uint8Array, key: Uint8Array): Uint8Array {
|
|
13
|
+
return key.slice(prefix.length);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function compareBytes(a: Uint8Array, b: Uint8Array): number {
|
|
17
|
+
const len = Math.min(a.length, b.length);
|
|
18
|
+
for (let i = 0; i < len; i++) {
|
|
19
|
+
if (a[i] !== b[i]) {
|
|
20
|
+
return a[i] - b[i];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return a.length - b.length;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class ActorTracesDriver implements TracesDriver {
|
|
27
|
+
#driver: ActorDriver;
|
|
28
|
+
#actorId: string;
|
|
29
|
+
#prefix: Uint8Array;
|
|
30
|
+
|
|
31
|
+
constructor(driver: ActorDriver, actorId: string) {
|
|
32
|
+
this.#driver = driver;
|
|
33
|
+
this.#actorId = actorId;
|
|
34
|
+
this.#prefix = tracesStoragePrefix();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async get(key: Uint8Array): Promise<Uint8Array | null> {
|
|
38
|
+
const [value] = await this.#driver.kvBatchGet(this.#actorId, [
|
|
39
|
+
concatPrefix(this.#prefix, key),
|
|
40
|
+
]);
|
|
41
|
+
return value ?? null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async set(key: Uint8Array, value: Uint8Array): Promise<void> {
|
|
45
|
+
await this.#driver.kvBatchPut(this.#actorId, [
|
|
46
|
+
[concatPrefix(this.#prefix, key), value],
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async delete(key: Uint8Array): Promise<void> {
|
|
51
|
+
await this.#driver.kvBatchDelete(this.#actorId, [
|
|
52
|
+
concatPrefix(this.#prefix, key),
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async deletePrefix(prefix: Uint8Array): Promise<void> {
|
|
57
|
+
const fullPrefix = concatPrefix(this.#prefix, prefix);
|
|
58
|
+
const entries = await this.#driver.kvListPrefix(
|
|
59
|
+
this.#actorId,
|
|
60
|
+
fullPrefix,
|
|
61
|
+
);
|
|
62
|
+
if (entries.length === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await this.#driver.kvBatchDelete(
|
|
66
|
+
this.#actorId,
|
|
67
|
+
entries.map(([key]) => key),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async list(
|
|
72
|
+
prefix: Uint8Array,
|
|
73
|
+
): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {
|
|
74
|
+
const fullPrefix = concatPrefix(this.#prefix, prefix);
|
|
75
|
+
const entries = await this.#driver.kvListPrefix(
|
|
76
|
+
this.#actorId,
|
|
77
|
+
fullPrefix,
|
|
78
|
+
);
|
|
79
|
+
return entries.map(([key, value]) => ({
|
|
80
|
+
key: stripPrefix(this.#prefix, key),
|
|
81
|
+
value,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async listRange(
|
|
86
|
+
start: Uint8Array,
|
|
87
|
+
end: Uint8Array,
|
|
88
|
+
options?: { reverse?: boolean; limit?: number },
|
|
89
|
+
): Promise<Array<{ key: Uint8Array; value: Uint8Array }>> {
|
|
90
|
+
const fullStart = concatPrefix(this.#prefix, start);
|
|
91
|
+
const fullEnd = concatPrefix(this.#prefix, end);
|
|
92
|
+
const entries = await this.#driver.kvListPrefix(
|
|
93
|
+
this.#actorId,
|
|
94
|
+
this.#prefix,
|
|
95
|
+
);
|
|
96
|
+
const filtered = entries
|
|
97
|
+
.filter(([key]) => {
|
|
98
|
+
return (
|
|
99
|
+
compareBytes(key, fullStart) >= 0 &&
|
|
100
|
+
compareBytes(key, fullEnd) < 0
|
|
101
|
+
);
|
|
102
|
+
})
|
|
103
|
+
.sort(([keyA], [keyB]) => compareBytes(keyA, keyB));
|
|
104
|
+
if (options?.reverse) {
|
|
105
|
+
filtered.reverse();
|
|
106
|
+
}
|
|
107
|
+
const limited = options?.limit
|
|
108
|
+
? filtered.slice(0, options.limit)
|
|
109
|
+
: filtered;
|
|
110
|
+
return limited.map(([key, value]) => ({
|
|
111
|
+
key: stripPrefix(this.#prefix, key),
|
|
112
|
+
value,
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async batch(writes: Array<{ key: Uint8Array; value: Uint8Array }>): Promise<void> {
|
|
117
|
+
if (writes.length === 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
await this.#driver.kvBatchPut(
|
|
121
|
+
this.#actorId,
|
|
122
|
+
writes.map(({ key, value }) => [
|
|
123
|
+
concatPrefix(this.#prefix, key),
|
|
124
|
+
value,
|
|
125
|
+
]),
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
package/src/actor/mod.ts
CHANGED
|
@@ -7,6 +7,8 @@ import {
|
|
|
7
7
|
} from "./config";
|
|
8
8
|
import type { AnyDatabaseProvider } from "./database";
|
|
9
9
|
import { ActorDefinition } from "./definition";
|
|
10
|
+
import { event as schemaEvent, queue as schemaQueue } from "./schema";
|
|
11
|
+
import type { EventSchemaConfig, QueueSchemaConfig } from "./schema";
|
|
10
12
|
|
|
11
13
|
export function actor<
|
|
12
14
|
TState,
|
|
@@ -15,13 +17,26 @@ export function actor<
|
|
|
15
17
|
TVars,
|
|
16
18
|
TInput,
|
|
17
19
|
TDatabase extends AnyDatabaseProvider,
|
|
20
|
+
TEvents extends EventSchemaConfig = Record<never, never>,
|
|
21
|
+
TQueues extends QueueSchemaConfig = Record<never, never>,
|
|
18
22
|
TActions extends Actions<
|
|
19
23
|
TState,
|
|
20
24
|
TConnParams,
|
|
21
25
|
TConnState,
|
|
22
26
|
TVars,
|
|
23
27
|
TInput,
|
|
24
|
-
TDatabase
|
|
28
|
+
TDatabase,
|
|
29
|
+
TEvents,
|
|
30
|
+
TQueues
|
|
31
|
+
> = Actions<
|
|
32
|
+
TState,
|
|
33
|
+
TConnParams,
|
|
34
|
+
TConnState,
|
|
35
|
+
TVars,
|
|
36
|
+
TInput,
|
|
37
|
+
TDatabase,
|
|
38
|
+
TEvents,
|
|
39
|
+
TQueues
|
|
25
40
|
>,
|
|
26
41
|
>(
|
|
27
42
|
input: ActorConfigInput<
|
|
@@ -31,6 +46,8 @@ export function actor<
|
|
|
31
46
|
TVars,
|
|
32
47
|
TInput,
|
|
33
48
|
TDatabase,
|
|
49
|
+
TEvents,
|
|
50
|
+
TQueues,
|
|
34
51
|
TActions
|
|
35
52
|
>,
|
|
36
53
|
): ActorDefinition<
|
|
@@ -40,6 +57,8 @@ export function actor<
|
|
|
40
57
|
TVars,
|
|
41
58
|
TInput,
|
|
42
59
|
TDatabase,
|
|
60
|
+
TEvents,
|
|
61
|
+
TQueues,
|
|
43
62
|
TActions
|
|
44
63
|
> {
|
|
45
64
|
const config = ActorConfigSchema.parse(input) as ActorConfig<
|
|
@@ -48,7 +67,9 @@ export function actor<
|
|
|
48
67
|
TConnState,
|
|
49
68
|
TVars,
|
|
50
69
|
TInput,
|
|
51
|
-
TDatabase
|
|
70
|
+
TDatabase,
|
|
71
|
+
TEvents,
|
|
72
|
+
TQueues
|
|
52
73
|
>;
|
|
53
74
|
return new ActorDefinition(config);
|
|
54
75
|
}
|
|
@@ -84,3 +105,6 @@ export {
|
|
|
84
105
|
createActorRouter,
|
|
85
106
|
} from "./router";
|
|
86
107
|
export { routeWebSocket } from "./router-websocket-endpoints";
|
|
108
|
+
export type { Type } from "./schema";
|
|
109
|
+
export const event = schemaEvent;
|
|
110
|
+
export const queue = schemaQueue;
|