@playfast/reform-profiler 1.0.2 → 1.2.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.
Files changed (53) hide show
  1. package/dist/index.d.ts +6 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +6 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/noop.d.ts +23 -0
  6. package/dist/noop.d.ts.map +1 -0
  7. package/dist/noop.js +41 -0
  8. package/dist/noop.js.map +1 -0
  9. package/dist/profileScene.d.ts +12 -0
  10. package/dist/profileScene.d.ts.map +1 -0
  11. package/dist/profileScene.js +32 -0
  12. package/dist/profileScene.js.map +1 -0
  13. package/dist/react/index.d.ts +2 -0
  14. package/dist/react/index.d.ts.map +1 -0
  15. package/dist/react/index.js +2 -0
  16. package/dist/react/index.js.map +1 -0
  17. package/dist/react/noop.d.ts +5 -0
  18. package/dist/react/noop.d.ts.map +1 -0
  19. package/dist/react/noop.js +3 -0
  20. package/dist/react/noop.js.map +1 -0
  21. package/dist/react/overlay.d.ts +5 -0
  22. package/dist/react/overlay.d.ts.map +1 -0
  23. package/dist/react/overlay.js +70 -0
  24. package/dist/react/overlay.js.map +1 -0
  25. package/dist/react/styles.d.ts +23 -0
  26. package/dist/react/styles.d.ts.map +1 -0
  27. package/dist/react/styles.js +91 -0
  28. package/dist/react/styles.js.map +1 -0
  29. package/dist/recorder.d.ts +38 -0
  30. package/dist/recorder.d.ts.map +1 -0
  31. package/dist/recorder.js +82 -0
  32. package/dist/recorder.js.map +1 -0
  33. package/dist/registry.d.ts +12 -0
  34. package/dist/registry.d.ts.map +1 -0
  35. package/dist/registry.js +57 -0
  36. package/dist/registry.js.map +1 -0
  37. package/dist/report.d.ts +3 -0
  38. package/dist/report.d.ts.map +1 -0
  39. package/dist/report.js +48 -0
  40. package/dist/report.js.map +1 -0
  41. package/dist/trace.d.ts +36 -0
  42. package/dist/trace.d.ts.map +1 -0
  43. package/dist/trace.js +58 -0
  44. package/dist/trace.js.map +1 -0
  45. package/package.json +42 -24
  46. package/src/index.ts +1 -1
  47. package/src/noop.ts +48 -12
  48. package/src/profileScene.ts +85 -19
  49. package/src/profiler.test.ts +38 -10
  50. package/src/react/overlay.tsx +3 -1
  51. package/src/recorder.ts +2 -3
  52. package/src/registry.ts +4 -1
  53. package/src/trace.ts +19 -2
@@ -0,0 +1,6 @@
1
+ export { makeProfiler, type ProfileKind, type ProfileRecord, type ProfilerHandle, type ProfilerOptionsExternalApi, type ProfileSnapshot, type ProfileStat, } from './recorder.js';
2
+ export { type CapturedProfiledScene, type ProfiledScene, profileScene } from './profileScene.js';
3
+ export { type ChromeTrace, type ChromeTraceEvent, toChromeTrace, traceJson } from './trace.js';
4
+ export { formatReport } from './report.js';
5
+ export { claimOverlay, listProfilers, type ProfilerRegistration, profilersVersion, registerProfiler, releaseOverlay, subscribeProfilers, } from './registry.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7F,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { makeProfiler, } from './recorder.js';
2
+ export { profileScene } from './profileScene.js';
3
+ export { toChromeTrace, traceJson } from './trace.js';
4
+ export { formatReport } from './report.js';
5
+ export { claimOverlay, listProfilers, profilersVersion, registerProfiler, releaseOverlay, subscribeProfilers, } from './registry.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAOb,MAAM,YAAY,CAAA;AACnB,OAAO,EAAkD,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7F,OAAO,EAA2C,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EACL,YAAY,EACZ,aAAa,EAEb,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAA"}
package/dist/noop.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import { type CapturedScene, type Scene, type UiContract } from '@playfast/reform';
2
+ import type { CapturedProfiledScene, ProfiledScene } from './profileScene.js';
3
+ import type { ProfilerHandle, ProfilerOptionsExternalApi } from './recorder.js';
4
+ import type { ProfilerRegistration } from './registry.js';
5
+ import type { ChromeTrace } from './trace.js';
6
+ export type { ProfileKind, ProfileRecord, ProfilerHandle, ProfilerOptionsExternalApi, ProfileSnapshot, ProfileStat, } from './recorder.js';
7
+ export type { CapturedProfiledScene, ProfiledScene } from './profileScene.js';
8
+ export type { ChromeTrace, ChromeTraceEvent } from './trace.js';
9
+ export type { ProfilerRegistration } from './registry.js';
10
+ export declare const noopProfiler: ProfilerHandle;
11
+ export declare const makeProfiler: (_options?: ProfilerOptionsExternalApi) => ProfilerHandle;
12
+ export declare function profileScene<C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(base: CapturedScene<C, S, Services, P, N, Identity>, _options?: ProfilerOptionsExternalApi): CapturedProfiledScene<C, S, Services, P, N, Identity>;
13
+ export declare function profileScene<C extends UiContract, S extends ReadonlyArray<unknown>>(base: Scene<C, S>, _options?: ProfilerOptionsExternalApi): ProfiledScene<C, S>;
14
+ export declare const toChromeTrace: (_profiler: ProfilerHandle) => ChromeTrace;
15
+ export declare const traceJson: (_profiler: ProfilerHandle) => string;
16
+ export declare const formatReport: (_profiler: ProfilerHandle) => string;
17
+ export declare const registerProfiler: (_registration: ProfilerRegistration) => (() => void);
18
+ export declare const listProfilers: () => ReadonlyArray<ProfilerRegistration>;
19
+ export declare const subscribeProfilers: (_listener: () => void) => (() => void);
20
+ export declare const profilersVersion: () => number;
21
+ export declare const claimOverlay: (_owner: object) => boolean;
22
+ export declare const releaseOverlay: (_owner: object) => void;
23
+ //# sourceMappingURL=noop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElF,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,0BAA0B,EAAmB,MAAM,YAAY,CAAA;AAC7F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI1C,YAAY,EACV,WAAW,EACX,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC1E,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC5D,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAetD,eAAO,MAAM,YAAY,EAAE,cAO1B,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,WAAU,0BAA+B,KAAG,cAC3D,CAAA;AAgBd,wBAAgB,YAAY,CAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACnD,QAAQ,CAAC,EAAE,0BAA0B,GACpC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;AACxD,wBAAgB,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EACjF,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,QAAQ,CAAC,EAAE,0BAA0B,GACpC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AActB,eAAO,MAAM,aAAa,GAAI,WAAW,cAAc,KAAG,WAAyB,CAAA;AAEnF,eAAO,MAAM,SAAS,GAAI,WAAW,cAAc,KAAG,MACT,CAAA;AAE7C,eAAO,MAAM,YAAY,GAAI,WAAW,cAAc,KAAG,MAAY,CAAA;AAErE,eAAO,MAAM,gBAAgB,GAC1B,eAAe,oBAAoB,KAAG,CAAC,MAAM,IAAI,CAC1C,CAAA;AAEV,eAAO,MAAM,aAAa,QAAO,aAAa,CAAC,oBAAoB,CAAO,CAAA;AAE1E,eAAO,MAAM,kBAAkB,GAC5B,WAAW,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAC5B,CAAA;AAEV,eAAO,MAAM,gBAAgB,QAAO,MAAW,CAAA;AAE/C,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,OAAgB,CAAA;AAE9D,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,IAAU,CAAA"}
package/dist/noop.js ADDED
@@ -0,0 +1,41 @@
1
+ import {} from '@playfast/reform';
2
+ import { noopInstrumentation } from '@playfast/reform/internal';
3
+ const emptySnapshot = {
4
+ events: new Map(),
5
+ reducers: new Map(),
6
+ states: new Map(),
7
+ calcs: new Map(),
8
+ queries: new Map(),
9
+ procedures: new Map(),
10
+ renders: new Map(),
11
+ frames: { count: 0, totalMs: 0 },
12
+ records: [],
13
+ dropped: 0,
14
+ };
15
+ export const noopProfiler = {
16
+ ...noopInstrumentation,
17
+ label: 'noop',
18
+ snapshot: () => emptySnapshot,
19
+ clear: () => { },
20
+ subscribe: () => () => { },
21
+ getVersion: () => 0,
22
+ };
23
+ export const makeProfiler = (_options = {}) => noopProfiler;
24
+ const profileCapturedScene = (base) => ({
25
+ scene: base,
26
+ profiler: noopProfiler,
27
+ });
28
+ export function profileScene(base, _options = {}) {
29
+ return base.capture((exactScene) => profileCapturedScene(exactScene));
30
+ }
31
+ const emptyTrace = { traceEvents: [], displayTimeUnit: 'ms' };
32
+ export const toChromeTrace = (_profiler) => emptyTrace;
33
+ export const traceJson = (_profiler) => '{"traceEvents":[],"displayTimeUnit":"ms"}';
34
+ export const formatReport = (_profiler) => '';
35
+ export const registerProfiler = (_registration) => () => { };
36
+ export const listProfilers = () => [];
37
+ export const subscribeProfilers = (_listener) => () => { };
38
+ export const profilersVersion = () => 0;
39
+ export const claimOverlay = (_owner) => false;
40
+ export const releaseOverlay = (_owner) => { };
41
+ //# sourceMappingURL=noop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAoB/D,MAAM,aAAa,GAAoB;IACrC,MAAM,EAAE,IAAI,GAAG,EAAE;IACjB,QAAQ,EAAE,IAAI,GAAG,EAAE;IACnB,MAAM,EAAE,IAAI,GAAG,EAAE;IACjB,KAAK,EAAE,IAAI,GAAG,EAAE;IAChB,OAAO,EAAE,IAAI,GAAG,EAAE;IAClB,UAAU,EAAE,IAAI,GAAG,EAAE;IACrB,OAAO,EAAE,IAAI,GAAG,EAAE;IAClB,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;IAChC,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,CAAC;CACX,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,GAAG,mBAAmB;IACtB,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,GAAG,EAAE,CAAC,aAAa;IAC7B,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;IACzB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;CACpB,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAuC,EAAE,EAAkB,EAAE,CACxF,YAAY,CAAA;AAEd,MAAM,oBAAoB,GAAG,CAQ3B,IAAmD,EACI,EAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,YAAY;CACvB,CAAC,CAAA;AAiBF,MAAM,UAAU,YAAY,CAC1B,IAAiB,EACjB,WAAuC,EAAE;IAEzC,OAAO,IAAI,CAAC,OAAO,CACjB,CACE,UAAyD,EACpC,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAC3D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,GAAgB,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAA;AAE1E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAyB,EAAe,EAAE,CAAC,UAAU,CAAA;AAEnF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAyB,EAAU,EAAE,CAC7D,2CAA2C,CAAA;AAE7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAyB,EAAU,EAAE,CAAC,EAAE,CAAA;AAErE,MAAM,CAAC,MAAM,gBAAgB,GAC3B,CAAC,aAAmC,EAAgB,EAAE,CACtD,GAAG,EAAE,GAAE,CAAC,CAAA;AAEV,MAAM,CAAC,MAAM,aAAa,GAAG,GAAwC,EAAE,CAAC,EAAE,CAAA;AAE1E,MAAM,CAAC,MAAM,kBAAkB,GAC7B,CAAC,SAAqB,EAAgB,EAAE,CACxC,GAAG,EAAE,GAAE,CAAC,CAAA;AAEV,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,CAAC,CAAA;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,KAAK,CAAA;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAQ,EAAE,GAAE,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { type CapturedScene, type Scene, type UiContract } from '@playfast/reform';
2
+ import { type ProfilerHandle, type ProfilerOptionsExternalApi } from './recorder.js';
3
+ export interface ProfiledScene<C extends UiContract = UiContract, S extends ReadonlyArray<unknown> = ReadonlyArray<unknown>> {
4
+ readonly scene: Scene<C, S>;
5
+ readonly profiler: ProfilerHandle;
6
+ }
7
+ export interface CapturedProfiledScene<C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity> extends ProfiledScene<C, S> {
8
+ readonly scene: CapturedScene<C, S, Services, P, N, Identity>;
9
+ }
10
+ export declare function profileScene<C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(base: CapturedScene<C, S, Services, P, N, Identity>, options?: ProfilerOptionsExternalApi): CapturedProfiledScene<C, S, Services, P, N, Identity>;
11
+ export declare function profileScene<C extends UiContract, S extends ReadonlyArray<unknown>>(base: Scene<C, S>, options?: ProfilerOptionsExternalApi): ProfiledScene<C, S>;
12
+ //# sourceMappingURL=profileScene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileScene.d.ts","sourceRoot":"","sources":["../src/profileScene.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEjG,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAG/F,MAAM,WAAW,aAAa,CAC5B,CAAC,SAAS,UAAU,GAAG,UAAU,EACjC,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC;IAEzD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;CAClC;AAED,MAAM,WAAW,qBAAqB,CACpC,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,CACR,SAAQ,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;CAC9D;AAoDD,wBAAgB,YAAY,CAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACnD,OAAO,CAAC,EAAE,0BAA0B,GACnC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;AACxD,wBAAgB,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EACjF,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,OAAO,CAAC,EAAE,0BAA0B,GACnC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { Effect, Layer } from 'effect';
2
+ import { profiledScene } from '@playfast/reform';
3
+ import {} from '@playfast/reform/internal';
4
+ import { makeProfiler } from './recorder.js';
5
+ import { registerProfiler } from './registry.js';
6
+ const makeLifecycle = (profiler) => Layer.scopedDiscard(Effect.acquireRelease(Effect.sync(() => registerProfiler({ label: profiler.label, handle: profiler })), (unregister) => Effect.sync(unregister)));
7
+ const withLifecycle = (base, lifecycle) => {
8
+ const captured = {
9
+ kind: 'Scene',
10
+ composition: base.composition,
11
+ // Lifecycle on the first provide layer tracks the runtime's build/dispose scope.
12
+ provide: base.provide.map((layer, index) => index === 0 ? Layer.merge(layer, lifecycle) : layer),
13
+ ...(base.boot === undefined ? {} : { boot: base.boot }),
14
+ ...(base.instrumentation === undefined ? {} : { instrumentation: base.instrumentation }),
15
+ capture: (capture) => capture(captured),
16
+ captureAny: (capture) => capture(captured),
17
+ };
18
+ return captured;
19
+ };
20
+ const profileCapturedScene = (base, profiler, lifecycle) => ({
21
+ scene: withLifecycle(profiledScene(base, profiler), lifecycle),
22
+ profiler,
23
+ });
24
+ export function profileScene(base, options = {}) {
25
+ const profiler = makeProfiler({
26
+ label: options.label ?? base.composition.manifest.title,
27
+ ...(options.capacity !== undefined ? { capacity: options.capacity } : {}),
28
+ });
29
+ const lifecycle = makeLifecycle(profiler);
30
+ return base.capture((exactScene) => profileCapturedScene(exactScene, profiler, lifecycle));
31
+ }
32
+ //# sourceMappingURL=profileScene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileScene.js","sourceRoot":"","sources":["../src/profileScene.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAsB,aAAa,EAA+B,MAAM,kBAAkB,CAAA;AACjG,OAAO,EAA2C,MAAM,2BAA2B,CAAA;AACnF,OAAO,EAAE,YAAY,EAAwD,MAAM,YAAY,CAAA;AAC/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAqB7C,MAAM,aAAa,GAAG,CAAC,QAAwB,EAAE,EAAE,CACjD,KAAK,CAAC,aAAa,CACjB,MAAM,CAAC,cAAc,CACnB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAChF,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CACF,CAAA;AAEH,MAAM,aAAa,GAAG,CAQpB,IAAmD,EACnD,SAA2C,EACI,EAAE;IACjD,MAAM,QAAQ,GAAkD;QAC9D,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,iFAAiF;QACjF,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACzC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CACpD;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;QACxF,OAAO,EAAE,CAAS,OAAmC,EAAU,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnF,UAAU,EAAE,CAAS,OAAgC,EAAU,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;KACpF,CAAA;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,CAQ3B,IAAmD,EACnD,QAAwB,EACxB,SAA2C,EACY,EAAE,CAAC,CAAC;IAC3D,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9D,QAAQ;CACT,CAAC,CAAA;AAiBF,MAAM,UAAU,YAAY,CAC1B,IAAiB,EACjB,UAAsC,EAAE;IAExC,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK;QACvD,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACzC,OAAO,IAAI,CAAC,OAAO,CACjB,CACE,UAAyD,EACpC,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAChF,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { downloadTrace, ReformProfiler } from './overlay.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { downloadTrace, ReformProfiler } from './overlay.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ProfilerHandle } from '../recorder.js';
3
+ export declare const ReformProfiler: () => ReactNode;
4
+ export declare const downloadTrace: (_profiler: ProfilerHandle) => void;
5
+ //# sourceMappingURL=noop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../src/react/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,cAAc,QAAO,SAAiB,CAAA;AAEnD,eAAO,MAAM,aAAa,GAAI,WAAW,cAAc,KAAG,IAAU,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const ReformProfiler = () => null;
2
+ export const downloadTrace = (_profiler) => { };
3
+ //# sourceMappingURL=noop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../src/react/noop.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAG,GAAc,EAAE,CAAC,IAAI,CAAA;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAyB,EAAQ,EAAE,GAAE,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ProfilerHandle } from '../recorder.js';
3
+ export declare const downloadTrace: (profiler: ProfilerHandle) => void;
4
+ export declare const ReformProfiler: () => ReactNode;
5
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/react/overlay.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,aAAa,CAAA;AAyB9D,eAAO,MAAM,aAAa,GAAI,UAAU,cAAc,KAAG,IAQxD,CAAA;AAkGD,eAAO,MAAM,cAAc,QAAO,SAoEjC,CAAA"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';
3
+ import { claimOverlay, listProfilers, profilersVersion, releaseOverlay, subscribeProfilers, } from '../registry.js';
4
+ import { traceJson } from '../trace.js';
5
+ import { bodyStyle, buttonStyle, cellStyle, headerStyle, nameCellStyle, palette, panelStyle, pillStyle, rootStyle, sectionTitleStyle, tableStyle, tabStyle, } from './styles.js';
6
+ // Plain React (not reform) so the profiler does not profile itself.
7
+ export const downloadTrace = (profiler) => {
8
+ const blob = new Blob([traceJson(profiler)], { type: 'application/json' });
9
+ const url = URL.createObjectURL(blob);
10
+ const anchor = document.createElement('a');
11
+ anchor.href = url;
12
+ anchor.download = `reform-trace-${profiler.label}.json`;
13
+ anchor.click();
14
+ URL.revokeObjectURL(url);
15
+ };
16
+ const sortedRows = (stats) => [...stats.entries()]
17
+ .map(([name, stat]) => ({ name, stat }))
18
+ .toSorted((left, right) => right.stat.totalMs - left.stat.totalMs || right.stat.count - left.stat.count);
19
+ const MS_DECIMALS = 2;
20
+ const formatMs = (durationMs) => durationMs.toFixed(MS_DECIMALS);
21
+ const avgMs = (stat) => formatMs(stat.count === 0 ? 0 : stat.totalMs / stat.count);
22
+ const Section = ({ title, rows, timed }) => {
23
+ if (rows.length === 0) {
24
+ return null;
25
+ }
26
+ return (_jsxs("div", { children: [_jsx("div", { style: sectionTitleStyle, children: title }), _jsxs("table", { style: tableStyle, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: nameCellStyle, children: "name" }), _jsx("th", { style: cellStyle, children: "count" }), timed ? _jsx("th", { style: cellStyle, children: "total ms" }) : null, timed ? _jsx("th", { style: cellStyle, children: "avg ms" }) : null] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { children: [_jsx("td", { style: nameCellStyle, children: row.name }), _jsx("td", { style: cellStyle, children: row.stat.count }), timed ? _jsx("td", { style: cellStyle, children: formatMs(row.stat.totalMs) }) : null, timed ? _jsx("td", { style: cellStyle, children: avgMs(row.stat) }) : null] }, row.name))) })] })] }));
27
+ };
28
+ const DroppedNote = ({ count }) => {
29
+ if (count === 0) {
30
+ return null;
31
+ }
32
+ return (_jsxs("div", { style: { color: palette.dim }, children: ["(", count, " early records evicted from the ring buffer)"] }));
33
+ };
34
+ const ProfilerBody = ({ profiler }) => {
35
+ const subscribe = useCallback((onStoreChange) => profiler.subscribe(onStoreChange), [profiler]);
36
+ const getVersion = useCallback(() => profiler.getVersion(), [profiler]);
37
+ useSyncExternalStore(subscribe, getVersion, getVersion);
38
+ const snapshot = profiler.snapshot();
39
+ const frameRows = snapshot.frames.count === 0 ? [] : [{ name: 'frame', stat: snapshot.frames }];
40
+ return (_jsxs("div", { style: bodyStyle, children: [_jsx(Section, { title: "Renders", rows: sortedRows(snapshot.renders), timed: true }), _jsx(Section, { title: "Events", rows: sortedRows(snapshot.events), timed: false }), _jsx(Section, { title: "Reducers", rows: sortedRows(snapshot.reducers), timed: true }), _jsx(Section, { title: "State updates", rows: sortedRows(snapshot.states), timed: false }), _jsx(Section, { title: "Calcs", rows: sortedRows(snapshot.calcs), timed: true }), _jsx(Section, { title: "Queries", rows: sortedRows(snapshot.queries), timed: true }), _jsx(Section, { title: "Procedures", rows: sortedRows(snapshot.procedures), timed: true }), _jsx(Section, { title: "Frames", rows: frameRows, timed: true }), _jsx(DroppedNote, { count: snapshot.dropped })] }));
41
+ };
42
+ export const ReformProfiler = () => {
43
+ const owner = useRef({}).current;
44
+ const [claimed, setClaimed] = useState(false);
45
+ useEffect(() => {
46
+ setClaimed(claimOverlay(owner));
47
+ const unsubscribe = subscribeProfilers(() => setClaimed(claimOverlay(owner)));
48
+ return () => {
49
+ unsubscribe();
50
+ releaseOverlay(owner);
51
+ };
52
+ }, [owner]);
53
+ const registryVersion = useSyncExternalStore(subscribeProfilers, profilersVersion, profilersVersion);
54
+ const registrations = listProfilers();
55
+ const [expanded, setExpanded] = useState(false);
56
+ const [tab, setTab] = useState(0);
57
+ void registryVersion;
58
+ if (!claimed || registrations.length === 0) {
59
+ return null;
60
+ }
61
+ const selected = registrations[Math.min(tab, registrations.length - 1)];
62
+ if (selected === undefined) {
63
+ return null;
64
+ }
65
+ if (!expanded) {
66
+ return (_jsx("div", { style: rootStyle, children: _jsx("button", { type: "button", style: pillStyle, onClick: () => setExpanded(true), children: "\u26A1 reform profiler" }) }));
67
+ }
68
+ return (_jsx("div", { style: rootStyle, children: _jsxs("div", { style: panelStyle, children: [_jsxs("div", { style: headerStyle, children: [_jsx("span", { style: { color: palette.accent, fontWeight: 600 }, children: "\u26A1 reform" }), registrations.map((registration, index) => (_jsx("button", { type: "button", style: tabStyle(registration === selected), onClick: () => setTab(index), children: registration.label }, registration.label + String(index)))), _jsx("span", { style: { flex: 1 } }), _jsx("button", { type: "button", style: buttonStyle, onClick: () => downloadTrace(selected.handle), children: "export" }), _jsx("button", { type: "button", style: buttonStyle, onClick: () => selected.handle.clear(), children: "clear" }), _jsx("button", { type: "button", style: buttonStyle, onClick: () => setExpanded(false), children: "\u00D7" })] }), _jsx(ProfilerBody, { profiler: selected.handle })] }) }));
69
+ };
70
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/react/overlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { CSSProperties } from 'react';
2
+ interface Palette {
3
+ readonly bg: string;
4
+ readonly panel: string;
5
+ readonly border: string;
6
+ readonly text: string;
7
+ readonly dim: string;
8
+ readonly accent: string;
9
+ }
10
+ export declare const palette: Palette;
11
+ export declare const rootStyle: CSSProperties;
12
+ export declare const pillStyle: CSSProperties;
13
+ export declare const panelStyle: CSSProperties;
14
+ export declare const headerStyle: CSSProperties;
15
+ export declare const buttonStyle: CSSProperties;
16
+ export declare const tabStyle: (active: boolean) => CSSProperties;
17
+ export declare const bodyStyle: CSSProperties;
18
+ export declare const tableStyle: CSSProperties;
19
+ export declare const cellStyle: CSSProperties;
20
+ export declare const nameCellStyle: CSSProperties;
21
+ export declare const sectionTitleStyle: CSSProperties;
22
+ export {};
23
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/react/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,UAAU,OAAO;IACf,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,eAAO,MAAM,OAAO,EAAE,OAOrB,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,aASvB,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,aASvB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,aAUxB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,aAOzB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,aASzB,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,OAAO,KAAG,aAIzC,CAAA;AAEF,eAAO,MAAM,SAAS,EAAE,aAGvB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,aAIxB,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,aAKvB,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,aAO3B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,aAI/B,CAAA"}
@@ -0,0 +1,91 @@
1
+ export const palette = {
2
+ bg: '#16181d',
3
+ panel: '#1d2026',
4
+ border: '#31353d',
5
+ text: '#d7dae0',
6
+ dim: '#8a8f98',
7
+ accent: '#e8a33d',
8
+ };
9
+ export const rootStyle = {
10
+ position: 'fixed',
11
+ right: 12,
12
+ bottom: 12,
13
+ zIndex: 2147483000,
14
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
15
+ fontSize: 11,
16
+ lineHeight: 1.5,
17
+ color: palette.text,
18
+ };
19
+ export const pillStyle = {
20
+ background: palette.bg,
21
+ border: `1px solid ${palette.border}`,
22
+ borderRadius: 999,
23
+ padding: '4px 12px',
24
+ cursor: 'pointer',
25
+ color: palette.accent,
26
+ fontSize: 11,
27
+ fontFamily: 'inherit',
28
+ };
29
+ export const panelStyle = {
30
+ background: palette.bg,
31
+ border: `1px solid ${palette.border}`,
32
+ borderRadius: 8,
33
+ width: 420,
34
+ maxHeight: '60vh',
35
+ display: 'flex',
36
+ flexDirection: 'column',
37
+ overflow: 'hidden',
38
+ boxShadow: '0 8px 24px rgba(0,0,0,0.5)',
39
+ };
40
+ export const headerStyle = {
41
+ display: 'flex',
42
+ alignItems: 'center',
43
+ gap: 8,
44
+ padding: '6px 10px',
45
+ borderBottom: `1px solid ${palette.border}`,
46
+ background: palette.panel,
47
+ };
48
+ export const buttonStyle = {
49
+ background: 'transparent',
50
+ border: `1px solid ${palette.border}`,
51
+ borderRadius: 4,
52
+ color: palette.text,
53
+ padding: '1px 8px',
54
+ cursor: 'pointer',
55
+ fontSize: 11,
56
+ fontFamily: 'inherit',
57
+ };
58
+ export const tabStyle = (active) => ({
59
+ ...buttonStyle,
60
+ borderColor: active ? palette.accent : palette.border,
61
+ color: active ? palette.accent : palette.dim,
62
+ });
63
+ export const bodyStyle = {
64
+ overflowY: 'auto',
65
+ padding: '4px 10px 10px',
66
+ };
67
+ export const tableStyle = {
68
+ width: '100%',
69
+ borderCollapse: 'collapse',
70
+ marginBottom: 8,
71
+ };
72
+ export const cellStyle = {
73
+ padding: '1px 6px 1px 0',
74
+ textAlign: 'right',
75
+ whiteSpace: 'nowrap',
76
+ color: palette.dim,
77
+ };
78
+ export const nameCellStyle = {
79
+ ...cellStyle,
80
+ textAlign: 'left',
81
+ width: '100%',
82
+ color: palette.text,
83
+ overflowWrap: 'anywhere',
84
+ whiteSpace: 'normal',
85
+ };
86
+ export const sectionTitleStyle = {
87
+ color: palette.accent,
88
+ margin: '8px 0 2px',
89
+ fontWeight: 600,
90
+ };
91
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/react/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type Instrumentation } from '@playfast/reform/internal';
2
+ export type ProfileKind = 'event' | 'reducer' | 'state' | 'calc' | 'query' | 'procedure' | 'render' | 'frame';
3
+ export interface ProfileRecord {
4
+ readonly kind: ProfileKind;
5
+ readonly name: string;
6
+ readonly detail: string;
7
+ readonly start: number;
8
+ readonly dur: number;
9
+ }
10
+ export interface ProfileStat {
11
+ readonly count: number;
12
+ readonly totalMs: number;
13
+ }
14
+ export interface ProfileSnapshot {
15
+ readonly events: ReadonlyMap<string, ProfileStat>;
16
+ readonly reducers: ReadonlyMap<string, ProfileStat>;
17
+ readonly states: ReadonlyMap<string, ProfileStat>;
18
+ readonly calcs: ReadonlyMap<string, ProfileStat>;
19
+ readonly queries: ReadonlyMap<string, ProfileStat>;
20
+ readonly procedures: ReadonlyMap<string, ProfileStat>;
21
+ readonly renders: ReadonlyMap<string, ProfileStat>;
22
+ readonly frames: ProfileStat;
23
+ readonly records: ReadonlyArray<ProfileRecord>;
24
+ readonly dropped: number;
25
+ }
26
+ export interface ProfilerOptionsExternalApi {
27
+ readonly label?: string;
28
+ readonly capacity?: number;
29
+ }
30
+ export interface ProfilerHandle extends Instrumentation {
31
+ readonly label: string;
32
+ readonly snapshot: () => ProfileSnapshot;
33
+ readonly clear: () => void;
34
+ readonly subscribe: (listener: () => void) => () => void;
35
+ readonly getVersion: () => number;
36
+ }
37
+ export declare const makeProfiler: (options?: ProfilerOptionsExternalApi) => ProfilerHandle;
38
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAA+B,MAAM,2BAA2B,CAAA;AAE7F,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,SAAS,GACT,OAAO,GACP,MAAM,GACN,OAAO,GACP,WAAW,GACX,QAAQ,GACR,OAAO,CAAA;AAEX,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACjD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACjD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAChD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAClD,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACrD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAe,SAAQ,eAAe;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,eAAe,CAAA;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAA;CAClC;AAMD,eAAO,MAAM,YAAY,GAAI,UAAS,0BAA+B,KAAG,cA+FvE,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { makeScheduler } from '@playfast/reform/internal';
2
+ const zeroStat = { count: 0, totalMs: 0 };
3
+ const DEFAULT_CAPACITY = 50_000;
4
+ export const makeProfiler = (options = {}) => {
5
+ const capacity = Math.max(1, options.capacity ?? DEFAULT_CAPACITY);
6
+ const label = options.label ?? 'reform';
7
+ // Fixed ring: written % capacity is next slot; aggregates keep full tally when records evict.
8
+ const emptyBuffer = () => Array.from({ length: capacity }, () => undefined);
9
+ const cursor = { buffer: emptyBuffer(), written: 0, version: 0 };
10
+ const stats = {
11
+ event: new Map(),
12
+ reducer: new Map(),
13
+ state: new Map(),
14
+ calc: new Map(),
15
+ query: new Map(),
16
+ procedure: new Map(),
17
+ render: new Map(),
18
+ frame: new Map(),
19
+ };
20
+ const listeners = new Set();
21
+ const scheduler = makeScheduler();
22
+ const notify = () => {
23
+ cursor.version += 1;
24
+ scheduler.schedule(listeners);
25
+ };
26
+ const record = (entry) => {
27
+ cursor.buffer[cursor.written % capacity] = entry;
28
+ cursor.written += 1;
29
+ const bucket = stats[entry.kind];
30
+ const prev = bucket.get(entry.name) ?? zeroStat;
31
+ bucket.set(entry.name, { count: prev.count + 1, totalMs: prev.totalMs + entry.dur });
32
+ notify();
33
+ };
34
+ const instant = (site) => record({ ...site, start: performance.now(), dur: 0 });
35
+ const span = (site) => {
36
+ const start = performance.now();
37
+ return () => record({ ...site, start, dur: performance.now() - start });
38
+ };
39
+ const snapshot = () => {
40
+ const size = Math.min(cursor.written, capacity);
41
+ const first = cursor.written - size;
42
+ const records = Array.from({ length: size }, (_, index) => cursor.buffer[(first + index) % capacity]).filter((candidate) => candidate !== undefined);
43
+ return {
44
+ events: new Map(stats.event),
45
+ reducers: new Map(stats.reducer),
46
+ states: new Map(stats.state),
47
+ calcs: new Map(stats.calc),
48
+ queries: new Map(stats.query),
49
+ procedures: new Map(stats.procedure),
50
+ renders: new Map(stats.render),
51
+ frames: stats.frame.get('frame') ?? zeroStat,
52
+ records,
53
+ dropped: first,
54
+ };
55
+ };
56
+ return {
57
+ label,
58
+ snapshot,
59
+ clear: () => {
60
+ cursor.buffer = emptyBuffer();
61
+ cursor.written = 0;
62
+ Object.values(stats).forEach((bucket) => bucket.clear());
63
+ notify();
64
+ },
65
+ subscribe: (listener) => {
66
+ listeners.add(listener);
67
+ return () => {
68
+ listeners.delete(listener);
69
+ };
70
+ },
71
+ getVersion: () => cursor.version,
72
+ eventDispatched: (tag, priority) => instant({ kind: 'event', name: tag, detail: priority }),
73
+ reducerRun: (name, eventTag) => span({ kind: 'reducer', name, detail: eventTag }),
74
+ stateUpdated: (name) => instant({ kind: 'state', name, detail: '' }),
75
+ calcRecomputed: (name) => span({ kind: 'calc', name, detail: '' }),
76
+ queryRun: (name) => span({ kind: 'query', name, detail: '' }),
77
+ procedureRun: (name, channel, eventTag) => span({ kind: 'procedure', name, detail: `${channel}:${eventTag}` }),
78
+ uiRendered: (composition) => span({ kind: 'render', name: composition, detail: '' }),
79
+ frame: (eventCount) => span({ kind: 'frame', name: 'frame', detail: String(eventCount) }),
80
+ };
81
+ };
82
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ProfilerHandle } from './recorder.js';
2
+ export interface ProfilerRegistration {
3
+ readonly label: string;
4
+ readonly handle: ProfilerHandle;
5
+ }
6
+ export declare const registerProfiler: (registration: ProfilerRegistration) => (() => void);
7
+ export declare const listProfilers: () => ReadonlyArray<ProfilerRegistration>;
8
+ export declare const subscribeProfilers: (listener: () => void) => (() => void);
9
+ export declare const profilersVersion: () => number;
10
+ export declare const claimOverlay: (owner: object) => boolean;
11
+ export declare const releaseOverlay: (owner: object) => void;
12
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAIhD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAChC;AA4BD,eAAO,MAAM,gBAAgB,GAAI,cAAc,oBAAoB,KAAG,CAAC,MAAM,IAAI,CAqBhF,CAAA;AAED,eAAO,MAAM,aAAa,QAAO,aAAa,CAAC,oBAAoB,CACH,CAAA;AAEhE,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAKpE,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,MAA+B,CAAA;AAGnE,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OAM5C,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,IAK9C,CAAA"}