@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.
- package/README.ko.md +64 -6
- package/README.md +64 -6
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +2 -1
- package/dist/service.d.ts +15 -5
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +96 -38
- package/dist/status.d.ts +3 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +10 -2
- package/dist/transports/grpc-transport.d.ts +4 -2
- package/dist/transports/grpc-transport.d.ts.map +1 -1
- package/dist/transports/grpc-transport.js +241 -241
- package/dist/transports/kafka-transport.d.ts +9 -1
- package/dist/transports/kafka-transport.d.ts.map +1 -1
- package/dist/transports/kafka-transport.js +41 -21
- package/dist/transports/mqtt-transport.d.ts +1 -0
- package/dist/transports/mqtt-transport.d.ts.map +1 -1
- package/dist/transports/mqtt-transport.js +22 -1
- package/dist/transports/nats-transport.d.ts +3 -0
- package/dist/transports/nats-transport.d.ts.map +1 -1
- package/dist/transports/nats-transport.js +83 -30
- package/dist/transports/rabbitmq-transport.d.ts +10 -1
- package/dist/transports/rabbitmq-transport.d.ts.map +1 -1
- package/dist/transports/rabbitmq-transport.js +80 -30
- package/dist/transports/redis-streams-transport.d.ts +18 -0
- package/dist/transports/redis-streams-transport.d.ts.map +1 -1
- package/dist/transports/redis-streams-transport.js +46 -3
- package/dist/transports/redis-transport.d.ts +1 -1
- package/dist/transports/redis-transport.d.ts.map +1 -1
- package/dist/transports/redis-transport.js +32 -16
- package/dist/transports/tcp-transport.d.ts +1 -0
- package/dist/transports/tcp-transport.d.ts.map +1 -1
- package/dist/transports/tcp-transport.js +45 -44
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -7
|
@@ -16,8 +16,10 @@ const grpcKinds = {
|
|
|
16
16
|
* and exposes matching unary/server-stream/client-stream/bidi-stream client calls through one transport surface.
|
|
17
17
|
*/
|
|
18
18
|
export class GrpcMicroserviceTransport {
|
|
19
|
-
/** Indicates
|
|
20
|
-
ownsResources;
|
|
19
|
+
/** Indicates that gRPC closes the cached outbound clients it creates. */
|
|
20
|
+
ownsResources = true;
|
|
21
|
+
/** Reports server and cached outbound client ownership independently. */
|
|
22
|
+
resourceOwnership;
|
|
21
23
|
bidiStreamHandler;
|
|
22
24
|
clientStreamHandler;
|
|
23
25
|
closePromise;
|
|
@@ -46,7 +48,10 @@ export class GrpcMicroserviceTransport {
|
|
|
46
48
|
this.requestTimeoutMs = options.requestTimeoutMs ?? 3_000;
|
|
47
49
|
this.server = options.server;
|
|
48
50
|
this.ownsServer = !options.server;
|
|
49
|
-
this.
|
|
51
|
+
this.resourceOwnership = {
|
|
52
|
+
outboundClients: 'framework',
|
|
53
|
+
server: this.ownsServer ? 'framework' : 'caller'
|
|
54
|
+
};
|
|
50
55
|
}
|
|
51
56
|
setLogger(logger) {
|
|
52
57
|
this.logger = logger;
|
|
@@ -536,124 +541,11 @@ export class GrpcMicroserviceTransport {
|
|
|
536
541
|
throw new Error(`GrpcMicroserviceTransport could not resolve server-streaming method "${parsedPattern.serviceName}.${parsedPattern.methodName}".`);
|
|
537
542
|
}
|
|
538
543
|
const metadata = this.createMetadata(grpcKinds.message);
|
|
539
|
-
const
|
|
540
|
-
return {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
let error;
|
|
545
|
-
let waiting;
|
|
546
|
-
let stream;
|
|
547
|
-
let removeAbortListener;
|
|
548
|
-
const cleanupAbortListener = () => {
|
|
549
|
-
removeAbortListener?.();
|
|
550
|
-
removeAbortListener = undefined;
|
|
551
|
-
};
|
|
552
|
-
const finish = () => {
|
|
553
|
-
done = true;
|
|
554
|
-
cleanupAbortListener();
|
|
555
|
-
};
|
|
556
|
-
const startStream = () => {
|
|
557
|
-
if (stream) {
|
|
558
|
-
return;
|
|
559
|
-
}
|
|
560
|
-
stream = method.call(runtime.client, payload, metadata);
|
|
561
|
-
stream.on('data', data => {
|
|
562
|
-
if (waiting) {
|
|
563
|
-
const w = waiting;
|
|
564
|
-
waiting = undefined;
|
|
565
|
-
w.resolve({
|
|
566
|
-
value: data,
|
|
567
|
-
done: false
|
|
568
|
-
});
|
|
569
|
-
} else {
|
|
570
|
-
buffer.push(data);
|
|
571
|
-
}
|
|
572
|
-
});
|
|
573
|
-
stream.on('end', () => {
|
|
574
|
-
finish();
|
|
575
|
-
if (waiting) {
|
|
576
|
-
const w = waiting;
|
|
577
|
-
waiting = undefined;
|
|
578
|
-
w.resolve({
|
|
579
|
-
value: undefined,
|
|
580
|
-
done: true
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
});
|
|
584
|
-
stream.on('error', err => {
|
|
585
|
-
finish();
|
|
586
|
-
if (signal?.aborted) {
|
|
587
|
-
error = new Error('gRPC server stream aborted.');
|
|
588
|
-
} else {
|
|
589
|
-
error = err instanceof Error ? err : new Error('gRPC server stream error.');
|
|
590
|
-
}
|
|
591
|
-
if (waiting) {
|
|
592
|
-
const w = waiting;
|
|
593
|
-
waiting = undefined;
|
|
594
|
-
w.reject(error);
|
|
595
|
-
}
|
|
596
|
-
});
|
|
597
|
-
if (signal) {
|
|
598
|
-
if (signal.aborted) {
|
|
599
|
-
finish();
|
|
600
|
-
error = new Error('gRPC server stream aborted.');
|
|
601
|
-
stream.cancel?.();
|
|
602
|
-
return;
|
|
603
|
-
}
|
|
604
|
-
const onAbort = () => {
|
|
605
|
-
finish();
|
|
606
|
-
error = new Error('gRPC server stream aborted.');
|
|
607
|
-
stream?.cancel?.();
|
|
608
|
-
if (waiting) {
|
|
609
|
-
const w = waiting;
|
|
610
|
-
waiting = undefined;
|
|
611
|
-
w.reject(error);
|
|
612
|
-
}
|
|
613
|
-
};
|
|
614
|
-
signal.addEventListener('abort', onAbort, {
|
|
615
|
-
once: true
|
|
616
|
-
});
|
|
617
|
-
removeAbortListener = () => signal.removeEventListener('abort', onAbort);
|
|
618
|
-
}
|
|
619
|
-
};
|
|
620
|
-
void transport;
|
|
621
|
-
return {
|
|
622
|
-
next() {
|
|
623
|
-
startStream();
|
|
624
|
-
if (buffer.length > 0) {
|
|
625
|
-
return Promise.resolve({
|
|
626
|
-
value: buffer.shift(),
|
|
627
|
-
done: false
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
if (error) {
|
|
631
|
-
return Promise.reject(error);
|
|
632
|
-
}
|
|
633
|
-
if (done) {
|
|
634
|
-
return Promise.resolve({
|
|
635
|
-
value: undefined,
|
|
636
|
-
done: true
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
return new Promise((resolve, reject) => {
|
|
640
|
-
waiting = {
|
|
641
|
-
resolve,
|
|
642
|
-
reject
|
|
643
|
-
};
|
|
644
|
-
});
|
|
645
|
-
},
|
|
646
|
-
return() {
|
|
647
|
-
finish();
|
|
648
|
-
stream?.cancel?.();
|
|
649
|
-
return Promise.resolve({
|
|
650
|
-
value: undefined,
|
|
651
|
-
done: true
|
|
652
|
-
});
|
|
653
|
-
}
|
|
654
|
-
};
|
|
655
|
-
}
|
|
656
|
-
};
|
|
544
|
+
const stream = method.call(runtime.client, payload, metadata);
|
|
545
|
+
return grpcReadableToAsyncIterable(stream, {
|
|
546
|
+
abortErrorMessage: 'gRPC server stream aborted.',
|
|
547
|
+
signal
|
|
548
|
+
});
|
|
657
549
|
}
|
|
658
550
|
callClientStream(parsedPattern, signal) {
|
|
659
551
|
const runtime = this.getServiceRuntime(parsedPattern.serviceName);
|
|
@@ -665,40 +557,63 @@ export class GrpcMicroserviceTransport {
|
|
|
665
557
|
let callStream;
|
|
666
558
|
let ended = false;
|
|
667
559
|
let cleanupAbortListener;
|
|
560
|
+
let settled = false;
|
|
561
|
+
let writerError;
|
|
562
|
+
let rejectResult;
|
|
668
563
|
const cleanup = () => {
|
|
669
564
|
cleanupAbortListener?.();
|
|
670
565
|
cleanupAbortListener = undefined;
|
|
671
566
|
};
|
|
672
567
|
const result = new Promise((resolve, reject) => {
|
|
673
568
|
if (signal?.aborted) {
|
|
569
|
+
settled = true;
|
|
674
570
|
reject(new Error('gRPC client stream aborted before dispatch.'));
|
|
675
571
|
return;
|
|
676
572
|
}
|
|
677
|
-
|
|
573
|
+
rejectResult = reject;
|
|
574
|
+
const settle = complete => {
|
|
575
|
+
if (settled) {
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
settled = true;
|
|
678
579
|
cleanup();
|
|
580
|
+
complete();
|
|
581
|
+
};
|
|
582
|
+
callStream = method.call(runtime.client, metadata, (error, response) => {
|
|
583
|
+
// A local writer.error() failure is the authoritative cause: the transport-level
|
|
584
|
+
// status that follows an aborted call would otherwise mask it.
|
|
585
|
+
if (writerError) {
|
|
586
|
+
settle(() => reject(writerError));
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
679
589
|
if (error) {
|
|
680
590
|
if (signal?.aborted) {
|
|
681
|
-
reject(new Error('gRPC client stream aborted.'));
|
|
591
|
+
settle(() => reject(new Error('gRPC client stream aborted.')));
|
|
682
592
|
return;
|
|
683
593
|
}
|
|
684
594
|
const message = typeof error.message === 'string' && error.message.length > 0 ? error.message : 'Unhandled gRPC client stream error';
|
|
685
|
-
reject(new Error(message));
|
|
595
|
+
settle(() => reject(new Error(message)));
|
|
686
596
|
return;
|
|
687
597
|
}
|
|
688
|
-
resolve(response);
|
|
598
|
+
settle(() => resolve(response));
|
|
689
599
|
});
|
|
690
|
-
if (signal) {
|
|
600
|
+
if (signal && !settled) {
|
|
691
601
|
const onAbort = () => {
|
|
692
|
-
|
|
693
|
-
ended
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
602
|
+
settle(() => {
|
|
603
|
+
if (!ended) {
|
|
604
|
+
ended = true;
|
|
605
|
+
callStream?.end();
|
|
606
|
+
}
|
|
607
|
+
reject(new Error('gRPC client stream aborted.'));
|
|
608
|
+
});
|
|
697
609
|
};
|
|
698
610
|
signal.addEventListener('abort', onAbort, {
|
|
699
611
|
once: true
|
|
700
612
|
});
|
|
701
613
|
cleanupAbortListener = () => signal.removeEventListener('abort', onAbort);
|
|
614
|
+
if (signal.aborted) {
|
|
615
|
+
onAbort();
|
|
616
|
+
}
|
|
702
617
|
}
|
|
703
618
|
});
|
|
704
619
|
const writer = {
|
|
@@ -714,10 +629,19 @@ export class GrpcMicroserviceTransport {
|
|
|
714
629
|
}
|
|
715
630
|
},
|
|
716
631
|
error(err) {
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
632
|
+
if (ended) {
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
ended = true;
|
|
636
|
+
writerError = err;
|
|
637
|
+
abortClientStreamCall(callStream, err);
|
|
638
|
+
|
|
639
|
+
// Runtimes without cancel()/destroy() cannot abort the call, so settle locally
|
|
640
|
+
// instead of leaving the caller with a silently successful stream.
|
|
641
|
+
if (!settled) {
|
|
642
|
+
settled = true;
|
|
643
|
+
cleanup();
|
|
644
|
+
rejectResult?.(err);
|
|
721
645
|
}
|
|
722
646
|
}
|
|
723
647
|
};
|
|
@@ -736,6 +660,9 @@ export class GrpcMicroserviceTransport {
|
|
|
736
660
|
const duplexStream = method.call(runtime.client, metadata);
|
|
737
661
|
let writerEnded = false;
|
|
738
662
|
let cleanupAbortListener;
|
|
663
|
+
const localFailure = {
|
|
664
|
+
error: undefined
|
|
665
|
+
};
|
|
739
666
|
if (signal) {
|
|
740
667
|
if (signal.aborted) {
|
|
741
668
|
duplexStream.cancel?.();
|
|
@@ -753,7 +680,11 @@ export class GrpcMicroserviceTransport {
|
|
|
753
680
|
cleanupAbortListener = () => signal.removeEventListener('abort', onAbort);
|
|
754
681
|
}
|
|
755
682
|
}
|
|
756
|
-
const reader = grpcReadableToAsyncIterable(duplexStream,
|
|
683
|
+
const reader = grpcReadableToAsyncIterable(duplexStream, {
|
|
684
|
+
externalAbortCleanup: cleanupAbortListener,
|
|
685
|
+
localFailure,
|
|
686
|
+
signal
|
|
687
|
+
});
|
|
757
688
|
const writer = {
|
|
758
689
|
write(data) {
|
|
759
690
|
if (!writerEnded) {
|
|
@@ -767,11 +698,14 @@ export class GrpcMicroserviceTransport {
|
|
|
767
698
|
}
|
|
768
699
|
},
|
|
769
700
|
error(err) {
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
writerEnded = true;
|
|
773
|
-
duplexStream.end();
|
|
701
|
+
if (writerEnded) {
|
|
702
|
+
return;
|
|
774
703
|
}
|
|
704
|
+
writerEnded = true;
|
|
705
|
+
// Recorded before cancelation so the reader reports the caller's cause rather than
|
|
706
|
+
// the CANCELLED status the aborted call raises.
|
|
707
|
+
localFailure.error = err;
|
|
708
|
+
abortDuplexStreamCall(duplexStream, err);
|
|
775
709
|
}
|
|
776
710
|
};
|
|
777
711
|
return {
|
|
@@ -963,117 +897,183 @@ export class GrpcMicroserviceTransport {
|
|
|
963
897
|
logTransportEventHandlerFailure(this.logger, 'GrpcMicroserviceTransport', error);
|
|
964
898
|
}
|
|
965
899
|
}
|
|
966
|
-
function grpcReadableToAsyncIterable(stream,
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
900
|
+
function grpcReadableToAsyncIterable(stream, options = {}) {
|
|
901
|
+
const {
|
|
902
|
+
signal
|
|
903
|
+
} = options;
|
|
904
|
+
const abortErrorMessage = options.abortErrorMessage ?? 'gRPC stream aborted.';
|
|
905
|
+
const buffer = [];
|
|
906
|
+
let cleanupExternalAbortListener = options.externalAbortCleanup;
|
|
907
|
+
let done = false;
|
|
908
|
+
let error;
|
|
909
|
+
let waiting;
|
|
910
|
+
let removeAbortListener;
|
|
911
|
+
const cleanupAbortListeners = () => {
|
|
912
|
+
const cleanupLocal = removeAbortListener;
|
|
913
|
+
const cleanupExternal = cleanupExternalAbortListener;
|
|
914
|
+
removeAbortListener = undefined;
|
|
915
|
+
cleanupExternalAbortListener = undefined;
|
|
916
|
+
cleanupLocal?.();
|
|
917
|
+
cleanupExternal?.();
|
|
918
|
+
};
|
|
919
|
+
const finish = () => {
|
|
920
|
+
if (done) {
|
|
921
|
+
return false;
|
|
922
|
+
}
|
|
923
|
+
done = true;
|
|
924
|
+
cleanupAbortListeners();
|
|
925
|
+
return true;
|
|
926
|
+
};
|
|
927
|
+
if (signal) {
|
|
928
|
+
if (signal.aborted) {
|
|
929
|
+
error = new Error(abortErrorMessage);
|
|
930
|
+
finish();
|
|
931
|
+
stream.cancel?.();
|
|
932
|
+
} else {
|
|
933
|
+
const onAbort = () => {
|
|
934
|
+
const abortError = new Error(abortErrorMessage);
|
|
935
|
+
if (!finish()) {
|
|
936
|
+
return;
|
|
993
937
|
}
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
finish();
|
|
938
|
+
error = abortError;
|
|
939
|
+
stream.cancel?.();
|
|
997
940
|
if (waiting) {
|
|
998
|
-
const
|
|
941
|
+
const current = waiting;
|
|
999
942
|
waiting = undefined;
|
|
1000
|
-
|
|
1001
|
-
value: undefined,
|
|
1002
|
-
done: true
|
|
1003
|
-
});
|
|
943
|
+
current.reject(abortError);
|
|
1004
944
|
}
|
|
945
|
+
};
|
|
946
|
+
signal.addEventListener('abort', onAbort, {
|
|
947
|
+
once: true
|
|
1005
948
|
});
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
949
|
+
removeAbortListener = () => signal.removeEventListener('abort', onAbort);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
stream.on('data', data => {
|
|
953
|
+
if (done) {
|
|
954
|
+
return;
|
|
955
|
+
}
|
|
956
|
+
if (waiting) {
|
|
957
|
+
const current = waiting;
|
|
958
|
+
waiting = undefined;
|
|
959
|
+
current.resolve({
|
|
960
|
+
value: data,
|
|
961
|
+
done: false
|
|
1018
962
|
});
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
963
|
+
} else {
|
|
964
|
+
buffer.push(data);
|
|
965
|
+
}
|
|
966
|
+
});
|
|
967
|
+
stream.on('end', () => {
|
|
968
|
+
if (!finish()) {
|
|
969
|
+
return;
|
|
970
|
+
}
|
|
971
|
+
if (waiting) {
|
|
972
|
+
const current = waiting;
|
|
973
|
+
waiting = undefined;
|
|
974
|
+
current.resolve({
|
|
975
|
+
value: undefined,
|
|
976
|
+
done: true
|
|
977
|
+
});
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
stream.on('error', err => {
|
|
981
|
+
const streamError = options.localFailure?.error ?? (signal?.aborted ? new Error(abortErrorMessage) : err);
|
|
982
|
+
if (!finish()) {
|
|
983
|
+
return;
|
|
984
|
+
}
|
|
985
|
+
error = streamError;
|
|
986
|
+
if (waiting) {
|
|
987
|
+
const current = waiting;
|
|
988
|
+
waiting = undefined;
|
|
989
|
+
current.reject(streamError);
|
|
990
|
+
}
|
|
991
|
+
});
|
|
992
|
+
const iterator = {
|
|
993
|
+
next() {
|
|
994
|
+
if (buffer.length > 0) {
|
|
995
|
+
return Promise.resolve({
|
|
996
|
+
value: buffer.shift(),
|
|
997
|
+
done: false
|
|
998
|
+
});
|
|
1040
999
|
}
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1000
|
+
if (error) {
|
|
1001
|
+
return Promise.reject(error);
|
|
1002
|
+
}
|
|
1003
|
+
if (done) {
|
|
1004
|
+
return Promise.resolve({
|
|
1005
|
+
value: undefined,
|
|
1006
|
+
done: true
|
|
1007
|
+
});
|
|
1008
|
+
}
|
|
1009
|
+
return new Promise((resolve, reject) => {
|
|
1010
|
+
waiting = {
|
|
1011
|
+
resolve,
|
|
1012
|
+
reject
|
|
1013
|
+
};
|
|
1014
|
+
});
|
|
1015
|
+
},
|
|
1016
|
+
return() {
|
|
1017
|
+
const shouldCancel = finish();
|
|
1018
|
+
buffer.length = 0;
|
|
1019
|
+
if (waiting) {
|
|
1020
|
+
const current = waiting;
|
|
1021
|
+
waiting = undefined;
|
|
1022
|
+
current.resolve({
|
|
1023
|
+
value: undefined,
|
|
1024
|
+
done: true
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
if (shouldCancel) {
|
|
1028
|
+
stream.cancel?.();
|
|
1029
|
+
}
|
|
1030
|
+
return Promise.resolve({
|
|
1031
|
+
value: undefined,
|
|
1032
|
+
done: true
|
|
1033
|
+
});
|
|
1034
|
+
}
|
|
1035
|
+
};
|
|
1036
|
+
return {
|
|
1037
|
+
[Symbol.asyncIterator]() {
|
|
1038
|
+
return iterator;
|
|
1074
1039
|
}
|
|
1075
1040
|
};
|
|
1076
1041
|
}
|
|
1042
|
+
|
|
1043
|
+
/**
|
|
1044
|
+
* Aborts an outbound client-streaming call so the peer observes a failure instead of a clean EOF.
|
|
1045
|
+
*
|
|
1046
|
+
* `destroy(err)` is preferred because it carries the cause; `cancel()` is the grpc-js fallback.
|
|
1047
|
+
*/
|
|
1048
|
+
function abortClientStreamCall(stream, err) {
|
|
1049
|
+
if (!stream) {
|
|
1050
|
+
return;
|
|
1051
|
+
}
|
|
1052
|
+
if (stream.destroy) {
|
|
1053
|
+
stream.destroy(err);
|
|
1054
|
+
return;
|
|
1055
|
+
}
|
|
1056
|
+
if (stream.cancel) {
|
|
1057
|
+
stream.cancel();
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1060
|
+
stream.end();
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
/**
|
|
1064
|
+
* Aborts an outbound bidirectional-streaming call so the peer observes a failure instead of a clean EOF.
|
|
1065
|
+
*/
|
|
1066
|
+
function abortDuplexStreamCall(stream, err) {
|
|
1067
|
+
if (stream.destroy) {
|
|
1068
|
+
stream.destroy(err);
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
if (stream.cancel) {
|
|
1072
|
+
stream.cancel();
|
|
1073
|
+
return;
|
|
1074
|
+
}
|
|
1075
|
+
stream.end();
|
|
1076
|
+
}
|
|
1077
1077
|
function parseGrpcPattern(pattern) {
|
|
1078
1078
|
const segments = pattern.split('.');
|
|
1079
1079
|
if (segments.length !== 2 || segments[0]?.length === 0 || segments[1]?.length === 0) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MicroserviceTransport, TransportHandler } from '../types.js';
|
|
1
|
+
import type { MicroserviceTransport, MicroserviceTransportLogger, TransportHandler } from '../types.js';
|
|
2
2
|
interface KafkaConsumerLike {
|
|
3
3
|
subscribe(topic: string, handler: (message: string) => Promise<void> | void): Promise<void>;
|
|
4
4
|
unsubscribe(topic: string): Promise<void>;
|
|
@@ -28,11 +28,19 @@ export declare class KafkaMicroserviceTransport implements MicroserviceTransport
|
|
|
28
28
|
private handler;
|
|
29
29
|
private listening;
|
|
30
30
|
private listenPromise;
|
|
31
|
+
private logger;
|
|
31
32
|
private readonly eventTopic;
|
|
32
33
|
private readonly messageTopic;
|
|
33
34
|
private readonly pending;
|
|
34
35
|
private readonly requestTimeoutMs;
|
|
35
36
|
private readonly responseTopic;
|
|
37
|
+
private logEventHandlerFailure;
|
|
38
|
+
/**
|
|
39
|
+
* Registers the runtime logger that receives inbound event handler failures.
|
|
40
|
+
*
|
|
41
|
+
* @param logger Logger used to report event handler failures.
|
|
42
|
+
*/
|
|
43
|
+
setLogger(logger: MicroserviceTransportLogger): void;
|
|
36
44
|
/**
|
|
37
45
|
* Creates a Kafka transport with explicit producer and consumer collaborators.
|
|
38
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kafka-transport.d.ts","sourceRoot":"","sources":["../../src/transports/kafka-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"kafka-transport.d.ts","sourceRoot":"","sources":["../../src/transports/kafka-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGxG,UAAU,iBAAiB;IACzB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,UAAU,iBAAiB;IACzB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAgBD,gEAAgE;AAChE,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,0BAA2B,YAAW,qBAAqB;IAmC1D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlCpC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,sBAAsB;IAQ9B;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,2BAA2B,GAAG,IAAI;IAIpD;;;;OAIG;gBAC0B,OAAO,EAAE,iCAAiC;IAOvE;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDtD;;;;;;;OAOG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAsFrF;;;;;;OAMG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6Cd,kBAAkB;YAuBlB,oBAAoB;YA2CpB,qBAAqB;IAqBnC,OAAO,CAAC,YAAY;CAqCrB"}
|