(
sessionId: string,
opts: { readonly timeoutMs: number; readonly signal?: AbortSignal },
)
| 104 | * this answers `null` immediately instead of holding. |
| 105 | */ |
| 106 | export const waitForOAuthResult = ( |
| 107 | sessionId: string, |
| 108 | opts: { readonly timeoutMs: number; readonly signal?: AbortSignal }, |
| 109 | ): Promise<AnyResult | null> => { |
| 110 | const immediate = consumeOAuthResult(sessionId); |
| 111 | if (immediate !== null) return Promise.resolve(immediate); |
| 112 | if (opts.timeoutMs <= 0 || opts.signal?.aborted === true) return Promise.resolve(null); |
| 113 | if (waiters.has(sessionId) || waiters.size >= MAX_HELD_WAITERS_TOTAL) { |
| 114 | return Promise.resolve(null); |
| 115 | } |
| 116 | |
| 117 | return new Promise((resolve) => { |
| 118 | let done = false; |
| 119 | const finish = (result: AnyResult | null) => { |
| 120 | if (done) return; |
| 121 | done = true; |
| 122 | clearTimeout(timer); |
| 123 | opts.signal?.removeEventListener("abort", onAbort); |
| 124 | removeWaiter(sessionId, wake); |
| 125 | resolve(result); |
| 126 | }; |
| 127 | const wake = () => finish(consumeOAuthResult(sessionId)); |
| 128 | const onAbort = () => finish(null); |
| 129 | const timer = setTimeout(() => finish(null), opts.timeoutMs); |
| 130 | |
| 131 | waiters.set(sessionId, wake); |
| 132 | opts.signal?.addEventListener("abort", onAbort, { once: true }); |
| 133 | }); |
| 134 | }; |
| 135 | |
| 136 | /** Test-only — clears the store and resolves any held waiters as pending. */ |
| 137 | export const __resetOAuthResultStoreForTests = (): void => { |
no test coverage detected