@adonis-agora/telescope 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/dist/providers/telescope_provider.d.ts +16 -0
- package/dist/providers/telescope_provider.d.ts.map +1 -1
- package/dist/providers/telescope_provider.js +33 -2
- package/dist/providers/telescope_provider.js.map +1 -1
- package/dist/providers/telescope_ui_provider.d.ts.map +1 -1
- package/dist/providers/telescope_ui_provider.js +87 -1
- package/dist/providers/telescope_ui_provider.js.map +1 -1
- package/dist/providers/telescope_watchers_provider.d.ts +11 -0
- package/dist/providers/telescope_watchers_provider.d.ts.map +1 -1
- package/dist/providers/telescope_watchers_provider.js +58 -0
- package/dist/providers/telescope_watchers_provider.js.map +1 -1
- package/dist/src/define_config.d.ts +50 -0
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +9 -0
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/index.d.ts +23 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +17 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/metrics/metrics_service.d.ts +63 -0
- package/dist/src/metrics/metrics_service.d.ts.map +1 -0
- package/dist/src/metrics/metrics_service.js +116 -0
- package/dist/src/metrics/metrics_service.js.map +1 -0
- package/dist/src/metrics/rollup.d.ts +61 -0
- package/dist/src/metrics/rollup.d.ts.map +1 -0
- package/dist/src/metrics/rollup.js +114 -0
- package/dist/src/metrics/rollup.js.map +1 -0
- package/dist/src/metrics/stats.d.ts +112 -0
- package/dist/src/metrics/stats.d.ts.map +1 -0
- package/dist/src/metrics/stats.js +255 -0
- package/dist/src/metrics/stats.js.map +1 -0
- package/dist/src/metrics/timeseries.d.ts +22 -0
- package/dist/src/metrics/timeseries.d.ts.map +1 -0
- package/dist/src/metrics/timeseries.js +34 -0
- package/dist/src/metrics/timeseries.js.map +1 -0
- package/dist/src/metrics/traces.d.ts +27 -0
- package/dist/src/metrics/traces.d.ts.map +1 -0
- package/dist/src/metrics/traces.js +71 -0
- package/dist/src/metrics/traces.js.map +1 -0
- package/dist/src/metrics/waterfall.d.ts +44 -0
- package/dist/src/metrics/waterfall.d.ts.map +1 -0
- package/dist/src/metrics/waterfall.js +99 -0
- package/dist/src/metrics/waterfall.js.map +1 -0
- package/dist/src/query/n_plus_one.d.ts +60 -0
- package/dist/src/query/n_plus_one.d.ts.map +1 -0
- package/dist/src/query/n_plus_one.js +102 -0
- package/dist/src/query/n_plus_one.js.map +1 -0
- package/dist/src/registry.d.ts +9 -0
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +6 -0
- package/dist/src/registry.js.map +1 -1
- package/dist/src/sampling/sampling.d.ts +52 -0
- package/dist/src/sampling/sampling.d.ts.map +1 -0
- package/dist/src/sampling/sampling.js +111 -0
- package/dist/src/sampling/sampling.js.map +1 -0
- package/dist/src/sampling/sampling_store.d.ts +33 -0
- package/dist/src/sampling/sampling_store.d.ts.map +1 -0
- package/dist/src/sampling/sampling_store.js +65 -0
- package/dist/src/sampling/sampling_store.js.map +1 -0
- package/dist/src/stream/entry_events.d.ts +45 -0
- package/dist/src/stream/entry_events.d.ts.map +1 -0
- package/dist/src/stream/entry_events.js +56 -0
- package/dist/src/stream/entry_events.js.map +1 -0
- package/dist/src/stream/index.d.ts +6 -0
- package/dist/src/stream/index.d.ts.map +1 -0
- package/dist/src/stream/index.js +5 -0
- package/dist/src/stream/index.js.map +1 -0
- package/dist/src/stream/stream_handler.d.ts +42 -0
- package/dist/src/stream/stream_handler.d.ts.map +1 -0
- package/dist/src/stream/stream_handler.js +48 -0
- package/dist/src/stream/stream_handler.js.map +1 -0
- package/dist/src/stream/streaming_store.d.ts +31 -0
- package/dist/src/stream/streaming_store.d.ts.map +1 -0
- package/dist/src/stream/streaming_store.js +49 -0
- package/dist/src/stream/streaming_store.js.map +1 -0
- package/dist/src/ui/api.d.ts +39 -1
- package/dist/src/ui/api.d.ts.map +1 -1
- package/dist/src/ui/api.js +116 -1
- package/dist/src/ui/api.js.map +1 -1
- package/dist/src/ui/define_config.d.ts +27 -0
- package/dist/src/ui/define_config.d.ts.map +1 -1
- package/dist/src/ui/define_config.js +6 -0
- package/dist/src/ui/define_config.js.map +1 -1
- package/dist/src/ui/http.d.ts +40 -0
- package/dist/src/ui/http.d.ts.map +1 -1
- package/dist/src/ui/http.js +43 -0
- package/dist/src/ui/http.js.map +1 -1
- package/dist/src/ui/index.d.ts +5 -3
- package/dist/src/ui/index.d.ts.map +1 -1
- package/dist/src/ui/index.js +3 -1
- package/dist/src/ui/index.js.map +1 -1
- package/dist/src/ui/request_replay.d.ts +56 -0
- package/dist/src/ui/request_replay.d.ts.map +1 -0
- package/dist/src/ui/request_replay.js +120 -0
- package/dist/src/ui/request_replay.js.map +1 -0
- package/dist/src/watchers/define_config.d.ts +17 -1
- package/dist/src/watchers/define_config.d.ts.map +1 -1
- package/dist/src/watchers/define_config.js +13 -0
- package/dist/src/watchers/define_config.js.map +1 -1
- package/dist/src/watchers/events_watcher.d.ts +63 -0
- package/dist/src/watchers/events_watcher.d.ts.map +1 -0
- package/dist/src/watchers/events_watcher.js +81 -0
- package/dist/src/watchers/events_watcher.js.map +1 -0
- package/dist/src/watchers/index.d.ts +6 -0
- package/dist/src/watchers/index.d.ts.map +1 -1
- package/dist/src/watchers/index.js +6 -0
- package/dist/src/watchers/index.js.map +1 -1
- package/dist/src/watchers/queue_watcher.d.ts +97 -0
- package/dist/src/watchers/queue_watcher.d.ts.map +1 -0
- package/dist/src/watchers/queue_watcher.js +114 -0
- package/dist/src/watchers/queue_watcher.js.map +1 -0
- package/dist/src/watchers/redis_watcher.d.ts +103 -0
- package/dist/src/watchers/redis_watcher.d.ts.map +1 -0
- package/dist/src/watchers/redis_watcher.js +161 -0
- package/dist/src/watchers/redis_watcher.js.map +1 -0
- package/dist/stubs/config/telescope.stub +9 -0
- package/dist/stubs/config/telescope_ui.stub +13 -0
- package/dist/stubs/config/telescope_watchers.stub +14 -3
- package/package.json +8 -8
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// — entry-events pub/sub (SSE live-stream) —
|
|
2
|
+
export { EntryEvents } from './entry_events.js';
|
|
3
|
+
export { StreamingTelescopeStore } from './streaming_store.js';
|
|
4
|
+
export { DEFAULT_HEARTBEAT_MS, streamEntries, } from './stream_handler.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stream/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,aAAa,GACd,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type SseSink } from '../ui/http.js';
|
|
2
|
+
import type { EntryEvents } from './entry_events.js';
|
|
3
|
+
/** Default keep-alive interval, mirroring the NestJS original's 15s heartbeat. */
|
|
4
|
+
export declare const DEFAULT_HEARTBEAT_MS = 15000;
|
|
5
|
+
/** Options for {@link streamEntries}. */
|
|
6
|
+
export interface StreamOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Heartbeat interval in milliseconds. A comment-only keep-alive frame is written
|
|
9
|
+
* on this cadence so proxies don't reap an idle connection. Set `0` to disable.
|
|
10
|
+
* Default {@link DEFAULT_HEARTBEAT_MS}.
|
|
11
|
+
*/
|
|
12
|
+
heartbeatMs?: number;
|
|
13
|
+
/**
|
|
14
|
+
* Injectable timer pair so tests can drive the heartbeat deterministically (no
|
|
15
|
+
* real timers / flake). Defaults to the global `setInterval`/`clearInterval`.
|
|
16
|
+
*/
|
|
17
|
+
timer?: {
|
|
18
|
+
setInterval: (fn: () => void, ms: number) => unknown;
|
|
19
|
+
clearInterval: (handle: unknown) => void;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** The live handle for an open stream — call {@link StreamSession.close} to tear it down. */
|
|
23
|
+
export interface StreamSession {
|
|
24
|
+
/** Unsubscribe from the bus and stop the heartbeat. Idempotent. */
|
|
25
|
+
close: () => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Wire an {@link EntryEvents} bus to an {@link SseSink}: subscribe, write the SSE
|
|
29
|
+
* handshake, push each newly-persisted entry as an `entry` frame (the already-redacted
|
|
30
|
+
* {@link EntrySummary}, matching the list API's row shape), and emit a periodic
|
|
31
|
+
* heartbeat. Cleans up (unsubscribe + clear the heartbeat) when the client
|
|
32
|
+
* disconnects (the sink fires its close handler) or when {@link StreamSession.close}
|
|
33
|
+
* is called.
|
|
34
|
+
*
|
|
35
|
+
* Port of the NestJS `StreamController.stream`, reshaped from RxJS to the
|
|
36
|
+
* dependency-free emitter + a raw SSE sink. Where the original coalesced
|
|
37
|
+
* type-batches over a 300ms window and pushed invalidation ticks, this pushes the
|
|
38
|
+
* stored entry directly (the dashboard renders it without a refetch); the 15s
|
|
39
|
+
* heartbeat is preserved.
|
|
40
|
+
*/
|
|
41
|
+
export declare function streamEntries(events: EntryEvents, sink: SseSink, options?: StreamOptions): StreamSession;
|
|
42
|
+
//# sourceMappingURL=stream_handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream_handler.d.ts","sourceRoot":"","sources":["../../../src/stream/stream_handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAsC,MAAM,eAAe,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,yCAAyC;AACzC,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QACrD,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KAC1C,CAAC;CACH;AAED,6FAA6F;AAC7F,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,aAAkB,GAC1B,aAAa,CAgCf"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { toSummary } from '../ui/api.js';
|
|
2
|
+
import { formatSseFrame, formatSseHeartbeat } from '../ui/http.js';
|
|
3
|
+
/** Default keep-alive interval, mirroring the NestJS original's 15s heartbeat. */
|
|
4
|
+
export const DEFAULT_HEARTBEAT_MS = 15_000;
|
|
5
|
+
/**
|
|
6
|
+
* Wire an {@link EntryEvents} bus to an {@link SseSink}: subscribe, write the SSE
|
|
7
|
+
* handshake, push each newly-persisted entry as an `entry` frame (the already-redacted
|
|
8
|
+
* {@link EntrySummary}, matching the list API's row shape), and emit a periodic
|
|
9
|
+
* heartbeat. Cleans up (unsubscribe + clear the heartbeat) when the client
|
|
10
|
+
* disconnects (the sink fires its close handler) or when {@link StreamSession.close}
|
|
11
|
+
* is called.
|
|
12
|
+
*
|
|
13
|
+
* Port of the NestJS `StreamController.stream`, reshaped from RxJS to the
|
|
14
|
+
* dependency-free emitter + a raw SSE sink. Where the original coalesced
|
|
15
|
+
* type-batches over a 300ms window and pushed invalidation ticks, this pushes the
|
|
16
|
+
* stored entry directly (the dashboard renders it without a refetch); the 15s
|
|
17
|
+
* heartbeat is preserved.
|
|
18
|
+
*/
|
|
19
|
+
export function streamEntries(events, sink, options = {}) {
|
|
20
|
+
const heartbeatMs = options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;
|
|
21
|
+
const timer = options.timer ?? {
|
|
22
|
+
setInterval: (fn, ms) => setInterval(fn, ms),
|
|
23
|
+
clearInterval: (handle) => clearInterval(handle),
|
|
24
|
+
};
|
|
25
|
+
// Open the stream: a comment line flushes headers and confirms the connection.
|
|
26
|
+
sink.write(': connected\n\n');
|
|
27
|
+
const unsubscribe = events.subscribe((entry) => {
|
|
28
|
+
const summary = toSummary(entry);
|
|
29
|
+
sink.write(formatSseFrame(summary, 'entry'));
|
|
30
|
+
});
|
|
31
|
+
let heartbeat = null;
|
|
32
|
+
if (heartbeatMs > 0) {
|
|
33
|
+
heartbeat = timer.setInterval(() => sink.write(formatSseHeartbeat()), heartbeatMs);
|
|
34
|
+
}
|
|
35
|
+
let closed = false;
|
|
36
|
+
const close = () => {
|
|
37
|
+
if (closed)
|
|
38
|
+
return;
|
|
39
|
+
closed = true;
|
|
40
|
+
unsubscribe();
|
|
41
|
+
if (heartbeat !== null)
|
|
42
|
+
timer.clearInterval(heartbeat);
|
|
43
|
+
};
|
|
44
|
+
// Tear down when the client disconnects.
|
|
45
|
+
sink.onClose(close);
|
|
46
|
+
return { close };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=stream_handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream_handler.js","sourceRoot":"","sources":["../../../src/stream/stream_handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAgB,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGjF,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AA0B3C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAmB,EACnB,IAAa,EACb,UAAyB,EAAE;IAE3B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI;QAC7B,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC;QAC5C,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAwC,CAAC;KACnF,CAAC;IAEF,+EAA+E;IAC/E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE9B,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAiB,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,GAAY,IAAI,CAAC;IAC9B,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,WAAW,EAAE,CAAC;QACd,IAAI,SAAS,KAAK,IAAI;YAAE,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC;IAEF,yCAAyC;IACzC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEpB,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Entry, RecordInput } from '../entry.js';
|
|
2
|
+
import type { EntryQuery, TelescopeStore } from '../store.js';
|
|
3
|
+
import type { EntryEvents } from './entry_events.js';
|
|
4
|
+
/**
|
|
5
|
+
* A {@link TelescopeStore} decorator that publishes each PERSISTED entry to an
|
|
6
|
+
* {@link EntryEvents} bus so the SSE route can stream it live. Placed as the
|
|
7
|
+
* OUTERMOST wrap in the provider's store chain (outside redaction + sampling), so
|
|
8
|
+
* it only ever sees the final, already-scrubbed entry that actually got stored —
|
|
9
|
+
* never raw content, never a sampled-away entry.
|
|
10
|
+
*
|
|
11
|
+
* A sampled-away entry is surfaced by the sampling decorator as a synthetic
|
|
12
|
+
* placeholder with `sequence: -1` (never persisted); this decorator skips
|
|
13
|
+
* publishing those, so only real stored entries are streamed.
|
|
14
|
+
*
|
|
15
|
+
* Default-neutral and zero-overhead: when nothing is subscribed
|
|
16
|
+
* (`events.subscriberCount === 0` — the dashboard is closed) `publish` is a cheap
|
|
17
|
+
* no-op, so the hot write path pays nothing. Every other operation passes through
|
|
18
|
+
* untouched.
|
|
19
|
+
*/
|
|
20
|
+
export declare class StreamingTelescopeStore implements TelescopeStore {
|
|
21
|
+
private readonly inner;
|
|
22
|
+
private readonly events;
|
|
23
|
+
constructor(inner: TelescopeStore, events: EntryEvents);
|
|
24
|
+
record<TContent>(input: RecordInput<TContent>): Promise<Entry<TContent>>;
|
|
25
|
+
get(id: string): Promise<Entry | null>;
|
|
26
|
+
list(query?: EntryQuery): Promise<Entry[]>;
|
|
27
|
+
count(): Promise<number>;
|
|
28
|
+
prune(olderThan: Date, keepLast?: number): Promise<number>;
|
|
29
|
+
clear(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=streaming_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming_store.d.ts","sourceRoot":"","sources":["../../../src/stream/streaming_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,uBAAwB,YAAW,cAAc;IAE1D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,WAAW;IAGhC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAU9E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAItC,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAI1C,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A {@link TelescopeStore} decorator that publishes each PERSISTED entry to an
|
|
3
|
+
* {@link EntryEvents} bus so the SSE route can stream it live. Placed as the
|
|
4
|
+
* OUTERMOST wrap in the provider's store chain (outside redaction + sampling), so
|
|
5
|
+
* it only ever sees the final, already-scrubbed entry that actually got stored —
|
|
6
|
+
* never raw content, never a sampled-away entry.
|
|
7
|
+
*
|
|
8
|
+
* A sampled-away entry is surfaced by the sampling decorator as a synthetic
|
|
9
|
+
* placeholder with `sequence: -1` (never persisted); this decorator skips
|
|
10
|
+
* publishing those, so only real stored entries are streamed.
|
|
11
|
+
*
|
|
12
|
+
* Default-neutral and zero-overhead: when nothing is subscribed
|
|
13
|
+
* (`events.subscriberCount === 0` — the dashboard is closed) `publish` is a cheap
|
|
14
|
+
* no-op, so the hot write path pays nothing. Every other operation passes through
|
|
15
|
+
* untouched.
|
|
16
|
+
*/
|
|
17
|
+
export class StreamingTelescopeStore {
|
|
18
|
+
inner;
|
|
19
|
+
events;
|
|
20
|
+
constructor(inner, events) {
|
|
21
|
+
this.inner = inner;
|
|
22
|
+
this.events = events;
|
|
23
|
+
}
|
|
24
|
+
async record(input) {
|
|
25
|
+
const entry = await this.inner.record(input);
|
|
26
|
+
// Skip the synthetic placeholder a sampling decorator returns for a dropped
|
|
27
|
+
// entry (sequence -1, never persisted): stream only entries that were stored.
|
|
28
|
+
if (entry.sequence >= 0) {
|
|
29
|
+
this.events.publish(entry);
|
|
30
|
+
}
|
|
31
|
+
return entry;
|
|
32
|
+
}
|
|
33
|
+
get(id) {
|
|
34
|
+
return this.inner.get(id);
|
|
35
|
+
}
|
|
36
|
+
list(query) {
|
|
37
|
+
return this.inner.list(query);
|
|
38
|
+
}
|
|
39
|
+
count() {
|
|
40
|
+
return this.inner.count();
|
|
41
|
+
}
|
|
42
|
+
prune(olderThan, keepLast) {
|
|
43
|
+
return this.inner.prune(olderThan, keepLast);
|
|
44
|
+
}
|
|
45
|
+
clear() {
|
|
46
|
+
return this.inner.clear();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=streaming_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming_store.js","sourceRoot":"","sources":["../../../src/stream/streaming_store.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,uBAAuB;IAEf;IACA;IAFnB,YACmB,KAAqB,EACrB,MAAmB;QADnB,UAAK,GAAL,KAAK,CAAgB;QACrB,WAAM,GAAN,MAAM,CAAa;IACnC,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAW,KAA4B;QACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,4EAA4E;QAC5E,8EAA8E;QAC9E,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAc,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,KAAkB;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAe,EAAE,QAAiB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
package/dist/src/ui/api.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Entry } from '../entry.js';
|
|
2
|
+
import { type MetricsServiceOptions } from '../metrics/metrics_service.js';
|
|
2
3
|
import type { TelescopeService } from '../service.js';
|
|
3
4
|
import type { EntryQuery } from '../store.js';
|
|
4
5
|
import type { UiHttpContext, UiRequest } from './http.js';
|
|
6
|
+
import { type ReplayOptions } from './request_replay.js';
|
|
5
7
|
/**
|
|
6
8
|
* The JSON-API handler functions over a {@link TelescopeService}. Each takes the
|
|
7
9
|
* framework-light {@link UiHttpContext} (an Adonis `HttpContext` satisfies it) plus
|
|
@@ -10,7 +12,12 @@ import type { UiHttpContext, UiRequest } from './http.js';
|
|
|
10
12
|
*/
|
|
11
13
|
export declare class TelescopeApi {
|
|
12
14
|
private readonly service;
|
|
13
|
-
|
|
15
|
+
private readonly metrics;
|
|
16
|
+
/** Request-replay settings (additive). Replay is disabled unless `enabled`. */
|
|
17
|
+
private readonly replay;
|
|
18
|
+
constructor(service: TelescopeService, metricsOptions?: MetricsServiceOptions, replayOptions?: ({
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
} & ReplayOptions) | undefined);
|
|
14
21
|
/**
|
|
15
22
|
* `GET <path>/api/entries` — list entries newest-first, with optional filters:
|
|
16
23
|
* `?type=`, `?traceId=`, `?search=`, `?limit=` (capped), `?before=` (ISO date).
|
|
@@ -25,6 +32,37 @@ export declare class TelescopeApi {
|
|
|
25
32
|
* top tags. `?limit=` caps each top-N list; `?type=` scopes `topFamilies`.
|
|
26
33
|
*/
|
|
27
34
|
stats(ctx: UiHttpContext): Promise<unknown>;
|
|
35
|
+
/**
|
|
36
|
+
* `GET <path>/api/metrics/stats?type=&windowMs=&buckets=` — per-type analytics
|
|
37
|
+
* (latency percentiles, family/cache/status/exception breakdowns, throughput).
|
|
38
|
+
*/
|
|
39
|
+
metricsStats(ctx: UiHttpContext): Promise<unknown>;
|
|
40
|
+
/**
|
|
41
|
+
* `GET <path>/api/metrics/timeseries?windowMs=&buckets=&type=` — throughput
|
|
42
|
+
* over time (total + per-type per bucket).
|
|
43
|
+
*/
|
|
44
|
+
metricsTimeseries(ctx: UiHttpContext): Promise<unknown>;
|
|
45
|
+
/** `GET <path>/api/metrics/traces?limit=` — recent traces, newest-last-seen first. */
|
|
46
|
+
metricsTraces(ctx: UiHttpContext): Promise<unknown>;
|
|
47
|
+
/** `GET <path>/api/metrics/waterfall/:traceId` — span waterfall for one trace, or 404. */
|
|
48
|
+
metricsWaterfall(ctx: UiHttpContext, traceId: string): Promise<unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* `GET <path>/api/metrics/n-plus-one/:traceId?threshold=` — N+1 query-loop
|
|
51
|
+
* patterns within a trace (loop attribution + wasted-time ranking).
|
|
52
|
+
*/
|
|
53
|
+
metricsNPlusOne(ctx: UiHttpContext, traceId: string): Promise<unknown>;
|
|
54
|
+
/**
|
|
55
|
+
* `POST <path>/api/requests/:id/replay` — re-issue a captured `request` entry
|
|
56
|
+
* against the LOCAL server and report the outcome.
|
|
57
|
+
*
|
|
58
|
+
* This is a MUTATION (it actually hits the app, which may write), so it is
|
|
59
|
+
* DISABLED BY DEFAULT: when `replay.enabled` is false the endpoint answers
|
|
60
|
+
* `403` and never issues a call — mirroring the NestJS original's default-deny
|
|
61
|
+
* mutation gate. `404` when there is no `request` entry with that id. The full
|
|
62
|
+
* safety posture (same-origin only, credential stripping, bounded) lives in
|
|
63
|
+
* `src/ui/request_replay.ts`.
|
|
64
|
+
*/
|
|
65
|
+
replayRequest(ctx: UiHttpContext, id: string): Promise<unknown>;
|
|
28
66
|
}
|
|
29
67
|
/**
|
|
30
68
|
* A trimmed projection of an {@link Entry} for the list views — drops the
|
package/dist/src/ui/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/ui/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,aAAa,EAAoC,MAAM,qBAAqB,CAAC;AAO3F;;;;;GAKG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,+EAA+E;IAC/E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;gBAG3C,OAAO,EAAE,gBAAgB,EAC1C,cAAc,GAAE,qBAA0B,EAC1C,aAAa,GAAE,CAAC;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,aAAa,CAAC,GAAG,SAAqB;IAMhF;;;OAGG;IACG,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhD,gFAAgF;IAC1E,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW5D,iFAAiF;IAC3E,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlE;;;OAGG;IACG,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAcjD;;;OAGG;IACG,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBxD;;;OAGG;IACG,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB7D,sFAAsF;IAChF,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IASzD,0FAA0F;IACpF,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW7E;;;OAGG;IACG,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5E;;;;;;;;;;OAUG;IACG,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAoBtE;AAMD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAapD;AAqBD,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,GAAG,UAAU,CAgBzD"}
|
package/dist/src/ui/api.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { EntryType } from '../entry.js';
|
|
2
|
+
import { MetricsService } from '../metrics/metrics_service.js';
|
|
3
|
+
import { replayRequest } from './request_replay.js';
|
|
1
4
|
/** Default number of entries returned by the list endpoint when no `limit` is given. */
|
|
2
5
|
const DEFAULT_LIMIT = 50;
|
|
3
6
|
/** Hard ceiling on `limit` so a hostile query string can't ask for everything. */
|
|
@@ -10,8 +13,13 @@ const MAX_LIMIT = 500;
|
|
|
10
13
|
*/
|
|
11
14
|
export class TelescopeApi {
|
|
12
15
|
service;
|
|
13
|
-
|
|
16
|
+
metrics;
|
|
17
|
+
/** Request-replay settings (additive). Replay is disabled unless `enabled`. */
|
|
18
|
+
replay;
|
|
19
|
+
constructor(service, metricsOptions = {}, replayOptions = undefined) {
|
|
14
20
|
this.service = service;
|
|
21
|
+
this.metrics = new MetricsService(service.telescopeStore, metricsOptions);
|
|
22
|
+
this.replay = { enabled: false, ...replayOptions };
|
|
15
23
|
}
|
|
16
24
|
/**
|
|
17
25
|
* `GET <path>/api/entries` — list entries newest-first, with optional filters:
|
|
@@ -64,6 +72,113 @@ export class TelescopeApi {
|
|
|
64
72
|
.header('content-type', 'application/json')
|
|
65
73
|
.send({ data: { count, topFamilies, topTags } });
|
|
66
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* `GET <path>/api/metrics/stats?type=&windowMs=&buckets=` — per-type analytics
|
|
77
|
+
* (latency percentiles, family/cache/status/exception breakdowns, throughput).
|
|
78
|
+
*/
|
|
79
|
+
async metricsStats(ctx) {
|
|
80
|
+
const type = readString(ctx.request, 'type');
|
|
81
|
+
if (type === undefined) {
|
|
82
|
+
return ctx.response.status(400).send({ error: '`type` query parameter is required' });
|
|
83
|
+
}
|
|
84
|
+
const windowMs = readNumber(ctx.request, 'windowMs') ?? 3_600_000;
|
|
85
|
+
const buckets = readNumber(ctx.request, 'buckets');
|
|
86
|
+
try {
|
|
87
|
+
const data = await this.metrics.getStats({
|
|
88
|
+
type,
|
|
89
|
+
windowMs,
|
|
90
|
+
...(buckets !== undefined ? { buckets } : {}),
|
|
91
|
+
});
|
|
92
|
+
return ctx.response.status(200).header('content-type', 'application/json').send({ data });
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return ctx.response.status(400).send({ error: asMessage(err) });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* `GET <path>/api/metrics/timeseries?windowMs=&buckets=&type=` — throughput
|
|
100
|
+
* over time (total + per-type per bucket).
|
|
101
|
+
*/
|
|
102
|
+
async metricsTimeseries(ctx) {
|
|
103
|
+
const windowMs = readNumber(ctx.request, 'windowMs') ?? 3_600_000;
|
|
104
|
+
const buckets = readNumber(ctx.request, 'buckets');
|
|
105
|
+
const type = readString(ctx.request, 'type');
|
|
106
|
+
try {
|
|
107
|
+
const data = await this.metrics.getTimeseries({
|
|
108
|
+
windowMs,
|
|
109
|
+
...(buckets !== undefined ? { buckets } : {}),
|
|
110
|
+
...(type !== undefined ? { type } : {}),
|
|
111
|
+
});
|
|
112
|
+
return ctx.response.status(200).header('content-type', 'application/json').send({ data });
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
return ctx.response.status(400).send({ error: asMessage(err) });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** `GET <path>/api/metrics/traces?limit=` — recent traces, newest-last-seen first. */
|
|
119
|
+
async metricsTraces(ctx) {
|
|
120
|
+
const limit = clampLimit(readNumber(ctx.request, 'limit') ?? 50);
|
|
121
|
+
const data = await this.metrics.getTraces(limit);
|
|
122
|
+
return ctx.response
|
|
123
|
+
.status(200)
|
|
124
|
+
.header('content-type', 'application/json')
|
|
125
|
+
.send({ data, meta: { count: data.length } });
|
|
126
|
+
}
|
|
127
|
+
/** `GET <path>/api/metrics/waterfall/:traceId` — span waterfall for one trace, or 404. */
|
|
128
|
+
async metricsWaterfall(ctx, traceId) {
|
|
129
|
+
const data = await this.metrics.getWaterfall(traceId);
|
|
130
|
+
if (data === null) {
|
|
131
|
+
return ctx.response.status(404).send({ error: 'Trace not found' });
|
|
132
|
+
}
|
|
133
|
+
return ctx.response
|
|
134
|
+
.status(200)
|
|
135
|
+
.header('content-type', 'application/json')
|
|
136
|
+
.send({ data, meta: { traceId } });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* `GET <path>/api/metrics/n-plus-one/:traceId?threshold=` — N+1 query-loop
|
|
140
|
+
* patterns within a trace (loop attribution + wasted-time ranking).
|
|
141
|
+
*/
|
|
142
|
+
async metricsNPlusOne(ctx, traceId) {
|
|
143
|
+
const threshold = readNumber(ctx.request, 'threshold');
|
|
144
|
+
const data = await this.metrics.getNPlusOne(traceId, threshold);
|
|
145
|
+
return ctx.response
|
|
146
|
+
.status(200)
|
|
147
|
+
.header('content-type', 'application/json')
|
|
148
|
+
.send({ data, meta: { traceId, count: data.length } });
|
|
149
|
+
}
|
|
150
|
+
// — request replay (additive: kept in its own region for trivial merges) —
|
|
151
|
+
/**
|
|
152
|
+
* `POST <path>/api/requests/:id/replay` — re-issue a captured `request` entry
|
|
153
|
+
* against the LOCAL server and report the outcome.
|
|
154
|
+
*
|
|
155
|
+
* This is a MUTATION (it actually hits the app, which may write), so it is
|
|
156
|
+
* DISABLED BY DEFAULT: when `replay.enabled` is false the endpoint answers
|
|
157
|
+
* `403` and never issues a call — mirroring the NestJS original's default-deny
|
|
158
|
+
* mutation gate. `404` when there is no `request` entry with that id. The full
|
|
159
|
+
* safety posture (same-origin only, credential stripping, bounded) lives in
|
|
160
|
+
* `src/ui/request_replay.ts`.
|
|
161
|
+
*/
|
|
162
|
+
async replayRequest(ctx, id) {
|
|
163
|
+
if (!this.replay.enabled) {
|
|
164
|
+
return ctx.response
|
|
165
|
+
.status(403)
|
|
166
|
+
.send({ error: 'Request replay is disabled (set telescope_ui `replay.enabled: true`).' });
|
|
167
|
+
}
|
|
168
|
+
const entry = await this.service.find(id);
|
|
169
|
+
if (entry === null || entry.type !== EntryType.Request) {
|
|
170
|
+
return ctx.response.status(404).send({ error: 'No request entry with that id.' });
|
|
171
|
+
}
|
|
172
|
+
const { enabled: _enabled, ...replayOptions } = this.replay;
|
|
173
|
+
const result = await replayRequest(entry.content, replayOptions);
|
|
174
|
+
return ctx.response
|
|
175
|
+
.status(200)
|
|
176
|
+
.header('content-type', 'application/json')
|
|
177
|
+
.send({ data: result });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function asMessage(err) {
|
|
181
|
+
return err instanceof Error ? err.message : String(err);
|
|
67
182
|
}
|
|
68
183
|
/** Project an entry to its {@link EntrySummary}. */
|
|
69
184
|
export function toSummary(entry) {
|
package/dist/src/ui/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/ui/api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/ui/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,6 +52,27 @@ export interface TelescopeUiConfig {
|
|
|
52
52
|
* is supplied). Lets you gate a production dashboard without writing a hook.
|
|
53
53
|
*/
|
|
54
54
|
credentials?: UiCredentials;
|
|
55
|
+
/**
|
|
56
|
+
* Request REPLAY: re-issue a captured `request` entry against the LOCAL server
|
|
57
|
+
* from the dashboard. DISABLED BY DEFAULT — replaying re-runs a real request
|
|
58
|
+
* that may MUTATE state (a captured `POST`/`DELETE` runs again), so the host
|
|
59
|
+
* must opt in. When disabled, the replay endpoint answers `403`. See
|
|
60
|
+
* `src/ui/request_replay.ts` for the full safety posture (same-origin only,
|
|
61
|
+
* credential stripping, bounded, self-identifying).
|
|
62
|
+
*/
|
|
63
|
+
replay?: ReplayConfig;
|
|
64
|
+
}
|
|
65
|
+
/** Request-replay configuration (see {@link TelescopeUiConfig.replay}). */
|
|
66
|
+
export interface ReplayConfig {
|
|
67
|
+
/** Master switch for replay. Default `false` (safe: replay disabled). */
|
|
68
|
+
enabled?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* The local server port the replay targets (`127.0.0.1:<port>`). When omitted,
|
|
71
|
+
* the `PORT` env var is used, falling back to 3000.
|
|
72
|
+
*/
|
|
73
|
+
port?: number;
|
|
74
|
+
/** Per-call timeout in ms. Default 30000. */
|
|
75
|
+
timeoutMs?: number;
|
|
55
76
|
}
|
|
56
77
|
/** The fully-resolved config the provider acts on (no optionals on the basics). */
|
|
57
78
|
export interface ResolvedTelescopeUiConfig {
|
|
@@ -60,6 +81,12 @@ export interface ResolvedTelescopeUiConfig {
|
|
|
60
81
|
path: string;
|
|
61
82
|
authorize: AuthorizeHook;
|
|
62
83
|
credentials: UiCredentials;
|
|
84
|
+
/** Resolved request-replay settings (disabled by default). */
|
|
85
|
+
replay: {
|
|
86
|
+
enabled: boolean;
|
|
87
|
+
port?: number;
|
|
88
|
+
timeoutMs?: number;
|
|
89
|
+
};
|
|
63
90
|
}
|
|
64
91
|
/**
|
|
65
92
|
* Identity helper giving `config/telescope_ui.ts` full type-checking. Mirrors the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/ui/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/ui/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B;;;OAGG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAG5B;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mFAAmF;AACnF,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;IACzB,WAAW,EAAE,aAAa,CAAC;IAC3B,8DAA8D;IAC9D,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAEzE;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAiDD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,aAAa,GAAG,aAAa,CAS1E;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,MAAM,GAAE,iBAAsB,GAAG,yBAAyB,CAcvF"}
|
|
@@ -99,6 +99,12 @@ export function resolveConfig(config = {}) {
|
|
|
99
99
|
path: normalizePath(config.path ?? '/telescope'),
|
|
100
100
|
authorize: config.authorize ?? defaultAuthorize(credentials),
|
|
101
101
|
credentials,
|
|
102
|
+
replay: {
|
|
103
|
+
// Safe default: replay is OFF unless the host explicitly enables it.
|
|
104
|
+
enabled: config.replay?.enabled ?? false,
|
|
105
|
+
...(config.replay?.port !== undefined ? { port: config.replay.port } : {}),
|
|
106
|
+
...(config.replay?.timeoutMs !== undefined ? { timeoutMs: config.replay.timeoutMs } : {}),
|
|
107
|
+
},
|
|
102
108
|
};
|
|
103
109
|
}
|
|
104
110
|
//# sourceMappingURL=define_config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/ui/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/ui/define_config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/ui/http.d.ts
CHANGED
|
@@ -42,6 +42,46 @@ export declare class RecordingResponse implements UiResponse {
|
|
|
42
42
|
header(name: string, value: string): this;
|
|
43
43
|
send(body: unknown): unknown;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* The slice of an outbound HTTP response the SSE stream writes to: raw chunks plus
|
|
47
|
+
* a close handler. Framework-light so the stream handler is unit-testable with a
|
|
48
|
+
* plain in-memory sink (no running server). An Adonis `response.response` (the
|
|
49
|
+
* underlying Node `ServerResponse`) satisfies this structurally via
|
|
50
|
+
* `writeHead`/`write`/`end`/`on('close')`.
|
|
51
|
+
*/
|
|
52
|
+
export interface SseSink {
|
|
53
|
+
/** Write a raw chunk (a fully-formatted SSE frame) to the socket. */
|
|
54
|
+
write(chunk: string): void;
|
|
55
|
+
/** Register a one-shot client-disconnect handler; returns nothing. */
|
|
56
|
+
onClose(handler: () => void): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format one Server-Sent-Events frame. `data` is JSON-encoded onto a single
|
|
60
|
+
* `data:` line; an optional `event` name is prefixed. Always terminated by the
|
|
61
|
+
* blank line that delimits SSE frames.
|
|
62
|
+
*
|
|
63
|
+
* ```text
|
|
64
|
+
* event: entry\n
|
|
65
|
+
* data: {"type":"request",...}\n
|
|
66
|
+
* \n
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export declare function formatSseFrame(data: unknown, event?: string): string;
|
|
70
|
+
/** A comment-only SSE keep-alive line (ignored by clients, keeps the socket warm). */
|
|
71
|
+
export declare function formatSseHeartbeat(): string;
|
|
72
|
+
/**
|
|
73
|
+
* A tiny in-memory {@link SseSink} for tests: captures every written frame and
|
|
74
|
+
* lets a test trigger the client-disconnect path via {@link RecordingSink.close}.
|
|
75
|
+
*/
|
|
76
|
+
export declare class RecordingSink implements SseSink {
|
|
77
|
+
readonly chunks: string[];
|
|
78
|
+
closed: boolean;
|
|
79
|
+
private readonly closeHandlers;
|
|
80
|
+
write(chunk: string): void;
|
|
81
|
+
onClose(handler: () => void): void;
|
|
82
|
+
/** Simulate a client disconnect, firing every registered close handler once. */
|
|
83
|
+
close(): void;
|
|
84
|
+
}
|
|
45
85
|
/** Build a plain {@link UiRequest} from a method, query record, and headers. */
|
|
46
86
|
export declare function makeRequest(method: string, qs?: Record<string, unknown>, headers?: Record<string, string>): UiRequest;
|
|
47
87
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/ui/http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,MAAM,IAAI,MAAM,CAAC;IACjB,wEAAwE;IACxE,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,8EAA8E;IAC9E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAChD,6DAA6D;IAC7D,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CAC9B;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,UAAU;IAClD,UAAU,SAAO;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAC9C,IAAI,EAAE,OAAO,CAAa;IAC1B,IAAI,UAAS;IAEb,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;CAK7B;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,EAAE,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAChC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,SAAS,CAQX"}
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/ui/http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,MAAM,IAAI,MAAM,CAAC;IACjB,wEAAwE;IACxE,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,uDAAuD;AACvD,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACjC,8EAA8E;IAC9E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAChD,6DAA6D;IAC7D,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;CAC9B;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,UAAU;IAClD,UAAU,SAAO;IACjB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAC9C,IAAI,EAAE,OAAO,CAAa;IAC1B,IAAI,UAAS;IAEb,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;CAK7B;AAKD;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACtB,qEAAqE;IACrE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sEAAsE;IACtE,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAM;IAC/B,MAAM,UAAS;IACf,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,gFAAgF;IAChF,KAAK,IAAI,IAAI;CAKd;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,EAAE,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAChC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACnC,SAAS,CAQX"}
|
package/dist/src/ui/http.js
CHANGED
|
@@ -29,6 +29,49 @@ export class RecordingResponse {
|
|
|
29
29
|
return body;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Format one Server-Sent-Events frame. `data` is JSON-encoded onto a single
|
|
34
|
+
* `data:` line; an optional `event` name is prefixed. Always terminated by the
|
|
35
|
+
* blank line that delimits SSE frames.
|
|
36
|
+
*
|
|
37
|
+
* ```text
|
|
38
|
+
* event: entry\n
|
|
39
|
+
* data: {"type":"request",...}\n
|
|
40
|
+
* \n
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function formatSseFrame(data, event) {
|
|
44
|
+
const payload = JSON.stringify(data);
|
|
45
|
+
const prefix = event !== undefined ? `event: ${event}\n` : '';
|
|
46
|
+
return `${prefix}data: ${payload}\n\n`;
|
|
47
|
+
}
|
|
48
|
+
/** A comment-only SSE keep-alive line (ignored by clients, keeps the socket warm). */
|
|
49
|
+
export function formatSseHeartbeat() {
|
|
50
|
+
return ': heartbeat\n\n';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A tiny in-memory {@link SseSink} for tests: captures every written frame and
|
|
54
|
+
* lets a test trigger the client-disconnect path via {@link RecordingSink.close}.
|
|
55
|
+
*/
|
|
56
|
+
export class RecordingSink {
|
|
57
|
+
chunks = [];
|
|
58
|
+
closed = false;
|
|
59
|
+
closeHandlers = [];
|
|
60
|
+
write(chunk) {
|
|
61
|
+
this.chunks.push(chunk);
|
|
62
|
+
}
|
|
63
|
+
onClose(handler) {
|
|
64
|
+
this.closeHandlers.push(handler);
|
|
65
|
+
}
|
|
66
|
+
/** Simulate a client disconnect, firing every registered close handler once. */
|
|
67
|
+
close() {
|
|
68
|
+
if (this.closed)
|
|
69
|
+
return;
|
|
70
|
+
this.closed = true;
|
|
71
|
+
for (const handler of this.closeHandlers.splice(0))
|
|
72
|
+
handler();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
32
75
|
/** Build a plain {@link UiRequest} from a method, query record, and headers. */
|
|
33
76
|
export function makeRequest(method, qs = {}, headers = {}) {
|
|
34
77
|
const lower = {};
|