@cnstra/core 1.3.1 → 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.
Files changed (44) hide show
  1. package/README.md +80 -7
  2. package/dist/CNS.d.ts +43 -9
  3. package/dist/CNS.d.ts.map +1 -1
  4. package/dist/CNSCollateral.d.ts +5 -5
  5. package/dist/CNSCollateral.d.ts.map +1 -1
  6. package/dist/CNSFunctionalQueue.d.ts +3 -3
  7. package/dist/CNSFunctionalQueue.d.ts.map +1 -1
  8. package/dist/CNSInstanceNeuronQueue.d.ts +8 -0
  9. package/dist/CNSInstanceNeuronQueue.d.ts.map +1 -0
  10. package/dist/CNSStimulation.d.ts +13 -11
  11. package/dist/CNSStimulation.d.ts.map +1 -1
  12. package/dist/CNSTaskQueue.d.ts +12 -0
  13. package/dist/CNSTaskQueue.d.ts.map +1 -0
  14. package/dist/factory/index.d.ts +14 -7
  15. package/dist/factory/index.d.ts.map +1 -1
  16. package/dist/index.cjs +391 -84
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +391 -85
  21. package/dist/index.js.map +1 -1
  22. package/dist/interfaces/ICNS.d.ts +20 -5
  23. package/dist/interfaces/ICNS.d.ts.map +1 -1
  24. package/dist/interfaces/ICNSCollateral.d.ts +3 -3
  25. package/dist/interfaces/ICNSCollateral.d.ts.map +1 -1
  26. package/dist/types/TCNSAxon.d.ts +3 -1
  27. package/dist/types/TCNSAxon.d.ts.map +1 -1
  28. package/dist/types/TCNSDendrite.d.ts +7 -3
  29. package/dist/types/TCNSDendrite.d.ts.map +1 -1
  30. package/dist/types/TCNSLocalContextValueStore.d.ts +1 -0
  31. package/dist/types/TCNSLocalContextValueStore.d.ts.map +1 -1
  32. package/dist/types/TCNSNeuron.d.ts +5 -3
  33. package/dist/types/TCNSNeuron.d.ts.map +1 -1
  34. package/dist/types/TCNSNeuronResponseReturn.d.ts +1 -1
  35. package/dist/types/TCNSNeuronResponseReturn.d.ts.map +1 -1
  36. package/dist/types/TCNSSignal.d.ts +2 -2
  37. package/dist/types/TCNSSignal.d.ts.map +1 -1
  38. package/dist/types/TCNSStimulationOptions.d.ts +3 -3
  39. package/dist/types/TCNSStimulationOptions.d.ts.map +1 -1
  40. package/dist/types/TCNSStimulationQueueItem.d.ts +3 -3
  41. package/dist/types/TCNSStimulationQueueItem.d.ts.map +1 -1
  42. package/dist/types/TCNSStimulationResponse.d.ts +3 -3
  43. package/dist/types/TCNSStimulationResponse.d.ts.map +1 -1
  44. package/package.json +1 -1
package/README.md CHANGED
@@ -9,7 +9,19 @@ 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
- > **Not 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.
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.
15
+
16
+ ## 💡 Why CNStra
17
+
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.
19
+
20
+ - **Deterministic routing**: signals are delivered along an explicit neuron graph, not broadcast to whoever “happens to listen”.
21
+ - **Readable, reliable flows**: each step is local and typed; branches are explicit, so debugging feels like reading a storyboard, not a log stream.
22
+ - **Backpressure & concurrency**: built‑in per‑stimulation and per‑neuron concurrency limits keep workloads controlled without custom plumbing.
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”.
24
+ - **Safer than ad‑hoc events**: no hidden global listeners, no accidental fan‑out; every continuation must be returned explicitly.
13
25
 
14
26
  ## 🏗️ Core Model
15
27
 
@@ -103,13 +115,57 @@ myNeuron
103
115
  .dendrite({
104
116
  collateral: inputCollateral,
105
117
  response: async (payload, axon, ctx) => {
106
- // Process input and return output signal
107
- // ctx parameter provides local context storage for this neuron
118
+ // ctx: { get, set, abortSignal?, cns? }
119
+ if (ctx.abortSignal?.aborted) return; // graceful cancel
120
+ const prev = ctx.get();
121
+ ctx.set({ ...prev, handled: true });
108
122
  return axon.output.createSignal(result);
109
123
  }
110
124
  });
111
125
  ```
112
126
 
127
+ ### `neuron.bind(axon, map)` — exhaustive subscriptions (with shorthand)
128
+
129
+ Bind this neuron to every collateral of another neuron's axon in one place. The `map` must be exhaustive: you must provide a handler for each collateral key of `axon`. This gives you compile-time safety: if someone adds a new collateral later, TypeScript will immediately flag missing handlers.
130
+
131
+ - You can pass either a full dendrite object per key or just a response function shorthand.
132
+ - Payload types are inferred from the followed axon.
133
+
134
+ This pattern is especially useful for domain-oriented neurons that must react to every way a record can be created/changed. For example, an email-notifier neuron can safely ensure emails are sent for every creation path; if a new creation collateral is introduced, the build will fail until the notifier adds a corresponding handler.
135
+
136
+ ```typescript
137
+ import { withCtx, collateral } from '@cnstra/core';
138
+
139
+ // Order domain model (axon)
140
+ const order = {
141
+ created: collateral<{ id: string; amount: number }>('order:created'),
142
+ updated: collateral<{ id: string; changes: Record<string, unknown> }>('order:updated'),
143
+ cancelled: collateral<{ id: string; reason?: string }>('order:cancelled'),
144
+ };
145
+
146
+ // Mailer neuron must react to ALL order events
147
+ withCtx()
148
+ .neuron('order-mailer', { /* your axon if you emit follow-up signals */ })
149
+ .bind(order, {
150
+ created: (payload) => {
151
+ sendEmail(`Order created #${payload.id} for $${payload.amount}`);
152
+ return undefined;
153
+ },
154
+ updated: (payload) => {
155
+ sendEmail(`Order updated #${payload.id} (changes: ${Object.keys(payload.changes).join(', ')})`);
156
+ return undefined;
157
+ },
158
+ cancelled: (payload) => {
159
+ sendEmail(`Order cancelled #${payload.id}${payload.reason ? `: ${payload.reason}` : ''}`);
160
+ return undefined;
161
+ },
162
+ });
163
+
164
+ // If later someone adds a new event variant, e.g. refunds:
165
+ // const order = { ...order, refunded: collateral<{ id: string; amount: number }>('order:refunded') };
166
+ // TypeScript will now error until you also add a `refunded` handler in the .bind(...) map.
167
+ ```
168
+
113
169
  ### `CNS` Class
114
170
 
115
171
  The main orchestrator that manages signal flow between neurons.
@@ -123,6 +179,14 @@ new CNS(neurons, options?)
123
179
  - `neurons`: Array of neurons that process signals
124
180
  - `options`: Optional CNS configuration
125
181
 
182
+ #### Global listeners
183
+ ```typescript
184
+ const unsubscribe = cns.addResponseListener(r => {
185
+ // fires for every stimulation (input + outputs)
186
+ });
187
+ // unsubscribe();
188
+ ```
189
+
126
190
  #### `stimulate()` Method
127
191
  ```typescript
128
192
  cns.stimulate(signal, options?)
@@ -192,6 +256,7 @@ cns.stimulate(signal, {
192
256
  // Cancel after 5 seconds
193
257
  setTimeout(() => controller.abort(), 5000);
194
258
  ```
259
+ Inside dendrites, read it via `ctx.abortSignal`.
195
260
 
196
261
  ### `stimulationId?: string`
197
262
  Custom identifier for this stimulation cascade. Auto-generated if not provided.
@@ -202,12 +267,12 @@ await cns.stimulate(signal, {
202
267
  });
203
268
  ```
204
269
 
205
- ### `allowType?: (collateralId: string) => boolean`
206
- Filter which collateral types can be processed.
270
+ ### `allowName?: (collateralName: string) => boolean`
271
+ Filter which collateral names can be processed.
207
272
 
208
273
  ```typescript
209
274
  await cns.stimulate(signal, {
210
- allowType: (type) => type.startsWith('user:') // Only process user-related signals
275
+ allowName: (name) => name.startsWith('user:') // Only process user-related signals
211
276
  });
212
277
  ```
213
278
 
@@ -220,6 +285,14 @@ await cns.stimulate(signal, {
220
285
  });
221
286
  ```
222
287
 
288
+ #### Per‑neuron global concurrency
289
+ Set a limit per neuron; parallel stimulations share the same gate.
290
+ ```typescript
291
+ const worker = neuron('worker', { out })
292
+ .setConcurrency(2)
293
+ .dendrite({ /* ... */ });
294
+ ```
295
+
223
296
  ### `ctx?: ICNSStimulationContextStore`
224
297
  Provide existing context store for recovery/retry scenarios.
225
298
 
@@ -375,7 +448,7 @@ const cns = new CNS([validator, handler]);
375
448
 
376
449
  ### Event Sourcing
377
450
  ```typescript
378
- const eventReceived = collateral<{ type: string; data: any }>('event:received');
451
+ const eventReceived = collateral<{ name: string; data: any }>('event:received');
379
452
  const eventStored = collateral<{ eventId: string }>('event:stored');
380
453
  const stateUpdated = collateral<{ aggregateId: string }>('state:updated');
381
454
 
package/dist/CNS.d.ts CHANGED
@@ -4,16 +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
- export declare class CNS<TCollateralId extends string, TNeuronId extends string, TNeuron extends TCNSNeuron<any, TNeuronId, any, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>> implements ICNS<TNeuron, TDendrite> {
9
+ import { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';
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> {
9
12
  protected readonly neurons: TNeuron[];
10
13
  readonly options?: TCNSOptions | undefined;
11
14
  /**
12
- * Fast lookup: collateralId -> list of (neuron, dendrite) subscribers.
15
+ * Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.
13
16
  * Built once at construction time.
14
17
  */
15
18
  private subIndex;
16
- private parentNeuronByCollateralId;
19
+ private neuronIndex;
20
+ private dendriteIndex;
21
+ private collateralIndex;
22
+ private parentNeuronByCollateralName;
17
23
  /**
18
24
  * Strongly Connected Components of the neuron graph.
19
25
  * Each component is a set of neuron IDs that can reach each other.
@@ -31,7 +37,32 @@ export declare class CNS<TCollateralId extends string, TNeuronId extends string,
31
37
  * Precomputed ancestor sets for each SCC for fast reachability checks
32
38
  */
33
39
  private sccAncestors;
40
+ /**
41
+ * Global per-neuron concurrency gates shared across all stimulations.
42
+ */
43
+ private readonly neuronGates;
44
+ /**
45
+ * Global task queue used by stimulation to schedule per-neuron gated work.
46
+ * Does not replace per-stimulation concurrency; only coordinates global per-neuron limits.
47
+ */
48
+ private readonly globalTaskQueue;
49
+ protected readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;
50
+ /**
51
+ * Global response listeners applied to every stimulation.
52
+ */
53
+ private readonly globalResponseListeners;
34
54
  constructor(neurons: TNeuron[], options?: TCNSOptions | undefined);
55
+ /**
56
+ * Validate uniqueness constraints:
57
+ * - neuron names are unique and non-empty
58
+ * - axon collateral types are globally unique (single owner)
59
+ * - the same collateral instance cannot be owned by multiple neurons
60
+ * Throws aggregated error if violations are found.
61
+ */
62
+ private validateUniqueIdentifiers;
63
+ addResponseListener(listener: <TInputPayload, TOutputPayload>(response: TCNSStimulationResponse<TCollateralName, TInputPayload, TOutputPayload>) => void): () => void;
64
+ wrapOnResponse<T>(local?: (response: T) => void): (response: T) => void;
65
+ protected runWithNeuronConcurrency(neuron: TNeuron, fn: () => (() => void) | Promise<() => void>): Promise<void>;
35
66
  private buildIndexes;
36
67
  /**
37
68
  * Build the neuron graph where neurons are connected if one can stimulate the other.
@@ -59,18 +90,21 @@ export declare class CNS<TCollateralId extends string, TNeuronId extends string,
59
90
  * Returns true if the neuron is in a strongly connected component with more than one member,
60
91
  * or if it's in a single-member SCC that can reach itself.
61
92
  */
62
- getSCCSetByNeuronId(neuronId: string): Set<string> | undefined;
93
+ getSCCSetByNeuronName(neuronName: string): Set<string> | undefined;
63
94
  /**
64
95
  * Get the SCC index for a given neuron ID
65
96
  */
66
- getSccIndexByNeuronId(neuronId: string): number | undefined;
97
+ getSccIndexByNeuronName(neuronName: string): number | undefined;
67
98
  /**
68
99
  * Check if a neuron can be guaranteed not to be visited again during the current propagation.
69
100
  * This is the core logic for safe context cleanup.
70
101
  */
71
- canNeuronBeGuaranteedDone(neuronId: string, activeSccCounts: Map<number, number>): boolean;
72
- getParentNeuronByCollateralId(collateralId: TCollateralId): TNeuron | undefined;
73
- getSubscribers(collateralId: TCollateralId): TCNSSubscriber<TNeuron, TDendrite>[];
74
- stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(signal: TCNSSignal<TCollateralId, TInputPayload>, options?: TCNSStimulationOptions<TCollateralId, TInputPayload, TOutputPayload>): void;
102
+ canNeuronBeGuaranteedDone(neuronName: string, activeSccCounts: Map<number, number>): boolean;
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;
75
109
  }
76
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;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,qBAAa,GAAG,CACZ,aAAa,SAAS,MAAM,EAC5B,SAAS,SAAS,MAAM,EACxB,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACnE,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAC9D,YAAW,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;IAmC7B,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE;aACrB,OAAO,CAAC,EAAE,WAAW;IAlCzC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAGZ;IAEJ,OAAO,CAAC,0BAA0B,CAAqC;IAEvE;;;OAGG;IACI,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAM;IAEvD;;OAEG;IACH,OAAO,CAAC,WAAW,CAA6B;IAEhD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAuC;IAErD;;OAEG;IACH,OAAO,CAAC,YAAY,CAAuC;gBAGpC,OAAO,EAAE,OAAO,EAAE,EACrB,OAAO,CAAC,EAAE,WAAW,YAAA;IAQzC,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAsEhB;;OAEG;IACH,OAAO,CAAC,WAAW;IA6BnB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiDzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;OAIG;IACI,mBAAmB,CAAC,QAAQ,EAAE,MAAM;IAQ3C;;OAEG;IACI,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIlE;;;OAGG;IACI,yBAAyB,CAC5B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,OAAO;IA4BH,6BAA6B,CAAC,YAAY,EAAE,aAAa;IAIzD,cAAc,CACjB,YAAY,EAAE,aAAa,GAC5B,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;IAIhC,SAAS,CAAC,aAAa,SAAS,cAAc,EAAE,cAAc,EACjE,MAAM,EAAE,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,EAChD,OAAO,CAAC,EAAE,sBAAsB,CAC5B,aAAa,EACb,aAAa,EACb,cAAc,CACjB;CAYR"}
1
+ {"version":3,"file":"CNS.d.ts","sourceRoot":"","sources":["../src/CNS.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { TCNSSignal } from './types/TCNSSignal';
2
2
  import { ICNSCollateral } from './interfaces/ICNSCollateral';
3
- export declare class CNSCollateral<TId extends string, TPayload> implements ICNSCollateral<TId, TPayload> {
4
- readonly id: TId;
5
- constructor(id: TId);
6
- createSignal(): TCNSSignal<TId, TPayload>;
7
- createSignal(payload: TPayload): TCNSSignal<TId, TPayload>;
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 +1 @@
1
- {"version":3,"file":"CNSCollateral.d.ts","sourceRoot":"","sources":["../src/CNSCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,qBAAa,aAAa,CAAC,GAAG,SAAS,MAAM,EAAE,QAAQ,CACnD,YAAW,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC;aAEZ,EAAE,EAAE,GAAG;gBAAP,EAAE,EAAE,GAAG;IAEnC,YAAY,IAAI,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;IACzC,YAAY,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;CAI7D"}
1
+ {"version":3,"file":"CNSCollateral.d.ts","sourceRoot":"","sources":["../src/CNSCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,qBAAa,aAAa,CAAC,KAAK,SAAS,MAAM,EAAE,QAAQ,CACrD,YAAW,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC;aAEd,IAAI,EAAE,KAAK;gBAAX,IAAI,EAAE,KAAK;IAEvC,YAAY,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC3C,YAAY,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;CAI/D"}
@@ -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<TCollateralId extends string, TNeuronId extends string, TNeuron extends TCNSNeuron<any, TNeuronId, TCollateralId, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>> {
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<TCollateralId extends string, TNeuronId
13
13
  protected activeOperations: number;
14
14
  private pumping;
15
15
  private needsPump;
16
- constructor(processor: (item: TCNSStimulationQueueItem<TCollateralId, TNeuronId, TNeuron, TDendrite>) => (() => void) | Promise<() => void>, concurrency?: number | undefined, abortSignal?: AbortSignal | undefined, initialCapacity?: number);
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<TCollateralId, TNeuronId, TNeuron, TDendrite>): void;
22
+ enqueue(x: TCNSStimulationQueueItem<TCollateralName, TNeuronName, TNeuron, TDendrite>): void;
23
23
  get length(): number;
24
24
  getActiveOperationsCount(): number;
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CNSFunctionalQueue.d.ts","sourceRoot":"","sources":["../src/CNSFunctionalQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAAa,kBAAkB,CAC3B,aAAa,SAAS,MAAM,EAC5B,SAAS,SAAS,MAAM,EACxB,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC7E,SAAS,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAexD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM;IACvC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW;IAfhD,OAAO,CAAC,KAAK,CAAgF;IAC7F,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAM;IACtB,SAAS,CAAC,gBAAgB,SAAK;IAI/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAGL,SAAS,EAAE,CAAC,IAAI,EAAE,wBAAwB,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,EAC7H,WAAW,CAAC,EAAE,MAAM,YAAA,EACpB,WAAW,CAAC,EAAE,WAAW,YAAA,EAC5C,eAAe,CAAC,EAAE,MAAM;IAQ5B,SAAS,KAAK,iBAAiB,IAAI,OAAO,CAGzC;IAED,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,WAAW;IAUnB,SAAS,CAAC,IAAI;IAyDd,OAAO,CAAC,CAAC,EAAE,wBAAwB,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC;IAOjF,IAAI,MAAM,WAET;IAED,wBAAwB;CAI3B"}
1
+ {"version":3,"file":"CNSFunctionalQueue.d.ts","sourceRoot":"","sources":["../src/CNSFunctionalQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,qBAAa,kBAAkB,CAC3B,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;IAmBxD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAQ1B,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM;IACvC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW;IA1BhD,OAAO,CAAC,KAAK,CAKJ;IACT,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAM;IACtB,SAAS,CAAC,gBAAgB,SAAK;IAG/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAGL,SAAS,EAAE,CACxB,IAAI,EAAE,wBAAwB,CAC1B,eAAe,EACf,WAAW,EACX,OAAO,EACP,SAAS,CACZ,KACA,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,EACpB,WAAW,CAAC,EAAE,MAAM,YAAA,EACpB,WAAW,CAAC,EAAE,WAAW,YAAA,EAC5C,eAAe,CAAC,EAAE,MAAM;IAQ5B,SAAS,KAAK,iBAAiB,IAAI,OAAO,CAGzC;IAED,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,WAAW;IAiBnB,SAAS,CAAC,IAAI;IAwDd,OAAO,CACH,CAAC,EAAE,wBAAwB,CACvB,eAAe,EACf,WAAW,EACX,OAAO,EACP,SAAS,CACZ;IAQL,IAAI,MAAM,WAET;IAED,wBAAwB;CAG3B"}
@@ -0,0 +1,8 @@
1
+ export declare class CNSInstanceNeuronQueue<TNeuron extends {
2
+ name: string;
3
+ concurrency?: number;
4
+ }> {
5
+ private readonly gates;
6
+ run(neuron: TNeuron, fn: () => (() => void) | Promise<() => void>): (() => void) | Promise<() => void>;
7
+ }
8
+ //# sourceMappingURL=CNSInstanceNeuronQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CNSInstanceNeuronQueue.d.ts","sourceRoot":"","sources":["../src/CNSInstanceNeuronQueue.ts"],"names":[],"mappings":"AAAA,qBAAa,sBAAsB,CAC/B,OAAO,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;IAEtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGlB;IAEJ,GAAG,CACC,MAAM,EAAE,OAAO,EACf,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAC7C,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;CAoDxC"}
@@ -3,30 +3,32 @@ import { TCNSStimulationOptions } from './types/TCNSStimulationOptions';
3
3
  import { TCNSNeuron } from './types/TCNSNeuron';
4
4
  import { TCNSDendrite } from './types/TCNSDendrite';
5
5
  import { TCNSSubscriber } from './types/TCNSSubscriber';
6
+ import { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';
6
7
  import { TCNSSignal } from './types/TCNSSignal';
7
- export declare class CNSStimulation<TCollateralId extends string, TNeuronId extends string, TNeuron extends TCNSNeuron<any, TNeuronId, TCollateralId, any, any, any, any>, TDendrite extends TCNSDendrite<any, any, any, any, any, any>, TInputPayload, TOutputPayload> {
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> {
8
9
  private readonly cns;
9
- readonly options?: TCNSStimulationOptions<TCollateralId, TInputPayload, TOutputPayload> | undefined;
10
+ readonly options?: TCNSStimulationOptions<TCollateralName, TInputPayload, TOutputPayload> | undefined;
10
11
  private readonly ctx;
11
12
  private readonly queue;
12
13
  private readonly nueronVisitMap?;
14
+ private readonly instanceNeuronQueue;
13
15
  private scheduledCount;
14
16
  /**
15
17
  * Track active SCCs: SCC index -> count of active neurons in that SCC
16
18
  */
17
19
  private readonly activeSccCounts;
18
20
  readonly id: string;
19
- constructor(cns: ICNS<TNeuron, TDendrite>, options?: TCNSStimulationOptions<TCollateralId, TInputPayload, TOutputPayload> | undefined);
21
+ constructor(cns: ICNS<TNeuron, TDendrite>, instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>, options?: TCNSStimulationOptions<TCollateralName, TInputPayload, TOutputPayload> | undefined);
20
22
  protected get concurrencyEnabled(): boolean;
21
23
  protected get autoCleanupContextsEnabled(): boolean;
22
24
  /**
23
25
  * Mark a neuron as active (being processed)
24
26
  */
25
- protected markNeuronActive(neuronId: TNeuronId): void;
27
+ protected markNeuronActive(neuronId: TNeuronName): void;
26
28
  /**
27
29
  * Mark a neuron as inactive (finished processing)
28
30
  */
29
- protected markNeuronInactive(neuronId: TNeuronId): void;
31
+ protected markNeuronInactive(neuronId: TNeuronName): void;
30
32
  /**
31
33
  * Increment the active count for the SCC containing this neuron
32
34
  */
@@ -38,15 +40,15 @@ export declare class CNSStimulation<TCollateralId extends string, TNeuronId exte
38
40
  /**
39
41
  * Check if a neuron can be guaranteed not to be visited again
40
42
  */
41
- protected canNeuronBeGuaranteedDone(neuronId: TNeuronId): boolean;
43
+ protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean;
42
44
  protected cleanupCtxIfNeeded(neuron: TNeuron): void;
43
- protected createSubscriberQueueItem(subscriber: TCNSSubscriber<TNeuron, TDendrite>, inputSignal?: TCNSSignal<TCollateralId, any>): {
44
- neuronId: TNeuronId;
45
+ protected createSubscriberQueueItem(subscriber: TCNSSubscriber<TNeuron, TDendrite>, inputSignal?: TCNSSignal<TCollateralName, any>): {
46
+ neuronId: TNeuronName;
45
47
  subscriber: TCNSSubscriber<TNeuron, TDendrite>;
46
- inputSignal: TCNSSignal<TCollateralId, any> | undefined;
48
+ inputSignal: TCNSSignal<TCollateralName, any> | undefined;
47
49
  };
48
50
  private processQueueItem;
49
- protected processResponse(inputSignal?: TCNSSignal<TCollateralId, TInputPayload>, outputSignal?: TCNSSignal<TCollateralId, TOutputPayload>, error?: any): void;
50
- responseToSignal(signal: TCNSSignal<TCollateralId, TOutputPayload>): void;
51
+ protected processResponse(inputSignal?: TCNSSignal<TCollateralName, TInputPayload>, outputSignal?: TCNSSignal<TCollateralName, TOutputPayload>, error?: any): void;
52
+ responseToSignal(signal: TCNSSignal<TCollateralName, TOutputPayload>): void;
51
53
  }
52
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,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,qBAAa,cAAc,CACvB,aAAa,SAAS,MAAM,EAC5B,SAAS,SAAS,MAAM,EACxB,OAAO,SAAS,UAAU,CACtB,GAAG,EACH,SAAS,EACT,aAAa,EACb,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;IAoBV,OAAO,CAAC,QAAQ,CAAC,GAAG;aACJ,OAAO,CAAC,EAAE,sBAAsB,CAC5C,aAAa,EACb,aAAa,EACb,cAAc,CACjB;IAvBL,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IACzD,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,EAC9B,OAAO,CAAC,EAAE,sBAAsB,CAC5C,aAAa,EACb,aAAa,EACb,cAAc,CACjB,YAAA;IAkBL,SAAS,KAAK,kBAAkB,IAAI,OAAO,CAK1C;IAED,SAAS,KAAK,0BAA0B,IAAI,OAAO,CAElD;IAED;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAMrD;;OAEG;IACH,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAMvD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,SAAS,CAAC,yBAAyB,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO;IAQjE,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,aAAa,EAAE,GAAG,CAAC;;;;;IA2BhD,OAAO,CAAC,gBAAgB;IA4DxB,SAAS,CAAC,eAAe,CACrB,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,EACtD,YAAY,CAAC,EAAE,UAAU,CAAC,aAAa,EAAE,cAAc,CAAC,EACxD,KAAK,CAAC,EAAE,GAAG,GACZ,IAAI;IAoDA,gBAAgB,CACnB,MAAM,EAAE,UAAU,CAAC,aAAa,EAAE,cAAc,CAAC,GAClD,IAAI;CAWV"}
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"}
@@ -0,0 +1,12 @@
1
+ export declare class CNSTaskQueue {
2
+ private readonly concurrency?;
3
+ private pumping;
4
+ private needsPump;
5
+ private activeOperations;
6
+ private items;
7
+ constructor(concurrency?: number | undefined);
8
+ private get canStartOperation();
9
+ enqueue(task: () => (() => void) | Promise<() => void>): Promise<void>;
10
+ private pump;
11
+ }
12
+ //# sourceMappingURL=CNSTaskQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CNSTaskQueue.d.ts","sourceRoot":"","sources":["../src/CNSTaskQueue.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IAWT,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAVzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,KAAK,CAIL;gBAEqB,WAAW,CAAC,EAAE,MAAM,YAAA;IAEjD,OAAO,KAAK,iBAAiB,GAG5B;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtE,OAAO,CAAC,IAAI;CAqEf"}
@@ -1,16 +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, TId extends string = string>(id: TId) => CNSCollateral<TId, TPayload>;
5
- type InterNeuronAPI<TContextValue, TIdType extends string, TReceiverCollateralIdType extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralIdType, TReceiverAxonCollateralPayload>> = {
6
- id: TIdType;
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>> = {
8
+ name: TNameType;
7
9
  axon: TAxonType;
8
- dendrites: TCNSDendrite<TContextValue, string, unknown, TReceiverCollateralIdType, TReceiverAxonCollateralPayload, TAxonType>[];
9
- dendrite: <TSenderExactCollateralIdType extends string, TSenderExactAxonCollateralPayload>(s: TCNSDendrite<TContextValue, TSenderExactCollateralIdType, TSenderExactAxonCollateralPayload, TReceiverCollateralIdType, TReceiverAxonCollateralPayload, TAxonType>) => InterNeuronAPI<TContextValue, TIdType, TReceiverCollateralIdType, TReceiverAxonCollateralPayload, TAxonType>;
10
+ concurrency?: number;
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>;
10
17
  };
11
- export declare const neuron: <TContextValue, TIdType extends string, TReceiverCollateralIdType extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralIdType, TReceiverAxonCollateralPayload>>(id: TIdType, axon: TAxonType) => InterNeuronAPI<TContextValue, TIdType, TReceiverCollateralIdType, TReceiverAxonCollateralPayload, TAxonType>;
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>>;
12
19
  export declare const withCtx: <TContextValue>() => {
13
- neuron: <TIdType extends string, TReceiverCollateralIdType extends string, TReceiverAxonCollateralPayload, TAxonType extends TCNSAxon<TReceiverCollateralIdType, TReceiverAxonCollateralPayload>>(id: TIdType, axon: TAxonType) => InterNeuronAPI<TContextValue, TIdType, TReceiverCollateralIdType, TReceiverAxonCollateralPayload, TAxonType>;
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>>;
14
21
  };
15
22
  export {};
16
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,GAAG,SAAS,MAAM,GAAG,MAAM,EACxE,IAAI,GAAG,iCAC8B,CAAC;AAE1C,KAAK,cAAc,CACf,aAAa,EACb,OAAO,SAAS,MAAM,EACtB,yBAAyB,SAAS,MAAM,EACxC,8BAA8B,EAC9B,SAAS,SAAS,QAAQ,CACtB,yBAAyB,EACzB,8BAA8B,CACjC,IACD;IACA,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,YAAY,CACnB,aAAa,EACb,MAAM,EACN,OAAO,EACP,yBAAyB,EACzB,8BAA8B,EAC9B,SAAS,CACZ,EAAE,CAAC;IACJ,QAAQ,EAAE,CACN,4BAA4B,SAAS,MAAM,EAC3C,iCAAiC,EAEjC,CAAC,EAAE,YAAY,CACX,aAAa,EACb,4BAA4B,EAC5B,iCAAiC,EACjC,yBAAyB,EACzB,8BAA8B,EAC9B,SAAS,CACZ,KACA,cAAc,CACf,aAAa,EACb,OAAO,EACP,yBAAyB,EACzB,8BAA8B,EAC9B,SAAS,CACZ,CAAC;CACL,CAAC;AAGF,eAAO,MAAM,MAAM,GACf,aAAa,EACb,OAAO,SAAS,MAAM,EACtB,yBAAyB,SAAS,MAAM,EACxC,8BAA8B,EAC9B,SAAS,SAAS,QAAQ,CACtB,yBAAyB,EACzB,8BAA8B,CACjC,EAED,IAAI,OAAO,EACX,MAAM,SAAS,KAChB,cAAc,CACb,aAAa,EACb,OAAO,EACP,yBAAyB,EACzB,8BAA8B,EAC9B,SAAS,CAiDZ,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,aAAa;aAE7B,OAAO,SAAS,MAAM,EACtB,yBAAyB,SAAS,MAAM,EACxC,8BAA8B,EAC9B,SAAS,SAAS,QAAQ,CACtB,yBAAyB,EACzB,8BAA8B,CACjC,MAEG,OAAO,QACL,SAAS;CAUrB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"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"}