@pipeline-builder/api-server 4.1.19 → 4.1.21
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.
|
@@ -8,8 +8,8 @@ import type { Store } from 'express-rate-limit';
|
|
|
8
8
|
* exactly when an HPA has scaled out under load. Use a namespace unique to the
|
|
9
9
|
* service AND limiter, so separate limiters never share a counter. Pair it with
|
|
10
10
|
* `passOnStoreError: true`: a Redis outage then lets requests through instead of
|
|
11
|
-
* failing them.
|
|
12
|
-
*
|
|
11
|
+
* failing them. Script loading is deferred to the first request and retried on
|
|
12
|
+
* failure — see {@link withRetryingInit}.
|
|
13
13
|
*/
|
|
14
14
|
export declare function createSharedRateLimitStore(namespace: string): Store | undefined;
|
|
15
15
|
/** Test-only: forget the memoized client. */
|
|
@@ -1,10 +1,84 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { createEnvRedisClient, createLogger, safeCreateRequire } from '@pipeline-builder/api-core';
|
|
3
|
+
import { createEnvRedisClient, createLogger, errorMessage, safeCreateRequire } from '@pipeline-builder/api-core';
|
|
4
4
|
const logger = createLogger('rate-limit-store');
|
|
5
5
|
/** One Redis connection for every rate limiter in the process.
|
|
6
6
|
* undefined = not built yet; null = Redis not configured. */
|
|
7
7
|
let client;
|
|
8
|
+
/**
|
|
9
|
+
* Run the wrapped store's `init` on FIRST USE rather than at route setup, and
|
|
10
|
+
* run it again if it fails.
|
|
11
|
+
*
|
|
12
|
+
* `rate-limit-redis` loads its two Lua scripts in `init` and keeps the in-flight
|
|
13
|
+
* `SCRIPT LOAD` promises on the instance (`incrementScriptSha`, `getScriptSha`),
|
|
14
|
+
* which every later `increment` awaits. express-rate-limit calls `init` exactly
|
|
15
|
+
* once, at route setup, does not await it, and never calls it again — its own
|
|
16
|
+
* contract says so. So ONE rejection there is memoized for the life of the
|
|
17
|
+
* process: every subsequent request re-awaits that same rejected promise and the
|
|
18
|
+
* limiter is silently off. The store's internal retry doesn't help, because it
|
|
19
|
+
* only re-loads on a `NOSCRIPT` reply.
|
|
20
|
+
*
|
|
21
|
+
* At boot that rejection is a live race, not a hypothetical. The env Redis
|
|
22
|
+
* client has no offline queue, and its readiness gate waits only
|
|
23
|
+
* `REQUEST_PATH_REDIS_READY_TIMEOUT_MS` before letting the command run against a
|
|
24
|
+
* socket that is still connecting — so on a slow start the `SCRIPT LOAD` is
|
|
25
|
+
* rejected with "Stream isn't writeable", and rate limiting never comes back.
|
|
26
|
+
*
|
|
27
|
+
* Both halves of the fix matter, and neither touches the connection's semantics
|
|
28
|
+
* (no offline queue, still fail-fast — a request must never hang behind a Redis
|
|
29
|
+
* outage). Deferring `init` to the first actual request removes the race, since
|
|
30
|
+
* a request arrives long after the connection settles. Re-running it on failure
|
|
31
|
+
* means no limiter can be left permanently off by one bad moment. A failure
|
|
32
|
+
* still propagates to express-rate-limit, which — paired with
|
|
33
|
+
* `passOnStoreError: true` — lets that one request through and logs it.
|
|
34
|
+
*/
|
|
35
|
+
function withRetryingInit(store, namespace) {
|
|
36
|
+
let initOptions;
|
|
37
|
+
let inflight = null;
|
|
38
|
+
let failed = false;
|
|
39
|
+
const initialized = () => {
|
|
40
|
+
// express-rate-limit always calls `init` before any other method; if some
|
|
41
|
+
// caller doesn't, pass straight through rather than inventing options.
|
|
42
|
+
if (initOptions === undefined)
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
if (!inflight) {
|
|
45
|
+
inflight = Promise.resolve(store.init?.(initOptions))
|
|
46
|
+
.then(() => {
|
|
47
|
+
// Worth a line: the failure below is loud, and an operator who saw it
|
|
48
|
+
// needs to know rate limiting is actually enforcing again.
|
|
49
|
+
if (failed)
|
|
50
|
+
logger.info('Rate-limit store recovered — scripts loaded', { namespace });
|
|
51
|
+
failed = false;
|
|
52
|
+
})
|
|
53
|
+
.catch((error) => {
|
|
54
|
+
// Forget the failure so the NEXT request builds fresh script promises
|
|
55
|
+
// instead of re-awaiting this rejected one forever.
|
|
56
|
+
inflight = null;
|
|
57
|
+
failed = true;
|
|
58
|
+
logger.warn('Rate-limit store init failed — requests pass unlimited until it succeeds', {
|
|
59
|
+
namespace, error: errorMessage(error),
|
|
60
|
+
});
|
|
61
|
+
throw error;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return inflight;
|
|
65
|
+
};
|
|
66
|
+
// Exactly `RedisStore`'s surface, which is all this ever wraps. It has no
|
|
67
|
+
// `resetAll`, `shutdown` or `localKeys`, and express-rate-limit reads the
|
|
68
|
+
// PRESENCE of those as "the store supports it" — so forwarding them
|
|
69
|
+
// defensively would advertise capabilities that don't exist. Omitting
|
|
70
|
+
// `localKeys` is also the correct answer for a Redis store: keys are shared
|
|
71
|
+
// across replicas, which is the whole point.
|
|
72
|
+
return {
|
|
73
|
+
// Captured, not forwarded — the real init runs from `initialized()`.
|
|
74
|
+
init: (options) => { initOptions = options; },
|
|
75
|
+
get: async (key) => { await initialized(); return store.get?.(key); },
|
|
76
|
+
increment: async (key) => { await initialized(); return store.increment(key); },
|
|
77
|
+
decrement: async (key) => { await initialized(); return store.decrement(key); },
|
|
78
|
+
resetKey: async (key) => { await initialized(); return store.resetKey(key); },
|
|
79
|
+
prefix: store.prefix,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
8
82
|
/**
|
|
9
83
|
* A cross-replica rate-limit store under `rl:<namespace>:`, or `undefined` when
|
|
10
84
|
* Redis isn't configured (express-rate-limit then uses its per-process memory
|
|
@@ -14,8 +88,8 @@ let client;
|
|
|
14
88
|
* exactly when an HPA has scaled out under load. Use a namespace unique to the
|
|
15
89
|
* service AND limiter, so separate limiters never share a counter. Pair it with
|
|
16
90
|
* `passOnStoreError: true`: a Redis outage then lets requests through instead of
|
|
17
|
-
* failing them.
|
|
18
|
-
*
|
|
91
|
+
* failing them. Script loading is deferred to the first request and retried on
|
|
92
|
+
* failure — see {@link withRetryingInit}.
|
|
19
93
|
*/
|
|
20
94
|
export function createSharedRateLimitStore(namespace) {
|
|
21
95
|
if (client === undefined)
|
|
@@ -27,13 +101,13 @@ export function createSharedRateLimitStore(namespace) {
|
|
|
27
101
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
28
102
|
const { RedisStore } = require('rate-limit-redis');
|
|
29
103
|
logger.debug('Shared rate-limit store created', { namespace });
|
|
30
|
-
return new RedisStore({
|
|
104
|
+
return withRetryingInit(new RedisStore({
|
|
31
105
|
prefix: `rl:${namespace}:`,
|
|
32
106
|
sendCommand: (...args) => redis.call(...args),
|
|
33
|
-
});
|
|
107
|
+
}), namespace);
|
|
34
108
|
}
|
|
35
109
|
/** Test-only: forget the memoized client. */
|
|
36
110
|
export function __resetSharedRateLimitStoreForTests() {
|
|
37
111
|
client = undefined;
|
|
38
112
|
}
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmF0ZS1saW1pdC1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUduRyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUloRDs4REFDOEQ7QUFDOUQsSUFBSSxNQUF3QyxDQUFDO0FBRTdDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFNBQWlCO0lBQzFELElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxNQUFNLEdBQUcsb0JBQW9CLENBQWdCLFlBQVksQ0FBQyxDQUFDO0lBQ3JGLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELGlFQUFpRTtJQUNqRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUE4QyxDQUFDO0lBQ2hHLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sSUFBSSxVQUFVLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU0sU0FBUyxHQUFHO1FBQzFCLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3hELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw2Q0FBNkM7QUFDN0MsTUFBTSxVQUFVLG1DQUFtQztJQUNqRCxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZUxvZ2dlciwgc2FmZUNyZWF0ZVJlcXVpcmUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlIH0gZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyYXRlLWxpbWl0LXN0b3JlJyk7XG5cbnR5cGUgQ29tbWFuZENsaWVudCA9IHsgY2FsbDogKC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHVua25vd24+IH07XG5cbi8qKiBPbmUgUmVkaXMgY29ubmVjdGlvbiBmb3IgZXZlcnkgcmF0ZSBsaW1pdGVyIGluIHRoZSBwcm9jZXNzLlxuICogIHVuZGVmaW5lZCA9IG5vdCBidWlsdCB5ZXQ7IG51bGwgPSBSZWRpcyBub3QgY29uZmlndXJlZC4gKi9cbmxldCBjbGllbnQ6IENvbW1hbmRDbGllbnQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgY3Jvc3MtcmVwbGljYSByYXRlLWxpbWl0IHN0b3JlIHVuZGVyIGBybDo8bmFtZXNwYWNlPjpgLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiBSZWRpcyBpc24ndCBjb25maWd1cmVkIChleHByZXNzLXJhdGUtbGltaXQgdGhlbiB1c2VzIGl0cyBwZXItcHJvY2VzcyBtZW1vcnlcbiAqIHN0b3JlLCB3aGljaCBpcyByaWdodCBmb3IgYSBzaW5nbGUgcmVwbGljYSkuXG4gKlxuICogV2l0aG91dCBhIHNoYXJlZCBzdG9yZSBldmVyeSBsaW1pdCBpcyByZWFsbHkgYG1heCDDlyByZXBsaWNhc2AsIGFuZCB3ZWFrZXN0XG4gKiBleGFjdGx5IHdoZW4gYW4gSFBBIGhhcyBzY2FsZWQgb3V0IHVuZGVyIGxvYWQuIFVzZSBhIG5hbWVzcGFjZSB1bmlxdWUgdG8gdGhlXG4gKiBzZXJ2aWNlIEFORCBsaW1pdGVyLCBzbyBzZXBhcmF0ZSBsaW1pdGVycyBuZXZlciBzaGFyZSBhIGNvdW50ZXIuIFBhaXIgaXQgd2l0aFxuICogYHBhc3NPblN0b3JlRXJyb3I6IHRydWVgOiBhIFJlZGlzIG91dGFnZSB0aGVuIGxldHMgcmVxdWVzdHMgdGhyb3VnaCBpbnN0ZWFkIG9mXG4gKiBmYWlsaW5nIHRoZW0uIEEgc3RvcmUgd2hvc2Ugc2NyaXB0cyBjYW4ndCBsb2FkIGF0IHN0YXJ0dXAgKFJlZGlzIG5vdCB5ZXRcbiAqIGNvbm5lY3RlZCkgaXMgdG9sZXJhdGVkIGJ5IGV4cHJlc3MtcmF0ZS1saW1pdCBhbmQgcmVsb2FkcyBvbiBmaXJzdCB1c2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaGFyZWRSYXRlTGltaXRTdG9yZShuYW1lc3BhY2U6IHN0cmluZyk6IFN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNsaWVudCA9PT0gdW5kZWZpbmVkKSBjbGllbnQgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxDb21tYW5kQ2xpZW50PigncmF0ZS1saW1pdCcpO1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVkaXMgPSBjbGllbnQ7XG4gIGNvbnN0IHJlcXVpcmUgPSBzYWZlQ3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCB7IFJlZGlzU3RvcmUgfSA9IHJlcXVpcmUoJ3JhdGUtbGltaXQtcmVkaXMnKSBhcyB7IFJlZGlzU3RvcmU6IG5ldyAobzogdW5rbm93bikgPT4gU3RvcmUgfTtcbiAgbG9nZ2VyLmRlYnVnKCdTaGFyZWQgcmF0ZS1saW1pdCBzdG9yZSBjcmVhdGVkJywgeyBuYW1lc3BhY2UgfSk7XG4gIHJldHVybiBuZXcgUmVkaXNTdG9yZSh7XG4gICAgcHJlZml4OiBgcmw6JHtuYW1lc3BhY2V9OmAsXG4gICAgc2VuZENvbW1hbmQ6ICguLi5hcmdzOiBzdHJpbmdbXSkgPT4gcmVkaXMuY2FsbCguLi5hcmdzKSxcbiAgfSk7XG59XG5cbi8qKiBUZXN0LW9ubHk6IGZvcmdldCB0aGUgbWVtb2l6ZWQgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzZXRTaGFyZWRSYXRlTGltaXRTdG9yZUZvclRlc3RzKCk6IHZvaWQge1xuICBjbGllbnQgPSB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmF0ZS1saW1pdC1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHakgsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFPaEQ7OERBQzhEO0FBQzlELElBQUksTUFBd0MsQ0FBQztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQVksRUFBRSxTQUFpQjtJQUN2RCxJQUFJLFdBQXlDLENBQUM7SUFDOUMsSUFBSSxRQUFRLEdBQXlCLElBQUksQ0FBQztJQUMxQyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFbkIsTUFBTSxXQUFXLEdBQUcsR0FBa0IsRUFBRTtRQUN0QywwRUFBMEU7UUFDMUUsdUVBQXVFO1FBQ3ZFLElBQUksV0FBVyxLQUFLLFNBQVM7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ2xELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1Qsc0VBQXNFO2dCQUN0RSwyREFBMkQ7Z0JBQzNELElBQUksTUFBTTtvQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDdEYsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNqQixDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7Z0JBQ3hCLHNFQUFzRTtnQkFDdEUsb0RBQW9EO2dCQUNwRCxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNoQixNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEVBQTBFLEVBQUU7b0JBQ3RGLFNBQVMsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQztpQkFDdEMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBRUYsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSxvRUFBb0U7SUFDcEUsc0VBQXNFO0lBQ3RFLDRFQUE0RTtJQUM1RSw2Q0FBNkM7SUFDN0MsT0FBTztRQUNMLHFFQUFxRTtRQUNyRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzdDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsTUFBTSxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0UsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtLQUNyQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFNBQWlCO0lBQzFELElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxNQUFNLEdBQUcsb0JBQW9CLENBQWdCLFlBQVksQ0FBQyxDQUFDO0lBQ3JGLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELGlFQUFpRTtJQUNqRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUE4QyxDQUFDO0lBQ2hHLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDckMsTUFBTSxFQUFFLE1BQU0sU0FBUyxHQUFHO1FBQzFCLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3hELENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqQixDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxtQ0FBbUM7SUFDakQsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50LCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgc2FmZUNyZWF0ZVJlcXVpcmUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JlIH0gZnJvbSAnZXhwcmVzcy1yYXRlLWxpbWl0JztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyYXRlLWxpbWl0LXN0b3JlJyk7XG5cbnR5cGUgQ29tbWFuZENsaWVudCA9IHsgY2FsbDogKC4uLmFyZ3M6IHN0cmluZ1tdKSA9PiBQcm9taXNlPHVua25vd24+IH07XG5cbi8qKiBUaGUgb3B0aW9ucyBleHByZXNzLXJhdGUtbGltaXQgaGFuZHMgdG8gYFN0b3JlLmluaXRgLiAqL1xudHlwZSBTdG9yZUluaXRPcHRpb25zID0gUGFyYW1ldGVyczxOb25OdWxsYWJsZTxTdG9yZVsnaW5pdCddPj5bMF07XG5cbi8qKiBPbmUgUmVkaXMgY29ubmVjdGlvbiBmb3IgZXZlcnkgcmF0ZSBsaW1pdGVyIGluIHRoZSBwcm9jZXNzLlxuICogIHVuZGVmaW5lZCA9IG5vdCBidWlsdCB5ZXQ7IG51bGwgPSBSZWRpcyBub3QgY29uZmlndXJlZC4gKi9cbmxldCBjbGllbnQ6IENvbW1hbmRDbGllbnQgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJ1biB0aGUgd3JhcHBlZCBzdG9yZSdzIGBpbml0YCBvbiBGSVJTVCBVU0UgcmF0aGVyIHRoYW4gYXQgcm91dGUgc2V0dXAsIGFuZFxuICogcnVuIGl0IGFnYWluIGlmIGl0IGZhaWxzLlxuICpcbiAqIGByYXRlLWxpbWl0LXJlZGlzYCBsb2FkcyBpdHMgdHdvIEx1YSBzY3JpcHRzIGluIGBpbml0YCBhbmQga2VlcHMgdGhlIGluLWZsaWdodFxuICogYFNDUklQVCBMT0FEYCBwcm9taXNlcyBvbiB0aGUgaW5zdGFuY2UgKGBpbmNyZW1lbnRTY3JpcHRTaGFgLCBgZ2V0U2NyaXB0U2hhYCksXG4gKiB3aGljaCBldmVyeSBsYXRlciBgaW5jcmVtZW50YCBhd2FpdHMuIGV4cHJlc3MtcmF0ZS1saW1pdCBjYWxscyBgaW5pdGAgZXhhY3RseVxuICogb25jZSwgYXQgcm91dGUgc2V0dXAsIGRvZXMgbm90IGF3YWl0IGl0LCBhbmQgbmV2ZXIgY2FsbHMgaXQgYWdhaW4g4oCUIGl0cyBvd25cbiAqIGNvbnRyYWN0IHNheXMgc28uIFNvIE9ORSByZWplY3Rpb24gdGhlcmUgaXMgbWVtb2l6ZWQgZm9yIHRoZSBsaWZlIG9mIHRoZVxuICogcHJvY2VzczogZXZlcnkgc3Vic2VxdWVudCByZXF1ZXN0IHJlLWF3YWl0cyB0aGF0IHNhbWUgcmVqZWN0ZWQgcHJvbWlzZSBhbmQgdGhlXG4gKiBsaW1pdGVyIGlzIHNpbGVudGx5IG9mZi4gVGhlIHN0b3JlJ3MgaW50ZXJuYWwgcmV0cnkgZG9lc24ndCBoZWxwLCBiZWNhdXNlIGl0XG4gKiBvbmx5IHJlLWxvYWRzIG9uIGEgYE5PU0NSSVBUYCByZXBseS5cbiAqXG4gKiBBdCBib290IHRoYXQgcmVqZWN0aW9uIGlzIGEgbGl2ZSByYWNlLCBub3QgYSBoeXBvdGhldGljYWwuIFRoZSBlbnYgUmVkaXNcbiAqIGNsaWVudCBoYXMgbm8gb2ZmbGluZSBxdWV1ZSwgYW5kIGl0cyByZWFkaW5lc3MgZ2F0ZSB3YWl0cyBvbmx5XG4gKiBgUkVRVUVTVF9QQVRIX1JFRElTX1JFQURZX1RJTUVPVVRfTVNgIGJlZm9yZSBsZXR0aW5nIHRoZSBjb21tYW5kIHJ1biBhZ2FpbnN0IGFcbiAqIHNvY2tldCB0aGF0IGlzIHN0aWxsIGNvbm5lY3Rpbmcg4oCUIHNvIG9uIGEgc2xvdyBzdGFydCB0aGUgYFNDUklQVCBMT0FEYCBpc1xuICogcmVqZWN0ZWQgd2l0aCBcIlN0cmVhbSBpc24ndCB3cml0ZWFibGVcIiwgYW5kIHJhdGUgbGltaXRpbmcgbmV2ZXIgY29tZXMgYmFjay5cbiAqXG4gKiBCb3RoIGhhbHZlcyBvZiB0aGUgZml4IG1hdHRlciwgYW5kIG5laXRoZXIgdG91Y2hlcyB0aGUgY29ubmVjdGlvbidzIHNlbWFudGljc1xuICogKG5vIG9mZmxpbmUgcXVldWUsIHN0aWxsIGZhaWwtZmFzdCDigJQgYSByZXF1ZXN0IG11c3QgbmV2ZXIgaGFuZyBiZWhpbmQgYSBSZWRpc1xuICogb3V0YWdlKS4gRGVmZXJyaW5nIGBpbml0YCB0byB0aGUgZmlyc3QgYWN0dWFsIHJlcXVlc3QgcmVtb3ZlcyB0aGUgcmFjZSwgc2luY2VcbiAqIGEgcmVxdWVzdCBhcnJpdmVzIGxvbmcgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gc2V0dGxlcy4gUmUtcnVubmluZyBpdCBvbiBmYWlsdXJlXG4gKiBtZWFucyBubyBsaW1pdGVyIGNhbiBiZSBsZWZ0IHBlcm1hbmVudGx5IG9mZiBieSBvbmUgYmFkIG1vbWVudC4gQSBmYWlsdXJlXG4gKiBzdGlsbCBwcm9wYWdhdGVzIHRvIGV4cHJlc3MtcmF0ZS1saW1pdCwgd2hpY2gg4oCUIHBhaXJlZCB3aXRoXG4gKiBgcGFzc09uU3RvcmVFcnJvcjogdHJ1ZWAg4oCUIGxldHMgdGhhdCBvbmUgcmVxdWVzdCB0aHJvdWdoIGFuZCBsb2dzIGl0LlxuICovXG5mdW5jdGlvbiB3aXRoUmV0cnlpbmdJbml0KHN0b3JlOiBTdG9yZSwgbmFtZXNwYWNlOiBzdHJpbmcpOiBTdG9yZSB7XG4gIGxldCBpbml0T3B0aW9uczogU3RvcmVJbml0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgbGV0IGluZmxpZ2h0OiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBmYWlsZWQgPSBmYWxzZTtcblxuICBjb25zdCBpbml0aWFsaXplZCA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBleHByZXNzLXJhdGUtbGltaXQgYWx3YXlzIGNhbGxzIGBpbml0YCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZDsgaWYgc29tZVxuICAgIC8vIGNhbGxlciBkb2Vzbid0LCBwYXNzIHN0cmFpZ2h0IHRocm91Z2ggcmF0aGVyIHRoYW4gaW52ZW50aW5nIG9wdGlvbnMuXG4gICAgaWYgKGluaXRPcHRpb25zID09PSB1bmRlZmluZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoIWluZmxpZ2h0KSB7XG4gICAgICBpbmZsaWdodCA9IFByb21pc2UucmVzb2x2ZShzdG9yZS5pbml0Py4oaW5pdE9wdGlvbnMpKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgLy8gV29ydGggYSBsaW5lOiB0aGUgZmFpbHVyZSBiZWxvdyBpcyBsb3VkLCBhbmQgYW4gb3BlcmF0b3Igd2hvIHNhdyBpdFxuICAgICAgICAgIC8vIG5lZWRzIHRvIGtub3cgcmF0ZSBsaW1pdGluZyBpcyBhY3R1YWxseSBlbmZvcmNpbmcgYWdhaW4uXG4gICAgICAgICAgaWYgKGZhaWxlZCkgbG9nZ2VyLmluZm8oJ1JhdGUtbGltaXQgc3RvcmUgcmVjb3ZlcmVkIOKAlCBzY3JpcHRzIGxvYWRlZCcsIHsgbmFtZXNwYWNlIH0pO1xuICAgICAgICAgIGZhaWxlZCA9IGZhbHNlO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgLy8gRm9yZ2V0IHRoZSBmYWlsdXJlIHNvIHRoZSBORVhUIHJlcXVlc3QgYnVpbGRzIGZyZXNoIHNjcmlwdCBwcm9taXNlc1xuICAgICAgICAgIC8vIGluc3RlYWQgb2YgcmUtYXdhaXRpbmcgdGhpcyByZWplY3RlZCBvbmUgZm9yZXZlci5cbiAgICAgICAgICBpbmZsaWdodCA9IG51bGw7XG4gICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICBsb2dnZXIud2FybignUmF0ZS1saW1pdCBzdG9yZSBpbml0IGZhaWxlZCDigJQgcmVxdWVzdHMgcGFzcyB1bmxpbWl0ZWQgdW50aWwgaXQgc3VjY2VlZHMnLCB7XG4gICAgICAgICAgICBuYW1lc3BhY2UsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZmxpZ2h0O1xuICB9O1xuXG4gIC8vIEV4YWN0bHkgYFJlZGlzU3RvcmVgJ3Mgc3VyZmFjZSwgd2hpY2ggaXMgYWxsIHRoaXMgZXZlciB3cmFwcy4gSXQgaGFzIG5vXG4gIC8vIGByZXNldEFsbGAsIGBzaHV0ZG93bmAgb3IgYGxvY2FsS2V5c2AsIGFuZCBleHByZXNzLXJhdGUtbGltaXQgcmVhZHMgdGhlXG4gIC8vIFBSRVNFTkNFIG9mIHRob3NlIGFzIFwidGhlIHN0b3JlIHN1cHBvcnRzIGl0XCIg4oCUIHNvIGZvcndhcmRpbmcgdGhlbVxuICAvLyBkZWZlbnNpdmVseSB3b3VsZCBhZHZlcnRpc2UgY2FwYWJpbGl0aWVzIHRoYXQgZG9uJ3QgZXhpc3QuIE9taXR0aW5nXG4gIC8vIGBsb2NhbEtleXNgIGlzIGFsc28gdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhIFJlZGlzIHN0b3JlOiBrZXlzIGFyZSBzaGFyZWRcbiAgLy8gYWNyb3NzIHJlcGxpY2FzLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQuXG4gIHJldHVybiB7XG4gICAgLy8gQ2FwdHVyZWQsIG5vdCBmb3J3YXJkZWQg4oCUIHRoZSByZWFsIGluaXQgcnVucyBmcm9tIGBpbml0aWFsaXplZCgpYC5cbiAgICBpbml0OiAob3B0aW9ucykgPT4geyBpbml0T3B0aW9ucyA9IG9wdGlvbnM7IH0sXG4gICAgZ2V0OiBhc3luYyAoa2V5KSA9PiB7IGF3YWl0IGluaXRpYWxpemVkKCk7IHJldHVybiBzdG9yZS5nZXQ/LihrZXkpOyB9LFxuICAgIGluY3JlbWVudDogYXN5bmMgKGtleSkgPT4geyBhd2FpdCBpbml0aWFsaXplZCgpOyByZXR1cm4gc3RvcmUuaW5jcmVtZW50KGtleSk7IH0sXG4gICAgZGVjcmVtZW50OiBhc3luYyAoa2V5KSA9PiB7IGF3YWl0IGluaXRpYWxpemVkKCk7IHJldHVybiBzdG9yZS5kZWNyZW1lbnQoa2V5KTsgfSxcbiAgICByZXNldEtleTogYXN5bmMgKGtleSkgPT4geyBhd2FpdCBpbml0aWFsaXplZCgpOyByZXR1cm4gc3RvcmUucmVzZXRLZXkoa2V5KTsgfSxcbiAgICBwcmVmaXg6IHN0b3JlLnByZWZpeCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGNyb3NzLXJlcGxpY2EgcmF0ZS1saW1pdCBzdG9yZSB1bmRlciBgcmw6PG5hbWVzcGFjZT46YCwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICogUmVkaXMgaXNuJ3QgY29uZmlndXJlZCAoZXhwcmVzcy1yYXRlLWxpbWl0IHRoZW4gdXNlcyBpdHMgcGVyLXByb2Nlc3MgbWVtb3J5XG4gKiBzdG9yZSwgd2hpY2ggaXMgcmlnaHQgZm9yIGEgc2luZ2xlIHJlcGxpY2EpLlxuICpcbiAqIFdpdGhvdXQgYSBzaGFyZWQgc3RvcmUgZXZlcnkgbGltaXQgaXMgcmVhbGx5IGBtYXggw5cgcmVwbGljYXNgLCBhbmQgd2Vha2VzdFxuICogZXhhY3RseSB3aGVuIGFuIEhQQSBoYXMgc2NhbGVkIG91dCB1bmRlciBsb2FkLiBVc2UgYSBuYW1lc3BhY2UgdW5pcXVlIHRvIHRoZVxuICogc2VydmljZSBBTkQgbGltaXRlciwgc28gc2VwYXJhdGUgbGltaXRlcnMgbmV2ZXIgc2hhcmUgYSBjb3VudGVyLiBQYWlyIGl0IHdpdGhcbiAqIGBwYXNzT25TdG9yZUVycm9yOiB0cnVlYDogYSBSZWRpcyBvdXRhZ2UgdGhlbiBsZXRzIHJlcXVlc3RzIHRocm91Z2ggaW5zdGVhZCBvZlxuICogZmFpbGluZyB0aGVtLiBTY3JpcHQgbG9hZGluZyBpcyBkZWZlcnJlZCB0byB0aGUgZmlyc3QgcmVxdWVzdCBhbmQgcmV0cmllZCBvblxuICogZmFpbHVyZSDigJQgc2VlIHtAbGluayB3aXRoUmV0cnlpbmdJbml0fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNoYXJlZFJhdGVMaW1pdFN0b3JlKG5hbWVzcGFjZTogc3RyaW5nKTogU3RvcmUgfCB1bmRlZmluZWQge1xuICBpZiAoY2xpZW50ID09PSB1bmRlZmluZWQpIGNsaWVudCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PENvbW1hbmRDbGllbnQ+KCdyYXRlLWxpbWl0Jyk7XG4gIGlmICghY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWRpcyA9IGNsaWVudDtcbiAgY29uc3QgcmVxdWlyZSA9IHNhZmVDcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IHsgUmVkaXNTdG9yZSB9ID0gcmVxdWlyZSgncmF0ZS1saW1pdC1yZWRpcycpIGFzIHsgUmVkaXNTdG9yZTogbmV3IChvOiB1bmtub3duKSA9PiBTdG9yZSB9O1xuICBsb2dnZXIuZGVidWcoJ1NoYXJlZCByYXRlLWxpbWl0IHN0b3JlIGNyZWF0ZWQnLCB7IG5hbWVzcGFjZSB9KTtcbiAgcmV0dXJuIHdpdGhSZXRyeWluZ0luaXQobmV3IFJlZGlzU3RvcmUoe1xuICAgIHByZWZpeDogYHJsOiR7bmFtZXNwYWNlfTpgLFxuICAgIHNlbmRDb21tYW5kOiAoLi4uYXJnczogc3RyaW5nW10pID0+IHJlZGlzLmNhbGwoLi4uYXJncyksXG4gIH0pLCBuYW1lc3BhY2UpO1xufVxuXG4vKiogVGVzdC1vbmx5OiBmb3JnZXQgdGhlIG1lbW9pemVkIGNsaWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc2V0U2hhcmVkUmF0ZUxpbWl0U3RvcmVGb3JUZXN0cygpOiB2b2lkIHtcbiAgY2xpZW50ID0gdW5kZWZpbmVkO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"swagger-ui-express": "5.0.1",
|
|
51
51
|
"unified": "11.0.5",
|
|
52
52
|
"uuid": "14.0.2",
|
|
53
|
-
"@pipeline-builder/
|
|
54
|
-
"@pipeline-builder/pipeline-data": "4.1.
|
|
55
|
-
"@pipeline-builder/
|
|
53
|
+
"@pipeline-builder/api-core": "4.1.19",
|
|
54
|
+
"@pipeline-builder/pipeline-data": "4.1.21",
|
|
55
|
+
"@pipeline-builder/pipeline-core": "4.1.21"
|
|
56
56
|
},
|
|
57
57
|
"keywords": [
|
|
58
58
|
"ci-cd",
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"access": "public",
|
|
109
109
|
"registry": "https://registry.npmjs.org/"
|
|
110
110
|
},
|
|
111
|
-
"version": "4.1.
|
|
111
|
+
"version": "4.1.21",
|
|
112
112
|
"bugs": {
|
|
113
113
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
114
114
|
},
|