@pipeline-builder/api-server 3.4.71 → 3.4.72
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 +66 -22
- package/lib/api/app-factory.d.ts +2 -2
- package/lib/api/app-factory.js +45 -84
- package/lib/api/check-quota.d.ts +1 -1
- package/lib/api/check-quota.js +8 -11
- package/lib/api/context-middleware.d.ts +2 -2
- package/lib/api/context-middleware.js +4 -7
- package/lib/api/etag-middleware.d.ts +1 -1
- package/lib/api/etag-middleware.js +4 -7
- package/lib/api/get-context.d.ts +1 -1
- package/lib/api/get-context.js +2 -5
- package/lib/api/health-checks.js +5 -9
- package/lib/api/idempotency-middleware.d.ts +1 -1
- package/lib/api/idempotency-middleware.js +11 -16
- package/lib/api/index.d.ts +16 -16
- package/lib/api/index.js +17 -33
- package/lib/api/metrics.d.ts +1 -1
- package/lib/api/metrics.js +17 -24
- package/lib/api/middleware-factory.d.ts +1 -1
- package/lib/api/middleware-factory.js +11 -15
- package/lib/api/middleware.js +2 -6
- package/lib/api/mongo-connect.js +4 -7
- package/lib/api/quota-helpers.d.ts +1 -1
- package/lib/api/quota-helpers.js +4 -7
- package/lib/api/request-types.d.ts +3 -3
- package/lib/api/request-types.js +8 -10
- package/lib/api/require-org-id.d.ts +1 -1
- package/lib/api/require-org-id.js +6 -9
- package/lib/api/route-wrapper.d.ts +1 -1
- package/lib/api/route-wrapper.js +12 -15
- package/lib/api/server.d.ts +2 -2
- package/lib/api/server.js +15 -17
- package/lib/api/tracing.js +18 -23
- package/lib/http/index.d.ts +1 -1
- package/lib/http/index.js +2 -18
- package/lib/http/sse-connection-manager.d.ts +1 -1
- package/lib/http/sse-connection-manager.js +8 -12
- package/lib/index.d.ts +2 -2
- package/lib/index.js +3 -19
- package/lib/otel-bootstrap.js +32 -19
- package/package.json +28 -20
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const check_quota_1 = require("./check-quota");
|
|
8
|
-
const middleware_1 = require("./middleware");
|
|
9
|
-
const require_org_id_1 = require("./require-org-id");
|
|
3
|
+
import { checkQuota } from './check-quota.js';
|
|
4
|
+
import { requireAuth } from './middleware.js';
|
|
5
|
+
import { requireOrgId } from './require-org-id.js';
|
|
10
6
|
/**
|
|
11
7
|
* Creates a middleware chain for protected routes requiring authentication, org ID, and quota check.
|
|
12
8
|
*
|
|
@@ -29,11 +25,11 @@ const require_org_id_1 = require("./require-org-id");
|
|
|
29
25
|
* );
|
|
30
26
|
* ```
|
|
31
27
|
*/
|
|
32
|
-
function createProtectedRoute(quotaService, quotaType) {
|
|
28
|
+
export function createProtectedRoute(quotaService, quotaType) {
|
|
33
29
|
return [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
requireAuth,
|
|
31
|
+
requireOrgId(),
|
|
32
|
+
checkQuota(quotaService, quotaType),
|
|
37
33
|
];
|
|
38
34
|
}
|
|
39
35
|
/**
|
|
@@ -57,10 +53,10 @@ function createProtectedRoute(quotaService, quotaType) {
|
|
|
57
53
|
* );
|
|
58
54
|
* ```
|
|
59
55
|
*/
|
|
60
|
-
function createAuthenticatedWithOrgRoute() {
|
|
56
|
+
export function createAuthenticatedWithOrgRoute() {
|
|
61
57
|
return [
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
requireAuth,
|
|
59
|
+
requireOrgId(),
|
|
64
60
|
];
|
|
65
61
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxZQUEwQixFQUMxQixTQUFvQjtJQUVwQixPQUFPO1FBQ0wsV0FBNkI7UUFDN0IsWUFBWSxFQUFvQjtRQUNoQyxVQUFVLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBbUI7S0FDdEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsK0JBQStCO0lBQzdDLE9BQU87UUFDTCxXQUE2QjtRQUM3QixZQUFZLEVBQW9CO0tBQ2pDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlLCBRdW90YVNlcnZpY2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVja1F1b3RhIH0gZnJvbSAnLi9jaGVjay1xdW90YS5qcyc7XG5pbXBvcnQgeyByZXF1aXJlQXV0aCB9IGZyb20gJy4vbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyByZXF1aXJlT3JnSWQgfSBmcm9tICcuL3JlcXVpcmUtb3JnLWlkLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWlkZGxld2FyZSBjaGFpbiBmb3IgcHJvdGVjdGVkIHJvdXRlcyByZXF1aXJpbmcgYXV0aGVudGljYXRpb24sIG9yZyBJRCwgYW5kIHF1b3RhIGNoZWNrLlxuICpcbiAqIEFwcGxpZXMgbWlkZGxld2FyZSBpbiBvcmRlcjpcbiAqIDEuIHJlcXVpcmVBdXRoIC0gVmFsaWRhdGVzIEpXVCBhbmQgZXh0cmFjdHMgdXNlciBpZGVudGl0eVxuICogMi4gcmVxdWlyZU9yZ0lkIC0gRW5zdXJlcyByZXF1ZXN0IGhhcyB4LW9yZy1pZCBoZWFkZXJcbiAqIDMuIGNoZWNrUXVvdGEgLSBWYWxpZGF0ZXMgcXVvdGEgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZVxuICpcbiAqIEBwYXJhbSBxdW90YVNlcnZpY2UgLSBRdW90YSBzZXJ2aWNlIGNsaWVudFxuICogQHBhcmFtIHF1b3RhVHlwZSAtIFdoaWNoIHF1b3RhIHRvIGNoZWNrIChlLmcuLCAnYXBpQ2FsbHMnLCAncGlwZWxpbmVzJywgJ3BsdWdpbnMnKVxuICogQHJldHVybnMgQXJyYXkgb2YgbWlkZGxld2FyZSBoYW5kbGVycyByZWFkeSB0byBzcHJlYWQgaW50byByb3V0ZSBkZWZpbml0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHJvdXRlci5wb3N0KCcvJyxcbiAqICAgLi4uY3JlYXRlUHJvdGVjdGVkUm91dGUocXVvdGFTZXJ2aWNlLCAncGlwZWxpbmVzJyksXG4gKiAgIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAgIC8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25cbiAqICAgfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvdGVjdGVkUm91dGUoXG4gIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbik6IFJlcXVlc3RIYW5kbGVyW10ge1xuICByZXR1cm4gW1xuICAgIHJlcXVpcmVBdXRoIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHJlcXVpcmVPcmdJZCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIGNoZWNrUXVvdGEocXVvdGFTZXJ2aWNlLCBxdW90YVR5cGUpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtaWRkbGV3YXJlIGNoYWluIGZvciBhdXRoZW50aWNhdGVkIHJvdXRlcyB3aXRoIG9yZyBJRCByZXF1aXJlbWVudCBidXQgbm8gcXVvdGEgY2hlY2suXG4gKlxuICogQXBwbGllcyBtaWRkbGV3YXJlIGluIG9yZGVyOlxuICogMS4gcmVxdWlyZUF1dGggLSBWYWxpZGF0ZXMgSldUIGFuZCBleHRyYWN0cyB1c2VyIGlkZW50aXR5XG4gKiAyLiByZXF1aXJlT3JnSWQgLSBFbnN1cmVzIHJlcXVlc3QgaGFzIHgtb3JnLWlkIGhlYWRlclxuICpcbiAqIFVzZSB0aGlzIGZvciByZWFkLW9ubHkgcm91dGVzIHRoYXQgZG9uJ3QgY29uc3VtZSBxdW90YS5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBtaWRkbGV3YXJlIGhhbmRsZXJzIHJlYWR5IHRvIHNwcmVhZCBpbnRvIHJvdXRlIGRlZmluaXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogcm91dGVyLmdldCgnLycsXG4gKiAgIC4uLmNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGUoKSxcbiAqICAgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgICAgLy8gSGFuZGxlciBpbXBsZW1lbnRhdGlvblxuICogICB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoZW50aWNhdGVkV2l0aE9yZ1JvdXRlKCk6IFJlcXVlc3RIYW5kbGVyW10ge1xuICByZXR1cm4gW1xuICAgIHJlcXVpcmVBdXRoIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHJlcXVpcmVPcmdJZCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICBdO1xufVxuIl19
|
package/lib/api/middleware.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
exports.requireAuth = void 0;
|
|
6
3
|
// Convenience re-export: api-server consumers usually compose middleware
|
|
7
4
|
// already imported from this package, so `requireAuth` is exposed here too.
|
|
8
5
|
// Other auth middleware (requireAdmin, requireFeature, isSystemAdmin) is
|
|
9
6
|
// consumed directly from api-core where it's defined.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7O0FBRXRDLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLHNEQUFzRDtBQUN0RCx1REFBeUQ7QUFBaEQsdUdBQUEsV0FBVyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vIENvbnZlbmllbmNlIHJlLWV4cG9ydDogYXBpLXNlcnZlciBjb25zdW1lcnMgdXN1YWxseSBjb21wb3NlIG1pZGRsZXdhcmVcbi8vIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSB0aGlzIHBhY2thZ2UsIHNvIGByZXF1aXJlQXV0aGAgaXMgZXhwb3NlZCBoZXJlIHRvby5cbi8vIE90aGVyIGF1dGggbWlkZGxld2FyZSAocmVxdWlyZUFkbWluLCByZXF1aXJlRmVhdHVyZSwgaXNTeXN0ZW1BZG1pbikgaXNcbi8vIGNvbnN1bWVkIGRpcmVjdGx5IGZyb20gYXBpLWNvcmUgd2hlcmUgaXQncyBkZWZpbmVkLlxuZXhwb3J0IHsgcmVxdWlyZUF1dGggfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG4iXX0=
|
|
7
|
+
export { requireAuth } from '@pipeline-builder/api-core';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLHNEQUFzRDtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy8gQ29udmVuaWVuY2UgcmUtZXhwb3J0OiBhcGktc2VydmVyIGNvbnN1bWVycyB1c3VhbGx5IGNvbXBvc2UgbWlkZGxld2FyZVxuLy8gYWxyZWFkeSBpbXBvcnRlZCBmcm9tIHRoaXMgcGFja2FnZSwgc28gYHJlcXVpcmVBdXRoYCBpcyBleHBvc2VkIGhlcmUgdG9vLlxuLy8gT3RoZXIgYXV0aCBtaWRkbGV3YXJlIChyZXF1aXJlQWRtaW4sIHJlcXVpcmVGZWF0dXJlLCBpc1N5c3RlbUFkbWluKSBpc1xuLy8gY29uc3VtZWQgZGlyZWN0bHkgZnJvbSBhcGktY29yZSB3aGVyZSBpdCdzIGRlZmluZWQuXG5leHBvcnQgeyByZXF1aXJlQXV0aCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbiJdfQ==
|
package/lib/api/mongo-connect.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const api_core_1 = require("@pipeline-builder/api-core");
|
|
7
|
-
const logger = (0, api_core_1.createLogger)('mongo-connect');
|
|
3
|
+
import { createLogger } from '@pipeline-builder/api-core';
|
|
4
|
+
const logger = createLogger('mongo-connect');
|
|
8
5
|
/**
|
|
9
6
|
* Connect to MongoDB with sensible production-ready pool defaults and
|
|
10
7
|
* standard event-handler wiring (error / disconnected / reconnected).
|
|
@@ -17,7 +14,7 @@ const logger = (0, api_core_1.createLogger)('mongo-connect');
|
|
|
17
14
|
* Pass the service's own mongoose instance — api-server doesn't bundle
|
|
18
15
|
* mongoose itself.
|
|
19
16
|
*/
|
|
20
|
-
async function connectMongo(mongoose, uri) {
|
|
17
|
+
export async function connectMongo(mongoose, uri) {
|
|
21
18
|
mongoose.set('strictQuery', true);
|
|
22
19
|
mongoose.connection.on('error', (err) => {
|
|
23
20
|
logger.error('MongoDB connection error', { error: err?.message });
|
|
@@ -34,4 +31,4 @@ async function connectMongo(mongoose, uri) {
|
|
|
34
31
|
await mongoose.connect(uri, { maxPoolSize, minPoolSize, serverSelectionTimeoutMS });
|
|
35
32
|
logger.info('MongoDB connection established', { maxPoolSize, minPoolSize, serverSelectionTimeoutMS });
|
|
36
33
|
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ28tY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbW9uZ28tY29ubmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7QUFvQjdDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBQUMsUUFBc0IsRUFBRSxHQUFXO0lBQ3BFLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWxDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sd0JBQXdCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRS9GLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFLENBQUMsQ0FBQztJQUNwRixNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7QUFDeEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignbW9uZ28tY29ubmVjdCcpO1xuXG4vKipcbiAqIE1pbmltYWwgc2hhcGUgb2YgbW9uZ29vc2UgYWNjZXB0ZWQgYnkgYGNvbm5lY3RNb25nb2AuIFBhc3NpbmcgdGhlIHJlYWxcbiAqIG1vbmdvb3NlIG9iamVjdCBzYXRpc2ZpZXMgaXQ7IGFwaS1zZXJ2ZXIgdGFrZXMgbW9uZ29vc2UgYXMgYSBwYXJhbWV0ZXJcbiAqIChkZXBlbmRlbmN5IGluamVjdGlvbikgc28gaXQgZG9lc24ndCBoYXZlIHRvIGRlY2xhcmUgbW9uZ29vc2UgYXMgYVxuICogZGVwZW5kZW5jeSBpdHNlbGYuXG4gKi9cbmludGVyZmFjZSBNb25nb29zZUxpa2Uge1xuICBzZXQob3B0aW9uOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93bjtcbiAgY29ubmVjdGlvbjoge1xuICAgIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoZXJyPzogRXJyb3IpID0+IHZvaWQpOiB1bmtub3duO1xuICB9O1xuICBjb25uZWN0KHVyaTogc3RyaW5nLCBvcHRpb25zOiB7XG4gICAgbWF4UG9vbFNpemU6IG51bWJlcjtcbiAgICBtaW5Qb29sU2l6ZTogbnVtYmVyO1xuICAgIHNlcnZlclNlbGVjdGlvblRpbWVvdXRNUzogbnVtYmVyO1xuICB9KTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBDb25uZWN0IHRvIE1vbmdvREIgd2l0aCBzZW5zaWJsZSBwcm9kdWN0aW9uLXJlYWR5IHBvb2wgZGVmYXVsdHMgYW5kXG4gKiBzdGFuZGFyZCBldmVudC1oYW5kbGVyIHdpcmluZyAoZXJyb3IgLyBkaXNjb25uZWN0ZWQgLyByZWNvbm5lY3RlZCkuXG4gKlxuICogUG9vbCBzaXppbmcgaXMgcmVhZCBmcm9tIGVudiAoYE1PTkdPX01BWF9QT09MYCwgYE1PTkdPX01JTl9QT09MYCxcbiAqIGBNT05HT19TRVJWRVJfU0VMRUNUSU9OX01TYCkuIFdpdGhvdXQgdGhlc2UgdGhlIGRyaXZlciBkZWZhdWx0IG9mXG4gKiBgbWF4UG9vbFNpemU9MTAwYCBsZXRzIGEgYnVyc3QgZXhoYXVzdCBNb25nbydzIGNvbm5lY3Rpb24gY2VpbGluZ1xuICogYWNyb3NzIHJlcGxpY2FzLiBEZWZhdWx0czogMjAgbWF4IC8gMiBtaW4gLyA1cyBzZXJ2ZXIgc2VsZWN0aW9uLlxuICpcbiAqIFBhc3MgdGhlIHNlcnZpY2UncyBvd24gbW9uZ29vc2UgaW5zdGFuY2Ug4oCUIGFwaS1zZXJ2ZXIgZG9lc24ndCBidW5kbGVcbiAqIG1vbmdvb3NlIGl0c2VsZi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RNb25nbyhtb25nb29zZTogTW9uZ29vc2VMaWtlLCB1cmk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBtb25nb29zZS5zZXQoJ3N0cmljdFF1ZXJ5JywgdHJ1ZSk7XG5cbiAgbW9uZ29vc2UuY29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgbG9nZ2VyLmVycm9yKCdNb25nb0RCIGNvbm5lY3Rpb24gZXJyb3InLCB7IGVycm9yOiBlcnI/Lm1lc3NhZ2UgfSk7XG4gIH0pO1xuXG4gIG1vbmdvb3NlLmNvbm5lY3Rpb24ub24oJ2Rpc2Nvbm5lY3RlZCcsICgpID0+IHtcbiAgICBsb2dnZXIud2FybignTW9uZ29EQiBkaXNjb25uZWN0ZWQnKTtcbiAgfSk7XG5cbiAgbW9uZ29vc2UuY29ubmVjdGlvbi5vbigncmVjb25uZWN0ZWQnLCAoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ01vbmdvREIgcmVjb25uZWN0ZWQnKTtcbiAgfSk7XG5cbiAgY29uc3QgbWF4UG9vbFNpemUgPSBwYXJzZUludChwcm9jZXNzLmVudi5NT05HT19NQVhfUE9PTCB8fCAnMjAnLCAxMCk7XG4gIGNvbnN0IG1pblBvb2xTaXplID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuTU9OR09fTUlOX1BPT0wgfHwgJzInLCAxMCk7XG4gIGNvbnN0IHNlcnZlclNlbGVjdGlvblRpbWVvdXRNUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52Lk1PTkdPX1NFUlZFUl9TRUxFQ1RJT05fTVMgfHwgJzUwMDAnLCAxMCk7XG5cbiAgYXdhaXQgbW9uZ29vc2UuY29ubmVjdCh1cmksIHsgbWF4UG9vbFNpemUsIG1pblBvb2xTaXplLCBzZXJ2ZXJTZWxlY3Rpb25UaW1lb3V0TVMgfSk7XG4gIGxvZ2dlci5pbmZvKCdNb25nb0RCIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnLCB7IG1heFBvb2xTaXplLCBtaW5Qb29sU2l6ZSwgc2VydmVyU2VsZWN0aW9uVGltZW91dE1TIH0pO1xufVxuIl19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type QuotaService, type QuotaType } from '@pipeline-builder/api-core';
|
|
2
2
|
import type { Request } from 'express';
|
|
3
|
-
import type { RequestContext } from './request-types';
|
|
3
|
+
import type { RequestContext } from './request-types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Increment a quota counter using values pulled from a route context.
|
|
6
6
|
*
|
package/lib/api/quota-helpers.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
exports.incrementQuotaFromCtx = incrementQuotaFromCtx;
|
|
6
|
-
const api_core_1 = require("@pipeline-builder/api-core");
|
|
3
|
+
import { incrementQuota } from '@pipeline-builder/api-core';
|
|
7
4
|
/**
|
|
8
5
|
* Increment a quota counter using values pulled from a route context.
|
|
9
6
|
*
|
|
@@ -19,7 +16,7 @@ const api_core_1 = require("@pipeline-builder/api-core");
|
|
|
19
16
|
* }));
|
|
20
17
|
* ```
|
|
21
18
|
*/
|
|
22
|
-
function incrementQuotaFromCtx(quotaService, rc, type) {
|
|
23
|
-
|
|
19
|
+
export function incrementQuotaFromCtx(quotaService, rc, type) {
|
|
20
|
+
incrementQuota(quotaService, rc.orgId, type, rc.req.headers.authorization || '', rc.ctx.log.bind(null, 'WARN'));
|
|
24
21
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcXVvdGEtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQXFDLE1BQU0sNEJBQTRCLENBQUM7QUFJL0Y7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLFlBQTBCLEVBQzFCLEVBQXdELEVBQ3hELElBQWU7SUFFZixjQUFjLENBQ1osWUFBWSxFQUNaLEVBQUUsQ0FBQyxLQUFLLEVBQ1IsSUFBSSxFQUNKLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLEVBQ2xDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGluY3JlbWVudFF1b3RhLCB0eXBlIFF1b3RhU2VydmljZSwgdHlwZSBRdW90YVR5cGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tICcuL3JlcXVlc3QtdHlwZXMuanMnO1xuXG4vKipcbiAqIEluY3JlbWVudCBhIHF1b3RhIGNvdW50ZXIgdXNpbmcgdmFsdWVzIHB1bGxlZCBmcm9tIGEgcm91dGUgY29udGV4dC5cbiAqXG4gKiBXcmFwcyBgaW5jcmVtZW50UXVvdGEocXVvdGFTZXJ2aWNlLCBvcmdJZCwgdHlwZSwgYXV0aEhlYWRlciwgbG9nV2FybilgIHNvXG4gKiByb3V0ZSBoYW5kbGVycyBkb24ndCBoYXZlIHRvIHJlLWRlcml2ZSBgcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbmAgYW5kXG4gKiBgY3R4LmxvZy5iaW5kKG51bGwsICdXQVJOJylgIGF0IGV2ZXJ5IGNhbGwgc2l0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogcm91dGVyLmdldCgnLycsIHdpdGhSb3V0ZShhc3luYyAoeyByZXEsIHJlcywgY3R4LCBvcmdJZCB9KSA9PiB7XG4gKiAgIC8vIC4uLlxuICogICBpbmNyZW1lbnRRdW90YUZyb21DdHgocXVvdGFTZXJ2aWNlLCB7IHJlcSwgY3R4LCBvcmdJZCB9LCAnYXBpQ2FsbHMnKTtcbiAqIH0pKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50UXVvdGFGcm9tQ3R4KFxuICBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgcmM6IHsgcmVxOiBSZXF1ZXN0OyBjdHg6IFJlcXVlc3RDb250ZXh0OyBvcmdJZDogc3RyaW5nIH0sXG4gIHR5cGU6IFF1b3RhVHlwZSxcbik6IHZvaWQge1xuICBpbmNyZW1lbnRRdW90YShcbiAgICBxdW90YVNlcnZpY2UsXG4gICAgcmMub3JnSWQsXG4gICAgdHlwZSxcbiAgICByYy5yZXEuaGVhZGVycy5hdXRob3JpemF0aW9uIHx8ICcnLFxuICAgIHJjLmN0eC5sb2cuYmluZChudWxsLCAnV0FSTicpLFxuICApO1xufVxuIl19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { RequestIdentity } from '@pipeline-builder/api-core';
|
|
2
|
-
import { Request } from 'express';
|
|
3
|
-
import {
|
|
1
|
+
import { type RequestIdentity } from '@pipeline-builder/api-core';
|
|
2
|
+
import type { Request } from 'express';
|
|
3
|
+
import { SSEManager, type SSEEventType } from '../http/sse-connection-manager.js';
|
|
4
4
|
declare global {
|
|
5
5
|
namespace Express {
|
|
6
6
|
interface Request {
|
package/lib/api/request-types.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const logger = (0, api_core_1.createLogger)('api-server');
|
|
3
|
+
import { getIdentity, createLogger } from '@pipeline-builder/api-core';
|
|
4
|
+
import { v7 as uuid } from 'uuid';
|
|
5
|
+
import { SSEManager } from '../http/sse-connection-manager.js';
|
|
6
|
+
const logger = createLogger('api-server');
|
|
9
7
|
/**
|
|
10
8
|
* Create a request context with identity and logging
|
|
11
9
|
*
|
|
@@ -32,11 +30,11 @@ const logger = (0, api_core_1.createLogger)('api-server');
|
|
|
32
30
|
* });
|
|
33
31
|
* ```
|
|
34
32
|
*/
|
|
35
|
-
function createRequestContext(req, sseManager) {
|
|
36
|
-
const identity =
|
|
33
|
+
export function createRequestContext(req, sseManager) {
|
|
34
|
+
const identity = getIdentity(req);
|
|
37
35
|
// Prefer the already-parsed requestId from app-factory middleware,
|
|
38
36
|
// fall back to identity header, then generate a new one.
|
|
39
|
-
const requestId = req.requestId || identity.requestId || (
|
|
37
|
+
const requestId = req.requestId || identity.requestId || uuid();
|
|
40
38
|
// Create logger that outputs to Winston and SSE
|
|
41
39
|
const log = (type, message, data) => {
|
|
42
40
|
const meta = { requestId, orgId: identity.orgId, type, data };
|
|
@@ -59,4 +57,4 @@ function createRequestContext(req, sseManager) {
|
|
|
59
57
|
log,
|
|
60
58
|
};
|
|
61
59
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVxdWVzdC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUEwQyxNQUFNLDRCQUE0QixDQUFDO0FBRS9HLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0sbUNBQW1DLENBQUM7QUFjbEYsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBbUIxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsR0FBWSxFQUNaLFVBQXNCO0lBRXRCLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFrQixDQUFDLENBQUM7SUFDakQsbUVBQW1FO0lBQ25FLHlEQUF5RDtJQUN6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFaEUsZ0RBQWdEO0lBQ2hELE1BQU0sR0FBRyxHQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDakQsTUFBTSxJQUFJLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlELFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLE9BQU87Z0JBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVCLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU07WUFDUjtnQkFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0IsTUFBTTtRQUNWLENBQUM7UUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgY3JlYXRlTG9nZ2VyLCB0eXBlIFJlcXVlc3RJZGVudGl0eSwgdHlwZSBIdHRwUmVxdWVzdCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgU1NFTWFuYWdlciwgdHlwZSBTU0VFdmVudFR5cGUgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG4vLyBDb25zb2xpZGF0ZWQgRXhwcmVzcyBSZXF1ZXN0IGF1Z21lbnRhdGlvbnNcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIC8qKiBVbmlxdWUgcmVxdWVzdCBJRCAoc2V0IGJ5IGFwcC1mYWN0b3J5IG1pZGRsZXdhcmUpICovXG4gICAgICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gICAgICAvKiogUmVxdWVzdCBjb250ZXh0IHdpdGggaWRlbnRpdHksIGxvZ2dpbmcsIGFuZCBTU0UgKi9cbiAgICAgIGNvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhcGktc2VydmVyJyk7XG5cbi8qKlxuICogUmVxdWVzdCBsb2dnZXIgZnVuY3Rpb24gdHlwZVxuICovXG5leHBvcnQgdHlwZSBSZXF1ZXN0TG9nZ2VyID0gKHR5cGU6IFNTRUV2ZW50VHlwZSwgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcblxuLyoqXG4gKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHtcbiAgLyoqIFVuaXF1ZSByZXF1ZXN0IElEICovXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xuICAvKiogSWRlbnRpdHkgZnJvbSBoZWFkZXJzICovXG4gIGlkZW50aXR5OiBSZXF1ZXN0SWRlbnRpdHk7XG4gIC8qKiBMb2dnaW5nIGZ1bmN0aW9uIHRoYXQgc2VuZHMgdG8gY29uc29sZSBhbmQgU1NFICovXG4gIGxvZzogUmVxdWVzdExvZ2dlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSByZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2luZ1xuICpcbiAqIENyZWF0ZXMgYSBsb2dnZXIgdGhhdCBvdXRwdXRzIHRvIGJvdGggY29uc29sZSBhbmQgU1NFLlxuICpcbiAqIEBwYXJhbSByZXEgLSBFeHByZXNzIHJlcXVlc3RcbiAqIEBwYXJhbSBzc2VNYW5hZ2VyIC0gU1NFIG1hbmFnZXIgZm9yIHJlYWwtdGltZSBsb2dzXG4gKiBAcmV0dXJucyBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2VyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICBjb25zdCBjdHggPSBjcmVhdGVSZXF1ZXN0Q29udGV4dChyZXEsIHNzZU1hbmFnZXIpO1xuICpcbiAqICAgY3R4LmxvZygnSU5GTycsICdQcm9jZXNzaW5nIHJlcXVlc3QnLCB7IGRhdGE6IHJlcS5ib2R5IH0pO1xuICpcbiAqICAgaWYgKCFjdHguaWRlbnRpdHkub3JnSWQpIHtcbiAqICAgICBjdHgubG9nKCdFUlJPUicsICdNaXNzaW5nIG9yZ2FuaXphdGlvbiBJRCcpO1xuICogICAgIHJldHVybiBzZW5kQmFkUmVxdWVzdChyZXMsICd4LW9yZy1pZCBoZWFkZXIgcmVxdWlyZWQnKTtcbiAqICAgfVxuICpcbiAqICAgLy8gUHJvY2VzcyByZXF1ZXN0Li4uXG4gKiAgIGN0eC5sb2coJ0NPTVBMRVRFRCcsICdSZXF1ZXN0IHByb2Nlc3NlZCBzdWNjZXNzZnVsbHknKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgcmVxOiBSZXF1ZXN0LFxuICBzc2VNYW5hZ2VyOiBTU0VNYW5hZ2VyLFxuKTogUmVxdWVzdENvbnRleHQge1xuICBjb25zdCBpZGVudGl0eSA9IGdldElkZW50aXR5KHJlcSBhcyBIdHRwUmVxdWVzdCk7XG4gIC8vIFByZWZlciB0aGUgYWxyZWFkeS1wYXJzZWQgcmVxdWVzdElkIGZyb20gYXBwLWZhY3RvcnkgbWlkZGxld2FyZSxcbiAgLy8gZmFsbCBiYWNrIHRvIGlkZW50aXR5IGhlYWRlciwgdGhlbiBnZW5lcmF0ZSBhIG5ldyBvbmUuXG4gIGNvbnN0IHJlcXVlc3RJZCA9IHJlcS5yZXF1ZXN0SWQgfHwgaWRlbnRpdHkucmVxdWVzdElkIHx8IHV1aWQoKTtcblxuICAvLyBDcmVhdGUgbG9nZ2VyIHRoYXQgb3V0cHV0cyB0byBXaW5zdG9uIGFuZCBTU0VcbiAgY29uc3QgbG9nOiBSZXF1ZXN0TG9nZ2VyID0gKHR5cGUsIG1lc3NhZ2UsIGRhdGEpID0+IHtcbiAgICBjb25zdCBtZXRhID0geyByZXF1ZXN0SWQsIG9yZ0lkOiBpZGVudGl0eS5vcmdJZCwgdHlwZSwgZGF0YSB9O1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRVJST1InOlxuICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnV0FSTic6XG4gICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UsIG1ldGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2UsIG1ldGEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgc3NlTWFuYWdlci5zZW5kKHJlcXVlc3RJZCwgdHlwZSwgbWVzc2FnZSwgZGF0YSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0SWQsXG4gICAgaWRlbnRpdHksXG4gICAgbG9nLFxuICB9O1xufVxuIl19
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const api_core_1 = require("@pipeline-builder/api-core");
|
|
7
|
-
const get_context_1 = require("./get-context");
|
|
3
|
+
import { ErrorCode, sendError } from '@pipeline-builder/api-core';
|
|
4
|
+
import { getContext } from './get-context.js';
|
|
8
5
|
/**
|
|
9
6
|
* Create middleware that validates the request has an orgId in the identity headers.
|
|
10
7
|
*
|
|
@@ -17,15 +14,15 @@ const get_context_1 = require("./get-context");
|
|
|
17
14
|
* app.get('/pipelines', requireAuth, requireOrgId(), handler);
|
|
18
15
|
* ```
|
|
19
16
|
*/
|
|
20
|
-
function requireOrgId() {
|
|
17
|
+
export function requireOrgId() {
|
|
21
18
|
return (req, res, next) => {
|
|
22
|
-
const ctx =
|
|
19
|
+
const ctx = getContext(req);
|
|
23
20
|
if (!ctx.identity.orgId) {
|
|
24
21
|
ctx.log('ERROR', 'Organization ID is missing from request headers');
|
|
25
|
-
|
|
22
|
+
sendError(res, 400, 'Organization ID is required. Please provide x-org-id header.', ErrorCode.VALIDATION_ERROR);
|
|
26
23
|
return;
|
|
27
24
|
}
|
|
28
25
|
next();
|
|
29
26
|
};
|
|
30
27
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS1vcmctaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JlcXVpcmUtb3JnLWlkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsWUFBWTtJQUMxQixPQUFPLENBQUMsR0FBWSxFQUFFLEdBQWEsRUFBRSxJQUFrQixFQUFRLEVBQUU7UUFDL0QsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGlEQUFpRCxDQUFDLENBQUM7WUFDcEUsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsOERBQThELEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDaEgsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBzZW5kRXJyb3IgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGdldENvbnRleHQgfSBmcm9tICcuL2dldC1jb250ZXh0LmpzJztcblxuLyoqXG4gKiBDcmVhdGUgbWlkZGxld2FyZSB0aGF0IHZhbGlkYXRlcyB0aGUgcmVxdWVzdCBoYXMgYW4gb3JnSWQgaW4gdGhlIGlkZW50aXR5IGhlYWRlcnMuXG4gKlxuICogQHJldHVybnMgRXhwcmVzcyBtaWRkbGV3YXJlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqXG4gKiBhcHAuZ2V0KCcvcGlwZWxpbmVzJywgcmVxdWlyZUF1dGgsIHJlcXVpcmVPcmdJZCgpLCBoYW5kbGVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZU9yZ0lkKCkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgY29uc3QgY3R4ID0gZ2V0Q29udGV4dChyZXEpO1xuXG4gICAgaWYgKCFjdHguaWRlbnRpdHkub3JnSWQpIHtcbiAgICAgIGN0eC5sb2coJ0VSUk9SJywgJ09yZ2FuaXphdGlvbiBJRCBpcyBtaXNzaW5nIGZyb20gcmVxdWVzdCBoZWFkZXJzJyk7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDAsICdPcmdhbml6YXRpb24gSUQgaXMgcmVxdWlyZWQuIFBsZWFzZSBwcm92aWRlIHgtb3JnLWlkIGhlYWRlci4nLCBFcnJvckNvZGUuVkFMSURBVElPTl9FUlJPUik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuIl19
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Request, Response, RequestHandler } from 'express';
|
|
2
|
-
import type { RequestContext } from './request-types';
|
|
2
|
+
import type { RequestContext } from './request-types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Context object passed to every route handler wrapped with `withRoute()`.
|
|
5
5
|
*/
|
package/lib/api/route-wrapper.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const get_context_1 = require("./get-context");
|
|
8
|
-
const logger = (0, api_core_1.createLogger)('route-wrapper');
|
|
3
|
+
import { AppError, errorMessage, sendError, sendBadRequest, sendInternalError, createLogger, } from '@pipeline-builder/api-core';
|
|
4
|
+
import { getContext } from './get-context.js';
|
|
5
|
+
const logger = createLogger('route-wrapper');
|
|
9
6
|
/**
|
|
10
7
|
* Wrap an async route handler with standard boilerplate.
|
|
11
8
|
*
|
|
@@ -27,14 +24,14 @@ const logger = (0, api_core_1.createLogger)('route-wrapper');
|
|
|
27
24
|
* }));
|
|
28
25
|
* ```
|
|
29
26
|
*/
|
|
30
|
-
function withRoute(handler, options = {}) {
|
|
27
|
+
export function withRoute(handler, options = {}) {
|
|
31
28
|
const { requireOrgId = true } = options;
|
|
32
29
|
return async (req, res) => {
|
|
33
|
-
const ctx =
|
|
30
|
+
const ctx = getContext(req);
|
|
34
31
|
const orgId = ctx.identity.orgId?.toLowerCase() || '';
|
|
35
32
|
const userId = ctx.identity.userId || '';
|
|
36
33
|
if (requireOrgId && !orgId) {
|
|
37
|
-
return
|
|
34
|
+
return sendBadRequest(res, 'Organization ID is required');
|
|
38
35
|
}
|
|
39
36
|
try {
|
|
40
37
|
await handler({ req, res, ctx, orgId, userId });
|
|
@@ -44,19 +41,19 @@ function withRoute(handler, options = {}) {
|
|
|
44
41
|
if (res.headersSent) {
|
|
45
42
|
logger.error('Route handler error after response sent', {
|
|
46
43
|
requestId: ctx.requestId,
|
|
47
|
-
error:
|
|
44
|
+
error: errorMessage(error),
|
|
48
45
|
});
|
|
49
46
|
return;
|
|
50
47
|
}
|
|
51
|
-
if (error instanceof
|
|
48
|
+
if (error instanceof AppError) {
|
|
52
49
|
const status = error.statusCode >= 400 && error.statusCode < 600
|
|
53
50
|
? error.statusCode
|
|
54
51
|
: 500;
|
|
55
|
-
return
|
|
52
|
+
return sendError(res, status, error.message, error.code);
|
|
56
53
|
}
|
|
57
|
-
ctx.log('ERROR', 'Request failed', { error:
|
|
58
|
-
return
|
|
54
|
+
ctx.log('ERROR', 'Request failed', { error: errorMessage(error) });
|
|
55
|
+
return sendInternalError(res, errorMessage(error));
|
|
59
56
|
}
|
|
60
57
|
};
|
|
61
58
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcm91dGUtd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFlBQVksR0FDYixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5QyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLE9BQTRDLEVBQzVDLFVBQTRCLEVBQUU7SUFFOUIsTUFBTSxFQUFFLFlBQVksR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFeEMsT0FBTyxLQUFLLEVBQUUsR0FBWSxFQUFFLEdBQWEsRUFBRSxFQUFFO1FBQzNDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRXpDLElBQUksWUFBWSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDM0IsT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixzREFBc0Q7WUFDdEQsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUU7b0JBQ3RELFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUztvQkFDeEIsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksS0FBSyxZQUFZLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUc7b0JBQzlELENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVTtvQkFDbEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDUixPQUFPLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFFRCxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLE9BQU8saUJBQWlCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7XG4gIEFwcEVycm9yLFxuICBlcnJvck1lc3NhZ2UsXG4gIHNlbmRFcnJvcixcbiAgc2VuZEJhZFJlcXVlc3QsXG4gIHNlbmRJbnRlcm5hbEVycm9yLFxuICBjcmVhdGVMb2dnZXIsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBnZXRDb250ZXh0IH0gZnJvbSAnLi9nZXQtY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnLi9yZXF1ZXN0LXR5cGVzLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyb3V0ZS13cmFwcGVyJyk7XG5cbi8qKlxuICogQ29udGV4dCBvYmplY3QgcGFzc2VkIHRvIGV2ZXJ5IHJvdXRlIGhhbmRsZXIgd3JhcHBlZCB3aXRoIGB3aXRoUm91dGUoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVDb250ZXh0IHtcbiAgLyoqIE9yaWdpbmFsIEV4cHJlc3MgcmVxdWVzdCAqL1xuICByZXE6IFJlcXVlc3Q7XG4gIC8qKiBPcmlnaW5hbCBFeHByZXNzIHJlc3BvbnNlICovXG4gIHJlczogUmVzcG9uc2U7XG4gIC8qKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSBhbmQgbG9nZ2luZyAqL1xuICBjdHg6IFJlcXVlc3RDb250ZXh0O1xuICAvKiogTG93ZXJjYXNlZCBvcmdhbml6YXRpb24gSUQgKGd1YXJhbnRlZWQgbm9uLWVtcHR5IHdoZW4gcmVxdWlyZU9yZ0lkIGlzIHRydWUpICovXG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBVc2VyIElEIGZyb20gSldUIChkZWZhdWx0cyB0byBlbXB0eSBzdHJpbmcpICovXG4gIHVzZXJJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGB3aXRoUm91dGUoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFJvdXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgb3JnSWQgb24gdGhlIHJlcXVlc3QuXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHJldHVybnMgNDAwIGlmIG9yZ0lkIGlzIG1pc3NpbmcuXG4gICAqIFNldCB0byBmYWxzZSBmb3Igcm91dGVzIHRoYXQgZG9uJ3QgbmVlZCBvcmcgY29udGV4dC5cbiAgICovXG4gIHJlcXVpcmVPcmdJZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV3JhcCBhbiBhc3luYyByb3V0ZSBoYW5kbGVyIHdpdGggc3RhbmRhcmQgYm9pbGVycGxhdGUuXG4gKlxuICogRXh0cmFjdHMgY29udGV4dCwgb3JnSWQsIHVzZXJJZCBmcm9tIHRoZSByZXF1ZXN0LCB2YWxpZGF0ZXMgb3JnSWQsXG4gKiBhbmQgY2F0Y2hlcyBlcnJvcnMuIFR5cGVkIGBBcHBFcnJvcmAgc3ViY2xhc3NlcyBhcmUgYXV0b21hdGljYWxseVxuICogbWFwcGVkIHRvIHRoZSBjb3JyZWN0IEhUVFAgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBBc3luYyBmdW5jdGlvbiByZWNlaXZpbmcgYSBSb3V0ZUNvbnRleHRcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBFeHByZXNzIFJlcXVlc3RIYW5kbGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHJvdXRlci5nZXQoJy86aWQnLCB3aXRoUm91dGUoYXN5bmMgKHsgcmVxLCByZXMsIGN0eCwgb3JnSWQgfSkgPT4ge1xuICogICBjb25zdCBpZCA9IGdldFBhcmFtKHJlcS5wYXJhbXMsICdpZCcpO1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBwaXBlbGluZVNlcnZpY2UuZmluZEJ5SWQoaWQsIG9yZ0lkKTtcbiAqICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdQaXBlbGluZSBub3QgZm91bmQnKTtcbiAqICAgcmV0dXJuIHNlbmRTdWNjZXNzKHJlcywgMjAwLCB7IHBpcGVsaW5lOiByZXN1bHQgfSk7XG4gKiB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSb3V0ZShcbiAgaGFuZGxlcjogKHJjOiBSb3V0ZUNvbnRleHQpID0+IFByb21pc2U8dm9pZD4sXG4gIG9wdGlvbnM6IFdpdGhSb3V0ZU9wdGlvbnMgPSB7fSxcbik6IFJlcXVlc3RIYW5kbGVyIHtcbiAgY29uc3QgeyByZXF1aXJlT3JnSWQgPSB0cnVlIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgY3R4ID0gZ2V0Q29udGV4dChyZXEpO1xuICAgIGNvbnN0IG9yZ0lkID0gY3R4LmlkZW50aXR5Lm9yZ0lkPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGNvbnN0IHVzZXJJZCA9IGN0eC5pZGVudGl0eS51c2VySWQgfHwgJyc7XG5cbiAgICBpZiAocmVxdWlyZU9yZ0lkICYmICFvcmdJZCkge1xuICAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KHJlcywgJ09yZ2FuaXphdGlvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBoYW5kbGVyKHsgcmVxLCByZXMsIGN0eCwgb3JnSWQsIHVzZXJJZCB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG9uJ3Qgc2VuZCBhbm90aGVyIHJlc3BvbnNlIGlmIG9uZSB3YXMgYWxyZWFkeSBzZW50XG4gICAgICBpZiAocmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignUm91dGUgaGFuZGxlciBlcnJvciBhZnRlciByZXNwb25zZSBzZW50Jywge1xuICAgICAgICAgIHJlcXVlc3RJZDogY3R4LnJlcXVlc3RJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBwRXJyb3IpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZXJyb3Iuc3RhdHVzQ29kZSA+PSA0MDAgJiYgZXJyb3Iuc3RhdHVzQ29kZSA8IDYwMFxuICAgICAgICAgID8gZXJyb3Iuc3RhdHVzQ29kZVxuICAgICAgICAgIDogNTAwO1xuICAgICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgc3RhdHVzLCBlcnJvci5tZXNzYWdlLCBlcnJvci5jb2RlKTtcbiAgICAgIH1cblxuICAgICAgY3R4LmxvZygnRVJST1InLCAnUmVxdWVzdCBmYWlsZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0pO1xuICAgICAgcmV0dXJuIHNlbmRJbnRlcm5hbEVycm9yKHJlcywgZXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9O1xufVxuIl19
|
package/lib/api/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Server } from 'http';
|
|
2
|
-
import { Express } from 'express';
|
|
3
|
-
import { SSEManager } from '../http/sse-connection-manager';
|
|
2
|
+
import type { Express } from 'express';
|
|
3
|
+
import { SSEManager } from '../http/sse-connection-manager.js';
|
|
4
4
|
/**
|
|
5
5
|
* Options for starting a server
|
|
6
6
|
*/
|
package/lib/api/server.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const logger = (0, api_core_1.createLogger)('server');
|
|
3
|
+
import { Server } from 'http';
|
|
4
|
+
import { createLogger, installCrashHandlers } from '@pipeline-builder/api-core';
|
|
5
|
+
import { Config, getConnection, closeConnection } from '@pipeline-builder/pipeline-core';
|
|
6
|
+
import { shutdownTracing } from './tracing.js';
|
|
7
|
+
import { SSEManager } from '../http/sse-connection-manager.js';
|
|
8
|
+
const logger = createLogger('server');
|
|
11
9
|
/**
|
|
12
10
|
* Start an Express server with graceful shutdown handling
|
|
13
11
|
*
|
|
@@ -34,12 +32,12 @@ const logger = (0, api_core_1.createLogger)('server');
|
|
|
34
32
|
* });
|
|
35
33
|
* ```
|
|
36
34
|
*/
|
|
37
|
-
async function startServer(app, options = {}) {
|
|
38
|
-
const serverConfig =
|
|
35
|
+
export async function startServer(app, options = {}) {
|
|
36
|
+
const serverConfig = Config.get('server');
|
|
39
37
|
const { name = 'Microservice', sseManager, shutdownTimeoutMs = 15000, onStart, onShutdown, onBeforeStart, testDatabase, closeDatabase, } = options;
|
|
40
38
|
const port = options.port ?? serverConfig.port;
|
|
41
39
|
// Validate auth configuration at server startup (not during CDK synthesis)
|
|
42
|
-
|
|
40
|
+
Config.validateAuth();
|
|
43
41
|
logger.info(`Starting ${name}...`);
|
|
44
42
|
// Pre-start hook (e.g., initialize external connections)
|
|
45
43
|
if (onBeforeStart) {
|
|
@@ -49,7 +47,7 @@ async function startServer(app, options = {}) {
|
|
|
49
47
|
if (testDatabase !== false) {
|
|
50
48
|
const dbHealthy = testDatabase
|
|
51
49
|
? await testDatabase()
|
|
52
|
-
: await
|
|
50
|
+
: await getConnection().testConnection();
|
|
53
51
|
if (!dbHealthy) {
|
|
54
52
|
throw new Error('Database connection failed');
|
|
55
53
|
}
|
|
@@ -88,7 +86,7 @@ async function startServer(app, options = {}) {
|
|
|
88
86
|
server.close(async () => {
|
|
89
87
|
logger.info('HTTP server closed');
|
|
90
88
|
// Shutdown OpenTelemetry tracing
|
|
91
|
-
await
|
|
89
|
+
await shutdownTracing().catch(err => logger.error('Error shutting down tracing', { error: err }));
|
|
92
90
|
// Close database connection
|
|
93
91
|
if (closeDatabase !== false) {
|
|
94
92
|
try {
|
|
@@ -96,7 +94,7 @@ async function startServer(app, options = {}) {
|
|
|
96
94
|
await closeDatabase();
|
|
97
95
|
}
|
|
98
96
|
else {
|
|
99
|
-
await
|
|
97
|
+
await closeConnection();
|
|
100
98
|
}
|
|
101
99
|
logger.info('Database connection closed');
|
|
102
100
|
}
|
|
@@ -135,14 +133,14 @@ async function startServer(app, options = {}) {
|
|
|
135
133
|
* void runServer(app, { name: 'My Service', sseManager });
|
|
136
134
|
* ```
|
|
137
135
|
*/
|
|
138
|
-
function runServer(app, options = {}) {
|
|
136
|
+
export function runServer(app, options = {}) {
|
|
139
137
|
// Last-resort fault handlers for the production entrypoint: an unhandled
|
|
140
138
|
// rejection / uncaught exception is logged (not silently fatal) then the
|
|
141
139
|
// process exits for the orchestrator to restart. No-op under NODE_ENV=test.
|
|
142
|
-
|
|
140
|
+
installCrashHandlers(logger);
|
|
143
141
|
startServer(app, options).catch((error) => {
|
|
144
142
|
logger.error('Failed to start server', { error });
|
|
145
143
|
process.exit(1);
|
|
146
144
|
});
|
|
147
145
|
}
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBeUV0QyxrQ0FnSEM7QUFnQkQsOEJBU0M7QUEvTUQseURBQWdGO0FBQ2hGLG1FQUF5RjtBQUV6Rix1Q0FBNEM7QUFHNUMsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBWSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0FBc0N0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNJLEtBQUssVUFBVSxXQUFXLENBQy9CLEdBQVksRUFDWixVQUE4QixFQUFFO0lBRWhDLE1BQU0sWUFBWSxHQUFHLHNCQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFDSixJQUFJLEdBQUcsY0FBYyxFQUNyQixVQUFVLEVBQ1YsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixPQUFPLEVBQ1AsVUFBVSxFQUNWLGFBQWEsRUFDYixZQUFZLEVBQ1osYUFBYSxHQUNkLEdBQUcsT0FBTyxDQUFDO0lBQ1osTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDO0lBRS9DLDJFQUEyRTtJQUMzRSxzQkFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBRW5DLHlEQUF5RDtJQUN6RCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sYUFBYSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBRyxZQUFZO1lBQzVCLENBQUMsQ0FBQyxNQUFNLFlBQVksRUFBRTtZQUN0QixDQUFDLENBQUMsTUFBTSxJQUFBLDZCQUFhLEdB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Q0FBQztJQUVGLDJCQUEyQjtJQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFeEQsT0FBTztRQUNMLE1BQU07UUFDTixJQUFJO1FBQ0osUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUMzQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixTQUFTLENBQUMsR0FBWSxFQUFFLFVBQThCLEVBQUU7SUFDdEUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsSUFBQSwrQkFBb0IsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBpbnN0YWxsQ3Jhc2hIYW5kbGVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZywgZ2V0Q29ubmVjdGlvbiwgY2xvc2VDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgeyBFeHByZXNzIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBzaHV0ZG93blRyYWNpbmcgfSBmcm9tICcuL3RyYWNpbmcnO1xuaW1wb3J0IHsgU1NFTWFuYWdlciB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlcic7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc2VydmVyJyk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlck9wdGlvbnMge1xuICAvKiogU2VydmljZSBuYW1lIGZvciBsb2dnaW5nICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBQb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdDogZnJvbSBjb25maWcpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBTU0UgbWFuYWdlciBmb3IgZ3JhY2VmdWwgc2h1dGRvd24gKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBTaHV0ZG93biB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogMTUwMDApICovXG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogQ2FsbGJhY2sgYWZ0ZXIgc2VydmVyIHN0YXJ0cyAqL1xuICBvblN0YXJ0PzogKHBvcnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIGJlZm9yZSBzaHV0ZG93biAqL1xuICBvblNodXRkb3duPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1bnMgYmVmb3JlIGRhdGFiYXNlIGNoZWNrIChlLmcuLCBpbml0aWFsaXplIGV4dGVybmFsIGNvbm5lY3Rpb25zKSAqL1xuICBvbkJlZm9yZVN0YXJ0PzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEN1c3RvbSBkYXRhYmFzZSBoZWFsdGggY2hlY2ssIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgdGVzdENvbm5lY3Rpb24gKi9cbiAgdGVzdERhdGFiYXNlPzogKCgpID0+IFByb21pc2U8Ym9vbGVhbj4pIHwgZmFsc2U7XG4gIC8qKiBDdXN0b20gZGF0YWJhc2UgY2xvc2UsIG9yIGZhbHNlIHRvIHNraXAuIERlZmF1bHQ6IFBvc3RncmVTUUwgY2xvc2VDb25uZWN0aW9uICovXG4gIGNsb3NlRGF0YWJhc2U/OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgYSBzZXJ2ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydFNlcnZlclJlc3VsdCB7XG4gIC8qKiBIVFRQIHNlcnZlciBpbnN0YW5jZSAqL1xuICBzZXJ2ZXI6IFNlcnZlcjtcbiAgLyoqIFBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24gKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogRnVuY3Rpb24gdG8gbWFudWFsbHkgdHJpZ2dlciBzaHV0ZG93biAqL1xuICBzaHV0ZG93bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBTdGFydCBhbiBFeHByZXNzIHNlcnZlciB3aXRoIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsaW5nXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBkYXRhYmFzZSBjb25uZWN0aW9uIHRlc3RpbmdcbiAqIC0gR3JhY2VmdWwgc2h1dGRvd24gb24gU0lHSU5UL1NJR1RFUk1cbiAqIC0gU1NFIGNvbm5lY3Rpb24gY2xlYW51cFxuICogLSBDb25maWd1cmFibGUgc2h1dGRvd24gdGltZW91dFxuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKiBAcmV0dXJucyBTZXJ2ZXIgaW5zdGFuY2UgYW5kIGNvbnRyb2wgZnVuY3Rpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqXG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBoYW5kbGVyKTtcbiAqXG4gKiBhd2FpdCBzdGFydFNlcnZlcihhcHAsIHtcbiAqICAgbmFtZTogJ015IE1pY3Jvc2VydmljZScsXG4gKiAgIHNzZU1hbmFnZXIsXG4gKiAgIG9uU3RhcnQ6IChwb3J0KSA9PiBjb25zb2xlLmxvZyhgTGlzdGVuaW5nIG9uICR7cG9ydH1gKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcihcbiAgYXBwOiBFeHByZXNzLFxuICBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8U3RhcnRTZXJ2ZXJSZXN1bHQ+IHtcbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IHtcbiAgICBuYW1lID0gJ01pY3Jvc2VydmljZScsXG4gICAgc3NlTWFuYWdlcixcbiAgICBzaHV0ZG93blRpbWVvdXRNcyA9IDE1MDAwLFxuICAgIG9uU3RhcnQsXG4gICAgb25TaHV0ZG93bixcbiAgICBvbkJlZm9yZVN0YXJ0LFxuICAgIHRlc3REYXRhYmFzZSxcbiAgICBjbG9zZURhdGFiYXNlLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBzZXJ2ZXJDb25maWcucG9ydDtcblxuICAvLyBWYWxpZGF0ZSBhdXRoIGNvbmZpZ3VyYXRpb24gYXQgc2VydmVyIHN0YXJ0dXAgKG5vdCBkdXJpbmcgQ0RLIHN5bnRoZXNpcylcbiAgQ29uZmlnLnZhbGlkYXRlQXV0aCgpO1xuXG4gIGxvZ2dlci5pbmZvKGBTdGFydGluZyAke25hbWV9Li4uYCk7XG5cbiAgLy8gUHJlLXN0YXJ0IGhvb2sgKGUuZy4sIGluaXRpYWxpemUgZXh0ZXJuYWwgY29ubmVjdGlvbnMpXG4gIGlmIChvbkJlZm9yZVN0YXJ0KSB7XG4gICAgYXdhaXQgb25CZWZvcmVTdGFydCgpO1xuICB9XG5cbiAgLy8gVGVzdCBkYXRhYmFzZSBjb25uZWN0aW9uXG4gIGlmICh0ZXN0RGF0YWJhc2UgIT09IGZhbHNlKSB7XG4gICAgY29uc3QgZGJIZWFsdGh5ID0gdGVzdERhdGFiYXNlXG4gICAgICA/IGF3YWl0IHRlc3REYXRhYmFzZSgpXG4gICAgICA6IGF3YWl0IGdldENvbm5lY3Rpb24oKS50ZXN0Q29ubmVjdGlvbigpO1xuXG4gICAgaWYgKCFkYkhlYWx0aHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YWJhc2UgY29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCcpO1xuICB9XG5cbiAgLy8gU3RhcnQgc2VydmVyXG4gIGNvbnN0IHNlcnZlciA9IGFwcC5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKGAke25hbWV9IGxpc3RlbmluZyBvbiBwb3J0OiAke3BvcnR9YCk7XG4gICAgbG9nZ2VyLmluZm8oYFBsYXRmb3JtIFVSTDogJHtzZXJ2ZXJDb25maWcucGxhdGZvcm1Vcmx9YCk7XG4gICAgb25TdGFydD8uKHBvcnQpO1xuICB9KTtcblxuICAvLyBTaHV0ZG93biBoYW5kbGVyIChndWFyZGVkIGFnYWluc3QgY29uY3VycmVudCBzaWduYWxzKVxuICBsZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG4gIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKHNpZ25hbD86IHN0cmluZykgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuXG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgbG9nZ2VyLmluZm8oYCR7c2lnbmFsfSByZWNlaXZlZCwgc2h1dHRpbmcgZG93biBncmFjZWZ1bGx5Li4uYCk7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIHNodXRkb3duIGNhbGxiYWNrXG4gICAgaWYgKG9uU2h1dGRvd24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG9uU2h1dGRvd24oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gb25TaHV0ZG93biBjYWxsYmFjaycsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgU1NFIGNvbm5lY3Rpb25zXG4gICAgaWYgKHNzZU1hbmFnZXIpIHtcbiAgICAgIHNzZU1hbmFnZXIuc2h1dGRvd24oKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdTU0UgY29ubmVjdGlvbnMgY2xvc2VkJyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgSFRUUCBzZXJ2ZXJcbiAgICBzZXJ2ZXIuY2xvc2UoYXN5bmMgKCkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oJ0hUVFAgc2VydmVyIGNsb3NlZCcpO1xuXG4gICAgICAvLyBTaHV0ZG93biBPcGVuVGVsZW1ldHJ5IHRyYWNpbmdcbiAgICAgIGF3YWl0IHNodXRkb3duVHJhY2luZygpLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ0Vycm9yIHNodXR0aW5nIGRvd24gdHJhY2luZycsIHsgZXJyb3I6IGVyciB9KSk7XG5cbiAgICAgIC8vIENsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICAgIGlmIChjbG9zZURhdGFiYXNlICE9PSBmYWxzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChjbG9zZURhdGFiYXNlKSB7XG4gICAgICAgICAgICBhd2FpdCBjbG9zZURhdGFiYXNlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNsb3NpbmcgZGF0YWJhc2UnLCB7IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9KTtcblxuICAgIC8vIEZvcmNlIHNodXRkb3duIGFmdGVyIHRpbWVvdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcignRm9yY2VkIHNodXRkb3duIGFmdGVyIHRpbWVvdXQnKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9LCBzaHV0ZG93blRpbWVvdXRNcykudW5yZWYoKTtcbiAgfTtcblxuICAvLyBSZWdpc3RlciBzaWduYWwgaGFuZGxlcnNcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCAoKSA9PiB2b2lkIHNodXRkb3duKCdTSUdJTlQnKSk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR1RFUk0nKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXJ2ZXIsXG4gICAgcG9ydCxcbiAgICBzaHV0ZG93bjogKCkgPT4gc2h1dGRvd24oKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgc2VydmVyIHN0YXJ0IHdyYXBwZXIgd2l0aCBlcnJvciBoYW5kbGluZ1xuICpcbiAqIEBwYXJhbSBhcHAgLSBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNlcnZlciBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHsgYXBwLCBzc2VNYW5hZ2VyIH0gPSBjcmVhdGVBcHAoKTtcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgaGFuZGxlcik7XG4gKlxuICogdm9pZCBydW5TZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJywgc3NlTWFuYWdlciB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2VydmVyKGFwcDogRXhwcmVzcywgb3B0aW9uczogU3RhcnRTZXJ2ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgLy8gTGFzdC1yZXNvcnQgZmF1bHQgaGFuZGxlcnMgZm9yIHRoZSBwcm9kdWN0aW9uIGVudHJ5cG9pbnQ6IGFuIHVuaGFuZGxlZFxuICAvLyByZWplY3Rpb24gLyB1bmNhdWdodCBleGNlcHRpb24gaXMgbG9nZ2VkIChub3Qgc2lsZW50bHkgZmF0YWwpIHRoZW4gdGhlXG4gIC8vIHByb2Nlc3MgZXhpdHMgZm9yIHRoZSBvcmNoZXN0cmF0b3IgdG8gcmVzdGFydC4gTm8tb3AgdW5kZXIgTk9ERV9FTlY9dGVzdC5cbiAgaW5zdGFsbENyYXNoSGFuZGxlcnMobG9nZ2VyKTtcbiAgc3RhcnRTZXJ2ZXIoYXBwLCBvcHRpb25zKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBzZXJ2ZXInLCB7IGVycm9yIH0pO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG4iXX0=
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFzQ3RDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLEdBQVksRUFDWixVQUE4QixFQUFFO0lBRWhDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsTUFBTSxFQUNKLElBQUksR0FBRyxjQUFjLEVBQ3JCLFVBQVUsRUFDVixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFlBQVksRUFDWixhQUFhLEdBQ2QsR0FBRyxPQUFPLENBQUM7SUFDWixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFFL0MsMkVBQTJFO0lBQzNFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV0QixNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsQ0FBQztJQUVuQyx5REFBeUQ7SUFDekQsSUFBSSxhQUFhLEVBQUUsQ0FB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QVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoQyxDQUFDLENBQUM7SUFFRiwyQkFBMkI7SUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhELE9BQU87UUFDTCxNQUFNO1FBQ04sSUFBSTtRQUNKLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFZLEVBQUUsVUFBOEIsRUFBRTtJQUN0RSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBpbnN0YWxsQ3Jhc2hIYW5kbGVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IENvbmZpZywgZ2V0Q29ubmVjdGlvbiwgY2xvc2VDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IEV4cHJlc3MgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IHNodXRkb3duVHJhY2luZyB9IGZyb20gJy4vdHJhY2luZy5qcyc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyIH0gZnJvbSAnLi4vaHR0cC9zc2UtY29ubmVjdGlvbi1tYW5hZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzZXJ2ZXInKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHNlcnZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0U2VydmVyT3B0aW9ucyB7XG4gIC8qKiBTZXJ2aWNlIG5hbWUgZm9yIGxvZ2dpbmcgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIFBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0OiBmcm9tIGNvbmZpZykgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFNTRSBtYW5hZ2VyIGZvciBncmFjZWZ1bCBzaHV0ZG93biAqL1xuICBzc2VNYW5hZ2VyPzogU1NFTWFuYWdlcjtcbiAgLyoqIFNodXRkb3duIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiAxNTAwMCkgKi9cbiAgc2h1dGRvd25UaW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKiBDYWxsYmFjayBhZnRlciBzZXJ2ZXIgc3RhcnRzICovXG4gIG9uU3RhcnQ/OiAocG9ydDogbnVtYmVyKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgYmVmb3JlIHNodXRkb3duICovXG4gIG9uU2h1dGRvd24/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUnVucyBiZWZvcmUgZGF0YWJhc2UgY2hlY2sgKGUuZy4sIGluaXRpYWxpemUgZXh0ZXJuYWwgY29ubmVjdGlvbnMpICovXG4gIG9uQmVmb3JlU3RhcnQ/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogQ3VzdG9tIGRhdGFiYXNlIGhlYWx0aCBjaGVjaywgb3IgZmFsc2UgdG8gc2tpcC4gRGVmYXVsdDogUG9zdGdyZVNRTCB0ZXN0Q29ubmVjdGlvbiAqL1xuICB0ZXN0RGF0YWJhc2U/OiAoKCkgPT4gUHJvbWlzZTxib29sZWFuPikgfCBmYWxzZTtcbiAgLyoqIEN1c3RvbSBkYXRhYmFzZSBjbG9zZSwgb3IgZmFsc2UgdG8gc2tpcC4gRGVmYXVsdDogUG9zdGdyZVNRTCBjbG9zZUNvbm5lY3Rpb24gKi9cbiAgY2xvc2VEYXRhYmFzZT86ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzdGFydGluZyBhIHNlcnZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0U2VydmVyUmVzdWx0IHtcbiAgLyoqIEhUVFAgc2VydmVyIGluc3RhbmNlICovXG4gIHNlcnZlcjogU2VydmVyO1xuICAvKiogUG9ydCB0aGUgc2VydmVyIGlzIGxpc3RlbmluZyBvbiAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBGdW5jdGlvbiB0byBtYW51YWxseSB0cmlnZ2VyIHNodXRkb3duICovXG4gIHNodXRkb3duOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFN0YXJ0IGFuIEV4cHJlc3Mgc2VydmVyIHdpdGggZ3JhY2VmdWwgc2h1dGRvd24gaGFuZGxpbmdcbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gQXV0b21hdGljIGRhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdGluZ1xuICogLSBHcmFjZWZ1bCBzaHV0ZG93biBvbiBTSUdJTlQvU0lHVEVSTVxuICogLSBTU0UgY29ubmVjdGlvbiBjbGVhbnVwXG4gKiAtIENvbmZpZ3VyYWJsZSBzaHV0ZG93biB0aW1lb3V0XG4gKlxuICogQHBhcmFtIGFwcCAtIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIG9wdGlvbnNcbiAqIEByZXR1cm5zIFNlcnZlciBpbnN0YW5jZSBhbmQgY29udHJvbCBmdW5jdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICpcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGhhbmRsZXIpO1xuICpcbiAqIGF3YWl0IHN0YXJ0U2VydmVyKGFwcCwge1xuICogICBuYW1lOiAnTXkgTWljcm9zZXJ2aWNlJyxcbiAqICAgc3NlTWFuYWdlcixcbiAqICAgb25TdGFydDogKHBvcnQpID0+IGNvbnNvbGUubG9nKGBMaXN0ZW5pbmcgb24gJHtwb3J0fWApLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0U2VydmVyKFxuICBhcHA6IEV4cHJlc3MsXG4gIG9wdGlvbnM6IFN0YXJ0U2VydmVyT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxTdGFydFNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBzZXJ2ZXJDb25maWcgPSBDb25maWcuZ2V0KCdzZXJ2ZXInKTtcbiAgY29uc3Qge1xuICAgIG5hbWUgPSAnTWljcm9zZXJ2aWNlJyxcbiAgICBzc2VNYW5hZ2VyLFxuICAgIHNodXRkb3duVGltZW91dE1zID0gMTUwMDAsXG4gICAgb25TdGFydCxcbiAgICBvblNodXRkb3duLFxuICAgIG9uQmVmb3JlU3RhcnQsXG4gICAgdGVzdERhdGFiYXNlLFxuICAgIGNsb3NlRGF0YWJhc2UsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0ID8/IHNlcnZlckNvbmZpZy5wb3J0O1xuXG4gIC8vIFZhbGlkYXRlIGF1dGggY29uZmlndXJhdGlvbiBhdCBzZXJ2ZXIgc3RhcnR1cCAobm90IGR1cmluZyBDREsgc3ludGhlc2lzKVxuICBDb25maWcudmFsaWRhdGVBdXRoKCk7XG5cbiAgbG9nZ2VyLmluZm8oYFN0YXJ0aW5nICR7bmFtZX0uLi5gKTtcblxuICAvLyBQcmUtc3RhcnQgaG9vayAoZS5nLiwgaW5pdGlhbGl6ZSBleHRlcm5hbCBjb25uZWN0aW9ucylcbiAgaWYgKG9uQmVmb3JlU3RhcnQpIHtcbiAgICBhd2FpdCBvbkJlZm9yZVN0YXJ0KCk7XG4gIH1cblxuICAvLyBUZXN0IGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgaWYgKHRlc3REYXRhYmFzZSAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBkYkhlYWx0aHkgPSB0ZXN0RGF0YWJhc2VcbiAgICAgID8gYXdhaXQgdGVzdERhdGFiYXNlKClcbiAgICAgIDogYXdhaXQgZ2V0Q29ubmVjdGlvbigpLnRlc3RDb25uZWN0aW9uKCk7XG5cbiAgICBpZiAoIWRiSGVhbHRoeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhYmFzZSBjb25uZWN0aW9uIGZhaWxlZCcpO1xuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIGVzdGFibGlzaGVkJyk7XG4gIH1cblxuICAvLyBTdGFydCBzZXJ2ZXJcbiAgY29uc3Qgc2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oYCR7bmFtZX0gbGlzdGVuaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICBsb2dnZXIuaW5mbyhgUGxhdGZvcm0gVVJMOiAke3NlcnZlckNvbmZpZy5wbGF0Zm9ybVVybH1gKTtcbiAgICBvblN0YXJ0Py4ocG9ydCk7XG4gIH0pO1xuXG4gIC8vIFNodXRkb3duIGhhbmRsZXIgKGd1YXJkZWQgYWdhaW5zdCBjb25jdXJyZW50IHNpZ25hbHMpXG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoc2lnbmFsPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG5cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgJHtzaWduYWx9IHJlY2VpdmVkLCBzaHV0dGluZyBkb3duIGdyYWNlZnVsbHkuLi5gKTtcbiAgICB9XG5cbiAgICAvLyBDdXN0b20gc2h1dGRvd24gY2FsbGJhY2tcbiAgICBpZiAob25TaHV0ZG93bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb25TaHV0ZG93bigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBpbiBvblNodXRkb3duIGNhbGxiYWNrJywgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbG9zZSBTU0UgY29ubmVjdGlvbnNcbiAgICBpZiAoc3NlTWFuYWdlcikge1xuICAgICAgc3NlTWFuYWdlci5zaHV0ZG93bigpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1NTRSBjb25uZWN0aW9ucyBjbG9zZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBIVFRQIHNlcnZlclxuICAgIHNlcnZlci5jbG9zZShhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbygnSFRUUCBzZXJ2ZXIgY2xvc2VkJyk7XG5cbiAgICAgIC8vIFNodXRkb3duIE9wZW5UZWxlbWV0cnkgdHJhY2luZ1xuICAgICAgYXdhaXQgc2h1dGRvd25UcmFjaW5nKCkuY2F0Y2goZXJyID0+IGxvZ2dlci5lcnJvcignRXJyb3Igc2h1dHRpbmcgZG93biB0cmFjaW5nJywgeyBlcnJvcjogZXJyIH0pKTtcblxuICAgICAgLy8gQ2xvc2UgZGF0YWJhc2UgY29ubmVjdGlvblxuICAgICAgaWYgKGNsb3NlRGF0YWJhc2UgIT09IGZhbHNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGF0YWJhc2UpIHtcbiAgICAgICAgICAgIGF3YWl0IGNsb3NlRGF0YWJhc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgY2xvc2VDb25uZWN0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKCdEYXRhYmFzZSBjb25uZWN0aW9uIGNsb3NlZCcpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyBkYXRhYmFzZScsIHsgZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yY2Ugc2h1dGRvd24gYWZ0ZXIgdGltZW91dFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGb3JjZWQgc2h1dGRvd24gYWZ0ZXIgdGltZW91dCcpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0sIHNodXRkb3duVGltZW91dE1zKS51bnJlZigpO1xuICB9O1xuXG4gIC8vIFJlZ2lzdGVyIHNpZ25hbCBoYW5kbGVyc1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsICgpID0+IHZvaWQgc2h1dGRvd24oJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgKCkgPT4gdm9pZCBzaHV0ZG93bignU0lHVEVSTScpKTtcblxuICByZXR1cm4ge1xuICAgIHNlcnZlcixcbiAgICBwb3J0LFxuICAgIHNodXRkb3duOiAoKSA9PiBzaHV0ZG93bigpLFxuICB9O1xufVxuXG4vKipcbiAqIFNpbXBsZSBzZXJ2ZXIgc3RhcnQgd3JhcHBlciB3aXRoIGVycm9yIGhhbmRsaW5nXG4gKlxuICogQHBhcmFtIGFwcCAtIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCBoYW5kbGVyKTtcbiAqXG4gKiB2b2lkIHJ1blNlcnZlcihhcHAsIHsgbmFtZTogJ015IFNlcnZpY2UnLCBzc2VNYW5hZ2VyIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5TZXJ2ZXIoYXBwOiBFeHByZXNzLCBvcHRpb25zOiBTdGFydFNlcnZlck9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAvLyBMYXN0LXJlc29ydCBmYXVsdCBoYW5kbGVycyBmb3IgdGhlIHByb2R1Y3Rpb24gZW50cnlwb2ludDogYW4gdW5oYW5kbGVkXG4gIC8vIHJlamVjdGlvbiAvIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpcyBsb2dnZWQgKG5vdCBzaWxlbnRseSBmYXRhbCkgdGhlbiB0aGVcbiAgLy8gcHJvY2VzcyBleGl0cyBmb3IgdGhlIG9yY2hlc3RyYXRvciB0byByZXN0YXJ0LiBOby1vcCB1bmRlciBOT0RFX0VOVj10ZXN0LlxuICBpbnN0YWxsQ3Jhc2hIYW5kbGVycyhsb2dnZXIpO1xuICBzdGFydFNlcnZlcihhcHAsIG9wdGlvbnMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcicsIHsgZXJyb3IgfSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbn1cbiJdfQ==
|