| 352 | } |
| 353 | |
| 354 | export function cancel(sessionID: string) { |
| 355 | log.info("cancel", { sessionID }) |
| 356 | const s = state() |
| 357 | const match = s[sessionID] |
| 358 | if (match) { |
| 359 | match.abort.abort() |
| 360 | for (const item of match.callbacks) { |
| 361 | item.reject() |
| 362 | } |
| 363 | delete s[sessionID] |
| 364 | } |
| 365 | // always set status to idle, even if no match in state |
| 366 | // this ensures status is properly reset if state got out of sync |
| 367 | SessionStatus.set(sessionID, { type: "idle" }) |
| 368 | } |
| 369 | |
| 370 | export const loop = fn(Identifier.schema("session"), async (sessionID) => { |
| 371 | const abort = start(sessionID) |