Gates / test (push) Successful in 1m40s
Gates / package (push) Successful in 3m58s
Gates / container (push) Successful in 14s
CI / gates (push) Successful in 12m51s
Gates / frontend (push) Successful in 1m18s
Gates / test-aarch64 (push) Successful in 6m57s
query log, live and lookup merge into /activity. history filters live in the url, so a pasted link or back/forward reproduces the exact view; the result column separates servfail and nxdomain from success in the list. live is follow-by-default with freeze, and a streamed row opens its in-memory provenance detail — no correlation invented for rows sqlite has not written. lookup survives as the current policy simulation under /activity/test. investigation links carry absolute bounds, and the diagnostics page now honors since/until instead of ignoring them. the old routes are gone without aliases.
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { EVENT_SOURCE_CLOSED, type EventSourceLike } from "./useLiveQueries";
|
|
|
|
const CONNECTING = 0;
|
|
const OPEN = 1;
|
|
|
|
/** Test double for the injected EventSource constructor. */
|
|
export class FakeEventSource implements EventSourceLike {
|
|
readonly url: string;
|
|
closed = false;
|
|
readyState: number = CONNECTING;
|
|
private listeners = new Map<string, Array<(event: { data?: unknown }) => void>>();
|
|
|
|
constructor(url: string) {
|
|
this.url = url;
|
|
}
|
|
|
|
addEventListener(type: string, listener: (event: { data?: unknown }) => void): void {
|
|
const existing = this.listeners.get(type) ?? [];
|
|
existing.push(listener);
|
|
this.listeners.set(type, existing);
|
|
}
|
|
|
|
close(): void {
|
|
this.closed = true;
|
|
this.readyState = EVENT_SOURCE_CLOSED;
|
|
}
|
|
|
|
emit(type: string, event: { data?: unknown } = {}): void {
|
|
if (type === "open") this.readyState = OPEN;
|
|
for (const listener of this.listeners.get(type) ?? []) listener(event);
|
|
}
|
|
|
|
/**
|
|
* A non-200 response: the browser closes the source, then dispatches one
|
|
* error event and never retries.
|
|
*/
|
|
failFatal(): void {
|
|
this.readyState = EVENT_SOURCE_CLOSED;
|
|
this.emit("error");
|
|
}
|
|
}
|