UNPKG

@rivetkit/redis

Version:

_Lightweight Libraries for Backends_

519 lines (499 loc) 14 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class;// ../../core/dist/chunk-INRCNZ4I.js var INTERNAL_ERROR_CODE = "internal_error"; var ActorError = (_class = class extends Error { constructor(code, message, opts) { super(message, { cause: opts == null ? void 0 : opts.cause });_class.prototype.__init.call(this);_class.prototype.__init2.call(this);; this.code = code; this.public = _nullishCoalesce((opts == null ? void 0 : opts.public), () => ( false)); this.metadata = opts == null ? void 0 : opts.metadata; if (opts == null ? void 0 : opts.public) { this.statusCode = 400; } } __init() {this.__type = "ActorError"} __init2() {this.statusCode = 500} static isActorError(error) { return typeof error === "object" && error.__type === "ActorError"; } toString() { return this.message; } /** * Serialize error for HTTP response */ serializeForHttp() { return { type: this.code, message: this.message, metadata: this.metadata }; } }, _class); var InternalError = class extends ActorError { constructor(message) { super(INTERNAL_ERROR_CODE, message); } }; var Unreachable = class extends InternalError { constructor(x) { super(`Unreachable case: ${x}`); } }; var ConnStateNotEnabled = class extends ActorError { constructor() { super( "conn_state_not_enabled", "Connection state not enabled. Must implement `createConnectionState` or `connectionState` to use connection state. (https://www.rivet.gg/docs/actors/connections/#connection-state)" ); } }; var ActorAlreadyExists = class extends ActorError { constructor(name, key) { super( "actor_already_exists", `Actor already exists with name '${name}' and key '${JSON.stringify(key)}' (https://www.rivet.gg/docs/actors/clients/#actor-client)`, { public: true } ); } }; // src/keys.ts var KEYS = { ACTOR: { // KEY LEASE: { // KEY (expire) = node ID node: (prefix, actorId) => `${prefix}:actor:${actorId}:lease:node` }, // KEY metadata: (prefix, actorId) => `${prefix}:actor:${actorId}:metadata`, // KEY persistedData: (prefix, actorId) => `${prefix}:actor:${actorId}:persisted_data` }, // KEY actorByKey: (prefix, name, key) => { let redisKey = `${prefix}:actor_by_key:${escapeRedisKey(name)}`; if (key.length > 0) { redisKey += `:${key.map((k) => escapeRedisKey(k)).join(":")}`; } return redisKey; } }; var PUBSUB = { node(prefix, nodeId) { return `${prefix}:node:${nodeId}:messages`; } }; function escapeRedisKey(part) { return part.replace(/\\/g, "\\\\").replace(/:/g, "\\:"); } // ../../core/dist/chunk-5JMI2VOL.js function assertUnreachable(x) { throw new Error(`Unreachable case: ${x}`); } var package_default = { name: "@rivetkit/core", version: "2.0.2", license: "Apache-2.0", keywords: [ "rivetkit", "stateful", "serverless", "actors", "agents", "realtime", "websocket", "actors", "framework" ], files: [ "dist", "src", "deno.json", "bun.json", "package.json" ], type: "module", exports: { ".": { import: { types: "./dist/mod.d.ts", default: "./dist/mod.js" }, require: { types: "./dist/mod.d.cts", default: "./dist/mod.cjs" } }, "./client": { import: { types: "./dist/client/mod.d.ts", default: "./dist/client/mod.js" }, require: { types: "./dist/client/mod.d.cts", default: "./dist/client/mod.cjs" } }, "./log": { import: { types: "./dist/common/log.d.ts", default: "./dist/common/log.js" }, require: { types: "./dist/common/log.d.cts", default: "./dist/common/log.cjs" } }, "./errors": { import: { types: "./dist/actor/errors.d.ts", default: "./dist/actor/errors.js" }, require: { types: "./dist/actor/errors.d.cts", default: "./dist/actor/errors.cjs" } }, "./utils": { import: { types: "./dist/utils.d.ts", default: "./dist/utils.js" }, require: { types: "./dist/utils.d.cts", default: "./dist/utils.cjs" } }, "./driver-helpers": { import: { types: "./dist/driver-helpers/mod.d.ts", default: "./dist/driver-helpers/mod.js" }, require: { types: "./dist/driver-helpers/mod.d.cts", default: "./dist/driver-helpers/mod.cjs" } }, "./driver-helpers/websocket": { import: { types: "./dist/common/websocket.d.ts", default: "./dist/common/websocket.js" }, require: { types: "./dist/common/websocket.d.cts", default: "./dist/common/websocket.cjs" } }, "./driver-test-suite": { import: { types: "./dist/driver-test-suite/mod.d.ts", default: "./dist/driver-test-suite/mod.js" }, require: { types: "./dist/driver-test-suite/mod.d.cts", default: "./dist/driver-test-suite/mod.cjs" } }, "./topologies/coordinate": { import: { types: "./dist/topologies/coordinate/mod.d.ts", default: "./dist/topologies/coordinate/mod.js" }, require: { types: "./dist/topologies/coordinate/mod.d.cts", default: "./dist/topologies/coordinate/mod.cjs" } }, "./topologies/partition": { import: { types: "./dist/topologies/partition/mod.d.ts", default: "./dist/topologies/partition/mod.js" }, require: { types: "./dist/topologies/partition/mod.d.cts", default: "./dist/topologies/partition/mod.cjs" } }, "./test": { import: { types: "./dist/test/mod.d.ts", default: "./dist/test/mod.js" }, require: { types: "./dist/test/mod.d.cts", default: "./dist/test/mod.cjs" } }, "./inspector": { import: { types: "./dist/inspector/mod.d.ts", default: "./dist/inspector/mod.js" }, require: { types: "./dist/inspector/mod.d.cts", default: "./dist/inspector/mod.cjs" } } }, engines: { node: ">=22.0.0" }, sideEffects: false, scripts: { dev: "pnpm build --watch", build: "tsup src/mod.ts src/client/mod.ts src/common/log.ts src/common/websocket.ts src/actor/errors.ts src/topologies/coordinate/mod.ts src/topologies/partition/mod.ts src/utils.ts src/driver-helpers/mod.ts src/driver-test-suite/mod.ts src/test/mod.ts src/inspector/mod.ts", "check-types": "tsc --noEmit", boop: "tsc --outDir dist/test -d", test: "vitest run", "test:watch": "vitest", "dump-openapi": "tsx scripts/dump-openapi.ts" }, dependencies: { "@hono/standard-validator": "^0.1.3", "@hono/zod-openapi": "^0.19.10", "@rivetkit/fast-json-patch": "^3.1.2", "cbor-x": "^1.6.0", hono: "^4.7.0", invariant: "^2.2.4", nanoevents: "^9.1.0", "on-change": "^5.0.1", "p-retry": "^6.2.1", zod: "^3.25.76", "@rivetkit/engine-runner": "https://pkg.pr.new/rivet-gg/rivet/@rivetkit/engine-runner@f1c054d" }, devDependencies: { "@hono/node-server": "^1.18.2", "@hono/node-ws": "^1.1.1", "@rivet-gg/actor-core": "^25.1.0", "@types/invariant": "^2", "@types/node": "^22.13.1", "@types/ws": "^8", "@vitest/ui": "3.1.1", "bundle-require": "^5.1.0", eventsource: "^3.0.5", tsup: "^8.4.0", tsx: "^4.19.4", typescript: "^5.7.3", vitest: "^3.1.1", ws: "^8.18.1" }, peerDependencies: { "@hono/node-server": "^1.14.0", "@hono/node-ws": "^1.1.1", eventsource: "^3.0.5", ws: "^8.0.0" }, peerDependenciesMeta: { "@hono/node-server": { optional: true }, "@hono/node-ws": { optional: true }, eventsource: { optional: true }, ws: { optional: true } }, stableVersion: "0.8.0" }; var VERSION = package_default.version; function getEnvUniversal(key) { if (typeof Deno !== "undefined") { return Deno.env.get(key); } else if (typeof process !== "undefined") { return process.env[key]; } } // ../../core/dist/chunk-7Q22A75R.js var LogLevels = { TRACE: 0, DEBUG: 1, INFO: 2, WARN: 3, ERROR: 4, CRITICAL: 5 }; var LevelNameMap = { 0: "TRACE", 1: "DEBUG", 2: "INFO", 3: "WARN", 4: "ERROR", 5: "CRITICAL" }; var LOG_LEVEL_COLORS = { [LogLevels.CRITICAL]: "\x1B[31m", // Red [LogLevels.ERROR]: "\x1B[31m", // Red [LogLevels.WARN]: "\x1B[33m", // Yellow [LogLevels.INFO]: "\x1B[32m", // Green [LogLevels.DEBUG]: "\x1B[36m", // Cyan [LogLevels.TRACE]: "\x1B[36m" // Cyan }; var RESET_COLOR = "\x1B[0m"; function stringify(...data) { let line = ""; for (let i = 0; i < data.length; i++) { const [key, valueRaw] = data[i]; let isNull = false; let valueString; if (valueRaw == null) { isNull = true; valueString = ""; } else { valueString = valueRaw.toString(); } if (valueString.length > 512 && key !== "msg" && key !== "error") valueString = `${valueString.slice(0, 512)}...`; const needsQuoting = valueString.indexOf(" ") > -1 || valueString.indexOf("=") > -1; const needsEscaping = valueString.indexOf('"') > -1 || valueString.indexOf("\\") > -1; valueString = valueString.replace(/\n/g, "\\n"); if (needsEscaping) valueString = valueString.replace(/["\\]/g, "\\$&"); if (needsQuoting || needsEscaping) valueString = `"${valueString}"`; if (valueString === "" && !isNull) valueString = '""'; if (LOGGER_CONFIG.enableColor) { let color = "\x1B[2m"; if (key === "level") { const level = LogLevels[valueString]; const levelColor = LOG_LEVEL_COLORS[level]; if (levelColor) { color = levelColor; } } else if (key === "msg") { color = "\x1B[32m"; } else if (key === "trace") { color = "\x1B[34m"; } line += `\x1B[0m\x1B[1m${key}\x1B[0m\x1B[2m=\x1B[0m${color}${valueString}${RESET_COLOR}`; } else { line += `${key}=${valueString}`; } if (i !== data.length - 1) { line += " "; } } return line; } function formatTimestamp(date) { const year = date.getUTCFullYear(); const month = String(date.getUTCMonth() + 1).padStart(2, "0"); const day = String(date.getUTCDate()).padStart(2, "0"); const hours = String(date.getUTCHours()).padStart(2, "0"); const minutes = String(date.getUTCMinutes()).padStart(2, "0"); const seconds = String(date.getUTCSeconds()).padStart(2, "0"); const milliseconds = String(date.getUTCMilliseconds()).padStart(3, "0"); return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`; } function castToLogValue(v) { if (typeof v === "string" || typeof v === "number" || typeof v === "boolean" || v === null || v === void 0) { return v; } if (v instanceof Error) { return String(v); } try { return JSON.stringify(v); } catch (e) { return "[cannot stringify]"; } } var LOGGER_CONFIG = { enableColor: false, enableSpreadObject: false, enableErrorStack: false }; var Logger = class { constructor(name, level) { this.name = name; this.level = level; } log(level, message, ...args) { const record = { msg: message, args, level, loggerName: this.name, datetime: /* @__PURE__ */ new Date(), levelName: LevelNameMap[level] }; if (this.#shouldLog(level)) { this.#logRecord(record); } } #shouldLog(level) { return level >= LogLevels[this.level]; } #logRecord(record) { console.log(formatter(record)); } trace(message, ...args) { this.log(LogLevels.TRACE, message, ...args); } debug(message, ...args) { this.log(LogLevels.DEBUG, message, ...args); } info(message, ...args) { this.log(LogLevels.INFO, message, ...args); } warn(message, ...args) { this.log(LogLevels.WARN, message, ...args); } error(message, ...args) { this.log(LogLevels.ERROR, message, ...args); } critical(message, ...args) { this.log(LogLevels.CRITICAL, message, ...args); } }; var loggers = {}; function getLogger(name = "default") { const defaultLogLevelEnv = getEnvUniversal( "_LOG_LEVEL" ); const defaultLogLevel = _nullishCoalesce(defaultLogLevelEnv, () => ( "INFO")); if (!loggers[name]) { loggers[name] = new Logger(name, defaultLogLevel); } return loggers[name]; } function formatter(log) { const args = []; for (let i = 0; i < log.args.length; i++) { const logArg = log.args[i]; if (logArg && typeof logArg === "object") { for (const k in logArg) { const v = logArg[k]; pushArg(k, v, args); } } else { pushArg(`arg${i}`, logArg, args); } } const logTs = getEnvUniversal("_LOG_TIMESTAMP") === "1"; const logTarget = getEnvUniversal("_LOG_TARGET") === "1"; return stringify( ...logTs ? [["ts", formatTimestamp(/* @__PURE__ */ new Date())]] : [], ["level", LevelNameMap[log.level]], ...logTarget ? [["target", log.loggerName]] : [], ["msg", log.msg], ...args ); } function pushArg(k, v, args) { args.push([k, castToLogValue(v)]); } // src/log.ts var LOGGER_NAME = "driver-redis"; function logger() { return getLogger(LOGGER_NAME); } exports.InternalError = InternalError; exports.Unreachable = Unreachable; exports.ConnStateNotEnabled = ConnStateNotEnabled; exports.ActorAlreadyExists = ActorAlreadyExists; exports.assertUnreachable = assertUnreachable; exports.getEnvUniversal = getEnvUniversal; exports.getLogger = getLogger; exports.KEYS = KEYS; exports.PUBSUB = PUBSUB; exports.logger = logger; //# sourceMappingURL=chunk-VQDBJLFC.cjs.map