rivetkit
Version:
Lightweight libraries for building stateful actors on edge platforms
313 lines (263 loc) • 10.8 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _chunkYKVTF7MPcjs = require('./chunk-YKVTF7MP.cjs');
var _chunkGIFHYL7Acjs = require('./chunk-GIFHYL7A.cjs');
var _chunk5QGQK44Lcjs = require('./chunk-5QGQK44L.cjs');
// src/actor/log.ts
function loggerWithoutContext() {
return _chunkYKVTF7MPcjs.getLogger.call(void 0, "actor-runtime");
}
// src/actor/utils.ts
function assertUnreachable2(x) {
loggerWithoutContext().error({
msg: "unreachable",
value: `${x}`,
stack: new Error().stack
});
throw new (0, _chunk5QGQK44Lcjs.Unreachable)(x);
}
var DeadlineError = class extends Error {
constructor() {
super("Promise did not complete before deadline.");
}
};
function deadline(promise, timeout) {
const controller = new AbortController();
const signal = controller.signal;
const timeoutId = setTimeout(() => controller.abort(), timeout);
return Promise.race([
promise,
new Promise((_, reject) => {
signal.addEventListener("abort", () => reject(new DeadlineError()));
})
]).finally(() => {
clearTimeout(timeoutId);
});
}
function generateSecureToken(length = 32) {
const array = new Uint8Array(length);
crypto.getRandomValues(array);
return btoa(String.fromCharCode(...array)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
}
function generateRandomString(length = 32) {
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
result += characters[randomIndex];
}
return result;
}
// src/common/actor-router-consts.ts
var PATH_CONNECT_WEBSOCKET = "/connect/websocket";
var PATH_RAW_WEBSOCKET_PREFIX = "/raw/websocket/";
var HEADER_ACTOR_QUERY = "x-rivet-query";
var HEADER_ENCODING = "x-rivet-encoding";
var HEADER_CONN_PARAMS = "x-rivet-conn-params";
var HEADER_ACTOR_ID = "x-rivet-actor";
var HEADER_CONN_ID = "x-rivet-conn";
var HEADER_CONN_TOKEN = "x-rivet-conn-token";
var HEADER_RIVET_TOKEN = "x-rivet-token";
var HEADER_RIVET_TARGET = "x-rivet-target";
var HEADER_RIVET_ACTOR = "x-rivet-actor";
var WS_PROTOCOL_STANDARD = "rivet";
var WS_PROTOCOL_TARGET = "rivet_target.";
var WS_PROTOCOL_ACTOR = "rivet_actor.";
var WS_PROTOCOL_ENCODING = "rivet_encoding.";
var WS_PROTOCOL_CONN_PARAMS = "rivet_conn_params.";
var WS_PROTOCOL_CONN_ID = "rivet_conn.";
var WS_PROTOCOL_CONN_TOKEN = "rivet_conn_token.";
var WS_PROTOCOL_TOKEN = "rivet_token.";
var WS_PROTOCOL_TRANSPORT = "test_transport.";
var WS_PROTOCOL_PATH = "test_path.";
var ALLOWED_PUBLIC_HEADERS = [
"Content-Type",
"User-Agent",
HEADER_ACTOR_QUERY,
HEADER_ENCODING,
HEADER_CONN_PARAMS,
HEADER_ACTOR_ID,
HEADER_CONN_ID,
HEADER_CONN_TOKEN,
HEADER_RIVET_TARGET,
HEADER_RIVET_ACTOR,
HEADER_RIVET_TOKEN
];
// src/serde.ts
var _cborx = require('cbor-x'); var cbor = _interopRequireWildcard(_cborx);
var _invariant = require('invariant'); var _invariant2 = _interopRequireDefault(_invariant);
// src/actor/protocol/serde.ts
var _zod = require('zod');
var EncodingSchema = _zod.z.enum(["json", "cbor", "bare"]);
var CachedSerializer = class {
#data;
#cache = /* @__PURE__ */ new Map();
#versionedDataHandler;
constructor(data, versionedDataHandler) {
this.#data = data;
this.#versionedDataHandler = versionedDataHandler;
}
get rawData() {
return this.#data;
}
serialize(encoding) {
const cached = this.#cache.get(encoding);
if (cached) {
return cached;
} else {
const serialized = serializeWithEncoding(
encoding,
this.#data,
this.#versionedDataHandler
);
this.#cache.set(encoding, serialized);
return serialized;
}
}
};
function base64EncodeUint8Array(uint8Array) {
let binary = "";
const len = uint8Array.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(uint8Array[i]);
}
return btoa(binary);
}
function base64EncodeArrayBuffer(arrayBuffer) {
const uint8Array = new Uint8Array(arrayBuffer);
return base64EncodeUint8Array(uint8Array);
}
function encodeDataToString(message) {
if (typeof message === "string") {
return message;
} else if (message instanceof ArrayBuffer) {
return base64EncodeArrayBuffer(message);
} else if (message instanceof Uint8Array) {
return base64EncodeUint8Array(message);
} else {
assertUnreachable2(message);
}
}
function base64DecodeToUint8Array(base64) {
if (typeof Buffer !== "undefined") {
return new Uint8Array(Buffer.from(base64, "base64"));
}
const binary = atob(base64);
const len = binary.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binary.charCodeAt(i);
}
return bytes;
}
function base64DecodeToArrayBuffer(base64) {
return base64DecodeToUint8Array(base64).buffer;
}
function jsonStringifyCompat(input) {
return JSON.stringify(input, (_key, value) => {
if (typeof value === "bigint") {
return ["$BigInt", value.toString()];
} else if (value instanceof ArrayBuffer) {
return ["$ArrayBuffer", base64EncodeArrayBuffer(value)];
} else if (value instanceof Uint8Array) {
return ["$Uint8Array", base64EncodeUint8Array(value)];
}
if (Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && value[0].startsWith("$")) {
return ["$" + value[0], value[1]];
}
return value;
});
}
function jsonParseCompat(input) {
return JSON.parse(input, (_key, value) => {
if (Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && value[0].startsWith("$")) {
if (value[0] === "$BigInt") {
return BigInt(value[1]);
} else if (value[0] === "$ArrayBuffer") {
return base64DecodeToArrayBuffer(value[1]);
} else if (value[0] === "$Uint8Array") {
return base64DecodeToUint8Array(value[1]);
}
if (value[0].startsWith("$$")) {
return [value[0].substring(1), value[1]];
}
throw new Error(
`Unknown JSON encoding type: ${value[0]}. This may indicate corrupted data or a version mismatch.`
);
}
return value;
});
}
// src/serde.ts
function uint8ArrayToBase64(uint8Array) {
if (typeof Buffer !== "undefined") {
return Buffer.from(uint8Array).toString("base64");
}
let binary = "";
const len = uint8Array.byteLength;
for (let i = 0; i < len; i++) {
binary += String.fromCharCode(uint8Array[i]);
}
return btoa(binary);
}
function encodingIsBinary(encoding) {
if (encoding === "json") {
return false;
} else if (encoding === "cbor" || encoding === "bare") {
return true;
} else {
_chunkGIFHYL7Acjs.assertUnreachable.call(void 0, encoding);
}
}
function contentTypeForEncoding(encoding) {
if (encoding === "json") {
return "application/json";
} else if (encoding === "cbor" || encoding === "bare") {
return "application/octet-stream";
} else {
_chunkGIFHYL7Acjs.assertUnreachable.call(void 0, encoding);
}
}
function serializeWithEncoding(encoding, value, versionedDataHandler) {
if (encoding === "json") {
return jsonStringifyCompat(value);
} else if (encoding === "cbor") {
return cbor.encode(value);
} else if (encoding === "bare") {
if (!versionedDataHandler) {
throw new Error("VersionedDataHandler is required for 'bare' encoding");
}
return versionedDataHandler.serializeWithEmbeddedVersion(value);
} else {
_chunkGIFHYL7Acjs.assertUnreachable.call(void 0, encoding);
}
}
function deserializeWithEncoding(encoding, buffer, versionedDataHandler) {
if (encoding === "json") {
if (typeof buffer === "string") {
return jsonParseCompat(buffer);
} else {
const decoder = new TextDecoder("utf-8");
const jsonString = decoder.decode(buffer);
return jsonParseCompat(jsonString);
}
} else if (encoding === "cbor") {
_invariant2.default.call(void 0,
typeof buffer !== "string",
"buffer cannot be string for cbor encoding"
);
return cbor.decode(buffer);
} else if (encoding === "bare") {
_invariant2.default.call(void 0,
typeof buffer !== "string",
"buffer cannot be string for bare encoding"
);
if (!versionedDataHandler) {
throw new Error("VersionedDataHandler is required for 'bare' encoding");
}
return versionedDataHandler.deserializeWithEmbeddedVersion(buffer);
} else {
_chunkGIFHYL7Acjs.assertUnreachable.call(void 0, encoding);
}
}
exports.uint8ArrayToBase64 = uint8ArrayToBase64; exports.encodingIsBinary = encodingIsBinary; exports.contentTypeForEncoding = contentTypeForEncoding; exports.serializeWithEncoding = serializeWithEncoding; exports.deserializeWithEncoding = deserializeWithEncoding; exports.loggerWithoutContext = loggerWithoutContext; exports.assertUnreachable = assertUnreachable2; exports.DeadlineError = DeadlineError; exports.deadline = deadline; exports.generateSecureToken = generateSecureToken; exports.generateRandomString = generateRandomString; exports.EncodingSchema = EncodingSchema; exports.CachedSerializer = CachedSerializer; exports.encodeDataToString = encodeDataToString; exports.jsonStringifyCompat = jsonStringifyCompat; exports.PATH_CONNECT_WEBSOCKET = PATH_CONNECT_WEBSOCKET; exports.PATH_RAW_WEBSOCKET_PREFIX = PATH_RAW_WEBSOCKET_PREFIX; exports.HEADER_ACTOR_QUERY = HEADER_ACTOR_QUERY; exports.HEADER_ENCODING = HEADER_ENCODING; exports.HEADER_CONN_PARAMS = HEADER_CONN_PARAMS; exports.HEADER_ACTOR_ID = HEADER_ACTOR_ID; exports.HEADER_CONN_ID = HEADER_CONN_ID; exports.HEADER_CONN_TOKEN = HEADER_CONN_TOKEN; exports.HEADER_RIVET_TOKEN = HEADER_RIVET_TOKEN; exports.HEADER_RIVET_TARGET = HEADER_RIVET_TARGET; exports.HEADER_RIVET_ACTOR = HEADER_RIVET_ACTOR; exports.WS_PROTOCOL_STANDARD = WS_PROTOCOL_STANDARD; exports.WS_PROTOCOL_TARGET = WS_PROTOCOL_TARGET; exports.WS_PROTOCOL_ACTOR = WS_PROTOCOL_ACTOR; exports.WS_PROTOCOL_ENCODING = WS_PROTOCOL_ENCODING; exports.WS_PROTOCOL_CONN_PARAMS = WS_PROTOCOL_CONN_PARAMS; exports.WS_PROTOCOL_CONN_ID = WS_PROTOCOL_CONN_ID; exports.WS_PROTOCOL_CONN_TOKEN = WS_PROTOCOL_CONN_TOKEN; exports.WS_PROTOCOL_TOKEN = WS_PROTOCOL_TOKEN; exports.WS_PROTOCOL_TRANSPORT = WS_PROTOCOL_TRANSPORT; exports.WS_PROTOCOL_PATH = WS_PROTOCOL_PATH; exports.ALLOWED_PUBLIC_HEADERS = ALLOWED_PUBLIC_HEADERS;
//# sourceMappingURL=chunk-I3FB346I.cjs.map