@demiurgejs/core 0.2.0-beta.4 → 0.2.0-beta.6

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 (161) hide show
  1. package/README.md +37 -0
  2. package/bin/demiurge.mjs +23 -1
  3. package/dist/adapter/index.d.ts +1 -1
  4. package/dist/adapter/index.d.ts.map +1 -1
  5. package/dist/browser/file-router.d.ts +1 -1
  6. package/dist/chunks/{document-shell-CpJnFtSC.js → document-shell-C0aPrkhd.js} +2 -2
  7. package/dist/chunks/{document-shell-CpJnFtSC.js.map → document-shell-C0aPrkhd.js.map} +1 -1
  8. package/dist/chunks/image-CRerJ5BY.js +145 -0
  9. package/dist/chunks/image-CRerJ5BY.js.map +1 -0
  10. package/dist/chunks/{image-codec-BmzWnH6W.js → image-codec-CQ8Cwxwb.js} +2 -2
  11. package/dist/chunks/{image-codec-BmzWnH6W.js.map → image-codec-CQ8Cwxwb.js.map} +1 -1
  12. package/dist/chunks/{images-BQ80950B.js → images-QgdmLyQ3.js} +11 -11
  13. package/dist/chunks/{images-BQ80950B.js.map → images-QgdmLyQ3.js.map} +1 -1
  14. package/dist/chunks/{index-BVk9zWbe.js → index-LYve1rQp.js} +287 -351
  15. package/dist/chunks/index-LYve1rQp.js.map +1 -0
  16. package/dist/chunks/links-iU22QkCE.js +68 -0
  17. package/dist/chunks/links-iU22QkCE.js.map +1 -0
  18. package/dist/chunks/plugin-bkP6WwrS.js +2311 -0
  19. package/dist/chunks/plugin-bkP6WwrS.js.map +1 -0
  20. package/dist/chunks/runtime-BH519j2t.js +294 -0
  21. package/dist/chunks/runtime-BH519j2t.js.map +1 -0
  22. package/dist/chunks/streaming-BlKlC3nw.js +427 -0
  23. package/dist/chunks/streaming-BlKlC3nw.js.map +1 -0
  24. package/dist/chunks/{testing-DueXbMo4.js → testing-BEW1nchS.js} +2161 -1562
  25. package/dist/chunks/testing-BEW1nchS.js.map +1 -0
  26. package/dist/chunks/{vite-DO70kZA6.js → vite-BADZA8Fl.js} +90 -87
  27. package/dist/chunks/vite-BADZA8Fl.js.map +1 -0
  28. package/dist/cli.d.ts +10 -2
  29. package/dist/cli.d.ts.map +1 -1
  30. package/dist/cli.js +277 -87
  31. package/dist/cli.js.map +1 -1
  32. package/dist/config/index.js +2 -2
  33. package/dist/config/types.d.ts +14 -2
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/config/validate.d.ts.map +1 -1
  36. package/dist/data/cache.d.ts +5 -0
  37. package/dist/data/cache.d.ts.map +1 -1
  38. package/dist/data/index.d.ts +1 -1
  39. package/dist/data/index.d.ts.map +1 -1
  40. package/dist/data/testing.d.ts.map +1 -1
  41. package/dist/data/testing.js +101 -67
  42. package/dist/data/testing.js.map +1 -1
  43. package/dist/data/tiered.d.ts.map +1 -1
  44. package/dist/edge/index.js +27 -26
  45. package/dist/edge/index.js.map +1 -1
  46. package/dist/edge/stores.d.ts.map +1 -1
  47. package/dist/index.d.ts +4 -4
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +158 -135
  50. package/dist/index.js.map +1 -1
  51. package/dist/inspect/command.d.ts +28 -0
  52. package/dist/inspect/command.d.ts.map +1 -0
  53. package/dist/inspect/index.d.ts +9 -0
  54. package/dist/inspect/index.d.ts.map +1 -0
  55. package/dist/inspect/redact.d.ts +35 -0
  56. package/dist/inspect/redact.d.ts.map +1 -0
  57. package/dist/inspect/report.d.ts +24 -0
  58. package/dist/inspect/report.d.ts.map +1 -0
  59. package/dist/inspect/types.d.ts +102 -0
  60. package/dist/inspect/types.d.ts.map +1 -0
  61. package/dist/internal/testing.js +12 -12
  62. package/dist/kv/index.js +7 -6
  63. package/dist/kv/index.js.map +1 -1
  64. package/dist/kv/store.d.ts.map +1 -1
  65. package/dist/node/http.d.ts +7 -0
  66. package/dist/node/http.d.ts.map +1 -1
  67. package/dist/node/index.d.ts +2 -2
  68. package/dist/node/index.d.ts.map +1 -1
  69. package/dist/node/index.js +31 -28
  70. package/dist/node/index.js.map +1 -1
  71. package/dist/node/serve.d.ts +4 -0
  72. package/dist/node/serve.d.ts.map +1 -1
  73. package/dist/redis/index.js +29 -28
  74. package/dist/redis/index.js.map +1 -1
  75. package/dist/redis/store.d.ts.map +1 -1
  76. package/dist/route/index.d.ts +1 -0
  77. package/dist/route/index.d.ts.map +1 -1
  78. package/dist/route/mutation.d.ts.map +1 -1
  79. package/dist/route/serialization.d.ts +24 -0
  80. package/dist/route/serialization.d.ts.map +1 -0
  81. package/dist/route/webhook.d.ts +6 -1
  82. package/dist/route/webhook.d.ts.map +1 -1
  83. package/dist/router/manifest.d.ts.map +1 -1
  84. package/dist/security/audit.d.ts +2 -1
  85. package/dist/security/audit.d.ts.map +1 -1
  86. package/dist/security/authorization.d.ts +36 -0
  87. package/dist/security/authorization.d.ts.map +1 -0
  88. package/dist/security/csrf.d.ts.map +1 -1
  89. package/dist/security/env-startup.d.ts +0 -2
  90. package/dist/security/env-startup.d.ts.map +1 -1
  91. package/dist/security/env.d.ts +27 -8
  92. package/dist/security/env.d.ts.map +1 -1
  93. package/dist/security/exceptions.d.ts +29 -0
  94. package/dist/security/exceptions.d.ts.map +1 -0
  95. package/dist/security/finding-codes.d.ts +56 -0
  96. package/dist/security/finding-codes.d.ts.map +1 -0
  97. package/dist/security/index.d.ts +5 -2
  98. package/dist/security/index.d.ts.map +1 -1
  99. package/dist/security/policy.d.ts +2 -5
  100. package/dist/security/policy.d.ts.map +1 -1
  101. package/dist/security/report.d.ts +2 -1
  102. package/dist/security/report.d.ts.map +1 -1
  103. package/dist/security/request.d.ts +1 -0
  104. package/dist/security/request.d.ts.map +1 -1
  105. package/dist/security/types.d.ts +138 -5
  106. package/dist/security/types.d.ts.map +1 -1
  107. package/dist/security/upload.d.ts +3 -3
  108. package/dist/security/upload.d.ts.map +1 -1
  109. package/dist/security/verification.d.ts.map +1 -1
  110. package/dist/server/request-handler.d.ts +3 -2
  111. package/dist/server/request-handler.d.ts.map +1 -1
  112. package/dist/server-only/browser.d.ts +2 -0
  113. package/dist/server-only/browser.d.ts.map +1 -0
  114. package/dist/server-only/browser.js +4 -0
  115. package/dist/server-only/browser.js.map +1 -0
  116. package/dist/server-only/index.d.ts +2 -0
  117. package/dist/server-only/index.d.ts.map +1 -0
  118. package/dist/server-only/index.js +2 -0
  119. package/dist/server-only/index.js.map +1 -0
  120. package/dist/static/index.d.ts.map +1 -1
  121. package/dist/static/index.js +255 -255
  122. package/dist/static/index.js.map +1 -1
  123. package/dist/static/testing.d.ts +26 -0
  124. package/dist/static/testing.d.ts.map +1 -0
  125. package/dist/static/testing.js +76 -0
  126. package/dist/static/testing.js.map +1 -0
  127. package/dist/testing/index.d.ts +47 -0
  128. package/dist/testing/index.d.ts.map +1 -0
  129. package/dist/testing/index.js +99 -0
  130. package/dist/testing/index.js.map +1 -0
  131. package/dist/vercel/build.d.ts +31 -0
  132. package/dist/vercel/build.d.ts.map +1 -0
  133. package/dist/vercel/config.d.ts +15 -0
  134. package/dist/vercel/config.d.ts.map +1 -0
  135. package/dist/vercel/index.d.ts +7 -0
  136. package/dist/vercel/index.d.ts.map +1 -0
  137. package/dist/vercel/index.js +11 -0
  138. package/dist/vercel/index.js.map +1 -0
  139. package/dist/vercel/runtime.d.ts +29 -0
  140. package/dist/vercel/runtime.d.ts.map +1 -0
  141. package/dist/vite/index.d.ts +9 -4
  142. package/dist/vite/index.d.ts.map +1 -1
  143. package/dist/vite/index.js +28 -21
  144. package/dist/vite/plugin.d.ts +18 -2
  145. package/dist/vite/plugin.d.ts.map +1 -1
  146. package/dist/vite/policy-verification.d.ts +33 -2
  147. package/dist/vite/policy-verification.d.ts.map +1 -1
  148. package/dist/vite/route-audit.d.ts +14 -2
  149. package/dist/vite/route-audit.d.ts.map +1 -1
  150. package/dist/vite/server-only-boundary.d.ts +8 -0
  151. package/dist/vite/server-only-boundary.d.ts.map +1 -0
  152. package/package.json +18 -1
  153. package/dist/chunks/env-startup-DOBYWlZD.js +0 -257
  154. package/dist/chunks/env-startup-DOBYWlZD.js.map +0 -1
  155. package/dist/chunks/index-BVk9zWbe.js.map +0 -1
  156. package/dist/chunks/plugin-BQgMiHxa.js +0 -1827
  157. package/dist/chunks/plugin-BQgMiHxa.js.map +0 -1
  158. package/dist/chunks/streaming-BEbPN7Uk.js +0 -469
  159. package/dist/chunks/streaming-BEbPN7Uk.js.map +0 -1
  160. package/dist/chunks/testing-DueXbMo4.js.map +0 -1
  161. package/dist/chunks/vite-DO70kZA6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/redis/store.ts","../../src/redis/rate-limit-store.ts","../../src/redis/session-store.ts"],"sourcesContent":["import type { Redis } from \"ioredis\";\nimport type { CacheStore, CacheStoreEntry } from \"../data/cache\";\n\nexport type RedisCacheStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's entry, tag, and lease keys away from an application's\n // other Redis use. Two Demiurge deployments that share a database still\n // need distinct prefixes, the same way they need distinct cache namespaces.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:cache:\";\n\n// Tag sets hold the raw, unprefixed cache key as each member, never the\n// prefixed entry key. invalidateTags() only knows a tag's members. It\n// rebuilds both the entry key and the lease key by applying their prefixes.\n// Every script below adds and removes the same raw-key member, so the two\n// stay in agreement.\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] entry JSON, ARGV[2] staleUntil epoch ms or \"\".\n// ARGV[3] tag key prefix, ARGV[4] raw key.\nconst setScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[3] .. oldTags[i], ARGV[4])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[1])\nif ARGV[2] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[2])\nend\nlocal newTags = cjson.decode(ARGV[1]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[3] .. newTags[i], ARGV[4])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] tag key prefix, ARGV[2] raw key.\nconst deleteScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nredis.call(\"DEL\", KEYS[2])\nif not old then\n return 0\nend\nlocal oldTags = cjson.decode(old).tags\nfor i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[1] .. oldTags[i], ARGV[2])\nend\nredis.call(\"DEL\", KEYS[1])\nreturn 1\n`;\n\n// No declared KEYS. Tags name a variable number of sets, so the script reads\n// their redis keys from ARGV instead.\n// ARGV[1] tags JSON array, ARGV[2] tag key prefix, ARGV[3] entry key prefix,\n// ARGV[4] lease key prefix\nconst invalidateTagsScript = `\nlocal tags = cjson.decode(ARGV[1])\nlocal seen = {}\nlocal deleted = 0\nfor i = 1, #tags do\n local tagSetKey = ARGV[2] .. tags[i]\n local members = redis.call(\"SMEMBERS\", tagSetKey)\n for j = 1, #members do\n local rawKey = members[j]\n if not seen[rawKey] then\n seen[rawKey] = true\n local entryKey = ARGV[3] .. rawKey\n local old = redis.call(\"GET\", entryKey)\n if old then\n local oldTags = cjson.decode(old).tags\n for t = 1, #oldTags do\n redis.call(\"SREM\", ARGV[2] .. oldTags[t], rawKey)\n end\n redis.call(\"DEL\", entryKey)\n redis.call(\"DEL\", ARGV[4] .. rawKey)\n deleted = deleted + 1\n else\n redis.call(\"SREM\", tagSetKey, rawKey)\n end\n end\n end\n redis.call(\"DEL\", tagSetKey)\nend\nreturn deleted\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] token, ARGV[2] entry JSON, ARGV[3] staleUntil epoch ms or \"\".\n// ARGV[4] tag key prefix, ARGV[5] raw key.\nconst publishRefreshScript = `\nlocal owner = redis.call(\"GET\", KEYS[2])\nif not owner or owner ~= ARGV[1] then\n return 0\nend\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[4] .. oldTags[i], ARGV[5])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[2])\nif ARGV[3] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[3])\nend\nlocal newTags = cjson.decode(ARGV[2]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[4] .. newTags[i], ARGV[5])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] lease key, ARGV[1] token\nconst releaseRefreshLeaseScript = `\nlocal owner = redis.call(\"GET\", KEYS[1])\nif owner == ARGV[1] then\n redis.call(\"DEL\", KEYS[1])\nend\nreturn 0\n`;\n\ntype RedisCacheCommands = {\n demiurgeCacheSet: (\n entryKey: string,\n leaseKey: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheDelete: (\n entryKey: string,\n leaseKey: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheInvalidateTags: (\n tagsJson: string,\n tagPrefix: string,\n entryPrefix: string,\n leasePrefix: string,\n ) => Promise<number>;\n demiurgeCachePublishRefresh: (\n entryKey: string,\n leaseKey: string,\n token: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheReleaseRefreshLease: (\n leaseKey: string,\n token: string,\n ) => Promise<number>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// commands is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines a command twice.\nfunction commands(client: Redis): Redis & RedisCacheCommands {\n // TYPE-EVIDENCE: the cast adds the optional custom command methods before the runtime checks install them.\n const withCommands = client as Redis & Partial<RedisCacheCommands>;\n\n if (!withCommands.demiurgeCacheSet) {\n client.defineCommand(\"demiurgeCacheSet\", { lua: setScript, numberOfKeys: 2 });\n }\n\n if (!withCommands.demiurgeCacheDelete) {\n client.defineCommand(\"demiurgeCacheDelete\", {\n lua: deleteScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheInvalidateTags) {\n client.defineCommand(\"demiurgeCacheInvalidateTags\", {\n lua: invalidateTagsScript,\n numberOfKeys: 0,\n });\n }\n\n if (!withCommands.demiurgeCachePublishRefresh) {\n client.defineCommand(\"demiurgeCachePublishRefresh\", {\n lua: publishRefreshScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheReleaseRefreshLease) {\n client.defineCommand(\"demiurgeCacheReleaseRefreshLease\", {\n lua: releaseRefreshLeaseScript,\n numberOfKeys: 1,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand calls above install each custom command. The cast reflects that the methods now exist.\n return withCommands as Redis & RedisCacheCommands;\n}\n\n// Redis holds the entry, its tag memberships, and its refresh lease as\n// independent keys. Every process talking to the same database must see\n// these three stay coordinated. Each write path therefore runs as one Lua\n// script rather than several round trips a concurrent writer could\n// interleave with.\nexport function createRedisCacheStore(\n options: RedisCacheStoreOptions,\n): CacheStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis cache store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n const entryPrefix = `${prefix}entry:`;\n const tagPrefix = `${prefix}tag:`;\n const leasePrefix = `${prefix}lease:`;\n\n return {\n async acquireRefreshLease(key, token, expiresAt) {\n // ioredis's typed SET overloads do not cover every flag order the\n // Redis SET command accepts, so this issues the raw command instead.\n const result = await client.call(\n \"SET\",\n leasePrefix + key,\n token,\n \"NX\",\n \"PXAT\",\n String(expiresAt),\n );\n\n return result === \"OK\";\n },\n async delete(key) {\n const deleted = await client.demiurgeCacheDelete(\n entryPrefix + key,\n leasePrefix + key,\n tagPrefix,\n key,\n );\n\n return deleted === 1;\n },\n async get(key) {\n const raw = await client.get(entryPrefix + key);\n // TYPE-EVIDENCE: the stored raw value is JSON that the store serialized from a cache entry. The cast restores that shape.\n return raw ? (JSON.parse(raw) as CacheStoreEntry) : undefined;\n },\n async invalidateTags(tags) {\n if (tags.length === 0) {\n return 0;\n }\n\n return await client.demiurgeCacheInvalidateTags(\n JSON.stringify(tags),\n tagPrefix,\n entryPrefix,\n leasePrefix,\n );\n },\n async publishRefresh(key, token, entry) {\n const result = await client.demiurgeCachePublishRefresh(\n entryPrefix + key,\n leasePrefix + key,\n token,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n\n return result === 1;\n },\n async releaseRefreshLease(key, token) {\n await client.demiurgeCacheReleaseRefreshLease(leasePrefix + key, token);\n },\n async set(key, entry) {\n await client.demiurgeCacheSet(\n entryPrefix + key,\n leasePrefix + key,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n },\n };\n}\n","import type { Redis } from \"ioredis\";\nimport type { RateLimitResult, RateLimitStore } from \"../security/types\";\n\nexport type RedisRateLimitStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's counter keys away from an application's other Redis\n // use, the same way RedisCacheStoreOptions.keyPrefix does for the cache\n // store. Two Demiurge deployments that share a database still need\n // distinct prefixes.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:ratelimit:\";\n\n// KEYS[1] counter key. ARGV[1] window in ms.\n//\n// INCR and PEXPIRE run inside one script. Redis executes the whole script\n// as a single atomic step, so two instances racing to increment the same\n// key never both observe count 1. The window's reset time comes from\n// Redis's own clock (TIME), not the caller-supplied `now`. The counter's\n// TTL is authoritative once several processes share it, and a\n// client-supplied timestamp could disagree with the server that expires the\n// key. TIME is deterministic across replication because Redis rewrites the\n// script's effects rather than replaying non-deterministic commands.\nconst incrementScript = `\nlocal count = redis.call(\"INCR\", KEYS[1])\nif count == 1 then\n redis.call(\"PEXPIRE\", KEYS[1], ARGV[1])\nend\nlocal ttl = redis.call(\"PTTL\", KEYS[1])\nif ttl < 0 then\n redis.call(\"PEXPIRE\", KEYS[1], ARGV[1])\n ttl = tonumber(ARGV[1])\nend\nlocal time = redis.call(\"TIME\")\nlocal nowMs = math.floor(tonumber(time[1]) * 1000 + tonumber(time[2]) / 1000)\nreturn { count, nowMs + ttl }\n`;\n\ntype RedisRateLimitCommands = {\n demiurgeRateLimitIncrement: (\n counterKey: string,\n windowMs: string,\n ) => Promise<[number, number]>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// command is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines the command twice.\nfunction commands(client: Redis): Redis & RedisRateLimitCommands {\n // TYPE-EVIDENCE: the cast adds the optional custom command methods before the runtime check installs them.\n const withCommands = client as Redis & Partial<RedisRateLimitCommands>;\n\n if (!withCommands.demiurgeRateLimitIncrement) {\n client.defineCommand(\"demiurgeRateLimitIncrement\", {\n lua: incrementScript,\n numberOfKeys: 1,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand call above installs the custom command. The cast reflects that the method now exists.\n return withCommands as Redis & RedisRateLimitCommands;\n}\n\nexport function createRedisRateLimitStore(\n options: RedisRateLimitStoreOptions,\n): RateLimitStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis rate limit store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n\n return {\n async increment(key, windowMs): Promise<RateLimitResult> {\n const [count, resetAt] = await client.demiurgeRateLimitIncrement(\n prefix + key,\n String(windowMs),\n );\n\n return { count, resetAt };\n },\n };\n}\n","import type { Redis } from \"ioredis\";\nimport {\n parseSessionRecord,\n serializeSessionNamespace,\n type SessionData,\n type SessionNamespace,\n type SessionRecord,\n type SessionStore,\n type SessionStoreCandidate,\n} from \"../security/session-store\";\n\nexport type RedisSessionStoreOptions = {\n client: Redis;\n keyPrefix?: string;\n namespace: SessionNamespace;\n};\n\nconst defaultKeyPrefix = \"demiurge:session:\";\n\nconst createScript = `\nif redis.call(\"EXISTS\", KEYS[1]) == 1 then\n return 0\nend\nredis.call(\"SET\", KEYS[1], ARGV[1], \"PXAT\", ARGV[2])\nreturn 1\n`;\n\nconst updateScript = `\nlocal current = redis.call(\"GET\", KEYS[1])\nif not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then\n return 0\nend\nredis.call(\"SET\", KEYS[1], ARGV[2], \"PXAT\", ARGV[3])\nreturn 1\n`;\n\nconst rotateScript = `\nlocal current = redis.call(\"GET\", KEYS[1])\nif not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then\n return 0\nend\nif KEYS[1] ~= KEYS[2] and redis.call(\"EXISTS\", KEYS[2]) == 1 then\n return 0\nend\nredis.call(\"DEL\", KEYS[1])\nredis.call(\"SET\", KEYS[2], ARGV[2], \"PXAT\", ARGV[3])\nreturn 1\n`;\n\ntype RedisSessionCommands = {\n demiurgeSessionCreate: (\n key: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n demiurgeSessionRotate: (\n currentKey: string,\n nextKey: string,\n expectedVersion: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n demiurgeSessionUpdate: (\n key: string,\n expectedVersion: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n};\n\nfunction commands(client: Redis): Redis & RedisSessionCommands {\n // TYPE-EVIDENCE: the cast adds optional custom commands before the runtime checks install them.\n const withCommands = client as Redis & Partial<RedisSessionCommands>;\n\n if (!withCommands.demiurgeSessionCreate) {\n client.defineCommand(\"demiurgeSessionCreate\", {\n lua: createScript,\n numberOfKeys: 1,\n });\n }\n\n if (!withCommands.demiurgeSessionUpdate) {\n client.defineCommand(\"demiurgeSessionUpdate\", {\n lua: updateScript,\n numberOfKeys: 1,\n });\n }\n\n if (!withCommands.demiurgeSessionRotate) {\n client.defineCommand(\"demiurgeSessionRotate\", {\n lua: rotateScript,\n numberOfKeys: 2,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand calls install each command. The cast reflects the resulting client shape.\n return withCommands as Redis & RedisSessionCommands;\n}\n\nexport function createRedisSessionStore<\n TData extends SessionData = SessionData,\n>(options: RedisSessionStoreOptions): SessionStore<TData> {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis session store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const namespace = serializeSessionNamespace(options.namespace);\n const prefix = `${options.keyPrefix ?? defaultKeyPrefix}${namespace}:`;\n const key = (id: string) => prefix + id;\n\n return {\n async create(candidate) {\n const record = toRecord(candidate, 0);\n\n try {\n const stored = await client.demiurgeSessionCreate(\n key(record.id),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async destroy(id) {\n return await client.del(key(id)) === 1;\n },\n async read(id, now) {\n const raw = await client.get(key(id));\n\n if (!raw) {\n return undefined;\n }\n\n const record = parseRecord<TData>(raw);\n\n if (!record) {\n return undefined;\n }\n\n if (storeExpiration(record) <= now) {\n await client.del(key(id));\n return undefined;\n }\n\n return record;\n },\n async rotate(currentId, candidate, expectedVersion) {\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await client.demiurgeSessionRotate(\n key(currentId),\n key(record.id),\n String(expectedVersion),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async update(candidate, expectedVersion) {\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await client.demiurgeSessionUpdate(\n key(record.id),\n String(expectedVersion),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n };\n}\n\nfunction parseRecord<TData extends SessionData>(\n raw: string,\n): SessionRecord<TData> | undefined {\n try {\n return parseSessionRecord<TData>(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nfunction toRecord<TData extends SessionData>(\n candidate: SessionStoreCandidate<TData>,\n version: number,\n): SessionRecord<TData> {\n return structuredClone({ ...candidate, version });\n}\n\nfunction storeExpiration(record: SessionRecord) {\n return Math.min(record.expiresAt, record.idleExpiresAt ?? record.expiresAt);\n}\n"],"names":["defaultKeyPrefix","setScript","deleteScript","invalidateTagsScript","publishRefreshScript","releaseRefreshLeaseScript","commands","client","withCommands","createRedisCacheStore","options","prefix","entryPrefix","tagPrefix","leasePrefix","key","token","expiresAt","raw","tags","entry","incrementScript","createRedisRateLimitStore","windowMs","count","resetAt","createScript","updateScript","rotateScript","createRedisSessionStore","namespace","serializeSessionNamespace","id","candidate","record","toRecord","storeExpiration","now","parseRecord","currentId","expectedVersion","parseSessionRecord","version"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/redis/store.ts","../../src/redis/rate-limit-store.ts","../../src/redis/session-store.ts"],"sourcesContent":["import type { Redis } from \"ioredis\";\nimport type { CacheStore, CacheStoreEntry } from \"../data/cache\";\n\nexport type RedisCacheStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's entry, tag, and lease keys away from an application's\n // other Redis use. Two Demiurge deployments that share a database still\n // need distinct prefixes, the same way they need distinct cache namespaces.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:cache:\";\n\n// Tag sets hold the raw, unprefixed cache key as each member, never the\n// prefixed entry key. invalidateTags() only knows a tag's members. It\n// rebuilds both the entry key and the lease key by applying their prefixes.\n// Every script below adds and removes the same raw-key member, so the two\n// stay in agreement.\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] entry JSON, ARGV[2] staleUntil epoch ms or \"\".\n// ARGV[3] tag key prefix, ARGV[4] raw key.\nconst setScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[3] .. oldTags[i], ARGV[4])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[1])\nif ARGV[2] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[2])\nend\nlocal newTags = cjson.decode(ARGV[1]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[3] .. newTags[i], ARGV[4])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] tag key prefix, ARGV[2] raw key.\nconst deleteScript = `\nlocal old = redis.call(\"GET\", KEYS[1])\nredis.call(\"DEL\", KEYS[2])\nif not old then\n return 0\nend\nlocal oldTags = cjson.decode(old).tags\nfor i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[1] .. oldTags[i], ARGV[2])\nend\nredis.call(\"DEL\", KEYS[1])\nreturn 1\n`;\n\n// No declared KEYS. Tags name a variable number of sets, so the script reads\n// their redis keys from ARGV instead.\n// ARGV[1] tags JSON array, ARGV[2] tag key prefix, ARGV[3] entry key prefix,\n// ARGV[4] lease key prefix\nconst invalidateTagsScript = `\nlocal tags = cjson.decode(ARGV[1])\nlocal seen = {}\nlocal deleted = 0\nfor i = 1, #tags do\n local tagSetKey = ARGV[2] .. tags[i]\n local members = redis.call(\"SMEMBERS\", tagSetKey)\n for j = 1, #members do\n local rawKey = members[j]\n if not seen[rawKey] then\n seen[rawKey] = true\n local entryKey = ARGV[3] .. rawKey\n local old = redis.call(\"GET\", entryKey)\n if old then\n local oldTags = cjson.decode(old).tags\n for t = 1, #oldTags do\n redis.call(\"SREM\", ARGV[2] .. oldTags[t], rawKey)\n end\n redis.call(\"DEL\", entryKey)\n redis.call(\"DEL\", ARGV[4] .. rawKey)\n deleted = deleted + 1\n else\n redis.call(\"SREM\", tagSetKey, rawKey)\n end\n end\n end\n redis.call(\"DEL\", tagSetKey)\nend\nreturn deleted\n`;\n\n// KEYS[1] entry key, KEYS[2] lease key.\n// ARGV[1] token, ARGV[2] entry JSON, ARGV[3] staleUntil epoch ms or \"\".\n// ARGV[4] tag key prefix, ARGV[5] raw key.\nconst publishRefreshScript = `\nlocal owner = redis.call(\"GET\", KEYS[2])\nif not owner or owner ~= ARGV[1] then\n return 0\nend\nlocal old = redis.call(\"GET\", KEYS[1])\nif old then\n local oldTags = cjson.decode(old).tags\n for i = 1, #oldTags do\n redis.call(\"SREM\", ARGV[4] .. oldTags[i], ARGV[5])\n end\nend\nredis.call(\"SET\", KEYS[1], ARGV[2])\nif ARGV[3] ~= \"\" then\n redis.call(\"PEXPIREAT\", KEYS[1], ARGV[3])\nend\nlocal newTags = cjson.decode(ARGV[2]).tags\nfor i = 1, #newTags do\n redis.call(\"SADD\", ARGV[4] .. newTags[i], ARGV[5])\nend\nredis.call(\"DEL\", KEYS[2])\nreturn 1\n`;\n\n// KEYS[1] lease key, ARGV[1] token\nconst releaseRefreshLeaseScript = `\nlocal owner = redis.call(\"GET\", KEYS[1])\nif owner == ARGV[1] then\n redis.call(\"DEL\", KEYS[1])\nend\nreturn 0\n`;\n\ntype RedisCacheCommands = {\n demiurgeCacheSet: (\n entryKey: string,\n leaseKey: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheDelete: (\n entryKey: string,\n leaseKey: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheInvalidateTags: (\n tagsJson: string,\n tagPrefix: string,\n entryPrefix: string,\n leasePrefix: string,\n ) => Promise<number>;\n demiurgeCachePublishRefresh: (\n entryKey: string,\n leaseKey: string,\n token: string,\n entryJson: string,\n staleUntil: string,\n tagPrefix: string,\n rawKey: string,\n ) => Promise<number>;\n demiurgeCacheReleaseRefreshLease: (\n leaseKey: string,\n token: string,\n ) => Promise<number>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// commands is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines a command twice.\nfunction commands(client: Redis): Redis & RedisCacheCommands {\n // TYPE-EVIDENCE: the cast adds the optional custom command methods before the runtime checks install them.\n const withCommands = client as Redis & Partial<RedisCacheCommands>;\n\n if (!withCommands.demiurgeCacheSet) {\n client.defineCommand(\"demiurgeCacheSet\", { lua: setScript, numberOfKeys: 2 });\n }\n\n if (!withCommands.demiurgeCacheDelete) {\n client.defineCommand(\"demiurgeCacheDelete\", {\n lua: deleteScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheInvalidateTags) {\n client.defineCommand(\"demiurgeCacheInvalidateTags\", {\n lua: invalidateTagsScript,\n numberOfKeys: 0,\n });\n }\n\n if (!withCommands.demiurgeCachePublishRefresh) {\n client.defineCommand(\"demiurgeCachePublishRefresh\", {\n lua: publishRefreshScript,\n numberOfKeys: 2,\n });\n }\n\n if (!withCommands.demiurgeCacheReleaseRefreshLease) {\n client.defineCommand(\"demiurgeCacheReleaseRefreshLease\", {\n lua: releaseRefreshLeaseScript,\n numberOfKeys: 1,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand calls above install each custom command. The cast reflects that the methods now exist.\n return withCommands as Redis & RedisCacheCommands;\n}\n\n// Redis holds the entry, its tag memberships, and its refresh lease as\n// independent keys. Every process talking to the same database must see\n// these three stay coordinated. Each write path therefore runs as one Lua\n// script rather than several round trips a concurrent writer could\n// interleave with.\nexport function createRedisCacheStore(\n options: RedisCacheStoreOptions,\n): CacheStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis cache store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n const entryPrefix = `${prefix}entry:`;\n const tagPrefix = `${prefix}tag:`;\n const leasePrefix = `${prefix}lease:`;\n\n return {\n capabilities: { atomicity: \"strong\" },\n async acquireRefreshLease(key, token, expiresAt) {\n // ioredis's typed SET overloads do not cover every flag order the\n // Redis SET command accepts, so this issues the raw command instead.\n const result = await client.call(\n \"SET\",\n leasePrefix + key,\n token,\n \"NX\",\n \"PXAT\",\n String(expiresAt),\n );\n\n return result === \"OK\";\n },\n async delete(key) {\n const deleted = await client.demiurgeCacheDelete(\n entryPrefix + key,\n leasePrefix + key,\n tagPrefix,\n key,\n );\n\n return deleted === 1;\n },\n async get(key) {\n const raw = await client.get(entryPrefix + key);\n // TYPE-EVIDENCE: the stored raw value is JSON that the store serialized from a cache entry. The cast restores that shape.\n return raw ? (JSON.parse(raw) as CacheStoreEntry) : undefined;\n },\n async invalidateTags(tags) {\n if (tags.length === 0) {\n return 0;\n }\n\n return await client.demiurgeCacheInvalidateTags(\n JSON.stringify(tags),\n tagPrefix,\n entryPrefix,\n leasePrefix,\n );\n },\n async publishRefresh(key, token, entry) {\n const result = await client.demiurgeCachePublishRefresh(\n entryPrefix + key,\n leasePrefix + key,\n token,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n\n return result === 1;\n },\n async releaseRefreshLease(key, token) {\n await client.demiurgeCacheReleaseRefreshLease(leasePrefix + key, token);\n },\n async set(key, entry) {\n await client.demiurgeCacheSet(\n entryPrefix + key,\n leasePrefix + key,\n JSON.stringify(entry),\n entry.staleUntil === null ? \"\" : String(entry.staleUntil),\n tagPrefix,\n key,\n );\n },\n };\n}\n","import type { Redis } from \"ioredis\";\nimport type { RateLimitResult, RateLimitStore } from \"../security/types\";\n\nexport type RedisRateLimitStoreOptions = {\n // Every consumer of one Redis database shares one keyspace. This prefix\n // scopes the store's counter keys away from an application's other Redis\n // use, the same way RedisCacheStoreOptions.keyPrefix does for the cache\n // store. Two Demiurge deployments that share a database still need\n // distinct prefixes.\n keyPrefix?: string;\n // The store issues commands on a client the application already\n // constructed and connected. Connection options, TLS, Sentinel, and retry\n // policy are the application's decision, not this store's.\n client: Redis;\n};\n\nconst defaultKeyPrefix = \"demiurge:ratelimit:\";\n\n// KEYS[1] counter key. ARGV[1] window in ms.\n//\n// INCR and PEXPIRE run inside one script. Redis executes the whole script\n// as a single atomic step, so two instances racing to increment the same\n// key never both observe count 1. The window's reset time comes from\n// Redis's own clock (TIME), not the caller-supplied `now`. The counter's\n// TTL is authoritative once several processes share it, and a\n// client-supplied timestamp could disagree with the server that expires the\n// key. TIME is deterministic across replication because Redis rewrites the\n// script's effects rather than replaying non-deterministic commands.\nconst incrementScript = `\nlocal count = redis.call(\"INCR\", KEYS[1])\nif count == 1 then\n redis.call(\"PEXPIRE\", KEYS[1], ARGV[1])\nend\nlocal ttl = redis.call(\"PTTL\", KEYS[1])\nif ttl < 0 then\n redis.call(\"PEXPIRE\", KEYS[1], ARGV[1])\n ttl = tonumber(ARGV[1])\nend\nlocal time = redis.call(\"TIME\")\nlocal nowMs = math.floor(tonumber(time[1]) * 1000 + tonumber(time[2]) / 1000)\nreturn { count, nowMs + ttl }\n`;\n\ntype RedisRateLimitCommands = {\n demiurgeRateLimitIncrement: (\n counterKey: string,\n windowMs: string,\n ) => Promise<[number, number]>;\n};\n\n// The application already owns one ioredis client. Attaching the store's\n// command is idempotent, so building several stores on the same client, or\n// rebuilding one after a reconnect, never redefines the command twice.\nfunction commands(client: Redis): Redis & RedisRateLimitCommands {\n // TYPE-EVIDENCE: the cast adds the optional custom command methods before the runtime check installs them.\n const withCommands = client as Redis & Partial<RedisRateLimitCommands>;\n\n if (!withCommands.demiurgeRateLimitIncrement) {\n client.defineCommand(\"demiurgeRateLimitIncrement\", {\n lua: incrementScript,\n numberOfKeys: 1,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand call above installs the custom command. The cast reflects that the method now exists.\n return withCommands as Redis & RedisRateLimitCommands;\n}\n\nexport function createRedisRateLimitStore(\n options: RedisRateLimitStoreOptions,\n): RateLimitStore {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis rate limit store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const prefix = options.keyPrefix ?? defaultKeyPrefix;\n\n return {\n async increment(key, windowMs): Promise<RateLimitResult> {\n const [count, resetAt] = await client.demiurgeRateLimitIncrement(\n prefix + key,\n String(windowMs),\n );\n\n return { count, resetAt };\n },\n };\n}\n","import type { Redis } from \"ioredis\";\nimport {\n parseSessionRecord,\n serializeSessionNamespace,\n type SessionData,\n type SessionNamespace,\n type SessionRecord,\n type SessionStore,\n type SessionStoreCandidate,\n} from \"../security/session-store\";\n\nexport type RedisSessionStoreOptions = {\n client: Redis;\n keyPrefix?: string;\n namespace: SessionNamespace;\n};\n\nconst defaultKeyPrefix = \"demiurge:session:\";\n\nconst createScript = `\nif redis.call(\"EXISTS\", KEYS[1]) == 1 then\n return 0\nend\nredis.call(\"SET\", KEYS[1], ARGV[1], \"PXAT\", ARGV[2])\nreturn 1\n`;\n\nconst updateScript = `\nlocal current = redis.call(\"GET\", KEYS[1])\nif not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then\n return 0\nend\nredis.call(\"SET\", KEYS[1], ARGV[2], \"PXAT\", ARGV[3])\nreturn 1\n`;\n\nconst rotateScript = `\nlocal current = redis.call(\"GET\", KEYS[1])\nif not current or cjson.decode(current).version ~= tonumber(ARGV[1]) then\n return 0\nend\nif KEYS[1] ~= KEYS[2] and redis.call(\"EXISTS\", KEYS[2]) == 1 then\n return 0\nend\nredis.call(\"DEL\", KEYS[1])\nredis.call(\"SET\", KEYS[2], ARGV[2], \"PXAT\", ARGV[3])\nreturn 1\n`;\n\ntype RedisSessionCommands = {\n demiurgeSessionCreate: (\n key: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n demiurgeSessionRotate: (\n currentKey: string,\n nextKey: string,\n expectedVersion: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n demiurgeSessionUpdate: (\n key: string,\n expectedVersion: string,\n record: string,\n expiresAt: string,\n ) => Promise<number>;\n};\n\nfunction commands(client: Redis): Redis & RedisSessionCommands {\n // TYPE-EVIDENCE: the cast adds optional custom commands before the runtime checks install them.\n const withCommands = client as Redis & Partial<RedisSessionCommands>;\n\n if (!withCommands.demiurgeSessionCreate) {\n client.defineCommand(\"demiurgeSessionCreate\", {\n lua: createScript,\n numberOfKeys: 1,\n });\n }\n\n if (!withCommands.demiurgeSessionUpdate) {\n client.defineCommand(\"demiurgeSessionUpdate\", {\n lua: updateScript,\n numberOfKeys: 1,\n });\n }\n\n if (!withCommands.demiurgeSessionRotate) {\n client.defineCommand(\"demiurgeSessionRotate\", {\n lua: rotateScript,\n numberOfKeys: 2,\n });\n }\n\n // TYPE-EVIDENCE: the defineCommand calls install each command. The cast reflects the resulting client shape.\n return withCommands as Redis & RedisSessionCommands;\n}\n\nexport function createRedisSessionStore<\n TData extends SessionData = SessionData,\n>(options: RedisSessionStoreOptions): SessionStore<TData> {\n if (!options.client || typeof options.client.defineCommand !== \"function\") {\n throw new Error(\n \"Demiurge Redis session store requires an ioredis client. Pass a connected ioredis Redis instance as `client`.\",\n );\n }\n\n const client = commands(options.client);\n const namespace = serializeSessionNamespace(options.namespace);\n const prefix = `${options.keyPrefix ?? defaultKeyPrefix}${namespace}:`;\n const key = (id: string) => prefix + id;\n\n return {\n async create(candidate) {\n const record = toRecord(candidate, 0);\n\n try {\n const stored = await client.demiurgeSessionCreate(\n key(record.id),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async destroy(id) {\n return await client.del(key(id)) === 1;\n },\n async read(id, now) {\n const raw = await client.get(key(id));\n\n if (!raw) {\n return undefined;\n }\n\n const record = parseRecord<TData>(raw);\n\n if (!record) {\n return undefined;\n }\n\n if (storeExpiration(record) <= now) {\n await client.del(key(id));\n return undefined;\n }\n\n return record;\n },\n async rotate(currentId, candidate, expectedVersion) {\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await client.demiurgeSessionRotate(\n key(currentId),\n key(record.id),\n String(expectedVersion),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n async update(candidate, expectedVersion) {\n const record = toRecord(candidate, expectedVersion + 1);\n\n try {\n const stored = await client.demiurgeSessionUpdate(\n key(record.id),\n String(expectedVersion),\n JSON.stringify(record),\n String(storeExpiration(record)),\n );\n return stored === 1\n ? { record, status: \"stored\" }\n : { status: \"conflict\" };\n } catch {\n return { status: \"unavailable\" };\n }\n },\n };\n}\n\nfunction parseRecord<TData extends SessionData>(\n raw: string,\n): SessionRecord<TData> | undefined {\n try {\n return parseSessionRecord<TData>(JSON.parse(raw));\n } catch {\n return undefined;\n }\n}\n\nfunction toRecord<TData extends SessionData>(\n candidate: SessionStoreCandidate<TData>,\n version: number,\n): SessionRecord<TData> {\n return structuredClone({ ...candidate, version });\n}\n\nfunction storeExpiration(record: SessionRecord) {\n return Math.min(record.expiresAt, record.idleExpiresAt ?? record.expiresAt);\n}\n"],"names":["defaultKeyPrefix","setScript","deleteScript","invalidateTagsScript","publishRefreshScript","releaseRefreshLeaseScript","commands","client","withCommands","createRedisCacheStore","options","prefix","entryPrefix","tagPrefix","leasePrefix","key","token","expiresAt","raw","tags","entry","incrementScript","createRedisRateLimitStore","windowMs","count","resetAt","createScript","updateScript","rotateScript","createRedisSessionStore","namespace","serializeSessionNamespace","id","candidate","record","toRecord","storeExpiration","now","parseRecord","currentId","expectedVersion","parseSessionRecord","version"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/redis/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG;IAKnC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC;AA4MF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,UAAU,CAkFZ"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/redis/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG;IAKnC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC;AA4MF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,UAAU,CAmFZ"}
@@ -1,6 +1,7 @@
1
1
  export { mutation, mutationInput, MutationValidationError, MUTATION_REQUEST_HEADER, MUTATION_REQUEST_VALUE, MUTATION_RESPONSE_MEDIA_TYPE, } from "./mutation";
2
2
  export { page } from "./page";
3
3
  export { defineMiddleware } from "./middleware";
4
+ export { assertSerializableValue, RouteSerializationError, } from "./serialization";
4
5
  export { HTTP_ERROR_STATUSES, HttpError, httpError, isHttpError, } from "./http-error";
5
6
  export { html, json, jsonl, notFound, redirect, response, serverTiming, sse, stream, text, toResponse, } from "./response";
6
7
  export { webhook } from "./webhook";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,+BAA+B,EAC/B,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,aAAa,EACb,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,+BAA+B,EAC/B,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC1B,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/route/mutation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,CAAC,MAAM,mBAAmB,EAAE,OAAO,MAAM,CAAC;AAEjD,MAAM,MAAM,aAAa,CACvB,MAAM,EACN,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IACpD;IACF,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;CACnE,CAAC;AAEF,KAAK,kBAAkB,CACrB,MAAM,EACN,KAAK,SAAS,MAAM,EACpB,OAAO,SAAS,MAAM,EACtB,MAAM,SAAS,MAAM,IACnB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG;IAC1C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE,CAAC;AAEF,KAAK,kBAAkB,CAAC,OAAO,IAAI,OAAO,SAAS;IACjD,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,MAAM,CAAA;KAAE,CAAC;CACzD,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnB,KAAK,kBAAkB,CAAC,OAAO,IAAI,OAAO,SAAS;IACjD,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,MAAM,SAAS,MAAM,CAAA;KAAE,CAAC;CACxE,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnB,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAC7D,eAAO,MAAM,sBAAsB,aAAa,CAAC;AACjD,eAAO,MAAM,4BAA4B,+CAA+C,CAAC;AAEzF,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,MAAM,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjE,MAAM,MAAM,kBAAkB,CAC5B,OAAO,GAAG,OAAO,EACjB,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IACpD,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG;IAC1C,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE;QAC7B,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI;KACtC,OAAO,IAAI,MAAM,OAAO,IACvB,OAAO,SAAS,cAAc,GAC1B,OAAO,CAAC,OAAO,CAAC,SAAS,kBAAkB,GAAG,OAAO,GAAG,KAAK,GAC7D,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,MAAM,OAAO,CAAC,GAChE,OAAO,CAAC,OAAO,CAAC,SAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,GAChE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACjC,KAAK,GACP,KAAK;CACd,CAAC;AAEF,KAAK,oBAAoB,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,SACnD,cAAc,CAAC,MAAM,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC;AAEhE,MAAM,MAAM,uBAAuB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IAC/D,MAAM,EAAE,SAAS,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;CACpD,CAAC;AAEF,qBAAa,uBAAuB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,CACjE,SAAQ,KAAK;IACb,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAEpC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC;CAUnD;AAED,MAAM,MAAM,eAAe,CACzB,MAAM,EACN,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IACpD,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAC7B,MAAM,EACN,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IACpD;IACF,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IACjF,KAAK,EAAE,gBAAgB,CAAC;IACxB,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAC9B,MAAM,EACN,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAEpD,+BAA+B,GAC/B,CAAC,CACD,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAC7C,YAAY,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAEtD,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,4BAA4B,+BAA+B,CAAC;AAEzE,MAAM,MAAM,eAAe,CACzB,MAAM,EACN,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,EACtD,OAAO,SAAS,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,GAC3D,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,IAC7C;IACF,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,CACP,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KACtD,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3B,WAAW,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACnE,KAAK,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACnE,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAEF,wBAAgB,QAAQ,CACtB,OAAO,SAAS,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EACnE,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,EACtD,OAAO,SAAS,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,GAC3D,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,EAE/C,OAAO,EAAE,IAAI,CAAC,eAAe,CAC3B,kBAAkB,CAAC,OAAO,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,OAAO,CACR,EAAE,OAAO,CAAC,GAAG;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB,GACA,kBAAkB,CACnB,oBAAoB,CAAC,OAAO,CAAC,EAC7B,kBAAkB,CAAC,OAAO,CAAC,EAC3B,KAAK,EACL,OAAO,CACR,CAAC;AAEF,wBAAgB,QAAQ,CACtB,MAAM,EACN,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,EACtD,OAAO,SAAS,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,GAC3D,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,EAE/C,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG;IAC1D,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;CAC9C,GACA,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAE7E,wBAAgB,QAAQ,CACtB,KAAK,SAAS,MAAM,GAAG,MAAM,EAC7B,OAAO,SAAS,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,EACtD,OAAO,SAAS,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,GAC3D,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,EAE/C,OAAO,EAAE,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG;IAC7D,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,GACA,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAkQ7E,eAAO,MAAM,aAAa;WAEtB,MAAM,SAAS,MAAM,WACrB,MAAM,YACN,KAAK,SAAS,MAAM,WACpB,OAAO,SAAS,MAAM,yCAEf,CACL,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,KACtC,YAAY,CAAC,MAAM,CAAC,GACxB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;SAKnD,OAAO,SAAS,gBAAgB,EAChC,KAAK,SAAS,MAAM,WACpB,OAAO,SAAS,MAAM,0CAEd,OAAO,OACV,CACH,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,KACtC,YAAY,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GACtD,kBAAkB,CACnB,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,EACrC,KAAK,EACL,OAAO,EACP,OAAO,CAAC,MAAM,gBAAgB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAC7D;0BAwB2B,gBAAgB;sBAGpB,gBAAgB;sBAIhB,gBAAgB;CAGzC,CAAC"}
1
+ {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../../src/route/mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The error that the framework reports for a browser payload that it cannot
3
+ * serialize.
4
+ *
5
+ * The message names the route and the field path. The message does not
6
+ * contain the value.
7
+ */
8
+ export declare class RouteSerializationError extends Error {
9
+ readonly field?: string;
10
+ readonly route: string;
11
+ constructor(message: string, route: string, field?: string);
12
+ }
13
+ /**
14
+ * Proves that the framework can serialize a page route browser payload.
15
+ *
16
+ * The return value of a page `data` function is the browser payload. This
17
+ * check names the value that `JSON.stringify` cannot represent. It checks a
18
+ * `toJSON` result, a circular reference, and a `bigint` value. It does not
19
+ * add a check for a value that
20
+ * `JSON.stringify` already accepts or silently drops, such as `undefined`,
21
+ * a function, a symbol key, or a non-finite number.
22
+ */
23
+ export declare function assertSerializableValue(value: unknown, route: string, path?: readonly string[], seen?: Set<object>, applyToJSON?: boolean): void;
24
+ //# sourceMappingURL=serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/route/serialization.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAM3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,IAAI,cAAoB,EACxB,WAAW,UAAO,GACjB,IAAI,CA8DN"}
@@ -18,7 +18,12 @@ export declare const webhook: {
18
18
  kind: "response";
19
19
  response: (context: HttpRouteContext<string, Record<never, never>>) => Promise<Response>;
20
20
  security: {
21
- csrf: false;
21
+ csrf: {
22
+ origin: "framework";
23
+ reason: string;
24
+ source: string;
25
+ value: false;
26
+ };
22
27
  };
23
28
  };
24
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/route/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;kBACJ,kBAAkB;;;;;;;CAgCjC,CAAC"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/route/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG;IAClD,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,OAAO;kBACJ,kBAAkB;;;;;;;;;;;;CAyCjC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import type { HttpMethod } from "../route/types";
2
2
  import type { ScriptTag } from "../document/scripts";
3
- import type { CorsPolicy, RouteSecurityPolicy, ScriptDependencyAuditOptions, SecurityAuditFinding, SecurityAuditOptions } from "./types";
3
+ import type { CorsPolicy, ResolvedRouteAccess, RouteSecurityPolicy, ScriptDependencyAuditOptions, SecurityAuditFinding, SecurityAuditOptions } from "./types";
4
4
  export declare function createSecurityAudit(options?: SecurityAuditOptions): {
5
5
  findings: SecurityAuditFinding[];
6
6
  headers: {
7
7
  [k: string]: string;
8
8
  };
9
9
  route: {
10
+ access: ResolvedRouteAccess | undefined;
10
11
  cors: CorsPolicy | undefined;
11
12
  method: HttpMethod;
12
13
  security: RouteSecurityPolicy | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/security/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAEV,UAAU,EAEV,mBAAmB,EACnB,4BAA4B,EAE5B,oBAAoB,EACpB,oBAAoB,EAGrB,MAAM,SAAS,CAAC;AAIjB,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB;;;;;;;;;;EAqCrE;AA2BD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,OAAO,GAAE,4BAAiC,0BAkD3C"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/security/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAWrD,OAAO,KAAK,EAGV,UAAU,EAEV,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAE5B,oBAAoB,EACpB,oBAAoB,EAGrB,MAAM,SAAS,CAAC;AAIjB,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB;;;;;;;;;;;EAsCrE;AA2ED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,OAAO,GAAE,4BAAiC,0BAkD3C"}
@@ -0,0 +1,36 @@
1
+ import type { HttpRouteContext, MaybePromise } from "../route/types";
2
+ import type { AuthorizationDecision, ResolvedRouteAccess, RouteAccessPolicy, RouteAccessSource, RouteAuthorizationHook } from "./types";
3
+ /**
4
+ * Declares an authorization hook with the request context values that
5
+ * inherited middleware supplies.
6
+ */
7
+ export declare function defineAuthorization<TValues extends object = Record<never, never>>(hook: (context: HttpRouteContext<string, TValues>) => MaybePromise<AuthorizationDecision>): RouteAuthorizationHook;
8
+ /**
9
+ * Reads the access declarations of one cascade, from the root of the route
10
+ * tree to the route file.
11
+ *
12
+ * A declaration adds a restriction. The framework keeps each inherited hook,
13
+ * because a child must not weaken an ancestor. Only an explicit exception
14
+ * removes the inherited hooks.
15
+ */
16
+ export declare function resolveRouteAccess(sources: readonly RouteAccessSource[]): ResolvedRouteAccess;
17
+ /**
18
+ * Merges the access declarations that `mergeRoutePolicies` receives.
19
+ */
20
+ export declare function mergeRouteAccess(policies: readonly (RouteAccessPolicy | undefined)[]): ResolvedRouteAccess;
21
+ /**
22
+ * Runs each inherited authorization hook, from the root of the subtree to the
23
+ * route. The function returns a denial response. It returns `null` when every
24
+ * hook permits the request.
25
+ *
26
+ * The framework runs this check before a protected data loader, before a read
27
+ * of a protected cache entry, before a render, and before the effect of a
28
+ * mutation.
29
+ */
30
+ export declare function authorizeRoute(access: ResolvedRouteAccess, context: HttpRouteContext<string, object>): Promise<Response | null>;
31
+ /**
32
+ * Reports if one decision permits the request. Each value other than `true`
33
+ * and `{ allow: true }` denies the request.
34
+ */
35
+ export declare function permitsRequest(decision: unknown): boolean;
36
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/security/authorization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,KAAK,EACV,qBAAqB,EAErB,mBAAmB,EAEnB,iBAAiB,EACjB,iBAAiB,EAEjB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAIjB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAE7C,IAAI,EAAE,CACJ,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,KACvC,YAAY,CAAC,qBAAqB,CAAC,GACvC,sBAAsB,CAGxB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GACpC,mBAAmB,CAyCrB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,CAAC,iBAAiB,GAAG,SAAS,CAAC,EAAE,GACnD,mBAAmB,CAErB;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA2B1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,WAM/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/security/csrf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,eAAe,WAQ9B;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,UAuBhC;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,iBAAsB,GAAG,eAAe,CAO/E;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,4BAyCjB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,uBAuBtD"}
1
+ {"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/security/csrf.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,SAAS,CAAC;AAK7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,eAAe,WAQ9B;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,iBAAsB,UAuBhC;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,iBAAsB,GAAG,eAAe,CAO/E;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,EAAE,OAAO,4BA2CjB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,uBAuBtD"}
@@ -1,11 +1,9 @@
1
1
  import { type EnvSchema, type EnvSchemaDescriptor, type EnvSource, type InferEnvSchema } from "./env";
2
2
  export type EnvStartupOptions = {
3
3
  source?: EnvSource;
4
- warn?: (message: string) => void;
5
4
  };
6
5
  export type EnvStartupResult = {
7
6
  values: Record<string, unknown>;
8
- warnings: string[];
9
7
  };
10
8
  export declare function serializeEnvSchema(schema: EnvSchema): EnvSchemaDescriptor;
11
9
  export declare function deserializeEnvSchema(descriptor: EnvSchemaDescriptor): EnvSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"env-startup.d.ts","sourceRoot":"","sources":["../../src/security/env-startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAId,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAWzE;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,mBAAmB,GAC9B,SAAS,CAOX;AAID,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,GAAG,mBAAmB,EACvC,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA0ClB;AAID,wBAAgB,OAAO,CAAC,MAAM,SAAS,SAAS,EAC9C,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,MAAM,CAAC,CAcxB;AAED,wBAAgB,gBAAgB,SAE/B"}
1
+ {"version":3,"file":"env-startup.d.ts","sourceRoot":"","sources":["../../src/security/env-startup.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAId,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC;AAsCF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAWzE;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,mBAAmB,GAC9B,SAAS,CAOX;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,GAAG,mBAAmB,EACvC,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA4ClB;AAKD,wBAAgB,OAAO,CAAC,MAAM,SAAS,SAAS,EAC9C,MAAM,EAAE,MAAM,GACb,cAAc,CAAC,MAAM,CAAC,CAmBxB;AAED,wBAAgB,gBAAgB,SAG/B"}
@@ -11,7 +11,7 @@ export declare class EnvValidationError extends Error {
11
11
  export type EnvVariableKind = "boolean" | "enum" | "integer" | "secret" | "string" | "url";
12
12
  export type EnvVariableDescriptor = {
13
13
  client: boolean;
14
- critical: boolean;
14
+ deferred: boolean;
15
15
  kind: EnvVariableKind;
16
16
  optional: boolean;
17
17
  options: Record<string, unknown>;
@@ -28,32 +28,47 @@ export type InferEnvSchema<Schema extends EnvSchema> = {
28
28
  };
29
29
  type SharedEnvVariableOptions = {
30
30
  client?: boolean;
31
- critical?: boolean;
32
31
  };
33
32
  type RequiredEnvVariableOptions = SharedEnvVariableOptions & {
33
+ deferred?: false;
34
34
  optional?: false;
35
35
  };
36
36
  type OptionalEnvVariableOptions = SharedEnvVariableOptions & {
37
+ deferred?: false;
37
38
  optional: true;
38
39
  };
40
+ type DeferredEnvVariableOptions = {
41
+ client?: never;
42
+ deferred: true;
43
+ optional?: false;
44
+ };
39
45
  type RequiredStringEnvOptions = RequiredEnvVariableOptions & {
40
46
  minLength?: number;
41
47
  };
42
48
  type OptionalStringEnvOptions = OptionalEnvVariableOptions & {
43
49
  minLength?: number;
44
50
  };
51
+ type DeferredStringEnvOptions = DeferredEnvVariableOptions & {
52
+ minLength?: number;
53
+ };
45
54
  type RequiredSecretEnvOptions = RequiredStringEnvOptions & {
46
55
  client?: never;
47
56
  };
48
57
  type OptionalSecretEnvOptions = OptionalStringEnvOptions & {
49
58
  client?: never;
50
59
  };
60
+ type DeferredSecretEnvOptions = DeferredStringEnvOptions & {
61
+ client?: never;
62
+ };
51
63
  type RequiredUrlEnvOptions = RequiredEnvVariableOptions & {
52
64
  protocols?: readonly string[];
53
65
  };
54
66
  type OptionalUrlEnvOptions = OptionalEnvVariableOptions & {
55
67
  protocols?: readonly string[];
56
68
  };
69
+ type DeferredUrlEnvOptions = DeferredEnvVariableOptions & {
70
+ protocols?: readonly string[];
71
+ };
57
72
  type RequiredIntegerEnvOptions = RequiredEnvVariableOptions & {
58
73
  max?: number;
59
74
  min?: number;
@@ -62,20 +77,24 @@ type OptionalIntegerEnvOptions = OptionalEnvVariableOptions & {
62
77
  max?: number;
63
78
  min?: number;
64
79
  };
80
+ type DeferredIntegerEnvOptions = DeferredEnvVariableOptions & {
81
+ max?: number;
82
+ min?: number;
83
+ };
65
84
  export declare function defineEnvSchema<Schema extends EnvSchema>(schema: Schema): Schema;
66
85
  export declare function validateEnv<Schema extends EnvSchema>(schema: Schema, source: EnvSource): InferEnvSchema<Schema>;
67
86
  declare function booleanEnv(options: OptionalEnvVariableOptions): EnvVariable<boolean, true>;
68
- declare function booleanEnv(options?: RequiredEnvVariableOptions): EnvVariable<boolean, false>;
87
+ declare function booleanEnv(options?: RequiredEnvVariableOptions | DeferredEnvVariableOptions): EnvVariable<boolean, false>;
69
88
  declare function enumEnv<const Values extends readonly [string, ...string[]]>(values: Values, options: OptionalEnvVariableOptions): EnvVariable<Values[number], true>;
70
- declare function enumEnv<const Values extends readonly [string, ...string[]]>(values: Values, options?: RequiredEnvVariableOptions): EnvVariable<Values[number], false>;
89
+ declare function enumEnv<const Values extends readonly [string, ...string[]]>(values: Values, options?: RequiredEnvVariableOptions | DeferredEnvVariableOptions): EnvVariable<Values[number], false>;
71
90
  declare function integerEnv(options: OptionalIntegerEnvOptions): EnvVariable<number, true>;
72
- declare function integerEnv(options?: RequiredIntegerEnvOptions): EnvVariable<number, false>;
91
+ declare function integerEnv(options?: RequiredIntegerEnvOptions | DeferredIntegerEnvOptions): EnvVariable<number, false>;
73
92
  declare function secretEnv(options: OptionalSecretEnvOptions): EnvVariable<string, true>;
74
- declare function secretEnv(options?: RequiredSecretEnvOptions): EnvVariable<string, false>;
93
+ declare function secretEnv(options?: RequiredSecretEnvOptions | DeferredSecretEnvOptions): EnvVariable<string, false>;
75
94
  declare function stringEnv(options: OptionalStringEnvOptions): EnvVariable<string, true>;
76
- declare function stringEnv(options?: RequiredStringEnvOptions): EnvVariable<string, false>;
95
+ declare function stringEnv(options?: RequiredStringEnvOptions | DeferredStringEnvOptions): EnvVariable<string, false>;
77
96
  declare function urlEnv(options: OptionalUrlEnvOptions): EnvVariable<URL, true>;
78
- declare function urlEnv(options?: RequiredUrlEnvOptions): EnvVariable<URL, false>;
97
+ declare function urlEnv(options?: RequiredUrlEnvOptions | DeferredUrlEnvOptions): EnvVariable<URL, false>;
79
98
  export declare const env: {
80
99
  boolean: typeof booleanEnv;
81
100
  enum: typeof enumEnv;
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/security/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/security/env.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAEjB,MAAM,EAAE,kBAAkB,EAAE;CAKzC;AAED,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,MAAM,GACN,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,KAAK,CAAC;AAKV,MAAM,MAAM,qBAAqB,GAAG;IAGlC,MAAM,EAAE,OAAO,CAAC;IAIhB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAExE,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,QAAQ,SAAS,OAAO,GAAG,KAAK,IACvD,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC,GACvC;IACA,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC;CAC1C,CAAC;AAEJ,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEtE,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,SAAS,IAAI;KACpD,GAAG,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,WAAW,CAAC,MAAM,KAAK,EAAE,MAAM,QAAQ,CAAC,GAC/E,QAAQ,SAAS,IAAI,GACnB,KAAK,GAAG,SAAS,GACjB,KAAK,GACP,KAAK;CACV,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAG9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,KAAK,0BAA0B,GAAG,wBAAwB,GAAG;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAIF,KAAK,0BAA0B,GAAG,wBAAwB,GAAG;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,QAAQ,EAAE,IAAI,CAAC;CAChB,CAAC;AAKF,KAAK,0BAA0B,GAAG;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAOF,KAAK,wBAAwB,GAAG,0BAA0B,GAAG;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,wBAAwB,GAAG,0BAA0B,GAAG;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,wBAAwB,GAAG,0BAA0B,GAAG;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AASF,KAAK,wBAAwB,GAAG,wBAAwB,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE9E,KAAK,wBAAwB,GAAG,wBAAwB,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE9E,KAAK,wBAAwB,GAAG,wBAAwB,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAO9E,KAAK,qBAAqB,GAAG,0BAA0B,GAAG;IACxD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,qBAAqB,GAAG,0BAA0B,GAAG;IACxD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,qBAAqB,GAAG,0BAA0B,GAAG;IACxD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAOF,KAAK,yBAAyB,GAAG,0BAA0B,GAAG;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,yBAAyB,GAAG,0BAA0B,GAAG;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,yBAAyB,GAAG,0BAA0B,GAAG;IAC5D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAOF,wBAAgB,eAAe,CAAC,MAAM,SAAS,SAAS,EAAE,MAAM,EAAE,MAAM,UAEvE;AAED,wBAAgB,WAAW,CAAC,MAAM,SAAS,SAAS,EAClD,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAChB,cAAc,CAAC,MAAM,CAAC,CA0CxB;AAED,iBAAS,UAAU,CAAC,OAAO,EAAE,0BAA0B,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACrF,iBAAS,UAAU,CACjB,OAAO,CAAC,EAAE,0BAA0B,GAAG,0BAA0B,GAChE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAe/B,iBAAS,OAAO,CAAC,KAAK,CAAC,MAAM,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAClE,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,0BAA0B,GAClC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,iBAAS,OAAO,CAAC,KAAK,CAAC,MAAM,SAAS,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,EAClE,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,0BAA0B,GAAG,0BAA0B,GAChE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAgBtC,iBAAS,UAAU,CAAC,OAAO,EAAE,yBAAyB,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACnF,iBAAS,UAAU,CACjB,OAAO,CAAC,EAAE,yBAAyB,GAAG,yBAAyB,GAC9D,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AA6B9B,iBAAS,SAAS,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjF,iBAAS,SAAS,CAChB,OAAO,CAAC,EAAE,wBAAwB,GAAG,wBAAwB,GAC5D,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAU9B,iBAAS,SAAS,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjF,iBAAS,SAAS,CAChB,OAAO,CAAC,EAAE,wBAAwB,GAAG,wBAAwB,GAC5D,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAU9B,iBAAS,MAAM,CAAC,OAAO,EAAE,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxE,iBAAS,MAAM,CACb,OAAO,CAAC,EAAE,qBAAqB,GAAG,qBAAqB,GACtD,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAwB3B,eAAO,MAAM,GAAG;;;;;;;CAOf,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { BodySizeException, BodySizeValue, ContentSecurityPolicy, CspException, CsrfException, CsrfPolicy, CsrfPolicyOptions, RequestSecurityPolicy, RoutePolicy, SecurityException, SecurityPolicy } from "./types";
2
+ /**
3
+ * Reports if a declaration is a typed security exception.
4
+ *
5
+ * An exception carries a `reason` and a `value`. No policy object of the
6
+ * framework uses both names, so the two fields identify the shape.
7
+ */
8
+ export declare function isSecurityException(value: unknown): value is SecurityException<unknown>;
9
+ /** Returns the Content-Security-Policy that a document declaration selects. */
10
+ export declare function resolveCsp(csp: SecurityPolicy["csp"]): ContentSecurityPolicy | false | undefined;
11
+ /** Returns the exception of a document declaration, or `undefined`. */
12
+ export declare function getCspException(csp: SecurityPolicy["csp"]): CspException | undefined;
13
+ /** Returns the CSRF policy that a route declaration selects. */
14
+ export declare function resolveCsrf(csrf: CsrfPolicy | undefined): true | false | CsrfPolicyOptions | undefined;
15
+ /** Returns the exception of a CSRF declaration, or `undefined`. */
16
+ export declare function getCsrfException(csrf: CsrfPolicy | undefined): CsrfException | undefined;
17
+ /** Returns the request body limit that a route declaration selects. */
18
+ export declare function resolveMaxBodySize(maxBodySize: RequestSecurityPolicy["maxBodySize"]): BodySizeValue | undefined;
19
+ /** Returns the exception of a body limit declaration, or `undefined`. */
20
+ export declare function getBodySizeException(maxBodySize: RequestSecurityPolicy["maxBodySize"]): BodySizeException | undefined;
21
+ /**
22
+ * Adds the declaring file to each exception of one policy file.
23
+ *
24
+ * The framework merges the policy cascade into one policy, and the merge
25
+ * keeps no file name. This function stamps the file before the merge, so the
26
+ * audit can report the source of each exception.
27
+ */
28
+ export declare function attachExceptionSource(policy: RoutePolicy | undefined, source: string | undefined): RoutePolicy | undefined;
29
+ //# sourceMappingURL=exceptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../src/security/exceptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,iBAAiB,EACjB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAMrC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GACzB,qBAAqB,GAAG,KAAK,GAAG,SAAS,CAM3C;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GACzB,YAAY,GAAG,SAAS,CAG1B;AAED,gEAAgE;AAChE,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAC3B,IAAI,GAAG,KAAK,GAAG,iBAAiB,GAAG,SAAS,CAM9C;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,GAAG,SAAS,GAC3B,aAAa,GAAG,SAAS,CAG3B;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,qBAAqB,CAAC,aAAa,CAAC,GAChD,aAAa,GAAG,SAAS,CAO3B;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,qBAAqB,CAAC,aAAa,CAAC,GAChD,iBAAiB,GAAG,SAAS,CAK/B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,WAAW,GAAG,SAAS,CAazB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * The diagnostic code vocabulary of Demiurge.
3
+ *
4
+ * ADR 0018 gives the build verifier and the runtime audit one vocabulary. A
5
+ * code names one condition. The build verifier reports a subset of the codes,
6
+ * because the build cannot read a value that only a request supplies.
7
+ */
8
+ export type SecurityFindingCode =
9
+ /** The route inherits no access declaration. */
10
+ "access-declaration-missing"
11
+ /** The route runs each inherited authorization hook. */
12
+ | "access-authorized"
13
+ /** An access exception removed each inherited authorization hook. */
14
+ | "access-exception"
15
+ /** The route declares public access. */
16
+ | "access-public"
17
+ /** The CORS policy is invalid. */
18
+ | "cors-invalid"
19
+ /** The CORS policy names a method that the route does not serve. */
20
+ | "cors-method-unavailable"
21
+ /** The document accepts no Content-Security-Policy. */
22
+ | "csp-disabled"
23
+ /** A document script needs a nonce for the effective script-src policy. */
24
+ | "csp-script-missing-nonce"
25
+ /** The effective script-src policy blocks a document script. */
26
+ | "csp-script-src-blocked"
27
+ /** The route accepts no CSRF check for an unsafe method. */
28
+ | "csrf-disabled"
29
+ /** The route inherits no document policy. */
30
+ | "document-policy-missing"
31
+ /** The rate limit policy is invalid. */
32
+ | "rate-limit-invalid"
33
+ /** The unsafe route declares no rate limit. */
34
+ | "rate-limit-missing"
35
+ /** Trusted Types report-only mode has no deliverable target. */
36
+ | "report-only-target-missing"
37
+ /** The route raises the inherited request body limit. */
38
+ | "request-body-limit-raised"
39
+ /** Google Tag Manager is a wide trust boundary. */
40
+ | "script-gtm-wide-trust-boundary"
41
+ /** A third-party script declares no integrity hash. */
42
+ | "script-integrity-missing"
43
+ /** A third-party script declares no purpose. */
44
+ | "script-purpose-missing"
45
+ /** A third-party script runs before the application is interactive. */
46
+ | "script-third-party-before-interactive"
47
+ /** A security exception states no reason. */
48
+ | "security-exception-reason-missing"
49
+ /** The security headers failed to render. */
50
+ | "security-header-render-failed";
51
+ /**
52
+ * The codes that the build verifier reports. Each code is a member of
53
+ * `SecurityFindingCode`.
54
+ */
55
+ export type StaticPolicyFindingCode = Extract<SecurityFindingCode, "access-declaration-missing" | "cors-invalid" | "cors-method-unavailable" | "document-policy-missing" | "rate-limit-invalid" | "security-exception-reason-missing" | "security-header-render-failed">;
56
+ //# sourceMappingURL=finding-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-codes.d.ts","sourceRoot":"","sources":["../../src/security/finding-codes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB;AAC7B,gDAAgD;AAC9C,4BAA4B;AAC9B,wDAAwD;GACtD,mBAAmB;AACrB,qEAAqE;GACnE,kBAAkB;AACpB,wCAAwC;GACtC,eAAe;AACjB,kCAAkC;GAChC,cAAc;AAChB,oEAAoE;GAClE,yBAAyB;AAC3B,uDAAuD;GACrD,cAAc;AAChB,2EAA2E;GACzE,0BAA0B;AAC5B,gEAAgE;GAC9D,wBAAwB;AAC1B,4DAA4D;GAC1D,eAAe;AACjB,6CAA6C;GAC3C,yBAAyB;AAC3B,wCAAwC;GACtC,oBAAoB;AACtB,+CAA+C;GAC7C,oBAAoB;AACtB,gEAAgE;GAC9D,4BAA4B;AAC9B,yDAAyD;GACvD,2BAA2B;AAC7B,mDAAmD;GACjD,gCAAgC;AAClC,uDAAuD;GACrD,0BAA0B;AAC5B,gDAAgD;GAC9C,wBAAwB;AAC1B,uEAAuE;GACrE,uCAAuC;AACzC,6CAA6C;GAC3C,mCAAmC;AACrC,6CAA6C;GAC3C,+BAA+B,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAC3C,mBAAmB,EACjB,4BAA4B,GAC5B,cAAc,GACd,yBAAyB,GACzB,yBAAyB,GACzB,oBAAoB,GACpB,mCAAmC,GACnC,+BAA+B,CAClC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { auditScriptDependencies, createSecurityAudit, } from "./audit";
2
+ export { authorizeRoute, defineAuthorization, mergeRouteAccess, permitsRequest, resolveRouteAccess, } from "./authorization";
2
3
  export { applyCorsHeaders, createCorsHeaders, createCorsPreflightResponse, validateCorsPolicy, } from "./cors";
3
4
  export { createSecureCookie, readSecureCookie, secureCookieName, validateSecureCookie, } from "./cookies";
4
5
  export type { CookieIssue, CookieIssueCode, CookieSameSite, CookieScope, SecureCookieDeclaration, SecureCookieDefinition, } from "./cookies";
@@ -18,12 +19,14 @@ export { createSessionManager, SessionStoreConflictError, SessionStoreUnavailabl
18
19
  export type { ServerSession, SessionManager, SessionManagerOptions, } from "./session-manager";
19
20
  export type { MemorySessionStoreOptions, SessionData, SessionNamespace, SessionPrimitive, SessionRecord, SessionStore, SessionStoreCandidate, SessionStoreWriteResult, } from "./session-store";
20
21
  export { createSecurityReportHandler, } from "./report";
21
- export { enforceAllowedMethods, enforceRequestSecurity, parseBodySize, } from "./request";
22
+ export { DEFAULT_MAX_BODY_SIZE, enforceAllowedMethods, enforceRequestSecurity, parseBodySize, } from "./request";
22
23
  export { validateUploads, } from "./upload";
23
24
  export { validateRouteModules } from "./verification";
24
25
  export type { RouteModuleVerificationOptions } from "./verification";
25
26
  export { checkWebSocketOrigin, enforceWebSocketOrigin, } from "./websocket";
26
- export type { ContentSecurityPolicy, CorsPolicy, CorsRequestContext, CorsResponseOptions, CsrfPolicy, CspHashAlgorithm, CspDirectiveValue, CspDirectiveReplacement, CspSource, CspSourceDirective, FetchMetadataCheck, FetchMetadataDestination, FetchMetadataPolicy, FetchMetadataPolicyOptions, FetchMetadataReason, MemoryRateLimitStoreOptions, RateLimitKey, RateLimitPolicy, RateLimitResult, RateLimitStore, ReferrerPolicy, ReportingEndpointUrl, ReportingEndpoints, SecurityAudit, SecurityAuditFinding, SecurityAuditOptions, ScriptDependencyAuditOptions, RequestSecurityPolicy, RoutePolicy, RouteSecurityNeeds, RouteSecurityPolicy, SecurityHeadersOptions, SecurityHeaderPolicy, SecurityPolicy, SecurityPreset, StrictTransportSecurityPolicy, TrustedTypesPolicy, } from "./types";
27
+ export type { AuthorizationDecision, AuthorizationDenial, AuthorizationDenialStatus, ContentSecurityPolicy, CorsPolicy, CorsRequestContext, CorsResponseOptions, CsrfPolicy, CspHashAlgorithm, CspDirectiveValue, CspDirectiveReplacement, CspSource, CspSourceDirective, FetchMetadataCheck, FetchMetadataDestination, FetchMetadataPolicy, FetchMetadataPolicyOptions, FetchMetadataReason, BodySizeException, BodySizeValue, CspException, CsrfException, CsrfPolicyOptions, MemoryRateLimitStoreOptions, RateLimitKey, RateLimitPolicy, RateLimitResult, RateLimitStore, ReferrerPolicy, ReportingEndpointUrl, ReportingEndpoints, SecurityAudit, SecurityAuditFinding, SecurityException, SecurityExceptionOrigin, SecurityAuditOptions, ScriptDependencyAuditOptions, MergedRoutePolicy, RequestSecurityPolicy, ResolvedRouteAccess, RouteAccessException, RouteAccessPolicy, RouteAccessSource, RouteAuthorizationEntry, RouteAuthorizationHook, RoutePolicy, RouteSecurityNeeds, RouteSecurityPolicy, SecurityHeadersOptions, SecurityHeaderPolicy, SecurityPolicy, SecurityPreset, StrictTransportSecurityPolicy, TrustedTypesPolicy, } from "./types";
28
+ export type { SecurityFindingCode, StaticPolicyFindingCode, } from "./finding-codes";
29
+ export { attachExceptionSource, getBodySizeException, getCspException, getCsrfException, isSecurityException, resolveCsp, resolveCsrf, resolveMaxBodySize, } from "./exceptions";
27
30
  export type { UploadFilePolicy, UploadPolicy, UploadValidationIssue, UploadValidationResult, } from "./upload";
28
31
  export type { EnvSchema, EnvSchemaDescriptor, EnvSource, EnvValidationIssue, EnvVariable, EnvVariableDescriptor, EnvVariableKind, InferEnvSchema, } from "./env";
29
32
  export type { SecurityReportContext, SecurityReportHandlerOptions, SecurityReportPayload, } from "./report";