@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
JavaScript
/*!
* 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