@solidjs/signals 0.9.8 → 0.9.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.
@@ -5,12 +5,13 @@ export interface BoundaryComputed<T> extends Computed<T> {
5
5
  }
6
6
  export declare class CollectionQueue extends Queue {
7
7
  _collectionType: number;
8
- _nodes: Set<Effect<any>>;
8
+ _sources: Set<Computed<any>>;
9
9
  _disabled: Signal<boolean>;
10
10
  _initialized: boolean;
11
11
  constructor(type: number);
12
12
  run(type: number): void;
13
- notify(node: Effect<any>, type: number, flags: number): boolean;
13
+ notify(node: Effect<any>, type: number, flags: number, error?: any): boolean;
14
+ checkSources(): void;
14
15
  }
15
16
  export declare const enum BoundaryMode {
16
17
  VISIBLE = "visible",
@@ -1,5 +1,5 @@
1
1
  import { $REFRESH, NOT_PENDING } from "./constants.js";
2
- import { type IQueue, type Transition } from "./scheduler.js";
2
+ import { type IQueue, type OptimisticLane, type Transition } from "./scheduler.js";
3
3
  export interface Disposable {
4
4
  (): void;
5
5
  }
@@ -30,6 +30,7 @@ export interface RawSignal<T> {
30
30
  _transition: Transition | null;
31
31
  _pendingValue: T | typeof NOT_PENDING;
32
32
  _optimistic?: boolean;
33
+ _optimisticLane?: OptimisticLane;
33
34
  _pendingSignal?: Signal<boolean>;
34
35
  _pendingValueComputed?: Computed<T>;
35
36
  }
@@ -62,7 +63,7 @@ export interface Computed<T> extends RawSignal<T>, Owner {
62
63
  _fn: (prev?: T) => T;
63
64
  _inFlight: PromiseLike<T> | AsyncIterable<T> | null;
64
65
  _child: FirewallSignal<any> | null;
65
- _notifyStatus?: () => void;
66
+ _notifyStatus?: (status?: number, error?: any) => void;
66
67
  }
67
68
  export interface Root extends Owner {
68
69
  _root: true;
@@ -1,6 +1,10 @@
1
1
  export declare class NotReadyError extends Error {
2
- cause: any;
3
- constructor(cause: any);
2
+ _source: any;
3
+ constructor(_source: any);
4
+ }
5
+ export declare class StatusError extends Error {
6
+ _source: any;
7
+ constructor(_source: any, original: any);
4
8
  }
5
9
  export declare class NoOwnerError extends Error {
6
10
  constructor();
@@ -4,9 +4,62 @@ export declare const dirtyQueue: Heap;
4
4
  export declare const zombieQueue: Heap;
5
5
  export declare let clock: number;
6
6
  export declare let activeTransition: Transition | null;
7
- export declare let optimisticReadActive: boolean;
8
7
  export declare let projectionWriteActive: boolean;
9
- export declare function setOptimisticReadActive(value: boolean): void;
8
+ /**
9
+ * OptimisticLane represents the context for a single optimistic write.
10
+ * Each optimistic signal creates its own lane. Lanes merge when their
11
+ * dependency graphs overlap.
12
+ */
13
+ export interface OptimisticLane {
14
+ _source: Signal<any>;
15
+ _pendingAsync: Set<Computed<any>>;
16
+ _effectQueues: [QueueCallback[], QueueCallback[]];
17
+ _mergedInto: OptimisticLane | null;
18
+ _transition: Transition | null;
19
+ }
20
+ export declare const activeLanes: Set<OptimisticLane>;
21
+ export declare let currentOptimisticLane: OptimisticLane | null;
22
+ export declare function setCurrentOptimisticLane(lane: OptimisticLane | null): void;
23
+ /**
24
+ * Get an existing lane for a signal or create a new one.
25
+ * Reuses lane for multiple writes to the same signal.
26
+ */
27
+ export declare function getOrCreateLane(signal: Signal<any>): OptimisticLane;
28
+ /**
29
+ * Union-find: find the root lane.
30
+ */
31
+ export declare function findLane(lane: OptimisticLane): OptimisticLane;
32
+ /**
33
+ * Merge two lanes when their dependency graphs overlap.
34
+ */
35
+ export declare function mergeLanes(lane1: OptimisticLane, lane2: OptimisticLane): OptimisticLane;
36
+ /**
37
+ * Clear a signal's lane entry so the next getOrCreateLane creates a fresh lane.
38
+ * Used after merging a sub-lane (e.g., _pendingSignal) into a parent lane.
39
+ */
40
+ export declare function clearLaneEntry(signal: Signal<any>): void;
41
+ /**
42
+ * Resolve a node's lane: follow union-find chain, verify active, clear if stale.
43
+ */
44
+ export declare function resolveLane(el: {
45
+ _optimisticLane?: OptimisticLane;
46
+ }): OptimisticLane | undefined;
47
+ /**
48
+ * Check if a node has an active optimistic override (pending value differs from base).
49
+ */
50
+ export declare function hasActiveOverride(el: {
51
+ _optimistic?: boolean;
52
+ _pendingValue?: any;
53
+ }): boolean;
54
+ /**
55
+ * Assign or merge a lane onto a node. At convergence points (node already has
56
+ * a different active lane), merge unless the node has an active override.
57
+ */
58
+ export declare function assignOrMergeLane(el: {
59
+ _optimisticLane?: OptimisticLane;
60
+ _optimistic?: boolean;
61
+ _pendingValue?: any;
62
+ }, sourceLane: OptimisticLane): void;
10
63
  export declare function setProjectionWriteActive(value: boolean): void;
11
64
  export type QueueCallback = (type: number) => void;
12
65
  type QueueStub = {
@@ -14,14 +67,14 @@ type QueueStub = {
14
67
  _children: QueueStub[];
15
68
  };
16
69
  export interface Transition {
17
- time: number;
18
- asyncNodes: Computed<any>[];
19
- pendingNodes: Signal<any>[];
20
- optimisticNodes: Signal<any>[];
21
- optimisticStores: Set<any>;
22
- actions: Array<Generator<any, any, any> | AsyncGenerator<any, any, any>>;
23
- queueStash: QueueStub;
24
- done: boolean | Transition;
70
+ _time: number;
71
+ _asyncNodes: Computed<any>[];
72
+ _pendingNodes: Signal<any>[];
73
+ _optimisticNodes: Signal<any>[];
74
+ _optimisticStores: Set<any>;
75
+ _actions: Array<Generator<any, any, any> | AsyncGenerator<any, any, any>>;
76
+ _queueStash: QueueStub;
77
+ _done: boolean | Transition;
25
78
  }
26
79
  export declare function schedule(): void;
27
80
  export interface IQueue {
@@ -30,7 +83,7 @@ export interface IQueue {
30
83
  addChild(child: IQueue): void;
31
84
  removeChild(child: IQueue): void;
32
85
  created: number;
33
- notify(node: Computed<any>, mask: number, flags: number): boolean;
86
+ notify(node: Computed<any>, mask: number, flags: number, error?: any): boolean;
34
87
  stashQueues(stub: QueueStub): void;
35
88
  restoreQueues(stub: QueueStub): void;
36
89
  _parent: IQueue | null;
@@ -38,15 +91,12 @@ export interface IQueue {
38
91
  export declare class Queue implements IQueue {
39
92
  _parent: IQueue | null;
40
93
  _queues: [QueueCallback[], QueueCallback[]];
41
- _optimisticQueues: [QueueCallback[], QueueCallback[]];
42
94
  _children: IQueue[];
43
95
  created: number;
44
96
  addChild(child: IQueue): void;
45
97
  removeChild(child: IQueue): void;
46
- notify(node: Computed<any>, mask: number, flags: number): boolean;
47
- private _runQueue;
98
+ notify(node: Computed<any>, mask: number, flags: number, error?: any): boolean;
48
99
  run(type: number): void;
49
- runOptimistic(type: number): void;
50
100
  enqueue(type: number, fn: QueueCallback): void;
51
101
  stashQueues(stub: QueueStub): void;
52
102
  restoreQueues(stub: QueueStub): void;
@@ -60,7 +110,7 @@ export declare class GlobalQueue extends Queue {
60
110
  static _dispose: (el: Computed<unknown>, self: boolean, zombie: boolean) => void;
61
111
  static _clearOptimisticStore: ((store: any) => void) | null;
62
112
  flush(): void;
63
- notify(node: Computed<any>, mask: number, flags: number): boolean;
113
+ notify(node: Computed<any>, mask: number, flags: number, error?: any): boolean;
64
114
  initTransition(transition?: Transition | null): void;
65
115
  }
66
116
  export declare function insertSubs(node: Signal<any> | Computed<any>, optimistic?: boolean): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solidjs/signals",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",