@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/numeric-bounds.js
CHANGED
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* numeric-bounds — shared validators for operator-tunable numeric opts.
|
|
4
|
-
*
|
|
5
|
-
* Replaces the recurring `typeof opts.X === "number" && opts.X > 0`
|
|
6
|
-
* pattern that ships across the framework. Pre-v0.6.69 each site had
|
|
7
|
-
* its own slightly-different inline check; the bug they all shared was
|
|
8
|
-
* accepting `Infinity` (silently bypassing OOM caps, body size limits,
|
|
9
|
-
* URL caps, depth limits) and `NaN` (also bypassing because every
|
|
10
|
-
* comparison with NaN is false). v0.6.57 fixed boundedChunkCollector,
|
|
11
|
-
* v0.6.68 fixed atomicFile, v0.6.69 sweeps the rest.
|
|
12
|
-
*
|
|
13
|
-
* var nb = require("./numeric-bounds");
|
|
14
|
-
*
|
|
15
|
-
* if (!nb.isPositiveFiniteInt(opts.maxBytes)) {
|
|
16
|
-
* throw new CsvError("csv/bad-opt",
|
|
17
|
-
* "csv.parse: maxBytes must be a positive finite integer; got " +
|
|
18
|
-
* nb.shape(opts.maxBytes));
|
|
19
|
-
* }
|
|
20
|
-
*
|
|
21
|
-
* The helper returns a predicate + a shape-formatter rather than
|
|
22
|
-
* throwing itself, because the framework's error classes use two
|
|
23
|
-
* different constructor conventions:
|
|
24
|
-
*
|
|
25
|
-
* AtomicFileError, SafeBufferError, SafeUrlError (message, code)
|
|
26
|
-
* defineClass(...)-built (CsvError, MailBounceError…) (code, message, permanent[, statusCode])
|
|
27
|
-
*
|
|
28
|
-
* Each call site throws its own class, with whatever ctor shape that
|
|
29
|
-
* class wants. The helper just owns the validation rule + the consistent
|
|
30
|
-
* shape format ("number Infinity" / "number NaN" / "string \"100\"") so
|
|
31
|
-
* the typo / coercion is visible in the error message — `JSON.stringify`
|
|
32
|
-
* collapses Infinity / NaN to "null" which obscures what went wrong.
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
// Shape formatter — typeof + String preserves "number Infinity" /
|
|
36
|
-
// "number NaN" / "string foo". Strings get JSON-quoted so trailing
|
|
37
|
-
// whitespace / control chars are visible.
|
|
38
|
-
function shape(value) {
|
|
39
|
-
if (typeof value === "string") {
|
|
40
|
-
return "string " + JSON.stringify(value);
|
|
41
|
-
}
|
|
42
|
-
return (typeof value) + " " + String(value);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function isPositiveFiniteInt(value) {
|
|
46
|
-
return typeof value === "number" && Number.isFinite(value) &&
|
|
47
|
-
Number.isInteger(value) && value > 0;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function isNonNegativeFiniteInt(value) {
|
|
51
|
-
return typeof value === "number" && Number.isFinite(value) &&
|
|
52
|
-
Number.isInteger(value) && value >= 0;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// requirePositiveFiniteIntIfPresent / requireNonNegativeFiniteIntIfPresent —
|
|
56
|
-
// optional-shape gates that throw via the caller's framework-error class
|
|
57
|
-
// when the value is present but invalid. Replaces the per-file
|
|
58
|
-
// `if (opts.X !== undefined) { if (!nb.isYFiniteInt(opts.X)) throw new
|
|
59
|
-
// XError(...); }` cascade that app-shutdown / bundler / dev /
|
|
60
|
-
// http-client-cookie-jar / external-db-migrate / restore-rollback
|
|
61
|
-
// previously rolled by hand.
|
|
62
|
-
//
|
|
63
|
-
// var nb = require("./numeric-bounds");
|
|
64
|
-
// nb.requirePositiveFiniteIntIfPresent(opts.graceMs,
|
|
65
|
-
// "app-shutdown.create: opts.graceMs", AppShutdownError,
|
|
66
|
-
// "app-shutdown/bad-grace-ms");
|
|
67
|
-
function requirePositiveFiniteIntIfPresent(value, label, errorClass, code) {
|
|
68
|
-
if (value === undefined) return value;
|
|
69
|
-
if (!isPositiveFiniteInt(value)) {
|
|
70
|
-
throw new errorClass(code,
|
|
71
|
-
(label || "value") + " must be a positive finite integer; got " + shape(value));
|
|
72
|
-
}
|
|
73
|
-
return value;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function requireNonNegativeFiniteIntIfPresent(value, label, errorClass, code) {
|
|
77
|
-
if (value === undefined) return value;
|
|
78
|
-
if (!isNonNegativeFiniteInt(value)) {
|
|
79
|
-
throw new errorClass(code,
|
|
80
|
-
(label || "value") + " must be a non-negative finite integer; got " + shape(value));
|
|
81
|
-
}
|
|
82
|
-
return value;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// requireAllPositiveFiniteIntIfPresent — batch validator. Walk each
|
|
86
|
-
// opt-name in the list; for any that is present in opts, require it to
|
|
87
|
-
// be a positive finite integer (otherwise throw via errorClass with the
|
|
88
|
-
// shared code). Used by primitives whose entry points have a 3-6
|
|
89
|
-
// numeric opts that all share the same shape constraint, so the inline
|
|
90
|
-
// call sequence doesn't repeat per primitive.
|
|
91
|
-
//
|
|
92
|
-
// nb.requireAllPositiveFiniteIntIfPresent(opts,
|
|
93
|
-
// ["maxBytes", "maxAttrValueBytes", "maxTagDepth", "maxAttrsPerTag"],
|
|
94
|
-
// "guardHtml.validate", GuardHtmlError, "html.bad-opt");
|
|
95
|
-
function requireAllPositiveFiniteIntIfPresent(opts, names, labelPrefix, errorClass, code) {
|
|
96
|
-
if (!opts || !Array.isArray(names)) return;
|
|
97
|
-
for (var i = 0; i < names.length; i += 1) {
|
|
98
|
-
var n = names[i];
|
|
99
|
-
requirePositiveFiniteIntIfPresent(opts[n],
|
|
100
|
-
(labelPrefix || "") + ": " + n, errorClass, code);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
module.exports = {
|
|
105
|
-
shape: shape,
|
|
106
|
-
isPositiveFiniteInt: isPositiveFiniteInt,
|
|
107
|
-
isNonNegativeFiniteInt: isNonNegativeFiniteInt,
|
|
108
|
-
requirePositiveFiniteIntIfPresent: requirePositiveFiniteIntIfPresent,
|
|
109
|
-
requireNonNegativeFiniteIntIfPresent: requireNonNegativeFiniteIntIfPresent,
|
|
110
|
-
requireAllPositiveFiniteIntIfPresent: requireAllPositiveFiniteIntIfPresent,
|
|
111
|
-
};
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* numeric-bounds — shared validators for operator-tunable numeric opts.
|
|
4
|
+
*
|
|
5
|
+
* Replaces the recurring `typeof opts.X === "number" && opts.X > 0`
|
|
6
|
+
* pattern that ships across the framework. Pre-v0.6.69 each site had
|
|
7
|
+
* its own slightly-different inline check; the bug they all shared was
|
|
8
|
+
* accepting `Infinity` (silently bypassing OOM caps, body size limits,
|
|
9
|
+
* URL caps, depth limits) and `NaN` (also bypassing because every
|
|
10
|
+
* comparison with NaN is false). v0.6.57 fixed boundedChunkCollector,
|
|
11
|
+
* v0.6.68 fixed atomicFile, v0.6.69 sweeps the rest.
|
|
12
|
+
*
|
|
13
|
+
* var nb = require("./numeric-bounds");
|
|
14
|
+
*
|
|
15
|
+
* if (!nb.isPositiveFiniteInt(opts.maxBytes)) {
|
|
16
|
+
* throw new CsvError("csv/bad-opt",
|
|
17
|
+
* "csv.parse: maxBytes must be a positive finite integer; got " +
|
|
18
|
+
* nb.shape(opts.maxBytes));
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* The helper returns a predicate + a shape-formatter rather than
|
|
22
|
+
* throwing itself, because the framework's error classes use two
|
|
23
|
+
* different constructor conventions:
|
|
24
|
+
*
|
|
25
|
+
* AtomicFileError, SafeBufferError, SafeUrlError (message, code)
|
|
26
|
+
* defineClass(...)-built (CsvError, MailBounceError…) (code, message, permanent[, statusCode])
|
|
27
|
+
*
|
|
28
|
+
* Each call site throws its own class, with whatever ctor shape that
|
|
29
|
+
* class wants. The helper just owns the validation rule + the consistent
|
|
30
|
+
* shape format ("number Infinity" / "number NaN" / "string \"100\"") so
|
|
31
|
+
* the typo / coercion is visible in the error message — `JSON.stringify`
|
|
32
|
+
* collapses Infinity / NaN to "null" which obscures what went wrong.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
// Shape formatter — typeof + String preserves "number Infinity" /
|
|
36
|
+
// "number NaN" / "string foo". Strings get JSON-quoted so trailing
|
|
37
|
+
// whitespace / control chars are visible.
|
|
38
|
+
function shape(value) {
|
|
39
|
+
if (typeof value === "string") {
|
|
40
|
+
return "string " + JSON.stringify(value);
|
|
41
|
+
}
|
|
42
|
+
return (typeof value) + " " + String(value);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isPositiveFiniteInt(value) {
|
|
46
|
+
return typeof value === "number" && Number.isFinite(value) &&
|
|
47
|
+
Number.isInteger(value) && value > 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function isNonNegativeFiniteInt(value) {
|
|
51
|
+
return typeof value === "number" && Number.isFinite(value) &&
|
|
52
|
+
Number.isInteger(value) && value >= 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// requirePositiveFiniteIntIfPresent / requireNonNegativeFiniteIntIfPresent —
|
|
56
|
+
// optional-shape gates that throw via the caller's framework-error class
|
|
57
|
+
// when the value is present but invalid. Replaces the per-file
|
|
58
|
+
// `if (opts.X !== undefined) { if (!nb.isYFiniteInt(opts.X)) throw new
|
|
59
|
+
// XError(...); }` cascade that app-shutdown / bundler / dev /
|
|
60
|
+
// http-client-cookie-jar / external-db-migrate / restore-rollback
|
|
61
|
+
// previously rolled by hand.
|
|
62
|
+
//
|
|
63
|
+
// var nb = require("./numeric-bounds");
|
|
64
|
+
// nb.requirePositiveFiniteIntIfPresent(opts.graceMs,
|
|
65
|
+
// "app-shutdown.create: opts.graceMs", AppShutdownError,
|
|
66
|
+
// "app-shutdown/bad-grace-ms");
|
|
67
|
+
function requirePositiveFiniteIntIfPresent(value, label, errorClass, code) {
|
|
68
|
+
if (value === undefined) return value;
|
|
69
|
+
if (!isPositiveFiniteInt(value)) {
|
|
70
|
+
throw new errorClass(code,
|
|
71
|
+
(label || "value") + " must be a positive finite integer; got " + shape(value));
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function requireNonNegativeFiniteIntIfPresent(value, label, errorClass, code) {
|
|
77
|
+
if (value === undefined) return value;
|
|
78
|
+
if (!isNonNegativeFiniteInt(value)) {
|
|
79
|
+
throw new errorClass(code,
|
|
80
|
+
(label || "value") + " must be a non-negative finite integer; got " + shape(value));
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// requireAllPositiveFiniteIntIfPresent — batch validator. Walk each
|
|
86
|
+
// opt-name in the list; for any that is present in opts, require it to
|
|
87
|
+
// be a positive finite integer (otherwise throw via errorClass with the
|
|
88
|
+
// shared code). Used by primitives whose entry points have a 3-6
|
|
89
|
+
// numeric opts that all share the same shape constraint, so the inline
|
|
90
|
+
// call sequence doesn't repeat per primitive.
|
|
91
|
+
//
|
|
92
|
+
// nb.requireAllPositiveFiniteIntIfPresent(opts,
|
|
93
|
+
// ["maxBytes", "maxAttrValueBytes", "maxTagDepth", "maxAttrsPerTag"],
|
|
94
|
+
// "guardHtml.validate", GuardHtmlError, "html.bad-opt");
|
|
95
|
+
function requireAllPositiveFiniteIntIfPresent(opts, names, labelPrefix, errorClass, code) {
|
|
96
|
+
if (!opts || !Array.isArray(names)) return;
|
|
97
|
+
for (var i = 0; i < names.length; i += 1) {
|
|
98
|
+
var n = names[i];
|
|
99
|
+
requirePositiveFiniteIntIfPresent(opts[n],
|
|
100
|
+
(labelPrefix || "") + ": " + n, errorClass, code);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = {
|
|
105
|
+
shape: shape,
|
|
106
|
+
isPositiveFiniteInt: isPositiveFiniteInt,
|
|
107
|
+
isNonNegativeFiniteInt: isNonNegativeFiniteInt,
|
|
108
|
+
requirePositiveFiniteIntIfPresent: requirePositiveFiniteIntIfPresent,
|
|
109
|
+
requireNonNegativeFiniteIntIfPresent: requireNonNegativeFiniteIntIfPresent,
|
|
110
|
+
requireAllPositiveFiniteIntIfPresent: requireAllPositiveFiniteIntIfPresent,
|
|
111
|
+
};
|