UNPKG

mastercache

Version:

Multi-tier cache module for Node.js. Redis, Upstash, CloudfareKV, File, in-memory and others drivers

79 lines 2.72 kB
// src/bus/encoders/binary-encoder.ts var BinaryEncoder = class { #busIdLength; /** * We assume the bus ID is a string of length 24 by default. * Because this is the default length of a cuid */ constructor(busIdLength = 24) { this.#busIdLength = busIdLength; } busMessageTypeToNum(type) { if (type === "set" /* Set */) return 1; if (type === "clear" /* Clear */) return 2; return 3; } numToBusMessageType(num) { if (num === 1) return "set" /* Set */; if (num === 2) return "clear" /* Clear */; return "delete" /* Delete */; } /** * Encode the given message into a Buffer */ encode(message) { const payload = message.payload; const totalKeysLength = payload.keys.reduce( (sum, key) => sum + 4 + Buffer.byteLength(key, "utf8"), 0 ); const namespaceKeyLength = payload.namespace ? Buffer.byteLength(payload.namespace, "utf8") : 0; const totalLength = this.#busIdLength + 1 + 4 + namespaceKeyLength + totalKeysLength; const buffer = Buffer.alloc(totalLength); buffer.write(message.busId, 0, this.#busIdLength, "utf8"); buffer.writeUInt8(this.busMessageTypeToNum(payload.type), this.#busIdLength); let offset = this.#busIdLength + 1; buffer.writeUInt32BE(namespaceKeyLength, offset); offset += 4; if (payload.namespace) { buffer.write(payload.namespace, offset, namespaceKeyLength, "utf8"); offset += namespaceKeyLength; } for (const key of payload.keys) { const keyLength = Buffer.byteLength(key, "utf8"); buffer.writeUInt32BE(keyLength, offset); offset += 4; buffer.write(key, offset, keyLength, "utf8"); offset += keyLength; } return buffer; } /** * Decode the given Buffer into a CacheBusMessage */ decode(data) { let offset = 0; const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, "binary"); const busId = buffer.toString("utf8", offset, this.#busIdLength); offset += this.#busIdLength; const typeValue = buffer.readUInt8(offset++); const type = this.numToBusMessageType(typeValue); const namespaceKeyLength = buffer.readUInt32BE(offset); offset += 4; const namespace = namespaceKeyLength ? buffer.toString("utf8", offset, offset + namespaceKeyLength) : ""; offset += namespaceKeyLength; const keys = []; while (offset < buffer.length) { const keyLength = buffer.readUInt32BE(offset); offset += 4; const key = buffer.toString("utf8", offset, offset + keyLength); offset += keyLength; keys.push(key); } return { busId, payload: { keys, type, namespace } }; } }; export { BinaryEncoder }; //# sourceMappingURL=binary-encoder.js.map