@spider-mesh/core 2.0.42 → 2.0.44

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 CHANGED
@@ -147,20 +147,23 @@ type RpcOptions<T = any> = {
147
147
  Examples:
148
148
 
149
149
  ```ts
150
+ import { firstValueFrom } from 'rxjs'
151
+
150
152
  await users.set({ timeout: 3000, retry: 2 }).getUser('42')
151
153
 
152
- await mesh.callRemoteService({
154
+ await firstValueFrom(mesh.callRemoteService({
153
155
  service: 'UserService',
154
156
  method: 'getUser',
155
157
  args: ['42'],
156
158
  transporter: 'Http2Rpc',
157
- })
159
+ }))
158
160
  ```
159
161
 
160
162
  `transporter` may be:
161
163
 
162
164
  - a registered transporter name string
163
- - a class or object with a `name`
165
+ - a class constructor (e.g. `Http2Rpc`)
166
+ - an object with a `name` property
164
167
 
165
168
  ## Events
166
169
 
@@ -202,10 +205,10 @@ Current public methods:
202
205
  - `getPeer(nodeId)`
203
206
  - `upsertPeer(node)`
204
207
  - `removePeer(nodeId)`
205
- - `listPeers({ service? })`
208
+ - `listPeers(service?)`
206
209
  - `watch(service?)`
207
210
  - `pickRpcNode(service, { node_id? })`
208
- - `getRpcTransporterName(service, { node_id? })`
211
+ - `getRpcTransporterName(service)`
209
212
  - `listTopicNodes(topic)`
210
213
 
211
214
  ## Transporter Contracts
@@ -217,14 +220,47 @@ The contract source of truth is `src/types.ts`.
217
220
  ```ts
218
221
  type RpcTransporter = Observable<RpcEvent> & {
219
222
  linkRegistry?(registry: Registry): void
220
- send(data: RpcPacket, node_id?: string): Promise<void>
223
+ send(data: RpcRequestPacket | RpcCancelPacket | RpcResponsePacket): Promise<{ cancel: () => void }>
224
+ }
225
+ ```
226
+
227
+ `send()` returns a `cancel` function. For `request` packets, calling `cancel()` sends a `RpcCancelPacket` to the destination node, which causes the provider to stop any running stream. For `response` and `cancel` packets the returned `cancel` is a no-op.
228
+
229
+ `SpiderMesh` calls `cancel()` automatically when a subscriber unsubscribes from a stream that has not yet completed.
230
+
231
+ ### Packet types
232
+
233
+ ```ts
234
+ type RpcRequestPacket = {
235
+ kind: 'request'
236
+ request_id: string
237
+ service: string
238
+ method: string
239
+ args: any[]
240
+ sender_node_id: string
241
+ destination_node_id?: string // explicit target; transporter falls back to registry round-robin when omitted
242
+ }
243
+
244
+ type RpcResponsePacket = {
245
+ kind: 'response'
246
+ request_id: string
247
+ data?: any
248
+ error?: SpiderMeshError | { code?: string; message: string }
249
+ completed?: boolean
250
+ destination_node_id?: string
251
+ }
252
+
253
+ type RpcCancelPacket = {
254
+ kind: 'cancel'
255
+ request_id: string
256
+ destination_node_id?: string
221
257
  }
222
258
  ```
223
259
 
224
260
  ### Pubsub transporter
225
261
 
226
262
  ```ts
227
- type PubsubTransporter = {
263
+ type PubsubTransporter = Observable<PubsubEvent> & {
228
264
  publish<T>(topic: string, data: T): Promise<void>
229
265
  listen<T>(topic: string): Observable<T>
230
266
  linkRegistry?(registry: Registry): void
@@ -245,10 +281,10 @@ type DiscoveryTransporter = Observable<DiscoveryEvent> & {
245
281
  The package exports:
246
282
 
247
283
  - `NestJSExposeMicroservice(factory, metadata?)`
248
- - `NestJSLinkMicroservice(factory, transporter)`
284
+ - `NestJSLinkMicroservice(factory, transporter?)`
249
285
  - `NestJSLinkEvent(factory)`
250
286
 
251
- `NestJSLinkMicroservice(factory, transporter)` forwards the transporter selector into `RemoteServiceLinker.link()`.
287
+ `NestJSLinkMicroservice(factory, transporter?)` forwards the optional transporter selector into `RemoteServiceLinker.link()`.
252
288
 
253
289
  ## Companion Packages
254
290
 
@@ -280,37 +316,30 @@ Build with:
280
316
  bun run build
281
317
  ```
282
318
 
283
- ## Notes
284
-
285
- - This package is ESM-only.
286
- - Repository source uses emitted `.js` relative specifiers.
287
- - `LOCAL_SERVICES$` is process-global inside one process.
288
-
289
- await userCreated.publish(new UserCreatedEvent('42', 'ada@example.com'))
290
-
291
- userCreated.listen().subscribe(event => {
292
- console.log(event.id)
293
- })
294
- ```
295
-
296
319
  ## NestJS Integration
297
320
 
298
321
  ### Register `SpiderMesh` as a provider
299
322
 
300
323
  ```ts
301
324
  import { Module } from '@nestjs/common'
302
- import { SpiderMesh } from '@spider-mesh/core'
325
+ import { Registry, SpiderMesh } from '@spider-mesh/core'
303
326
  import { Http2Pubsub, Http2Rpc, UdpDiscovery } from '@spider-mesh/tcp'
304
327
 
305
328
  @Module({
306
329
  providers: [
307
- SpiderMesh.asProvider({
308
- transporters: [
309
- UdpDiscovery,
310
- Http2Rpc,
311
- Http2Pubsub,
312
- ],
313
- }),
330
+ {
331
+ provide: SpiderMesh,
332
+ useFactory: () => {
333
+ const registry = new Registry()
334
+ const mesh = new SpiderMesh(registry)
335
+
336
+ mesh.registerTransporter(new UdpDiscovery())
337
+ mesh.registerTransporter(new Http2Rpc())
338
+ mesh.registerTransporter(new Http2Pubsub())
339
+
340
+ return mesh
341
+ },
342
+ },
314
343
  ],
315
344
  exports: [SpiderMesh],
316
345
  })
@@ -372,6 +401,12 @@ export class CheckoutService {
372
401
  export class CheckoutModule {}
373
402
  ```
374
403
 
404
+ Pass a transporter only when you need to force a specific RPC transporter:
405
+
406
+ ```ts
407
+ NestJSLinkMicroservice(BillingService, 'Http2Rpc')
408
+ ```
409
+
375
410
  ### Inject an event binding in NestJS
376
411
 
377
412
  ```ts
@@ -402,85 +437,6 @@ export class AuditService {
402
437
  export class AuditModule {}
403
438
  ```
404
439
 
405
- ## Transporter Contract
406
-
407
- Concrete transport implementations can live in companion packages such as `@spider-mesh/tcp` and `@spider-mesh/ws`, or in your own application code.
408
-
409
- You can also provide your own classes that implement one or more transporter contracts exported by `@spider-mesh/core`.
410
-
411
- ### Public API map
412
-
413
- - `SpiderMesh`: runtime coordinator for services, events, discovery, and transporters
414
- - `RemoteServiceLinker.link()`: creates a typed remote proxy
415
- - `@Microservice()`: exposes a local class instance as a remote service
416
- - `SpiderMesh.linkEvent()`: creates a topic binding for publish and subscribe
417
- - `RpcTransporter`: RPC transporter contract
418
- - `DiscoveryTransporter`: discovery transporter contract
419
- - `PubsubTransporter`: pubsub transporter contract
420
-
421
- ### RPC transporter
422
-
423
- ```ts
424
- type RpcMessage = {
425
- node_id: string
426
- packet: RpcPacket
427
- }
428
-
429
- type RpcEvent = Partial<{
430
- rpc: RpcMessage
431
- offline: string
432
- endpoints: Record<string, string | boolean | number>
433
- }>
434
-
435
- type RpcTransporter = Observable<RpcEvent> & {
436
- send(data: RpcPacket, node: SpiderMeshNode): Promise<void>
437
- }
438
- ```
439
-
440
- The RPC observable can emit:
441
-
442
- - `rpc`: inbound RPC message shaped as `{ node_id, packet }`
443
- - `offline`: node offline event
444
- - `endpoints`: transporter metadata to attach to the current node
445
-
446
- The internal RPC wire protocol supports:
447
-
448
- - `request`
449
- - `response`
450
- - `cancel`
451
-
452
- `response` packets can carry:
453
-
454
- - `data`
455
- - `error`
456
- - `completed`
457
-
458
- ### Discovery transporter
459
-
460
- ```ts
461
- type DiscoveryEvent = {
462
- discovered: SpiderMeshNode
463
- }
464
-
465
- type DiscoveryTransporter = Observable<DiscoveryEvent> & {
466
- broadcast(
467
- data: MdnsMessage<NodeMetadata>,
468
- ips: string[],
469
- ): Promise<void>
470
- }
471
- ```
472
-
473
- Discovery transporters stream remote node snapshots into the mesh, and `SpiderMesh` itself calls `broadcast()` whenever local node metadata changes.
474
-
475
- ### Pubsub transporter
476
-
477
- ```ts
478
- type PubsubTransporter = {
479
- publish<T>(topic: string, data: T): Promise<void>
480
- listen<T>(topic: string): Observable<T>
481
- }
482
- ```
483
-
484
440
  ## Error Model
485
441
 
486
442
  The core defines these error codes for RPC flows:
@@ -499,22 +455,18 @@ The core defines these error codes for RPC flows:
499
455
  The package also exports:
500
456
 
501
457
  - `LimitConcurrency(limit)` and `LimitConcurrentRunning(limit)` for throttling async method execution
502
- - `randomUUID()` for Node.js, browser, and React Native compatible UUID generation using ESM-safe runtime detection
503
- - `MicroserviceException` types for common RPC error codes
504
-
505
- ## Build
506
-
507
- ```bash
508
- bun run build
509
- ```
458
+ - `MicroserviceError` for common RPC error codes
510
459
 
511
460
  ## Notes
512
461
 
462
+ - This package is ESM-only.
463
+ - Repository source uses emitted `.js` relative specifiers.
464
+ - `LOCAL_SERVICES$` is process-global inside one process.
513
465
  - Local services are registered when their class instances are constructed.
514
466
  - Service identity is based on the class name.
515
467
  - Event topic identity is based on the event class name.
516
- - RPC target selection is round-robin unless you force `node_id` or `ip`.
517
- - `SpiderMesh` owns RPC stream lifecycle, timeout, retry, and cancel behavior.
468
+ - RPC target selection is round-robin unless you force `node_id`.
469
+ - `SpiderMesh` owns RPC stream lifecycle, timeout, retry, and cancel behavior. When a subscriber unsubscribes before a stream completes, `SpiderMesh` calls the `cancel()` function returned by `transporter.send()`, which causes the provider to stop the running Observable.
518
470
  - Transporters focus on byte transport, pubsub topic IO, and discovery broadcasts.
519
471
  - The root package entry intentionally focuses on runtime-agnostic APIs and shared contracts.
520
472
  - If an AI agent is uncertain which import to use, prefer `@spider-mesh/core` first, then opt into a companion transport package such as `@spider-mesh/tcp` or `@spider-mesh/ws` only when a concrete transport is needed.
@@ -9,11 +9,9 @@ export declare class Registry {
9
9
  getPeer(nodeId: string): SpiderMeshNode | undefined;
10
10
  upsertPeer(node: SpiderMeshNode): SpiderMeshNode;
11
11
  removePeer(nodeId: string): boolean;
12
- listPeers(options?: {
13
- service?: string;
14
- }): SpiderMeshNode[];
12
+ listPeers(service?: string): SpiderMeshNode[];
15
13
  watch(service?: string): import("rxjs").Observable<SpiderMeshNode[]>;
16
14
  pickRpcNode(service: string, options?: RegistryPickRpcTargetOptions): string | null;
17
- getRpcTransporterName(service: string, options?: RegistryPickRpcTargetOptions): string | null;
15
+ getRpcTransporterName(service: string): string | undefined;
18
16
  listTopicNodes(topic: string): SpiderMeshNode[];
19
17
  }
@@ -1,11 +1,15 @@
1
1
  import { BehaviorSubject, map } from 'rxjs';
2
2
  export class Registry {
3
3
  nodes$ = new BehaviorSubject(new Map());
4
+ #transporters = new Map();
4
5
  #rrIndexes = new Map();
5
6
  getPeer(nodeId) {
6
7
  return this.nodes$.value.get(nodeId);
7
8
  }
8
9
  upsertPeer(node) {
10
+ node.transporters.rpc && Object.keys(node.services).forEach(service => {
11
+ this.#transporters.set(service, node.transporters.rpc);
12
+ });
9
13
  const nodes = new Map(this.nodes$.value);
10
14
  const current = nodes.get(node.node_id);
11
15
  nodes.set(node.node_id, {
@@ -36,15 +40,15 @@ export class Registry {
36
40
  }
37
41
  return deleted;
38
42
  }
39
- listPeers(options = {}) {
43
+ listPeers(service) {
40
44
  return [...this.nodes$.value.values()].filter(node => {
41
- if (options.service && node.services[options.service] == undefined)
45
+ if (service && node.services[service] == undefined)
42
46
  return false;
43
47
  return true;
44
48
  });
45
49
  }
46
50
  watch(service) {
47
- return this.nodes$.pipe(map(() => this.listPeers({ service })));
51
+ return this.nodes$.pipe(map(() => this.listPeers(service)));
48
52
  }
49
53
  pickRpcNode(service, options = {}) {
50
54
  if (options.node_id) {
@@ -55,20 +59,15 @@ export class Registry {
55
59
  return null;
56
60
  return node.node_id;
57
61
  }
58
- const targets = this.listPeers({ service });
62
+ const targets = this.listPeers(service);
59
63
  if (targets.length === 0)
60
64
  return null;
61
- const index = this.#rrIndexes.get(service) || 0;
62
- this.#rrIndexes.set(service, (index + 1) % targets.length);
63
- return targets[index % targets.length]?.node_id || null;
65
+ const index = ((this.#rrIndexes.get(service) || 0) + 1) % targets.length;
66
+ this.#rrIndexes.set(service, index);
67
+ return targets[index]?.node_id;
64
68
  }
65
- getRpcTransporterName(service, options = {}) {
66
- const nodeId = options.node_id || this.pickRpcNode(service, options);
67
- if (!nodeId)
68
- return null;
69
- const node = this.getPeer(nodeId);
70
- const transporter = node?.transporters?.rpc;
71
- return typeof transporter === 'string' ? transporter : null;
69
+ getRpcTransporterName(service) {
70
+ return this.#transporters.get(service);
72
71
  }
73
72
  listTopicNodes(topic) {
74
73
  return [...this.nodes$.value.values()].filter(node => node.topics.includes(topic));
@@ -1 +1 @@
1
- {"version":3,"file":"Registry.js","sourceRoot":"","sources":["../../src/Registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Registry.js","sourceRoot":"","sources":["../../src/Registry.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BehaviorSubject, catchError, EMPTY, filter, finalize, from, lastValueFrom, map, mergeMap, Observable, of, retry, share, Subject, Subscription, take, tap, throwError, timeout, timer } from "rxjs";
1
+ import { BehaviorSubject, catchError, EMPTY, finalize, firstValueFrom, from, lastValueFrom, map, mergeMap, Observable, of, retry, share, Subject, Subscription, switchMap, take, tap, throwError, timeout, timer } from "rxjs";
2
2
  import { listBeforeMicroserviceOnlineMethods } from "./decorators/BeforeMicroserviceOnline.js";
3
3
  import { LOCAL_SERVICES$ } from "./decorators/Microservice.js";
4
4
  import { SPIDERMESH_NAMESPACE, SPIDERMESH_NODE_HOSTNAME } from "../const.js";
@@ -67,9 +67,9 @@ export class SpiderMesh {
67
67
  return subscription;
68
68
  }
69
69
  listRpcNodes(service) {
70
- return (this.registry?.listPeers({ service }) || []).filter(node => {
71
- return typeof node.transporters?.rpc === 'string';
72
- });
70
+ if (!this.registry)
71
+ return [];
72
+ return this.registry.listPeers(service).filter(node => !!node.transporters.rpc);
73
73
  }
74
74
  watchService(service) {
75
75
  if (!this.registry)
@@ -78,38 +78,21 @@ export class SpiderMesh {
78
78
  }
79
79
  #selectRpcTransport(filters = {}) {
80
80
  if (!filters.service)
81
- return null;
82
- const transporterName = typeof filters.transporter === 'string'
83
- ? filters.transporter
84
- : filters.transporter?.name;
81
+ return undefined;
82
+ if (filters.transporter) {
83
+ const name = typeof filters.transporter === 'string' ? filters.transporter : filters.transporter.name;
84
+ if (!name)
85
+ return;
86
+ return this.#transporters.rpcs.get(name);
87
+ }
85
88
  if (!this.registry) {
86
- const transporter = transporterName
87
- ? this.#transporters.rpcs.get(transporterName)
88
- : this.#transporters.rpcs.values().next().value;
89
- if (!transporter)
90
- return null;
91
- return {
92
- node_id: filters.node_id,
93
- transporter
94
- };
89
+ return this.#transporters.rpcs.values().next().value;
95
90
  }
96
- const nodeId = this.registry.pickRpcNode(filters.service, {
97
- node_id: filters.node_id
98
- });
99
- const resolvedTransporterName = filters.node_id || nodeId
100
- ? this.registry.getRpcTransporterName(filters.service, {
101
- node_id: nodeId || filters.node_id
102
- })
103
- : transporterName;
104
- if (!resolvedTransporterName)
105
- return null;
106
- const transporter = this.#transporters.rpcs.get(resolvedTransporterName);
107
- if (!transporter)
108
- return null;
109
- return {
110
- node_id: nodeId || filters.node_id,
111
- transporter
112
- };
91
+ const name = this.registry.getRpcTransporterName(filters.service);
92
+ if (!name)
93
+ return;
94
+ const transporter = this.#transporters.rpcs.get(name);
95
+ return transporter;
113
96
  }
114
97
  #normalizeRpcError(error) {
115
98
  if (error && typeof error === 'object') {
@@ -126,13 +109,14 @@ export class SpiderMesh {
126
109
  #completeRunningRpc(request_id) {
127
110
  this.#rpc.running.delete(request_id);
128
111
  }
112
+ #index = 1;
129
113
  callRemoteService(options) {
130
- const source$ = this.registry
131
- ? this.registry.watch(options.service)
132
- : of(undefined);
133
- return source$.pipe(map(() => this.#selectRpcTransport(options)), filter((target) => !!target), take(1), mergeMap(target => {
114
+ return of(1).pipe(switchMap(() => this.registry ? firstValueFrom(this.registry.watch(options.service)) : of(1)), take(1), mergeMap(() => {
115
+ const transporter = this.#selectRpcTransport(options);
116
+ if (!transporter)
117
+ throw { code: 'MICROSERVICE_OFFLINE', message: `No transporter available for service ${options.service}` };
134
118
  return new Observable(subscriber => {
135
- const request_id = `${this.node_id}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;
119
+ const request_id = `${this.node_id}:${Date.now().toString(36)}:${(this.#index++).toString(36)}`;
136
120
  const pending = {
137
121
  stream: new Subject(),
138
122
  finished: false
@@ -149,28 +133,26 @@ export class SpiderMesh {
149
133
  subscriber.complete();
150
134
  }
151
135
  });
152
- target.transporter.send({
136
+ let cancelSend;
137
+ transporter.send({
153
138
  kind: 'request',
154
139
  request_id,
155
- source_node_id: this.node_id,
156
- target_node_id: target.node_id || '',
140
+ sender_node_id: this.node_id,
141
+ destination_node_id: options.node_id,
157
142
  service: options.service,
158
143
  method: options.method,
159
144
  args: options.args
160
- }, target.node_id).catch((error) => {
145
+ }).then(({ cancel }) => {
146
+ cancelSend = cancel;
147
+ }).catch((error) => {
161
148
  pending.finished = true;
162
149
  pending.stream.error(this.#normalizeRpcError(error));
163
150
  this.#completePendingRpc(request_id);
164
151
  });
165
152
  return () => {
166
153
  subscription.unsubscribe();
167
- if (!pending.finished && this.#rpc.pending.has(request_id) && target.node_id) {
168
- void target.transporter.send({
169
- kind: 'cancel',
170
- request_id,
171
- source_node_id: this.node_id,
172
- target_node_id: target.node_id,
173
- }, target.node_id).catch(() => undefined);
154
+ if (!pending.finished) {
155
+ cancelSend?.();
174
156
  }
175
157
  this.#completePendingRpc(request_id);
176
158
  };
@@ -205,16 +187,15 @@ export class SpiderMesh {
205
187
  }
206
188
  return transporter.pipe(map(({ rpc, offline, endpoints }) => {
207
189
  if (rpc) {
208
- const packet = rpc.packet;
209
- if (packet?.kind === 'request' && packet.target_node_id === this.node_id) {
190
+ const packet = rpc;
191
+ if (packet.kind == 'request') {
210
192
  const reply = async (response) => {
211
193
  await transporter.send({
212
194
  kind: 'response',
213
195
  request_id: packet.request_id,
214
- source_node_id: this.node_id,
215
- target_node_id: rpc.node_id,
196
+ destination_node_id: packet.sender_node_id,
216
197
  ...response
217
- }, rpc.node_id);
198
+ });
218
199
  };
219
200
  const handleResponse = (response) => {
220
201
  if (isSubscribable(response)) {
@@ -284,7 +265,7 @@ export class SpiderMesh {
284
265
  }
285
266
  }
286
267
  }
287
- if (packet?.kind === 'cancel' && packet.target_node_id === this.node_id) {
268
+ if (packet?.kind === 'cancel') {
288
269
  const stream = this.#rpc.running.get(packet.request_id);
289
270
  if (stream) {
290
271
  stream.unsubscribe();
@@ -1 +1 @@
1
- {"version":3,"file":"SpiderMesh.js","sourceRoot":"","sources":["../../src/SpiderMesh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpiderMesh.js","sourceRoot":"","sources":["../../src/SpiderMesh.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import { SpiderMesh } from "../SpiderMesh.js";
2
- export declare const NestJSLinkMicroservice: (factory: any, transporter: string | {
3
- name?: string | undefined;
4
- }) => {
2
+ import type { TransporterSelector } from '../types.js';
3
+ export declare const NestJSLinkMicroservice: (factory: any, transporter?: TransporterSelector) => {
5
4
  provide: any;
6
5
  inject: (typeof SpiderMesh)[];
7
- useFactory: (sm: SpiderMesh) => Promise<import("../RemoteService.js").Mapper<unknown, never>>;
6
+ useFactory: (sm: SpiderMesh) => import("../RemoteService.js").Mapper<unknown, never>;
8
7
  };
@@ -3,9 +3,6 @@ import { SpiderMesh } from "../SpiderMesh.js";
3
3
  export const NestJSLinkMicroservice = (factory, transporter) => ({
4
4
  provide: factory,
5
5
  inject: [SpiderMesh],
6
- useFactory: async (sm) => {
7
- const service = RemoteServiceLinker.link(sm, { service: factory.name, transporter });
8
- return service;
9
- }
6
+ useFactory: (sm) => RemoteServiceLinker.link(sm, { service: factory.name, transporter })
10
7
  });
11
8
  //# sourceMappingURL=NestJSLinkMicroservice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NestJSLinkMicroservice.js","sourceRoot":"","sources":["../../../src/decorators/NestJSLinkMicroservice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAY,EAAE,WAAoD,EAAE,EAAE,CAAC,CAAC;IAC3G,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,UAAU,EAAE,KAAK,EAAE,EAAc,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QACpF,OAAO,OAAO,CAAA;IAClB,CAAC;CACJ,CAAC,CAAA"}
1
+ {"version":3,"file":"NestJSLinkMicroservice.js","sourceRoot":"","sources":["../../../src/decorators/NestJSLinkMicroservice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAY,EAAE,WAAiC,EAAE,EAAE,CAAC,CAAC;IACxF,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,UAAU,EAAE,CAAC,EAAc,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;CACvG,CAAC,CAAA"}
@@ -9,4 +9,4 @@ export * from './decorators/LimitConcurrentRunning.js';
9
9
  export * from './helpers/MicroserviceException.js';
10
10
  export * from './helpers/LimitConcurrency.js';
11
11
  export * from './RemoteService.js';
12
- export type { DiscoveryEvent, DiscoveryTransporter, MdnsMessage, MeshTransporter, NodeMetadata, PubsubEvent, PubsubTransporter, RpcCancelPacket, RpcEvent, RpcMessage, RpcOptions, RpcPacket, RpcRequestPacket, RpcResponsePacket, RpcRoutingOptions, RpcTransporter, SpiderMeshError, SpiderMeshErrorCode, SpiderMeshNode, } from './types.js';
12
+ export type { DiscoveryEvent, DiscoveryTransporter, MdnsMessage, MeshTransporter, NodeMetadata, PubsubEvent, PubsubTransporter, RpcCancelPacket, RpcEvent, RpcOptions, RpcRequestPacket, RpcResponsePacket, RpcRoutingOptions, TransporterSelector, RpcTransporter, SpiderMeshError, SpiderMeshErrorCode, SpiderMeshNode, } from './types.js';
@@ -55,6 +55,9 @@ export type PubsubTransporter = Observable<PubsubEvent> & {
55
55
  export type RpcRoutingOptions = {
56
56
  [key: string]: string | number | boolean;
57
57
  };
58
+ export type TransporterSelector = string | {
59
+ name?: string;
60
+ } | (abstract new (...args: any[]) => any);
58
61
  export type RpcOptions<T = any> = {
59
62
  service: string;
60
63
  method: string;
@@ -63,49 +66,42 @@ export type RpcOptions<T = any> = {
63
66
  timeout?: number;
64
67
  retry?: number;
65
68
  node_id?: string;
66
- transporter?: string | {
67
- name?: string;
68
- };
69
+ transporter?: TransporterSelector;
69
70
  };
70
71
  export type RpcRequestPacket = {
71
72
  kind: 'request';
72
73
  request_id: string;
73
- source_node_id: string;
74
- target_node_id: string;
75
74
  service: string;
76
75
  method: string;
77
76
  args: any[];
77
+ sender_node_id: string;
78
+ destination_node_id?: string;
78
79
  };
79
80
  export type RpcResponsePacket = {
80
81
  kind: 'response';
81
82
  request_id: string;
82
- source_node_id: string;
83
- target_node_id: string;
84
83
  data?: any;
85
84
  error?: SpiderMeshError | {
86
85
  code?: string;
87
86
  message: string;
88
87
  };
89
88
  completed?: boolean;
89
+ destination_node_id?: string;
90
90
  };
91
91
  export type RpcCancelPacket = {
92
92
  kind: 'cancel';
93
93
  request_id: string;
94
- source_node_id: string;
95
- target_node_id: string;
96
- };
97
- export type RpcPacket = RpcRequestPacket | RpcResponsePacket | RpcCancelPacket;
98
- export type RpcMessage = {
99
- node_id: string;
100
- packet: RpcPacket;
94
+ destination_node_id?: string;
101
95
  };
102
96
  export type RpcEvent = Partial<{
103
- rpc: RpcMessage;
97
+ rpc: RpcRequestPacket | RpcResponsePacket | RpcCancelPacket;
104
98
  offline: string;
105
99
  endpoints: Record<string, string | boolean | number>;
106
100
  }>;
107
101
  export type RpcTransporter = Observable<RpcEvent> & {
108
102
  linkRegistry?(registry: Registry): void;
109
- send(data: RpcPacket, node_id?: string): Promise<void>;
103
+ send(data: RpcRequestPacket | RpcCancelPacket | RpcResponsePacket): Promise<{
104
+ cancel: () => void;
105
+ }>;
110
106
  };
111
107
  export type MeshTransporter = RpcTransporter | PubsubTransporter | DiscoveryTransporter;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { firstValueFrom, Subject } from 'rxjs';
3
+ import { Registry } from '../../src/Registry.js';
4
+ import { SpiderMesh } from '../../src/SpiderMesh.js';
5
+ import { LOCAL_SERVICES$ } from '../../src/decorators/Microservice.js';
6
+ const role = process.argv[2];
7
+ const serviceName = process.argv[3];
8
+ if (!role || !serviceName) {
9
+ throw new Error('Usage: bun run tests/fixtures/process-mesh.ts <role> <serviceName>');
10
+ }
11
+ const sendHostMessage = (message) => {
12
+ process.stdout.write(`${JSON.stringify(message)}\n`);
13
+ };
14
+ class ProcessRpcTransporter extends Subject {
15
+ metadata = { mock: true };
16
+ async send(packet, node_id) {
17
+ sendHostMessage({
18
+ kind: 'rpc-send',
19
+ role,
20
+ packet,
21
+ node_id,
22
+ });
23
+ return { cancel: () => { } };
24
+ }
25
+ }
26
+ class ProcessDiscoveryTransporter extends Subject {
27
+ async broadcast(data) {
28
+ sendHostMessage({
29
+ kind: 'discovery-broadcast',
30
+ role,
31
+ node: data.node,
32
+ });
33
+ }
34
+ }
35
+ const registry = role === 'client' ? new Registry() : undefined;
36
+ const mesh = new SpiderMesh(registry);
37
+ const rpcTransporter = new ProcessRpcTransporter();
38
+ const discoveryTransporter = new ProcessDiscoveryTransporter();
39
+ mesh.registerTransporter(rpcTransporter, 'ProcessRpcTransporter');
40
+ mesh.registerTransporter(discoveryTransporter, 'ProcessDiscoveryTransporter');
41
+ if (role === 'provider') {
42
+ LOCAL_SERVICES$.next({
43
+ name: serviceName,
44
+ metadata: {},
45
+ instance: {
46
+ echo(value) {
47
+ return `provider:${value}`;
48
+ },
49
+ },
50
+ });
51
+ }
52
+ sendHostMessage({
53
+ kind: 'ready',
54
+ role,
55
+ node_id: mesh.node_id,
56
+ });
57
+ const rl = createInterface({ input: process.stdin });
58
+ rl.on('line', async (line) => {
59
+ if (!line.trim())
60
+ return;
61
+ const command = JSON.parse(line);
62
+ if (command.kind === 'discovery-deliver') {
63
+ discoveryTransporter.next({ discovered: command.node });
64
+ return;
65
+ }
66
+ if (command.kind === 'rpc-deliver') {
67
+ rpcTransporter.next({
68
+ rpc: command.packet,
69
+ });
70
+ return;
71
+ }
72
+ if (command.kind === 'call') {
73
+ try {
74
+ const value = await firstValueFrom(mesh.callRemoteService({
75
+ service: serviceName,
76
+ method: 'echo',
77
+ args: [command.value],
78
+ timeout: 1500,
79
+ }));
80
+ sendHostMessage({ kind: 'result', role, value });
81
+ }
82
+ catch (error) {
83
+ sendHostMessage({
84
+ kind: 'result',
85
+ role,
86
+ error: error instanceof Error ? error.message : String(error),
87
+ code: typeof error === 'object' && error && 'code' in error ? String(error.code) : undefined,
88
+ });
89
+ }
90
+ }
91
+ });
92
+ //# sourceMappingURL=process-mesh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-mesh.js","sourceRoot":"","sources":["../../../tests/fixtures/process-mesh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,174 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import { firstValueFrom, from, Subject, toArray } from 'rxjs';
3
+ import { Registry } from '../src/Registry.js';
4
+ import { RemoteServiceLinker } from '../src/RemoteService.js';
5
+ import { SpiderMesh } from '../src/SpiderMesh.js';
6
+ import { NestJSLinkMicroservice } from '../src/decorators/NestJSLinkMicroservice.js';
7
+ import { LOCAL_SERVICES$ } from '../src/decorators/Microservice.js';
8
+ let sequence = 0;
9
+ const nextName = (prefix) => `${prefix}${++sequence}`;
10
+ const cloneNode = (node) => ({
11
+ ...node,
12
+ topics: [...node.topics],
13
+ services: { ...node.services },
14
+ nodes: { ...node.nodes },
15
+ transporters: { ...node.transporters },
16
+ });
17
+ class NamedLoopbackRpcTransporter extends Subject {
18
+ localNodeId;
19
+ constructor(localNodeId) {
20
+ super();
21
+ this.localNodeId = localNodeId;
22
+ }
23
+ async send(data, node_id) {
24
+ const targetNodeId = node_id || this.localNodeId;
25
+ this.next({
26
+ rpc: 'sender_node_id' in data ? { ...data, sender_node_id: targetNodeId } : data,
27
+ });
28
+ return { cancel: () => { } };
29
+ }
30
+ }
31
+ class SilentRpcTransporter extends Subject {
32
+ async send(_data, _node_id) {
33
+ return { cancel: () => { } };
34
+ }
35
+ }
36
+ class MockPubsubTransporter extends Subject {
37
+ #topics = new Map();
38
+ constructor() {
39
+ super();
40
+ }
41
+ async publish(topic, data) {
42
+ this.#getTopic(topic).next(data);
43
+ }
44
+ listen(topic) {
45
+ return this.#getTopic(topic);
46
+ }
47
+ #getTopic(topic) {
48
+ if (!this.#topics.has(topic)) {
49
+ this.#topics.set(topic, new Subject());
50
+ }
51
+ return this.#topics.get(topic);
52
+ }
53
+ }
54
+ class MockDiscoveryTransporter extends Subject {
55
+ broadcasts = [];
56
+ async broadcast(data) {
57
+ this.broadcasts.push({
58
+ ...data,
59
+ node: cloneNode(data.node),
60
+ });
61
+ }
62
+ }
63
+ describe('mock e2e', () => {
64
+ test('routes rpc through explicit transporter name and class', async () => {
65
+ const mesh = new SpiderMesh();
66
+ const silent = new SilentRpcTransporter();
67
+ const loopback = new NamedLoopbackRpcTransporter(mesh.node_id);
68
+ const serviceName = nextName('EchoService');
69
+ mesh.registerTransporter(silent, 'SilentRpcTransporter');
70
+ mesh.registerTransporter(loopback);
71
+ LOCAL_SERVICES$.next({
72
+ name: serviceName,
73
+ metadata: {},
74
+ instance: {
75
+ echo(value) {
76
+ return value;
77
+ },
78
+ stream() {
79
+ return from([1, 2, 3]);
80
+ },
81
+ },
82
+ });
83
+ const byName = await firstValueFrom(mesh.callRemoteService({
84
+ service: serviceName,
85
+ method: 'echo',
86
+ args: ['by-name'],
87
+ transporter: 'NamedLoopbackRpcTransporter',
88
+ }));
89
+ const byClass = await firstValueFrom(mesh.callRemoteService({
90
+ service: serviceName,
91
+ method: 'echo',
92
+ args: ['by-class'],
93
+ transporter: NamedLoopbackRpcTransporter,
94
+ }));
95
+ const streamValues = await firstValueFrom(mesh.callRemoteService({
96
+ service: serviceName,
97
+ method: 'stream',
98
+ args: [],
99
+ transporter: NamedLoopbackRpcTransporter,
100
+ }).pipe(toArray()));
101
+ expect(byName).toBe('by-name');
102
+ expect(byClass).toBe('by-class');
103
+ expect(streamValues).toEqual([1, 2, 3]);
104
+ });
105
+ test('wait supports async checker functions', async () => {
106
+ const registry = new Registry();
107
+ const mesh = new SpiderMesh(registry);
108
+ const serviceName = nextName('AsyncWaitService');
109
+ const remote = RemoteServiceLinker.link(mesh, { service: serviceName });
110
+ const waitPromise = remote.wait(async (nodes) => {
111
+ await Promise.resolve();
112
+ return nodes.length > 0;
113
+ });
114
+ await Promise.resolve();
115
+ registry.upsertPeer({
116
+ host: '127.0.0.1',
117
+ namespace: mesh.namespace,
118
+ node_id: nextName('peer'),
119
+ topics: [],
120
+ services: {
121
+ [serviceName]: {},
122
+ },
123
+ nodes: {},
124
+ transporters: {
125
+ rpc: 'NamedLoopbackRpcTransporter',
126
+ },
127
+ version: 1,
128
+ });
129
+ const nodes = await waitPromise;
130
+ expect(nodes).not.toBeNull();
131
+ expect(nodes).toHaveLength(1);
132
+ expect(nodes?.[0]?.services?.[serviceName]).toEqual({});
133
+ });
134
+ test('keeps topic metadata when discovery registers after listen and clears it on unsubscribe', async () => {
135
+ class TopicEvent {
136
+ }
137
+ const mesh = new SpiderMesh();
138
+ const pubsub = new MockPubsubTransporter();
139
+ const discovery = new MockDiscoveryTransporter();
140
+ const event = mesh.linkEvent(TopicEvent);
141
+ mesh.registerTransporter(pubsub, 'MockPubsubTransporter');
142
+ const subscription = event.listen().subscribe(() => undefined);
143
+ mesh.registerTransporter(discovery, 'MockDiscoveryTransporter');
144
+ expect(discovery.broadcasts.at(-1)?.node.topics).toContain('TopicEvent');
145
+ subscription.unsubscribe();
146
+ expect(discovery.broadcasts.at(-1)?.node.topics).not.toContain('TopicEvent');
147
+ });
148
+ test('NestJSLinkMicroservice links a remote service without requiring transporter', async () => {
149
+ class BillingService {
150
+ charge(orderId) {
151
+ throw new Error('typing only');
152
+ }
153
+ }
154
+ const mesh = new SpiderMesh();
155
+ const loopback = new NamedLoopbackRpcTransporter(mesh.node_id);
156
+ mesh.registerTransporter(loopback);
157
+ LOCAL_SERVICES$.next({
158
+ name: BillingService.name,
159
+ metadata: {},
160
+ instance: {
161
+ charge(orderId) {
162
+ return { orderId };
163
+ },
164
+ },
165
+ });
166
+ const provider = NestJSLinkMicroservice(BillingService);
167
+ const remote = provider.useFactory(mesh);
168
+ const result = await remote.charge('order-1');
169
+ expect(provider.provide).toBe(BillingService);
170
+ expect(provider.inject).toEqual([SpiderMesh]);
171
+ expect(result).toEqual({ orderId: 'order-1' });
172
+ });
173
+ });
174
+ //# sourceMappingURL=mock-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-e2e.test.js","sourceRoot":"","sources":["../../tests/mock-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,93 @@
1
+ import { afterEach, describe, expect, test } from 'bun:test';
2
+ import { spawn } from 'node:child_process';
3
+ import { EventEmitter, once } from 'node:events';
4
+ import { createInterface } from 'node:readline';
5
+ class MeshProcess {
6
+ process;
7
+ events = new EventEmitter();
8
+ messages = [];
9
+ stderr = '';
10
+ constructor(role, serviceName) {
11
+ this.process = spawn('bun', ['run', 'tests/fixtures/process-mesh.ts', role, serviceName], {
12
+ cwd: process.cwd(),
13
+ stdio: ['pipe', 'pipe', 'pipe'],
14
+ });
15
+ createInterface({ input: this.process.stdout }).on('line', line => {
16
+ if (!line.trim())
17
+ return;
18
+ const message = JSON.parse(line);
19
+ this.messages.push(message);
20
+ this.events.emit(message.kind, message);
21
+ this.events.emit('message', message);
22
+ });
23
+ createInterface({ input: this.process.stderr }).on('line', line => {
24
+ this.stderr += `${line}\n`;
25
+ });
26
+ }
27
+ send(message) {
28
+ this.process.stdin.write(`${JSON.stringify(message)}\n`);
29
+ }
30
+ async waitFor(kind, timeoutMs = 4000) {
31
+ const existing = this.messages.find(message => message.kind === kind);
32
+ if (existing)
33
+ return existing;
34
+ const timer = setTimeout(() => {
35
+ this.events.emit(`timeout:${kind}`);
36
+ }, timeoutMs);
37
+ try {
38
+ const result = await Promise.race([
39
+ once(this.events, kind).then(([message]) => message),
40
+ once(this.events, `timeout:${kind}`).then(() => {
41
+ throw new Error(`Timed out waiting for ${kind}. stderr:\n${this.stderr}`);
42
+ }),
43
+ ]);
44
+ return result;
45
+ }
46
+ finally {
47
+ clearTimeout(timer);
48
+ }
49
+ }
50
+ latest(kind) {
51
+ return [...this.messages].reverse().find(message => message.kind === kind);
52
+ }
53
+ kill() {
54
+ this.process.kill();
55
+ }
56
+ }
57
+ const children = [];
58
+ afterEach(() => {
59
+ for (const child of children.splice(0)) {
60
+ child.kill();
61
+ }
62
+ });
63
+ describe('process e2e', () => {
64
+ test('routes rpc between isolated processes through mock discovery and rpc transporters', async () => {
65
+ const serviceName = `ProcessEcho${Date.now().toString(36)}`;
66
+ const client = new MeshProcess('client', serviceName);
67
+ const provider = new MeshProcess('provider', serviceName);
68
+ children.push(client, provider);
69
+ const routeDiscovery = (message) => {
70
+ const target = message.role === 'provider' ? client : provider;
71
+ target.send({ kind: 'discovery-deliver', node: message.node });
72
+ };
73
+ const routeRpc = (message) => {
74
+ const target = message.role === 'provider' ? client : provider;
75
+ target.send({ kind: 'rpc-deliver', packet: message.packet });
76
+ };
77
+ client.events.on('discovery-broadcast', routeDiscovery);
78
+ provider.events.on('discovery-broadcast', routeDiscovery);
79
+ client.events.on('rpc-send', routeRpc);
80
+ provider.events.on('rpc-send', routeRpc);
81
+ await client.waitFor('ready');
82
+ await provider.waitFor('ready');
83
+ const providerDiscovery = provider.latest('discovery-broadcast');
84
+ if (providerDiscovery) {
85
+ client.send({ kind: 'discovery-deliver', node: providerDiscovery.node });
86
+ }
87
+ client.send({ kind: 'call', value: 'cross-process' });
88
+ const result = await client.waitFor('result');
89
+ expect(result.error).toBeUndefined();
90
+ expect(result.value).toBe('provider:cross-process');
91
+ });
92
+ });
93
+ //# sourceMappingURL=process-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-e2e.test.js","sourceRoot":"","sources":["../../tests/process-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"root":["../const.ts","../env.d.ts","../src/registry.ts","../src/remoteservice.ts","../src/spidermesh.ts","../src/index.ts","../src/types.ts","../src/decorators/beforemicroserviceonline.ts","../src/decorators/limitconcurrentrunning.ts","../src/decorators/microservice.ts","../src/decorators/nestjsexposemicroservice.ts","../src/decorators/nestjslinkevent.ts","../src/decorators/nestjslinkmicroservice.ts","../src/helpers/limitconcurrency.ts","../src/helpers/microserviceexception.ts","../src/helpers/sleep.ts"],"version":"6.0.3"}
1
+ {"root":["../const.ts","../env.d.ts","../src/registry.ts","../src/remoteservice.ts","../src/spidermesh.ts","../src/index.ts","../src/types.ts","../src/decorators/beforemicroserviceonline.ts","../src/decorators/limitconcurrentrunning.ts","../src/decorators/microservice.ts","../src/decorators/nestjsexposemicroservice.ts","../src/decorators/nestjslinkevent.ts","../src/decorators/nestjslinkmicroservice.ts","../src/helpers/limitconcurrency.ts","../src/helpers/microserviceexception.ts","../src/helpers/sleep.ts","../tests/mock-e2e.test.ts","../tests/process-e2e.test.ts","../tests/fixtures/process-mesh.ts"],"version":"6.0.3"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spider-mesh/core",
3
3
  "type": "module",
4
- "version": "2.0.42",
4
+ "version": "2.0.44",
5
5
  "description": "Lightweight microservice framework for typescript, auto discovery, load-balancing, fault-torrent, multiple transporters",
6
6
  "main": "./build/src/index.js",
7
7
  "types": "./build/src/index.d.ts",
package/tsconfig.json CHANGED
@@ -31,9 +31,7 @@
31
31
  "exclude": [
32
32
  "node_modules",
33
33
  "out",
34
- "src/schema.ts",
35
34
  "bin",
36
- "./build/**/*",
37
- "tests/**/*"
35
+ "./build/**/*"
38
36
  ]
39
37
  }