@blamejs/core 0.8.42 → 0.8.49

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.
Files changed (222) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +10 -10
  3. package/index.js +52 -0
  4. package/lib/a2a.js +159 -34
  5. package/lib/acme.js +762 -0
  6. package/lib/ai-pref.js +166 -43
  7. package/lib/api-key.js +108 -47
  8. package/lib/api-snapshot.js +157 -40
  9. package/lib/app-shutdown.js +113 -77
  10. package/lib/archive.js +337 -40
  11. package/lib/arg-parser.js +697 -0
  12. package/lib/asyncapi.js +99 -55
  13. package/lib/atomic-file.js +465 -104
  14. package/lib/audit-chain.js +123 -34
  15. package/lib/audit-daily-review.js +389 -0
  16. package/lib/audit-sign.js +302 -56
  17. package/lib/audit-tools.js +412 -63
  18. package/lib/audit.js +656 -35
  19. package/lib/auth/jwt-external.js +17 -0
  20. package/lib/auth/oauth.js +7 -0
  21. package/lib/auth-bot-challenge.js +505 -0
  22. package/lib/auth-header.js +92 -25
  23. package/lib/backup/bundle.js +26 -0
  24. package/lib/backup/index.js +512 -89
  25. package/lib/backup/manifest.js +168 -7
  26. package/lib/break-glass.js +415 -39
  27. package/lib/budr.js +103 -30
  28. package/lib/bundler.js +86 -66
  29. package/lib/cache.js +192 -72
  30. package/lib/chain-writer.js +65 -40
  31. package/lib/circuit-breaker.js +56 -33
  32. package/lib/cli-helpers.js +106 -75
  33. package/lib/cli.js +6 -30
  34. package/lib/cloud-events.js +99 -32
  35. package/lib/cluster-storage.js +162 -37
  36. package/lib/cluster.js +340 -49
  37. package/lib/codepoint-class.js +66 -0
  38. package/lib/compliance.js +424 -24
  39. package/lib/config-drift.js +111 -46
  40. package/lib/config.js +94 -40
  41. package/lib/consent.js +165 -18
  42. package/lib/constants.js +1 -0
  43. package/lib/content-credentials.js +153 -48
  44. package/lib/cookies.js +154 -62
  45. package/lib/credential-hash.js +133 -61
  46. package/lib/crypto-field.js +702 -18
  47. package/lib/crypto-hpke.js +256 -0
  48. package/lib/crypto.js +744 -22
  49. package/lib/csv.js +178 -35
  50. package/lib/daemon.js +456 -0
  51. package/lib/dark-patterns.js +186 -55
  52. package/lib/db-query.js +79 -2
  53. package/lib/db.js +1431 -60
  54. package/lib/ddl-change-control.js +523 -0
  55. package/lib/deprecate.js +195 -40
  56. package/lib/dev.js +82 -39
  57. package/lib/dora.js +67 -48
  58. package/lib/dr-runbook.js +368 -0
  59. package/lib/dsr.js +142 -11
  60. package/lib/dual-control.js +91 -56
  61. package/lib/events.js +120 -41
  62. package/lib/external-db-migrate.js +192 -2
  63. package/lib/external-db.js +795 -50
  64. package/lib/fapi2.js +122 -1
  65. package/lib/fda-21cfr11.js +395 -0
  66. package/lib/fdx.js +132 -2
  67. package/lib/file-type.js +87 -0
  68. package/lib/file-upload.js +93 -0
  69. package/lib/flag.js +82 -20
  70. package/lib/forms.js +132 -29
  71. package/lib/framework-error.js +169 -0
  72. package/lib/framework-schema.js +163 -35
  73. package/lib/gate-contract.js +849 -175
  74. package/lib/graphql-federation.js +68 -7
  75. package/lib/guard-all.js +172 -55
  76. package/lib/guard-archive.js +286 -124
  77. package/lib/guard-auth.js +194 -21
  78. package/lib/guard-cidr.js +190 -28
  79. package/lib/guard-csv.js +397 -51
  80. package/lib/guard-domain.js +213 -91
  81. package/lib/guard-email.js +236 -29
  82. package/lib/guard-filename.js +307 -75
  83. package/lib/guard-graphql.js +263 -30
  84. package/lib/guard-html.js +310 -116
  85. package/lib/guard-image.js +243 -30
  86. package/lib/guard-json.js +260 -54
  87. package/lib/guard-jsonpath.js +235 -23
  88. package/lib/guard-jwt.js +284 -30
  89. package/lib/guard-markdown.js +204 -22
  90. package/lib/guard-mime.js +190 -26
  91. package/lib/guard-oauth.js +277 -28
  92. package/lib/guard-pdf.js +251 -27
  93. package/lib/guard-regex.js +226 -18
  94. package/lib/guard-shell.js +229 -26
  95. package/lib/guard-svg.js +177 -10
  96. package/lib/guard-template.js +232 -21
  97. package/lib/guard-time.js +195 -29
  98. package/lib/guard-uuid.js +189 -30
  99. package/lib/guard-xml.js +259 -36
  100. package/lib/guard-yaml.js +241 -44
  101. package/lib/honeytoken.js +63 -27
  102. package/lib/html-balance.js +83 -0
  103. package/lib/http-client.js +486 -59
  104. package/lib/http-message-signature.js +582 -0
  105. package/lib/i18n.js +102 -49
  106. package/lib/iab-mspa.js +112 -32
  107. package/lib/iab-tcf.js +107 -2
  108. package/lib/inbox.js +90 -52
  109. package/lib/keychain.js +865 -0
  110. package/lib/legal-hold.js +374 -0
  111. package/lib/local-db-thin.js +320 -0
  112. package/lib/log-stream.js +281 -51
  113. package/lib/log.js +184 -86
  114. package/lib/mail-bounce.js +107 -62
  115. package/lib/mail.js +295 -58
  116. package/lib/mcp.js +108 -27
  117. package/lib/metrics.js +98 -89
  118. package/lib/middleware/age-gate.js +36 -0
  119. package/lib/middleware/ai-act-disclosure.js +37 -0
  120. package/lib/middleware/api-encrypt.js +45 -0
  121. package/lib/middleware/assetlinks.js +40 -0
  122. package/lib/middleware/asyncapi-serve.js +35 -0
  123. package/lib/middleware/attach-user.js +40 -0
  124. package/lib/middleware/bearer-auth.js +40 -0
  125. package/lib/middleware/body-parser.js +230 -0
  126. package/lib/middleware/bot-disclose.js +34 -0
  127. package/lib/middleware/bot-guard.js +39 -0
  128. package/lib/middleware/compression.js +37 -0
  129. package/lib/middleware/cookies.js +32 -0
  130. package/lib/middleware/cors.js +40 -0
  131. package/lib/middleware/csp-nonce.js +40 -0
  132. package/lib/middleware/csp-report.js +34 -0
  133. package/lib/middleware/csrf-protect.js +43 -0
  134. package/lib/middleware/daily-byte-quota.js +53 -85
  135. package/lib/middleware/db-role-for.js +40 -0
  136. package/lib/middleware/dpop.js +40 -0
  137. package/lib/middleware/error-handler.js +37 -14
  138. package/lib/middleware/fetch-metadata.js +39 -0
  139. package/lib/middleware/flag-context.js +34 -0
  140. package/lib/middleware/gpc.js +33 -0
  141. package/lib/middleware/headers.js +35 -0
  142. package/lib/middleware/health.js +46 -0
  143. package/lib/middleware/host-allowlist.js +30 -0
  144. package/lib/middleware/network-allowlist.js +38 -0
  145. package/lib/middleware/openapi-serve.js +34 -0
  146. package/lib/middleware/rate-limit.js +160 -18
  147. package/lib/middleware/request-id.js +36 -18
  148. package/lib/middleware/request-log.js +37 -0
  149. package/lib/middleware/require-aal.js +29 -0
  150. package/lib/middleware/require-auth.js +32 -0
  151. package/lib/middleware/require-bound-key.js +41 -0
  152. package/lib/middleware/require-content-type.js +32 -0
  153. package/lib/middleware/require-methods.js +27 -0
  154. package/lib/middleware/require-mtls.js +33 -0
  155. package/lib/middleware/require-step-up.js +37 -0
  156. package/lib/middleware/security-headers.js +44 -0
  157. package/lib/middleware/security-txt.js +38 -0
  158. package/lib/middleware/span-http-server.js +37 -0
  159. package/lib/middleware/sse.js +36 -0
  160. package/lib/middleware/trace-log-correlation.js +33 -0
  161. package/lib/middleware/trace-propagate.js +32 -0
  162. package/lib/middleware/tus-upload.js +90 -0
  163. package/lib/middleware/web-app-manifest.js +53 -0
  164. package/lib/mtls-ca.js +100 -70
  165. package/lib/network-byte-quota.js +308 -0
  166. package/lib/network-heartbeat.js +135 -0
  167. package/lib/network-tls.js +534 -4
  168. package/lib/network.js +103 -0
  169. package/lib/notify.js +114 -43
  170. package/lib/ntp-check.js +192 -51
  171. package/lib/observability.js +145 -47
  172. package/lib/openapi.js +90 -44
  173. package/lib/outbox.js +99 -1
  174. package/lib/pagination.js +168 -86
  175. package/lib/parsers/index.js +16 -5
  176. package/lib/permissions.js +93 -40
  177. package/lib/pqc-agent.js +84 -8
  178. package/lib/pqc-software.js +94 -60
  179. package/lib/process-spawn.js +95 -21
  180. package/lib/pubsub.js +96 -66
  181. package/lib/queue.js +375 -54
  182. package/lib/redact.js +793 -21
  183. package/lib/render.js +139 -47
  184. package/lib/request-helpers.js +485 -121
  185. package/lib/restore-bundle.js +142 -39
  186. package/lib/restore-rollback.js +136 -45
  187. package/lib/retention.js +178 -50
  188. package/lib/retry.js +116 -33
  189. package/lib/router.js +475 -23
  190. package/lib/safe-async.js +543 -94
  191. package/lib/safe-buffer.js +337 -41
  192. package/lib/safe-json.js +467 -62
  193. package/lib/safe-jsonpath.js +285 -0
  194. package/lib/safe-schema.js +631 -87
  195. package/lib/safe-sql.js +221 -59
  196. package/lib/safe-url.js +278 -46
  197. package/lib/sandbox-worker.js +135 -0
  198. package/lib/sandbox.js +358 -0
  199. package/lib/scheduler.js +135 -70
  200. package/lib/self-update.js +647 -0
  201. package/lib/session-device-binding.js +431 -0
  202. package/lib/session.js +259 -49
  203. package/lib/slug.js +138 -26
  204. package/lib/ssrf-guard.js +316 -56
  205. package/lib/storage.js +433 -70
  206. package/lib/subject.js +405 -23
  207. package/lib/template.js +148 -8
  208. package/lib/tenant-quota.js +545 -0
  209. package/lib/testing.js +440 -53
  210. package/lib/time.js +291 -23
  211. package/lib/tls-exporter.js +239 -0
  212. package/lib/tracing.js +90 -74
  213. package/lib/uuid.js +97 -22
  214. package/lib/vault/index.js +284 -22
  215. package/lib/vault/seal-pem-file.js +66 -0
  216. package/lib/watcher.js +368 -0
  217. package/lib/webhook.js +196 -63
  218. package/lib/websocket.js +393 -68
  219. package/lib/wiki-concepts.js +338 -0
  220. package/lib/worker-pool.js +464 -0
  221. package/package.json +3 -3
  222. package/sbom.cyclonedx.json +7 -7
package/lib/asyncapi.js CHANGED
@@ -1,62 +1,36 @@
1
1
  "use strict";
2
2
  /**
3
- * b.asyncapi — AsyncAPI 3.0 schema-document builder.
3
+ * @module b.asyncapi
4
+ * @nav Other
5
+ * @title Asyncapi
4
6
  *
5
- * AsyncAPI is the event-driven sibling to OpenAPI. Operators describe
6
- * pubsub / websocket / kafka / mqtt surfaces as a single document the
7
- * framework can serve at /asyncapi.json (or /asyncapi.yaml) for
8
- * downstream tooling.
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
- * var aapi = b.asyncapi.create({
11
- * info: { title: "Acme Events API", version: "1.0.0" },
12
- * servers: {
13
- * production: { host: "broker.acme.example.com:9092",
14
- * protocol: "kafka",
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
- * aapi.channel("orders.created", {
20
- * address: "orders.created",
21
- * messages: {
22
- * OrderCreated: {
23
- * payload: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
24
- * contentType: "application/json",
25
- * },
26
- * },
27
- * bindings: { kafka: b.asyncapi.bindings.kafka({ topic: "orders.created", partitions: 4 }) },
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
- * aapi.operation("publishOrderCreated", {
31
- * action: "send",
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
- // Parse + validate an external AsyncAPI 3.0 document. Like openapi.parse:
427
- // returns `{ doc, errors[], valid }`. Throws on invalid JSON.
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") {