Download src/meeting-bot/node-audio-pull-waiters.ts from SaylorTwift/openclaw: direct link, hf CLI and curl.
- Browser
- Download file 1.05 kB
-
https://huggingface.co/SaylorTwift/openclaw/resolve/main/src/meeting-bot/node-audio-pull-waiters.ts
- Command line
-
hf download hf://SaylorTwift/openclaw/src/meeting-bot/node-audio-pull-waiters.ts
-
curl -L -o node-audio-pull-waiters.ts https://huggingface.co/SaylorTwift/openclaw/resolve/main/src/meeting-bot/node-audio-pull-waiters.ts
1.05 kB
| /** Internal pull-wait ownership used by the node-host long poll. */ | |
| export class MeetingNodeAudioPullWaiters { | |
| readonly #waiters = new Set<() => void>(); | |
| get size(): number { | |
| return this.#waiters.size; | |
| } | |
| async wait(timeoutMs: number): Promise<void> { | |
| let wake!: () => void; | |
| const ready = new Promise<void>((resolve) => { | |
| wake = resolve; | |
| this.#waiters.add(wake); | |
| }); | |
| let timer: ReturnType<typeof setTimeout> | undefined; | |
| const timeout = new Promise<void>((resolve) => { | |
| timer = setTimeout(resolve, timeoutMs); | |
| }); | |
| try { | |
| await Promise.race([timeout, ready]); | |
| } finally { | |
| // A stalled bridge can be polled indefinitely. Timeout must release its | |
| // resolver instead of retaining one waiter per empty pull. | |
| this.#waiters.delete(wake); | |
| if (timer !== undefined) { | |
| clearTimeout(timer); | |
| } | |
| } | |
| } | |
| wake(): void { | |
| const waiters = [...this.#waiters]; | |
| this.#waiters.clear(); | |
| for (const waiter of waiters) { | |
| waiter(); | |
| } | |
| } | |
| } | |