@blamejs/core 0.7.18 → 0.7.20
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/CHANGELOG.md +427 -423
- package/README.md +150 -150
- package/bin/blamejs.js +0 -0
- package/index.js +310 -308
- package/lib/api-key.js +660 -660
- package/lib/api-snapshot.js +338 -338
- package/lib/app-shutdown.js +385 -385
- package/lib/app.js +365 -365
- package/lib/archive.js +250 -250
- package/lib/atomic-file.js +544 -544
- package/lib/audit-chain.js +177 -177
- package/lib/audit-sign.js +344 -344
- package/lib/audit-tools.js +677 -677
- package/lib/audit.js +766 -766
- package/lib/auth/jwt-external.js +365 -0
- package/lib/auth/jwt.js +337 -311
- package/lib/auth/lockout.js +436 -436
- package/lib/auth/oauth.js +721 -721
- package/lib/auth/passkey.js +181 -181
- package/lib/auth/password.js +628 -594
- package/lib/backup/bundle.js +217 -217
- package/lib/backup/crypto.js +176 -176
- package/lib/backup/index.js +515 -515
- package/lib/backup/manifest.js +282 -282
- package/lib/break-glass.js +1338 -1338
- package/lib/bundler.js +441 -441
- package/lib/cache-redis.js +256 -256
- package/lib/cache.js +1206 -1206
- package/lib/canonical-json.js +115 -115
- package/lib/chain-writer.js +234 -234
- package/lib/cli-helpers.js +206 -206
- package/lib/cli.js +2334 -2334
- package/lib/cluster-provider-db.js +317 -317
- package/lib/cluster-storage.js +226 -226
- package/lib/cluster.js +703 -703
- package/lib/config-drift.js +301 -301
- package/lib/consent.js +222 -222
- package/lib/constants.js +191 -191
- package/lib/cookies.js +350 -315
- package/lib/credential-hash.js +322 -322
- package/lib/crypto.js +266 -266
- package/lib/csv.js +275 -275
- package/lib/db-declare-row-policy.js +267 -267
- package/lib/db-declare-view.js +420 -420
- package/lib/db-query.js +406 -406
- package/lib/db-schema.js +319 -319
- package/lib/db.js +1288 -1288
- package/lib/deprecate.js +222 -222
- package/lib/dev.js +335 -335
- package/lib/dual-control.js +473 -473
- package/lib/error-page.js +420 -420
- package/lib/external-db-migrate.js +441 -441
- package/lib/external-db.js +1061 -1061
- package/lib/file-type.js +273 -273
- package/lib/forms.js +422 -422
- package/lib/framework-error.js +293 -293
- package/lib/framework-schema.js +717 -717
- package/lib/handlers.js +350 -350
- package/lib/http-client-cookie-jar.js +508 -508
- package/lib/http-client.js +1195 -1195
- package/lib/i18n.js +878 -878
- package/lib/jobs.js +185 -185
- package/lib/log-stream-cloudwatch.js +369 -369
- package/lib/log-stream-local.js +146 -146
- package/lib/log-stream-otlp-grpc.js +410 -410
- package/lib/log-stream-otlp.js +286 -286
- package/lib/log-stream-syslog.js +302 -302
- package/lib/log-stream-webhook.js +199 -199
- package/lib/log-stream.js +330 -330
- package/lib/log.js +500 -500
- package/lib/mail-bounce.js +528 -528
- package/lib/mail-dkim.js +369 -369
- package/lib/mail.js +981 -981
- package/lib/metrics.js +683 -683
- package/lib/middleware/api-encrypt.js +936 -936
- package/lib/middleware/attach-user.js +157 -157
- package/lib/middleware/bearer-auth.js +152 -0
- package/lib/middleware/body-parser.js +1170 -1170
- package/lib/middleware/bot-guard.js +178 -178
- package/lib/middleware/compression.js +452 -452
- package/lib/middleware/cors.js +314 -314
- package/lib/middleware/csp-nonce.js +348 -348
- package/lib/middleware/csrf-protect.js +399 -316
- package/lib/middleware/db-role-for.js +264 -264
- package/lib/middleware/fetch-metadata.js +129 -0
- package/lib/middleware/health.js +392 -392
- package/lib/middleware/index.js +85 -79
- package/lib/middleware/rate-limit.js +358 -358
- package/lib/middleware/request-id.js +61 -61
- package/lib/middleware/request-log.js +168 -168
- package/lib/middleware/require-auth.js +104 -104
- package/lib/middleware/security-headers.js +121 -116
- package/lib/middleware/sse.js +166 -166
- package/lib/migrations.js +383 -383
- package/lib/mtls-ca.js +518 -518
- package/lib/mtls-engine-default.js +481 -481
- package/lib/network-dns.js +632 -632
- package/lib/network-heartbeat.js +290 -290
- package/lib/network-nts.js +574 -574
- package/lib/network-proxy.js +265 -265
- package/lib/network-tls.js +328 -328
- package/lib/network.js +233 -233
- package/lib/notify.js +612 -612
- package/lib/ntp-check.js +229 -229
- package/lib/numeric-bounds.js +111 -111
- package/lib/object-store/azure-blob-bucket-ops.js +349 -349
- package/lib/object-store/azure-blob.js +488 -488
- package/lib/object-store/gcs-bucket-ops.js +351 -351
- package/lib/object-store/gcs.js +519 -519
- package/lib/object-store/http-put.js +153 -153
- package/lib/object-store/index.js +197 -197
- package/lib/object-store/sigv4-bucket-ops.js +1092 -1092
- package/lib/object-store/sigv4.js +903 -903
- package/lib/observability.js +151 -151
- package/lib/otel-export.js +269 -269
- package/lib/pagination.js +464 -464
- package/lib/parsers/index.js +80 -80
- package/lib/parsers/safe-env.js +642 -642
- package/lib/parsers/safe-ini.js +292 -292
- package/lib/parsers/safe-toml.js +784 -784
- package/lib/parsers/safe-xml.js +390 -390
- package/lib/parsers/safe-yaml.js +1015 -1015
- package/lib/permissions.js +708 -708
- package/lib/pqc-agent.js +87 -87
- package/lib/pqc-gate.js +279 -279
- package/lib/protobuf-encoder.js +190 -190
- package/lib/protocol-dispatcher.js +161 -161
- package/lib/pubsub-redis.js +167 -167
- package/lib/pubsub.js +429 -429
- package/lib/queue-local.js +476 -476
- package/lib/queue-redis.js +745 -745
- package/lib/queue-sqs.js +319 -319
- package/lib/queue.js +695 -695
- package/lib/redis-client.js +519 -519
- package/lib/request-helpers.js +340 -340
- package/lib/restore-bundle.js +237 -237
- package/lib/restore-rollback.js +259 -259
- package/lib/restore.js +409 -409
- package/lib/retry.js +376 -376
- package/lib/router.js +748 -748
- package/lib/safe-async.js +735 -735
- package/lib/safe-buffer.js +237 -237
- package/lib/safe-json.js +541 -541
- package/lib/safe-schema.js +1266 -1266
- package/lib/safe-url.js +159 -159
- package/lib/scheduler.js +706 -706
- package/lib/security-assert.js +373 -373
- package/lib/seeders.js +618 -618
- package/lib/session.js +535 -478
- package/lib/slug.js +269 -269
- package/lib/ssrf-guard.js +401 -401
- package/lib/static.js +7 -5
- package/lib/storage.js +471 -471
- package/lib/subject.js +281 -281
- package/lib/template.js +791 -791
- package/lib/testing.js +798 -798
- package/lib/time.js +310 -310
- package/lib/totp.js +302 -302
- package/lib/tracing.js +494 -494
- package/lib/uuid.js +132 -132
- package/lib/validate-opts.js +340 -340
- package/lib/vault/index.js +308 -308
- package/lib/vault/rotate.js +784 -784
- package/lib/vault/wrap.js +296 -296
- package/lib/vendor/noble-ciphers.cjs +9 -9
- package/lib/webhook.js +595 -595
- package/lib/websocket.js +1048 -1048
- package/package.json +77 -77
- package/sbom.cyclonedx.json +7 -7
package/lib/canonical-json.js
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Canonical JSON — deterministic stringify with sorted keys at every depth.
|
|
4
|
-
*
|
|
5
|
-
* Replaces the four near-identical implementations that grew up across
|
|
6
|
-
* `lib/audit-chain.js`, `lib/audit-tools.js`, `lib/config-drift.js`, and
|
|
7
|
-
* `lib/pagination.js`. They all walked `typeof === "object"` with
|
|
8
|
-
* `Object.keys(...).sort()` and silently round-tripped Date as `{}`,
|
|
9
|
-
* Buffer as `{"0":97,"1":98,…}`, Map / Set / RegExp as `{}`, Symbol /
|
|
10
|
-
* function as missing keys, and BigInt as a thrown
|
|
11
|
-
* `Do not know how to serialize a BigInt` mid-emit. Circular references
|
|
12
|
-
* stack-overflowed instead of producing a clean framework error.
|
|
13
|
-
*
|
|
14
|
-
* The walk:
|
|
15
|
-
*
|
|
16
|
-
* primitives + null + undefined → JSON.stringify (undefined → "null")
|
|
17
|
-
* bigint → decimal string ("123" not 123n)
|
|
18
|
-
* Date → ISO string
|
|
19
|
-
* Buffer / Uint8Array → hex (when bufferAs = "hex", default)
|
|
20
|
-
* throw (when bufferAs = "reject")
|
|
21
|
-
* Map / Set / RegExp → throw with constructor name
|
|
22
|
-
* symbol / function → throw with type name
|
|
23
|
-
* circular reference → throw via WeakSet detection
|
|
24
|
-
* plain array → recurse, preserve order
|
|
25
|
-
* plain object → recurse with sorted keys
|
|
26
|
-
*
|
|
27
|
-
* Two consumer policies on Buffer / Uint8Array are documented because
|
|
28
|
-
* the framework historically chose differently per call site:
|
|
29
|
-
*
|
|
30
|
-
* bufferAs: "hex" audit-chain / audit-tools / config-drift —
|
|
31
|
-
* binary data is legitimate (cert PEMs, key
|
|
32
|
-
* material, hash bytes); preserve as hex so the
|
|
33
|
-
* canonical output is reversible.
|
|
34
|
-
* bufferAs: "reject" pagination — cursor state is operator-supplied
|
|
35
|
-
* primitive data; binary in a cursor is almost
|
|
36
|
-
* always a bug; reject loudly.
|
|
37
|
-
*
|
|
38
|
-
* Operators don't call this directly — it's a framework-internal walker.
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
function _scrub(value, seen, bufferAs) {
|
|
42
|
-
if (value === null || typeof value === "undefined") return null;
|
|
43
|
-
var t = typeof value;
|
|
44
|
-
if (t === "string" || t === "boolean" || t === "number") return value;
|
|
45
|
-
if (t === "bigint") return String(value);
|
|
46
|
-
if (t === "symbol" || t === "function") {
|
|
47
|
-
throw new Error("canonical-json: " + t + " value is not " +
|
|
48
|
-
"serialisable; convert to a string before passing in");
|
|
49
|
-
}
|
|
50
|
-
// Buffer / Uint8Array — policy-driven
|
|
51
|
-
if (Buffer.isBuffer(value)) {
|
|
52
|
-
if (bufferAs === "reject") {
|
|
53
|
-
throw new Error("canonical-json: Buffer is not serialisable in this " +
|
|
54
|
-
"context (bufferAs=reject); convert to a string or hex first");
|
|
55
|
-
}
|
|
56
|
-
return value.toString("hex");
|
|
57
|
-
}
|
|
58
|
-
if (value instanceof Uint8Array) {
|
|
59
|
-
if (bufferAs === "reject") {
|
|
60
|
-
throw new Error("canonical-json: Uint8Array is not serialisable in " +
|
|
61
|
-
"this context (bufferAs=reject); convert to a string or hex first");
|
|
62
|
-
}
|
|
63
|
-
return Buffer.from(value).toString("hex");
|
|
64
|
-
}
|
|
65
|
-
if (value instanceof Date) return value.toISOString();
|
|
66
|
-
// After primitives + Date + Buffer + Uint8Array, any remaining "object"
|
|
67
|
-
// must be a plain object or array. Map / Set / RegExp / class instances
|
|
68
|
-
// all reject so the silent-data-loss class is closed.
|
|
69
|
-
if (value instanceof Map || value instanceof Set || value instanceof RegExp) {
|
|
70
|
-
throw new Error("canonical-json: " + value.constructor.name +
|
|
71
|
-
" is not serialisable; convert to a plain primitive / array / object first");
|
|
72
|
-
}
|
|
73
|
-
seen = seen || new WeakSet();
|
|
74
|
-
if (seen.has(value)) {
|
|
75
|
-
throw new Error("canonical-json: circular reference detected");
|
|
76
|
-
}
|
|
77
|
-
seen.add(value);
|
|
78
|
-
if (Array.isArray(value)) {
|
|
79
|
-
return value.map(function (v) { return _scrub(v, seen, bufferAs); });
|
|
80
|
-
}
|
|
81
|
-
// Canonical-json IS the destination for sorted-keys walks across the
|
|
82
|
-
// codebase; the keys-then-sort here is the canonical primitive itself.
|
|
83
|
-
var keys = Object.keys(value);
|
|
84
|
-
keys.sort();
|
|
85
|
-
var out = {};
|
|
86
|
-
for (var i = 0; i < keys.length; i++) {
|
|
87
|
-
out[keys[i]] = _scrub(value[keys[i]], seen, bufferAs);
|
|
88
|
-
}
|
|
89
|
-
return out;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Return the deterministic JSON string. opts.bufferAs picks the Buffer
|
|
93
|
-
// policy ("hex" default, "reject" for callers like pagination).
|
|
94
|
-
function stringify(value, opts) {
|
|
95
|
-
var bufferAs = (opts && opts.bufferAs) || "hex";
|
|
96
|
-
if (bufferAs !== "hex" && bufferAs !== "reject") {
|
|
97
|
-
throw new Error("canonical-json: bufferAs must be 'hex' or 'reject'; got " +
|
|
98
|
-
JSON.stringify(bufferAs));
|
|
99
|
-
}
|
|
100
|
-
return JSON.stringify(_scrub(value, null, bufferAs));
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Stable key ordering for an object — same lexicographic sort used by
|
|
104
|
-
// the canonical-json walker. Exposed so call sites that need a sorted
|
|
105
|
-
// key list (CLI report ordering, fingerprint inputs) route through
|
|
106
|
-
// the framework's single source-of-truth ordering rule rather than
|
|
107
|
-
// re-implementing the keys-then-sort dance inline.
|
|
108
|
-
function sortKeys(obj) {
|
|
109
|
-
if (!obj || typeof obj !== "object") return [];
|
|
110
|
-
var keys = Object.keys(obj);
|
|
111
|
-
keys.sort();
|
|
112
|
-
return keys;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
module.exports = { stringify: stringify, sortKeys: sortKeys };
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Canonical JSON — deterministic stringify with sorted keys at every depth.
|
|
4
|
+
*
|
|
5
|
+
* Replaces the four near-identical implementations that grew up across
|
|
6
|
+
* `lib/audit-chain.js`, `lib/audit-tools.js`, `lib/config-drift.js`, and
|
|
7
|
+
* `lib/pagination.js`. They all walked `typeof === "object"` with
|
|
8
|
+
* `Object.keys(...).sort()` and silently round-tripped Date as `{}`,
|
|
9
|
+
* Buffer as `{"0":97,"1":98,…}`, Map / Set / RegExp as `{}`, Symbol /
|
|
10
|
+
* function as missing keys, and BigInt as a thrown
|
|
11
|
+
* `Do not know how to serialize a BigInt` mid-emit. Circular references
|
|
12
|
+
* stack-overflowed instead of producing a clean framework error.
|
|
13
|
+
*
|
|
14
|
+
* The walk:
|
|
15
|
+
*
|
|
16
|
+
* primitives + null + undefined → JSON.stringify (undefined → "null")
|
|
17
|
+
* bigint → decimal string ("123" not 123n)
|
|
18
|
+
* Date → ISO string
|
|
19
|
+
* Buffer / Uint8Array → hex (when bufferAs = "hex", default)
|
|
20
|
+
* throw (when bufferAs = "reject")
|
|
21
|
+
* Map / Set / RegExp → throw with constructor name
|
|
22
|
+
* symbol / function → throw with type name
|
|
23
|
+
* circular reference → throw via WeakSet detection
|
|
24
|
+
* plain array → recurse, preserve order
|
|
25
|
+
* plain object → recurse with sorted keys
|
|
26
|
+
*
|
|
27
|
+
* Two consumer policies on Buffer / Uint8Array are documented because
|
|
28
|
+
* the framework historically chose differently per call site:
|
|
29
|
+
*
|
|
30
|
+
* bufferAs: "hex" audit-chain / audit-tools / config-drift —
|
|
31
|
+
* binary data is legitimate (cert PEMs, key
|
|
32
|
+
* material, hash bytes); preserve as hex so the
|
|
33
|
+
* canonical output is reversible.
|
|
34
|
+
* bufferAs: "reject" pagination — cursor state is operator-supplied
|
|
35
|
+
* primitive data; binary in a cursor is almost
|
|
36
|
+
* always a bug; reject loudly.
|
|
37
|
+
*
|
|
38
|
+
* Operators don't call this directly — it's a framework-internal walker.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
function _scrub(value, seen, bufferAs) {
|
|
42
|
+
if (value === null || typeof value === "undefined") return null;
|
|
43
|
+
var t = typeof value;
|
|
44
|
+
if (t === "string" || t === "boolean" || t === "number") return value;
|
|
45
|
+
if (t === "bigint") return String(value);
|
|
46
|
+
if (t === "symbol" || t === "function") {
|
|
47
|
+
throw new Error("canonical-json: " + t + " value is not " +
|
|
48
|
+
"serialisable; convert to a string before passing in");
|
|
49
|
+
}
|
|
50
|
+
// Buffer / Uint8Array — policy-driven
|
|
51
|
+
if (Buffer.isBuffer(value)) {
|
|
52
|
+
if (bufferAs === "reject") {
|
|
53
|
+
throw new Error("canonical-json: Buffer is not serialisable in this " +
|
|
54
|
+
"context (bufferAs=reject); convert to a string or hex first");
|
|
55
|
+
}
|
|
56
|
+
return value.toString("hex");
|
|
57
|
+
}
|
|
58
|
+
if (value instanceof Uint8Array) {
|
|
59
|
+
if (bufferAs === "reject") {
|
|
60
|
+
throw new Error("canonical-json: Uint8Array is not serialisable in " +
|
|
61
|
+
"this context (bufferAs=reject); convert to a string or hex first");
|
|
62
|
+
}
|
|
63
|
+
return Buffer.from(value).toString("hex");
|
|
64
|
+
}
|
|
65
|
+
if (value instanceof Date) return value.toISOString();
|
|
66
|
+
// After primitives + Date + Buffer + Uint8Array, any remaining "object"
|
|
67
|
+
// must be a plain object or array. Map / Set / RegExp / class instances
|
|
68
|
+
// all reject so the silent-data-loss class is closed.
|
|
69
|
+
if (value instanceof Map || value instanceof Set || value instanceof RegExp) {
|
|
70
|
+
throw new Error("canonical-json: " + value.constructor.name +
|
|
71
|
+
" is not serialisable; convert to a plain primitive / array / object first");
|
|
72
|
+
}
|
|
73
|
+
seen = seen || new WeakSet();
|
|
74
|
+
if (seen.has(value)) {
|
|
75
|
+
throw new Error("canonical-json: circular reference detected");
|
|
76
|
+
}
|
|
77
|
+
seen.add(value);
|
|
78
|
+
if (Array.isArray(value)) {
|
|
79
|
+
return value.map(function (v) { return _scrub(v, seen, bufferAs); });
|
|
80
|
+
}
|
|
81
|
+
// Canonical-json IS the destination for sorted-keys walks across the
|
|
82
|
+
// codebase; the keys-then-sort here is the canonical primitive itself.
|
|
83
|
+
var keys = Object.keys(value);
|
|
84
|
+
keys.sort();
|
|
85
|
+
var out = {};
|
|
86
|
+
for (var i = 0; i < keys.length; i++) {
|
|
87
|
+
out[keys[i]] = _scrub(value[keys[i]], seen, bufferAs);
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Return the deterministic JSON string. opts.bufferAs picks the Buffer
|
|
93
|
+
// policy ("hex" default, "reject" for callers like pagination).
|
|
94
|
+
function stringify(value, opts) {
|
|
95
|
+
var bufferAs = (opts && opts.bufferAs) || "hex";
|
|
96
|
+
if (bufferAs !== "hex" && bufferAs !== "reject") {
|
|
97
|
+
throw new Error("canonical-json: bufferAs must be 'hex' or 'reject'; got " +
|
|
98
|
+
JSON.stringify(bufferAs));
|
|
99
|
+
}
|
|
100
|
+
return JSON.stringify(_scrub(value, null, bufferAs));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Stable key ordering for an object — same lexicographic sort used by
|
|
104
|
+
// the canonical-json walker. Exposed so call sites that need a sorted
|
|
105
|
+
// key list (CLI report ordering, fingerprint inputs) route through
|
|
106
|
+
// the framework's single source-of-truth ordering rule rather than
|
|
107
|
+
// re-implementing the keys-then-sort dance inline.
|
|
108
|
+
function sortKeys(obj) {
|
|
109
|
+
if (!obj || typeof obj !== "object") return [];
|
|
110
|
+
var keys = Object.keys(obj);
|
|
111
|
+
keys.sort();
|
|
112
|
+
return keys;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = { stringify: stringify, sortKeys: sortKeys };
|