@fluojs/microservices 1.0.5 → 2.0.0

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 (34) hide show
  1. package/README.ko.md +20 -6
  2. package/README.md +20 -6
  3. package/dist/module.d.ts.map +1 -1
  4. package/dist/module.js +1 -0
  5. package/dist/service.d.ts +12 -3
  6. package/dist/service.d.ts.map +1 -1
  7. package/dist/service.js +92 -36
  8. package/dist/status.d.ts +3 -0
  9. package/dist/status.d.ts.map +1 -1
  10. package/dist/status.js +10 -2
  11. package/dist/transports/grpc-transport.d.ts +4 -2
  12. package/dist/transports/grpc-transport.d.ts.map +1 -1
  13. package/dist/transports/grpc-transport.js +77 -12
  14. package/dist/transports/kafka-transport.d.ts +9 -1
  15. package/dist/transports/kafka-transport.d.ts.map +1 -1
  16. package/dist/transports/kafka-transport.js +29 -5
  17. package/dist/transports/nats-transport.d.ts +2 -0
  18. package/dist/transports/nats-transport.d.ts.map +1 -1
  19. package/dist/transports/nats-transport.js +50 -27
  20. package/dist/transports/rabbitmq-transport.d.ts +9 -1
  21. package/dist/transports/rabbitmq-transport.d.ts.map +1 -1
  22. package/dist/transports/rabbitmq-transport.js +38 -13
  23. package/dist/transports/redis-streams-transport.d.ts +18 -0
  24. package/dist/transports/redis-streams-transport.d.ts.map +1 -1
  25. package/dist/transports/redis-streams-transport.js +31 -1
  26. package/dist/transports/redis-transport.d.ts +1 -1
  27. package/dist/transports/redis-transport.d.ts.map +1 -1
  28. package/dist/transports/redis-transport.js +32 -16
  29. package/dist/transports/tcp-transport.d.ts +1 -0
  30. package/dist/transports/tcp-transport.d.ts.map +1 -1
  31. package/dist/transports/tcp-transport.js +45 -44
  32. package/dist/types.d.ts +7 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/package.json +11 -7
@@ -10,7 +10,6 @@ interface RedisLike {
10
10
  export interface RedisPubSubMicroserviceTransportOptions {
11
11
  namespace?: string;
12
12
  publishClient: RedisLike;
13
- requestTimeoutMs?: number;
14
13
  subscribeClient: RedisLike;
15
14
  }
16
15
  /**
@@ -30,6 +29,7 @@ export declare class RedisPubSubMicroserviceTransport implements MicroserviceTra
30
29
  private readonly messageListener;
31
30
  private readonly namespace;
32
31
  private logEventHandlerFailure;
32
+ private logMalformedFrame;
33
33
  /**
34
34
  * Creates a Redis Pub/Sub transport using dedicated publish and subscribe clients.
35
35
  *
@@ -1 +1 @@
1
- {"version":3,"file":"redis-transport.d.ts","sourceRoot":"","sources":["../../src/transports/redis-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AASxG,UAAU,SAAS;IACjB,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;IACtF,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;IACpF,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,SAAS,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED,wEAAwE;AACxE,MAAM,WAAW,uCAAuC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,SAAS,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,gCAAiC,YAAW,qBAAqB;IAqBhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE9B;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,sBAAsB;IAI9B;;;;OAIG;gBAC0B,OAAO,EAAE,uCAAuC;IAI7E,SAAS,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI;IAIpD;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCtD;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D;;;;;;;;OAQG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrF;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsCd,cAAc;IA4B5B,OAAO,KAAK,YAAY,GAEvB;CACF"}
1
+ {"version":3,"file":"redis-transport.d.ts","sourceRoot":"","sources":["../../src/transports/redis-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqBxG,UAAU,SAAS;IACjB,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;IACtF,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC;IACpF,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,SAAS,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,WAAW,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED,wEAAwE;AACxE,MAAM,WAAW,uCAAuC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,SAAS,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,gCAAiC,YAAW,qBAAqB;IAmChE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlCpC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAE9B;IACF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,iBAAiB;IAczB;;;;OAIG;gBAC0B,OAAO,EAAE,uCAAuC;IAI7E,SAAS,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI;IAIpD;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCtD;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D;;;;;;;;OAQG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrF;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsCd,cAAc;IA8B5B,OAAO,KAAK,YAAY,GAEvB;CACF"}
@@ -1,4 +1,7 @@
1
1
  import { logTransportEventHandlerFailure } from './event-handler-logger.js';
2
+ function isRedisPubSubMessage(value) {
3
+ return typeof value === 'object' && value !== null && !Array.isArray(value) && 'kind' in value && value.kind === 'event' && 'pattern' in value && typeof value.pattern === 'string';
4
+ }
2
5
 
3
6
  /** Options for configuring the Redis Pub/Sub microservice transport. */
4
7
 
@@ -22,6 +25,17 @@ export class RedisPubSubMicroserviceTransport {
22
25
  logEventHandlerFailure(error) {
23
26
  logTransportEventHandlerFailure(this.logger, 'RedisPubSubMicroserviceTransport', error);
24
27
  }
28
+ logMalformedFrame(error) {
29
+ const logger = this.logger;
30
+ if (!logger) {
31
+ return;
32
+ }
33
+ try {
34
+ logger.error('Malformed frame discarded.', error, 'RedisPubSubMicroserviceTransport');
35
+ } catch {
36
+ // Redis callbacks must remain isolated when the configured logger fails.
37
+ }
38
+ }
25
39
 
26
40
  /**
27
41
  * Creates a Redis Pub/Sub transport using dedicated publish and subscribe clients.
@@ -147,27 +161,29 @@ export class RedisPubSubMicroserviceTransport {
147
161
  }
148
162
  }
149
163
  async handleIncoming(channel, rawMessage) {
150
- let message;
151
- try {
152
- message = JSON.parse(rawMessage);
153
- } catch {
164
+ if (!this.handler || channel !== this.eventChannel) {
154
165
  return;
155
166
  }
156
- if (!this.handler) {
157
- return;
158
- }
159
- if (channel === this.eventChannel && message.kind === 'event') {
160
- try {
161
- await this.handler({
162
- kind: 'event',
163
- pattern: message.pattern,
164
- payload: message.payload
165
- });
166
- } catch (error) {
167
- this.logEventHandlerFailure(error);
167
+ let message;
168
+ try {
169
+ const decoded = JSON.parse(rawMessage);
170
+ if (!isRedisPubSubMessage(decoded)) {
171
+ throw new Error('Redis Pub/Sub event frames must have kind "event" and a string pattern.');
168
172
  }
173
+ message = decoded;
174
+ } catch (error) {
175
+ this.logMalformedFrame(error);
169
176
  return;
170
177
  }
178
+ try {
179
+ await this.handler({
180
+ kind: 'event',
181
+ pattern: message.pattern,
182
+ payload: message.payload
183
+ });
184
+ } catch (error) {
185
+ this.logEventHandlerFailure(error);
186
+ }
171
187
  }
172
188
  get eventChannel() {
173
189
  return `${this.namespace}:events`;
@@ -22,6 +22,7 @@ export declare class TcpMicroserviceTransport implements MicroserviceTransport {
22
22
  readonly ownsResources = true;
23
23
  private boundPort;
24
24
  private closing;
25
+ private closePromise;
25
26
  private handler;
26
27
  private listenPromise;
27
28
  private server;
@@ -1 +1 @@
1
- {"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../src/transports/tcp-transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAQ5F,8DAA8D;AAC9D,MAAM,WAAW,+BAA+B;IAC9C,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,qBAAqB;IAoBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAnBpC,yFAAyF;IACzF,QAAQ,CAAC,aAAa,QAAQ;IAE9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C;;;;OAIG;gBAC0B,OAAO,EAAE,+BAA+B;IAMrE;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAqBxC,cAAc;IAyB5B;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D;;;;;;;OAOG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrF;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6Cd,mBAAmB;YA8BnB,cAAc;IA2G5B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,gBAAgB;YAUV,YAAY;IAyB1B,OAAO,CAAC,gBAAgB;IAyCxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;CASvB"}
1
+ {"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../src/transports/tcp-transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAQ5F,8DAA8D;AAC9D,MAAM,WAAW,+BAA+B;IAC9C,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,qBAAqB;IAqBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,yFAAyF;IACzF,QAAQ,CAAC,aAAa,QAAQ;IAE9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAE1C;;;;OAIG;gBAC0B,OAAO,EAAE,+BAA+B;IAMrE;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAqBxC,cAAc;IAyB5B;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D;;;;;;;OAOG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrF;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiDR,mBAAmB;YA8BnB,cAAc;IA2G5B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,gBAAgB;YAUV,YAAY;IAyB1B,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;CASvB"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  const DEFAULT_MAX_FRAME_BYTES = 1_048_576;
4
4
 
5
+ // allow: SIZE_OK — TCP framing and lifecycle form one transport state machine; splitting it is outside this focused fix.
5
6
  /**
6
7
  * Lightweight TCP transport for request-response messages and fire-and-forget events.
7
8
  *
@@ -13,6 +14,7 @@ export class TcpMicroserviceTransport {
13
14
  ownsResources = true;
14
15
  boundPort;
15
16
  closing = false;
17
+ closePromise;
16
18
  handler;
17
19
  listenPromise;
18
20
  server;
@@ -117,40 +119,43 @@ export class TcpMicroserviceTransport {
117
119
  *
118
120
  * @returns A promise that resolves once the server is fully closed.
119
121
  */
120
- async close() {
122
+ close() {
121
123
  this.closing = true;
122
- let listenError;
123
- if (this.listenPromise) {
124
- try {
125
- await this.listenPromise;
126
- } catch (error) {
127
- listenError = error;
124
+ this.closePromise ??= (async () => {
125
+ let listenError;
126
+ if (this.listenPromise) {
127
+ try {
128
+ await this.listenPromise;
129
+ } catch (error) {
130
+ listenError = error;
131
+ }
128
132
  }
129
- }
130
- for (const socket of this.sockets) {
131
- socket.destroy();
132
- }
133
- this.sockets.clear();
134
- if (!this.server?.listening) {
133
+ for (const socket of this.sockets) {
134
+ socket.destroy();
135
+ }
136
+ this.sockets.clear();
137
+ if (!this.server?.listening) {
138
+ this.boundPort = undefined;
139
+ if (listenError) {
140
+ throw listenError;
141
+ }
142
+ return;
143
+ }
144
+ await new Promise((resolve, reject) => {
145
+ this.server?.close(error => {
146
+ if (error) {
147
+ reject(error);
148
+ return;
149
+ }
150
+ resolve();
151
+ });
152
+ });
135
153
  this.boundPort = undefined;
136
154
  if (listenError) {
137
155
  throw listenError;
138
156
  }
139
- return;
140
- }
141
- await new Promise((resolve, reject) => {
142
- this.server?.close(error => {
143
- if (error) {
144
- reject(error);
145
- return;
146
- }
147
- resolve();
148
- });
149
- });
150
- this.boundPort = undefined;
151
- if (listenError) {
152
- throw listenError;
153
- }
157
+ })();
158
+ return this.closePromise;
154
159
  }
155
160
  async handleInboundPacket(socket, packet) {
156
161
  if (!this.handler) {
@@ -320,26 +325,19 @@ export class TcpMicroserviceTransport {
320
325
  }
321
326
  }
322
327
  bindSocketParser(socket, onPacket) {
323
- let buffer = '';
324
- let bufferBytes = 0;
328
+ let buffer = Buffer.alloc(0);
325
329
  socket.on('data', chunk => {
326
- const chunkString = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
327
- buffer += chunkString;
328
- bufferBytes += Buffer.byteLength(chunkString, 'utf8');
329
- if (bufferBytes > this.maxFrameBytes) {
330
- socket.destroy();
331
- return;
332
- }
333
- let newLineIndex = buffer.indexOf('\n');
330
+ const chunkBuffer = typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : chunk;
331
+ buffer = buffer.length === 0 ? chunkBuffer : Buffer.concat([buffer, chunkBuffer]);
332
+ let newLineIndex = buffer.indexOf(0x0a);
334
333
  while (newLineIndex >= 0) {
335
- const rawLine = buffer.slice(0, newLineIndex);
336
- const line = rawLine.trim();
337
- buffer = buffer.slice(newLineIndex + 1);
338
- bufferBytes = Buffer.byteLength(buffer, 'utf8');
339
- if (Buffer.byteLength(rawLine, 'utf8') > this.maxFrameBytes) {
334
+ const rawLine = buffer.subarray(0, newLineIndex);
335
+ buffer = buffer.subarray(newLineIndex + 1);
336
+ if (rawLine.length > this.maxFrameBytes) {
340
337
  socket.destroy();
341
338
  return;
342
339
  }
340
+ const line = rawLine.toString('utf8').trim();
343
341
  if (line.length > 0) {
344
342
  try {
345
343
  void Promise.resolve(onPacket(JSON.parse(line))).catch(() => undefined);
@@ -348,7 +346,10 @@ export class TcpMicroserviceTransport {
348
346
  return;
349
347
  }
350
348
  }
351
- newLineIndex = buffer.indexOf('\n');
349
+ newLineIndex = buffer.indexOf(0x0a);
350
+ }
351
+ if (buffer.length > this.maxFrameBytes) {
352
+ socket.destroy();
352
353
  }
353
354
  });
354
355
  }
package/dist/types.d.ts CHANGED
@@ -69,6 +69,13 @@ export interface MicroserviceTransport {
69
69
  listenServerStreaming?(handler: TransportServerStreamHandler): void;
70
70
  /** Whether this transport closes or destroys runtime resources it creates. */
71
71
  readonly ownsResources?: boolean;
72
+ /** Per-resource ownership details when one transport mixes caller- and framework-owned resources. */
73
+ readonly resourceOwnership?: {
74
+ /** Ownership of cached outbound transport clients. */
75
+ readonly outboundClients?: 'caller' | 'framework';
76
+ /** Ownership of the inbound transport server. */
77
+ readonly server?: 'caller' | 'framework';
78
+ };
72
79
  setLogger?(logger: MicroserviceTransportLogger): void;
73
80
  send(pattern: string, payload: unknown, signal?: AbortSignal): Promise<unknown>;
74
81
  serverStream?(pattern: string, payload: unknown, signal?: AbortSignal): AsyncIterable<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,4EAA4E;AAC5E,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AACtC,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,eAAe,CAAC;AAElG,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7E,iFAAiF;AACjF,MAAM,WAAW,2BAA4B,SAAQ,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC;CAAG;AAExF,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,GAAG,IAAI,IAAI,CAAC;IACZ,KAAK,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,qDAAqD;AACrD,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,kBAAkB,KACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,mEAAmE;AACnE,MAAM,MAAM,4BAA4B,GAAG,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,kBAAkB,KACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,qDAAqD;AACrD,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,mEAAmE;AACnE,MAAM,MAAM,4BAA4B,GAAG,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,KAC3B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,4DAA4D;AAC5D,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,MAAM,EAAE,kBAAkB,KACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,0EAA0E;AAC1E,MAAM,MAAM,0BAA0B,GAAG,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,MAAM,EAAE,kBAAkB,KACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,8FAA8F;AAC9F,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;IACnH,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAC/G,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,mBAAmB,CAAC,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAChE,qBAAqB,CAAC,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACpE,qBAAqB,CAAC,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACpE,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,qGAAqG;IACrG,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QAC3B,sDAAsD;QACtD,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;QAClD,iDAAiD;QACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;KAC1C,CAAC;IACF,SAAS,CAAC,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;CAChG;AAED,mGAAmG;AACnG,MAAM,WAAW,qCAAqC;IACpD,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC;IAC5B,+FAA+F;IAC/F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,WAAW,yBAAyB;IACxC,qFAAqF;IACrF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sHAAsH;IACtH,MAAM,CAAC,EAAE,qCAAqC,CAAC;IAC/C,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC;IACnH,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG;QAAE,MAAM,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAC/G,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,YAAY,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;CAChG"}
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "grpc",
14
14
  "mqtt"
15
15
  ],
16
- "version": "1.0.5",
16
+ "version": "2.0.0",
17
17
  "private": false,
18
18
  "license": "MIT",
19
19
  "repository": {
@@ -22,7 +22,7 @@
22
22
  "directory": "packages/microservices"
23
23
  },
24
24
  "engines": {
25
- "node": ">=20.0.0"
25
+ "node": ">=24.0.0 <27"
26
26
  },
27
27
  "publishConfig": {
28
28
  "access": "public"
@@ -53,6 +53,10 @@
53
53
  "types": "./dist/transports/redis-transport.d.ts",
54
54
  "import": "./dist/transports/redis-transport.js"
55
55
  },
56
+ "./redis-streams": {
57
+ "types": "./dist/transports/redis-streams-transport.d.ts",
58
+ "import": "./dist/transports/redis-streams-transport.js"
59
+ },
56
60
  "./rabbitmq": {
57
61
  "types": "./dist/transports/rabbitmq-transport.d.ts",
58
62
  "import": "./dist/transports/rabbitmq-transport.js"
@@ -68,12 +72,12 @@
68
72
  "dist"
69
73
  ],
70
74
  "dependencies": {
71
- "@fluojs/core": "^1.1.0",
72
- "@fluojs/di": "^2.0.0",
73
- "@fluojs/runtime": "^2.0.1"
75
+ "@fluojs/core": "^2.0.0",
76
+ "@fluojs/di": "^3.0.0",
77
+ "@fluojs/runtime": "^3.0.0"
74
78
  },
75
79
  "peerDependencies": {
76
- "@grpc/grpc-js": "^1.0.0",
80
+ "@grpc/grpc-js": "^1.14.4",
77
81
  "@grpc/proto-loader": "^0.8.0",
78
82
  "ioredis": "^5.0.0",
79
83
  "mqtt": "^5.0.0"
@@ -93,7 +97,7 @@
93
97
  }
94
98
  },
95
99
  "devDependencies": {
96
- "vitest": "^3.2.4"
100
+ "vitest": "^4.1.11"
97
101
  },
98
102
  "scripts": {
99
103
  "prebuild": "node ../../tooling/scripts/clean-dist.mjs",