@blamejs/blamejs-shop 0.4.31 → 0.4.33

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 (343) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +1 -1
  3. package/lib/asset-manifest.json +1 -1
  4. package/lib/vendor/MANIFEST.json +400 -282
  5. package/lib/vendor/blamejs/.github/workflows/ci.yml +34 -3
  6. package/lib/vendor/blamejs/.github/workflows/npm-publish.yml +21 -4
  7. package/lib/vendor/blamejs/.gitignore +6 -0
  8. package/lib/vendor/blamejs/CHANGELOG.md +28 -0
  9. package/lib/vendor/blamejs/MIGRATING.md +55 -0
  10. package/lib/vendor/blamejs/README.md +8 -6
  11. package/lib/vendor/blamejs/SECURITY.md +19 -3
  12. package/lib/vendor/blamejs/api-snapshot.json +2190 -664
  13. package/lib/vendor/blamejs/docker/caddy/localstack.Caddyfile +19 -0
  14. package/lib/vendor/blamejs/docker/init/generate-certs.sh +1 -1
  15. package/lib/vendor/blamejs/docker/otel/config.yaml +42 -0
  16. package/lib/vendor/blamejs/docker/otel/export/.gitkeep +0 -0
  17. package/lib/vendor/blamejs/docker/postgres/initdb/10-replication.sh +15 -0
  18. package/lib/vendor/blamejs/docker/postgres/replica-entrypoint.sh +38 -0
  19. package/lib/vendor/blamejs/docker/toxiproxy/toxiproxy.json +14 -0
  20. package/lib/vendor/blamejs/docker-compose.test.yml +209 -0
  21. package/lib/vendor/blamejs/examples/wiki/lib/page-generator.js +132 -0
  22. package/lib/vendor/blamejs/examples/wiki/lib/source-comment-block-validator.js +221 -61
  23. package/lib/vendor/blamejs/examples/wiki/lib/source-doc-parser.js +144 -9
  24. package/lib/vendor/blamejs/examples/wiki/test/e2e.js +99 -0
  25. package/lib/vendor/blamejs/fuzz/guard-sql.fuzz.js +36 -0
  26. package/lib/vendor/blamejs/index.js +4 -0
  27. package/lib/vendor/blamejs/lib/agent-envelope-mac.js +104 -0
  28. package/lib/vendor/blamejs/lib/agent-event-bus.js +105 -4
  29. package/lib/vendor/blamejs/lib/agent-posture-chain.js +8 -42
  30. package/lib/vendor/blamejs/lib/ai-content-detect.js +9 -10
  31. package/lib/vendor/blamejs/lib/api-key.js +158 -77
  32. package/lib/vendor/blamejs/lib/atomic-file.js +62 -4
  33. package/lib/vendor/blamejs/lib/audit-chain.js +47 -11
  34. package/lib/vendor/blamejs/lib/audit-sign.js +77 -2
  35. package/lib/vendor/blamejs/lib/audit-tools.js +79 -51
  36. package/lib/vendor/blamejs/lib/audit.js +259 -123
  37. package/lib/vendor/blamejs/lib/auth/elevation-grant.js +6 -2
  38. package/lib/vendor/blamejs/lib/auth/oauth.js +66 -9
  39. package/lib/vendor/blamejs/lib/auth/openid-federation.js +108 -47
  40. package/lib/vendor/blamejs/lib/auth/saml.js +6 -8
  41. package/lib/vendor/blamejs/lib/auth/sd-jwt-vc.js +36 -7
  42. package/lib/vendor/blamejs/lib/backup/index.js +45 -10
  43. package/lib/vendor/blamejs/lib/break-glass.js +355 -147
  44. package/lib/vendor/blamejs/lib/cache.js +174 -105
  45. package/lib/vendor/blamejs/lib/chain-writer.js +38 -16
  46. package/lib/vendor/blamejs/lib/cli.js +19 -14
  47. package/lib/vendor/blamejs/lib/cluster-provider-db.js +130 -104
  48. package/lib/vendor/blamejs/lib/cluster-storage.js +119 -22
  49. package/lib/vendor/blamejs/lib/cluster.js +119 -71
  50. package/lib/vendor/blamejs/lib/codepoint-class.js +23 -0
  51. package/lib/vendor/blamejs/lib/compliance.js +210 -4
  52. package/lib/vendor/blamejs/lib/consent.js +82 -29
  53. package/lib/vendor/blamejs/lib/constants.js +27 -11
  54. package/lib/vendor/blamejs/lib/credential-hash.js +9 -0
  55. package/lib/vendor/blamejs/lib/crypto-field.js +916 -156
  56. package/lib/vendor/blamejs/lib/db-declare-row-policy.js +35 -22
  57. package/lib/vendor/blamejs/lib/db-file-lifecycle.js +3 -2
  58. package/lib/vendor/blamejs/lib/db-query.js +882 -260
  59. package/lib/vendor/blamejs/lib/db-schema.js +228 -44
  60. package/lib/vendor/blamejs/lib/db.js +249 -99
  61. package/lib/vendor/blamejs/lib/dsr.js +385 -55
  62. package/lib/vendor/blamejs/lib/error-page.js +14 -1
  63. package/lib/vendor/blamejs/lib/external-db-migrate.js +239 -137
  64. package/lib/vendor/blamejs/lib/external-db.js +549 -34
  65. package/lib/vendor/blamejs/lib/file-upload.js +52 -7
  66. package/lib/vendor/blamejs/lib/framework-error.js +20 -1
  67. package/lib/vendor/blamejs/lib/framework-files.js +73 -0
  68. package/lib/vendor/blamejs/lib/framework-schema.js +695 -394
  69. package/lib/vendor/blamejs/lib/gate-contract.js +659 -1
  70. package/lib/vendor/blamejs/lib/guard-agent-registry.js +26 -44
  71. package/lib/vendor/blamejs/lib/guard-all.js +1 -0
  72. package/lib/vendor/blamejs/lib/guard-auth.js +42 -112
  73. package/lib/vendor/blamejs/lib/guard-cidr.js +33 -154
  74. package/lib/vendor/blamejs/lib/guard-csv.js +46 -113
  75. package/lib/vendor/blamejs/lib/guard-domain.js +34 -157
  76. package/lib/vendor/blamejs/lib/guard-dsn.js +27 -43
  77. package/lib/vendor/blamejs/lib/guard-email.js +47 -69
  78. package/lib/vendor/blamejs/lib/guard-envelope.js +19 -32
  79. package/lib/vendor/blamejs/lib/guard-event-bus-payload.js +24 -42
  80. package/lib/vendor/blamejs/lib/guard-event-bus-topic.js +25 -43
  81. package/lib/vendor/blamejs/lib/guard-filename.js +42 -106
  82. package/lib/vendor/blamejs/lib/guard-graphql.js +42 -123
  83. package/lib/vendor/blamejs/lib/guard-html.js +53 -108
  84. package/lib/vendor/blamejs/lib/guard-idempotency-key.js +24 -42
  85. package/lib/vendor/blamejs/lib/guard-image.js +46 -103
  86. package/lib/vendor/blamejs/lib/guard-imap-command.js +18 -32
  87. package/lib/vendor/blamejs/lib/guard-jmap.js +16 -30
  88. package/lib/vendor/blamejs/lib/guard-json.js +38 -108
  89. package/lib/vendor/blamejs/lib/guard-jsonpath.js +38 -171
  90. package/lib/vendor/blamejs/lib/guard-jwt.js +49 -179
  91. package/lib/vendor/blamejs/lib/guard-list-id.js +25 -41
  92. package/lib/vendor/blamejs/lib/guard-list-unsubscribe.js +27 -43
  93. package/lib/vendor/blamejs/lib/guard-mail-compose.js +24 -42
  94. package/lib/vendor/blamejs/lib/guard-mail-move.js +26 -44
  95. package/lib/vendor/blamejs/lib/guard-mail-query.js +28 -46
  96. package/lib/vendor/blamejs/lib/guard-mail-reply.js +24 -42
  97. package/lib/vendor/blamejs/lib/guard-mail-sieve.js +24 -42
  98. package/lib/vendor/blamejs/lib/guard-managesieve-command.js +17 -31
  99. package/lib/vendor/blamejs/lib/guard-markdown.js +37 -104
  100. package/lib/vendor/blamejs/lib/guard-message-id.js +26 -45
  101. package/lib/vendor/blamejs/lib/guard-mime.js +39 -151
  102. package/lib/vendor/blamejs/lib/guard-oauth.js +54 -135
  103. package/lib/vendor/blamejs/lib/guard-pdf.js +45 -101
  104. package/lib/vendor/blamejs/lib/guard-pop3-command.js +21 -31
  105. package/lib/vendor/blamejs/lib/guard-posture-chain.js +24 -42
  106. package/lib/vendor/blamejs/lib/guard-regex.js +33 -107
  107. package/lib/vendor/blamejs/lib/guard-saga-config.js +24 -42
  108. package/lib/vendor/blamejs/lib/guard-shell.js +42 -172
  109. package/lib/vendor/blamejs/lib/guard-smtp-command.js +48 -54
  110. package/lib/vendor/blamejs/lib/guard-snapshot-envelope.js +24 -42
  111. package/lib/vendor/blamejs/lib/guard-sql.js +1491 -0
  112. package/lib/vendor/blamejs/lib/guard-stream-args.js +24 -43
  113. package/lib/vendor/blamejs/lib/guard-svg.js +47 -65
  114. package/lib/vendor/blamejs/lib/guard-template.js +35 -172
  115. package/lib/vendor/blamejs/lib/guard-tenant-id.js +26 -45
  116. package/lib/vendor/blamejs/lib/guard-time.js +32 -154
  117. package/lib/vendor/blamejs/lib/guard-trace-context.js +25 -44
  118. package/lib/vendor/blamejs/lib/guard-uuid.js +32 -153
  119. package/lib/vendor/blamejs/lib/guard-xml.js +38 -113
  120. package/lib/vendor/blamejs/lib/guard-yaml.js +51 -163
  121. package/lib/vendor/blamejs/lib/http-client.js +37 -9
  122. package/lib/vendor/blamejs/lib/inbox.js +120 -107
  123. package/lib/vendor/blamejs/lib/legal-hold.js +121 -50
  124. package/lib/vendor/blamejs/lib/log-stream-cloudwatch.js +47 -31
  125. package/lib/vendor/blamejs/lib/log-stream-otlp.js +32 -18
  126. package/lib/vendor/blamejs/lib/mail-auth.js +236 -0
  127. package/lib/vendor/blamejs/lib/mail-crypto-smime.js +2 -6
  128. package/lib/vendor/blamejs/lib/mail-dkim.js +1 -0
  129. package/lib/vendor/blamejs/lib/mail-greylist.js +2 -6
  130. package/lib/vendor/blamejs/lib/mail-helo.js +2 -6
  131. package/lib/vendor/blamejs/lib/mail-journal.js +85 -64
  132. package/lib/vendor/blamejs/lib/mail-rbl.js +2 -6
  133. package/lib/vendor/blamejs/lib/mail-scan.js +2 -6
  134. package/lib/vendor/blamejs/lib/mail-server-jmap.js +117 -12
  135. package/lib/vendor/blamejs/lib/mail-server-mx.js +276 -7
  136. package/lib/vendor/blamejs/lib/mail-spam-score.js +2 -6
  137. package/lib/vendor/blamejs/lib/mail-store.js +293 -154
  138. package/lib/vendor/blamejs/lib/mail.js +8 -4
  139. package/lib/vendor/blamejs/lib/middleware/body-parser.js +71 -25
  140. package/lib/vendor/blamejs/lib/middleware/csrf-protect.js +19 -8
  141. package/lib/vendor/blamejs/lib/middleware/dpop.js +10 -1
  142. package/lib/vendor/blamejs/lib/middleware/fetch-metadata.js +17 -7
  143. package/lib/vendor/blamejs/lib/middleware/idempotency-key.js +75 -51
  144. package/lib/vendor/blamejs/lib/middleware/rate-limit.js +102 -32
  145. package/lib/vendor/blamejs/lib/middleware/security-headers.js +21 -5
  146. package/lib/vendor/blamejs/lib/migrations.js +108 -66
  147. package/lib/vendor/blamejs/lib/network-heartbeat.js +7 -0
  148. package/lib/vendor/blamejs/lib/network-proxy.js +24 -1
  149. package/lib/vendor/blamejs/lib/nonce-store.js +31 -9
  150. package/lib/vendor/blamejs/lib/object-store/azure-blob-bucket-ops.js +9 -4
  151. package/lib/vendor/blamejs/lib/object-store/azure-blob.js +57 -3
  152. package/lib/vendor/blamejs/lib/object-store/gcs.js +4 -1
  153. package/lib/vendor/blamejs/lib/object-store/sigv4-bucket-ops.js +5 -2
  154. package/lib/vendor/blamejs/lib/object-store/sigv4.js +38 -6
  155. package/lib/vendor/blamejs/lib/observability-otlp-exporter.js +9 -1
  156. package/lib/vendor/blamejs/lib/observability.js +124 -0
  157. package/lib/vendor/blamejs/lib/otel-export.js +12 -3
  158. package/lib/vendor/blamejs/lib/outbox.js +184 -83
  159. package/lib/vendor/blamejs/lib/parsers/safe-xml.js +47 -7
  160. package/lib/vendor/blamejs/lib/pqc-agent.js +44 -0
  161. package/lib/vendor/blamejs/lib/pubsub-cluster.js +42 -20
  162. package/lib/vendor/blamejs/lib/queue-local.js +225 -140
  163. package/lib/vendor/blamejs/lib/queue-redis.js +9 -1
  164. package/lib/vendor/blamejs/lib/queue-sqs.js +6 -0
  165. package/lib/vendor/blamejs/lib/queue.js +7 -0
  166. package/lib/vendor/blamejs/lib/redact.js +68 -11
  167. package/lib/vendor/blamejs/lib/redis-client.js +160 -31
  168. package/lib/vendor/blamejs/lib/request-helpers.js +7 -0
  169. package/lib/vendor/blamejs/lib/retention.js +117 -42
  170. package/lib/vendor/blamejs/lib/router.js +212 -5
  171. package/lib/vendor/blamejs/lib/safe-dns.js +29 -45
  172. package/lib/vendor/blamejs/lib/safe-ical.js +18 -33
  173. package/lib/vendor/blamejs/lib/safe-icap.js +27 -43
  174. package/lib/vendor/blamejs/lib/safe-sieve.js +21 -40
  175. package/lib/vendor/blamejs/lib/safe-sql.js +212 -3
  176. package/lib/vendor/blamejs/lib/safe-url.js +170 -3
  177. package/lib/vendor/blamejs/lib/safe-vcard.js +18 -33
  178. package/lib/vendor/blamejs/lib/scheduler.js +47 -12
  179. package/lib/vendor/blamejs/lib/seeders.js +122 -74
  180. package/lib/vendor/blamejs/lib/session-stores.js +42 -14
  181. package/lib/vendor/blamejs/lib/session.js +175 -77
  182. package/lib/vendor/blamejs/lib/sql.js +3842 -0
  183. package/lib/vendor/blamejs/lib/sse.js +26 -0
  184. package/lib/vendor/blamejs/lib/ssrf-guard.js +169 -4
  185. package/lib/vendor/blamejs/lib/static.js +177 -34
  186. package/lib/vendor/blamejs/lib/subject.js +96 -49
  187. package/lib/vendor/blamejs/lib/vault/index.js +3 -2
  188. package/lib/vendor/blamejs/lib/vault/passphrase-ops.js +3 -2
  189. package/lib/vendor/blamejs/lib/vault/rotate.js +168 -108
  190. package/lib/vendor/blamejs/lib/vault-aad.js +6 -0
  191. package/lib/vendor/blamejs/lib/vendor-data.js +2 -0
  192. package/lib/vendor/blamejs/lib/websocket.js +35 -5
  193. package/lib/vendor/blamejs/lib/worker-pool.js +11 -0
  194. package/lib/vendor/blamejs/package.json +2 -2
  195. package/lib/vendor/blamejs/release-notes/v0.14.x.json +1503 -0
  196. package/lib/vendor/blamejs/release-notes/v0.15.0.json +77 -0
  197. package/lib/vendor/blamejs/release-notes/v0.15.1.json +22 -0
  198. package/lib/vendor/blamejs/release-notes/v0.15.2.json +22 -0
  199. package/lib/vendor/blamejs/release-notes/v0.15.3.json +39 -0
  200. package/lib/vendor/blamejs/release-notes/v0.15.4.json +39 -0
  201. package/lib/vendor/blamejs/release-notes/v0.15.5.json +22 -0
  202. package/lib/vendor/blamejs/release-notes/v0.15.6.json +59 -0
  203. package/lib/vendor/blamejs/release-notes/v0.15.7.json +43 -0
  204. package/lib/vendor/blamejs/scripts/check-services.js +21 -0
  205. package/lib/vendor/blamejs/scripts/gen-migrating.js +67 -0
  206. package/lib/vendor/blamejs/scripts/release.js +398 -38
  207. package/lib/vendor/blamejs/test/00-primitives.js +168 -0
  208. package/lib/vendor/blamejs/test/10-state.js +140 -14
  209. package/lib/vendor/blamejs/test/20-db.js +65 -2
  210. package/lib/vendor/blamejs/test/helpers/db.js +9 -0
  211. package/lib/vendor/blamejs/test/helpers/drivers.js +27 -15
  212. package/lib/vendor/blamejs/test/helpers/services.js +21 -0
  213. package/lib/vendor/blamejs/test/integration/audit-actor-binding-pg.test.js +246 -0
  214. package/lib/vendor/blamejs/test/integration/audit-chain-external-db.test.js +517 -0
  215. package/lib/vendor/blamejs/test/integration/audit-stack-mysql.test.js +639 -0
  216. package/lib/vendor/blamejs/test/integration/audit-stack-postgres.test.js +832 -0
  217. package/lib/vendor/blamejs/test/integration/backup-restore-objectstore.test.js +453 -0
  218. package/lib/vendor/blamejs/test/integration/data-layer-cluster-mysql.test.js +649 -0
  219. package/lib/vendor/blamejs/test/integration/data-layer-cluster-pg.test.js +770 -0
  220. package/lib/vendor/blamejs/test/integration/data-layer-mysql-privacy.test.js +630 -0
  221. package/lib/vendor/blamejs/test/integration/data-layer-mysql.test.js +610 -0
  222. package/lib/vendor/blamejs/test/integration/data-layer-pg.test.js +577 -0
  223. package/lib/vendor/blamejs/test/integration/data-layer-postgres.test.js +771 -0
  224. package/lib/vendor/blamejs/test/integration/db-layer-mysql.test.js +549 -0
  225. package/lib/vendor/blamejs/test/integration/db-layer-postgres.test.js +598 -0
  226. package/lib/vendor/blamejs/test/integration/distributed-scheduler-fencing-pg.test.js +602 -0
  227. package/lib/vendor/blamejs/test/integration/external-db-postgres.test.js +576 -0
  228. package/lib/vendor/blamejs/test/integration/framework-schema-mysql.test.js +353 -0
  229. package/lib/vendor/blamejs/test/integration/log-stream-cloudwatch.test.js +224 -0
  230. package/lib/vendor/blamejs/test/integration/mail-crypto-smime.test.js +142 -17
  231. package/lib/vendor/blamejs/test/integration/network-heartbeat.test.js +25 -10
  232. package/lib/vendor/blamejs/test/integration/object-store-azure.test.js +101 -0
  233. package/lib/vendor/blamejs/test/integration/object-store-gcs.test.js +239 -0
  234. package/lib/vendor/blamejs/test/integration/object-store-sigv4.test.js +35 -16
  235. package/lib/vendor/blamejs/test/integration/object-store-worm-lock.test.js +291 -0
  236. package/lib/vendor/blamejs/test/integration/pubsub.test.js +14 -0
  237. package/lib/vendor/blamejs/test/integration/queue-sqs.test.js +322 -0
  238. package/lib/vendor/blamejs/test/integration/redis-reconnect-toxiproxy.test.js +300 -0
  239. package/lib/vendor/blamejs/test/integration/sql-fts5-catalog-sqlite.test.js +154 -0
  240. package/lib/vendor/blamejs/test/integration/tls-classical-downgrade-audit.test.js +71 -0
  241. package/lib/vendor/blamejs/test/layer-0-primitives/agent-event-bus.test.js +175 -12
  242. package/lib/vendor/blamejs/test/layer-0-primitives/atomic-file-exclusive-temp.test.js +216 -0
  243. package/lib/vendor/blamejs/test/layer-0-primitives/audit-checkpoint-false-rollback.test.js +203 -0
  244. package/lib/vendor/blamejs/test/layer-0-primitives/audit-query-self-log.test.js +126 -0
  245. package/lib/vendor/blamejs/test/layer-0-primitives/audit-safeemit-redacts-secrets.test.js +196 -0
  246. package/lib/vendor/blamejs/test/layer-0-primitives/audit-signing-key-rotation.test.js +197 -0
  247. package/lib/vendor/blamejs/test/layer-0-primitives/audit-verifybundle-tamper.test.js +209 -0
  248. package/lib/vendor/blamejs/test/layer-0-primitives/azure-blob-key-encoding.test.js +121 -0
  249. package/lib/vendor/blamejs/test/layer-0-primitives/backup-residency-posture.test.js +168 -0
  250. package/lib/vendor/blamejs/test/layer-0-primitives/backup-scheduletest-drill.test.js +318 -0
  251. package/lib/vendor/blamejs/test/layer-0-primitives/break-glass.test.js +233 -7
  252. package/lib/vendor/blamejs/test/layer-0-primitives/codebase-patterns.test.js +1196 -14
  253. package/lib/vendor/blamejs/test/layer-0-primitives/compliance.test.js +229 -0
  254. package/lib/vendor/blamejs/test/layer-0-primitives/credential-hash.test.js +18 -0
  255. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-derived-hash.test.js +24 -7
  256. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-dual-read-migrate.test.js +165 -0
  257. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-per-row-key.test.js +350 -0
  258. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-unseal-rate-cap.test.js +27 -9
  259. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-field-upgrade-dialect.test.js +76 -0
  260. package/lib/vendor/blamejs/test/layer-0-primitives/crypto-interop-oracles.test.js +392 -0
  261. package/lib/vendor/blamejs/test/layer-0-primitives/csrf-protect.test.js +159 -0
  262. package/lib/vendor/blamejs/test/layer-0-primitives/db-column-gate.test.js +180 -1
  263. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-cross-schema.test.js +5 -2
  264. package/lib/vendor/blamejs/test/layer-0-primitives/db-query-sealed-field-in.test.js +101 -0
  265. package/lib/vendor/blamejs/test/layer-0-primitives/db-raw-residency-gate.test.js +128 -0
  266. package/lib/vendor/blamejs/test/layer-0-primitives/db-schema-drift.test.js +38 -5
  267. package/lib/vendor/blamejs/test/layer-0-primitives/db-schema-reconcile-emittable.test.js +127 -0
  268. package/lib/vendor/blamejs/test/layer-0-primitives/db-stream-and-payload-shape.test.js +267 -0
  269. package/lib/vendor/blamejs/test/layer-0-primitives/db-worm.test.js +150 -0
  270. package/lib/vendor/blamejs/test/layer-0-primitives/defineguard-default-gate-posture-caps.test.js +30 -0
  271. package/lib/vendor/blamejs/test/layer-0-primitives/dpop-middleware-replaystore-required.test.js +46 -0
  272. package/lib/vendor/blamejs/test/layer-0-primitives/dsr.test.js +218 -0
  273. package/lib/vendor/blamejs/test/layer-0-primitives/erase-posture-vacuum.test.js +210 -0
  274. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-hardening.test.js +4 -1
  275. package/lib/vendor/blamejs/test/layer-0-primitives/external-db-migrate.test.js +48 -2
  276. package/lib/vendor/blamejs/test/layer-0-primitives/federation-vc-suite.test.js +237 -5
  277. package/lib/vendor/blamejs/test/layer-0-primitives/fetch-metadata.test.js +20 -9
  278. package/lib/vendor/blamejs/test/layer-0-primitives/file-upload-content-safety-skip-audit.test.js +193 -0
  279. package/lib/vendor/blamejs/test/layer-0-primitives/guard-csv.test.js +90 -0
  280. package/lib/vendor/blamejs/test/layer-0-primitives/http-client-stream.test.js +85 -0
  281. package/lib/vendor/blamejs/test/layer-0-primitives/idempotency-key.test.js +10 -6
  282. package/lib/vendor/blamejs/test/layer-0-primitives/inbox.test.js +15 -4
  283. package/lib/vendor/blamejs/test/layer-0-primitives/legal-hold.test.js +146 -0
  284. package/lib/vendor/blamejs/test/layer-0-primitives/mail-auth.test.js +189 -0
  285. package/lib/vendor/blamejs/test/layer-0-primitives/mail-journal.test.js +3 -1
  286. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-jmap.test.js +123 -4
  287. package/lib/vendor/blamejs/test/layer-0-primitives/mail-server-mx.test.js +207 -2
  288. package/lib/vendor/blamejs/test/layer-0-primitives/mail-store.test.js +74 -0
  289. package/lib/vendor/blamejs/test/layer-0-primitives/oauth-callback.test.js +43 -0
  290. package/lib/vendor/blamejs/test/layer-0-primitives/otel-export.test.js +133 -0
  291. package/lib/vendor/blamejs/test/layer-0-primitives/otlp-attr-redaction.test.js +101 -0
  292. package/lib/vendor/blamejs/test/layer-0-primitives/outbox-inflight-reaper.test.js +136 -0
  293. package/lib/vendor/blamejs/test/layer-0-primitives/parsers-standalone.test.js +83 -0
  294. package/lib/vendor/blamejs/test/layer-0-primitives/passkey-real-vectors.test.js +429 -0
  295. package/lib/vendor/blamejs/test/layer-0-primitives/pqc-agent-curve.test.js +21 -11
  296. package/lib/vendor/blamejs/test/layer-0-primitives/queue-byo-db.test.js +40 -0
  297. package/lib/vendor/blamejs/test/layer-0-primitives/redact-dlp.test.js +83 -0
  298. package/lib/vendor/blamejs/test/layer-0-primitives/redis-client.test.js +113 -0
  299. package/lib/vendor/blamejs/test/layer-0-primitives/retention-dryrun-no-vacuum.test.js +99 -0
  300. package/lib/vendor/blamejs/test/layer-0-primitives/retention-floor.test.js +59 -0
  301. package/lib/vendor/blamejs/test/layer-0-primitives/router-use-path-scope.test.js +255 -0
  302. package/lib/vendor/blamejs/test/layer-0-primitives/safe-url-canonicalize.test.js +362 -0
  303. package/lib/vendor/blamejs/test/layer-0-primitives/safe-xml.test.js +143 -0
  304. package/lib/vendor/blamejs/test/layer-0-primitives/saml-subjectconfirmation-notonorafter.test.js +287 -0
  305. package/lib/vendor/blamejs/test/layer-0-primitives/scheduler-watchdog-stale-settle.test.js +71 -0
  306. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc-ecdsa-p1363.test.js +79 -0
  307. package/lib/vendor/blamejs/test/layer-0-primitives/sd-jwt-vc.test.js +50 -0
  308. package/lib/vendor/blamejs/test/layer-0-primitives/security-headers.test.js +31 -4
  309. package/lib/vendor/blamejs/test/layer-0-primitives/session-extensions.test.js +45 -0
  310. package/lib/vendor/blamejs/test/layer-0-primitives/sigv4-bucket-ops.test.js +49 -0
  311. package/lib/vendor/blamejs/test/layer-0-primitives/sql.test.js +595 -0
  312. package/lib/vendor/blamejs/test/layer-0-primitives/sse-backpressure.test.js +91 -0
  313. package/lib/vendor/blamejs/test/layer-0-primitives/ssrf-guard.test.js +69 -0
  314. package/lib/vendor/blamejs/test/layer-0-primitives/static.test.js +194 -2
  315. package/lib/vendor/blamejs/test/layer-0-primitives/websocket-extension-header.test.js +88 -0
  316. package/lib/vendor/blamejs/test/layer-0-primitives/worker-pool-recycle-race.test.js +66 -0
  317. package/lib/vendor/blamejs/test/layer-1-state/api-key.test.js +84 -0
  318. package/lib/vendor/blamejs/test/layer-5-integration/external-db-residency.test.js +638 -0
  319. package/lib/vendor/blamejs/test/layer-5-integration/guard-host-integration.test.js +21 -0
  320. package/lib/vendor/blamejs/test/smoke.js +79 -21
  321. package/package.json +2 -2
  322. package/lib/vendor/blamejs/release-notes/v0.14.0.json +0 -43
  323. package/lib/vendor/blamejs/release-notes/v0.14.1.json +0 -60
  324. package/lib/vendor/blamejs/release-notes/v0.14.10.json +0 -54
  325. package/lib/vendor/blamejs/release-notes/v0.14.11.json +0 -72
  326. package/lib/vendor/blamejs/release-notes/v0.14.12.json +0 -95
  327. package/lib/vendor/blamejs/release-notes/v0.14.13.json +0 -52
  328. package/lib/vendor/blamejs/release-notes/v0.14.14.json +0 -31
  329. package/lib/vendor/blamejs/release-notes/v0.14.16.json +0 -45
  330. package/lib/vendor/blamejs/release-notes/v0.14.17.json +0 -57
  331. package/lib/vendor/blamejs/release-notes/v0.14.18.json +0 -127
  332. package/lib/vendor/blamejs/release-notes/v0.14.19.json +0 -61
  333. package/lib/vendor/blamejs/release-notes/v0.14.2.json +0 -18
  334. package/lib/vendor/blamejs/release-notes/v0.14.20.json +0 -73
  335. package/lib/vendor/blamejs/release-notes/v0.14.21.json +0 -98
  336. package/lib/vendor/blamejs/release-notes/v0.14.22.json +0 -91
  337. package/lib/vendor/blamejs/release-notes/v0.14.3.json +0 -18
  338. package/lib/vendor/blamejs/release-notes/v0.14.4.json +0 -18
  339. package/lib/vendor/blamejs/release-notes/v0.14.5.json +0 -18
  340. package/lib/vendor/blamejs/release-notes/v0.14.6.json +0 -60
  341. package/lib/vendor/blamejs/release-notes/v0.14.7.json +0 -77
  342. package/lib/vendor/blamejs/release-notes/v0.14.8.json +0 -27
  343. package/lib/vendor/blamejs/release-notes/v0.14.9.json +0 -40
@@ -58,10 +58,13 @@ var nodePath = require("node:path");
58
58
  var atomicFile = require("./atomic-file");
59
59
  var C = require("./constants");
60
60
  var dbSchema = require("./db-schema");
61
+ var frameworkSchema = require("./framework-schema");
61
62
  var lazyRequire = require("./lazy-require");
62
63
  var { boot } = require("./log");
63
64
  var migrationFiles = require("./migration-files");
64
65
  var requestHelpers = require("./request-helpers");
66
+ var safeSql = require("./safe-sql");
67
+ var sql = require("./sql");
65
68
  var validateOpts = require("./validate-opts");
66
69
  var { SeederError } = require("./framework-error");
67
70
 
@@ -72,13 +75,29 @@ var observability = lazyRequire(function () { return require("./observability");
72
75
 
73
76
  var _err = SeederError.factory;
74
77
 
75
- var SEEDERS_TABLE = "_blamejs_seeders";
76
- var LOCK_TABLE = "_blamejs_seeders_lock";
77
- // Pre-quoted forms used at every SQL interpolation site — defense in
78
- // depth so a future rename to a reserved-word or whitespace-bearing
79
- // table name doesn't silently break the query.
80
- var Q_SEEDERS_TABLE = '"' + SEEDERS_TABLE + '"';
81
- var Q_LOCK_TABLE = '"' + LOCK_TABLE + '"';
78
+ // Logical framework-table names, resolved to the configured prefix via
79
+ // frameworkSchema.tableName at every call site. These run against the
80
+ // local node:sqlite handle directly (no clusterStorage rewrite in the
81
+ // path), so b.sql is built with quoteName: true on the resolved name —
82
+ // the `"name"` identifier form the single-node path always prepares.
83
+ var SEEDERS_TABLE = "_blamejs_seeders"; // allow:hand-rolled-sql logical name declaration; physical name + prefix resolve via frameworkSchema.tableName below
84
+ var LOCK_TABLE = "_blamejs_seeders_lock"; // allow:hand-rolled-sql — logical name declaration; physical name + prefix resolve via frameworkSchema.tableName below
85
+
86
+ // b.sql opts for the local single-node handle: the resolved table name,
87
+ // quoted by construction. tableName() applies the configurable prefix
88
+ // (byte-identical to the literal under the default _blamejs_ prefix).
89
+ function _seedersTable() { return frameworkSchema.tableName(SEEDERS_TABLE); }
90
+ function _lockTable() { return frameworkSchema.tableName(LOCK_TABLE); }
91
+ // b.sql opts resolved from the handle's dialect (sqlite by default; an
92
+ // operator's own Postgres / MySQL handle declares `handle.dialect`).
93
+ // quoteName forces the resolved framework name to quote. The
94
+ // handle-dialect / opts / key-text-type resolution is shared with
95
+ // db-schema's reconciler + migrations.js, so it is composed from db-schema
96
+ // rather than re-derived here. The historical default (sqlite) is
97
+ // byte-identical for every local-handle caller.
98
+ var _handleDialect = dbSchema.handleDialect;
99
+ var _sqlOpts = dbSchema.sqlOpts;
100
+ var _keyTextType = dbSchema.keyTextType;
82
101
 
83
102
  // Filename grammar: leading numeric prefix (any width), '-', non-empty
84
103
  // body of [A-Za-z0-9_-], '.js'. Same shape as migrations to avoid
@@ -279,48 +298,63 @@ function _ensureTables(db) {
279
298
  // Both _blamejs_seeders + _blamejs_seeders_lock are part of
280
299
  // FRAMEWORK_SCHEMA so db.js creates them at boot. The CREATE IF NOT
281
300
  // EXISTS here is defensive for tests that hand-seed a fresh
282
- // node:sqlite Database without going through b.db.
283
- _runSql(db,
284
- "CREATE TABLE IF NOT EXISTS " + Q_SEEDERS_TABLE + " (" +
285
- " env TEXT NOT NULL," +
286
- " name TEXT NOT NULL," +
287
- " description TEXT," +
288
- " appliedAt TEXT NOT NULL," +
289
- " rerunnable INTEGER NOT NULL DEFAULT 0," +
290
- " PRIMARY KEY (env, name)" +
291
- ")"
292
- );
293
- _runSql(db,
294
- "CREATE TABLE IF NOT EXISTS " + Q_LOCK_TABLE + " (" +
295
- " scope TEXT PRIMARY KEY CHECK (scope = 'lock')," +
296
- " lockedAt INTEGER NOT NULL," +
297
- " lockedBy TEXT NOT NULL" +
298
- ")"
299
- );
301
+ // node:sqlite Database without going through b.db. Built through b.sql
302
+ // so the identifiers quote by construction (composite PK + the single-
303
+ // row CHECK fence on the lock table mirror db.js's FRAMEWORK_SCHEMA).
304
+ // env + name are the composite PRIMARY KEY, so both take the key-safe
305
+ // text type (VARCHAR on mysql, TEXT elsewhere). The lock's scope CHECK
306
+ // quotes the column under the handle dialect (backtick on mysql); lockedAt
307
+ // is ms-epoch (`int` → BIGINT on Postgres/MySQL, INTEGER on SQLite).
308
+ var dialect = _handleDialect(db);
309
+ var kt = _keyTextType(db);
310
+ var scopeCheck = "CHECK (" + safeSql.quoteIdentifier("scope", dialect, { allowReserved: true }) + " = 'lock')";
311
+ var seedersDdl = sql.createTable(_seedersTable(), [
312
+ { name: "env", type: kt, notNull: true },
313
+ { name: "name", type: kt, notNull: true },
314
+ { name: "description", type: "text" },
315
+ { name: "appliedAt", type: "text", notNull: true },
316
+ { name: "rerunnable", type: "int", notNull: true, default: 0 },
317
+ ], { quoteName: true, primaryKey: ["env", "name"], dialect: dialect });
318
+ _runSql(db, seedersDdl.sql);
319
+ var lockDdl = sql.createTable(_lockTable(), [
320
+ { name: "scope", type: kt, primaryKey: true, constraints: scopeCheck },
321
+ { name: "lockedAt", type: "int", notNull: true },
322
+ { name: "lockedBy", type: "text", notNull: true },
323
+ ], { quoteName: true, dialect: dialect });
324
+ _runSql(db, lockDdl.sql);
300
325
  }
301
326
 
302
327
  function _lockHolderId() {
303
328
  return String(process.pid) + "@" + (require("node:os").hostname() || "unknown");
304
329
  }
305
330
 
331
+ // b.sql-built statements for the single advisory-lock row. Each binds
332
+ // every value as a placeholder (the constant scope "lock" included) and
333
+ // quotes the resolved table name by construction.
334
+ function _lockInsertSql(db, nowMs, holder) {
335
+ return sql.insert(_lockTable(), _sqlOpts(db))
336
+ .values({ scope: "lock", lockedAt: nowMs, lockedBy: holder }).toSql();
337
+ }
338
+
306
339
  function _acquireLock(db, lockStaleAfterMs, clock) {
307
340
  var holder = _lockHolderId();
308
341
  var nowMs = clock();
309
342
  try {
310
- db.prepare(
311
- "INSERT INTO " + Q_LOCK_TABLE + " (scope, lockedAt, lockedBy) VALUES ('lock', ?, ?)"
312
- ).run(nowMs, holder);
343
+ var ins = _lockInsertSql(db, nowMs, holder);
344
+ var insStmt = db.prepare(ins.sql);
345
+ insStmt.run.apply(insStmt, ins.params);
313
346
  return holder;
314
347
  } catch (_e) {
315
- var existing = db.prepare(
316
- "SELECT lockedAt, lockedBy FROM " + Q_LOCK_TABLE + " WHERE scope = 'lock'"
317
- ).get();
348
+ var selBuilt = sql.select(_lockTable(), _sqlOpts(db))
349
+ .columns(["lockedAt", "lockedBy"]).where("scope", "lock").toSql();
350
+ var selStmt = db.prepare(selBuilt.sql);
351
+ var existing = selStmt.get.apply(selStmt, selBuilt.params);
318
352
  if (!existing) {
319
353
  // Race window between INSERT failure and SELECT — try once more.
320
354
  try {
321
- db.prepare(
322
- "INSERT INTO " + Q_LOCK_TABLE + " (scope, lockedAt, lockedBy) VALUES ('lock', ?, ?)"
323
- ).run(nowMs, holder);
355
+ var ins2 = _lockInsertSql(db, nowMs, holder);
356
+ var ins2Stmt = db.prepare(ins2.sql);
357
+ ins2Stmt.run.apply(ins2Stmt, ins2.params);
324
358
  return holder;
325
359
  } catch (e2) {
326
360
  throw _err("LOCK_BUSY",
@@ -329,23 +363,32 @@ function _acquireLock(db, lockStaleAfterMs, clock) {
329
363
  }
330
364
  var ageMs = nowMs - Number(existing.lockedAt);
331
365
  if (lockStaleAfterMs > 0 && ageMs > lockStaleAfterMs) {
332
- _runSql(db, "BEGIN IMMEDIATE");
366
+ // Force-replace the stale lock atomically. The transaction boundary
367
+ // is dialect-aware: only SQLite has the `BEGIN IMMEDIATE`
368
+ // write-lock-up-front form — Postgres + MySQL reject the `IMMEDIATE`
369
+ // keyword, so the shared runInTransaction helper emits a plain
370
+ // portable `BEGIN`/`COMMIT`/`ROLLBACK` there.
371
+ var lockMode = _handleDialect(db) === "sqlite" ? "IMMEDIATE" : null;
333
372
  try {
334
- db.prepare("DELETE FROM " + Q_LOCK_TABLE + " WHERE scope = 'lock' AND lockedAt = ?")
335
- .run(existing.lockedAt);
336
- db.prepare(
337
- "INSERT INTO " + Q_LOCK_TABLE + " (scope, lockedAt, lockedBy) VALUES ('lock', ?, ?)"
338
- ).run(nowMs, holder);
339
- _runSql(db, "COMMIT");
340
- return holder;
373
+ return dbSchema.runInTransaction(db, function () {
374
+ var delBuilt = sql.delete(_lockTable(), _sqlOpts(db))
375
+ .where("scope", "lock").where("lockedAt", existing.lockedAt).toSql();
376
+ var delStmt = db.prepare(delBuilt.sql);
377
+ delStmt.run.apply(delStmt, delBuilt.params);
378
+ var insForce = _lockInsertSql(db, nowMs, holder);
379
+ var insForceStmt = db.prepare(insForce.sql);
380
+ insForceStmt.run.apply(insForceStmt, insForce.params);
381
+ return holder;
382
+ }, {
383
+ lockMode: lockMode,
384
+ onRollbackFail: function (rollbackErr) {
385
+ log.debug("rollback-failed", {
386
+ op: "lock-stale-replace",
387
+ error: rollbackErr && rollbackErr.message,
388
+ });
389
+ },
390
+ });
341
391
  } catch (forceErr) {
342
- try { _runSql(db, "ROLLBACK"); }
343
- catch (rollbackErr) {
344
- log.debug("rollback-failed", {
345
- op: "lock-stale-replace",
346
- error: rollbackErr && rollbackErr.message,
347
- });
348
- }
349
392
  throw _err("LOCK_STALE_REPLACE_FAILED",
350
393
  "seeders: could not replace stale lock: " +
351
394
  ((forceErr && forceErr.message) || String(forceErr)));
@@ -359,9 +402,10 @@ function _acquireLock(db, lockStaleAfterMs, clock) {
359
402
 
360
403
  function _releaseLock(db, holder) {
361
404
  try {
362
- db.prepare(
363
- "DELETE FROM " + Q_LOCK_TABLE + " WHERE scope = 'lock' AND lockedBy = ?"
364
- ).run(holder);
405
+ var built = sql.delete(_lockTable(), _sqlOpts(db))
406
+ .where("scope", "lock").where("lockedBy", holder).toSql();
407
+ var stmt = db.prepare(built.sql);
408
+ stmt.run.apply(stmt, built.params);
365
409
  } catch (_e) { /* best-effort */ }
366
410
  }
367
411
 
@@ -406,10 +450,13 @@ function create(opts) {
406
450
  }
407
451
 
408
452
  function _appliedRows(db, env) {
409
- return db.prepare(
410
- "SELECT name, description, appliedAt, rerunnable FROM " + Q_SEEDERS_TABLE +
411
- " WHERE env = ? ORDER BY appliedAt ASC, name ASC"
412
- ).all(env);
453
+ var built = sql.select(_seedersTable(), _sqlOpts(db))
454
+ .columns(["name", "description", "appliedAt", "rerunnable"])
455
+ .where("env", env)
456
+ .orderBy("appliedAt", "asc").orderBy("name", "asc")
457
+ .toSql();
458
+ var stmt = db.prepare(built.sql);
459
+ return stmt.all.apply(stmt, built.params);
413
460
  }
414
461
 
415
462
  function status(callerOpts) {
@@ -469,8 +516,11 @@ function create(opts) {
469
516
 
470
517
  var holder = _acquireLock(db, lockStaleAfterMs, clock);
471
518
  try {
519
+ var appliedSelBuilt = sql.select(_seedersTable(), _sqlOpts(db))
520
+ .columns(["name"]).where("env", env).toSql();
521
+ var appliedSelStmt = db.prepare(appliedSelBuilt.sql);
472
522
  var appliedSet = new Set(
473
- db.prepare("SELECT name FROM " + Q_SEEDERS_TABLE + " WHERE env = ?").all(env)
523
+ appliedSelStmt.all.apply(appliedSelStmt, appliedSelBuilt.params)
474
524
  .map(function (r) { return r.name; })
475
525
  );
476
526
 
@@ -503,27 +553,25 @@ function create(opts) {
503
553
  _runSql(db, "BEGIN");
504
554
  try {
505
555
  await mod.run(db, ctx);
556
+ var nowIso = new Date(clock()).toISOString();
557
+ var writeBuilt;
506
558
  if (alreadyApplied && mod.rerunnable) {
507
- db.prepare(
508
- "UPDATE " + Q_SEEDERS_TABLE +
509
- " SET appliedAt = ?, description = ?, rerunnable = ?" +
510
- " WHERE env = ? AND name = ?"
511
- ).run(new Date(clock()).toISOString(), mod.description || "",
512
- mod.rerunnable ? 1 : 0, env, name);
559
+ writeBuilt = sql.update(_seedersTable(), _sqlOpts(db))
560
+ .set({ appliedAt: nowIso, description: mod.description || "",
561
+ rerunnable: mod.rerunnable ? 1 : 0 })
562
+ .where("env", env).where("name", name).toSql();
513
563
  } else if (alreadyApplied && force) {
514
- db.prepare(
515
- "UPDATE " + Q_SEEDERS_TABLE +
516
- " SET appliedAt = ?, description = ?" +
517
- " WHERE env = ? AND name = ?"
518
- ).run(new Date(clock()).toISOString(), mod.description || "",
519
- env, name);
564
+ writeBuilt = sql.update(_seedersTable(), _sqlOpts(db))
565
+ .set({ appliedAt: nowIso, description: mod.description || "" })
566
+ .where("env", env).where("name", name).toSql();
520
567
  } else {
521
- db.prepare(
522
- "INSERT INTO " + Q_SEEDERS_TABLE +
523
- " (env, name, description, appliedAt, rerunnable) VALUES (?, ?, ?, ?, ?)"
524
- ).run(env, name, mod.description || "",
525
- new Date(clock()).toISOString(), mod.rerunnable ? 1 : 0);
568
+ writeBuilt = sql.insert(_seedersTable(), _sqlOpts(db))
569
+ .values({ env: env, name: name, description: mod.description || "",
570
+ appliedAt: nowIso, rerunnable: mod.rerunnable ? 1 : 0 })
571
+ .toSql();
526
572
  }
573
+ var writeStmt = db.prepare(writeBuilt.sql);
574
+ writeStmt.run.apply(writeStmt, writeBuilt.params);
527
575
  _runSql(db, "COMMIT");
528
576
  } catch (e) {
529
577
  try { _runSql(db, "ROLLBACK"); }
@@ -37,22 +37,50 @@
37
37
  * b.session.useStore(sessionStore);
38
38
  */
39
39
 
40
+ var frameworkSchema = require("./framework-schema");
40
41
  var localDbThin = require("./local-db-thin");
42
+ var sql = require("./sql");
41
43
  var validateOpts = require("./validate-opts");
42
44
 
43
- var SESSION_SCHEMA_SQL = [
44
- "CREATE TABLE IF NOT EXISTS _blamejs_sessions (",
45
- ' "sidHash" TEXT PRIMARY KEY,',
46
- ' "userId" TEXT,',
47
- ' "userIdHash" TEXT,',
48
- ' "data" TEXT,',
49
- ' "createdAt" INTEGER,',
50
- ' "expiresAt" INTEGER,',
51
- ' "lastActivity" INTEGER',
52
- ");",
53
- 'CREATE INDEX IF NOT EXISTS "_blamejs_sessions_userIdHash_idx" ON _blamejs_sessions ("userIdHash");',
54
- 'CREATE INDEX IF NOT EXISTS "_blamejs_sessions_expiresAt_idx" ON _blamejs_sessions ("expiresAt");',
55
- ].join("\n");
45
+ // Logical session-table name — resolved through frameworkSchema.tableName
46
+ // so a configured table prefix (b.frameworkSchema.setTablePrefix) is
47
+ // honored. This isolated localDbThin file owns its own schema; the name
48
+ // must agree with the main-DB / cluster-mode session table b.session
49
+ // reads + the sealedFields registry key (db.js registers under the
50
+ // logical name).
51
+ var SESSION_LOGICAL = "_blamejs_sessions"; // allow:hand-rolled-sql — canonical logical table-name declaration
52
+
53
+ // b.sql opts for this adapter's schema DDL + every statement b.session
54
+ // builds against it. The localDbThin backend is a dedicated node:sqlite
55
+ // file (always sqlite, independent of cluster mode — see local-db-thin.js),
56
+ // so the dialect is the literal "sqlite": this store NEVER dispatches to an
57
+ // external Postgres / MySQL backend. Making the dialect explicit (rather than
58
+ // leaning on b.sql's "sqlite" default) keeps the quoting intent documented +
59
+ // matches the cluster-routed data-layer files threading
60
+ // clusterStorage.dialect() through the same opts seam.
61
+ var SQL_OPTS = { dialect: "sqlite" };
62
+
63
+ // CREATE TABLE + the two session-side indexes (userIdHash for
64
+ // destroyAllForUser, expiresAt for purgeExpired), built through b.sql so
65
+ // every identifier is quoted by construction and the table name resolves
66
+ // through the configurable prefix. DDL binds no values, so each builder
67
+ // returns { sql } only; the statements are joined for the adapter's
68
+ // schemaSql.
69
+ function _sessionSchemaSql() {
70
+ var table = frameworkSchema.tableName(SESSION_LOGICAL);
71
+ var create = sql.createTable(table, [
72
+ { name: "sidHash", type: "text", primaryKey: true },
73
+ { name: "userId", type: "text" },
74
+ { name: "userIdHash", type: "text" },
75
+ { name: "data", type: "text" },
76
+ { name: "createdAt", type: "int" },
77
+ { name: "expiresAt", type: "int" },
78
+ { name: "lastActivity", type: "int" },
79
+ ], SQL_OPTS).sql;
80
+ var idxUser = sql.createIndex(table + "_userIdHash_idx", table, ["userIdHash"], SQL_OPTS).sql;
81
+ var idxExp = sql.createIndex(table + "_expiresAt_idx", table, ["expiresAt"], SQL_OPTS).sql;
82
+ return [create + ";", idxUser + ";", idxExp + ";"].join("\n");
83
+ }
56
84
 
57
85
  /**
58
86
  * @primitive b.session.stores.localDbThin
@@ -99,7 +127,7 @@ function localDbThinStore(opts) {
99
127
  // logging out every user; operators wanting clear-on-corrupt opt in.
100
128
  var handle = localDbThin.thin({
101
129
  file: opts.file,
102
- schemaSql: SESSION_SCHEMA_SQL,
130
+ schemaSql: _sessionSchemaSql(),
103
131
  recovery: opts.recovery || "refuse",
104
132
  pragmas: opts.pragmas,
105
133
  audit: opts.audit !== false,