@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
@@ -1,8 +1,152 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides how a cancelled transaction says why it failed.
4
+ *
5
+ * A `TransactionCanceledException` carries one raw reason per item, in the
6
+ * order the items were sent, under codes that are not the exception names the
7
+ * same failures carry outside a transaction. Which reason is a guard
8
+ * rejection, which are transient or throttling, and which item failed its
9
+ * condition are read here and nowhere else, so the retry layer, the error
10
+ * classifier and the writers that act on a rejection cannot read one apart.
11
+ */
2
12
  Object.defineProperty(exports, "__esModule", { value: true });
3
13
  exports.getCancellationReasons = getCancellationReasons;
4
- /** Extract `CancellationReasons` from a transaction-cancellation error, if present. */
14
+ exports.conditionalCheckFailure = conditionalCheckFailure;
15
+ exports.transientCancellation = transientCancellation;
16
+ exports.throttledCancellation = throttledCancellation;
17
+ exports.conditionFailedAt = conditionFailedAt;
18
+ /** The reason code an item that was not the cause carries. */
19
+ const NOT_THE_CAUSE = 'None';
20
+ /**
21
+ * The reason code a guard rejection arrives under inside a transaction. It is
22
+ * *not* the exception name the same rejection carries outside one
23
+ * (`ConditionalCheckFailedException`); the two strings are neither
24
+ * interchangeable nor prefixes to test for.
25
+ */
26
+ const CONDITION_FAILED = 'ConditionalCheckFailed';
27
+ /**
28
+ * The per-item reasons a `TransactWriteItems` cancellation carries.
29
+ *
30
+ * Accepts: `error` — any error; only a `TransactionCanceledException` carries
31
+ * the field.
32
+ *
33
+ * Its parameter is the weak {@link RejectionFields} rather than `Error`, which
34
+ * is a deliberate trade: `{}` and `{ name }` now compile where they did not,
35
+ * and in exchange this module stays the only place that dereferences
36
+ * `CancellationReasons`, so {@link conditionalCheckFailure}, the retry
37
+ * classifier and the two history readers cannot drift apart in how they read
38
+ * it. Every value that reaches it at runtime comes from a `catch`; the two
39
+ * call sites inside this package that pass it along rather than an `Error`
40
+ * ({@link conditionalCheckFailure} and `isConditionalCheckFailed`) received
41
+ * one from a `catch` themselves.
42
+ *
43
+ * Returns: one entry per transaction item, in the order the items were sent
44
+ * (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html),
45
+ * or `undefined` when the error carries none — which is what an older service
46
+ * response, a different failure, or a thrown value that is not an object at
47
+ * all looks like.
48
+ *
49
+ * Throws: **nothing**, for any value a `throw` can produce. Every value that
50
+ * reaches this came from a `catch`, and `null` is one a `catch` can bind: the
51
+ * property read raised a `TypeError` there, inside the classification the
52
+ * retry layer makes before it decides whether to try again.
53
+ */
5
54
  function getCancellationReasons(error) {
6
- return error.CancellationReasons;
55
+ return error?.CancellationReasons;
56
+ }
57
+ /**
58
+ * The reason belonging to the one item a transaction's guard turned away.
59
+ *
60
+ * A cancellation names every item, so "was this write rejected by its
61
+ * condition?" is only answerable once the items that were merely along for the
62
+ * ride are set aside. What must remain is a single cause, and it must be the
63
+ * condition: a cancellation that also failed a second item for its own reason
64
+ * is not a guard rejection, and reporting one would hide the other failure.
65
+ *
66
+ * A reason carrying no `Code` counts as a cause here, while the retry
67
+ * classifier treats that same shape as transient. The disagreement is
68
+ * deliberate, because the two readers are conservative in opposite directions:
69
+ * for the classifier, an unreadable reason may be retried, which a request
70
+ * token makes harmless; here it must **not** be read as a clean rejection,
71
+ * since acting on one discards whatever else the transaction failed on. AWS
72
+ * populates `Code` for every item, so neither branch is reachable in practice.
73
+ *
74
+ * Accepts: `error` — any error; only a cancellation carries reasons.
75
+ *
76
+ * Returns: the sole `ConditionalCheckFailed` reason — with the rejected row
77
+ * attached when the item asked for it — or `undefined` for every other error,
78
+ * including a cancellation with no reasons, a different cause, or more than
79
+ * one.
80
+ *
81
+ * Throws: nothing.
82
+ */
83
+ function conditionalCheckFailure(error) {
84
+ const reasons = getCancellationReasons(error) ?? [];
85
+ const causes = reasons.filter((reason) => reason.Code !== NOT_THE_CAUSE);
86
+ return causes.length === 1 && causes[0].Code === CONDITION_FAILED ? causes[0] : undefined;
87
+ }
88
+ /**
89
+ * Cancellation reason codes (from a `TransactionCanceledException`'s
90
+ * `CancellationReasons`) that are transient and safe to retry. `None` marks an
91
+ * item that was not the cause and is ignored.
92
+ */
93
+ const TRANSIENT_CANCELLATION_REASONS = [
94
+ 'None',
95
+ 'TransactionConflict',
96
+ 'ThrottlingError',
97
+ 'ProvisionedThroughputExceeded',
98
+ ];
99
+ /**
100
+ * Whether a cancelled transaction failed only for transient reasons.
101
+ *
102
+ * Accepts: `error` — any error; only a cancellation carries reasons.
103
+ *
104
+ * Returns: `undefined` when the error carries no reasons, so the caller's
105
+ * ordinary signal matching applies; otherwise whether every reason is
106
+ * transient. A cancellation carrying no reasons at all is not transient.
107
+ *
108
+ * Throws: nothing, for any value; see {@link getCancellationReasons}.
109
+ */
110
+ function transientCancellation(error) {
111
+ const reasons = getCancellationReasons(error);
112
+ if (!reasons)
113
+ return undefined;
114
+ // `length > 0` is load-bearing: `.every()` is vacuously true on an empty
115
+ // array, which would make a reason-less cancellation retryable — the exact
116
+ // opposite of what this function documents. AWS populates one reason per
117
+ // `TransactItems` entry, so an empty array should not occur; if it ever
118
+ // does, the conservative answer is not to retry.
119
+ return (reasons.length > 0 &&
120
+ reasons.every((reason) => reason.Code === undefined || TRANSIENT_CANCELLATION_REASONS.includes(reason.Code)));
121
+ }
122
+ /** Cancellation reason codes that mean the request was throttled. */
123
+ const THROTTLING_REASONS = ['ThrottlingError', 'ProvisionedThroughputExceeded'];
124
+ /**
125
+ * Whether a cancelled transaction was throttled.
126
+ *
127
+ * Accepts: `error` — any error; only a cancellation carries reasons.
128
+ *
129
+ * Returns: true when any reason is a throttling reason. Meaningful only for a
130
+ * cancellation {@link transientCancellation} already found transient, which is
131
+ * the one place it is asked.
132
+ *
133
+ * Throws: nothing, for any value.
134
+ */
135
+ function throttledCancellation(error) {
136
+ return (getCancellationReasons(error) ?? []).some((reason) => reason.Code !== undefined && THROTTLING_REASONS.includes(reason.Code));
137
+ }
138
+ /**
139
+ * Whether the item at `index` of a cancelled transaction failed its condition.
140
+ *
141
+ * Accepts: `error` — any error. `index` — the item's position in the
142
+ * `TransactItems` the caller sent; reasons come back in that order.
143
+ *
144
+ * Returns: true when that item's reason is `ConditionalCheckFailed`, whatever
145
+ * the other items' reasons are; false for anything that is not such a
146
+ * cancellation.
147
+ *
148
+ * Throws: nothing, for any value.
149
+ */
150
+ function conditionFailedAt(error, index) {
151
+ return getCancellationReasons(error)?.[index]?.Code === CONDITION_FAILED;
7
152
  }
8
- //# sourceMappingURL=cancellation.js.map
@@ -1,21 +1,175 @@
1
+ /**
2
+ * Hides the DynamoDB client: the part of the DocumentClient this package calls,
3
+ * the row shapes that part speaks, and how a client this package builds bounds
4
+ * each request.
5
+ *
6
+ * The structural type is what lets a caller inject any DocumentClient-shaped
7
+ * object, and it is public; the row shapes travel through every module that
8
+ * reads or writes a row; the construction is the one place a request timeout
9
+ * and a socket timeout are set, and the one place that knows whether the
10
+ * adapter owns the client it holds.
11
+ */
1
12
  import { DynamoDBClient, type DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
2
- import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
13
+ import { DynamoDBDocument, type NativeAttributeValue, type TransactWriteCommandInput } from '@aws-sdk/lib-dynamodb';
14
+ import type { Logger } from '../logging/logger';
15
+ /**
16
+ * How long one request attempt may take on a client this library builds
17
+ * (10 seconds) before the SDK's request handler destroys it and rejects with a
18
+ * retryable `TimeoutError`. `MAX_WRITE_LIFETIME_MS`
19
+ * (`src/shared/dynamodb/retry.ts`) bounds how many attempts *start*; it is
20
+ * checked between them, so it can refuse to begin another wait and can never
21
+ * shorten the attempt already in flight. Without a handler timeout — every one
22
+ * of them defaults to 0 — a hung socket holds that attempt open forever and
23
+ * the write lifetime bounds nothing.
24
+ *
25
+ * Measured, not picked. Across the fan-out widths this package documents, the
26
+ * worst interval the handler itself saw — socket acquisition including the
27
+ * wait behind the agent's fifty sockets, connect, request write and
28
+ * time-to-first-response-header — was 0.92 s, at a thousand concurrent writes
29
+ * of 20 KB values, and ten seconds is roughly eleven times that. The asymmetry
30
+ * settles the close call: too large leaves one attempt hanging for at most ten
31
+ * seconds, which the write lifetime's own headroom absorbs, while too small
32
+ * turns a healthy wide fan-out into a retry storm.
33
+ */
34
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 10000;
35
+ /**
36
+ * How long a socket may sit idle (5 seconds) on a client this library builds
37
+ * before the request handler destroys the request. Which error that surfaces
38
+ * as depends on when it fires: before response headers the handler's own
39
+ * rejection reaches the caller as a `TimeoutError`, while after them the call
40
+ * has already resolved and the destroy arrives through the response stream
41
+ * instead, as an `ECONNRESET` abort. Both are classified retryable, so either
42
+ * way a stalled transfer becomes a retry of this library's own. An idle timer
43
+ * rather than a deadline: activity in either direction resets it, so it bounds
44
+ * a transfer that has stalled and never one that is merely slow, and its clock
45
+ * starts at socket assignment rather than at request creation. What each
46
+ * client needs it *for* differs, so that belongs at each client's own call
47
+ * site rather than here.
48
+ *
49
+ * Not a tuning knob. The handler installs the socket listener immediately only
50
+ * below 6 000 ms; at or above that it defers registration by 3 000 ms and
51
+ * returns the deferral's timer id, which the handler's clear-on-resolve
52
+ * cancels when response headers arrive — so at 6 000 or more the field
53
+ * silently stops doing anything for every response that answers inside three
54
+ * seconds, which is the normal case. That is a fact about the request handler
55
+ * and about neither client. A unit assertion holds this value under that
56
+ * threshold so raising it fails loudly instead of disabling the only bound a
57
+ * stalled transfer has.
58
+ */
59
+ export declare const DEFAULT_SOCKET_TIMEOUT_MS = 5000;
3
60
  /** A resolved DynamoDB client plus its ownership flag. */
4
61
  export interface ResolvedDynamoDBClient {
5
62
  ddbClient: DynamoDBClient | undefined;
6
- client: DynamoDBDocument;
63
+ client: DynamoDBDocumentLike;
7
64
  ownsClient: boolean;
8
65
  }
9
66
  /** Options for {@link resolveDynamoDBClient}. */
10
67
  export interface ResolveClientOptions {
11
- client?: DynamoDBDocument;
68
+ client?: DynamoDBDocumentLike;
12
69
  clientConfig?: DynamoDBClientConfig;
13
- createClient?: (config: DynamoDBClientConfig) => DynamoDBClient;
14
70
  }
15
71
  /**
16
- * Resolve the DocumentClient for an adapter. An injected `client` is used as-is
17
- * and not owned; otherwise a client is built from `clientConfig` (via the
18
- * `createClient` seam) and owned, so the adapter destroys it on `destroy()`.
72
+ * The DocumentClient an adapter will use, and whether it owns it.
73
+ *
74
+ * Accepts: `client` — an injected DocumentClient, used as-is; `clientConfig` —
75
+ * what one is built from when no client is injected; `createClient` — the test
76
+ * seam that builds it. `assertBaseAdapterOptions` rejects an injected client
77
+ * given alongside either of the other two, so only one branch is ever taken.
78
+ *
79
+ * Returns: the document client, the raw client behind it when this call built
80
+ * one, and `ownsClient` — true only then. An injected client is never
81
+ * destroyed by `destroy()`; it may be shared with the caller's own code and
82
+ * with the other adapters.
83
+ *
84
+ * Throws: whatever the SDK constructor throws for an unusable config.
85
+ *
86
+ * Guarantees: a client this call builds gets `maxAttempts: 1` unless the config
87
+ * overrides it, so the SDK performs no retries of its own and this library's
88
+ * retry layer is the only one. It also gets a default request handler that
89
+ * bounds how long one attempt may run, which `maxAttempts` alone does not. A
90
+ * `requestHandler` in `clientConfig` replaces that default whole rather than
91
+ * merging with it — the documented escape hatch, and equally the documented
92
+ * way to give up the bound. An injected client keeps whatever it was built
93
+ * with — see {@link warnOnStackedRetries}.
19
94
  */
20
95
  export declare function resolveDynamoDBClient(options: ResolveClientOptions): ResolvedDynamoDBClient;
21
- //# sourceMappingURL=client.d.ts.map
96
+ /**
97
+ * Warn once when an injected client keeps the SDK's own retries.
98
+ *
99
+ * Accepts: `client` — the caller's. A client that cannot report its setting —
100
+ * a stub, a mock, a future SDK shape — is left alone.
101
+ *
102
+ * Returns: nothing. Deliberately not awaited by its callers: it is a warning
103
+ * about a caller-supplied client, not a precondition for using it, so
104
+ * constructing an adapter stays free of I/O.
105
+ *
106
+ * Throws: nothing, ever. The SDK's own config resolution can reject, and a
107
+ * rejection here would surface as an unhandled rejection from a constructor
108
+ * that did nothing wrong.
109
+ *
110
+ * Guarantees: the SDK's retries run inside every attempt of this library's
111
+ * retry layer, so the budget the constants and README describe multiplies (5 ×
112
+ * 3 requests per operation at the SDK default) and a throttling event turns
113
+ * into a retry storm. Saying so once, at construction, is the only place the
114
+ * caller can act on it.
115
+ *
116
+ * The one gap a deadline cannot cover. A tokened write's budget is bounded by
117
+ * `MAX_WRITE_LIFETIME_MS`, but that bound is checked between attempts: it can
118
+ * refuse to start another wait, and it cannot shorten an attempt already in
119
+ * flight. An injected client that retries internally turns one of this
120
+ * library's attempts into several of its own, so the time spent inside a
121
+ * single attempt stops being bounded by anything this library sets — which is
122
+ * why the warning says to construct it with `maxAttempts: 1`.
123
+ *
124
+ * `maxAttempts: 1` is necessary but not sufficient. The per-attempt bound
125
+ * holds for an injected client only if it also carries its own request
126
+ * timeout: a client this library builds is given one
127
+ * ({@link resolveDynamoDBClient}), and an injected client is used exactly as
128
+ * handed over, so one without a handler timeout leaves a single attempt
129
+ * unbounded even with the SDK's retries switched off.
130
+ */
131
+ export declare function warnOnStackedRetries(client: DynamoDBDocumentLike, logger: Logger): Promise<void>;
132
+ /**
133
+ * A row, or a key, as the DocumentClient returns and takes it: attribute names
134
+ * mapped to values that nothing has checked yet. Each feature's row parser
135
+ * turns one into that feature's row type.
136
+ */
137
+ export type AttributeMap = Record<string, NativeAttributeValue>;
138
+ /** A BatchWriteItem PutRequest. */
139
+ interface PutWriteRequest {
140
+ PutRequest: {
141
+ Item: AttributeMap;
142
+ };
143
+ }
144
+ /** A BatchWriteItem DeleteRequest. */
145
+ interface DeleteWriteRequest {
146
+ DeleteRequest: {
147
+ Key: AttributeMap;
148
+ };
149
+ }
150
+ /** A single BatchWriteItem write request. */
151
+ export type WriteRequest = PutWriteRequest | DeleteWriteRequest;
152
+ /** One action of a `TransactWriteItems` request, as the document client takes it. */
153
+ export type TransactAction = NonNullable<TransactWriteCommandInput['TransactItems']>[number];
154
+ /**
155
+ * The DocumentClient surface this library uses, named by shape rather than by
156
+ * identity. A `DynamoDBDocument` satisfies it, and so does a client built from
157
+ * a different copy of `@aws-sdk/lib-dynamodb`.
158
+ *
159
+ * That second case is the reason it exists. A consumer pinned to an older SDK
160
+ * than this package depends on gets a second, newer copy nested under the
161
+ * package; naming `DynamoDBDocument` in an option type would name *that* copy,
162
+ * and the client the consumer built is then a different type with the same
163
+ * name — refused at compile time for a method this library never calls, on the
164
+ * injection path the documentation recommends. Injection always worked at
165
+ * runtime; only the compiler stood in the way.
166
+ *
167
+ * The members are the eight the runtime collaborator check already requires,
168
+ * pinned equal to that list by a test — a client this type accepts and the
169
+ * constructor then rejects, or the reverse, would be worse than either rule
170
+ * alone. Picking them off `DynamoDBDocument` keeps each signature the SDK's
171
+ * own, so the internals stay exactly as type-safe as they were and the
172
+ * signatures cannot drift from the SDK this package installs.
173
+ */
174
+ export type DynamoDBDocumentLike = Pick<DynamoDBDocument, 'batchWrite' | 'delete' | 'get' | 'put' | 'query' | 'scan' | 'transactWrite' | 'update'>;
175
+ export {};
@@ -1,19 +1,167 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides the DynamoDB client: the part of the DocumentClient this package calls,
4
+ * the row shapes that part speaks, and how a client this package builds bounds
5
+ * each request.
6
+ *
7
+ * The structural type is what lets a caller inject any DocumentClient-shaped
8
+ * object, and it is public; the row shapes travel through every module that
9
+ * reads or writes a row; the construction is the one place a request timeout
10
+ * and a socket timeout are set, and the one place that knows whether the
11
+ * adapter owns the client it holds.
12
+ */
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.DEFAULT_SOCKET_TIMEOUT_MS = exports.DEFAULT_REQUEST_TIMEOUT_MS = void 0;
3
15
  exports.resolveDynamoDBClient = resolveDynamoDBClient;
16
+ exports.warnOnStackedRetries = warnOnStackedRetries;
4
17
  const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
5
18
  const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
6
19
  /**
7
- * Resolve the DocumentClient for an adapter. An injected `client` is used as-is
8
- * and not owned; otherwise a client is built from `clientConfig` (via the
9
- * `createClient` seam) and owned, so the adapter destroys it on `destroy()`.
20
+ * How long one request attempt may take on a client this library builds
21
+ * (10 seconds) before the SDK's request handler destroys it and rejects with a
22
+ * retryable `TimeoutError`. `MAX_WRITE_LIFETIME_MS`
23
+ * (`src/shared/dynamodb/retry.ts`) bounds how many attempts *start*; it is
24
+ * checked between them, so it can refuse to begin another wait and can never
25
+ * shorten the attempt already in flight. Without a handler timeout — every one
26
+ * of them defaults to 0 — a hung socket holds that attempt open forever and
27
+ * the write lifetime bounds nothing.
28
+ *
29
+ * Measured, not picked. Across the fan-out widths this package documents, the
30
+ * worst interval the handler itself saw — socket acquisition including the
31
+ * wait behind the agent's fifty sockets, connect, request write and
32
+ * time-to-first-response-header — was 0.92 s, at a thousand concurrent writes
33
+ * of 20 KB values, and ten seconds is roughly eleven times that. The asymmetry
34
+ * settles the close call: too large leaves one attempt hanging for at most ten
35
+ * seconds, which the write lifetime's own headroom absorbs, while too small
36
+ * turns a healthy wide fan-out into a retry storm.
37
+ */
38
+ exports.DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
39
+ /**
40
+ * How long a socket may sit idle (5 seconds) on a client this library builds
41
+ * before the request handler destroys the request. Which error that surfaces
42
+ * as depends on when it fires: before response headers the handler's own
43
+ * rejection reaches the caller as a `TimeoutError`, while after them the call
44
+ * has already resolved and the destroy arrives through the response stream
45
+ * instead, as an `ECONNRESET` abort. Both are classified retryable, so either
46
+ * way a stalled transfer becomes a retry of this library's own. An idle timer
47
+ * rather than a deadline: activity in either direction resets it, so it bounds
48
+ * a transfer that has stalled and never one that is merely slow, and its clock
49
+ * starts at socket assignment rather than at request creation. What each
50
+ * client needs it *for* differs, so that belongs at each client's own call
51
+ * site rather than here.
52
+ *
53
+ * Not a tuning knob. The handler installs the socket listener immediately only
54
+ * below 6 000 ms; at or above that it defers registration by 3 000 ms and
55
+ * returns the deferral's timer id, which the handler's clear-on-resolve
56
+ * cancels when response headers arrive — so at 6 000 or more the field
57
+ * silently stops doing anything for every response that answers inside three
58
+ * seconds, which is the normal case. That is a fact about the request handler
59
+ * and about neither client. A unit assertion holds this value under that
60
+ * threshold so raising it fails loudly instead of disabling the only bound a
61
+ * stalled transfer has.
62
+ */
63
+ exports.DEFAULT_SOCKET_TIMEOUT_MS = 5_000;
64
+ /**
65
+ * The DocumentClient an adapter will use, and whether it owns it.
66
+ *
67
+ * Accepts: `client` — an injected DocumentClient, used as-is; `clientConfig` —
68
+ * what one is built from when no client is injected; `createClient` — the test
69
+ * seam that builds it. `assertBaseAdapterOptions` rejects an injected client
70
+ * given alongside either of the other two, so only one branch is ever taken.
71
+ *
72
+ * Returns: the document client, the raw client behind it when this call built
73
+ * one, and `ownsClient` — true only then. An injected client is never
74
+ * destroyed by `destroy()`; it may be shared with the caller's own code and
75
+ * with the other adapters.
76
+ *
77
+ * Throws: whatever the SDK constructor throws for an unusable config.
78
+ *
79
+ * Guarantees: a client this call builds gets `maxAttempts: 1` unless the config
80
+ * overrides it, so the SDK performs no retries of its own and this library's
81
+ * retry layer is the only one. It also gets a default request handler that
82
+ * bounds how long one attempt may run, which `maxAttempts` alone does not. A
83
+ * `requestHandler` in `clientConfig` replaces that default whole rather than
84
+ * merging with it — the documented escape hatch, and equally the documented
85
+ * way to give up the bound. An injected client keeps whatever it was built
86
+ * with — see {@link warnOnStackedRetries}.
10
87
  */
11
88
  function resolveDynamoDBClient(options) {
12
89
  if (options.client) {
13
90
  return { ddbClient: undefined, client: options.client, ownsClient: false };
14
91
  }
15
92
  const createClient = options.createClient ?? ((config) => new client_dynamodb_1.DynamoDBClient(config));
16
- const ddbClient = createClient({ maxAttempts: 1, ...options.clientConfig });
93
+ // `throwOnRequestTimeout` is what makes the request timeout a bound: without
94
+ // it the handler only logs a warning when the timeout is breached.
95
+ // `socketTimeout` is here because `requestTimeout` stops applying the moment
96
+ // response *headers* arrive — the handler resolves there and clears its
97
+ // timers — so it says nothing about a response body that then stalls
98
+ // mid-stream, and an idle timer does. No `connectionTimeout` is passed,
99
+ // deliberately — its timer starts when the request is created and is
100
+ // cleared only when the agent *assigns* a socket, so the time a request
101
+ // spends queued behind `maxSockets` counts against it. At the thousand-wide
102
+ // fan-out this package documents, any value short enough to be useful
103
+ // destroys healthy writes that this library then retries, and any value
104
+ // long enough to be safe bounds nothing the request timeout does not
105
+ // already bound.
106
+ const ddbClient = createClient({
107
+ maxAttempts: 1,
108
+ requestHandler: {
109
+ requestTimeout: exports.DEFAULT_REQUEST_TIMEOUT_MS,
110
+ socketTimeout: exports.DEFAULT_SOCKET_TIMEOUT_MS,
111
+ throwOnRequestTimeout: true,
112
+ },
113
+ ...options.clientConfig,
114
+ });
17
115
  return { ddbClient, client: lib_dynamodb_1.DynamoDBDocument.from(ddbClient), ownsClient: true };
18
116
  }
19
- //# sourceMappingURL=client.js.map
117
+ /**
118
+ * Warn once when an injected client keeps the SDK's own retries.
119
+ *
120
+ * Accepts: `client` — the caller's. A client that cannot report its setting —
121
+ * a stub, a mock, a future SDK shape — is left alone.
122
+ *
123
+ * Returns: nothing. Deliberately not awaited by its callers: it is a warning
124
+ * about a caller-supplied client, not a precondition for using it, so
125
+ * constructing an adapter stays free of I/O.
126
+ *
127
+ * Throws: nothing, ever. The SDK's own config resolution can reject, and a
128
+ * rejection here would surface as an unhandled rejection from a constructor
129
+ * that did nothing wrong.
130
+ *
131
+ * Guarantees: the SDK's retries run inside every attempt of this library's
132
+ * retry layer, so the budget the constants and README describe multiplies (5 ×
133
+ * 3 requests per operation at the SDK default) and a throttling event turns
134
+ * into a retry storm. Saying so once, at construction, is the only place the
135
+ * caller can act on it.
136
+ *
137
+ * The one gap a deadline cannot cover. A tokened write's budget is bounded by
138
+ * `MAX_WRITE_LIFETIME_MS`, but that bound is checked between attempts: it can
139
+ * refuse to start another wait, and it cannot shorten an attempt already in
140
+ * flight. An injected client that retries internally turns one of this
141
+ * library's attempts into several of its own, so the time spent inside a
142
+ * single attempt stops being bounded by anything this library sets — which is
143
+ * why the warning says to construct it with `maxAttempts: 1`.
144
+ *
145
+ * `maxAttempts: 1` is necessary but not sufficient. The per-attempt bound
146
+ * holds for an injected client only if it also carries its own request
147
+ * timeout: a client this library builds is given one
148
+ * ({@link resolveDynamoDBClient}), and an injected client is used exactly as
149
+ * handed over, so one without a handler timeout leaves a single attempt
150
+ * unbounded even with the SDK's retries switched off.
151
+ */
152
+ async function warnOnStackedRetries(client, logger) {
153
+ const report = client.config
154
+ ?.maxAttempts;
155
+ if (typeof report !== 'function')
156
+ return;
157
+ try {
158
+ const maxAttempts = await report();
159
+ if (maxAttempts > 1) {
160
+ logger.warn("injected DynamoDB client keeps the SDK's own retries; they stack inside this library's " +
161
+ 'retry budget — construct it with maxAttempts: 1 unless that is intended', { maxAttempts });
162
+ }
163
+ }
164
+ catch {
165
+ // A client that cannot report its retry setting is left alone.
166
+ }
167
+ }