UNPKG

ram64

Version:

Multi-threaded 64bit memory cache database inspired by redis-like features

46 lines (34 loc) 1.56 kB
import { MessagePort, parentPort, isMainThread } from "worker_threads"; import { MessageToMain, MessageFromMain } from '../types'; import { RAM64 } from "."; import { randomString } from '../util/rand'; import { DEFAULT_CONCURRENCY } from "./startup"; export type ConnectOptions = { concurrency?: number; } export async function connect(connectKey: string, { concurrency = DEFAULT_CONCURRENCY }: ConnectOptions = {}): Promise<RAM64> { if (isMainThread) return Promise.reject(new Error('connect() must be called from a worker thread. Use startup() instead.')); const req: MessageToMain = { ram64: true, requestId: randomString(), command: 'connect', args: { connectKey } }; // TODO: support for timeout probably isn't a terrible idea const promise = new Promise((resolve, reject) => { const handler = (res: MessageFromMain) => { if (res?.requestId !== req.requestId) return; // ignore unintended responses parentPort?.off('message', handler); // remove handler if (res.error) return void reject(res.error); resolve(res.value); }; parentPort?.on('message', handler); parentPort?.postMessage(req); }); const res = await promise as { ports: MessagePort[], shardCount: number }; const ports = res.ports as MessagePort[]; const shardCount = res.shardCount as number; return new RAM64({ connectKey, ports, shardCount, concurrency }); }