@deno/kv
Version:
A Deno KV client library optimized for Node.js.
92 lines (91 loc) • 2.68 kB
JavaScript
// Copyright 2023 the Deno authors. All rights reserved. MIT license.
export { decodeHex, encodeHex, } from "./deps/deno.land/std@0.208.0/encoding/hex.js";
import { concat } from "./deps/deno.land/std@0.208.0/bytes/concat.js";
export function checkEnd(bytes, pos) {
const extra = bytes.length - pos;
if (extra > 0)
throw new Error(`Unexpected trailing bytes: ${extra}`);
}
export function equalBytes(lhs, rhs) {
if (lhs.length !== rhs.length)
return false;
for (let i = 0; i < lhs.length; i++) {
if (lhs[i] !== rhs[i])
return false;
}
return true;
}
export function flipBytes(arr, start = 0) {
for (let i = start; i < arr.length; i++) {
arr[i] = 0xff - arr[i];
}
}
export function computeBigintMinimumNumberOfBytes(val) {
let n = 0;
while (val !== 0n) {
val >>= 8n;
n++;
}
return n;
}
export function compareBytes(lhs, rhs) {
if (lhs === rhs)
return 0;
let x = lhs.length, y = rhs.length;
const len = Math.min(x, y);
for (let i = 0; i < len; i++) {
if (lhs[i] !== rhs[i]) {
x = lhs[i];
y = rhs[i];
break;
}
}
return x < y ? -1 : y < x ? 1 : 0;
}
//
const ZERO_BYTES = new Uint8Array(0);
export class ByteReader {
constructor(reader) {
Object.defineProperty(this, "reader", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "remaining", {
enumerable: true,
configurable: true,
writable: true,
value: ZERO_BYTES
});
Object.defineProperty(this, "done", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
this.reader = reader;
}
async read(bytes) {
if (bytes < 0)
throw new Error(`Invalid bytes: ${bytes}`);
if (bytes === 0)
return { done: false, value: ZERO_BYTES };
while (this.remaining.length < bytes && !this.done) {
const { done, value } = await this.reader.read();
if (done) {
this.done = true;
}
else {
this.remaining = concat([this.remaining, value]);
}
}
const { remaining } = this;
if (remaining.length < bytes && this.done) {
return { done: true, value: undefined };
}
const value = remaining.slice(0, bytes);
this.remaining = remaining.slice(bytes);
return { done: false, value };
}
}