Download apps/shared/src/cron-trigger-controller.ts from SaylorTwift/hermes-agent: direct link, hf CLI and curl.
- Browser
- Download file 1.16 kB
-
https://huggingface.co/SaylorTwift/hermes-agent/resolve/main/apps/shared/src/cron-trigger-controller.ts
- Command line
-
hf download hf://SaylorTwift/hermes-agent/apps/shared/src/cron-trigger-controller.ts
-
curl -L -o cron-trigger-controller.ts https://huggingface.co/SaylorTwift/hermes-agent/resolve/main/apps/shared/src/cron-trigger-controller.ts
1.16 kB
| export interface CronTriggerRunResult<T> { | |
| started: boolean | |
| value: T | null | |
| } | |
| export interface CronTriggerController { | |
| isRunning(key: string): boolean | |
| run<T>(key: string, action: () => Promise<T>, onStarted?: () => void): Promise<CronTriggerRunResult<T>> | |
| } | |
| // This is an interaction guard for one mounted UI surface. Cross-window and | |
| // cross-process exclusion remains the backend's responsibility via its durable | |
| // cron claim; a renderer-local Set must never be treated as the execution lock. | |
| export function createCronTriggerController( | |
| onRunningChange: (key: string, running: boolean) => void = () => undefined | |
| ): CronTriggerController { | |
| const running = new Set<string>() | |
| return { | |
| isRunning: key => running.has(key), | |
| async run<T>(key: string, action: () => Promise<T>, onStarted?: () => void) { | |
| if (running.has(key)) { | |
| return { started: false, value: null } | |
| } | |
| running.add(key) | |
| try { | |
| onRunningChange(key, true) | |
| onStarted?.() | |
| return { started: true, value: await action() } | |
| } finally { | |
| running.delete(key) | |
| onRunningChange(key, false) | |
| } | |
| } | |
| } | |
| } | |