@ebarahona/loopback-transport-core 1.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/LICENSE +21 -0
- package/README.md +297 -0
- package/dist/client/client-proxy.d.ts +147 -0
- package/dist/client/client-proxy.js +225 -0
- package/dist/client/client-proxy.js.map +1 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/context/execution-context.d.ts +102 -0
- package/dist/context/execution-context.js +110 -0
- package/dist/context/execution-context.js.map +1 -0
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.js +18 -0
- package/dist/context/index.js.map +1 -0
- package/dist/decorators/constants.d.ts +41 -0
- package/dist/decorators/constants.js +13 -0
- package/dist/decorators/constants.js.map +1 -0
- package/dist/decorators/event-handler.decorator.d.ts +28 -0
- package/dist/decorators/event-handler.decorator.js +42 -0
- package/dist/decorators/event-handler.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.js +21 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/message-handler.decorator.d.ts +26 -0
- package/dist/decorators/message-handler.decorator.js +40 -0
- package/dist/decorators/message-handler.decorator.js.map +1 -0
- package/dist/decorators/payload.decorator.d.ts +30 -0
- package/dist/decorators/payload.decorator.js +42 -0
- package/dist/decorators/payload.decorator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/index.d.ts +4 -0
- package/dist/interfaces/index.js +21 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/message-handler.interface.d.ts +21 -0
- package/dist/interfaces/message-handler.interface.js +3 -0
- package/dist/interfaces/message-handler.interface.js.map +1 -0
- package/dist/interfaces/packet.interface.d.ts +42 -0
- package/dist/interfaces/packet.interface.js +3 -0
- package/dist/interfaces/packet.interface.js.map +1 -0
- package/dist/interfaces/transport-client.interface.d.ts +41 -0
- package/dist/interfaces/transport-client.interface.js +3 -0
- package/dist/interfaces/transport-client.interface.js.map +1 -0
- package/dist/interfaces/transport-server.interface.d.ts +44 -0
- package/dist/interfaces/transport-server.interface.js +3 -0
- package/dist/interfaces/transport-server.interface.js.map +1 -0
- package/dist/keys.d.ts +88 -0
- package/dist/keys.js +123 -0
- package/dist/keys.js.map +1 -0
- package/dist/registry/handler-registry.d.ts +77 -0
- package/dist/registry/handler-registry.js +265 -0
- package/dist/registry/handler-registry.js.map +1 -0
- package/dist/registry/index.d.ts +1 -0
- package/dist/registry/index.js +18 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/serializers/index.d.ts +1 -0
- package/dist/serializers/index.js +18 -0
- package/dist/serializers/index.js.map +1 -0
- package/dist/serializers/serializer.interface.d.ts +62 -0
- package/dist/serializers/serializer.interface.js +52 -0
- package/dist/serializers/serializer.interface.js.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +18 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/server-base.d.ts +154 -0
- package/dist/server/server-base.js +287 -0
- package/dist/server/server-base.js.map +1 -0
- package/dist/transport-booter.d.ts +31 -0
- package/dist/transport-booter.js +117 -0
- package/dist/transport-booter.js.map +1 -0
- package/dist/transport.component.d.ts +26 -0
- package/dist/transport.component.js +42 -0
- package/dist/transport.component.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/normalize-pattern.d.ts +18 -0
- package/dist/utils/normalize-pattern.js +75 -0
- package/dist/utils/normalize-pattern.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,YAAY;AACZ,6DAAyD;AAAjD,yHAAA,kBAAkB,OAAA;AAE1B,SAAS;AACT,uDAAmD;AAA3C,mHAAA,eAAe,OAAA;AAEvB,wBAAwB;AACxB,+BAIgB;AAHd,yGAAA,iBAAiB,OAAA;AACjB,4GAAA,oBAAoB,OAAA;AACpB,0GAAA,kBAAkB,OAAA;AAGpB,WAAW;AACX,uCAA2C;AAAnC,2GAAA,eAAe,OAAA;AAkBvB,UAAU;AACV,qCAMmB;AALjB,2GAAA,gBAAgB,OAAA;AAOlB,aAAa;AACb,2CAUsB;AATpB,4GAAA,cAAc,OAAA;AACd,0GAAA,YAAY,OAAA;AACZ,qGAAA,OAAO,OAAA;AACP,0GAAA,YAAY,OAAA;AAIZ,sHAAA,wBAAwB,OAAA;AACxB,oHAAA,sBAAsB,OAAA;AAGxB,QAAQ;AACR,iCAAyC;AAAjC,yGAAA,gBAAgB,OAAA;AAExB,SAAS;AACT,mCAAqC;AAA7B,qGAAA,WAAW,OAAA;AAEnB,SAAS;AACT,mCAAmD;AAA3C,oGAAA,UAAU,OAAA;AAElB,cAAc;AACd,6CAMuB;AAHrB,6GAAA,cAAc,OAAA;AACd,+GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./packet.interface"), exports);
|
|
18
|
+
__exportStar(require("./transport-server.interface"), exports);
|
|
19
|
+
__exportStar(require("./transport-client.interface"), exports);
|
|
20
|
+
__exportStar(require("./message-handler.interface"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,+DAA6C;AAC7C,+DAA6C;AAC7C,8DAA4C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
/**
|
|
3
|
+
* Function that handles an incoming message.
|
|
4
|
+
*/
|
|
5
|
+
export interface MessageHandler<TInput = unknown, TContext = unknown, TResult = unknown> {
|
|
6
|
+
(data: TInput, ctx?: TContext): Promise<TResult> | Promise<Observable<TResult>> | TResult | Observable<TResult>;
|
|
7
|
+
/**
|
|
8
|
+
* True for @eventHandler, false for @messageHandler.
|
|
9
|
+
*/
|
|
10
|
+
isEventHandler?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Target transport name (e.g., 'kafka', 'rabbitmq').
|
|
13
|
+
* First-class property for routing, not buried in extras.
|
|
14
|
+
*/
|
|
15
|
+
transport?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Transport-specific metadata (e.g., QoS for MQTT, consumer group for Kafka).
|
|
18
|
+
* Does not contain framework routing metadata (use transport field instead).
|
|
19
|
+
*/
|
|
20
|
+
extras?: Readonly<Record<string, unknown>>;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-handler.interface.js","sourceRoot":"","sources":["../../src/interfaces/message-handler.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unique identifier for correlating request/response messages.
|
|
3
|
+
*/
|
|
4
|
+
export interface PacketId {
|
|
5
|
+
id: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Inbound message envelope. Used for both requests and events.
|
|
9
|
+
* Events omit the id field.
|
|
10
|
+
*/
|
|
11
|
+
export interface ReadPacket<T = unknown> {
|
|
12
|
+
pattern: string;
|
|
13
|
+
data: T;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Outbound response envelope. Sent back for request/response patterns.
|
|
17
|
+
*/
|
|
18
|
+
export interface WritePacket<T = unknown> {
|
|
19
|
+
err?: Error | string | Record<string, unknown>;
|
|
20
|
+
response?: T;
|
|
21
|
+
isDisposed?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A request with a correlation ID for response matching.
|
|
25
|
+
*/
|
|
26
|
+
export type OutgoingRequest = ReadPacket & PacketId;
|
|
27
|
+
/**
|
|
28
|
+
* An event with no correlation ID (fire-and-forget).
|
|
29
|
+
*/
|
|
30
|
+
export type OutgoingEvent = ReadPacket;
|
|
31
|
+
/**
|
|
32
|
+
* Server receives a request with correlation ID.
|
|
33
|
+
*/
|
|
34
|
+
export type IncomingRequest = ReadPacket & PacketId;
|
|
35
|
+
/**
|
|
36
|
+
* Server receives an event (no correlation).
|
|
37
|
+
*/
|
|
38
|
+
export type IncomingEvent = ReadPacket;
|
|
39
|
+
/**
|
|
40
|
+
* Response correlated to a request by ID.
|
|
41
|
+
*/
|
|
42
|
+
export type IncomingResponse = WritePacket & PacketId;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packet.interface.js","sourceRoot":"","sources":["../../src/interfaces/packet.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { TransportStatus } from './transport-server.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Interface that all transport clients must implement.
|
|
5
|
+
* Used for sending messages to brokers (producer side).
|
|
6
|
+
*/
|
|
7
|
+
export interface TransportClient {
|
|
8
|
+
/**
|
|
9
|
+
* Establish connection to the broker.
|
|
10
|
+
* Called lazily on first send/emit, or explicitly for eager connection.
|
|
11
|
+
*/
|
|
12
|
+
connect(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Close the connection.
|
|
15
|
+
*/
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Send a request and wait for a response (request/response pattern).
|
|
19
|
+
* Returns a cold Observable: the message is sent when subscribed.
|
|
20
|
+
*
|
|
21
|
+
* @param pattern - String or object pattern to match on the server side
|
|
22
|
+
* @param data - The message payload
|
|
23
|
+
*/
|
|
24
|
+
send<TResult = unknown, TInput = unknown>(pattern: string | Record<string, unknown>, data: TInput): Observable<TResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Emit an event with no response expected (fire-and-forget pattern).
|
|
27
|
+
* Returns a Promise that resolves when the event is dispatched.
|
|
28
|
+
*
|
|
29
|
+
* @param pattern - String or object event pattern
|
|
30
|
+
* @param data - The event payload
|
|
31
|
+
*/
|
|
32
|
+
emit<TInput = unknown>(pattern: string | Record<string, unknown>, data: TInput): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Observable stream of connection status changes.
|
|
35
|
+
*/
|
|
36
|
+
readonly status$: Observable<TransportStatus>;
|
|
37
|
+
/**
|
|
38
|
+
* Access the underlying native client (e.g., KafkaJS Producer).
|
|
39
|
+
*/
|
|
40
|
+
unwrap<T>(): T;
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-client.interface.js","sourceRoot":"","sources":["../../src/interfaces/transport-client.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { MessageHandler } from './message-handler.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Transport connection status.
|
|
5
|
+
*/
|
|
6
|
+
export type TransportStatus = 'connected' | 'disconnected' | 'reconnecting' | 'error';
|
|
7
|
+
/**
|
|
8
|
+
* Interface that all transport servers must implement.
|
|
9
|
+
* Each transport (Kafka, RabbitMQ, gRPC, MQTT, NATS) provides
|
|
10
|
+
* a concrete implementation.
|
|
11
|
+
*/
|
|
12
|
+
export interface TransportServer {
|
|
13
|
+
/**
|
|
14
|
+
* Start listening for messages.
|
|
15
|
+
*/
|
|
16
|
+
listen(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Stop listening and close connections.
|
|
19
|
+
*/
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Observable stream of connection status changes.
|
|
23
|
+
*/
|
|
24
|
+
readonly status$: Observable<TransportStatus>;
|
|
25
|
+
/**
|
|
26
|
+
* Access the underlying native client (e.g., KafkaJS Consumer).
|
|
27
|
+
*/
|
|
28
|
+
unwrap<T>(): T;
|
|
29
|
+
/**
|
|
30
|
+
* Register a message handler for a pattern.
|
|
31
|
+
*/
|
|
32
|
+
addHandler(pattern: string, handler: MessageHandler): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get all registered handlers. Returns a read-only view.
|
|
35
|
+
* Each pattern maps to an array of handlers (one for request/response,
|
|
36
|
+
* potentially many for event fan-out).
|
|
37
|
+
*/
|
|
38
|
+
getHandlers(): ReadonlyMap<string, readonly MessageHandler[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Remove all registered handlers.
|
|
41
|
+
* Called before rebinding on restart to prevent duplicate registration.
|
|
42
|
+
*/
|
|
43
|
+
clearHandlers(): void;
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-server.interface.js","sourceRoot":"","sources":["../../src/interfaces/transport-server.interface.ts"],"names":[],"mappings":""}
|
package/dist/keys.d.ts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Application, Binding, BindingKey, Constructor, Provider } from '@loopback/core';
|
|
2
|
+
import { TransportClient, TransportServer } from './interfaces';
|
|
3
|
+
import type { HandlerRegistry } from './registry';
|
|
4
|
+
/**
|
|
5
|
+
* Tag used to identify transport server bindings.
|
|
6
|
+
* Transport adapters should tag their server bindings with this value.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TRANSPORT_SERVER_TAG = "transport-server";
|
|
9
|
+
/**
|
|
10
|
+
* Tag key for the transport name on server bindings.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TRANSPORT_NAME_TAG = "transport";
|
|
13
|
+
export declare namespace TransportBindings {
|
|
14
|
+
/**
|
|
15
|
+
* Binding key for the handler registry.
|
|
16
|
+
*/
|
|
17
|
+
const HANDLER_REGISTRY: BindingKey<HandlerRegistry>;
|
|
18
|
+
/**
|
|
19
|
+
* Binding key for the current message payload.
|
|
20
|
+
* Set by the handler registry before invoking the handler.
|
|
21
|
+
*/
|
|
22
|
+
const CURRENT_PAYLOAD: BindingKey<unknown>;
|
|
23
|
+
/**
|
|
24
|
+
* Binding key for the current transport context.
|
|
25
|
+
* Set by the transport server before invoking the handler.
|
|
26
|
+
*/
|
|
27
|
+
const CURRENT_CONTEXT: BindingKey<unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* Binding key prefix for transport configurations.
|
|
30
|
+
*/
|
|
31
|
+
const CONFIG_PREFIX = "transport.config";
|
|
32
|
+
/**
|
|
33
|
+
* Binding key prefix for transport clients.
|
|
34
|
+
*/
|
|
35
|
+
const CLIENT_PREFIX = "transport.client";
|
|
36
|
+
/**
|
|
37
|
+
* Binding key prefix for transport servers.
|
|
38
|
+
*/
|
|
39
|
+
const SERVER_PREFIX = "transport.server";
|
|
40
|
+
/**
|
|
41
|
+
* Get a binding key for a specific transport's configuration.
|
|
42
|
+
*/
|
|
43
|
+
function config(transport: string): BindingKey<Record<string, unknown>>;
|
|
44
|
+
/**
|
|
45
|
+
* Get a binding key for a specific transport's client.
|
|
46
|
+
*/
|
|
47
|
+
function client(transport: string): BindingKey<TransportClient>;
|
|
48
|
+
/**
|
|
49
|
+
* Get a binding key for a specific transport's server.
|
|
50
|
+
*/
|
|
51
|
+
function server(transport: string): BindingKey<TransportServer>;
|
|
52
|
+
/**
|
|
53
|
+
* Register a concrete transport server instance.
|
|
54
|
+
*
|
|
55
|
+
* Use when the server is already constructed (e.g., in tests or
|
|
56
|
+
* when no DI is needed).
|
|
57
|
+
*
|
|
58
|
+
* @param app - The LoopBack application
|
|
59
|
+
* @param transport - Transport name (e.g., 'kafka', 'rabbitmq')
|
|
60
|
+
* @param instance - A concrete transport server instance
|
|
61
|
+
*/
|
|
62
|
+
function registerServer(app: Application, transport: string, instance: TransportServer): Binding<TransportServer>;
|
|
63
|
+
/**
|
|
64
|
+
* Register a transport server class with the IoC container.
|
|
65
|
+
*
|
|
66
|
+
* The class is instantiated by the container, enabling constructor
|
|
67
|
+
* injection of config, clients, health checks, and other dependencies.
|
|
68
|
+
* This is the recommended registration method for transport adapters.
|
|
69
|
+
*
|
|
70
|
+
* @param app - The LoopBack application
|
|
71
|
+
* @param transport - Transport name (e.g., 'kafka', 'rabbitmq')
|
|
72
|
+
* @param serverClass - A transport server class constructor
|
|
73
|
+
*/
|
|
74
|
+
function registerServerClass(app: Application, transport: string, serverClass: Constructor<TransportServer>): Binding<TransportServer>;
|
|
75
|
+
/**
|
|
76
|
+
* Register a transport server provider.
|
|
77
|
+
*
|
|
78
|
+
* Providers enable async factory patterns with full DI support.
|
|
79
|
+
* Use when server construction requires async initialization or
|
|
80
|
+
* complex setup logic. The binding is singleton-scoped so every
|
|
81
|
+
* resolution returns the same server instance.
|
|
82
|
+
*
|
|
83
|
+
* @param app - The LoopBack application
|
|
84
|
+
* @param transport - Transport name (e.g., 'kafka', 'rabbitmq')
|
|
85
|
+
* @param serverProvider - A provider class that produces a TransportServer
|
|
86
|
+
*/
|
|
87
|
+
function registerServerProvider(app: Application, transport: string, serverProvider: Constructor<Provider<TransportServer>>): Binding<TransportServer>;
|
|
88
|
+
}
|
package/dist/keys.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransportBindings = exports.TRANSPORT_NAME_TAG = exports.TRANSPORT_SERVER_TAG = void 0;
|
|
4
|
+
const core_1 = require("@loopback/core");
|
|
5
|
+
/**
|
|
6
|
+
* Tag used to identify transport server bindings.
|
|
7
|
+
* Transport adapters should tag their server bindings with this value.
|
|
8
|
+
*/
|
|
9
|
+
exports.TRANSPORT_SERVER_TAG = 'transport-server';
|
|
10
|
+
/**
|
|
11
|
+
* Tag key for the transport name on server bindings.
|
|
12
|
+
*/
|
|
13
|
+
exports.TRANSPORT_NAME_TAG = 'transport';
|
|
14
|
+
var TransportBindings;
|
|
15
|
+
(function (TransportBindings) {
|
|
16
|
+
/**
|
|
17
|
+
* Binding key for the handler registry.
|
|
18
|
+
*/
|
|
19
|
+
TransportBindings.HANDLER_REGISTRY = core_1.BindingKey.create('transport.handler-registry');
|
|
20
|
+
/**
|
|
21
|
+
* Binding key for the current message payload.
|
|
22
|
+
* Set by the handler registry before invoking the handler.
|
|
23
|
+
*/
|
|
24
|
+
TransportBindings.CURRENT_PAYLOAD = core_1.BindingKey.create('transport.current.payload');
|
|
25
|
+
/**
|
|
26
|
+
* Binding key for the current transport context.
|
|
27
|
+
* Set by the transport server before invoking the handler.
|
|
28
|
+
*/
|
|
29
|
+
TransportBindings.CURRENT_CONTEXT = core_1.BindingKey.create('transport.current.context');
|
|
30
|
+
/**
|
|
31
|
+
* Binding key prefix for transport configurations.
|
|
32
|
+
*/
|
|
33
|
+
TransportBindings.CONFIG_PREFIX = 'transport.config';
|
|
34
|
+
/**
|
|
35
|
+
* Binding key prefix for transport clients.
|
|
36
|
+
*/
|
|
37
|
+
TransportBindings.CLIENT_PREFIX = 'transport.client';
|
|
38
|
+
/**
|
|
39
|
+
* Binding key prefix for transport servers.
|
|
40
|
+
*/
|
|
41
|
+
TransportBindings.SERVER_PREFIX = 'transport.server';
|
|
42
|
+
/**
|
|
43
|
+
* Get a binding key for a specific transport's configuration.
|
|
44
|
+
*/
|
|
45
|
+
function config(transport) {
|
|
46
|
+
return core_1.BindingKey.create(`${TransportBindings.CONFIG_PREFIX}.${transport}`);
|
|
47
|
+
}
|
|
48
|
+
TransportBindings.config = config;
|
|
49
|
+
/**
|
|
50
|
+
* Get a binding key for a specific transport's client.
|
|
51
|
+
*/
|
|
52
|
+
function client(transport) {
|
|
53
|
+
return core_1.BindingKey.create(`${TransportBindings.CLIENT_PREFIX}.${transport}`);
|
|
54
|
+
}
|
|
55
|
+
TransportBindings.client = client;
|
|
56
|
+
/**
|
|
57
|
+
* Get a binding key for a specific transport's server.
|
|
58
|
+
*/
|
|
59
|
+
function server(transport) {
|
|
60
|
+
return core_1.BindingKey.create(`${TransportBindings.SERVER_PREFIX}.${transport}`);
|
|
61
|
+
}
|
|
62
|
+
TransportBindings.server = server;
|
|
63
|
+
/**
|
|
64
|
+
* Tag a transport server binding for booter discovery.
|
|
65
|
+
*/
|
|
66
|
+
function tagServerBinding(binding, transport) {
|
|
67
|
+
return binding
|
|
68
|
+
.tag(exports.TRANSPORT_SERVER_TAG)
|
|
69
|
+
.tag({ [exports.TRANSPORT_NAME_TAG]: transport });
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Register a concrete transport server instance.
|
|
73
|
+
*
|
|
74
|
+
* Use when the server is already constructed (e.g., in tests or
|
|
75
|
+
* when no DI is needed).
|
|
76
|
+
*
|
|
77
|
+
* @param app - The LoopBack application
|
|
78
|
+
* @param transport - Transport name (e.g., 'kafka', 'rabbitmq')
|
|
79
|
+
* @param instance - A concrete transport server instance
|
|
80
|
+
*/
|
|
81
|
+
function registerServer(app, transport, instance) {
|
|
82
|
+
return tagServerBinding(app.bind(server(transport)).to(instance), transport);
|
|
83
|
+
}
|
|
84
|
+
TransportBindings.registerServer = registerServer;
|
|
85
|
+
/**
|
|
86
|
+
* Register a transport server class with the IoC container.
|
|
87
|
+
*
|
|
88
|
+
* The class is instantiated by the container, enabling constructor
|
|
89
|
+
* injection of config, clients, health checks, and other dependencies.
|
|
90
|
+
* This is the recommended registration method for transport adapters.
|
|
91
|
+
*
|
|
92
|
+
* @param app - The LoopBack application
|
|
93
|
+
* @param transport - Transport name (e.g., 'kafka', 'rabbitmq')
|
|
94
|
+
* @param serverClass - A transport server class constructor
|
|
95
|
+
*/
|
|
96
|
+
function registerServerClass(app, transport, serverClass) {
|
|
97
|
+
return tagServerBinding(app
|
|
98
|
+
.bind(server(transport))
|
|
99
|
+
.toClass(serverClass)
|
|
100
|
+
.inScope(core_1.BindingScope.SINGLETON), transport);
|
|
101
|
+
}
|
|
102
|
+
TransportBindings.registerServerClass = registerServerClass;
|
|
103
|
+
/**
|
|
104
|
+
* Register a transport server provider.
|
|
105
|
+
*
|
|
106
|
+
* Providers enable async factory patterns with full DI support.
|
|
107
|
+
* Use when server construction requires async initialization or
|
|
108
|
+
* complex setup logic. The binding is singleton-scoped so every
|
|
109
|
+
* resolution returns the same server instance.
|
|
110
|
+
*
|
|
111
|
+
* @param app - The LoopBack application
|
|
112
|
+
* @param transport - Transport name (e.g., 'kafka', 'rabbitmq')
|
|
113
|
+
* @param serverProvider - A provider class that produces a TransportServer
|
|
114
|
+
*/
|
|
115
|
+
function registerServerProvider(app, transport, serverProvider) {
|
|
116
|
+
return tagServerBinding(app
|
|
117
|
+
.bind(server(transport))
|
|
118
|
+
.toProvider(serverProvider)
|
|
119
|
+
.inScope(core_1.BindingScope.SINGLETON), transport);
|
|
120
|
+
}
|
|
121
|
+
TransportBindings.registerServerProvider = registerServerProvider;
|
|
122
|
+
})(TransportBindings || (exports.TransportBindings = TransportBindings = {}));
|
|
123
|
+
//# sourceMappingURL=keys.js.map
|
package/dist/keys.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":";;;AAAA,yCAOwB;AAIxB;;;GAGG;AACU,QAAA,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD;;GAEG;AACU,QAAA,kBAAkB,GAAG,WAAW,CAAC;AAE9C,IAAiB,iBAAiB,CA4IjC;AA5ID,WAAiB,iBAAiB;IAChC;;OAEG;IACU,kCAAgB,GAAG,iBAAU,CAAC,MAAM,CAC/C,4BAA4B,CAC7B,CAAC;IAEF;;;OAGG;IACU,iCAAe,GAAG,iBAAU,CAAC,MAAM,CAC9C,2BAA2B,CAC5B,CAAC;IAEF;;;OAGG;IACU,iCAAe,GAAG,iBAAU,CAAC,MAAM,CAC9C,2BAA2B,CAC5B,CAAC;IAEF;;OAEG;IACU,+BAAa,GAAG,kBAAkB,CAAC;IAEhD;;OAEG;IACU,+BAAa,GAAG,kBAAkB,CAAC;IAEhD;;OAEG;IACU,+BAAa,GAAG,kBAAkB,CAAC;IAEhD;;OAEG;IACH,SAAgB,MAAM,CAAC,SAAiB;QACtC,OAAO,iBAAU,CAAC,MAAM,CAAC,GAAG,kBAAA,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAFe,wBAAM,SAErB,CAAA;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,SAAiB;QACtC,OAAO,iBAAU,CAAC,MAAM,CAAC,GAAG,kBAAA,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAFe,wBAAM,SAErB,CAAA;IAED;;OAEG;IACH,SAAgB,MAAM,CAAC,SAAiB;QACtC,OAAO,iBAAU,CAAC,MAAM,CAAC,GAAG,kBAAA,aAAa,IAAI,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAFe,wBAAM,SAErB,CAAA;IAED;;OAEG;IACH,SAAS,gBAAgB,CACvB,OAAiC,EACjC,SAAiB;QAEjB,OAAO,OAAO;aACX,GAAG,CAAC,4BAAoB,CAAC;aACzB,GAAG,CAAC,EAAC,CAAC,0BAAkB,CAAC,EAAE,SAAS,EAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;OASG;IACH,SAAgB,cAAc,CAC5B,GAAgB,EAChB,SAAiB,EACjB,QAAyB;QAEzB,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;IANe,gCAAc,iBAM7B,CAAA;IAED;;;;;;;;;;OAUG;IACH,SAAgB,mBAAmB,CACjC,GAAgB,EAChB,SAAiB,EACjB,WAAyC;QAEzC,OAAO,gBAAgB,CACrB,GAAG;aACA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACvB,OAAO,CAAC,WAAW,CAAC;aACpB,OAAO,CAAC,mBAAY,CAAC,SAAS,CAAC,EAClC,SAAS,CACV,CAAC;IACJ,CAAC;IAZe,qCAAmB,sBAYlC,CAAA;IAED;;;;;;;;;;;OAWG;IACH,SAAgB,sBAAsB,CACpC,GAAgB,EAChB,SAAiB,EACjB,cAAsD;QAEtD,OAAO,gBAAgB,CACrB,GAAG;aACA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aACvB,UAAU,CAAC,cAAc,CAAC;aAC1B,OAAO,CAAC,mBAAY,CAAC,SAAS,CAAC,EAClC,SAAS,CACV,CAAC;IACJ,CAAC;IAZe,wCAAsB,yBAYrC,CAAA;AACH,CAAC,EA5IgB,iBAAiB,iCAAjB,iBAAiB,QA4IjC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Application } from '@loopback/core';
|
|
2
|
+
import { MessageHandler } from '../interfaces';
|
|
3
|
+
/**
|
|
4
|
+
* Discovers @messageHandler and @eventHandler decorated methods
|
|
5
|
+
* from controllers and registers them with the appropriate transport server.
|
|
6
|
+
*
|
|
7
|
+
* This class does NOT run in the constructor. It is invoked by
|
|
8
|
+
* TransportBooter after all controllers are registered.
|
|
9
|
+
*
|
|
10
|
+
* Handler invocations use per-message child contexts for concurrency
|
|
11
|
+
* safety. The application context is never mutated per-message.
|
|
12
|
+
*
|
|
13
|
+
* Context lifetime extends until the handler result (including Observable
|
|
14
|
+
* streams) fully completes, errors, or times out.
|
|
15
|
+
*/
|
|
16
|
+
export declare class HandlerRegistry {
|
|
17
|
+
/**
|
|
18
|
+
* Registry keyed by `transport::pattern` to support the same pattern
|
|
19
|
+
* on different transports without collision.
|
|
20
|
+
*/
|
|
21
|
+
private readonly handlers;
|
|
22
|
+
private discovered;
|
|
23
|
+
/**
|
|
24
|
+
* Scan all controllers in the application for transport decorators
|
|
25
|
+
* and register the handlers.
|
|
26
|
+
*
|
|
27
|
+
* Idempotent: clears previously discovered handlers before scanning.
|
|
28
|
+
*/
|
|
29
|
+
discoverHandlers(app: Application): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Bind discovered handlers to the registered transport servers.
|
|
32
|
+
* Throws if discovery has not been run.
|
|
33
|
+
*
|
|
34
|
+
* Handles precedence: transport-specific handlers override wildcard
|
|
35
|
+
* handlers for the same pattern on that transport's server.
|
|
36
|
+
*/
|
|
37
|
+
bindToServers(app: Application): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Get all discovered handlers.
|
|
40
|
+
*/
|
|
41
|
+
getHandlers(): ReadonlyMap<string, readonly MessageHandler[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Whether discovery has been run.
|
|
44
|
+
*/
|
|
45
|
+
isDiscovered(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Build the registry key from transport and raw pattern.
|
|
48
|
+
* Normalizes the pattern (sorts object keys) before keying.
|
|
49
|
+
* Format: `transport::normalizedPattern` or `*::normalizedPattern`.
|
|
50
|
+
*/
|
|
51
|
+
private buildKey;
|
|
52
|
+
/**
|
|
53
|
+
* Extract the pattern portion from a registry key.
|
|
54
|
+
*/
|
|
55
|
+
private extractPattern;
|
|
56
|
+
private scanMessageHandlers;
|
|
57
|
+
private scanEventHandlers;
|
|
58
|
+
/**
|
|
59
|
+
* Shared scanner for both @messageHandler and @eventHandler metadata.
|
|
60
|
+
* The isEvent flag controls duplicate/chaining rules.
|
|
61
|
+
*/
|
|
62
|
+
private scanHandlers;
|
|
63
|
+
/**
|
|
64
|
+
* Create a handler function that invokes the controller method through
|
|
65
|
+
* LoopBack's native invocation pipeline.
|
|
66
|
+
*
|
|
67
|
+
* Each invocation creates a uniquely named child Context from the
|
|
68
|
+
* application context. Per-message bindings (payload, transport context)
|
|
69
|
+
* are scoped to the child context and cannot collide with concurrent
|
|
70
|
+
* messages.
|
|
71
|
+
*
|
|
72
|
+
* The child context lifetime extends until the handler result fully
|
|
73
|
+
* resolves. For Observable results, the context stays open until the
|
|
74
|
+
* Observable completes, errors, or times out.
|
|
75
|
+
*/
|
|
76
|
+
private createHandler;
|
|
77
|
+
}
|