@fluojs/microservices 1.0.4 → 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 (37) hide show
  1. package/README.ko.md +64 -6
  2. package/README.md +64 -6
  3. package/dist/module.d.ts.map +1 -1
  4. package/dist/module.js +2 -1
  5. package/dist/service.d.ts +15 -5
  6. package/dist/service.d.ts.map +1 -1
  7. package/dist/service.js +96 -38
  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 +241 -241
  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 +41 -21
  17. package/dist/transports/mqtt-transport.d.ts +1 -0
  18. package/dist/transports/mqtt-transport.d.ts.map +1 -1
  19. package/dist/transports/mqtt-transport.js +22 -1
  20. package/dist/transports/nats-transport.d.ts +3 -0
  21. package/dist/transports/nats-transport.d.ts.map +1 -1
  22. package/dist/transports/nats-transport.js +83 -30
  23. package/dist/transports/rabbitmq-transport.d.ts +10 -1
  24. package/dist/transports/rabbitmq-transport.d.ts.map +1 -1
  25. package/dist/transports/rabbitmq-transport.js +80 -30
  26. package/dist/transports/redis-streams-transport.d.ts +18 -0
  27. package/dist/transports/redis-streams-transport.d.ts.map +1 -1
  28. package/dist/transports/redis-streams-transport.js +46 -3
  29. package/dist/transports/redis-transport.d.ts +1 -1
  30. package/dist/transports/redis-transport.d.ts.map +1 -1
  31. package/dist/transports/redis-transport.js +32 -16
  32. package/dist/transports/tcp-transport.d.ts +1 -0
  33. package/dist/transports/tcp-transport.d.ts.map +1 -1
  34. package/dist/transports/tcp-transport.js +45 -44
  35. package/dist/types.d.ts +7 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/package.json +11 -7
@@ -29,9 +29,12 @@ export class RedisStreamsMicroserviceTransport {
29
29
  messageGroupLeaseRegistered = false;
30
30
  ownsMessageGroup = false;
31
31
  pending = new Map();
32
+ pendingReclaimFailureGroups = new Set();
33
+ pendingReclaimStartIds = new Map();
32
34
  pollPromises = [];
33
35
  namespace;
34
36
  consumerGroup;
37
+ pendingReclaimIdleMs;
35
38
  requestTimeoutMs;
36
39
  pollBlockMs;
37
40
  messageRetentionMaxLen;
@@ -48,6 +51,7 @@ export class RedisStreamsMicroserviceTransport {
48
51
  this.consumerId = crypto.randomUUID();
49
52
  this.namespace = options.namespace ?? 'fluo:streams';
50
53
  this.consumerGroup = options.consumerGroup ?? 'fluo-handlers';
54
+ this.pendingReclaimIdleMs = options.pendingReclaimIdleMs ?? 60_000;
51
55
  this.requestTimeoutMs = options.requestTimeoutMs ?? 3_000;
52
56
  this.pollBlockMs = options.pollBlockMs ?? 500;
53
57
  this.messageRetentionMaxLen = options.messageRetentionMaxLen;
@@ -216,12 +220,22 @@ export class RedisStreamsMicroserviceTransport {
216
220
  this.closing = true;
217
221
  this.closePromise = (async () => {
218
222
  let closeError;
223
+ let listenError;
219
224
  if (this.listenPromise) {
220
- await this.listenPromise;
225
+ try {
226
+ await this.listenPromise;
227
+ } catch (error) {
228
+ listenError = error;
229
+ }
221
230
  }
222
231
  try {
223
232
  const settled = await Promise.allSettled(this.pollPromises);
224
- const shouldDestroyMessageGroup = await this.releaseMessageGroupLease();
233
+ let shouldDestroyMessageGroup = false;
234
+ try {
235
+ shouldDestroyMessageGroup = await this.releaseMessageGroupLease();
236
+ } catch (error) {
237
+ closeError ??= error;
238
+ }
225
239
  for (const result of settled) {
226
240
  if (result.status === 'rejected') {
227
241
  closeError ??= result.reason;
@@ -254,11 +268,16 @@ export class RedisStreamsMicroserviceTransport {
254
268
  this.handler = undefined;
255
269
  this.messageGroupLeaseRegistered = false;
256
270
  this.ownsMessageGroup = false;
271
+ this.pendingReclaimFailureGroups.clear();
272
+ this.pendingReclaimStartIds.clear();
257
273
  this.pollPromises = [];
258
274
  for (const pending of [...this.pending.values()]) {
259
275
  pending.reject(new Error('Redis Streams microservice transport closed before response.'));
260
276
  }
261
277
  }
278
+ if (listenError) {
279
+ throw listenError;
280
+ }
262
281
  if (closeError) {
263
282
  throw closeError;
264
283
  }
@@ -329,7 +348,8 @@ export class RedisStreamsMicroserviceTransport {
329
348
  async pollStream(stream, group) {
330
349
  while (!this.closing) {
331
350
  try {
332
- const entries = await this.options.readerClient.xreadgroup(group, this.consumerId, [stream], {
351
+ const reclaimedEntries = await this.reclaimPendingEntries(stream, group);
352
+ const entries = reclaimedEntries.length > 0 ? reclaimedEntries : await this.options.readerClient.xreadgroup(group, this.consumerId, [stream], {
333
353
  blockMs: this.pollBlockMs,
334
354
  count: 10
335
355
  });
@@ -356,6 +376,29 @@ export class RedisStreamsMicroserviceTransport {
356
376
  }
357
377
  }
358
378
  }
379
+ async reclaimPendingEntries(stream, group) {
380
+ const {
381
+ readerClient
382
+ } = this.options;
383
+ if (stream === this.responseStream || this.pendingReclaimIdleMs <= 0 || !readerClient.xautoclaim) {
384
+ return [];
385
+ }
386
+ const groupKey = `${stream}::${group}`;
387
+ try {
388
+ const result = await readerClient.xautoclaim(stream, group, this.consumerId, this.pendingReclaimIdleMs, this.pendingReclaimStartIds.get(groupKey) ?? '0-0', {
389
+ count: 10
390
+ });
391
+ this.pendingReclaimFailureGroups.delete(groupKey);
392
+ this.pendingReclaimStartIds.set(groupKey, result.nextStartId);
393
+ return result.entries;
394
+ } catch (error) {
395
+ if (!this.pendingReclaimFailureGroups.has(groupKey)) {
396
+ this.logger?.error('Redis Streams pending reclaim failed; continuing normal consumption.', error, 'RedisStreamsMicroserviceTransport');
397
+ this.pendingReclaimFailureGroups.add(groupKey);
398
+ }
399
+ return [];
400
+ }
401
+ }
359
402
  async handleStreamEntry(stream, message) {
360
403
  if (stream === this.messageStream) {
361
404
  await this.handleInboundRequest(message);
@@ -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":"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,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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "grpc",
14
14
  "mqtt"
15
15
  ],
16
- "version": "1.0.4",
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.0.3",
72
- "@fluojs/di": "^1.1.0",
73
- "@fluojs/runtime": "^1.1.8"
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",