@praxisjs/concurrent 1.3.8 → 1.3.9

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 (50) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/decorators.d.ts +3 -3
  3. package/dist/decorators.d.ts.map +1 -1
  4. package/dist/decorators.js +23 -38
  5. package/dist/decorators.js.map +1 -1
  6. package/dist/pool.d.ts.map +1 -1
  7. package/dist/pool.js +64 -43
  8. package/dist/pool.js.map +1 -1
  9. package/dist/queue.d.ts.map +1 -1
  10. package/dist/queue.js +53 -50
  11. package/dist/queue.js.map +1 -1
  12. package/dist/task.d.ts.map +1 -1
  13. package/dist/task.js +39 -33
  14. package/dist/task.js.map +1 -1
  15. package/dist/utils.d.ts +12 -0
  16. package/dist/utils.d.ts.map +1 -1
  17. package/dist/utils.js +42 -0
  18. package/dist/utils.js.map +1 -1
  19. package/package.json +15 -6
  20. package/src/decorators.ts +37 -38
  21. package/src/pool.ts +64 -46
  22. package/src/queue.ts +60 -56
  23. package/src/task.ts +38 -34
  24. package/src/utils.ts +55 -0
  25. package/dist/__tests__/decorators.test.d.ts +0 -2
  26. package/dist/__tests__/decorators.test.d.ts.map +0 -1
  27. package/dist/__tests__/decorators.test.js +0 -195
  28. package/dist/__tests__/decorators.test.js.map +0 -1
  29. package/dist/__tests__/pool.test.d.ts +0 -2
  30. package/dist/__tests__/pool.test.d.ts.map +0 -1
  31. package/dist/__tests__/pool.test.js +0 -196
  32. package/dist/__tests__/pool.test.js.map +0 -1
  33. package/dist/__tests__/queue.test.d.ts +0 -2
  34. package/dist/__tests__/queue.test.d.ts.map +0 -1
  35. package/dist/__tests__/queue.test.js +0 -173
  36. package/dist/__tests__/queue.test.js.map +0 -1
  37. package/dist/__tests__/task.test.d.ts +0 -2
  38. package/dist/__tests__/task.test.d.ts.map +0 -1
  39. package/dist/__tests__/task.test.js +0 -182
  40. package/dist/__tests__/task.test.js.map +0 -1
  41. package/dist/__tests__/utils.test.d.ts +0 -2
  42. package/dist/__tests__/utils.test.d.ts.map +0 -1
  43. package/dist/__tests__/utils.test.js +0 -32
  44. package/dist/__tests__/utils.test.js.map +0 -1
  45. package/src/__tests__/decorators.test.ts +0 -267
  46. package/src/__tests__/pool.test.ts +0 -212
  47. package/src/__tests__/queue.test.ts +0 -197
  48. package/src/__tests__/task.test.ts +0 -205
  49. package/src/__tests__/utils.test.ts +0 -48
  50. package/tsconfig.json +0 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @praxisjs/concurrent
2
2
 
3
+ ## 1.3.9
4
+
5
+ ### Patch Changes
6
+
7
+ - 75115a9: Field decorators throw a `TypeError` when the class is defined if they decorate an `accessor`, naming the member to fix. Covers `@State()`, `@Prop()`, every built-in field decorator and `createFieldDecorator` bindings. New `assertFieldContext(context, label?)` export for field decorators written against the TC39 API directly.
8
+ - 75115a9: Published packages no longer contain their tests: package builds compile `src` without `src/**/__tests__` (through a `tsconfig.build.json`), and each package's `files` leaves test sources and stale compiled tests out of the tarball. `pnpm typecheck` still type-checks the tests.
9
+ - 75115a9: Faster utils packages and fixes. `@praxisjs/css`: shared per-field state for `@Styled`, `@Param` and `@Style`, a prototype-based `css()` builder, cached token reads and a direct `cx()`. Static extraction now keeps `globalStyle()` layers and supports `preflight()`. Server renders collect theme vars, and instantiating a `@Themed` class keeps the active theme. `@praxisjs/composables`: listeners, observers and timers start on mount. `Idle` and `TimeAgo` no longer reschedule or poll timers, and `FileUpload.clear()` no longer starts discarded uploads. `add()` called from an effect no longer subscribes it to the list. `@praxisjs/concurrent`: cached signal detection, direct signal views, O(1) queues, and `@Pool` no longer subscribes the calling effect.
10
+ - 75115a9: Smaller production bundles. The framework and feature packages are marked `"sideEffects": false`, so bundlers leave out the modules an app does not use (`For`/`Index` and `selector()` were kept in every bundle by their shape keepers). `@praxisjs/core`'s graph gates its observer instrumentation on a boolean that minifiers fold away when no observer is ever installed. `@praxisjs/runtime` passes `Index`'s positional update to the list view, so `For`-only apps leave it out, and builds its event prop table from camel-case names. `@praxisjs/devtools` is built one file per module and its decorators check `process.env.NODE_ENV` inline, so `@Trace`/`@Debug` in production code no longer bundle the registry and the panel. `@praxisjs/vite-plugin` serves TypeScript's decorator helpers and the claimed fields' helper from one virtual module (`virtual:praxisjs/decorators`) instead of writing them into every decorated file, and replaces the identical copies `tsc` wrote into ES module libraries.
11
+ - Updated dependencies [75115a9]
12
+ - Updated dependencies [75115a9]
13
+ - Updated dependencies [75115a9]
14
+ - Updated dependencies [75115a9]
15
+ - Updated dependencies [75115a9]
16
+ - Updated dependencies [75115a9]
17
+ - Updated dependencies [75115a9]
18
+ - Updated dependencies [75115a9]
19
+ - Updated dependencies [75115a9]
20
+ - Updated dependencies [75115a9]
21
+ - Updated dependencies [75115a9]
22
+ - @praxisjs/decorators@2.0.0
23
+ - @praxisjs/core@2.3.0
24
+ - @praxisjs/shared@0.3.2
25
+
3
26
  ## 1.3.8
4
27
 
5
28
  ### Patch Changes
@@ -31,8 +31,8 @@ export type PoolDecorated<T extends AnyAsyncFn> = ((...args: DropSignalIfPresent
31
31
  export type TaskOf<C, K extends keyof C> = C[K] extends AnyAsyncFn ? TaskDecorated<C[K]> : never;
32
32
  export type QueueOf<C, K extends keyof C> = C[K] extends AnyAsyncFn ? QueueDecorated<C[K]> : never;
33
33
  export type PoolOf<C, K extends keyof C> = C[K] extends AnyAsyncFn ? PoolDecorated<C[K]> : never;
34
- export declare function Task(methodName: string): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) => void;
35
- export declare function Queue(methodName: string): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) => void;
36
- export declare function Pool(methodName: string, concurrency?: number): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) => void;
34
+ export declare function Task(methodName: string): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) => (this: This) => Value;
35
+ export declare function Queue(methodName: string): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) => (this: This) => Value;
36
+ export declare function Pool(methodName: string, concurrency?: number): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) => (this: This) => Value;
37
37
  export {};
38
38
  //# sourceMappingURL=decorators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQjD,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE9D;;;;;;;GAOG;AACH,KAAK,mBAAmB,CAAC,CAAC,SAAS,OAAO,EAAE,IAC1C,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAI9C,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,UAAU,IAC5C,CAAC,CAAC,GAAG,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAEJ,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,UAAU,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEJ,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,UAAU,IAC5C,CAAC,CAAC,GAAG,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAIJ,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IACrC,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IACtC,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAEzD,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IACrC,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAIxD,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,uHActC;AAID,wBAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,uHAavC;AAID,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,SAAI,uHAavD"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQjD,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE9D;;;;;;;GAOG;AACH,KAAK,mBAAmB,CAAC,CAAC,SAAS,OAAO,EAAE,IAC1C,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAI9C,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,UAAU,IAC5C,CAAC,CAAC,GAAG,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAEJ,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,UAAU,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEJ,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,UAAU,IAC5C,CAAC,CAAC,GAAG,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;IACjE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC;AAIJ,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IACrC,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IACtC,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAEzD,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IACrC,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAmBxD,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,IACpB,IAAI,SAAS,MAAM,EAAE,KAAK,GAAG,OAAO,EACnD,QAAQ,SAAS,EACjB,SAAS,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,KAC/C,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAIzB;AAID,wBAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,IACrB,IAAI,SAAS,MAAM,EAAE,KAAK,GAAG,OAAO,EACnD,QAAQ,SAAS,EACjB,SAAS,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,KAC/C,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAIzB;AAID,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,SAAI,IACrC,IAAI,SAAS,MAAM,EAAE,KAAK,GAAG,OAAO,EACnD,QAAQ,SAAS,EACjB,SAAS,0BAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,KAC/C,CAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAIzB"}
@@ -1,52 +1,37 @@
1
- import { createFieldDecorator } from "@praxisjs/decorators";
1
+ import { assertFieldContext } from "@praxisjs/decorators";
2
2
  import { pool } from "./pool";
3
3
  import { queue } from "./queue";
4
4
  import { task } from "./task";
5
5
  import { acceptsSignal } from "./utils";
6
+ // ── Field decorators ───────────────────────────────────────────────────────────
7
+ // Each decorator returns the field's initializer: the value is created per instance while the
8
+ // field is defined, instead of redefining the field afterwards with Object.defineProperty.
9
+ function fieldFrom(methodName, create) {
10
+ return function () {
11
+ const method = this[methodName];
12
+ // Detect signal on the unbound method — bound functions lose their source.
13
+ return create(method.bind(this), acceptsSignal(method));
14
+ };
15
+ }
6
16
  // ── @Task ──────────────────────────────────────────────────────────────────────
7
17
  export function Task(methodName) {
8
- return createFieldDecorator({
9
- bind(instance, _name) {
10
- const inst = instance;
11
- // Detect signal on the unbound method — bound functions lose their source.
12
- const wantsSignal = acceptsSignal(inst[methodName]);
13
- return {
14
- descriptor: {
15
- value: task(inst[methodName].bind(instance), { signal: wantsSignal }),
16
- writable: true,
17
- },
18
- };
19
- },
20
- });
18
+ return function (_value, context) {
19
+ assertFieldContext(context);
20
+ return fieldFrom(methodName, (method, signal) => task(method, { signal }));
21
+ };
21
22
  }
22
23
  // ── @Queue ─────────────────────────────────────────────────────────────────────
23
24
  export function Queue(methodName) {
24
- return createFieldDecorator({
25
- bind(instance, _name) {
26
- const inst = instance;
27
- const wantsSignal = acceptsSignal(inst[methodName]);
28
- return {
29
- descriptor: {
30
- value: queue(inst[methodName].bind(instance), { signal: wantsSignal }),
31
- writable: true,
32
- },
33
- };
34
- },
35
- });
25
+ return function (_value, context) {
26
+ assertFieldContext(context);
27
+ return fieldFrom(methodName, (method, signal) => queue(method, { signal }));
28
+ };
36
29
  }
37
30
  // ── @Pool ──────────────────────────────────────────────────────────────────────
38
31
  export function Pool(methodName, concurrency = 1) {
39
- return createFieldDecorator({
40
- bind(instance, _name) {
41
- const inst = instance;
42
- const wantsSignal = acceptsSignal(inst[methodName]);
43
- return {
44
- descriptor: {
45
- value: pool(concurrency, inst[methodName].bind(instance), { signal: wantsSignal }),
46
- writable: true,
47
- },
48
- };
49
- },
50
- });
32
+ return function (_value, context) {
33
+ assertFieldContext(context);
34
+ return fieldFrom(methodName, (method, signal) => pool(concurrency, method, { signal }));
35
+ };
51
36
  }
52
37
  //# sourceMappingURL=decorators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAsDxC,kFAAkF;AAElF,MAAM,UAAU,IAAI,CAAC,UAAkB;IACrC,OAAO,oBAAoB,CAAC;QAC1B,IAAI,CAAC,QAAgB,EAAE,KAAa;YAClC,MAAM,IAAI,GAAG,QAAsC,CAAC;YACpD,2EAA2E;YAC3E,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,OAAO;gBACL,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAY;oBAChF,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,KAAK,CAAC,UAAkB;IACtC,OAAO,oBAAoB,CAAC;QAC1B,IAAI,CAAC,QAAgB,EAAE,KAAa;YAClC,MAAM,IAAI,GAAG,QAAsC,CAAC;YACpD,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,OAAO;gBACL,UAAU,EAAE;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAY;oBACjF,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,IAAI,CAAC,UAAkB,EAAE,WAAW,GAAG,CAAC;IACtD,OAAO,oBAAoB,CAAC;QAC1B,IAAI,CAAC,QAAgB,EAAE,KAAa;YAClC,MAAM,IAAI,GAAG,QAAsC,CAAC;YACpD,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpD,OAAO;gBACL,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAY;oBAC7F,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAsDxC,kFAAkF;AAElF,8FAA8F;AAC9F,2FAA2F;AAC3F,SAAS,SAAS,CAChB,UAAkB,EAClB,MAA6D;IAE7D,OAAO;QACL,MAAM,MAAM,GAAI,IAAmC,CAAC,UAAU,CAAC,CAAC;QAChE,2EAA2E;QAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,IAAI,CAAC,UAAkB;IACrC,OAAO,UACL,MAAiB,EACjB,OAAgD;QAEhD,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAA0B,CAAC;IACtG,CAAC,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,KAAK,CAAC,UAAkB;IACtC,OAAO,UACL,MAAiB,EACjB,OAAgD;QAEhD,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAA0B,CAAC;IACvG,CAAC,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,IAAI,CAAC,UAAkB,EAAE,WAAW,GAAG,CAAC;IACtD,OAAO,UACL,MAAiB,EACjB,OAAgD;QAEhD,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAA0B,CAAC;IACnH,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,SAAS,IAAI,IAAI,CAAC;CACnB;AAMD,wBAAgB,IAAI,CAAC,CAAC,EACpB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,YAAY,CAAC,CAAC,CAAC,CAgEjB"}
1
+ {"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,SAAS,IAAI,IAAI,CAAC;CACnB;AAQD,wBAAgB,IAAI,CAAC,CAAC,EACpB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,YAAY,CAAC,CAAC,CAAC,CAgFjB"}
package/dist/pool.js CHANGED
@@ -1,64 +1,85 @@
1
- import { signal, computed } from "@praxisjs/core/internal";
2
- import { acceptsSignal } from "./utils";
3
- function isAbortError(err) {
4
- return err instanceof Error && err.name === "AbortError";
5
- }
1
+ import { endBatch, SignalNode, startBatch, writeSignal } from "@praxisjs/core/internal";
2
+ import { acceptsSignal, isAbortError, readonlyView, toError } from "./utils";
6
3
  export function pool(concurrency, fn, options) {
7
4
  concurrency = Math.max(1, concurrency);
8
- const _active = signal(0);
9
- const _pending = signal(0);
10
- const _error = signal(null);
11
- const _wantsSignal = options?.signal ?? acceptsSignal(fn);
12
- const _queue = [];
13
- const _activeControllers = new Set();
14
- async function tryRun() {
15
- if (_active() >= concurrency || _queue.length === 0)
16
- return;
17
- const item = _queue[0];
18
- _queue.shift();
5
+ const activeNode = new SignalNode(0);
6
+ const pendingNode = new SignalNode(0);
7
+ const loadingNode = new SignalNode(false);
8
+ const error = new SignalNode(null);
9
+ const wantsSignal = options?.signal ?? acceptsSignal(fn);
10
+ // Plain counters drive scheduling: reading the signals here would subscribe whatever effect
11
+ // happens to call the pool.
12
+ let active = 0;
13
+ let items = [];
14
+ let head = 0;
15
+ const activeControllers = new Set();
16
+ function publish() {
17
+ startBatch();
18
+ writeSignal(activeNode, active);
19
+ writeSignal(pendingNode, items.length - head);
20
+ writeSignal(loadingNode, active > 0);
21
+ endBatch();
22
+ }
23
+ async function execute(item) {
19
24
  const { args, resolve, controller } = item;
20
- _pending.update((n) => n - 1);
21
- _active.update((n) => n + 1);
22
- _activeControllers.add(controller);
25
+ if (controller)
26
+ activeControllers.add(controller);
23
27
  try {
24
- const result = await (_wantsSignal ? fn(controller.signal, ...args) : fn(...args));
25
- resolve(result);
28
+ resolve(await (controller ? fn(controller.signal, ...args) : fn(...args)));
26
29
  }
27
30
  catch (err) {
28
- if (!isAbortError(err)) {
29
- _error.set(err instanceof Error ? err : new Error(String(err)));
30
- }
31
+ if (!isAbortError(err))
32
+ writeSignal(error, toError(err));
31
33
  resolve(undefined);
32
34
  }
33
35
  finally {
34
- _activeControllers.delete(controller);
35
- _active.update((n) => n - 1);
36
- void tryRun();
36
+ if (controller)
37
+ activeControllers.delete(controller);
38
+ active--;
39
+ pump();
37
40
  }
38
41
  }
42
+ function pump() {
43
+ while (active < concurrency && head < items.length) {
44
+ const item = items[head];
45
+ items[head++] = undefined;
46
+ if (head === items.length) {
47
+ items = [];
48
+ head = 0;
49
+ }
50
+ active++;
51
+ void execute(item);
52
+ }
53
+ publish();
54
+ }
39
55
  function run(...args) {
40
- const controller = new AbortController();
41
56
  return new Promise((resolve) => {
42
- _queue.push({ args, resolve, controller });
43
- _pending.update((n) => n + 1);
44
- void tryRun();
57
+ items.push({ args, resolve, controller: wantsSignal ? new AbortController() : undefined });
58
+ // While every slot is busy only the backlog grows.
59
+ if (active < concurrency)
60
+ pump();
61
+ else
62
+ writeSignal(pendingNode, items.length - head);
45
63
  });
46
64
  }
47
- run.loading = computed(() => _active() > 0);
48
- run.active = computed(() => _active());
49
- run.pending = computed(() => _pending());
50
- run.error = computed(() => _error());
65
+ run.loading = readonlyView(loadingNode);
66
+ run.active = readonlyView(activeNode);
67
+ run.pending = readonlyView(pendingNode);
68
+ run.error = readonlyView(error);
51
69
  run.cancelAll = () => {
52
- for (const c of _activeControllers) {
70
+ for (const c of activeControllers)
53
71
  c.abort();
72
+ activeControllers.clear();
73
+ const cleared = items;
74
+ const from = head;
75
+ items = [];
76
+ head = 0;
77
+ for (let i = from; i < cleared.length; i++) {
78
+ const item = cleared[i];
79
+ item.controller?.abort();
80
+ item.resolve(undefined);
54
81
  }
55
- _activeControllers.clear();
56
- while (_queue.length > 0) {
57
- const item = _queue.shift();
58
- item?.controller.abort();
59
- item?.resolve(undefined);
60
- }
61
- _pending.set(0);
82
+ publish();
62
83
  };
63
84
  return run;
64
85
  }
package/dist/pool.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAMD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,KAAK,CAAC,CAAC,EACrB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,aAAa,CAAC,CAAC,CAAC,CAgFlB"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACf;AASD,wBAAgB,KAAK,CAAC,CAAC,EACrB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,aAAa,CAAC,CAAC,CAAC,CAiFlB"}
package/dist/queue.js CHANGED
@@ -1,86 +1,89 @@
1
- import { signal, computed } from "@praxisjs/core/internal";
2
- import { acceptsSignal } from "./utils";
1
+ import { SignalNode, writeSignal } from "@praxisjs/core/internal";
2
+ import { acceptsSignal, isAbortError, readonlyView, toError } from "./utils";
3
3
  export class QueueClearedError extends Error {
4
4
  constructor() {
5
5
  super("Queue cleared");
6
6
  this.name = "QueueClearedError";
7
7
  }
8
8
  }
9
- function isAbortError(err) {
10
- return err instanceof Error && err.name === "AbortError";
11
- }
12
9
  export function queue(fn, options) {
13
- const _loading = signal(false);
14
- const _pending = signal(0);
15
- const _error = signal(null);
16
- const _wantsSignal = options?.signal ?? acceptsSignal(fn);
17
- const _queue = [];
18
- let _running = false;
19
- let _cleared = false;
20
- let _activeController = null;
21
- let _activeAbortedByClear = false;
10
+ const loading = new SignalNode(false);
11
+ const pending = new SignalNode(0);
12
+ const error = new SignalNode(null);
13
+ const wantsSignal = options?.signal ?? acceptsSignal(fn);
14
+ // FIFO read from `head`: shifting the array instead made draining n calls O(n²).
15
+ let items = [];
16
+ let head = 0;
17
+ let running = false;
18
+ let inCall = false;
19
+ let activeController;
20
+ let activeAbortedByClear = false;
22
21
  async function drain() {
23
- if (_running || _queue.length === 0)
22
+ if (running || head === items.length)
24
23
  return;
25
- _running = true;
26
- _loading.set(true);
27
- while (_queue.length > 0) {
28
- const item = _queue[0];
29
- _queue.shift();
24
+ running = true;
25
+ writeSignal(loading, true);
26
+ while (head < items.length) {
27
+ const item = items[head];
28
+ items[head++] = undefined;
29
+ if (head === items.length) {
30
+ items = [];
31
+ head = 0;
32
+ }
30
33
  const { args, resolve, reject, controller } = item;
31
- _activeController = controller;
32
- _activeAbortedByClear = false;
33
- _pending.update((n) => n - 1);
34
+ activeController = controller;
35
+ activeAbortedByClear = false;
36
+ inCall = true;
37
+ writeSignal(pending, items.length - head);
34
38
  try {
35
- const result = await (_wantsSignal ? fn(controller.signal, ...args) : fn(...args));
39
+ const result = await (controller ? fn(controller.signal, ...args) : fn(...args));
36
40
  resolve(result);
37
41
  }
38
42
  catch (err) {
39
- // _activeAbortedByClear is set asynchronously by clear() between the await and this catch
43
+ // activeAbortedByClear is set by clear() while the call is awaited
40
44
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
41
- if (isAbortError(err) && _activeAbortedByClear) {
45
+ if (isAbortError(err) && activeAbortedByClear) {
42
46
  reject(new QueueClearedError());
43
47
  }
44
48
  else {
45
- const e = err instanceof Error ? err : new Error(String(err));
46
- _error.set(e);
49
+ const e = toError(err);
50
+ writeSignal(error, e);
47
51
  reject(e);
48
52
  }
49
53
  }
50
54
  finally {
51
- _activeController = null;
55
+ inCall = false;
56
+ activeController = undefined;
52
57
  }
53
58
  }
54
- _cleared = false;
55
- _running = false;
56
- _loading.set(false);
59
+ running = false;
60
+ writeSignal(loading, false);
57
61
  }
58
62
  function enqueue(...args) {
59
- if (_cleared) {
60
- _cleared = false;
61
- }
62
- const controller = new AbortController();
63
63
  return new Promise((resolve, reject) => {
64
- _queue.push({ args, resolve, reject, controller });
65
- _pending.update((n) => n + 1);
64
+ items.push({ args, resolve, reject, controller: wantsSignal ? new AbortController() : undefined });
65
+ writeSignal(pending, items.length - head);
66
66
  void drain();
67
67
  });
68
68
  }
69
- enqueue.loading = computed(() => _loading());
70
- enqueue.pending = computed(() => _pending());
71
- enqueue.error = computed(() => _error());
69
+ enqueue.loading = readonlyView(loading);
70
+ enqueue.pending = readonlyView(pending);
71
+ enqueue.error = readonlyView(error);
72
72
  enqueue.clear = () => {
73
- if (_activeController) {
74
- _activeAbortedByClear = true;
75
- _activeController.abort();
73
+ if (inCall) {
74
+ activeAbortedByClear = true;
75
+ activeController?.abort();
76
76
  }
77
- while (_queue.length > 0) {
78
- const item = _queue.shift();
79
- item?.controller.abort();
80
- item?.reject(new QueueClearedError());
77
+ const cleared = items;
78
+ const from = head;
79
+ items = [];
80
+ head = 0;
81
+ for (let i = from; i < cleared.length; i++) {
82
+ const item = cleared[i];
83
+ item.controller?.abort();
84
+ item.reject(new QueueClearedError());
81
85
  }
82
- _pending.set(0);
83
- _cleared = true;
86
+ writeSignal(pending, 0);
84
87
  };
85
88
  return enqueue;
86
89
  }
package/dist/queue.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,UAAU,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/B,SAAS,IAAI,IAAI,CAAC;CACnB;AAMD,wBAAgB,IAAI,CAAC,CAAC,EACpB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,YAAY,CAAC,CAAC,CAAC,CA0CjB"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9B,UAAU,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/B,SAAS,IAAI,IAAI,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,CAAC,EACpB,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,YAAY,CAAC,CAAC,CAAC,CAkDjB"}
package/dist/task.js CHANGED
@@ -1,48 +1,54 @@
1
- import { signal, computed } from "@praxisjs/core/internal";
2
- import { acceptsSignal } from "./utils";
3
- function isAbortError(err) {
4
- return err instanceof Error && err.name === "AbortError";
5
- }
1
+ import { endBatch, SignalNode, startBatch, writeSignal } from "@praxisjs/core/internal";
2
+ import { acceptsSignal, isAbortError, readonlyView, toError } from "./utils";
6
3
  export function task(fn, options) {
7
- const _loading = signal(false);
8
- const _error = signal(null);
9
- const _lastResult = signal(null);
10
- let _runId = 0;
11
- let _controller = null;
12
- const _wantsSignal = options?.signal ?? acceptsSignal(fn);
4
+ const loading = new SignalNode(false);
5
+ const error = new SignalNode(null);
6
+ const lastResult = new SignalNode(null);
7
+ let runId = 0;
8
+ // Only created when `fn` takes a signal: nothing else could observe the abort.
9
+ let controller = null;
10
+ const wantsSignal = options?.signal ?? acceptsSignal(fn);
13
11
  async function run(...args) {
14
- _controller?.abort();
15
- const controller = new AbortController();
16
- _controller = controller;
17
- const id = ++_runId;
18
- _loading.set(true);
19
- _error.set(null);
12
+ const id = ++runId;
13
+ let signal;
14
+ if (wantsSignal) {
15
+ controller?.abort();
16
+ controller = new AbortController();
17
+ signal = controller.signal;
18
+ }
19
+ startBatch();
20
+ writeSignal(loading, true);
21
+ writeSignal(error, null);
22
+ endBatch();
20
23
  try {
21
- const result = await (_wantsSignal ? fn(controller.signal, ...args) : fn(...args));
22
- if (id !== _runId)
24
+ const result = await (signal ? fn(signal, ...args) : fn(...args));
25
+ if (id !== runId)
23
26
  return undefined;
24
- _lastResult.set(result);
25
- _loading.set(false);
27
+ startBatch();
28
+ writeSignal(lastResult, result);
29
+ writeSignal(loading, false);
30
+ endBatch();
26
31
  return result;
27
32
  }
28
33
  catch (err) {
29
- if (id !== _runId)
34
+ if (id !== runId)
30
35
  return undefined;
31
- if (!isAbortError(err)) {
32
- _error.set(err instanceof Error ? err : new Error(String(err)));
33
- }
34
- _loading.set(false);
36
+ startBatch();
37
+ if (!isAbortError(err))
38
+ writeSignal(error, toError(err));
39
+ writeSignal(loading, false);
40
+ endBatch();
35
41
  return undefined;
36
42
  }
37
43
  }
38
- run.loading = computed(() => _loading());
39
- run.error = computed(() => _error());
40
- run.lastResult = computed(() => _lastResult());
44
+ run.loading = readonlyView(loading);
45
+ run.error = readonlyView(error);
46
+ run.lastResult = readonlyView(lastResult);
41
47
  run.cancelAll = () => {
42
- _controller?.abort();
43
- _controller = null;
44
- _runId++;
45
- _loading.set(false);
48
+ controller?.abort();
49
+ controller = null;
50
+ runId++;
51
+ writeSignal(loading, false);
46
52
  };
47
53
  return run;
48
54
  }
package/dist/task.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAUxC,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,EAAsC,EACtC,OAA8B;IAE9B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAe,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,MAAM,CAAW,IAAI,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,WAAW,GAA2B,IAAI,CAAC;IAC/C,MAAM,YAAY,GAAG,OAAO,EAAE,MAAM,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;IAE1D,KAAK,UAAU,GAAG,CAAC,GAAG,IAAe;QACnC,WAAW,EAAE,KAAK,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,WAAW,GAAG,UAAU,CAAC;QACzB,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACnF,IAAI,EAAE,KAAK,MAAM;gBAAE,OAAO,SAAS,CAAC;YACpC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,EAAE,KAAK,MAAM;gBAAE,OAAO,SAAS,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE;QACnB,WAAW,EAAE,KAAK,EAAE,CAAC;QACrB,WAAW,GAAG,IAAI,CAAC;QACnB,MAAM,EAAE,CAAC;QACT,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,GAAsB,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGxF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAU7E,MAAM,UAAU,IAAI,CAClB,EAAsC,EACtC,OAA8B;IAE9B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAe,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAW,IAAI,CAAC,CAAC;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,+EAA+E;IAC/E,IAAI,UAAU,GAA2B,IAAI,CAAC;IAC9C,MAAM,WAAW,GAAG,OAAO,EAAE,MAAM,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;IAEzD,KAAK,UAAU,GAAG,CAAC,GAAG,IAAe;QACnC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;QACnB,IAAI,MAA+B,CAAC;QACpC,IAAI,WAAW,EAAE,CAAC;YAChB,UAAU,EAAE,KAAK,EAAE,CAAC;YACpB,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QAC7B,CAAC;QACD,UAAU,EAAE,CAAC;QACb,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAClE,IAAI,EAAE,KAAK,KAAK;gBAAE,OAAO,SAAS,CAAC;YACnC,UAAU,EAAE,CAAC;YACb,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAChC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,QAAQ,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,EAAE,KAAK,KAAK;gBAAE,OAAO,SAAS,CAAC;YACnC,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;gBAAE,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACzD,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,QAAQ,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,GAAG,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,GAAG,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE;QACnB,UAAU,EAAE,KAAK,EAAE,CAAC;QACpB,UAAU,GAAG,IAAI,CAAC;QAClB,KAAK,EAAE,CAAC;QACR,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,GAAsB,CAAC;AAChC,CAAC"}
package/dist/utils.d.ts CHANGED
@@ -1,9 +1,21 @@
1
+ import { type SignalNode } from "@praxisjs/core/internal";
2
+ import type { Computed } from "@praxisjs/shared";
1
3
  /**
2
4
  * Returns true if the function declares `signal` as its first parameter name.
3
5
  * Used to decide whether to inject an AbortSignal at call time.
4
6
  *
5
7
  * Works on unminified source (class methods, arrow functions, async functions).
6
8
  * Bound functions always return false — check the original method before binding.
9
+ *
10
+ * Cached per function: a decorated method is the same prototype function for every instance, and
11
+ * reading its source on each construction was the main cost of creating a decorated component.
7
12
  */
8
13
  export declare function acceptsSignal(fn: (...args: any[]) => any): boolean;
14
+ /**
15
+ * A read-only `Computed` view of a signal node: reading it tracks the node directly, without the
16
+ * extra computed node, getter closure and recomputation a `computed(() => sig())` wrapper costs.
17
+ */
18
+ export declare function readonlyView<T>(node: SignalNode<T>): Computed<T>;
19
+ export declare function isAbortError(err: unknown): boolean;
20
+ export declare function toError(err: unknown): Error;
9
21
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAelE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD;;;;;;;;;GASG;AAEH,wBAAgB,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAOlE;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAgBhE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAE3C"}