ram64
Version:
Multi-threaded 64bit memory cache database inspired by redis-like features
51 lines (38 loc) • 1.5 kB
text/typescript
import { MessagePort } from 'worker_threads';
import { Shard, MessageFromWorker, MessageToWorker } from "../types";
import { commands } from './commands';
import { Command } from '../commands';
import { getShardFromKey } from './get-shard';
import { isRAM64Message } from '../client/is-ram64-message';
import { isLRUEnabled, evict } from './lru';
let msgSinceEvict = 0;
export async function processRequest(port: MessagePort, req: MessageToWorker): Promise<void> {
if (!isRAM64Message(req)) return;
const { key, commandIndex, requestId, args }: MessageToWorker = req;
const cmd: Command = commands[commandIndex ?? -1];
if (!cmd?.fn) return void port.postMessage({ ram64: true, requestId, error: `Command '${commandIndex}' not implemented` });
let shard: Shard|undefined, value: any, error: any;
if (key) {
shard = getShardFromKey(key);
}
if (cmd.promise) {
value = await cmd.fn({ shard, key, args }).catch((err: any) => {
error = err;
});
} else {
try {
value = cmd.fn({ shard, key, args });
} catch (err) {
error = err;
}
}
const response: MessageFromWorker = { ram64: true, requestId, value, error };
port.postMessage(response);
if (isLRUEnabled) {
msgSinceEvict++;
if (msgSinceEvict > 100) { // periodic checks
msgSinceEvict = 0;
evict();
}
}
}