@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.
- package/CHANGELOG.md +23 -0
- package/dist/decorators.d.ts +3 -3
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +23 -38
- package/dist/decorators.js.map +1 -1
- package/dist/pool.d.ts.map +1 -1
- package/dist/pool.js +64 -43
- package/dist/pool.js.map +1 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +53 -50
- package/dist/queue.js.map +1 -1
- package/dist/task.d.ts.map +1 -1
- package/dist/task.js +39 -33
- package/dist/task.js.map +1 -1
- package/dist/utils.d.ts +12 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +42 -0
- package/dist/utils.js.map +1 -1
- package/package.json +15 -6
- package/src/decorators.ts +37 -38
- package/src/pool.ts +64 -46
- package/src/queue.ts +60 -56
- package/src/task.ts +38 -34
- package/src/utils.ts +55 -0
- package/dist/__tests__/decorators.test.d.ts +0 -2
- package/dist/__tests__/decorators.test.d.ts.map +0 -1
- package/dist/__tests__/decorators.test.js +0 -195
- package/dist/__tests__/decorators.test.js.map +0 -1
- package/dist/__tests__/pool.test.d.ts +0 -2
- package/dist/__tests__/pool.test.d.ts.map +0 -1
- package/dist/__tests__/pool.test.js +0 -196
- package/dist/__tests__/pool.test.js.map +0 -1
- package/dist/__tests__/queue.test.d.ts +0 -2
- package/dist/__tests__/queue.test.d.ts.map +0 -1
- package/dist/__tests__/queue.test.js +0 -173
- package/dist/__tests__/queue.test.js.map +0 -1
- package/dist/__tests__/task.test.d.ts +0 -2
- package/dist/__tests__/task.test.d.ts.map +0 -1
- package/dist/__tests__/task.test.js +0 -182
- package/dist/__tests__/task.test.js.map +0 -1
- package/dist/__tests__/utils.test.d.ts +0 -2
- package/dist/__tests__/utils.test.d.ts.map +0 -1
- package/dist/__tests__/utils.test.js +0 -32
- package/dist/__tests__/utils.test.js.map +0 -1
- package/src/__tests__/decorators.test.ts +0 -267
- package/src/__tests__/pool.test.ts +0 -212
- package/src/__tests__/queue.test.ts +0 -197
- package/src/__tests__/task.test.ts +0 -205
- package/src/__tests__/utils.test.ts +0 -48
- 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
|
package/dist/decorators.d.ts
CHANGED
|
@@ -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>) =>
|
|
35
|
-
export declare function Queue(methodName: string): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) =>
|
|
36
|
-
export declare function Pool(methodName: string, concurrency?: number): <This extends object, Value = unknown>(_value: undefined, context: ClassFieldDecoratorContext<This, Value>) =>
|
|
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
|
package/dist/decorators.d.ts.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/decorators.js
CHANGED
|
@@ -1,52 +1,37 @@
|
|
|
1
|
-
import {
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
package/dist/decorators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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"}
|
package/dist/pool.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
_activeControllers.add(controller);
|
|
25
|
+
if (controller)
|
|
26
|
+
activeControllers.add(controller);
|
|
23
27
|
try {
|
|
24
|
-
|
|
25
|
-
resolve(result);
|
|
28
|
+
resolve(await (controller ? fn(controller.signal, ...args) : fn(...args)));
|
|
26
29
|
}
|
|
27
30
|
catch (err) {
|
|
28
|
-
if (!isAbortError(err))
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
+
if (!isAbortError(err))
|
|
32
|
+
writeSignal(error, toError(err));
|
|
31
33
|
resolve(undefined);
|
|
32
34
|
}
|
|
33
35
|
finally {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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 =
|
|
48
|
-
run.active =
|
|
49
|
-
run.pending =
|
|
50
|
-
run.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
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
let
|
|
19
|
-
let
|
|
20
|
-
let
|
|
21
|
-
let
|
|
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 (
|
|
22
|
+
if (running || head === items.length)
|
|
24
23
|
return;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
while (
|
|
28
|
-
const item =
|
|
29
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
activeController = controller;
|
|
35
|
+
activeAbortedByClear = false;
|
|
36
|
+
inCall = true;
|
|
37
|
+
writeSignal(pending, items.length - head);
|
|
34
38
|
try {
|
|
35
|
-
const result = await (
|
|
39
|
+
const result = await (controller ? fn(controller.signal, ...args) : fn(...args));
|
|
36
40
|
resolve(result);
|
|
37
41
|
}
|
|
38
42
|
catch (err) {
|
|
39
|
-
//
|
|
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) &&
|
|
45
|
+
if (isAbortError(err) && activeAbortedByClear) {
|
|
42
46
|
reject(new QueueClearedError());
|
|
43
47
|
}
|
|
44
48
|
else {
|
|
45
|
-
const e =
|
|
46
|
-
|
|
49
|
+
const e = toError(err);
|
|
50
|
+
writeSignal(error, e);
|
|
47
51
|
reject(e);
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
finally {
|
|
51
|
-
|
|
55
|
+
inCall = false;
|
|
56
|
+
activeController = undefined;
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
65
|
-
|
|
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 =
|
|
70
|
-
enqueue.pending =
|
|
71
|
-
enqueue.error =
|
|
69
|
+
enqueue.loading = readonlyView(loading);
|
|
70
|
+
enqueue.pending = readonlyView(pending);
|
|
71
|
+
enqueue.error = readonlyView(error);
|
|
72
72
|
enqueue.clear = () => {
|
|
73
|
-
if (
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
if (inCall) {
|
|
74
|
+
activeAbortedByClear = true;
|
|
75
|
+
activeController?.abort();
|
|
76
76
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
|
package/dist/task.d.ts.map
CHANGED
|
@@ -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;
|
|
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 {
|
|
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
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
let
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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 (
|
|
22
|
-
if (id !==
|
|
24
|
+
const result = await (signal ? fn(signal, ...args) : fn(...args));
|
|
25
|
+
if (id !== runId)
|
|
23
26
|
return undefined;
|
|
24
|
-
|
|
25
|
-
|
|
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 !==
|
|
34
|
+
if (id !== runId)
|
|
30
35
|
return undefined;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 =
|
|
39
|
-
run.error =
|
|
40
|
-
run.lastResult =
|
|
44
|
+
run.loading = readonlyView(loading);
|
|
45
|
+
run.error = readonlyView(error);
|
|
46
|
+
run.lastResult = readonlyView(lastResult);
|
|
41
47
|
run.cancelAll = () => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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,
|
|
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
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|