@opendatalabs/personal-server-ts-core 0.0.1-canary.00328bf

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 (573) hide show
  1. package/dist/api/index.d.ts +408 -0
  2. package/dist/api/index.d.ts.map +1 -0
  3. package/dist/api/index.js +1257 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/api/raw-envelope.d.ts +3 -0
  6. package/dist/api/raw-envelope.d.ts.map +1 -0
  7. package/dist/api/raw-envelope.js +215 -0
  8. package/dist/api/raw-envelope.js.map +1 -0
  9. package/dist/auth/index.d.ts +2 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +2 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/request.d.ts +28 -0
  14. package/dist/auth/request.d.ts.map +1 -0
  15. package/dist/auth/request.js +106 -0
  16. package/dist/auth/request.js.map +1 -0
  17. package/dist/client.d.ts +233 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +243 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/config/defaults.d.ts +12 -0
  22. package/dist/config/defaults.d.ts.map +1 -0
  23. package/dist/config/defaults.js +12 -0
  24. package/dist/config/defaults.js.map +1 -0
  25. package/dist/config/index.d.ts +3 -0
  26. package/dist/config/index.d.ts.map +1 -0
  27. package/dist/config/index.js +3 -0
  28. package/dist/config/index.js.map +1 -0
  29. package/dist/config/paths.d.ts +9 -0
  30. package/dist/config/paths.d.ts.map +1 -0
  31. package/dist/config/paths.js +14 -0
  32. package/dist/config/paths.js.map +1 -0
  33. package/dist/contracts/access-logs.d.ts +8 -0
  34. package/dist/contracts/access-logs.d.ts.map +1 -0
  35. package/dist/contracts/access-logs.js +7 -0
  36. package/dist/contracts/access-logs.js.map +1 -0
  37. package/dist/contracts/auth-device.d.ts +70 -0
  38. package/dist/contracts/auth-device.d.ts.map +1 -0
  39. package/dist/contracts/auth-device.js +163 -0
  40. package/dist/contracts/auth-device.js.map +1 -0
  41. package/dist/contracts/binary.d.ts +66 -0
  42. package/dist/contracts/binary.d.ts.map +1 -0
  43. package/dist/contracts/binary.js +123 -0
  44. package/dist/contracts/binary.js.map +1 -0
  45. package/dist/contracts/config.d.ts +5 -0
  46. package/dist/contracts/config.d.ts.map +1 -0
  47. package/dist/contracts/config.js +30 -0
  48. package/dist/contracts/config.js.map +1 -0
  49. package/dist/contracts/data.d.ts +165 -0
  50. package/dist/contracts/data.d.ts.map +1 -0
  51. package/dist/contracts/data.js +371 -0
  52. package/dist/contracts/data.js.map +1 -0
  53. package/dist/contracts/grants.d.ts +45 -0
  54. package/dist/contracts/grants.d.ts.map +1 -0
  55. package/dist/contracts/grants.js +177 -0
  56. package/dist/contracts/grants.js.map +1 -0
  57. package/dist/contracts/http.d.ts +21 -0
  58. package/dist/contracts/http.d.ts.map +1 -0
  59. package/dist/contracts/http.js +49 -0
  60. package/dist/contracts/http.js.map +1 -0
  61. package/dist/contracts/index.d.ts +16 -0
  62. package/dist/contracts/index.d.ts.map +1 -0
  63. package/dist/contracts/index.js +10 -0
  64. package/dist/contracts/index.js.map +1 -0
  65. package/dist/contracts/oauth.d.ts +38 -0
  66. package/dist/contracts/oauth.d.ts.map +1 -0
  67. package/dist/contracts/oauth.js +130 -0
  68. package/dist/contracts/oauth.js.map +1 -0
  69. package/dist/contracts/sync.d.ts +10 -0
  70. package/dist/contracts/sync.d.ts.map +1 -0
  71. package/dist/contracts/sync.js +35 -0
  72. package/dist/contracts/sync.js.map +1 -0
  73. package/dist/derivatives/answer-shape.d.ts +83 -0
  74. package/dist/derivatives/answer-shape.d.ts.map +1 -0
  75. package/dist/derivatives/answer-shape.js +320 -0
  76. package/dist/derivatives/answer-shape.js.map +1 -0
  77. package/dist/derivatives/api.d.ts +48 -0
  78. package/dist/derivatives/api.d.ts.map +1 -0
  79. package/dist/derivatives/api.js +374 -0
  80. package/dist/derivatives/api.js.map +1 -0
  81. package/dist/derivatives/compute.d.ts +112 -0
  82. package/dist/derivatives/compute.d.ts.map +1 -0
  83. package/dist/derivatives/compute.js +476 -0
  84. package/dist/derivatives/compute.js.map +1 -0
  85. package/dist/derivatives/e2ee/aad.d.ts +22 -0
  86. package/dist/derivatives/e2ee/aad.d.ts.map +1 -0
  87. package/dist/derivatives/e2ee/aad.js +32 -0
  88. package/dist/derivatives/e2ee/aad.js.map +1 -0
  89. package/dist/derivatives/e2ee/attestation.d.ts +134 -0
  90. package/dist/derivatives/e2ee/attestation.d.ts.map +1 -0
  91. package/dist/derivatives/e2ee/attestation.js +248 -0
  92. package/dist/derivatives/e2ee/attestation.js.map +1 -0
  93. package/dist/derivatives/e2ee/index.d.ts +6 -0
  94. package/dist/derivatives/e2ee/index.d.ts.map +1 -0
  95. package/dist/derivatives/e2ee/index.js +6 -0
  96. package/dist/derivatives/e2ee/index.js.map +1 -0
  97. package/dist/derivatives/e2ee/jcs.d.ts +17 -0
  98. package/dist/derivatives/e2ee/jcs.d.ts.map +1 -0
  99. package/dist/derivatives/e2ee/jcs.js +55 -0
  100. package/dist/derivatives/e2ee/jcs.js.map +1 -0
  101. package/dist/derivatives/e2ee/phala.d.ts +62 -0
  102. package/dist/derivatives/e2ee/phala.d.ts.map +1 -0
  103. package/dist/derivatives/e2ee/phala.js +168 -0
  104. package/dist/derivatives/e2ee/phala.js.map +1 -0
  105. package/dist/derivatives/e2ee/suite.d.ts +56 -0
  106. package/dist/derivatives/e2ee/suite.d.ts.map +1 -0
  107. package/dist/derivatives/e2ee/suite.js +164 -0
  108. package/dist/derivatives/e2ee/suite.js.map +1 -0
  109. package/dist/derivatives/index.d.ts +11 -0
  110. package/dist/derivatives/index.d.ts.map +1 -0
  111. package/dist/derivatives/index.js +11 -0
  112. package/dist/derivatives/index.js.map +1 -0
  113. package/dist/derivatives/inference.d.ts +151 -0
  114. package/dist/derivatives/inference.d.ts.map +1 -0
  115. package/dist/derivatives/inference.js +262 -0
  116. package/dist/derivatives/inference.js.map +1 -0
  117. package/dist/derivatives/prompt.d.ts +99 -0
  118. package/dist/derivatives/prompt.d.ts.map +1 -0
  119. package/dist/derivatives/prompt.js +281 -0
  120. package/dist/derivatives/prompt.js.map +1 -0
  121. package/dist/derivatives/registration.d.ts +56 -0
  122. package/dist/derivatives/registration.d.ts.map +1 -0
  123. package/dist/derivatives/registration.js +187 -0
  124. package/dist/derivatives/registration.js.map +1 -0
  125. package/dist/derivatives/scheduler.d.ts +114 -0
  126. package/dist/derivatives/scheduler.d.ts.map +1 -0
  127. package/dist/derivatives/scheduler.js +331 -0
  128. package/dist/derivatives/scheduler.js.map +1 -0
  129. package/dist/derivatives/store.d.ts +14 -0
  130. package/dist/derivatives/store.d.ts.map +1 -0
  131. package/dist/derivatives/store.js +79 -0
  132. package/dist/derivatives/store.js.map +1 -0
  133. package/dist/derivatives/types.d.ts +102 -0
  134. package/dist/derivatives/types.d.ts.map +1 -0
  135. package/dist/derivatives/types.js +29 -0
  136. package/dist/derivatives/types.js.map +1 -0
  137. package/dist/errors/catalog.d.ts +125 -0
  138. package/dist/errors/catalog.d.ts.map +1 -0
  139. package/dist/errors/catalog.js +198 -0
  140. package/dist/errors/catalog.js.map +1 -0
  141. package/dist/errors/pdpp-catalog.d.ts +36 -0
  142. package/dist/errors/pdpp-catalog.d.ts.map +1 -0
  143. package/dist/errors/pdpp-catalog.js +82 -0
  144. package/dist/errors/pdpp-catalog.js.map +1 -0
  145. package/dist/grants/index.d.ts +5 -0
  146. package/dist/grants/index.d.ts.map +1 -0
  147. package/dist/grants/index.js +6 -0
  148. package/dist/grants/index.js.map +1 -0
  149. package/dist/grants/pdpp-binding-store.d.ts +58 -0
  150. package/dist/grants/pdpp-binding-store.d.ts.map +1 -0
  151. package/dist/grants/pdpp-binding-store.js +97 -0
  152. package/dist/grants/pdpp-binding-store.js.map +1 -0
  153. package/dist/grants/pdpp-binding.d.ts +179 -0
  154. package/dist/grants/pdpp-binding.d.ts.map +1 -0
  155. package/dist/grants/pdpp-binding.js +214 -0
  156. package/dist/grants/pdpp-binding.js.map +1 -0
  157. package/dist/keys/index.d.ts +3 -0
  158. package/dist/keys/index.d.ts.map +1 -0
  159. package/dist/keys/index.js +2 -0
  160. package/dist/keys/index.js.map +1 -0
  161. package/dist/keys/public-only-account.d.ts +8 -0
  162. package/dist/keys/public-only-account.d.ts.map +1 -0
  163. package/dist/keys/public-only-account.js +21 -0
  164. package/dist/keys/public-only-account.js.map +1 -0
  165. package/dist/keys/server-account.d.ts +24 -0
  166. package/dist/keys/server-account.d.ts.map +1 -0
  167. package/dist/keys/server-account.js +2 -0
  168. package/dist/keys/server-account.js.map +1 -0
  169. package/dist/lineage/attestation.d.ts +42 -0
  170. package/dist/lineage/attestation.d.ts.map +1 -0
  171. package/dist/lineage/attestation.js +25 -0
  172. package/dist/lineage/attestation.js.map +1 -0
  173. package/dist/lineage/gateway.d.ts +105 -0
  174. package/dist/lineage/gateway.d.ts.map +1 -0
  175. package/dist/lineage/gateway.js +242 -0
  176. package/dist/lineage/gateway.js.map +1 -0
  177. package/dist/lineage/index.d.ts +5 -0
  178. package/dist/lineage/index.d.ts.map +1 -0
  179. package/dist/lineage/index.js +5 -0
  180. package/dist/lineage/index.js.map +1 -0
  181. package/dist/lineage/lineage.d.ts +141 -0
  182. package/dist/lineage/lineage.d.ts.map +1 -0
  183. package/dist/lineage/lineage.js +255 -0
  184. package/dist/lineage/lineage.js.map +1 -0
  185. package/dist/logger/index.d.ts +9 -0
  186. package/dist/logger/index.d.ts.map +1 -0
  187. package/dist/logger/index.js +5 -0
  188. package/dist/logger/index.js.map +1 -0
  189. package/dist/logging/access-log.d.ts +23 -0
  190. package/dist/logging/access-log.d.ts.map +1 -0
  191. package/dist/logging/access-log.js +2 -0
  192. package/dist/logging/access-log.js.map +1 -0
  193. package/dist/logging/access-reader.d.ts +14 -0
  194. package/dist/logging/access-reader.d.ts.map +1 -0
  195. package/dist/logging/access-reader.js +2 -0
  196. package/dist/logging/access-reader.js.map +1 -0
  197. package/dist/mcp/activity.d.ts +68 -0
  198. package/dist/mcp/activity.d.ts.map +1 -0
  199. package/dist/mcp/activity.js +111 -0
  200. package/dist/mcp/activity.js.map +1 -0
  201. package/dist/mcp/builder-registration.d.ts +24 -0
  202. package/dist/mcp/builder-registration.d.ts.map +1 -0
  203. package/dist/mcp/builder-registration.js +89 -0
  204. package/dist/mcp/builder-registration.js.map +1 -0
  205. package/dist/mcp/connection-api.d.ts +201 -0
  206. package/dist/mcp/connection-api.d.ts.map +1 -0
  207. package/dist/mcp/connection-api.js +506 -0
  208. package/dist/mcp/connection-api.js.map +1 -0
  209. package/dist/mcp/grantee.d.ts +52 -0
  210. package/dist/mcp/grantee.d.ts.map +1 -0
  211. package/dist/mcp/grantee.js +91 -0
  212. package/dist/mcp/grantee.js.map +1 -0
  213. package/dist/mcp/index.d.ts +12 -0
  214. package/dist/mcp/index.d.ts.map +1 -0
  215. package/dist/mcp/index.js +12 -0
  216. package/dist/mcp/index.js.map +1 -0
  217. package/dist/mcp/read-client.d.ts +176 -0
  218. package/dist/mcp/read-client.d.ts.map +1 -0
  219. package/dist/mcp/read-client.js +579 -0
  220. package/dist/mcp/read-client.js.map +1 -0
  221. package/dist/mcp/resources.d.ts +37 -0
  222. package/dist/mcp/resources.d.ts.map +1 -0
  223. package/dist/mcp/resources.js +114 -0
  224. package/dist/mcp/resources.js.map +1 -0
  225. package/dist/mcp/search/index.d.ts +34 -0
  226. package/dist/mcp/search/index.d.ts.map +1 -0
  227. package/dist/mcp/search/index.js +156 -0
  228. package/dist/mcp/search/index.js.map +1 -0
  229. package/dist/mcp/server.d.ts +72 -0
  230. package/dist/mcp/server.d.ts.map +1 -0
  231. package/dist/mcp/server.js +447 -0
  232. package/dist/mcp/server.js.map +1 -0
  233. package/dist/mcp/session.d.ts +160 -0
  234. package/dist/mcp/session.d.ts.map +1 -0
  235. package/dist/mcp/session.js +243 -0
  236. package/dist/mcp/session.js.map +1 -0
  237. package/dist/mcp/store.d.ts +13 -0
  238. package/dist/mcp/store.d.ts.map +1 -0
  239. package/dist/mcp/store.js +119 -0
  240. package/dist/mcp/store.js.map +1 -0
  241. package/dist/mcp/token-expiry.d.ts +38 -0
  242. package/dist/mcp/token-expiry.d.ts.map +1 -0
  243. package/dist/mcp/token-expiry.js +55 -0
  244. package/dist/mcp/token-expiry.js.map +1 -0
  245. package/dist/mcp/tools.d.ts +95 -0
  246. package/dist/mcp/tools.d.ts.map +1 -0
  247. package/dist/mcp/tools.js +1381 -0
  248. package/dist/mcp/tools.js.map +1 -0
  249. package/dist/mcp/types.d.ts +135 -0
  250. package/dist/mcp/types.d.ts.map +1 -0
  251. package/dist/mcp/types.js +24 -0
  252. package/dist/mcp/types.js.map +1 -0
  253. package/dist/payment/index.d.ts +2 -0
  254. package/dist/payment/index.d.ts.map +1 -0
  255. package/dist/payment/index.js +2 -0
  256. package/dist/payment/index.js.map +1 -0
  257. package/dist/payment/x402.d.ts +155 -0
  258. package/dist/payment/x402.d.ts.map +1 -0
  259. package/dist/payment/x402.js +402 -0
  260. package/dist/payment/x402.js.map +1 -0
  261. package/dist/pdpp/approval.d.ts +182 -0
  262. package/dist/pdpp/approval.d.ts.map +1 -0
  263. package/dist/pdpp/approval.js +337 -0
  264. package/dist/pdpp/approval.js.map +1 -0
  265. package/dist/pdpp/client-identity.d.ts +88 -0
  266. package/dist/pdpp/client-identity.d.ts.map +1 -0
  267. package/dist/pdpp/client-identity.js +183 -0
  268. package/dist/pdpp/client-identity.js.map +1 -0
  269. package/dist/pdpp/client-metadata.d.ts +95 -0
  270. package/dist/pdpp/client-metadata.d.ts.map +1 -0
  271. package/dist/pdpp/client-metadata.js +96 -0
  272. package/dist/pdpp/client-metadata.js.map +1 -0
  273. package/dist/pdpp/declaration.d.ts +118 -0
  274. package/dist/pdpp/declaration.d.ts.map +1 -0
  275. package/dist/pdpp/declaration.js +549 -0
  276. package/dist/pdpp/declaration.js.map +1 -0
  277. package/dist/pdpp/index.d.ts +35 -0
  278. package/dist/pdpp/index.d.ts.map +1 -0
  279. package/dist/pdpp/index.js +22 -0
  280. package/dist/pdpp/index.js.map +1 -0
  281. package/dist/pdpp/issuance.d.ts +91 -0
  282. package/dist/pdpp/issuance.d.ts.map +1 -0
  283. package/dist/pdpp/issuance.js +124 -0
  284. package/dist/pdpp/issuance.js.map +1 -0
  285. package/dist/pdpp/pkce.d.ts +53 -0
  286. package/dist/pdpp/pkce.d.ts.map +1 -0
  287. package/dist/pdpp/pkce.js +109 -0
  288. package/dist/pdpp/pkce.js.map +1 -0
  289. package/dist/pdpp/redirect.d.ts +60 -0
  290. package/dist/pdpp/redirect.d.ts.map +1 -0
  291. package/dist/pdpp/redirect.js +125 -0
  292. package/dist/pdpp/redirect.js.map +1 -0
  293. package/dist/pdpp/resolve.d.ts +53 -0
  294. package/dist/pdpp/resolve.d.ts.map +1 -0
  295. package/dist/pdpp/resolve.js +218 -0
  296. package/dist/pdpp/resolve.js.map +1 -0
  297. package/dist/pdpp/review.d.ts +155 -0
  298. package/dist/pdpp/review.d.ts.map +1 -0
  299. package/dist/pdpp/review.js +142 -0
  300. package/dist/pdpp/review.js.map +1 -0
  301. package/dist/pdpp/selection.d.ts +43 -0
  302. package/dist/pdpp/selection.d.ts.map +1 -0
  303. package/dist/pdpp/selection.js +211 -0
  304. package/dist/pdpp/selection.js.map +1 -0
  305. package/dist/pdpp/store.d.ts +204 -0
  306. package/dist/pdpp/store.d.ts.map +1 -0
  307. package/dist/pdpp/store.js +501 -0
  308. package/dist/pdpp/store.js.map +1 -0
  309. package/dist/pdpp/tokens.d.ts +149 -0
  310. package/dist/pdpp/tokens.d.ts.map +1 -0
  311. package/dist/pdpp/tokens.js +387 -0
  312. package/dist/pdpp/tokens.js.map +1 -0
  313. package/dist/pdpp/types.d.ts +258 -0
  314. package/dist/pdpp/types.d.ts.map +1 -0
  315. package/dist/pdpp/types.js +40 -0
  316. package/dist/pdpp/types.js.map +1 -0
  317. package/dist/pdpp-version.d.ts +28 -0
  318. package/dist/pdpp-version.d.ts.map +1 -0
  319. package/dist/pdpp-version.js +28 -0
  320. package/dist/pdpp-version.js.map +1 -0
  321. package/dist/policy/data-read.d.ts +56 -0
  322. package/dist/policy/data-read.d.ts.map +1 -0
  323. package/dist/policy/data-read.js +176 -0
  324. package/dist/policy/data-read.js.map +1 -0
  325. package/dist/policy/data-write.d.ts +69 -0
  326. package/dist/policy/data-write.d.ts.map +1 -0
  327. package/dist/policy/data-write.js +131 -0
  328. package/dist/policy/data-write.js.map +1 -0
  329. package/dist/policy/index.d.ts +4 -0
  330. package/dist/policy/index.d.ts.map +1 -0
  331. package/dist/policy/index.js +4 -0
  332. package/dist/policy/index.js.map +1 -0
  333. package/dist/policy/signed-artifacts.d.ts +17 -0
  334. package/dist/policy/signed-artifacts.d.ts.map +1 -0
  335. package/dist/policy/signed-artifacts.js +110 -0
  336. package/dist/policy/signed-artifacts.js.map +1 -0
  337. package/dist/ports/index.d.ts +243 -0
  338. package/dist/ports/index.d.ts.map +1 -0
  339. package/dist/ports/index.js +7 -0
  340. package/dist/ports/index.js.map +1 -0
  341. package/dist/ports/pdpp-auth.d.ts +103 -0
  342. package/dist/ports/pdpp-auth.d.ts.map +1 -0
  343. package/dist/ports/pdpp-auth.js +37 -0
  344. package/dist/ports/pdpp-auth.js.map +1 -0
  345. package/dist/ports/pdpp-auth.test-utils.d.ts +9 -0
  346. package/dist/ports/pdpp-auth.test-utils.d.ts.map +1 -0
  347. package/dist/ports/pdpp-auth.test-utils.js +18 -0
  348. package/dist/ports/pdpp-auth.test-utils.js.map +1 -0
  349. package/dist/schemas/server-config.d.ts +190 -0
  350. package/dist/schemas/server-config.d.ts.map +1 -0
  351. package/dist/schemas/server-config.js +282 -0
  352. package/dist/schemas/server-config.js.map +1 -0
  353. package/dist/signing/index.d.ts +3 -0
  354. package/dist/signing/index.d.ts.map +1 -0
  355. package/dist/signing/index.js +3 -0
  356. package/dist/signing/index.js.map +1 -0
  357. package/dist/signing/request-signer.d.ts +20 -0
  358. package/dist/signing/request-signer.d.ts.map +1 -0
  359. package/dist/signing/request-signer.js +23 -0
  360. package/dist/signing/request-signer.js.map +1 -0
  361. package/dist/signing/signer.d.ts +40 -0
  362. package/dist/signing/signer.d.ts.map +1 -0
  363. package/dist/signing/signer.js +56 -0
  364. package/dist/signing/signer.js.map +1 -0
  365. package/dist/storage/adapters/index.d.ts +4 -0
  366. package/dist/storage/adapters/index.d.ts.map +1 -0
  367. package/dist/storage/adapters/index.js +3 -0
  368. package/dist/storage/adapters/index.js.map +1 -0
  369. package/dist/storage/adapters/interface.d.ts +57 -0
  370. package/dist/storage/adapters/interface.d.ts.map +1 -0
  371. package/dist/storage/adapters/interface.js +2 -0
  372. package/dist/storage/adapters/interface.js.map +1 -0
  373. package/dist/storage/adapters/sdk.d.ts +23 -0
  374. package/dist/storage/adapters/sdk.d.ts.map +1 -0
  375. package/dist/storage/adapters/sdk.js +73 -0
  376. package/dist/storage/adapters/sdk.js.map +1 -0
  377. package/dist/storage/adapters/vana.d.ts +12 -0
  378. package/dist/storage/adapters/vana.d.ts.map +1 -0
  379. package/dist/storage/adapters/vana.js +111 -0
  380. package/dist/storage/adapters/vana.js.map +1 -0
  381. package/dist/storage/blocks/build.d.ts +20 -0
  382. package/dist/storage/blocks/build.d.ts.map +1 -0
  383. package/dist/storage/blocks/build.js +378 -0
  384. package/dist/storage/blocks/build.js.map +1 -0
  385. package/dist/storage/blocks/cursor.d.ts +33 -0
  386. package/dist/storage/blocks/cursor.d.ts.map +1 -0
  387. package/dist/storage/blocks/cursor.js +142 -0
  388. package/dist/storage/blocks/cursor.js.map +1 -0
  389. package/dist/storage/blocks/errors.d.ts +6 -0
  390. package/dist/storage/blocks/errors.d.ts.map +1 -0
  391. package/dist/storage/blocks/errors.js +9 -0
  392. package/dist/storage/blocks/errors.js.map +1 -0
  393. package/dist/storage/blocks/index.d.ts +6 -0
  394. package/dist/storage/blocks/index.d.ts.map +1 -0
  395. package/dist/storage/blocks/index.js +5 -0
  396. package/dist/storage/blocks/index.js.map +1 -0
  397. package/dist/storage/blocks/select.d.ts +29 -0
  398. package/dist/storage/blocks/select.d.ts.map +1 -0
  399. package/dist/storage/blocks/select.js +120 -0
  400. package/dist/storage/blocks/select.js.map +1 -0
  401. package/dist/storage/blocks/types.d.ts +56 -0
  402. package/dist/storage/blocks/types.d.ts.map +1 -0
  403. package/dist/storage/blocks/types.js +2 -0
  404. package/dist/storage/blocks/types.js.map +1 -0
  405. package/dist/storage/hierarchy/index.d.ts +3 -0
  406. package/dist/storage/hierarchy/index.d.ts.map +1 -0
  407. package/dist/storage/hierarchy/index.js +2 -0
  408. package/dist/storage/hierarchy/index.js.map +1 -0
  409. package/dist/storage/hierarchy/manager.d.ts +9 -0
  410. package/dist/storage/hierarchy/manager.d.ts.map +1 -0
  411. package/dist/storage/hierarchy/manager.js +2 -0
  412. package/dist/storage/hierarchy/manager.js.map +1 -0
  413. package/dist/storage/hierarchy/paths.d.ts +11 -0
  414. package/dist/storage/hierarchy/paths.d.ts.map +1 -0
  415. package/dist/storage/hierarchy/paths.js +43 -0
  416. package/dist/storage/hierarchy/paths.js.map +1 -0
  417. package/dist/storage/index/index.d.ts +3 -0
  418. package/dist/storage/index/index.d.ts.map +1 -0
  419. package/dist/storage/index/index.js +2 -0
  420. package/dist/storage/index/index.js.map +1 -0
  421. package/dist/storage/index/manager.d.ts +63 -0
  422. package/dist/storage/index/manager.d.ts.map +1 -0
  423. package/dist/storage/index/manager.js +2 -0
  424. package/dist/storage/index/manager.js.map +1 -0
  425. package/dist/storage/index/schema.d.ts +2 -0
  426. package/dist/storage/index/schema.d.ts.map +1 -0
  427. package/dist/storage/index/schema.js +2 -0
  428. package/dist/storage/index/schema.js.map +1 -0
  429. package/dist/storage/index/types.d.ts +37 -0
  430. package/dist/storage/index/types.d.ts.map +1 -0
  431. package/dist/storage/index/types.js +2 -0
  432. package/dist/storage/index/types.js.map +1 -0
  433. package/dist/storage/pdpp-records/cursor.d.ts +27 -0
  434. package/dist/storage/pdpp-records/cursor.d.ts.map +1 -0
  435. package/dist/storage/pdpp-records/cursor.js +49 -0
  436. package/dist/storage/pdpp-records/cursor.js.map +1 -0
  437. package/dist/storage/pdpp-records/enforcement.d.ts +37 -0
  438. package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -0
  439. package/dist/storage/pdpp-records/enforcement.js +79 -0
  440. package/dist/storage/pdpp-records/enforcement.js.map +1 -0
  441. package/dist/storage/pdpp-records/index.d.ts +8 -0
  442. package/dist/storage/pdpp-records/index.d.ts.map +1 -0
  443. package/dist/storage/pdpp-records/index.js +8 -0
  444. package/dist/storage/pdpp-records/index.js.map +1 -0
  445. package/dist/storage/pdpp-records/interface.d.ts +49 -0
  446. package/dist/storage/pdpp-records/interface.d.ts.map +1 -0
  447. package/dist/storage/pdpp-records/interface.js +2 -0
  448. package/dist/storage/pdpp-records/interface.js.map +1 -0
  449. package/dist/storage/pdpp-records/memory-store.d.ts +9 -0
  450. package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -0
  451. package/dist/storage/pdpp-records/memory-store.js +0 -0
  452. package/dist/storage/pdpp-records/memory-store.js.map +1 -0
  453. package/dist/storage/pdpp-records/record-key.d.ts +52 -0
  454. package/dist/storage/pdpp-records/record-key.d.ts.map +1 -0
  455. package/dist/storage/pdpp-records/record-key.js +97 -0
  456. package/dist/storage/pdpp-records/record-key.js.map +1 -0
  457. package/dist/storage/pdpp-records/stream-declaration.d.ts +43 -0
  458. package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -0
  459. package/dist/storage/pdpp-records/stream-declaration.js +17 -0
  460. package/dist/storage/pdpp-records/stream-declaration.js.map +1 -0
  461. package/dist/storage/pdpp-records/types.d.ts +93 -0
  462. package/dist/storage/pdpp-records/types.d.ts.map +1 -0
  463. package/dist/storage/pdpp-records/types.js +17 -0
  464. package/dist/storage/pdpp-records/types.js.map +1 -0
  465. package/dist/storage/preview.d.ts +12 -0
  466. package/dist/storage/preview.d.ts.map +1 -0
  467. package/dist/storage/preview.js +239 -0
  468. package/dist/storage/preview.js.map +1 -0
  469. package/dist/sync/cursor.d.ts +10 -0
  470. package/dist/sync/cursor.d.ts.map +1 -0
  471. package/dist/sync/cursor.js +2 -0
  472. package/dist/sync/cursor.js.map +1 -0
  473. package/dist/sync/data-point-feed.d.ts +35 -0
  474. package/dist/sync/data-point-feed.d.ts.map +1 -0
  475. package/dist/sync/data-point-feed.js +122 -0
  476. package/dist/sync/data-point-feed.js.map +1 -0
  477. package/dist/sync/data-point-id.d.ts +7 -0
  478. package/dist/sync/data-point-id.d.ts.map +1 -0
  479. package/dist/sync/data-point-id.js +16 -0
  480. package/dist/sync/data-point-id.js.map +1 -0
  481. package/dist/sync/delete-data-port.d.ts +50 -0
  482. package/dist/sync/delete-data-port.d.ts.map +1 -0
  483. package/dist/sync/delete-data-port.js +244 -0
  484. package/dist/sync/delete-data-port.js.map +1 -0
  485. package/dist/sync/engine/sync-manager.d.ts +58 -0
  486. package/dist/sync/engine/sync-manager.d.ts.map +1 -0
  487. package/dist/sync/engine/sync-manager.js +285 -0
  488. package/dist/sync/engine/sync-manager.js.map +1 -0
  489. package/dist/sync/index.d.ts +15 -0
  490. package/dist/sync/index.d.ts.map +1 -0
  491. package/dist/sync/index.js +14 -0
  492. package/dist/sync/index.js.map +1 -0
  493. package/dist/sync/issues.d.ts +55 -0
  494. package/dist/sync/issues.d.ts.map +1 -0
  495. package/dist/sync/issues.js +168 -0
  496. package/dist/sync/issues.js.map +1 -0
  497. package/dist/sync/pdpp-import.d.ts +192 -0
  498. package/dist/sync/pdpp-import.d.ts.map +1 -0
  499. package/dist/sync/pdpp-import.js +422 -0
  500. package/dist/sync/pdpp-import.js.map +1 -0
  501. package/dist/sync/pending-blob-deletions.d.ts +29 -0
  502. package/dist/sync/pending-blob-deletions.d.ts.map +1 -0
  503. package/dist/sync/pending-blob-deletions.js +116 -0
  504. package/dist/sync/pending-blob-deletions.js.map +1 -0
  505. package/dist/sync/retry-memory.d.ts +33 -0
  506. package/dist/sync/retry-memory.d.ts.map +1 -0
  507. package/dist/sync/retry-memory.js +68 -0
  508. package/dist/sync/retry-memory.js.map +1 -0
  509. package/dist/sync/scope-deletions.d.ts +155 -0
  510. package/dist/sync/scope-deletions.d.ts.map +1 -0
  511. package/dist/sync/scope-deletions.js +225 -0
  512. package/dist/sync/scope-deletions.js.map +1 -0
  513. package/dist/sync/tombstone.d.ts +27 -0
  514. package/dist/sync/tombstone.d.ts.map +1 -0
  515. package/dist/sync/tombstone.js +28 -0
  516. package/dist/sync/tombstone.js.map +1 -0
  517. package/dist/sync/types.d.ts +27 -0
  518. package/dist/sync/types.d.ts.map +1 -0
  519. package/dist/sync/types.js +2 -0
  520. package/dist/sync/types.js.map +1 -0
  521. package/dist/sync/workers/delete.d.ts +163 -0
  522. package/dist/sync/workers/delete.d.ts.map +1 -0
  523. package/dist/sync/workers/delete.js +474 -0
  524. package/dist/sync/workers/delete.js.map +1 -0
  525. package/dist/sync/workers/download.d.ts +159 -0
  526. package/dist/sync/workers/download.d.ts.map +1 -0
  527. package/dist/sync/workers/download.js +731 -0
  528. package/dist/sync/workers/download.js.map +1 -0
  529. package/dist/sync/workers/upload.d.ts +98 -0
  530. package/dist/sync/workers/upload.d.ts.map +1 -0
  531. package/dist/sync/workers/upload.js +412 -0
  532. package/dist/sync/workers/upload.js.map +1 -0
  533. package/dist/test-utils/e2ee-fixtures.d.ts +94 -0
  534. package/dist/test-utils/e2ee-fixtures.d.ts.map +1 -0
  535. package/dist/test-utils/e2ee-fixtures.js +116 -0
  536. package/dist/test-utils/e2ee-fixtures.js.map +1 -0
  537. package/dist/test-utils/e2ee-gateway.d.ts +61 -0
  538. package/dist/test-utils/e2ee-gateway.d.ts.map +1 -0
  539. package/dist/test-utils/e2ee-gateway.js +248 -0
  540. package/dist/test-utils/e2ee-gateway.js.map +1 -0
  541. package/dist/test-utils/index.d.ts +5 -0
  542. package/dist/test-utils/index.d.ts.map +1 -0
  543. package/dist/test-utils/index.js +5 -0
  544. package/dist/test-utils/index.js.map +1 -0
  545. package/dist/test-utils/memory-storage.d.ts +12 -0
  546. package/dist/test-utils/memory-storage.d.ts.map +1 -0
  547. package/dist/test-utils/memory-storage.js +146 -0
  548. package/dist/test-utils/memory-storage.js.map +1 -0
  549. package/dist/test-utils/wallet.d.ts +47 -0
  550. package/dist/test-utils/wallet.d.ts.map +1 -0
  551. package/dist/test-utils/wallet.js +98 -0
  552. package/dist/test-utils/wallet.js.map +1 -0
  553. package/dist/write/attribution.d.ts +185 -0
  554. package/dist/write/attribution.d.ts.map +1 -0
  555. package/dist/write/attribution.js +450 -0
  556. package/dist/write/attribution.js.map +1 -0
  557. package/dist/write/authorize.d.ts +77 -0
  558. package/dist/write/authorize.d.ts.map +1 -0
  559. package/dist/write/authorize.js +109 -0
  560. package/dist/write/authorize.js.map +1 -0
  561. package/dist/write/index.d.ts +5 -0
  562. package/dist/write/index.d.ts.map +1 -0
  563. package/dist/write/index.js +5 -0
  564. package/dist/write/index.js.map +1 -0
  565. package/dist/write/route.d.ts +61 -0
  566. package/dist/write/route.d.ts.map +1 -0
  567. package/dist/write/route.js +132 -0
  568. package/dist/write/route.js.map +1 -0
  569. package/dist/write/session.d.ts +96 -0
  570. package/dist/write/session.d.ts.map +1 -0
  571. package/dist/write/session.js +136 -0
  572. package/dist/write/session.js.map +1 -0
  573. package/package.json +175 -0
@@ -0,0 +1,422 @@
1
+ /**
2
+ * Import qualifying synced DataPipe envelopes into the PDPP record store.
3
+ *
4
+ * The production path already existed end to end: Unity's OwnerDataClient
5
+ * writes an encrypted `DataFileEnvelope` and registers it with the Gateway,
6
+ * and `sync/workers/download.ts` downloads, decrypts and indexes it. What was
7
+ * missing was the last hop — that decrypted envelope reaching the PDPP record
8
+ * store, so a grant-bound client can read it. This module is that hop, and
9
+ * nothing else: it does not fetch, does not decrypt, and does not open a
10
+ * second ingestion surface. There is no web HTTP ingest here by design; the
11
+ * encrypted owner-data transport stays the only way data arrives.
12
+ *
13
+ * Why the metadata lives in `data.$pdpp`
14
+ * -------------------------------------
15
+ * The SDK's `DataFileEnvelopeSchema` accepts only `$schema`, `version`,
16
+ * `scope`, `schemaId`, `collectedAt` and `data`, and STRIPS unknown top-level
17
+ * keys. A `$pdpp` sibling of `scope` would therefore be silently deleted in
18
+ * transit — not rejected, deleted — so the producer nests it inside `data`,
19
+ * the one field whose interior the transport preserves verbatim. That is a
20
+ * transport constraint, not a preference.
21
+ *
22
+ * The consequence this module owns: `$pdpp` is import metadata that arrived
23
+ * inside the payload, so it must be removed before the record is stored.
24
+ * Otherwise every PDPP read would serve back a `$pdpp` blob that is not part
25
+ * of the source's declared schema, and a field projection computed from the
26
+ * declaration would not cover it.
27
+ *
28
+ * What is verified before anything is written
29
+ * -------------------------------------------
30
+ * Every check below is a fail-closed rejection, because the alternative is
31
+ * importing a record whose identity or authority we could not confirm:
32
+ *
33
+ * 1. `$pdpp.version === 1`. An unknown metadata version is refused rather
34
+ * than interpreted under this version's assumptions.
35
+ * 2. The declaration digest is recomputed over the EXACT retained
36
+ * declaration document this deployment booted with, and must equal the
37
+ * digest the producer claims. This is the check that makes the rest
38
+ * meaningful: without it the producer would be asserting its own
39
+ * authority over the stream shape it is being validated against.
40
+ * 3. `scope`, `stream.name` and `primaryKey` must agree with that same
41
+ * declaration, and `record.key` must agree with the payload's actual
42
+ * primary-key values.
43
+ *
44
+ * Only then is `$pdpp` stripped and the record handed to the store.
45
+ *
46
+ * Instance derivation is PS-owned
47
+ * -------------------------------
48
+ * The producer supplies no instance id and must not: an instance handle is a
49
+ * statement about this deployment's connection inventory, which the producer
50
+ * cannot observe. The importer derives it through the same function the
51
+ * authorization and resource servers use, so an imported record is readable
52
+ * under a grant issued for the same source. An id that cannot be derived is a
53
+ * rejection, never an invention.
54
+ */
55
+ import { computeRecordKeyFromData } from "../storage/pdpp-records/record-key.js";
56
+ /** The reserved key carrying PDPP import metadata inside `data`. */
57
+ export const PDPP_METADATA_KEY = "$pdpp";
58
+ /** The only `$pdpp.version` this importer understands. */
59
+ export const SUPPORTED_PDPP_METADATA_VERSION = 1;
60
+ /**
61
+ * Rejection codes that describe the ENVELOPE rather than this deployment's
62
+ * current state. They are permanent verdicts: the same bytes re-read on a
63
+ * later cycle produce the same answer, so retrying them is work that can
64
+ * never succeed.
65
+ *
66
+ * `unknown_source` and `no_instance` are deliberately NOT here. Both depend
67
+ * on what this deployment has mounted — a declaration that is not retained
68
+ * yet, or an instance inventory that is not populated yet — and both start
69
+ * working once boot completes or an operator provisions the declaration.
70
+ * Treating them as permanent is exactly how an envelope gets stranded.
71
+ * `store_rejected` is likewise excluded: the store is infrastructure, and a
72
+ * write it refuses today may be accepted once it is healthy.
73
+ */
74
+ const PERMANENT_REJECTION_CODES = new Set([
75
+ "malformed_metadata",
76
+ "unsupported_metadata_version",
77
+ "digest_mismatch",
78
+ "declaration_version_mismatch",
79
+ "scope_mismatch",
80
+ "unknown_stream",
81
+ "primary_key_mismatch",
82
+ "semantics_mismatch",
83
+ "record_key_mismatch",
84
+ ]);
85
+ /**
86
+ * Whether a rejection is a settled verdict about the envelope itself.
87
+ *
88
+ * Callers use this to decide whether re-offering the same envelope later
89
+ * could ever change the answer. Fail-closed by construction: an unrecognized
90
+ * code is treated as transient, so a new failure mode is retried (visibly,
91
+ * with a logged outcome) rather than silently abandoned.
92
+ */
93
+ export function isPermanentRejection(rejection) {
94
+ return PERMANENT_REJECTION_CODES.has(rejection.code);
95
+ }
96
+ function reject(code, message) {
97
+ return { status: "rejected", rejection: { code, message } };
98
+ }
99
+ /**
100
+ * Normalize a claimed digest to bare lowercase hex.
101
+ *
102
+ * The producer contract writes `sha256:<hex>`; this repo's
103
+ * `computeDeclarationDigest` returns bare hex with no prefix. Accepting both
104
+ * spellings of the same SHA-256 value keeps the two sides interoperable
105
+ * without either silently coercing the other. Any OTHER algorithm prefix
106
+ * returns null and fails the import: treating `md5:...` as if it were the
107
+ * SHA-256 we computed would turn the digest check into decoration.
108
+ */
109
+ export function normalizeDigest(claimed) {
110
+ const trimmed = claimed.trim().toLowerCase();
111
+ const colon = trimmed.indexOf(":");
112
+ if (colon === -1)
113
+ return /^[0-9a-f]{64}$/.test(trimmed) ? trimmed : null;
114
+ if (trimmed.slice(0, colon) !== "sha256")
115
+ return null;
116
+ const hex = trimmed.slice(colon + 1);
117
+ return /^[0-9a-f]{64}$/.test(hex) ? hex : null;
118
+ }
119
+ function isRecord(value) {
120
+ return typeof value === "object" && value !== null && !Array.isArray(value);
121
+ }
122
+ /**
123
+ * Read `data.$pdpp` into a typed shape, or explain why it is not usable.
124
+ *
125
+ * Returns `null` for "no metadata present", which is the ordinary legacy
126
+ * case and must stay distinguishable from a malformed `$pdpp` — a producer
127
+ * that writes broken metadata should be visible, not silently treated as a
128
+ * legacy write.
129
+ */
130
+ function readMetadata(data) {
131
+ if (!isRecord(data))
132
+ return null;
133
+ const raw = data[PDPP_METADATA_KEY];
134
+ if (raw === undefined)
135
+ return null;
136
+ if (!isRecord(raw))
137
+ return { ok: false, reason: "$pdpp is not an object" };
138
+ if (typeof raw.version !== "number") {
139
+ return { ok: false, reason: "$pdpp.version is missing or not a number" };
140
+ }
141
+ if (typeof raw.sourceId !== "string" || raw.sourceId.length === 0) {
142
+ return { ok: false, reason: "$pdpp.sourceId is missing" };
143
+ }
144
+ const declaration = raw.declaration;
145
+ if (!isRecord(declaration)) {
146
+ return { ok: false, reason: "$pdpp.declaration is missing" };
147
+ }
148
+ if (typeof declaration.digest !== "string" ||
149
+ declaration.digest.length === 0) {
150
+ return { ok: false, reason: "$pdpp.declaration.digest is missing" };
151
+ }
152
+ if (typeof declaration.version !== "string") {
153
+ return { ok: false, reason: "$pdpp.declaration.version is missing" };
154
+ }
155
+ const stream = raw.stream;
156
+ if (!isRecord(stream))
157
+ return { ok: false, reason: "$pdpp.stream is missing" };
158
+ if (typeof stream.name !== "string" || stream.name.length === 0) {
159
+ return { ok: false, reason: "$pdpp.stream.name is missing" };
160
+ }
161
+ if (typeof stream.scope !== "string" || stream.scope.length === 0) {
162
+ return { ok: false, reason: "$pdpp.stream.scope is missing" };
163
+ }
164
+ if (!Array.isArray(stream.primaryKey) ||
165
+ stream.primaryKey.length === 0 ||
166
+ !stream.primaryKey.every((f) => typeof f === "string")) {
167
+ return { ok: false, reason: "$pdpp.stream.primaryKey is missing" };
168
+ }
169
+ const record = raw.record;
170
+ if (!isRecord(record))
171
+ return { ok: false, reason: "$pdpp.record is missing" };
172
+ if (!isRecord(record.key)) {
173
+ return { ok: false, reason: "$pdpp.record.key is missing" };
174
+ }
175
+ const op = record.op ?? "upsert";
176
+ if (op !== "upsert" && op !== "delete") {
177
+ return {
178
+ ok: false,
179
+ reason: `$pdpp.record.op '${String(op)}' is not valid`,
180
+ };
181
+ }
182
+ return {
183
+ ok: true,
184
+ meta: {
185
+ version: raw.version,
186
+ sourceId: raw.sourceId,
187
+ declaration: {
188
+ source: typeof declaration.source === "string" ? declaration.source : "",
189
+ version: declaration.version,
190
+ upstreamCommit: typeof declaration.upstreamCommit === "string"
191
+ ? declaration.upstreamCommit
192
+ : null,
193
+ digest: declaration.digest,
194
+ },
195
+ stream: {
196
+ name: stream.name,
197
+ scope: stream.scope,
198
+ semantics: typeof stream.semantics === "string" ? stream.semantics : "",
199
+ primaryKey: stream.primaryKey,
200
+ },
201
+ record: { key: record.key, op },
202
+ ...(isRecord(raw.run) && {
203
+ run: {
204
+ ...(typeof raw.run.id === "string" && { id: raw.run.id }),
205
+ ...(typeof raw.run.source === "string" && { source: raw.run.source }),
206
+ },
207
+ }),
208
+ },
209
+ };
210
+ }
211
+ /** Remove `$pdpp` without mutating the caller's object. */
212
+ function stripMetadata(data) {
213
+ const { [PDPP_METADATA_KEY]: _dropped, ...rest } = data;
214
+ return rest;
215
+ }
216
+ function sameArray(a, b) {
217
+ return a.length === b.length && a.every((v, i) => v === b[i]);
218
+ }
219
+ /**
220
+ * Deep structural equality over JSON-shaped values.
221
+ *
222
+ * Used only to decide "did this record actually change?". Key order must not
223
+ * count as a change: the producer re-serializes the payload on every run, so
224
+ * an order-sensitive comparison would report every re-sync as a new version
225
+ * and fill `changes_since` with records that are byte-identical to what a
226
+ * client already read.
227
+ */
228
+ function jsonEqual(a, b) {
229
+ if (a === b)
230
+ return true;
231
+ if (typeof a !== typeof b)
232
+ return false;
233
+ if (a === null || b === null)
234
+ return false;
235
+ if (Array.isArray(a) || Array.isArray(b)) {
236
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
237
+ return false;
238
+ }
239
+ return a.every((item, i) => jsonEqual(item, b[i]));
240
+ }
241
+ if (typeof a !== "object")
242
+ return false;
243
+ const ao = a;
244
+ const bo = b;
245
+ const aKeys = Object.keys(ao).sort();
246
+ const bKeys = Object.keys(bo).sort();
247
+ if (!sameArray(aKeys, bKeys))
248
+ return false;
249
+ return aKeys.every((k) => jsonEqual(ao[k], bo[k]));
250
+ }
251
+ export function createPdppImporter(deps) {
252
+ const { store, logger } = deps;
253
+ const bySourceId = new Map();
254
+ for (const declaration of deps.declarations) {
255
+ bySourceId.set(declaration.sourceId, declaration);
256
+ }
257
+ /**
258
+ * Versions whose import outcome cannot change on a later offer. Bounded by
259
+ * the number of distinct (scope, collectedAt) pairs this process sees, and
260
+ * holding only a short key per entry.
261
+ */
262
+ const settled = new Set();
263
+ const versionKey = (scope, collectedAt) => `${scope}@${collectedAt}`;
264
+ function needsRetry(scope, collectedAt) {
265
+ return !settled.has(versionKey(scope, collectedAt));
266
+ }
267
+ /**
268
+ * Record whether this version is done with, so the retry path can stop
269
+ * reading it back off disk every cycle.
270
+ *
271
+ * Only a transient rejection stays unsettled — that is the one outcome a
272
+ * later cycle can genuinely improve on.
273
+ */
274
+ function importAndSettle(envelope) {
275
+ const outcome = importEnvelope(envelope);
276
+ const retryable = outcome.status === "rejected" && !isPermanentRejection(outcome.rejection);
277
+ if (!retryable) {
278
+ settled.add(versionKey(envelope.scope, envelope.collectedAt));
279
+ }
280
+ return outcome;
281
+ }
282
+ function importEnvelope(envelope) {
283
+ const read = readMetadata(envelope.data);
284
+ if (read === null)
285
+ return { status: "skipped" };
286
+ if (!read.ok)
287
+ return reject("malformed_metadata", read.reason);
288
+ const meta = read.meta;
289
+ if (meta.version !== SUPPORTED_PDPP_METADATA_VERSION) {
290
+ return reject("unsupported_metadata_version", `$pdpp.version ${meta.version} is not supported (expected ${SUPPORTED_PDPP_METADATA_VERSION})`);
291
+ }
292
+ const retained = bySourceId.get(meta.sourceId);
293
+ if (!retained) {
294
+ return reject("unknown_source", `no retained declaration for source '${meta.sourceId}'`);
295
+ }
296
+ // The digest gate. Everything after this point is validated against a
297
+ // document we have confirmed is the one the producer claims to have read.
298
+ const claimed = normalizeDigest(meta.declaration.digest);
299
+ if (claimed === null) {
300
+ return reject("digest_mismatch", `declaration digest '${meta.declaration.digest}' is not a recognized sha256 digest`);
301
+ }
302
+ if (claimed !== retained.documentDigest.trim().toLowerCase()) {
303
+ return reject("digest_mismatch", `declaration digest does not match the retained declaration for '${meta.sourceId}'`);
304
+ }
305
+ if (meta.declaration.version !== retained.version) {
306
+ return reject("declaration_version_mismatch", `declaration version '${meta.declaration.version}' does not match retained version '${retained.version}'`);
307
+ }
308
+ // The scope the envelope was transported under must be the scope the
309
+ // metadata claims. Without this, metadata for one scope could ride on a
310
+ // blob decrypted under another scope's key.
311
+ if (meta.stream.scope !== envelope.scope) {
312
+ return reject("scope_mismatch", `$pdpp.stream.scope '${meta.stream.scope}' does not match envelope scope '${envelope.scope}'`);
313
+ }
314
+ const declaredStream = retained.streams.find((s) => s.name === meta.stream.name);
315
+ if (!declaredStream) {
316
+ return reject("unknown_stream", `stream '${meta.stream.name}' is not declared by the retained declaration for '${meta.sourceId}'`);
317
+ }
318
+ if (!sameArray(meta.stream.primaryKey, declaredStream.primaryKey)) {
319
+ return reject("primary_key_mismatch", `stream '${meta.stream.name}' declares primary key [${declaredStream.primaryKey.join(", ")}] but the envelope claims [${meta.stream.primaryKey.join(", ")}]`);
320
+ }
321
+ if (meta.stream.semantics.length > 0 &&
322
+ meta.stream.semantics !== declaredStream.semantics) {
323
+ return reject("semantics_mismatch", `stream '${meta.stream.name}' is ${declaredStream.semantics} here but the envelope claims '${meta.stream.semantics}'`);
324
+ }
325
+ const instance = deps.instanceFor(meta.sourceId);
326
+ if (!instance) {
327
+ return reject("no_instance", `no instance handle could be derived for source '${meta.sourceId}'`);
328
+ }
329
+ if (!isRecord(envelope.data)) {
330
+ return reject("malformed_metadata", "envelope data is not an object");
331
+ }
332
+ const payload = stripMetadata(envelope.data);
333
+ // `record.key` is the producer's claim about identity; the payload is the
334
+ // record. They must agree, or the record would be stored under a key that
335
+ // does not describe it — and a grant naming that key would authorize the
336
+ // wrong row.
337
+ let keyFromData;
338
+ let keyFromClaim;
339
+ try {
340
+ keyFromData = computeRecordKeyFromData(payload, declaredStream.primaryKey);
341
+ keyFromClaim = computeRecordKeyFromData(meta.record.key, declaredStream.primaryKey);
342
+ }
343
+ catch (err) {
344
+ return reject("record_key_mismatch", err.message);
345
+ }
346
+ if (keyFromData !== keyFromClaim) {
347
+ return reject("record_key_mismatch", "$pdpp.record.key does not match the payload's primary key values");
348
+ }
349
+ // Idempotency. `ingestBatch` allocates a NEW version on every accepted
350
+ // mutable_state upsert, so an unconditional re-ingest would bump the
351
+ // version and publish a `changes_since` entry every time the sync worker
352
+ // re-downloads an unchanged record — which it does on any full reconcile
353
+ // or retry. Comparing against the stored row first is what makes a repeat
354
+ // sync a no-op rather than a fabricated change.
355
+ // `getRecord` returns undefined for a deleted row as well as an absent
356
+ // one, which is exactly the distinction both branches below need.
357
+ const existing = store.getRecord(instance, meta.stream.name, keyFromData);
358
+ const unchanged = {
359
+ status: "unchanged",
360
+ instance,
361
+ stream: meta.stream.name,
362
+ recordKey: keyFromData,
363
+ };
364
+ if (meta.record.op === "delete") {
365
+ // A delete for a record we do not currently hold changes nothing.
366
+ // Ingesting it would write a tombstone announcing the removal of
367
+ // something this store never served — a fabricated change.
368
+ if (!existing)
369
+ return unchanged;
370
+ }
371
+ else if (existing &&
372
+ jsonEqual(existing.data, payload) &&
373
+ existing.emittedAt === envelope.collectedAt) {
374
+ return unchanged;
375
+ }
376
+ // A single-field key must stay a bare string. `encodeRecordKey` treats an
377
+ // array as a COMPOUND key and JSON-encodes it, so wrapping a lone value
378
+ // in an array would produce `["235680975"]` where the data yields
379
+ // `235680975` — a key/data mismatch the store rejects, on every record of
380
+ // every single-key stream.
381
+ const components = declaredStream.primaryKey.map((f) => String(payload[f]));
382
+ const input = {
383
+ instance,
384
+ stream: meta.stream.name,
385
+ key: components.length === 1 ? components[0] : components,
386
+ data: meta.record.op === "delete" ? null : payload,
387
+ emitted_at: envelope.collectedAt,
388
+ op: meta.record.op,
389
+ };
390
+ // One envelope per call, but through the batch API so the store's own
391
+ // transaction wraps the write: a failure rolls back rather than leaving
392
+ // a row without its history entry.
393
+ const result = store.ingestBatch([input], () => declaredStream.semantics, () => declaredStream.primaryKey);
394
+ if (result.rejected.length > 0) {
395
+ return reject("store_rejected", result.rejected[0].reason);
396
+ }
397
+ if (result.accepted === 0) {
398
+ // append_only duplicate: the store treats it as a no-op, and so do we.
399
+ return {
400
+ status: "unchanged",
401
+ instance,
402
+ stream: meta.stream.name,
403
+ recordKey: keyFromData,
404
+ };
405
+ }
406
+ logger.info({
407
+ instance,
408
+ stream: meta.stream.name,
409
+ sourceId: meta.sourceId,
410
+ op: meta.record.op,
411
+ ...(meta.run?.id && { runId: meta.run.id }),
412
+ }, "Imported synced DataPipe record into the PDPP record store");
413
+ return {
414
+ status: "imported",
415
+ instance,
416
+ stream: meta.stream.name,
417
+ recordKey: keyFromData,
418
+ };
419
+ }
420
+ return { importEnvelope: importAndSettle, needsRetry };
421
+ }
422
+ //# sourceMappingURL=pdpp-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdpp-import.js","sourceRoot":"","sources":["../../src/sync/pdpp-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { PendingBlobDeletion, PendingBlobDeletionStore } from "../ports/index.js";
2
+ /**
3
+ * Minimal persistence seam for the pending-blob-deletion markers. Hosts
4
+ * supply the storage (a JSON file on Node, IndexedDB state in the browser);
5
+ * the store keeps the set semantics, de-duplication and mutation ordering in
6
+ * one place. `write` must replace the whole value atomically (tmp + rename on
7
+ * disk, a single IndexedDB put in the browser) so a crash mid-write cannot
8
+ * leave a torn marker file.
9
+ */
10
+ export interface PendingBlobDeletionKv {
11
+ read(): Promise<PendingBlobDeletion[] | null>;
12
+ write(keys: PendingBlobDeletion[]): Promise<void>;
13
+ }
14
+ /**
15
+ * Accept the stored value from either marker generation: exact keys
16
+ * (`{ scope, version }`) or the pre-key format that recorded whole scopes,
17
+ * which maps to a version-less marker the retry expands into exact keys.
18
+ */
19
+ export declare function normalizePendingBlobDeletions(stored: unknown): PendingBlobDeletion[];
20
+ /**
21
+ * Every operation is a read-modify-write of the whole marker set, so the
22
+ * store serialises them: a delete recording keys while a sync cycle's retry
23
+ * clears others must not lose either update. Ordering is FIFO, and a failed
24
+ * operation never blocks the ones queued behind it.
25
+ */
26
+ export declare function createPendingBlobDeletionStore(kv: PendingBlobDeletionKv): PendingBlobDeletionStore;
27
+ /** Non-durable store: markers survive only for the process lifetime. */
28
+ export declare function createMemoryPendingBlobDeletionStore(): PendingBlobDeletionStore;
29
+ //# sourceMappingURL=pending-blob-deletions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-blob-deletions.d.ts","sourceRoot":"","sources":["../../src/sync/pending-blob-deletions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAwBD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,GACd,mBAAmB,EAAE,CAwBvB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,qBAAqB,GACxB,wBAAwB,CAgD1B;AAED,wEAAwE;AACxE,wBAAgB,oCAAoC,IAAI,wBAAwB,CAU/E"}
@@ -0,0 +1,116 @@
1
+ function markerId(key) {
2
+ const range = key.range ? `${key.range.from}-${key.range.to}` : "";
3
+ return `${key.scope}\u0000${key.version ?? ""}\u0000${range}`;
4
+ }
5
+ function normalizeRange(value) {
6
+ if (typeof value !== "object" || value === null)
7
+ return undefined;
8
+ const { from, to } = value;
9
+ if (typeof from !== "string" ||
10
+ typeof to !== "string" ||
11
+ !/^\d+$/.test(from) ||
12
+ !/^\d+$/.test(to) ||
13
+ BigInt(from) > BigInt(to)) {
14
+ return undefined;
15
+ }
16
+ return { from, to };
17
+ }
18
+ /**
19
+ * Accept the stored value from either marker generation: exact keys
20
+ * (`{ scope, version }`) or the pre-key format that recorded whole scopes,
21
+ * which maps to a version-less marker the retry expands into exact keys.
22
+ */
23
+ export function normalizePendingBlobDeletions(stored) {
24
+ if (!Array.isArray(stored))
25
+ return [];
26
+ const keys = [];
27
+ for (const item of stored) {
28
+ if (typeof item === "string") {
29
+ keys.push({ scope: item, version: null });
30
+ }
31
+ else if (typeof item === "object" &&
32
+ item !== null &&
33
+ typeof item.scope === "string") {
34
+ const version = item.version;
35
+ const range = typeof version === "string"
36
+ ? undefined
37
+ : normalizeRange(item.range);
38
+ keys.push({
39
+ scope: item.scope,
40
+ version: typeof version === "string" ? version : null,
41
+ ...(range ? { range } : {}),
42
+ });
43
+ }
44
+ }
45
+ return keys;
46
+ }
47
+ /**
48
+ * Every operation is a read-modify-write of the whole marker set, so the
49
+ * store serialises them: a delete recording keys while a sync cycle's retry
50
+ * clears others must not lose either update. Ordering is FIFO, and a failed
51
+ * operation never blocks the ones queued behind it.
52
+ */
53
+ export function createPendingBlobDeletionStore(kv) {
54
+ let queue = Promise.resolve();
55
+ function serialized(operation) {
56
+ const run = queue.then(operation, operation);
57
+ queue = run.catch(() => undefined);
58
+ return run;
59
+ }
60
+ async function current() {
61
+ return normalizePendingBlobDeletions(await kv.read());
62
+ }
63
+ return {
64
+ list() {
65
+ return serialized(current);
66
+ },
67
+ add(keys) {
68
+ return serialized(async () => {
69
+ if (keys.length === 0)
70
+ return;
71
+ const existing = await current();
72
+ const known = new Set(existing.map(markerId));
73
+ const next = [...existing];
74
+ for (const key of keys) {
75
+ const id = markerId(key);
76
+ if (known.has(id))
77
+ continue;
78
+ known.add(id);
79
+ next.push({
80
+ scope: key.scope,
81
+ version: key.version,
82
+ ...(key.range ? { range: { ...key.range } } : {}),
83
+ });
84
+ }
85
+ if (next.length === existing.length)
86
+ return;
87
+ await kv.write(next);
88
+ });
89
+ },
90
+ remove(keys) {
91
+ return serialized(async () => {
92
+ if (keys.length === 0)
93
+ return;
94
+ const existing = await current();
95
+ const gone = new Set(keys.map(markerId));
96
+ const next = existing.filter((key) => !gone.has(markerId(key)));
97
+ if (next.length === existing.length)
98
+ return;
99
+ await kv.write(next);
100
+ });
101
+ },
102
+ };
103
+ }
104
+ /** Non-durable store: markers survive only for the process lifetime. */
105
+ export function createMemoryPendingBlobDeletionStore() {
106
+ let keys = [];
107
+ return createPendingBlobDeletionStore({
108
+ async read() {
109
+ return keys;
110
+ },
111
+ async write(next) {
112
+ keys = next.map((key) => ({ ...key }));
113
+ },
114
+ });
115
+ }
116
+ //# sourceMappingURL=pending-blob-deletions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-blob-deletions.js","sourceRoot":"","sources":["../../src/sync/pending-blob-deletions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type DownloadAttemptDecision = "attempt" | "backoff" | "give-up";
2
+ export interface DownloadRetryMemoryOptions {
3
+ /** Attempt cap for retryable failures (default 5). */
4
+ maxTransientAttempts?: number;
5
+ /** Base backoff, doubled per failed attempt (default 30s). */
6
+ backoffBaseMs?: number;
7
+ /** Clock override for tests. */
8
+ now?: () => number;
9
+ }
10
+ export declare const DEFAULT_MAX_TRANSIENT_ATTEMPTS = 5;
11
+ export declare const DEFAULT_BACKOFF_BASE_MS = 30000;
12
+ export interface DownloadRetryMemory {
13
+ /** Whether the next download of `key` should run, wait, or never happen. */
14
+ decide(key: string): DownloadAttemptDecision;
15
+ /** Record a failed attempt; `retryable` follows the issue classification. */
16
+ recordFailure(key: string, retryable: boolean): void;
17
+ /** Clear the failure history after a successful download. */
18
+ recordSuccess(key: string): void;
19
+ /**
20
+ * The listing restarted from the beginning (repair pass / full
21
+ * reconcile) — give transient failures a fresh attempt budget so the
22
+ * reset can actually re-fetch what it re-lists. Deterministic (404)
23
+ * entries stay dead: re-listing doesn't make missing bytes appear.
24
+ */
25
+ onListingReset(): void;
26
+ }
27
+ /** Retry-memory key for a data-point record: id + version. */
28
+ export declare function downloadRetryKey(record: {
29
+ id: string;
30
+ expectedVersion: string;
31
+ }): string;
32
+ export declare function createDownloadRetryMemory(options?: DownloadRetryMemoryOptions): DownloadRetryMemory;
33
+ //# sourceMappingURL=retry-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-memory.d.ts","sourceRoot":"","sources":["../../src/sync/retry-memory.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC7C,6EAA6E;IAC7E,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,6DAA6D;IAC7D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;OAKG;IACH,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAET;AAQD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CA4CrB"}