@pipeline-builder/api-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +79 -0
- package/lib/api/app-factory.d.ts +95 -0
- package/lib/api/app-factory.js +328 -0
- package/lib/api/check-quota.d.ts +13 -0
- package/lib/api/check-quota.js +74 -0
- package/lib/api/context-middleware.d.ts +34 -0
- package/lib/api/context-middleware.js +42 -0
- package/lib/api/etag-middleware.d.ts +7 -0
- package/lib/api/etag-middleware.js +44 -0
- package/lib/api/get-context.d.ts +22 -0
- package/lib/api/get-context.js +28 -0
- package/lib/api/health-checks.d.ts +62 -0
- package/lib/api/health-checks.js +87 -0
- package/lib/api/idempotency-middleware.d.ts +80 -0
- package/lib/api/idempotency-middleware.js +321 -0
- package/lib/api/index.d.ts +20 -0
- package/lib/api/index.js +34 -0
- package/lib/api/meter-quota.d.ts +32 -0
- package/lib/api/meter-quota.js +70 -0
- package/lib/api/metrics.d.ts +47 -0
- package/lib/api/metrics.js +221 -0
- package/lib/api/middleware-factory.d.ts +56 -0
- package/lib/api/middleware-factory.js +80 -0
- package/lib/api/middleware.d.ts +1 -0
- package/lib/api/middleware.js +8 -0
- package/lib/api/mongo-connect.d.ts +19 -0
- package/lib/api/mongo-connect.js +41 -0
- package/lib/api/quota-helpers.d.ts +23 -0
- package/lib/api/quota-helpers.js +22 -0
- package/lib/api/rate-limit-by-org.d.ts +29 -0
- package/lib/api/rate-limit-by-org.js +64 -0
- package/lib/api/readiness.d.ts +29 -0
- package/lib/api/readiness.js +65 -0
- package/lib/api/request-types.d.ts +55 -0
- package/lib/api/request-types.js +65 -0
- package/lib/api/require-org-id.d.ts +14 -0
- package/lib/api/require-org-id.js +28 -0
- package/lib/api/route-wrapper.d.ts +50 -0
- package/lib/api/route-wrapper.js +84 -0
- package/lib/api/server.d.ts +79 -0
- package/lib/api/server.js +234 -0
- package/lib/api/tenant-context.d.ts +28 -0
- package/lib/api/tenant-context.js +48 -0
- package/lib/api/tracing.d.ts +25 -0
- package/lib/api/tracing.js +69 -0
- package/lib/http/index.d.ts +4 -0
- package/lib/http/index.js +7 -0
- package/lib/http/sse-connection-manager.d.ts +357 -0
- package/lib/http/sse-connection-manager.js +665 -0
- package/lib/http/sse-relay.d.ts +63 -0
- package/lib/http/sse-relay.js +70 -0
- package/lib/http/sse-ticket-channel.d.ts +31 -0
- package/lib/http/sse-ticket-channel.js +52 -0
- package/lib/http/sse-ticket-store.d.ts +75 -0
- package/lib/http/sse-ticket-store.js +160 -0
- package/lib/index.d.ts +30 -0
- package/lib/index.js +35 -0
- package/lib/otel-bootstrap.d.ts +1 -0
- package/lib/otel-bootstrap.js +75 -0
- package/package.json +183 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Shared OpenTelemetry preload bootstrap for every Pipeline Builder service.
|
|
5
|
+
*
|
|
6
|
+
* Preload it BEFORE the app's own code with (services are ESM, so `--import`,
|
|
7
|
+
* not the CJS `-r`):
|
|
8
|
+
* node --import @pipeline-builder/api-server/lib/otel-bootstrap.js index.js
|
|
9
|
+
* (see each service's Dockerfile CMD).
|
|
10
|
+
*
|
|
11
|
+
* Why a preload and not a programmatic SDK start from createApp/index.ts:
|
|
12
|
+
* OpenTelemetry auto-instrumentation patches modules as they load. If
|
|
13
|
+
* `http`/`express` are already loaded when the SDK starts, the HTTP server is
|
|
14
|
+
* never wrapped, so no inbound server span — and therefore no trace id — is ever
|
|
15
|
+
* created. The `--import` preload runs fully before `index.js` loads any
|
|
16
|
+
* instrumented module. Because the services are ESM, we also register the
|
|
17
|
+
* import-in-the-middle ESM loader hook below — require-in-the-middle alone only
|
|
18
|
+
* patches CJS `require()`, which an ESM app never uses.
|
|
19
|
+
*
|
|
20
|
+
* Self-contained on purpose: it imports ONLY OpenTelemetry packages and reads
|
|
21
|
+
* `process.env` directly. It must NOT import this package's own barrel (or
|
|
22
|
+
* api-core / pipeline-core), because those transitively require express — which
|
|
23
|
+
* would load express before the SDK starts and defeat the preload. This is why
|
|
24
|
+
* the bootstrap lives in its own entrypoint file rather than starting the SDK
|
|
25
|
+
* from within `api/tracing.ts`.
|
|
26
|
+
*
|
|
27
|
+
* No-op unless `OTEL_TRACING_ENABLED=true`. Service name comes from
|
|
28
|
+
* `OTEL_SERVICE_NAME` (falling back to `SERVICE_NAME`), which every service
|
|
29
|
+
* already sets in its deploy env.
|
|
30
|
+
*/
|
|
31
|
+
import { register } from 'node:module';
|
|
32
|
+
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
33
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
34
|
+
import { resourceFromAttributes } from '@opentelemetry/resources';
|
|
35
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
36
|
+
if (process.env.OTEL_TRACING_ENABLED === 'true') {
|
|
37
|
+
const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces';
|
|
38
|
+
const serviceName = process.env.OTEL_SERVICE_NAME || process.env.SERVICE_NAME || 'api';
|
|
39
|
+
// Enable ESM instrumentation: register the import-in-the-middle hook before any
|
|
40
|
+
// instrumented module is imported. Wrapped so a hook-resolution failure
|
|
41
|
+
// degrades to no-instrumentation (today's behaviour) rather than crashing the
|
|
42
|
+
// service on startup.
|
|
43
|
+
try {
|
|
44
|
+
register('@opentelemetry/instrumentation/hook.mjs', import.meta.url);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
// eslint-disable-next-line no-console
|
|
48
|
+
console.warn('[otel] ESM instrumentation hook not registered:', err.message);
|
|
49
|
+
}
|
|
50
|
+
const sdk = new NodeSDK({
|
|
51
|
+
resource: resourceFromAttributes({
|
|
52
|
+
'service.name': serviceName,
|
|
53
|
+
'service.namespace': 'pipeline-builder',
|
|
54
|
+
'deployment.environment': process.env.NODE_ENV ?? 'development',
|
|
55
|
+
}),
|
|
56
|
+
traceExporter: new OTLPTraceExporter({ url: endpoint }),
|
|
57
|
+
// `fs` spans are noise for request-level correlation; everything else
|
|
58
|
+
// (http/express/mongo/pg/…) is auto-instrumented so inbound requests get a
|
|
59
|
+
// server span whose trace id flows onto audit events + structured logs.
|
|
60
|
+
instrumentations: [
|
|
61
|
+
getNodeAutoInstrumentations({
|
|
62
|
+
'@opentelemetry/instrumentation-fs': { enabled: false },
|
|
63
|
+
}),
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
sdk.start();
|
|
67
|
+
// eslint-disable-next-line no-console
|
|
68
|
+
console.log(`[otel] tracing initialized for ${serviceName} -> ${endpoint}`);
|
|
69
|
+
const shutdown = () => {
|
|
70
|
+
void sdk.shutdown().catch(() => undefined);
|
|
71
|
+
};
|
|
72
|
+
process.once('SIGTERM', shutdown);
|
|
73
|
+
process.once('SIGINT', shutdown);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbC1ib290c3RyYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb3RlbC1ib290c3RyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixLQUFLLE1BQU0sRUFBRSxDQUFDO0lBQ2hELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksaUNBQWlDLENBQUM7SUFDOUYsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUM7SUFFdkYsZ0ZBQWdGO0lBQ2hGLHdFQUF3RTtJQUN4RSw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLElBQUksQ0FBQztRQUNILFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLGlEQUFpRCxFQUFHLEdBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUM7UUFDdEIsUUFBUSxFQUFFLHNCQUFzQixDQUFDO1lBQy9CLGNBQWMsRUFBRSxXQUFXO1lBQzNCLG1CQUFtQixFQUFFLGtCQUFrQjtZQUN2Qyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxhQUFhO1NBQ2hFLENBQUM7UUFDRixhQUFhLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUN2RCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHdFQUF3RTtRQUN4RSxnQkFBZ0IsRUFBRTtZQUNoQiwyQkFBMkIsQ0FBQztnQkFDMUIsbUNBQW1DLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO2FBQ3hELENBQUM7U0FDSDtLQUNGLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNaLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxXQUFXLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztJQUU1RSxNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUU7UUFDcEIsS0FBSyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTaGFyZWQgT3BlblRlbGVtZXRyeSBwcmVsb2FkIGJvb3RzdHJhcCBmb3IgZXZlcnkgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLlxuICpcbiAqIFByZWxvYWQgaXQgQkVGT1JFIHRoZSBhcHAncyBvd24gY29kZSB3aXRoIChzZXJ2aWNlcyBhcmUgRVNNLCBzbyBgLS1pbXBvcnRgLFxuICogbm90IHRoZSBDSlMgYC1yYCk6XG4gKiAgIG5vZGUgLS1pbXBvcnQgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLXNlcnZlci9saWIvb3RlbC1ib290c3RyYXAuanMgaW5kZXguanNcbiAqIChzZWUgZWFjaCBzZXJ2aWNlJ3MgRG9ja2VyZmlsZSBDTUQpLlxuICpcbiAqIFdoeSBhIHByZWxvYWQgYW5kIG5vdCBhIHByb2dyYW1tYXRpYyBTREsgc3RhcnQgZnJvbSBjcmVhdGVBcHAvaW5kZXgudHM6XG4gKiBPcGVuVGVsZW1ldHJ5IGF1dG8taW5zdHJ1bWVudGF0aW9uIHBhdGNoZXMgbW9kdWxlcyBhcyB0aGV5IGxvYWQuIElmXG4gKiBgaHR0cGAvYGV4cHJlc3NgIGFyZSBhbHJlYWR5IGxvYWRlZCB3aGVuIHRoZSBTREsgc3RhcnRzLCB0aGUgSFRUUCBzZXJ2ZXIgaXNcbiAqIG5ldmVyIHdyYXBwZWQsIHNvIG5vIGluYm91bmQgc2VydmVyIHNwYW4g4oCUIGFuZCB0aGVyZWZvcmUgbm8gdHJhY2UgaWQg4oCUIGlzIGV2ZXJcbiAqIGNyZWF0ZWQuIFRoZSBgLS1pbXBvcnRgIHByZWxvYWQgcnVucyBmdWxseSBiZWZvcmUgYGluZGV4LmpzYCBsb2FkcyBhbnlcbiAqIGluc3RydW1lbnRlZCBtb2R1bGUuIEJlY2F1c2UgdGhlIHNlcnZpY2VzIGFyZSBFU00sIHdlIGFsc28gcmVnaXN0ZXIgdGhlXG4gKiBpbXBvcnQtaW4tdGhlLW1pZGRsZSBFU00gbG9hZGVyIGhvb2sgYmVsb3cg4oCUIHJlcXVpcmUtaW4tdGhlLW1pZGRsZSBhbG9uZSBvbmx5XG4gKiBwYXRjaGVzIENKUyBgcmVxdWlyZSgpYCwgd2hpY2ggYW4gRVNNIGFwcCBuZXZlciB1c2VzLlxuICpcbiAqIFNlbGYtY29udGFpbmVkIG9uIHB1cnBvc2U6IGl0IGltcG9ydHMgT05MWSBPcGVuVGVsZW1ldHJ5IHBhY2thZ2VzIGFuZCByZWFkc1xuICogYHByb2Nlc3MuZW52YCBkaXJlY3RseS4gSXQgbXVzdCBOT1QgaW1wb3J0IHRoaXMgcGFja2FnZSdzIG93biBiYXJyZWwgKG9yXG4gKiBhcGktY29yZSAvIHBpcGVsaW5lLWNvcmUpLCBiZWNhdXNlIHRob3NlIHRyYW5zaXRpdmVseSByZXF1aXJlIGV4cHJlc3Mg4oCUIHdoaWNoXG4gKiB3b3VsZCBsb2FkIGV4cHJlc3MgYmVmb3JlIHRoZSBTREsgc3RhcnRzIGFuZCBkZWZlYXQgdGhlIHByZWxvYWQuIFRoaXMgaXMgd2h5XG4gKiB0aGUgYm9vdHN0cmFwIGxpdmVzIGluIGl0cyBvd24gZW50cnlwb2ludCBmaWxlIHJhdGhlciB0aGFuIHN0YXJ0aW5nIHRoZSBTREtcbiAqIGZyb20gd2l0aGluIGBhcGkvdHJhY2luZy50c2AuXG4gKlxuICogTm8tb3AgdW5sZXNzIGBPVEVMX1RSQUNJTkdfRU5BQkxFRD10cnVlYC4gU2VydmljZSBuYW1lIGNvbWVzIGZyb21cbiAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgKGZhbGxpbmcgYmFjayB0byBgU0VSVklDRV9OQU1FYCksIHdoaWNoIGV2ZXJ5IHNlcnZpY2VcbiAqIGFscmVhZHkgc2V0cyBpbiBpdHMgZGVwbG95IGVudi5cbiAqL1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBnZXROb2RlQXV0b0luc3RydW1lbnRhdGlvbnMgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hdXRvLWluc3RydW1lbnRhdGlvbnMtbm9kZSc7XG5pbXBvcnQgeyBPVExQVHJhY2VFeHBvcnRlciB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2V4cG9ydGVyLXRyYWNlLW90bHAtaHR0cCc7XG5pbXBvcnQgeyByZXNvdXJjZUZyb21BdHRyaWJ1dGVzIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvcmVzb3VyY2VzJztcbmltcG9ydCB7IE5vZGVTREsgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9zZGstbm9kZSc7XG5cbmlmIChwcm9jZXNzLmVudi5PVEVMX1RSQUNJTkdfRU5BQkxFRCA9PT0gJ3RydWUnKSB7XG4gIGNvbnN0IGVuZHBvaW50ID0gcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UIHx8ICdodHRwOi8vbG9jYWxob3N0OjQzMTgvdjEvdHJhY2VzJztcbiAgY29uc3Qgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5PVEVMX1NFUlZJQ0VfTkFNRSB8fCBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ2FwaSc7XG5cbiAgLy8gRW5hYmxlIEVTTSBpbnN0cnVtZW50YXRpb246IHJlZ2lzdGVyIHRoZSBpbXBvcnQtaW4tdGhlLW1pZGRsZSBob29rIGJlZm9yZSBhbnlcbiAgLy8gaW5zdHJ1bWVudGVkIG1vZHVsZSBpcyBpbXBvcnRlZC4gV3JhcHBlZCBzbyBhIGhvb2stcmVzb2x1dGlvbiBmYWlsdXJlXG4gIC8vIGRlZ3JhZGVzIHRvIG5vLWluc3RydW1lbnRhdGlvbiAodG9kYXkncyBiZWhhdmlvdXIpIHJhdGhlciB0aGFuIGNyYXNoaW5nIHRoZVxuICAvLyBzZXJ2aWNlIG9uIHN0YXJ0dXAuXG4gIHRyeSB7XG4gICAgcmVnaXN0ZXIoJ0BvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi9ob29rLm1qcycsIGltcG9ydC5tZXRhLnVybCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKCdbb3RlbF0gRVNNIGluc3RydW1lbnRhdGlvbiBob29rIG5vdCByZWdpc3RlcmVkOicsIChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3Qgc2RrID0gbmV3IE5vZGVTREsoe1xuICAgIHJlc291cmNlOiByZXNvdXJjZUZyb21BdHRyaWJ1dGVzKHtcbiAgICAgICdzZXJ2aWNlLm5hbWUnOiBzZXJ2aWNlTmFtZSxcbiAgICAgICdzZXJ2aWNlLm5hbWVzcGFjZSc6ICdwaXBlbGluZS1idWlsZGVyJyxcbiAgICAgICdkZXBsb3ltZW50LmVudmlyb25tZW50JzogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz8gJ2RldmVsb3BtZW50JyxcbiAgICB9KSxcbiAgICB0cmFjZUV4cG9ydGVyOiBuZXcgT1RMUFRyYWNlRXhwb3J0ZXIoeyB1cmw6IGVuZHBvaW50IH0pLFxuICAgIC8vIGBmc2Agc3BhbnMgYXJlIG5vaXNlIGZvciByZXF1ZXN0LWxldmVsIGNvcnJlbGF0aW9uOyBldmVyeXRoaW5nIGVsc2VcbiAgICAvLyAoaHR0cC9leHByZXNzL21vbmdvL3BnL+KApikgaXMgYXV0by1pbnN0cnVtZW50ZWQgc28gaW5ib3VuZCByZXF1ZXN0cyBnZXQgYVxuICAgIC8vIHNlcnZlciBzcGFuIHdob3NlIHRyYWNlIGlkIGZsb3dzIG9udG8gYXVkaXQgZXZlbnRzICsgc3RydWN0dXJlZCBsb2dzLlxuICAgIGluc3RydW1lbnRhdGlvbnM6IFtcbiAgICAgIGdldE5vZGVBdXRvSW5zdHJ1bWVudGF0aW9ucyh7XG4gICAgICAgICdAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24tZnMnOiB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICB9KSxcbiAgICBdLFxuICB9KTtcblxuICBzZGsuc3RhcnQoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5sb2coYFtvdGVsXSB0cmFjaW5nIGluaXRpYWxpemVkIGZvciAke3NlcnZpY2VOYW1lfSAtPiAke2VuZHBvaW50fWApO1xuXG4gIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgIHZvaWQgc2RrLnNodXRkb3duKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIHNodXRkb3duKTtcbn1cbiJdfQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pipeline-builder/api-server",
|
|
3
|
+
"description": "Express server infrastructure for Pipeline Builder: app factory, middleware (CORS, Helmet, rate limiting, idempotency, ETag), request context, route wrappers, health-check helpers, and SSE support.",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/mwashburn160/pipeline-builder.git"
|
|
7
|
+
},
|
|
8
|
+
"devDependencies": {
|
|
9
|
+
"@jest/globals": "30.4.1",
|
|
10
|
+
"@stylistic/eslint-plugin": "^2",
|
|
11
|
+
"@types/compression": "1.8.1",
|
|
12
|
+
"@types/cors": "2.8.19",
|
|
13
|
+
"@types/express": "5.0.6",
|
|
14
|
+
"@types/express-serve-static-core": "5.1.3",
|
|
15
|
+
"@types/jsonwebtoken": "9.0.10",
|
|
16
|
+
"@types/node": "26.1.2",
|
|
17
|
+
"@types/swagger-ui-express": "4.1.8",
|
|
18
|
+
"@typescript-eslint/eslint-plugin": "^8",
|
|
19
|
+
"@typescript-eslint/parser": "^8",
|
|
20
|
+
"@typescript/native": "npm:typescript@^7.0.2",
|
|
21
|
+
"eslint": "^9",
|
|
22
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
23
|
+
"eslint-plugin-import": "^2.32.0",
|
|
24
|
+
"jest": "30.4.2",
|
|
25
|
+
"jest-junit": "^17",
|
|
26
|
+
"ts-jest": "29.4.12",
|
|
27
|
+
"typescript": "npm:@typescript/typescript6@^6.0.2"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@opentelemetry/api": "1.9.1",
|
|
31
|
+
"@opentelemetry/auto-instrumentations-node": "0.79.0",
|
|
32
|
+
"@opentelemetry/exporter-trace-otlp-http": "0.221.0",
|
|
33
|
+
"@opentelemetry/instrumentation": "0.221.0",
|
|
34
|
+
"@opentelemetry/resources": "2.10.0",
|
|
35
|
+
"@opentelemetry/sdk-node": "0.221.0",
|
|
36
|
+
"compression": "1.8.1",
|
|
37
|
+
"cors": "2.8.6",
|
|
38
|
+
"express": "5.2.1",
|
|
39
|
+
"express-rate-limit": "8.6.1",
|
|
40
|
+
"helmet": "8.3.0",
|
|
41
|
+
"ioredis": "6.0.0",
|
|
42
|
+
"jsonwebtoken": "9.0.3",
|
|
43
|
+
"prom-client": "15.1.3",
|
|
44
|
+
"rate-limit-redis": "6.0.0",
|
|
45
|
+
"swagger-ui-express": "5.0.1",
|
|
46
|
+
"uuid": "14.0.1",
|
|
47
|
+
"@pipeline-builder/pipeline-core": "0.0.1",
|
|
48
|
+
"@pipeline-builder/pipeline-data": "0.0.1",
|
|
49
|
+
"@pipeline-builder/api-core": "0.0.1"
|
|
50
|
+
},
|
|
51
|
+
"keywords": [
|
|
52
|
+
"ci-cd",
|
|
53
|
+
"cicd",
|
|
54
|
+
"continuous-delivery",
|
|
55
|
+
"devops",
|
|
56
|
+
"self-service",
|
|
57
|
+
"platform-engineering",
|
|
58
|
+
"internal-developer-platform",
|
|
59
|
+
"developer-platform",
|
|
60
|
+
"aws",
|
|
61
|
+
"aws-cdk",
|
|
62
|
+
"cdk",
|
|
63
|
+
"codepipeline",
|
|
64
|
+
"codebuild",
|
|
65
|
+
"cloudformation",
|
|
66
|
+
"pipeline",
|
|
67
|
+
"pipeline-as-code",
|
|
68
|
+
"infrastructure-as-code",
|
|
69
|
+
"iac",
|
|
70
|
+
"compliance",
|
|
71
|
+
"policy-as-code",
|
|
72
|
+
"governance",
|
|
73
|
+
"golden-paths",
|
|
74
|
+
"multi-tenant",
|
|
75
|
+
"rbac",
|
|
76
|
+
"ai",
|
|
77
|
+
"ai-pipeline-generation",
|
|
78
|
+
"llm",
|
|
79
|
+
"bedrock",
|
|
80
|
+
"plugins",
|
|
81
|
+
"plugin-marketplace",
|
|
82
|
+
"containerized",
|
|
83
|
+
"docker",
|
|
84
|
+
"kubernetes",
|
|
85
|
+
"typescript",
|
|
86
|
+
"cli"
|
|
87
|
+
],
|
|
88
|
+
"engines": {
|
|
89
|
+
"node": ">= 24.14.0"
|
|
90
|
+
},
|
|
91
|
+
"devEngines": {
|
|
92
|
+
"packageManager": {
|
|
93
|
+
"name": "pnpm",
|
|
94
|
+
"version": ">=10",
|
|
95
|
+
"onFail": "ignore"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"main": "lib/index.js",
|
|
99
|
+
"license": "Apache-2.0",
|
|
100
|
+
"homepage": "https://mwashburn160.github.io/pipeline-builder/",
|
|
101
|
+
"publishConfig": {
|
|
102
|
+
"access": "public",
|
|
103
|
+
"registry": "https://registry.npmjs.org/"
|
|
104
|
+
},
|
|
105
|
+
"version": "0.0.1",
|
|
106
|
+
"bugs": {
|
|
107
|
+
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
108
|
+
},
|
|
109
|
+
"jest": {
|
|
110
|
+
"coverageProvider": "v8",
|
|
111
|
+
"testMatch": [
|
|
112
|
+
"<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
|
|
113
|
+
"<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)"
|
|
114
|
+
],
|
|
115
|
+
"clearMocks": true,
|
|
116
|
+
"collectCoverage": true,
|
|
117
|
+
"coverageReporters": [
|
|
118
|
+
"json",
|
|
119
|
+
"lcov",
|
|
120
|
+
"clover",
|
|
121
|
+
"cobertura",
|
|
122
|
+
"text"
|
|
123
|
+
],
|
|
124
|
+
"coverageDirectory": "coverage",
|
|
125
|
+
"coveragePathIgnorePatterns": [
|
|
126
|
+
"/node_modules/"
|
|
127
|
+
],
|
|
128
|
+
"testPathIgnorePatterns": [
|
|
129
|
+
"/node_modules/"
|
|
130
|
+
],
|
|
131
|
+
"watchPathIgnorePatterns": [
|
|
132
|
+
"/node_modules/"
|
|
133
|
+
],
|
|
134
|
+
"reporters": [
|
|
135
|
+
"default",
|
|
136
|
+
[
|
|
137
|
+
"jest-junit",
|
|
138
|
+
{
|
|
139
|
+
"outputDirectory": "test-reports"
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
],
|
|
143
|
+
"transform": {
|
|
144
|
+
"^.+\\.[t]sx?$": [
|
|
145
|
+
"ts-jest",
|
|
146
|
+
{
|
|
147
|
+
"useESM": true,
|
|
148
|
+
"tsconfig": "tsconfig.dev.json",
|
|
149
|
+
"diagnostics": {
|
|
150
|
+
"ignoreCodes": [
|
|
151
|
+
151002
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
"extensionsToTreatAsEsm": [
|
|
158
|
+
".ts",
|
|
159
|
+
".tsx"
|
|
160
|
+
],
|
|
161
|
+
"moduleNameMapper": {
|
|
162
|
+
"^uuid$": "<rootDir>/../../jest-uuid-stub.js",
|
|
163
|
+
"^(\\.{1,2}/.*)\\.js$": "$1"
|
|
164
|
+
},
|
|
165
|
+
"maxWorkers": 1
|
|
166
|
+
},
|
|
167
|
+
"types": "lib/index.d.ts",
|
|
168
|
+
"type": "module",
|
|
169
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm dlx projen\".",
|
|
170
|
+
"scripts": {
|
|
171
|
+
"build": "pnpm dlx projen build",
|
|
172
|
+
"compile": "pnpm dlx projen compile",
|
|
173
|
+
"default": "pnpm dlx projen default",
|
|
174
|
+
"eslint": "pnpm dlx projen eslint",
|
|
175
|
+
"package": "pnpm dlx projen package",
|
|
176
|
+
"post-compile": "pnpm dlx projen post-compile",
|
|
177
|
+
"pre-compile": "pnpm dlx projen pre-compile",
|
|
178
|
+
"test": "pnpm dlx projen test",
|
|
179
|
+
"test:watch": "pnpm dlx projen test:watch",
|
|
180
|
+
"watch": "pnpm dlx projen watch",
|
|
181
|
+
"projen": "pnpm dlx projen"
|
|
182
|
+
}
|
|
183
|
+
}
|