@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,43 @@
1
+ /**
2
+ * Hides how many calls run at once, and which failure a fan-out reports.
3
+ *
4
+ * A caller maps over rows, shards or payloads and gets results in input order.
5
+ * The worker pool, the floor that turns a bad limit into sequential work
6
+ * rather than none, and the rule that the first rejection wins and stops new
7
+ * work are decided here, as is the default of eight in flight, so tuning it
8
+ * touches no reader.
9
+ */
10
+ /**
11
+ * Offloaded payloads decoded at once by one read (`getTuple` pending writes,
12
+ * `search` candidates, `getMessages`). Each offloaded row costs one S3 GET, so
13
+ * a serial loop scaled latency linearly with the row count; eight in flight
14
+ * keeps the win without bursting a bucket. Also the recency-index shards one
15
+ * listing queries at once when the adapter names no `readConcurrency`.
16
+ */
17
+ export declare const DEFAULT_READ_CONCURRENCY = 8;
18
+ /**
19
+ * Map `items` through `fn` with at most `limit` calls in flight.
20
+ *
21
+ * Accepts: `items` — any length, including empty, which calls `fn` never.
22
+ * `limit` — calls in flight; anything that is not a whole number of at least 1
23
+ * degrades to sequential rather than stalling, and a value above `items.length`
24
+ * starts only as many workers as there are items. The floor is a *range* test
25
+ * rather than arithmetic on purpose: `Math.min(NaN, items.length)` is `NaN`,
26
+ * so a `NaN` limit asked for `Array.from({ length: NaN })` workers — none —
27
+ * and the call resolved to an empty array having invoked `fn` on nothing.
28
+ * `refillDryShards` loops while any shard is dry around exactly this call, so
29
+ * zero workers there was a busy-spin with no I/O and no way out; only the
30
+ * required `concurrency` field kept it off typed paths. `fn` — receives the
31
+ * item and its index.
32
+ *
33
+ * Returns: the results in **input** order, not completion order.
34
+ *
35
+ * Throws: the first rejection, whatever its value. No further item is started
36
+ * after it, the calls already in flight are allowed to settle, and that first
37
+ * error is the one thrown — a later failure never displaces it. Whether one
38
+ * has happened is tracked by a flag rather than by testing the value, because
39
+ * a rejection whose value is `undefined` is indistinguishable from no rejection
40
+ * at all: tested by value, it would be swallowed, and its slot in the results
41
+ * would stay a hole.
42
+ */
43
+ export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * Hides how many calls run at once, and which failure a fan-out reports.
4
+ *
5
+ * A caller maps over rows, shards or payloads and gets results in input order.
6
+ * The worker pool, the floor that turns a bad limit into sequential work
7
+ * rather than none, and the rule that the first rejection wins and stops new
8
+ * work are decided here, as is the default of eight in flight, so tuning it
9
+ * touches no reader.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DEFAULT_READ_CONCURRENCY = void 0;
13
+ exports.mapWithConcurrency = mapWithConcurrency;
14
+ /**
15
+ * Offloaded payloads decoded at once by one read (`getTuple` pending writes,
16
+ * `search` candidates, `getMessages`). Each offloaded row costs one S3 GET, so
17
+ * a serial loop scaled latency linearly with the row count; eight in flight
18
+ * keeps the win without bursting a bucket. Also the recency-index shards one
19
+ * listing queries at once when the adapter names no `readConcurrency`.
20
+ */
21
+ exports.DEFAULT_READ_CONCURRENCY = 8;
22
+ /**
23
+ * Map `items` through `fn` with at most `limit` calls in flight.
24
+ *
25
+ * Accepts: `items` — any length, including empty, which calls `fn` never.
26
+ * `limit` — calls in flight; anything that is not a whole number of at least 1
27
+ * degrades to sequential rather than stalling, and a value above `items.length`
28
+ * starts only as many workers as there are items. The floor is a *range* test
29
+ * rather than arithmetic on purpose: `Math.min(NaN, items.length)` is `NaN`,
30
+ * so a `NaN` limit asked for `Array.from({ length: NaN })` workers — none —
31
+ * and the call resolved to an empty array having invoked `fn` on nothing.
32
+ * `refillDryShards` loops while any shard is dry around exactly this call, so
33
+ * zero workers there was a busy-spin with no I/O and no way out; only the
34
+ * required `concurrency` field kept it off typed paths. `fn` — receives the
35
+ * item and its index.
36
+ *
37
+ * Returns: the results in **input** order, not completion order.
38
+ *
39
+ * Throws: the first rejection, whatever its value. No further item is started
40
+ * after it, the calls already in flight are allowed to settle, and that first
41
+ * error is the one thrown — a later failure never displaces it. Whether one
42
+ * has happened is tracked by a flag rather than by testing the value, because
43
+ * a rejection whose value is `undefined` is indistinguishable from no rejection
44
+ * at all: tested by value, it would be swallowed, and its slot in the results
45
+ * would stay a hole.
46
+ */
47
+ async function mapWithConcurrency(items, limit, fn) {
48
+ const results = [];
49
+ let next = 0;
50
+ let failed = false;
51
+ let failure;
52
+ const worker = async () => {
53
+ while (!failed && next < items.length) {
54
+ const index = next;
55
+ next += 1;
56
+ try {
57
+ results[index] = await fn(items[index], index);
58
+ }
59
+ catch (error) {
60
+ if (!failed) {
61
+ failed = true;
62
+ failure = error;
63
+ }
64
+ }
65
+ }
66
+ };
67
+ const workers = Math.min(limit >= 1 ? Math.floor(limit) : 1, Math.max(items.length, 1));
68
+ await Promise.all(Array.from({ length: workers }, worker));
69
+ // `failure` is stored `Error | undefined` only because that is as far as a
70
+ // `catch` binding's value can be named without `unknown`, which is banned
71
+ // in src; the JSDoc above states the real contract — whatever `fn` rejected
72
+ // with, unchanged, and that can be `undefined` itself. The assertion below
73
+ // changes nothing at runtime; it only lets `only-throw-error` see the type
74
+ // this throw already had before that rule existed.
75
+ if (failed)
76
+ throw failure;
77
+ return results;
78
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Hides what an abort looks like.
3
+ *
4
+ * A signal may be aborted with this library's own `ABORTED` error, a
5
+ * `DOMException`, a string, any other error or nothing at all. Every one of
6
+ * them reaches a caller as a single `ABORTED` error that is never wrapped
7
+ * twice, and one test on the library's brand and that code is what tells a
8
+ * cancellation from a failure, so no call site inspects a reason's shape.
9
+ */
10
+ import { DynamoDBLangGraphError } from '../errors/base-error';
11
+ import { ErrorCode } from '../errors/error-code';
12
+ /**
13
+ * Whether `error` is a cancellation rather than a failure.
14
+ *
15
+ * Accepts: `error` — any error, from any layer, and equally any other value a
16
+ * `throw` can produce, since a `catch` is where this is called; `undefined`
17
+ * too, the `reason` a signal aborted without one can carry.
18
+ *
19
+ * Returns: whether it carries this library's brand and `code: 'ABORTED'`,
20
+ * which is the contract every cancellable method documents and the only thing
21
+ * a caller branches on, narrowed so it can be handed on as the abort it is.
22
+ * An unbranded object that merely carries `code: 'ABORTED'` is not an abort,
23
+ * because an error a wrapper caught that only looks like an abort must still
24
+ * be rebranded rather than re-thrown as it is.
25
+ *
26
+ * Throws: **nothing**, for any value. A value that cannot carry a property is
27
+ * not a cancellation, which is the answer an uncoded `Error` gets too.
28
+ */
29
+ export declare function isAbortError(error: Error | undefined): error is DynamoDBLangGraphError<ErrorCode.ABORTED>;
30
+ /**
31
+ * This library's error for an aborted `signal`.
32
+ *
33
+ * Accepts: `signal` — aborted; its `reason` may be this library's own
34
+ * `ABORTED` error, the `DOMException` a bare `controller.abort()` produces, a
35
+ * string, any other error, or `undefined`.
36
+ *
37
+ * Returns: the reason unchanged when it already is this library's own
38
+ * `ABORTED` error, so an error does not accumulate wrappers across layers;
39
+ * otherwise a fresh `ABORTED` error carrying the reason as `cause` (`undefined` reason carries
40
+ * none).
41
+ *
42
+ * Throws: nothing.
43
+ *
44
+ * Guarantees: `code === 'ABORTED'` holds however the signal was aborted, so a
45
+ * caller branches on the code rather than on the reason's shape.
46
+ */
47
+ export declare function abortErrorFrom(signal: AbortSignal): DynamoDBLangGraphError<ErrorCode.ABORTED>;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * Hides what an abort looks like.
4
+ *
5
+ * A signal may be aborted with this library's own `ABORTED` error, a
6
+ * `DOMException`, a string, any other error or nothing at all. Every one of
7
+ * them reaches a caller as a single `ABORTED` error that is never wrapped
8
+ * twice, and one test on the library's brand and that code is what tells a
9
+ * cancellation from a failure, so no call site inspects a reason's shape.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.isAbortError = isAbortError;
13
+ exports.abortErrorFrom = abortErrorFrom;
14
+ const base_error_1 = require("../errors/base-error");
15
+ const error_code_1 = require("../errors/error-code");
16
+ const errors_1 = require("../errors/errors");
17
+ /**
18
+ * Whether `error` is a cancellation rather than a failure.
19
+ *
20
+ * Accepts: `error` — any error, from any layer, and equally any other value a
21
+ * `throw` can produce, since a `catch` is where this is called; `undefined`
22
+ * too, the `reason` a signal aborted without one can carry.
23
+ *
24
+ * Returns: whether it carries this library's brand and `code: 'ABORTED'`,
25
+ * which is the contract every cancellable method documents and the only thing
26
+ * a caller branches on, narrowed so it can be handed on as the abort it is.
27
+ * An unbranded object that merely carries `code: 'ABORTED'` is not an abort,
28
+ * because an error a wrapper caught that only looks like an abort must still
29
+ * be rebranded rather than re-thrown as it is.
30
+ *
31
+ * Throws: **nothing**, for any value. A value that cannot carry a property is
32
+ * not a cancellation, which is the answer an uncoded `Error` gets too.
33
+ */
34
+ function isAbortError(error) {
35
+ return error !== undefined && (0, base_error_1.hasErrorCode)(error, error_code_1.ErrorCode.ABORTED);
36
+ }
37
+ /**
38
+ * This library's error for an aborted `signal`.
39
+ *
40
+ * Accepts: `signal` — aborted; its `reason` may be this library's own
41
+ * `ABORTED` error, the `DOMException` a bare `controller.abort()` produces, a
42
+ * string, any other error, or `undefined`.
43
+ *
44
+ * Returns: the reason unchanged when it already is this library's own
45
+ * `ABORTED` error, so an error does not accumulate wrappers across layers;
46
+ * otherwise a fresh `ABORTED` error carrying the reason as `cause` (`undefined` reason carries
47
+ * none).
48
+ *
49
+ * Throws: nothing.
50
+ *
51
+ * Guarantees: `code === 'ABORTED'` holds however the signal was aborted, so a
52
+ * caller branches on the code rather than on the reason's shape.
53
+ */
54
+ function abortErrorFrom(signal) {
55
+ const reason = signal.reason;
56
+ if (isAbortError(reason))
57
+ return reason;
58
+ return (0, errors_1.abortError)('Operation aborted', reason === undefined ? undefined : (0, base_error_1.toError)(reason));
59
+ }
@@ -1,23 +1,86 @@
1
- import type { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
2
- import { DrainOptions } from './drain-unprocessed';
3
- import type { WriteRequest } from './types';
1
+ /**
2
+ * Hides BatchWriteItem.
3
+ *
4
+ * A call carries at most twenty-five requests, and the service may hand some
5
+ * back unprocessed; they are re-sent with backoff until a bound, and a batch
6
+ * that still cannot finish is reported with how much of it did.
7
+ */
8
+ import type { DynamoDBDocumentLike, WriteRequest } from './client';
9
+ import { type RetryOptions } from './retry';
10
+ /**
11
+ * DynamoDB BatchWriteItem maximum requests per call.
12
+ *
13
+ * @see https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html
14
+ */
15
+ export declare const BATCH_WRITE_MAX = 25;
16
+ /** Maximum retries draining UnprocessedItems / UnprocessedKeys. */
17
+ export declare const MAX_UNPROCESSED_RETRIES = 10;
4
18
  /**
5
19
  * Write an arbitrary number of requests, chunked into batches of 25 (the
6
20
  * BatchWriteItem limit). Every chunk is attempted regardless of an earlier
7
21
  * chunk's failure — order-independent writes (deletes/puts) should never
8
22
  * lose "later" chunks just because an earlier one failed. If any chunk fails,
9
- * throws {@link BatchWriteAllIncompleteError} reporting exactly how many
23
+ * throws `BATCH_WRITE_INCOMPLETE` reporting exactly how many
10
24
  * chunks succeeded vs. failed, and exactly how many individual writes
11
25
  * persisted, once every chunk has been attempted.
12
26
  *
13
- * This is this function's ONLY throw site. Two callers —
14
- * checkpointer/internal/special-write-cleanup.ts and
15
- * history/internal/append-saga.ts — type-assert a caught error straight to
16
- * {@link BatchWriteAllIncompleteError} on that guarantee (not `instanceof`,
17
- * banned repo-wide) instead of narrowing it, since this project enforces
18
- * 100% branch coverage and a defensive else-branch here would be
19
- * unreachable, hence untestable. Adding another throw path to this function
20
- * requires updating both call sites.
27
+ * Accepts: `requests` — any number, in any order, of writes that do not depend
28
+ * on each other; none is a no-op. `options` — the drain's retry budget and
29
+ * signal.
30
+ *
31
+ * Returns: nothing, and only when every request persisted.
32
+ *
33
+ * Throws: `ABORTED` the moment a chunk reports one, unwrapped and with no
34
+ * further chunk attempted — a caller who cancelled did not encounter a fault,
35
+ * and spending the remaining requests on a cancelled call is the opposite of
36
+ * what the cancel asked for. Otherwise `BATCH_WRITE_INCOMPLETE`,
37
+ * once every chunk has been attempted, reporting how many chunks succeeded and
38
+ * how many individual writes persisted. Its one caller — the rollback in
39
+ * history/internal/append.ts — type-asserts a caught error straight to
40
+ * its code's details (not `instanceof`, banned repo-wide) instead of
41
+ * narrowing it, on the narrower guarantee that it passes no signal, so the
42
+ * abort path cannot arise there; a call site that does pass one must narrow
43
+ * instead.
44
+ *
45
+ * Guarantees: every chunk is attempted regardless of an earlier chunk's
46
+ * failure — these writes are order-independent, so losing the later ones to an
47
+ * earlier failure would delete less than the caller asked and report no more
48
+ * for it. A cancel is the one exception, because it is not a failure. The
49
+ * count the error carries is exact, which is what lets a compensating caller
50
+ * revert precisely what landed, and it never counts a chunk whose error
51
+ * carried no count of its own.
52
+ */
53
+ export declare function batchWriteAll(client: DynamoDBDocumentLike, tableName: string, requests: WriteRequest[], options?: DrainOptions): Promise<void>;
54
+ /** Backoff/abort options shared by the drain helpers. */
55
+ export interface DrainOptions {
56
+ /** The adapter's retry options, applied to every BatchWriteItem round. */
57
+ retry?: RetryOptions;
58
+ signal?: AbortSignal;
59
+ rng?: () => number;
60
+ maxRetries?: number;
61
+ }
62
+ /**
63
+ * Write `requests` with `BatchWriteItem`, re-submitting what DynamoDB returns
64
+ * as `UnprocessedItems` until the batch drains.
65
+ *
66
+ * Accepts: `requests` — any length, including empty, which issues no request.
67
+ * `options.maxRetries` — re-submission rounds, default
68
+ * {@link MAX_UNPROCESSED_RETRIES}. `options.retry` — the adapter's policy, whose
69
+ * `baseDelayMs` and `maxDelayMs` set the backoff between rounds, so one policy
70
+ * governs every wait this package performs. `options.signal` — aborts a wait.
71
+ *
72
+ * Returns: nothing; success means every request persisted.
73
+ *
74
+ * Throws: `BATCH_WRITE_INCOMPLETE` when the batch does not drain
75
+ * within the rounds allowed, or when a round's write call fails outright — its
76
+ * `succeededCount` is every earlier round's confirmed persists and the
77
+ * triggering error is the `cause`. An `ABORTED` error passes through unchanged: a
78
+ * caller who cancelled did not get an incomplete batch write, and every
79
+ * cancellable method documents `ABORTED`.
80
+ *
81
+ * Guarantees: **every** error this function throws is one of those two — a
82
+ * `BATCH_WRITE_INCOMPLETE` error carrying an accurate `succeededCount`, or an
83
+ * `ABORTED` error. {@link batchWriteAll} adds up those counts across chunks and
84
+ * depends on it.
21
85
  */
22
- export declare function batchWriteAll(client: DynamoDBDocument, tableName: string, requests: WriteRequest[], options?: DrainOptions): Promise<void>;
23
- //# sourceMappingURL=batch-write.d.ts.map
86
+ export declare function drainUnprocessedWrites(client: DynamoDBDocumentLike, tableName: string, requests: WriteRequest[], options?: DrainOptions): Promise<void>;
@@ -1,54 +1,173 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides BatchWriteItem.
4
+ *
5
+ * A call carries at most twenty-five requests, and the service may hand some
6
+ * back unprocessed; they are re-sent with backoff until a bound, and a batch
7
+ * that still cannot finish is reported with how much of it did.
8
+ */
2
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MAX_UNPROCESSED_RETRIES = exports.BATCH_WRITE_MAX = void 0;
3
11
  exports.batchWriteAll = batchWriteAll;
4
- const constants_1 = require("../constants");
12
+ exports.drainUnprocessedWrites = drainUnprocessedWrites;
13
+ const base_error_1 = require("../errors/base-error");
14
+ const error_code_1 = require("../errors/error-code");
5
15
  const errors_1 = require("../errors/errors");
6
- const drain_unprocessed_1 = require("./drain-unprocessed");
16
+ const abort_1 = require("./abort");
17
+ const retry_1 = require("./retry");
18
+ /**
19
+ * DynamoDB BatchWriteItem maximum requests per call.
20
+ *
21
+ * @see https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html
22
+ */
23
+ exports.BATCH_WRITE_MAX = 25;
24
+ /** Maximum retries draining UnprocessedItems / UnprocessedKeys. */
25
+ exports.MAX_UNPROCESSED_RETRIES = 10;
7
26
  /**
8
27
  * Write an arbitrary number of requests, chunked into batches of 25 (the
9
28
  * BatchWriteItem limit). Every chunk is attempted regardless of an earlier
10
29
  * chunk's failure — order-independent writes (deletes/puts) should never
11
30
  * lose "later" chunks just because an earlier one failed. If any chunk fails,
12
- * throws {@link BatchWriteAllIncompleteError} reporting exactly how many
31
+ * throws `BATCH_WRITE_INCOMPLETE` reporting exactly how many
13
32
  * chunks succeeded vs. failed, and exactly how many individual writes
14
33
  * persisted, once every chunk has been attempted.
15
34
  *
16
- * This is this function's ONLY throw site. Two callers —
17
- * checkpointer/internal/special-write-cleanup.ts and
18
- * history/internal/append-saga.ts — type-assert a caught error straight to
19
- * {@link BatchWriteAllIncompleteError} on that guarantee (not `instanceof`,
20
- * banned repo-wide) instead of narrowing it, since this project enforces
21
- * 100% branch coverage and a defensive else-branch here would be
22
- * unreachable, hence untestable. Adding another throw path to this function
23
- * requires updating both call sites.
35
+ * Accepts: `requests` — any number, in any order, of writes that do not depend
36
+ * on each other; none is a no-op. `options` — the drain's retry budget and
37
+ * signal.
38
+ *
39
+ * Returns: nothing, and only when every request persisted.
40
+ *
41
+ * Throws: `ABORTED` the moment a chunk reports one, unwrapped and with no
42
+ * further chunk attempted — a caller who cancelled did not encounter a fault,
43
+ * and spending the remaining requests on a cancelled call is the opposite of
44
+ * what the cancel asked for. Otherwise `BATCH_WRITE_INCOMPLETE`,
45
+ * once every chunk has been attempted, reporting how many chunks succeeded and
46
+ * how many individual writes persisted. Its one caller — the rollback in
47
+ * history/internal/append.ts — type-asserts a caught error straight to
48
+ * its code's details (not `instanceof`, banned repo-wide) instead of
49
+ * narrowing it, on the narrower guarantee that it passes no signal, so the
50
+ * abort path cannot arise there; a call site that does pass one must narrow
51
+ * instead.
52
+ *
53
+ * Guarantees: every chunk is attempted regardless of an earlier chunk's
54
+ * failure — these writes are order-independent, so losing the later ones to an
55
+ * earlier failure would delete less than the caller asked and report no more
56
+ * for it. A cancel is the one exception, because it is not a failure. The
57
+ * count the error carries is exact, which is what lets a compensating caller
58
+ * revert precisely what landed, and it never counts a chunk whose error
59
+ * carried no count of its own.
24
60
  */
25
61
  async function batchWriteAll(client, tableName, requests, options = {}) {
26
- const totalChunks = Math.ceil(requests.length / constants_1.BATCH_WRITE_MAX);
62
+ const totalChunks = Math.ceil(requests.length / exports.BATCH_WRITE_MAX);
27
63
  let succeededChunks = 0;
28
64
  let succeededCount = 0;
29
65
  const failedChunks = [];
30
- for (let offset = 0; offset < requests.length; offset += constants_1.BATCH_WRITE_MAX) {
31
- const chunk = requests.slice(offset, offset + constants_1.BATCH_WRITE_MAX);
66
+ for (let offset = 0; offset < requests.length; offset += exports.BATCH_WRITE_MAX) {
67
+ const chunk = requests.slice(offset, offset + exports.BATCH_WRITE_MAX);
32
68
  try {
33
- await (0, drain_unprocessed_1.drainUnprocessedWrites)(client, tableName, chunk, options);
69
+ await drainUnprocessedWrites(client, tableName, chunk, options);
34
70
  succeededChunks += 1;
35
71
  succeededCount += chunk.length;
36
72
  }
37
73
  catch (error) {
38
- /**
39
- * drainUnprocessedWrites has exactly three throw sites and every one
40
- * constructs a BatchWriteIncompleteError with an accurate
41
- * succeededCount — asserted, not name-checked, since the false case is
42
- * unreachable and this project enforces 100% branch coverage with no
43
- * exceptions (see drain-unprocessed.ts).
44
- */
45
- const err = error;
46
- failedChunks.push(err);
47
- succeededCount += err.succeededCount;
74
+ const failure = error;
75
+ // Anything but an incomplete batch is the drain's other documented
76
+ // throw, a cancel, and it leaves the loop at once. Reading the brand and
77
+ // code rather than the class is the same realm-safe test the rest of
78
+ // this package makes, and it is what keeps a count this function cannot
79
+ // know out of the total: adding an absent `succeededCount` made it
80
+ // `NaN`.
81
+ if (!(0, base_error_1.hasErrorCode)(failure, error_code_1.ErrorCode.BATCH_WRITE_INCOMPLETE))
82
+ throw failure;
83
+ failedChunks.push(failure);
84
+ succeededCount += failure.details.succeededCount;
48
85
  }
49
86
  }
50
87
  if (failedChunks.length > 0) {
51
- throw new errors_1.BatchWriteAllIncompleteError(succeededChunks, totalChunks, failedChunks, succeededCount);
88
+ throw (0, errors_1.batchWriteAllIncompleteError)({
89
+ succeeded: succeededChunks,
90
+ total: totalChunks,
91
+ failures: failedChunks,
92
+ succeededCount,
93
+ });
94
+ }
95
+ }
96
+ /**
97
+ * The backoff window between rounds: the adapter's configured policy, never
98
+ * module constants — reading the constants here instead would leave a caller
99
+ * who raises `baseDelayMs` still waiting the module's default 100 ms on this
100
+ * one path, breaking the documented "one policy governs every wait".
101
+ */
102
+ function drainBackoff(retry) {
103
+ return {
104
+ base: retry?.baseDelayMs ?? retry_1.INITIAL_BACKOFF_DELAY_MS,
105
+ max: retry?.maxDelayMs ?? retry_1.MAX_BACKOFF_DELAY_MS,
106
+ };
107
+ }
108
+ /**
109
+ * The error a failed round raises.
110
+ *
111
+ * An `ABORTED` error passes through unchanged: a caller who cancelled did not get
112
+ * an incomplete batch write, and wrapping it reported
113
+ * `BATCH_WRITE_INCOMPLETE` for an aborted `deleteThread`, contradicting the
114
+ * `ABORTED` every cancellable method documents. Anything else becomes a
115
+ * `BATCH_WRITE_INCOMPLETE` error carrying what did persist.
116
+ */
117
+ function drainFailure(error, succeededCount, pending, retries) {
118
+ if ((0, abort_1.isAbortError)(error))
119
+ return error;
120
+ return (0, errors_1.batchWriteIncompleteError)(succeededCount, pending, retries, error);
121
+ }
122
+ /**
123
+ * Write `requests` with `BatchWriteItem`, re-submitting what DynamoDB returns
124
+ * as `UnprocessedItems` until the batch drains.
125
+ *
126
+ * Accepts: `requests` — any length, including empty, which issues no request.
127
+ * `options.maxRetries` — re-submission rounds, default
128
+ * {@link MAX_UNPROCESSED_RETRIES}. `options.retry` — the adapter's policy, whose
129
+ * `baseDelayMs` and `maxDelayMs` set the backoff between rounds, so one policy
130
+ * governs every wait this package performs. `options.signal` — aborts a wait.
131
+ *
132
+ * Returns: nothing; success means every request persisted.
133
+ *
134
+ * Throws: `BATCH_WRITE_INCOMPLETE` when the batch does not drain
135
+ * within the rounds allowed, or when a round's write call fails outright — its
136
+ * `succeededCount` is every earlier round's confirmed persists and the
137
+ * triggering error is the `cause`. An `ABORTED` error passes through unchanged: a
138
+ * caller who cancelled did not get an incomplete batch write, and every
139
+ * cancellable method documents `ABORTED`.
140
+ *
141
+ * Guarantees: **every** error this function throws is one of those two — a
142
+ * `BATCH_WRITE_INCOMPLETE` error carrying an accurate `succeededCount`, or an
143
+ * `ABORTED` error. {@link batchWriteAll} adds up those counts across chunks and
144
+ * depends on it.
145
+ */
146
+ async function drainUnprocessedWrites(client, tableName, requests, options = {}) {
147
+ if (requests.length === 0)
148
+ return;
149
+ const maxRetries = options.maxRetries ?? exports.MAX_UNPROCESSED_RETRIES;
150
+ const initialCount = requests.length;
151
+ const { base: baseDelay, max: maxDelay } = drainBackoff(options.retry);
152
+ let pending = requests;
153
+ let delay = baseDelay;
154
+ let retries = 0;
155
+ while (pending.length > 0) {
156
+ try {
157
+ const result = await (0, retry_1.withDynamoDBRetry)((request) => client.batchWrite({ RequestItems: { [tableName]: pending } }, request), { ...options.retry, signal: options.signal });
158
+ const leftover = result.UnprocessedItems?.[tableName] ?? [];
159
+ if (leftover.length === 0)
160
+ return;
161
+ pending = leftover;
162
+ retries += 1;
163
+ if (retries > maxRetries)
164
+ break;
165
+ await (0, retry_1.sleep)((0, retry_1.fullJitter)(delay, options.rng), options.signal);
166
+ delay = (0, retry_1.nextBackoffDelay)(delay, maxDelay);
167
+ }
168
+ catch (error) {
169
+ throw drainFailure(error, initialCount - pending.length, pending, retries);
170
+ }
52
171
  }
172
+ throw (0, errors_1.batchWriteIncompleteError)(initialCount - pending.length, pending, maxRetries);
53
173
  }
54
- //# sourceMappingURL=batch-write.js.map
@@ -1,7 +1,124 @@
1
- /** One entry of a TransactWriteItems/TransactionCanceledException's CancellationReasons. */
1
+ /**
2
+ * Hides how a cancelled transaction says why it failed.
3
+ *
4
+ * A `TransactionCanceledException` carries one raw reason per item, in the
5
+ * order the items were sent, under codes that are not the exception names the
6
+ * same failures carry outside a transaction. Which reason is a guard
7
+ * rejection, which are transient or throttling, and which item failed its
8
+ * condition are read here and nowhere else, so the retry layer, the error
9
+ * classifier and the writers that act on a rejection cannot read one apart.
10
+ */
11
+ import type { AttributeValue } from '@aws-sdk/client-dynamodb';
12
+ /**
13
+ * One entry of a TransactWriteItems/TransactionCanceledException's
14
+ * CancellationReasons. `Item` is the row the service attached to the item whose
15
+ * condition failed, in raw AttributeValue form — an error payload is not
16
+ * unmarshalled by the document client the way a response is.
17
+ */
2
18
  export interface CancellationReason {
3
19
  Code?: string;
20
+ Item?: Record<string, AttributeValue>;
4
21
  }
5
- /** Extract `CancellationReasons` from a transaction-cancellation error, if present. */
6
- export declare function getCancellationReasons(error: Error): CancellationReason[] | undefined;
7
- //# sourceMappingURL=cancellation.d.ts.map
22
+ /**
23
+ * The fields a write's rejection can arrive in: the exception's own name, and
24
+ * the per-item reasons a cancelled transaction carries instead. Both are
25
+ * optional because this is an arbitrary error seen through a reader's eyes — a
26
+ * rejection outside a transaction names itself and carries no reasons, one
27
+ * inside a transaction carries reasons under a name of its own.
28
+ */
29
+ export interface RejectionFields {
30
+ name?: string;
31
+ CancellationReasons?: CancellationReason[];
32
+ }
33
+ /**
34
+ * The per-item reasons a `TransactWriteItems` cancellation carries.
35
+ *
36
+ * Accepts: `error` — any error; only a `TransactionCanceledException` carries
37
+ * the field.
38
+ *
39
+ * Its parameter is the weak {@link RejectionFields} rather than `Error`, which
40
+ * is a deliberate trade: `{}` and `{ name }` now compile where they did not,
41
+ * and in exchange this module stays the only place that dereferences
42
+ * `CancellationReasons`, so {@link conditionalCheckFailure}, the retry
43
+ * classifier and the two history readers cannot drift apart in how they read
44
+ * it. Every value that reaches it at runtime comes from a `catch`; the two
45
+ * call sites inside this package that pass it along rather than an `Error`
46
+ * ({@link conditionalCheckFailure} and `isConditionalCheckFailed`) received
47
+ * one from a `catch` themselves.
48
+ *
49
+ * Returns: one entry per transaction item, in the order the items were sent
50
+ * (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html),
51
+ * or `undefined` when the error carries none — which is what an older service
52
+ * response, a different failure, or a thrown value that is not an object at
53
+ * all looks like.
54
+ *
55
+ * Throws: **nothing**, for any value a `throw` can produce. Every value that
56
+ * reaches this came from a `catch`, and `null` is one a `catch` can bind: the
57
+ * property read raised a `TypeError` there, inside the classification the
58
+ * retry layer makes before it decides whether to try again.
59
+ */
60
+ export declare function getCancellationReasons(error: RejectionFields): CancellationReason[] | undefined;
61
+ /**
62
+ * The reason belonging to the one item a transaction's guard turned away.
63
+ *
64
+ * A cancellation names every item, so "was this write rejected by its
65
+ * condition?" is only answerable once the items that were merely along for the
66
+ * ride are set aside. What must remain is a single cause, and it must be the
67
+ * condition: a cancellation that also failed a second item for its own reason
68
+ * is not a guard rejection, and reporting one would hide the other failure.
69
+ *
70
+ * A reason carrying no `Code` counts as a cause here, while the retry
71
+ * classifier treats that same shape as transient. The disagreement is
72
+ * deliberate, because the two readers are conservative in opposite directions:
73
+ * for the classifier, an unreadable reason may be retried, which a request
74
+ * token makes harmless; here it must **not** be read as a clean rejection,
75
+ * since acting on one discards whatever else the transaction failed on. AWS
76
+ * populates `Code` for every item, so neither branch is reachable in practice.
77
+ *
78
+ * Accepts: `error` — any error; only a cancellation carries reasons.
79
+ *
80
+ * Returns: the sole `ConditionalCheckFailed` reason — with the rejected row
81
+ * attached when the item asked for it — or `undefined` for every other error,
82
+ * including a cancellation with no reasons, a different cause, or more than
83
+ * one.
84
+ *
85
+ * Throws: nothing.
86
+ */
87
+ export declare function conditionalCheckFailure(error: RejectionFields): CancellationReason | undefined;
88
+ /**
89
+ * Whether a cancelled transaction failed only for transient reasons.
90
+ *
91
+ * Accepts: `error` — any error; only a cancellation carries reasons.
92
+ *
93
+ * Returns: `undefined` when the error carries no reasons, so the caller's
94
+ * ordinary signal matching applies; otherwise whether every reason is
95
+ * transient. A cancellation carrying no reasons at all is not transient.
96
+ *
97
+ * Throws: nothing, for any value; see {@link getCancellationReasons}.
98
+ */
99
+ export declare function transientCancellation(error: RejectionFields): boolean | undefined;
100
+ /**
101
+ * Whether a cancelled transaction was throttled.
102
+ *
103
+ * Accepts: `error` — any error; only a cancellation carries reasons.
104
+ *
105
+ * Returns: true when any reason is a throttling reason. Meaningful only for a
106
+ * cancellation {@link transientCancellation} already found transient, which is
107
+ * the one place it is asked.
108
+ *
109
+ * Throws: nothing, for any value.
110
+ */
111
+ export declare function throttledCancellation(error: RejectionFields): boolean;
112
+ /**
113
+ * Whether the item at `index` of a cancelled transaction failed its condition.
114
+ *
115
+ * Accepts: `error` — any error. `index` — the item's position in the
116
+ * `TransactItems` the caller sent; reasons come back in that order.
117
+ *
118
+ * Returns: true when that item's reason is `ConditionalCheckFailed`, whatever
119
+ * the other items' reasons are; false for anything that is not such a
120
+ * cancellation.
121
+ *
122
+ * Throws: nothing, for any value.
123
+ */
124
+ export declare function conditionFailedAt(error: RejectionFields, index: number): boolean;