refactor: fix worker-relay for external users

This commit is contained in:
Kieran 2024-03-04 12:22:48 +00:00
parent a0aa86a0b3
commit 226618ac77
26 changed files with 362 additions and 68 deletions

View File

@ -1,7 +1,7 @@
import { CachedTable, CacheEvents } from "@snort/shared";
import { NostrEvent } from "@snort/system";
import { WorkerRelayInterface } from "@snort/worker-relay";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
export class EventCacheWorker extends EventEmitter<CacheEvents> implements CachedTable<NostrEvent> {
#relay: WorkerRelayInterface;

View File

@ -2,7 +2,7 @@ import { CachedTable, CacheEvents, removeUndefined, unixNowMs, unwrap } from "@s
import { CachedMetadata, mapEventToProfile, NostrEvent } from "@snort/system";
import { WorkerRelayInterface } from "@snort/worker-relay";
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
export class ProfileCacheRelayWorker extends EventEmitter<CacheEvents> implements CachedTable<CachedMetadata> {
#relay: WorkerRelayInterface;

View File

@ -2,7 +2,7 @@ import { CachedTable, CacheEvents, removeUndefined, unixNowMs, unwrap } from "@s
import { EventKind, NostrEvent, UsersFollows } from "@snort/system";
import { WorkerRelayInterface } from "@snort/worker-relay";
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
export class UserFollowsWorker extends EventEmitter<CacheEvents> implements CachedTable<UsersFollows> {
#relay: WorkerRelayInterface;

View File

@ -62,11 +62,12 @@ export default defineConfig({
CONFIG: JSON.stringify(appConfig),
global: {}, // needed for custom-event lib
},
test: {
globals: true,
environment: "jsdom",
},
worker: {
format: "es",
rollupOptions: {
output: {
format: "module"
}
}
},
});

View File

@ -1,4 +1,4 @@
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
interface ExternalStoreEvents {
change: () => void;

View File

@ -1,7 +1,7 @@
import debug from "debug";
import { removeUndefined, unixNowMs } from "./utils";
import { DexieTableLike } from "./dexie-like";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
type HookFn = () => void;

View File

@ -1,6 +1,6 @@
import { removeUndefined, sanitizeRelayUrl, unwrap } from "@snort/shared";
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { Connection, RelaySettings } from "./connection";
import { NostrEvent, OkResponse, TaggedNostrEvent } from "./nostr";

View File

@ -2,7 +2,7 @@ import { v4 as uuid } from "uuid";
import debug from "debug";
import WebSocket from "isomorphic-ws";
import { unixNowMs, dedupe } from "@snort/shared";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { DefaultConnectTimeout } from "./const";
import { NostrEvent, OkResponse, ReqCommand, ReqFilter, TaggedNostrEvent, u256 } from "./nostr";

View File

@ -8,7 +8,7 @@ import { EventSigner, PrivateKeySigner } from "../signer";
import { NostrEvent } from "../nostr";
import { EventBuilder } from "../event-builder";
import EventKind from "../event-kind";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
const NIP46_KIND = 24_133;

View File

@ -8,7 +8,7 @@ import { Optimizer } from "./query-optimizer";
import { base64 } from "@scure/base";
import { CachedTable } from "@snort/shared";
import { ConnectionPool } from "./connection-pool";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { QueryEvents } from "./query";
import { CacheRelay } from "./cache-relay";
import { RequestRouter } from "./request-router";

View File

@ -4,7 +4,7 @@ import { ReqFilter, TaggedNostrEvent } from "../nostr";
import { Negentropy } from "./negentropy";
import { NegentropyStorageVector } from "./vector-storage";
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
export interface NegentropyFlowEvents {
/**

View File

@ -1,5 +1,5 @@
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { CachedTable, isHex, unixNowMs } from "@snort/shared";
import { NostrEvent, TaggedNostrEvent, OkResponse } from "./nostr";

View File

@ -1,7 +1,7 @@
import { SortedMap, dedupe } from "@snort/shared";
import { EventExt, EventType, TaggedNostrEvent } from ".";
import { findTag } from "./utils";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
export const EmptySnapshot: NoteStoreSnapshotData = [];
export type NoteStoreSnapshotData = Array<TaggedNostrEvent>;

View File

@ -1,5 +1,5 @@
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { BuiltRawReqFilter, RequestBuilder, RequestStrategy, SystemInterface, TaggedNostrEvent } from ".";
import { Query, TraceReport } from "./query";
import { FilterCacheLayer, IdsFilterCacheLayer } from "./filter-cache-layer";

View File

@ -1,6 +1,6 @@
import { v4 as uuid } from "uuid";
import debug from "debug";
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { unixNowMs, unwrap } from "@snort/shared";
import { Connection, ReqFilter, Nips, TaggedNostrEvent, SystemInterface, ParsedFragment } from ".";

View File

@ -1,15 +1,16 @@
{
"name": "@snort/worker-relay",
"version": "1.0.3",
"version": "1.0.5",
"description": "A nostr relay in a service worker",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"type": "module",
"module": "src/index.ts",
"repository": "https://git.v0l.io/Kieran/snort",
"author": "Kieran",
"license": "MIT",
"scripts": {
"build": "rm -rf dist && tsc"
"build": "rm -rf dist && tsc && esbuild src/worker.ts --bundle --minify --sourcemap --outdir=dist/esm --format=esm --out-extension:.js=.mjs"
},
"files": [
"src",
@ -17,13 +18,13 @@
],
"dependencies": {
"@sqlite.org/sqlite-wasm": "^3.45.1-build1",
"debug": "^4.3.4",
"eventemitter3": "^5.0.1",
"uuid": "^9.0.1"
},
"devDependencies": {
"@types/debug": "^4.1.12",
"@types/uuid": "^9.0.7",
"esbuild": "^0.20.1",
"typescript": "^5.2.2"
}
}

View File

@ -0,0 +1,10 @@
let debug = false;
export function debugLog(scope: string, msg: string, ...args: Array<any>) {
if (!debug) return;
console.log(scope, msg, ...args);
}
export function setLogging(v: boolean) {
debug = v;
}

View File

@ -1,5 +1,4 @@
import debug from "debug";
import { debugLog } from "./debug";
import { RelayHandler, NostrEvent } from "./types";
// import { parseZap } from "../../system/src/zaps";
@ -8,7 +7,7 @@ const parseZap = (_zap: NostrEvent) => {
return { event: null } as { event: null | NostrEvent };
};
const log = debug("getForYouFeed");
const log = (msg: string, ...args: Array<any>) => debugLog("getForYouFeed", msg, ...args);
export async function getForYouFeed(relay: RelayHandler, pubkey: string): Promise<NostrEvent[]> {
console.time("For You feed generation time");

View File

@ -1 +1 @@
export * from "./interface";
export * from "./interface";

View File

@ -10,13 +10,32 @@ import { v4 as uuid } from "uuid";
export class WorkerRelayInterface {
#worker: Worker;
#sqliteDir?: string;
#commandQueue: Map<string, (v: unknown, ports: ReadonlyArray<MessagePort>) => void> = new Map();
// Command timeout
timeout: number = 30_000;
constructor(path: string) {
this.#worker = new Worker(path, { type: "module" });
/**
* Interface wrapper for worker relay
* @param path Path to worker script or Worker script object
* @param sqlite3Dir Directory to search for sqlite3 depends
*/
constructor(path?: string | Worker, sqlite3Dir?: string) {
if (path instanceof Worker) {
this.#worker = path;
} else {
const sqliteBase = new URL("@sqlite.org/sqlite-wasm?url", import.meta.url);
this.#sqliteDir = sqlite3Dir ?? sqliteBase.href;
const scriptPath = path ? new URL(path) : new URL("@snort/worker-relay/dist/esm/worker.mjs", import.meta.url);
this.#worker = new Worker(scriptPath, { type: "module" })
};
this.#worker.onerror = e => {
console.error(e.message, e);
}
this.#worker.onmessageerror = e => {
console.error(e);
}
this.#worker.onmessage = e => {
const cmd = e.data as WorkerMessage<any>;
if (cmd.cmd === "reply") {
@ -27,8 +46,8 @@ export class WorkerRelayInterface {
};
}
async init(path: string) {
return await this.#workerRpc<string, boolean>("init", path);
async init(databasePath: string) {
return await this.#workerRpc<Array<string>, boolean>("init", [databasePath, this.#sqliteDir ?? ""]);
}
async event(ev: NostrEvent) {
@ -63,6 +82,10 @@ export class WorkerRelayInterface {
return this.#workerRpc<[string, EventMetadata], void>("setEventMetadata", [id, meta]);
}
async debug(v: string) {
return await this.#workerRpc<string, boolean>("debug", v);
}
async #workerRpc<T, R>(cmd: WorkerMessageCommand, args?: T) {
const id = uuid();
const msg = {
@ -70,8 +93,8 @@ export class WorkerRelayInterface {
cmd,
args,
} as WorkerMessage<T>;
this.#worker.postMessage(msg);
return await new Promise<R>((resolve, reject) => {
this.#worker.postMessage(msg);
const t = setTimeout(() => {
this.#commandQueue.delete(id);
reject(new Error("Timeout"));

View File

@ -1,15 +1,15 @@
import EventEmitter from "eventemitter3";
import { EventEmitter } from "eventemitter3";
import { NostrEvent, RelayHandler, RelayHandlerEvents, ReqFilter, eventMatchesFilter, EventMetadata } from "./types";
import debug from "debug";
import { debugLog } from "./debug";
/**
* A very simple dumb fallback relay using a flat table
*/
export class InMemoryRelay extends EventEmitter<RelayHandlerEvents> implements RelayHandler {
#events: Map<string, NostrEvent> = new Map();
#log = debug("InMemoryRelay");
#log = (msg: string, ...args: Array<any>) => debugLog("InMemoryRelay", msg, ...args);
init(path: string): Promise<void> {
init() {
this.#log("Using in-memory relay");
return Promise.resolve();
}

View File

@ -1,8 +1,8 @@
import { NostrEvent } from "./types";
import { SqliteRelay } from "./sqlite-relay";
import debug from "debug";
import { debugLog } from "./debug";
const log = debug("SqliteRelay:migrations");
const log = (msg: string, ...args: Array<any>) => debugLog("SqliteRelay:migrations", msg, ...args);
const migrations = [
{ version: 1, script: migrate_v1 },

View File

@ -1,21 +1,27 @@
import sqlite3InitModule, { Database, Sqlite3Static } from "@sqlite.org/sqlite-wasm";
import { EventEmitter } from "eventemitter3";
import { EventMetadata, NostrEvent, RelayHandler, RelayHandlerEvents, ReqFilter, unixNowMs } from "./types";
import debug from "debug";
import migrate from "./migrations";
import { debugLog } from "./debug";
export class SqliteRelay extends EventEmitter<RelayHandlerEvents> implements RelayHandler {
#sqlite?: Sqlite3Static;
#log = debug("SqliteRelay");
#log = (msg: string, ...args: Array<any>) => debugLog("SqliteRelay", msg, ...args);
db?: Database;
#seenInserts = new Set<string>();
/**
* Initialize the SQLite driver
*/
async init(path: string) {
async init(path: string, sqliteWasmPath?: string) {
if (this.#sqlite) return;
this.#sqlite = await sqlite3InitModule();
this.#sqlite = await sqlite3InitModule({
locateFile(path, prefix) {
return new URL(`sqlite-wasm/jswasm/${path}`, sqliteWasmPath).href;
},
print: msg => this.#log(msg),
printErr: msg => this.#log(msg)
});
this.#log(`Got SQLite version: ${this.#sqlite.version.libVersion}`);
await this.#open(path);
this.db && migrate(this);
@ -28,22 +34,13 @@ export class SqliteRelay extends EventEmitter<RelayHandlerEvents> implements Rel
if (!this.#sqlite) throw new Error("Must call init first");
if (this.db) return;
if ("opfs" in this.#sqlite) {
try {
this.db = new this.#sqlite.oo1.OpfsDb(path, "cw");
this.#log(`Opened ${this.db.filename}`);
this.db.exec(
`PRAGMA cache_size=${
32 * 1024
}; PRAGMA page_size=8192; PRAGMA journal_mode=MEMORY; PRAGMA temp_store=MEMORY;`,
);
} catch (e) {
// wipe db
console.error(e);
}
} else {
throw new Error("OPFS not supported!");
}
const pool = await this.#sqlite.installOpfsSAHPoolVfs({});
this.db = new pool.OpfsSAHPoolDb(path);
this.#log(`Opened ${this.db.filename}`);
/*this.db.exec(
`PRAGMA cache_size=${32 * 1024
}; PRAGMA page_size=8192; PRAGMA journal_mode=MEMORY; PRAGMA temp_store=MEMORY;`,
);*/
}
close() {

View File

@ -11,7 +11,8 @@ export type WorkerMessageCommand =
| "dumpDb"
| "emit-event"
| "forYouFeed"
| "setEventMetadata";
| "setEventMetadata"
| "debug";
export interface WorkerMessage<T> {
id: string;
@ -57,7 +58,7 @@ export interface OkResponse {
}
export interface RelayHandler extends EventEmitter<RelayHandlerEvents> {
init(path: string): Promise<void>;
init(path: string, path2Wasm?: string): Promise<void>;
close(): void;
event(ev: NostrEvent): boolean;
eventBatch(evs: Array<NostrEvent>): boolean;

View File

@ -1,8 +1,9 @@
/// <reference lib="webworker" />
import { InMemoryRelay } from "./memory-relay";
import { WorkQueueItem, barrierQueue, processWorkQueue } from "./queue";
import { SqliteRelay } from "./sqlite-relay";
import { InMemoryRelay } from "./memory-relay";
import { debugLog, setLogging } from "./debug";
import { WorkQueueItem, barrierQueue, processWorkQueue } from "./queue";
import { NostrEvent, RelayHandler, ReqCommand, ReqFilter, WorkerMessage, unixNowMs, EventMetadata } from "./types";
import { getForYouFeed } from "./forYouFeed";
@ -40,10 +41,14 @@ async function insertBatch() {
}
setTimeout(() => insertBatch(), 100);
}
setTimeout(() => insertBatch(), 100);
const cmdQueue: Array<WorkQueueItem> = [];
processWorkQueue(cmdQueue, 50);
try {
setTimeout(() => insertBatch(), 100);
processWorkQueue(cmdQueue, 50);
} catch (e) {
console.error(e);
}
async function tryOpfs() {
try {
@ -57,12 +62,17 @@ async function tryOpfs() {
globalThis.onclose = () => {
relay?.close();
};
}
globalThis.onmessage = async ev => {
const msg = ev.data as WorkerMessage<any>;
try {
switch (msg.cmd) {
case "debug": {
setLogging(true);
reply(msg.id, true);
break;
}
case "init": {
await barrierQueue(cmdQueue, async () => {
if ("WebAssembly" in globalThis && (await tryOpfs())) {
@ -70,7 +80,9 @@ globalThis.onmessage = async ev => {
} else {
relay = new InMemoryRelay();
}
await relay.init(msg.args as string);
const [dbPath, wasmPath] = msg.args as Array<string>;
debugLog("StartInit", dbPath, wasmPath);
await relay.init(dbPath, wasmPath);
reply(msg.id, true);
});
break;
@ -81,7 +93,10 @@ globalThis.onmessage = async ev => {
break;
}
case "close": {
reply(msg.id, true);
await barrierQueue(cmdQueue, async () => {
const res = relay!.close();
reply(msg.id, res);
});
break;
}
case "req": {
@ -151,6 +166,12 @@ globalThis.onmessage = async ev => {
}
}
} catch (e) {
reply(msg.id, { error: JSON.stringify(e) });
if (e instanceof Error) {
reply(msg.id, { error: e.message });
} else if (typeof e === "string") {
reply(msg.id, { error: e });
} else {
reply(msg.id, "Unknown error")
}
}
};
}

243
yarn.lock
View File

@ -1857,6 +1857,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/aix-ppc64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/aix-ppc64@npm:0.20.1"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/android-arm64@npm:0.19.5"
@ -1864,6 +1871,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/android-arm64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/android-arm64@npm:0.20.1"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/android-arm@npm:0.19.5"
@ -1871,6 +1885,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/android-arm@npm:0.20.1"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/android-x64@npm:0.19.5"
@ -1878,6 +1899,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/android-x64@npm:0.20.1"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/darwin-arm64@npm:0.19.5"
@ -1885,6 +1913,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/darwin-arm64@npm:0.20.1"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/darwin-x64@npm:0.19.5"
@ -1892,6 +1927,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/darwin-x64@npm:0.20.1"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/freebsd-arm64@npm:0.19.5"
@ -1899,6 +1941,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/freebsd-arm64@npm:0.20.1"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/freebsd-x64@npm:0.19.5"
@ -1906,6 +1955,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/freebsd-x64@npm:0.20.1"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-arm64@npm:0.19.5"
@ -1913,6 +1969,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-arm64@npm:0.20.1"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-arm@npm:0.19.5"
@ -1920,6 +1983,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-arm@npm:0.20.1"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-ia32@npm:0.19.5"
@ -1927,6 +1997,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-ia32@npm:0.20.1"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-loong64@npm:0.19.5"
@ -1934,6 +2011,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-loong64@npm:0.20.1"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-mips64el@npm:0.19.5"
@ -1941,6 +2025,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-mips64el@npm:0.20.1"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-ppc64@npm:0.19.5"
@ -1948,6 +2039,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-ppc64@npm:0.20.1"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-riscv64@npm:0.19.5"
@ -1955,6 +2053,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-riscv64@npm:0.20.1"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-s390x@npm:0.19.5"
@ -1962,6 +2067,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-s390x@npm:0.20.1"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/linux-x64@npm:0.19.5"
@ -1969,6 +2081,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/linux-x64@npm:0.20.1"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/netbsd-x64@npm:0.19.5"
@ -1976,6 +2095,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/netbsd-x64@npm:0.20.1"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/openbsd-x64@npm:0.19.5"
@ -1983,6 +2109,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/openbsd-x64@npm:0.20.1"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/sunos-x64@npm:0.19.5"
@ -1990,6 +2123,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/sunos-x64@npm:0.20.1"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/win32-arm64@npm:0.19.5"
@ -1997,6 +2137,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/win32-arm64@npm:0.20.1"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/win32-ia32@npm:0.19.5"
@ -2004,6 +2151,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/win32-ia32@npm:0.20.1"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.19.5":
version: 0.19.5
resolution: "@esbuild/win32-x64@npm:0.19.5"
@ -2011,6 +2165,13 @@ __metadata:
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.20.1":
version: 0.20.1
resolution: "@esbuild/win32-x64@npm:0.20.1"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0":
version: 4.4.0
resolution: "@eslint-community/eslint-utils@npm:4.4.0"
@ -3117,7 +3278,7 @@ __metadata:
"@sqlite.org/sqlite-wasm": ^3.45.1-build1
"@types/debug": ^4.1.12
"@types/uuid": ^9.0.7
debug: ^4.3.4
esbuild: ^0.20.1
eventemitter3: ^5.0.1
typescript: ^5.2.2
uuid: ^9.0.1
@ -5913,6 +6074,86 @@ __metadata:
languageName: node
linkType: hard
"esbuild@npm:^0.20.1":
version: 0.20.1
resolution: "esbuild@npm:0.20.1"
dependencies:
"@esbuild/aix-ppc64": 0.20.1
"@esbuild/android-arm": 0.20.1
"@esbuild/android-arm64": 0.20.1
"@esbuild/android-x64": 0.20.1
"@esbuild/darwin-arm64": 0.20.1
"@esbuild/darwin-x64": 0.20.1
"@esbuild/freebsd-arm64": 0.20.1
"@esbuild/freebsd-x64": 0.20.1
"@esbuild/linux-arm": 0.20.1
"@esbuild/linux-arm64": 0.20.1
"@esbuild/linux-ia32": 0.20.1
"@esbuild/linux-loong64": 0.20.1
"@esbuild/linux-mips64el": 0.20.1
"@esbuild/linux-ppc64": 0.20.1
"@esbuild/linux-riscv64": 0.20.1
"@esbuild/linux-s390x": 0.20.1
"@esbuild/linux-x64": 0.20.1
"@esbuild/netbsd-x64": 0.20.1
"@esbuild/openbsd-x64": 0.20.1
"@esbuild/sunos-x64": 0.20.1
"@esbuild/win32-arm64": 0.20.1
"@esbuild/win32-ia32": 0.20.1
"@esbuild/win32-x64": 0.20.1
dependenciesMeta:
"@esbuild/aix-ppc64":
optional: true
"@esbuild/android-arm":
optional: true
"@esbuild/android-arm64":
optional: true
"@esbuild/android-x64":
optional: true
"@esbuild/darwin-arm64":
optional: true
"@esbuild/darwin-x64":
optional: true
"@esbuild/freebsd-arm64":
optional: true
"@esbuild/freebsd-x64":
optional: true
"@esbuild/linux-arm":
optional: true
"@esbuild/linux-arm64":
optional: true
"@esbuild/linux-ia32":
optional: true
"@esbuild/linux-loong64":
optional: true
"@esbuild/linux-mips64el":
optional: true
"@esbuild/linux-ppc64":
optional: true
"@esbuild/linux-riscv64":
optional: true
"@esbuild/linux-s390x":
optional: true
"@esbuild/linux-x64":
optional: true
"@esbuild/netbsd-x64":
optional: true
"@esbuild/openbsd-x64":
optional: true
"@esbuild/sunos-x64":
optional: true
"@esbuild/win32-arm64":
optional: true
"@esbuild/win32-ia32":
optional: true
"@esbuild/win32-x64":
optional: true
bin:
esbuild: bin/esbuild
checksum: af8b3c79e48d303501cac8551bf1ac5ebf5d86eebf2d1eb9d2a7018f4c5506bb120ed2454a013e3387e499de780a916bbffc9edd4ef132be403cd39771ace045
languageName: node
linkType: hard
"escalade@npm:^3.1.1":
version: 3.1.1
resolution: "escalade@npm:3.1.1"