Files
stats/apps/api/src/utils/deduplicate.ts
2025-02-28 10:03:28 +01:00

51 lines
902 B
TypeScript

import { getLock } from '@openpanel/redis';
import fastJsonStableHash from 'fast-json-stable-hash';
import type { FastifyReply } from 'fastify';
export async function isDuplicatedEvent({
payload,
projectId,
}: {
payload: Record<string, any>;
projectId: string;
}) {
const locked = await getLock(
`fastify:deduplicate:${fastJsonStableHash.hash(
{
...payload,
projectId,
},
'md5',
)}`,
'1',
100,
);
if (locked) {
return false;
}
return true;
}
export async function checkDuplicatedEvent({
reply,
payload,
projectId,
}: {
reply: FastifyReply;
payload: Record<string, any>;
projectId: string;
}) {
if (await isDuplicatedEvent({ payload, projectId })) {
reply.log.info('duplicated event', {
payload,
projectId,
});
reply.status(200).send('duplicated');
return true;
}
return false;
}