@blamejs/core 0.8.43 → 0.8.50
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 +93 -0
- package/README.md +10 -10
- package/index.js +52 -0
- package/lib/a2a.js +159 -34
- package/lib/acme.js +762 -0
- package/lib/ai-pref.js +166 -43
- package/lib/api-key.js +108 -47
- package/lib/api-snapshot.js +157 -40
- package/lib/app-shutdown.js +113 -77
- package/lib/archive.js +337 -40
- package/lib/arg-parser.js +697 -0
- package/lib/asyncapi.js +99 -55
- package/lib/atomic-file.js +465 -104
- package/lib/audit-chain.js +123 -34
- package/lib/audit-daily-review.js +389 -0
- package/lib/audit-sign.js +302 -56
- package/lib/audit-tools.js +412 -63
- package/lib/audit.js +656 -35
- package/lib/auth/jwt-external.js +17 -0
- package/lib/auth/oauth.js +7 -0
- package/lib/auth-bot-challenge.js +505 -0
- package/lib/auth-header.js +92 -25
- package/lib/backup/bundle.js +26 -0
- package/lib/backup/index.js +512 -89
- package/lib/backup/manifest.js +168 -7
- package/lib/break-glass.js +415 -39
- package/lib/budr.js +103 -30
- package/lib/bundler.js +86 -66
- package/lib/cache.js +192 -72
- package/lib/chain-writer.js +65 -40
- package/lib/circuit-breaker.js +56 -33
- package/lib/cli-helpers.js +106 -75
- package/lib/cli.js +6 -30
- package/lib/cloud-events.js +99 -32
- package/lib/cluster-storage.js +162 -37
- package/lib/cluster.js +340 -49
- package/lib/codepoint-class.js +66 -0
- package/lib/compliance.js +424 -24
- package/lib/config-drift.js +111 -46
- package/lib/config.js +94 -40
- package/lib/consent.js +165 -18
- package/lib/constants.js +1 -0
- package/lib/content-credentials.js +153 -48
- package/lib/cookies.js +154 -62
- package/lib/credential-hash.js +133 -61
- package/lib/crypto-field.js +702 -18
- package/lib/crypto-hpke.js +256 -0
- package/lib/crypto.js +744 -22
- package/lib/csv.js +178 -35
- package/lib/daemon.js +456 -0
- package/lib/dark-patterns.js +186 -55
- package/lib/db-query.js +79 -2
- package/lib/db.js +1431 -60
- package/lib/ddl-change-control.js +523 -0
- package/lib/deprecate.js +195 -40
- package/lib/dev.js +82 -39
- package/lib/dora.js +67 -48
- package/lib/dr-runbook.js +368 -0
- package/lib/dsr.js +142 -11
- package/lib/dual-control.js +91 -56
- package/lib/events.js +120 -41
- package/lib/external-db-migrate.js +192 -2
- package/lib/external-db.js +795 -50
- package/lib/fapi2.js +122 -1
- package/lib/fda-21cfr11.js +395 -0
- package/lib/fdx.js +132 -2
- package/lib/file-type.js +87 -0
- package/lib/file-upload.js +93 -0
- package/lib/flag.js +82 -20
- package/lib/forms.js +132 -29
- package/lib/framework-error.js +169 -0
- package/lib/framework-schema.js +163 -35
- package/lib/gate-contract.js +849 -175
- package/lib/graphql-federation.js +68 -7
- package/lib/guard-all.js +172 -55
- package/lib/guard-archive.js +286 -124
- package/lib/guard-auth.js +194 -21
- package/lib/guard-cidr.js +190 -28
- package/lib/guard-csv.js +397 -51
- package/lib/guard-domain.js +213 -91
- package/lib/guard-email.js +236 -29
- package/lib/guard-filename.js +307 -75
- package/lib/guard-graphql.js +263 -30
- package/lib/guard-html.js +310 -116
- package/lib/guard-image.js +243 -30
- package/lib/guard-json.js +260 -54
- package/lib/guard-jsonpath.js +235 -23
- package/lib/guard-jwt.js +284 -30
- package/lib/guard-markdown.js +204 -22
- package/lib/guard-mime.js +190 -26
- package/lib/guard-oauth.js +277 -28
- package/lib/guard-pdf.js +251 -27
- package/lib/guard-regex.js +226 -18
- package/lib/guard-shell.js +229 -26
- package/lib/guard-svg.js +177 -10
- package/lib/guard-template.js +232 -21
- package/lib/guard-time.js +195 -29
- package/lib/guard-uuid.js +189 -30
- package/lib/guard-xml.js +259 -36
- package/lib/guard-yaml.js +241 -44
- package/lib/honeytoken.js +63 -27
- package/lib/html-balance.js +83 -0
- package/lib/http-client.js +486 -59
- package/lib/http-message-signature.js +582 -0
- package/lib/i18n.js +102 -49
- package/lib/iab-mspa.js +112 -32
- package/lib/iab-tcf.js +107 -2
- package/lib/inbox.js +90 -52
- package/lib/keychain.js +865 -0
- package/lib/legal-hold.js +374 -0
- package/lib/local-db-thin.js +320 -0
- package/lib/log-stream.js +281 -51
- package/lib/log.js +184 -86
- package/lib/mail-bounce.js +107 -62
- package/lib/mail.js +295 -58
- package/lib/mcp.js +108 -27
- package/lib/metrics.js +98 -89
- package/lib/middleware/age-gate.js +36 -0
- package/lib/middleware/ai-act-disclosure.js +37 -0
- package/lib/middleware/api-encrypt.js +45 -0
- package/lib/middleware/assetlinks.js +40 -0
- package/lib/middleware/asyncapi-serve.js +35 -0
- package/lib/middleware/attach-user.js +40 -0
- package/lib/middleware/bearer-auth.js +40 -0
- package/lib/middleware/body-parser.js +230 -0
- package/lib/middleware/bot-disclose.js +34 -0
- package/lib/middleware/bot-guard.js +39 -0
- package/lib/middleware/compression.js +37 -0
- package/lib/middleware/cookies.js +32 -0
- package/lib/middleware/cors.js +40 -0
- package/lib/middleware/csp-nonce.js +40 -0
- package/lib/middleware/csp-report.js +34 -0
- package/lib/middleware/csrf-protect.js +43 -0
- package/lib/middleware/daily-byte-quota.js +53 -85
- package/lib/middleware/db-role-for.js +40 -0
- package/lib/middleware/dpop.js +40 -0
- package/lib/middleware/error-handler.js +37 -14
- package/lib/middleware/fetch-metadata.js +39 -0
- package/lib/middleware/flag-context.js +34 -0
- package/lib/middleware/gpc.js +33 -0
- package/lib/middleware/headers.js +35 -0
- package/lib/middleware/health.js +46 -0
- package/lib/middleware/host-allowlist.js +30 -0
- package/lib/middleware/network-allowlist.js +38 -0
- package/lib/middleware/openapi-serve.js +34 -0
- package/lib/middleware/rate-limit.js +160 -18
- package/lib/middleware/request-id.js +36 -18
- package/lib/middleware/request-log.js +37 -0
- package/lib/middleware/require-aal.js +29 -0
- package/lib/middleware/require-auth.js +32 -0
- package/lib/middleware/require-bound-key.js +41 -0
- package/lib/middleware/require-content-type.js +32 -0
- package/lib/middleware/require-methods.js +27 -0
- package/lib/middleware/require-mtls.js +33 -0
- package/lib/middleware/require-step-up.js +37 -0
- package/lib/middleware/security-headers.js +44 -0
- package/lib/middleware/security-txt.js +38 -0
- package/lib/middleware/span-http-server.js +37 -0
- package/lib/middleware/sse.js +36 -0
- package/lib/middleware/trace-log-correlation.js +33 -0
- package/lib/middleware/trace-propagate.js +32 -0
- package/lib/middleware/tus-upload.js +90 -0
- package/lib/middleware/web-app-manifest.js +53 -0
- package/lib/mtls-ca.js +100 -70
- package/lib/network-byte-quota.js +308 -0
- package/lib/network-heartbeat.js +135 -0
- package/lib/network-tls.js +534 -4
- package/lib/network.js +103 -0
- package/lib/notify.js +114 -43
- package/lib/ntp-check.js +192 -51
- package/lib/observability.js +145 -47
- package/lib/openapi.js +90 -44
- package/lib/outbox.js +99 -1
- package/lib/pagination.js +168 -86
- package/lib/parsers/index.js +16 -5
- package/lib/permissions.js +93 -40
- package/lib/pqc-agent.js +84 -8
- package/lib/pqc-software.js +94 -60
- package/lib/process-spawn.js +95 -21
- package/lib/pubsub.js +96 -66
- package/lib/queue.js +375 -54
- package/lib/redact.js +793 -21
- package/lib/render.js +139 -47
- package/lib/request-helpers.js +485 -121
- package/lib/restore-bundle.js +142 -39
- package/lib/restore-rollback.js +136 -45
- package/lib/retention.js +178 -50
- package/lib/retry.js +116 -33
- package/lib/router.js +475 -23
- package/lib/safe-async.js +543 -94
- package/lib/safe-buffer.js +337 -41
- package/lib/safe-json.js +467 -62
- package/lib/safe-jsonpath.js +285 -0
- package/lib/safe-schema.js +631 -87
- package/lib/safe-sql.js +221 -59
- package/lib/safe-url.js +278 -46
- package/lib/sandbox-worker.js +135 -0
- package/lib/sandbox.js +358 -0
- package/lib/scheduler.js +135 -70
- package/lib/self-update.js +647 -0
- package/lib/session-device-binding.js +431 -0
- package/lib/session.js +259 -49
- package/lib/slug.js +138 -26
- package/lib/ssrf-guard.js +316 -56
- package/lib/storage.js +433 -70
- package/lib/subject.js +405 -23
- package/lib/template.js +148 -8
- package/lib/tenant-quota.js +545 -0
- package/lib/testing.js +440 -53
- package/lib/time.js +291 -23
- package/lib/tls-exporter.js +239 -0
- package/lib/tracing.js +90 -74
- package/lib/uuid.js +97 -22
- package/lib/vault/index.js +284 -22
- package/lib/vault/seal-pem-file.js +66 -0
- package/lib/watcher.js +368 -0
- package/lib/webhook.js +196 -63
- package/lib/websocket.js +393 -68
- package/lib/wiki-concepts.js +338 -0
- package/lib/worker-pool.js +464 -0
- package/package.json +3 -3
- package/sbom.cyclonedx.json +7 -7
package/lib/asyncapi.js
CHANGED
|
@@ -1,62 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* b.asyncapi
|
|
3
|
+
* @module b.asyncapi
|
|
4
|
+
* @nav Other
|
|
5
|
+
* @title Asyncapi
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* @intro
|
|
8
|
+
* AsyncAPI 3.0 emitter for pubsub / WebSocket / SSE channels;
|
|
9
|
+
* complements `b.openapi`. Operators describe their pubsub /
|
|
10
|
+
* websocket / kafka / mqtt surfaces as a single document the
|
|
11
|
+
* framework serves at `/asyncapi.json` (or `.yaml`) for downstream
|
|
12
|
+
* tooling.
|
|
9
13
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* description: "Kafka broker" },
|
|
16
|
-
* },
|
|
17
|
-
* });
|
|
14
|
+
* The builder is FRAMEWORK-FACING: it produces a valid AsyncAPI 3.0
|
|
15
|
+
* document, but the operator's hand-written contract is the source
|
|
16
|
+
* of truth — it does NOT auto-walk `b.pubsub` topics or
|
|
17
|
+
* `b.websocketChannels` subscriptions (operators frequently want a
|
|
18
|
+
* smaller / different surface published than what is in-process).
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
20
|
+
* Builder fluent surface: `channel(id, opts)` registers a channel,
|
|
21
|
+
* `operation(id, opts)` registers a send/receive operation that
|
|
22
|
+
* `$ref`s an already-registered channel (operations referencing
|
|
23
|
+
* undeclared channels throw `asyncapi/dangling-channel`),
|
|
24
|
+
* `schema()` / `message()` / `parameter()` / `correlationId()` /
|
|
25
|
+
* `security.add()` / `security.require()` / `tag()` / `server()`
|
|
26
|
+
* register components. Terminal calls are `toJson()` /
|
|
27
|
+
* `toJsonString(indent)` / `toYaml()`. Typed binding builders for
|
|
28
|
+
* websockets / kafka / amqp / mqtt / http live on
|
|
29
|
+
* `b.asyncapi.bindings`; reusable trait builders on
|
|
30
|
+
* `b.asyncapi.traits`.
|
|
29
31
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* channel: "orders.created",
|
|
33
|
-
* summary: "Publish an order-created event",
|
|
34
|
-
* });
|
|
35
|
-
*
|
|
36
|
-
* var doc = aapi.toJson(); // AsyncAPI 3.0 JSON document
|
|
37
|
-
* var yaml = aapi.toYaml(); // YAML serialisation
|
|
38
|
-
*
|
|
39
|
-
* The builder is FRAMEWORK-FACING: it produces a valid AsyncAPI 3.0
|
|
40
|
-
* document, but the operator's hand-written contract is the source of
|
|
41
|
-
* truth — it does NOT auto-walk b.pubsub topics or b.websocketChannels
|
|
42
|
-
* subscriptions (operators frequently want a smaller / different
|
|
43
|
-
* surface published than what is in-process).
|
|
44
|
-
*
|
|
45
|
-
* Public surface (b.asyncapi.*):
|
|
46
|
-
*
|
|
47
|
-
* .create({ info, servers, defaultContentType, security, externalDocs })
|
|
48
|
-
* -> builder
|
|
49
|
-
*
|
|
50
|
-
* builder.channel(channelId, opts) // register channel
|
|
51
|
-
* builder.operation(operationId, opts) // register operation
|
|
52
|
-
* builder.schema(name, schemaSpec) // reusable schema
|
|
53
|
-
* builder.message(name, messageSpec) // reusable message
|
|
54
|
-
* builder.security.add(name, scheme)
|
|
55
|
-
* builder.tag({ name, description })
|
|
56
|
-
* builder.toJson() / toJsonString() / toYaml()
|
|
57
|
-
*
|
|
58
|
-
* b.asyncapi.bindings.{websockets, kafka, amqp, mqtt, http}
|
|
59
|
-
* -> typed binding builders.
|
|
32
|
+
* @card
|
|
33
|
+
* AsyncAPI 3.0 emitter for pubsub / WebSocket / SSE channels; complements `b.openapi`.
|
|
60
34
|
*/
|
|
61
35
|
|
|
62
36
|
var validateOpts = require("./validate-opts");
|
|
@@ -75,6 +49,50 @@ var ASYNCAPI_VERSION = "3.0.0";
|
|
|
75
49
|
|
|
76
50
|
var VALID_OPERATION_ACTIONS = ["send", "receive"];
|
|
77
51
|
|
|
52
|
+
/**
|
|
53
|
+
* @primitive b.asyncapi.create
|
|
54
|
+
* @signature b.asyncapi.create(opts)
|
|
55
|
+
* @since 0.6.30
|
|
56
|
+
* @related b.asyncapi.parse, b.openapi.create
|
|
57
|
+
*
|
|
58
|
+
* Build a fluent AsyncAPI 3.0 document builder. `opts.info` is
|
|
59
|
+
* required (`title` + `version`). `opts.servers` is a map keyed by
|
|
60
|
+
* server id, each entry carrying `host` + `protocol`. Returns a
|
|
61
|
+
* chainable builder; terminal calls are `toJson()`,
|
|
62
|
+
* `toJsonString(indent)`, and `toYaml()`. `toJson()` cross-checks
|
|
63
|
+
* every doc-level and per-operation security requirement against
|
|
64
|
+
* `components.securitySchemes` and throws
|
|
65
|
+
* `AsyncApiError("asyncapi/dangling-security")` on a missing scheme.
|
|
66
|
+
*
|
|
67
|
+
* @opts
|
|
68
|
+
* info: { title, version, description?, contact?, license? }, // REQUIRED — title + version are non-empty strings
|
|
69
|
+
* servers: { serverId: { host, protocol, description?, ... } }, // map keyed by id; each entry needs host + protocol
|
|
70
|
+
* defaultContentType: string, // defaults to "application/json"
|
|
71
|
+
* security: array, // doc-level security requirements [{ schemeName: ["scope"] }, ...]
|
|
72
|
+
* externalDocs: { url, description? },
|
|
73
|
+
* tags: array, // [{ name, description? }, ...] — seed; builder.tag() appends more
|
|
74
|
+
* id: string, // optional document identifier (e.g. "urn:com:acme:events")
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* var aapi = b.asyncapi.create({
|
|
78
|
+
* info: { title: "Acme Events", version: "1.0.0" },
|
|
79
|
+
* servers: { production: { host: "broker.acme.example.com:9092", protocol: "kafka" } },
|
|
80
|
+
* });
|
|
81
|
+
* aapi.channel("orders.created", {
|
|
82
|
+
* address: "orders.created",
|
|
83
|
+
* messages: { OrderCreated: { payload: { type: "object", properties: { id: { type: "string" } }, required: ["id"] }, contentType: "application/json" } },
|
|
84
|
+
* bindings: { kafka: b.asyncapi.bindings.kafka({ topic: "orders.created", partitions: 4 }) },
|
|
85
|
+
* });
|
|
86
|
+
* aapi.operation("publishOrderCreated", {
|
|
87
|
+
* action: "send",
|
|
88
|
+
* channel: "orders.created",
|
|
89
|
+
* summary: "Publish an order-created event",
|
|
90
|
+
* });
|
|
91
|
+
* var doc = aapi.toJson();
|
|
92
|
+
* doc.asyncapi; // → "3.0.0"
|
|
93
|
+
* doc.operations.publishOrderCreated.action; // → "send"
|
|
94
|
+
* doc.operations.publishOrderCreated.channel.$ref; // → "#/channels/orders.created"
|
|
95
|
+
*/
|
|
78
96
|
function create(opts) {
|
|
79
97
|
opts = opts || {};
|
|
80
98
|
validateOpts(opts, [
|
|
@@ -423,8 +441,34 @@ function _validateServerEntry(entry, label) {
|
|
|
423
441
|
label + ": protocol", AsyncApiError, "asyncapi/bad-server");
|
|
424
442
|
}
|
|
425
443
|
|
|
426
|
-
|
|
427
|
-
|
|
444
|
+
/**
|
|
445
|
+
* @primitive b.asyncapi.parse
|
|
446
|
+
* @signature b.asyncapi.parse(jsonStringOrObject)
|
|
447
|
+
* @since 0.6.30
|
|
448
|
+
* @related b.asyncapi.create, b.openapi.parse
|
|
449
|
+
*
|
|
450
|
+
* Parse + validate an external AsyncAPI 3.0 document. Throws on
|
|
451
|
+
* invalid JSON or non-object input; otherwise returns
|
|
452
|
+
* `{ doc, errors, valid }`. `errors` is an array of strings — empty
|
|
453
|
+
* on a valid document. Operations must declare `action: "send" |
|
|
454
|
+
* "receive"` and a `channel.$ref` resolving to a declared channel;
|
|
455
|
+
* server entries need both `host` and `protocol`; doc-level security
|
|
456
|
+
* must reference declared schemes.
|
|
457
|
+
*
|
|
458
|
+
* @example
|
|
459
|
+
* var result = b.asyncapi.parse('{"asyncapi":"3.0.0","info":{"title":"x","version":"1.0.0"}}');
|
|
460
|
+
* result.valid; // → true
|
|
461
|
+
* result.errors; // → []
|
|
462
|
+
*
|
|
463
|
+
* var bad = b.asyncapi.parse({
|
|
464
|
+
* asyncapi: "3.0.0",
|
|
465
|
+
* info: { title: "x", version: "1.0.0" },
|
|
466
|
+
* channels: {},
|
|
467
|
+
* operations: { pub: { action: "send", channel: { $ref: "#/channels/missing" } } },
|
|
468
|
+
* });
|
|
469
|
+
* bad.valid; // → false
|
|
470
|
+
* bad.errors[0]; // → 'operations.pub.channel: $ref "#/channels/missing" does not resolve to a declared channel'
|
|
471
|
+
*/
|
|
428
472
|
function parse(jsonStringOrObject) {
|
|
429
473
|
var doc;
|
|
430
474
|
if (typeof jsonStringOrObject === "string") {
|