@djangocfg/debuger 2.1.219
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/README.md +345 -0
- package/dist/chunk-ESIQODSI.mjs +115 -0
- package/dist/chunk-ESIQODSI.mjs.map +1 -0
- package/dist/chunk-PAWJFY3S.mjs +6 -0
- package/dist/chunk-PAWJFY3S.mjs.map +1 -0
- package/dist/chunk-YQE3KTBG.mjs +64 -0
- package/dist/chunk-YQE3KTBG.mjs.map +1 -0
- package/dist/customEmitter-BO-1IWxm.d.ts +57 -0
- package/dist/emitters/index.cjs +74 -0
- package/dist/emitters/index.cjs.map +1 -0
- package/dist/emitters/index.d.ts +33 -0
- package/dist/emitters/index.mjs +4 -0
- package/dist/emitters/index.mjs.map +1 -0
- package/dist/index.cjs +887 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +162 -0
- package/dist/index.mjs +694 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger/index.cjs +123 -0
- package/dist/logger/index.cjs.map +1 -0
- package/dist/logger/index.d.ts +50 -0
- package/dist/logger/index.mjs +4 -0
- package/dist/logger/index.mjs.map +1 -0
- package/package.json +67 -0
- package/src/DebugButton.tsx +143 -0
- package/src/DebugPanel.tsx +171 -0
- package/src/bridges/index.ts +1 -0
- package/src/bridges/monitorBridge.ts +63 -0
- package/src/emitters/Emitter.ts +51 -0
- package/src/emitters/audioEmitter.ts +74 -0
- package/src/emitters/customEmitter.ts +42 -0
- package/src/emitters/index.ts +10 -0
- package/src/hooks/useAudioEventLog.ts +147 -0
- package/src/hooks/useCustomEventLog.ts +39 -0
- package/src/hooks/useDebugShortcut.ts +27 -0
- package/src/hooks/useStoreSnapshot.ts +70 -0
- package/src/index.ts +62 -0
- package/src/logger/index.ts +3 -0
- package/src/logger/logStore.ts +89 -0
- package/src/logger/logger.ts +95 -0
- package/src/logger/types.ts +39 -0
- package/src/panels/AudioDebugPanel.tsx +157 -0
- package/src/panels/LogsPanel.tsx +267 -0
- package/src/panels/StorePanel.tsx +71 -0
- package/src/store/debugStore.ts +42 -0
- package/src/styles/index.css +5 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
|
|
6
|
+
// src/emitters/Emitter.ts
|
|
7
|
+
var _Emitter = class _Emitter {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.listeners = /* @__PURE__ */ new Map();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Emit an event. No-op if no listeners are registered.
|
|
13
|
+
*/
|
|
14
|
+
emit(event, data) {
|
|
15
|
+
const handlers = this.listeners.get(event);
|
|
16
|
+
if (!handlers || handlers.size === 0) return;
|
|
17
|
+
handlers.forEach((h) => h(data));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Subscribe to an event. Returns an unsubscribe function.
|
|
21
|
+
*/
|
|
22
|
+
on(event, handler) {
|
|
23
|
+
if (!this.listeners.has(event)) {
|
|
24
|
+
this.listeners.set(event, /* @__PURE__ */ new Set());
|
|
25
|
+
}
|
|
26
|
+
this.listeners.get(event).add(handler);
|
|
27
|
+
return () => this.listeners.get(event)?.delete(handler);
|
|
28
|
+
}
|
|
29
|
+
/** True when at least one listener is registered for this event (hot-path guard) */
|
|
30
|
+
hasListeners(event) {
|
|
31
|
+
return (this.listeners.get(event)?.size ?? 0) > 0;
|
|
32
|
+
}
|
|
33
|
+
/** Remove all listeners (useful for testing / cleanup) */
|
|
34
|
+
clear() {
|
|
35
|
+
this.listeners.clear();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
__name(_Emitter, "Emitter");
|
|
39
|
+
var Emitter = _Emitter;
|
|
40
|
+
|
|
41
|
+
// src/emitters/audioEmitter.ts
|
|
42
|
+
var _emitter = new Emitter();
|
|
43
|
+
var BUFFER_SIZE = 200;
|
|
44
|
+
var _buffer = [];
|
|
45
|
+
var emitAudioEvent = /* @__PURE__ */ __name((event) => {
|
|
46
|
+
if (_buffer.length >= BUFFER_SIZE) _buffer.shift();
|
|
47
|
+
_buffer.push(event);
|
|
48
|
+
_emitter.emit("event", event);
|
|
49
|
+
}, "emitAudioEvent");
|
|
50
|
+
var subscribeAudioEvents = /* @__PURE__ */ __name((fn) => {
|
|
51
|
+
for (const e of _buffer) fn(e);
|
|
52
|
+
return _emitter.on("event", fn);
|
|
53
|
+
}, "subscribeAudioEvents");
|
|
54
|
+
var clearAudioEventBuffer = /* @__PURE__ */ __name(() => {
|
|
55
|
+
_buffer.length = 0;
|
|
56
|
+
}, "clearAudioEventBuffer");
|
|
57
|
+
var hasAudioListeners = /* @__PURE__ */ __name(() => _emitter.hasListeners("event"), "hasAudioListeners");
|
|
58
|
+
|
|
59
|
+
// src/emitters/customEmitter.ts
|
|
60
|
+
var _emitter2 = new Emitter();
|
|
61
|
+
var emitDebugEvent = /* @__PURE__ */ __name((event) => _emitter2.emit("event", event), "emitDebugEvent");
|
|
62
|
+
var subscribeCustomEvents = /* @__PURE__ */ __name((fn) => _emitter2.on("event", fn), "subscribeCustomEvents");
|
|
63
|
+
var hasCustomListeners = /* @__PURE__ */ __name(() => _emitter2.hasListeners("event"), "hasCustomListeners");
|
|
64
|
+
|
|
65
|
+
exports.Emitter = Emitter;
|
|
66
|
+
exports.clearAudioEventBuffer = clearAudioEventBuffer;
|
|
67
|
+
exports.emitAudioEvent = emitAudioEvent;
|
|
68
|
+
exports.emitDebugEvent = emitDebugEvent;
|
|
69
|
+
exports.hasAudioListeners = hasAudioListeners;
|
|
70
|
+
exports.hasCustomListeners = hasCustomListeners;
|
|
71
|
+
exports.subscribeAudioEvents = subscribeAudioEvents;
|
|
72
|
+
exports.subscribeCustomEvents = subscribeCustomEvents;
|
|
73
|
+
//# sourceMappingURL=index.cjs.map
|
|
74
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/emitters/Emitter.ts","../../src/emitters/audioEmitter.ts","../../src/emitters/customEmitter.ts"],"names":["_emitter"],"mappings":";;;;;;AAiBO,IAAM,QAAA,GAAN,MAAM,QAAA,CAAkC;AAAA,EAAxC,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAiD;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKzE,IAAA,CAA8B,OAAU,IAAA,EAAwB;AAC9D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,CAAA,EAAG;AACtC,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CAA4B,OAAU,OAAA,EAAiD;AACrF,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACrC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,OAAc,CAAA;AAC7C,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,EAAG,OAAO,OAAc,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,aAAsC,KAAA,EAAmB;AACvD,IAAA,OAAA,CAAQ,KAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,QAAQ,CAAA,IAAK,CAAA;AAAA,EAClD;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF,CAAA;AAjC+C,MAAA,CAAA,QAAA,EAAA,SAAA,CAAA;AAAxC,IAAM,OAAA,GAAN;;;AC2BP,IAAM,QAAA,GAAW,IAAI,OAAA,EAAqB;AAG1C,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,UAA6B,EAAC;AAG7B,IAAM,cAAA,2BAAkB,KAAA,KAAiC;AAE9D,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,WAAA,EAAa,OAAA,CAAQ,KAAA,EAAM;AACjD,EAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AAC9B,CAAA,EAL8B,gBAAA;AAYvB,IAAM,oBAAA,2BAAwB,EAAA,KAAmD;AAEtF,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,EAAA,CAAG,CAAC,CAAA;AAC7B,EAAA,OAAO,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,EAAE,CAAA;AAChC,CAAA,EAJoC,sBAAA;AAO7B,IAAM,wCAAwB,MAAA,CAAA,MAAY;AAAE,EAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAG,CAAA,EAAlC,uBAAA;AAG9B,IAAM,iBAAA,mBAAoB,MAAA,CAAA,MAAe,QAAA,CAAS,YAAA,CAAa,OAAO,CAAA,EAA5C,mBAAA;;;AC1CjC,IAAMA,SAAAA,GAAW,IAAI,OAAA,EAAsB;AAGpC,IAAM,iCAAiB,MAAA,CAAA,CAAC,KAAA,KAC7BA,UAAS,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA,EADA,gBAAA;AAIvB,IAAM,wCAAwB,MAAA,CAAA,CAAC,EAAA,KACpCA,UAAS,EAAA,CAAG,OAAA,EAAS,EAAE,CAAA,EADY,uBAAA;AAG9B,IAAM,kBAAA,mBAAqB,MAAA,CAAA,MAAeA,SAAAA,CAAS,YAAA,CAAa,OAAO,CAAA,EAA5C,oBAAA","file":"index.cjs","sourcesContent":["/**\n * Generic typed event emitter\n *\n * Zero-cost: emit() is a no-op when no listeners are registered for an event.\n * SSR-safe: no browser APIs used.\n * No dependencies.\n *\n * Usage:\n * type MyEvents = { 'user:login': { id: string }; 'page:view': { path: string } };\n * export const myEmitter = new Emitter<MyEvents>();\n * myEmitter.on('user:login', ({ id }) => console.log(id));\n * myEmitter.emit('user:login', { id: '123' });\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventMap = Record<string, any>;\n\nexport class Emitter<TEvents extends EventMap> {\n private listeners = new Map<keyof TEvents, Set<(data: unknown) => void>>();\n\n /**\n * Emit an event. No-op if no listeners are registered.\n */\n emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void {\n const handlers = this.listeners.get(event);\n if (!handlers || handlers.size === 0) return;\n handlers.forEach((h) => h(data));\n }\n\n /**\n * Subscribe to an event. Returns an unsubscribe function.\n */\n on<K extends keyof TEvents>(event: K, handler: (data: TEvents[K]) => void): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.listeners.get(event)!.add(handler as any);\n return () => this.listeners.get(event)?.delete(handler as any);\n }\n\n /** True when at least one listener is registered for this event (hot-path guard) */\n hasListeners<K extends keyof TEvents>(event: K): boolean {\n return (this.listeners.get(event)?.size ?? 0) > 0;\n }\n\n /** Remove all listeners (useful for testing / cleanup) */\n clear(): void {\n this.listeners.clear();\n }\n}\n","/**\n * Audio/Media Engine Event Emitter\n *\n * Universal zero-cost pub/sub for audio/media player debug events.\n * No React dependency — pure TypeScript module.\n *\n * Wire into your audio engine:\n * import { emitAudioEvent } from '@org/debuger/emitters';\n * emitAudioEvent({ kind: 'play', trackId: 'abc', ts: Date.now(), msg: 'started' });\n */\n\nimport { Emitter } from './Emitter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type AudioEventKind =\n | 'play'\n | 'pause'\n | 'seek'\n | 'ended'\n | 'sync' // periodic sync tick (RAF loop)\n | 'load'\n | 'error'\n | 'engine' // engine lifecycle: start/stop/create/destroy\n | 'custom';\n\nexport interface AudioDebugEvent {\n kind: AudioEventKind;\n ts: number;\n /** Track/player ID (short prefix) */\n trackId?: string;\n msg: string;\n /** Arbitrary metadata: positions, drift, etc. */\n data?: Record<string, unknown>;\n}\n\ntype AudioEvents = { event: AudioDebugEvent };\n\n// ============================================================================\n// Singleton emitter + ring-buffer\n// ============================================================================\n\nconst _emitter = new Emitter<AudioEvents>();\n\n/** Ring-buffer of recent events — replayed to new subscribers */\nconst BUFFER_SIZE = 200;\nconst _buffer: AudioDebugEvent[] = [];\n\n/** Emit an audio debug event. Zero-cost when no panel is open. */\nexport const emitAudioEvent = (event: AudioDebugEvent): void => {\n // Always buffer (capped) so late subscribers get recent history\n if (_buffer.length >= BUFFER_SIZE) _buffer.shift();\n _buffer.push(event);\n _emitter.emit('event', event);\n};\n\n/**\n * Subscribe to audio debug events.\n * Immediately replays buffered events to the new subscriber,\n * then delivers live events. Returns unsubscribe function.\n */\nexport const subscribeAudioEvents = (fn: (e: AudioDebugEvent) => void): (() => void) => {\n // Replay history so the panel sees events that happened before it opened\n for (const e of _buffer) fn(e);\n return _emitter.on('event', fn);\n};\n\n/** Clear the ring-buffer (called from the panel's Clear button) */\nexport const clearAudioEventBuffer = (): void => { _buffer.length = 0; };\n\n/** True when at least one listener is active (use as hot-path guard) */\nexport const hasAudioListeners = (): boolean => _emitter.hasListeners('event');\n","/**\n * Custom Debug Event Emitter\n *\n * Generic channel for consuming apps to send arbitrary debug events\n * without coupling to any specific domain.\n *\n * import { emitDebugEvent } from '@org/debuger/emitters';\n * emitDebugEvent({ channel: 'pipeline', kind: 'slot:updated', ts: Date.now(), msg: '...' });\n */\n\nimport { Emitter } from './Emitter';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CustomDebugEvent {\n /** Logical grouping — matches registered custom tab id */\n channel: string;\n kind: string;\n ts: number;\n msg: string;\n data?: Record<string, unknown>;\n}\n\ntype CustomEvents = { event: CustomDebugEvent };\n\n// ============================================================================\n// Singleton emitter\n// ============================================================================\n\nconst _emitter = new Emitter<CustomEvents>();\n\n/** Emit a custom debug event. Zero-cost when no panel is open. */\nexport const emitDebugEvent = (event: CustomDebugEvent): void =>\n _emitter.emit('event', event);\n\n/** Subscribe to custom debug events. Returns unsubscribe function. */\nexport const subscribeCustomEvents = (fn: (e: CustomDebugEvent) => void): (() => void) =>\n _emitter.on('event', fn);\n\nexport const hasCustomListeners = (): boolean => _emitter.hasListeners('event');\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export { A as AudioDebugEvent, a as AudioEventKind, C as CustomDebugEvent, c as clearAudioEventBuffer, e as emitAudioEvent, d as emitDebugEvent, h as hasAudioListeners, f as hasCustomListeners, s as subscribeAudioEvents, b as subscribeCustomEvents } from '../customEmitter-BO-1IWxm.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generic typed event emitter
|
|
5
|
+
*
|
|
6
|
+
* Zero-cost: emit() is a no-op when no listeners are registered for an event.
|
|
7
|
+
* SSR-safe: no browser APIs used.
|
|
8
|
+
* No dependencies.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* type MyEvents = { 'user:login': { id: string }; 'page:view': { path: string } };
|
|
12
|
+
* export const myEmitter = new Emitter<MyEvents>();
|
|
13
|
+
* myEmitter.on('user:login', ({ id }) => console.log(id));
|
|
14
|
+
* myEmitter.emit('user:login', { id: '123' });
|
|
15
|
+
*/
|
|
16
|
+
type EventMap = Record<string, any>;
|
|
17
|
+
declare class Emitter<TEvents extends EventMap> {
|
|
18
|
+
private listeners;
|
|
19
|
+
/**
|
|
20
|
+
* Emit an event. No-op if no listeners are registered.
|
|
21
|
+
*/
|
|
22
|
+
emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void;
|
|
23
|
+
/**
|
|
24
|
+
* Subscribe to an event. Returns an unsubscribe function.
|
|
25
|
+
*/
|
|
26
|
+
on<K extends keyof TEvents>(event: K, handler: (data: TEvents[K]) => void): () => void;
|
|
27
|
+
/** True when at least one listener is registered for this event (hot-path guard) */
|
|
28
|
+
hasListeners<K extends keyof TEvents>(event: K): boolean;
|
|
29
|
+
/** Remove all listeners (useful for testing / cleanup) */
|
|
30
|
+
clear(): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { Emitter };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Emitter, clearAudioEventBuffer, emitAudioEvent, emitDebugEvent, hasAudioListeners, hasCustomListeners, subscribeAudioEvents, subscribeCustomEvents } from '../chunk-YQE3KTBG.mjs';
|
|
2
|
+
import '../chunk-PAWJFY3S.mjs';
|
|
3
|
+
//# sourceMappingURL=index.mjs.map
|
|
4
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|