UNPKG

@deno/kv

Version:

A Deno KV client library optimized for Node.js.

92 lines (91 loc) 2.68 kB
// 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 }; } }