UNPKG

@worker-tools/deno-kv-storage

Version:

An implementation of the StorageArea (1,2,3) interface for Deno with an extensible system for supporting various database backends.

202 lines 13.1 kB
/*! * Adapted directly from https://github.com/brianc/node-buffer-writer * which is licensed as follows: * * The MIT License (MIT) * * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * 'Software'), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _PacketReader_buffer, _PacketReader_decoder, _PacketReader_offset, _PacketWriter_instances, _PacketWriter_buffer, _PacketWriter_encoder, _PacketWriter_headerPosition, _PacketWriter_offset, _PacketWriter_size, _PacketWriter_ensure; import { copy } from "../deps.js"; import { readInt16BE, readInt32BE } from "../utils/utils.js"; export class PacketReader { constructor(buffer) { _PacketReader_buffer.set(this, void 0); _PacketReader_decoder.set(this, new TextDecoder()); _PacketReader_offset.set(this, 0); __classPrivateFieldSet(this, _PacketReader_buffer, buffer, "f"); } readInt16() { const value = readInt16BE(__classPrivateFieldGet(this, _PacketReader_buffer, "f"), __classPrivateFieldGet(this, _PacketReader_offset, "f")); __classPrivateFieldSet(this, _PacketReader_offset, __classPrivateFieldGet(this, _PacketReader_offset, "f") + 2, "f"); return value; } readInt32() { const value = readInt32BE(__classPrivateFieldGet(this, _PacketReader_buffer, "f"), __classPrivateFieldGet(this, _PacketReader_offset, "f")); __classPrivateFieldSet(this, _PacketReader_offset, __classPrivateFieldGet(this, _PacketReader_offset, "f") + 4, "f"); return value; } readByte() { return this.readBytes(1)[0]; } readBytes(length) { const start = __classPrivateFieldGet(this, _PacketReader_offset, "f"); const end = start + length; const slice = __classPrivateFieldGet(this, _PacketReader_buffer, "f").slice(start, end); __classPrivateFieldSet(this, _PacketReader_offset, end, "f"); return slice; } readAllBytes() { const slice = __classPrivateFieldGet(this, _PacketReader_buffer, "f").slice(__classPrivateFieldGet(this, _PacketReader_offset, "f")); __classPrivateFieldSet(this, _PacketReader_offset, __classPrivateFieldGet(this, _PacketReader_buffer, "f").length, "f"); return slice; } readString(length) { const bytes = this.readBytes(length); return __classPrivateFieldGet(this, _PacketReader_decoder, "f").decode(bytes); } readCString() { const start = __classPrivateFieldGet(this, _PacketReader_offset, "f"); // find next null byte const end = __classPrivateFieldGet(this, _PacketReader_buffer, "f").indexOf(0, start); const slice = __classPrivateFieldGet(this, _PacketReader_buffer, "f").slice(start, end); // add +1 for null byte __classPrivateFieldSet(this, _PacketReader_offset, end + 1, "f"); return __classPrivateFieldGet(this, _PacketReader_decoder, "f").decode(slice); } } _PacketReader_buffer = new WeakMap(), _PacketReader_decoder = new WeakMap(), _PacketReader_offset = new WeakMap(); export class PacketWriter { constructor(size) { _PacketWriter_instances.add(this); _PacketWriter_buffer.set(this, void 0); _PacketWriter_encoder.set(this, new TextEncoder()); _PacketWriter_headerPosition.set(this, void 0); _PacketWriter_offset.set(this, void 0); _PacketWriter_size.set(this, void 0); __classPrivateFieldSet(this, _PacketWriter_size, size || 1024, "f"); __classPrivateFieldSet(this, _PacketWriter_buffer, new Uint8Array(__classPrivateFieldGet(this, _PacketWriter_size, "f") + 5), "f"); __classPrivateFieldSet(this, _PacketWriter_offset, 5, "f"); __classPrivateFieldSet(this, _PacketWriter_headerPosition, 0, "f"); } addInt32(num) { var _a, _b, _c, _d, _e, _f, _g, _h; __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, 4); __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_b = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _a = _b++, _b), "f"), _a] = (num >>> 24) & 0xff; __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_d = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _c = _d++, _d), "f"), _c] = (num >>> 16) & 0xff; __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_f = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _e = _f++, _f), "f"), _e] = (num >>> 8) & 0xff; __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_h = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _g = _h++, _h), "f"), _g] = (num >>> 0) & 0xff; return this; } addInt16(num) { var _a, _b, _c, _d; __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, 2); __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_b = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _a = _b++, _b), "f"), _a] = (num >>> 8) & 0xff; __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_d = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _c = _d++, _d), "f"), _c] = (num >>> 0) & 0xff; return this; } addCString(string) { var _a, _b; // just write a 0 for empty or null strings if (!string) { __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, 1); } else { const encodedStr = __classPrivateFieldGet(this, _PacketWriter_encoder, "f").encode(string); __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, encodedStr.byteLength + 1); // +1 for null terminator copy(encodedStr, __classPrivateFieldGet(this, _PacketWriter_buffer, "f"), __classPrivateFieldGet(this, _PacketWriter_offset, "f")); __classPrivateFieldSet(this, _PacketWriter_offset, __classPrivateFieldGet(this, _PacketWriter_offset, "f") + encodedStr.byteLength, "f"); } __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_b = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _a = _b++, _b), "f"), _a] = 0; // null terminator return this; } addChar(c) { var _a; if (c.length != 1) { throw new Error("addChar requires single character strings"); } __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, 1); copy(__classPrivateFieldGet(this, _PacketWriter_encoder, "f").encode(c), __classPrivateFieldGet(this, _PacketWriter_buffer, "f"), __classPrivateFieldGet(this, _PacketWriter_offset, "f")); __classPrivateFieldSet(this, _PacketWriter_offset, (_a = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _a++, _a), "f"); return this; } addString(string) { string = string || ""; const encodedStr = __classPrivateFieldGet(this, _PacketWriter_encoder, "f").encode(string); __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, encodedStr.byteLength); copy(encodedStr, __classPrivateFieldGet(this, _PacketWriter_buffer, "f"), __classPrivateFieldGet(this, _PacketWriter_offset, "f")); __classPrivateFieldSet(this, _PacketWriter_offset, __classPrivateFieldGet(this, _PacketWriter_offset, "f") + encodedStr.byteLength, "f"); return this; } add(otherBuffer) { __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, otherBuffer.length); copy(otherBuffer, __classPrivateFieldGet(this, _PacketWriter_buffer, "f"), __classPrivateFieldGet(this, _PacketWriter_offset, "f")); __classPrivateFieldSet(this, _PacketWriter_offset, __classPrivateFieldGet(this, _PacketWriter_offset, "f") + otherBuffer.length, "f"); return this; } clear() { __classPrivateFieldSet(this, _PacketWriter_offset, 5, "f"); __classPrivateFieldSet(this, _PacketWriter_headerPosition, 0, "f"); } // appends a header block to all the written data since the last // subsequent header or to the beginning if there is only one data block addHeader(code, last) { var _a, _b; const origOffset = __classPrivateFieldGet(this, _PacketWriter_offset, "f"); __classPrivateFieldSet(this, _PacketWriter_offset, __classPrivateFieldGet(this, _PacketWriter_headerPosition, "f"), "f"); __classPrivateFieldGet(this, _PacketWriter_buffer, "f")[__classPrivateFieldSet(this, _PacketWriter_offset, (_b = __classPrivateFieldGet(this, _PacketWriter_offset, "f"), _a = _b++, _b), "f"), _a] = code; // length is everything in this packet minus the code this.addInt32(origOffset - (__classPrivateFieldGet(this, _PacketWriter_headerPosition, "f") + 1)); // set next header position __classPrivateFieldSet(this, _PacketWriter_headerPosition, origOffset, "f"); // make space for next header __classPrivateFieldSet(this, _PacketWriter_offset, origOffset, "f"); if (!last) { __classPrivateFieldGet(this, _PacketWriter_instances, "m", _PacketWriter_ensure).call(this, 5); __classPrivateFieldSet(this, _PacketWriter_offset, __classPrivateFieldGet(this, _PacketWriter_offset, "f") + 5, "f"); } return this; } join(code) { if (code) { this.addHeader(code, true); } return __classPrivateFieldGet(this, _PacketWriter_buffer, "f").slice(code ? 0 : 5, __classPrivateFieldGet(this, _PacketWriter_offset, "f")); } flush(code) { const result = this.join(code); this.clear(); return result; } } _PacketWriter_buffer = new WeakMap(), _PacketWriter_encoder = new WeakMap(), _PacketWriter_headerPosition = new WeakMap(), _PacketWriter_offset = new WeakMap(), _PacketWriter_size = new WeakMap(), _PacketWriter_instances = new WeakSet(), _PacketWriter_ensure = function _PacketWriter_ensure(size) { const remaining = __classPrivateFieldGet(this, _PacketWriter_buffer, "f").length - __classPrivateFieldGet(this, _PacketWriter_offset, "f"); if (remaining < size) { const oldBuffer = __classPrivateFieldGet(this, _PacketWriter_buffer, "f"); // exponential growth factor of around ~ 1.5 // https://stackoverflow.com/questions/2269063/#buffer-growth-strategy const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size; __classPrivateFieldSet(this, _PacketWriter_buffer, new Uint8Array(newSize), "f"); copy(oldBuffer, __classPrivateFieldGet(this, _PacketWriter_buffer, "f")); } }; //# sourceMappingURL=packet.js.map