@blamejs/blamejs-shop 0.2.24 → 0.2.26
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 +4 -0
- package/lib/admin.js +42 -9
- package/lib/asset-manifest.json +1 -1
- package/lib/storefront.js +98 -21
- package/lib/vendor/MANIFEST.json +2 -2
- package/lib/vendor/blamejs/CHANGELOG.md +2 -0
- package/lib/vendor/blamejs/api-snapshot.json +2 -2
- package/lib/vendor/blamejs/lib/a2a.js +11 -11
- package/lib/vendor/blamejs/lib/agent-snapshot.js +1 -1
- package/lib/vendor/blamejs/lib/ai-capability.js +20 -20
- package/lib/vendor/blamejs/lib/ai-dp.js +17 -17
- package/lib/vendor/blamejs/lib/ai-input.js +3 -3
- package/lib/vendor/blamejs/lib/ai-pref.js +9 -9
- package/lib/vendor/blamejs/lib/ai-quota.js +17 -17
- package/lib/vendor/blamejs/lib/arg-parser.js +38 -38
- package/lib/vendor/blamejs/lib/audit-sign.js +4 -4
- package/lib/vendor/blamejs/lib/auth/acr-vocabulary.js +4 -4
- package/lib/vendor/blamejs/lib/auth/auth-time-tracker.js +1 -1
- package/lib/vendor/blamejs/lib/auth/elevation-grant.js +10 -10
- package/lib/vendor/blamejs/lib/auth/step-up-policy.js +12 -12
- package/lib/vendor/blamejs/lib/auth/step-up.js +15 -15
- package/lib/vendor/blamejs/lib/boot-gates.js +6 -6
- package/lib/vendor/blamejs/lib/budr.js +6 -6
- package/lib/vendor/blamejs/lib/content-credentials.js +13 -13
- package/lib/vendor/blamejs/lib/dark-patterns.js +15 -15
- package/lib/vendor/blamejs/lib/ddl-change-control.js +37 -37
- package/lib/vendor/blamejs/lib/dr-runbook.js +7 -7
- package/lib/vendor/blamejs/lib/fapi2.js +9 -9
- package/lib/vendor/blamejs/lib/fdx.js +7 -7
- package/lib/vendor/blamejs/lib/graphql-federation.js +2 -2
- package/lib/vendor/blamejs/lib/iab-mspa.js +5 -5
- package/lib/vendor/blamejs/lib/iab-tcf.js +18 -18
- package/lib/vendor/blamejs/lib/mcp.js +13 -13
- package/lib/vendor/blamejs/lib/middleware/require-step-up.js +3 -3
- package/lib/vendor/blamejs/lib/sec-cyber.js +3 -3
- package/lib/vendor/blamejs/lib/sse.js +14 -14
- package/lib/vendor/blamejs/lib/tcpa-10dlc.js +5 -5
- package/lib/vendor/blamejs/lib/tenant-quota.js +18 -18
- package/lib/vendor/blamejs/package.json +1 -1
- package/lib/vendor/blamejs/release-notes/v0.13.44.json +31 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/a2a.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-capability.test.js +15 -15
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-dp.test.js +16 -16
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-input.test.js +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-pref.test.js +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/ai-quota.test.js +19 -19
- package/lib/vendor/blamejs/test/layer-0-primitives/audit-sign-ml-dsa-65.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/boot-gates.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/budr.test.js +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +52 -0
- package/lib/vendor/blamejs/test/layer-0-primitives/content-credentials.test.js +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/dark-patterns.test.js +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/dr-runbook.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/fapi2.test.js +6 -6
- package/lib/vendor/blamejs/test/layer-0-primitives/fdx.test.js +2 -2
- package/lib/vendor/blamejs/test/layer-0-primitives/graphql-federation.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-mspa.test.js +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/iab-tcf.test.js +7 -7
- package/lib/vendor/blamejs/test/layer-0-primitives/mcp.test.js +5 -5
- package/lib/vendor/blamejs/test/layer-0-primitives/sse.test.js +1 -1
- package/lib/vendor/blamejs/test/layer-0-primitives/tcpa-10dlc.test.js +3 -3
- package/lib/vendor/blamejs/test/layer-0-primitives/tenant-quota.test.js +3 -3
- package/package.json +1 -1
|
@@ -102,7 +102,7 @@ function _frGt(a, b) { return a.num * b.den > b.num * a.den; } // a > b
|
|
|
102
102
|
// Uniform BigInt in [0, m) via rejection sampling on CSPRNG bytes —
|
|
103
103
|
// no modulo bias.
|
|
104
104
|
function _uniformBelow(m) {
|
|
105
|
-
if (m <= 0n) throw new AiDpError("
|
|
105
|
+
if (m <= 0n) throw new AiDpError("ai-dp/internal", "ai.dp: _uniformBelow needs m > 0");
|
|
106
106
|
if (m === 1n) return 0n;
|
|
107
107
|
var bits = m.toString(2).length;
|
|
108
108
|
var bytes = Math.ceil(bits / 8); // allow:raw-byte-literal — bits-per-byte divisor, not a size
|
|
@@ -296,23 +296,23 @@ function mechanism(opts) {
|
|
|
296
296
|
validateOpts(opts, ["type", "sensitivity", "epsilon", "delta", "bound"], "ai.dp.mechanism");
|
|
297
297
|
|
|
298
298
|
if (MECHANISMS.indexOf(opts.type) === -1) {
|
|
299
|
-
throw new AiDpError("
|
|
299
|
+
throw new AiDpError("ai-dp/bad-mechanism",
|
|
300
300
|
"ai.dp.mechanism: type must be one of " + MECHANISMS.join(" / ") +
|
|
301
301
|
" (exponential / sparse-vector are deferred — their float-safe constructions " +
|
|
302
302
|
"re-open on demand)");
|
|
303
303
|
}
|
|
304
304
|
if (typeof opts.sensitivity !== "number" || !isFinite(opts.sensitivity) || opts.sensitivity <= 0) {
|
|
305
|
-
throw new AiDpError("
|
|
305
|
+
throw new AiDpError("ai-dp/bad-sensitivity",
|
|
306
306
|
"ai.dp.mechanism: sensitivity must be a positive finite number");
|
|
307
307
|
}
|
|
308
308
|
if (typeof opts.epsilon !== "number" || !isFinite(opts.epsilon) || opts.epsilon <= 0) {
|
|
309
|
-
throw new AiDpError("
|
|
309
|
+
throw new AiDpError("ai-dp/bad-epsilon",
|
|
310
310
|
"ai.dp.mechanism: epsilon must be a positive finite number");
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
if (opts.type === "laplace") {
|
|
314
314
|
if (typeof opts.bound !== "number" || !isFinite(opts.bound) || opts.bound <= 0) {
|
|
315
|
-
throw new AiDpError("
|
|
315
|
+
throw new AiDpError("ai-dp/bad-bound",
|
|
316
316
|
"ai.dp.mechanism: laplace requires bound > 0 (the snapping clamp; the " +
|
|
317
317
|
"privacy guarantee depends on it)");
|
|
318
318
|
}
|
|
@@ -325,11 +325,11 @@ function mechanism(opts) {
|
|
|
325
325
|
|
|
326
326
|
// gaussian
|
|
327
327
|
if (typeof opts.delta !== "number" || !isFinite(opts.delta) || opts.delta <= 0 || opts.delta >= 1) {
|
|
328
|
-
throw new AiDpError("
|
|
328
|
+
throw new AiDpError("ai-dp/bad-delta",
|
|
329
329
|
"ai.dp.mechanism: gaussian requires 0 < delta < 1");
|
|
330
330
|
}
|
|
331
331
|
if (opts.epsilon > 1) {
|
|
332
|
-
throw new AiDpError("
|
|
332
|
+
throw new AiDpError("ai-dp/epsilon-too-large",
|
|
333
333
|
"ai.dp.mechanism: the classic Gaussian calibration is proven for epsilon <= 1; " +
|
|
334
334
|
"split into multiple releases under an rdp budget, or the analytic Gaussian " +
|
|
335
335
|
"mechanism (Balle-Wang 2018) re-opens this path on demand");
|
|
@@ -346,7 +346,7 @@ function mechanism(opts) {
|
|
|
346
346
|
// budget wraps this).
|
|
347
347
|
function _applyMechanism(m, value) {
|
|
348
348
|
if (typeof value !== "number" || !isFinite(value)) {
|
|
349
|
-
throw new AiDpError("
|
|
349
|
+
throw new AiDpError("ai-dp/bad-value", "ai.dp: value must be a finite number");
|
|
350
350
|
}
|
|
351
351
|
if (m.type === "laplace") {
|
|
352
352
|
return _snappingLaplace(value, m.scale, m.bound);
|
|
@@ -403,22 +403,22 @@ function budget(opts) {
|
|
|
403
403
|
validateOpts(opts, ["scope", "epsilon", "delta", "accounting", "audit"], "ai.dp.budget");
|
|
404
404
|
|
|
405
405
|
validateOpts.requireNonEmptyString(opts.scope,
|
|
406
|
-
"ai.dp.budget: scope", AiDpError, "
|
|
406
|
+
"ai.dp.budget: scope", AiDpError, "ai-dp/bad-scope");
|
|
407
407
|
if (typeof opts.epsilon !== "number" || !isFinite(opts.epsilon) || opts.epsilon <= 0) {
|
|
408
|
-
throw new AiDpError("
|
|
408
|
+
throw new AiDpError("ai-dp/bad-epsilon", "ai.dp.budget: epsilon must be a positive finite number");
|
|
409
409
|
}
|
|
410
410
|
var totalEpsilon = opts.epsilon;
|
|
411
411
|
var totalDelta = (opts.delta == null) ? 0 : opts.delta;
|
|
412
412
|
if (typeof totalDelta !== "number" || !isFinite(totalDelta) || totalDelta < 0 || totalDelta >= 1) {
|
|
413
|
-
throw new AiDpError("
|
|
413
|
+
throw new AiDpError("ai-dp/bad-delta", "ai.dp.budget: delta must be in [0, 1)");
|
|
414
414
|
}
|
|
415
415
|
var accounting = (opts.accounting == null) ? "basic" : opts.accounting;
|
|
416
416
|
if (ACCOUNTINGS.indexOf(accounting) === -1) {
|
|
417
|
-
throw new AiDpError("
|
|
417
|
+
throw new AiDpError("ai-dp/bad-accounting",
|
|
418
418
|
"ai.dp.budget: accounting must be one of " + ACCOUNTINGS.join(" / "));
|
|
419
419
|
}
|
|
420
420
|
if (accounting === "rdp" && totalDelta <= 0) {
|
|
421
|
-
throw new AiDpError("
|
|
421
|
+
throw new AiDpError("ai-dp/bad-accounting",
|
|
422
422
|
"ai.dp.budget: rdp accounting requires delta > 0 (the RDP→(ε,δ) conversion is " +
|
|
423
423
|
"undefined at delta = 0; use basic accounting for pure-ε budgets)");
|
|
424
424
|
}
|
|
@@ -457,11 +457,11 @@ function budget(opts) {
|
|
|
457
457
|
|
|
458
458
|
function consume(m, value) {
|
|
459
459
|
if (!m || typeof m !== "object" || MECHANISMS.indexOf(m.type) === -1) {
|
|
460
|
-
throw new AiDpError("
|
|
460
|
+
throw new AiDpError("ai-dp/bad-mechanism",
|
|
461
461
|
"ai.dp.budget.consume: first argument must be a b.ai.dp.mechanism");
|
|
462
462
|
}
|
|
463
463
|
if (m.type === "gaussian" && totalDelta <= 0) {
|
|
464
|
-
throw new AiDpError("
|
|
464
|
+
throw new AiDpError("ai-dp/bad-delta",
|
|
465
465
|
"ai.dp.budget.consume: a gaussian mechanism needs a scope delta > 0");
|
|
466
466
|
}
|
|
467
467
|
|
|
@@ -475,7 +475,7 @@ function budget(opts) {
|
|
|
475
475
|
requestEpsilon: m.epsilon, requestDelta: m.delta,
|
|
476
476
|
spentEpsilon: spentEpsilon, totalEpsilon: totalEpsilon,
|
|
477
477
|
});
|
|
478
|
-
throw new AiDpError("
|
|
478
|
+
throw new AiDpError("ai-dp/budget-exhausted",
|
|
479
479
|
"ai.dp.budget.consume: scope '" + scope + "' would spend ε=" +
|
|
480
480
|
(spentEpsilon + m.epsilon) + "/" + totalEpsilon + ", δ=" +
|
|
481
481
|
(spentDelta + m.delta) + "/" + totalDelta + "; refused");
|
|
@@ -489,7 +489,7 @@ function budget(opts) {
|
|
|
489
489
|
scope: scope, accounting: accounting, mechanism: m.type,
|
|
490
490
|
projectedEpsilon: trialEps, totalEpsilon: totalEpsilon,
|
|
491
491
|
});
|
|
492
|
-
throw new AiDpError("
|
|
492
|
+
throw new AiDpError("ai-dp/budget-exhausted",
|
|
493
493
|
"ai.dp.budget.consume: scope '" + scope + "' would reach ε=" +
|
|
494
494
|
trialEps.toFixed(4) + " of " + totalEpsilon + " at δ=" + totalDelta + "; refused");
|
|
495
495
|
}
|
|
@@ -104,12 +104,12 @@ function classify(input, opts) {
|
|
|
104
104
|
var auditOn = opts.audit !== false;
|
|
105
105
|
|
|
106
106
|
if (typeof input !== "string") {
|
|
107
|
-
throw errorClass.factory("
|
|
107
|
+
throw errorClass.factory("ai-input/bad-input",
|
|
108
108
|
"aiInput.classify: input must be a string");
|
|
109
109
|
}
|
|
110
110
|
var byteLen = Buffer.byteLength(input, "utf8");
|
|
111
111
|
if (byteLen > maxBytes) {
|
|
112
|
-
throw errorClass.factory("
|
|
112
|
+
throw errorClass.factory("ai-input/input-too-large",
|
|
113
113
|
"aiInput.classify: input exceeds " + maxBytes + " bytes (got " + byteLen + ")");
|
|
114
114
|
}
|
|
115
115
|
|
|
@@ -187,7 +187,7 @@ function refuseIfMalicious(input, opts) {
|
|
|
187
187
|
var errorClass = opts.errorClass || AiInputError;
|
|
188
188
|
var result = classify(input, opts);
|
|
189
189
|
if (result.verdict === "malicious") {
|
|
190
|
-
throw errorClass.factory("
|
|
190
|
+
throw errorClass.factory("ai-input/malicious-input",
|
|
191
191
|
"aiInput: input flagged as malicious (signals: " +
|
|
192
192
|
result.signals.map(function (s) { return s.id; }).join(", ") + ")");
|
|
193
193
|
}
|
|
@@ -38,25 +38,25 @@ var SNIPPET_VALUES = ["allow", "deny"];
|
|
|
38
38
|
|
|
39
39
|
function _validate(opts) {
|
|
40
40
|
if (!opts || typeof opts !== "object") {
|
|
41
|
-
throw AiPrefError.factory("
|
|
41
|
+
throw AiPrefError.factory("ai-pref/bad-opts",
|
|
42
42
|
"aiPref: opts required");
|
|
43
43
|
}
|
|
44
44
|
var train = opts.train || "deny";
|
|
45
45
|
var infer = opts.infer || "allow";
|
|
46
46
|
var snippet = opts.snippet || "allow";
|
|
47
47
|
if (TRAIN_VALUES.indexOf(train) === -1) {
|
|
48
|
-
throw AiPrefError.factory("
|
|
48
|
+
throw AiPrefError.factory("ai-pref/bad-train", "aiPref: train must be one of " + TRAIN_VALUES.join(", "));
|
|
49
49
|
}
|
|
50
50
|
if (INFER_VALUES.indexOf(infer) === -1) {
|
|
51
|
-
throw AiPrefError.factory("
|
|
51
|
+
throw AiPrefError.factory("ai-pref/bad-infer", "aiPref: infer must be one of " + INFER_VALUES.join(", "));
|
|
52
52
|
}
|
|
53
53
|
if (SNIPPET_VALUES.indexOf(snippet) === -1) {
|
|
54
|
-
throw AiPrefError.factory("
|
|
54
|
+
throw AiPrefError.factory("ai-pref/bad-snippet", "aiPref: snippet must be one of " + SNIPPET_VALUES.join(", "));
|
|
55
55
|
}
|
|
56
56
|
if ((train === "paid" || infer === "paid") &&
|
|
57
57
|
(!opts.price || typeof opts.price.amountUsd !== "number" ||
|
|
58
58
|
!isFinite(opts.price.amountUsd) || opts.price.amountUsd <= 0)) {
|
|
59
|
-
throw AiPrefError.factory("
|
|
59
|
+
throw AiPrefError.factory("ai-pref/bad-price",
|
|
60
60
|
"aiPref: price.amountUsd (positive finite number) required when train or infer is 'paid'");
|
|
61
61
|
}
|
|
62
62
|
return { train: train, infer: infer, snippet: snippet, price: opts.price || null };
|
|
@@ -140,10 +140,10 @@ function serializeHeader(opts) {
|
|
|
140
140
|
*/
|
|
141
141
|
function parseHeader(value) {
|
|
142
142
|
if (typeof value !== "string" || value.length === 0) {
|
|
143
|
-
throw AiPrefError.factory("
|
|
143
|
+
throw AiPrefError.factory("ai-pref/bad-header", "aiPref.parseHeader: value required");
|
|
144
144
|
}
|
|
145
145
|
if (value.length > 1024) { // allow:raw-byte-literal — header value cap, not bytes
|
|
146
|
-
throw AiPrefError.factory("
|
|
146
|
+
throw AiPrefError.factory("ai-pref/header-too-large",
|
|
147
147
|
"aiPref.parseHeader: value exceeds 1024 chars");
|
|
148
148
|
}
|
|
149
149
|
structuredFields.refuseControlBytes(value, {
|
|
@@ -206,7 +206,7 @@ function robotsBlock(opts) {
|
|
|
206
206
|
var v = _validate(opts);
|
|
207
207
|
var ua = opts.userAgent || "*";
|
|
208
208
|
if (typeof ua !== "string" || ua.length === 0 || ua.length > 256) { // allow:raw-byte-literal — UA-string cap, not bytes
|
|
209
|
-
throw AiPrefError.factory("
|
|
209
|
+
throw AiPrefError.factory("ai-pref/bad-user-agent",
|
|
210
210
|
"aiPref.robotsBlock: userAgent must be 1-256 char string (or omit for *)");
|
|
211
211
|
}
|
|
212
212
|
return "User-agent: " + ua + "\n" +
|
|
@@ -298,7 +298,7 @@ function middleware(opts) {
|
|
|
298
298
|
*/
|
|
299
299
|
function refusePaidCrawl(req, res, opts) {
|
|
300
300
|
if (!opts || !opts.price || typeof opts.price.amountUsd !== "number") {
|
|
301
|
-
throw AiPrefError.factory("
|
|
301
|
+
throw AiPrefError.factory("ai-pref/bad-price",
|
|
302
302
|
"aiPref.refusePaidCrawl: opts.price.amountUsd required");
|
|
303
303
|
}
|
|
304
304
|
var body = JSON.stringify({
|
|
@@ -257,20 +257,20 @@ function create(opts) {
|
|
|
257
257
|
|
|
258
258
|
var dimension = opts.dimension;
|
|
259
259
|
if (DIMENSIONS.indexOf(dimension) === -1) {
|
|
260
|
-
throw new AiQuotaError("
|
|
260
|
+
throw new AiQuotaError("ai-quota/bad-dimension",
|
|
261
261
|
"ai.quota.create: dimension must be one of " + DIMENSIONS.join(" / ") +
|
|
262
262
|
" (got " + JSON.stringify(dimension) + ")");
|
|
263
263
|
}
|
|
264
264
|
|
|
265
265
|
var period = opts.period;
|
|
266
266
|
if (PERIODS.indexOf(period) === -1) {
|
|
267
|
-
throw new AiQuotaError("
|
|
267
|
+
throw new AiQuotaError("ai-quota/bad-period",
|
|
268
268
|
"ai.quota.create: period must be one of " + PERIODS.join(" / ") +
|
|
269
269
|
" (got " + JSON.stringify(period) + ")");
|
|
270
270
|
}
|
|
271
271
|
|
|
272
272
|
if (typeof opts.limit !== "number" || !isFinite(opts.limit) || opts.limit <= 0) {
|
|
273
|
-
throw new AiQuotaError("
|
|
273
|
+
throw new AiQuotaError("ai-quota/bad-limit",
|
|
274
274
|
"ai.quota.create: limit must be a positive finite number");
|
|
275
275
|
}
|
|
276
276
|
var defaultLimit = opts.limit;
|
|
@@ -281,7 +281,7 @@ function create(opts) {
|
|
|
281
281
|
|
|
282
282
|
var enforcement = (opts.enforcement == null) ? "hard" : opts.enforcement;
|
|
283
283
|
if (ENFORCEMENTS.indexOf(enforcement) === -1) {
|
|
284
|
-
throw new AiQuotaError("
|
|
284
|
+
throw new AiQuotaError("ai-quota/bad-enforcement",
|
|
285
285
|
"ai.quota.create: enforcement must be one of " + ENFORCEMENTS.join(" / ") +
|
|
286
286
|
" (got " + JSON.stringify(enforcement) + ")");
|
|
287
287
|
}
|
|
@@ -353,11 +353,11 @@ function create(opts) {
|
|
|
353
353
|
|
|
354
354
|
function consume(tenantId, model, amount, consumeOpts) {
|
|
355
355
|
validateOpts.requireNonEmptyString(tenantId,
|
|
356
|
-
"ai.quota.consume: tenantId", AiQuotaError, "
|
|
356
|
+
"ai.quota.consume: tenantId", AiQuotaError, "ai-quota/bad-tenant");
|
|
357
357
|
validateOpts.requireNonEmptyString(model,
|
|
358
|
-
"ai.quota.consume: model", AiQuotaError, "
|
|
358
|
+
"ai.quota.consume: model", AiQuotaError, "ai-quota/bad-model");
|
|
359
359
|
if (typeof amount !== "number" || !isFinite(amount) || amount < 0) {
|
|
360
|
-
throw new AiQuotaError("
|
|
360
|
+
throw new AiQuotaError("ai-quota/bad-amount",
|
|
361
361
|
"ai.quota.consume: amount must be a non-negative finite number");
|
|
362
362
|
}
|
|
363
363
|
consumeOpts = consumeOpts || {};
|
|
@@ -366,7 +366,7 @@ function create(opts) {
|
|
|
366
366
|
// enforcer; still validated against the allowlist.
|
|
367
367
|
var mode = (consumeOpts.enforcement == null) ? enforcement : consumeOpts.enforcement;
|
|
368
368
|
if (ENFORCEMENTS.indexOf(mode) === -1) {
|
|
369
|
-
throw new AiQuotaError("
|
|
369
|
+
throw new AiQuotaError("ai-quota/bad-enforcement",
|
|
370
370
|
"ai.quota.consume: enforcement override must be one of " + ENFORCEMENTS.join(" / "));
|
|
371
371
|
}
|
|
372
372
|
|
|
@@ -401,7 +401,7 @@ function create(opts) {
|
|
|
401
401
|
enforcement: mode, nodeId: _nodeId(),
|
|
402
402
|
});
|
|
403
403
|
_emitMetric("ai.quota.exceeded", 1);
|
|
404
|
-
throw new AiQuotaError("
|
|
404
|
+
throw new AiQuotaError("ai-quota/exceeded",
|
|
405
405
|
"ai.quota.consume: tenant '" + tenantId + "' model '" + model +
|
|
406
406
|
"' is at " + rv.used + " of " + limit + " " + dimension +
|
|
407
407
|
" this " + period + "; consuming " + amount + " would exceed the budget — call refused");
|
|
@@ -432,9 +432,9 @@ function create(opts) {
|
|
|
432
432
|
|
|
433
433
|
function check(tenantId, model) {
|
|
434
434
|
validateOpts.requireNonEmptyString(tenantId,
|
|
435
|
-
"ai.quota.check: tenantId", AiQuotaError, "
|
|
435
|
+
"ai.quota.check: tenantId", AiQuotaError, "ai-quota/bad-tenant");
|
|
436
436
|
validateOpts.requireNonEmptyString(model,
|
|
437
|
-
"ai.quota.check: model", AiQuotaError, "
|
|
437
|
+
"ai.quota.check: model", AiQuotaError, "ai-quota/bad-model");
|
|
438
438
|
var now = Date.now();
|
|
439
439
|
var windowStart = _windowStartFor(period, now);
|
|
440
440
|
var resetsAt = _resetsAtFor(period, windowStart);
|
|
@@ -454,10 +454,10 @@ function create(opts) {
|
|
|
454
454
|
return;
|
|
455
455
|
}
|
|
456
456
|
validateOpts.requireNonEmptyString(tenantId,
|
|
457
|
-
"ai.quota.reset: tenantId", AiQuotaError, "
|
|
457
|
+
"ai.quota.reset: tenantId", AiQuotaError, "ai-quota/bad-tenant");
|
|
458
458
|
if (model !== undefined) {
|
|
459
459
|
validateOpts.requireNonEmptyString(model,
|
|
460
|
-
"ai.quota.reset: model", AiQuotaError, "
|
|
460
|
+
"ai.quota.reset: model", AiQuotaError, "ai-quota/bad-model");
|
|
461
461
|
store.reset(_keyFor(tenantId, model, windowStart));
|
|
462
462
|
return;
|
|
463
463
|
}
|
|
@@ -470,7 +470,7 @@ function create(opts) {
|
|
|
470
470
|
for (var i = 0; i < keys.length; i++) store.reset(keys[i]);
|
|
471
471
|
return;
|
|
472
472
|
}
|
|
473
|
-
throw new AiQuotaError("
|
|
473
|
+
throw new AiQuotaError("ai-quota/reset-unsupported",
|
|
474
474
|
"ai.quota.reset: tenant-wide reset with an external store requires " +
|
|
475
475
|
"an explicit model argument (per-key) or a store-side prefix delete");
|
|
476
476
|
}
|
|
@@ -491,14 +491,14 @@ function create(opts) {
|
|
|
491
491
|
function _validateLimitMap(map, label) {
|
|
492
492
|
if (map == null) return {};
|
|
493
493
|
if (typeof map !== "object" || Array.isArray(map)) {
|
|
494
|
-
throw new AiQuotaError("
|
|
494
|
+
throw new AiQuotaError("ai-quota/bad-override",
|
|
495
495
|
"ai.quota.create: " + label + " must be a plain object { key: limit }");
|
|
496
496
|
}
|
|
497
497
|
var keys = Object.keys(map);
|
|
498
498
|
for (var i = 0; i < keys.length; i++) {
|
|
499
499
|
var v = map[keys[i]];
|
|
500
500
|
if (typeof v !== "number" || !isFinite(v) || v <= 0) {
|
|
501
|
-
throw new AiQuotaError("
|
|
501
|
+
throw new AiQuotaError("ai-quota/bad-override",
|
|
502
502
|
"ai.quota.create: " + label + "['" + keys[i] +
|
|
503
503
|
"'] must be a positive finite number");
|
|
504
504
|
}
|
|
@@ -512,7 +512,7 @@ function _validateStore(store) {
|
|
|
512
512
|
typeof store.add !== "function" ||
|
|
513
513
|
typeof store.get !== "function" ||
|
|
514
514
|
typeof store.reset !== "function") {
|
|
515
|
-
throw new AiQuotaError("
|
|
515
|
+
throw new AiQuotaError("ai-quota/bad-store",
|
|
516
516
|
"ai.quota.create: store must expose reserve / add / get / reset functions");
|
|
517
517
|
}
|
|
518
518
|
}
|
|
@@ -53,17 +53,17 @@ function _isPlainNonEmpty(s) {
|
|
|
53
53
|
|
|
54
54
|
function _validateFlagName(name) {
|
|
55
55
|
if (!_isPlainNonEmpty(name)) {
|
|
56
|
-
throw new ArgParserError("
|
|
56
|
+
throw new ArgParserError("arg-parser/flag-name-invalid",
|
|
57
57
|
"flag name must be a non-empty string");
|
|
58
58
|
}
|
|
59
59
|
if (FORBIDDEN_NAMES.indexOf(name) !== -1) {
|
|
60
|
-
throw new ArgParserError("
|
|
60
|
+
throw new ArgParserError("arg-parser/flag-name-forbidden",
|
|
61
61
|
"flag name '" + name + "' is reserved");
|
|
62
62
|
}
|
|
63
63
|
// ASCII-only kebab-/snake-case identifier. Keeps every flag name safe
|
|
64
64
|
// to embed in help text and prevents `--foo$bar=baz` style oddities.
|
|
65
65
|
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {
|
|
66
|
-
throw new ArgParserError("
|
|
66
|
+
throw new ArgParserError("arg-parser/flag-name-shape",
|
|
67
67
|
"flag name '" + name + "' must match [a-zA-Z][a-zA-Z0-9_-]*");
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -71,26 +71,26 @@ function _validateFlagName(name) {
|
|
|
71
71
|
function _validateAlias(alias, ownerName) {
|
|
72
72
|
if (alias === undefined || alias === null) return;
|
|
73
73
|
if (typeof alias !== "string" || alias.length !== 1 || !/^[a-zA-Z]$/.test(alias)) {
|
|
74
|
-
throw new ArgParserError("
|
|
74
|
+
throw new ArgParserError("arg-parser/alias-shape",
|
|
75
75
|
"flag '" + ownerName + "' alias must be a single letter [a-zA-Z]");
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
function _validateFlagSpec(spec, ownerLabel) {
|
|
80
80
|
if (!spec || typeof spec !== "object") {
|
|
81
|
-
throw new ArgParserError("
|
|
81
|
+
throw new ArgParserError("arg-parser/flag-spec-invalid",
|
|
82
82
|
ownerLabel + ": flag spec must be an object");
|
|
83
83
|
}
|
|
84
84
|
_validateFlagName(spec.name);
|
|
85
85
|
_validateAlias(spec.alias, spec.name);
|
|
86
86
|
var type = spec.type || "string";
|
|
87
87
|
if (SUPPORTED_TYPES.indexOf(type) === -1) {
|
|
88
|
-
throw new ArgParserError("
|
|
88
|
+
throw new ArgParserError("arg-parser/flag-type-unsupported",
|
|
89
89
|
ownerLabel + ": flag '" + spec.name +
|
|
90
90
|
"' type '" + type + "' must be one of " + SUPPORTED_TYPES.join(", "));
|
|
91
91
|
}
|
|
92
92
|
if (spec.description !== undefined && typeof spec.description !== "string") {
|
|
93
|
-
throw new ArgParserError("
|
|
93
|
+
throw new ArgParserError("arg-parser/flag-description-invalid",
|
|
94
94
|
ownerLabel + ": flag '" + spec.name + "' description must be a string");
|
|
95
95
|
}
|
|
96
96
|
}
|
|
@@ -101,7 +101,7 @@ function _coerceValue(spec, raw, label) {
|
|
|
101
101
|
if (type === "number") {
|
|
102
102
|
var n = Number(raw);
|
|
103
103
|
if (!isFinite(n)) {
|
|
104
|
-
throw new ArgParserError("
|
|
104
|
+
throw new ArgParserError("arg-parser/value-not-number",
|
|
105
105
|
label + " '" + spec.name + "' expected a number, got " + JSON.stringify(raw));
|
|
106
106
|
}
|
|
107
107
|
return n;
|
|
@@ -112,7 +112,7 @@ function _coerceValue(spec, raw, label) {
|
|
|
112
112
|
var s = String(raw).toLowerCase();
|
|
113
113
|
if (s === "true" || s === "1" || s === "yes") return true;
|
|
114
114
|
if (s === "false" || s === "0" || s === "no") return false;
|
|
115
|
-
throw new ArgParserError("
|
|
115
|
+
throw new ArgParserError("arg-parser/value-not-boolean",
|
|
116
116
|
label + " '" + spec.name + "' expected boolean, got " + JSON.stringify(raw));
|
|
117
117
|
}
|
|
118
118
|
if (type === "list") {
|
|
@@ -121,7 +121,7 @@ function _coerceValue(spec, raw, label) {
|
|
|
121
121
|
return s2.indexOf(",") === -1 ? [s2] : s2.split(",");
|
|
122
122
|
}
|
|
123
123
|
// Unreachable: validated at create-time.
|
|
124
|
-
throw new ArgParserError("
|
|
124
|
+
throw new ArgParserError("arg-parser/type-unreachable",
|
|
125
125
|
"unsupported flag type '" + type + "'");
|
|
126
126
|
}
|
|
127
127
|
|
|
@@ -132,13 +132,13 @@ function _buildFlagIndex(flagSpecs, ownerLabel) {
|
|
|
132
132
|
var spec = flagSpecs[i];
|
|
133
133
|
_validateFlagSpec(spec, ownerLabel);
|
|
134
134
|
if (byName[spec.name]) {
|
|
135
|
-
throw new ArgParserError("
|
|
135
|
+
throw new ArgParserError("arg-parser/flag-duplicate",
|
|
136
136
|
ownerLabel + ": flag '" + spec.name + "' declared twice");
|
|
137
137
|
}
|
|
138
138
|
byName[spec.name] = spec;
|
|
139
139
|
if (spec.alias) {
|
|
140
140
|
if (byAlias[spec.alias]) {
|
|
141
|
-
throw new ArgParserError("
|
|
141
|
+
throw new ArgParserError("arg-parser/alias-duplicate",
|
|
142
142
|
ownerLabel + ": alias '-" + spec.alias + "' declared twice");
|
|
143
143
|
}
|
|
144
144
|
byAlias[spec.alias] = spec;
|
|
@@ -232,12 +232,12 @@ function _renderCommandHelp(parser, command) {
|
|
|
232
232
|
// command-name (the first non-flag token, when commands are configured).
|
|
233
233
|
function _splitArgv(parser, argv) {
|
|
234
234
|
if (!Array.isArray(argv)) {
|
|
235
|
-
throw new ArgParserError("
|
|
235
|
+
throw new ArgParserError("arg-parser/argv-not-array",
|
|
236
236
|
"argv must be an array of strings");
|
|
237
237
|
}
|
|
238
238
|
for (var n = 0; n < argv.length; n++) {
|
|
239
239
|
if (typeof argv[n] !== "string") {
|
|
240
|
-
throw new ArgParserError("
|
|
240
|
+
throw new ArgParserError("arg-parser/argv-element-not-string",
|
|
241
241
|
"argv[" + n + "] must be a string");
|
|
242
242
|
}
|
|
243
243
|
}
|
|
@@ -256,7 +256,7 @@ function _splitArgv(parser, argv) {
|
|
|
256
256
|
if (!parser.commands.byName[name]) {
|
|
257
257
|
// Surface help / version as built-ins even when no command matches.
|
|
258
258
|
if (name === "help") return { command: "__help__", pre: argv.slice(0, i), rest: argv.slice(i + 1) };
|
|
259
|
-
throw new ArgParserError("
|
|
259
|
+
throw new ArgParserError("arg-parser/unknown-command",
|
|
260
260
|
"unknown command '" + name + "'");
|
|
261
261
|
}
|
|
262
262
|
return { command: name, pre: argv.slice(0, i), rest: argv.slice(i + 1) };
|
|
@@ -299,7 +299,7 @@ function _consumeFlags(index, tokens) {
|
|
|
299
299
|
if (tok.indexOf("--") === 0) {
|
|
300
300
|
var rest = tok.slice(2);
|
|
301
301
|
if (FORBIDDEN_NAMES.indexOf(rest.split("=")[0]) !== -1) {
|
|
302
|
-
throw new ArgParserError("
|
|
302
|
+
throw new ArgParserError("arg-parser/argv-forbidden-name",
|
|
303
303
|
"flag '--" + rest.split("=")[0] + "' is reserved");
|
|
304
304
|
}
|
|
305
305
|
var eq = rest.indexOf("=");
|
|
@@ -313,7 +313,7 @@ function _consumeFlags(index, tokens) {
|
|
|
313
313
|
}
|
|
314
314
|
spec = index.byName[nm];
|
|
315
315
|
if (!spec) {
|
|
316
|
-
throw new ArgParserError("
|
|
316
|
+
throw new ArgParserError("arg-parser/unknown-flag",
|
|
317
317
|
"unknown flag '--" + nm + "'");
|
|
318
318
|
}
|
|
319
319
|
} else if (tok.indexOf("-") === 0 && tok.length >= 2) {
|
|
@@ -329,12 +329,12 @@ function _consumeFlags(index, tokens) {
|
|
|
329
329
|
ach = alias;
|
|
330
330
|
}
|
|
331
331
|
if (ach.length !== 1) {
|
|
332
|
-
throw new ArgParserError("
|
|
332
|
+
throw new ArgParserError("arg-parser/short-flag-shape",
|
|
333
333
|
"short flag '" + tok + "' must be a single letter (use --long-form for multi-char names)");
|
|
334
334
|
}
|
|
335
335
|
spec = index.byAlias[ach];
|
|
336
336
|
if (!spec) {
|
|
337
|
-
throw new ArgParserError("
|
|
337
|
+
throw new ArgParserError("arg-parser/unknown-alias",
|
|
338
338
|
"unknown short flag '-" + ach + "'");
|
|
339
339
|
}
|
|
340
340
|
} else {
|
|
@@ -349,7 +349,7 @@ function _consumeFlags(index, tokens) {
|
|
|
349
349
|
} else {
|
|
350
350
|
if (!hasInlineValue) {
|
|
351
351
|
if (i + 1 >= tokens.length) {
|
|
352
|
-
throw new ArgParserError("
|
|
352
|
+
throw new ArgParserError("arg-parser/value-missing",
|
|
353
353
|
"flag '--" + spec.name + "' requires a value");
|
|
354
354
|
}
|
|
355
355
|
rawValue = tokens[++i];
|
|
@@ -377,7 +377,7 @@ function _applyDefaultsAndRequired(specs, flags, ownerLabel) {
|
|
|
377
377
|
for (var k = 0; k < specs.length; k++) {
|
|
378
378
|
var s = specs[k];
|
|
379
379
|
if (s.required && flags[s.name] === undefined) {
|
|
380
|
-
throw new ArgParserError("
|
|
380
|
+
throw new ArgParserError("arg-parser/missing-required",
|
|
381
381
|
ownerLabel + ": flag '--" + s.name + "' is required");
|
|
382
382
|
}
|
|
383
383
|
}
|
|
@@ -385,23 +385,23 @@ function _applyDefaultsAndRequired(specs, flags, ownerLabel) {
|
|
|
385
385
|
|
|
386
386
|
function _validateCommandSpec(cmd) {
|
|
387
387
|
if (!cmd || typeof cmd !== "object") {
|
|
388
|
-
throw new ArgParserError("
|
|
388
|
+
throw new ArgParserError("arg-parser/command-spec-invalid",
|
|
389
389
|
"command spec must be an object");
|
|
390
390
|
}
|
|
391
391
|
if (!_isPlainNonEmpty(cmd.name)) {
|
|
392
|
-
throw new ArgParserError("
|
|
392
|
+
throw new ArgParserError("arg-parser/command-name-invalid",
|
|
393
393
|
"command name must be a non-empty string");
|
|
394
394
|
}
|
|
395
395
|
if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(cmd.name)) {
|
|
396
|
-
throw new ArgParserError("
|
|
396
|
+
throw new ArgParserError("arg-parser/command-name-shape",
|
|
397
397
|
"command name '" + cmd.name + "' must match [a-zA-Z][a-zA-Z0-9_-]*");
|
|
398
398
|
}
|
|
399
399
|
if (cmd.handler !== undefined && typeof cmd.handler !== "function") {
|
|
400
|
-
throw new ArgParserError("
|
|
400
|
+
throw new ArgParserError("arg-parser/command-handler-not-function",
|
|
401
401
|
"command '" + cmd.name + "' handler must be a function");
|
|
402
402
|
}
|
|
403
403
|
if (cmd.description !== undefined && typeof cmd.description !== "string") {
|
|
404
|
-
throw new ArgParserError("
|
|
404
|
+
throw new ArgParserError("arg-parser/command-description-invalid",
|
|
405
405
|
"command '" + cmd.name + "' description must be a string");
|
|
406
406
|
}
|
|
407
407
|
}
|
|
@@ -465,29 +465,29 @@ function _validateCommandSpec(cmd) {
|
|
|
465
465
|
*/
|
|
466
466
|
function create(opts) {
|
|
467
467
|
if (!opts || typeof opts !== "object") {
|
|
468
|
-
throw new ArgParserError("
|
|
468
|
+
throw new ArgParserError("arg-parser/opts-required",
|
|
469
469
|
"argParser.create requires an opts object");
|
|
470
470
|
}
|
|
471
471
|
var programName = opts.programName;
|
|
472
472
|
if (programName !== undefined && typeof programName !== "string") {
|
|
473
|
-
throw new ArgParserError("
|
|
473
|
+
throw new ArgParserError("arg-parser/program-name-invalid",
|
|
474
474
|
"programName must be a string");
|
|
475
475
|
}
|
|
476
476
|
var description = opts.description;
|
|
477
477
|
if (description !== undefined && typeof description !== "string") {
|
|
478
|
-
throw new ArgParserError("
|
|
478
|
+
throw new ArgParserError("arg-parser/description-invalid",
|
|
479
479
|
"description must be a string");
|
|
480
480
|
}
|
|
481
481
|
var topFlagsSpec = opts.flags || [];
|
|
482
482
|
if (!Array.isArray(topFlagsSpec)) {
|
|
483
|
-
throw new ArgParserError("
|
|
483
|
+
throw new ArgParserError("arg-parser/flags-not-array",
|
|
484
484
|
"flags must be an array");
|
|
485
485
|
}
|
|
486
486
|
var topFlags = _buildFlagIndex(topFlagsSpec, "top-level");
|
|
487
487
|
|
|
488
488
|
var commandsSpec = opts.commands || [];
|
|
489
489
|
if (!Array.isArray(commandsSpec)) {
|
|
490
|
-
throw new ArgParserError("
|
|
490
|
+
throw new ArgParserError("arg-parser/commands-not-array",
|
|
491
491
|
"commands must be an array");
|
|
492
492
|
}
|
|
493
493
|
var commandsByName = Object.create(null);
|
|
@@ -496,12 +496,12 @@ function create(opts) {
|
|
|
496
496
|
var c = commandsSpec[i];
|
|
497
497
|
_validateCommandSpec(c);
|
|
498
498
|
if (commandsByName[c.name]) {
|
|
499
|
-
throw new ArgParserError("
|
|
499
|
+
throw new ArgParserError("arg-parser/command-duplicate",
|
|
500
500
|
"command '" + c.name + "' declared twice");
|
|
501
501
|
}
|
|
502
502
|
var cmdFlagsSpec = c.flags || [];
|
|
503
503
|
if (!Array.isArray(cmdFlagsSpec)) {
|
|
504
|
-
throw new ArgParserError("
|
|
504
|
+
throw new ArgParserError("arg-parser/command-flags-not-array",
|
|
505
505
|
"command '" + c.name + "' flags must be an array");
|
|
506
506
|
}
|
|
507
507
|
var cmdFlags = _buildFlagIndex(cmdFlagsSpec, "command '" + c.name + "'");
|
|
@@ -526,7 +526,7 @@ function create(opts) {
|
|
|
526
526
|
if (commandName) {
|
|
527
527
|
var cmd = commandsByName[commandName];
|
|
528
528
|
if (!cmd) {
|
|
529
|
-
throw new ArgParserError("
|
|
529
|
+
throw new ArgParserError("arg-parser/help-unknown-command",
|
|
530
530
|
"no command named '" + commandName + "'");
|
|
531
531
|
}
|
|
532
532
|
return _renderCommandHelp(parser, cmd);
|
|
@@ -645,7 +645,7 @@ function create(opts) {
|
|
|
645
645
|
*/
|
|
646
646
|
function parseRaw(argv) {
|
|
647
647
|
if (!Array.isArray(argv)) {
|
|
648
|
-
throw new ArgParserError("
|
|
648
|
+
throw new ArgParserError("arg-parser/argv-not-array",
|
|
649
649
|
"argv must be an array of strings");
|
|
650
650
|
}
|
|
651
651
|
var pos = [];
|
|
@@ -653,7 +653,7 @@ function parseRaw(argv) {
|
|
|
653
653
|
for (var i = 0; i < argv.length; i++) {
|
|
654
654
|
var tok = argv[i];
|
|
655
655
|
if (typeof tok !== "string") {
|
|
656
|
-
throw new ArgParserError("
|
|
656
|
+
throw new ArgParserError("arg-parser/argv-element-not-string",
|
|
657
657
|
"argv[" + i + "] must be a string");
|
|
658
658
|
}
|
|
659
659
|
if (tok === "--") {
|
|
@@ -673,14 +673,14 @@ function parseRaw(argv) {
|
|
|
673
673
|
val = true;
|
|
674
674
|
}
|
|
675
675
|
if (FORBIDDEN_NAMES.indexOf(name) !== -1) {
|
|
676
|
-
throw new ArgParserError("
|
|
676
|
+
throw new ArgParserError("arg-parser/argv-forbidden-name",
|
|
677
677
|
"flag '--" + name + "' is reserved");
|
|
678
678
|
}
|
|
679
679
|
flags[name] = val;
|
|
680
680
|
} else if (tok.indexOf("-") === 0 && tok.length === 2) {
|
|
681
681
|
var s = tok.slice(1);
|
|
682
682
|
if (FORBIDDEN_NAMES.indexOf(s) !== -1) {
|
|
683
|
-
throw new ArgParserError("
|
|
683
|
+
throw new ArgParserError("arg-parser/argv-forbidden-name",
|
|
684
684
|
"flag '-" + s + "' is reserved");
|
|
685
685
|
}
|
|
686
686
|
flags[s] = true;
|
|
@@ -178,13 +178,13 @@ var pendingNewKeyAlg = null;
|
|
|
178
178
|
async function init(opts) {
|
|
179
179
|
if (initialized) return;
|
|
180
180
|
if (!opts || !opts.dataDir) {
|
|
181
|
-
throw new AuditSignError("
|
|
181
|
+
throw new AuditSignError("audit-sign/bad-init",
|
|
182
182
|
"auditSign.init({ dataDir }) is required");
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
var mode = (opts.mode || "wrapped").toLowerCase();
|
|
186
186
|
if (mode !== "wrapped" && mode !== "plaintext") {
|
|
187
|
-
throw new AuditSignError("
|
|
187
|
+
throw new AuditSignError("audit-sign/bad-mode",
|
|
188
188
|
"auditSign.init: mode must be 'wrapped' or 'plaintext'");
|
|
189
189
|
}
|
|
190
190
|
// Algorithm-on-generate. Validated against the supported list so
|
|
@@ -192,7 +192,7 @@ async function init(opts) {
|
|
|
192
192
|
// deeper in nodeCrypto.
|
|
193
193
|
var alg = (opts.algorithm || DEFAULT_SIGNING_ALG).toLowerCase();
|
|
194
194
|
if (SUPPORTED_SIGNING_ALGS.indexOf(alg) === -1) {
|
|
195
|
-
throw new AuditSignError("
|
|
195
|
+
throw new AuditSignError("audit-sign/bad-algorithm",
|
|
196
196
|
"auditSign.init: algorithm must be one of " +
|
|
197
197
|
SUPPORTED_SIGNING_ALGS.join(", ") + " (got: " + alg + ")");
|
|
198
198
|
}
|
|
@@ -341,7 +341,7 @@ async function _initFirstRunWrapped() {
|
|
|
341
341
|
|
|
342
342
|
function _requireInit() {
|
|
343
343
|
if (!initialized) {
|
|
344
|
-
throw new AuditSignError("
|
|
344
|
+
throw new AuditSignError("audit-sign/not-initialized",
|
|
345
345
|
"auditSign.init() must be awaited before sign/verify");
|
|
346
346
|
}
|
|
347
347
|
}
|