@pipeline-builder/api-core 4.0.3 → 4.1.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.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Constant-time string equality, for comparing a presented secret against an
3
+ * expected one (scrape tokens, shared webhook secrets, signatures).
4
+ *
5
+ * `a === b` on secrets short-circuits at the first differing byte, which leaks
6
+ * the expected value a byte at a time to an attacker who can measure response
7
+ * latency. `timingSafeEqual` does not — but it THROWS when the two buffers
8
+ * differ in length, so length is compared first and the result is folded in
9
+ * without an early return.
10
+ *
11
+ * The length check itself is not constant-time, so this leaks the expected
12
+ * secret's LENGTH. That is acceptable for fixed-length tokens and is the
13
+ * standard trade-off; do not use this where the length is itself the secret.
14
+ */
15
+ export declare function safeEqual(presented: string, expected: string): boolean;
@@ -0,0 +1,29 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { timingSafeEqual } from 'crypto';
4
+ /**
5
+ * Constant-time string equality, for comparing a presented secret against an
6
+ * expected one (scrape tokens, shared webhook secrets, signatures).
7
+ *
8
+ * `a === b` on secrets short-circuits at the first differing byte, which leaks
9
+ * the expected value a byte at a time to an attacker who can measure response
10
+ * latency. `timingSafeEqual` does not — but it THROWS when the two buffers
11
+ * differ in length, so length is compared first and the result is folded in
12
+ * without an early return.
13
+ *
14
+ * The length check itself is not constant-time, so this leaks the expected
15
+ * secret's LENGTH. That is acceptable for fixed-length tokens and is the
16
+ * standard trade-off; do not use this where the length is itself the secret.
17
+ */
18
+ export function safeEqual(presented, expected) {
19
+ const a = Buffer.from(presented, 'utf8');
20
+ const b = Buffer.from(expected, 'utf8');
21
+ if (a.length !== b.length) {
22
+ // Still run a comparison of equal-length buffers so a wrong-length guess
23
+ // doesn't return measurably faster than a right-length one.
24
+ timingSafeEqual(a, a);
25
+ return false;
26
+ }
27
+ return timingSafeEqual(a, b);
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlLWNvbXBhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjdXJlLWNvbXBhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7SUFDM0QsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQix5RUFBeUU7UUFDekUsNERBQTREO1FBQzVELGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsT0FBTyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgdGltaW5nU2FmZUVxdWFsIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqXG4gKiBDb25zdGFudC10aW1lIHN0cmluZyBlcXVhbGl0eSwgZm9yIGNvbXBhcmluZyBhIHByZXNlbnRlZCBzZWNyZXQgYWdhaW5zdCBhblxuICogZXhwZWN0ZWQgb25lIChzY3JhcGUgdG9rZW5zLCBzaGFyZWQgd2ViaG9vayBzZWNyZXRzLCBzaWduYXR1cmVzKS5cbiAqXG4gKiBgYSA9PT0gYmAgb24gc2VjcmV0cyBzaG9ydC1jaXJjdWl0cyBhdCB0aGUgZmlyc3QgZGlmZmVyaW5nIGJ5dGUsIHdoaWNoIGxlYWtzXG4gKiB0aGUgZXhwZWN0ZWQgdmFsdWUgYSBieXRlIGF0IGEgdGltZSB0byBhbiBhdHRhY2tlciB3aG8gY2FuIG1lYXN1cmUgcmVzcG9uc2VcbiAqIGxhdGVuY3kuIGB0aW1pbmdTYWZlRXF1YWxgIGRvZXMgbm90IOKAlCBidXQgaXQgVEhST1dTIHdoZW4gdGhlIHR3byBidWZmZXJzXG4gKiBkaWZmZXIgaW4gbGVuZ3RoLCBzbyBsZW5ndGggaXMgY29tcGFyZWQgZmlyc3QgYW5kIHRoZSByZXN1bHQgaXMgZm9sZGVkIGluXG4gKiB3aXRob3V0IGFuIGVhcmx5IHJldHVybi5cbiAqXG4gKiBUaGUgbGVuZ3RoIGNoZWNrIGl0c2VsZiBpcyBub3QgY29uc3RhbnQtdGltZSwgc28gdGhpcyBsZWFrcyB0aGUgZXhwZWN0ZWRcbiAqIHNlY3JldCdzIExFTkdUSC4gVGhhdCBpcyBhY2NlcHRhYmxlIGZvciBmaXhlZC1sZW5ndGggdG9rZW5zIGFuZCBpcyB0aGVcbiAqIHN0YW5kYXJkIHRyYWRlLW9mZjsgZG8gbm90IHVzZSB0aGlzIHdoZXJlIHRoZSBsZW5ndGggaXMgaXRzZWxmIHRoZSBzZWNyZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYWZlRXF1YWwocHJlc2VudGVkOiBzdHJpbmcsIGV4cGVjdGVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYSA9IEJ1ZmZlci5mcm9tKHByZXNlbnRlZCwgJ3V0ZjgnKTtcbiAgY29uc3QgYiA9IEJ1ZmZlci5mcm9tKGV4cGVjdGVkLCAndXRmOCcpO1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgLy8gU3RpbGwgcnVuIGEgY29tcGFyaXNvbiBvZiBlcXVhbC1sZW5ndGggYnVmZmVycyBzbyBhIHdyb25nLWxlbmd0aCBndWVzc1xuICAgIC8vIGRvZXNuJ3QgcmV0dXJuIG1lYXN1cmFibHkgZmFzdGVyIHRoYW4gYSByaWdodC1sZW5ndGggb25lLlxuICAgIHRpbWluZ1NhZmVFcXVhbChhLCBhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRpbWluZ1NhZmVFcXVhbChhLCBiKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -87,7 +87,7 @@
87
87
  "access": "public",
88
88
  "registry": "https://registry.npmjs.org/"
89
89
  },
90
- "version": "4.0.3",
90
+ "version": "4.1.1",
91
91
  "bugs": {
92
92
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
93
93
  },