@ebarahona/loopback-transport-core 1.0.0 → 1.2.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.md +472 -35
- package/dist/client/client-proxy.d.ts +73 -42
- package/dist/client/client-proxy.js +71 -42
- package/dist/client/client-proxy.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +3 -15
- package/dist/client/index.js.map +1 -1
- package/dist/context/execution-context.d.ts +58 -11
- package/dist/context/execution-context.js +62 -17
- package/dist/context/execution-context.js.map +1 -1
- package/dist/context/index.d.ts +2 -1
- package/dist/context/index.js +3 -15
- package/dist/context/index.js.map +1 -1
- package/dist/decorators/constants.d.ts +20 -10
- package/dist/decorators/constants.js +6 -2
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/event-handler.decorator.d.ts +10 -7
- package/dist/decorators/event-handler.decorator.js +18 -13
- package/dist/decorators/event-handler.decorator.js.map +1 -1
- package/dist/decorators/index.d.ts +5 -4
- package/dist/decorators/index.js +11 -18
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/message-handler.decorator.d.ts +8 -5
- package/dist/decorators/message-handler.decorator.js +16 -11
- package/dist/decorators/message-handler.decorator.js.map +1 -1
- package/dist/decorators/payload.decorator.d.ts +16 -7
- package/dist/decorators/payload.decorator.js +16 -8
- package/dist/decorators/payload.decorator.js.map +1 -1
- package/dist/discovery/discovery.service.d.ts +143 -0
- package/dist/discovery/discovery.service.js +165 -0
- package/dist/discovery/discovery.service.js.map +1 -0
- package/dist/discovery/event-handler-discoverer.d.ts +19 -0
- package/dist/discovery/event-handler-discoverer.js +50 -0
- package/dist/discovery/event-handler-discoverer.js.map +1 -0
- package/dist/discovery/handler-discoverer.d.ts +48 -0
- package/dist/discovery/handler-discoverer.js +3 -0
- package/dist/discovery/handler-discoverer.js.map +1 -0
- package/dist/discovery/handler-kind.d.ts +23 -0
- package/dist/discovery/handler-kind.js +14 -0
- package/dist/discovery/handler-kind.js.map +1 -0
- package/dist/discovery/index.d.ts +7 -0
- package/dist/discovery/index.js +13 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/message-handler-discoverer.d.ts +19 -0
- package/dist/discovery/message-handler-discoverer.js +50 -0
- package/dist/discovery/message-handler-discoverer.js.map +1 -0
- package/dist/discovery/registered-handler.d.ts +35 -0
- package/dist/discovery/registered-handler.js +3 -0
- package/dist/discovery/registered-handler.js.map +1 -0
- package/dist/helpers/errors.d.ts +61 -0
- package/dist/helpers/errors.js +80 -0
- package/dist/helpers/errors.js.map +1 -0
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.js +14 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/register-server.d.ts +44 -0
- package/dist/helpers/register-server.js +72 -0
- package/dist/helpers/register-server.js.map +1 -0
- package/dist/index.d.ts +15 -7
- package/dist/index.js +33 -9
- package/dist/index.js.map +1 -1
- package/dist/interfaces/index.d.ts +4 -4
- package/dist/interfaces/index.js +0 -18
- package/dist/interfaces/index.js.map +1 -1
- package/dist/interfaces/message-handler.interface.d.ts +12 -6
- package/dist/interfaces/packet.interface.d.ts +20 -2
- package/dist/interfaces/transport-client.interface.d.ts +25 -13
- package/dist/interfaces/transport-server.interface.d.ts +36 -10
- package/dist/keys.d.ts +143 -46
- package/dist/keys.js +142 -68
- package/dist/keys.js.map +1 -1
- package/dist/registry/handler-registry.d.ts +94 -24
- package/dist/registry/handler-registry.js +279 -89
- package/dist/registry/handler-registry.js.map +1 -1
- package/dist/registry/index.d.ts +1 -1
- package/dist/registry/index.js +3 -15
- package/dist/registry/index.js.map +1 -1
- package/dist/serializers/cloudevents-serializer.d.ts +107 -0
- package/dist/serializers/cloudevents-serializer.js +130 -0
- package/dist/serializers/cloudevents-serializer.js.map +1 -0
- package/dist/serializers/index.d.ts +4 -1
- package/dist/serializers/index.js +7 -15
- package/dist/serializers/index.js.map +1 -1
- package/dist/serializers/serializer.interface.d.ts +49 -16
- package/dist/serializers/serializer.interface.js +41 -15
- package/dist/serializers/serializer.interface.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +3 -15
- package/dist/server/index.js.map +1 -1
- package/dist/server/server-base.d.ts +125 -52
- package/dist/server/server-base.js +168 -57
- package/dist/server/server-base.js.map +1 -1
- package/dist/transport.component.d.ts +21 -8
- package/dist/transport.component.js +41 -18
- package/dist/transport.component.js.map +1 -1
- package/dist/transport.observer.d.ts +91 -0
- package/dist/transport.observer.js +297 -0
- package/dist/transport.observer.js.map +1 -0
- package/dist/utils/normalize-pattern.d.ts +11 -6
- package/dist/utils/normalize-pattern.js +18 -13
- package/dist/utils/normalize-pattern.js.map +1 -1
- package/package.json +58 -16
- package/dist/transport-booter.d.ts +0 -31
- package/dist/transport-booter.js +0 -117
- package/dist/transport-booter.js.map +0 -1
|
@@ -1,29 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.normalizePattern =
|
|
3
|
+
exports.normalizePattern = normalizePattern;
|
|
4
|
+
const errors_1 = require("../helpers/errors");
|
|
4
5
|
/**
|
|
5
6
|
* Normalize a pattern to a consistent string key.
|
|
6
7
|
*
|
|
7
|
-
* Strings pass through as-is. Objects are deep-sorted by key
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Strings pass through as-is. Objects are deep-sorted by key and
|
|
9
|
+
* JSON-stringified for consistent lookup regardless of property
|
|
10
|
+
* insertion order.
|
|
10
11
|
*
|
|
11
12
|
* Only JSON-compatible values are accepted: strings, finite numbers,
|
|
12
13
|
* booleans, null, plain objects, and arrays. Non-JSON values
|
|
13
|
-
* (undefined
|
|
14
|
-
* RegExp
|
|
14
|
+
* (`undefined`, functions, symbols, `NaN`, `Infinity`, `BigInt`,
|
|
15
|
+
* `Date`, `RegExp`, `Map`, `Set`, class instances) are rejected
|
|
16
|
+
* deterministically.
|
|
15
17
|
*
|
|
16
18
|
* Shared (non-circular) object references are allowed. Only true
|
|
17
19
|
* cycles throw.
|
|
18
20
|
*
|
|
19
|
-
* @
|
|
21
|
+
* @public
|
|
22
|
+
* @param pattern - String or plain-object pattern.
|
|
23
|
+
* @returns A canonical string representation suitable as a registry key.
|
|
24
|
+
* @throws TransportPatternError On circular references, non-JSON
|
|
25
|
+
* values, or non-plain objects.
|
|
20
26
|
*/
|
|
21
27
|
function normalizePattern(pattern) {
|
|
22
28
|
if (typeof pattern === 'string')
|
|
23
29
|
return pattern;
|
|
24
30
|
return stableStringify(pattern, new Set());
|
|
25
31
|
}
|
|
26
|
-
exports.normalizePattern = normalizePattern;
|
|
27
32
|
function isPlainObject(obj) {
|
|
28
33
|
if (typeof obj !== 'object' || obj === null)
|
|
29
34
|
return false;
|
|
@@ -40,7 +45,7 @@ function stableStringify(obj, seen) {
|
|
|
40
45
|
if (type === 'number') {
|
|
41
46
|
const n = obj;
|
|
42
47
|
if (!Number.isFinite(n)) {
|
|
43
|
-
throw new
|
|
48
|
+
throw new errors_1.TransportPatternError(`Pattern contains ${String(n)}, which is not JSON-serializable`);
|
|
44
49
|
}
|
|
45
50
|
return JSON.stringify(n);
|
|
46
51
|
}
|
|
@@ -48,12 +53,12 @@ function stableStringify(obj, seen) {
|
|
|
48
53
|
type === 'function' ||
|
|
49
54
|
type === 'symbol' ||
|
|
50
55
|
type === 'bigint') {
|
|
51
|
-
throw new
|
|
56
|
+
throw new errors_1.TransportPatternError(`Pattern contains ${type} value, which is not JSON-serializable`);
|
|
52
57
|
}
|
|
53
|
-
// At this point, type === 'object' and obj !== null
|
|
58
|
+
// At this point, type === 'object' and obj !== null.
|
|
54
59
|
const o = obj;
|
|
55
60
|
if (seen.has(o)) {
|
|
56
|
-
throw new
|
|
61
|
+
throw new errors_1.TransportPatternError('Circular reference detected in pattern object');
|
|
57
62
|
}
|
|
58
63
|
if (Array.isArray(o)) {
|
|
59
64
|
seen.add(o);
|
|
@@ -63,7 +68,7 @@ function stableStringify(obj, seen) {
|
|
|
63
68
|
}
|
|
64
69
|
if (!isPlainObject(o)) {
|
|
65
70
|
const name = o.constructor?.name ?? 'unknown';
|
|
66
|
-
throw new
|
|
71
|
+
throw new errors_1.TransportPatternError(`Pattern contains ${name} instance, which is not a plain object`);
|
|
67
72
|
}
|
|
68
73
|
seen.add(o);
|
|
69
74
|
const keys = Object.keys(o).sort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-pattern.js","sourceRoot":"","sources":["../../src/utils/normalize-pattern.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"normalize-pattern.js","sourceRoot":"","sources":["../../src/utils/normalize-pattern.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ebarahona/loopback-transport-core",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Transport-agnostic microservice primitives for LoopBack 4 — message handlers, event patterns, execution context, and client proxies for Kafka, RabbitMQ, gRPC, MQTT, and NATS.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"type": "commonjs",
|
|
7
14
|
"engines": {
|
|
8
|
-
"node": ">=
|
|
15
|
+
"node": ">=20.19.0"
|
|
9
16
|
},
|
|
10
17
|
"scripts": {
|
|
11
18
|
"build": "tsc -p tsconfig.build.json",
|
|
@@ -13,8 +20,14 @@
|
|
|
13
20
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
14
21
|
"lint": "eslint \"src/**/*.ts\"",
|
|
15
22
|
"test": "vitest run",
|
|
23
|
+
"test:unit": "vitest run src/__tests__/unit",
|
|
24
|
+
"test:integration": "vitest run src/__tests__/integration",
|
|
16
25
|
"test:dev": "vitest",
|
|
17
|
-
"
|
|
26
|
+
"commitlint": "commitlint --edit",
|
|
27
|
+
"prepare": "sh scripts/install-hooks.sh",
|
|
28
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
29
|
+
"bench": "node bench/index.mjs",
|
|
30
|
+
"docs": "typedoc"
|
|
18
31
|
},
|
|
19
32
|
"keywords": [
|
|
20
33
|
"loopback",
|
|
@@ -28,39 +41,54 @@
|
|
|
28
41
|
"nats",
|
|
29
42
|
"event-driven",
|
|
30
43
|
"message-handler",
|
|
31
|
-
"execution-context"
|
|
44
|
+
"execution-context",
|
|
45
|
+
"loopback4 extension",
|
|
46
|
+
"extension"
|
|
32
47
|
],
|
|
33
48
|
"author": "Ed Barahona (https://github.com/ebarahona)",
|
|
34
49
|
"license": "MIT",
|
|
35
50
|
"repository": {
|
|
36
51
|
"type": "git",
|
|
37
|
-
"url": "https://github.com/ebarahona/loopback-transport-core.git"
|
|
52
|
+
"url": "git+https://github.com/ebarahona/loopback-transport-core.git"
|
|
38
53
|
},
|
|
39
54
|
"bugs": {
|
|
40
55
|
"url": "https://github.com/ebarahona/loopback-transport-core/issues"
|
|
41
56
|
},
|
|
42
57
|
"homepage": "https://github.com/ebarahona/loopback-transport-core#readme",
|
|
43
58
|
"peerDependencies": {
|
|
44
|
-
"@loopback/core": ">=7.0.0",
|
|
45
|
-
"@loopback/metadata": ">=8.0.0"
|
|
59
|
+
"@loopback/core": ">=7.0.0 <8.0.0",
|
|
60
|
+
"@loopback/metadata": ">=8.0.0 <9.0.0",
|
|
61
|
+
"cloudevents": ">=10.0.0 <11.0.0",
|
|
62
|
+
"rxjs": ">=7.0.0 <8.0.0"
|
|
46
63
|
},
|
|
47
64
|
"dependencies": {
|
|
48
|
-
"debug": "^4.3.4"
|
|
49
|
-
"rxjs": "^7.8.0"
|
|
65
|
+
"debug": "^4.3.4"
|
|
50
66
|
},
|
|
51
67
|
"devDependencies": {
|
|
68
|
+
"@commitlint/cli": "^21.0.1",
|
|
69
|
+
"@commitlint/config-conventional": "^21.0.1",
|
|
52
70
|
"@loopback/core": "^7.0.12",
|
|
53
71
|
"@loopback/metadata": "^8.0.12",
|
|
54
|
-
"@
|
|
55
|
-
"@loopback/testlab": "^8.0.12",
|
|
72
|
+
"@size-limit/preset-small-lib": "^11.0.0",
|
|
56
73
|
"@types/debug": "^4.1.12",
|
|
74
|
+
"@types/node": "^25.7.0",
|
|
57
75
|
"@typescript-eslint/eslint-plugin": "^8.59.3",
|
|
58
76
|
"@typescript-eslint/parser": "^8.59.3",
|
|
77
|
+
"cloudevents": ">=10.0.0 <11.0.0",
|
|
59
78
|
"eslint": "^10.3.0",
|
|
79
|
+
"eslint-config-prettier": "^10.1.8",
|
|
80
|
+
"eslint-plugin-import-x": "^4.16.2",
|
|
81
|
+
"eslint-plugin-tsdoc": "^0.5.2",
|
|
82
|
+
"lefthook": "^2.1.6",
|
|
60
83
|
"prettier": "^3.2.0",
|
|
61
|
-
"rimraf": "^
|
|
62
|
-
"
|
|
63
|
-
"
|
|
84
|
+
"rimraf": "^6.0.1",
|
|
85
|
+
"rxjs": "^7.8.0",
|
|
86
|
+
"size-limit": "^11.0.0",
|
|
87
|
+
"tinybench": "^3.1.1",
|
|
88
|
+
"typedoc": "^0.28.19",
|
|
89
|
+
"typescript": "^6.0.3",
|
|
90
|
+
"vitest": "^4.1.6",
|
|
91
|
+
"yaml": "^2.9.0"
|
|
64
92
|
},
|
|
65
93
|
"files": [
|
|
66
94
|
"dist",
|
|
@@ -69,5 +97,19 @@
|
|
|
69
97
|
],
|
|
70
98
|
"publishConfig": {
|
|
71
99
|
"access": "public"
|
|
72
|
-
}
|
|
100
|
+
},
|
|
101
|
+
"size-limit": [
|
|
102
|
+
{
|
|
103
|
+
"name": "dist (CommonJS)",
|
|
104
|
+
"path": "dist/index.js",
|
|
105
|
+
"limit": "100 KB",
|
|
106
|
+
"ignore": [
|
|
107
|
+
"@loopback/core",
|
|
108
|
+
"@loopback/metadata",
|
|
109
|
+
"cloudevents",
|
|
110
|
+
"rxjs",
|
|
111
|
+
"debug"
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
]
|
|
73
115
|
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Application, LifeCycleObserver } from '@loopback/core';
|
|
2
|
-
import { HandlerRegistry } from './registry';
|
|
3
|
-
/**
|
|
4
|
-
* Lifecycle observer that discovers transport handlers after boot
|
|
5
|
-
* and starts/stops transport servers.
|
|
6
|
-
*
|
|
7
|
-
* Runs after all controllers are registered (boot phase complete).
|
|
8
|
-
* Scans controllers for @messageHandler/@eventHandler metadata,
|
|
9
|
-
* registers handlers with transport servers, then starts listeners.
|
|
10
|
-
*
|
|
11
|
-
* Startup behavior: sequential with deterministic rollback.
|
|
12
|
-
* Servers start one at a time. If any fails, all previously started
|
|
13
|
-
* servers are rolled back. No race between concurrent starts.
|
|
14
|
-
*
|
|
15
|
-
* Shutdown behavior: best-effort parallel. All servers stop concurrently.
|
|
16
|
-
* Individual errors are logged but don't prevent other servers from stopping.
|
|
17
|
-
*
|
|
18
|
-
* Restart safety: servers are cleared of handlers before rebinding
|
|
19
|
-
* to prevent duplicate registration on stop/start cycles.
|
|
20
|
-
*/
|
|
21
|
-
export declare class TransportBooter implements LifeCycleObserver {
|
|
22
|
-
private app;
|
|
23
|
-
private registry;
|
|
24
|
-
constructor(app: Application, registry: HandlerRegistry);
|
|
25
|
-
start(): Promise<void>;
|
|
26
|
-
stop(): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* Resolve all registered transport servers with their names.
|
|
29
|
-
*/
|
|
30
|
-
private getServerEntries;
|
|
31
|
-
}
|
package/dist/transport-booter.js
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.TransportBooter = void 0;
|
|
16
|
-
const core_1 = require("@loopback/core");
|
|
17
|
-
const debug_1 = require("debug");
|
|
18
|
-
const registry_1 = require("./registry");
|
|
19
|
-
const keys_1 = require("./keys");
|
|
20
|
-
const debug = (0, debug_1.default)('loopback:transport:booter');
|
|
21
|
-
/**
|
|
22
|
-
* Lifecycle observer that discovers transport handlers after boot
|
|
23
|
-
* and starts/stops transport servers.
|
|
24
|
-
*
|
|
25
|
-
* Runs after all controllers are registered (boot phase complete).
|
|
26
|
-
* Scans controllers for @messageHandler/@eventHandler metadata,
|
|
27
|
-
* registers handlers with transport servers, then starts listeners.
|
|
28
|
-
*
|
|
29
|
-
* Startup behavior: sequential with deterministic rollback.
|
|
30
|
-
* Servers start one at a time. If any fails, all previously started
|
|
31
|
-
* servers are rolled back. No race between concurrent starts.
|
|
32
|
-
*
|
|
33
|
-
* Shutdown behavior: best-effort parallel. All servers stop concurrently.
|
|
34
|
-
* Individual errors are logged but don't prevent other servers from stopping.
|
|
35
|
-
*
|
|
36
|
-
* Restart safety: servers are cleared of handlers before rebinding
|
|
37
|
-
* to prevent duplicate registration on stop/start cycles.
|
|
38
|
-
*/
|
|
39
|
-
let TransportBooter = class TransportBooter {
|
|
40
|
-
constructor(app, registry) {
|
|
41
|
-
this.app = app;
|
|
42
|
-
this.registry = registry;
|
|
43
|
-
}
|
|
44
|
-
async start() {
|
|
45
|
-
debug('transport booter starting');
|
|
46
|
-
// Discover handlers from controllers (idempotent: clears first)
|
|
47
|
-
await this.registry.discoverHandlers(this.app);
|
|
48
|
-
// Clear existing handlers from servers before rebinding
|
|
49
|
-
const entries = await this.getServerEntries();
|
|
50
|
-
for (const { server } of entries) {
|
|
51
|
-
server.clearHandlers();
|
|
52
|
-
}
|
|
53
|
-
// Bind handlers to transport servers
|
|
54
|
-
await this.registry.bindToServers(this.app);
|
|
55
|
-
// Start servers sequentially for deterministic rollback
|
|
56
|
-
const started = [];
|
|
57
|
-
try {
|
|
58
|
-
for (const { name, server } of entries) {
|
|
59
|
-
await server.listen();
|
|
60
|
-
started.push({ name, server });
|
|
61
|
-
debug('transport server [%s] started', name);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
debug('startup failed, rolling back %d started servers', started.length);
|
|
66
|
-
for (const { name, server } of started.reverse()) {
|
|
67
|
-
try {
|
|
68
|
-
await server.close();
|
|
69
|
-
debug('transport server [%s] rolled back', name);
|
|
70
|
-
}
|
|
71
|
-
catch (closeErr) {
|
|
72
|
-
debug('transport server [%s] rollback failed: %O', name, closeErr);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
throw err;
|
|
76
|
-
}
|
|
77
|
-
debug('transport booter started (%d handlers, %d servers)', this.registry.getHandlers().size, entries.length);
|
|
78
|
-
}
|
|
79
|
-
async stop() {
|
|
80
|
-
debug('transport booter stopping');
|
|
81
|
-
const entries = await this.getServerEntries();
|
|
82
|
-
const results = await Promise.allSettled(entries.map(async ({ name, server }) => {
|
|
83
|
-
await server.close();
|
|
84
|
-
debug('transport server [%s] stopped', name);
|
|
85
|
-
}));
|
|
86
|
-
const failures = results.filter((r) => r.status === 'rejected');
|
|
87
|
-
if (failures.length > 0) {
|
|
88
|
-
debug('%d transport server(s) failed to stop cleanly', failures.length);
|
|
89
|
-
for (const failure of failures) {
|
|
90
|
-
debug('transport server shutdown failure: %O', failure.reason);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
debug('transport booter stopped');
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Resolve all registered transport servers with their names.
|
|
97
|
-
*/
|
|
98
|
-
async getServerEntries() {
|
|
99
|
-
const bindings = this.app.findByTag(keys_1.TRANSPORT_SERVER_TAG);
|
|
100
|
-
const entries = [];
|
|
101
|
-
for (const binding of bindings) {
|
|
102
|
-
const server = await this.app.get(binding.key);
|
|
103
|
-
const name = String(binding.tagMap?.[keys_1.TRANSPORT_NAME_TAG] ?? binding.key);
|
|
104
|
-
entries.push({ name, server });
|
|
105
|
-
}
|
|
106
|
-
return entries;
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
exports.TransportBooter = TransportBooter;
|
|
110
|
-
exports.TransportBooter = TransportBooter = __decorate([
|
|
111
|
-
(0, core_1.lifeCycleObserver)('transport'),
|
|
112
|
-
__param(0, (0, core_1.inject)(core_1.CoreBindings.APPLICATION_INSTANCE)),
|
|
113
|
-
__param(1, (0, core_1.inject)(keys_1.TransportBindings.HANDLER_REGISTRY)),
|
|
114
|
-
__metadata("design:paramtypes", [core_1.Application,
|
|
115
|
-
registry_1.HandlerRegistry])
|
|
116
|
-
], TransportBooter);
|
|
117
|
-
//# sourceMappingURL=transport-booter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transport-booter.js","sourceRoot":"","sources":["../src/transport-booter.ts"],"names":[],"mappings":"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"}
|