fix(updates): enforce a persisted daily check

This commit is contained in:
ajnart committed 2026-07-29 06:47:07 +02:00
1 parent 6b74078766
commit add6ee56ba
8 files changed
+349 -27

No files matched your search

+1
View File
@@ -6,6 +6,7 @@ export {
handshakeAsync,
createSubPubChannel,
createGetSetChannel,
createLockChannel,
setQueryCacheAsync,
getQueryCacheAsync,
removeQueryCacheAsync,
+27 -2
View File
@@ -114,10 +114,11 @@ export const createGetSetChannel = <TData>(name: string) => {
* @param options optional TTL in seconds
*/
setAsync: async (data: TData, options?: { ttlSeconds?: number }) => {
await getSetClient.set(name, superjson.stringify(data));
if (options?.ttlSeconds) {
await getSetClient.expire(name, options.ttlSeconds);
await getSetClient.set(name, superjson.stringify(data), "EX", options.ttlSeconds);
return;
}
await getSetClient.set(name, superjson.stringify(data));
},
/**
* Remove data from the channel
@@ -128,6 +129,30 @@ export const createGetSetChannel = <TData>(name: string) => {
};
};
/**
* Creates a short-lived distributed lock.
*
* The token prevents a process from releasing a lock that expired and was
* acquired by another process in the meantime.
*/
export const createLockChannel = (name: string) => {
return {
acquireAsync: async (ttlSeconds: number) => {
const token = createId();
const result = await getSetClient.set(name, token, "EX", ttlSeconds, "NX");
return result === "OK" ? token : null;
},
releaseAsync: async (token: string) => {
await getSetClient.eval(
"if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end",
1,
name,
token,
);
},
};
};
const queryCacheKey = (userId: string, boardId: string) => `qc:${userId}:${boardId}`;
export const setQueryCacheAsync = async (