mor
This commit is contained in:
parent
ff1f474324
commit
e151208e15
1 changed files with 2933 additions and 784 deletions
45
frontend/test-support/checkpoint.ts
Normal file
45
frontend/test-support/checkpoint.ts
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import assert from "node:assert/strict";
|
||||
|
||||
/** A one-shot, observable scheduling boundary. An unexercised gate is a failure. */
|
||||
export class Checkpoint<T> {
|
||||
private readonly reached = Promise.withResolvers<T>();
|
||||
private readonly released = Promise.withResolvers<void>();
|
||||
public fired = false;
|
||||
public resumed = false;
|
||||
public value?: T;
|
||||
|
||||
public async enter(value: T, signal?: AbortSignal | null): Promise<void> {
|
||||
assert(!this.fired, "Checkpoint entered twice");
|
||||
this.fired = true;
|
||||
this.value = structuredClone(value);
|
||||
this.reached.resolve(this.value);
|
||||
signal?.throwIfAborted();
|
||||
let abort = () => {};
|
||||
try {
|
||||
await Promise.race([
|
||||
this.released.promise,
|
||||
new Promise<never>((_, reject) => {
|
||||
abort = () =>
|
||||
reject(
|
||||
signal?.reason ?? new Error("Checkpoint aborted")
|
||||
);
|
||||
signal?.addEventListener("abort", abort, { once: true });
|
||||
})
|
||||
]);
|
||||
} finally {
|
||||
signal?.removeEventListener("abort", abort);
|
||||
}
|
||||
}
|
||||
|
||||
public wait(): Promise<T> {
|
||||
return this.reached.promise;
|
||||
}
|
||||
public resume(): void {
|
||||
this.resumed = true;
|
||||
this.released.resolve();
|
||||
}
|
||||
public assertConsumed(): void {
|
||||
assert(this.fired, "Checkpoint never reached");
|
||||
assert(this.resumed, "Checkpoint never released");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue