@farukada/aws-langgraph-dynamodb-ts 0.9.0 → 1.0.0-rc.2

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 (512) hide show
  1. package/README.md +1720 -154
  2. package/dist/backfill/backfill.d.ts +168 -0
  3. package/dist/backfill/backfill.js +393 -0
  4. package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
  5. package/dist/checkpointer/actions/delete-thread.js +58 -21
  6. package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
  7. package/dist/checkpointer/actions/get-tuple.js +44 -10
  8. package/dist/checkpointer/actions/list.d.ts +46 -4
  9. package/dist/checkpointer/actions/list.js +121 -66
  10. package/dist/checkpointer/actions/put-writes.d.ts +41 -9
  11. package/dist/checkpointer/actions/put-writes.js +62 -77
  12. package/dist/checkpointer/actions/put.d.ts +83 -4
  13. package/dist/checkpointer/actions/put.js +177 -25
  14. package/dist/checkpointer/internal/delta-history.d.ts +112 -0
  15. package/dist/checkpointer/internal/delta-history.js +252 -0
  16. package/dist/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/checkpointer/internal/listing.js +245 -0
  18. package/dist/checkpointer/internal/parse.d.ts +262 -0
  19. package/dist/checkpointer/internal/parse.js +372 -0
  20. package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
  21. package/dist/checkpointer/internal/pending-writes.js +588 -0
  22. package/dist/checkpointer/internal/read.d.ts +130 -0
  23. package/dist/checkpointer/internal/read.js +264 -0
  24. package/dist/checkpointer/internal/rows.d.ts +571 -0
  25. package/dist/checkpointer/internal/rows.js +834 -0
  26. package/dist/checkpointer/internal/setup.d.ts +42 -19
  27. package/dist/checkpointer/internal/setup.js +65 -29
  28. package/dist/checkpointer/saver.d.ts +256 -16
  29. package/dist/checkpointer/saver.js +275 -29
  30. package/dist/checkpointer/types.d.ts +39 -39
  31. package/dist/checkpointer/types.js +10 -1
  32. package/dist/factory/factory.d.ts +134 -28
  33. package/dist/factory/factory.js +240 -21
  34. package/dist/factory/types.d.ts +76 -0
  35. package/dist/factory/types.js +10 -0
  36. package/dist/history/actions/add-messages.d.ts +31 -4
  37. package/dist/history/actions/add-messages.js +38 -58
  38. package/dist/history/actions/clear.d.ts +49 -6
  39. package/dist/history/actions/clear.js +66 -14
  40. package/dist/history/actions/get-messages.d.ts +54 -6
  41. package/dist/history/actions/get-messages.js +126 -43
  42. package/dist/history/actions/list-sessions.d.ts +52 -10
  43. package/dist/history/actions/list-sessions.js +139 -40
  44. package/dist/history/actions/reconcile-count.d.ts +42 -10
  45. package/dist/history/actions/reconcile-count.js +45 -45
  46. package/dist/history/chat-message-history.d.ts +220 -33
  47. package/dist/history/chat-message-history.js +240 -43
  48. package/dist/history/internal/append.d.ts +212 -0
  49. package/dist/history/internal/append.js +500 -0
  50. package/dist/history/internal/message-read.d.ts +84 -0
  51. package/dist/history/internal/message-read.js +204 -0
  52. package/dist/history/internal/parse.d.ts +153 -0
  53. package/dist/history/internal/parse.js +252 -0
  54. package/dist/history/internal/rows.d.ts +195 -0
  55. package/dist/history/internal/rows.js +250 -0
  56. package/dist/history/internal/session.d.ts +331 -0
  57. package/dist/history/internal/session.js +628 -0
  58. package/dist/history/internal/setup.d.ts +52 -17
  59. package/dist/history/internal/setup.js +92 -21
  60. package/dist/history/session-adapter.d.ts +102 -7
  61. package/dist/history/session-adapter.js +103 -9
  62. package/dist/history/types.d.ts +80 -29
  63. package/dist/history/types.js +10 -1
  64. package/dist/index.d.ts +42 -11
  65. package/dist/index.js +33 -12
  66. package/dist/shared/adapter.d.ts +135 -0
  67. package/dist/shared/adapter.js +143 -0
  68. package/dist/shared/clock.d.ts +51 -2
  69. package/dist/shared/clock.js +57 -2
  70. package/dist/shared/codec/codec.d.ts +288 -13
  71. package/dist/shared/codec/codec.js +416 -19
  72. package/dist/shared/codec/compression.d.ts +43 -7
  73. package/dist/shared/codec/compression.js +53 -13
  74. package/dist/shared/codec/json-serde.d.ts +76 -4
  75. package/dist/shared/codec/json-serde.js +181 -8
  76. package/dist/shared/codec/s3/client-types.d.ts +53 -0
  77. package/dist/shared/codec/s3/client-types.js +26 -0
  78. package/dist/shared/codec/s3/client.d.ts +43 -10
  79. package/dist/shared/codec/s3/client.js +82 -9
  80. package/dist/shared/codec/s3/config.d.ts +242 -11
  81. package/dist/shared/codec/s3/config.js +293 -11
  82. package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
  83. package/dist/shared/codec/s3/lifecycle.js +335 -27
  84. package/dist/shared/codec/s3/offloader.d.ts +393 -18
  85. package/dist/shared/codec/s3/offloader.js +595 -37
  86. package/dist/shared/concurrency.d.ts +43 -0
  87. package/dist/shared/concurrency.js +78 -0
  88. package/dist/shared/dynamodb/abort.d.ts +47 -0
  89. package/dist/shared/dynamodb/abort.js +59 -0
  90. package/dist/shared/dynamodb/batch-write.d.ts +77 -14
  91. package/dist/shared/dynamodb/batch-write.js +146 -27
  92. package/dist/shared/dynamodb/cancellation.d.ts +121 -4
  93. package/dist/shared/dynamodb/cancellation.js +147 -3
  94. package/dist/shared/dynamodb/client.d.ts +162 -8
  95. package/dist/shared/dynamodb/client.js +153 -5
  96. package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
  97. package/dist/shared/dynamodb/idempotent-write.js +593 -0
  98. package/dist/shared/dynamodb/paginate.d.ts +105 -9
  99. package/dist/shared/dynamodb/paginate.js +175 -7
  100. package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
  101. package/dist/shared/dynamodb/partition-delete.js +314 -44
  102. package/dist/shared/dynamodb/recency-index.d.ts +231 -0
  103. package/dist/shared/dynamodb/recency-index.js +377 -0
  104. package/dist/shared/dynamodb/retry.d.ts +276 -8
  105. package/dist/shared/dynamodb/retry.js +433 -23
  106. package/dist/shared/dynamodb/table-schema.d.ts +190 -0
  107. package/dist/shared/dynamodb/table-schema.js +209 -0
  108. package/dist/shared/errors/base-error.d.ts +184 -10
  109. package/dist/shared/errors/base-error.js +160 -14
  110. package/dist/shared/errors/boundary.d.ts +71 -0
  111. package/dist/shared/errors/boundary.js +143 -0
  112. package/dist/shared/errors/classify.d.ts +97 -0
  113. package/dist/shared/errors/classify.js +257 -0
  114. package/dist/shared/errors/error-code.d.ts +77 -2
  115. package/dist/shared/errors/error-code.js +83 -1
  116. package/dist/shared/errors/errors.d.ts +158 -59
  117. package/dist/shared/errors/errors.js +219 -92
  118. package/dist/shared/logging/logger.d.ts +69 -3
  119. package/dist/shared/logging/logger.js +97 -3
  120. package/dist/shared/logging/redaction.d.ts +92 -8
  121. package/dist/shared/logging/redaction.js +273 -17
  122. package/dist/shared/logging/secret-patterns.d.ts +149 -19
  123. package/dist/shared/logging/secret-patterns.js +188 -27
  124. package/dist/shared/logging/truncate.d.ts +197 -0
  125. package/dist/shared/logging/truncate.js +231 -0
  126. package/dist/shared/options.d.ts +59 -7
  127. package/dist/shared/options.js +9 -1
  128. package/dist/shared/ulid.d.ts +77 -7
  129. package/dist/shared/ulid.js +103 -8
  130. package/dist/shared/validation/collaborators.d.ts +141 -0
  131. package/dist/shared/validation/collaborators.js +188 -0
  132. package/dist/shared/validation/option-shape.d.ts +89 -0
  133. package/dist/shared/validation/option-shape.js +113 -0
  134. package/dist/shared/validation/options.d.ts +145 -0
  135. package/dist/shared/validation/options.js +328 -0
  136. package/dist/shared/validation/primitives.d.ts +288 -21
  137. package/dist/shared/validation/primitives.js +353 -50
  138. package/dist/shared/validation/ttl.d.ts +66 -10
  139. package/dist/shared/validation/ttl.js +113 -15
  140. package/dist/store/actions/list-namespaces.d.ts +76 -6
  141. package/dist/store/actions/list-namespaces.js +166 -24
  142. package/dist/store/actions/put.d.ts +33 -8
  143. package/dist/store/actions/put.js +53 -60
  144. package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
  145. package/dist/store/actions/reconcile-vector-index.js +34 -15
  146. package/dist/store/actions/search.d.ts +34 -6
  147. package/dist/store/actions/search.js +56 -51
  148. package/dist/store/internal/batch-plan.d.ts +26 -0
  149. package/dist/store/internal/batch-plan.js +109 -0
  150. package/dist/store/internal/filter.d.ts +36 -3
  151. package/dist/store/internal/filter.js +66 -15
  152. package/dist/store/internal/get-item.d.ts +45 -0
  153. package/dist/store/internal/get-item.js +115 -0
  154. package/dist/store/internal/item-write.d.ts +230 -0
  155. package/dist/store/internal/item-write.js +463 -0
  156. package/dist/store/internal/parse.d.ts +225 -0
  157. package/dist/store/internal/parse.js +350 -0
  158. package/dist/store/internal/rows.d.ts +355 -0
  159. package/dist/store/internal/rows.js +447 -0
  160. package/dist/store/internal/semantic-search.d.ts +161 -6
  161. package/dist/store/internal/semantic-search.js +360 -18
  162. package/dist/store/internal/setup.d.ts +77 -20
  163. package/dist/store/internal/setup.js +178 -47
  164. package/dist/store/internal/table-search.d.ts +100 -0
  165. package/dist/store/internal/table-search.js +213 -0
  166. package/dist/store/internal/vector-index.d.ts +247 -0
  167. package/dist/store/internal/vector-index.js +546 -0
  168. package/dist/store/store.d.ts +270 -17
  169. package/dist/store/store.js +329 -38
  170. package/dist/store/types.d.ts +76 -26
  171. package/dist/store/types.js +13 -1
  172. package/dist/store/vector-backend.d.ts +64 -4
  173. package/dist/store/vector-backend.js +15 -1
  174. package/package.json +58 -36
  175. package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
  176. package/dist/checkpointer/actions/delete-thread.js.map +0 -1
  177. package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
  178. package/dist/checkpointer/actions/get-tuple.js.map +0 -1
  179. package/dist/checkpointer/actions/list.d.ts.map +0 -1
  180. package/dist/checkpointer/actions/list.js.map +0 -1
  181. package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
  182. package/dist/checkpointer/actions/put-writes.js.map +0 -1
  183. package/dist/checkpointer/actions/put.d.ts.map +0 -1
  184. package/dist/checkpointer/actions/put.js.map +0 -1
  185. package/dist/checkpointer/internal/assemble.d.ts +0 -10
  186. package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
  187. package/dist/checkpointer/internal/assemble.js +0 -37
  188. package/dist/checkpointer/internal/assemble.js.map +0 -1
  189. package/dist/checkpointer/internal/configurable.d.ts +0 -13
  190. package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
  191. package/dist/checkpointer/internal/configurable.js +0 -23
  192. package/dist/checkpointer/internal/configurable.js.map +0 -1
  193. package/dist/checkpointer/internal/fetch.d.ts +0 -10
  194. package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
  195. package/dist/checkpointer/internal/fetch.js +0 -46
  196. package/dist/checkpointer/internal/fetch.js.map +0 -1
  197. package/dist/checkpointer/internal/filter-match.d.ts +0 -12
  198. package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
  199. package/dist/checkpointer/internal/filter-match.js +0 -14
  200. package/dist/checkpointer/internal/filter-match.js.map +0 -1
  201. package/dist/checkpointer/internal/item-reader.d.ts +0 -55
  202. package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
  203. package/dist/checkpointer/internal/item-reader.js +0 -88
  204. package/dist/checkpointer/internal/item-reader.js.map +0 -1
  205. package/dist/checkpointer/internal/item-writer.d.ts +0 -26
  206. package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
  207. package/dist/checkpointer/internal/item-writer.js +0 -92
  208. package/dist/checkpointer/internal/item-writer.js.map +0 -1
  209. package/dist/checkpointer/internal/keys.d.ts +0 -31
  210. package/dist/checkpointer/internal/keys.d.ts.map +0 -1
  211. package/dist/checkpointer/internal/keys.js +0 -87
  212. package/dist/checkpointer/internal/keys.js.map +0 -1
  213. package/dist/checkpointer/internal/query.d.ts +0 -20
  214. package/dist/checkpointer/internal/query.d.ts.map +0 -1
  215. package/dist/checkpointer/internal/query.js +0 -36
  216. package/dist/checkpointer/internal/query.js.map +0 -1
  217. package/dist/checkpointer/internal/setup.d.ts.map +0 -1
  218. package/dist/checkpointer/internal/setup.js.map +0 -1
  219. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
  220. package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
  221. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  222. package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
  223. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
  224. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
  225. package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
  226. package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
  227. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
  228. package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
  229. package/dist/checkpointer/internal/special-write-verify.js +0 -65
  230. package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
  231. package/dist/checkpointer/internal/validation.d.ts +0 -13
  232. package/dist/checkpointer/internal/validation.d.ts.map +0 -1
  233. package/dist/checkpointer/internal/validation.js +0 -30
  234. package/dist/checkpointer/internal/validation.js.map +0 -1
  235. package/dist/checkpointer/internal/write-guard.d.ts +0 -13
  236. package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
  237. package/dist/checkpointer/internal/write-guard.js +0 -39
  238. package/dist/checkpointer/internal/write-guard.js.map +0 -1
  239. package/dist/checkpointer/internal/write-index.d.ts +0 -37
  240. package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
  241. package/dist/checkpointer/internal/write-index.js +0 -42
  242. package/dist/checkpointer/internal/write-index.js.map +0 -1
  243. package/dist/checkpointer/saver.d.ts.map +0 -1
  244. package/dist/checkpointer/saver.js.map +0 -1
  245. package/dist/checkpointer/types.d.ts.map +0 -1
  246. package/dist/checkpointer/types.js.map +0 -1
  247. package/dist/factory/factory.d.ts.map +0 -1
  248. package/dist/factory/factory.js.map +0 -1
  249. package/dist/history/actions/add-messages.d.ts.map +0 -1
  250. package/dist/history/actions/add-messages.js.map +0 -1
  251. package/dist/history/actions/clear.d.ts.map +0 -1
  252. package/dist/history/actions/clear.js.map +0 -1
  253. package/dist/history/actions/get-messages.d.ts.map +0 -1
  254. package/dist/history/actions/get-messages.js.map +0 -1
  255. package/dist/history/actions/list-sessions.d.ts.map +0 -1
  256. package/dist/history/actions/list-sessions.js.map +0 -1
  257. package/dist/history/actions/reconcile-count.d.ts.map +0 -1
  258. package/dist/history/actions/reconcile-count.js.map +0 -1
  259. package/dist/history/chat-message-history.d.ts.map +0 -1
  260. package/dist/history/chat-message-history.js.map +0 -1
  261. package/dist/history/internal/append-saga.d.ts +0 -20
  262. package/dist/history/internal/append-saga.d.ts.map +0 -1
  263. package/dist/history/internal/append-saga.js +0 -35
  264. package/dist/history/internal/append-saga.js.map +0 -1
  265. package/dist/history/internal/compensation.d.ts +0 -21
  266. package/dist/history/internal/compensation.d.ts.map +0 -1
  267. package/dist/history/internal/compensation.js +0 -84
  268. package/dist/history/internal/compensation.js.map +0 -1
  269. package/dist/history/internal/item-mapper.d.ts +0 -12
  270. package/dist/history/internal/item-mapper.d.ts.map +0 -1
  271. package/dist/history/internal/item-mapper.js +0 -33
  272. package/dist/history/internal/item-mapper.js.map +0 -1
  273. package/dist/history/internal/keys.d.ts +0 -17
  274. package/dist/history/internal/keys.d.ts.map +0 -1
  275. package/dist/history/internal/keys.js +0 -49
  276. package/dist/history/internal/keys.js.map +0 -1
  277. package/dist/history/internal/message-chunker.d.ts +0 -14
  278. package/dist/history/internal/message-chunker.d.ts.map +0 -1
  279. package/dist/history/internal/message-chunker.js +0 -68
  280. package/dist/history/internal/message-chunker.js.map +0 -1
  281. package/dist/history/internal/message-transaction.d.ts +0 -26
  282. package/dist/history/internal/message-transaction.d.ts.map +0 -1
  283. package/dist/history/internal/message-transaction.js +0 -60
  284. package/dist/history/internal/message-transaction.js.map +0 -1
  285. package/dist/history/internal/query.d.ts +0 -10
  286. package/dist/history/internal/query.d.ts.map +0 -1
  287. package/dist/history/internal/query.js +0 -31
  288. package/dist/history/internal/query.js.map +0 -1
  289. package/dist/history/internal/session-count.d.ts +0 -41
  290. package/dist/history/internal/session-count.d.ts.map +0 -1
  291. package/dist/history/internal/session-count.js +0 -109
  292. package/dist/history/internal/session-count.js.map +0 -1
  293. package/dist/history/internal/session-title.d.ts +0 -20
  294. package/dist/history/internal/session-title.d.ts.map +0 -1
  295. package/dist/history/internal/session-title.js +0 -44
  296. package/dist/history/internal/session-title.js.map +0 -1
  297. package/dist/history/internal/session-update.d.ts +0 -28
  298. package/dist/history/internal/session-update.d.ts.map +0 -1
  299. package/dist/history/internal/session-update.js +0 -70
  300. package/dist/history/internal/session-update.js.map +0 -1
  301. package/dist/history/internal/setup.d.ts.map +0 -1
  302. package/dist/history/internal/setup.js.map +0 -1
  303. package/dist/history/internal/title-generator.d.ts +0 -13
  304. package/dist/history/internal/title-generator.d.ts.map +0 -1
  305. package/dist/history/internal/title-generator.js +0 -25
  306. package/dist/history/internal/title-generator.js.map +0 -1
  307. package/dist/history/internal/ttl-anchor.d.ts +0 -25
  308. package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
  309. package/dist/history/internal/ttl-anchor.js +0 -38
  310. package/dist/history/internal/ttl-anchor.js.map +0 -1
  311. package/dist/history/internal/validation.d.ts +0 -9
  312. package/dist/history/internal/validation.d.ts.map +0 -1
  313. package/dist/history/internal/validation.js +0 -16
  314. package/dist/history/internal/validation.js.map +0 -1
  315. package/dist/history/session-adapter.d.ts.map +0 -1
  316. package/dist/history/session-adapter.js.map +0 -1
  317. package/dist/history/types.d.ts.map +0 -1
  318. package/dist/history/types.js.map +0 -1
  319. package/dist/index.d.ts.map +0 -1
  320. package/dist/index.js.map +0 -1
  321. package/dist/shared/clock.d.ts.map +0 -1
  322. package/dist/shared/clock.js.map +0 -1
  323. package/dist/shared/codec/codec.d.ts.map +0 -1
  324. package/dist/shared/codec/codec.js.map +0 -1
  325. package/dist/shared/codec/compression.d.ts.map +0 -1
  326. package/dist/shared/codec/compression.js.map +0 -1
  327. package/dist/shared/codec/descriptor-keys.d.ts +0 -4
  328. package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
  329. package/dist/shared/codec/descriptor-keys.js +0 -14
  330. package/dist/shared/codec/descriptor-keys.js.map +0 -1
  331. package/dist/shared/codec/json-serde.d.ts.map +0 -1
  332. package/dist/shared/codec/json-serde.js.map +0 -1
  333. package/dist/shared/codec/s3/client.d.ts.map +0 -1
  334. package/dist/shared/codec/s3/client.js.map +0 -1
  335. package/dist/shared/codec/s3/config.d.ts.map +0 -1
  336. package/dist/shared/codec/s3/config.js.map +0 -1
  337. package/dist/shared/codec/s3/delete.d.ts +0 -8
  338. package/dist/shared/codec/s3/delete.d.ts.map +0 -1
  339. package/dist/shared/codec/s3/delete.js +0 -29
  340. package/dist/shared/codec/s3/delete.js.map +0 -1
  341. package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
  342. package/dist/shared/codec/s3/lifecycle.js.map +0 -1
  343. package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
  344. package/dist/shared/codec/s3/offloader.js.map +0 -1
  345. package/dist/shared/codec/s3/orphans.d.ts +0 -18
  346. package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
  347. package/dist/shared/codec/s3/orphans.js +0 -58
  348. package/dist/shared/codec/s3/orphans.js.map +0 -1
  349. package/dist/shared/codec/s3/read-write.d.ts +0 -14
  350. package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
  351. package/dist/shared/codec/s3/read-write.js +0 -43
  352. package/dist/shared/codec/s3/read-write.js.map +0 -1
  353. package/dist/shared/codec/s3/retry.d.ts +0 -5
  354. package/dist/shared/codec/s3/retry.d.ts.map +0 -1
  355. package/dist/shared/codec/s3/retry.js +0 -25
  356. package/dist/shared/codec/s3/retry.js.map +0 -1
  357. package/dist/shared/constants.d.ts +0 -64
  358. package/dist/shared/constants.d.ts.map +0 -1
  359. package/dist/shared/constants.js +0 -67
  360. package/dist/shared/constants.js.map +0 -1
  361. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  362. package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
  363. package/dist/shared/dynamodb/backoff.js +0 -48
  364. package/dist/shared/dynamodb/backoff.js.map +0 -1
  365. package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
  366. package/dist/shared/dynamodb/batch-write.js.map +0 -1
  367. package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
  368. package/dist/shared/dynamodb/cancellation.js.map +0 -1
  369. package/dist/shared/dynamodb/client.d.ts.map +0 -1
  370. package/dist/shared/dynamodb/client.js.map +0 -1
  371. package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
  372. package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
  373. package/dist/shared/dynamodb/conditional-put.js +0 -59
  374. package/dist/shared/dynamodb/conditional-put.js.map +0 -1
  375. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
  376. package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
  377. package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
  378. package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
  379. package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
  380. package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
  381. package/dist/shared/dynamodb/paginate-core.js +0 -52
  382. package/dist/shared/dynamodb/paginate-core.js.map +0 -1
  383. package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
  384. package/dist/shared/dynamodb/paginate.js.map +0 -1
  385. package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
  386. package/dist/shared/dynamodb/partition-delete.js.map +0 -1
  387. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
  388. package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
  389. package/dist/shared/dynamodb/retry-classifier.js +0 -87
  390. package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
  391. package/dist/shared/dynamodb/retry.d.ts.map +0 -1
  392. package/dist/shared/dynamodb/retry.js.map +0 -1
  393. package/dist/shared/dynamodb/scan.d.ts +0 -15
  394. package/dist/shared/dynamodb/scan.d.ts.map +0 -1
  395. package/dist/shared/dynamodb/scan.js +0 -20
  396. package/dist/shared/dynamodb/scan.js.map +0 -1
  397. package/dist/shared/dynamodb/types.d.ts +0 -24
  398. package/dist/shared/dynamodb/types.d.ts.map +0 -1
  399. package/dist/shared/dynamodb/types.js +0 -3
  400. package/dist/shared/dynamodb/types.js.map +0 -1
  401. package/dist/shared/errors/base-error.d.ts.map +0 -1
  402. package/dist/shared/errors/base-error.js.map +0 -1
  403. package/dist/shared/errors/error-code.d.ts.map +0 -1
  404. package/dist/shared/errors/error-code.js.map +0 -1
  405. package/dist/shared/errors/errors.d.ts.map +0 -1
  406. package/dist/shared/errors/errors.js.map +0 -1
  407. package/dist/shared/errors/wrap-error.d.ts +0 -16
  408. package/dist/shared/errors/wrap-error.d.ts.map +0 -1
  409. package/dist/shared/errors/wrap-error.js +0 -30
  410. package/dist/shared/errors/wrap-error.js.map +0 -1
  411. package/dist/shared/logging/logger.d.ts.map +0 -1
  412. package/dist/shared/logging/logger.js.map +0 -1
  413. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  414. package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
  415. package/dist/shared/logging/redaction-walk.js +0 -92
  416. package/dist/shared/logging/redaction-walk.js.map +0 -1
  417. package/dist/shared/logging/redaction.d.ts.map +0 -1
  418. package/dist/shared/logging/redaction.js.map +0 -1
  419. package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
  420. package/dist/shared/logging/secret-patterns.js.map +0 -1
  421. package/dist/shared/options.d.ts.map +0 -1
  422. package/dist/shared/options.js.map +0 -1
  423. package/dist/shared/ulid.d.ts.map +0 -1
  424. package/dist/shared/ulid.js.map +0 -1
  425. package/dist/shared/validation/primitives.d.ts.map +0 -1
  426. package/dist/shared/validation/primitives.js.map +0 -1
  427. package/dist/shared/validation/ttl.d.ts.map +0 -1
  428. package/dist/shared/validation/ttl.js.map +0 -1
  429. package/dist/store/actions/get.d.ts +0 -5
  430. package/dist/store/actions/get.d.ts.map +0 -1
  431. package/dist/store/actions/get.js +0 -35
  432. package/dist/store/actions/get.js.map +0 -1
  433. package/dist/store/actions/list-namespaces.d.ts.map +0 -1
  434. package/dist/store/actions/list-namespaces.js.map +0 -1
  435. package/dist/store/actions/put.d.ts.map +0 -1
  436. package/dist/store/actions/put.js.map +0 -1
  437. package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
  438. package/dist/store/actions/reconcile-vector-index.js.map +0 -1
  439. package/dist/store/actions/search.d.ts.map +0 -1
  440. package/dist/store/actions/search.js.map +0 -1
  441. package/dist/store/internal/backend-search.d.ts +0 -5
  442. package/dist/store/internal/backend-search.d.ts.map +0 -1
  443. package/dist/store/internal/backend-search.js +0 -68
  444. package/dist/store/internal/backend-search.js.map +0 -1
  445. package/dist/store/internal/filter.d.ts.map +0 -1
  446. package/dist/store/internal/filter.js.map +0 -1
  447. package/dist/store/internal/index-reconcile.d.ts +0 -22
  448. package/dist/store/internal/index-reconcile.d.ts.map +0 -1
  449. package/dist/store/internal/index-reconcile.js +0 -105
  450. package/dist/store/internal/index-reconcile.js.map +0 -1
  451. package/dist/store/internal/index-sync.d.ts +0 -11
  452. package/dist/store/internal/index-sync.d.ts.map +0 -1
  453. package/dist/store/internal/index-sync.js +0 -26
  454. package/dist/store/internal/index-sync.js.map +0 -1
  455. package/dist/store/internal/item-mapper.d.ts +0 -25
  456. package/dist/store/internal/item-mapper.d.ts.map +0 -1
  457. package/dist/store/internal/item-mapper.js +0 -53
  458. package/dist/store/internal/item-mapper.js.map +0 -1
  459. package/dist/store/internal/keys.d.ts +0 -18
  460. package/dist/store/internal/keys.d.ts.map +0 -1
  461. package/dist/store/internal/keys.js +0 -42
  462. package/dist/store/internal/keys.js.map +0 -1
  463. package/dist/store/internal/namespace-match.d.ts +0 -12
  464. package/dist/store/internal/namespace-match.d.ts.map +0 -1
  465. package/dist/store/internal/namespace-match.js +0 -41
  466. package/dist/store/internal/namespace-match.js.map +0 -1
  467. package/dist/store/internal/overwrite-swap.d.ts +0 -33
  468. package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
  469. package/dist/store/internal/overwrite-swap.js +0 -62
  470. package/dist/store/internal/overwrite-swap.js.map +0 -1
  471. package/dist/store/internal/persist.d.ts +0 -27
  472. package/dist/store/internal/persist.d.ts.map +0 -1
  473. package/dist/store/internal/persist.js +0 -59
  474. package/dist/store/internal/persist.js.map +0 -1
  475. package/dist/store/internal/query.d.ts +0 -6
  476. package/dist/store/internal/query.d.ts.map +0 -1
  477. package/dist/store/internal/query.js +0 -32
  478. package/dist/store/internal/query.js.map +0 -1
  479. package/dist/store/internal/ranker.d.ts +0 -13
  480. package/dist/store/internal/ranker.d.ts.map +0 -1
  481. package/dist/store/internal/ranker.js +0 -31
  482. package/dist/store/internal/ranker.js.map +0 -1
  483. package/dist/store/internal/read-existing.d.ts +0 -19
  484. package/dist/store/internal/read-existing.d.ts.map +0 -1
  485. package/dist/store/internal/read-existing.js +0 -29
  486. package/dist/store/internal/read-existing.js.map +0 -1
  487. package/dist/store/internal/score-direction.d.ts +0 -32
  488. package/dist/store/internal/score-direction.d.ts.map +0 -1
  489. package/dist/store/internal/score-direction.js +0 -39
  490. package/dist/store/internal/score-direction.js.map +0 -1
  491. package/dist/store/internal/search-filter.d.ts +0 -4
  492. package/dist/store/internal/search-filter.d.ts.map +0 -1
  493. package/dist/store/internal/search-filter.js +0 -11
  494. package/dist/store/internal/search-filter.js.map +0 -1
  495. package/dist/store/internal/semantic-search.d.ts.map +0 -1
  496. package/dist/store/internal/semantic-search.js.map +0 -1
  497. package/dist/store/internal/setup.d.ts.map +0 -1
  498. package/dist/store/internal/setup.js.map +0 -1
  499. package/dist/store/internal/validation.d.ts +0 -13
  500. package/dist/store/internal/validation.d.ts.map +0 -1
  501. package/dist/store/internal/validation.js +0 -35
  502. package/dist/store/internal/validation.js.map +0 -1
  503. package/dist/store/internal/write-verify.d.ts +0 -37
  504. package/dist/store/internal/write-verify.d.ts.map +0 -1
  505. package/dist/store/internal/write-verify.js +0 -68
  506. package/dist/store/internal/write-verify.js.map +0 -1
  507. package/dist/store/store.d.ts.map +0 -1
  508. package/dist/store/store.js.map +0 -1
  509. package/dist/store/types.d.ts.map +0 -1
  510. package/dist/store/types.js.map +0 -1
  511. package/dist/store/vector-backend.d.ts.map +0 -1
  512. package/dist/store/vector-backend.js.map +0 -1
@@ -0,0 +1,551 @@
1
+ /**
2
+ * Hides how a row write whose outcome matters is issued and settled.
3
+ *
4
+ * A write can lose its acknowledgement, be re-sent by the retry layer, race a
5
+ * concurrent writer, or leave an S3 object that only its row names. Three
6
+ * things answer that, and they are decided together here: a guard that admits
7
+ * the write only while the row still holds what the caller observed; a client
8
+ * request token, drawn once per logical write with a deadline inside the
9
+ * window the service honours it for, so a re-send of a committed write is
10
+ * discarded (record 6); and a strongly consistent read-back that turns a write
11
+ * whose outcome was lost into one of three verdicts. Whether a write needs the
12
+ * token is the payload descriptor's question, answered here once.
13
+ */
14
+ import { type PayloadDescriptor, type DescriptorRef } from '../codec/codec';
15
+ import type { DynamoDBDocumentLike, AttributeMap, TransactAction } from './client';
16
+ import type { RetryOptions } from './retry';
17
+ import { type RowKey } from './table-schema';
18
+ /**
19
+ * What a row write needs of its adapter: the document client, the table, and
20
+ * the retry policy. Every context that writes or reads back a row already
21
+ * carries these three, so a call site passes itself.
22
+ */
23
+ export interface RowWriteDeps {
24
+ client: DynamoDBDocumentLike;
25
+ tableName: string;
26
+ retry?: RetryOptions;
27
+ }
28
+ /** How one tokened transaction is retried, beyond the adapter's own policy. */
29
+ export interface TokenedWriteOptions {
30
+ /** Cancels the retries. */
31
+ signal?: AbortSignal;
32
+ /** The jitter source, for a caller whose tests need the backoff to take no time. */
33
+ rng?: () => number;
34
+ /** The fewest attempts the write is given, whatever the adapter's policy says. */
35
+ minAttempts?: number;
36
+ }
37
+ /** How one row write is sent: the guard it carries and the signal that cancels it. */
38
+ export interface RowWriteOptions {
39
+ guard?: RevisionGuard;
40
+ signal?: AbortSignal;
41
+ }
42
+ /**
43
+ * Whether a payload descriptor names an S3 object, and so whether the write
44
+ * carrying it can strand one.
45
+ *
46
+ * An inline payload references nothing outside its own row: a re-landed copy
47
+ * of such a write is an ordinary last-write-wins outcome, not a lost object.
48
+ * Only the offloaded write is worth the extra write capacity a transaction
49
+ * costs, which is why the question is asked of the descriptor rather than of
50
+ * the adapter — an adapter with an offloader configured still writes inline
51
+ * whenever the payload is under its threshold.
52
+ *
53
+ * Accepts: `descriptor` — a full payload descriptor, or the projection a
54
+ * pre-write read returns without the inline bytes.
55
+ *
56
+ * Returns: true when the payload was offloaded to S3.
57
+ *
58
+ * Throws: nothing.
59
+ */
60
+ export declare function referencesS3Object(descriptor: DescriptorRef): boolean;
61
+ /**
62
+ * Commit `actions` as one
63
+ * {@link https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html | TransactWriteItems}
64
+ * under a client request token, so a re-send DynamoDB already applied lands as
65
+ * a no-op instead of as a second write.
66
+ *
67
+ * A write that offloads its payload uploads the object first and commits the
68
+ * row second. Lose the row's acknowledgement and the retry can commit it
69
+ * twice; the cleanup that follows then releases an object the other attempt's
70
+ * row still names, leaving a live row pointing at nothing. A delete has the
71
+ * mirror problem: its retry, re-evaluated rather than deduplicated, meets a row
72
+ * a competitor wrote after the first attempt landed and erases it. `PutItem`
73
+ * and `DeleteItem` take no token and cannot be made to; a one-item transaction
74
+ * can, and inside the service's 10-minute window the re-send is discarded
75
+ * rather than applied.
76
+ *
77
+ * **What the token guarantees, and what it does not.** A write whose first
78
+ * attempt **committed** is applied exactly once, at that moment — so a later
79
+ * writer supersedes it normally and a concurrent delete stands. A write whose
80
+ * first attempt was **rejected by its condition** carries no idempotency at
81
+ * all: a cancelled transaction never completes, so DynamoDB caches no result
82
+ * for its token, and a retry with the same token is a **fresh evaluation**
83
+ * against the table as it stands at retry time. The short version — "a retried
84
+ * write lands once" — is therefore false, and every caller that reasons about a
85
+ * rejection must reason about the table, not about the token.
86
+ *
87
+ * Two readings that sentence must not be given, because the shorter version of
88
+ * it invites both. It is about writes **this library sends with a token**: it
89
+ * says nothing about a `BatchWriteItem`, which can carry no token at all, and
90
+ * nothing about a first request that was already wrong, which no token can
91
+ * help — a token makes a *re-sent* request harmless and has nothing to say
92
+ * about a race that needs no retry to go wrong. And "exactly once" is about
93
+ * **application, not ordering**: a cancelled-then-retried write applies later
94
+ * than its first attempt, or not at all. What a cancellation does still
95
+ * reserve is the token's *parameters*, which is why a re-pin must draw a fresh
96
+ * one rather than re-present this one.
97
+ *
98
+ * **Stable across a re-send, fresh across a re-pin.** The input — token
99
+ * included — is built once here, outside the retry closure, so every attempt
100
+ * of one budget re-sends the identical request and the token deduplicates it.
101
+ * A compare-and-swap that loses and re-pins calls this again and draws a new
102
+ * token, which is required rather than merely tidy: the re-pinned request
103
+ * carries a different `ConditionExpression`, and the same token presented with
104
+ * changed parameters inside the window is refused with
105
+ * `IdempotentParameterMismatchException` — a name that appears in no retry
106
+ * list and in no handler in this package, so reusing a token would surface a
107
+ * raw SDK error to a caller. That refusal is only observable against real
108
+ * DynamoDB: the local image does not reserve a cancelled token's parameters
109
+ * and simply re-evaluates the changed body, so the unit and integration tiers
110
+ * can assert only that two re-pins carry different tokens, and the refusal
111
+ * itself belongs to the tier that runs against AWS.
112
+ *
113
+ * **At most one guarded action, and only ever as many actions as must land
114
+ * together.** A cancellation is read as a guard rejection only while exactly
115
+ * one cause remains once the items along for the ride are set aside, so a
116
+ * second *guarded* action whose condition fails in the same race would turn
117
+ * that race into an unrecognised non-retryable error — which is exactly what a
118
+ * competing writer of the same checkpoint id would produce, since it fails
119
+ * both rows at once. Every row-at-a-time caller here
120
+ * passes a single action for a second reason as well: a transaction cancels
121
+ * whole, so one item per transaction keeps each write's outcome independent of
122
+ * its neighbours', which is what the fan-out writers rely on. More than one
123
+ * action is for the callers whose rows are atomic by contract and carry no
124
+ * condition between them.
125
+ *
126
+ * Accepts: `deps` — the adapter's client, table and retry policy. `actions` —
127
+ * the `Put`, `Delete`, `Update` or `ConditionCheck` entries to commit
128
+ * together, captured by reference and re-sent unchanged on every attempt of
129
+ * the budget, so a caller must mutate neither the array nor an entry of it while this call is in flight.
130
+ * `options.signal` — aborts between attempts. `options.rng` — the jitter
131
+ * source, replacing the default one for a caller whose tests need the backoff
132
+ * to take no time. `options.minAttempts` — the fewest attempts the write is
133
+ * given: the budget is the larger of it and the adapter's own `maxAttempts`,
134
+ * so a caller policy may raise it, never lower it. Without `rng` and
135
+ * `minAttempts` the retry receives the adapter's policy, the signal and the
136
+ * deadline, and nothing else.
137
+ *
138
+ * Returns: nothing. The transaction committed, or it threw.
139
+ *
140
+ * Throws: whatever the transaction throws.
141
+ *
142
+ * Guarantees: the retrying stops while the token is still honoured. The budget
143
+ * carries a deadline of {@link MAX_WRITE_LIFETIME_MS} from now, half the
144
+ * window the service deduplicates over, so the wait that would carry this
145
+ * write past it is never started.
146
+ *
147
+ * Nothing in the token enforces that window — the service honours a token for
148
+ * `TOKEN_IDEMPOTENCY_WINDOW_MS` whatever the caller's policy says, and a
149
+ * re-send arriving after it closes is a new request that is applied. The
150
+ * deadline is what keeps the budget inside it, and it bounds only the waits
151
+ * *between* attempts: it is tested before each backoff and cannot shorten an
152
+ * attempt already in flight. On a client this library builds the per-attempt
153
+ * `DEFAULT_REQUEST_TIMEOUT_MS` bounds that attempt as well; on an **injected**
154
+ * client, which is used exactly as given and may carry no request timeout at
155
+ * all, a single hung request can still carry the budget past the window, and
156
+ * nothing here prevents it.
157
+ *
158
+ * That deadline is spread onto a copy of the policy and never assigned onto
159
+ * it: `retryFor` hands back the adapter's own options object when there is no
160
+ * signal, and stamping a deadline onto that object would bound every later
161
+ * call of the same adapter by this call's clock.
162
+ */
163
+ export declare function transactIdempotently(deps: RowWriteDeps, actions: TransactAction[], options?: TokenedWriteOptions): Promise<void>;
164
+ /**
165
+ * Commit one row under a request token; see {@link transactIdempotently} for
166
+ * why the write takes a transaction's shape and what the token buys.
167
+ *
168
+ * Accepts: `deps` — the adapter's client, table and retry policy. `item` — the
169
+ * row to commit. It is captured by reference and re-sent unchanged on every
170
+ * attempt of the budget, so a caller must not mutate it while this call is in
171
+ * flight: the re-send would carry the same token with different parameters,
172
+ * which the service refuses with `IdempotentParameterMismatchException`.
173
+ * `guard` — the condition fragments from `revisionGuard`, or a caller's own;
174
+ * omitted writes unconditionally, which is the case a token helps most, since
175
+ * nothing else stops a re-send from landing. `signal` — aborts between
176
+ * attempts.
177
+ *
178
+ * Returns: nothing. The write committed, or it threw.
179
+ *
180
+ * Throws: whatever the transaction throws. A guard rejection now arrives as a
181
+ * `TransactionCanceledException` whose single reason is `ConditionalCheckFailed`
182
+ * rather than as a `ConditionalCheckFailedException`; both answer
183
+ * `isConditionalCheckFailed` and both carry the rejected row to
184
+ * `rejectedRow`, so a caller reads them the same way. A spent budget
185
+ * throws `RETRY_EXHAUSTED` as any other call does.
186
+ */
187
+ export declare function putIdempotently(deps: RowWriteDeps, item: AttributeMap, guard?: RevisionGuard, signal?: AbortSignal): Promise<void>;
188
+ /**
189
+ * Remove one row under a request token; see {@link transactIdempotently} for
190
+ * why the delete takes a transaction's shape and what the token buys.
191
+ *
192
+ * It buys more here than a put's token does. An unconditional `DeleteItem`
193
+ * cannot be turned away, so a retry that arrives after the first attempt
194
+ * already committed removes whatever a competitor has written since. Under a
195
+ * token that replay is answered from the idempotency cache and never reaches
196
+ * the row, which is what makes a condition failure *informative*: it now
197
+ * proves a genuine race rather than possibly reporting this call's own
198
+ * landed attempt.
199
+ *
200
+ * Accepts: `deps` — the adapter's client, table and retry policy. `key` — the
201
+ * row's key, captured by reference and re-sent unchanged for the same reason a
202
+ * put's item is. `guard` — the condition fragments pinning what the caller
203
+ * observed; omitted deletes unconditionally. `signal` — aborts between
204
+ * attempts.
205
+ *
206
+ * Returns: nothing. The delete committed, or it threw.
207
+ *
208
+ * Throws: as {@link putIdempotently} does. A rejection carries the row that
209
+ * turned it away only while there is one — an absent row cancels with no
210
+ * `Item` at all, which is how a caller tells "someone rewrote it" from "it was
211
+ * already gone". **That reading is only sound while the guard asks for the
212
+ * row.** Every guard `revisionGuard` builds carries
213
+ * `ReturnValuesOnConditionCheckFailure: 'ALL_OLD'`; a caller passing its own
214
+ * guard without it, or no guard at all, gets an empty rejection for a row that
215
+ * is very much still there — and a caller that then releases what that row
216
+ * names has deleted an object a live row points at.
217
+ */
218
+ export declare function deleteIdempotently(deps: RowWriteDeps, key: AttributeMap, guard?: RevisionGuard, signal?: AbortSignal): Promise<void>;
219
+ /**
220
+ * Commit one row: as a tokened one-item transaction when it names an S3
221
+ * object, and as a plain `PutItem` otherwise.
222
+ *
223
+ * The descriptor decides, not the adapter. An adapter with an offloader still
224
+ * writes inline whenever a payload is under its threshold, and a row that names
225
+ * no object has nothing a re-sent write could strand, so a transaction would
226
+ * charge twice the write capacity to buy nothing.
227
+ *
228
+ * Accepts: `row` — the item to write. `payload` — its payload descriptor, which
229
+ * decides the shape. `options.guard` — the condition the write carries, if any.
230
+ * `options.signal` — cancels the retries.
231
+ *
232
+ * Returns: nothing, once the write committed.
233
+ *
234
+ * Throws: the guard's rejection — a rejection that `isConditionalCheckFailed`
235
+ * answers true for, with the row that turned the write away readable through
236
+ * `rejectedRow`; whatever the write throws once its retries are spent.
237
+ */
238
+ export declare function commitRow(deps: RowWriteDeps, row: AttributeMap, payload: DescriptorRef, options?: RowWriteOptions): Promise<void>;
239
+ /**
240
+ * Compare-and-swap attempts before a caller gives up and overwrites
241
+ * unconditionally. Kept small on purpose: DynamoDB charges write capacity for a
242
+ * *failed* conditional write too, sized on the existing item, so an aggressive
243
+ * loop turns contention into cost. Three attempts settle every realistic race,
244
+ * and the fallback is exactly the pre-0.9.0 behaviour rather than an error.
245
+ */
246
+ export declare const OVERWRITE_CAS_MAX_ATTEMPTS = 3;
247
+ /** What a caller saw at the row before it tried to overwrite it. */
248
+ export interface ObservedRow {
249
+ exists: boolean;
250
+ revision?: string;
251
+ }
252
+ /**
253
+ * Condition fragments to spread into a `PutCommand` input. Every guard asks
254
+ * DynamoDB to attach the existing row to a rejection, so a compare-and-swap
255
+ * that loses can re-pin from the exception (see {@link rejectedRow}) instead
256
+ * of spending a second strongly-consistent read.
257
+ */
258
+ export interface RevisionGuard {
259
+ ConditionExpression: string;
260
+ ExpressionAttributeNames?: Record<string, string>;
261
+ ExpressionAttributeValues?: Record<string, string>;
262
+ ReturnValuesOnConditionCheckFailure: 'ALL_OLD';
263
+ }
264
+ /**
265
+ * Build the condition admitting a write only while the row still holds the
266
+ * revision this caller observed.
267
+ *
268
+ * Without it, two concurrent overwrites both read the same previous payload
269
+ * descriptor, both commit their own nonced upload, and both delete that same
270
+ * previous object — leaving the loser's upload orphaned with nothing left
271
+ * recording that it ever existed. A post-commit read-back cannot repair that,
272
+ * because neither writer can learn of an object it never saw; only refusing the
273
+ * second write until it re-reads can.
274
+ *
275
+ * A row with no revision attribute was written before 0.9.0. Pinning its
276
+ * *absence* is what makes the swap correct across an upgrade: the first writer
277
+ * to touch such a row stamps one, and any racer still holding the pre-upgrade
278
+ * observation is turned away.
279
+ *
280
+ * Accepts: `attribute` — the revision attribute's name, since the checkpointer
281
+ * reuses its `writeGroup` rather than carrying a second one. `observed` — the
282
+ * three states a caller can have seen: no row, a row with no revision, a row
283
+ * with one.
284
+ *
285
+ * Returns: the condition fragments for a `PutCommand`, one per state —
286
+ * `attribute_not_exists(PK)`, `attribute_not_exists(<attribute>)`, and
287
+ * equality. Every one asks DynamoDB to attach the existing row to a rejection,
288
+ * so a swap that loses re-pins from the exception instead of spending a second
289
+ * strongly-consistent read.
290
+ *
291
+ * Throws: nothing.
292
+ *
293
+ * Guarantees: it pins the revision the caller observed — a value, its absence,
294
+ * or the row's own absence — and nothing else about the row. A revision is
295
+ * drawn afresh by every write that replaces the row (`randomUUID()` for a
296
+ * store record, the call's own `writeGroup` for a special row) and nothing
297
+ * restores a spent one, so a **satisfied** guard proves that nothing replaced
298
+ * the row between the caller's read and this write: the row overwritten is the
299
+ * row observed, still naming the descriptor the caller read off it. That is
300
+ * what makes it safe to release the payload this write superseded — the
301
+ * caller is holding the descriptor the row really named, not a stale copy of
302
+ * one a racer has already replaced and released. An update that leaves the
303
+ * revision alone can still have touched the row in between — the recency-index
304
+ * backfill is the one such write in this package, and it adds index keys and
305
+ * nothing else — so what the guard pins is the row's identity, not every byte
306
+ * of it.
307
+ *
308
+ * A **rejected** guard proves the mirror and no more: the row is not the one
309
+ * observed. It is never evidence that a competitor won, because a write whose
310
+ * acknowledgement was lost can be turned away by the row it committed itself
311
+ * — see {@link isConditionalCheckFailed} — and it carries no idempotency for a
312
+ * retry either, since a rejected attempt commits nothing for a token to be
313
+ * answered from.
314
+ */
315
+ export declare function revisionGuard(attribute: string, observed: ObservedRow): RevisionGuard;
316
+ /** The field a payload descriptor carries the id of the write that produced it in. */
317
+ export declare const WRITE_ID_ATTRIBUTE = "writeId";
318
+ /**
319
+ * Build the condition admitting a delete only while the row still carries the
320
+ * per-write id the reader observed on it.
321
+ *
322
+ * A partition-wide delete reads a partition and then deletes what it saw. A row
323
+ * rewritten in between was acknowledged to its writer and is erased anyway, and
324
+ * the object it named is released — which this turns into a refusal the pass
325
+ * reports instead. The id is the write's own, never recomputed from the row's
326
+ * state, so nothing can restore it and no second writer can arrive at it.
327
+ *
328
+ * Accepts: `attribute` — the attribute the id lives on, top-level for a row
329
+ * that carries one (a pending write's `writeGroup`, a session row's own id) and
330
+ * the payload attribute otherwise. `id` — the id the read observed; a row
331
+ * observed *without* one is deleted unconditionally rather than pinned, so this
332
+ * is never called for it. `field` — the field inside the attribute, which turns
333
+ * the condition into a document path over a descriptor; omitted for a
334
+ * top-level pin.
335
+ *
336
+ * Returns: the condition fragments for a `DeleteCommand`, asking DynamoDB to
337
+ * attach the existing row to a rejection so the refusal can be told from a row
338
+ * that was already gone with no second read.
339
+ *
340
+ * Throws: nothing.
341
+ *
342
+ * Guarantees: one equality and nothing else. A document path over an attribute
343
+ * that is absent, or present without the field, evaluates false rather than
344
+ * failing the request, so one shape covers an offloaded row, an inline one and
345
+ * a row a racer has rewritten into either.
346
+ *
347
+ * What a satisfied guard proves is the delete's counterpart of
348
+ * {@link revisionGuard}'s: the row removed is the row the partition read saw,
349
+ * not a replacement a later write left at the same key — which is what makes
350
+ * the object that read recorded against it the right one to release. A
351
+ * rejection means the row now carries some other write's id, and this pass
352
+ * leaves it in place and reports it rather than re-pinning, because a row it
353
+ * never read is not its to delete.
354
+ */
355
+ export declare function writeIdGuard(attribute: string, id: string, field?: string): RevisionGuard;
356
+ /**
357
+ * Whether a conditional write was turned away by its guard.
358
+ *
359
+ * The same rejection has two shapes, because a `PutItem` reports it as an
360
+ * exception of its own while a `TransactWriteItems` reports it as one
361
+ * cancellation reason among one per item. Both are the same event to a caller,
362
+ * so both answer true here and neither is a caller's business to tell apart.
363
+ *
364
+ * Accepts: `error` — any error; the exception's name and, for a cancelled
365
+ * transaction, its reasons are read.
366
+ *
367
+ * Returns: true for `ConditionalCheckFailedException`, and for a cancellation
368
+ * whose one cause is a `ConditionalCheckFailed` reason, as the classifier
369
+ * decides both.
370
+ *
371
+ * Throws: nothing.
372
+ *
373
+ * Guarantees: **not** evidence that a competitor won. A `PutCommand` retried
374
+ * after its response was lost can re-hit the row it wrote itself and fail
375
+ * identically, and the two are indistinguishable from the rejection alone —
376
+ * which is why every caller reads the row back before deleting anything.
377
+ */
378
+ export declare function isConditionalCheckFailed(error: Error): boolean;
379
+ /**
380
+ * The row that turned a conditional write away, when DynamoDB attached it
381
+ * (`ReturnValuesOnConditionCheckFailure: 'ALL_OLD'`). Verified against real
382
+ * DynamoDB: the document client does not unmarshall an *error* payload the way
383
+ * it unmarshalls a response, so the item arrives in raw AttributeValue form and
384
+ * is unmarshalled here. Undefined when the rejection carries no item — the row
385
+ * was deleted between the observation and the write — in which case the caller
386
+ * falls back to a read.
387
+ *
388
+ * A cancelled transaction attaches the same row to the cancellation reason of
389
+ * the item whose condition failed, rather than to the error itself, and leaves
390
+ * it in the same raw form — so there is one place more to look and still one
391
+ * unmarshalling.
392
+ *
393
+ * Accepts: `error` — any error; only a rejection from a guard built by
394
+ * {@link revisionGuard} carries the item.
395
+ *
396
+ * Returns: the row as a plain document, or undefined.
397
+ *
398
+ * Throws: whatever `unmarshall` rejects for an item that is not in
399
+ * AttributeValue form.
400
+ */
401
+ export declare function rejectedRow(error: Error): AttributeMap | undefined;
402
+ /**
403
+ * What a post-failure read established about a write whose outcome was
404
+ * ambiguous.
405
+ *
406
+ * - `'landed'` — the row holds this write, so it committed server-side and only
407
+ * its acknowledgement was lost.
408
+ * - `'not-landed'` — the row was read and holds something else, or nothing, so
409
+ * this write's own upload is dead and safe to release.
410
+ * - `'unverified'` — the read itself failed, so nothing is established.
411
+ *
412
+ * The third answer is the one that must exist. Folding it into the second made
413
+ * a partition that blocked both the write and this read delete the object a
414
+ * possibly-live row points at, breaking every later read of that item. Leaking
415
+ * one object is recoverable; stranding a live row is not.
416
+ */
417
+ export type WriteVerdict = 'landed' | 'not-landed' | 'unverified';
418
+ /** Which row to read, and which attributes of it to project. */
419
+ export interface RowRead {
420
+ key: {
421
+ PK: string;
422
+ SK: string;
423
+ };
424
+ /** The attribute carrying the row's identity; always projected. */
425
+ attribute: string;
426
+ /** Further attributes to project, when the caller needs the row itself back. */
427
+ also?: readonly string[];
428
+ /**
429
+ * Attributes holding a payload descriptor, projected as its `location` and
430
+ * `s3Key` only. A cleanup decision needs where the payload lives, never its
431
+ * inline bytes, which can run to hundreds of kilobytes. An attribute named
432
+ * here and as `attribute` or in `also` is projected once, as the descriptor,
433
+ * because DynamoDB refuses two overlapping paths in one projection.
434
+ */
435
+ descriptors?: readonly string[];
436
+ }
437
+ /**
438
+ * A read, plus what makes the row *this* write's row.
439
+ *
440
+ * `expected` is the string the row must yield. `undefined` means there is
441
+ * nothing to compare — a record with no revision, a checkpoint with nothing
442
+ * offloaded — and no read is spent: with nothing at stake the answer is
443
+ * `'not-landed'`, which releases nothing that exists.
444
+ */
445
+ export interface RowProbe extends RowRead {
446
+ /**
447
+ * How the row names the write that holds it: `'attribute'` reads the
448
+ * identity straight out of `attribute`, `'descriptor'` reads the S3 key of
449
+ * the payload descriptor stored there.
450
+ */
451
+ kind: 'attribute' | 'descriptor';
452
+ expected: string | undefined;
453
+ }
454
+ /** A verification read: what it established, and the row it saw. */
455
+ export interface VerifiedWrite {
456
+ verdict: WriteVerdict;
457
+ /** The row as read. Absent when nothing was read, or no row exists. */
458
+ row?: AttributeMap;
459
+ }
460
+ /**
461
+ * The S3 key an offloaded descriptor points at.
462
+ *
463
+ * Accepts: any descriptor, or none.
464
+ *
465
+ * Returns: the key, or undefined for an inline or absent payload — "this row
466
+ * names no object", which is what a caller comparing two writes needs.
467
+ *
468
+ * Throws: nothing.
469
+ */
470
+ export declare function offloadedKey(descriptor: PayloadDescriptor | undefined): string | undefined;
471
+ /**
472
+ * The identity `row` carries under `probe`.
473
+ *
474
+ * Accepts: `probe.kind` — `'attribute'` reads the identity straight out of the
475
+ * attribute, `'descriptor'` reads the S3 key of the descriptor stored there.
476
+ * `row` — as read, or undefined when there is none.
477
+ *
478
+ * Returns: the identity, or undefined when the row is absent or carries none.
479
+ *
480
+ * Throws: nothing.
481
+ */
482
+ export declare function identityOf(probe: RowProbe, row: AttributeMap | undefined): string | undefined;
483
+ /**
484
+ * The verdict for a row already in hand.
485
+ *
486
+ * Accepts: `row` — the row a conditional-write rejection carried back, which
487
+ * makes this verdict cost no read at all.
488
+ *
489
+ * Returns: `'landed'` when the row's identity is this write's, `'not-landed'`
490
+ * otherwise. Never `'unverified'`: the row was seen.
491
+ *
492
+ * Throws: nothing.
493
+ */
494
+ export declare function verdictFor(probe: RowProbe, row: AttributeMap | undefined): WriteVerdict;
495
+ /**
496
+ * Read the row a probe names, strongly consistently.
497
+ *
498
+ * Accepts: `read.attribute` — always projected. `read.also` — further
499
+ * attributes, for a caller that needs the row itself back rather than only its
500
+ * identity. `read.descriptors` — descriptor attributes, projected as their
501
+ * `location` and `s3Key` only; each still comes back under its own name, as a
502
+ * map holding those two.
503
+ *
504
+ * Returns: the projected row, or undefined when there is none.
505
+ *
506
+ * Throws: the underlying error, which {@link verifyRow} turns into a verdict
507
+ * and a caller that wants the cause keeps. The two are separate functions
508
+ * because a synthetic error built from a caught one lost the original cause.
509
+ *
510
+ * Guarantees: strongly consistent — a read that may lag is no evidence at all
511
+ * about a write that may have landed.
512
+ */
513
+ export declare function readRow(deps: RowWriteDeps, read: RowRead): Promise<AttributeMap | undefined>;
514
+ /**
515
+ * Read one row back to establish what an ambiguous write actually did.
516
+ *
517
+ * No failure is proof of a non-commit: `withDynamoDBRetry` re-issues a write
518
+ * whose response was lost, and those re-issues can time out at the transport
519
+ * without reaching DynamoDB, so the budget is spent on a `RETRY_EXHAUSTED` error
520
+ * while the row is live. Every caller that is about to delete something on the
521
+ * strength of a failure reads the row first, through here.
522
+ *
523
+ * Accepts: `probe.expected` — the identity that would prove the write landed.
524
+ * `undefined` means there is nothing at stake — a record with no revision, a
525
+ * checkpoint with nothing offloaded — and no read is spent.
526
+ *
527
+ * Returns: the verdict and, when one was read, the row. See
528
+ * {@link WriteVerdict} for what each answer licenses the caller to do.
529
+ *
530
+ * Throws: nothing. A failed read is the `'unverified'` answer, not an error:
531
+ * the caller is already handling a failure and needs a decision, not a second
532
+ * one.
533
+ */
534
+ export declare function verifyRow(deps: RowWriteDeps, probe: RowProbe): Promise<VerifiedWrite>;
535
+ /**
536
+ * Whether a row is confirmed absent right now — what resolves an ambiguous
537
+ * retry-exhausted *delete*, where the delete may well have landed server-side
538
+ * and only its acknowledgement was lost. Only the partition key is projected:
539
+ * existence is the whole question.
540
+ *
541
+ * Accepts: `key` — the row's.
542
+ *
543
+ * Returns: `true` only when a strongly consistent read found no row; `false`
544
+ * when it found one or when the read itself failed, because a failed read
545
+ * confirms nothing — "not confirmed", never "still there": the caller only
546
+ * rethrows on `false`, so nothing is deleted on the strength of a read that
547
+ * did not happen.
548
+ *
549
+ * Throws: nothing.
550
+ */
551
+ export declare function isRowAbsent(deps: RowWriteDeps, key: RowKey): Promise<boolean>;