@opendatalabs/personal-server-ts-core 1.34.2 → 1.35.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 (414) hide show
  1. package/dist/additions/durable.d.ts +32 -2
  2. package/dist/additions/durable.d.ts.map +1 -1
  3. package/dist/additions/durable.js +237 -88
  4. package/dist/additions/durable.js.map +1 -1
  5. package/dist/additions/version-inventory.d.ts +4 -0
  6. package/dist/additions/version-inventory.d.ts.map +1 -1
  7. package/dist/additions/version-inventory.js +11 -1
  8. package/dist/additions/version-inventory.js.map +1 -1
  9. package/dist/api/index.d.ts +18 -1
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/api/index.js +172 -4
  12. package/dist/api/index.js.map +1 -1
  13. package/dist/api/oura-collection-requirements.d.ts +16 -0
  14. package/dist/api/oura-collection-requirements.d.ts.map +1 -0
  15. package/dist/api/oura-collection-requirements.js +70 -0
  16. package/dist/api/oura-collection-requirements.js.map +1 -0
  17. package/dist/api/scope-upload-batches.d.ts +18 -0
  18. package/dist/api/scope-upload-batches.d.ts.map +1 -0
  19. package/dist/api/scope-upload-batches.js +71 -0
  20. package/dist/api/scope-upload-batches.js.map +1 -0
  21. package/dist/api/scope-uploads.d.ts +112 -0
  22. package/dist/api/scope-uploads.d.ts.map +1 -0
  23. package/dist/api/scope-uploads.js +369 -0
  24. package/dist/api/scope-uploads.js.map +1 -0
  25. package/dist/client.d.ts +70 -0
  26. package/dist/client.d.ts.map +1 -1
  27. package/dist/client.js +1 -0
  28. package/dist/client.js.map +1 -1
  29. package/dist/contracts/data.d.ts +8 -0
  30. package/dist/contracts/data.d.ts.map +1 -1
  31. package/dist/contracts/data.js +31 -1
  32. package/dist/contracts/data.js.map +1 -1
  33. package/dist/contracts/grants.d.ts.map +1 -1
  34. package/dist/contracts/grants.js +3 -0
  35. package/dist/contracts/grants.js.map +1 -1
  36. package/dist/contracts/index.d.ts +3 -1
  37. package/dist/contracts/index.d.ts.map +1 -1
  38. package/dist/contracts/index.js +3 -1
  39. package/dist/contracts/index.js.map +1 -1
  40. package/dist/contracts/oura-collection-requirements.d.ts +17 -0
  41. package/dist/contracts/oura-collection-requirements.d.ts.map +1 -0
  42. package/dist/contracts/oura-collection-requirements.js +49 -0
  43. package/dist/contracts/oura-collection-requirements.js.map +1 -0
  44. package/dist/legacy-projection/bindings.d.ts +1 -7
  45. package/dist/legacy-projection/bindings.d.ts.map +1 -1
  46. package/dist/legacy-projection/bindings.js +162 -28
  47. package/dist/legacy-projection/bindings.js.map +1 -1
  48. package/dist/legacy-projection/index.d.ts +6 -5
  49. package/dist/legacy-projection/index.d.ts.map +1 -1
  50. package/dist/legacy-projection/index.js +9 -21
  51. package/dist/legacy-projection/index.js.map +1 -1
  52. package/dist/legacy-projection/oura-browser-bindings.d.ts +2 -0
  53. package/dist/legacy-projection/oura-browser-bindings.d.ts.map +1 -1
  54. package/dist/legacy-projection/oura-browser-bindings.js +2 -0
  55. package/dist/legacy-projection/oura-browser-bindings.js.map +1 -1
  56. package/dist/legacy-projection/strava-browser-bindings.d.ts +3 -0
  57. package/dist/legacy-projection/strava-browser-bindings.d.ts.map +1 -0
  58. package/dist/legacy-projection/strava-browser-bindings.js +32 -0
  59. package/dist/legacy-projection/strava-browser-bindings.js.map +1 -0
  60. package/dist/legacy-projection/types.d.ts +44 -12
  61. package/dist/legacy-projection/types.d.ts.map +1 -1
  62. package/dist/mcp/connection-api.d.ts +11 -1
  63. package/dist/mcp/connection-api.d.ts.map +1 -1
  64. package/dist/mcp/connection-api.js +94 -9
  65. package/dist/mcp/connection-api.js.map +1 -1
  66. package/dist/mcp/index.d.ts +1 -0
  67. package/dist/mcp/index.d.ts.map +1 -1
  68. package/dist/mcp/index.js +1 -0
  69. package/dist/mcp/index.js.map +1 -1
  70. package/dist/mcp/server.d.ts +9 -0
  71. package/dist/mcp/server.d.ts.map +1 -1
  72. package/dist/mcp/server.js +19 -6
  73. package/dist/mcp/server.js.map +1 -1
  74. package/dist/mcp/store.d.ts +10 -1
  75. package/dist/mcp/store.d.ts.map +1 -1
  76. package/dist/mcp/store.js +51 -0
  77. package/dist/mcp/store.js.map +1 -1
  78. package/dist/mcp/tools.d.ts +52 -2
  79. package/dist/mcp/tools.d.ts.map +1 -1
  80. package/dist/mcp/tools.js +395 -11
  81. package/dist/mcp/tools.js.map +1 -1
  82. package/dist/mcp/types.d.ts +36 -2
  83. package/dist/mcp/types.d.ts.map +1 -1
  84. package/dist/mcp/types.js +12 -0
  85. package/dist/mcp/types.js.map +1 -1
  86. package/dist/mcp/write-client.d.ts +81 -0
  87. package/dist/mcp/write-client.d.ts.map +1 -0
  88. package/dist/mcp/write-client.js +140 -0
  89. package/dist/mcp/write-client.js.map +1 -0
  90. package/dist/oura/history-policy.d.ts +12 -0
  91. package/dist/oura/history-policy.d.ts.map +1 -0
  92. package/dist/oura/history-policy.js +54 -0
  93. package/dist/oura/history-policy.js.map +1 -0
  94. package/dist/oura/index.d.ts +51 -0
  95. package/dist/oura/index.d.ts.map +1 -0
  96. package/dist/oura/index.js +315 -0
  97. package/dist/oura/index.js.map +1 -0
  98. package/dist/pdpp/approval.d.ts +1 -1
  99. package/dist/pdpp/approval.d.ts.map +1 -1
  100. package/dist/pdpp/approval.js +29 -10
  101. package/dist/pdpp/approval.js.map +1 -1
  102. package/dist/pdpp/declaration-limits.d.ts +7 -0
  103. package/dist/pdpp/declaration-limits.d.ts.map +1 -0
  104. package/dist/pdpp/declaration-limits.js +7 -0
  105. package/dist/pdpp/declaration-limits.js.map +1 -0
  106. package/dist/pdpp/declaration.d.ts +2 -1
  107. package/dist/pdpp/declaration.d.ts.map +1 -1
  108. package/dist/pdpp/declaration.js +2 -1
  109. package/dist/pdpp/declaration.js.map +1 -1
  110. package/dist/pdpp/index.d.ts +3 -2
  111. package/dist/pdpp/index.d.ts.map +1 -1
  112. package/dist/pdpp/index.js +3 -2
  113. package/dist/pdpp/index.js.map +1 -1
  114. package/dist/pdpp/issuance.d.ts.map +1 -1
  115. package/dist/pdpp/issuance.js +6 -2
  116. package/dist/pdpp/issuance.js.map +1 -1
  117. package/dist/pdpp/resolve.d.ts +12 -1
  118. package/dist/pdpp/resolve.d.ts.map +1 -1
  119. package/dist/pdpp/resolve.js +156 -58
  120. package/dist/pdpp/resolve.js.map +1 -1
  121. package/dist/pdpp/selection.d.ts +30 -1
  122. package/dist/pdpp/selection.d.ts.map +1 -1
  123. package/dist/pdpp/selection.js +77 -26
  124. package/dist/pdpp/selection.js.map +1 -1
  125. package/dist/pdpp/time.d.ts +39 -0
  126. package/dist/pdpp/time.d.ts.map +1 -0
  127. package/dist/pdpp/time.js +173 -0
  128. package/dist/pdpp/time.js.map +1 -0
  129. package/dist/pdpp/tokens.d.ts.map +1 -1
  130. package/dist/pdpp/tokens.js +4 -2
  131. package/dist/pdpp/tokens.js.map +1 -1
  132. package/dist/pdpp/types.d.ts +18 -2
  133. package/dist/pdpp/types.d.ts.map +1 -1
  134. package/dist/pdpp/types.js +7 -0
  135. package/dist/pdpp/types.js.map +1 -1
  136. package/dist/policy/reserved-scopes.d.ts +7 -0
  137. package/dist/policy/reserved-scopes.d.ts.map +1 -1
  138. package/dist/policy/reserved-scopes.js +12 -1
  139. package/dist/policy/reserved-scopes.js.map +1 -1
  140. package/dist/ports/index.d.ts +85 -1
  141. package/dist/ports/index.d.ts.map +1 -1
  142. package/dist/ports/index.js.map +1 -1
  143. package/dist/ports/pdpp-auth.d.ts +17 -27
  144. package/dist/ports/pdpp-auth.d.ts.map +1 -1
  145. package/dist/ports/pdpp-auth.js +14 -28
  146. package/dist/ports/pdpp-auth.js.map +1 -1
  147. package/dist/publication/publish.d.ts +96 -0
  148. package/dist/publication/publish.d.ts.map +1 -0
  149. package/dist/publication/publish.js +261 -0
  150. package/dist/publication/publish.js.map +1 -0
  151. package/dist/replication/completion.d.ts +20 -0
  152. package/dist/replication/completion.d.ts.map +1 -0
  153. package/dist/replication/completion.js +73 -0
  154. package/dist/replication/completion.js.map +1 -0
  155. package/dist/replication/coordinator-state.d.ts +29 -0
  156. package/dist/replication/coordinator-state.d.ts.map +1 -0
  157. package/dist/replication/coordinator-state.js +88 -0
  158. package/dist/replication/coordinator-state.js.map +1 -0
  159. package/dist/replication/coordinator-state.test-utils.d.ts +32 -0
  160. package/dist/replication/coordinator-state.test-utils.d.ts.map +1 -0
  161. package/dist/replication/coordinator-state.test-utils.js +113 -0
  162. package/dist/replication/coordinator-state.test-utils.js.map +1 -0
  163. package/dist/replication/coordinator.d.ts +264 -0
  164. package/dist/replication/coordinator.d.ts.map +1 -0
  165. package/dist/replication/coordinator.js +499 -0
  166. package/dist/replication/coordinator.js.map +1 -0
  167. package/dist/replication/copies.d.ts +126 -0
  168. package/dist/replication/copies.d.ts.map +1 -0
  169. package/dist/replication/copies.js +437 -0
  170. package/dist/replication/copies.js.map +1 -0
  171. package/dist/replication/copy-promotion.d.ts +132 -0
  172. package/dist/replication/copy-promotion.d.ts.map +1 -0
  173. package/dist/replication/copy-promotion.js +126 -0
  174. package/dist/replication/copy-promotion.js.map +1 -0
  175. package/dist/replication/door.d.ts +33 -0
  176. package/dist/replication/door.d.ts.map +1 -0
  177. package/dist/replication/door.js +10 -0
  178. package/dist/replication/door.js.map +1 -0
  179. package/dist/replication/dpv2.d.ts +141 -0
  180. package/dist/replication/dpv2.d.ts.map +1 -0
  181. package/dist/replication/dpv2.js +320 -0
  182. package/dist/replication/dpv2.js.map +1 -0
  183. package/dist/replication/effects.d.ts +68 -0
  184. package/dist/replication/effects.d.ts.map +1 -0
  185. package/dist/replication/effects.js +89 -0
  186. package/dist/replication/effects.js.map +1 -0
  187. package/dist/replication/engine.d.ts +378 -0
  188. package/dist/replication/engine.d.ts.map +1 -0
  189. package/dist/replication/engine.js +3197 -0
  190. package/dist/replication/engine.js.map +1 -0
  191. package/dist/replication/envelope.d.ts +481 -0
  192. package/dist/replication/envelope.d.ts.map +1 -0
  193. package/dist/replication/envelope.js +192 -0
  194. package/dist/replication/envelope.js.map +1 -0
  195. package/dist/replication/evidence.d.ts +118 -0
  196. package/dist/replication/evidence.d.ts.map +1 -0
  197. package/dist/replication/evidence.js +198 -0
  198. package/dist/replication/evidence.js.map +1 -0
  199. package/dist/replication/finality.d.ts +16 -0
  200. package/dist/replication/finality.d.ts.map +1 -0
  201. package/dist/replication/finality.js +11 -0
  202. package/dist/replication/finality.js.map +1 -0
  203. package/dist/replication/fixtures.d.ts +16 -0
  204. package/dist/replication/fixtures.d.ts.map +1 -0
  205. package/dist/replication/fixtures.js +47 -0
  206. package/dist/replication/fixtures.js.map +1 -0
  207. package/dist/replication/host-config.d.ts +52 -0
  208. package/dist/replication/host-config.d.ts.map +1 -0
  209. package/dist/replication/host-config.js +111 -0
  210. package/dist/replication/host-config.js.map +1 -0
  211. package/dist/replication/host-driver.d.ts +95 -0
  212. package/dist/replication/host-driver.d.ts.map +1 -0
  213. package/dist/replication/host-driver.js +202 -0
  214. package/dist/replication/host-driver.js.map +1 -0
  215. package/dist/replication/host-ports.d.ts +48 -0
  216. package/dist/replication/host-ports.d.ts.map +1 -0
  217. package/dist/replication/host-ports.js +69 -0
  218. package/dist/replication/host-ports.js.map +1 -0
  219. package/dist/replication/identity.d.ts +13 -0
  220. package/dist/replication/identity.d.ts.map +1 -0
  221. package/dist/replication/identity.js +22 -0
  222. package/dist/replication/identity.js.map +1 -0
  223. package/dist/replication/limits.d.ts +124 -0
  224. package/dist/replication/limits.d.ts.map +1 -0
  225. package/dist/replication/limits.js +182 -0
  226. package/dist/replication/limits.js.map +1 -0
  227. package/dist/replication/merge-plan.d.ts +92 -0
  228. package/dist/replication/merge-plan.d.ts.map +1 -0
  229. package/dist/replication/merge-plan.js +229 -0
  230. package/dist/replication/merge-plan.js.map +1 -0
  231. package/dist/replication/namespace.d.ts +4 -0
  232. package/dist/replication/namespace.d.ts.map +1 -0
  233. package/dist/replication/namespace.js +7 -0
  234. package/dist/replication/namespace.js.map +1 -0
  235. package/dist/replication/outcome.d.ts +178 -0
  236. package/dist/replication/outcome.d.ts.map +1 -0
  237. package/dist/replication/outcome.js +83 -0
  238. package/dist/replication/outcome.js.map +1 -0
  239. package/dist/replication/payload.d.ts +39 -0
  240. package/dist/replication/payload.d.ts.map +1 -0
  241. package/dist/replication/payload.js +137 -0
  242. package/dist/replication/payload.js.map +1 -0
  243. package/dist/replication/preparation.d.ts +42 -0
  244. package/dist/replication/preparation.d.ts.map +1 -0
  245. package/dist/replication/preparation.js +118 -0
  246. package/dist/replication/preparation.js.map +1 -0
  247. package/dist/replication/rebaseline.d.ts +33 -0
  248. package/dist/replication/rebaseline.d.ts.map +1 -0
  249. package/dist/replication/rebaseline.js +40 -0
  250. package/dist/replication/rebaseline.js.map +1 -0
  251. package/dist/replication/rebinding.d.ts +43 -0
  252. package/dist/replication/rebinding.d.ts.map +1 -0
  253. package/dist/replication/rebinding.js +52 -0
  254. package/dist/replication/rebinding.js.map +1 -0
  255. package/dist/replication/receive.d.ts +57 -0
  256. package/dist/replication/receive.d.ts.map +1 -0
  257. package/dist/replication/receive.js +114 -0
  258. package/dist/replication/receive.js.map +1 -0
  259. package/dist/replication/record-reducer.d.ts +16 -0
  260. package/dist/replication/record-reducer.d.ts.map +1 -0
  261. package/dist/replication/record-reducer.js +52 -0
  262. package/dist/replication/record-reducer.js.map +1 -0
  263. package/dist/replication/revision.d.ts +24 -0
  264. package/dist/replication/revision.d.ts.map +1 -0
  265. package/dist/replication/revision.js +35 -0
  266. package/dist/replication/revision.js.map +1 -0
  267. package/dist/replication/roster.d.ts +53 -0
  268. package/dist/replication/roster.d.ts.map +1 -0
  269. package/dist/replication/roster.js +115 -0
  270. package/dist/replication/roster.js.map +1 -0
  271. package/dist/replication/schedule.d.ts +73 -0
  272. package/dist/replication/schedule.d.ts.map +1 -0
  273. package/dist/replication/schedule.js +182 -0
  274. package/dist/replication/schedule.js.map +1 -0
  275. package/dist/replication/stream.d.ts +73 -0
  276. package/dist/replication/stream.d.ts.map +1 -0
  277. package/dist/replication/stream.js +542 -0
  278. package/dist/replication/stream.js.map +1 -0
  279. package/dist/replication/transport.d.ts +236 -0
  280. package/dist/replication/transport.d.ts.map +1 -0
  281. package/dist/replication/transport.js +440 -0
  282. package/dist/replication/transport.js.map +1 -0
  283. package/dist/replication/visibility-engine.d.ts +337 -0
  284. package/dist/replication/visibility-engine.d.ts.map +1 -0
  285. package/dist/replication/visibility-engine.js +602 -0
  286. package/dist/replication/visibility-engine.js.map +1 -0
  287. package/dist/replication/visibility-policy.d.ts +26 -0
  288. package/dist/replication/visibility-policy.d.ts.map +1 -0
  289. package/dist/replication/visibility-policy.js +33 -0
  290. package/dist/replication/visibility-policy.js.map +1 -0
  291. package/dist/replication/writer-identity-store.d.ts +100 -0
  292. package/dist/replication/writer-identity-store.d.ts.map +1 -0
  293. package/dist/replication/writer-identity-store.js +218 -0
  294. package/dist/replication/writer-identity-store.js.map +1 -0
  295. package/dist/replication/writer-identity.d.ts +252 -0
  296. package/dist/replication/writer-identity.d.ts.map +1 -0
  297. package/dist/replication/writer-identity.js +281 -0
  298. package/dist/replication/writer-identity.js.map +1 -0
  299. package/dist/replication/writer-identity.test-utils.d.ts +24 -0
  300. package/dist/replication/writer-identity.test-utils.d.ts.map +1 -0
  301. package/dist/replication/writer-identity.test-utils.js +86 -0
  302. package/dist/replication/writer-identity.test-utils.js.map +1 -0
  303. package/dist/schemas/server-config.d.ts +13 -0
  304. package/dist/schemas/server-config.d.ts.map +1 -1
  305. package/dist/schemas/server-config.js +24 -0
  306. package/dist/schemas/server-config.js.map +1 -1
  307. package/dist/storage/adapters/index.d.ts +3 -1
  308. package/dist/storage/adapters/index.d.ts.map +1 -1
  309. package/dist/storage/adapters/index.js +2 -0
  310. package/dist/storage/adapters/index.js.map +1 -1
  311. package/dist/storage/adapters/interface.d.ts +18 -1
  312. package/dist/storage/adapters/interface.d.ts.map +1 -1
  313. package/dist/storage/adapters/interface.js +13 -1
  314. package/dist/storage/adapters/interface.js.map +1 -1
  315. package/dist/storage/adapters/sdk.d.ts +2 -1
  316. package/dist/storage/adapters/sdk.d.ts.map +1 -1
  317. package/dist/storage/adapters/sdk.js +21 -3
  318. package/dist/storage/adapters/sdk.js.map +1 -1
  319. package/dist/storage/adapters/vana-audience.d.ts +17 -5
  320. package/dist/storage/adapters/vana-audience.d.ts.map +1 -1
  321. package/dist/storage/adapters/vana-audience.js +24 -9
  322. package/dist/storage/adapters/vana-audience.js.map +1 -1
  323. package/dist/storage/adapters/vana.d.ts +2 -2
  324. package/dist/storage/adapters/vana.d.ts.map +1 -1
  325. package/dist/storage/adapters/vana.js +30 -22
  326. package/dist/storage/adapters/vana.js.map +1 -1
  327. package/dist/storage/canonical-legacy-projection.d.ts +1 -1
  328. package/dist/storage/canonical-legacy-projection.d.ts.map +1 -1
  329. package/dist/storage/canonical-legacy-projection.js +13 -15
  330. package/dist/storage/canonical-legacy-projection.js.map +1 -1
  331. package/dist/storage/legacy-projection.d.ts.map +1 -1
  332. package/dist/storage/legacy-projection.js +16 -1
  333. package/dist/storage/legacy-projection.js.map +1 -1
  334. package/dist/storage/legacy-scope-coverage-exceptions.d.ts +5 -0
  335. package/dist/storage/legacy-scope-coverage-exceptions.d.ts.map +1 -1
  336. package/dist/storage/legacy-scope-coverage-exceptions.js +4 -0
  337. package/dist/storage/legacy-scope-coverage-exceptions.js.map +1 -1
  338. package/dist/storage/legacy-scope-coverage.d.ts.map +1 -1
  339. package/dist/storage/legacy-scope-coverage.js +14 -1
  340. package/dist/storage/legacy-scope-coverage.js.map +1 -1
  341. package/dist/storage/legacy-scope-entity-keys.d.ts +14 -1
  342. package/dist/storage/legacy-scope-entity-keys.d.ts.map +1 -1
  343. package/dist/storage/legacy-scope-entity-keys.js +18 -1
  344. package/dist/storage/legacy-scope-entity-keys.js.map +1 -1
  345. package/dist/storage/legacy-scope-view.d.ts +57 -5
  346. package/dist/storage/legacy-scope-view.d.ts.map +1 -1
  347. package/dist/storage/legacy-scope-view.js +644 -318
  348. package/dist/storage/legacy-scope-view.js.map +1 -1
  349. package/dist/storage/pdpp-records/cursor.d.ts +47 -2
  350. package/dist/storage/pdpp-records/cursor.d.ts.map +1 -1
  351. package/dist/storage/pdpp-records/cursor.js +7 -0
  352. package/dist/storage/pdpp-records/cursor.js.map +1 -1
  353. package/dist/storage/pdpp-records/enforcement.d.ts +3 -16
  354. package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -1
  355. package/dist/storage/pdpp-records/enforcement.js +40 -13
  356. package/dist/storage/pdpp-records/enforcement.js.map +1 -1
  357. package/dist/storage/pdpp-records/index.d.ts +2 -0
  358. package/dist/storage/pdpp-records/index.d.ts.map +1 -1
  359. package/dist/storage/pdpp-records/index.js +1 -0
  360. package/dist/storage/pdpp-records/index.js.map +1 -1
  361. package/dist/storage/pdpp-records/interface.d.ts +8 -1
  362. package/dist/storage/pdpp-records/interface.d.ts.map +1 -1
  363. package/dist/storage/pdpp-records/list-page.d.ts +35 -0
  364. package/dist/storage/pdpp-records/list-page.d.ts.map +1 -0
  365. package/dist/storage/pdpp-records/list-page.js +106 -0
  366. package/dist/storage/pdpp-records/list-page.js.map +1 -0
  367. package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -1
  368. package/dist/storage/pdpp-records/memory-store.js +95 -99
  369. package/dist/storage/pdpp-records/memory-store.js.map +1 -1
  370. package/dist/storage/pdpp-records/portable.d.ts +3 -0
  371. package/dist/storage/pdpp-records/portable.d.ts.map +1 -1
  372. package/dist/storage/pdpp-records/portable.js +3 -0
  373. package/dist/storage/pdpp-records/portable.js.map +1 -1
  374. package/dist/storage/pdpp-records/replication-journal.d.ts +20 -0
  375. package/dist/storage/pdpp-records/replication-journal.d.ts.map +1 -0
  376. package/dist/storage/pdpp-records/replication-journal.js +2 -0
  377. package/dist/storage/pdpp-records/replication-journal.js.map +1 -0
  378. package/dist/storage/pdpp-records/stream-declaration.d.ts +0 -2
  379. package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -1
  380. package/dist/storage/pdpp-records/stream-declaration.js +0 -9
  381. package/dist/storage/pdpp-records/stream-declaration.js.map +1 -1
  382. package/dist/storage/pdpp-records/sync-selection.d.ts +4 -0
  383. package/dist/storage/pdpp-records/sync-selection.d.ts.map +1 -0
  384. package/dist/storage/pdpp-records/sync-selection.js +37 -0
  385. package/dist/storage/pdpp-records/sync-selection.js.map +1 -0
  386. package/dist/storage/pdpp-records/types.d.ts +64 -0
  387. package/dist/storage/pdpp-records/types.d.ts.map +1 -1
  388. package/dist/storage/pdpp-records/types.js.map +1 -1
  389. package/dist/sync/delete-data-port.d.ts +15 -0
  390. package/dist/sync/delete-data-port.d.ts.map +1 -1
  391. package/dist/sync/delete-data-port.js +19 -7
  392. package/dist/sync/delete-data-port.js.map +1 -1
  393. package/dist/sync/index.d.ts +2 -1
  394. package/dist/sync/index.d.ts.map +1 -1
  395. package/dist/sync/index.js +2 -1
  396. package/dist/sync/index.js.map +1 -1
  397. package/dist/sync/pending-blob-deletions.d.ts +18 -2
  398. package/dist/sync/pending-blob-deletions.d.ts.map +1 -1
  399. package/dist/sync/pending-blob-deletions.js +69 -23
  400. package/dist/sync/pending-blob-deletions.js.map +1 -1
  401. package/dist/sync/workers/delete.d.ts.map +1 -1
  402. package/dist/sync/workers/delete.js +316 -142
  403. package/dist/sync/workers/delete.js.map +1 -1
  404. package/dist/sync/workers/download.d.ts.map +1 -1
  405. package/dist/sync/workers/download.js +53 -5
  406. package/dist/sync/workers/download.js.map +1 -1
  407. package/dist/sync/workers/upload.d.ts +24 -5
  408. package/dist/sync/workers/upload.d.ts.map +1 -1
  409. package/dist/sync/workers/upload.js +160 -275
  410. package/dist/sync/workers/upload.js.map +1 -1
  411. package/dist/test-utils/memory-storage.d.ts.map +1 -1
  412. package/dist/test-utils/memory-storage.js +17 -2
  413. package/dist/test-utils/memory-storage.js.map +1 -1
  414. package/package.json +24 -2
@@ -0,0 +1,126 @@
1
+ import { encodeAbiParameters, keccak256 } from "viem";
2
+ /**
3
+ * keccak256(abi.encode(string "pdpp.replica.copy.v1", bytes32[] commitments)),
4
+ * commitments in slot order. A manifest-carried batch has one slot: its
5
+ * manifest. Always recomputed locally from the verified (dataHash,
6
+ * metadataHash) pairs, never taken from a sender.
7
+ */
8
+ export function replicaCopyKey(fragmentCommitments) {
9
+ return keccak256(encodeAbiParameters([{ type: "string" }, { type: "bytes32[]" }], [
10
+ "pdpp.replica.copy.v1",
11
+ fragmentCommitments.map((c) => c.toLowerCase()),
12
+ ])).toLowerCase();
13
+ }
14
+ const same = (a, b) => a.toLowerCase() === b.toLowerCase();
15
+ /**
16
+ * The one copy-promotion rule (contract v2 §2 with amendments B, G and I).
17
+ * First matching rule wins:
18
+ * 1. terminal disposition or any contradiction → terminal;
19
+ * 2. promoted p: p missing or disproved → terminal, else reconcile_promoted;
20
+ * 3. more than one proven copy → terminal (needs a hash collision);
21
+ * 4. exactly one proven copy → promote;
22
+ * 5. every copy disproved and finality known → refetch, then owner at budget;
23
+ * 6. otherwise → wait for finality.
24
+ * Never arrival order, size, counter, deadline or hint. The predecessor check
25
+ * is the caller's precondition, not part of this decision.
26
+ */
27
+ /** Completed non-matching re-downloads before the owner decides (contract F4). */
28
+ export const REPLICA_REFETCH_BUDGET = 5;
29
+ export function decideCopyPromotion(input) {
30
+ const byKey = new Map();
31
+ for (const copy of input.copies)
32
+ if (copy.validity === "valid")
33
+ byKey.set(copy.copyKey.toLowerCase(), {
34
+ ...copy,
35
+ copyKey: copy.copyKey.toLowerCase(),
36
+ });
37
+ const valid = [...byKey.values()].sort((a, b) => a.copyKey < b.copyKey ? -1 : a.copyKey > b.copyKey ? 1 : 0);
38
+ const keys = valid.map((copy) => copy.copyKey);
39
+ const except = (key) => keys.filter((k) => k !== key);
40
+ const terminal = () => ({
41
+ kind: "terminal",
42
+ reason: "finalized_conflict",
43
+ quarantine: keys,
44
+ });
45
+ const facts = (copy) => copy.fragmentCommitments.map((commitment, index) => [commitment, input.evidence.get(index) ?? { kind: "unknown" }]);
46
+ const proven = (copy) => facts(copy).every(([commitment, evidence]) => evidence.kind === "committed" &&
47
+ evidence.eligible &&
48
+ same(evidence.commitment, commitment));
49
+ const disproved = (copy) => facts(copy).some(([commitment, evidence]) => evidence.kind === "committed" && !same(evidence.commitment, commitment));
50
+ const evidence = [...input.evidence.values()];
51
+ if (input.disposition.state === "terminal" ||
52
+ evidence.some((e) => e.kind === "contradiction"))
53
+ return terminal();
54
+ if (input.disposition.state === "promoted") {
55
+ const promoted = byKey.get(input.disposition.copyKey.toLowerCase());
56
+ if (!promoted || disproved(promoted))
57
+ return terminal();
58
+ return {
59
+ kind: "reconcile_promoted",
60
+ copyKey: promoted.copyKey,
61
+ quarantine: except(promoted.copyKey),
62
+ };
63
+ }
64
+ const provenCopies = valid.filter(proven);
65
+ if (provenCopies.length > 1)
66
+ return terminal();
67
+ if (provenCopies.length === 1) {
68
+ const key = provenCopies[0].copyKey;
69
+ return { kind: "promote", copyKey: key, quarantine: except(key) };
70
+ }
71
+ if (valid.every(disproved) && evidence.some((e) => e.kind === "committed"))
72
+ return input.refetch.attempts < input.refetch.budget
73
+ ? { kind: "refetch", quarantine: keys }
74
+ : { kind: "owner", reason: "copy_conflict_unresolved", quarantine: keys };
75
+ return {
76
+ kind: "wait",
77
+ on: "finality",
78
+ quarantine: valid.length >= 2 ? keys : [],
79
+ };
80
+ }
81
+ /**
82
+ * The evidence of one slot from its verified fact history (amendment D).
83
+ * Versions append, so a currentVersion above the slot is normal. A slot's
84
+ * commitment is write-once, so contradiction is absorbing: two commitments
85
+ * for the slot, an absent fact later than a committed one, facts about two
86
+ * slots, one block number with two hashes, or facts from two authorities.
87
+ * Otherwise the fact with the highest block number decides, and among facts
88
+ * at that block the last observed. `facts` must be in observation order.
89
+ */
90
+ export function indexEvidenceFromFacts(facts) {
91
+ if (!facts.length)
92
+ return { kind: "unknown" };
93
+ const authority = (f) => `${f.chainId} ${f.registry.toLowerCase()} ${f.owner.toLowerCase()}`;
94
+ if (new Set(facts.map(authority)).size > 1)
95
+ return { kind: "contradiction" };
96
+ if (new Set(facts.map((f) => f.version)).size > 1)
97
+ return { kind: "contradiction" };
98
+ const slot = BigInt(facts[0].version);
99
+ const committed = (f) => BigInt(f.currentVersion) >= slot;
100
+ const committedFacts = facts.filter(committed);
101
+ if (new Set(committedFacts.map((f) => f.commitment.toLowerCase())).size > 1)
102
+ return { kind: "contradiction" };
103
+ const hashes = new Map();
104
+ for (const f of facts) {
105
+ const seen = hashes.get(f.blockNumber);
106
+ if (seen !== undefined && seen !== f.blockHash.toLowerCase())
107
+ return { kind: "contradiction" };
108
+ hashes.set(f.blockNumber, f.blockHash.toLowerCase());
109
+ }
110
+ const firstCommitted = committedFacts.reduce((low, f) => low === undefined || f.blockNumber < low ? f.blockNumber : low, undefined);
111
+ if (firstCommitted !== undefined &&
112
+ facts.some((f) => !committed(f) && f.blockNumber > firstCommitted))
113
+ return { kind: "contradiction" };
114
+ // Facts arrive in observation order. At one block, a later observation
115
+ // supersedes: eligibility follows the live head, which can change while
116
+ // the finalized block does not.
117
+ const latest = facts.reduce((a, b) => b.blockNumber >= a.blockNumber ? b : a);
118
+ return committed(latest)
119
+ ? {
120
+ kind: "committed",
121
+ commitment: latest.commitment.toLowerCase(),
122
+ eligible: latest.eligible,
123
+ }
124
+ : { kind: "absent" };
125
+ }
126
+ //# sourceMappingURL=copy-promotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-promotion.js","sourceRoot":"","sources":["../../src/replication/copy-promotion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The one-way door for replication on one device's database.
3
+ *
4
+ * Replication can be turned on once. Turning it off is permanent: a later
5
+ * enabled open is refused, because writes made while it was off were never
6
+ * captured and a peer would never see them. No data is deleted.
7
+ *
8
+ * - `never`: replication has never been enabled on this database.
9
+ * - `on`: enabled, and every replicated write since the first enable was
10
+ * captured.
11
+ * - `off`: replication was enabled once and this open has it off. The door
12
+ * is now closed.
13
+ * - `refused`: an enabled open found the door closed. The host shows
14
+ * `refusal`; the store runs as if the flag were off.
15
+ */
16
+ export type ReplicationDoorStatus = {
17
+ state: "never" | "on" | "off";
18
+ } | {
19
+ state: "refused";
20
+ refusal: ReplicationRefusal;
21
+ };
22
+ /**
23
+ * Why an enabled open was refused. `reenable_refused`: replication was
24
+ * turned off after it was on, a write bypassed capture, or the database was
25
+ * enabled by a build that kept no record of its off periods.
26
+ */
27
+ export type ReplicationRefusal = "reenable_refused";
28
+ /** Thrown by a store asked to replicate behind a closed door. */
29
+ export declare class ReplicationRefusedError extends Error {
30
+ readonly reason: ReplicationRefusal;
31
+ constructor(reason: ReplicationRefusal);
32
+ }
33
+ //# sourceMappingURL=door.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"door.d.ts","sourceRoot":"","sources":["../../src/replication/door.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,KAAK,CAAA;CAAE,GACjC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;AAEpD,iEAAiE;AACjE,qBAAa,uBAAwB,SAAQ,KAAK;aACpB,MAAM,EAAE,kBAAkB;gBAA1B,MAAM,EAAE,kBAAkB;CAIvD"}
@@ -0,0 +1,10 @@
1
+ /** Thrown by a store asked to replicate behind a closed door. */
2
+ export class ReplicationRefusedError extends Error {
3
+ reason;
4
+ constructor(reason) {
5
+ super(reason);
6
+ this.reason = reason;
7
+ this.name = "ReplicationRefusedError";
8
+ }
9
+ }
10
+ //# sourceMappingURL=door.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"door.js","sourceRoot":"","sources":["../../src/replication/door.ts"],"names":[],"mappings":"AA0BA,iEAAiE;AACjE,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACpB;IAA5B,YAA4B,MAA0B;QACpD,KAAK,CAAC,MAAM,CAAC,CAAC;QADY,WAAM,GAAN,MAAM,CAAoB;QAEpD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,141 @@
1
+ import type { ReplicaFinalityHints } from "./finality.js";
2
+ export { createReplicaFinalityHints } from "./finality.js";
3
+ import { type GatewayClient } from "@opendatalabs/vana-sdk/browser";
4
+ import { type Hex } from "viem";
5
+ import type { BoundedStorageAdapter } from "../storage/adapters/interface.js";
6
+ import type { DataPointFeedPort } from "../ports/index.js";
7
+ import type { ServerSigner } from "../signing/signer.js";
8
+ import { type PreparedFragment, type PreparedManifest } from "./transport.js";
9
+ /** Every peer read has a finite default, including existence probes. */
10
+ export declare const REPLICA_RECEIVE_TIMEOUT_MS = 30000;
11
+ export interface ReplicaCommitment {
12
+ owner: string;
13
+ scope: string;
14
+ version: string;
15
+ dataHash: string;
16
+ metadataHash: string;
17
+ deleted: boolean;
18
+ }
19
+ /**
20
+ * DataRegistryV2 stores the hash-pair commitment, never its preimages.
21
+ * `version` is the requested slot; `commitment` is that slot's commitment,
22
+ * zero while `currentVersion` is below it.
23
+ */
24
+ export interface ReplicaFinalizedChainEvidence {
25
+ owner: string;
26
+ scope: string;
27
+ version: string;
28
+ currentVersion: string;
29
+ status: "None" | "Active" | "Inactive" | "Unavailable";
30
+ commitment: Hex;
31
+ chainId: number;
32
+ registry: Hex;
33
+ blockNumber: bigint;
34
+ blockHash: Hex;
35
+ blockTimestamp: bigint;
36
+ }
37
+ export interface ReplicaRegistrationEvidence {
38
+ /** The Gateway's current head of the scope: its latest version only. */
39
+ head: ReplicaCommitment | null;
40
+ /** null means unavailable, never authoritative absence. */
41
+ chain: ReplicaFinalizedChainEvidence | null;
42
+ pending: boolean;
43
+ }
44
+ /** One registered slot: a writer scope at one version. */
45
+ export interface ReplicaSlot {
46
+ owner: string;
47
+ scope: string;
48
+ version: number;
49
+ dataHash?: string;
50
+ metadataHash?: string;
51
+ }
52
+ export declare function replicaChainCommitment(dataHash: Hex, metadataHash: Hex): Hex;
53
+ /**
54
+ * The carrier will not read an object: it is larger than the caller's bound,
55
+ * it is a compressed OpenPGP message, whose plaintext size the ciphertext
56
+ * does not bound, or its packets are outside the profile every writer emits,
57
+ * which bounds the password KDF. Writers never make any of these.
58
+ */
59
+ export declare class ReplicaObjectRefused extends Error {
60
+ readonly cause_: "oversize" | "compressed" | "profile";
61
+ constructor(cause_: "oversize" | "compressed" | "profile");
62
+ }
63
+ /** One bounded read: stop reading and throw ReplicaObjectRefused past `maxBytes`. */
64
+ export interface ReplicaRead {
65
+ maxBytes: number;
66
+ signal?: AbortSignal;
67
+ }
68
+ export interface ReplicaTransportPort {
69
+ /** The owner whose keys and signer this port uses. A worker refuses any other binding. */
70
+ owner?: string;
71
+ finality?: ReplicaFinalityHints;
72
+ encrypt(scope: string, plaintext: Uint8Array): Promise<Uint8Array>;
73
+ /** Exact size for this uncompressed codec, independent of content and randomness.
74
+ * Without this capability, aggregate attribution stays Retry rather than
75
+ * guessing which operations are permanently unsupported. */
76
+ encryptedByteLength?: (plaintextBytes: number) => number;
77
+ /**
78
+ * Refuses a message outside the writers' OpenPGP profile before its KDF
79
+ * runs, and a compressed message, so the plaintext is never larger than
80
+ * `encrypted`.
81
+ */
82
+ decrypt(scope: string, encrypted: Uint8Array): Promise<Uint8Array>;
83
+ /** Finalized evidence of one slot, plus the Gateway head of its scope. */
84
+ evidence(scope: string, version: number): Promise<ReplicaRegistrationEvidence>;
85
+ /** Store an unregistered fragment at its content address. */
86
+ putFragment(fragment: Pick<PreparedFragment, "scope" | "digest" | "encrypted">, signal?: AbortSignal): Promise<void>;
87
+ getFragment(scope: string, digest: string, read: ReplicaRead): Promise<Uint8Array>;
88
+ /** False only when storage definitively has no object at the address. */
89
+ hasFragment(scope: string, digest: string, signal?: AbortSignal): Promise<boolean>;
90
+ put(manifest: PreparedManifest, signal?: AbortSignal): Promise<void>;
91
+ /** The batch's single AddData registration, at version `manifest.version`. */
92
+ register(manifest: PreparedManifest): Promise<void>;
93
+ get(scope: string, version: number, read: ReplicaRead): Promise<Uint8Array>;
94
+ /** Owner feed page: every scope with the Gateway's latest version of it. */
95
+ list(cursor: string | null): Promise<{
96
+ points: {
97
+ scope: string;
98
+ version: string;
99
+ }[];
100
+ cursor: string | null;
101
+ }>;
102
+ }
103
+ /** SDK binary literal + AES-256 SKESKv4 / SEIPDv1, without compression or AEAD. */
104
+ export declare function replicaOpenPgpCiphertextByteLength(plaintextBytes: number): number;
105
+ /** Uses existing DPv2 crypto, storage keying, AddData signing and owner feed. No file-head rebase. */
106
+ export declare function createDpv2ReplicaTransport(deps: {
107
+ finality?: ReplicaFinalityHints;
108
+ owner: `0x${string}`;
109
+ masterKey: Uint8Array;
110
+ /** Every read is bounded, so an adapter without bounded reads is refused. */
111
+ storage: BoundedStorageAdapter;
112
+ gateway: Pick<GatewayClient, "registerDataPoint">;
113
+ feed: DataPointFeedPort;
114
+ signer: Pick<ServerSigner, "signAddData">;
115
+ /** Host verifies a slot against a pinned finalized DataRegistryV2 commitment.
116
+ * SDK head-only lookup cannot implement this port. No production fallback is allowed. */
117
+ evidence: (scope: string, version: number) => Promise<ReplicaRegistrationEvidence>;
118
+ }): ReplicaTransportPort;
119
+ /**
120
+ * The registration state of one slot. Versions append, so a later version
121
+ * is normal. A finalized slot commitment never changes, so only a finalized
122
+ * commitment that differs from the known expected hash pair quarantines.
123
+ * A Gateway head can roll back and status can reactivate: both stay pending.
124
+ */
125
+ export declare function replicaRegistrationState(evidence: ReplicaRegistrationEvidence, slot: ReplicaSlot): "absent" | "pending" | "confirmed" | "conflict";
126
+ /**
127
+ * A finalized registration of exactly the expected commitment whose status
128
+ * is not Active (for example temporarily Unavailable). Status can
129
+ * reactivate, so this is a Wait on the chain, never a conflict or an error.
130
+ * A receiver that has not fetched the slot yet has no expected commitment:
131
+ * any finalized commitment then counts, because nothing is fetched or
132
+ * trusted until the status is Active again.
133
+ */
134
+ export declare function replicaRegistrationInactive(evidence: ReplicaRegistrationEvidence, slot: ReplicaSlot): boolean;
135
+ /**
136
+ * Expected optimistic registration of this slot, distinct from disagreements
137
+ * and errors: the Gateway head is at or above the slot and finality has not
138
+ * reached it. Only a head at exactly the slot can be checked against hashes.
139
+ */
140
+ export declare function replicaAwaitingFinality(evidence: ReplicaRegistrationEvidence, slot: ReplicaSlot): boolean;
141
+ //# sourceMappingURL=dpv2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpv2.d.ts","sourceRoot":"","sources":["../../src/replication/dpv2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,320 @@
1
+ export { createReplicaFinalityHints } from "./finality.js";
2
+ import { deriveScopeKey, encryptWithPassword, } from "@opendatalabs/vana-sdk/browser";
3
+ import { CompressedDataPacket, decrypt, enums, readMessage, SymEncryptedIntegrityProtectedDataPacket, SymEncryptedSessionKeyPacket, } from "openpgp";
4
+ import { bytesToHex, encodeAbiParameters, keccak256, stringToHex, } from "viem";
5
+ import { isDefinitiveNotFound } from "../storage/adapters/sdk.js";
6
+ import { abortable } from "./coordinator.js";
7
+ import { AdditionsBudget, AdditionsBudgetExceeded, } from "../additions/budget.js";
8
+ import { replicaFragmentKey, replicaManifestKey, } from "./transport.js";
9
+ const tombstoneDataHash = keccak256(stringToHex("vana.data-point.tombstone.v1"));
10
+ /** Every peer read has a finite default, including existence probes. */
11
+ export const REPLICA_RECEIVE_TIMEOUT_MS = 30_000;
12
+ const tombstoneMetadataHash = keccak256(stringToHex("vana.data-point.tombstone.metadata.v1"));
13
+ export function replicaChainCommitment(dataHash, metadataHash) {
14
+ return keccak256(encodeAbiParameters([{ type: "bytes32" }, { type: "bytes32" }], [dataHash, metadataHash]));
15
+ }
16
+ /**
17
+ * The carrier will not read an object: it is larger than the caller's bound,
18
+ * it is a compressed OpenPGP message, whose plaintext size the ciphertext
19
+ * does not bound, or its packets are outside the profile every writer emits,
20
+ * which bounds the password KDF. Writers never make any of these.
21
+ */
22
+ export class ReplicaObjectRefused extends Error {
23
+ cause_;
24
+ constructor(cause_) {
25
+ super(`replica object refused: ${cause_}`);
26
+ this.cause_ = cause_;
27
+ this.name = "ReplicaObjectRefused";
28
+ }
29
+ }
30
+ /** SDK binary literal + AES-256 SKESKv4 / SEIPDv1, without compression or AEAD. */
31
+ export function replicaOpenPgpCiphertextByteLength(plaintextBytes) {
32
+ if (!Number.isSafeInteger(plaintextBytes) ||
33
+ plaintextBytes < 0 ||
34
+ plaintextBytes > 0xffffffff - 128)
35
+ throw new RangeError("invalid replica plaintext length");
36
+ // New-format packet: tag, one/two/five length octets, then body.
37
+ const packet = (body) => 1 + (body < 192 ? 1 : body < 8384 ? 2 : 5) + body;
38
+ // 48-byte encrypted session-key packet; binary literal has a six-byte
39
+ // header; SEIPDv1 has version(1), CFB prefix(18), MDC header/hash(22).
40
+ return 48 + packet(41 + packet(6 + plaintextBytes));
41
+ }
42
+ /** Uses existing DPv2 crypto, storage keying, AddData signing and owner feed. No file-head rebase. */
43
+ export function createDpv2ReplicaTransport(deps) {
44
+ if (typeof deps.storage.downloadBounded !== "function")
45
+ throw new TypeError("replication needs a storage adapter with bounded reads");
46
+ const password = (scope) => bytesToHex(deriveScopeKey(deps.masterKey, scope)).slice(2);
47
+ const fragmentUrl = (scope, digest) => deps.storage.urlForKey(replicaFragmentKey(scope, digest));
48
+ async function download(url, read) {
49
+ const timeout = AbortSignal.timeout(REPLICA_RECEIVE_TIMEOUT_MS);
50
+ const signal = read.signal
51
+ ? AbortSignal.any([read.signal, timeout])
52
+ : timeout;
53
+ let bytes;
54
+ // The bounded reader charges the chunks and their contiguous copy.
55
+ try {
56
+ bytes = await abortable(signal, () => deps.storage.downloadBounded(url, new AdditionsBudget(2 * read.maxBytes, undefined, signal)));
57
+ }
58
+ catch (error) {
59
+ signal.throwIfAborted();
60
+ if (error instanceof AdditionsBudgetExceeded)
61
+ throw new ReplicaObjectRefused("oversize");
62
+ throw error;
63
+ }
64
+ if (bytes.length > read.maxBytes)
65
+ throw new ReplicaObjectRefused("oversize");
66
+ return bytes;
67
+ }
68
+ return {
69
+ owner: deps.owner,
70
+ finality: deps.finality,
71
+ encrypt: (scope, bytes) => encryptWithPassword(bytes, password(scope)),
72
+ encryptedByteLength: replicaOpenPgpCiphertextByteLength,
73
+ decrypt: (scope, bytes) => decryptUncompressed(bytes, password(scope)),
74
+ evidence: deps.evidence,
75
+ async putFragment(fragment, signal) {
76
+ await deps.storage.upload(replicaFragmentKey(fragment.scope, fragment.digest), fragment.encrypted, signal);
77
+ },
78
+ getFragment: (scope, digest, read) => download(fragmentUrl(scope, digest), read),
79
+ async hasFragment(scope, digest, signal) {
80
+ try {
81
+ // A zero-byte bounded probe proves presence as soon as bytes arrive.
82
+ // StorageAdapter.exists may hide a full SDK download; never call it.
83
+ await download(fragmentUrl(scope, digest), { maxBytes: 0, signal });
84
+ return true;
85
+ }
86
+ catch (error) {
87
+ if (error instanceof ReplicaObjectRefused)
88
+ return true;
89
+ if (isDefinitiveNotFound(error))
90
+ return false;
91
+ throw error;
92
+ }
93
+ },
94
+ async put(manifest, signal) {
95
+ await deps.storage.upload(replicaManifestKey(manifest.scope, manifest.version), manifest.encrypted, signal);
96
+ },
97
+ async register(manifest) {
98
+ const msg = {
99
+ ownerAddress: deps.owner,
100
+ scope: manifest.scope,
101
+ dataHash: manifest.dataHash,
102
+ metadataHash: manifest.metadataHash,
103
+ expectedVersion: BigInt(manifest.version),
104
+ };
105
+ await deps.gateway.registerDataPoint({
106
+ ...msg,
107
+ expectedVersion: String(manifest.version),
108
+ signature: await deps.signer.signAddData(msg),
109
+ });
110
+ },
111
+ get: (scope, version, read) => download(deps.storage.urlForKey(replicaManifestKey(scope, version)), read),
112
+ async list(cursor) {
113
+ const page = await deps.feed.listDataPointsByOwner(deps.owner, cursor, {
114
+ includeDeleted: true,
115
+ });
116
+ // The Gateway version only says where to look. Each slot is verified
117
+ // against finalized evidence before anything is fetched or trusted.
118
+ return {
119
+ points: page.dataPoints.map((p) => ({
120
+ scope: p.scope,
121
+ version: p.expectedVersion,
122
+ })),
123
+ cursor: page.cursor,
124
+ };
125
+ },
126
+ };
127
+ }
128
+ /**
129
+ * The iterated S2K count byte of OpenPGP.js's default, which the SDK's
130
+ * `encryptWithPassword` uses: 16 MiB hashed per password attempt.
131
+ */
132
+ const REPLICA_S2K_MAX_COUNT_BYTE = 224;
133
+ /**
134
+ * Refuse packets outside the profile the SDK's `encryptWithPassword` emits on
135
+ * OpenPGP.js defaults, before decrypt runs the password KDF: exactly one v4
136
+ * password packet whose S2K is iterated and salted SHA-256 at no more than
137
+ * the default count, then one v1 integrity-protected data packet. So the KDF
138
+ * runs once, takes no memory parameter (Argon2 is refused) and hashes at most
139
+ * 16 MiB. Reading the packets runs no KDF.
140
+ */
141
+ function checkReplicaProfile(packets) {
142
+ const [session, data, ...rest] = packets;
143
+ const s2k = session?.s2k;
144
+ if (rest.length !== 0 ||
145
+ !(session instanceof SymEncryptedSessionKeyPacket) ||
146
+ session.version !== 4 ||
147
+ s2k?.type !== "iterated" ||
148
+ s2k.algorithm !== enums.hash.sha256 ||
149
+ typeof s2k.c !== "number" ||
150
+ s2k.c > REPLICA_S2K_MAX_COUNT_BYTE ||
151
+ !(data instanceof SymEncryptedIntegrityProtectedDataPacket) ||
152
+ data.version !== 1)
153
+ throw new ReplicaObjectRefused("profile");
154
+ }
155
+ /**
156
+ * The SDK's password decryption inside the writers' profile, refusing
157
+ * compression before it inflates anything. OpenPGP 6.3 constructs the allowed
158
+ * class for tag 8 before it reads the packet, and wraps what `read` throws,
159
+ * so the refusal is a flag.
160
+ */
161
+ async function decryptUncompressed(encrypted, password) {
162
+ let compressed = false;
163
+ class RefusedCompressedPacket extends CompressedDataPacket {
164
+ async read() {
165
+ compressed = true;
166
+ throw new Error("compressed OpenPGP packet");
167
+ }
168
+ }
169
+ const config = {
170
+ additionalAllowedPackets: [RefusedCompressedPacket],
171
+ maxDecompressedMessageSize: 0,
172
+ ignoreUnsupportedPackets: false,
173
+ ignoreMalformedPackets: false,
174
+ };
175
+ try {
176
+ const message = await readMessage({ binaryMessage: encrypted, config });
177
+ checkReplicaProfile(message.packets);
178
+ const { data } = await decrypt({
179
+ message,
180
+ passwords: [password],
181
+ format: "binary",
182
+ config,
183
+ });
184
+ if (!(data instanceof Uint8Array))
185
+ throw new Error("unexpected OpenPGP stream");
186
+ return data;
187
+ }
188
+ catch (error) {
189
+ if (compressed)
190
+ throw new ReplicaObjectRefused("compressed");
191
+ throw error;
192
+ }
193
+ }
194
+ const isTombstone = (head) => head.dataHash.toLowerCase() === tombstoneDataHash &&
195
+ head.metadataHash.toLowerCase() === tombstoneMetadataHash;
196
+ const uintPattern = /^(0|[1-9][0-9]*)$/;
197
+ const hashPattern = /^0x[0-9a-fA-F]{64}$/;
198
+ const expectedCommitment = (slot) => slot.dataHash !== undefined && slot.metadataHash !== undefined
199
+ ? replicaChainCommitment(slot.dataHash, slot.metadataHash).toLowerCase()
200
+ : undefined;
201
+ /** The chain object is for exactly this owner, scope and slot. */
202
+ function chainFor(evidence, slot) {
203
+ const { chain } = evidence;
204
+ return chain &&
205
+ Number.isSafeInteger(slot.version) &&
206
+ slot.version >= 1 &&
207
+ chain.owner.toLowerCase() === slot.owner.toLowerCase() &&
208
+ chain.scope === slot.scope &&
209
+ chain.version === String(slot.version) &&
210
+ uintPattern.test(chain.currentVersion)
211
+ ? chain
212
+ : undefined;
213
+ }
214
+ /** The Gateway head is live and agrees with the slot where it can. */
215
+ function headAgrees(head, slot, commitment) {
216
+ if (!head ||
217
+ head.owner.toLowerCase() !== slot.owner.toLowerCase() ||
218
+ head.scope !== slot.scope ||
219
+ !uintPattern.test(head.version) ||
220
+ head.deleted ||
221
+ isTombstone(head) ||
222
+ !hashPattern.test(head.dataHash) ||
223
+ !hashPattern.test(head.metadataHash))
224
+ return false;
225
+ const version = BigInt(head.version);
226
+ if (version < BigInt(slot.version))
227
+ return false;
228
+ // Only the latest version has a head. A later head says nothing about
229
+ // this slot's preimages; the finalized chain commitment binds them.
230
+ if (version > BigInt(slot.version))
231
+ return true;
232
+ return ((slot.dataHash === undefined ||
233
+ head.dataHash.toLowerCase() === slot.dataHash.toLowerCase()) &&
234
+ (slot.metadataHash === undefined ||
235
+ head.metadataHash.toLowerCase() === slot.metadataHash.toLowerCase()) &&
236
+ replicaChainCommitment(head.dataHash, head.metadataHash).toLowerCase() === commitment);
237
+ }
238
+ /**
239
+ * The registration state of one slot. Versions append, so a later version
240
+ * is normal. A finalized slot commitment never changes, so only a finalized
241
+ * commitment that differs from the known expected hash pair quarantines.
242
+ * A Gateway head can roll back and status can reactivate: both stay pending.
243
+ */
244
+ export function replicaRegistrationState(evidence, slot) {
245
+ const chain = chainFor(evidence, slot);
246
+ if (!chain)
247
+ return "pending";
248
+ const current = BigInt(chain.currentVersion);
249
+ const version = BigInt(slot.version);
250
+ const expected = expectedCommitment(slot);
251
+ const committed = chain.commitment.toLowerCase();
252
+ if (current >= version && expected !== undefined && expected !== committed)
253
+ return "conflict";
254
+ if (evidence.pending)
255
+ return "pending";
256
+ if (current < version) {
257
+ // No finalized commitment at this slot. Absent only if the Gateway has
258
+ // no head at or above it either (an optimistic registration).
259
+ const { head } = evidence;
260
+ const headBelow = !head ||
261
+ (uintPattern.test(head.version) && BigInt(head.version) < version);
262
+ return headBelow &&
263
+ /^0x0{64}$/i.test(chain.commitment) &&
264
+ (current > 0n || chain.status === "None")
265
+ ? "absent"
266
+ : "pending";
267
+ }
268
+ if (chain.status !== "Active")
269
+ return "pending";
270
+ return headAgrees(evidence.head, slot, committed) ? "confirmed" : "pending";
271
+ }
272
+ /**
273
+ * A finalized registration of exactly the expected commitment whose status
274
+ * is not Active (for example temporarily Unavailable). Status can
275
+ * reactivate, so this is a Wait on the chain, never a conflict or an error.
276
+ * A receiver that has not fetched the slot yet has no expected commitment:
277
+ * any finalized commitment then counts, because nothing is fetched or
278
+ * trusted until the status is Active again.
279
+ */
280
+ export function replicaRegistrationInactive(evidence, slot) {
281
+ const chain = chainFor(evidence, slot);
282
+ const expected = expectedCommitment(slot);
283
+ return (replicaRegistrationState(evidence, slot) === "pending" &&
284
+ !evidence.pending &&
285
+ chain !== undefined &&
286
+ BigInt(chain.currentVersion) >= BigInt(slot.version) &&
287
+ chain.status !== "Active" &&
288
+ (expected === undefined
289
+ ? !/^0x0{64}$/i.test(chain.commitment)
290
+ : expected === chain.commitment.toLowerCase()));
291
+ }
292
+ /**
293
+ * Expected optimistic registration of this slot, distinct from disagreements
294
+ * and errors: the Gateway head is at or above the slot and finality has not
295
+ * reached it. Only a head at exactly the slot can be checked against hashes.
296
+ */
297
+ export function replicaAwaitingFinality(evidence, slot) {
298
+ const chain = chainFor(evidence, slot);
299
+ const { head } = evidence;
300
+ return (replicaRegistrationState(evidence, slot) === "pending" &&
301
+ chain !== undefined &&
302
+ BigInt(chain.currentVersion) < BigInt(slot.version) &&
303
+ (BigInt(chain.currentVersion) > 0n || chain.status === "None") &&
304
+ /^0x0{64}$/i.test(chain.commitment) &&
305
+ head !== null &&
306
+ head.owner.toLowerCase() === slot.owner.toLowerCase() &&
307
+ head.scope === slot.scope &&
308
+ uintPattern.test(head.version) &&
309
+ BigInt(head.version) >= BigInt(slot.version) &&
310
+ !head.deleted &&
311
+ !isTombstone(head) &&
312
+ hashPattern.test(head.dataHash) &&
313
+ hashPattern.test(head.metadataHash) &&
314
+ (head.version !== String(slot.version) ||
315
+ ((slot.dataHash === undefined ||
316
+ head.dataHash.toLowerCase() === slot.dataHash.toLowerCase()) &&
317
+ (slot.metadataHash === undefined ||
318
+ head.metadataHash.toLowerCase() === slot.metadataHash.toLowerCase()))));
319
+ }
320
+ //# sourceMappingURL=dpv2.js.map