dyomedea/src/db/change-handler.ts

114 lines
2.9 KiB
TypeScript
Raw Normal View History

import { debounce, slice } from 'lodash';
2022-12-06 13:36:50 +00:00
import { getWpt } from '../db/wpt';
import { getParentId } from '../lib/docuri';
2022-12-06 13:36:50 +00:00
import { returnAgain } from '../workers/dispatcher-worker';
import { getAllGpxes, getGpx } from './gpx';
import { put } from './lib';
import { getOverlays } from './overlays';
2022-12-09 16:31:56 +00:00
import { getRte } from './rte';
import { getTrk } from './trk';
import { getTrkseg } from './trkseg';
2022-12-05 17:49:36 +00:00
2022-12-06 13:36:50 +00:00
declare global {
var watches: Map<string, any>;
2022-12-05 17:49:36 +00:00
}
2022-12-06 13:36:50 +00:00
const methods = {
getAllGpxes,
getGpx,
getTrk,
getTrkseg,
2022-12-06 13:36:50 +00:00
getWpt,
2022-12-09 16:31:56 +00:00
getRte,
getOverlays,
2022-12-06 13:36:50 +00:00
};
const sendUpdate = async (params: any) => {
2022-12-06 13:36:50 +00:00
if (params) {
console.log({ caller: 'ChangeHandler / sendUpdate', params });
2023-02-13 14:59:41 +00:00
try {
const { method, _dispatchId, id, ...otherParams } = params;
const returnValue = await methods[<keyof typeof methods>method](params);
if (returnValue) {
returnAgain(_dispatchId, returnValue);
}
} catch (error) {
console.error({ caller: 'ChangeHandler / sendUpdate', params, error });
2022-12-06 13:36:50 +00:00
}
}
};
let debouncedSendUpdates = <any>{};
for (const property in methods) {
debouncedSendUpdates[<keyof typeof debouncedSendUpdates>property] = debounce(
sendUpdate,
500
);
}
const changeHandler = async (change: any) => {
// console.log({ caller: 'ChangeHandler', change, watches: globalThis.watches });
const { id } = change;
if (!globalThis.watches) {
globalThis.watches = new Map();
}
sendUpdate(globalThis.watches.get(id));
const parentId = getParentId(id);
if (parentId === 'gpx') {
const gpxes = await getAllGpxes();
2023-02-12 13:10:56 +00:00
// console.log({ caller: 'changeHandler / gpxes', gpxes, id });
2022-12-12 19:57:25 +00:00
if (!gpxes.includes(id)) {
await put(
parentId,
`idx-${parentId}`,
(doc) => {
2023-02-12 13:10:56 +00:00
// console.log({ caller: 'changeHandler / gpxes', doc });
doc.push(id);
doc.reverse().sort().reverse();
return doc;
},
[]
);
}
}
const parentParams = globalThis.watches.get(parentId);
if (parentParams) {
debouncedSendUpdates[parentParams.method](parentParams);
}
};
2022-12-06 13:36:50 +00:00
export default changeHandler;
export const getAndWatch = async (params: any) => {
2023-02-12 13:10:56 +00:00
// console.log({
// caller: 'ChangeHandler / getAndWatch',
// params,
// watches: globalThis.watches,
// });
2022-12-06 13:36:50 +00:00
const { method, _dispatchId, id, ...otherParams } = params;
if (!globalThis.watches) {
globalThis.watches = new Map();
}
globalThis.watches.set(id, params);
const returnValue = await methods[<keyof typeof methods>method](params);
2023-02-12 13:10:56 +00:00
// console.log({
// caller: 'ChangeHandler / getAndWatch',
// params,
// returnValue,
// watches: globalThis.watches,
// });
2022-12-06 13:36:50 +00:00
return returnValue;
};
export const cancelWatch = (params: any) => {
if (!globalThis.watches) {
globalThis.watches = new Map();
}
const { id } = params;
globalThis.watches.delete(id);
};