@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
package/README.md
CHANGED
|
@@ -2,34 +2,78 @@
|
|
|
2
2
|
|
|
3
3
|
📖 **[View documentation](https://mwashburn160.github.io/pipeline-builder/)**
|
|
4
4
|
|
|
5
|
-
Express server infrastructure for [Pipeline Builder](https://mwashburn160.github.io/pipeline-builder/):
|
|
5
|
+
Express server infrastructure for [Pipeline Builder](https://mwashburn160.github.io/pipeline-builder/): app factory, middleware (CORS, Helmet, rate limiting, idempotency, ETag), request context, route wrappers, health-check helpers, and SSE support.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
> Internal workspace package — consumed by other packages via `workspace:*`. Not published or used standalone.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- `createApp({ checkDependencies?, warmupHooks?, redisUrl?, ... })` — Creates a configured Express app with CORS, Helmet (strict CSP), gzip/deflate compression, rate limiting, `/health` (liveness), `/ready` (readiness), `/warmup`, `/metrics`, and OpenAPI spec + Swagger UI at `/docs`. Fails fast if `JWT_SECRET` is unset. Rate limiting keys per org (falling back to a normalized IPv6 prefix) and uses a shared Redis store when `redisUrl` is provided, so limits hold across multiple instances. Pass `warmupHooks: [() => mongoose.connection.db?.admin().ping()]` for services that need to pre-warm Mongo/Redis on cold start.
|
|
11
|
-
- `runServer`, `startServer` — Server lifecycle with graceful shutdown
|
|
9
|
+
## Responsibilities
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
- `attachRequestContext` / `createRequestContext` — Identity + logging attached to every request
|
|
15
|
-
- `requireOrgId` — Validates `x-org-id` header
|
|
16
|
-
- `checkQuota` — Quota enforcement middleware
|
|
17
|
-
- `etagMiddleware` — Conditional GET (304 Not Modified) support
|
|
18
|
-
- `idempotencyMiddleware` — Idempotency key handling
|
|
11
|
+
Assembles the standardized HTTP runtime shared by every backend service: a configured Express app factory, request-context middleware (identity + structured logging), org-scoped rate limiting, idempotency and ETag handling, quota enforcement, async route wrappers with consistent error mapping, health/readiness checks, metrics and OpenTelemetry tracing, and a Server-Sent Events connection manager. Builds on `@pipeline-builder/api-core` for auth, responses, and logging.
|
|
19
12
|
|
|
20
|
-
|
|
21
|
-
- `withRoute` — Wraps async handlers with context extraction, orgId validation, and error mapping
|
|
22
|
-
- `getContext` — Retrieves `RequestContext` from an Express request
|
|
23
|
-
- `createProtectedRoute`, `createAuthenticatedWithOrgRoute` — Composable middleware chains
|
|
13
|
+
## Key exports
|
|
24
14
|
|
|
25
|
-
###
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
### App factory & lifecycle (`./api`)
|
|
16
|
+
| Export | Purpose |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| `createApp` | Configured Express app: CORS, Helmet (strict CSP), gzip/deflate compression, org-keyed rate limiting (shared Redis store when `redisUrl` is set), `/health`, `/ready`, `/warmup`, `/metrics`, and Swagger UI + OpenAPI at `/docs`. Fails fast if `JWT_SECRET` is unset. |
|
|
19
|
+
| `startServer`, `runServer` | Server lifecycle with graceful shutdown |
|
|
29
20
|
|
|
30
|
-
###
|
|
31
|
-
|
|
21
|
+
### Middleware (`./api`)
|
|
22
|
+
| Export | Purpose |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `attachRequestContext`, `createRequestContext` | Attach identity + logging (`RequestContext`) to each request |
|
|
25
|
+
| `requireOrgId` | Validate the `x-org-id` header is present |
|
|
26
|
+
| `checkQuota` | Quota enforcement middleware |
|
|
27
|
+
| `etagMiddleware` | Conditional GET (304 Not Modified) support |
|
|
28
|
+
| `idempotencyMiddleware`, `createMemoryStore`, `createRedisIdempotencyStore` | Idempotency-key handling with pluggable stores |
|
|
29
|
+
|
|
30
|
+
### Route helpers (`./api`)
|
|
31
|
+
| Export | Purpose |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| `withRoute` | Wrap async handlers with context extraction, orgId validation, and error mapping |
|
|
34
|
+
| `getContext` | Retrieve `RequestContext` from an Express request |
|
|
35
|
+
| `createProtectedRoute`, `createAuthenticatedWithOrgRoute` | Composable auth/org middleware chains |
|
|
36
|
+
|
|
37
|
+
### Health, quota & observability (`./api`)
|
|
38
|
+
| Export | Purpose |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `postgresHealthCheck` | Returns `{ postgres: 'connected' \| 'disconnected' }` |
|
|
41
|
+
| `mongoHealthCheck` | Returns `{ mongodb: 'connected' \| 'unknown' \| 'disconnected' }` from mongoose `readyState` |
|
|
42
|
+
| `incrementQuotaFromCtx` | Increment a quota counter from the route context |
|
|
43
|
+
| `metricsMiddleware`, `metricsHandler`, `incCounter`, `observe`, `setGauge` | Prometheus metrics collection and `/metrics` handler |
|
|
44
|
+
| `initTracing`, `currentTraceId` | OpenTelemetry tracing init and current trace ID |
|
|
45
|
+
|
|
46
|
+
### Server-Sent Events (`./http`)
|
|
47
|
+
| Export | Purpose |
|
|
48
|
+
| --- | --- |
|
|
49
|
+
| `SSEManager` | Connection manager for streaming logs/events to clients |
|
|
50
|
+
|
|
51
|
+
## Usage
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { createApp, withRoute, getContext } from '@pipeline-builder/api-server';
|
|
55
|
+
import { requireAuth, sendSuccess } from '@pipeline-builder/api-core';
|
|
56
|
+
|
|
57
|
+
const { app } = createApp({ serviceName: 'plugin-service' });
|
|
58
|
+
|
|
59
|
+
app.get(
|
|
60
|
+
'/plugins',
|
|
61
|
+
requireAuth(),
|
|
62
|
+
withRoute(async (req, res) => {
|
|
63
|
+
const { orgId, logger } = getContext(req);
|
|
64
|
+
logger.info('listing plugins', { orgId });
|
|
65
|
+
return sendSuccess(res, await plugins.findByOrg(orgId));
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Development
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
pnpm build # projen build (compile + lint + test)
|
|
74
|
+
pnpm test # run the Jest test suite
|
|
75
|
+
```
|
|
32
76
|
|
|
33
77
|
## License
|
|
34
78
|
|
|
35
|
-
Apache-2.0. See [LICENSE](./LICENSE).
|
|
79
|
+
Apache-2.0. See [LICENSE](./LICENSE).
|
package/lib/api/app-factory.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { OpenApiSpecOptions } from '@pipeline-builder/api-core';
|
|
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 creating an Express application
|
|
6
6
|
*/
|
package/lib/api/app-factory.js
CHANGED
|
@@ -1,62 +1,23 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
3
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}) : function(o, v) {
|
|
18
|
-
o["default"] = v;
|
|
19
|
-
});
|
|
20
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
-
var ownKeys = function(o) {
|
|
22
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
-
var ar = [];
|
|
24
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
-
return ar;
|
|
26
|
-
};
|
|
27
|
-
return ownKeys(o);
|
|
28
|
-
};
|
|
29
|
-
return function (mod) {
|
|
30
|
-
if (mod && mod.__esModule) return mod;
|
|
31
|
-
var result = {};
|
|
32
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
-
__setModuleDefault(result, mod);
|
|
34
|
-
return result;
|
|
35
|
-
};
|
|
36
|
-
})();
|
|
37
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
38
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
39
|
-
};
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.createApp = createApp;
|
|
42
|
-
const api_core_1 = require("@pipeline-builder/api-core");
|
|
43
|
-
const pipeline_core_1 = require("@pipeline-builder/pipeline-core");
|
|
44
|
-
const compression_1 = __importDefault(require("compression"));
|
|
45
|
-
const cors_1 = __importDefault(require("cors"));
|
|
46
|
-
const express_1 = __importDefault(require("express"));
|
|
47
|
-
const express_rate_limit_1 = __importStar(require("express-rate-limit"));
|
|
48
|
-
const helmet_1 = __importDefault(require("helmet"));
|
|
49
|
-
const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
|
|
50
|
-
const uuid_1 = require("uuid");
|
|
51
|
-
const etag_middleware_1 = require("./etag-middleware");
|
|
52
|
-
const idempotency_middleware_1 = require("./idempotency-middleware");
|
|
53
|
-
const metrics_1 = require("./metrics");
|
|
54
|
-
const sse_connection_manager_1 = require("../http/sse-connection-manager");
|
|
3
|
+
import { sendSuccess, sendError, generateOpenApiSpec, ErrorCode, createLogger, getOrgId, createHealthRouter, setCounterEmitter } from '@pipeline-builder/api-core';
|
|
4
|
+
import { Config, CoreConstants, getConnection } from '@pipeline-builder/pipeline-core';
|
|
5
|
+
import compression from 'compression';
|
|
6
|
+
import cors from 'cors';
|
|
7
|
+
import express, {} from 'express';
|
|
8
|
+
import rateLimit, { ipKeyGenerator } from 'express-rate-limit';
|
|
9
|
+
import helmet from 'helmet';
|
|
10
|
+
import swaggerUi from 'swagger-ui-express';
|
|
11
|
+
import { v7 as uuid } from 'uuid';
|
|
12
|
+
import { etagMiddleware } from './etag-middleware.js';
|
|
13
|
+
import { idempotencyMiddleware } from './idempotency-middleware.js';
|
|
14
|
+
import { metricsMiddleware, metricsHandler, incCounter } from './metrics.js';
|
|
15
|
+
import { SSEManager } from '../http/sse-connection-manager.js';
|
|
55
16
|
// Wire api-core's counter shim to the real prom-client registry. This is
|
|
56
17
|
// a no-op until incCounter is called for the first time (lazy registration
|
|
57
18
|
// in metrics.ts), and lets api-core helpers like the quota client record
|
|
58
19
|
// `quota_fail_open_total` without taking a hard dep on api-server.
|
|
59
|
-
|
|
20
|
+
setCounterEmitter(incCounter);
|
|
60
21
|
/**
|
|
61
22
|
* Create and configure an Express application with common middleware
|
|
62
23
|
*
|
|
@@ -84,8 +45,8 @@ const sse_connection_manager_1 = require("../http/sse-connection-manager");
|
|
|
84
45
|
* startServer(app, { name: 'My Service' });
|
|
85
46
|
* ```
|
|
86
47
|
*/
|
|
87
|
-
function createApp(options = {}) {
|
|
88
|
-
const { enableCors = true, enableHelmet = true, enableRateLimit = true, enableJsonBody = true, jsonLimit = '1mb', enableUrlEncoded = true, urlEncodedLimit = '1mb', sseManager = new
|
|
48
|
+
export function createApp(options = {}) {
|
|
49
|
+
const { enableCors = true, enableHelmet = true, enableRateLimit = true, enableJsonBody = true, jsonLimit = '1mb', enableUrlEncoded = true, urlEncodedLimit = '1mb', sseManager = new SSEManager(), checkDependencies, enableOpenApi = true, openApiOptions, enableCompression = true, warmupHooks = [], } = options;
|
|
89
50
|
// Fail fast if JWT_SECRET is not configured — prevents silent auth failures at runtime
|
|
90
51
|
if (!process.env.JWT_SECRET) {
|
|
91
52
|
throw new Error('JWT_SECRET environment variable is required. Set it before starting the server.');
|
|
@@ -96,8 +57,8 @@ function createApp(options = {}) {
|
|
|
96
57
|
// started by the `otel-bootstrap.js` preload instead (node -r … — see each
|
|
97
58
|
// service's Dockerfile CMD / start script), which runs before any
|
|
98
59
|
// instrumented module loads. `currentTraceId()` then reads the active span.
|
|
99
|
-
const serverConfig =
|
|
100
|
-
const app = (
|
|
60
|
+
const serverConfig = Config.get('server');
|
|
61
|
+
const app = express();
|
|
101
62
|
// Security middleware.
|
|
102
63
|
//
|
|
103
64
|
// Swagger UI needs unsafe-inline + unsafe-eval for its bundled scripts —
|
|
@@ -108,7 +69,7 @@ function createApp(options = {}) {
|
|
|
108
69
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
109
70
|
const allowSwaggerCsp = enableOpenApi && !isProduction;
|
|
110
71
|
if (enableHelmet) {
|
|
111
|
-
app.use((
|
|
72
|
+
app.use(helmet({
|
|
112
73
|
contentSecurityPolicy: {
|
|
113
74
|
directives: {
|
|
114
75
|
defaultSrc: ["'self'"],
|
|
@@ -128,41 +89,41 @@ function createApp(options = {}) {
|
|
|
128
89
|
}));
|
|
129
90
|
}
|
|
130
91
|
if (enableCors) {
|
|
131
|
-
app.use((
|
|
92
|
+
app.use(cors(serverConfig.cors));
|
|
132
93
|
}
|
|
133
94
|
// Response compression (gzip/deflate) — skip SSE streams
|
|
134
95
|
if (enableCompression) {
|
|
135
|
-
app.use((
|
|
96
|
+
app.use(compression({
|
|
136
97
|
filter: (req, res) => {
|
|
137
98
|
// Don't compress SSE streams
|
|
138
99
|
if (req.headers.accept === 'text/event-stream')
|
|
139
100
|
return false;
|
|
140
|
-
return
|
|
101
|
+
return compression.filter(req, res);
|
|
141
102
|
},
|
|
142
|
-
threshold:
|
|
103
|
+
threshold: CoreConstants.COMPRESSION_THRESHOLD_BYTES,
|
|
143
104
|
}));
|
|
144
105
|
}
|
|
145
106
|
// ETag support for conditional GET requests (304 Not Modified)
|
|
146
|
-
app.use(
|
|
107
|
+
app.use(etagMiddleware());
|
|
147
108
|
// Body parsing
|
|
148
109
|
if (enableJsonBody) {
|
|
149
|
-
app.use(
|
|
110
|
+
app.use(express.json({ limit: jsonLimit }));
|
|
150
111
|
}
|
|
151
112
|
if (enableUrlEncoded) {
|
|
152
|
-
app.use(
|
|
113
|
+
app.use(express.urlencoded({ extended: true, limit: urlEncodedLimit }));
|
|
153
114
|
}
|
|
154
115
|
// Trust proxy (must be set before rate limiter so req.ip resolves correctly)
|
|
155
116
|
app.set('trust proxy', serverConfig.trustProxy);
|
|
156
117
|
// Request ID — prefer existing header from nginx, otherwise generate one
|
|
157
118
|
app.use((req, res, next) => {
|
|
158
119
|
const hdr = req.headers['x-request-id'];
|
|
159
|
-
const requestId = (Array.isArray(hdr) ? hdr[0] : hdr) || (
|
|
120
|
+
const requestId = (Array.isArray(hdr) ? hdr[0] : hdr) || uuid();
|
|
160
121
|
req.requestId = requestId;
|
|
161
122
|
res.setHeader('X-Request-Id', requestId);
|
|
162
123
|
next();
|
|
163
124
|
});
|
|
164
125
|
// Health check registered before rate limiter so it is never throttled
|
|
165
|
-
app.use(
|
|
126
|
+
app.use(createHealthRouter({
|
|
166
127
|
serviceName: process.env.SERVICE_NAME || 'api',
|
|
167
128
|
checkDependencies,
|
|
168
129
|
}));
|
|
@@ -172,30 +133,30 @@ function createApp(options = {}) {
|
|
|
172
133
|
app.get('/warmup', async (_req, res) => {
|
|
173
134
|
try {
|
|
174
135
|
await Promise.all([
|
|
175
|
-
|
|
136
|
+
getConnection().testConnection(),
|
|
176
137
|
...warmupHooks.map((hook) => hook()),
|
|
177
138
|
]);
|
|
178
|
-
|
|
139
|
+
sendSuccess(res, 200, { warmed: true, hooks: warmupHooks.length });
|
|
179
140
|
}
|
|
180
141
|
catch {
|
|
181
|
-
|
|
142
|
+
sendError(res, 503, 'Warmup failed');
|
|
182
143
|
}
|
|
183
144
|
});
|
|
184
145
|
// Prometheus metrics endpoint — always registered (never throttled)
|
|
185
|
-
app.get('/metrics',
|
|
146
|
+
app.get('/metrics', metricsHandler());
|
|
186
147
|
// OpenAPI spec and Swagger UI (registered before rate limiter)
|
|
187
148
|
if (enableOpenApi) {
|
|
188
|
-
const spec =
|
|
149
|
+
const spec = generateOpenApiSpec(openApiOptions);
|
|
189
150
|
app.get('/docs/openapi.json', (_req, res) => {
|
|
190
151
|
res.json(spec);
|
|
191
152
|
});
|
|
192
|
-
app.use('/docs',
|
|
153
|
+
app.use('/docs', swaggerUi.serve, swaggerUi.setup(spec, {
|
|
193
154
|
customSiteTitle: openApiOptions?.title ?? 'Pipeline Builder API Docs',
|
|
194
155
|
}));
|
|
195
156
|
}
|
|
196
157
|
// Rate limiting — uses Redis when redisUrl is provided for shared state across instances
|
|
197
158
|
if (enableRateLimit) {
|
|
198
|
-
const rateLimitConfig =
|
|
159
|
+
const rateLimitConfig = Config.get('rateLimit');
|
|
199
160
|
const rateLimitOptions = {
|
|
200
161
|
max: rateLimitConfig.max,
|
|
201
162
|
windowMs: rateLimitConfig.windowMs,
|
|
@@ -207,9 +168,9 @@ function createApp(options = {}) {
|
|
|
207
168
|
// ipKeyGenerator normalizes IPv6 to a /64 prefix so a single user can't
|
|
208
169
|
// rotate low-bits to escape the bucket; express-rate-limit 8.x's
|
|
209
170
|
// validator also refuses to start without it.
|
|
210
|
-
keyGenerator: (req) =>
|
|
171
|
+
keyGenerator: (req) => getOrgId(req) || ipKeyGenerator(req.ip || 'anon', 64),
|
|
211
172
|
handler: (_req, res) => {
|
|
212
|
-
|
|
173
|
+
sendError(res, 429, 'Too many requests, please try again later.', ErrorCode.RATE_LIMIT_EXCEEDED);
|
|
213
174
|
},
|
|
214
175
|
};
|
|
215
176
|
// Use Redis store when available for shared state across instances
|
|
@@ -225,23 +186,23 @@ function createApp(options = {}) {
|
|
|
225
186
|
});
|
|
226
187
|
}
|
|
227
188
|
catch {
|
|
228
|
-
|
|
189
|
+
createLogger('rate-limit').warn('Redis store unavailable, falling back to in-memory rate limiting');
|
|
229
190
|
}
|
|
230
191
|
}
|
|
231
|
-
app.use((
|
|
192
|
+
app.use(rateLimit(rateLimitOptions));
|
|
232
193
|
}
|
|
233
194
|
// Express request timeout — uses CoreConstants to share the same default as Lambda handlers
|
|
234
|
-
const timeoutMs =
|
|
195
|
+
const timeoutMs = CoreConstants.HANDLER_TIMEOUT_MS;
|
|
235
196
|
app.use((_req, res, next) => {
|
|
236
197
|
res.setTimeout(timeoutMs, () => {
|
|
237
198
|
if (!res.headersSent) {
|
|
238
|
-
|
|
199
|
+
sendError(res, 503, 'Request timeout');
|
|
239
200
|
}
|
|
240
201
|
});
|
|
241
202
|
next();
|
|
242
203
|
});
|
|
243
204
|
// Request duration logging
|
|
244
|
-
const durationLogger =
|
|
205
|
+
const durationLogger = createLogger('request-duration');
|
|
245
206
|
app.use((req, res, next) => {
|
|
246
207
|
const start = Date.now();
|
|
247
208
|
res.on('finish', () => {
|
|
@@ -257,11 +218,11 @@ function createApp(options = {}) {
|
|
|
257
218
|
next();
|
|
258
219
|
});
|
|
259
220
|
// Prometheus metrics middleware — records request duration and count
|
|
260
|
-
app.use(
|
|
221
|
+
app.use(metricsMiddleware());
|
|
261
222
|
// Idempotency key support for mutation endpoints
|
|
262
|
-
app.use(
|
|
223
|
+
app.use(idempotencyMiddleware());
|
|
263
224
|
// SSE logs endpoint
|
|
264
225
|
app.get('/logs/:requestId', sseManager.middleware());
|
|
265
226
|
return { app, sseManager };
|
|
266
227
|
}
|
|
267
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9HdEMsOEJBdU5DO0FBelRELHlEQUFtSztBQUVuSyxtRUFBdUY7QUFDdkYsOERBQXNDO0FBQ3RDLGdEQUF3QjtBQUN4QixzREFBNEU7QUFDNUUseUVBQStEO0FBQy9ELG9EQUE0QjtBQUM1Qiw0RUFBMkM7QUFDM0MsK0JBQWtDO0FBQ2xDLHVEQUFtRDtBQUNuRCxxRUFBaUU7QUFDakUsdUNBQTBFO0FBQzFFLDJFQUE0RDtBQUU1RCx5RUFBeUU7QUFDekUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSxtRUFBbUU7QUFDbkUsSUFBQSw0QkFBaUIsRUFBQyxvQkFBVSxDQUFDLENBQUM7QUFvRDlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxVQUE0QixFQUFFO0lBQ3RELE1BQU0sRUFDSixVQUFVLEdBQUcsSUFBSSxFQUNqQixZQUFZLEdBQUcsSUFBSSxFQUNuQixlQUFlLEdBQUcsSUFBSSxFQUN0QixjQUFjLEdBQUcsSUFBSSxFQUNyQixTQUFTLEdBQUcsS0FBSyxFQUNqQixnQkFBZ0IsR0FBRyxJQUFJLEVBQ3ZCLGVBQWUsR0FBRyxLQUFLLEVBQ3ZCLFVBQVUsR0FBRyxJQUFJLG1DQUFVLEVBQUUsRUFDN0IsaUJBQWlCLEVBQ2pCLGFBQWEsR0FBRyxJQUFJLEVBQ3BCLGNBQWMsRUFDZCxpQkFBaUIsR0FBRyxJQUFJLEVBQ3hCLFdBQVcsR0FBRyxFQUFFLEdBQ2pCLEdBQUcsT0FBTyxDQUFDO0lBRVosdUZBQXVGO0lBQ3ZGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0s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RyxDQUFDLFVBQVU7Z0JBQzFCLFVBQVUsRUFBRSxRQUFRO2dCQUNwQixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0lBRUgscUVBQXFFO0lBQ3JFLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBQSwyQkFBaUIsR0FBRSxDQUFDLENBQUM7SUFFN0IsaURBQWlEO0lBQ2pELEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBQSw4Q0FBcUIsR0FBRSxDQUFDLENBQUM7SUFFakMsb0JBQW9CO0lBQ3BCLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRTdWNjZXNzLCBzZW5kRXJyb3IsIGdlbmVyYXRlT3BlbkFwaVNwZWMsIEVycm9yQ29kZSwgY3JlYXRlTG9nZ2VyLCBnZXRPcmdJZCwgY3JlYXRlSGVhbHRoUm91dGVyLCBzZXRDb3VudGVyRW1pdHRlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgT3BlbkFwaVNwZWNPcHRpb25zIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzLCBnZXRDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgZXhwcmVzcywgeyBFeHByZXNzLCBOZXh0RnVuY3Rpb24sIFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgcmF0ZUxpbWl0LCB7IGlwS2V5R2VuZXJhdG9yIH0gZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcbmltcG9ydCBoZWxtZXQgZnJvbSAnaGVsbWV0JztcbmltcG9ydCBzd2FnZ2VyVWkgZnJvbSAnc3dhZ2dlci11aS1leHByZXNzJztcbmltcG9ydCB7IHY3IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGV0YWdNaWRkbGV3YXJlIH0gZnJvbSAnLi9ldGFnLW1pZGRsZXdhcmUnO1xuaW1wb3J0IHsgaWRlbXBvdGVuY3lNaWRkbGV3YXJlIH0gZnJvbSAnLi9pZGVtcG90ZW5jeS1taWRkbGV3YXJlJztcbmltcG9ydCB7IG1ldHJpY3NNaWRkbGV3YXJlLCBtZXRyaWNzSGFuZGxlciwgaW5jQ291bnRlciB9IGZyb20gJy4vbWV0cmljcyc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyIH0gZnJvbSAnLi4vaHR0cC9zc2UtY29ubmVjdGlvbi1tYW5hZ2VyJztcblxuLy8gV2lyZSBhcGktY29yZSdzIGNvdW50ZXIgc2hpbSB0byB0aGUgcmVhbCBwcm9tLWNsaWVudCByZWdpc3RyeS4gVGhpcyBpc1xuLy8gYSBuby1vcCB1bnRpbCBpbmNDb3VudGVyIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKGxhenkgcmVnaXN0cmF0aW9uXG4vLyBpbiBtZXRyaWNzLnRzKSwgYW5kIGxldHMgYXBpLWNvcmUgaGVscGVycyBsaWtlIHRoZSBxdW90YSBjbGllbnQgcmVjb3JkXG4vLyBgcXVvdGFfZmFpbF9vcGVuX3RvdGFsYCB3aXRob3V0IHRha2luZyBhIGhhcmQgZGVwIG9uIGFwaS1zZXJ2ZXIuXG5zZXRDb3VudGVyRW1pdHRlcihpbmNDb3VudGVyKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhbiBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXBwT3B0aW9ucyB7XG4gIC8qKiBFbmFibGUgQ09SUyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlQ29ycz86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgSGVsbWV0IHNlY3VyaXR5IGhlYWRlcnMgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUhlbG1ldD86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgcmF0ZSBsaW1pdGluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlUmF0ZUxpbWl0PzogYm9vbGVhbjtcbiAgLyoqIFJlZGlzIFVSTCBmb3Igc2hhcmVkIHJhdGUtbGltaXQgc3RhdGUgKGUuZy4gJ3JlZGlzOi8vaG9zdDo2Mzc5JykuIEluLW1lbW9yeSB3aGVuIG9taXR0ZWQuICovXG4gIHJlZGlzVXJsPzogc3RyaW5nO1xuICAvKiogRW5hYmxlIEpTT04gYm9keSBwYXJzaW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVKc29uQm9keT86IGJvb2xlYW47XG4gIC8qKiBKU09OIGJvZHkgc2l6ZSBsaW1pdCAoZGVmYXVsdDogJzFtYicpICovXG4gIGpzb25MaW1pdD86IHN0cmluZztcbiAgLyoqIEVuYWJsZSBVUkwtZW5jb2RlZCBib2R5IHBhcnNpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZVVybEVuY29kZWQ/OiBib29sZWFuO1xuICAvKiogVVJMLWVuY29kZWQgYm9keSBzaXplIGxpbWl0IChkZWZhdWx0OiAnMW1iJykgKi9cbiAgdXJsRW5jb2RlZExpbWl0Pzogc3RyaW5nO1xuICAvKiogQ3VzdG9tIFNTRSBtYW5hZ2VyIGluc3RhbmNlICovXG4gIHNzZU1hbmFnZXI/OiBTU0VNYW5hZ2VyO1xuICAvKiogSGVhbHRoIGNoZWNrIGRlcGVuZGVuY3kgY2hlY2tlciDigJQgaWYgcHJvdmlkZWQsIC9oZWFsdGggcmVwb3J0cyBkZXBlbmRlbmN5IHN0YXR1cyAqL1xuICBjaGVja0RlcGVuZGVuY2llcz86ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz4+O1xuICAvKiogRW5hYmxlIE9wZW5BUEkgc3BlYyBhdCAvZG9jcy9vcGVuYXBpLmpzb24gYW5kIFN3YWdnZXIgVUkgYXQgL2RvY3MgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZU9wZW5BcGk/OiBib29sZWFuO1xuICAvKiogT3BlbkFQSSBzcGVjIGN1c3RvbWl6YXRpb24gb3B0aW9ucyAqL1xuICBvcGVuQXBpT3B0aW9ucz86IE9wZW5BcGlTcGVjT3B0aW9ucztcbiAgLyoqIEVuYWJsZSBnemlwL2RlZmxhdGUgcmVzcG9uc2UgY29tcHJlc3Npb24gKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUNvbXByZXNzaW9uPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEV4dHJhIHdhcm11cCBjYWxsYmFja3MgaW52b2tlZCBieSBgR0VUIC93YXJtdXBgIGluIGFkZGl0aW9uIHRvIHRoZVxuICAgKiBkZWZhdWx0IFBvc3RncmVzIHBpbmcuIFVzZSBmb3Igc2VydmljZXMgdGhhdCBkZXBlbmQgb24gTW9uZ28sIFJlZGlzLFxuICAgKiBTUVMsIGV0Yy4g4oCUIHByZS13YXJtaW5nIG9wZW5zIGNvbm5lY3Rpb24gcG9vbHMgYmVmb3JlIHJlYWwgdHJhZmZpY1xuICAgKiBhcnJpdmVzLiBFYWNoIGNhbGxiYWNrIHNob3VsZCByZXNvbHZlIHdoZW4gaXRzIGRlcGVuZGVuY3kgaXMgcmVhZHk7XG4gICAqIGFueSByZWplY3Rpb24gY2F1c2VzIC93YXJtdXAgdG8gcmV0dXJuIDUwMy5cbiAgICovXG4gIHdhcm11cEhvb2tzPzogQXJyYXk8KCkgPT4gUHJvbWlzZTx2b2lkPj47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBSZXN1bHQge1xuICAvKiogQ29uZmlndXJlZCBFeHByZXNzIGFwcGxpY2F0aW9uICovXG4gIGFwcDogRXhwcmVzcztcbiAgLyoqIFNTRSBtYW5hZ2VyIGluc3RhbmNlICovXG4gIHNzZU1hbmFnZXI6IFNTRU1hbmFnZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYW4gRXhwcmVzcyBhcHBsaWNhdGlvbiB3aXRoIGNvbW1vbiBtaWRkbGV3YXJlXG4gKlxuICogU2V0cyB1cDpcbiAqIC0gQ09SUyB3aXRoIGNvbmZpZ3VyZWQgb3JpZ2luc1xuICogLSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVyc1xuICogLSBSYXRlIGxpbWl0aW5nXG4gKiAtIEpTT04gYW5kIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZ1xuICogLSBUcnVzdCBwcm94eSBzZXR0aW5nc1xuICogLSBIZWFsdGggY2hlY2sgZW5kcG9pbnQgKC9oZWFsdGgpXG4gKiAtIE1ldHJpY3MgZW5kcG9pbnQgKC9tZXRyaWNzKVxuICogLSBTU0UgbG9ncyBlbmRwb2ludCAoL2xvZ3MvOnJlcXVlc3RJZClcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29uZmlndXJlZCBFeHByZXNzIGFwcCBhbmQgU1NFIG1hbmFnZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICpcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAvLyBZb3VyIHJvdXRlIGhhbmRsZXJcbiAqIH0pO1xuICpcbiAqIHN0YXJ0U2VydmVyKGFwcCwgeyBuYW1lOiAnTXkgU2VydmljZScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwcChvcHRpb25zOiBDcmVhdGVBcHBPcHRpb25zID0ge30pOiBDcmVhdGVBcHBSZXN1bHQge1xuICBjb25zdCB7XG4gICAgZW5hYmxlQ29ycyA9IHRydWUsXG4gICAgZW5hYmxlSGVsbWV0ID0gdHJ1ZSxcbiAgICBlbmFibGVSYXRlTGltaXQgPSB0cnVlLFxuICAgIGVuYWJsZUpzb25Cb2R5ID0gdHJ1ZSxcbiAgICBqc29uTGltaXQgPSAnMW1iJyxcbiAgICBlbmFibGVVcmxFbmNvZGVkID0gdHJ1ZSxcbiAgICB1cmxFbmNvZGVkTGltaXQgPSAnMW1iJyxcbiAgICBzc2VNYW5hZ2VyID0gbmV3IFNTRU1hbmFnZXIoKSxcbiAgICBjaGVja0RlcGVuZGVuY2llcyxcbiAgICBlbmFibGVPcGVuQXBpID0gdHJ1ZSxcbiAgICBvcGVuQXBpT3B0aW9ucyxcbiAgICBlbmFibGVDb21wcmVzc2lvbiA9IHRydWUsXG4gICAgd2FybXVwSG9va3MgPSBbXSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gRmFpbCBmYXN0IGlmIEpXVF9TRUNSRVQgaXMgbm90IGNvbmZpZ3VyZWQg4oCUIHByZXZlbnRzIHNpbGVudCBhdXRoIGZhaWx1cmVzIGF0IHJ1bnRpbWVcbiAgaWYgKCFwcm9jZXNzLmVudi5KV1RfU0VDUkVUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkLiBTZXQgaXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuJyk7XG4gIH1cblxuICAvLyBPcGVuVGVsZW1ldHJ5IGlzIE5PVCBpbml0aWFsaXplZCBoZXJlOiBieSB0aGUgdGltZSBjcmVhdGVBcHAgcnVucywgZXhwcmVzc1xuICAvLyBhbmQgaHR0cCBoYXZlIGFscmVhZHkgYmVlbiByZXF1aXJlZCwgc28gdGhlIGF1dG8taW5zdHJ1bWVudGF0aW9uIGhvb2tzXG4gIC8vIHdvdWxkIGhhdmUgbm90aGluZyB0byBwYXRjaCAobm8gaW5ib3VuZCBzcGFuIOKGkiBubyB0cmFjZSBpZCkuIFRyYWNpbmcgaXNcbiAgLy8gc3RhcnRlZCBieSB0aGUgYG90ZWwtYm9vdHN0cmFwLmpzYCBwcmVsb2FkIGluc3RlYWQgKG5vZGUgLXIg4oCmIOKAlCBzZWUgZWFjaFxuICAvLyBzZXJ2aWNlJ3MgRG9ja2VyZmlsZSBDTUQgLyBzdGFydCBzY3JpcHQpLCB3aGljaCBydW5zIGJlZm9yZSBhbnlcbiAgLy8gaW5zdHJ1bWVudGVkIG1vZHVsZSBsb2Fkcy4gYGN1cnJlbnRUcmFjZUlkKClgIHRoZW4gcmVhZHMgdGhlIGFjdGl2ZSBzcGFuLlxuXG4gIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gU2VjdXJpdHkgbWlkZGxld2FyZS5cbiAgLy9cbiAgLy8gU3dhZ2dlciBVSSBuZWVkcyB1bnNhZmUtaW5saW5lICsgdW5zYWZlLWV2YWwgZm9yIGl0cyBidW5kbGVkIHNjcmlwdHMg4oCUXG4gIC8vIGJ1dCB3ZSBvbmx5IHJlbGF4IENTUCB0aGF0IGZhciB3aGVuIChhKSBPcGVuQVBJIGlzIGVuYWJsZWQgQU5EIChiKSB3ZSdyZVxuICAvLyBub3QgaW4gcHJvZHVjdGlvbi4gSW4gcHJvZCwgU3dhZ2dlciBzaG91bGQgYmUgc2VydmVkIGJlaGluZCBhIHNlcGFyYXRlXG4gIC8vIGhvc3Qgb3IgYXV0aC1nYXRlZCByb3V0ZTsgdGhlIG1haW4gYXBwIGtlZXBzIHRoZSBzdHJpY3QgQ1NQIHNvIGEgU3RvcmVkXG4gIC8vIFhTUyBpbiBhbnkgaGFuZGxlciBjYW4ndCBgZXZhbCgpYCBhcmJpdHJhcnkgc2NyaXB0LlxuICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuICBjb25zdCBhbGxvd1N3YWdnZXJDc3AgPSBlbmFibGVPcGVuQXBpICYmICFpc1Byb2R1Y3Rpb247XG4gIGlmIChlbmFibGVIZWxtZXQpIHtcbiAgICBhcHAudXNlKGhlbG1ldCh7XG4gICAgICBjb250ZW50U2VjdXJpdHlQb2xpY3k6IHtcbiAgICAgICAgZGlyZWN0aXZlczoge1xuICAgICAgICAgIGRlZmF1bHRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBzY3JpcHRTcmM6IGFsbG93U3dhZ2dlckNzcFxuICAgICAgICAgICAgPyBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIiwgXCIndW5zYWZlLWV2YWwnXCJdXG4gICAgICAgICAgICA6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBzdHlsZVNyYzogW1wiJ3NlbGYnXCIsIFwiJ3Vuc2FmZS1pbmxpbmUnXCJdLFxuICAgICAgICAgIGltZ1NyYzogW1wiJ3NlbGYnXCIsICdkYXRhOicsICdibG9iOiddLFxuICAgICAgICAgIGNvbm5lY3RTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb250U3JjOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgb2JqZWN0U3JjOiBbXCInbm9uZSdcIl0sXG4gICAgICAgICAgZnJhbWVBbmNlc3RvcnM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBiYXNlVXJpOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgZm9ybUFjdGlvbjogW1wiJ3NlbGYnXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICBpZiAoZW5hYmxlQ29ycykge1xuICAgIGFwcC51c2UoY29ycyhzZXJ2ZXJDb25maWcuY29ycykpO1xuICB9XG5cbiAgLy8gUmVzcG9uc2UgY29tcHJlc3Npb24gKGd6aXAvZGVmbGF0ZSkg4oCUIHNraXAgU1NFIHN0cmVhbXNcbiAgaWYgKGVuYWJsZUNvbXByZXNzaW9uKSB7XG4gICAgYXBwLnVzZShjb21wcmVzc2lvbih7XG4gICAgICBmaWx0ZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgY29tcHJlc3MgU1NFIHN0cmVhbXNcbiAgICAgICAgaWYgKHJlcS5oZWFkZXJzLmFjY2VwdCA9PT0gJ3RleHQvZXZlbnQtc3RyZWFtJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY29tcHJlc3Npb24uZmlsdGVyKHJlcSwgcmVzKTtcbiAgICAgIH0sXG4gICAgICB0aHJlc2hvbGQ6IENvcmVDb25zdGFudHMuQ09NUFJFU1NJT05fVEhSRVNIT0xEX0JZVEVTLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIEVUYWcgc3VwcG9ydCBmb3IgY29uZGl0aW9uYWwgR0VUIHJlcXVlc3RzICgzMDQgTm90IE1vZGlmaWVkKVxuICBhcHAudXNlKGV0YWdNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIEJvZHkgcGFyc2luZ1xuICBpZiAoZW5hYmxlSnNvbkJvZHkpIHtcbiAgICBhcHAudXNlKGV4cHJlc3MuanNvbih7IGxpbWl0OiBqc29uTGltaXQgfSkpO1xuICB9XG5cbiAgaWYgKGVuYWJsZVVybEVuY29kZWQpIHtcbiAgICBhcHAudXNlKGV4cHJlc3MudXJsZW5jb2RlZCh7IGV4dGVuZGVkOiB0cnVlLCBsaW1pdDogdXJsRW5jb2RlZExpbWl0IH0pKTtcbiAgfVxuXG4gIC8vIFRydXN0IHByb3h5IChtdXN0IGJlIHNldCBiZWZvcmUgcmF0ZSBsaW1pdGVyIHNvIHJlcS5pcCByZXNvbHZlcyBjb3JyZWN0bHkpXG4gIGFwcC5zZXQoJ3RydXN0IHByb3h5Jywgc2VydmVyQ29uZmlnLnRydXN0UHJveHkpO1xuXG4gIC8vIFJlcXVlc3QgSUQg4oCUIHByZWZlciBleGlzdGluZyBoZWFkZXIgZnJvbSBuZ2lueCwgb3RoZXJ3aXNlIGdlbmVyYXRlIG9uZVxuICBhcHAudXNlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IGhkciA9IHJlcS5oZWFkZXJzWyd4LXJlcXVlc3QtaWQnXTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSAoQXJyYXkuaXNBcnJheShoZHIpID8gaGRyWzBdIDogaGRyKSB8fCB1dWlkKCk7XG4gICAgcmVxLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVJlcXVlc3QtSWQnLCByZXF1ZXN0SWQpO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gSGVhbHRoIGNoZWNrIHJlZ2lzdGVyZWQgYmVmb3JlIHJhdGUgbGltaXRlciBzbyBpdCBpcyBuZXZlciB0aHJvdHRsZWRcbiAgYXBwLnVzZShjcmVhdGVIZWFsdGhSb3V0ZXIoe1xuICAgIHNlcnZpY2VOYW1lOiBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ2FwaScsXG4gICAgY2hlY2tEZXBlbmRlbmNpZXMsXG4gIH0pKTtcblxuICAvLyBXYXJtLXVwIGVuZHBvaW50IOKAlCBwcmUtb3BlbnMgY29ubmVjdGlvbiBwb29scyBzbyB0aGUgZmlyc3QgcmVhbCByZXF1ZXN0XG4gIC8vIGRvZXNuJ3QgcGF5IGNvbGQtc3RhcnQgbGF0ZW5jeS4gQWx3YXlzIHBpbmdzIFBvc3RncmVzOyBzZXJ2aWNlcyB1c2luZ1xuICAvLyBNb25nbyAvIFJlZGlzIC8gU1FTIHBhc3MgYHdhcm11cEhvb2tzYCBzbyB0aG9zZSBhcmUgd2FybWVkIGluIHBhcmFsbGVsLlxuICBhcHAuZ2V0KCcvd2FybXVwJywgYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRDb25uZWN0aW9uKCkudGVzdENvbm5lY3Rpb24oKSxcbiAgICAgICAgLi4ud2FybXVwSG9va3MubWFwKChob29rKSA9PiBob29rKCkpLFxuICAgICAgXSk7XG4gICAgICBzZW5kU3VjY2VzcyhyZXMsIDIwMCwgeyB3YXJtZWQ6IHRydWUsIGhvb2tzOiB3YXJtdXBIb29rcy5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdXYXJtdXAgZmFpbGVkJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgZW5kcG9pbnQg4oCUIGFsd2F5cyByZWdpc3RlcmVkIChuZXZlciB0aHJvdHRsZWQpXG4gIGFwcC5nZXQoJy9tZXRyaWNzJywgbWV0cmljc0hhbmRsZXIoKSk7XG5cbiAgLy8gT3BlbkFQSSBzcGVjIGFuZCBTd2FnZ2VyIFVJIChyZWdpc3RlcmVkIGJlZm9yZSByYXRlIGxpbWl0ZXIpXG4gIGlmIChlbmFibGVPcGVuQXBpKSB7XG4gICAgY29uc3Qgc3BlYyA9IGdlbmVyYXRlT3BlbkFwaVNwZWMob3BlbkFwaU9wdGlvbnMpO1xuICAgIGFwcC5nZXQoJy9kb2NzL29wZW5hcGkuanNvbicsIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICByZXMuanNvbihzcGVjKTtcbiAgICB9KTtcbiAgICBhcHAudXNlKCcvZG9jcycsIHN3YWdnZXJVaS5zZXJ2ZSwgc3dhZ2dlclVpLnNldHVwKHNwZWMsIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogb3BlbkFwaU9wdGlvbnM/LnRpdGxlID8/ICdQaXBlbGluZSBCdWlsZGVyIEFQSSBEb2NzJyxcbiAgICB9KSk7XG4gIH1cblxuICAvLyBSYXRlIGxpbWl0aW5nIOKAlCB1c2VzIFJlZGlzIHdoZW4gcmVkaXNVcmwgaXMgcHJvdmlkZWQgZm9yIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgaW5zdGFuY2VzXG4gIGlmIChlbmFibGVSYXRlTGltaXQpIHtcbiAgICBjb25zdCByYXRlTGltaXRDb25maWcgPSBDb25maWcuZ2V0KCdyYXRlTGltaXQnKTtcblxuICAgIGNvbnN0IHJhdGVMaW1pdE9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgICBtYXg6IHJhdGVMaW1pdENvbmZpZy5tYXgsXG4gICAgICB3aW5kb3dNczogcmF0ZUxpbWl0Q29uZmlnLndpbmRvd01zLFxuICAgICAgc3RhbmRhcmRIZWFkZXJzOiB0cnVlLFxuICAgICAgbGVnYWN5SGVhZGVyczogZmFsc2UsXG4gICAgICAvLyBTa2lwIHJhdGUgbGltaXRpbmcgZm9yIGludGVybmFsIHNlcnZpY2UgY2FsbHMgKGluaXQgc2NyaXB0cywgaW50ZXItc2VydmljZSlcbiAgICAgIHNraXA6IChyZXE6IFJlcXVlc3QpID0+IHJlcS5oZWFkZXJzWyd4LWludGVybmFsLXNlcnZpY2UnXSA9PT0gJ3RydWUnLFxuICAgICAgLy8gUGVyLW9yZyBrZXk6IHVzZSBvcmdJZCBmcm9tIEpXVCB3aGVuIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIElQLlxuICAgICAgLy8gaXBLZXlHZW5lcmF0b3Igbm9ybWFsaXplcyBJUHY2IHRvIGEgLzY0IHByZWZpeCBzbyBhIHNpbmdsZSB1c2VyIGNhbid0XG4gICAgICAvLyByb3RhdGUgbG93LWJpdHMgdG8gZXNjYXBlIHRoZSBidWNrZXQ7IGV4cHJlc3MtcmF0ZS1saW1pdCA4Lngnc1xuICAgICAgLy8gdmFsaWRhdG9yIGFsc28gcmVmdXNlcyB0byBzdGFydCB3aXRob3V0IGl0LlxuICAgICAga2V5R2VuZXJhdG9yOiAocmVxOiBSZXF1ZXN0KSA9PiBnZXRPcmdJZChyZXEpIHx8IGlwS2V5R2VuZXJhdG9yKHJlcS5pcCB8fCAnYW5vbicsIDY0KSxcbiAgICAgIGhhbmRsZXI6IChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDQyOSwgJ1RvbyBtYW55IHJlcXVlc3RzLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsIEVycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIFVzZSBSZWRpcyBzdG9yZSB3aGVuIGF2YWlsYWJsZSBmb3Igc2hhcmVkIHN0YXRlIGFjcm9zcyBpbnN0YW5jZXNcbiAgICBpZiAob3B0aW9ucy5yZWRpc1VybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgY29uc3QgeyBSZWRpc1N0b3JlIH0gPSByZXF1aXJlKCdyYXRlLWxpbWl0LXJlZGlzJyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgICAgIGNvbnN0IFJlZGlzID0gcmVxdWlyZSgnaW9yZWRpcycpO1xuICAgICAgICBjb25zdCByZWRpc0NsaWVudCA9IG5ldyBSZWRpcyhvcHRpb25zLnJlZGlzVXJsKTtcbiAgICAgICAgcmF0ZUxpbWl0T3B0aW9ucy5zdG9yZSA9IG5ldyBSZWRpc1N0b3JlKHtcbiAgICAgICAgICBzZW5kQ29tbWFuZDogKC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiByZWRpc0NsaWVudC5jYWxsKC4uLmFyZ3MpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3JhdGUtbGltaXQnKS53YXJuKCdSZWRpcyBzdG9yZSB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIGluLW1lbW9yeSByYXRlIGxpbWl0aW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwLnVzZShyYXRlTGltaXQocmF0ZUxpbWl0T3B0aW9ucykpO1xuICB9XG5cbiAgLy8gRXhwcmVzcyByZXF1ZXN0IHRpbWVvdXQg4oCUIHVzZXMgQ29yZUNvbnN0YW50cyB0byBzaGFyZSB0aGUgc2FtZSBkZWZhdWx0IGFzIExhbWJkYSBoYW5kbGVyc1xuICBjb25zdCB0aW1lb3V0TXMgPSBDb3JlQ29uc3RhbnRzLkhBTkRMRVJfVElNRU9VVF9NUztcbiAgYXBwLnVzZSgoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgcmVzLnNldFRpbWVvdXQodGltZW91dE1zLCAoKSA9PiB7XG4gICAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA1MDMsICdSZXF1ZXN0IHRpbWVvdXQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIFJlcXVlc3QgZHVyYXRpb24gbG9nZ2luZ1xuICBjb25zdCBkdXJhdGlvbkxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVxdWVzdC1kdXJhdGlvbicpO1xuICBhcHAudXNlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICByZXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgZHVyYXRpb25Mb2dnZXIuaW5mbyhgJHtyZXEubWV0aG9kfSAke3JlcS5vcmlnaW5hbFVybH0gJHtyZXMuc3RhdHVzQ29kZX0gJHtkdXJhdGlvbn1tc2AsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEub3JpZ2luYWxVcmwsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICBkdXJhdGlvbk1zOiBkdXJhdGlvbixcbiAgICAgICAgcmVxdWVzdElkOiByZXEucmVxdWVzdElkLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgbWlkZGxld2FyZSDigJQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudFxuICBhcHAudXNlKG1ldHJpY3NNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIElkZW1wb3RlbmN5IGtleSBzdXBwb3J0IGZvciBtdXRhdGlvbiBlbmRwb2ludHNcbiAgYXBwLnVzZShpZGVtcG90ZW5jeU1pZGRsZXdhcmUoKSk7XG5cbiAgLy8gU1NFIGxvZ3MgZW5kcG9pbnRcbiAgYXBwLmdldCgnL2xvZ3MvOnJlcXVlc3RJZCcsIHNzZU1hbmFnZXIubWlkZGxld2FyZSgpKTtcblxuICByZXR1cm4geyBhcHAsIHNzZU1hbmFnZXIgfTtcbn1cbiJdfQ==
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVuSyxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RixPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sT0FBTyxFQUFFLEVBQWdFLE1BQU0sU0FBUyxDQUFDO0FBQ2hHLE9BQU8sU0FBUyxFQUFFLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0QseUVBQXlFO0FBQ3pFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBb0Q5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7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RyxFQUFFLENBQUM7UUFDekIsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDcEMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVEsSUFBSSxFQUFFO2dCQUN0RixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07Z0JBQ2xCLElBQUksRUFBRSxHQUFHLENBQUMsV0FBVztnQkFDckIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO2dCQUMxQixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO2FBQ3pCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztJQUVILHFFQUFxRTtJQUNyRSxHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUU3QixpREFBaUQ7SUFDakQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFFakMsb0JBQW9CO0lBQ3BCLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFFckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRTdWNjZXNzLCBzZW5kRXJyb3IsIGdlbmVyYXRlT3BlbkFwaVNwZWMsIEVycm9yQ29kZSwgY3JlYXRlTG9nZ2VyLCBnZXRPcmdJZCwgY3JlYXRlSGVhbHRoUm91dGVyLCBzZXRDb3VudGVyRW1pdHRlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgT3BlbkFwaVNwZWNPcHRpb25zIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzLCBnZXRDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgZXhwcmVzcywgeyB0eXBlIEV4cHJlc3MsIHR5cGUgTmV4dEZ1bmN0aW9uLCB0eXBlIFJlcXVlc3QsIHR5cGUgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCByYXRlTGltaXQsIHsgaXBLZXlHZW5lcmF0b3IgfSBmcm9tICdleHByZXNzLXJhdGUtbGltaXQnO1xuaW1wb3J0IGhlbG1ldCBmcm9tICdoZWxtZXQnO1xuaW1wb3J0IHN3YWdnZXJVaSBmcm9tICdzd2FnZ2VyLXVpLWV4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgZXRhZ01pZGRsZXdhcmUgfSBmcm9tICcuL2V0YWctbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBpZGVtcG90ZW5jeU1pZGRsZXdhcmUgfSBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgbWV0cmljc01pZGRsZXdhcmUsIG1ldHJpY3NIYW5kbGVyLCBpbmNDb3VudGVyIH0gZnJvbSAnLi9tZXRyaWNzLmpzJztcbmltcG9ydCB7IFNTRU1hbmFnZXIgfSBmcm9tICcuLi9odHRwL3NzZS1jb25uZWN0aW9uLW1hbmFnZXIuanMnO1xuXG4vLyBXaXJlIGFwaS1jb3JlJ3MgY291bnRlciBzaGltIHRvIHRoZSByZWFsIHByb20tY2xpZW50IHJlZ2lzdHJ5LiBUaGlzIGlzXG4vLyBhIG5vLW9wIHVudGlsIGluY0NvdW50ZXIgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAobGF6eSByZWdpc3RyYXRpb25cbi8vIGluIG1ldHJpY3MudHMpLCBhbmQgbGV0cyBhcGktY29yZSBoZWxwZXJzIGxpa2UgdGhlIHF1b3RhIGNsaWVudCByZWNvcmRcbi8vIGBxdW90YV9mYWlsX29wZW5fdG90YWxgIHdpdGhvdXQgdGFraW5nIGEgaGFyZCBkZXAgb24gYXBpLXNlcnZlci5cbnNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBPcHRpb25zIHtcbiAgLyoqIEVuYWJsZSBDT1JTIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb3JzPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVycyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlSGVsbWV0PzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVSYXRlTGltaXQ/OiBib29sZWFuO1xuICAvKiogUmVkaXMgVVJMIGZvciBzaGFyZWQgcmF0ZS1saW1pdCBzdGF0ZSAoZS5nLiAncmVkaXM6Ly9ob3N0OjYzNzknKS4gSW4tbWVtb3J5IHdoZW4gb21pdHRlZC4gKi9cbiAgcmVkaXNVcmw/OiBzdHJpbmc7XG4gIC8qKiBFbmFibGUgSlNPTiBib2R5IHBhcnNpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUpzb25Cb2R5PzogYm9vbGVhbjtcbiAgLyoqIEpTT04gYm9keSBzaXplIGxpbWl0IChkZWZhdWx0OiAnMW1iJykgKi9cbiAganNvbkxpbWl0Pzogc3RyaW5nO1xuICAvKiogRW5hYmxlIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlVXJsRW5jb2RlZD86IGJvb2xlYW47XG4gIC8qKiBVUkwtZW5jb2RlZCBib2R5IHNpemUgbGltaXQgKGRlZmF1bHQ6ICcxbWInKSAqL1xuICB1cmxFbmNvZGVkTGltaXQ/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBIZWFsdGggY2hlY2sgZGVwZW5kZW5jeSBjaGVja2VyIOKAlCBpZiBwcm92aWRlZCwgL2hlYWx0aCByZXBvcnRzIGRlcGVuZGVuY3kgc3RhdHVzICovXG4gIGNoZWNrRGVwZW5kZW5jaWVzPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnIHwgJ3Vua25vd24nPj47XG4gIC8qKiBFbmFibGUgT3BlbkFQSSBzcGVjIGF0IC9kb2NzL29wZW5hcGkuanNvbiBhbmQgU3dhZ2dlciBVSSBhdCAvZG9jcyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlT3BlbkFwaT86IGJvb2xlYW47XG4gIC8qKiBPcGVuQVBJIHNwZWMgY3VzdG9taXphdGlvbiBvcHRpb25zICovXG4gIG9wZW5BcGlPcHRpb25zPzogT3BlbkFwaVNwZWNPcHRpb25zO1xuICAvKiogRW5hYmxlIGd6aXAvZGVmbGF0ZSByZXNwb25zZSBjb21wcmVzc2lvbiAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgd2FybXVwIGNhbGxiYWNrcyBpbnZva2VkIGJ5IGBHRVQgL3dhcm11cGAgaW4gYWRkaXRpb24gdG8gdGhlXG4gICAqIGRlZmF1bHQgUG9zdGdyZXMgcGluZy4gVXNlIGZvciBzZXJ2aWNlcyB0aGF0IGRlcGVuZCBvbiBNb25nbywgUmVkaXMsXG4gICAqIFNRUywgZXRjLiDigJQgcHJlLXdhcm1pbmcgb3BlbnMgY29ubmVjdGlvbiBwb29scyBiZWZvcmUgcmVhbCB0cmFmZmljXG4gICAqIGFycml2ZXMuIEVhY2ggY2FsbGJhY2sgc2hvdWxkIHJlc29sdmUgd2hlbiBpdHMgZGVwZW5kZW5jeSBpcyByZWFkeTtcbiAgICogYW55IHJlamVjdGlvbiBjYXVzZXMgL3dhcm11cCB0byByZXR1cm4gNTAzLlxuICAgKi9cbiAgd2FybXVwSG9va3M/OiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+Pjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY3JlYXRpbmcgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFwcFJlc3VsdCB7XG4gIC8qKiBDb25maWd1cmVkIEV4cHJlc3MgYXBwbGljYXRpb24gKi9cbiAgYXBwOiBFeHByZXNzO1xuICAvKiogU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcjogU1NFTWFuYWdlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhbiBFeHByZXNzIGFwcGxpY2F0aW9uIHdpdGggY29tbW9uIG1pZGRsZXdhcmVcbiAqXG4gKiBTZXRzIHVwOlxuICogLSBDT1JTIHdpdGggY29uZmlndXJlZCBvcmlnaW5zXG4gKiAtIEhlbG1ldCBzZWN1cml0eSBoZWFkZXJzXG4gKiAtIFJhdGUgbGltaXRpbmdcbiAqIC0gSlNPTiBhbmQgVVJMLWVuY29kZWQgYm9keSBwYXJzaW5nXG4gKiAtIFRydXN0IHByb3h5IHNldHRpbmdzXG4gKiAtIEhlYWx0aCBjaGVjayBlbmRwb2ludCAoL2hlYWx0aClcbiAqIC0gTWV0cmljcyBlbmRwb2ludCAoL21ldHJpY3MpXG4gKiAtIFNTRSBsb2dzIGVuZHBvaW50ICgvbG9ncy86cmVxdWVzdElkKVxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEV4cHJlc3MgYXBwIGFuZCBTU0UgbWFuYWdlclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB7IGFwcCwgc3NlTWFuYWdlciB9ID0gY3JlYXRlQXBwKCk7XG4gKlxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgIC8vIFlvdXIgcm91dGUgaGFuZGxlclxuICogfSk7XG4gKlxuICogc3RhcnRTZXJ2ZXIoYXBwLCB7IG5hbWU6ICdNeSBTZXJ2aWNlJyB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBwKG9wdGlvbnM6IENyZWF0ZUFwcE9wdGlvbnMgPSB7fSk6IENyZWF0ZUFwcFJlc3VsdCB7XG4gIGNvbnN0IHtcbiAgICBlbmFibGVDb3JzID0gdHJ1ZSxcbiAgICBlbmFibGVIZWxtZXQgPSB0cnVlLFxuICAgIGVuYWJsZVJhdGVMaW1pdCA9IHRydWUsXG4gICAgZW5hYmxlSnNvbkJvZHkgPSB0cnVlLFxuICAgIGpzb25MaW1pdCA9ICcxbWInLFxuICAgIGVuYWJsZVVybEVuY29kZWQgPSB0cnVlLFxuICAgIHVybEVuY29kZWRMaW1pdCA9ICcxbWInLFxuICAgIHNzZU1hbmFnZXIgPSBuZXcgU1NFTWFuYWdlcigpLFxuICAgIGNoZWNrRGVwZW5kZW5jaWVzLFxuICAgIGVuYWJsZU9wZW5BcGkgPSB0cnVlLFxuICAgIG9wZW5BcGlPcHRpb25zLFxuICAgIGVuYWJsZUNvbXByZXNzaW9uID0gdHJ1ZSxcbiAgICB3YXJtdXBIb29rcyA9IFtdLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBGYWlsIGZhc3QgaWYgSldUX1NFQ1JFVCBpcyBub3QgY29uZmlndXJlZCDigJQgcHJldmVudHMgc2lsZW50IGF1dGggZmFpbHVyZXMgYXQgcnVudGltZVxuICBpZiAoIXByb2Nlc3MuZW52LkpXVF9TRUNSRVQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0pXVF9TRUNSRVQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQuIFNldCBpdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHNlcnZlci4nKTtcbiAgfVxuXG4gIC8vIE9wZW5UZWxlbWV0cnkgaXMgTk9UIGluaXRpYWxpemVkIGhlcmU6IGJ5IHRoZSB0aW1lIGNyZWF0ZUFwcCBydW5zLCBleHByZXNzXG4gIC8vIGFuZCBodHRwIGhhdmUgYWxyZWFkeSBiZWVuIHJlcXVpcmVkLCBzbyB0aGUgYXV0by1pbnN0cnVtZW50YXRpb24gaG9va3NcbiAgLy8gd291bGQgaGF2ZSBub3RoaW5nIHRvIHBhdGNoIChubyBpbmJvdW5kIHNwYW4g4oaSIG5vIHRyYWNlIGlkKS4gVHJhY2luZyBpc1xuICAvLyBzdGFydGVkIGJ5IHRoZSBgb3RlbC1ib290c3RyYXAuanNgIHByZWxvYWQgaW5zdGVhZCAobm9kZSAtciDigKYg4oCUIHNlZSBlYWNoXG4gIC8vIHNlcnZpY2UncyBEb2NrZXJmaWxlIENNRCAvIHN0YXJ0IHNjcmlwdCksIHdoaWNoIHJ1bnMgYmVmb3JlIGFueVxuICAvLyBpbnN0cnVtZW50ZWQgbW9kdWxlIGxvYWRzLiBgY3VycmVudFRyYWNlSWQoKWAgdGhlbiByZWFkcyB0aGUgYWN0aXZlIHNwYW4uXG5cbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBTZWN1cml0eSBtaWRkbGV3YXJlLlxuICAvL1xuICAvLyBTd2FnZ2VyIFVJIG5lZWRzIHVuc2FmZS1pbmxpbmUgKyB1bnNhZmUtZXZhbCBmb3IgaXRzIGJ1bmRsZWQgc2NyaXB0cyDigJRcbiAgLy8gYnV0IHdlIG9ubHkgcmVsYXggQ1NQIHRoYXQgZmFyIHdoZW4gKGEpIE9wZW5BUEkgaXMgZW5hYmxlZCBBTkQgKGIpIHdlJ3JlXG4gIC8vIG5vdCBpbiBwcm9kdWN0aW9uLiBJbiBwcm9kLCBTd2FnZ2VyIHNob3VsZCBiZSBzZXJ2ZWQgYmVoaW5kIGEgc2VwYXJhdGVcbiAgLy8gaG9zdCBvciBhdXRoLWdhdGVkIHJvdXRlOyB0aGUgbWFpbiBhcHAga2VlcHMgdGhlIHN0cmljdCBDU1Agc28gYSBTdG9yZWRcbiAgLy8gWFNTIGluIGFueSBoYW5kbGVyIGNhbid0IGBldmFsKClgIGFyYml0cmFyeSBzY3JpcHQuXG4gIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGFsbG93U3dhZ2dlckNzcCA9IGVuYWJsZU9wZW5BcGkgJiYgIWlzUHJvZHVjdGlvbjtcbiAgaWYgKGVuYWJsZUhlbG1ldCkge1xuICAgIGFwcC51c2UoaGVsbWV0KHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICBkaXJlY3RpdmVzOiB7XG4gICAgICAgICAgZGVmYXVsdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHNjcmlwdFNyYzogYWxsb3dTd2FnZ2VyQ3NwXG4gICAgICAgICAgICA/IFtcIidzZWxmJ1wiLCBcIid1bnNhZmUtaW5saW5lJ1wiLCBcIid1bnNhZmUtZXZhbCdcIl1cbiAgICAgICAgICAgIDogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHN0eWxlU3JjOiBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIl0sXG4gICAgICAgICAgaW1nU3JjOiBbXCInc2VsZidcIiwgJ2RhdGE6JywgJ2Jsb2I6J10sXG4gICAgICAgICAgY29ubmVjdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIGZvbnRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBvYmplY3RTcmM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBmcmFtZUFuY2VzdG9yczogW1wiJ25vbmUnXCJdLFxuICAgICAgICAgIGJhc2VVcmk6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb3JtQWN0aW9uOiBbXCInc2VsZidcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChlbmFibGVDb3JzKSB7XG4gICAgYXBwLnVzZShjb3JzKHNlcnZlckNvbmZpZy5jb3JzKSk7XG4gIH1cblxuICAvLyBSZXNwb25zZSBjb21wcmVzc2lvbiAoZ3ppcC9kZWZsYXRlKSDigJQgc2tpcCBTU0Ugc3RyZWFtc1xuICBpZiAoZW5hYmxlQ29tcHJlc3Npb24pIHtcbiAgICBhcHAudXNlKGNvbXByZXNzaW9uKHtcbiAgICAgIGZpbHRlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBjb21wcmVzcyBTU0Ugc3RyZWFtc1xuICAgICAgICBpZiAocmVxLmhlYWRlcnMuYWNjZXB0ID09PSAndGV4dC9ldmVudC1zdHJlYW0nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb21wcmVzc2lvbi5maWx0ZXIocmVxLCByZXMpO1xuICAgICAgfSxcbiAgICAgIHRocmVzaG9sZDogQ29yZUNvbnN0YW50cy5DT01QUkVTU0lPTl9USFJFU0hPTERfQllURVMsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gRVRhZyBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBHRVQgcmVxdWVzdHMgKDMwNCBOb3QgTW9kaWZpZWQpXG4gIGFwcC51c2UoZXRhZ01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gQm9keSBwYXJzaW5nXG4gIGlmIChlbmFibGVKc29uQm9keSkge1xuICAgIGFwcC51c2UoZXhwcmVzcy5qc29uKHsgbGltaXQ6IGpzb25MaW1pdCB9KSk7XG4gIH1cblxuICBpZiAoZW5hYmxlVXJsRW5jb2RlZCkge1xuICAgIGFwcC51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUsIGxpbWl0OiB1cmxFbmNvZGVkTGltaXQgfSkpO1xuICB9XG5cbiAgLy8gVHJ1c3QgcHJveHkgKG11c3QgYmUgc2V0IGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gcmVxLmlwIHJlc29sdmVzIGNvcnJlY3RseSlcbiAgYXBwLnNldCgndHJ1c3QgcHJveHknLCBzZXJ2ZXJDb25maWcudHJ1c3RQcm94eSk7XG5cbiAgLy8gUmVxdWVzdCBJRCDigJQgcHJlZmVyIGV4aXN0aW5nIGhlYWRlciBmcm9tIG5naW54LCBvdGhlcndpc2UgZ2VuZXJhdGUgb25lXG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3QgaGRyID0gcmVxLmhlYWRlcnNbJ3gtcmVxdWVzdC1pZCddO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChBcnJheS5pc0FycmF5KGhkcikgPyBoZHJbMF0gOiBoZHIpIHx8IHV1aWQoKTtcbiAgICByZXEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtUmVxdWVzdC1JZCcsIHJlcXVlc3RJZCk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBIZWFsdGggY2hlY2sgcmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyIHNvIGl0IGlzIG5ldmVyIHRocm90dGxlZFxuICBhcHAudXNlKGNyZWF0ZUhlYWx0aFJvdXRlcih7XG4gICAgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJyxcbiAgICBjaGVja0RlcGVuZGVuY2llcyxcbiAgfSkpO1xuXG4gIC8vIFdhcm0tdXAgZW5kcG9pbnQg4oCUIHByZS1vcGVucyBjb25uZWN0aW9uIHBvb2xzIHNvIHRoZSBmaXJzdCByZWFsIHJlcXVlc3RcbiAgLy8gZG9lc24ndCBwYXkgY29sZC1zdGFydCBsYXRlbmN5LiBBbHdheXMgcGluZ3MgUG9zdGdyZXM7IHNlcnZpY2VzIHVzaW5nXG4gIC8vIE1vbmdvIC8gUmVkaXMgLyBTUVMgcGFzcyBgd2FybXVwSG9va3NgIHNvIHRob3NlIGFyZSB3YXJtZWQgaW4gcGFyYWxsZWwuXG4gIGFwcC5nZXQoJy93YXJtdXAnLCBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdldENvbm5lY3Rpb24oKS50ZXN0Q29ubmVjdGlvbigpLFxuICAgICAgICAuLi53YXJtdXBIb29rcy5tYXAoKGhvb2spID0+IGhvb2soKSksXG4gICAgICBdKTtcbiAgICAgIHNlbmRTdWNjZXNzKHJlcywgMjAwLCB7IHdhcm1lZDogdHJ1ZSwgaG9va3M6IHdhcm11cEhvb2tzLmxlbmd0aCB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ1dhcm11cCBmYWlsZWQnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludCDigJQgYWx3YXlzIHJlZ2lzdGVyZWQgKG5ldmVyIHRocm90dGxlZClcbiAgYXBwLmdldCgnL21ldHJpY3MnLCBtZXRyaWNzSGFuZGxlcigpKTtcblxuICAvLyBPcGVuQVBJIHNwZWMgYW5kIFN3YWdnZXIgVUkgKHJlZ2lzdGVyZWQgYmVmb3JlIHJhdGUgbGltaXRlcilcbiAgaWYgKGVuYWJsZU9wZW5BcGkpIHtcbiAgICBjb25zdCBzcGVjID0gZ2VuZXJhdGVPcGVuQXBpU3BlYyhvcGVuQXBpT3B0aW9ucyk7XG4gICAgYXBwLmdldCgnL2RvY3Mvb3BlbmFwaS5qc29uJywgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIHJlcy5qc29uKHNwZWMpO1xuICAgIH0pO1xuICAgIGFwcC51c2UoJy9kb2NzJywgc3dhZ2dlclVpLnNlcnZlLCBzd2FnZ2VyVWkuc2V0dXAoc3BlYywge1xuICAgICAgY3VzdG9tU2l0ZVRpdGxlOiBvcGVuQXBpT3B0aW9ucz8udGl0bGUgPz8gJ1BpcGVsaW5lIEJ1aWxkZXIgQVBJIERvY3MnLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIFJhdGUgbGltaXRpbmcg4oCUIHVzZXMgUmVkaXMgd2hlbiByZWRpc1VybCBpcyBwcm92aWRlZCBmb3Igc2hhcmVkIHN0YXRlIGFjcm9zcyBpbnN0YW5jZXNcbiAgaWYgKGVuYWJsZVJhdGVMaW1pdCkge1xuICAgIGNvbnN0IHJhdGVMaW1pdENvbmZpZyA9IENvbmZpZy5nZXQoJ3JhdGVMaW1pdCcpO1xuXG4gICAgY29uc3QgcmF0ZUxpbWl0T3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcmF0ZUxpbWl0PlswXSA9IHtcbiAgICAgIG1heDogcmF0ZUxpbWl0Q29uZmlnLm1heCxcbiAgICAgIHdpbmRvd01zOiByYXRlTGltaXRDb25maWcud2luZG93TXMsXG4gICAgICBzdGFuZGFyZEhlYWRlcnM6IHRydWUsXG4gICAgICBsZWdhY3lIZWFkZXJzOiBmYWxzZSxcbiAgICAgIC8vIFNraXAgcmF0ZSBsaW1pdGluZyBmb3IgaW50ZXJuYWwgc2VydmljZSBjYWxscyAoaW5pdCBzY3JpcHRzLCBpbnRlci1zZXJ2aWNlKVxuICAgICAgc2tpcDogKHJlcTogUmVxdWVzdCkgPT4gcmVxLmhlYWRlcnNbJ3gtaW50ZXJuYWwtc2VydmljZSddID09PSAndHJ1ZScsXG4gICAgICAvLyBQZXItb3JnIGtleTogdXNlIG9yZ0lkIGZyb20gSldUIHdoZW4gYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gSVAuXG4gICAgICAvLyBpcEtleUdlbmVyYXRvciBub3JtYWxpemVzIElQdjYgdG8gYSAvNjQgcHJlZml4IHNvIGEgc2luZ2xlIHVzZXIgY2FuJ3RcbiAgICAgIC8vIHJvdGF0ZSBsb3ctYml0cyB0byBlc2NhcGUgdGhlIGJ1Y2tldDsgZXhwcmVzcy1yYXRlLWxpbWl0IDgueCdzXG4gICAgICAvLyB2YWxpZGF0b3IgYWxzbyByZWZ1c2VzIHRvIHN0YXJ0IHdpdGhvdXQgaXQuXG4gICAgICBrZXlHZW5lcmF0b3I6IChyZXE6IFJlcXVlc3QpID0+IGdldE9yZ0lkKHJlcSkgfHwgaXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpLFxuICAgICAgaGFuZGxlcjogKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCAnVG9vIG1hbnkgcmVxdWVzdHMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERUQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIFJlZGlzIHN0b3JlIHdoZW4gYXZhaWxhYmxlIGZvciBzaGFyZWQgc3RhdGUgYWNyb3NzIGluc3RhbmNlc1xuICAgIGlmIChvcHRpb25zLnJlZGlzVXJsKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgICBjb25zdCB7IFJlZGlzU3RvcmUgfSA9IHJlcXVpcmUoJ3JhdGUtbGltaXQtcmVkaXMnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgY29uc3QgUmVkaXMgPSByZXF1aXJlKCdpb3JlZGlzJyk7XG4gICAgICAgIGNvbnN0IHJlZGlzQ2xpZW50ID0gbmV3IFJlZGlzKG9wdGlvbnMucmVkaXNVcmwpO1xuICAgICAgICByYXRlTGltaXRPcHRpb25zLnN0b3JlID0gbmV3IFJlZGlzU3RvcmUoe1xuICAgICAgICAgIHNlbmRDb21tYW5kOiAoLi4uYXJnczogc3RyaW5nW10pID0+IHJlZGlzQ2xpZW50LmNhbGwoLi4uYXJncyksXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNyZWF0ZUxvZ2dlcigncmF0ZS1saW1pdCcpLndhcm4oJ1JlZGlzIHN0b3JlIHVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gaW4tbWVtb3J5IHJhdGUgbGltaXRpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhcHAudXNlKHJhdGVMaW1pdChyYXRlTGltaXRPcHRpb25zKSk7XG4gIH1cblxuICAvLyBFeHByZXNzIHJlcXVlc3QgdGltZW91dCDigJQgdXNlcyBDb3JlQ29uc3RhbnRzIHRvIHNoYXJlIHRoZSBzYW1lIGRlZmF1bHQgYXMgTGFtYmRhIGhhbmRsZXJzXG4gIGNvbnN0IHRpbWVvdXRNcyA9IENvcmVDb25zdGFudHMuSEFORExFUl9USU1FT1VUX01TO1xuICBhcHAudXNlKChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICByZXMuc2V0VGltZW91dCh0aW1lb3V0TXMsICgpID0+IHtcbiAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ1JlcXVlc3QgdGltZW91dCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gUmVxdWVzdCBkdXJhdGlvbiBsb2dnaW5nXG4gIGNvbnN0IGR1cmF0aW9uTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXF1ZXN0LWR1cmF0aW9uJyk7XG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgICBkdXJhdGlvbkxvZ2dlci5pbmZvKGAke3JlcS5tZXRob2R9ICR7cmVxLm9yaWdpbmFsVXJsfSAke3Jlcy5zdGF0dXNDb2RlfSAke2R1cmF0aW9ufW1zYCwge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5vcmlnaW5hbFVybCxcbiAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgIGR1cmF0aW9uTXM6IGR1cmF0aW9uLFxuICAgICAgICByZXF1ZXN0SWQ6IHJlcS5yZXF1ZXN0SWQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIFByb21ldGhldXMgbWV0cmljcyBtaWRkbGV3YXJlIOKAlCByZWNvcmRzIHJlcXVlc3QgZHVyYXRpb24gYW5kIGNvdW50XG4gIGFwcC51c2UobWV0cmljc01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gSWRlbXBvdGVuY3kga2V5IHN1cHBvcnQgZm9yIG11dGF0aW9uIGVuZHBvaW50c1xuICBhcHAudXNlKGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpKTtcblxuICAvLyBTU0UgbG9ncyBlbmRwb2ludFxuICBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuXG4gIHJldHVybiB7IGFwcCwgc3NlTWFuYWdlciB9O1xufVxuIl19
|
package/lib/api/check-quota.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { QuotaType, QuotaService } from '@pipeline-builder/api-core';
|
|
2
|
-
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
3
3
|
/**
|
|
4
4
|
* Create middleware that checks a specific quota type before proceeding.
|
|
5
5
|
*
|
package/lib/api/check-quota.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)('check-quota');
|
|
3
|
+
import { ErrorCode, createLogger, sendError } from '@pipeline-builder/api-core';
|
|
4
|
+
import { getContext } from './get-context.js';
|
|
5
|
+
const logger = createLogger('check-quota');
|
|
9
6
|
/** Human-readable labels for quota exceeded messages. */
|
|
10
7
|
const QUOTA_LABELS = {
|
|
11
8
|
apiCalls: 'API call',
|
|
@@ -28,12 +25,12 @@ const QUOTA_LABELS = {
|
|
|
28
25
|
* @param quotaType - Which quota to check (e.g. 'apiCalls', 'pipelines', 'plugins')
|
|
29
26
|
* @returns Express middleware
|
|
30
27
|
*/
|
|
31
|
-
function checkQuota(quotaService, quotaType) {
|
|
28
|
+
export function checkQuota(quotaService, quotaType) {
|
|
32
29
|
return async (req, res, next) => {
|
|
33
30
|
let orgId;
|
|
34
31
|
let authHeader = '';
|
|
35
32
|
try {
|
|
36
|
-
const ctx =
|
|
33
|
+
const ctx = getContext(req);
|
|
37
34
|
orgId = ctx.identity.orgId;
|
|
38
35
|
authHeader = req.headers.authorization || '';
|
|
39
36
|
}
|
|
@@ -43,7 +40,7 @@ function checkQuota(quotaService, quotaType) {
|
|
|
43
40
|
return next();
|
|
44
41
|
}
|
|
45
42
|
if (!orgId) {
|
|
46
|
-
|
|
43
|
+
sendError(res, 400, 'Organization ID is required for quota check', ErrorCode.VALIDATION_ERROR);
|
|
47
44
|
return;
|
|
48
45
|
}
|
|
49
46
|
try {
|
|
@@ -54,7 +51,7 @@ function checkQuota(quotaService, quotaType) {
|
|
|
54
51
|
limit: quotaStatus.limit,
|
|
55
52
|
used: quotaStatus.used,
|
|
56
53
|
});
|
|
57
|
-
|
|
54
|
+
sendError(res, 429, `${QUOTA_LABELS[quotaType]} quota exceeded. Please contact your administrator to increase your quota.`, ErrorCode.QUOTA_EXCEEDED, { quota: { type: quotaType, limit: quotaStatus.limit, used: quotaStatus.used, remaining: quotaStatus.remaining } });
|
|
58
55
|
return;
|
|
59
56
|
}
|
|
60
57
|
next();
|
|
@@ -70,4 +67,4 @@ function checkQuota(quotaService, quotaType) {
|
|
|
70
67
|
}
|
|
71
68
|
};
|
|
72
69
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stcXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2NoZWNrLXF1b3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQyx5REFBeUQ7QUFDekQsTUFBTSxZQUFZLEdBQThCO0lBQzlDLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsVUFBVSxFQUFFLFdBQVc7SUFDdkIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3RDLFVBQVUsRUFBRSxtQkFBbUI7Q0FDaEMsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3hCLFlBQTBCLEVBQzFCLFNBQW9CO0lBRXBCLE9BQU8sS0FBSyxFQUFFLEdBQVksRUFBRSxHQUFhLEVBQUUsSUFBa0IsRUFBaUIsRUFBRTtRQUM5RSxJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDM0IsVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZ0VBQWdFO1lBQ2hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUNwRSxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSw2Q0FBNkMsRUFBRSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMvRixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRTNFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLGlCQUFpQixFQUFFO29CQUN6QyxLQUFLO29CQUNMLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztvQkFDeEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2lCQUN2QixDQUFDLENBQUM7Z0JBRUgsU0FBUyxDQUNQLEdBQUcsRUFDSCxHQUFHLEVBQ0gsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLDRFQUE0RSxFQUN0RyxTQUFTLENBQUMsY0FBYyxFQUN4QixFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUNuSCxDQUFDO2dCQUNGLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGdFQUFnRTtZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxFQUFFO2dCQUN0RSxLQUFLO2dCQUNMLFNBQVM7Z0JBQ1QsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDOUQsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBFcnJvckNvZGUsIGNyZWF0ZUxvZ2dlciwgc2VuZEVycm9yIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBRdW90YVR5cGUsIFF1b3RhU2VydmljZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgZ2V0Q29udGV4dCB9IGZyb20gJy4vZ2V0LWNvbnRleHQuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NoZWNrLXF1b3RhJyk7XG5cbi8qKiBIdW1hbi1yZWFkYWJsZSBsYWJlbHMgZm9yIHF1b3RhIGV4Y2VlZGVkIG1lc3NhZ2VzLiAqL1xuY29uc3QgUVVPVEFfTEFCRUxTOiBSZWNvcmQ8UXVvdGFUeXBlLCBzdHJpbmc+ID0ge1xuICBhcGlDYWxsczogJ0FQSSBjYWxsJyxcbiAgYWlDYWxsczogJ0FJIGNhbGwnLFxuICBwaXBlbGluZXM6ICdQaXBlbGluZScsXG4gIHBsdWdpbnM6ICdQbHVnaW4nLFxuICBzdG9yYWdlQnl0ZXM6ICdSZWdpc3RyeSBzdG9yYWdlJyxcbiAgZGFzaGJvYXJkczogJ0Rhc2hib2FyZCcsXG4gIGFsZXJ0UnVsZXM6ICdBbGVydCBydWxlJyxcbiAgYWxlcnREZXN0aW5hdGlvbnM6ICdBbGVydCBkZXN0aW5hdGlvbicsXG4gIGlkcENvbmZpZ3M6ICdJZFAgY29uZmlndXJhdGlvbicsXG59O1xuXG4vKipcbiAqIENyZWF0ZSBtaWRkbGV3YXJlIHRoYXQgY2hlY2tzIGEgc3BlY2lmaWMgcXVvdGEgdHlwZSBiZWZvcmUgcHJvY2VlZGluZy5cbiAqXG4gKiBPbiBxdW90YSBleGNlZWRlZCwgcmV0dXJucyBhIDQyOSByZXNwb25zZSB3aXRoIHF1b3RhIGRldGFpbHMuXG4gKiBPbiBxdW90YSBzZXJ2aWNlIGZhaWx1cmUsIGZhaWxzIG9wZW4gKGFsbG93cyB0aGUgcmVxdWVzdCkuXG4gKlxuICogQHBhcmFtIHF1b3RhU2VydmljZSAtIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKiBAcGFyYW0gcXVvdGFUeXBlIC0gV2hpY2ggcXVvdGEgdG8gY2hlY2sgKGUuZy4gJ2FwaUNhbGxzJywgJ3BpcGVsaW5lcycsICdwbHVnaW5zJylcbiAqIEByZXR1cm5zIEV4cHJlc3MgbWlkZGxld2FyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tRdW90YShcbiAgcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuKSB7XG4gIHJldHVybiBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsZXQgb3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXV0aEhlYWRlciA9ICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN0eCA9IGdldENvbnRleHQocmVxKTtcbiAgICAgIG9yZ0lkID0gY3R4LmlkZW50aXR5Lm9yZ0lkO1xuICAgICAgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24gfHwgJyc7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDb250ZXh0IG1pZGRsZXdhcmUgbm90IGFwcGxpZWQg4oCUIGZhaWwgb3BlbiAobG9nIGFuZCBjb250aW51ZSlcbiAgICAgIGxvZ2dlci53YXJuKCdRdW90YSBjaGVjayBza2lwcGVkOiByZXF1ZXN0IGNvbnRleHQgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cblxuICAgIGlmICghb3JnSWQpIHtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDQwMCwgJ09yZ2FuaXphdGlvbiBJRCBpcyByZXF1aXJlZCBmb3IgcXVvdGEgY2hlY2snLCBFcnJvckNvZGUuVkFMSURBVElPTl9FUlJPUik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1b3RhU3RhdHVzID0gYXdhaXQgcXVvdGFTZXJ2aWNlLmNoZWNrKG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIpO1xuXG4gICAgICBpZiAoIXF1b3RhU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYCR7cXVvdGFUeXBlfSBxdW90YSBleGNlZWRlZGAsIHtcbiAgICAgICAgICBvcmdJZCxcbiAgICAgICAgICBsaW1pdDogcXVvdGFTdGF0dXMubGltaXQsXG4gICAgICAgICAgdXNlZDogcXVvdGFTdGF0dXMudXNlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VuZEVycm9yKFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICA0MjksXG4gICAgICAgICAgYCR7UVVPVEFfTEFCRUxTW3F1b3RhVHlwZV19IHF1b3RhIGV4Y2VlZGVkLiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IgdG8gaW5jcmVhc2UgeW91ciBxdW90YS5gLFxuICAgICAgICAgIEVycm9yQ29kZS5RVU9UQV9FWENFRURFRCxcbiAgICAgICAgICB7IHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IHF1b3RhU3RhdHVzLmxpbWl0LCB1c2VkOiBxdW90YVN0YXR1cy51c2VkLCByZW1haW5pbmc6IHF1b3RhU3RhdHVzLnJlbWFpbmluZyB9IH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIG9wZW4g4oCUIGFsbG93IHRoZSByZXF1ZXN0IGlmIHF1b3RhIHNlcnZpY2UgaXMgdW5hdmFpbGFibGVcbiAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIGV4Y2VwdGlvbiwgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgb3JnSWQsXG4gICAgICAgIHF1b3RhVHlwZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RequestHandler } from 'express';
|
|
2
|
-
import type { SSEManager } from '../http/sse-connection-manager';
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import type { SSEManager } from '../http/sse-connection-manager.js';
|
|
3
3
|
/**
|
|
4
4
|
* Creates middleware that attaches RequestContext to req.context
|
|
5
5
|
*
|
|
@@ -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.attachRequestContext = attachRequestContext;
|
|
6
|
-
const request_types_1 = require("./request-types");
|
|
3
|
+
import { createRequestContext } from './request-types.js';
|
|
7
4
|
/**
|
|
8
5
|
* Creates middleware that attaches RequestContext to req.context
|
|
9
6
|
*
|
|
@@ -35,11 +32,11 @@ const request_types_1 = require("./request-types");
|
|
|
35
32
|
* });
|
|
36
33
|
* ```
|
|
37
34
|
*/
|
|
38
|
-
function attachRequestContext(sseManager) {
|
|
35
|
+
export function attachRequestContext(sseManager) {
|
|
39
36
|
return (req, _res, next) => {
|
|
40
37
|
// Create and attach context to request
|
|
41
|
-
req.context =
|
|
38
|
+
req.context = createRequestContext(req, sseManager);
|
|
42
39
|
next();
|
|
43
40
|
};
|
|
44
41
|
}
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jb250ZXh0LW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUcxRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFVBQXNCO0lBQ3pELE9BQU8sQ0FBQyxHQUFZLEVBQUUsSUFBYyxFQUFFLElBQWtCLEVBQVEsRUFBRTtRQUNoRSx1Q0FBdUM7UUFDdkMsR0FBRyxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEQsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiwgUmVxdWVzdEhhbmRsZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVlc3RDb250ZXh0IH0gZnJvbSAnLi9yZXF1ZXN0LXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU1NFTWFuYWdlciB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBtaWRkbGV3YXJlIHRoYXQgYXR0YWNoZXMgUmVxdWVzdENvbnRleHQgdG8gcmVxLmNvbnRleHRcbiAqXG4gKiBUaGUgY29udGV4dCBpbmNsdWRlczpcbiAqIC0gcmVxdWVzdElkOiBVbmlxdWUgcmVxdWVzdCBpZGVudGlmaWVyXG4gKiAtIGlkZW50aXR5OiBVc2VyIGlkZW50aXR5IGZyb20gSldUIChvcmdJZCwgdXNlcklkLCByb2xlKVxuICogLSBsb2c6IExvZ2dlciBmdW5jdGlvbiB0aGF0IHNlbmRzIHRvIGJvdGggV2luc3RvbiBhbmQgU1NFXG4gKlxuICogQHBhcmFtIHNzZU1hbmFnZXIgLSBTU0UgbWFuYWdlciBmb3IgcmVhbC10aW1lIGxvZ2dpbmdcbiAqIEByZXR1cm5zIEV4cHJlc3MgbWlkZGxld2FyZSB0aGF0IGF0dGFjaGVzIGNvbnRleHQgdG8gcmVxLmNvbnRleHRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICpcbiAqIC8vIEFwcGx5IGNvbnRleHQgbWlkZGxld2FyZSBnbG9iYWxseVxuICogYXBwLnVzZShhdHRhY2hSZXF1ZXN0Q29udGV4dChzc2VNYW5hZ2VyKSk7XG4gKlxuICogLy8gVXNlIGNvbnRleHQgaW4gcm91dGUgaGFuZGxlcnNcbiAqIGFwcC5nZXQoJy9waXBlbGluZXMnLCByZXF1aXJlQXV0aCwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgIGNvbnN0IGN0eCA9IGdldENvbnRleHQocmVxKTtcbiAqICAgY3R4LmxvZygnSU5GTycsICdGZXRjaGluZyBwaXBlbGluZXMnKTtcbiAqXG4gKiAgIGlmICghY3R4LmlkZW50aXR5Lm9yZ0lkKSB7XG4gKiAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIDQwMCwgJ09yZ2FuaXphdGlvbiBJRCByZXF1aXJlZCcpO1xuICogICB9XG4gKlxuICogICAvLyAuLi4gcmVzdCBvZiBoYW5kbGVyXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUmVxdWVzdENvbnRleHQoc3NlTWFuYWdlcjogU1NFTWFuYWdlcik6IFJlcXVlc3RIYW5kbGVyIHtcbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIF9yZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICAvLyBDcmVhdGUgYW5kIGF0dGFjaCBjb250ZXh0IHRvIHJlcXVlc3RcbiAgICByZXEuY29udGV4dCA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0KHJlcSwgc3NlTWFuYWdlcik7XG4gICAgbmV4dCgpO1xuICB9O1xufVxuIl19
|