batchkit 0.3.0 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,YAAY,EAEZ,KAAK,EAIN,MAAM,SAAS,CAAC;AAEjB,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAClB,OAAO,GAAE,YAAY,CAAC,CAAC,CAAM,GAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAkTf"}
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../src/batch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,YAAY,EAEZ,KAAK,EAIN,MAAM,SAAS,CAAC;AAEjB,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EACxB,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAClB,OAAO,GAAE,YAAY,CAAC,CAAC,CAAM,GAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAiTf"}
package/dist/index.js CHANGED
@@ -67,11 +67,30 @@ function onIdle(options) {
67
67
 
68
68
  // src/trace.ts
69
69
  var devtoolsHook = null;
70
+ var pendingBatchers = [];
70
71
  function __setDevtoolsHook(hook) {
71
72
  devtoolsHook = hook;
73
+ if (hook && pendingBatchers.length > 0) {
74
+ for (const pending of pendingBatchers) {
75
+ const emitter = hook.onBatcherCreated({
76
+ fn: pending.fn,
77
+ name: pending.name,
78
+ stack: pending.stack
79
+ });
80
+ pending.setEmitter(emitter);
81
+ }
82
+ pendingBatchers.length = 0;
83
+ } else if (!hook) {
84
+ pendingBatchers.length = 0;
85
+ }
72
86
  }
73
- function getDevtoolsHook() {
74
- return devtoolsHook;
87
+ function registerBatcher(info, setEmitter) {
88
+ if (devtoolsHook) {
89
+ const emitter = devtoolsHook.onBatcherCreated(info);
90
+ setEmitter(emitter);
91
+ } else {
92
+ pendingBatchers.push({ ...info, setEmitter });
93
+ }
75
94
  }
76
95
  function createTracer(name, handler, getDevtoolsEmitter) {
77
96
  let batchCounter = 0;
@@ -107,11 +126,10 @@ function batch(fn, match, options = {}) {
107
126
  } = options;
108
127
  const scheduler = schedule ?? (waitMs ? wait(waitMs) : microtask);
109
128
  let devtoolsEmitter;
110
- const hook = getDevtoolsHook();
111
- if (hook) {
112
- const stack = new Error().stack;
113
- devtoolsEmitter = hook.onBatcherCreated({ fn, name, stack });
114
- }
129
+ const creationStack = new Error().stack;
130
+ registerBatcher({ fn, name, stack: creationStack }, (emitter) => {
131
+ devtoolsEmitter = emitter;
132
+ });
115
133
  const tracer = createTracer(name, traceHandler, () => devtoolsEmitter);
116
134
  const matchFn = normalizeMatch(match);
117
135
  const isIndexedMatch = isIndexed(match);
package/dist/trace.d.ts CHANGED
@@ -9,7 +9,13 @@ export interface DevtoolsHook {
9
9
  }): ((event: TraceEvent) => void) | undefined;
10
10
  }
11
11
  export declare function __setDevtoolsHook(hook: DevtoolsHook | null): void;
12
- export declare function getDevtoolsHook(): DevtoolsHook | null;
12
+ export declare function registerBatcher(info: {
13
+ fn: {
14
+ toString(): string;
15
+ };
16
+ name: string | undefined;
17
+ stack: string | undefined;
18
+ }, setEmitter: (emitter: ((event: TraceEvent) => void) | undefined) => void): void;
13
19
  export declare function createTracer<K>(name: string | undefined, handler: TraceHandler<K> | undefined, getDevtoolsEmitter: (() => ((event: TraceEvent<K>) => void) | undefined) | undefined): {
14
20
  emit: (event: TraceEventData<K>) => void;
15
21
  nextBatchId: () => string;
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,IAAI,EAAE;QACrB,EAAE,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,CAAC;QAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;KAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,EACpC,kBAAkB,EACd,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,GACpD,SAAS;kBAIQ,eAAe,CAAC,CAAC;uBAiBd,MAAM;EAK/B"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,IAAI,EAAE;QACrB,EAAE,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,CAAC;QAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;KAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/C;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAiBjE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE;IACJ,EAAE,EAAE;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,EACD,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,SAAS,KAAK,IAAI,GACvE,IAAI,CAON;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,EACpC,kBAAkB,EACd,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,GACpD,SAAS;kBAIQ,eAAe,CAAC,CAAC;uBAiBd,MAAM;EAK/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "batchkit",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "A modern TypeScript library for batching async operations",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/batch.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { BatchError } from './errors';
2
2
  import { createIndexedMatcher, isIndexed, normalizeMatch } from './match';
3
3
  import { microtask, wait } from './schedulers';
4
- import { createTracer, getDevtoolsHook } from './trace';
4
+ import { createTracer, registerBatcher } from './trace';
5
5
  import type {
6
6
  Batcher,
7
7
  BatchFn,
@@ -30,12 +30,11 @@ export function batch<K, V>(
30
30
  const scheduler: Scheduler = schedule ?? (waitMs ? wait(waitMs) : microtask);
31
31
 
32
32
  let devtoolsEmitter: ((event: TraceEvent) => void) | undefined;
33
- const hook = getDevtoolsHook();
33
+ const creationStack = new Error().stack;
34
34
 
35
- if (hook) {
36
- const stack = new Error().stack;
37
- devtoolsEmitter = hook.onBatcherCreated({ fn, name, stack });
38
- }
35
+ registerBatcher({ fn, name, stack: creationStack }, (emitter) => {
36
+ devtoolsEmitter = emitter;
37
+ });
39
38
 
40
39
  const tracer = createTracer(name, traceHandler, () => devtoolsEmitter);
41
40
 
package/src/trace.ts CHANGED
@@ -8,14 +8,49 @@ export interface DevtoolsHook {
8
8
  }): ((event: TraceEvent) => void) | undefined;
9
9
  }
10
10
 
11
+ interface PendingBatcher {
12
+ fn: { toString(): string };
13
+ name: string | undefined;
14
+ stack: string | undefined;
15
+ setEmitter: (emitter: ((event: TraceEvent) => void) | undefined) => void;
16
+ }
17
+
11
18
  let devtoolsHook: DevtoolsHook | null = null;
19
+ const pendingBatchers: PendingBatcher[] = [];
12
20
 
13
21
  export function __setDevtoolsHook(hook: DevtoolsHook | null): void {
14
22
  devtoolsHook = hook;
23
+
24
+ if (hook && pendingBatchers.length > 0) {
25
+ for (const pending of pendingBatchers) {
26
+ const emitter = hook.onBatcherCreated({
27
+ fn: pending.fn,
28
+ name: pending.name,
29
+ stack: pending.stack,
30
+ });
31
+ pending.setEmitter(emitter);
32
+ }
33
+ pendingBatchers.length = 0;
34
+ } else if (!hook) {
35
+ // clear pending batchers when hook is removed
36
+ pendingBatchers.length = 0;
37
+ }
15
38
  }
16
39
 
17
- export function getDevtoolsHook(): DevtoolsHook | null {
18
- return devtoolsHook;
40
+ export function registerBatcher(
41
+ info: {
42
+ fn: { toString(): string };
43
+ name: string | undefined;
44
+ stack: string | undefined;
45
+ },
46
+ setEmitter: (emitter: ((event: TraceEvent) => void) | undefined) => void,
47
+ ): void {
48
+ if (devtoolsHook) {
49
+ const emitter = devtoolsHook.onBatcherCreated(info);
50
+ setEmitter(emitter);
51
+ } else {
52
+ pendingBatchers.push({ ...info, setEmitter });
53
+ }
19
54
  }
20
55
 
21
56
  export function createTracer<K>(