rivetkit 2.0.4 → 2.0.5
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/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/{chunk-HLLF4B4Q.js → chunk-2MD57QF4.js} +7 -5
- package/dist/tsup/chunk-2MD57QF4.js.map +1 -0
- package/dist/tsup/{chunk-SBHHJ6QS.cjs → chunk-5QGQK44L.cjs} +2 -2
- package/dist/tsup/{chunk-SBHHJ6QS.cjs.map → chunk-5QGQK44L.cjs.map} +1 -1
- package/dist/tsup/{chunk-4CXBCT26.cjs → chunk-5YTI25C3.cjs} +7 -7
- package/dist/tsup/{chunk-4CXBCT26.cjs.map → chunk-5YTI25C3.cjs.map} +1 -1
- package/dist/tsup/{chunk-TQ62L3X7.js → chunk-B2QGJGZQ.js} +18 -5
- package/dist/tsup/chunk-B2QGJGZQ.js.map +1 -0
- package/dist/tsup/{chunk-PQY7KKTL.js → chunk-CFFKMUYH.js} +32 -7
- package/dist/tsup/{chunk-PQY7KKTL.js.map → chunk-CFFKMUYH.js.map} +1 -1
- package/dist/tsup/{chunk-H26RP6GD.js → chunk-CKA54YQN.js} +2 -2
- package/dist/tsup/chunk-D7NWUCRK.cjs +20 -0
- package/dist/tsup/{chunk-4R73YDN3.cjs.map → chunk-D7NWUCRK.cjs.map} +1 -1
- package/dist/tsup/{chunk-IH6CKNDW.cjs → chunk-FGFT4FVX.cjs} +9 -9
- package/dist/tsup/{chunk-IH6CKNDW.cjs.map → chunk-FGFT4FVX.cjs.map} +1 -1
- package/dist/tsup/{chunk-HI3HWJRC.js → chunk-I5VTWPHW.js} +4 -4
- package/dist/tsup/{chunk-HI3HWJRC.js.map → chunk-I5VTWPHW.js.map} +1 -1
- package/dist/tsup/{chunk-GICQ3YCU.cjs → chunk-IRMBWX36.cjs} +39 -37
- package/dist/tsup/chunk-IRMBWX36.cjs.map +1 -0
- package/dist/tsup/{chunk-XJQHKJ4P.js → chunk-L7QRXNWP.js} +331 -62
- package/dist/tsup/chunk-L7QRXNWP.js.map +1 -0
- package/dist/tsup/{chunk-LWNKVZG5.cjs → chunk-LZIBTLEY.cjs} +12 -12
- package/dist/tsup/{chunk-LWNKVZG5.cjs.map → chunk-LZIBTLEY.cjs.map} +1 -1
- package/dist/tsup/{chunk-VO7ZRVVD.cjs → chunk-MRZS2J4X.cjs} +581 -312
- package/dist/tsup/chunk-MRZS2J4X.cjs.map +1 -0
- package/dist/tsup/{chunk-QK72M5JB.js → chunk-PG3K2LI7.js} +2 -2
- package/dist/tsup/{chunk-QNNXFOQV.cjs → chunk-PHSQJ6QI.cjs} +3 -3
- package/dist/tsup/{chunk-QNNXFOQV.cjs.map → chunk-PHSQJ6QI.cjs.map} +1 -1
- package/dist/tsup/{chunk-WHBPJNGW.cjs → chunk-RM2SVURR.cjs} +29 -16
- package/dist/tsup/chunk-RM2SVURR.cjs.map +1 -0
- package/dist/tsup/{chunk-6LJT3QRL.cjs → chunk-WADSS5X4.cjs} +37 -12
- package/dist/tsup/chunk-WADSS5X4.cjs.map +1 -0
- package/dist/tsup/{chunk-LV2S3OU3.js → chunk-WNGOBAA7.js} +2 -2
- package/dist/tsup/{chunk-NFU2BBT5.js → chunk-YPZFLUO6.js} +2 -2
- package/dist/tsup/chunk-YPZFLUO6.js.map +1 -0
- package/dist/tsup/{chunk-3F2YSRJL.js → chunk-YW6Y6VNE.js} +4 -4
- package/dist/tsup/client/mod.cjs +10 -10
- package/dist/tsup/client/mod.d.cts +2 -2
- package/dist/tsup/client/mod.d.ts +2 -2
- package/dist/tsup/client/mod.js +9 -9
- package/dist/tsup/common/log.cjs +4 -4
- package/dist/tsup/common/log.js +3 -3
- package/dist/tsup/common/websocket.cjs +5 -5
- package/dist/tsup/common/websocket.js +4 -4
- package/dist/tsup/{connection-BI-6UIBJ.d.ts → connection-BvE-Oq7t.d.ts} +22 -11
- package/dist/tsup/{connection-Dyd4NLGW.d.cts → connection-DTzmWwU5.d.cts} +22 -11
- package/dist/tsup/driver-helpers/mod.cjs +6 -6
- package/dist/tsup/driver-helpers/mod.d.cts +2 -2
- package/dist/tsup/driver-helpers/mod.d.ts +2 -2
- package/dist/tsup/driver-helpers/mod.js +5 -5
- package/dist/tsup/driver-test-suite/mod.cjs +606 -140
- package/dist/tsup/driver-test-suite/mod.cjs.map +1 -1
- package/dist/tsup/driver-test-suite/mod.d.cts +2 -2
- package/dist/tsup/driver-test-suite/mod.d.ts +2 -2
- package/dist/tsup/driver-test-suite/mod.js +563 -97
- package/dist/tsup/driver-test-suite/mod.js.map +1 -1
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/mod.cjs +9 -9
- package/dist/tsup/mod.d.cts +3 -3
- package/dist/tsup/mod.d.ts +3 -3
- package/dist/tsup/mod.js +8 -8
- package/dist/tsup/{router-endpoints-BTe_Rsdn.d.cts → router-endpoints-CctffZNL.d.cts} +1 -1
- package/dist/tsup/{router-endpoints-CBSrKHmo.d.ts → router-endpoints-DFm1BglJ.d.ts} +1 -1
- package/dist/tsup/test/mod.cjs +10 -10
- package/dist/tsup/test/mod.d.cts +1 -1
- package/dist/tsup/test/mod.d.ts +1 -1
- package/dist/tsup/test/mod.js +9 -9
- package/dist/tsup/utils.cjs +5 -3
- package/dist/tsup/utils.cjs.map +1 -1
- package/dist/tsup/utils.d.cts +18 -1
- package/dist/tsup/utils.d.ts +18 -1
- package/dist/tsup/utils.js +4 -2
- package/package.json +4 -4
- package/src/actor/errors.ts +1 -1
- package/src/actor/router-endpoints.ts +6 -1
- package/src/actor/router.ts +2 -1
- package/src/client/mod.ts +1 -1
- package/src/client/raw-utils.ts +1 -1
- package/src/driver-test-suite/mod.ts +1 -1
- package/src/driver-test-suite/test-inline-client-driver.ts +588 -0
- package/src/driver-test-suite/tests/actor-error-handling.ts +4 -12
- package/src/driver-test-suite/tests/actor-inspector.ts +2 -1
- package/src/driver-test-suite/utils.ts +10 -9
- package/src/drivers/file-system/global-state.ts +3 -1
- package/src/drivers/file-system/manager.ts +16 -21
- package/src/manager/router.ts +373 -5
- package/src/registry/mod.ts +29 -33
- package/src/registry/run-config.ts +16 -1
- package/src/remote-manager-driver/actor-http-client.ts +3 -1
- package/src/remote-manager-driver/actor-websocket-client.ts +2 -1
- package/src/remote-manager-driver/api-utils.ts +4 -1
- package/src/remote-manager-driver/mod.ts +2 -1
- package/src/utils.ts +53 -0
- package/dist/tsup/chunk-4R73YDN3.cjs +0 -20
- package/dist/tsup/chunk-6LJT3QRL.cjs.map +0 -1
- package/dist/tsup/chunk-GICQ3YCU.cjs.map +0 -1
- package/dist/tsup/chunk-HLLF4B4Q.js.map +0 -1
- package/dist/tsup/chunk-NFU2BBT5.js.map +0 -1
- package/dist/tsup/chunk-TQ62L3X7.js.map +0 -1
- package/dist/tsup/chunk-VO7ZRVVD.cjs.map +0 -1
- package/dist/tsup/chunk-WHBPJNGW.cjs.map +0 -1
- package/dist/tsup/chunk-XJQHKJ4P.js.map +0 -1
- /package/dist/tsup/{chunk-H26RP6GD.js.map → chunk-CKA54YQN.js.map} +0 -0
- /package/dist/tsup/{chunk-QK72M5JB.js.map → chunk-PG3K2LI7.js.map} +0 -0
- /package/dist/tsup/{chunk-LV2S3OU3.js.map → chunk-WNGOBAA7.js.map} +0 -0
- /package/dist/tsup/{chunk-3F2YSRJL.js.map → chunk-YW6Y6VNE.js.map} +0 -0
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
var
|
|
38
|
+
var _chunk5QGQK44Lcjs = require('../chunk-5QGQK44L.cjs');
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
|
|
@@ -73,5 +73,5 @@ var _chunkSBHHJ6QScjs = require('../chunk-SBHHJ6QS.cjs');
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
|
|
76
|
-
exports.ActionNotFound =
|
|
76
|
+
exports.ActionNotFound = _chunk5QGQK44Lcjs.ActionNotFound; exports.ActionTimedOut = _chunk5QGQK44Lcjs.ActionTimedOut; exports.ActorAlreadyExists = _chunk5QGQK44Lcjs.ActorAlreadyExists; exports.ActorError = _chunk5QGQK44Lcjs.ActorError; exports.ActorNotFound = _chunk5QGQK44Lcjs.ActorNotFound; exports.ConnNotFound = _chunk5QGQK44Lcjs.ConnNotFound; exports.ConnStateNotEnabled = _chunk5QGQK44Lcjs.ConnStateNotEnabled; exports.DatabaseNotEnabled = _chunk5QGQK44Lcjs.DatabaseNotEnabled; exports.FeatureNotImplemented = _chunk5QGQK44Lcjs.FeatureNotImplemented; exports.FetchHandlerNotDefined = _chunk5QGQK44Lcjs.FetchHandlerNotDefined; exports.Forbidden = _chunk5QGQK44Lcjs.Forbidden; exports.INTERNAL_ERROR_CODE = _chunk5QGQK44Lcjs.INTERNAL_ERROR_CODE; exports.INTERNAL_ERROR_DESCRIPTION = _chunk5QGQK44Lcjs.INTERNAL_ERROR_DESCRIPTION; exports.IncorrectConnToken = _chunk5QGQK44Lcjs.IncorrectConnToken; exports.InternalError = _chunk5QGQK44Lcjs.InternalError; exports.InvalidActionRequest = _chunk5QGQK44Lcjs.InvalidActionRequest; exports.InvalidEncoding = _chunk5QGQK44Lcjs.InvalidEncoding; exports.InvalidFetchResponse = _chunk5QGQK44Lcjs.InvalidFetchResponse; exports.InvalidParams = _chunk5QGQK44Lcjs.InvalidParams; exports.InvalidQueryJSON = _chunk5QGQK44Lcjs.InvalidQueryJSON; exports.InvalidRequest = _chunk5QGQK44Lcjs.InvalidRequest; exports.InvalidStateType = _chunk5QGQK44Lcjs.InvalidStateType; exports.MalformedMessage = _chunk5QGQK44Lcjs.MalformedMessage; exports.MessageTooLong = _chunk5QGQK44Lcjs.MessageTooLong; exports.MissingActorHeader = _chunk5QGQK44Lcjs.MissingActorHeader; exports.ProxyError = _chunk5QGQK44Lcjs.ProxyError; exports.RouteNotFound = _chunk5QGQK44Lcjs.RouteNotFound; exports.StateNotEnabled = _chunk5QGQK44Lcjs.StateNotEnabled; exports.USER_ERROR_CODE = _chunk5QGQK44Lcjs.USER_ERROR_CODE; exports.Unauthorized = _chunk5QGQK44Lcjs.Unauthorized; exports.Unreachable = _chunk5QGQK44Lcjs.Unreachable; exports.Unsupported = _chunk5QGQK44Lcjs.Unsupported; exports.UserError = _chunk5QGQK44Lcjs.UserError; exports.VarsNotEnabled = _chunk5QGQK44Lcjs.VarsNotEnabled; exports.WebSocketHandlerNotDefined = _chunk5QGQK44Lcjs.WebSocketHandlerNotDefined; exports.WebSocketsNotEnabled = _chunk5QGQK44Lcjs.WebSocketsNotEnabled;
|
|
77
77
|
//# sourceMappingURL=errors.cjs.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getLogger
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WNGOBAA7.js";
|
|
4
4
|
import {
|
|
5
5
|
assertUnreachable,
|
|
6
6
|
bufferToArrayBuffer,
|
|
7
7
|
deconstructError,
|
|
8
8
|
stringifyError
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-CFFKMUYH.js";
|
|
10
10
|
import {
|
|
11
11
|
ConnNotFound,
|
|
12
12
|
ConnStateNotEnabled,
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
MessageTooLong,
|
|
18
18
|
Unreachable,
|
|
19
19
|
Unsupported
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-YPZFLUO6.js";
|
|
21
21
|
|
|
22
22
|
// src/actor/connection.ts
|
|
23
23
|
import * as cbor2 from "cbor-x";
|
|
@@ -1551,7 +1551,9 @@ async function handleSseConnect(c, _runConfig, actorDriver, actorId, authData) {
|
|
|
1551
1551
|
authData
|
|
1552
1552
|
);
|
|
1553
1553
|
const abortResolver = Promise.withResolvers();
|
|
1554
|
-
stream.onAbort(
|
|
1554
|
+
stream.onAbort(() => {
|
|
1555
|
+
});
|
|
1556
|
+
c.req.raw.signal.addEventListener("abort", async () => {
|
|
1555
1557
|
const rLog = (actor == null ? void 0 : actor.rLog) ?? loggerWithoutContext();
|
|
1556
1558
|
try {
|
|
1557
1559
|
rLog.debug("sse stream aborted");
|
|
@@ -1789,4 +1791,4 @@ export {
|
|
|
1789
1791
|
HEADER_CONN_TOKEN,
|
|
1790
1792
|
ALLOWED_PUBLIC_HEADERS
|
|
1791
1793
|
};
|
|
1792
|
-
//# sourceMappingURL=chunk-
|
|
1794
|
+
//# sourceMappingURL=chunk-2MD57QF4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actor/connection.ts","../../src/common/versioned-data.ts","../schemas/client-protocol/v1.ts","../../src/schemas/client-protocol/versioned.ts","../../src/actor/protocol/serde.ts","../../src/serde.ts","../../src/actor/log.ts","../../src/actor/utils.ts","../../src/actor/router-endpoints.ts","../../src/actor/action.ts","../../src/manager/log.ts","../../src/manager/hono-websocket-adapter.ts","../../src/actor/protocol/old.ts"],"sourcesContent":["import * as cbor from \"cbor-x\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport { TO_CLIENT_VERSIONED } from \"@/schemas/client-protocol/versioned\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { AnyDatabaseProvider } from \"./database\";\nimport { type ConnDriver, ConnectionReadyState } from \"./driver\";\nimport * as errors from \"./errors\";\nimport type { ActorInstance } from \"./instance\";\nimport { loggerWithoutContext } from \"./log\";\nimport type { PersistedConn } from \"./persisted\";\nimport { CachedSerializer } from \"./protocol/serde\";\nimport { generateSecureToken } from \"./utils\";\n\nexport function generateConnId(): string {\n\treturn crypto.randomUUID();\n}\n\nexport function generateConnToken(): string {\n\treturn generateSecureToken(32);\n}\n\nexport type ConnId = string;\n\nexport type AnyConn = Conn<any, any, any, any, any, any>;\n\nexport const CONNECTION_DRIVER_WEBSOCKET = \"webSocket\";\nexport const CONNECTION_DRIVER_SSE = \"sse\";\nexport const CONNECTION_DRIVER_HTTP = \"http\";\n\nexport type ConnectionDriver =\n\t| typeof CONNECTION_DRIVER_WEBSOCKET\n\t| typeof CONNECTION_DRIVER_SSE\n\t| typeof CONNECTION_DRIVER_HTTP;\n\nexport type ConnectionStatus = \"connected\" | \"reconnecting\";\n\nexport const CONNECTION_CHECK_LIVENESS_SYMBOL = Symbol(\"checkLiveness\");\n\n/**\n * Represents a client connection to a actor.\n *\n * Manages connection-specific data and controls the connection lifecycle.\n *\n * @see {@link https://rivet.dev/docs/connections|Connection Documentation}\n */\nexport class Conn<S, CP, CS, V, I, DB extends AnyDatabaseProvider> {\n\tsubscriptions: Set<string> = new Set<string>();\n\n\t#stateEnabled: boolean;\n\n\t// TODO: Remove this cyclical reference\n\t#actor: ActorInstance<S, CP, CS, V, I, DB>;\n\n\t#status: ConnectionStatus = \"connected\";\n\n\t/**\n\t * The proxied state that notifies of changes automatically.\n\t *\n\t * Any data that should be stored indefinitely should be held within this object.\n\t */\n\t__persist: PersistedConn<CP, CS>;\n\n\t/**\n\t * Driver used to manage realtime connection communication.\n\t *\n\t * @protected\n\t */\n\t#driver: ConnDriver;\n\n\tpublic get params(): CP {\n\t\treturn this.__persist.params;\n\t}\n\n\tpublic get driver(): ConnectionDriver {\n\t\treturn this.__persist.connDriver as ConnectionDriver;\n\t}\n\n\tpublic get _stateEnabled() {\n\t\treturn this.#stateEnabled;\n\t}\n\n\t/**\n\t * Gets the current state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic get state(): CS {\n\t\tthis.#validateStateEnabled();\n\t\tif (!this.__persist.state) throw new Error(\"state should exists\");\n\t\treturn this.__persist.state;\n\t}\n\n\t/**\n\t * Sets the state of the connection.\n\t *\n\t * Throws an error if the state is not enabled.\n\t */\n\tpublic set state(value: CS) {\n\t\tthis.#validateStateEnabled();\n\t\tthis.__persist.state = value;\n\t}\n\n\t/**\n\t * Unique identifier for the connection.\n\t */\n\tpublic get id(): ConnId {\n\t\treturn this.__persist.connId;\n\t}\n\n\t/**\n\t * Token used to authenticate this request.\n\t */\n\tpublic get _token(): string {\n\t\treturn this.__persist.token;\n\t}\n\n\t/**\n\t * Status of the connection.\n\t */\n\tpublic get status(): ConnectionStatus {\n\t\treturn this.#status;\n\t}\n\n\t/**\n\t * Timestamp of the last time the connection was seen, i.e. the last time the connection was active and checked for liveness.\n\t */\n\tpublic get lastSeen(): number {\n\t\treturn this.__persist.lastSeen;\n\t}\n\n\t/**\n\t * Initializes a new instance of the Connection class.\n\t *\n\t * This should only be constructed by {@link Actor}.\n\t *\n\t * @protected\n\t */\n\tpublic constructor(\n\t\tactor: ActorInstance<S, CP, CS, V, I, DB>,\n\t\tpersist: PersistedConn<CP, CS>,\n\t\tdriver: ConnDriver,\n\t\tstateEnabled: boolean,\n\t) {\n\t\tthis.#actor = actor;\n\t\tthis.__persist = persist;\n\t\tthis.#driver = driver;\n\t\tthis.#stateEnabled = stateEnabled;\n\t}\n\n\t#validateStateEnabled() {\n\t\tif (!this.#stateEnabled) {\n\t\t\tthrow new errors.ConnStateNotEnabled();\n\t\t}\n\t}\n\n\t/**\n\t * Sends a WebSocket message to the client.\n\t *\n\t * @param message - The message to send.\n\t *\n\t * @protected\n\t */\n\tpublic _sendMessage(message: CachedSerializer<protocol.ToClient>) {\n\t\tthis.#driver.sendMessage?.(\n\t\t\tthis.#actor,\n\t\t\tthis,\n\t\t\tthis.__persist.connDriverState,\n\t\t\tmessage,\n\t\t);\n\t}\n\n\t/**\n\t * Sends an event with arguments to the client.\n\t *\n\t * @param eventName - The name of the event.\n\t * @param args - The arguments for the event.\n\t * @see {@link https://rivet.dev/docs/events|Events Documentation}\n\t */\n\tpublic send(eventName: string, ...args: unknown[]) {\n\t\tthis.#actor.inspector.emitter.emit(\"eventFired\", {\n\t\t\ttype: \"event\",\n\t\t\teventName,\n\t\t\targs,\n\t\t\tconnId: this.id,\n\t\t});\n\t\tthis._sendMessage(\n\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t{\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Event\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tname: eventName,\n\t\t\t\t\t\t\targs: bufferToArrayBuffer(cbor.encode(args)),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Disconnects the client with an optional reason.\n\t *\n\t * @param reason - The reason for disconnection.\n\t */\n\tpublic async disconnect(reason?: string) {\n\t\tthis.#status = \"reconnecting\";\n\t\tawait this.#driver.disconnect(\n\t\t\tthis.#actor,\n\t\t\tthis,\n\t\t\tthis.__persist.connDriverState,\n\t\t\treason,\n\t\t);\n\t}\n\n\t/**\n\t * This method checks the connection's liveness by querying the driver for its ready state.\n\t * If the connection is not closed, it updates the last liveness timestamp and returns `true`.\n\t * Otherwise, it returns `false`.\n\t * @internal\n\t */\n\t[CONNECTION_CHECK_LIVENESS_SYMBOL]() {\n\t\tconst readyState = this.#driver.getConnectionReadyState(this.#actor, this);\n\n\t\tconst isConnectionClosed =\n\t\t\treadyState === ConnectionReadyState.CLOSED ||\n\t\t\treadyState === ConnectionReadyState.CLOSING ||\n\t\t\treadyState === undefined;\n\n\t\tconst newLastSeen = Date.now();\n\t\tconst newStatus = isConnectionClosed ? \"reconnecting\" : \"connected\";\n\n\t\tthis.#actor.rLog.debug({\n\t\t\tmsg: \"liveness probe for connection\",\n\t\t\tconnId: this.id,\n\t\t\tactorId: this.#actor.id,\n\t\t\treadyState,\n\n\t\t\tstatus: this.#status,\n\t\t\tnewStatus,\n\n\t\t\tlastSeen: this.__persist.lastSeen,\n\t\t\tcurrentTs: newLastSeen,\n\t\t});\n\n\t\tif (!isConnectionClosed) {\n\t\t\tthis.__persist.lastSeen = newLastSeen;\n\t\t}\n\n\t\tthis.#status = newStatus;\n\t\treturn {\n\t\t\tstatus: this.#status,\n\t\t\tlastSeen: this.__persist.lastSeen,\n\t\t};\n\t}\n}\n","export interface VersionedData<T> {\n\tversion: number;\n\tdata: T;\n}\n\nexport type MigrationFn<TFrom, TTo> = (data: TFrom) => TTo;\n\nexport interface VersionedDataConfig<T> {\n\tcurrentVersion: number;\n\tmigrations: Map<number, MigrationFn<any, any>>;\n\tserializeVersion: (data: T) => Uint8Array;\n\tdeserializeVersion: (bytes: Uint8Array) => T;\n}\n\nexport class VersionedDataHandler<T> {\n\tconstructor(private config: VersionedDataConfig<T>) {}\n\n\tserializeWithEmbeddedVersion(data: T): Uint8Array {\n\t\tconst versioned: VersionedData<Uint8Array> = {\n\t\t\tversion: this.config.currentVersion,\n\t\t\tdata: this.config.serializeVersion(data),\n\t\t};\n\n\t\treturn this.embedVersion(versioned);\n\t}\n\n\tdeserializeWithEmbeddedVersion(bytes: Uint8Array): T {\n\t\tconst versioned = this.extractVersion(bytes);\n\t\treturn this.deserialize(versioned.data, versioned.version);\n\t}\n\n\tserialize(data: T, version: number): Uint8Array {\n\t\treturn this.config.serializeVersion(data);\n\t}\n\n\tdeserialize(bytes: Uint8Array, version: number): T {\n\t\tif (version === this.config.currentVersion) {\n\t\t\treturn this.config.deserializeVersion(bytes);\n\t\t}\n\n\t\tif (version > this.config.currentVersion) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot decode data from version ${version}, current version is ${this.config.currentVersion}`,\n\t\t\t);\n\t\t}\n\n\t\tlet currentData: any = this.config.deserializeVersion(bytes);\n\t\tlet currentVersion = version;\n\n\t\twhile (currentVersion < this.config.currentVersion) {\n\t\t\tconst migration = this.config.migrations.get(currentVersion);\n\t\t\tif (!migration) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No migration found from version ${currentVersion} to ${currentVersion + 1}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcurrentData = migration(currentData);\n\t\t\tcurrentVersion++;\n\t\t}\n\n\t\treturn currentData;\n\t}\n\n\tprivate embedVersion(data: VersionedData<Uint8Array>): Uint8Array {\n\t\tconst versionBytes = new Uint8Array(4);\n\t\tnew DataView(versionBytes.buffer).setUint32(0, data.version, true);\n\n\t\tconst result = new Uint8Array(versionBytes.length + data.data.length);\n\t\tresult.set(versionBytes);\n\t\tresult.set(data.data, versionBytes.length);\n\n\t\treturn result;\n\t}\n\n\tprivate extractVersion(bytes: Uint8Array): VersionedData<Uint8Array> {\n\t\tif (bytes.length < 4) {\n\t\t\tthrow new Error(\"Invalid versioned data: too short\");\n\t\t}\n\n\t\tconst version = new DataView(bytes.buffer, bytes.byteOffset).getUint32(\n\t\t\t0,\n\t\t\ttrue,\n\t\t);\n\t\tconst data = bytes.slice(4);\n\n\t\treturn { version, data };\n\t}\n}\n\nexport function createVersionedDataHandler<T>(\n\tconfig: VersionedDataConfig<T>,\n): VersionedDataHandler<T> {\n\treturn new VersionedDataHandler(config);\n}\n","import * as bare from \"@bare-ts/lib\"\n\nconst config = /* @__PURE__ */ bare.Config({})\n\nexport type uint = bigint\n\nexport type Init = {\n readonly actorId: string,\n readonly connectionId: string,\n readonly connectionToken: string,\n}\n\nexport function readInit(bc: bare.ByteCursor): Init {\n return {\n actorId: bare.readString(bc),\n connectionId: bare.readString(bc),\n connectionToken: bare.readString(bc),\n }\n}\n\nexport function writeInit(bc: bare.ByteCursor, x: Init): void {\n bare.writeString(bc, x.actorId)\n bare.writeString(bc, x.connectionId)\n bare.writeString(bc, x.connectionToken)\n}\n\nfunction read0(bc: bare.ByteCursor): ArrayBuffer | null {\n return bare.readBool(bc)\n ? bare.readData(bc)\n : null\n}\n\nfunction write0(bc: bare.ByteCursor, x: ArrayBuffer | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeData(bc, x)\n }\n}\n\nfunction read1(bc: bare.ByteCursor): uint | null {\n return bare.readBool(bc)\n ? bare.readUint(bc)\n : null\n}\n\nfunction write1(bc: bare.ByteCursor, x: uint | null): void {\n bare.writeBool(bc, x !== null)\n if (x !== null) {\n bare.writeUint(bc, x)\n }\n}\n\nexport type Error = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n readonly actionId: uint | null,\n}\n\nexport function readError(bc: bare.ByteCursor): Error {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n actionId: read1(bc),\n }\n}\n\nexport function writeError(bc: bare.ByteCursor, x: Error): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n write1(bc, x.actionId)\n}\n\nexport type ActionResponse = {\n readonly id: uint,\n readonly output: ArrayBuffer,\n}\n\nexport function readActionResponse(bc: bare.ByteCursor): ActionResponse {\n return {\n id: bare.readUint(bc),\n output: bare.readData(bc),\n }\n}\n\nexport function writeActionResponse(bc: bare.ByteCursor, x: ActionResponse): void {\n bare.writeUint(bc, x.id)\n bare.writeData(bc, x.output)\n}\n\nexport type Event = {\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readEvent(bc: bare.ByteCursor): Event {\n return {\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeEvent(bc: bare.ByteCursor, x: Event): void {\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type ToClientBody =\n | { readonly tag: \"Init\", readonly val: Init }\n | { readonly tag: \"Error\", readonly val: Error }\n | { readonly tag: \"ActionResponse\", readonly val: ActionResponse }\n | { readonly tag: \"Event\", readonly val: Event }\n\nexport function readToClientBody(bc: bare.ByteCursor): ToClientBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"Init\", val: readInit(bc) }\n case 1:\n return { tag: \"Error\", val: readError(bc) }\n case 2:\n return { tag: \"ActionResponse\", val: readActionResponse(bc) }\n case 3:\n return { tag: \"Event\", val: readEvent(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToClientBody(bc: bare.ByteCursor, x: ToClientBody): void {\n switch (x.tag) {\n case \"Init\": {\n bare.writeU8(bc, 0)\n writeInit(bc, x.val)\n break\n }\n case \"Error\": {\n bare.writeU8(bc, 1)\n writeError(bc, x.val)\n break\n }\n case \"ActionResponse\": {\n bare.writeU8(bc, 2)\n writeActionResponse(bc, x.val)\n break\n }\n case \"Event\": {\n bare.writeU8(bc, 3)\n writeEvent(bc, x.val)\n break\n }\n }\n}\n\nexport type ToClient = {\n readonly body: ToClientBody,\n}\n\nexport function readToClient(bc: bare.ByteCursor): ToClient {\n return {\n body: readToClientBody(bc),\n }\n}\n\nexport function writeToClient(bc: bare.ByteCursor, x: ToClient): void {\n writeToClientBody(bc, x.body)\n}\n\nexport function encodeToClient(x: ToClient): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToClient(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToClient(bytes: Uint8Array): ToClient {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToClient(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type ActionRequest = {\n readonly id: uint,\n readonly name: string,\n readonly args: ArrayBuffer,\n}\n\nexport function readActionRequest(bc: bare.ByteCursor): ActionRequest {\n return {\n id: bare.readUint(bc),\n name: bare.readString(bc),\n args: bare.readData(bc),\n }\n}\n\nexport function writeActionRequest(bc: bare.ByteCursor, x: ActionRequest): void {\n bare.writeUint(bc, x.id)\n bare.writeString(bc, x.name)\n bare.writeData(bc, x.args)\n}\n\nexport type SubscriptionRequest = {\n readonly eventName: string,\n readonly subscribe: boolean,\n}\n\nexport function readSubscriptionRequest(bc: bare.ByteCursor): SubscriptionRequest {\n return {\n eventName: bare.readString(bc),\n subscribe: bare.readBool(bc),\n }\n}\n\nexport function writeSubscriptionRequest(bc: bare.ByteCursor, x: SubscriptionRequest): void {\n bare.writeString(bc, x.eventName)\n bare.writeBool(bc, x.subscribe)\n}\n\nexport type ToServerBody =\n | { readonly tag: \"ActionRequest\", readonly val: ActionRequest }\n | { readonly tag: \"SubscriptionRequest\", readonly val: SubscriptionRequest }\n\nexport function readToServerBody(bc: bare.ByteCursor): ToServerBody {\n const offset = bc.offset\n const tag = bare.readU8(bc)\n switch (tag) {\n case 0:\n return { tag: \"ActionRequest\", val: readActionRequest(bc) }\n case 1:\n return { tag: \"SubscriptionRequest\", val: readSubscriptionRequest(bc) }\n default: {\n bc.offset = offset\n throw new bare.BareError(offset, \"invalid tag\")\n }\n }\n}\n\nexport function writeToServerBody(bc: bare.ByteCursor, x: ToServerBody): void {\n switch (x.tag) {\n case \"ActionRequest\": {\n bare.writeU8(bc, 0)\n writeActionRequest(bc, x.val)\n break\n }\n case \"SubscriptionRequest\": {\n bare.writeU8(bc, 1)\n writeSubscriptionRequest(bc, x.val)\n break\n }\n }\n}\n\nexport type ToServer = {\n readonly body: ToServerBody,\n}\n\nexport function readToServer(bc: bare.ByteCursor): ToServer {\n return {\n body: readToServerBody(bc),\n }\n}\n\nexport function writeToServer(bc: bare.ByteCursor, x: ToServer): void {\n writeToServerBody(bc, x.body)\n}\n\nexport function encodeToServer(x: ToServer): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeToServer(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeToServer(bytes: Uint8Array): ToServer {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readToServer(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionRequest = {\n readonly args: ArrayBuffer,\n}\n\nexport function readHttpActionRequest(bc: bare.ByteCursor): HttpActionRequest {\n return {\n args: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionRequest(bc: bare.ByteCursor, x: HttpActionRequest): void {\n bare.writeData(bc, x.args)\n}\n\nexport function encodeHttpActionRequest(x: HttpActionRequest): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionRequest(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionRequest(bytes: Uint8Array): HttpActionRequest {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionRequest(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpActionResponse = {\n readonly output: ArrayBuffer,\n}\n\nexport function readHttpActionResponse(bc: bare.ByteCursor): HttpActionResponse {\n return {\n output: bare.readData(bc),\n }\n}\n\nexport function writeHttpActionResponse(bc: bare.ByteCursor, x: HttpActionResponse): void {\n bare.writeData(bc, x.output)\n}\n\nexport function encodeHttpActionResponse(x: HttpActionResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpActionResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpActionResponse(bytes: Uint8Array): HttpActionResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpActionResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResponseError = {\n readonly group: string,\n readonly code: string,\n readonly message: string,\n readonly metadata: ArrayBuffer | null,\n}\n\nexport function readHttpResponseError(bc: bare.ByteCursor): HttpResponseError {\n return {\n group: bare.readString(bc),\n code: bare.readString(bc),\n message: bare.readString(bc),\n metadata: read0(bc),\n }\n}\n\nexport function writeHttpResponseError(bc: bare.ByteCursor, x: HttpResponseError): void {\n bare.writeString(bc, x.group)\n bare.writeString(bc, x.code)\n bare.writeString(bc, x.message)\n write0(bc, x.metadata)\n}\n\nexport function encodeHttpResponseError(x: HttpResponseError): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResponseError(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResponseError(bytes: Uint8Array): HttpResponseError {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResponseError(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n\nexport type HttpResolveRequest = null\n\nexport type HttpResolveResponse = {\n readonly actorId: string,\n}\n\nexport function readHttpResolveResponse(bc: bare.ByteCursor): HttpResolveResponse {\n return {\n actorId: bare.readString(bc),\n }\n}\n\nexport function writeHttpResolveResponse(bc: bare.ByteCursor, x: HttpResolveResponse): void {\n bare.writeString(bc, x.actorId)\n}\n\nexport function encodeHttpResolveResponse(x: HttpResolveResponse): Uint8Array {\n const bc = new bare.ByteCursor(\n new Uint8Array(config.initialBufferLength),\n config\n )\n writeHttpResolveResponse(bc, x)\n return new Uint8Array(bc.view.buffer, bc.view.byteOffset, bc.offset)\n}\n\nexport function decodeHttpResolveResponse(bytes: Uint8Array): HttpResolveResponse {\n const bc = new bare.ByteCursor(bytes, config)\n const result = readHttpResolveResponse(bc)\n if (bc.offset < bc.view.byteLength) {\n throw new bare.BareError(bc.offset, \"remaining bytes\")\n }\n return result\n}\n","import {\n\tcreateVersionedDataHandler,\n\ttype MigrationFn,\n} from \"@/common/versioned-data\";\nimport * as v1 from \"../../../dist/schemas/client-protocol/v1\";\n\nexport const CURRENT_VERSION = 1;\n\nconst migrations = new Map<number, MigrationFn<any, any>>();\n\nexport const TO_SERVER_VERSIONED = createVersionedDataHandler<v1.ToServer>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v1.encodeToServer(data),\n\tdeserializeVersion: (bytes) => v1.decodeToServer(bytes),\n});\n\nexport const TO_CLIENT_VERSIONED = createVersionedDataHandler<v1.ToClient>({\n\tcurrentVersion: CURRENT_VERSION,\n\tmigrations,\n\tserializeVersion: (data) => v1.encodeToClient(data),\n\tdeserializeVersion: (bytes) => v1.decodeToClient(bytes),\n});\n\nexport const HTTP_ACTION_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpActionRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpActionRequest(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpActionRequest(bytes),\n\t});\n\nexport const HTTP_ACTION_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpActionResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpActionResponse(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpActionResponse(bytes),\n\t});\n\nexport const HTTP_RESPONSE_ERROR_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResponseError>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpResponseError(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpResponseError(bytes),\n\t});\n\nexport const HTTP_RESOLVE_REQUEST_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResolveRequest>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (_) => new Uint8Array(),\n\t\tdeserializeVersion: (bytes) => null,\n\t});\n\nexport const HTTP_RESOLVE_RESPONSE_VERSIONED =\n\tcreateVersionedDataHandler<v1.HttpResolveResponse>({\n\t\tcurrentVersion: CURRENT_VERSION,\n\t\tmigrations,\n\t\tserializeVersion: (data) => v1.encodeHttpResolveResponse(data),\n\t\tdeserializeVersion: (bytes) => v1.decodeHttpResolveResponse(bytes),\n\t});\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport * as errors from \"@/actor/errors\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\nimport { serializeWithEncoding } from \"@/serde\";\nimport { loggerWithoutContext } from \"../log\";\nimport { assertUnreachable } from \"../utils\";\n\n/** Data that can be deserialized. */\nexport type InputData = string | Buffer | Blob | ArrayBufferLike | Uint8Array;\n\n/** Data that's been serialized. */\nexport type OutputData = string | Uint8Array;\n\nexport const EncodingSchema = z.enum([\"json\", \"cbor\", \"bare\"]);\n\n/**\n * Encoding used to communicate between the client & actor.\n */\nexport type Encoding = z.infer<typeof EncodingSchema>;\n\n/**\n * Helper class that helps serialize data without re-serializing for the same encoding.\n */\nexport class CachedSerializer<T> {\n\t#data: T;\n\t#cache = new Map<Encoding, OutputData>();\n\t#versionedDataHandler: VersionedDataHandler<T>;\n\n\tconstructor(data: T, versionedDataHandler: VersionedDataHandler<T>) {\n\t\tthis.#data = data;\n\t\tthis.#versionedDataHandler = versionedDataHandler;\n\t}\n\n\tpublic get rawData(): T {\n\t\treturn this.#data;\n\t}\n\n\tpublic serialize(encoding: Encoding): OutputData {\n\t\tconst cached = this.#cache.get(encoding);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t} else {\n\t\t\tconst serialized = serializeWithEncoding(\n\t\t\t\tencoding,\n\t\t\t\tthis.#data,\n\t\t\t\tthis.#versionedDataHandler,\n\t\t\t);\n\t\t\tthis.#cache.set(encoding, serialized);\n\t\t\treturn serialized;\n\t\t}\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tlogger().warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tlogger().warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n\n// TODO: Encode base 128\nfunction base64EncodeUint8Array(uint8Array: Uint8Array): string {\n\tlet binary = \"\";\n\tconst len = uint8Array.byteLength;\n\tfor (let i = 0; i < len; i++) {\n\t\tbinary += String.fromCharCode(uint8Array[i]);\n\t}\n\treturn btoa(binary);\n}\n\nfunction base64EncodeArrayBuffer(arrayBuffer: ArrayBuffer): string {\n\tconst uint8Array = new Uint8Array(arrayBuffer);\n\treturn base64EncodeUint8Array(uint8Array);\n}\n\n/** Converts data that was encoded to a string. Some formats (like SSE) don't support raw binary data. */\nexport function encodeDataToString(message: OutputData): string {\n\tif (typeof message === \"string\") {\n\t\treturn message;\n\t} else if (message instanceof ArrayBuffer) {\n\t\treturn base64EncodeArrayBuffer(message);\n\t} else if (message instanceof Uint8Array) {\n\t\treturn base64EncodeUint8Array(message);\n\t} else {\n\t\tassertUnreachable(message);\n\t}\n}\n\n/** Stringifies with compat for values that BARE & CBOR supports. */\nexport function jsonStringifyCompat(input: any): string {\n\treturn JSON.stringify(input, (_key, value) =>\n\t\ttypeof value === \"bigint\" ? value.toString() : value,\n\t);\n}\n","import * as cbor from \"cbor-x\";\nimport invariant from \"invariant\";\nimport { assertUnreachable } from \"@/common/utils\";\nimport type { VersionedDataHandler } from \"@/common/versioned-data\";\nimport type { Encoding } from \"@/mod\";\nimport { jsonStringifyCompat } from \"./actor/protocol/serde\";\n\nexport function encodingIsBinary(encoding: Encoding): boolean {\n\tif (encoding === \"json\") {\n\t\treturn false;\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn true;\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function contentTypeForEncoding(encoding: Encoding): string {\n\tif (encoding === \"json\") {\n\t\treturn \"application/json\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"application/octet-stream\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function wsBinaryTypeForEncoding(\n\tencoding: Encoding,\n): \"arraybuffer\" | \"blob\" {\n\tif (encoding === \"json\") {\n\t\treturn \"blob\";\n\t} else if (encoding === \"cbor\" || encoding === \"bare\") {\n\t\treturn \"arraybuffer\";\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function serializeWithEncoding<T>(\n\tencoding: Encoding,\n\tvalue: T,\n\tversionedDataHandler: VersionedDataHandler<T> | undefined,\n): Uint8Array | string {\n\tif (encoding === \"json\") {\n\t\treturn jsonStringifyCompat(value);\n\t} else if (encoding === \"cbor\") {\n\t\treturn cbor.encode(value);\n\t} else if (encoding === \"bare\") {\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\"VersionedDataHandler is required for 'bare' encoding\");\n\t\t}\n\t\treturn versionedDataHandler.serializeWithEmbeddedVersion(value);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n\nexport function deserializeWithEncoding<T>(\n\tencoding: Encoding,\n\tbuffer: Uint8Array | string,\n\tversionedDataHandler: VersionedDataHandler<T> | undefined,\n): T {\n\tif (encoding === \"json\") {\n\t\tif (typeof buffer === \"string\") {\n\t\t\treturn JSON.parse(buffer);\n\t\t} else {\n\t\t\tconst decoder = new TextDecoder(\"utf-8\");\n\t\t\tconst jsonString = decoder.decode(buffer);\n\t\t\treturn JSON.parse(jsonString);\n\t\t}\n\t} else if (encoding === \"cbor\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for cbor encoding\",\n\t\t);\n\t\treturn cbor.decode(buffer);\n\t} else if (encoding === \"bare\") {\n\t\tinvariant(\n\t\t\ttypeof buffer !== \"string\",\n\t\t\t\"buffer cannot be string for bare encoding\",\n\t\t);\n\t\tif (!versionedDataHandler) {\n\t\t\tthrow new Error(\"VersionedDataHandler is required for 'bare' encoding\");\n\t\t}\n\t\treturn versionedDataHandler.deserializeWithEmbeddedVersion(buffer);\n\t} else {\n\t\tassertUnreachable(encoding);\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\n/** Prever to use ActorInstance.rlog child logger. This does not provide context in the log, should only be used as a last resort if you cannot pass the actor's child logger. */\nexport function loggerWithoutContext() {\n\treturn getLogger(\"actor-runtime\");\n}\n","import * as errors from \"./errors\";\nimport { loggerWithoutContext } from \"./log\";\n\nexport function assertUnreachable(x: never): never {\n\tloggerWithoutContext().error({\n\t\tmsg: \"unreachable\",\n\t\tvalue: `${x}`,\n\t\tstack: new Error().stack,\n\t});\n\tthrow new errors.Unreachable(x);\n}\n\nexport const throttle = <\n\t// biome-ignore lint/suspicious/noExplicitAny: we want to allow any function\n\tFn extends (...args: any) => any,\n>(\n\tfn: Fn,\n\tdelay: number,\n) => {\n\tlet lastRan = false;\n\tlet lastArgs: Parameters<Fn> | null = null;\n\n\treturn (...args: Parameters<Fn>) => {\n\t\tif (!lastRan) {\n\t\t\tfn.apply(this, args);\n\t\t\tlastRan = true;\n\t\t\tconst timer = () =>\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tlastRan = false;\n\t\t\t\t\tif (lastArgs) {\n\t\t\t\t\t\tfn.apply(this, lastArgs);\n\t\t\t\t\t\tlastRan = true;\n\t\t\t\t\t\tlastArgs = null;\n\t\t\t\t\t\ttimer();\n\t\t\t\t\t}\n\t\t\t\t}, delay);\n\t\t\ttimer();\n\t\t} else lastArgs = args;\n\t};\n};\n\nexport class DeadlineError extends Error {\n\tconstructor() {\n\t\tsuper(\"Promise did not complete before deadline.\");\n\t}\n}\n\nexport function deadline<T>(promise: Promise<T>, timeout: number): Promise<T> {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\t// Set a timeout to abort the operation\n\tconst timeoutId = setTimeout(() => controller.abort(), timeout);\n\n\treturn Promise.race<T>([\n\t\tpromise,\n\t\tnew Promise<T>((_, reject) => {\n\t\t\tsignal.addEventListener(\"abort\", () => reject(new DeadlineError()));\n\t\t}),\n\t]).finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n}\n\nexport class Lock<T> {\n\tprivate _locked = false;\n\tprivate _waiting: Array<() => void> = [];\n\n\tconstructor(private _value: T) {}\n\n\tasync lock(fn: (value: T) => Promise<void>): Promise<void> {\n\t\tif (this._locked) {\n\t\t\tawait new Promise<void>((resolve) => this._waiting.push(resolve));\n\t\t}\n\t\tthis._locked = true;\n\n\t\ttry {\n\t\t\tawait fn(this._value);\n\t\t} finally {\n\t\t\tthis._locked = false;\n\t\t\tconst next = this._waiting.shift();\n\t\t\tif (next) next();\n\t\t}\n\t}\n}\n\nexport function generateSecureToken(length = 32) {\n\tconst array = new Uint8Array(length);\n\tcrypto.getRandomValues(array);\n\treturn btoa(String.fromCharCode(...array));\n}\n\nexport function generateRandomString(length = 32) {\n\tconst characters =\n\t\t\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tconst randomIndex = Math.floor(Math.random() * characters.length);\n\t\tresult += characters[randomIndex];\n\t}\n\treturn result;\n}\n","import * as cbor from \"cbor-x\";\nimport type { Context as HonoContext, HonoRequest } from \"hono\";\nimport { type SSEStreamingApi, streamSSE } from \"hono/streaming\";\nimport type { WSContext } from \"hono/ws\";\nimport { ActionContext } from \"@/actor/action\";\nimport type { AnyConn } from \"@/actor/connection\";\nimport {\n\tCONNECTION_DRIVER_HTTP,\n\tCONNECTION_DRIVER_SSE,\n\tCONNECTION_DRIVER_WEBSOCKET,\n\tgenerateConnId,\n\tgenerateConnToken,\n} from \"@/actor/connection\";\nimport * as errors from \"@/actor/errors\";\nimport type { AnyActorInstance } from \"@/actor/instance\";\nimport type { InputData } from \"@/actor/protocol/serde\";\nimport { type Encoding, EncodingSchema } from \"@/actor/protocol/serde\";\nimport type { UpgradeWebSocketArgs } from \"@/common/inline-websocket-adapter2\";\nimport { deconstructError, stringifyError } from \"@/common/utils\";\nimport type { UniversalWebSocket } from \"@/common/websocket-interface\";\nimport { HonoWebSocketAdapter } from \"@/manager/hono-websocket-adapter\";\nimport type { RunConfig } from \"@/registry/run-config\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tHTTP_ACTION_REQUEST_VERSIONED,\n\tHTTP_ACTION_RESPONSE_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport {\n\tcontentTypeForEncoding,\n\tdeserializeWithEncoding,\n\tserializeWithEncoding,\n} from \"@/serde\";\nimport { bufferToArrayBuffer } from \"@/utils\";\nimport type { ActorDriver } from \"./driver\";\nimport type {\n\tGenericHttpDriverState,\n\tGenericSseDriverState,\n\tGenericWebSocketDriverState,\n} from \"./generic-conn-driver\";\nimport { loggerWithoutContext } from \"./log\";\nimport { parseMessage } from \"./protocol/old\";\n\nexport interface ConnectWebSocketOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tactorId: string;\n\tparams: unknown;\n\tauthData: unknown;\n}\n\nexport interface ConnectWebSocketOutput {\n\tonOpen: (ws: WSContext) => void;\n\tonMessage: (message: protocol.ToServer) => void;\n\tonClose: () => void;\n}\n\nexport interface ConnectSseOpts {\n\treq?: HonoRequest;\n\tencoding: Encoding;\n\tparams: unknown;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ConnectSseOutput {\n\tonOpen: (stream: SSEStreamingApi) => void;\n\tonClose: () => Promise<void>;\n}\n\nexport interface ActionOpts {\n\treq?: HonoRequest;\n\tparams: unknown;\n\tactionName: string;\n\tactionArgs: unknown[];\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface ActionOutput {\n\toutput: unknown;\n}\n\nexport interface ConnsMessageOpts {\n\treq?: HonoRequest;\n\tconnId: string;\n\tconnToken: string;\n\tmessage: protocol.ToServer;\n\tactorId: string;\n}\n\nexport interface FetchOpts {\n\trequest: Request;\n\tactorId: string;\n\tauthData: unknown;\n}\n\nexport interface WebSocketOpts {\n\trequest: Request;\n\twebsocket: UniversalWebSocket;\n\tactorId: string;\n\tauthData: unknown;\n}\n\n/**\n * Creates a WebSocket connection handler\n */\nexport async function handleWebSocketConnect(\n\treq: Request | undefined,\n\trunConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tencoding: Encoding,\n\tparameters: unknown,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst exposeInternalError = req ? getRequestExposeInternalError(req) : false;\n\n\t// Setup promise for the init handlers since all other behavior depends on this\n\tconst {\n\t\tpromise: handlersPromise,\n\t\tresolve: handlersResolve,\n\t\treject: handlersReject,\n\t} = Promise.withResolvers<{\n\t\tconn: AnyConn;\n\t\tactor: AnyActorInstance;\n\t\tconnId: string;\n\t}>();\n\n\t// Pre-load the actor to catch errors early\n\tlet actor: AnyActorInstance;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\t} catch (error) {\n\t\t// Return handler that immediately closes with error\n\t\treturn {\n\t\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tactor.rLog,\n\t\t\t\t\t{\n\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t},\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t\tws.close(1011, code);\n\t\t\t},\n\t\t\tonMessage: (_evt: { data: any }, ws: WSContext) => {\n\t\t\t\tws.close(1011, \"Actor not loaded\");\n\t\t\t},\n\t\t\tonClose: (_event: any, _ws: WSContext) => {},\n\t\t\tonError: (_error: unknown) => {},\n\t\t};\n\t}\n\n\treturn {\n\t\tonOpen: (_evt: any, ws: WSContext) => {\n\t\t\tactor.rLog.debug(\"websocket open\");\n\n\t\t\t// Run async operations in background\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst connId = generateConnId();\n\t\t\t\t\tconst connToken = generateConnToken();\n\t\t\t\t\tconst connState = await actor.prepareConn(parameters, req);\n\n\t\t\t\t\t// Save socket\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconnGlobalState.websockets.set(connId, ws);\n\t\t\t\t\tactor.rLog.debug({\n\t\t\t\t\t\tmsg: \"registered websocket for conn\",\n\t\t\t\t\t\tactorId,\n\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t});\n\n\t\t\t\t\t// Create connection\n\t\t\t\t\tconst conn = await actor.createConn(\n\t\t\t\t\t\tconnId,\n\t\t\t\t\t\tconnToken,\n\t\t\t\t\t\tparameters,\n\t\t\t\t\t\tconnState,\n\t\t\t\t\t\tCONNECTION_DRIVER_WEBSOCKET,\n\t\t\t\t\t\t{ encoding } satisfies GenericWebSocketDriverState,\n\t\t\t\t\t\tauthData,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Unblock other handlers\n\t\t\t\t\thandlersResolve({ conn, actor, connId });\n\t\t\t\t} catch (error) {\n\t\t\t\t\thandlersReject(error);\n\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"open\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t}\n\t\t\t})();\n\t\t},\n\t\tonMessage: (evt: { data: any }, ws: WSContext) => {\n\t\t\t// Handle message asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor }) => {\n\t\t\t\t\tactor.rLog.debug({ msg: \"received message\" });\n\n\t\t\t\t\tconst value = evt.data.valueOf() as InputData;\n\t\t\t\t\tparseMessage(value, {\n\t\t\t\t\t\tencoding: encoding,\n\t\t\t\t\t\tmaxIncomingMessageSize: runConfig.maxIncomingMessageSize,\n\t\t\t\t\t})\n\t\t\t\t\t\t.then((message) => {\n\t\t\t\t\t\t\tactor.processMessage(message, conn).catch((error) => {\n\t\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tws.close(1011, code);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconst { code } = deconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twsEvent: \"message\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t\tws.close(1011, code);\n\t\t\t\t});\n\t\t},\n\t\tonClose: (\n\t\t\tevent: {\n\t\t\t\twasClean: boolean;\n\t\t\t\tcode: number;\n\t\t\t\treason: string;\n\t\t\t},\n\t\t\tws: WSContext,\n\t\t) => {\n\t\t\tif (event.wasClean) {\n\t\t\t\tactor.rLog.info({\n\t\t\t\t\tmsg: \"websocket closed\",\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tactor.rLog.warn({\n\t\t\t\t\tmsg: \"websocket closed\",\n\t\t\t\t\tcode: event.code,\n\t\t\t\t\treason: event.reason,\n\t\t\t\t\twasClean: event.wasClean,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t\tws.close(1000, \"hack_force_close\");\n\n\t\t\t// Handle cleanup asynchronously\n\t\t\thandlersPromise\n\t\t\t\t.then(({ conn, actor, connId }) => {\n\t\t\t\t\tconst connGlobalState =\n\t\t\t\t\t\tactorDriver.getGenericConnGlobalState(actorId);\n\t\t\t\t\tconst didDelete = connGlobalState.websockets.delete(connId);\n\t\t\t\t\tif (didDelete) {\n\t\t\t\t\t\tactor.rLog.info({\n\t\t\t\t\t\t\tmsg: \"removing websocket for conn\",\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tactor.rLog.warn({\n\t\t\t\t\t\t\tmsg: \"websocket does not exist for conn\",\n\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\ttotalCount: connGlobalState.websockets.size,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tdeconstructError(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\tactor.rLog,\n\t\t\t\t\t\t{ wsEvent: \"close\" },\n\t\t\t\t\t\texposeInternalError,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t},\n\t\tonError: (_error: unknown) => {\n\t\t\ttry {\n\t\t\t\t// Actors don't need to know about this, since it's abstracted away\n\t\t\t\tactor.rLog.warn({ msg: \"websocket error\" });\n\t\t\t} catch (error) {\n\t\t\t\tdeconstructError(\n\t\t\t\t\terror,\n\t\t\t\t\tactor.rLog,\n\t\t\t\t\t{ wsEvent: \"error\" },\n\t\t\t\t\texposeInternalError,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Creates an SSE connection handler\n */\nexport async function handleSseConnect(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Return the main handler with all async work inside\n\treturn streamSSE(c, async (stream) => {\n\t\tlet actor: AnyActorInstance | undefined;\n\t\tlet connId: string | undefined;\n\t\tlet connToken: string | undefined;\n\t\tlet connState: unknown;\n\t\tlet conn: AnyConn | undefined;\n\n\t\ttry {\n\t\t\t// Do all async work inside the handler\n\t\t\tactor = await actorDriver.loadActor(actorId);\n\t\t\tconnId = generateConnId();\n\t\t\tconnToken = generateConnToken();\n\t\t\tconnState = await actor.prepareConn(parameters, c.req.raw);\n\n\t\t\tactor.rLog.debug(\"sse open\");\n\n\t\t\t// Save stream\n\t\t\tactorDriver\n\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t.sseStreams.set(connId, stream);\n\n\t\t\t// Create connection\n\t\t\tconn = await actor.createConn(\n\t\t\t\tconnId,\n\t\t\t\tconnToken,\n\t\t\t\tparameters,\n\t\t\t\tconnState,\n\t\t\t\tCONNECTION_DRIVER_SSE,\n\t\t\t\t{ encoding } satisfies GenericSseDriverState,\n\t\t\t\tauthData,\n\t\t\t);\n\n\t\t\t// Wait for close\n\t\t\tconst abortResolver = Promise.withResolvers();\n\n\t\t\t// HACK: This is required so the abort handler below works\n\t\t\t//\n\t\t\t// See https://github.com/honojs/hono/issues/1770#issuecomment-2461966225\n\t\t\tstream.onAbort(() => {});\n\n\t\t\t// Handle stream abort (when client closes the connection)\n\t\t\tc.req.raw.signal.addEventListener(\"abort\", async () => {\n\t\t\t\tconst rLog = actor?.rLog ?? loggerWithoutContext();\n\t\t\t\ttry {\n\t\t\t\t\trLog.debug(\"sse stream aborted\");\n\n\t\t\t\t\t// Cleanup\n\t\t\t\t\tif (connId) {\n\t\t\t\t\t\tactorDriver\n\t\t\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t\t\t}\n\t\t\t\t\tif (conn && actor) {\n\t\t\t\t\t\tactor.__removeConn(conn);\n\t\t\t\t\t}\n\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t} catch (error) {\n\t\t\t\t\trLog.error({ msg: \"error closing sse connection\", error });\n\t\t\t\t\tabortResolver.resolve(undefined);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// HACK: Will throw if not configured\n\t\t\ttry {\n\t\t\t\tc.executionCtx.waitUntil(abortResolver.promise);\n\t\t\t} catch {}\n\n\t\t\t// Wait until connection aborted\n\t\t\tawait abortResolver.promise;\n\t\t} catch (error) {\n\t\t\tloggerWithoutContext().error({ msg: \"error in sse connection\", error });\n\n\t\t\t// Cleanup on error\n\t\t\tif (connId !== undefined) {\n\t\t\t\tactorDriver\n\t\t\t\t\t.getGenericConnGlobalState(actorId)\n\t\t\t\t\t.sseStreams.delete(connId);\n\t\t\t}\n\t\t\tif (conn && actor !== undefined) {\n\t\t\t\tactor.__removeConn(conn);\n\t\t\t}\n\n\t\t\t// Close the stream on error\n\t\t\tstream.close();\n\t\t}\n\t});\n}\n\n/**\n * Creates an action handler\n */\nexport async function handleAction(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tactionName: string,\n\tactorId: string,\n\tauthData: unknown,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\tconst parameters = getRequestConnParams(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\tconst request = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tHTTP_ACTION_REQUEST_VERSIONED,\n\t);\n\tconst actionArgs = cbor.decode(new Uint8Array(request.args));\n\n\t// Invoke the action\n\tlet actor: AnyActorInstance | undefined;\n\tlet conn: AnyConn | undefined;\n\tlet output: unknown | undefined;\n\ttry {\n\t\tactor = await actorDriver.loadActor(actorId);\n\n\t\tactor.rLog.debug({ msg: \"handling action\", actionName, encoding });\n\n\t\t// Create conn\n\t\tconst connState = await actor.prepareConn(parameters, c.req.raw);\n\t\tconn = await actor.createConn(\n\t\t\tgenerateConnId(),\n\t\t\tgenerateConnToken(),\n\t\t\tparameters,\n\t\t\tconnState,\n\t\t\tCONNECTION_DRIVER_HTTP,\n\t\t\t{} satisfies GenericHttpDriverState,\n\t\t\tauthData,\n\t\t);\n\n\t\t// Call action\n\t\tconst ctx = new ActionContext(actor.actorContext!, conn!);\n\t\toutput = await actor.executeAction(ctx, actionName, actionArgs);\n\t} finally {\n\t\tif (conn) {\n\t\t\tactor?.__removeConn(conn);\n\t\t}\n\t}\n\n\t// Send response\n\tconst responseData: protocol.HttpActionResponse = {\n\t\toutput: bufferToArrayBuffer(cbor.encode(output)),\n\t};\n\tconst serialized = serializeWithEncoding(\n\t\tencoding,\n\t\tresponseData,\n\t\tHTTP_ACTION_RESPONSE_VERSIONED,\n\t);\n\treturn c.body(serialized as Uint8Array, 200, {\n\t\t\"Content-Type\": contentTypeForEncoding(encoding),\n\t});\n}\n\n/**\n * Create a connection message handler\n */\nexport async function handleConnectionMessage(\n\tc: HonoContext,\n\t_runConfig: RunConfig,\n\tactorDriver: ActorDriver,\n\tconnId: string,\n\tconnToken: string,\n\tactorId: string,\n) {\n\tconst encoding = getRequestEncoding(c.req);\n\n\t// Validate incoming request\n\tconst arrayBuffer = await c.req.arrayBuffer();\n\tconst message = deserializeWithEncoding(\n\t\tencoding,\n\t\tnew Uint8Array(arrayBuffer),\n\t\tTO_SERVER_VERSIONED,\n\t);\n\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Find connection\n\tconst conn = actor.conns.get(connId);\n\tif (!conn) {\n\t\tthrow new errors.ConnNotFound(connId);\n\t}\n\n\t// Authenticate connection\n\tif (conn._token !== connToken) {\n\t\tthrow new errors.IncorrectConnToken();\n\t}\n\n\t// Process message\n\tawait actor.processMessage(message, conn);\n\n\treturn c.json({});\n}\n\nexport async function handleRawWebSocketHandler(\n\treq: Request | undefined,\n\tpath: string,\n\tactorDriver: ActorDriver,\n\tactorId: string,\n\tauthData: unknown,\n): Promise<UpgradeWebSocketArgs> {\n\tconst actor = await actorDriver.loadActor(actorId);\n\n\t// Return WebSocket event handlers\n\treturn {\n\t\tonOpen: (_evt: any, ws: any) => {\n\t\t\t// Wrap the Hono WebSocket in our adapter\n\t\t\tconst adapter = new HonoWebSocketAdapter(ws);\n\n\t\t\t// Store adapter reference on the WebSocket for event handlers\n\t\t\t(ws as any).__adapter = adapter;\n\n\t\t\t// Extract the path after prefix and preserve query parameters\n\t\t\t// Use URL API for cleaner parsing\n\t\t\tconst url = new URL(path, \"http://actor\");\n\t\t\tconst pathname = url.pathname.replace(/^\\/raw\\/websocket\\/?/, \"\") || \"/\";\n\t\t\tconst normalizedPath =\n\t\t\t\t(pathname.startsWith(\"/\") ? pathname : \"/\" + pathname) + url.search;\n\n\t\t\tlet newRequest: Request;\n\t\t\tif (req) {\n\t\t\t\tnewRequest = new Request(`http://actor${normalizedPath}`, req);\n\t\t\t} else {\n\t\t\t\tnewRequest = new Request(`http://actor${normalizedPath}`, {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"rewriting websocket url\",\n\t\t\t\tfrom: path,\n\t\t\t\tto: newRequest.url,\n\t\t\t\tpathname: url.pathname,\n\t\t\t\tsearch: url.search,\n\t\t\t\tnormalizedPath,\n\t\t\t});\n\n\t\t\t// Call the actor's onWebSocket handler with the adapted WebSocket\n\t\t\tactor.handleWebSocket(adapter, {\n\t\t\t\trequest: newRequest,\n\t\t\t});\n\t\t},\n\t\tonMessage: (event: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleMessage(event);\n\t\t\t}\n\t\t},\n\t\tonClose: (evt: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleClose(evt?.code || 1006, evt?.reason || \"\");\n\t\t\t}\n\t\t},\n\t\tonError: (error: any, ws: any) => {\n\t\t\t// Find the adapter for this WebSocket\n\t\t\tconst adapter = (ws as any).__adapter;\n\t\t\tif (adapter) {\n\t\t\t\tadapter._handleError(error);\n\t\t\t}\n\t\t},\n\t};\n}\n\n// Helper to get the connection encoding from a request\nexport function getRequestEncoding(req: HonoRequest): Encoding {\n\tconst encodingParam = req.header(HEADER_ENCODING);\n\tif (!encodingParam) {\n\t\tthrow new errors.InvalidEncoding(\"undefined\");\n\t}\n\n\tconst result = EncodingSchema.safeParse(encodingParam);\n\tif (!result.success) {\n\t\tthrow new errors.InvalidEncoding(encodingParam as string);\n\t}\n\n\treturn result.data;\n}\n\nexport function getRequestExposeInternalError(_req: Request): boolean {\n\t// Unipmlemented\n\treturn false;\n}\n\nexport function getRequestQuery(c: HonoContext): unknown {\n\t// Get query parameters for actor lookup\n\tconst queryParam = c.req.header(HEADER_ACTOR_QUERY);\n\tif (!queryParam) {\n\t\tloggerWithoutContext().error({ msg: \"missing query parameter\" });\n\t\tthrow new errors.InvalidRequest(\"missing query\");\n\t}\n\n\t// Parse the query JSON and validate with schema\n\ttry {\n\t\tconst parsed = JSON.parse(queryParam);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tloggerWithoutContext().error({ msg: \"invalid query json\", error });\n\t\tthrow new errors.InvalidQueryJSON(error);\n\t}\n}\n\nexport const HEADER_ACTOR_QUERY = \"X-RivetKit-Query\";\n\nexport const HEADER_ENCODING = \"X-RivetKit-Encoding\";\n\n// IMPORTANT: Params must be in headers or in an E2EE part of the request (i.e. NOT the URL or query string) in order to ensure that tokens can be securely passed in params.\nexport const HEADER_CONN_PARAMS = \"X-RivetKit-Conn-Params\";\n\n// Internal header\nexport const HEADER_AUTH_DATA = \"X-RivetKit-Auth-Data\";\n\nexport const HEADER_ACTOR_ID = \"X-RivetKit-Actor\";\n\nexport const HEADER_CONN_ID = \"X-RivetKit-Conn\";\n\nexport const HEADER_CONN_TOKEN = \"X-RivetKit-Conn-Token\";\n\n/**\n * Headers that publics can send from public clients.\n *\n * Used for CORS.\n **/\nexport const ALLOWED_PUBLIC_HEADERS = [\n\t\"Content-Type\",\n\t\"User-Agent\",\n\tHEADER_ACTOR_QUERY,\n\tHEADER_ENCODING,\n\tHEADER_CONN_PARAMS,\n\tHEADER_ACTOR_ID,\n\tHEADER_CONN_ID,\n\tHEADER_CONN_TOKEN,\n];\n\n// Helper to get connection parameters for the request\nexport function getRequestConnParams(req: HonoRequest): unknown {\n\tconst paramsParam = req.header(HEADER_CONN_PARAMS);\n\tif (!paramsParam) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\treturn JSON.parse(paramsParam);\n\t} catch (err) {\n\t\tthrow new errors.InvalidParams(\n\t\t\t`Invalid params JSON: ${stringifyError(err)}`,\n\t\t);\n\t}\n}\n","import type { ActorKey } from \"@/actor/mod\";\nimport type { Client } from \"@/client/client\";\nimport type { Logger } from \"@/common/log\";\nimport type { Registry } from \"@/registry/mod\";\nimport type { Conn, ConnId } from \"./connection\";\nimport type { ActorContext } from \"./context\";\nimport type { AnyDatabaseProvider, InferDatabaseClient } from \"./database\";\nimport type { SaveStateOptions } from \"./instance\";\nimport type { Schedule } from \"./schedule\";\n\n/**\n * Context for a remote procedure call.\n *\n * @typeParam A Actor this action belongs to\n */\nexport class ActionContext<\n\tTState,\n\tTConnParams,\n\tTConnState,\n\tTVars,\n\tTInput,\n\tTDatabase extends AnyDatabaseProvider,\n> {\n\t#actorContext: ActorContext<\n\t\tTState,\n\t\tTConnParams,\n\t\tTConnState,\n\t\tTVars,\n\t\tTInput,\n\t\tTDatabase\n\t>;\n\n\t/**\n\t * Should not be called directly.\n\t *\n\t * @param actorContext - The actor context\n\t * @param conn - The connection associated with the action\n\t */\n\tconstructor(\n\t\tactorContext: ActorContext<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t\tpublic readonly conn: Conn<\n\t\t\tTState,\n\t\t\tTConnParams,\n\t\t\tTConnState,\n\t\t\tTVars,\n\t\t\tTInput,\n\t\t\tTDatabase\n\t\t>,\n\t) {\n\t\tthis.#actorContext = actorContext;\n\t}\n\n\t/**\n\t * Get the actor state\n\t */\n\tget state(): TState {\n\t\treturn this.#actorContext.state;\n\t}\n\n\t/**\n\t * Get the actor variables\n\t */\n\tget vars(): TVars {\n\t\treturn this.#actorContext.vars;\n\t}\n\n\t/**\n\t * Broadcasts an event to all connected clients.\n\t */\n\tbroadcast(name: string, ...args: any[]): void {\n\t\tthis.#actorContext.broadcast(name, ...args);\n\t}\n\n\t/**\n\t * Gets the logger instance.\n\t */\n\tget log(): Logger {\n\t\treturn this.#actorContext.log;\n\t}\n\n\t/**\n\t * Gets actor ID.\n\t */\n\tget actorId(): string {\n\t\treturn this.#actorContext.actorId;\n\t}\n\n\t/**\n\t * Gets the actor name.\n\t */\n\tget name(): string {\n\t\treturn this.#actorContext.name;\n\t}\n\n\t/**\n\t * Gets the actor key.\n\t */\n\tget key(): ActorKey {\n\t\treturn this.#actorContext.key;\n\t}\n\n\t/**\n\t * Gets the region.\n\t */\n\tget region(): string {\n\t\treturn this.#actorContext.region;\n\t}\n\n\t/**\n\t * Gets the scheduler.\n\t */\n\tget schedule(): Schedule {\n\t\treturn this.#actorContext.schedule;\n\t}\n\n\t/**\n\t * Gets the map of connections.\n\t */\n\tget conns(): Map<\n\t\tConnId,\n\t\tConn<TState, TConnParams, TConnState, TVars, TInput, TDatabase>\n\t> {\n\t\treturn this.#actorContext.conns;\n\t}\n\n\t/**\n\t * Returns the client for the given registry.\n\t */\n\tclient<R extends Registry<any>>(): Client<R> {\n\t\treturn this.#actorContext.client<R>();\n\t}\n\n\t/**\n\t * @experimental\n\t */\n\tget db(): InferDatabaseClient<TDatabase> {\n\t\treturn this.#actorContext.db;\n\t}\n\n\t/**\n\t * Forces the state to get saved.\n\t */\n\tasync saveState(opts: SaveStateOptions): Promise<void> {\n\t\treturn this.#actorContext.saveState(opts);\n\t}\n\n\t/**\n\t * Prevents the actor from sleeping until promise is complete.\n\t */\n\twaitUntil(promise: Promise<void>): void {\n\t\tthis.#actorContext.waitUntil(promise);\n\t}\n\n\t/**\n\t * AbortSignal that fires when the actor is stopping.\n\t */\n\tget abortSignal(): AbortSignal {\n\t\treturn this.#actorContext.abortSignal;\n\t}\n\n\t/**\n\t * Forces the actor to sleep.\n\t *\n\t * Not supported on all drivers.\n\t *\n\t * @experimental\n\t */\n\tsleep() {\n\t\tthis.#actorContext.sleep();\n\t}\n}\n","import { getLogger } from \"@/common/log\";\n\nexport function logger() {\n\treturn getLogger(\"actor-manager\");\n}\n","import type { WSContext } from \"hono/ws\";\nimport type {\n\tRivetCloseEvent,\n\tRivetEvent,\n\tRivetMessageEvent,\n\tUniversalWebSocket,\n} from \"@/common/websocket-interface\";\nimport { logger } from \"./log\";\n\n/**\n * HonoWebSocketAdapter provides a WebSocket-like interface over WSContext\n * for raw WebSocket handling in actors\n */\nexport class HonoWebSocketAdapter implements UniversalWebSocket {\n\t// WebSocket readyState values\n\treadonly CONNECTING = 0 as const;\n\treadonly OPEN = 1 as const;\n\treadonly CLOSING = 2 as const;\n\treadonly CLOSED = 3 as const;\n\n\t#ws: WSContext;\n\t#readyState: 0 | 1 | 2 | 3 = 1; // Start as OPEN since WSContext is already connected\n\t#eventListeners: Map<string, Set<(event: any) => void>> = new Map();\n\t#closeCode?: number;\n\t#closeReason?: string;\n\n\tconstructor(ws: WSContext) {\n\t\tthis.#ws = ws;\n\n\t\t// The WSContext is already open when we receive it\n\t\tthis.#readyState = this.OPEN;\n\n\t\t// Immediately fire the open event\n\t\tsetTimeout(() => {\n\t\t\tthis.#fireEvent(\"open\", { type: \"open\", target: this });\n\t\t}, 0);\n\t}\n\n\tget readyState(): 0 | 1 | 2 | 3 {\n\t\treturn this.#readyState;\n\t}\n\n\tget binaryType(): \"arraybuffer\" | \"blob\" {\n\t\treturn \"arraybuffer\";\n\t}\n\n\tset binaryType(value: \"arraybuffer\" | \"blob\") {\n\t\t// Ignored for now - always use arraybuffer\n\t}\n\n\tget bufferedAmount(): number {\n\t\treturn 0; // Not tracked in WSContext\n\t}\n\n\tget extensions(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tget protocol(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tget url(): string {\n\t\treturn \"\"; // Not available in WSContext\n\t}\n\n\tsend(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n\t\tif (this.readyState !== this.OPEN) {\n\t\t\tthrow new Error(\"WebSocket is not open\");\n\t\t}\n\n\t\ttry {\n\t\t\tlogger().debug({\n\t\t\t\tmsg: \"bridge sending data\",\n\t\t\t\tdataType: typeof data,\n\t\t\t\tisString: typeof data === \"string\",\n\t\t\t\tisArrayBuffer: data instanceof ArrayBuffer,\n\t\t\t\tdataStr:\n\t\t\t\t\ttypeof data === \"string\" ? data.substring(0, 100) : \"<non-string>\",\n\t\t\t});\n\n\t\t\tif (typeof data === \"string\") {\n\t\t\t\t(this.#ws as any).send(data);\n\t\t\t} else if (data instanceof ArrayBuffer) {\n\t\t\t\t(this.#ws as any).send(data);\n\t\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\t\t// Convert ArrayBufferView to ArrayBuffer\n\t\t\t\tconst buffer = data.buffer.slice(\n\t\t\t\t\tdata.byteOffset,\n\t\t\t\t\tdata.byteOffset + data.byteLength,\n\t\t\t\t);\n\t\t\t\t// Check if it's a SharedArrayBuffer and convert to ArrayBuffer\n\t\t\t\tif (buffer instanceof SharedArrayBuffer) {\n\t\t\t\t\tconst arrayBuffer = new ArrayBuffer(buffer.byteLength);\n\t\t\t\t\tnew Uint8Array(arrayBuffer).set(new Uint8Array(buffer));\n\t\t\t\t\t(this.#ws as any).send(arrayBuffer);\n\t\t\t\t} else {\n\t\t\t\t\t(this.#ws as any).send(buffer);\n\t\t\t\t}\n\t\t\t} else if (data instanceof Blob) {\n\t\t\t\t// Convert Blob to ArrayBuffer\n\t\t\t\tdata\n\t\t\t\t\t.arrayBuffer()\n\t\t\t\t\t.then((buffer) => {\n\t\t\t\t\t\t(this.#ws as any).send(buffer);\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tlogger().error({\n\t\t\t\t\t\t\tmsg: \"failed to convert blob to arraybuffer\",\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.#fireEvent(\"error\", { type: \"error\", target: this, error });\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Try to convert to string as a fallback\n\t\t\t\tlogger().warn({\n\t\t\t\t\tmsg: \"unsupported data type, converting to string\",\n\t\t\t\t\tdataType: typeof data,\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t\t(this.#ws as any).send(String(data));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger().error({ msg: \"error sending websocket data\", error });\n\t\t\tthis.#fireEvent(\"error\", { type: \"error\", target: this, error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tclose(code = 1000, reason = \"\"): void {\n\t\tif (this.readyState === this.CLOSING || this.readyState === this.CLOSED) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#readyState = this.CLOSING;\n\t\tthis.#closeCode = code;\n\t\tthis.#closeReason = reason;\n\n\t\ttry {\n\t\t\t(this.#ws as any).close(code, reason);\n\n\t\t\t// Update state and fire close event\n\t\t\tthis.#readyState = this.CLOSED;\n\t\t\tthis.#fireEvent(\"close\", {\n\t\t\t\ttype: \"close\",\n\t\t\t\ttarget: this,\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t\twasClean: code === 1000,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger().error({ msg: \"error closing websocket\", error });\n\t\t\tthis.#readyState = this.CLOSED;\n\t\t\tthis.#fireEvent(\"close\", {\n\t\t\t\ttype: \"close\",\n\t\t\t\ttarget: this,\n\t\t\t\tcode: 1006,\n\t\t\t\treason: \"Abnormal closure\",\n\t\t\t\twasClean: false,\n\t\t\t});\n\t\t}\n\t}\n\n\taddEventListener(type: string, listener: (event: any) => void): void {\n\t\tif (!this.#eventListeners.has(type)) {\n\t\t\tthis.#eventListeners.set(type, new Set());\n\t\t}\n\t\tthis.#eventListeners.get(type)!.add(listener);\n\t}\n\n\tremoveEventListener(type: string, listener: (event: any) => void): void {\n\t\tconst listeners = this.#eventListeners.get(type);\n\t\tif (listeners) {\n\t\t\tlisteners.delete(listener);\n\t\t}\n\t}\n\n\tdispatchEvent(event: RivetEvent): boolean {\n\t\tconst listeners = this.#eventListeners.get(event.type);\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({\n\t\t\t\t\t\tmsg: `error in ${event.type} event listener`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t// Internal method to handle incoming messages from WSContext\n\t_handleMessage(data: any): void {\n\t\t// Hono may pass either raw data or a MessageEvent-like object\n\t\tlet messageData: string | ArrayBuffer | ArrayBufferView;\n\n\t\tif (typeof data === \"string\") {\n\t\t\tmessageData = data;\n\t\t} else if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {\n\t\t\tmessageData = data;\n\t\t} else if (data && typeof data === \"object\" && \"data\" in data) {\n\t\t\t// Handle MessageEvent-like objects\n\t\t\tmessageData = data.data;\n\t\t} else {\n\t\t\t// Fallback - shouldn't happen in normal operation\n\t\t\tmessageData = String(data);\n\t\t}\n\n\t\tlogger().debug({\n\t\t\tmsg: \"bridge handling message\",\n\t\t\tdataType: typeof messageData,\n\t\t\tisArrayBuffer: messageData instanceof ArrayBuffer,\n\t\t\tdataStr: typeof messageData === \"string\" ? messageData : \"<binary>\",\n\t\t});\n\n\t\tthis.#fireEvent(\"message\", {\n\t\t\ttype: \"message\",\n\t\t\ttarget: this,\n\t\t\tdata: messageData,\n\t\t});\n\t}\n\n\t// Internal method to handle close from WSContext\n\t_handleClose(code: number, reason: string): void {\n\t\t// HACK: Close socket in order to fix bug with Cloudflare leaving WS in closing state\n\t\t// https://github.com/cloudflare/workerd/issues/2569\n\t\t(this.#ws as any).close(1000, \"hack_force_close\");\n\n\t\tif (this.readyState === this.CLOSED) return;\n\n\t\tthis.#readyState = this.CLOSED;\n\t\tthis.#closeCode = code;\n\t\tthis.#closeReason = reason;\n\n\t\tthis.#fireEvent(\"close\", {\n\t\t\ttype: \"close\",\n\t\t\ttarget: this,\n\t\t\tcode,\n\t\t\treason,\n\t\t\twasClean: code === 1000,\n\t\t});\n\t}\n\n\t// Internal method to handle errors from WSContext\n\t_handleError(error: any): void {\n\t\tthis.#fireEvent(\"error\", {\n\t\t\ttype: \"error\",\n\t\t\ttarget: this,\n\t\t\terror,\n\t\t});\n\t}\n\n\t#fireEvent(type: string, event: any): void {\n\t\tconst listeners = this.#eventListeners.get(type);\n\t\tif (listeners) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger().error({ msg: `error in ${type} event listener`, error });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Also check for on* properties\n\t\tswitch (type) {\n\t\t\tcase \"open\":\n\t\t\t\tif (this.#onopen) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onopen(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onopen handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"close\":\n\t\t\t\tif (this.#onclose) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onclose(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onclose handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tif (this.#onerror) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onerror(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onerror handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message\":\n\t\t\t\tif (this.#onmessage) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#onmessage(event);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger().error({ msg: \"error in onmessage handler\", error });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Event handler properties with getters/setters\n\t#onopen: ((event: RivetEvent) => void) | null = null;\n\t#onclose: ((event: RivetCloseEvent) => void) | null = null;\n\t#onerror: ((event: RivetEvent) => void) | null = null;\n\t#onmessage: ((event: RivetMessageEvent) => void) | null = null;\n\n\tget onopen(): ((event: RivetEvent) => void) | null {\n\t\treturn this.#onopen;\n\t}\n\tset onopen(handler: ((event: RivetEvent) => void) | null) {\n\t\tthis.#onopen = handler;\n\t}\n\n\tget onclose(): ((event: RivetCloseEvent) => void) | null {\n\t\treturn this.#onclose;\n\t}\n\tset onclose(handler: ((event: RivetCloseEvent) => void) | null) {\n\t\tthis.#onclose = handler;\n\t}\n\n\tget onerror(): ((event: RivetEvent) => void) | null {\n\t\treturn this.#onerror;\n\t}\n\tset onerror(handler: ((event: RivetEvent) => void) | null) {\n\t\tthis.#onerror = handler;\n\t}\n\n\tget onmessage(): ((event: RivetMessageEvent) => void) | null {\n\t\treturn this.#onmessage;\n\t}\n\tset onmessage(handler: ((event: RivetMessageEvent) => void) | null) {\n\t\tthis.#onmessage = handler;\n\t}\n}\n","import * as cbor from \"cbor-x\";\nimport { z } from \"zod\";\nimport type { AnyDatabaseProvider } from \"@/actor/database\";\nimport * as errors from \"@/actor/errors\";\nimport {\n\tCachedSerializer,\n\ttype Encoding,\n\ttype InputData,\n} from \"@/actor/protocol/serde\";\nimport { deconstructError } from \"@/common/utils\";\nimport type * as protocol from \"@/schemas/client-protocol/mod\";\nimport {\n\tTO_CLIENT_VERSIONED,\n\tTO_SERVER_VERSIONED,\n} from \"@/schemas/client-protocol/versioned\";\nimport { deserializeWithEncoding } from \"@/serde\";\nimport { assertUnreachable, bufferToArrayBuffer } from \"../../utils\";\nimport { ActionContext } from \"../action\";\nimport type { Conn } from \"../connection\";\nimport type { ActorInstance } from \"../instance\";\n\nexport const TransportSchema = z.enum([\"websocket\", \"sse\"]);\n\n/**\n * Transport mechanism used to communicate between client & actor.\n */\nexport type Transport = z.infer<typeof TransportSchema>;\n\ninterface MessageEventOpts {\n\tencoding: Encoding;\n\tmaxIncomingMessageSize: number;\n}\n\nfunction getValueLength(value: InputData): number {\n\tif (typeof value === \"string\") {\n\t\treturn value.length;\n\t} else if (value instanceof Blob) {\n\t\treturn value.size;\n\t} else if (\n\t\tvalue instanceof ArrayBuffer ||\n\t\tvalue instanceof SharedArrayBuffer ||\n\t\tvalue instanceof Uint8Array\n\t) {\n\t\treturn value.byteLength;\n\t} else {\n\t\tassertUnreachable(value);\n\t}\n}\n\nexport async function inputDataToBuffer(\n\tdata: InputData,\n): Promise<Uint8Array | string> {\n\tif (typeof data === \"string\") {\n\t\treturn data;\n\t} else if (data instanceof Blob) {\n\t\tconst arrayBuffer = await data.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} else if (data instanceof Uint8Array) {\n\t\treturn data;\n\t} else if (data instanceof ArrayBuffer || data instanceof SharedArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t} else {\n\t\tthrow new errors.MalformedMessage();\n\t}\n}\n\nexport async function parseMessage(\n\tvalue: InputData,\n\topts: MessageEventOpts,\n): Promise<protocol.ToServer> {\n\t// Validate value length\n\tconst length = getValueLength(value);\n\tif (length > opts.maxIncomingMessageSize) {\n\t\tthrow new errors.MessageTooLong();\n\t}\n\n\t// Convert value\n\tlet buffer = await inputDataToBuffer(value);\n\n\t// HACK: For some reason, the output buffer needs to be cloned when using BARE encoding\n\t//\n\t// THis is likely because the input data is of type `Buffer` and there is an inconsistency in implementation that I am not aware of\n\tif (buffer instanceof Buffer) {\n\t\tbuffer = new Uint8Array(buffer);\n\t}\n\n\t// Deserialize message\n\treturn deserializeWithEncoding(opts.encoding, buffer, TO_SERVER_VERSIONED);\n}\n\nexport interface ProcessMessageHandler<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n> {\n\tonExecuteAction?: (\n\t\tctx: ActionContext<S, CP, CS, V, I, DB>,\n\t\tname: string,\n\t\targs: unknown[],\n\t) => Promise<unknown>;\n\tonSubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\n\t) => Promise<void>;\n\tonUnsubscribe?: (\n\t\teventName: string,\n\t\tconn: Conn<S, CP, CS, V, I, DB>,\n\t) => Promise<void>;\n}\n\nexport async function processMessage<\n\tS,\n\tCP,\n\tCS,\n\tV,\n\tI,\n\tDB extends AnyDatabaseProvider,\n>(\n\tmessage: protocol.ToServer,\n\tactor: ActorInstance<S, CP, CS, V, I, DB>,\n\tconn: Conn<S, CP, CS, V, I, DB>,\n\thandler: ProcessMessageHandler<S, CP, CS, V, I, DB>,\n) {\n\tlet actionId: bigint | undefined;\n\tlet actionName: string | undefined;\n\n\ttry {\n\t\tif (message.body.tag === \"ActionRequest\") {\n\t\t\t// Action request\n\n\t\t\tif (handler.onExecuteAction === undefined) {\n\t\t\t\tthrow new errors.Unsupported(\"Action\");\n\t\t\t}\n\n\t\t\tconst { id, name, args: argsRaw } = message.body.val;\n\t\t\tactionId = id;\n\t\t\tactionName = name;\n\t\t\tconst args = cbor.decode(new Uint8Array(argsRaw));\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing action request\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t});\n\n\t\t\tconst ctx = new ActionContext<S, CP, CS, V, I, DB>(\n\t\t\t\tactor.actorContext,\n\t\t\t\tconn,\n\t\t\t);\n\n\t\t\t// Process the action request and wait for the result\n\t\t\t// This will wait for async actions to complete\n\t\t\tconst output = await handler.onExecuteAction(ctx, name, args);\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"sending action response\",\n\t\t\t\tactionId: id,\n\t\t\t\tactionName: name,\n\t\t\t\toutputType: typeof output,\n\t\t\t\tisPromise: output instanceof Promise,\n\t\t\t});\n\n\t\t\t// Send the response back to the client\n\t\t\tconn._sendMessage(\n\t\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t\t{\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\ttag: \"ActionResponse\",\n\t\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\toutput: bufferToArrayBuffer(cbor.encode(output)),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tactor.rLog.debug({ msg: \"action response sent\", id, name: name });\n\t\t} else if (message.body.tag === \"SubscriptionRequest\") {\n\t\t\t// Subscription request\n\n\t\t\tif (\n\t\t\t\thandler.onSubscribe === undefined ||\n\t\t\t\thandler.onUnsubscribe === undefined\n\t\t\t) {\n\t\t\t\tthrow new errors.Unsupported(\"Subscriptions\");\n\t\t\t}\n\n\t\t\tconst { eventName, subscribe } = message.body.val;\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"processing subscription request\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\n\t\t\tif (subscribe) {\n\t\t\t\tawait handler.onSubscribe(eventName, conn);\n\t\t\t} else {\n\t\t\t\tawait handler.onUnsubscribe(eventName, conn);\n\t\t\t}\n\n\t\t\tactor.rLog.debug({\n\t\t\t\tmsg: \"subscription request completed\",\n\t\t\t\teventName,\n\t\t\t\tsubscribe,\n\t\t\t});\n\t\t} else {\n\t\t\tassertUnreachable(message.body);\n\t\t}\n\t} catch (error) {\n\t\tconst { group, code, message, metadata } = deconstructError(\n\t\t\terror,\n\t\t\tactor.rLog,\n\t\t\t{\n\t\t\t\tconnectionId: conn.id,\n\t\t\t\tactionId,\n\t\t\t\tactionName,\n\t\t\t},\n\t\t);\n\n\t\tactor.rLog.debug({\n\t\t\tmsg: \"sending error response\",\n\t\t\tactionId,\n\t\t\tactionName,\n\t\t\tcode,\n\t\t\tmessage,\n\t\t});\n\n\t\t// Build response\n\t\tconn._sendMessage(\n\t\t\tnew CachedSerializer<protocol.ToClient>(\n\t\t\t\t{\n\t\t\t\t\tbody: {\n\t\t\t\t\t\ttag: \"Error\",\n\t\t\t\t\t\tval: {\n\t\t\t\t\t\t\tgroup,\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\tmetadata: bufferToArrayBuffer(cbor.encode(metadata)),\n\t\t\t\t\t\t\tactionId: actionId ?? null,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tTO_CLIENT_VERSIONED,\n\t\t\t),\n\t\t);\n\n\t\tactor.rLog.debug({ msg: \"error response sent\", actionId, actionName });\n\t}\n}\n\n///**\n// * Use `CachedSerializer` if serializing the same data repeatedly.\n// */\n//export function serialize<T>(value: T, encoding: Encoding): OutputData {\n//\tif (encoding === \"json\") {\n//\t\treturn JSON.stringify(value);\n//\t} else if (encoding === \"cbor\") {\n//\t\t// TODO: Remove this hack, but cbor-x can't handle anything extra in data structures\n//\t\tconst cleanValue = JSON.parse(JSON.stringify(value));\n//\t\treturn cbor.encode(cleanValue);\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n//\n//export async function deserialize(data: InputData, encoding: Encoding) {\n//\tif (encoding === \"json\") {\n//\t\tif (typeof data !== \"string\") {\n//\t\t\tactor.rLog.warn(\"received non-string for json parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t} else {\n//\t\t\treturn JSON.parse(data);\n//\t\t}\n//\t} else if (encoding === \"cbor\") {\n//\t\tif (data instanceof Blob) {\n//\t\t\tconst arrayBuffer = await data.arrayBuffer();\n//\t\t\treturn cbor.decode(new Uint8Array(arrayBuffer));\n//\t\t} else if (data instanceof Uint8Array) {\n//\t\t\treturn cbor.decode(data);\n//\t\t} else if (\n//\t\t\tdata instanceof ArrayBuffer ||\n//\t\t\tdata instanceof SharedArrayBuffer\n//\t\t) {\n//\t\t\treturn cbor.decode(new Uint8Array(data));\n//\t\t} else {\n//\t\t\tactor.rLog.warn(\"received non-binary type for cbor parse\");\n//\t\t\tthrow new errors.MalformedMessage();\n//\t\t}\n//\t} else {\n//\t\tassertUnreachable(encoding);\n//\t}\n//}\n"],"mappings":"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","names":["cbor","config","assertUnreachable","assertUnreachable","cbor","cbor","z","z","message","actor"]}
|
|
@@ -124,7 +124,7 @@ var MessageTooLong = class extends ActorError {
|
|
|
124
124
|
super(
|
|
125
125
|
"message",
|
|
126
126
|
"too_long",
|
|
127
|
-
"Message too long. This can be configured with: `registry.
|
|
127
|
+
"Message too long. This can be configured with: `registry.start({ maxIncomingMessageSize: ... })`",
|
|
128
128
|
{ public: true }
|
|
129
129
|
);
|
|
130
130
|
}
|
|
@@ -371,4 +371,4 @@ var RouteNotFound = class extends ActorError {
|
|
|
371
371
|
|
|
372
372
|
|
|
373
373
|
exports.INTERNAL_ERROR_CODE = INTERNAL_ERROR_CODE; exports.INTERNAL_ERROR_DESCRIPTION = INTERNAL_ERROR_DESCRIPTION; exports.USER_ERROR_CODE = USER_ERROR_CODE; exports.ActorError = ActorError; exports.InternalError = InternalError; exports.Unreachable = Unreachable; exports.StateNotEnabled = StateNotEnabled; exports.ConnStateNotEnabled = ConnStateNotEnabled; exports.VarsNotEnabled = VarsNotEnabled; exports.ActionTimedOut = ActionTimedOut; exports.ActionNotFound = ActionNotFound; exports.InvalidEncoding = InvalidEncoding; exports.ConnNotFound = ConnNotFound; exports.IncorrectConnToken = IncorrectConnToken; exports.MessageTooLong = MessageTooLong; exports.MalformedMessage = MalformedMessage; exports.InvalidStateType = InvalidStateType; exports.Unsupported = Unsupported; exports.UserError = UserError; exports.InvalidQueryJSON = InvalidQueryJSON; exports.InvalidRequest = InvalidRequest; exports.ActorNotFound = ActorNotFound; exports.ActorAlreadyExists = ActorAlreadyExists; exports.ProxyError = ProxyError; exports.InvalidActionRequest = InvalidActionRequest; exports.InvalidParams = InvalidParams; exports.Unauthorized = Unauthorized; exports.Forbidden = Forbidden; exports.DatabaseNotEnabled = DatabaseNotEnabled; exports.FetchHandlerNotDefined = FetchHandlerNotDefined; exports.WebSocketHandlerNotDefined = WebSocketHandlerNotDefined; exports.InvalidFetchResponse = InvalidFetchResponse; exports.MissingActorHeader = MissingActorHeader; exports.WebSocketsNotEnabled = WebSocketsNotEnabled; exports.FeatureNotImplemented = FeatureNotImplemented; exports.RouteNotFound = RouteNotFound;
|
|
374
|
-
//# sourceMappingURL=chunk-
|
|
374
|
+
//# sourceMappingURL=chunk-5QGQK44L.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-SBHHJ6QS.cjs","../../src/actor/errors.ts"],"names":[],"mappings":"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A;AACb,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACe,MAAA;AAChB,IAAA;AACkB,IAAA;AACnB,EAAA;AACD;AAGO;AACQ,EAAA;AACb,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACe,MAAA;AAChB,IAAA;AACkB,IAAA;AACnB,EAAA;AACD;AAEO;AACQ,EAAA;AACb,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACe,MAAA;AAChB,IAAA;AACkB,IAAA;AACnB,EAAA;AACD;AAEO;AACuB,EAAA;AACX,IAAA;AACR,MAAA;AACR,IAAA;AACiB,IAAA;AACnB,EAAA;AACD;AAEO;AACQ,EAAA;AACe,IAAA;AACV,IAAA;AACnB,EAAA;AACD;ADvFiC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-SBHHJ6QS.cjs","sourcesContent":[null,"import type { DeconstructedError } from \"@/common/utils\";\n\nexport const INTERNAL_ERROR_CODE = \"internal_error\";\nexport const INTERNAL_ERROR_DESCRIPTION =\n\t\"Internal error. Read the server logs for more details.\";\nexport type InternalErrorMetadata = {};\n\nexport const USER_ERROR_CODE = \"user_error\";\n\ninterface ActorErrorOptions extends ErrorOptions {\n\t/** Error data can safely be serialized in a response to the client. */\n\tpublic?: boolean;\n\t/** Metadata associated with this error. This will be sent to clients. */\n\tmetadata?: unknown;\n}\n\nexport class ActorError extends Error {\n\t__type = \"ActorError\";\n\n\tpublic public: boolean;\n\tpublic metadata?: unknown;\n\tpublic statusCode = 500;\n\tpublic readonly group: string;\n\tpublic readonly code: string;\n\n\tpublic static isActorError(\n\t\terror: unknown,\n\t): error is ActorError | DeconstructedError {\n\t\treturn (\n\t\t\ttypeof error === \"object\" &&\n\t\t\t(error as ActorError | DeconstructedError).__type === \"ActorError\"\n\t\t);\n\t}\n\n\tconstructor(\n\t\tgroup: string,\n\t\tcode: string,\n\t\tmessage: string,\n\t\topts?: ActorErrorOptions,\n\t) {\n\t\tsuper(message, { cause: opts?.cause });\n\t\tthis.group = group;\n\t\tthis.code = code;\n\t\tthis.public = opts?.public ?? false;\n\t\tthis.metadata = opts?.metadata;\n\n\t\t// Set status code based on error type\n\t\tif (opts?.public) {\n\t\t\tthis.statusCode = 400; // Bad request for public errors\n\t\t}\n\t}\n\n\ttoString() {\n\t\t// Force stringify to return the message\n\t\treturn this.message;\n\t}\n\n\t/**\n\t * Serialize error for HTTP response\n\t */\n\tserializeForHttp() {\n\t\treturn {\n\t\t\ttype: this.code,\n\t\t\tmessage: this.message,\n\t\t\tmetadata: this.metadata,\n\t\t};\n\t}\n}\n\nexport class InternalError extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"actor\", INTERNAL_ERROR_CODE, message);\n\t}\n}\n\nexport class Unreachable extends InternalError {\n\tconstructor(x: never) {\n\t\tsuper(`Unreachable case: ${x}`);\n\t}\n}\n\nexport class StateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"state_not_enabled\",\n\t\t\t\"State not enabled. Must implement `createState` or `state` to use state. (https://www.rivet.dev/docs/actors/state/#initializing-state)\",\n\t\t);\n\t}\n}\n\nexport class ConnStateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"conn_state_not_enabled\",\n\t\t\t\"Connection state not enabled. Must implement `createConnectionState` or `connectionState` to use connection state. (https://www.rivet.dev/docs/actors/connections/#connection-state)\",\n\t\t);\n\t}\n}\n\nexport class VarsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"vars_not_enabled\",\n\t\t\t\"Variables not enabled. Must implement `createVars` or `vars` to use state. (https://www.rivet.dev/docs/actors/ephemeral-variables/#initializing-variables)\",\n\t\t);\n\t}\n}\n\nexport class ActionTimedOut extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"timed_out\",\n\t\t\t\"Action timed out. This can be increased with: `actor({ options: { action: { timeout: ... } } })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActionNotFound extends ActorError {\n\tconstructor(name: string) {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"not_found\",\n\t\t\t`Action '${name}' not found. Validate the action exists on your actor.`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class InvalidEncoding extends ActorError {\n\tconstructor(format?: string) {\n\t\tsuper(\n\t\t\t\"encoding\",\n\t\t\t\"invalid\",\n\t\t\t`Invalid encoding \\`${format}\\`. (https://www.rivet.dev/docs/actors/clients/#actor-client)`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class ConnNotFound extends ActorError {\n\tconstructor(id?: string) {\n\t\tsuper(\"connection\", \"not_found\", `Connection not found for ID: ${id}`, {\n\t\t\tpublic: true,\n\t\t});\n\t}\n}\n\nexport class IncorrectConnToken extends ActorError {\n\tconstructor() {\n\t\tsuper(\"connection\", \"incorrect_token\", \"Incorrect connection token.\", {\n\t\t\tpublic: true,\n\t\t});\n\t}\n}\n\nexport class MessageTooLong extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"message\",\n\t\t\t\"too_long\",\n\t\t\t\"Message too long. This can be configured with: `registry.runServer({ maxIncomingMessageSize: ... })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class MalformedMessage extends ActorError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(\"message\", \"malformed\", `Malformed message: ${cause}`, {\n\t\t\tpublic: true,\n\t\t\tcause,\n\t\t});\n\t}\n}\n\nexport interface InvalidStateTypeOptions {\n\tpath?: unknown;\n}\n\nexport class InvalidStateType extends ActorError {\n\tconstructor(opts?: InvalidStateTypeOptions) {\n\t\tlet msg = \"\";\n\t\tif (opts?.path) {\n\t\t\tmsg += `Attempted to set invalid state at path \\`${opts.path}\\`.`;\n\t\t} else {\n\t\t\tmsg += \"Attempted to set invalid state.\";\n\t\t}\n\t\tmsg +=\n\t\t\t\" Valid types include: null, undefined, boolean, string, number, BigInt, Date, RegExp, Error, typed arrays (Uint8Array, Int8Array, Float32Array, etc.), Map, Set, Array, and plain objects. (https://www.rivet.dev/docs/actors/state/#limitations)\";\n\t\tsuper(\"state\", \"invalid_type\", msg);\n\t}\n}\n\nexport class Unsupported extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"unsupported\", `Unsupported feature: ${feature}`);\n\t}\n}\n\n/**\n * Options for the UserError class.\n */\nexport interface UserErrorOptions extends ErrorOptions {\n\t/**\n\t * Machine readable code for this error. Useful for catching different types of errors in try-catch.\n\t */\n\tcode?: string;\n\n\t/**\n\t * Additional metadata related to the error. Useful for understanding context about the error.\n\t */\n\tmetadata?: unknown;\n}\n\n/** Error that can be safely returned to the user. */\nexport class UserError extends ActorError {\n\t/**\n\t * Constructs a new UserError instance.\n\t *\n\t * @param message - The error message to be displayed.\n\t * @param opts - Optional parameters for the error, including a machine-readable code and additional metadata.\n\t */\n\tconstructor(message: string, opts?: UserErrorOptions) {\n\t\tsuper(\"user\", opts?.code ?? USER_ERROR_CODE, message, {\n\t\t\tpublic: true,\n\t\t\tmetadata: opts?.metadata,\n\t\t});\n\t}\n}\n\nexport class InvalidQueryJSON extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid_query_json\", `Invalid query JSON: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class InvalidRequest extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid\", `Invalid request: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class ActorNotFound extends ActorError {\n\tconstructor(identifier?: string) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"not_found\",\n\t\t\tidentifier\n\t\t\t\t? `Actor not found: ${identifier} (https://www.rivet.dev/docs/actors/clients/#actor-client)`\n\t\t\t\t: \"Actor not found (https://www.rivet.dev/docs/actors/clients/#actor-client)\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActorAlreadyExists extends ActorError {\n\tconstructor(name: string, key: string[]) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"already_exists\",\n\t\t\t`Actor already exists with name '${name}' and key '${JSON.stringify(key)}' (https://www.rivet.dev/docs/actors/clients/#actor-client)`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ProxyError extends ActorError {\n\tconstructor(operation: string, error?: unknown) {\n\t\tsuper(\n\t\t\t\"proxy\",\n\t\t\t\"error\",\n\t\t\t`Error proxying ${operation}, this is likely an internal error: ${error}`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tcause: error,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class InvalidActionRequest extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"action\", \"invalid_request\", message, { public: true });\n\t}\n}\n\nexport class InvalidParams extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"params\", \"invalid\", message, { public: true });\n\t}\n}\n\nexport class Unauthorized extends ActorError {\n\tconstructor(message?: string) {\n\t\tsuper(\n\t\t\t\"auth\",\n\t\t\t\"unauthorized\",\n\t\t\tmessage ??\n\t\t\t\t\"Unauthorized. Access denied. (https://www.rivet.dev/docs/actors/authentication/)\",\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t},\n\t\t);\n\t\tthis.statusCode = 401;\n\t}\n}\n\nexport class Forbidden extends ActorError {\n\tconstructor(message?: string, opts?: { metadata?: unknown }) {\n\t\tsuper(\n\t\t\t\"auth\",\n\t\t\t\"forbidden\",\n\t\t\tmessage ??\n\t\t\t\t\"Forbidden. Access denied. (https://www.rivet.dev/docs/actors/authentication/)\",\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tmetadata: opts?.metadata,\n\t\t\t},\n\t\t);\n\t\tthis.statusCode = 403;\n\t}\n}\n\nexport class DatabaseNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"database\",\n\t\t\t\"not_enabled\",\n\t\t\t\"Database not enabled. Must implement `database` to use database.\",\n\t\t);\n\t}\n}\n\nexport class FetchHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"fetch_not_defined\",\n\t\t\t\"Raw HTTP handler not defined. Actor must implement `onFetch` to handle raw HTTP requests. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class WebSocketHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"websocket_not_defined\",\n\t\t\t\"Raw WebSocket handler not defined. Actor must implement `onWebSocket` to handle raw WebSocket connections. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class InvalidFetchResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_fetch_response\",\n\t\t\t\"Actor's onFetch handler must return a Response object. Returning void/undefined is not allowed. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\n// Manager-specific errors\nexport class MissingActorHeader extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"request\",\n\t\t\t\"missing_actor_header\",\n\t\t\t\"Missing x-rivet-actor header when x-rivet-target=actor\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class WebSocketsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"driver\",\n\t\t\t\"websockets_not_enabled\",\n\t\t\t\"WebSockets are not enabled for this driver\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class FeatureNotImplemented extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"not_implemented\", `${feature} is not implemented`, {\n\t\t\tpublic: true,\n\t\t});\n\t\tthis.statusCode = 501;\n\t}\n}\n\nexport class RouteNotFound extends ActorError {\n\tconstructor() {\n\t\tsuper(\"route\", \"not_found\", \"Route not found\", { public: true });\n\t\tthis.statusCode = 404;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-5QGQK44L.cjs","../../src/actor/errors.ts"],"names":[],"mappings":"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A;AACb,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACe,MAAA;AAChB,IAAA;AACkB,IAAA;AACnB,EAAA;AACD;AAGO;AACQ,EAAA;AACb,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACe,MAAA;AAChB,IAAA;AACkB,IAAA;AACnB,EAAA;AACD;AAEO;AACQ,EAAA;AACb,IAAA;AACC,MAAA;AACA,MAAA;AACA,MAAA;AACe,MAAA;AAChB,IAAA;AACkB,IAAA;AACnB,EAAA;AACD;AAEO;AACuB,EAAA;AACX,IAAA;AACR,MAAA;AACR,IAAA;AACiB,IAAA;AACnB,EAAA;AACD;AAEO;AACQ,EAAA;AACe,IAAA;AACV,IAAA;AACnB,EAAA;AACD;ADvFiC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-5QGQK44L.cjs","sourcesContent":[null,"import type { DeconstructedError } from \"@/common/utils\";\n\nexport const INTERNAL_ERROR_CODE = \"internal_error\";\nexport const INTERNAL_ERROR_DESCRIPTION =\n\t\"Internal error. Read the server logs for more details.\";\nexport type InternalErrorMetadata = {};\n\nexport const USER_ERROR_CODE = \"user_error\";\n\ninterface ActorErrorOptions extends ErrorOptions {\n\t/** Error data can safely be serialized in a response to the client. */\n\tpublic?: boolean;\n\t/** Metadata associated with this error. This will be sent to clients. */\n\tmetadata?: unknown;\n}\n\nexport class ActorError extends Error {\n\t__type = \"ActorError\";\n\n\tpublic public: boolean;\n\tpublic metadata?: unknown;\n\tpublic statusCode = 500;\n\tpublic readonly group: string;\n\tpublic readonly code: string;\n\n\tpublic static isActorError(\n\t\terror: unknown,\n\t): error is ActorError | DeconstructedError {\n\t\treturn (\n\t\t\ttypeof error === \"object\" &&\n\t\t\t(error as ActorError | DeconstructedError).__type === \"ActorError\"\n\t\t);\n\t}\n\n\tconstructor(\n\t\tgroup: string,\n\t\tcode: string,\n\t\tmessage: string,\n\t\topts?: ActorErrorOptions,\n\t) {\n\t\tsuper(message, { cause: opts?.cause });\n\t\tthis.group = group;\n\t\tthis.code = code;\n\t\tthis.public = opts?.public ?? false;\n\t\tthis.metadata = opts?.metadata;\n\n\t\t// Set status code based on error type\n\t\tif (opts?.public) {\n\t\t\tthis.statusCode = 400; // Bad request for public errors\n\t\t}\n\t}\n\n\ttoString() {\n\t\t// Force stringify to return the message\n\t\treturn this.message;\n\t}\n\n\t/**\n\t * Serialize error for HTTP response\n\t */\n\tserializeForHttp() {\n\t\treturn {\n\t\t\ttype: this.code,\n\t\t\tmessage: this.message,\n\t\t\tmetadata: this.metadata,\n\t\t};\n\t}\n}\n\nexport class InternalError extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"actor\", INTERNAL_ERROR_CODE, message);\n\t}\n}\n\nexport class Unreachable extends InternalError {\n\tconstructor(x: never) {\n\t\tsuper(`Unreachable case: ${x}`);\n\t}\n}\n\nexport class StateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"state_not_enabled\",\n\t\t\t\"State not enabled. Must implement `createState` or `state` to use state. (https://www.rivet.dev/docs/actors/state/#initializing-state)\",\n\t\t);\n\t}\n}\n\nexport class ConnStateNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"conn_state_not_enabled\",\n\t\t\t\"Connection state not enabled. Must implement `createConnectionState` or `connectionState` to use connection state. (https://www.rivet.dev/docs/actors/connections/#connection-state)\",\n\t\t);\n\t}\n}\n\nexport class VarsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"vars_not_enabled\",\n\t\t\t\"Variables not enabled. Must implement `createVars` or `vars` to use state. (https://www.rivet.dev/docs/actors/ephemeral-variables/#initializing-variables)\",\n\t\t);\n\t}\n}\n\nexport class ActionTimedOut extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"timed_out\",\n\t\t\t\"Action timed out. This can be increased with: `actor({ options: { action: { timeout: ... } } })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActionNotFound extends ActorError {\n\tconstructor(name: string) {\n\t\tsuper(\n\t\t\t\"action\",\n\t\t\t\"not_found\",\n\t\t\t`Action '${name}' not found. Validate the action exists on your actor.`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class InvalidEncoding extends ActorError {\n\tconstructor(format?: string) {\n\t\tsuper(\n\t\t\t\"encoding\",\n\t\t\t\"invalid\",\n\t\t\t`Invalid encoding \\`${format}\\`. (https://www.rivet.dev/docs/actors/clients/#actor-client)`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class ConnNotFound extends ActorError {\n\tconstructor(id?: string) {\n\t\tsuper(\"connection\", \"not_found\", `Connection not found for ID: ${id}`, {\n\t\t\tpublic: true,\n\t\t});\n\t}\n}\n\nexport class IncorrectConnToken extends ActorError {\n\tconstructor() {\n\t\tsuper(\"connection\", \"incorrect_token\", \"Incorrect connection token.\", {\n\t\t\tpublic: true,\n\t\t});\n\t}\n}\n\nexport class MessageTooLong extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"message\",\n\t\t\t\"too_long\",\n\t\t\t\"Message too long. This can be configured with: `registry.start({ maxIncomingMessageSize: ... })`\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class MalformedMessage extends ActorError {\n\tconstructor(cause?: unknown) {\n\t\tsuper(\"message\", \"malformed\", `Malformed message: ${cause}`, {\n\t\t\tpublic: true,\n\t\t\tcause,\n\t\t});\n\t}\n}\n\nexport interface InvalidStateTypeOptions {\n\tpath?: unknown;\n}\n\nexport class InvalidStateType extends ActorError {\n\tconstructor(opts?: InvalidStateTypeOptions) {\n\t\tlet msg = \"\";\n\t\tif (opts?.path) {\n\t\t\tmsg += `Attempted to set invalid state at path \\`${opts.path}\\`.`;\n\t\t} else {\n\t\t\tmsg += \"Attempted to set invalid state.\";\n\t\t}\n\t\tmsg +=\n\t\t\t\" Valid types include: null, undefined, boolean, string, number, BigInt, Date, RegExp, Error, typed arrays (Uint8Array, Int8Array, Float32Array, etc.), Map, Set, Array, and plain objects. (https://www.rivet.dev/docs/actors/state/#limitations)\";\n\t\tsuper(\"state\", \"invalid_type\", msg);\n\t}\n}\n\nexport class Unsupported extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"unsupported\", `Unsupported feature: ${feature}`);\n\t}\n}\n\n/**\n * Options for the UserError class.\n */\nexport interface UserErrorOptions extends ErrorOptions {\n\t/**\n\t * Machine readable code for this error. Useful for catching different types of errors in try-catch.\n\t */\n\tcode?: string;\n\n\t/**\n\t * Additional metadata related to the error. Useful for understanding context about the error.\n\t */\n\tmetadata?: unknown;\n}\n\n/** Error that can be safely returned to the user. */\nexport class UserError extends ActorError {\n\t/**\n\t * Constructs a new UserError instance.\n\t *\n\t * @param message - The error message to be displayed.\n\t * @param opts - Optional parameters for the error, including a machine-readable code and additional metadata.\n\t */\n\tconstructor(message: string, opts?: UserErrorOptions) {\n\t\tsuper(\"user\", opts?.code ?? USER_ERROR_CODE, message, {\n\t\t\tpublic: true,\n\t\t\tmetadata: opts?.metadata,\n\t\t});\n\t}\n}\n\nexport class InvalidQueryJSON extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid_query_json\", `Invalid query JSON: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class InvalidRequest extends ActorError {\n\tconstructor(error?: unknown) {\n\t\tsuper(\"request\", \"invalid\", `Invalid request: ${error}`, {\n\t\t\tpublic: true,\n\t\t\tcause: error,\n\t\t});\n\t}\n}\n\nexport class ActorNotFound extends ActorError {\n\tconstructor(identifier?: string) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"not_found\",\n\t\t\tidentifier\n\t\t\t\t? `Actor not found: ${identifier} (https://www.rivet.dev/docs/actors/clients/#actor-client)`\n\t\t\t\t: \"Actor not found (https://www.rivet.dev/docs/actors/clients/#actor-client)\",\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ActorAlreadyExists extends ActorError {\n\tconstructor(name: string, key: string[]) {\n\t\tsuper(\n\t\t\t\"actor\",\n\t\t\t\"already_exists\",\n\t\t\t`Actor already exists with name '${name}' and key '${JSON.stringify(key)}' (https://www.rivet.dev/docs/actors/clients/#actor-client)`,\n\t\t\t{ public: true },\n\t\t);\n\t}\n}\n\nexport class ProxyError extends ActorError {\n\tconstructor(operation: string, error?: unknown) {\n\t\tsuper(\n\t\t\t\"proxy\",\n\t\t\t\"error\",\n\t\t\t`Error proxying ${operation}, this is likely an internal error: ${error}`,\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tcause: error,\n\t\t\t},\n\t\t);\n\t}\n}\n\nexport class InvalidActionRequest extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"action\", \"invalid_request\", message, { public: true });\n\t}\n}\n\nexport class InvalidParams extends ActorError {\n\tconstructor(message: string) {\n\t\tsuper(\"params\", \"invalid\", message, { public: true });\n\t}\n}\n\nexport class Unauthorized extends ActorError {\n\tconstructor(message?: string) {\n\t\tsuper(\n\t\t\t\"auth\",\n\t\t\t\"unauthorized\",\n\t\t\tmessage ??\n\t\t\t\t\"Unauthorized. Access denied. (https://www.rivet.dev/docs/actors/authentication/)\",\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t},\n\t\t);\n\t\tthis.statusCode = 401;\n\t}\n}\n\nexport class Forbidden extends ActorError {\n\tconstructor(message?: string, opts?: { metadata?: unknown }) {\n\t\tsuper(\n\t\t\t\"auth\",\n\t\t\t\"forbidden\",\n\t\t\tmessage ??\n\t\t\t\t\"Forbidden. Access denied. (https://www.rivet.dev/docs/actors/authentication/)\",\n\t\t\t{\n\t\t\t\tpublic: true,\n\t\t\t\tmetadata: opts?.metadata,\n\t\t\t},\n\t\t);\n\t\tthis.statusCode = 403;\n\t}\n}\n\nexport class DatabaseNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"database\",\n\t\t\t\"not_enabled\",\n\t\t\t\"Database not enabled. Must implement `database` to use database.\",\n\t\t);\n\t}\n}\n\nexport class FetchHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"fetch_not_defined\",\n\t\t\t\"Raw HTTP handler not defined. Actor must implement `onFetch` to handle raw HTTP requests. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class WebSocketHandlerNotDefined extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"websocket_not_defined\",\n\t\t\t\"Raw WebSocket handler not defined. Actor must implement `onWebSocket` to handle raw WebSocket connections. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 404;\n\t}\n}\n\nexport class InvalidFetchResponse extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"handler\",\n\t\t\t\"invalid_fetch_response\",\n\t\t\t\"Actor's onFetch handler must return a Response object. Returning void/undefined is not allowed. (https://www.rivet.dev/docs/actors/fetch-and-websocket-handler/)\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 500;\n\t}\n}\n\n// Manager-specific errors\nexport class MissingActorHeader extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"request\",\n\t\t\t\"missing_actor_header\",\n\t\t\t\"Missing x-rivet-actor header when x-rivet-target=actor\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class WebSocketsNotEnabled extends ActorError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"driver\",\n\t\t\t\"websockets_not_enabled\",\n\t\t\t\"WebSockets are not enabled for this driver\",\n\t\t\t{ public: true },\n\t\t);\n\t\tthis.statusCode = 400;\n\t}\n}\n\nexport class FeatureNotImplemented extends ActorError {\n\tconstructor(feature: string) {\n\t\tsuper(\"feature\", \"not_implemented\", `${feature} is not implemented`, {\n\t\t\tpublic: true,\n\t\t});\n\t\tthis.statusCode = 501;\n\t}\n}\n\nexport class RouteNotFound extends ActorError {\n\tconstructor() {\n\t\tsuper(\"route\", \"not_found\", \"Route not found\", { public: true });\n\t\tthis.statusCode = 404;\n\t}\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkWADSS5X4cjs = require('./chunk-WADSS5X4.cjs');
|
|
4
4
|
|
|
5
5
|
// src/common/log.ts
|
|
6
6
|
|
|
@@ -128,7 +128,7 @@ function getPinoLevel(logLevel) {
|
|
|
128
128
|
if (configuredLogLevel) {
|
|
129
129
|
return configuredLogLevel;
|
|
130
130
|
}
|
|
131
|
-
const raw = (
|
|
131
|
+
const raw = (_chunkWADSS5X4cjs.getEnvUniversal.call(void 0, "LOG_LEVEL") || "warn").toString().toLowerCase();
|
|
132
132
|
const parsed = LogLevelSchema.safeParse(raw);
|
|
133
133
|
if (parsed.success) {
|
|
134
134
|
return parsed.data;
|
|
@@ -136,7 +136,7 @@ function getPinoLevel(logLevel) {
|
|
|
136
136
|
return "info";
|
|
137
137
|
}
|
|
138
138
|
function getIncludeTarget() {
|
|
139
|
-
return
|
|
139
|
+
return _chunkWADSS5X4cjs.getEnvUniversal.call(void 0, "LOG_TARGET") === "1";
|
|
140
140
|
}
|
|
141
141
|
function configureBaseLogger(logger) {
|
|
142
142
|
baseLogger = logger;
|
|
@@ -144,7 +144,7 @@ function configureBaseLogger(logger) {
|
|
|
144
144
|
}
|
|
145
145
|
function customWrite(level, o) {
|
|
146
146
|
const entries = {};
|
|
147
|
-
if (
|
|
147
|
+
if (_chunkWADSS5X4cjs.getEnvUniversal.call(void 0, "LOG_TIMESTAMP") === "1" && o.time) {
|
|
148
148
|
const date = typeof o.time === "number" ? new Date(o.time) : /* @__PURE__ */ new Date();
|
|
149
149
|
entries.ts = formatTimestamp(date);
|
|
150
150
|
}
|
|
@@ -178,7 +178,7 @@ async function configureDefaultLogger(logLevel) {
|
|
|
178
178
|
return { level: number };
|
|
179
179
|
}
|
|
180
180
|
},
|
|
181
|
-
timestamp:
|
|
181
|
+
timestamp: _chunkWADSS5X4cjs.getEnvUniversal.call(void 0, "LOG_TIMESTAMP") === "1" ? _pino.stdTimeFunctions.epochTime : false,
|
|
182
182
|
browser: {
|
|
183
183
|
write: {
|
|
184
184
|
fatal: customWrite.bind(null, "fatal"),
|
|
@@ -200,7 +200,7 @@ async function configureDefaultLogger(logLevel) {
|
|
|
200
200
|
60: "fatal"
|
|
201
201
|
};
|
|
202
202
|
const levelName = levelMap[level] || "info";
|
|
203
|
-
const time =
|
|
203
|
+
const time = _chunkWADSS5X4cjs.getEnvUniversal.call(void 0, "LOG_TIMESTAMP") === "1" ? Date.now() : void 0;
|
|
204
204
|
if (inputArgs.length >= 2) {
|
|
205
205
|
const [objOrMsg, msg] = inputArgs;
|
|
206
206
|
if (typeof objOrMsg === "object" && objOrMsg !== null) {
|
|
@@ -247,4 +247,4 @@ function getLogger(name = "default") {
|
|
|
247
247
|
|
|
248
248
|
|
|
249
249
|
exports.LogLevelSchema = LogLevelSchema; exports.getPinoLevel = getPinoLevel; exports.getIncludeTarget = getIncludeTarget; exports.configureBaseLogger = configureBaseLogger; exports.configureDefaultLogger = configureDefaultLogger; exports.getBaseLogger = getBaseLogger; exports.getLogger = getLogger;
|
|
250
|
-
//# sourceMappingURL=chunk-
|
|
250
|
+
//# sourceMappingURL=chunk-5YTI25C3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-4CXBCT26.cjs","../../src/common/log.ts","../../src/common/log-levels.ts","../../src/common/logfmt.ts"],"names":[],"mappings":"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","file":"/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-4CXBCT26.cjs","sourcesContent":[null,"import {\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\nimport { z } from \"zod\";\nimport { getEnvUniversal } from \"@/utils\";\nimport {\n\tcastToLogValue,\n\tformatTimestamp,\n\tLOGGER_CONFIG,\n\tstringify,\n} from \"./logfmt\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\nlet configuredLogLevel: LogLevel | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport const LogLevelSchema = z.enum([\n\t\"trace\",\n\t\"debug\",\n\t\"info\",\n\t\"warn\",\n\t\"error\",\n\t\"fatal\",\n\t\"silent\",\n]);\n\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport function getPinoLevel(logLevel?: LogLevel): LevelWithSilent {\n\t// Priority: provided > configured > env > default\n\tif (logLevel) {\n\t\treturn logLevel;\n\t}\n\n\tif (configuredLogLevel) {\n\t\treturn configuredLogLevel;\n\t}\n\n\tconst raw = (getEnvUniversal(\"LOG_LEVEL\") || \"warn\").toString().toLowerCase();\n\n\tconst parsed = LogLevelSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\n\t// Default to info if invalid\n\treturn \"info\";\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn getEnvUniversal(\"LOG_TARGET\") === \"1\";\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n// TODO: This can be simplified in logfmt.ts\nfunction customWrite(level: string, o: any) {\n\tconst entries: any = {};\n\n\t// Add timestamp if enabled\n\tif (getEnvUniversal(\"LOG_TIMESTAMP\") === \"1\" && o.time) {\n\t\tconst date = typeof o.time === \"number\" ? new Date(o.time) : new Date();\n\t\tentries.ts = formatTimestamp(date);\n\t}\n\n\t// Add level\n\tentries.level = level.toUpperCase();\n\n\t// Add target if present\n\tif (o.target) {\n\t\tentries.target = o.target;\n\t}\n\n\t// Add message\n\tif (o.msg) {\n\t\tentries.msg = o.msg;\n\t}\n\n\t// Add other properties\n\tfor (const [key, value] of Object.entries(o)) {\n\t\tif (\n\t\t\tkey !== \"time\" &&\n\t\t\tkey !== \"level\" &&\n\t\t\tkey !== \"target\" &&\n\t\t\tkey !== \"msg\" &&\n\t\t\tkey !== \"pid\" &&\n\t\t\tkey !== \"hostname\"\n\t\t) {\n\t\t\tentries[key] = castToLogValue(value);\n\t\t}\n\t}\n\n\tconst output = stringify(entries);\n\tconsole.log(output);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport async function configureDefaultLogger(\n\tlogLevel?: LogLevel,\n): Promise<void> {\n\t// Store the configured log level\n\tif (logLevel) {\n\t\tconfiguredLogLevel = logLevel;\n\t}\n\n\tbaseLogger = pino({\n\t\tlevel: getPinoLevel(logLevel),\n\t\tmessageKey: \"msg\",\n\t\t// Do not include pid/hostname in output\n\t\tbase: {},\n\t\t// Keep a string level in the output\n\t\tformatters: {\n\t\t\tlevel(_label: string, number: number) {\n\t\t\t\treturn { level: number };\n\t\t\t},\n\t\t},\n\t\ttimestamp:\n\t\t\tgetEnvUniversal(\"LOG_TIMESTAMP\") === \"1\"\n\t\t\t\t? stdTimeFunctions.epochTime\n\t\t\t\t: false,\n\t\tbrowser: {\n\t\t\twrite: {\n\t\t\t\tfatal: customWrite.bind(null, \"fatal\"),\n\t\t\t\terror: customWrite.bind(null, \"error\"),\n\t\t\t\twarn: customWrite.bind(null, \"warn\"),\n\t\t\t\tinfo: customWrite.bind(null, \"info\"),\n\t\t\t\tdebug: customWrite.bind(null, \"debug\"),\n\t\t\t\ttrace: customWrite.bind(null, \"trace\"),\n\t\t\t},\n\t\t},\n\t\thooks: {\n\t\t\tlogMethod(inputArgs, _method, level) {\n\t\t\t\t// TODO: This is a hack to not implement our own transport target. We can get better perf if we have our own transport target.\n\n\t\t\t\tconst levelMap: Record<number, string> = {\n\t\t\t\t\t10: \"trace\",\n\t\t\t\t\t20: \"debug\",\n\t\t\t\t\t30: \"info\",\n\t\t\t\t\t40: \"warn\",\n\t\t\t\t\t50: \"error\",\n\t\t\t\t\t60: \"fatal\",\n\t\t\t\t};\n\t\t\t\tconst levelName = levelMap[level] || \"info\";\n\t\t\t\tconst time =\n\t\t\t\t\tgetEnvUniversal(\"LOG_TIMESTAMP\") === \"1\" ? Date.now() : undefined;\n\t\t\t\t// TODO: This can be simplified in logfmt.ts\n\t\t\t\tif (inputArgs.length >= 2) {\n\t\t\t\t\tconst [objOrMsg, msg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, msg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t} else if (inputArgs.length === 1) {\n\t\t\t\t\tconst [objOrMsg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t});\n\n\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n","export type LogLevel =\n\t| \"TRACE\"\n\t| \"DEBUG\"\n\t| \"INFO\"\n\t| \"WARN\"\n\t| \"ERROR\"\n\t| \"CRITICAL\";\n\nexport const LogLevels: Record<LogLevel, LevelIndex> = {\n\tTRACE: 0,\n\tDEBUG: 1,\n\tINFO: 2,\n\tWARN: 3,\n\tERROR: 4,\n\tCRITICAL: 5,\n} as const;\n\nexport const LevelNameMap: Record<number, LogLevel> = {\n\t0: \"TRACE\",\n\t1: \"DEBUG\",\n\t2: \"INFO\",\n\t3: \"WARN\",\n\t4: \"ERROR\",\n\t5: \"CRITICAL\",\n};\n\nexport type LevelIndex = number;\n","import { type LogLevel, LogLevels } from \"./log-levels\";\n\nconst LOG_LEVEL_COLORS: Record<number, string> = {\n\t[LogLevels.CRITICAL]: \"\\x1b[31m\", // Red\n\t[LogLevels.ERROR]: \"\\x1b[31m\", // Red\n\t[LogLevels.WARN]: \"\\x1b[33m\", // Yellow\n\t[LogLevels.INFO]: \"\\x1b[32m\", // Green\n\t[LogLevels.DEBUG]: \"\\x1b[36m\", // Cyan\n\t[LogLevels.TRACE]: \"\\x1b[36m\", // Cyan\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n/**\n * Serializes logfmt line from an object.\n *\n * ## Styling Methodology\n *\n * The three things you need to know for every log line is the level, the\n * message, and who called it. These properties are highlighted in different colros\n * and sorted in th eorder that you usually read them.\n *\n * Once you've found a log line you care about, then you want to find the\n * property you need to see. The property names are bolded and the default color\n * while the rest of the data is dim. This lets you scan to find the property\n * name quickly then look closer to read the data associated with the\n * property.\n */\nexport function stringify(data: any) {\n\tlet line = \"\";\n\tconst entries = Object.entries(data);\n\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tconst [key, valueRaw] = entries[i];\n\n\t\tlet isNull = false;\n\t\tlet valueString: string;\n\t\tif (valueRaw == null) {\n\t\t\tisNull = true;\n\t\t\tvalueString = \"\";\n\t\t} else {\n\t\t\tvalueString = valueRaw.toString();\n\t\t}\n\n\t\t// Clip value unless specifically the error message\n\t\tif (valueString.length > 512 && key !== \"msg\" && key !== \"error\")\n\t\t\tvalueString = `${valueString.slice(0, 512)}...`;\n\n\t\tconst needsQuoting =\n\t\t\tvalueString.indexOf(\" \") > -1 || valueString.indexOf(\"=\") > -1;\n\t\tconst needsEscaping =\n\t\t\tvalueString.indexOf('\"') > -1 || valueString.indexOf(\"\\\\\") > -1;\n\n\t\tvalueString = valueString.replace(/\\n/g, \"\\\\n\");\n\t\tif (needsEscaping) valueString = valueString.replace(/[\"\\\\]/g, \"\\\\$&\");\n\t\tif (needsQuoting || needsEscaping) valueString = `\"${valueString}\"`;\n\t\tif (valueString === \"\" && !isNull) valueString = '\"\"';\n\n\t\tif (LOGGER_CONFIG.enableColor) {\n\t\t\t// With color\n\n\t\t\t// Special message colors\n\t\t\tlet color = \"\\x1b[2m\";\n\t\t\tif (key === \"level\") {\n\t\t\t\tconst level = LogLevels[valueString as LogLevel];\n\t\t\t\tconst levelColor = LOG_LEVEL_COLORS[level];\n\t\t\t\tif (levelColor) {\n\t\t\t\t\tcolor = levelColor;\n\t\t\t\t}\n\t\t\t} else if (key === \"msg\") {\n\t\t\t\tcolor = \"\\x1b[32m\";\n\t\t\t} else if (key === \"trace\") {\n\t\t\t\tcolor = \"\\x1b[34m\";\n\t\t\t}\n\n\t\t\t// Format line\n\t\t\tline += `\\x1b[0m\\x1b[1m${key}\\x1b[0m\\x1b[2m=\\x1b[0m${color}${valueString}${RESET_COLOR}`;\n\t\t} else {\n\t\t\t// No color\n\t\t\tline += `${key}=${valueString}`;\n\t\t}\n\n\t\tif (i !== entries.length - 1) {\n\t\t\tline += \" \";\n\t\t}\n\t}\n\n\treturn line;\n}\n\nexport function formatTimestamp(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst hours = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n\tconst milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\n\n\treturn `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\n}\n\nexport function castToLogValue(v: unknown): any {\n\tif (\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"bigint\" ||\n\t\ttypeof v === \"boolean\" ||\n\t\tv === null ||\n\t\tv === undefined\n\t) {\n\t\treturn v;\n\t}\n\tif (v instanceof Error) {\n\t\t//args.push(...errorToLogEntries(k, v));\n\t\treturn String(v);\n\t}\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch {\n\t\treturn \"[cannot stringify]\";\n\t}\n}\n\n// MARK: Config\ninterface GlobalLoggerConfig {\n\tenableColor: boolean;\n\tenableSpreadObject: boolean;\n\tenableErrorStack: boolean;\n}\n\nexport const LOGGER_CONFIG: GlobalLoggerConfig = {\n\tenableColor: false,\n\tenableSpreadObject: false,\n\tenableErrorStack: false,\n};\n\n// MARK: Utils\n/**\n * Converts an object in to an easier to read KV of entries.\n */\nexport function spreadObjectToLogEntries(base: string, data: unknown): any {\n\tif (\n\t\tLOGGER_CONFIG.enableSpreadObject &&\n\t\ttypeof data === \"object\" &&\n\t\t!Array.isArray(data) &&\n\t\tdata !== null &&\n\t\tObject.keys(data).length !== 0 &&\n\t\tObject.keys(data).length < 16\n\t) {\n\t\tconst logData: any = {};\n\t\tfor (const key in data) {\n\t\t\tObject.assign(\n\t\t\t\tlogData,\n\t\t\t\tspreadObjectToLogEntries(\n\t\t\t\t\t`${base}.${key}`,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: FIXME\n\t\t\t\t\t(data as any)[key],\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn logData;\n\t}\n\n\treturn { [base]: JSON.stringify(data) };\n}\n\nexport function errorToLogEntries(base: string, error: unknown): any {\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\t[`${base}.message`]: error.message,\n\t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n\t\t\t\t? { [`${base}.stack`]: formatStackTrace(error.stack) }\n\t\t\t\t: {}),\n\t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : {}),\n\t\t};\n\t}\n\treturn { [base]: `${error}` };\n}\n\n// export function errorToLogEntries(base: string, error: unknown): LogEntry[] {\n// \tif (error instanceof RuntimeError) {\n// \t\treturn [\n// \t\t\t[`${base}.code`, error.code],\n// \t\t\t[`${base}.description`, error.errorConfig?.description],\n// \t\t\t[`${base}.module`, error.moduleName],\n// \t\t\t...(error.trace ? [[`${base}.trace`, stringifyTrace(error.trace)] as LogEntry] : []),\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.meta ? [[`${base}.meta`, JSON.stringify(error.meta)] as LogEntry] : []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else if (error instanceof Error) {\n// \t\treturn [\n// \t\t\t[`${base}.name`, error.name],\n// \t\t\t[`${base}.message`, error.message],\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else {\n// \t\treturn [\n// \t\t\t[base, `${error}`],\n// \t\t];\n// \t}\n// }\n\n/**\n * Formats a JS stack trace in to a legible one-liner.\n */\nfunction formatStackTrace(stackTrace: string): string {\n\tconst regex = /at (.+?)$/gm;\n\tconst matches = [...stackTrace.matchAll(regex)];\n\t// Reverse array since the stack goes from top level -> bottom level\n\tmatches.reverse();\n\treturn matches.map((match) => match[1].trim()).join(\" > \");\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-5YTI25C3.cjs","../../src/common/log.ts","../../src/common/log-levels.ts","../../src/common/logfmt.ts"],"names":[],"mappings":"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","file":"/Users/nathan/rivetkit/packages/rivetkit/dist/tsup/chunk-5YTI25C3.cjs","sourcesContent":[null,"import {\n\ttype LevelWithSilent,\n\ttype Logger,\n\tpino,\n\tstdTimeFunctions,\n} from \"pino\";\nimport { z } from \"zod\";\nimport { getEnvUniversal } from \"@/utils\";\nimport {\n\tcastToLogValue,\n\tformatTimestamp,\n\tLOGGER_CONFIG,\n\tstringify,\n} from \"./logfmt\";\n\nexport type { Logger } from \"pino\";\n\nlet baseLogger: Logger | undefined;\nlet configuredLogLevel: LogLevel | undefined;\n\n/** Cache of child loggers by logger name. */\nconst loggerCache = new Map<string, Logger>();\n\nexport const LogLevelSchema = z.enum([\n\t\"trace\",\n\t\"debug\",\n\t\"info\",\n\t\"warn\",\n\t\"error\",\n\t\"fatal\",\n\t\"silent\",\n]);\n\nexport type LogLevel = z.infer<typeof LogLevelSchema>;\n\nexport function getPinoLevel(logLevel?: LogLevel): LevelWithSilent {\n\t// Priority: provided > configured > env > default\n\tif (logLevel) {\n\t\treturn logLevel;\n\t}\n\n\tif (configuredLogLevel) {\n\t\treturn configuredLogLevel;\n\t}\n\n\tconst raw = (getEnvUniversal(\"LOG_LEVEL\") || \"warn\").toString().toLowerCase();\n\n\tconst parsed = LogLevelSchema.safeParse(raw);\n\tif (parsed.success) {\n\t\treturn parsed.data;\n\t}\n\n\t// Default to info if invalid\n\treturn \"info\";\n}\n\nexport function getIncludeTarget(): boolean {\n\treturn getEnvUniversal(\"LOG_TARGET\") === \"1\";\n}\n\n/**\n * Configure a custom base logger.\n */\nexport function configureBaseLogger(logger: Logger): void {\n\tbaseLogger = logger;\n\tloggerCache.clear();\n}\n\n// TODO: This can be simplified in logfmt.ts\nfunction customWrite(level: string, o: any) {\n\tconst entries: any = {};\n\n\t// Add timestamp if enabled\n\tif (getEnvUniversal(\"LOG_TIMESTAMP\") === \"1\" && o.time) {\n\t\tconst date = typeof o.time === \"number\" ? new Date(o.time) : new Date();\n\t\tentries.ts = formatTimestamp(date);\n\t}\n\n\t// Add level\n\tentries.level = level.toUpperCase();\n\n\t// Add target if present\n\tif (o.target) {\n\t\tentries.target = o.target;\n\t}\n\n\t// Add message\n\tif (o.msg) {\n\t\tentries.msg = o.msg;\n\t}\n\n\t// Add other properties\n\tfor (const [key, value] of Object.entries(o)) {\n\t\tif (\n\t\t\tkey !== \"time\" &&\n\t\t\tkey !== \"level\" &&\n\t\t\tkey !== \"target\" &&\n\t\t\tkey !== \"msg\" &&\n\t\t\tkey !== \"pid\" &&\n\t\t\tkey !== \"hostname\"\n\t\t) {\n\t\t\tentries[key] = castToLogValue(value);\n\t\t}\n\t}\n\n\tconst output = stringify(entries);\n\tconsole.log(output);\n}\n\n/**\n * Configure the default logger with optional log level.\n */\nexport async function configureDefaultLogger(\n\tlogLevel?: LogLevel,\n): Promise<void> {\n\t// Store the configured log level\n\tif (logLevel) {\n\t\tconfiguredLogLevel = logLevel;\n\t}\n\n\tbaseLogger = pino({\n\t\tlevel: getPinoLevel(logLevel),\n\t\tmessageKey: \"msg\",\n\t\t// Do not include pid/hostname in output\n\t\tbase: {},\n\t\t// Keep a string level in the output\n\t\tformatters: {\n\t\t\tlevel(_label: string, number: number) {\n\t\t\t\treturn { level: number };\n\t\t\t},\n\t\t},\n\t\ttimestamp:\n\t\t\tgetEnvUniversal(\"LOG_TIMESTAMP\") === \"1\"\n\t\t\t\t? stdTimeFunctions.epochTime\n\t\t\t\t: false,\n\t\tbrowser: {\n\t\t\twrite: {\n\t\t\t\tfatal: customWrite.bind(null, \"fatal\"),\n\t\t\t\terror: customWrite.bind(null, \"error\"),\n\t\t\t\twarn: customWrite.bind(null, \"warn\"),\n\t\t\t\tinfo: customWrite.bind(null, \"info\"),\n\t\t\t\tdebug: customWrite.bind(null, \"debug\"),\n\t\t\t\ttrace: customWrite.bind(null, \"trace\"),\n\t\t\t},\n\t\t},\n\t\thooks: {\n\t\t\tlogMethod(inputArgs, _method, level) {\n\t\t\t\t// TODO: This is a hack to not implement our own transport target. We can get better perf if we have our own transport target.\n\n\t\t\t\tconst levelMap: Record<number, string> = {\n\t\t\t\t\t10: \"trace\",\n\t\t\t\t\t20: \"debug\",\n\t\t\t\t\t30: \"info\",\n\t\t\t\t\t40: \"warn\",\n\t\t\t\t\t50: \"error\",\n\t\t\t\t\t60: \"fatal\",\n\t\t\t\t};\n\t\t\t\tconst levelName = levelMap[level] || \"info\";\n\t\t\t\tconst time =\n\t\t\t\t\tgetEnvUniversal(\"LOG_TIMESTAMP\") === \"1\" ? Date.now() : undefined;\n\t\t\t\t// TODO: This can be simplified in logfmt.ts\n\t\t\t\tif (inputArgs.length >= 2) {\n\t\t\t\t\tconst [objOrMsg, msg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, msg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t} else if (inputArgs.length === 1) {\n\t\t\t\t\tconst [objOrMsg] = inputArgs;\n\t\t\t\t\tif (typeof objOrMsg === \"object\" && objOrMsg !== null) {\n\t\t\t\t\t\tcustomWrite(levelName, { ...objOrMsg, time });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcustomWrite(levelName, { msg: String(objOrMsg), time });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t});\n\n\tloggerCache.clear();\n}\n\n/**\n * Get or initialize the base logger.\n */\nexport function getBaseLogger(): Logger {\n\tif (!baseLogger) {\n\t\tconfigureDefaultLogger();\n\t}\n\treturn baseLogger!;\n}\n\n/**\n * Returns a child logger with `target` bound for the given name.\n */\nexport function getLogger(name = \"default\"): Logger {\n\t// Check cache first\n\tconst cached = loggerCache.get(name);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\t// Create\n\tconst base = getBaseLogger();\n\n\t// Add target to log if enabled\n\tconst child = getIncludeTarget() ? base.child({ target: name }) : base;\n\n\t// Cache the logger\n\tloggerCache.set(name, child);\n\n\treturn child;\n}\n","export type LogLevel =\n\t| \"TRACE\"\n\t| \"DEBUG\"\n\t| \"INFO\"\n\t| \"WARN\"\n\t| \"ERROR\"\n\t| \"CRITICAL\";\n\nexport const LogLevels: Record<LogLevel, LevelIndex> = {\n\tTRACE: 0,\n\tDEBUG: 1,\n\tINFO: 2,\n\tWARN: 3,\n\tERROR: 4,\n\tCRITICAL: 5,\n} as const;\n\nexport const LevelNameMap: Record<number, LogLevel> = {\n\t0: \"TRACE\",\n\t1: \"DEBUG\",\n\t2: \"INFO\",\n\t3: \"WARN\",\n\t4: \"ERROR\",\n\t5: \"CRITICAL\",\n};\n\nexport type LevelIndex = number;\n","import { type LogLevel, LogLevels } from \"./log-levels\";\n\nconst LOG_LEVEL_COLORS: Record<number, string> = {\n\t[LogLevels.CRITICAL]: \"\\x1b[31m\", // Red\n\t[LogLevels.ERROR]: \"\\x1b[31m\", // Red\n\t[LogLevels.WARN]: \"\\x1b[33m\", // Yellow\n\t[LogLevels.INFO]: \"\\x1b[32m\", // Green\n\t[LogLevels.DEBUG]: \"\\x1b[36m\", // Cyan\n\t[LogLevels.TRACE]: \"\\x1b[36m\", // Cyan\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n/**\n * Serializes logfmt line from an object.\n *\n * ## Styling Methodology\n *\n * The three things you need to know for every log line is the level, the\n * message, and who called it. These properties are highlighted in different colros\n * and sorted in th eorder that you usually read them.\n *\n * Once you've found a log line you care about, then you want to find the\n * property you need to see. The property names are bolded and the default color\n * while the rest of the data is dim. This lets you scan to find the property\n * name quickly then look closer to read the data associated with the\n * property.\n */\nexport function stringify(data: any) {\n\tlet line = \"\";\n\tconst entries = Object.entries(data);\n\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tconst [key, valueRaw] = entries[i];\n\n\t\tlet isNull = false;\n\t\tlet valueString: string;\n\t\tif (valueRaw == null) {\n\t\t\tisNull = true;\n\t\t\tvalueString = \"\";\n\t\t} else {\n\t\t\tvalueString = valueRaw.toString();\n\t\t}\n\n\t\t// Clip value unless specifically the error message\n\t\tif (valueString.length > 512 && key !== \"msg\" && key !== \"error\")\n\t\t\tvalueString = `${valueString.slice(0, 512)}...`;\n\n\t\tconst needsQuoting =\n\t\t\tvalueString.indexOf(\" \") > -1 || valueString.indexOf(\"=\") > -1;\n\t\tconst needsEscaping =\n\t\t\tvalueString.indexOf('\"') > -1 || valueString.indexOf(\"\\\\\") > -1;\n\n\t\tvalueString = valueString.replace(/\\n/g, \"\\\\n\");\n\t\tif (needsEscaping) valueString = valueString.replace(/[\"\\\\]/g, \"\\\\$&\");\n\t\tif (needsQuoting || needsEscaping) valueString = `\"${valueString}\"`;\n\t\tif (valueString === \"\" && !isNull) valueString = '\"\"';\n\n\t\tif (LOGGER_CONFIG.enableColor) {\n\t\t\t// With color\n\n\t\t\t// Special message colors\n\t\t\tlet color = \"\\x1b[2m\";\n\t\t\tif (key === \"level\") {\n\t\t\t\tconst level = LogLevels[valueString as LogLevel];\n\t\t\t\tconst levelColor = LOG_LEVEL_COLORS[level];\n\t\t\t\tif (levelColor) {\n\t\t\t\t\tcolor = levelColor;\n\t\t\t\t}\n\t\t\t} else if (key === \"msg\") {\n\t\t\t\tcolor = \"\\x1b[32m\";\n\t\t\t} else if (key === \"trace\") {\n\t\t\t\tcolor = \"\\x1b[34m\";\n\t\t\t}\n\n\t\t\t// Format line\n\t\t\tline += `\\x1b[0m\\x1b[1m${key}\\x1b[0m\\x1b[2m=\\x1b[0m${color}${valueString}${RESET_COLOR}`;\n\t\t} else {\n\t\t\t// No color\n\t\t\tline += `${key}=${valueString}`;\n\t\t}\n\n\t\tif (i !== entries.length - 1) {\n\t\t\tline += \" \";\n\t\t}\n\t}\n\n\treturn line;\n}\n\nexport function formatTimestamp(date: Date): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n\tconst day = String(date.getUTCDate()).padStart(2, \"0\");\n\tconst hours = String(date.getUTCHours()).padStart(2, \"0\");\n\tconst minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n\tconst seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n\tconst milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\n\n\treturn `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\n}\n\nexport function castToLogValue(v: unknown): any {\n\tif (\n\t\ttypeof v === \"string\" ||\n\t\ttypeof v === \"number\" ||\n\t\ttypeof v === \"bigint\" ||\n\t\ttypeof v === \"boolean\" ||\n\t\tv === null ||\n\t\tv === undefined\n\t) {\n\t\treturn v;\n\t}\n\tif (v instanceof Error) {\n\t\t//args.push(...errorToLogEntries(k, v));\n\t\treturn String(v);\n\t}\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch {\n\t\treturn \"[cannot stringify]\";\n\t}\n}\n\n// MARK: Config\ninterface GlobalLoggerConfig {\n\tenableColor: boolean;\n\tenableSpreadObject: boolean;\n\tenableErrorStack: boolean;\n}\n\nexport const LOGGER_CONFIG: GlobalLoggerConfig = {\n\tenableColor: false,\n\tenableSpreadObject: false,\n\tenableErrorStack: false,\n};\n\n// MARK: Utils\n/**\n * Converts an object in to an easier to read KV of entries.\n */\nexport function spreadObjectToLogEntries(base: string, data: unknown): any {\n\tif (\n\t\tLOGGER_CONFIG.enableSpreadObject &&\n\t\ttypeof data === \"object\" &&\n\t\t!Array.isArray(data) &&\n\t\tdata !== null &&\n\t\tObject.keys(data).length !== 0 &&\n\t\tObject.keys(data).length < 16\n\t) {\n\t\tconst logData: any = {};\n\t\tfor (const key in data) {\n\t\t\tObject.assign(\n\t\t\t\tlogData,\n\t\t\t\tspreadObjectToLogEntries(\n\t\t\t\t\t`${base}.${key}`,\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: FIXME\n\t\t\t\t\t(data as any)[key],\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn logData;\n\t}\n\n\treturn { [base]: JSON.stringify(data) };\n}\n\nexport function errorToLogEntries(base: string, error: unknown): any {\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\t[`${base}.message`]: error.message,\n\t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n\t\t\t\t? { [`${base}.stack`]: formatStackTrace(error.stack) }\n\t\t\t\t: {}),\n\t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : {}),\n\t\t};\n\t}\n\treturn { [base]: `${error}` };\n}\n\n// export function errorToLogEntries(base: string, error: unknown): LogEntry[] {\n// \tif (error instanceof RuntimeError) {\n// \t\treturn [\n// \t\t\t[`${base}.code`, error.code],\n// \t\t\t[`${base}.description`, error.errorConfig?.description],\n// \t\t\t[`${base}.module`, error.moduleName],\n// \t\t\t...(error.trace ? [[`${base}.trace`, stringifyTrace(error.trace)] as LogEntry] : []),\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.meta ? [[`${base}.meta`, JSON.stringify(error.meta)] as LogEntry] : []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else if (error instanceof Error) {\n// \t\treturn [\n// \t\t\t[`${base}.name`, error.name],\n// \t\t\t[`${base}.message`, error.message],\n// \t\t\t...(LOGGER_CONFIG.enableErrorStack && error.stack\n// \t\t\t\t? [[`${base}.stack`, formatStackTrace(error.stack)] as LogEntry]\n// \t\t\t\t: []),\n// \t\t\t...(error.cause ? errorToLogEntries(`${base}.cause`, error.cause) : []),\n// \t\t];\n// \t} else {\n// \t\treturn [\n// \t\t\t[base, `${error}`],\n// \t\t];\n// \t}\n// }\n\n/**\n * Formats a JS stack trace in to a legible one-liner.\n */\nfunction formatStackTrace(stackTrace: string): string {\n\tconst regex = /at (.+?)$/gm;\n\tconst matches = [...stackTrace.matchAll(regex)];\n\t// Reverse array since the stack goes from top level -> bottom level\n\tmatches.reverse();\n\treturn matches.map((match) => match[1].trim()).join(\" > \");\n}\n"]}
|