(signal?: AbortSignal)
| 4971 | } |
| 4972 | |
| 4973 | async waitForIdle(signal?: AbortSignal): Promise<void> { |
| 4974 | assert( |
| 4975 | signal == null || typeof signal.aborted === "boolean", |
| 4976 | "waitForIdle signal must be an AbortSignal" |
| 4977 | ); |
| 4978 | if (signal?.aborted === true) { |
| 4979 | throw new Error("Waiting for session idle canceled."); |
| 4980 | } |
| 4981 | if (this.turnPhase === TurnPhase.IDLE) { |
| 4982 | return; |
| 4983 | } |
| 4984 | |
| 4985 | await new Promise<void>((resolve, reject) => { |
| 4986 | let settled = false; |
| 4987 | const settle = (callback: () => void) => { |
| 4988 | if (settled) { |
| 4989 | return; |
| 4990 | } |
| 4991 | settled = true; |
| 4992 | signal?.removeEventListener("abort", abort); |
| 4993 | callback(); |
| 4994 | }; |
| 4995 | const waiter = () => settle(resolve); |
| 4996 | const abort = () => { |
| 4997 | const waiterIndex = this.idleWaiters.indexOf(waiter); |
| 4998 | if (waiterIndex !== -1) { |
| 4999 | this.idleWaiters.splice(waiterIndex, 1); |
| 5000 | } |
| 5001 | settle(() => reject(new Error("Waiting for session idle canceled."))); |
| 5002 | }; |
| 5003 | |
| 5004 | this.idleWaiters.push(waiter); |
| 5005 | signal?.addEventListener("abort", abort, { once: true }); |
| 5006 | }); |
| 5007 | } |
| 5008 | |
| 5009 | /** |
| 5010 | * Slash workflow commands are user follow-ups even though they do not live in MessageQueue. |
no test coverage detected