@opendatalabs/personal-server-ts-core 1.33.7 → 1.34.0

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 (341) hide show
  1. package/dist/additions/budget.d.ts +28 -0
  2. package/dist/additions/budget.d.ts.map +1 -0
  3. package/dist/additions/budget.js +119 -0
  4. package/dist/additions/budget.js.map +1 -0
  5. package/dist/additions/durable.d.ts +64 -0
  6. package/dist/additions/durable.d.ts.map +1 -0
  7. package/dist/additions/durable.js +591 -0
  8. package/dist/additions/durable.js.map +1 -0
  9. package/dist/additions/first-added.d.ts +32 -48
  10. package/dist/additions/first-added.d.ts.map +1 -1
  11. package/dist/additions/first-added.js +68 -123
  12. package/dist/additions/first-added.js.map +1 -1
  13. package/dist/additions/index.d.ts +3 -0
  14. package/dist/additions/index.d.ts.map +1 -1
  15. package/dist/additions/index.js +3 -0
  16. package/dist/additions/index.js.map +1 -1
  17. package/dist/additions/ledger-store.js +1 -1
  18. package/dist/additions/record-rules.d.ts.map +1 -1
  19. package/dist/additions/record-rules.js +7 -0
  20. package/dist/additions/record-rules.js.map +1 -1
  21. package/dist/additions/summary.d.ts +88 -1
  22. package/dist/additions/summary.d.ts.map +1 -1
  23. package/dist/additions/summary.js +173 -8
  24. package/dist/additions/summary.js.map +1 -1
  25. package/dist/additions/version-inventory.d.ts +80 -0
  26. package/dist/additions/version-inventory.d.ts.map +1 -0
  27. package/dist/additions/version-inventory.js +232 -0
  28. package/dist/additions/version-inventory.js.map +1 -0
  29. package/dist/api/index.d.ts +70 -2
  30. package/dist/api/index.d.ts.map +1 -1
  31. package/dist/api/index.js +506 -79
  32. package/dist/api/index.js.map +1 -1
  33. package/dist/auth/index.d.ts +1 -1
  34. package/dist/auth/index.d.ts.map +1 -1
  35. package/dist/auth/index.js +1 -1
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/auth/request.d.ts +6 -0
  38. package/dist/auth/request.d.ts.map +1 -1
  39. package/dist/auth/request.js +66 -4
  40. package/dist/auth/request.js.map +1 -1
  41. package/dist/contracts/data.d.ts +54 -8
  42. package/dist/contracts/data.d.ts.map +1 -1
  43. package/dist/contracts/data.js +178 -35
  44. package/dist/contracts/data.js.map +1 -1
  45. package/dist/contracts/index.d.ts +1 -1
  46. package/dist/contracts/index.d.ts.map +1 -1
  47. package/dist/derivatives/registration.d.ts +0 -5
  48. package/dist/derivatives/registration.d.ts.map +1 -1
  49. package/dist/derivatives/registration.js +2 -1
  50. package/dist/derivatives/registration.js.map +1 -1
  51. package/dist/errors/pdpp-catalog.d.ts +36 -0
  52. package/dist/errors/pdpp-catalog.d.ts.map +1 -0
  53. package/dist/errors/pdpp-catalog.js +86 -0
  54. package/dist/errors/pdpp-catalog.js.map +1 -0
  55. package/dist/grants/index.d.ts +2 -0
  56. package/dist/grants/index.d.ts.map +1 -1
  57. package/dist/grants/index.js +4 -0
  58. package/dist/grants/index.js.map +1 -1
  59. package/dist/grants/pdpp-binding-store.d.ts +89 -0
  60. package/dist/grants/pdpp-binding-store.d.ts.map +1 -0
  61. package/dist/grants/pdpp-binding-store.js +112 -0
  62. package/dist/grants/pdpp-binding-store.js.map +1 -0
  63. package/dist/grants/pdpp-binding.d.ts +169 -0
  64. package/dist/grants/pdpp-binding.d.ts.map +1 -0
  65. package/dist/grants/pdpp-binding.js +236 -0
  66. package/dist/grants/pdpp-binding.js.map +1 -0
  67. package/dist/legacy-projection/bindings.d.ts +28 -1
  68. package/dist/legacy-projection/bindings.d.ts.map +1 -1
  69. package/dist/legacy-projection/bindings.js +622 -189
  70. package/dist/legacy-projection/bindings.js.map +1 -1
  71. package/dist/legacy-projection/claude-source-record.d.ts +22 -0
  72. package/dist/legacy-projection/claude-source-record.d.ts.map +1 -0
  73. package/dist/legacy-projection/claude-source-record.js +360 -0
  74. package/dist/legacy-projection/claude-source-record.js.map +1 -0
  75. package/dist/legacy-projection/declared-text.d.ts +41 -0
  76. package/dist/legacy-projection/declared-text.d.ts.map +1 -0
  77. package/dist/legacy-projection/declared-text.js +199 -0
  78. package/dist/legacy-projection/declared-text.js.map +1 -0
  79. package/dist/legacy-projection/github-browser-bindings.d.ts.map +1 -1
  80. package/dist/legacy-projection/github-browser-bindings.js +89 -5
  81. package/dist/legacy-projection/github-browser-bindings.js.map +1 -1
  82. package/dist/legacy-projection/github-legacy-fields.d.ts +6 -0
  83. package/dist/legacy-projection/github-legacy-fields.d.ts.map +1 -0
  84. package/dist/legacy-projection/github-legacy-fields.js +202 -0
  85. package/dist/legacy-projection/github-legacy-fields.js.map +1 -0
  86. package/dist/legacy-projection/index.d.ts +3 -1
  87. package/dist/legacy-projection/index.d.ts.map +1 -1
  88. package/dist/legacy-projection/index.js +49 -1
  89. package/dist/legacy-projection/index.js.map +1 -1
  90. package/dist/legacy-projection/oura-browser-bindings.d.ts.map +1 -1
  91. package/dist/legacy-projection/oura-browser-bindings.js +43 -41
  92. package/dist/legacy-projection/oura-browser-bindings.js.map +1 -1
  93. package/dist/legacy-projection/types.d.ts +38 -2
  94. package/dist/legacy-projection/types.d.ts.map +1 -1
  95. package/dist/mcp/connection-api.d.ts.map +1 -1
  96. package/dist/mcp/connection-api.js +4 -0
  97. package/dist/mcp/connection-api.js.map +1 -1
  98. package/dist/mcp/index.d.ts +1 -0
  99. package/dist/mcp/index.d.ts.map +1 -1
  100. package/dist/mcp/index.js +1 -0
  101. package/dist/mcp/index.js.map +1 -1
  102. package/dist/mcp/oauth-redirect.d.ts +14 -0
  103. package/dist/mcp/oauth-redirect.d.ts.map +1 -0
  104. package/dist/mcp/oauth-redirect.js +51 -0
  105. package/dist/mcp/oauth-redirect.js.map +1 -0
  106. package/dist/mcp/resources.d.ts.map +1 -1
  107. package/dist/mcp/resources.js +3 -0
  108. package/dist/mcp/resources.js.map +1 -1
  109. package/dist/mcp/tools.d.ts.map +1 -1
  110. package/dist/mcp/tools.js +11 -2
  111. package/dist/mcp/tools.js.map +1 -1
  112. package/dist/pdpp/approval.d.ts +271 -0
  113. package/dist/pdpp/approval.d.ts.map +1 -0
  114. package/dist/pdpp/approval.js +467 -0
  115. package/dist/pdpp/approval.js.map +1 -0
  116. package/dist/pdpp/client-identity.d.ts +88 -0
  117. package/dist/pdpp/client-identity.d.ts.map +1 -0
  118. package/dist/pdpp/client-identity.js +196 -0
  119. package/dist/pdpp/client-identity.js.map +1 -0
  120. package/dist/pdpp/client-metadata.d.ts +95 -0
  121. package/dist/pdpp/client-metadata.d.ts.map +1 -0
  122. package/dist/pdpp/client-metadata.js +96 -0
  123. package/dist/pdpp/client-metadata.js.map +1 -0
  124. package/dist/pdpp/commitments.d.ts +75 -0
  125. package/dist/pdpp/commitments.d.ts.map +1 -0
  126. package/dist/pdpp/commitments.js +113 -0
  127. package/dist/pdpp/commitments.js.map +1 -0
  128. package/dist/pdpp/declaration.d.ts +118 -0
  129. package/dist/pdpp/declaration.d.ts.map +1 -0
  130. package/dist/pdpp/declaration.js +836 -0
  131. package/dist/pdpp/declaration.js.map +1 -0
  132. package/dist/pdpp/index.d.ts +37 -0
  133. package/dist/pdpp/index.d.ts.map +1 -0
  134. package/dist/pdpp/index.js +23 -0
  135. package/dist/pdpp/index.js.map +1 -0
  136. package/dist/pdpp/issuance.d.ts +126 -0
  137. package/dist/pdpp/issuance.d.ts.map +1 -0
  138. package/dist/pdpp/issuance.js +180 -0
  139. package/dist/pdpp/issuance.js.map +1 -0
  140. package/dist/pdpp/pkce.d.ts +53 -0
  141. package/dist/pdpp/pkce.d.ts.map +1 -0
  142. package/dist/pdpp/pkce.js +109 -0
  143. package/dist/pdpp/pkce.js.map +1 -0
  144. package/dist/pdpp/redirect.d.ts +60 -0
  145. package/dist/pdpp/redirect.d.ts.map +1 -0
  146. package/dist/pdpp/redirect.js +125 -0
  147. package/dist/pdpp/redirect.js.map +1 -0
  148. package/dist/pdpp/resolve.d.ts +109 -0
  149. package/dist/pdpp/resolve.d.ts.map +1 -0
  150. package/dist/pdpp/resolve.js +393 -0
  151. package/dist/pdpp/resolve.js.map +1 -0
  152. package/dist/pdpp/review.d.ts +280 -0
  153. package/dist/pdpp/review.d.ts.map +1 -0
  154. package/dist/pdpp/review.js +205 -0
  155. package/dist/pdpp/review.js.map +1 -0
  156. package/dist/pdpp/selection.d.ts +50 -0
  157. package/dist/pdpp/selection.d.ts.map +1 -0
  158. package/dist/pdpp/selection.js +442 -0
  159. package/dist/pdpp/selection.js.map +1 -0
  160. package/dist/pdpp/store.d.ts +228 -0
  161. package/dist/pdpp/store.d.ts.map +1 -0
  162. package/dist/pdpp/store.js +542 -0
  163. package/dist/pdpp/store.js.map +1 -0
  164. package/dist/pdpp/tokens.d.ts +181 -0
  165. package/dist/pdpp/tokens.d.ts.map +1 -0
  166. package/dist/pdpp/tokens.js +419 -0
  167. package/dist/pdpp/tokens.js.map +1 -0
  168. package/dist/pdpp/types.d.ts +441 -0
  169. package/dist/pdpp/types.d.ts.map +1 -0
  170. package/dist/pdpp/types.js +61 -0
  171. package/dist/pdpp/types.js.map +1 -0
  172. package/dist/pdpp-version.d.ts +28 -0
  173. package/dist/pdpp-version.d.ts.map +1 -0
  174. package/dist/pdpp-version.js +28 -0
  175. package/dist/pdpp-version.js.map +1 -0
  176. package/dist/policy/data-read.d.ts +24 -0
  177. package/dist/policy/data-read.d.ts.map +1 -1
  178. package/dist/policy/data-read.js +60 -3
  179. package/dist/policy/data-read.js.map +1 -1
  180. package/dist/policy/data-write.d.ts.map +1 -1
  181. package/dist/policy/data-write.js +3 -0
  182. package/dist/policy/data-write.js.map +1 -1
  183. package/dist/policy/index.d.ts +1 -0
  184. package/dist/policy/index.d.ts.map +1 -1
  185. package/dist/policy/index.js +1 -0
  186. package/dist/policy/index.js.map +1 -1
  187. package/dist/policy/reserved-scopes.d.ts +3 -0
  188. package/dist/policy/reserved-scopes.d.ts.map +1 -0
  189. package/dist/policy/reserved-scopes.js +5 -0
  190. package/dist/policy/reserved-scopes.js.map +1 -0
  191. package/dist/ports/index.d.ts +63 -0
  192. package/dist/ports/index.d.ts.map +1 -1
  193. package/dist/ports/index.js.map +1 -1
  194. package/dist/ports/pdpp-auth.d.ts +129 -0
  195. package/dist/ports/pdpp-auth.d.ts.map +1 -0
  196. package/dist/ports/pdpp-auth.js +60 -0
  197. package/dist/ports/pdpp-auth.js.map +1 -0
  198. package/dist/ports/pdpp-auth.test-utils.d.ts +9 -0
  199. package/dist/ports/pdpp-auth.test-utils.d.ts.map +1 -0
  200. package/dist/ports/pdpp-auth.test-utils.js +18 -0
  201. package/dist/ports/pdpp-auth.test-utils.js.map +1 -0
  202. package/dist/schemas/server-config.d.ts +44 -0
  203. package/dist/schemas/server-config.d.ts.map +1 -1
  204. package/dist/schemas/server-config.js +91 -0
  205. package/dist/schemas/server-config.js.map +1 -1
  206. package/dist/signing/request-signer.d.ts +2 -0
  207. package/dist/signing/request-signer.d.ts.map +1 -1
  208. package/dist/signing/request-signer.js +1 -0
  209. package/dist/signing/request-signer.js.map +1 -1
  210. package/dist/storage/adapters/interface.d.ts +3 -0
  211. package/dist/storage/adapters/interface.d.ts.map +1 -1
  212. package/dist/storage/adapters/vana-audience.d.ts +12 -0
  213. package/dist/storage/adapters/vana-audience.d.ts.map +1 -0
  214. package/dist/storage/adapters/vana-audience.js +72 -0
  215. package/dist/storage/adapters/vana-audience.js.map +1 -0
  216. package/dist/storage/adapters/vana.d.ts +2 -0
  217. package/dist/storage/adapters/vana.d.ts.map +1 -1
  218. package/dist/storage/adapters/vana.js +53 -20
  219. package/dist/storage/adapters/vana.js.map +1 -1
  220. package/dist/storage/canonical-legacy-projection.d.ts +262 -0
  221. package/dist/storage/canonical-legacy-projection.d.ts.map +1 -0
  222. package/dist/storage/canonical-legacy-projection.js +761 -0
  223. package/dist/storage/canonical-legacy-projection.js.map +1 -0
  224. package/dist/storage/index/manager.d.ts +29 -2
  225. package/dist/storage/index/manager.d.ts.map +1 -1
  226. package/dist/storage/index/schema.d.ts +1 -1
  227. package/dist/storage/index/schema.js +1 -1
  228. package/dist/storage/index/types.d.ts +7 -1
  229. package/dist/storage/index/types.d.ts.map +1 -1
  230. package/dist/storage/legacy-projection.d.ts +4 -3
  231. package/dist/storage/legacy-projection.d.ts.map +1 -1
  232. package/dist/storage/legacy-projection.js +145 -42
  233. package/dist/storage/legacy-projection.js.map +1 -1
  234. package/dist/storage/legacy-scope-coverage-exceptions.d.ts +8 -0
  235. package/dist/storage/legacy-scope-coverage-exceptions.d.ts.map +1 -0
  236. package/dist/storage/legacy-scope-coverage-exceptions.js +10 -0
  237. package/dist/storage/legacy-scope-coverage-exceptions.js.map +1 -0
  238. package/dist/storage/legacy-scope-coverage.d.ts +53 -0
  239. package/dist/storage/legacy-scope-coverage.d.ts.map +1 -0
  240. package/dist/storage/legacy-scope-coverage.js +403 -0
  241. package/dist/storage/legacy-scope-coverage.js.map +1 -0
  242. package/dist/storage/legacy-scope-entity-keys.d.ts +4 -0
  243. package/dist/storage/legacy-scope-entity-keys.d.ts.map +1 -0
  244. package/dist/storage/legacy-scope-entity-keys.js +92 -0
  245. package/dist/storage/legacy-scope-entity-keys.js.map +1 -0
  246. package/dist/storage/legacy-scope-view.d.ts +154 -0
  247. package/dist/storage/legacy-scope-view.d.ts.map +1 -0
  248. package/dist/storage/legacy-scope-view.js +735 -0
  249. package/dist/storage/legacy-scope-view.js.map +1 -0
  250. package/dist/storage/pdpp-records/completion.d.ts +91 -0
  251. package/dist/storage/pdpp-records/completion.d.ts.map +1 -0
  252. package/dist/storage/pdpp-records/completion.js +170 -0
  253. package/dist/storage/pdpp-records/completion.js.map +1 -0
  254. package/dist/storage/pdpp-records/cursor.d.ts +41 -0
  255. package/dist/storage/pdpp-records/cursor.d.ts.map +1 -0
  256. package/dist/storage/pdpp-records/cursor.js +49 -0
  257. package/dist/storage/pdpp-records/cursor.js.map +1 -0
  258. package/dist/storage/pdpp-records/declaration-witness.d.ts +58 -0
  259. package/dist/storage/pdpp-records/declaration-witness.d.ts.map +1 -0
  260. package/dist/storage/pdpp-records/declaration-witness.js +230 -0
  261. package/dist/storage/pdpp-records/declaration-witness.js.map +1 -0
  262. package/dist/storage/pdpp-records/enforcement.d.ts +52 -0
  263. package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -0
  264. package/dist/storage/pdpp-records/enforcement.js +116 -0
  265. package/dist/storage/pdpp-records/enforcement.js.map +1 -0
  266. package/dist/storage/pdpp-records/index.d.ts +5 -0
  267. package/dist/storage/pdpp-records/index.d.ts.map +1 -0
  268. package/dist/storage/pdpp-records/index.js +5 -0
  269. package/dist/storage/pdpp-records/index.js.map +1 -0
  270. package/dist/storage/pdpp-records/ingest-plan.d.ts +39 -0
  271. package/dist/storage/pdpp-records/ingest-plan.d.ts.map +1 -0
  272. package/dist/storage/pdpp-records/ingest-plan.js +103 -0
  273. package/dist/storage/pdpp-records/ingest-plan.js.map +1 -0
  274. package/dist/storage/pdpp-records/interface.d.ts +104 -0
  275. package/dist/storage/pdpp-records/interface.d.ts.map +1 -0
  276. package/dist/storage/pdpp-records/interface.js +2 -0
  277. package/dist/storage/pdpp-records/interface.js.map +1 -0
  278. package/dist/storage/pdpp-records/memory-store.d.ts +9 -0
  279. package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -0
  280. package/dist/storage/pdpp-records/memory-store.js +466 -0
  281. package/dist/storage/pdpp-records/memory-store.js.map +1 -0
  282. package/dist/storage/pdpp-records/portable.d.ts +9 -0
  283. package/dist/storage/pdpp-records/portable.d.ts.map +1 -0
  284. package/dist/storage/pdpp-records/portable.js +8 -0
  285. package/dist/storage/pdpp-records/portable.js.map +1 -0
  286. package/dist/storage/pdpp-records/read-port.d.ts +44 -0
  287. package/dist/storage/pdpp-records/read-port.d.ts.map +1 -0
  288. package/dist/storage/pdpp-records/read-port.js +22 -0
  289. package/dist/storage/pdpp-records/read-port.js.map +1 -0
  290. package/dist/storage/pdpp-records/record-key.d.ts +52 -0
  291. package/dist/storage/pdpp-records/record-key.d.ts.map +1 -0
  292. package/dist/storage/pdpp-records/record-key.js +97 -0
  293. package/dist/storage/pdpp-records/record-key.js.map +1 -0
  294. package/dist/storage/pdpp-records/schema.d.ts +41 -0
  295. package/dist/storage/pdpp-records/schema.d.ts.map +1 -0
  296. package/dist/storage/pdpp-records/schema.js +153 -0
  297. package/dist/storage/pdpp-records/schema.js.map +1 -0
  298. package/dist/storage/pdpp-records/stream-declaration.d.ts +88 -0
  299. package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -0
  300. package/dist/storage/pdpp-records/stream-declaration.js +57 -0
  301. package/dist/storage/pdpp-records/stream-declaration.js.map +1 -0
  302. package/dist/storage/pdpp-records/types.d.ts +138 -0
  303. package/dist/storage/pdpp-records/types.d.ts.map +1 -0
  304. package/dist/storage/pdpp-records/types.js +38 -0
  305. package/dist/storage/pdpp-records/types.js.map +1 -0
  306. package/dist/sync/data-point-feed.d.ts +3 -0
  307. package/dist/sync/data-point-feed.d.ts.map +1 -1
  308. package/dist/sync/data-point-feed.js +17 -1
  309. package/dist/sync/data-point-feed.js.map +1 -1
  310. package/dist/sync/delete-data-port.d.ts +2 -0
  311. package/dist/sync/delete-data-port.d.ts.map +1 -1
  312. package/dist/sync/delete-data-port.js +1 -1
  313. package/dist/sync/delete-data-port.js.map +1 -1
  314. package/dist/sync/engine/sync-manager.d.ts.map +1 -1
  315. package/dist/sync/engine/sync-manager.js +5 -2
  316. package/dist/sync/engine/sync-manager.js.map +1 -1
  317. package/dist/sync/index.d.ts +3 -1
  318. package/dist/sync/index.d.ts.map +1 -1
  319. package/dist/sync/index.js +4 -0
  320. package/dist/sync/index.js.map +1 -1
  321. package/dist/sync/pdpp-import.d.ts +192 -0
  322. package/dist/sync/pdpp-import.d.ts.map +1 -0
  323. package/dist/sync/pdpp-import.js +441 -0
  324. package/dist/sync/pdpp-import.js.map +1 -0
  325. package/dist/sync/scope-deletions.d.ts +10 -0
  326. package/dist/sync/scope-deletions.d.ts.map +1 -1
  327. package/dist/sync/scope-deletions.js +40 -7
  328. package/dist/sync/scope-deletions.js.map +1 -1
  329. package/dist/sync/workers/download.d.ts +14 -0
  330. package/dist/sync/workers/download.d.ts.map +1 -1
  331. package/dist/sync/workers/download.js +149 -13
  332. package/dist/sync/workers/download.js.map +1 -1
  333. package/dist/sync/workers/upload.d.ts +2 -0
  334. package/dist/sync/workers/upload.d.ts.map +1 -1
  335. package/dist/sync/workers/upload.js +7 -0
  336. package/dist/sync/workers/upload.js.map +1 -1
  337. package/dist/test-utils/memory-storage.d.ts +1 -1
  338. package/dist/test-utils/memory-storage.d.ts.map +1 -1
  339. package/dist/test-utils/memory-storage.js +11 -5
  340. package/dist/test-utils/memory-storage.js.map +1 -1
  341. package/package.json +54 -4
@@ -0,0 +1,442 @@
1
+ /**
2
+ * PDPP Core §6 selection-request validation.
3
+ *
4
+ * This is the shape gate that runs before consent. It answers one question:
5
+ * is this request expressible against the retained declaration snapshot? It
6
+ * does not resolve anything — `resolve.ts` does that, and only against the
7
+ * same snapshot this module validated against.
8
+ *
9
+ * "Fails neutrally" in §6 means the both/neither `streams`/`selection_preset`
10
+ * failure is a Source validation failure the binding maps to an error code; it
11
+ * must not leak which of the two the client got wrong, and it must not depend
12
+ * on any owner-specific state. We return a binding-neutral failure and let the
13
+ * OAuth/RAR layer map it to RFC 9396 `invalid_authorization_details`.
14
+ */
15
+ import { PDPP_DATA_ACCESS_TYPE, PDPP_DATA_ACCESS_TYPE_V02, } from "./types.js";
16
+ function fail(code, message) {
17
+ return { ok: false, failure: { code, message } };
18
+ }
19
+ /**
20
+ * Canonical key strings: a plain string for a simple key, a minified JSON
21
+ * array for a compound key (§6 `resources`). We validate arity and type
22
+ * against the declaration's `primary_key` here so an unsatisfiable resource
23
+ * list is rejected at issuance rather than silently matching nothing at the RS.
24
+ */
25
+ function validateResourceKey(raw, primaryKey) {
26
+ if (primaryKey.length <= 1) {
27
+ // A simple key is a plain string. A JSON array here is an arity error.
28
+ if (raw.startsWith("[")) {
29
+ return "expected a simple key string, got a compound key array";
30
+ }
31
+ return raw.length > 0 ? null : "resource key must not be empty";
32
+ }
33
+ let parsed;
34
+ try {
35
+ parsed = JSON.parse(raw);
36
+ }
37
+ catch {
38
+ return "compound resource key must be a minified JSON array";
39
+ }
40
+ if (!Array.isArray(parsed)) {
41
+ return "compound resource key must be a JSON array";
42
+ }
43
+ if (parsed.length !== primaryKey.length) {
44
+ return `compound resource key has ${parsed.length} parts, declaration primary_key has ${primaryKey.length}`;
45
+ }
46
+ if (!parsed.every((part) => typeof part === "string")) {
47
+ return "compound resource key parts must be strings";
48
+ }
49
+ return null;
50
+ }
51
+ /**
52
+ * The field set a `minimum.fields` member must be drawn from: the *expanded
53
+ * request*, not the declaration.
54
+ *
55
+ * v0.2 requires rejecting fields "outside the expanded request", which is a
56
+ * stricter gate than the declared schema. A floor naming a field the client
57
+ * did not request is incoherent — the upper limit already excludes it, so the
58
+ * minimum could never be met and the request could never succeed. Catching it
59
+ * here turns a guaranteed `access_denied` at issuance into a fixable shape
60
+ * error before a human is asked to decide anything.
61
+ */
62
+ function expandedRequestFields(stream, declared, snapshot) {
63
+ if (stream.view !== undefined) {
64
+ const view = snapshot.views?.find((v) => v.name === stream.view);
65
+ // An unresolvable view already failed above; treat it as empty here.
66
+ return view ? view.fields.filter((f) => declared.fields.includes(f)) : [];
67
+ }
68
+ if (stream.fields !== undefined) {
69
+ return stream.fields.filter((f) => declared.fields.includes(f));
70
+ }
71
+ // Omitting both asks for all permitted fields, so the whole declared set is
72
+ // in the expanded request.
73
+ return declared.fields;
74
+ }
75
+ /**
76
+ * Validate a request `time_range`'s own shape, independent of which stream
77
+ * carries it.
78
+ *
79
+ * Shared by the named-stream path and the wildcard path so the two cannot
80
+ * disagree about what a well-formed window is. Before this was factored out,
81
+ * a wildcard's window skipped every check here — unparseable bounds, an
82
+ * inverted `since`/`until`, and an empty `{}` were all accepted, while the
83
+ * same values written longhand were rejected. A shorthand that validates less
84
+ * than the form it stands for is a hole, not a convenience.
85
+ *
86
+ * `value` is untrusted JSON, so the object and string types are checked
87
+ * rather than assumed: a `null` or a number here must be a validation failure,
88
+ * not a `TypeError` that the binding turns into a 500.
89
+ */
90
+ function validateTimeRangeBounds(value, subject) {
91
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
92
+ return fail("invalid_request", `${subject} time_range must be an object`);
93
+ }
94
+ const { since, until } = value;
95
+ if (since === undefined && until === undefined) {
96
+ return fail("invalid_request", `${subject} has an empty time_range`);
97
+ }
98
+ for (const [label, bound] of [
99
+ ["since", since],
100
+ ["until", until],
101
+ ]) {
102
+ if (bound === undefined)
103
+ continue;
104
+ if (typeof bound !== "string" || Number.isNaN(Date.parse(bound))) {
105
+ return fail("invalid_request", `${subject} time_range.${label} is not a valid ISO 8601 instant`);
106
+ }
107
+ }
108
+ if (typeof since === "string" && typeof until === "string") {
109
+ if (Date.parse(since) >= Date.parse(until)) {
110
+ return fail("invalid_request", `${subject} time_range.since must precede time_range.until`);
111
+ }
112
+ }
113
+ return { ok: true };
114
+ }
115
+ /**
116
+ * Validate one v0.2 `minimum` against the request that carries it.
117
+ *
118
+ * Everything here is a shape question answerable without the owner, the
119
+ * inventory, or any record. Whether the *owner's* narrowing then satisfies a
120
+ * well-formed minimum is an issuance question, handled in `resolve.ts`.
121
+ */
122
+ function validateMinimum(stream, declared, snapshot) {
123
+ const minimum = stream.minimum;
124
+ if (minimum === undefined)
125
+ return { ok: true };
126
+ const bad = (message) => fail("invalid_minimum", `stream '${stream.name}' minimum: ${message}`);
127
+ if (typeof minimum !== "object" || minimum === null) {
128
+ return bad("must be an object");
129
+ }
130
+ // Only `fields` and `time_range` are recognized. An unknown member must not
131
+ // pass silently: the client would believe it imposed a condition the AS
132
+ // never evaluates.
133
+ const unknown = Object.keys(minimum).filter((key) => key !== "fields" && key !== "time_range");
134
+ if (unknown.length > 0) {
135
+ return bad(`unknown member(s) ${unknown.join(", ")}`);
136
+ }
137
+ if (minimum.fields === undefined && minimum.time_range === undefined) {
138
+ return bad("must specify at least one of fields or time_range");
139
+ }
140
+ if (minimum.fields !== undefined) {
141
+ const fields = minimum.fields;
142
+ if (!Array.isArray(fields) || fields.length === 0) {
143
+ return bad("fields must be a non-empty array");
144
+ }
145
+ if (!fields.every((f) => typeof f === "string" && f.length > 0)) {
146
+ return bad("fields must contain non-empty strings");
147
+ }
148
+ if (new Set(fields).size !== fields.length) {
149
+ return bad("fields must not contain duplicates");
150
+ }
151
+ const permitted = expandedRequestFields(stream, declared, snapshot);
152
+ const outside = fields.filter((f) => !permitted.includes(f));
153
+ if (outside.length > 0) {
154
+ return bad(`fields outside the expanded request: ${outside.join(", ")}`);
155
+ }
156
+ }
157
+ if (minimum.time_range !== undefined) {
158
+ const range = minimum.time_range;
159
+ if (typeof range !== "object" || range === null || Array.isArray(range)) {
160
+ return bad("time_range must be an object");
161
+ }
162
+ const { since, until } = range;
163
+ // Unlike a request `time_range`, a minimum window must be closed: an open
164
+ // floor would mean "at least everything", which no narrowing can satisfy
165
+ // and which the request's own upper limit already bounds.
166
+ if (typeof since !== "string" || typeof until !== "string") {
167
+ return bad("time_range must contain both since and until");
168
+ }
169
+ const from = Date.parse(since);
170
+ const to = Date.parse(until);
171
+ if (Number.isNaN(from) || Number.isNaN(to)) {
172
+ return bad("time_range bounds must be valid ISO 8601 instants");
173
+ }
174
+ if (from >= to) {
175
+ return bad("time_range.since must precede time_range.until");
176
+ }
177
+ if (!declared.consent_time_field) {
178
+ return bad("stream declares no consent_time_field and cannot carry a time minimum");
179
+ }
180
+ // The floor must sit inside the ceiling. Comparisons are on instants, so
181
+ // an offset-bearing timestamp is ordered by the moment it names rather
182
+ // than by its string form.
183
+ const requested = stream.time_range;
184
+ const ceilingSince = requested?.since !== undefined ? Date.parse(requested.since) : -Infinity;
185
+ const ceilingUntil = requested?.until !== undefined ? Date.parse(requested.until) : Infinity;
186
+ if (from < ceilingSince || to > ceilingUntil) {
187
+ return bad("time_range falls outside the requested time_range");
188
+ }
189
+ }
190
+ return { ok: true };
191
+ }
192
+ function validateStreamRequest(stream, snapshot, revision) {
193
+ // The entry is untrusted JSON: `streams: [null]` and `streams: ["name"]`
194
+ // both reach here. Every check below reads a member off it, so the shape
195
+ // gate comes first or the first read throws.
196
+ if (typeof stream !== "object" || stream === null || Array.isArray(stream)) {
197
+ return fail("invalid_request", "each stream entry must be an object");
198
+ }
199
+ if (typeof stream.name !== "string" || stream.name.length === 0) {
200
+ return fail("invalid_request", "each stream entry must carry a non-empty name");
201
+ }
202
+ if (stream.necessity !== undefined) {
203
+ if (stream.necessity !== "required" && stream.necessity !== "optional") {
204
+ return fail("invalid_request", `stream '${stream.name}' necessity must be required or optional`);
205
+ }
206
+ }
207
+ if (stream.minimum !== undefined && revision === "0.1") {
208
+ // v0.1 has no `minimum`. Accepting and ignoring it is the one outcome
209
+ // worse than rejecting: the client would ship believing a floor is
210
+ // enforced. A client that wants minima moves to the v0.2 type.
211
+ return fail("unsupported_selection_parameter", `stream '${stream.name}' carries minimum, which requires the ${PDPP_DATA_ACCESS_TYPE_V02} detail type`);
212
+ }
213
+ // A wildcard is checked by the caller (it must be the sole entry) and
214
+ // expands during resolution, so there is no declared stream to match yet.
215
+ if (stream.name === "*") {
216
+ if (stream.view !== undefined) {
217
+ return fail("unsupported_selection_parameter", "view cannot be combined with a wildcard stream selection");
218
+ }
219
+ if (stream.minimum !== undefined) {
220
+ // A wildcard minimum would be one floor asserted over every stream the
221
+ // declaration happens to contain, including streams whose schema has no
222
+ // such field and streams that cannot carry a time window at all. v0.2
223
+ // defines a minimum per named stream; it says nothing about what a
224
+ // fanned-out one would mean, so we do not invent semantics for it.
225
+ return fail("unsupported_selection_parameter", "minimum cannot be combined with a wildcard stream selection");
226
+ }
227
+ if (stream.time_range !== undefined) {
228
+ // A wildcard is shorthand for naming every declared stream, so it
229
+ // cannot mean something weaker than naming them. §6's rule for a named
230
+ // stream — "no consent_time_field, no time_range" — therefore applies
231
+ // to every stream the wildcard expands to.
232
+ //
233
+ // The alternative was to keep accepting this and let resolution drop
234
+ // the window for time-incapable streams, which is what the code did.
235
+ // That silently issued unbounded access to those streams from a request
236
+ // whose own words asked for a bounded one: the owner approved, and the
237
+ // client received, more than either had read. A request that cannot be
238
+ // carried out as written is refused, not quietly reinterpreted.
239
+ const incapable = snapshot.streams
240
+ .filter((s) => !s.consent_time_field)
241
+ .map((s) => s.name);
242
+ if (incapable.length > 0) {
243
+ return fail("unsupported_selection_parameter", `wildcard time_range expands to stream(s) that declare no consent_time_field and cannot accept it: ${incapable.join(", ")}`);
244
+ }
245
+ // The window's own shape is checked by the same rule a named stream's
246
+ // is; a wildcard must not be the weaker form.
247
+ const bounds = validateTimeRangeBounds(stream.time_range, "wildcard stream selection");
248
+ if (!bounds.ok)
249
+ return bounds;
250
+ }
251
+ return { ok: true };
252
+ }
253
+ const declared = snapshot.streams.find((s) => s.name === stream.name);
254
+ if (!declared) {
255
+ return fail("unknown_stream", `stream '${stream.name}' is not declared by the retained snapshot`);
256
+ }
257
+ if (stream.view !== undefined && stream.fields !== undefined) {
258
+ return fail("invalid_request", `stream '${stream.name}' specifies both view and fields, which are mutually exclusive`);
259
+ }
260
+ if (stream.view !== undefined) {
261
+ const view = snapshot.views?.find((v) => v.name === stream.view);
262
+ if (!view) {
263
+ return fail("unknown_view", `view '${stream.view}' is not defined for this source`);
264
+ }
265
+ // §9 AS item 12: a view naming a field absent from the retained schema is
266
+ // not resolvable, and we reject rather than silently dropping the field.
267
+ const absent = view.fields.filter((f) => !declared.fields.includes(f));
268
+ if (absent.length > 0) {
269
+ return fail("unknown_field", `view '${stream.view}' names fields absent from stream '${stream.name}': ${absent.join(", ")}`);
270
+ }
271
+ }
272
+ if (stream.fields !== undefined) {
273
+ if (!Array.isArray(stream.fields)) {
274
+ return fail("invalid_request", `stream '${stream.name}' fields must be an array`);
275
+ }
276
+ if (stream.fields.length === 0) {
277
+ return fail("invalid_request", `stream '${stream.name}' specifies an empty fields list`);
278
+ }
279
+ if (!stream.fields.every((f) => typeof f === "string" && f.length > 0)) {
280
+ return fail("invalid_request", `stream '${stream.name}' fields must contain non-empty strings`);
281
+ }
282
+ const absent = stream.fields.filter((f) => !declared.fields.includes(f));
283
+ if (absent.length > 0) {
284
+ return fail("unknown_field", `stream '${stream.name}' requests fields absent from the retained schema: ${absent.join(", ")}`);
285
+ }
286
+ }
287
+ if (stream.time_range !== undefined) {
288
+ // §6: the declaration's consent_time_field is the authoritative signal
289
+ // that a stream is time-range-capable. No field, no time_range.
290
+ if (!declared.consent_time_field) {
291
+ return fail("unsupported_selection_parameter", `stream '${stream.name}' declares no consent_time_field and cannot accept time_range`);
292
+ }
293
+ const bounds = validateTimeRangeBounds(stream.time_range, `stream '${stream.name}'`);
294
+ if (!bounds.ok)
295
+ return bounds;
296
+ }
297
+ if (stream.resources !== undefined) {
298
+ if (!Array.isArray(stream.resources)) {
299
+ return fail("invalid_request", `stream '${stream.name}' resources must be an array`);
300
+ }
301
+ if (stream.resources.length === 0) {
302
+ return fail("invalid_request", `stream '${stream.name}' specifies an empty resources list`);
303
+ }
304
+ for (const raw of stream.resources) {
305
+ if (typeof raw !== "string") {
306
+ return fail("invalid_resource_key", `stream '${stream.name}' resources must contain strings`);
307
+ }
308
+ const problem = validateResourceKey(raw, declared.primary_key);
309
+ if (problem) {
310
+ return fail("invalid_resource_key", `stream '${stream.name}' resource '${raw}': ${problem}`);
311
+ }
312
+ }
313
+ }
314
+ // Last, so a minimum naming a field that is itself undeclared reports the
315
+ // undeclared field rather than the floor built on it.
316
+ return validateMinimum(stream, declared, snapshot);
317
+ }
318
+ /**
319
+ * Validate one selection request against the retained declaration snapshot.
320
+ *
321
+ * The caller must have already retrieved and pinned `snapshot`; this function
322
+ * never fetches. §9 AS item 16 requires that the same snapshot carry through
323
+ * consent and issuance, so passing a freshly fetched declaration here and a
324
+ * different one to `resolveGrant` would defeat the whole guarantee.
325
+ */
326
+ export function validateSelectionRequest(request, snapshot) {
327
+ // Exactly two types are recognized, each resolved under its own revision.
328
+ // Anything else is rejected rather than processed as the nearest PDPP type:
329
+ // a type URI the AS does not implement carries rules it does not apply.
330
+ const revision = request.type === PDPP_DATA_ACCESS_TYPE_V02
331
+ ? "0.2"
332
+ : request.type === PDPP_DATA_ACCESS_TYPE
333
+ ? "0.1"
334
+ : null;
335
+ if (revision === null) {
336
+ return fail("invalid_request", `authorization detail type must be ${PDPP_DATA_ACCESS_TYPE} or ${PDPP_DATA_ACCESS_TYPE_V02}`);
337
+ }
338
+ if (typeof request.source !== "object" ||
339
+ request.source === null ||
340
+ Array.isArray(request.source)) {
341
+ return fail("invalid_request", "source must be an object");
342
+ }
343
+ if (request.source.id !== snapshot.source_id) {
344
+ return fail("invalid_request", "request source.id does not match the retained declaration snapshot");
345
+ }
346
+ // §6: the purpose code must be a syntactically valid absolute URI, and that
347
+ // is the only syntactic gate. §9 AS item 6 forbids rejecting a code merely
348
+ // for being absent from the registry — an unregistered code renders from its
349
+ // description or raw URI instead.
350
+ if (!isAbsoluteUri(request.purpose_code)) {
351
+ return fail("invalid_request", "purpose_code must be an absolute URI");
352
+ }
353
+ if (request.access_mode !== "single_use" &&
354
+ request.access_mode !== "continuous") {
355
+ return fail("invalid_request", "access_mode must be single_use or continuous");
356
+ }
357
+ if (request.retention !== undefined) {
358
+ const retention = request.retention;
359
+ if (typeof retention !== "object" ||
360
+ retention === null ||
361
+ Array.isArray(retention)) {
362
+ return fail("invalid_request", "retention must be an object");
363
+ }
364
+ const { on_expiry } = retention;
365
+ if (on_expiry !== "delete" && on_expiry !== "anonymize") {
366
+ // `archive` was dropped in v0.1 and is the likely wrong value here.
367
+ return fail("invalid_request", "retention.on_expiry must be delete or anonymize");
368
+ }
369
+ }
370
+ const hasStreams = request.streams !== undefined;
371
+ const hasPreset = request.selection_preset !== undefined;
372
+ if (hasStreams === hasPreset) {
373
+ // Both or neither. Deliberately one message for both cases: the failure
374
+ // is about the pair, and distinguishing them tells a probing client which
375
+ // half the server accepted.
376
+ return fail("source_validation_failed", "exactly one of streams or selection_preset is required");
377
+ }
378
+ if (hasPreset) {
379
+ const preset = snapshot.selection_presets?.find((p) => p.name === request.selection_preset);
380
+ if (!preset) {
381
+ return fail("unknown_preset", `selection preset '${request.selection_preset}' is not defined by the retained snapshot`);
382
+ }
383
+ // The preset's own streams still have to be expressible against the
384
+ // snapshot; a declaration that ships a preset naming a dropped stream is
385
+ // invalid and we would rather fail here than resolve an empty grant.
386
+ for (const stream of preset.streams) {
387
+ const result = validateStreamRequest(stream, snapshot, revision);
388
+ if (!result.ok)
389
+ return result;
390
+ }
391
+ return { ok: true };
392
+ }
393
+ const streams = request.streams ?? [];
394
+ if (!Array.isArray(streams)) {
395
+ return fail("invalid_request", "streams must be an array");
396
+ }
397
+ if (streams.length === 0) {
398
+ return fail("invalid_request", "streams must not be empty");
399
+ }
400
+ // Every check from here down reads `.name` off an entry — the wildcard
401
+ // scan, the uniqueness scan, and the per-stream validation — so the entry
402
+ // shapes are gated once, first, rather than at each read.
403
+ for (const entry of streams) {
404
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
405
+ return fail("invalid_request", "each stream entry must be an object");
406
+ }
407
+ if (typeof entry.name !== "string" || entry.name.length === 0) {
408
+ return fail("invalid_request", "each stream entry must carry a non-empty name");
409
+ }
410
+ }
411
+ const wildcards = streams.filter((s) => s.name === "*");
412
+ if (wildcards.length > 0 && streams.length > 1) {
413
+ // §6 clause 6.8-3: a wildcard entry must be the only entry. Like the
414
+ // streams/preset exactly-one check above, this is a Source validation
415
+ // failure and must map to the same RFC 9396 code.
416
+ return fail("source_validation_failed", "a wildcard stream entry must be the only entry in streams");
417
+ }
418
+ const seen = new Set();
419
+ for (const stream of streams) {
420
+ if (seen.has(stream.name)) {
421
+ // §6 clause 6.8-3: stream names must be unique — also a Source
422
+ // validation failure.
423
+ return fail("source_validation_failed", `stream '${stream.name}' appears more than once`);
424
+ }
425
+ seen.add(stream.name);
426
+ const result = validateStreamRequest(stream, snapshot, revision);
427
+ if (!result.ok)
428
+ return result;
429
+ }
430
+ return { ok: true };
431
+ }
432
+ function isAbsoluteUri(value) {
433
+ try {
434
+ // URL rejects relative references, which is exactly the check we want.
435
+ new URL(value);
436
+ return true;
437
+ }
438
+ catch {
439
+ return false;
440
+ }
441
+ }
442
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/pdpp/selection.ts"],"names":[],"mappings":"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"}