@cnstra/core 1.4.0 → 1.5.2
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/README.md +9 -7
- package/dist/CNS.d.ts +15 -7
- package/dist/CNS.d.ts.map +1 -1
- package/dist/CNSCollateral.d.ts +5 -5
- package/dist/CNSFunctionalQueue.d.ts +3 -3
- package/dist/CNSStimulation.d.ts +7 -7
- package/dist/CNSStimulation.d.ts.map +1 -1
- package/dist/factory/index.d.ts +12 -10
- package/dist/factory/index.d.ts.map +1 -1
- package/dist/index.cjs +41 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -42
- package/dist/index.js.map +1 -1
- package/dist/interfaces/ICNS.d.ts +8 -2
- package/dist/interfaces/ICNS.d.ts.map +1 -1
- package/dist/interfaces/ICNSCollateral.d.ts +3 -3
- package/dist/types/TCNSAxon.d.ts +2 -2
- package/dist/types/TCNSDendrite.d.ts +5 -4
- package/dist/types/TCNSDendrite.d.ts.map +1 -1
- package/dist/types/TCNSLocalContextValueStore.d.ts +1 -0
- package/dist/types/TCNSLocalContextValueStore.d.ts.map +1 -1
- package/dist/types/TCNSNeuron.d.ts +2 -2
- package/dist/types/TCNSNeuronResponseReturn.d.ts +1 -1
- package/dist/types/TCNSSignal.d.ts +2 -2
- package/dist/types/TCNSStimulationOptions.d.ts +3 -3
- package/dist/types/TCNSStimulationQueueItem.d.ts +2 -2
- package/dist/types/TCNSStimulationResponse.d.ts +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,16 +9,18 @@ You explicitly start a run with `cns.stimulate(...)`; CNStra then performs a **d
|
|
|
9
9
|
|
|
10
10
|
> **Zero dependencies:** CNS has no third-party dependencies, making it suitable for any JavaScript/TypeScript environment - browsers, Node.js, serverless, edge functions, React Native, or embedded systems.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
**No pub/sub:** there are no ambient listeners or global `emit`. Only the **signal you return** from a dendrite continues the traversal; returning `null`/`undefined` ends that branch. Hop limits guard against cycles.
|
|
13
|
+
|
|
14
|
+
We follow the **IERG approach — Inverted Explicit Reactive Graph**. You explicitly stimulate the graph; reactions are local and deterministic; no background listeners or buses exist.
|
|
13
15
|
|
|
14
16
|
## 💡 Why CNStra
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
IERG is our inverted control flow: you start the run, we walk the reaction graph explicitly. This is not Flux and not an event bus.
|
|
17
19
|
|
|
18
20
|
- **Deterministic routing**: signals are delivered along an explicit neuron graph, not broadcast to whoever “happens to listen”.
|
|
19
21
|
- **Readable, reliable flows**: each step is local and typed; branches are explicit, so debugging feels like reading a storyboard, not a log stream.
|
|
20
22
|
- **Backpressure & concurrency**: built‑in per‑stimulation and per‑neuron concurrency limits keep workloads controlled without custom plumbing.
|
|
21
|
-
- **Saga‑grade orchestration**:
|
|
23
|
+
- **Saga‑grade orchestration**: IERG already models long‑running, multi‑step reactions with retries/cancellation hooks (abort), so you rarely need to hand‑roll “sagas”.
|
|
22
24
|
- **Safer than ad‑hoc events**: no hidden global listeners, no accidental fan‑out; every continuation must be returned explicitly.
|
|
23
25
|
|
|
24
26
|
## 🏗️ Core Model
|
|
@@ -265,12 +267,12 @@ await cns.stimulate(signal, {
|
|
|
265
267
|
});
|
|
266
268
|
```
|
|
267
269
|
|
|
268
|
-
### `
|
|
269
|
-
Filter which collateral
|
|
270
|
+
### `allowName?: (collateralName: string) => boolean`
|
|
271
|
+
Filter which collateral names can be processed.
|
|
270
272
|
|
|
271
273
|
```typescript
|
|
272
274
|
await cns.stimulate(signal, {
|
|
273
|
-
|
|
275
|
+
allowName: (name) => name.startsWith('user:') // Only process user-related signals
|
|
274
276
|
});
|
|
275
277
|
```
|
|
276
278
|
|
|
@@ -446,7 +448,7 @@ const cns = new CNS([validator, handler]);
|
|
|
446
448
|
|
|
447
449
|
### Event Sourcing
|
|
448
450
|
```typescript
|
|
449
|
-
const eventReceived = collateral<{
|
|
451
|
+
const eventReceived = collateral<{ name: string; data: any }>('event:received');
|
|
450
452
|
const eventStored = collateral<{ eventId: string }>('event:stored');
|
|
451
453
|
const stateUpdated = collateral<{ aggregateId: string }>('state:updated');
|
|
452
454
|
|
package/dist/CNS.d.ts
CHANGED
|
@@ -4,17 +4,22 @@ import { ICNS } from './interfaces/ICNS';
|
|
|
4
4
|
import { TCNSSubscriber } from './types/TCNSSubscriber';
|
|
5
5
|
import { TCNSOptions } from './types/TCNSOptions';
|
|
6
6
|
import { TCNSStimulationOptions } from './types/TCNSStimulationOptions';
|
|
7
|
+
import { CNSCollateral } from './CNSCollateral';
|
|
7
8
|
import { TCNSSignal } from './types/TCNSSignal';
|
|
8
9
|
import { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';
|
|
9
|
-
|
|
10
|
+
import { TCNSStimulationResponse } from './types/TCNSStimulationResponse';
|
|
11
|
+
export declare class CNS<TCollateralName extends string, TNeuronName extends string, TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>> implements ICNS<TNeuron, TDendrite> {
|
|
10
12
|
protected readonly neurons: TNeuron[];
|
|
11
13
|
readonly options?: TCNSOptions | undefined;
|
|
12
14
|
/**
|
|
13
|
-
* Fast lookup:
|
|
15
|
+
* Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.
|
|
14
16
|
* Built once at construction time.
|
|
15
17
|
*/
|
|
16
18
|
private subIndex;
|
|
17
|
-
private
|
|
19
|
+
private neuronIndex;
|
|
20
|
+
private dendriteIndex;
|
|
21
|
+
private collateralIndex;
|
|
22
|
+
private parentNeuronByCollateralName;
|
|
18
23
|
/**
|
|
19
24
|
* Strongly Connected Components of the neuron graph.
|
|
20
25
|
* Each component is a set of neuron IDs that can reach each other.
|
|
@@ -55,7 +60,7 @@ export declare class CNS<TCollateralType extends string, TNeuronName extends str
|
|
|
55
60
|
* Throws aggregated error if violations are found.
|
|
56
61
|
*/
|
|
57
62
|
private validateUniqueIdentifiers;
|
|
58
|
-
addResponseListener(listener: (response:
|
|
63
|
+
addResponseListener(listener: <TInputPayload, TOutputPayload>(response: TCNSStimulationResponse<TCollateralName, TInputPayload, TOutputPayload>) => void): () => void;
|
|
59
64
|
wrapOnResponse<T>(local?: (response: T) => void): (response: T) => void;
|
|
60
65
|
protected runWithNeuronConcurrency(neuron: TNeuron, fn: () => (() => void) | Promise<() => void>): Promise<void>;
|
|
61
66
|
private buildIndexes;
|
|
@@ -95,8 +100,11 @@ export declare class CNS<TCollateralType extends string, TNeuronName extends str
|
|
|
95
100
|
* This is the core logic for safe context cleanup.
|
|
96
101
|
*/
|
|
97
102
|
canNeuronBeGuaranteedDone(neuronName: string, activeSccCounts: Map<number, number>): boolean;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
103
|
+
getParentNeuronByCollateralName(collateralName: TCollateralName): TNeuron | undefined;
|
|
104
|
+
getDendrites(): TDendrite[];
|
|
105
|
+
getCollaterals(): CNSCollateral<TCollateralName, unknown>[];
|
|
106
|
+
getNeurons(): TNeuron[];
|
|
107
|
+
getSubscribers(collateralName: TCollateralName): TCNSSubscriber<TNeuron, TDendrite>[];
|
|
108
|
+
stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(signal: TCNSSignal<TCollateralName, TInputPayload>, options?: TCNSStimulationOptions<TCollateralName, TInputPayload, TOutputPayload>): void;
|
|
101
109
|
}
|
|
102
110
|
//# sourceMappingURL=CNS.d.ts.map
|
package/dist/CNS.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CNS.d.ts","sourceRoot":"","sources":["../src/CNS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"CNS.d.ts","sourceRoot":"","sources":["../src/CNS.ts"],"names":[],"mappings":"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"}
|
package/dist/CNSCollateral.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TCNSSignal } from './types/TCNSSignal';
|
|
2
2
|
import { ICNSCollateral } from './interfaces/ICNSCollateral';
|
|
3
|
-
export declare class CNSCollateral<
|
|
4
|
-
readonly
|
|
5
|
-
constructor(
|
|
6
|
-
createSignal(): TCNSSignal<
|
|
7
|
-
createSignal(payload: TPayload): TCNSSignal<
|
|
3
|
+
export declare class CNSCollateral<TName extends string, TPayload> implements ICNSCollateral<TName, TPayload> {
|
|
4
|
+
readonly name: TName;
|
|
5
|
+
constructor(name: TName);
|
|
6
|
+
createSignal(): TCNSSignal<TName, TPayload>;
|
|
7
|
+
createSignal(payload: TPayload): TCNSSignal<TName, TPayload>;
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=CNSCollateral.d.ts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';
|
|
2
2
|
import { TCNSNeuron } from './types/TCNSNeuron';
|
|
3
3
|
import { TCNSDendrite } from './types/TCNSDendrite';
|
|
4
|
-
export declare class CNSFunctionalQueue<
|
|
4
|
+
export declare class CNSFunctionalQueue<TCollateralName extends string, TNeuronName extends string, TNeuron extends TCNSNeuron<any, TNeuronName, TCollateralName, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>> {
|
|
5
5
|
private readonly processor;
|
|
6
6
|
protected readonly concurrency?: number | undefined;
|
|
7
7
|
protected readonly abortSignal?: AbortSignal | undefined;
|
|
@@ -13,13 +13,13 @@ export declare class CNSFunctionalQueue<TCollateralType extends string, TNeuronN
|
|
|
13
13
|
protected activeOperations: number;
|
|
14
14
|
private pumping;
|
|
15
15
|
private needsPump;
|
|
16
|
-
constructor(processor: (item: TCNSStimulationQueueItem<
|
|
16
|
+
constructor(processor: (item: TCNSStimulationQueueItem<TCollateralName, TNeuronName, TNeuron, TDendrite>) => (() => void) | Promise<() => void>, concurrency?: number | undefined, abortSignal?: AbortSignal | undefined, initialCapacity?: number);
|
|
17
17
|
protected get canStartOperation(): boolean;
|
|
18
18
|
private resize;
|
|
19
19
|
private dequeue;
|
|
20
20
|
private enqueueItem;
|
|
21
21
|
protected pump(): void;
|
|
22
|
-
enqueue(x: TCNSStimulationQueueItem<
|
|
22
|
+
enqueue(x: TCNSStimulationQueueItem<TCollateralName, TNeuronName, TNeuron, TDendrite>): void;
|
|
23
23
|
get length(): number;
|
|
24
24
|
getActiveOperationsCount(): number;
|
|
25
25
|
}
|
package/dist/CNSStimulation.d.ts
CHANGED
|
@@ -5,9 +5,9 @@ import { TCNSDendrite } from './types/TCNSDendrite';
|
|
|
5
5
|
import { TCNSSubscriber } from './types/TCNSSubscriber';
|
|
6
6
|
import { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';
|
|
7
7
|
import { TCNSSignal } from './types/TCNSSignal';
|
|
8
|
-
export declare class CNSStimulation<
|
|
8
|
+
export declare class CNSStimulation<TCollateralName extends string, TNeuronName extends string, TNeuron extends TCNSNeuron<any, TNeuronName, TCollateralName, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>, TInputPayload, TOutputPayload> {
|
|
9
9
|
private readonly cns;
|
|
10
|
-
readonly options?: TCNSStimulationOptions<
|
|
10
|
+
readonly options?: TCNSStimulationOptions<TCollateralName, TInputPayload, TOutputPayload> | undefined;
|
|
11
11
|
private readonly ctx;
|
|
12
12
|
private readonly queue;
|
|
13
13
|
private readonly nueronVisitMap?;
|
|
@@ -18,7 +18,7 @@ export declare class CNSStimulation<TCollateralType extends string, TNeuronName
|
|
|
18
18
|
*/
|
|
19
19
|
private readonly activeSccCounts;
|
|
20
20
|
readonly id: string;
|
|
21
|
-
constructor(cns: ICNS<TNeuron, TDendrite>, instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>, options?: TCNSStimulationOptions<
|
|
21
|
+
constructor(cns: ICNS<TNeuron, TDendrite>, instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>, options?: TCNSStimulationOptions<TCollateralName, TInputPayload, TOutputPayload> | undefined);
|
|
22
22
|
protected get concurrencyEnabled(): boolean;
|
|
23
23
|
protected get autoCleanupContextsEnabled(): boolean;
|
|
24
24
|
/**
|
|
@@ -42,13 +42,13 @@ export declare class CNSStimulation<TCollateralType extends string, TNeuronName
|
|
|
42
42
|
*/
|
|
43
43
|
protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean;
|
|
44
44
|
protected cleanupCtxIfNeeded(neuron: TNeuron): void;
|
|
45
|
-
protected createSubscriberQueueItem(subscriber: TCNSSubscriber<TNeuron, TDendrite>, inputSignal?: TCNSSignal<
|
|
45
|
+
protected createSubscriberQueueItem(subscriber: TCNSSubscriber<TNeuron, TDendrite>, inputSignal?: TCNSSignal<TCollateralName, any>): {
|
|
46
46
|
neuronId: TNeuronName;
|
|
47
47
|
subscriber: TCNSSubscriber<TNeuron, TDendrite>;
|
|
48
|
-
inputSignal: TCNSSignal<
|
|
48
|
+
inputSignal: TCNSSignal<TCollateralName, any> | undefined;
|
|
49
49
|
};
|
|
50
50
|
private processQueueItem;
|
|
51
|
-
protected processResponse(inputSignal?: TCNSSignal<
|
|
52
|
-
responseToSignal(signal: TCNSSignal<
|
|
51
|
+
protected processResponse(inputSignal?: TCNSSignal<TCollateralName, TInputPayload>, outputSignal?: TCNSSignal<TCollateralName, TOutputPayload>, error?: any): void;
|
|
52
|
+
responseToSignal(signal: TCNSSignal<TCollateralName, TOutputPayload>): void;
|
|
53
53
|
}
|
|
54
54
|
//# sourceMappingURL=CNSStimulation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CNSStimulation.d.ts","sourceRoot":"","sources":["../src/CNSStimulation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,qBAAa,cAAc,CACvB,eAAe,SAAS,MAAM,EAC9B,WAAW,SAAS,MAAM,EAC1B,OAAO,SAAS,UAAU,CACtB,GAAG,EACH,WAAW,EACX,eAAe,EACf,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,CACN,EACD,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC5D,aAAa,EACb,cAAc;IAqBV,OAAO,CAAC,QAAQ,CAAC,GAAG;aAEJ,OAAO,CAAC,EAAE,sBAAsB,CAC5C,eAAe,EACf,aAAa,EACb,cAAc,CACjB;IAzBL,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkC;IACtE,OAAO,CAAC,cAAc,CAAK;IAE3B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D,SAAgB,EAAE,EAAE,MAAM,CAAC;gBAGN,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9C,mBAAmB,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,sBAAsB,CAC5C,eAAe,EACf,aAAa,EACb,cAAc,CACjB,YAAA;IAoBL,SAAS,KAAK,kBAAkB,IAAI,OAAO,CAK1C;IAED,SAAS,KAAK,0BAA0B,IAAI,OAAO,CAElD;IAED;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMvD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMzD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAQnE,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IASnD,SAAS,CAAC,yBAAyB,CAC/B,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9C,WAAW,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC;;;;;IA2BlD,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"CNSStimulation.d.ts","sourceRoot":"","sources":["../src/CNSStimulation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,qBAAa,cAAc,CACvB,eAAe,SAAS,MAAM,EAC9B,WAAW,SAAS,MAAM,EAC1B,OAAO,SAAS,UAAU,CACtB,GAAG,EACH,WAAW,EACX,eAAe,EACf,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,CACN,EACD,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC5D,aAAa,EACb,cAAc;IAqBV,OAAO,CAAC,QAAQ,CAAC,GAAG;aAEJ,OAAO,CAAC,EAAE,sBAAsB,CAC5C,eAAe,EACf,aAAa,EACb,cAAc,CACjB;IAzBL,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkC;IACtE,OAAO,CAAC,cAAc,CAAK;IAE3B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D,SAAgB,EAAE,EAAE,MAAM,CAAC;gBAGN,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9C,mBAAmB,EAAE,sBAAsB,CAAC,OAAO,CAAC,EACpC,OAAO,CAAC,EAAE,sBAAsB,CAC5C,eAAe,EACf,aAAa,EACb,cAAc,CACjB,YAAA;IAoBL,SAAS,KAAK,kBAAkB,IAAI,OAAO,CAK1C;IAED,SAAS,KAAK,0BAA0B,IAAI,OAAO,CAElD;IAED;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMvD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMzD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAQnE,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IASnD,SAAS,CAAC,yBAAyB,CAC/B,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAC9C,WAAW,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC;;;;;IA2BlD,OAAO,CAAC,gBAAgB;IAqExB,SAAS,CAAC,eAAe,CACrB,WAAW,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,aAAa,CAAC,EACxD,YAAY,CAAC,EAAE,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,EAC1D,KAAK,CAAC,EAAE,GAAG,GACZ,IAAI;IAqDA,gBAAgB,CACnB,MAAM,EAAE,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,GACpD,IAAI;CAWV"}
|
package/dist/factory/index.d.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import { CNSCollateral } from '../CNSCollateral';
|
|
2
2
|
import { TCNSAxon } from '../types/TCNSAxon';
|
|
3
3
|
import { TCNSDendrite } from '../types/TCNSDendrite';
|
|
4
|
-
export declare const collateral: <TPayload = undefined,
|
|
5
|
-
type
|
|
4
|
+
export declare const collateral: <TPayload = undefined, TName extends string = string>(name: TName) => CNSCollateral<TName, TPayload>;
|
|
5
|
+
type PayloadOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<any, infer P> ? P : never;
|
|
6
|
+
type NameOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<infer N, any> ? N : never;
|
|
7
|
+
type InterNeuronAPI<TContextValue, TNameType extends string, TReceiverCollateralName extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>> = {
|
|
6
8
|
name: TNameType;
|
|
7
9
|
axon: TAxonType;
|
|
8
10
|
concurrency?: number;
|
|
9
|
-
dendrites: TCNSDendrite<TContextValue, string, unknown,
|
|
10
|
-
setConcurrency: (n: number | undefined) => InterNeuronAPI<TContextValue, TNameType,
|
|
11
|
-
bind: <TFollowAxon extends
|
|
12
|
-
[K in keyof TFollowAxon]: TCNSDendrite<TContextValue, K & string, TFollowAxon
|
|
13
|
-
}) => InterNeuronAPI<TContextValue, TNameType,
|
|
14
|
-
dendrite: <
|
|
11
|
+
dendrites: TCNSDendrite<TContextValue, string, unknown, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType>[];
|
|
12
|
+
setConcurrency: (n: number | undefined) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType>;
|
|
13
|
+
bind: <TFollowAxon extends Record<string, CNSCollateral<any, any>>>(axon: TFollowAxon, dendrites: {
|
|
14
|
+
[K in keyof TFollowAxon]: TCNSDendrite<TContextValue, NameOf<TFollowAxon, K> & string, PayloadOf<TFollowAxon, K>, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType> | TCNSDendrite<TContextValue, NameOf<TFollowAxon, K> & string, PayloadOf<TFollowAxon, K>, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType>['response'];
|
|
15
|
+
}) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType>;
|
|
16
|
+
dendrite: <TSenderExactCollateralName extends string, TSenderExactAxonCollateralPayload>(s: TCNSDendrite<TContextValue, TSenderExactCollateralName, TSenderExactAxonCollateralPayload, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType>) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralName, TReceiverAxonCollateralPayload, TAxonType>;
|
|
15
17
|
};
|
|
16
|
-
export declare const neuron: <TContextValue, TNameType extends string,
|
|
18
|
+
export declare const neuron: <TContextValue, TNameType extends string, TProvidedAxon extends Record<string, CNSCollateral<any, any>>, TReceiverCollateralName extends keyof TProvidedAxon & string = keyof TProvidedAxon & string, TReceiverAxonCollateralPayload = TProvidedAxon[keyof TProvidedAxon] extends CNSCollateral<any, infer P> ? P : never>(name: TNameType, axon: TProvidedAxon) => InterNeuronAPI<TContextValue, TNameType, TReceiverCollateralName, TReceiverAxonCollateralPayload, TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>>;
|
|
17
19
|
export declare const withCtx: <TContextValue>() => {
|
|
18
|
-
neuron: <TNameType extends string,
|
|
20
|
+
neuron: <TNameType extends string, TProvidedAxon extends Record<string, CNSCollateral<any, any>>>(name: TNameType, axon: TProvidedAxon) => InterNeuronAPI<TContextValue, TNameType, keyof TProvidedAxon & string, TProvidedAxon[keyof TProvidedAxon] extends CNSCollateral<any, infer P> ? P : never, TCNSAxon<keyof TProvidedAxon & string, TProvidedAxon[keyof TProvidedAxon] extends CNSCollateral<any, infer P> ? P : never>>;
|
|
19
21
|
};
|
|
20
22
|
export {};
|
|
21
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,eAAO,MAAM,UAAU,GAAI,QAAQ,GAAG,SAAS,EAAE,KAAK,SAAS,MAAM,GAAG,MAAM,EAC1E,MAAM,KAAK,mCAC8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -215,7 +215,7 @@ var CNSStimulation = class {
|
|
|
215
215
|
if (this.options?.maxNeuronHops) {
|
|
216
216
|
if (this.nueronVisitMap?.get(subscriber.neuron.name) ?? 0 >= this.options?.maxNeuronHops) {
|
|
217
217
|
throw new Error(
|
|
218
|
-
`Max neuron hops reached for neuron "${subscriber.neuron.name}" when trying to enqueue subscriber "${subscriber.dendrite.collateral.
|
|
218
|
+
`Max neuron hops reached for neuron "${subscriber.neuron.name}" when trying to enqueue subscriber "${subscriber.dendrite.collateral.name}" in stimulation "${this.id}"`
|
|
219
219
|
);
|
|
220
220
|
} else {
|
|
221
221
|
this.nueronVisitMap?.set(
|
|
@@ -241,6 +241,7 @@ var CNSStimulation = class {
|
|
|
241
241
|
{
|
|
242
242
|
get: () => this.ctx.get(neuron2.name),
|
|
243
243
|
set: (value) => this.ctx.set(neuron2.name, value),
|
|
244
|
+
delete: () => this.ctx.delete(neuron2.name),
|
|
244
245
|
abortSignal: this.options?.abortSignal,
|
|
245
246
|
cns: this.cns
|
|
246
247
|
}
|
|
@@ -281,8 +282,8 @@ var CNSStimulation = class {
|
|
|
281
282
|
}
|
|
282
283
|
processResponse(inputSignal, outputSignal, error) {
|
|
283
284
|
const collateral2 = outputSignal?.collateral;
|
|
284
|
-
const ownerNeuron = collateral2 ? this.cns.
|
|
285
|
-
const subscribers = collateral2 ? this.cns.getSubscribers(collateral2.
|
|
285
|
+
const ownerNeuron = collateral2 ? this.cns.getParentNeuronByCollateralName(collateral2.name) : void 0;
|
|
286
|
+
const subscribers = collateral2 ? this.cns.getSubscribers(collateral2.name) : [];
|
|
286
287
|
const subscriberQueueItems = [];
|
|
287
288
|
if (collateral2 && !error) {
|
|
288
289
|
if (ownerNeuron) {
|
|
@@ -300,6 +301,7 @@ var CNSStimulation = class {
|
|
|
300
301
|
outputSignal,
|
|
301
302
|
ctx: this.ctx,
|
|
302
303
|
queueLength: this.queue.length + this.scheduledCount,
|
|
304
|
+
stimulationId: this.id,
|
|
303
305
|
hops: this.options?.maxNeuronHops && ownerNeuron ? this.nueronVisitMap?.get(ownerNeuron.name) ?? 0 : void 0,
|
|
304
306
|
error
|
|
305
307
|
});
|
|
@@ -309,8 +311,8 @@ var CNSStimulation = class {
|
|
|
309
311
|
}
|
|
310
312
|
}
|
|
311
313
|
responseToSignal(signal) {
|
|
312
|
-
const ownerNeuron = this.cns.
|
|
313
|
-
signal.collateral.
|
|
314
|
+
const ownerNeuron = this.cns.getParentNeuronByCollateralName(
|
|
315
|
+
signal.collateral.name
|
|
314
316
|
);
|
|
315
317
|
if (ownerNeuron) {
|
|
316
318
|
this.markNeuronActive(ownerNeuron.name);
|
|
@@ -462,11 +464,14 @@ var CNS = class {
|
|
|
462
464
|
this.neurons = neurons;
|
|
463
465
|
this.options = options;
|
|
464
466
|
/**
|
|
465
|
-
* Fast lookup:
|
|
467
|
+
* Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.
|
|
466
468
|
* Built once at construction time.
|
|
467
469
|
*/
|
|
468
470
|
this.subIndex = /* @__PURE__ */ new Map();
|
|
469
|
-
this.
|
|
471
|
+
this.neuronIndex = /* @__PURE__ */ new Map();
|
|
472
|
+
this.dendriteIndex = /* @__PURE__ */ new Map();
|
|
473
|
+
this.collateralIndex = /* @__PURE__ */ new Map();
|
|
474
|
+
this.parentNeuronByCollateralName = /* @__PURE__ */ new Map();
|
|
470
475
|
/**
|
|
471
476
|
* Strongly Connected Components of the neuron graph.
|
|
472
477
|
* Each component is a set of neuron IDs that can reach each other.
|
|
@@ -613,22 +618,28 @@ var CNS = class {
|
|
|
613
618
|
}
|
|
614
619
|
buildIndexes() {
|
|
615
620
|
this.subIndex.clear();
|
|
616
|
-
this.
|
|
621
|
+
this.parentNeuronByCollateralName.clear();
|
|
617
622
|
for (const neuron2 of this.neurons) {
|
|
623
|
+
this.neuronIndex.set(neuron2.name, neuron2);
|
|
618
624
|
for (const dendrite of neuron2.dendrites) {
|
|
619
|
-
const key = dendrite.collateral.
|
|
625
|
+
const key = dendrite.collateral.name;
|
|
620
626
|
const arr = this.subIndex.get(key) ?? [];
|
|
621
627
|
arr.push({ neuron: neuron2, dendrite });
|
|
622
628
|
this.subIndex.set(
|
|
623
629
|
key,
|
|
624
630
|
arr
|
|
625
631
|
);
|
|
632
|
+
this.dendriteIndex.set(key, dendrite);
|
|
626
633
|
}
|
|
627
634
|
Object.values(neuron2.axon).forEach((collateral2) => {
|
|
628
|
-
this.
|
|
629
|
-
collateral2.
|
|
635
|
+
this.parentNeuronByCollateralName.set(
|
|
636
|
+
collateral2.name,
|
|
630
637
|
neuron2
|
|
631
638
|
);
|
|
639
|
+
this.collateralIndex.set(
|
|
640
|
+
collateral2.name,
|
|
641
|
+
collateral2
|
|
642
|
+
);
|
|
632
643
|
});
|
|
633
644
|
}
|
|
634
645
|
}
|
|
@@ -645,8 +656,8 @@ var CNS = class {
|
|
|
645
656
|
const reachableNeurons = /* @__PURE__ */ new Set();
|
|
646
657
|
for (const axonKey in neuron2.axon) {
|
|
647
658
|
const collateral2 = neuron2.axon[axonKey];
|
|
648
|
-
const
|
|
649
|
-
const subscribers = this.subIndex.get(
|
|
659
|
+
const collateralName = collateral2.name;
|
|
660
|
+
const subscribers = this.subIndex.get(collateralName);
|
|
650
661
|
if (subscribers) {
|
|
651
662
|
for (const { neuron: targetNeuron } of subscribers) {
|
|
652
663
|
reachableNeurons.add(targetNeuron.name);
|
|
@@ -819,11 +830,20 @@ var CNS = class {
|
|
|
819
830
|
}
|
|
820
831
|
return true;
|
|
821
832
|
}
|
|
822
|
-
|
|
823
|
-
return this.
|
|
833
|
+
getParentNeuronByCollateralName(collateralName) {
|
|
834
|
+
return this.parentNeuronByCollateralName.get(collateralName);
|
|
835
|
+
}
|
|
836
|
+
getDendrites() {
|
|
837
|
+
return Array.from(this.dendriteIndex.values());
|
|
838
|
+
}
|
|
839
|
+
getCollaterals() {
|
|
840
|
+
return Array.from(this.collateralIndex.values());
|
|
841
|
+
}
|
|
842
|
+
getNeurons() {
|
|
843
|
+
return Array.from(this.neuronIndex.values());
|
|
824
844
|
}
|
|
825
|
-
getSubscribers(
|
|
826
|
-
return this.subIndex.get(
|
|
845
|
+
getSubscribers(collateralName) {
|
|
846
|
+
return this.subIndex.get(collateralName) ?? [];
|
|
827
847
|
}
|
|
828
848
|
stimulate(signal, options) {
|
|
829
849
|
const wrapped = this.wrapOnResponse(options?.onResponse);
|
|
@@ -837,8 +857,8 @@ var CNS = class {
|
|
|
837
857
|
|
|
838
858
|
// src/CNSCollateral.ts
|
|
839
859
|
var CNSCollateral = class {
|
|
840
|
-
constructor(
|
|
841
|
-
this.
|
|
860
|
+
constructor(name) {
|
|
861
|
+
this.name = name;
|
|
842
862
|
}
|
|
843
863
|
createSignal(payload) {
|
|
844
864
|
return { collateral: this, payload };
|
|
@@ -846,7 +866,7 @@ var CNSCollateral = class {
|
|
|
846
866
|
};
|
|
847
867
|
|
|
848
868
|
// src/factory/index.ts
|
|
849
|
-
var collateral = (
|
|
869
|
+
var collateral = (name) => new CNSCollateral(name);
|
|
850
870
|
var neuron = (name, axon) => {
|
|
851
871
|
const dendrites = [];
|
|
852
872
|
const api = {
|
|
@@ -885,30 +905,10 @@ var withCtx = () => ({
|
|
|
885
905
|
return neuron(name, axon);
|
|
886
906
|
}
|
|
887
907
|
});
|
|
888
|
-
var fa = {
|
|
889
|
-
test1: new CNSCollateral("test1"),
|
|
890
|
-
test2: new CNSCollateral("test2")
|
|
891
|
-
};
|
|
892
|
-
var fb = {
|
|
893
|
-
test4: collateral("test4"),
|
|
894
|
-
test5: collateral("test5")
|
|
895
|
-
};
|
|
896
|
-
withCtx().neuron("test", {
|
|
897
|
-
test1: fa.test1,
|
|
898
|
-
test2: fa.test2
|
|
899
|
-
}).bind(fb, {
|
|
900
|
-
test4: (payload, axon) => {
|
|
901
|
-
const ok = payload.test44;
|
|
902
|
-
return axon.test1.createSignal(ok);
|
|
903
|
-
},
|
|
904
|
-
test5: (payload, axon) => {
|
|
905
|
-
const ok2 = payload.test44;
|
|
906
|
-
return axon.test2.createSignal(ok2);
|
|
907
|
-
}
|
|
908
|
-
});
|
|
909
908
|
|
|
910
909
|
exports.CNS = CNS;
|
|
911
910
|
exports.CNSCollateral = CNSCollateral;
|
|
911
|
+
exports.CNSStimulationContextStore = CNSStimulationContextStore;
|
|
912
912
|
exports.collateral = collateral;
|
|
913
913
|
exports.neuron = neuron;
|
|
914
914
|
exports.withCtx = withCtx;
|