rivetkit 2.0.23 → 2.0.24
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/schemas/actor-persist/v2.ts +3 -3
- package/dist/schemas/actor-persist/v3.ts +274 -0
- package/dist/schemas/client-protocol/v2.ts +432 -0
- package/dist/schemas/file-system-driver/v2.ts +136 -0
- package/dist/tsup/actor/errors.cjs +2 -4
- package/dist/tsup/actor/errors.cjs.map +1 -1
- package/dist/tsup/actor/errors.d.cts +7 -10
- package/dist/tsup/actor/errors.d.ts +7 -10
- package/dist/tsup/actor/errors.js +9 -11
- package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.cts → actor-router-consts-DzI2szci.d.cts} +5 -9
- package/dist/tsup/{actor-router-consts-B3Lu87yJ.d.ts → actor-router-consts-DzI2szci.d.ts} +5 -9
- package/dist/tsup/{chunk-3JYSUFET.cjs → chunk-3543NCSN.cjs} +45 -57
- package/dist/tsup/chunk-3543NCSN.cjs.map +1 -0
- package/dist/tsup/chunk-4SHILYS5.cjs +5694 -0
- package/dist/tsup/chunk-4SHILYS5.cjs.map +1 -0
- package/dist/tsup/{chunk-NCUALX2Q.cjs → chunk-5BZO5XPS.cjs} +3 -3
- package/dist/tsup/{chunk-NCUALX2Q.cjs.map → chunk-5BZO5XPS.cjs.map} +1 -1
- package/dist/tsup/{chunk-5PKKNNNS.js → chunk-BAIGSF64.js} +189 -187
- package/dist/tsup/chunk-BAIGSF64.js.map +1 -0
- package/dist/tsup/{chunk-HNYF4T36.cjs → chunk-CHLZBSI2.cjs} +17 -17
- package/dist/tsup/chunk-CHLZBSI2.cjs.map +1 -0
- package/dist/tsup/chunk-D3SLADUD.cjs +512 -0
- package/dist/tsup/chunk-D3SLADUD.cjs.map +1 -0
- package/dist/tsup/{chunk-KSRXX3Z4.cjs → chunk-D6762AOA.cjs} +20 -25
- package/dist/tsup/chunk-D6762AOA.cjs.map +1 -0
- package/dist/tsup/{chunk-C56XVVV4.cjs → chunk-DLK5YCTN.cjs} +187 -185
- package/dist/tsup/chunk-DLK5YCTN.cjs.map +1 -0
- package/dist/tsup/{chunk-DLYZKFRY.js → chunk-DUJQWGYD.js} +3 -7
- package/dist/tsup/chunk-DUJQWGYD.js.map +1 -0
- package/dist/tsup/{chunk-5UJQWWO3.js → chunk-EIPANQMF.js} +2 -2
- package/dist/tsup/{chunk-54DVMQPT.cjs → chunk-ESMTDP7G.cjs} +6 -6
- package/dist/tsup/chunk-ESMTDP7G.cjs.map +1 -0
- package/dist/tsup/{chunk-XYK5PY3B.cjs → chunk-FVAKREFB.cjs} +1900 -1737
- package/dist/tsup/chunk-FVAKREFB.cjs.map +1 -0
- package/dist/tsup/{chunk-PHNIVSG5.js → chunk-I3XT7WOF.js} +44 -56
- package/dist/tsup/chunk-I3XT7WOF.js.map +1 -0
- package/dist/tsup/{chunk-3I6ZIJVJ.js → chunk-IMDS5T42.js} +3 -3
- package/dist/tsup/chunk-IMDS5T42.js.map +1 -0
- package/dist/tsup/{chunk-SN4KWTRA.cjs → chunk-J3HZJF2P.cjs} +10 -14
- package/dist/tsup/chunk-J3HZJF2P.cjs.map +1 -0
- package/dist/tsup/{chunk-NOZSCUPQ.js → chunk-MBBJUHSP.js} +1844 -1681
- package/dist/tsup/chunk-MBBJUHSP.js.map +1 -0
- package/dist/tsup/{chunk-RVVUS4X6.js → chunk-MO5CB6MD.js} +9 -9
- package/dist/tsup/chunk-MO5CB6MD.js.map +1 -0
- package/dist/tsup/chunk-OFOTPKAH.js +512 -0
- package/dist/tsup/chunk-OFOTPKAH.js.map +1 -0
- package/dist/tsup/{chunk-G64QUEDJ.js → chunk-W6RDS6NW.js} +23 -28
- package/dist/tsup/chunk-W6RDS6NW.js.map +1 -0
- package/dist/tsup/{chunk-XSDSNHSE.cjs → chunk-YC5DUHPM.cjs} +4 -8
- package/dist/tsup/chunk-YC5DUHPM.cjs.map +1 -0
- package/dist/tsup/{chunk-YAYNBR37.js → chunk-YC7YPM2T.js} +2 -6
- package/dist/tsup/chunk-YC7YPM2T.js.map +1 -0
- package/dist/tsup/{chunk-FTQ62XTN.js → chunk-ZSPU5R4C.js} +3322 -2251
- package/dist/tsup/chunk-ZSPU5R4C.js.map +1 -0
- package/dist/tsup/client/mod.cjs +9 -9
- package/dist/tsup/client/mod.d.cts +5 -7
- package/dist/tsup/client/mod.d.ts +5 -7
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{conn-B3Vhbgnd.d.ts → config-BRDYDraU.d.cts} +1119 -1047
- package/dist/tsup/{conn-DJWL3nGx.d.cts → config-Bo-blHpJ.d.ts} +1119 -1047
- package/dist/tsup/driver-helpers/mod.cjs +5 -13
- package/dist/tsup/driver-helpers/mod.cjs.map +1 -1
- package/dist/tsup/driver-helpers/mod.d.cts +11 -9
- package/dist/tsup/driver-helpers/mod.d.ts +11 -9
- package/dist/tsup/driver-helpers/mod.js +14 -22
- package/dist/tsup/driver-test-suite/mod.cjs +474 -303
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +6 -9
- package/dist/tsup/driver-test-suite/mod.d.ts +6 -9
- package/dist/tsup/driver-test-suite/mod.js +1085 -914
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.d.cts +5 -7
- package/dist/tsup/inspector/mod.d.ts +5 -7
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/mod.cjs +10 -16
- package/dist/tsup/mod.cjs.map +1 -1
- package/dist/tsup/mod.d.cts +23 -25
- package/dist/tsup/mod.d.ts +23 -25
- package/dist/tsup/mod.js +17 -23
- package/dist/tsup/test/mod.cjs +11 -11
- package/dist/tsup/test/mod.d.cts +4 -6
- package/dist/tsup/test/mod.d.ts +4 -6
- package/dist/tsup/test/mod.js +10 -10
- package/dist/tsup/utils.cjs +3 -5
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +1 -2
- package/dist/tsup/utils.d.ts +1 -2
- package/dist/tsup/utils.js +2 -4
- package/package.json +13 -6
- package/src/actor/config.ts +56 -44
- package/src/actor/conn/driver.ts +61 -0
- package/src/actor/conn/drivers/http.ts +17 -0
- package/src/actor/conn/drivers/raw-request.ts +24 -0
- package/src/actor/conn/drivers/raw-websocket.ts +65 -0
- package/src/actor/conn/drivers/websocket.ts +129 -0
- package/src/actor/conn/mod.ts +232 -0
- package/src/actor/conn/persisted.ts +81 -0
- package/src/actor/conn/state-manager.ts +196 -0
- package/src/actor/contexts/action.ts +23 -0
- package/src/actor/{context.ts → contexts/actor.ts} +19 -8
- package/src/actor/contexts/conn-init.ts +31 -0
- package/src/actor/contexts/conn.ts +48 -0
- package/src/actor/contexts/create-conn-state.ts +13 -0
- package/src/actor/contexts/on-before-connect.ts +13 -0
- package/src/actor/contexts/on-connect.ts +22 -0
- package/src/actor/contexts/request.ts +48 -0
- package/src/actor/contexts/websocket.ts +48 -0
- package/src/actor/definition.ts +3 -3
- package/src/actor/driver.ts +36 -5
- package/src/actor/errors.ts +19 -24
- package/src/actor/instance/connection-manager.ts +465 -0
- package/src/actor/instance/event-manager.ts +292 -0
- package/src/actor/instance/kv.ts +15 -0
- package/src/actor/instance/mod.ts +1107 -0
- package/src/actor/instance/persisted.ts +67 -0
- package/src/actor/instance/schedule-manager.ts +349 -0
- package/src/actor/instance/state-manager.ts +502 -0
- package/src/actor/mod.ts +13 -16
- package/src/actor/protocol/old.ts +131 -43
- package/src/actor/protocol/serde.ts +19 -4
- package/src/actor/router-endpoints.ts +61 -586
- package/src/actor/router-websocket-endpoints.ts +408 -0
- package/src/actor/router.ts +63 -197
- package/src/actor/schedule.ts +1 -1
- package/src/client/actor-conn.ts +183 -249
- package/src/client/actor-handle.ts +29 -6
- package/src/client/client.ts +0 -4
- package/src/client/config.ts +1 -4
- package/src/client/mod.ts +0 -1
- package/src/client/raw-utils.ts +3 -3
- package/src/client/utils.ts +85 -39
- package/src/common/actor-router-consts.ts +5 -12
- package/src/common/{inline-websocket-adapter2.ts → inline-websocket-adapter.ts} +26 -48
- package/src/common/log.ts +1 -1
- package/src/common/router.ts +28 -17
- package/src/common/utils.ts +2 -0
- package/src/driver-helpers/mod.ts +7 -10
- package/src/driver-helpers/utils.ts +18 -9
- package/src/driver-test-suite/mod.ts +26 -50
- package/src/driver-test-suite/test-inline-client-driver.ts +27 -51
- package/src/driver-test-suite/tests/actor-conn-hibernation.ts +150 -0
- package/src/driver-test-suite/tests/actor-conn-state.ts +1 -4
- package/src/driver-test-suite/tests/actor-conn.ts +5 -9
- package/src/driver-test-suite/tests/actor-destroy.ts +294 -0
- package/src/driver-test-suite/tests/actor-driver.ts +0 -7
- package/src/driver-test-suite/tests/actor-handle.ts +12 -12
- package/src/driver-test-suite/tests/actor-metadata.ts +1 -1
- package/src/driver-test-suite/tests/manager-driver.ts +1 -1
- package/src/driver-test-suite/tests/raw-http-direct-registry.ts +8 -8
- package/src/driver-test-suite/tests/raw-http-request-properties.ts +6 -5
- package/src/driver-test-suite/tests/raw-http.ts +5 -5
- package/src/driver-test-suite/tests/raw-websocket-direct-registry.ts +7 -7
- package/src/driver-test-suite/tests/request-access.ts +4 -4
- package/src/driver-test-suite/utils.ts +6 -10
- package/src/drivers/engine/actor-driver.ts +614 -424
- package/src/drivers/engine/mod.ts +0 -1
- package/src/drivers/file-system/actor.ts +24 -12
- package/src/drivers/file-system/global-state.ts +427 -37
- package/src/drivers/file-system/manager.ts +71 -83
- package/src/drivers/file-system/mod.ts +3 -0
- package/src/drivers/file-system/utils.ts +18 -8
- package/src/engine-process/mod.ts +38 -38
- package/src/inspector/utils.ts +7 -5
- package/src/manager/driver.ts +11 -4
- package/src/manager/gateway.ts +4 -29
- package/src/manager/protocol/mod.ts +0 -2
- package/src/manager/protocol/query.ts +0 -4
- package/src/manager/router.ts +67 -64
- package/src/manager-api/actors.ts +13 -0
- package/src/mod.ts +1 -3
- package/src/registry/mod.ts +20 -20
- package/src/registry/serve.ts +9 -14
- package/src/remote-manager-driver/actor-websocket-client.ts +1 -16
- package/src/remote-manager-driver/api-endpoints.ts +13 -1
- package/src/remote-manager-driver/api-utils.ts +8 -0
- package/src/remote-manager-driver/metadata.ts +58 -0
- package/src/remote-manager-driver/mod.ts +47 -62
- package/src/remote-manager-driver/ws-proxy.ts +1 -1
- package/src/schemas/actor-persist/mod.ts +1 -1
- package/src/schemas/actor-persist/versioned.ts +56 -31
- package/src/schemas/client-protocol/mod.ts +1 -1
- package/src/schemas/client-protocol/versioned.ts +41 -21
- package/src/schemas/client-protocol-zod/mod.ts +103 -0
- package/src/schemas/file-system-driver/mod.ts +1 -1
- package/src/schemas/file-system-driver/versioned.ts +42 -19
- package/src/serde.ts +33 -11
- package/src/test/mod.ts +7 -3
- package/src/utils/node.ts +173 -0
- package/src/utils.ts +0 -4
- package/dist/tsup/chunk-3I6ZIJVJ.js.map +0 -1
- package/dist/tsup/chunk-3JYSUFET.cjs.map +0 -1
- package/dist/tsup/chunk-54DVMQPT.cjs.map +0 -1
- package/dist/tsup/chunk-5PKKNNNS.js.map +0 -1
- package/dist/tsup/chunk-C56XVVV4.cjs.map +0 -1
- package/dist/tsup/chunk-D6PCH7FR.cjs +0 -4623
- package/dist/tsup/chunk-D6PCH7FR.cjs.map +0 -1
- package/dist/tsup/chunk-DLYZKFRY.js.map +0 -1
- package/dist/tsup/chunk-FTQ62XTN.js.map +0 -1
- package/dist/tsup/chunk-G64QUEDJ.js.map +0 -1
- package/dist/tsup/chunk-HNYF4T36.cjs.map +0 -1
- package/dist/tsup/chunk-JMLTKMJ7.cjs +0 -1119
- package/dist/tsup/chunk-JMLTKMJ7.cjs.map +0 -1
- package/dist/tsup/chunk-KSRXX3Z4.cjs.map +0 -1
- package/dist/tsup/chunk-NOZSCUPQ.js.map +0 -1
- package/dist/tsup/chunk-PHNIVSG5.js.map +0 -1
- package/dist/tsup/chunk-RUTBXBRR.js +0 -1119
- package/dist/tsup/chunk-RUTBXBRR.js.map +0 -1
- package/dist/tsup/chunk-RVVUS4X6.js.map +0 -1
- package/dist/tsup/chunk-SN4KWTRA.cjs.map +0 -1
- package/dist/tsup/chunk-XSDSNHSE.cjs.map +0 -1
- package/dist/tsup/chunk-XYK5PY3B.cjs.map +0 -1
- package/dist/tsup/chunk-YAYNBR37.js.map +0 -1
- package/src/actor/action.ts +0 -178
- package/src/actor/conn-drivers.ts +0 -216
- package/src/actor/conn-socket.ts +0 -8
- package/src/actor/conn.ts +0 -272
- package/src/actor/instance.ts +0 -2336
- package/src/actor/persisted.ts +0 -49
- package/src/actor/unstable-react.ts +0 -110
- package/src/driver-test-suite/tests/actor-reconnect.ts +0 -170
- package/src/drivers/engine/kv.ts +0 -3
- package/src/manager/hono-websocket-adapter.ts +0 -393
- /package/dist/tsup/{chunk-5UJQWWO3.js.map → chunk-EIPANQMF.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/inspector/protocol/actor.ts","../../src/inspector/protocol/manager.ts","../../src/inspector/utils.ts","../../src/inspector/log.ts"],"sourcesContent":["import { hc } from \"hono/client\";\nimport type { createActorInspectorRouter } from \"../actor\";\n\ntype ActorInspectorRouter = ReturnType<typeof createActorInspectorRouter>;\nconst client = hc<ActorInspectorRouter>(\"\");\nexport type ActorInspectorClient = typeof client;\n\nexport const createActorInspectorClient = (\n\t...args: Parameters<typeof hc>\n): ActorInspectorClient => hc<ActorInspectorRouter>(...args);\n","import { hc } from \"hono/client\";\nimport type { createManagerInspectorRouter } from \"../manager\";\n\ntype ManagerInspectorRouter = ReturnType<typeof createManagerInspectorRouter>;\nconst client = hc<ManagerInspectorRouter>(\"\");\nexport type ManagerInspectorClient = typeof client;\n\nexport const createManagerInspectorClient = (\n\t...args: Parameters<typeof hc>\n): ManagerInspectorClient => hc<ManagerInspectorRouter>(...args);\n","import crypto from \"node:crypto\";\nimport { createMiddleware } from \"hono/factory\";\nimport type { ManagerDriver } from \"@/driver-helpers/mod\";\nimport type { RunConfig } from \"@/mod\";\nimport type { RunnerConfigInput } from \"@/registry/run-config\";\nimport { inspectorLogger } from \"./log\";\n\nexport function compareSecrets(providedSecret: string, validSecret: string) {\n\t// Early length check to avoid unnecessary processing\n\tif (providedSecret.length !== validSecret.length) {\n\t\treturn false;\n\t}\n\n\tconst encoder = new TextEncoder();\n\n\tconst a = encoder.encode(providedSecret);\n\tconst b = encoder.encode(validSecret);\n\n\tif (a.byteLength !== b.byteLength) {\n\t\treturn false;\n\t}\n\n\t// Perform timing-safe comparison\n\tif (!crypto.timingSafeEqual(a, b)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport const secureInspector = (runConfig: RunConfig) =>\n\tcreateMiddleware(async (c, next) => {\n\t\tconst userToken = c.req.header(\"Authorization\")?.replace(\"Bearer \", \"\");\n\t\tif (!userToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst inspectorToken = runConfig.inspector.token?.();\n\t\tif (!inspectorToken) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\n\t\tconst isValid = compareSecrets(userToken, inspectorToken);\n\n\t\tif (!isValid) {\n\t\t\treturn c.text(\"Unauthorized\", 401);\n\t\t}\n\t\tawait next();\n\t});\n\nexport function getInspectorUrl(runConfig: RunnerConfigInput | undefined) {\n\tif (!runConfig?.inspector?.enabled) {\n\t\treturn \"disabled\";\n\t}\n\n\tconst accessToken = runConfig?.inspector?.token?.();\n\n\tif (!accessToken) {\n\t\tinspectorLogger().warn(\n\t\t\t\"Inspector Token is not set, but Inspector is enabled. Please set it in the run configuration `inspector.token` or via `RIVETKIT_INSPECTOR_TOKEN` environment variable. Inspector will not be accessible.\",\n\t\t);\n\t\treturn \"disabled\";\n\t}\n\n\tconst url = new URL(\"https://inspect.rivet.dev\");\n\n\turl.searchParams.set(\"t\", accessToken);\n\n\tconst overrideDefaultEndpoint =\n\t\trunConfig?.inspector?.defaultEndpoint ??\n\t\trunConfig.overrideServerAddress;\n\tif (overrideDefaultEndpoint) {\n\t\turl.searchParams.set(\"u\", overrideDefaultEndpoint);\n\t}\n\n\treturn url.href;\n}\n\nexport const isInspectorEnabled = (\n\trunConfig: RunConfig,\n\tcontext: \"actor\" | \"manager\",\n) => {\n\tif (typeof runConfig.inspector?.enabled === \"boolean\") {\n\t\treturn runConfig.inspector.enabled;\n\t} else if (typeof runConfig.inspector?.enabled === \"object\") {\n\t\treturn runConfig.inspector.enabled[context];\n\t}\n\treturn false;\n};\n\nexport const configureInspectorAccessToken = (\n\trunConfig: RunConfig,\n\tmanagerDriver: ManagerDriver,\n) => {\n\tif (!runConfig.inspector?.token()) {\n\t\tconst token = managerDriver.getOrCreateInspectorAccessToken();\n\t\trunConfig.inspector.token = () => token;\n\t}\n};\n","import { getLogger } from \"@/common/log\";\n\nexport function inspectorLogger() {\n\treturn getLogger(\"inspector\");\n}\n"],"mappings":";;;;;AAAA,SAAS,UAAU;AAInB,IAAM,SAAS,GAAyB,EAAE;AAGnC,IAAM,6BAA6B,IACtC,SACuB,GAAyB,GAAG,IAAI;;;ACT3D,SAAS,MAAAA,WAAU;AAInB,IAAMC,UAASD,IAA2B,EAAE;AAGrC,IAAM,+BAA+B,IACxC,SACyBA,IAA2B,GAAG,IAAI;;;ACT/D,OAAO,YAAY;AACnB,SAAS,wBAAwB;;;ACC1B,SAAS,kBAAkB;AACjC,SAAO,UAAU,WAAW;AAC7B;;;ADGO,SAAS,eAAe,gBAAwB,aAAqB;AAE3E,MAAI,eAAe,WAAW,YAAY,QAAQ;AACjD,WAAO;AAAA,EACR;AAEA,QAAM,UAAU,IAAI,YAAY;AAEhC,QAAM,IAAI,QAAQ,OAAO,cAAc;AACvC,QAAM,IAAI,QAAQ,OAAO,WAAW;AAEpC,MAAI,EAAE,eAAe,EAAE,YAAY;AAClC,WAAO;AAAA,EACR;AAGA,MAAI,CAAC,OAAO,gBAAgB,GAAG,CAAC,GAAG;AAClC,WAAO;AAAA,EACR;AACA,SAAO;AACR;AAEO,IAAM,kBAAkB,CAAC,cAC/B,iBAAiB,OAAO,GAAG,SAAS;AA9BrC;AA+BE,QAAM,aAAY,OAAE,IAAI,OAAO,eAAe,MAA5B,mBAA+B,QAAQ,WAAW;AACpE,MAAI,CAAC,WAAW;AACf,WAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,EAClC;AAEA,QAAM,kBAAiB,qBAAU,WAAU,UAApB;AACvB,MAAI,CAAC,gBAAgB;AACpB,WAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,EAClC;AAEA,QAAM,UAAU,eAAe,WAAW,cAAc;AAExD,MAAI,CAAC,SAAS;AACb,WAAO,EAAE,KAAK,gBAAgB,GAAG;AAAA,EAClC;AACA,QAAM,KAAK;AACZ,CAAC;AAEK,SAAS,gBAAgB,WAA0C;AAjD1E;AAkDC,MAAI,GAAC,4CAAW,cAAX,mBAAsB,UAAS;AACnC,WAAO;AAAA,EACR;AAEA,QAAM,eAAc,kDAAW,cAAX,mBAAsB,UAAtB;AAEpB,MAAI,CAAC,aAAa;AACjB,oBAAgB,EAAE;AAAA,MACjB;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAEA,QAAM,MAAM,IAAI,IAAI,2BAA2B;AAE/C,MAAI,aAAa,IAAI,KAAK,WAAW;AAErC,QAAM,4BACL,4CAAW,cAAX,mBAAsB,oBACtB,UAAU;AACX,MAAI,yBAAyB;AAC5B,QAAI,aAAa,IAAI,KAAK,uBAAuB;AAAA,EAClD;AAEA,SAAO,IAAI;AACZ;AAEO,IAAM,qBAAqB,CACjC,WACA,YACI;AAhFL;AAiFC,MAAI,SAAO,eAAU,cAAV,mBAAqB,aAAY,WAAW;AACtD,WAAO,UAAU,UAAU;AAAA,EAC5B,WAAW,SAAO,eAAU,cAAV,mBAAqB,aAAY,UAAU;AAC5D,WAAO,UAAU,UAAU,QAAQ,OAAO;AAAA,EAC3C;AACA,SAAO;AACR;AAEO,IAAM,gCAAgC,CAC5C,WACA,kBACI;AA5FL;AA6FC,MAAI,GAAC,eAAU,cAAV,mBAAqB,UAAS;AAClC,UAAM,QAAQ,cAAc,gCAAgC;AAC5D,cAAU,UAAU,QAAQ,MAAM;AAAA,EACnC;AACD;","names":["hc","client"]}
|
package/src/actor/action.ts
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import type { ActorKey } from "@/actor/mod";
|
|
2
|
-
import type { Client } from "@/client/client";
|
|
3
|
-
import type { Logger } from "@/common/log";
|
|
4
|
-
import type { Registry } from "@/registry/mod";
|
|
5
|
-
import type { Conn, ConnId } from "./conn";
|
|
6
|
-
import type { ActorContext } from "./context";
|
|
7
|
-
import type { AnyDatabaseProvider, InferDatabaseClient } from "./database";
|
|
8
|
-
import type { SaveStateOptions } from "./instance";
|
|
9
|
-
import type { Schedule } from "./schedule";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Context for a remote procedure call.
|
|
13
|
-
*
|
|
14
|
-
* @typeParam A Actor this action belongs to
|
|
15
|
-
*/
|
|
16
|
-
export class ActionContext<
|
|
17
|
-
TState,
|
|
18
|
-
TConnParams,
|
|
19
|
-
TConnState,
|
|
20
|
-
TVars,
|
|
21
|
-
TInput,
|
|
22
|
-
TDatabase extends AnyDatabaseProvider,
|
|
23
|
-
> {
|
|
24
|
-
#actorContext: ActorContext<
|
|
25
|
-
TState,
|
|
26
|
-
TConnParams,
|
|
27
|
-
TConnState,
|
|
28
|
-
TVars,
|
|
29
|
-
TInput,
|
|
30
|
-
TDatabase
|
|
31
|
-
>;
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Should not be called directly.
|
|
35
|
-
*
|
|
36
|
-
* @param actorContext - The actor context
|
|
37
|
-
* @param conn - The connection associated with the action
|
|
38
|
-
*/
|
|
39
|
-
constructor(
|
|
40
|
-
actorContext: ActorContext<
|
|
41
|
-
TState,
|
|
42
|
-
TConnParams,
|
|
43
|
-
TConnState,
|
|
44
|
-
TVars,
|
|
45
|
-
TInput,
|
|
46
|
-
TDatabase
|
|
47
|
-
>,
|
|
48
|
-
public readonly conn: Conn<
|
|
49
|
-
TState,
|
|
50
|
-
TConnParams,
|
|
51
|
-
TConnState,
|
|
52
|
-
TVars,
|
|
53
|
-
TInput,
|
|
54
|
-
TDatabase
|
|
55
|
-
>,
|
|
56
|
-
) {
|
|
57
|
-
this.#actorContext = actorContext;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Get the actor state
|
|
62
|
-
*/
|
|
63
|
-
get state(): TState {
|
|
64
|
-
return this.#actorContext.state;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Get the actor variables
|
|
69
|
-
*/
|
|
70
|
-
get vars(): TVars {
|
|
71
|
-
return this.#actorContext.vars;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Broadcasts an event to all connected clients.
|
|
76
|
-
*/
|
|
77
|
-
broadcast(name: string, ...args: any[]): void {
|
|
78
|
-
this.#actorContext.broadcast(name, ...args);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Gets the logger instance.
|
|
83
|
-
*/
|
|
84
|
-
get log(): Logger {
|
|
85
|
-
return this.#actorContext.log;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Gets actor ID.
|
|
90
|
-
*/
|
|
91
|
-
get actorId(): string {
|
|
92
|
-
return this.#actorContext.actorId;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Gets the actor name.
|
|
97
|
-
*/
|
|
98
|
-
get name(): string {
|
|
99
|
-
return this.#actorContext.name;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Gets the actor key.
|
|
104
|
-
*/
|
|
105
|
-
get key(): ActorKey {
|
|
106
|
-
return this.#actorContext.key;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Gets the region.
|
|
111
|
-
*/
|
|
112
|
-
get region(): string {
|
|
113
|
-
return this.#actorContext.region;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Gets the scheduler.
|
|
118
|
-
*/
|
|
119
|
-
get schedule(): Schedule {
|
|
120
|
-
return this.#actorContext.schedule;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Gets the map of connections.
|
|
125
|
-
*/
|
|
126
|
-
get conns(): Map<
|
|
127
|
-
ConnId,
|
|
128
|
-
Conn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>
|
|
129
|
-
> {
|
|
130
|
-
return this.#actorContext.conns;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Returns the client for the given registry.
|
|
135
|
-
*/
|
|
136
|
-
client<R extends Registry<any>>(): Client<R> {
|
|
137
|
-
return this.#actorContext.client<R>();
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* @experimental
|
|
142
|
-
*/
|
|
143
|
-
get db(): InferDatabaseClient<TDatabase> {
|
|
144
|
-
return this.#actorContext.db;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Forces the state to get saved.
|
|
149
|
-
*/
|
|
150
|
-
async saveState(opts: SaveStateOptions): Promise<void> {
|
|
151
|
-
return this.#actorContext.saveState(opts);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Prevents the actor from sleeping until promise is complete.
|
|
156
|
-
*/
|
|
157
|
-
waitUntil(promise: Promise<void>): void {
|
|
158
|
-
this.#actorContext.waitUntil(promise);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* AbortSignal that fires when the actor is stopping.
|
|
163
|
-
*/
|
|
164
|
-
get abortSignal(): AbortSignal {
|
|
165
|
-
return this.#actorContext.abortSignal;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Forces the actor to sleep.
|
|
170
|
-
*
|
|
171
|
-
* Not supported on all drivers.
|
|
172
|
-
*
|
|
173
|
-
* @experimental
|
|
174
|
-
*/
|
|
175
|
-
sleep() {
|
|
176
|
-
this.#actorContext.sleep();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import type { SSEStreamingApi } from "hono/streaming";
|
|
2
|
-
import type { WSContext } from "hono/ws";
|
|
3
|
-
import type { WebSocket } from "ws";
|
|
4
|
-
import type { AnyConn } from "@/actor/conn";
|
|
5
|
-
import type { AnyActorInstance } from "@/actor/instance";
|
|
6
|
-
import type { CachedSerializer, Encoding } from "@/actor/protocol/serde";
|
|
7
|
-
import { encodeDataToString } from "@/actor/protocol/serde";
|
|
8
|
-
import type { HonoWebSocketAdapter } from "@/manager/hono-websocket-adapter";
|
|
9
|
-
import type * as protocol from "@/schemas/client-protocol/mod";
|
|
10
|
-
import { assertUnreachable, type promiseWithResolvers } from "@/utils";
|
|
11
|
-
|
|
12
|
-
export enum ConnDriverKind {
|
|
13
|
-
WEBSOCKET = 0,
|
|
14
|
-
SSE = 1,
|
|
15
|
-
HTTP = 2,
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export enum ConnReadyState {
|
|
19
|
-
UNKNOWN = -1,
|
|
20
|
-
CONNECTING = 0,
|
|
21
|
-
OPEN = 1,
|
|
22
|
-
CLOSING = 2,
|
|
23
|
-
CLOSED = 3,
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface ConnDriverWebSocketState {
|
|
27
|
-
encoding: Encoding;
|
|
28
|
-
websocket: WSContext;
|
|
29
|
-
closePromise: ReturnType<typeof promiseWithResolvers<void>>;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface ConnDriverSseState {
|
|
33
|
-
encoding: Encoding;
|
|
34
|
-
stream: SSEStreamingApi;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export type ConnDriverHttpState = Record<never, never>;
|
|
38
|
-
|
|
39
|
-
export type ConnDriverState =
|
|
40
|
-
| { [ConnDriverKind.WEBSOCKET]: ConnDriverWebSocketState }
|
|
41
|
-
| { [ConnDriverKind.SSE]: ConnDriverSseState }
|
|
42
|
-
| { [ConnDriverKind.HTTP]: ConnDriverHttpState };
|
|
43
|
-
|
|
44
|
-
export interface ConnDriver<State> {
|
|
45
|
-
sendMessage?(
|
|
46
|
-
actor: AnyActorInstance,
|
|
47
|
-
conn: AnyConn,
|
|
48
|
-
state: State,
|
|
49
|
-
message: CachedSerializer<protocol.ToClient>,
|
|
50
|
-
): void;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* This returns a promise since we commonly disconnect at the end of a program, and not waiting will cause the socket to not close cleanly.
|
|
54
|
-
*/
|
|
55
|
-
disconnect(
|
|
56
|
-
actor: AnyActorInstance,
|
|
57
|
-
conn: AnyConn,
|
|
58
|
-
state: State,
|
|
59
|
-
reason?: string,
|
|
60
|
-
): Promise<void>;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Returns the ready state of the connection.
|
|
64
|
-
* This is used to determine if the connection is ready to send messages, or if the connection is stale.
|
|
65
|
-
*/
|
|
66
|
-
getConnectionReadyState(
|
|
67
|
-
actor: AnyActorInstance,
|
|
68
|
-
conn: AnyConn,
|
|
69
|
-
state: State,
|
|
70
|
-
): ConnReadyState | undefined;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// MARK: WebSocket
|
|
74
|
-
const WEBSOCKET_DRIVER: ConnDriver<ConnDriverWebSocketState> = {
|
|
75
|
-
sendMessage: (
|
|
76
|
-
actor: AnyActorInstance,
|
|
77
|
-
conn: AnyConn,
|
|
78
|
-
state: ConnDriverWebSocketState,
|
|
79
|
-
message: CachedSerializer<protocol.ToClient>,
|
|
80
|
-
) => {
|
|
81
|
-
if (state.websocket.readyState !== ConnReadyState.OPEN) {
|
|
82
|
-
actor.rLog.warn({
|
|
83
|
-
msg: "attempting to send message to closed websocket, this is likely a bug in RivetKit",
|
|
84
|
-
connId: conn.id,
|
|
85
|
-
wsReadyState: state.websocket.readyState,
|
|
86
|
-
});
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const serialized = message.serialize(state.encoding);
|
|
91
|
-
|
|
92
|
-
actor.rLog.debug({
|
|
93
|
-
msg: "sending websocket message",
|
|
94
|
-
encoding: state.encoding,
|
|
95
|
-
dataType: typeof serialized,
|
|
96
|
-
isUint8Array: serialized instanceof Uint8Array,
|
|
97
|
-
isArrayBuffer: serialized instanceof ArrayBuffer,
|
|
98
|
-
dataLength:
|
|
99
|
-
(serialized as any).byteLength || (serialized as any).length,
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Convert Uint8Array to ArrayBuffer for proper transmission
|
|
103
|
-
if (serialized instanceof Uint8Array) {
|
|
104
|
-
const buffer = serialized.buffer.slice(
|
|
105
|
-
serialized.byteOffset,
|
|
106
|
-
serialized.byteOffset + serialized.byteLength,
|
|
107
|
-
);
|
|
108
|
-
// Handle SharedArrayBuffer case
|
|
109
|
-
if (buffer instanceof SharedArrayBuffer) {
|
|
110
|
-
const arrayBuffer = new ArrayBuffer(buffer.byteLength);
|
|
111
|
-
new Uint8Array(arrayBuffer).set(new Uint8Array(buffer));
|
|
112
|
-
actor.rLog.debug({
|
|
113
|
-
msg: "converted SharedArrayBuffer to ArrayBuffer",
|
|
114
|
-
byteLength: arrayBuffer.byteLength,
|
|
115
|
-
});
|
|
116
|
-
state.websocket.send(arrayBuffer);
|
|
117
|
-
} else {
|
|
118
|
-
actor.rLog.debug({
|
|
119
|
-
msg: "sending ArrayBuffer",
|
|
120
|
-
byteLength: buffer.byteLength,
|
|
121
|
-
});
|
|
122
|
-
state.websocket.send(buffer);
|
|
123
|
-
}
|
|
124
|
-
} else {
|
|
125
|
-
actor.rLog.debug({
|
|
126
|
-
msg: "sending string data",
|
|
127
|
-
length: (serialized as string).length,
|
|
128
|
-
});
|
|
129
|
-
state.websocket.send(serialized);
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
disconnect: async (
|
|
134
|
-
_actor: AnyActorInstance,
|
|
135
|
-
_conn: AnyConn,
|
|
136
|
-
state: ConnDriverWebSocketState,
|
|
137
|
-
reason?: string,
|
|
138
|
-
) => {
|
|
139
|
-
// Close socket
|
|
140
|
-
state.websocket.close(1000, reason);
|
|
141
|
-
|
|
142
|
-
// Create promise to wait for socket to close gracefully
|
|
143
|
-
await state.closePromise.promise;
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
getConnectionReadyState: (
|
|
147
|
-
_actor: AnyActorInstance,
|
|
148
|
-
_conn: AnyConn,
|
|
149
|
-
state: ConnDriverWebSocketState,
|
|
150
|
-
): ConnReadyState | undefined => {
|
|
151
|
-
return state.websocket.readyState;
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
// MARK: SSE
|
|
156
|
-
const SSE_DRIVER: ConnDriver<ConnDriverSseState> = {
|
|
157
|
-
sendMessage: (
|
|
158
|
-
_actor: AnyActorInstance,
|
|
159
|
-
_conn: AnyConn,
|
|
160
|
-
state: ConnDriverSseState,
|
|
161
|
-
message: CachedSerializer<protocol.ToClient>,
|
|
162
|
-
) => {
|
|
163
|
-
state.stream.writeSSE({
|
|
164
|
-
data: encodeDataToString(message.serialize(state.encoding)),
|
|
165
|
-
});
|
|
166
|
-
},
|
|
167
|
-
|
|
168
|
-
disconnect: async (
|
|
169
|
-
_actor: AnyActorInstance,
|
|
170
|
-
_conn: AnyConn,
|
|
171
|
-
state: ConnDriverSseState,
|
|
172
|
-
_reason?: string,
|
|
173
|
-
) => {
|
|
174
|
-
state.stream.close();
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
getConnectionReadyState: (
|
|
178
|
-
_actor: AnyActorInstance,
|
|
179
|
-
_conn: AnyConn,
|
|
180
|
-
state: ConnDriverSseState,
|
|
181
|
-
): ConnReadyState | undefined => {
|
|
182
|
-
if (state.stream.aborted || state.stream.closed) {
|
|
183
|
-
return ConnReadyState.CLOSED;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return ConnReadyState.OPEN;
|
|
187
|
-
},
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
// MARK: HTTP
|
|
191
|
-
const HTTP_DRIVER: ConnDriver<ConnDriverHttpState> = {
|
|
192
|
-
getConnectionReadyState(_actor, _conn) {
|
|
193
|
-
// TODO: This might not be the correct logic
|
|
194
|
-
return ConnReadyState.OPEN;
|
|
195
|
-
},
|
|
196
|
-
disconnect: async () => {
|
|
197
|
-
// Noop
|
|
198
|
-
// TODO: Abort the request
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
/** List of all connection drivers. */
|
|
203
|
-
export const CONN_DRIVERS: Record<ConnDriverKind, ConnDriver<unknown>> = {
|
|
204
|
-
[ConnDriverKind.WEBSOCKET]: WEBSOCKET_DRIVER,
|
|
205
|
-
[ConnDriverKind.SSE]: SSE_DRIVER,
|
|
206
|
-
[ConnDriverKind.HTTP]: HTTP_DRIVER,
|
|
207
|
-
};
|
|
208
|
-
|
|
209
|
-
export function getConnDriverKindFromState(
|
|
210
|
-
state: ConnDriverState,
|
|
211
|
-
): ConnDriverKind {
|
|
212
|
-
if (ConnDriverKind.WEBSOCKET in state) return ConnDriverKind.WEBSOCKET;
|
|
213
|
-
else if (ConnDriverKind.SSE in state) return ConnDriverKind.SSE;
|
|
214
|
-
else if (ConnDriverKind.HTTP in state) return ConnDriverKind.HTTP;
|
|
215
|
-
else assertUnreachable(state);
|
|
216
|
-
}
|
package/src/actor/conn-socket.ts
DELETED
package/src/actor/conn.ts
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import * as cbor from "cbor-x";
|
|
2
|
-
import invariant from "invariant";
|
|
3
|
-
import { PersistedHibernatableWebSocket } from "@/schemas/actor-persist/mod";
|
|
4
|
-
import type * as protocol from "@/schemas/client-protocol/mod";
|
|
5
|
-
import { TO_CLIENT_VERSIONED } from "@/schemas/client-protocol/versioned";
|
|
6
|
-
import { arrayBuffersEqual, bufferToArrayBuffer } from "@/utils";
|
|
7
|
-
import {
|
|
8
|
-
CONN_DRIVERS,
|
|
9
|
-
ConnDriverKind,
|
|
10
|
-
type ConnDriverState,
|
|
11
|
-
ConnReadyState,
|
|
12
|
-
getConnDriverKindFromState,
|
|
13
|
-
} from "./conn-drivers";
|
|
14
|
-
import type { ConnSocket } from "./conn-socket";
|
|
15
|
-
import type { AnyDatabaseProvider } from "./database";
|
|
16
|
-
import * as errors from "./errors";
|
|
17
|
-
import { type ActorInstance, PERSIST_SYMBOL } from "./instance";
|
|
18
|
-
import type { PersistedConn } from "./persisted";
|
|
19
|
-
import { CachedSerializer } from "./protocol/serde";
|
|
20
|
-
import { generateSecureToken } from "./utils";
|
|
21
|
-
|
|
22
|
-
export function generateConnId(): string {
|
|
23
|
-
return crypto.randomUUID();
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function generateConnToken(): string {
|
|
27
|
-
return generateSecureToken(32);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function generateConnRequestId(): string {
|
|
31
|
-
return crypto.randomUUID();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type ConnId = string;
|
|
35
|
-
|
|
36
|
-
export type AnyConn = Conn<any, any, any, any, any, any>;
|
|
37
|
-
|
|
38
|
-
export type ConnectionStatus = "connected" | "reconnecting";
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Represents a client connection to a actor.
|
|
42
|
-
*
|
|
43
|
-
* Manages connection-specific data and controls the connection lifecycle.
|
|
44
|
-
*
|
|
45
|
-
* @see {@link https://rivet.dev/docs/connections|Connection Documentation}
|
|
46
|
-
*/
|
|
47
|
-
export class Conn<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {
|
|
48
|
-
subscriptions: Set<string> = new Set<string>();
|
|
49
|
-
|
|
50
|
-
// TODO: Remove this cyclical reference
|
|
51
|
-
#actor: ActorInstance<S, CP, CS, V, I, DB>;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* The proxied state that notifies of changes automatically.
|
|
55
|
-
*
|
|
56
|
-
* Any data that should be stored indefinitely should be held within this object.
|
|
57
|
-
*/
|
|
58
|
-
__persist: PersistedConn<CP, CS>;
|
|
59
|
-
|
|
60
|
-
get __driverState(): ConnDriverState | undefined {
|
|
61
|
-
return this.__socket?.driverState;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Socket connected to this connection.
|
|
66
|
-
*
|
|
67
|
-
* If undefined, then nothing is connected to this.
|
|
68
|
-
*/
|
|
69
|
-
__socket?: ConnSocket;
|
|
70
|
-
|
|
71
|
-
get __status(): ConnectionStatus {
|
|
72
|
-
// TODO: isHibernatible might be true while the actual hibernatable websocket has disconnected
|
|
73
|
-
if (this.__socket || this.isHibernatable) {
|
|
74
|
-
return "connected";
|
|
75
|
-
} else {
|
|
76
|
-
return "reconnecting";
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
public get params(): CP {
|
|
81
|
-
return this.__persist.params;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
public get __stateEnabled() {
|
|
85
|
-
return this.#actor.connStateEnabled;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Gets the current state of the connection.
|
|
90
|
-
*
|
|
91
|
-
* Throws an error if the state is not enabled.
|
|
92
|
-
*/
|
|
93
|
-
public get state(): CS {
|
|
94
|
-
this.#validateStateEnabled();
|
|
95
|
-
if (!this.__persist.state) throw new Error("state should exists");
|
|
96
|
-
return this.__persist.state;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Sets the state of the connection.
|
|
101
|
-
*
|
|
102
|
-
* Throws an error if the state is not enabled.
|
|
103
|
-
*/
|
|
104
|
-
public set state(value: CS) {
|
|
105
|
-
this.#validateStateEnabled();
|
|
106
|
-
this.__persist.state = value;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Unique identifier for the connection.
|
|
111
|
-
*/
|
|
112
|
-
public get id(): ConnId {
|
|
113
|
-
return this.__persist.connId;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Token used to authenticate this request.
|
|
118
|
-
*/
|
|
119
|
-
public get _token(): string {
|
|
120
|
-
return this.__persist.token;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Status of the connection.
|
|
125
|
-
*/
|
|
126
|
-
public get status(): ConnectionStatus {
|
|
127
|
-
return this.__status;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* @experimental
|
|
132
|
-
*
|
|
133
|
-
* If the underlying connection can hibernate.
|
|
134
|
-
*/
|
|
135
|
-
public get isHibernatable(): boolean {
|
|
136
|
-
if (!this.__persist.hibernatableRequestId) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
return (
|
|
140
|
-
this.#actor[PERSIST_SYMBOL].hibernatableWebSocket.findIndex((x) =>
|
|
141
|
-
arrayBuffersEqual(
|
|
142
|
-
x.requestId,
|
|
143
|
-
this.__persist.hibernatableRequestId!,
|
|
144
|
-
),
|
|
145
|
-
) > -1
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Timestamp of the last time the connection was seen, i.e. the last time the connection was active and checked for liveness.
|
|
151
|
-
*/
|
|
152
|
-
public get lastSeen(): number {
|
|
153
|
-
return this.__persist.lastSeen;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Initializes a new instance of the Connection class.
|
|
158
|
-
*
|
|
159
|
-
* This should only be constructed by {@link Actor}.
|
|
160
|
-
*
|
|
161
|
-
* @protected
|
|
162
|
-
*/
|
|
163
|
-
public constructor(
|
|
164
|
-
actor: ActorInstance<S, CP, CS, V, I, DB>,
|
|
165
|
-
persist: PersistedConn<CP, CS>,
|
|
166
|
-
) {
|
|
167
|
-
this.#actor = actor;
|
|
168
|
-
this.__persist = persist;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
#validateStateEnabled() {
|
|
172
|
-
if (!this.__stateEnabled) {
|
|
173
|
-
throw new errors.ConnStateNotEnabled();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Sends a WebSocket message to the client.
|
|
179
|
-
*
|
|
180
|
-
* @param message - The message to send.
|
|
181
|
-
*
|
|
182
|
-
* @protected
|
|
183
|
-
*/
|
|
184
|
-
public _sendMessage(message: CachedSerializer<protocol.ToClient>) {
|
|
185
|
-
if (this.__driverState) {
|
|
186
|
-
const driverKind = getConnDriverKindFromState(this.__driverState);
|
|
187
|
-
const driver = CONN_DRIVERS[driverKind];
|
|
188
|
-
if (driver.sendMessage) {
|
|
189
|
-
driver.sendMessage(
|
|
190
|
-
this.#actor,
|
|
191
|
-
this,
|
|
192
|
-
(this.__driverState as any)[driverKind],
|
|
193
|
-
message,
|
|
194
|
-
);
|
|
195
|
-
} else {
|
|
196
|
-
this.#actor.rLog.debug({
|
|
197
|
-
msg: "conn driver does not support sending messages",
|
|
198
|
-
conn: this.id,
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
} else {
|
|
202
|
-
this.#actor.rLog.warn({
|
|
203
|
-
msg: "missing connection driver state for send message",
|
|
204
|
-
conn: this.id,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Sends an event with arguments to the client.
|
|
211
|
-
*
|
|
212
|
-
* @param eventName - The name of the event.
|
|
213
|
-
* @param args - The arguments for the event.
|
|
214
|
-
* @see {@link https://rivet.dev/docs/events|Events Documentation}
|
|
215
|
-
*/
|
|
216
|
-
public send(eventName: string, ...args: unknown[]) {
|
|
217
|
-
this.#actor.inspector.emitter.emit("eventFired", {
|
|
218
|
-
type: "event",
|
|
219
|
-
eventName,
|
|
220
|
-
args,
|
|
221
|
-
connId: this.id,
|
|
222
|
-
});
|
|
223
|
-
this._sendMessage(
|
|
224
|
-
new CachedSerializer<protocol.ToClient>(
|
|
225
|
-
{
|
|
226
|
-
body: {
|
|
227
|
-
tag: "Event",
|
|
228
|
-
val: {
|
|
229
|
-
name: eventName,
|
|
230
|
-
args: bufferToArrayBuffer(cbor.encode(args)),
|
|
231
|
-
},
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
TO_CLIENT_VERSIONED,
|
|
235
|
-
),
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/**
|
|
240
|
-
* Disconnects the client with an optional reason.
|
|
241
|
-
*
|
|
242
|
-
* @param reason - The reason for disconnection.
|
|
243
|
-
*/
|
|
244
|
-
public async disconnect(reason?: string) {
|
|
245
|
-
if (this.__socket && this.__driverState) {
|
|
246
|
-
const driverKind = getConnDriverKindFromState(this.__driverState);
|
|
247
|
-
const driver = CONN_DRIVERS[driverKind];
|
|
248
|
-
if (driver.disconnect) {
|
|
249
|
-
driver.disconnect(
|
|
250
|
-
this.#actor,
|
|
251
|
-
this,
|
|
252
|
-
(this.__driverState as any)[driverKind],
|
|
253
|
-
reason,
|
|
254
|
-
);
|
|
255
|
-
} else {
|
|
256
|
-
this.#actor.rLog.debug({
|
|
257
|
-
msg: "no disconnect handler for conn driver",
|
|
258
|
-
conn: this.id,
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
this.#actor.__connDisconnected(this, true, this.__socket.requestId);
|
|
263
|
-
} else {
|
|
264
|
-
this.#actor.rLog.warn({
|
|
265
|
-
msg: "missing connection driver state for disconnect",
|
|
266
|
-
conn: this.id,
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
this.__socket = undefined;
|
|
271
|
-
}
|
|
272
|
-
}
|