100 lines
4.0 KiB
JavaScript
100 lines
4.0 KiB
JavaScript
import cluster from 'node:cluster';
|
|
import Debug from 'debug';
|
|
import NodeCache from 'node-cache';
|
|
import getNextBurialSiteIdFromDatabase from '../database/getNextBurialSiteId.js';
|
|
import getPreviousLotIdFromDatabase from '../database/getPreviousLotId.js';
|
|
import { DEBUG_NAMESPACE } from '../debug.config.js';
|
|
const debug = Debug(`${DEBUG_NAMESPACE}:burialSites.helpers:${process.pid}`);
|
|
const cacheOptions = {
|
|
stdTTL: 2 * 60, // two minutes
|
|
useClones: false
|
|
};
|
|
const previousBurialSiteIdCache = new NodeCache(cacheOptions);
|
|
const nextBurialSiteIdCache = new NodeCache(cacheOptions);
|
|
function cacheBurialSiteIds(burialSiteId, nextBurialSiteId, relayMessage = true) {
|
|
previousBurialSiteIdCache.set(nextBurialSiteId, burialSiteId);
|
|
nextBurialSiteIdCache.set(burialSiteId, nextBurialSiteId);
|
|
try {
|
|
if (relayMessage && cluster.isWorker && process.send !== undefined) {
|
|
const workerMessage = {
|
|
messageType: 'cacheBurialSiteIds',
|
|
burialSiteId,
|
|
nextBurialSiteId,
|
|
timeMillis: Date.now(),
|
|
pid: process.pid
|
|
};
|
|
debug(`Sending cache burial site ids from worker: (${burialSiteId}, ${nextBurialSiteId})`);
|
|
process.send(workerMessage);
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
export async function getNextBurialSiteId(burialSiteId) {
|
|
let nextBurialSiteId = nextBurialSiteIdCache.get(burialSiteId);
|
|
if (nextBurialSiteId === undefined) {
|
|
nextBurialSiteId = await getNextBurialSiteIdFromDatabase(burialSiteId);
|
|
if (nextBurialSiteId !== undefined) {
|
|
cacheBurialSiteIds(burialSiteId, nextBurialSiteId);
|
|
}
|
|
}
|
|
return nextBurialSiteId;
|
|
}
|
|
export async function getPreviousBurialSiteId(burialSiteId) {
|
|
let previousBurialSiteId = previousBurialSiteIdCache.get(burialSiteId);
|
|
if (previousBurialSiteId === undefined) {
|
|
previousBurialSiteId = await getPreviousLotIdFromDatabase(burialSiteId);
|
|
if (previousBurialSiteId !== undefined) {
|
|
cacheBurialSiteIds(previousBurialSiteId, burialSiteId);
|
|
}
|
|
}
|
|
return previousBurialSiteId;
|
|
}
|
|
export function clearNextPreviousBurialSiteIdCache(burialSiteId = -1, relayMessage = true) {
|
|
if (burialSiteId === -1) {
|
|
previousBurialSiteIdCache.flushAll();
|
|
nextBurialSiteIdCache.flushAll();
|
|
return;
|
|
}
|
|
const previousBurialSiteId = previousBurialSiteIdCache.get(burialSiteId);
|
|
if (previousBurialSiteId !== undefined) {
|
|
nextBurialSiteIdCache.del(previousBurialSiteId);
|
|
previousBurialSiteIdCache.del(burialSiteId);
|
|
}
|
|
const nextBurialSiteId = nextBurialSiteIdCache.get(burialSiteId);
|
|
if (nextBurialSiteId !== undefined) {
|
|
previousBurialSiteIdCache.del(nextBurialSiteId);
|
|
nextBurialSiteIdCache.del(burialSiteId);
|
|
}
|
|
try {
|
|
if (relayMessage && cluster.isWorker && process.send !== undefined) {
|
|
const workerMessage = {
|
|
// eslint-disable-next-line no-secrets/no-secrets
|
|
messageType: 'clearNextPreviousBurialSiteIdCache',
|
|
burialSiteId,
|
|
timeMillis: Date.now(),
|
|
pid: process.pid
|
|
};
|
|
debug(`Sending clear next/previous burial site cache from worker: ${burialSiteId}`);
|
|
process.send(workerMessage);
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
process.on('message', (message) => {
|
|
if (message.pid !== process.pid) {
|
|
switch (message.messageType) {
|
|
case 'cacheBurialSiteIds': {
|
|
debug(`Caching burial site ids: (${message.burialSiteId}, ${message.nextBurialSiteId})`);
|
|
cacheBurialSiteIds(message.burialSiteId, message.nextBurialSiteId, false);
|
|
break;
|
|
}
|
|
// eslint-disable-next-line no-secrets/no-secrets
|
|
case 'clearNextPreviousBurialSiteIdCache': {
|
|
debug(`Clearing next/previous burial site cache: ${message.burialSiteId}`);
|
|
clearNextPreviousBurialSiteIdCache(message.burialSiteId, false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|