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

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 (494) hide show
  1. package/README.md +282 -49
  2. package/dist/checkpointer/actions/delete-thread.d.ts +3 -2
  3. package/dist/checkpointer/actions/delete-thread.js +5 -2
  4. package/dist/checkpointer/actions/get-tuple.d.ts +3 -2
  5. package/dist/checkpointer/actions/get-tuple.js +10 -4
  6. package/dist/checkpointer/actions/list.d.ts +14 -4
  7. package/dist/checkpointer/actions/list.js +89 -63
  8. package/dist/checkpointer/actions/put-writes.d.ts +5 -5
  9. package/dist/checkpointer/actions/put-writes.js +12 -41
  10. package/dist/checkpointer/actions/put.d.ts +10 -3
  11. package/dist/checkpointer/actions/put.js +42 -12
  12. package/dist/checkpointer/internal/assemble.d.ts +10 -3
  13. package/dist/checkpointer/internal/assemble.js +7 -6
  14. package/dist/checkpointer/internal/checkpoint-write-verify.d.ts +24 -0
  15. package/dist/checkpointer/internal/checkpoint-write-verify.js +67 -0
  16. package/dist/checkpointer/internal/configurable.d.ts +0 -1
  17. package/dist/checkpointer/internal/configurable.js +10 -9
  18. package/dist/checkpointer/internal/fetch.d.ts +14 -5
  19. package/dist/checkpointer/internal/fetch.js +56 -14
  20. package/dist/checkpointer/internal/filter-match.d.ts +3 -2
  21. package/dist/checkpointer/internal/filter-match.js +4 -3
  22. package/dist/checkpointer/internal/item-reader.d.ts +17 -6
  23. package/dist/checkpointer/internal/item-reader.js +39 -14
  24. package/dist/checkpointer/internal/item-writer.d.ts +12 -3
  25. package/dist/checkpointer/internal/item-writer.js +24 -9
  26. package/dist/checkpointer/internal/keys.d.ts +11 -1
  27. package/dist/checkpointer/internal/keys.js +33 -3
  28. package/dist/checkpointer/internal/list-scope.d.ts +61 -0
  29. package/dist/checkpointer/internal/list-scope.js +108 -0
  30. package/dist/checkpointer/internal/pending-sends.d.ts +13 -0
  31. package/dist/checkpointer/internal/pending-sends.js +29 -0
  32. package/dist/checkpointer/internal/query.d.ts +2 -1
  33. package/dist/checkpointer/internal/query.js +9 -3
  34. package/dist/checkpointer/internal/regular-write.d.ts +28 -0
  35. package/dist/checkpointer/internal/regular-write.js +66 -0
  36. package/dist/checkpointer/internal/setup.d.ts +3 -1
  37. package/dist/checkpointer/internal/setup.js +10 -8
  38. package/dist/checkpointer/internal/special-write-cas.d.ts +1 -2
  39. package/dist/checkpointer/internal/special-write-cas.js +9 -9
  40. package/dist/checkpointer/internal/special-write-cleanup.d.ts +1 -2
  41. package/dist/checkpointer/internal/special-write-cleanup.js +10 -7
  42. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -1
  43. package/dist/checkpointer/internal/special-write-verify.js +18 -3
  44. package/dist/checkpointer/internal/stored-channels.d.ts +31 -0
  45. package/dist/checkpointer/internal/stored-channels.js +70 -0
  46. package/dist/checkpointer/internal/validation.d.ts +11 -6
  47. package/dist/checkpointer/internal/validation.js +19 -9
  48. package/dist/checkpointer/internal/write-guard.d.ts +8 -1
  49. package/dist/checkpointer/internal/write-guard.js +16 -7
  50. package/dist/checkpointer/internal/write-index.d.ts +0 -1
  51. package/dist/checkpointer/internal/write-index.js +0 -1
  52. package/dist/checkpointer/saver.d.ts +50 -10
  53. package/dist/checkpointer/saver.js +59 -17
  54. package/dist/checkpointer/types.d.ts +8 -1
  55. package/dist/checkpointer/types.js +0 -1
  56. package/dist/factory/factory.d.ts +22 -25
  57. package/dist/factory/factory.js +58 -18
  58. package/dist/factory/types.d.ts +57 -0
  59. package/dist/factory/types.js +2 -0
  60. package/dist/history/actions/add-messages.d.ts +1 -2
  61. package/dist/history/actions/add-messages.js +4 -4
  62. package/dist/history/actions/clear.d.ts +3 -2
  63. package/dist/history/actions/clear.js +5 -2
  64. package/dist/history/actions/get-messages.d.ts +13 -6
  65. package/dist/history/actions/get-messages.js +63 -42
  66. package/dist/history/actions/list-sessions.d.ts +1 -1
  67. package/dist/history/actions/list-sessions.js +8 -12
  68. package/dist/history/actions/reconcile-count.d.ts +1 -2
  69. package/dist/history/actions/reconcile-count.js +20 -7
  70. package/dist/history/chat-message-history.d.ts +51 -26
  71. package/dist/history/chat-message-history.js +60 -30
  72. package/dist/history/internal/append-saga.d.ts +7 -2
  73. package/dist/history/internal/append-saga.js +58 -14
  74. package/dist/history/internal/compensation.d.ts +6 -2
  75. package/dist/history/internal/compensation.js +14 -6
  76. package/dist/history/internal/item-mapper.d.ts +0 -3
  77. package/dist/history/internal/item-mapper.js +2 -8
  78. package/dist/history/internal/keys.d.ts +0 -1
  79. package/dist/history/internal/keys.js +0 -1
  80. package/dist/history/internal/message-chunker.d.ts +0 -1
  81. package/dist/history/internal/message-chunker.js +0 -1
  82. package/dist/history/internal/message-transaction.d.ts +0 -1
  83. package/dist/history/internal/message-transaction.js +3 -2
  84. package/dist/history/internal/message-window.d.ts +17 -0
  85. package/dist/history/internal/message-window.js +49 -0
  86. package/dist/history/internal/query.d.ts +16 -3
  87. package/dist/history/internal/query.js +13 -5
  88. package/dist/history/internal/session-count.d.ts +8 -2
  89. package/dist/history/internal/session-count.js +14 -8
  90. package/dist/history/internal/session-title.d.ts +0 -1
  91. package/dist/history/internal/session-title.js +1 -2
  92. package/dist/history/internal/session-update.d.ts +0 -1
  93. package/dist/history/internal/session-update.js +0 -1
  94. package/dist/history/internal/setup.d.ts +3 -1
  95. package/dist/history/internal/setup.js +16 -8
  96. package/dist/history/internal/title-generator.d.ts +0 -1
  97. package/dist/history/internal/title-generator.js +19 -3
  98. package/dist/history/internal/ttl-anchor.d.ts +1 -2
  99. package/dist/history/internal/ttl-anchor.js +5 -5
  100. package/dist/history/internal/validation.d.ts +19 -3
  101. package/dist/history/internal/validation.js +41 -4
  102. package/dist/history/session-adapter.d.ts +9 -3
  103. package/dist/history/session-adapter.js +6 -3
  104. package/dist/history/types.d.ts +23 -2
  105. package/dist/history/types.js +0 -1
  106. package/dist/index.d.ts +12 -5
  107. package/dist/index.js +5 -3
  108. package/dist/shared/clock.d.ts +6 -1
  109. package/dist/shared/clock.js +9 -1
  110. package/dist/shared/codec/codec.d.ts +26 -17
  111. package/dist/shared/codec/codec.js +46 -24
  112. package/dist/shared/codec/compression.d.ts +1 -2
  113. package/dist/shared/codec/compression.js +2 -3
  114. package/dist/shared/codec/descriptor-keys.d.ts +11 -3
  115. package/dist/shared/codec/descriptor-keys.js +2 -2
  116. package/dist/shared/codec/encode.d.ts +13 -0
  117. package/dist/shared/codec/encode.js +43 -0
  118. package/dist/shared/codec/json-serde.d.ts +0 -1
  119. package/dist/shared/codec/json-serde.js +0 -1
  120. package/dist/shared/codec/payload-loss.d.ts +12 -0
  121. package/dist/shared/codec/payload-loss.js +38 -0
  122. package/dist/shared/codec/s3/adapter-config.d.ts +13 -0
  123. package/dist/shared/codec/s3/adapter-config.js +22 -0
  124. package/dist/shared/codec/s3/bounded-body.d.ts +14 -0
  125. package/dist/shared/codec/s3/bounded-body.js +47 -0
  126. package/dist/shared/codec/s3/client-types.d.ts +34 -0
  127. package/dist/shared/codec/s3/client-types.js +7 -0
  128. package/dist/shared/codec/s3/client.d.ts +11 -5
  129. package/dist/shared/codec/s3/client.js +25 -3
  130. package/dist/shared/codec/s3/config.d.ts +32 -5
  131. package/dist/shared/codec/s3/config.js +37 -5
  132. package/dist/shared/codec/s3/delete.d.ts +0 -1
  133. package/dist/shared/codec/s3/delete.js +0 -1
  134. package/dist/shared/codec/s3/key-scope.d.ts +23 -0
  135. package/dist/shared/codec/s3/key-scope.js +44 -0
  136. package/dist/shared/codec/s3/lifecycle.d.ts +11 -5
  137. package/dist/shared/codec/s3/lifecycle.js +32 -16
  138. package/dist/shared/codec/s3/offloader.d.ts +6 -2
  139. package/dist/shared/codec/s3/offloader.js +21 -3
  140. package/dist/shared/codec/s3/orphans.d.ts +6 -1
  141. package/dist/shared/codec/s3/orphans.js +15 -2
  142. package/dist/shared/codec/s3/read-write.d.ts +7 -3
  143. package/dist/shared/codec/s3/read-write.js +16 -8
  144. package/dist/shared/codec/s3/retry.d.ts +4 -4
  145. package/dist/shared/codec/s3/retry.js +13 -16
  146. package/dist/shared/concurrency.d.ts +6 -0
  147. package/dist/shared/concurrency.js +30 -0
  148. package/dist/shared/constants.d.ts +53 -5
  149. package/dist/shared/constants.js +55 -7
  150. package/dist/shared/dynamodb/abort.d.ts +9 -0
  151. package/dist/shared/dynamodb/abort.js +27 -0
  152. package/dist/shared/dynamodb/backoff.d.ts +4 -4
  153. package/dist/shared/dynamodb/backoff.js +7 -7
  154. package/dist/shared/dynamodb/batch-write.d.ts +0 -1
  155. package/dist/shared/dynamodb/batch-write.js +0 -1
  156. package/dist/shared/dynamodb/cancellation.d.ts +0 -1
  157. package/dist/shared/dynamodb/cancellation.js +0 -1
  158. package/dist/shared/dynamodb/client.d.ts +9 -2
  159. package/dist/shared/dynamodb/client.js +24 -1
  160. package/dist/shared/dynamodb/conditional-put.d.ts +18 -2
  161. package/dist/shared/dynamodb/conditional-put.js +19 -2
  162. package/dist/shared/dynamodb/drain-unprocessed.d.ts +3 -1
  163. package/dist/shared/dynamodb/drain-unprocessed.js +1 -2
  164. package/dist/shared/dynamodb/expiry.d.ts +16 -0
  165. package/dist/shared/dynamodb/expiry.js +29 -0
  166. package/dist/shared/dynamodb/paginate-core.d.ts +5 -3
  167. package/dist/shared/dynamodb/paginate-core.js +47 -17
  168. package/dist/shared/dynamodb/paginate.d.ts +0 -1
  169. package/dist/shared/dynamodb/paginate.js +1 -2
  170. package/dist/shared/dynamodb/partition-delete.d.ts +7 -1
  171. package/dist/shared/dynamodb/partition-delete.js +4 -3
  172. package/dist/shared/dynamodb/retry-classifier.d.ts +10 -2
  173. package/dist/shared/dynamodb/retry-classifier.js +42 -11
  174. package/dist/shared/dynamodb/retry-policy.d.ts +26 -0
  175. package/dist/shared/dynamodb/retry-policy.js +22 -0
  176. package/dist/shared/dynamodb/retry.d.ts +14 -1
  177. package/dist/shared/dynamodb/retry.js +11 -7
  178. package/dist/shared/dynamodb/scan.d.ts +0 -1
  179. package/dist/shared/dynamodb/scan.js +1 -2
  180. package/dist/shared/dynamodb/types.d.ts +1 -2
  181. package/dist/shared/dynamodb/types.js +0 -1
  182. package/dist/shared/errors/base-error.d.ts +14 -6
  183. package/dist/shared/errors/base-error.js +8 -9
  184. package/dist/shared/errors/boundary.d.ts +18 -0
  185. package/dist/shared/errors/boundary.js +46 -0
  186. package/dist/shared/errors/error-code.d.ts +2 -2
  187. package/dist/shared/errors/error-code.js +1 -1
  188. package/dist/shared/errors/errors.d.ts +13 -13
  189. package/dist/shared/errors/errors.js +18 -16
  190. package/dist/shared/errors/upstream-error.d.ts +16 -0
  191. package/dist/shared/errors/upstream-error.js +27 -0
  192. package/dist/shared/errors/wrap-error.d.ts +0 -9
  193. package/dist/shared/errors/wrap-error.js +0 -15
  194. package/dist/shared/logging/logger.d.ts +6 -2
  195. package/dist/shared/logging/logger.js +0 -1
  196. package/dist/shared/logging/redaction-walk.d.ts +2 -2
  197. package/dist/shared/logging/redaction-walk.js +38 -18
  198. package/dist/shared/logging/redaction.d.ts +9 -5
  199. package/dist/shared/logging/redaction.js +19 -4
  200. package/dist/shared/logging/secret-patterns.d.ts +21 -3
  201. package/dist/shared/logging/secret-patterns.js +32 -6
  202. package/dist/shared/options.d.ts +9 -4
  203. package/dist/shared/options.js +0 -1
  204. package/dist/shared/ulid.d.ts +15 -2
  205. package/dist/shared/ulid.js +35 -3
  206. package/dist/shared/validation/options.d.ts +8 -0
  207. package/dist/shared/validation/options.js +90 -0
  208. package/dist/shared/validation/primitives.d.ts +14 -10
  209. package/dist/shared/validation/primitives.js +23 -25
  210. package/dist/shared/validation/ttl.d.ts +14 -7
  211. package/dist/shared/validation/ttl.js +29 -11
  212. package/dist/store/actions/get.d.ts +11 -3
  213. package/dist/store/actions/get.js +52 -14
  214. package/dist/store/actions/list-namespaces.d.ts +0 -1
  215. package/dist/store/actions/list-namespaces.js +10 -6
  216. package/dist/store/actions/put.d.ts +0 -1
  217. package/dist/store/actions/put.js +24 -13
  218. package/dist/store/actions/reconcile-vector-index.d.ts +3 -2
  219. package/dist/store/actions/reconcile-vector-index.js +2 -3
  220. package/dist/store/actions/search.d.ts +1 -2
  221. package/dist/store/actions/search.js +11 -38
  222. package/dist/store/internal/backend-search.d.ts +1 -2
  223. package/dist/store/internal/backend-search.js +12 -6
  224. package/dist/store/internal/batch-plan.d.ts +11 -0
  225. package/dist/store/internal/batch-plan.js +52 -0
  226. package/dist/store/internal/candidates.d.ts +23 -0
  227. package/dist/store/internal/candidates.js +94 -0
  228. package/dist/store/internal/filter.d.ts +0 -1
  229. package/dist/store/internal/filter.js +0 -1
  230. package/dist/store/internal/index-reconcile.d.ts +5 -6
  231. package/dist/store/internal/index-reconcile.js +25 -12
  232. package/dist/store/internal/index-sync.d.ts +0 -1
  233. package/dist/store/internal/index-sync.js +0 -1
  234. package/dist/store/internal/item-mapper.d.ts +5 -3
  235. package/dist/store/internal/item-mapper.js +14 -6
  236. package/dist/store/internal/keys.d.ts +0 -1
  237. package/dist/store/internal/keys.js +0 -1
  238. package/dist/store/internal/namespace-match.d.ts +0 -1
  239. package/dist/store/internal/namespace-match.js +0 -1
  240. package/dist/store/internal/option-validation.d.ts +13 -0
  241. package/dist/store/internal/option-validation.js +77 -0
  242. package/dist/store/internal/overwrite-swap.d.ts +0 -1
  243. package/dist/store/internal/overwrite-swap.js +10 -4
  244. package/dist/store/internal/persist.d.ts +3 -2
  245. package/dist/store/internal/persist.js +16 -11
  246. package/dist/store/internal/query.d.ts +6 -1
  247. package/dist/store/internal/query.js +17 -1
  248. package/dist/store/internal/ranker.d.ts +7 -2
  249. package/dist/store/internal/ranker.js +10 -2
  250. package/dist/store/internal/read-existing.d.ts +9 -5
  251. package/dist/store/internal/read-existing.js +22 -10
  252. package/dist/store/internal/score-direction.d.ts +0 -1
  253. package/dist/store/internal/score-direction.js +0 -1
  254. package/dist/store/internal/search-filter.d.ts +0 -1
  255. package/dist/store/internal/search-filter.js +0 -1
  256. package/dist/store/internal/semantic-search.d.ts +26 -5
  257. package/dist/store/internal/semantic-search.js +59 -19
  258. package/dist/store/internal/setup.d.ts +5 -13
  259. package/dist/store/internal/setup.js +11 -63
  260. package/dist/store/internal/text-path.d.ts +17 -0
  261. package/dist/store/internal/text-path.js +147 -0
  262. package/dist/store/internal/validation.d.ts +8 -3
  263. package/dist/store/internal/validation.js +21 -5
  264. package/dist/store/internal/write-verify.d.ts +15 -10
  265. package/dist/store/internal/write-verify.js +24 -21
  266. package/dist/store/store.d.ts +37 -9
  267. package/dist/store/store.js +52 -17
  268. package/dist/store/types.d.ts +6 -2
  269. package/dist/store/types.js +0 -1
  270. package/dist/store/vector-backend.d.ts +0 -1
  271. package/dist/store/vector-backend.js +0 -1
  272. package/package.json +21 -15
  273. package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
  274. package/dist/checkpointer/actions/delete-thread.js.map +0 -1
  275. package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
  276. package/dist/checkpointer/actions/get-tuple.js.map +0 -1
  277. package/dist/checkpointer/actions/list.d.ts.map +0 -1
  278. package/dist/checkpointer/actions/list.js.map +0 -1
  279. package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
  280. package/dist/checkpointer/actions/put-writes.js.map +0 -1
  281. package/dist/checkpointer/actions/put.d.ts.map +0 -1
  282. package/dist/checkpointer/actions/put.js.map +0 -1
  283. package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
  284. package/dist/checkpointer/internal/assemble.js.map +0 -1
  285. package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
  286. package/dist/checkpointer/internal/configurable.js.map +0 -1
  287. package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
  288. package/dist/checkpointer/internal/fetch.js.map +0 -1
  289. package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
  290. package/dist/checkpointer/internal/filter-match.js.map +0 -1
  291. package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
  292. package/dist/checkpointer/internal/item-reader.js.map +0 -1
  293. package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
  294. package/dist/checkpointer/internal/item-writer.js.map +0 -1
  295. package/dist/checkpointer/internal/keys.d.ts.map +0 -1
  296. package/dist/checkpointer/internal/keys.js.map +0 -1
  297. package/dist/checkpointer/internal/query.d.ts.map +0 -1
  298. package/dist/checkpointer/internal/query.js.map +0 -1
  299. package/dist/checkpointer/internal/setup.d.ts.map +0 -1
  300. package/dist/checkpointer/internal/setup.js.map +0 -1
  301. package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
  302. package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
  303. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
  304. package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
  305. package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
  306. package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
  307. package/dist/checkpointer/internal/validation.d.ts.map +0 -1
  308. package/dist/checkpointer/internal/validation.js.map +0 -1
  309. package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
  310. package/dist/checkpointer/internal/write-guard.js.map +0 -1
  311. package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
  312. package/dist/checkpointer/internal/write-index.js.map +0 -1
  313. package/dist/checkpointer/saver.d.ts.map +0 -1
  314. package/dist/checkpointer/saver.js.map +0 -1
  315. package/dist/checkpointer/types.d.ts.map +0 -1
  316. package/dist/checkpointer/types.js.map +0 -1
  317. package/dist/factory/factory.d.ts.map +0 -1
  318. package/dist/factory/factory.js.map +0 -1
  319. package/dist/history/actions/add-messages.d.ts.map +0 -1
  320. package/dist/history/actions/add-messages.js.map +0 -1
  321. package/dist/history/actions/clear.d.ts.map +0 -1
  322. package/dist/history/actions/clear.js.map +0 -1
  323. package/dist/history/actions/get-messages.d.ts.map +0 -1
  324. package/dist/history/actions/get-messages.js.map +0 -1
  325. package/dist/history/actions/list-sessions.d.ts.map +0 -1
  326. package/dist/history/actions/list-sessions.js.map +0 -1
  327. package/dist/history/actions/reconcile-count.d.ts.map +0 -1
  328. package/dist/history/actions/reconcile-count.js.map +0 -1
  329. package/dist/history/chat-message-history.d.ts.map +0 -1
  330. package/dist/history/chat-message-history.js.map +0 -1
  331. package/dist/history/internal/append-saga.d.ts.map +0 -1
  332. package/dist/history/internal/append-saga.js.map +0 -1
  333. package/dist/history/internal/compensation.d.ts.map +0 -1
  334. package/dist/history/internal/compensation.js.map +0 -1
  335. package/dist/history/internal/item-mapper.d.ts.map +0 -1
  336. package/dist/history/internal/item-mapper.js.map +0 -1
  337. package/dist/history/internal/keys.d.ts.map +0 -1
  338. package/dist/history/internal/keys.js.map +0 -1
  339. package/dist/history/internal/message-chunker.d.ts.map +0 -1
  340. package/dist/history/internal/message-chunker.js.map +0 -1
  341. package/dist/history/internal/message-transaction.d.ts.map +0 -1
  342. package/dist/history/internal/message-transaction.js.map +0 -1
  343. package/dist/history/internal/query.d.ts.map +0 -1
  344. package/dist/history/internal/query.js.map +0 -1
  345. package/dist/history/internal/session-count.d.ts.map +0 -1
  346. package/dist/history/internal/session-count.js.map +0 -1
  347. package/dist/history/internal/session-title.d.ts.map +0 -1
  348. package/dist/history/internal/session-title.js.map +0 -1
  349. package/dist/history/internal/session-update.d.ts.map +0 -1
  350. package/dist/history/internal/session-update.js.map +0 -1
  351. package/dist/history/internal/setup.d.ts.map +0 -1
  352. package/dist/history/internal/setup.js.map +0 -1
  353. package/dist/history/internal/title-generator.d.ts.map +0 -1
  354. package/dist/history/internal/title-generator.js.map +0 -1
  355. package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
  356. package/dist/history/internal/ttl-anchor.js.map +0 -1
  357. package/dist/history/internal/validation.d.ts.map +0 -1
  358. package/dist/history/internal/validation.js.map +0 -1
  359. package/dist/history/session-adapter.d.ts.map +0 -1
  360. package/dist/history/session-adapter.js.map +0 -1
  361. package/dist/history/types.d.ts.map +0 -1
  362. package/dist/history/types.js.map +0 -1
  363. package/dist/index.d.ts.map +0 -1
  364. package/dist/index.js.map +0 -1
  365. package/dist/shared/clock.d.ts.map +0 -1
  366. package/dist/shared/clock.js.map +0 -1
  367. package/dist/shared/codec/codec.d.ts.map +0 -1
  368. package/dist/shared/codec/codec.js.map +0 -1
  369. package/dist/shared/codec/compression.d.ts.map +0 -1
  370. package/dist/shared/codec/compression.js.map +0 -1
  371. package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
  372. package/dist/shared/codec/descriptor-keys.js.map +0 -1
  373. package/dist/shared/codec/json-serde.d.ts.map +0 -1
  374. package/dist/shared/codec/json-serde.js.map +0 -1
  375. package/dist/shared/codec/s3/client.d.ts.map +0 -1
  376. package/dist/shared/codec/s3/client.js.map +0 -1
  377. package/dist/shared/codec/s3/config.d.ts.map +0 -1
  378. package/dist/shared/codec/s3/config.js.map +0 -1
  379. package/dist/shared/codec/s3/delete.d.ts.map +0 -1
  380. package/dist/shared/codec/s3/delete.js.map +0 -1
  381. package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
  382. package/dist/shared/codec/s3/lifecycle.js.map +0 -1
  383. package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
  384. package/dist/shared/codec/s3/offloader.js.map +0 -1
  385. package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
  386. package/dist/shared/codec/s3/orphans.js.map +0 -1
  387. package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
  388. package/dist/shared/codec/s3/read-write.js.map +0 -1
  389. package/dist/shared/codec/s3/retry.d.ts.map +0 -1
  390. package/dist/shared/codec/s3/retry.js.map +0 -1
  391. package/dist/shared/constants.d.ts.map +0 -1
  392. package/dist/shared/constants.js.map +0 -1
  393. package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
  394. package/dist/shared/dynamodb/backoff.js.map +0 -1
  395. package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
  396. package/dist/shared/dynamodb/batch-write.js.map +0 -1
  397. package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
  398. package/dist/shared/dynamodb/cancellation.js.map +0 -1
  399. package/dist/shared/dynamodb/client.d.ts.map +0 -1
  400. package/dist/shared/dynamodb/client.js.map +0 -1
  401. package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
  402. package/dist/shared/dynamodb/conditional-put.js.map +0 -1
  403. package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
  404. package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
  405. package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
  406. package/dist/shared/dynamodb/paginate-core.js.map +0 -1
  407. package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
  408. package/dist/shared/dynamodb/paginate.js.map +0 -1
  409. package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
  410. package/dist/shared/dynamodb/partition-delete.js.map +0 -1
  411. package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
  412. package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
  413. package/dist/shared/dynamodb/retry.d.ts.map +0 -1
  414. package/dist/shared/dynamodb/retry.js.map +0 -1
  415. package/dist/shared/dynamodb/scan.d.ts.map +0 -1
  416. package/dist/shared/dynamodb/scan.js.map +0 -1
  417. package/dist/shared/dynamodb/types.d.ts.map +0 -1
  418. package/dist/shared/dynamodb/types.js.map +0 -1
  419. package/dist/shared/errors/base-error.d.ts.map +0 -1
  420. package/dist/shared/errors/base-error.js.map +0 -1
  421. package/dist/shared/errors/error-code.d.ts.map +0 -1
  422. package/dist/shared/errors/error-code.js.map +0 -1
  423. package/dist/shared/errors/errors.d.ts.map +0 -1
  424. package/dist/shared/errors/errors.js.map +0 -1
  425. package/dist/shared/errors/wrap-error.d.ts.map +0 -1
  426. package/dist/shared/errors/wrap-error.js.map +0 -1
  427. package/dist/shared/logging/logger.d.ts.map +0 -1
  428. package/dist/shared/logging/logger.js.map +0 -1
  429. package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
  430. package/dist/shared/logging/redaction-walk.js.map +0 -1
  431. package/dist/shared/logging/redaction.d.ts.map +0 -1
  432. package/dist/shared/logging/redaction.js.map +0 -1
  433. package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
  434. package/dist/shared/logging/secret-patterns.js.map +0 -1
  435. package/dist/shared/options.d.ts.map +0 -1
  436. package/dist/shared/options.js.map +0 -1
  437. package/dist/shared/ulid.d.ts.map +0 -1
  438. package/dist/shared/ulid.js.map +0 -1
  439. package/dist/shared/validation/primitives.d.ts.map +0 -1
  440. package/dist/shared/validation/primitives.js.map +0 -1
  441. package/dist/shared/validation/ttl.d.ts.map +0 -1
  442. package/dist/shared/validation/ttl.js.map +0 -1
  443. package/dist/store/actions/get.d.ts.map +0 -1
  444. package/dist/store/actions/get.js.map +0 -1
  445. package/dist/store/actions/list-namespaces.d.ts.map +0 -1
  446. package/dist/store/actions/list-namespaces.js.map +0 -1
  447. package/dist/store/actions/put.d.ts.map +0 -1
  448. package/dist/store/actions/put.js.map +0 -1
  449. package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
  450. package/dist/store/actions/reconcile-vector-index.js.map +0 -1
  451. package/dist/store/actions/search.d.ts.map +0 -1
  452. package/dist/store/actions/search.js.map +0 -1
  453. package/dist/store/internal/backend-search.d.ts.map +0 -1
  454. package/dist/store/internal/backend-search.js.map +0 -1
  455. package/dist/store/internal/filter.d.ts.map +0 -1
  456. package/dist/store/internal/filter.js.map +0 -1
  457. package/dist/store/internal/index-reconcile.d.ts.map +0 -1
  458. package/dist/store/internal/index-reconcile.js.map +0 -1
  459. package/dist/store/internal/index-sync.d.ts.map +0 -1
  460. package/dist/store/internal/index-sync.js.map +0 -1
  461. package/dist/store/internal/item-mapper.d.ts.map +0 -1
  462. package/dist/store/internal/item-mapper.js.map +0 -1
  463. package/dist/store/internal/keys.d.ts.map +0 -1
  464. package/dist/store/internal/keys.js.map +0 -1
  465. package/dist/store/internal/namespace-match.d.ts.map +0 -1
  466. package/dist/store/internal/namespace-match.js.map +0 -1
  467. package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
  468. package/dist/store/internal/overwrite-swap.js.map +0 -1
  469. package/dist/store/internal/persist.d.ts.map +0 -1
  470. package/dist/store/internal/persist.js.map +0 -1
  471. package/dist/store/internal/query.d.ts.map +0 -1
  472. package/dist/store/internal/query.js.map +0 -1
  473. package/dist/store/internal/ranker.d.ts.map +0 -1
  474. package/dist/store/internal/ranker.js.map +0 -1
  475. package/dist/store/internal/read-existing.d.ts.map +0 -1
  476. package/dist/store/internal/read-existing.js.map +0 -1
  477. package/dist/store/internal/score-direction.d.ts.map +0 -1
  478. package/dist/store/internal/score-direction.js.map +0 -1
  479. package/dist/store/internal/search-filter.d.ts.map +0 -1
  480. package/dist/store/internal/search-filter.js.map +0 -1
  481. package/dist/store/internal/semantic-search.d.ts.map +0 -1
  482. package/dist/store/internal/semantic-search.js.map +0 -1
  483. package/dist/store/internal/setup.d.ts.map +0 -1
  484. package/dist/store/internal/setup.js.map +0 -1
  485. package/dist/store/internal/validation.d.ts.map +0 -1
  486. package/dist/store/internal/validation.js.map +0 -1
  487. package/dist/store/internal/write-verify.d.ts.map +0 -1
  488. package/dist/store/internal/write-verify.js.map +0 -1
  489. package/dist/store/store.d.ts.map +0 -1
  490. package/dist/store/store.js.map +0 -1
  491. package/dist/store/types.d.ts.map +0 -1
  492. package/dist/store/types.js.map +0 -1
  493. package/dist/store/vector-backend.d.ts.map +0 -1
  494. package/dist/store/vector-backend.js.map +0 -1
@@ -1,26 +1,45 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_SECRET_VALUE_PATTERNS = exports.DEFAULT_SECRET_KEY_PATTERNS = exports.REDACTED = void 0;
4
+ exports.normaliseKey = normaliseKey;
4
5
  exports.isSecretKey = isSecretKey;
6
+ exports.redactedMessage = redactedMessage;
5
7
  exports.redactText = redactText;
6
8
  exports.binaryLabel = binaryLabel;
7
9
  exports.redactErrorText = redactErrorText;
8
10
  /** Marker substituted for anything recognised as secret. */
9
11
  exports.REDACTED = '[REDACTED]';
10
- /** Key names (matched case-insensitively as substrings) whose value is a secret. */
12
+ /**
13
+ * Key names whose value is a secret. Each entry is a *normalised* name — see
14
+ * {@link normaliseKey} — and matches a key whose normalised form equals it or
15
+ * ends with it. Suffix matching is what catches `secretAccessKey`, `x-api-key`,
16
+ * `client_secret` and `AUTH_TOKEN`; requiring the pattern to be a suffix, not a
17
+ * substring, is what spares `maxTokens`, `total_tokens`, `tokenizer` and
18
+ * `secretary`, which the old substring rule redacted.
19
+ */
11
20
  exports.DEFAULT_SECRET_KEY_PATTERNS = [
12
21
  'accesskey',
13
- 'secretkey',
22
+ 'accesskeyid',
14
23
  'secret',
15
24
  'sessiontoken',
16
25
  'securitytoken',
17
26
  'authorization',
18
27
  'password',
28
+ 'passwd',
29
+ 'passphrase',
19
30
  'apikey',
20
31
  'bearer',
21
32
  'token',
22
33
  'privatekey',
23
34
  ];
35
+ /**
36
+ * Canonical form of a key name for matching: lower-case with every character
37
+ * that is not a letter or digit removed, so `api_key`, `x-api-key`, `ApiKey`
38
+ * and `API KEY` all become `apikey`.
39
+ */
40
+ function normaliseKey(key) {
41
+ return key.toLowerCase().replace(/[^a-z0-9]/g, '');
42
+ }
24
43
  /**
25
44
  * Secret shapes recognisable in free text, where key-name matching cannot
26
45
  * reach: an error's `message`/`stack`, or any other string value. Deliberately
@@ -59,10 +78,18 @@ exports.DEFAULT_SECRET_VALUE_PATTERNS = [
59
78
  /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
60
79
  /((?:aws_)?(?:secret_access_key|secretaccesskey|password|passwd|api_?key|token)["']?\s*[=:]\s*)(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|(?:-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|true|false|null)(?=\s*[,}\]]|\s*$)|[^\r\n]+)/gi,
61
80
  ];
62
- /** True when `key` matches any secret-key pattern. */
81
+ /** True when `key`'s normalised form equals or ends with any (normalised) pattern. */
63
82
  function isSecretKey(key, patterns) {
64
- const lower = key.toLowerCase();
65
- return patterns.some((pattern) => lower.includes(pattern));
83
+ const normalised = normaliseKey(key);
84
+ return patterns.some((pattern) => normalised === pattern || normalised.endsWith(pattern));
85
+ }
86
+ /**
87
+ * An error's message with recognised credential shapes redacted, for embedding
88
+ * in another error's message: a wrapper that quotes its cause must not leak a
89
+ * `password=` or token the cause happened to carry.
90
+ */
91
+ function redactedMessage(error) {
92
+ return redactText(error.message, exports.DEFAULT_SECRET_VALUE_PATTERNS);
66
93
  }
67
94
  /**
68
95
  * Replace every recognised secret shape inside `value` with {@link REDACTED},
@@ -104,4 +131,3 @@ function redactErrorText(error, patterns) {
104
131
  changed: message !== error.message || stack !== error.stack,
105
132
  };
106
133
  }
107
- //# sourceMappingURL=secret-patterns.js.map
@@ -1,7 +1,8 @@
1
- import type { DynamoDBClient, DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
1
+ import type { DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
2
2
  import type { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
3
3
  import type { CompressionConfig } from './codec/compression';
4
4
  import type { S3OffloadConfig } from './codec/s3/config';
5
+ import type { RetryPolicy } from './dynamodb/retry-policy';
5
6
  import type { Logger } from './logging/logger';
6
7
  import type { TtlOption } from './validation/ttl';
7
8
  /**
@@ -15,12 +16,12 @@ export interface BaseAdapterOptions {
15
16
  client?: DynamoDBDocument;
16
17
  /** Config used to build a client when `client` is not provided. */
17
18
  clientConfig?: DynamoDBClientConfig;
18
- /** Factory seam for constructing the underlying client (testing). */
19
- createClient?: (config: DynamoDBClientConfig) => DynamoDBClient;
20
19
  /** Optional time-to-live applied to written items. */
21
20
  ttl?: TtlOption;
22
21
  /** Optional per-instance logger (defaults to a silent logger). */
23
22
  logger?: Logger;
23
+ /** Retry budget and backoff for every DynamoDB call (see the README "Retries and backoff"). */
24
+ retry?: RetryPolicy;
24
25
  }
25
26
  /** Options enabling payload compression and/or S3 offloading. */
26
27
  export interface CodecOptions {
@@ -29,4 +30,8 @@ export interface CodecOptions {
29
30
  /** S3 offload configuration for payloads over DynamoDB's item limit. */
30
31
  s3?: S3OffloadConfig;
31
32
  }
32
- //# sourceMappingURL=options.d.ts.map
33
+ /** Per-call cancellation for the long-running adapter methods. */
34
+ export interface CancelOptions {
35
+ /** Aborting it rejects the call with `AbortError` (`ABORTED`) at the next wait. */
36
+ signal?: AbortSignal;
37
+ }
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=options.js.map
@@ -1,10 +1,23 @@
1
+ /**
2
+ * A CSPRNG-backed `rng` seam: uniform values in `[0, 1)` from `crypto.randomBytes`,
3
+ * drawn from a refilled pool so a burst of ids costs one syscall per 256
4
+ * digits rather than one per digit. `Math.random` is fine for uniqueness and
5
+ * ordering but is not a cryptographically secure source, which security
6
+ * baselines flag in identifier generation; the ULID spec recommends a CSPRNG.
7
+ */
8
+ export declare function secureRng(): () => number;
9
+ /**
10
+ * The 10 time characters every ULID generated at `timeMs` starts with. Used
11
+ * as a sort-key bound: every id from that millisecond onwards sorts at or
12
+ * after it, every earlier id before it.
13
+ */
14
+ export declare function ulidTimePrefix(timeMs: number): string;
1
15
  /**
2
16
  * Build a monotonic ULID generator: lexicographically sortable 26-char ids
3
17
  * whose first 10 chars encode the millisecond timestamp. Ids strictly increase
4
18
  * even when the clock regresses or the same-millisecond random space overflows:
5
19
  * any non-advancing clock reuses the last timestamp and increments the random
6
20
  * component, carrying into the timestamp on overflow. `now`/`rng` are seams for
7
- * deterministic tests.
21
+ * deterministic tests; the default `rng` is {@link secureRng}.
8
22
  */
9
23
  export declare function createUlidFactory(now?: () => number, rng?: () => number): () => string;
10
- //# sourceMappingURL=ulid.d.ts.map
@@ -1,10 +1,35 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.secureRng = secureRng;
4
+ exports.ulidTimePrefix = ulidTimePrefix;
3
5
  exports.createUlidFactory = createUlidFactory;
6
+ const node_crypto_1 = require("node:crypto");
4
7
  const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
5
8
  const ENCODING_LEN = 32;
6
9
  const TIME_CHARS = 10;
7
10
  const RANDOM_CHARS = 16;
11
+ /** Bytes drawn per refill of the {@link secureRng} pool: 16 ids per syscall. */
12
+ const RNG_POOL_BYTES = 256;
13
+ /**
14
+ * A CSPRNG-backed `rng` seam: uniform values in `[0, 1)` from `crypto.randomBytes`,
15
+ * drawn from a refilled pool so a burst of ids costs one syscall per 256
16
+ * digits rather than one per digit. `Math.random` is fine for uniqueness and
17
+ * ordering but is not a cryptographically secure source, which security
18
+ * baselines flag in identifier generation; the ULID spec recommends a CSPRNG.
19
+ */
20
+ function secureRng() {
21
+ let pool = Buffer.alloc(0);
22
+ let offset = 0;
23
+ return () => {
24
+ if (offset >= pool.length) {
25
+ pool = (0, node_crypto_1.randomBytes)(RNG_POOL_BYTES);
26
+ offset = 0;
27
+ }
28
+ const byte = pool[offset];
29
+ offset += 1;
30
+ return byte / 256;
31
+ };
32
+ }
8
33
  function encodeTime(timeMs) {
9
34
  let remaining = Math.floor(timeMs);
10
35
  let out = '';
@@ -14,6 +39,14 @@ function encodeTime(timeMs) {
14
39
  }
15
40
  return out;
16
41
  }
42
+ /**
43
+ * The 10 time characters every ULID generated at `timeMs` starts with. Used
44
+ * as a sort-key bound: every id from that millisecond onwards sorts at or
45
+ * after it, every earlier id before it.
46
+ */
47
+ function ulidTimePrefix(timeMs) {
48
+ return encodeTime(timeMs);
49
+ }
17
50
  function randomDigits(rng) {
18
51
  const digits = [];
19
52
  for (let i = 0; i < RANDOM_CHARS; i++) {
@@ -38,9 +71,9 @@ function incrementDigits(digits) {
38
71
  * even when the clock regresses or the same-millisecond random space overflows:
39
72
  * any non-advancing clock reuses the last timestamp and increments the random
40
73
  * component, carrying into the timestamp on overflow. `now`/`rng` are seams for
41
- * deterministic tests.
74
+ * deterministic tests; the default `rng` is {@link secureRng}.
42
75
  */
43
- function createUlidFactory(now = Date.now, rng = Math.random) {
76
+ function createUlidFactory(now = Date.now, rng = secureRng()) {
44
77
  let lastTime = -1;
45
78
  let lastRandom = [];
46
79
  return () => {
@@ -62,4 +95,3 @@ function createUlidFactory(now = Date.now, rng = Math.random) {
62
95
  return encodeTime(lastTime) + lastRandom.map((digit) => ENCODING[digit]).join('');
63
96
  };
64
97
  }
65
- //# sourceMappingURL=ulid.js.map
@@ -0,0 +1,8 @@
1
+ import type { BaseAdapterOptions, CodecOptions } from '../options';
2
+ /**
3
+ * Validate the options every adapter shares, at construction. Each failure is
4
+ * a {@link ValidationError} whose `context.field` names the offending option,
5
+ * so a misconfiguration surfaces where it was written instead of as a raw AWS
6
+ * error on the first request.
7
+ */
8
+ export declare function validateBaseAdapterOptions(options: BaseAdapterOptions & CodecOptions): void;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateBaseAdapterOptions = validateBaseAdapterOptions;
4
+ const config_1 = require("../codec/s3/config");
5
+ const constants_1 = require("../constants");
6
+ const errors_1 = require("../errors/errors");
7
+ const primitives_1 = require("./primitives");
8
+ const ttl_1 = require("./ttl");
9
+ /** DynamoDB's table-name rule: 3–255 characters from `[A-Za-z0-9_.-]`. */
10
+ const TABLE_NAME_PATTERN = /^[A-Za-z0-9_.-]{3,255}$/;
11
+ /** Server-side encryption algorithms S3 accepts for `PutObject`. */
12
+ const SSE_ALGORITHMS = ['AES256', 'aws:kms', 'aws:kms:dsse'];
13
+ function validateTableName(tableName) {
14
+ if (typeof tableName !== 'string' || !TABLE_NAME_PATTERN.test(tableName)) {
15
+ throw new errors_1.ValidationError('tableName must be 3-255 characters from [A-Za-z0-9_.-], as DynamoDB requires', 'tableName');
16
+ }
17
+ }
18
+ /**
19
+ * An injected `client` is used as-is, so a `clientConfig` or `createClient`
20
+ * given alongside it would be silently ignored — including a `region` the
21
+ * caller believes is in effect. Reject the combination instead.
22
+ */
23
+ function validateClientChoice(options) {
24
+ if (options.client &&
25
+ (options.clientConfig !== undefined || options.createClient !== undefined)) {
26
+ throw new errors_1.ValidationError('provide either `client` or `clientConfig`/`createClient`, not both: an injected client ' +
27
+ 'is used as-is and the configuration would be silently ignored', 'client');
28
+ }
29
+ }
30
+ function validateRetryPolicy(policy) {
31
+ if (policy.maxAttempts !== undefined) {
32
+ (0, primitives_1.validateInteger)(policy.maxAttempts, 'retry.maxAttempts', { min: 1, max: constants_1.MAX_RETRY_ATTEMPTS });
33
+ }
34
+ if (policy.baseDelayMs !== undefined) {
35
+ (0, primitives_1.validateInteger)(policy.baseDelayMs, 'retry.baseDelayMs', { min: 1 });
36
+ }
37
+ if (policy.maxDelayMs !== undefined) {
38
+ (0, primitives_1.validateInteger)(policy.maxDelayMs, 'retry.maxDelayMs', { min: policy.baseDelayMs ?? 1 });
39
+ }
40
+ }
41
+ function validateCompression(config) {
42
+ if (typeof config.enabled !== 'boolean') {
43
+ throw new errors_1.ValidationError('compression.enabled must be a boolean', 'compression.enabled');
44
+ }
45
+ if (config.level !== undefined) {
46
+ (0, primitives_1.validateInteger)(config.level, 'compression.level', { min: 0, max: 9 });
47
+ }
48
+ if (config.minSizeBytes !== undefined) {
49
+ (0, primitives_1.validateInteger)(config.minSizeBytes, 'compression.minSizeBytes', { min: 0 });
50
+ }
51
+ if (config.maxDecompressedBytes !== undefined) {
52
+ (0, primitives_1.validateInteger)(config.maxDecompressedBytes, 'compression.maxDecompressedBytes', { min: 1 });
53
+ }
54
+ }
55
+ function validateS3(config) {
56
+ (0, primitives_1.validateNonEmptyString)(config.bucketName, 's3.bucketName');
57
+ if (config.thresholdBytes !== undefined) {
58
+ (0, primitives_1.validateInteger)(config.thresholdBytes, 's3.thresholdBytes', {
59
+ min: 1,
60
+ max: constants_1.MAX_INLINE_PAYLOAD_BYTES,
61
+ });
62
+ }
63
+ if (config.keyPrefix !== undefined)
64
+ (0, config_1.assertScopedKeyPrefix)(config.keyPrefix);
65
+ if (config.maxDownloadBytes !== undefined) {
66
+ (0, primitives_1.validateInteger)(config.maxDownloadBytes, 's3.maxDownloadBytes', { min: 1 });
67
+ }
68
+ if (config.serverSideEncryption !== undefined &&
69
+ !SSE_ALGORITHMS.includes(config.serverSideEncryption)) {
70
+ throw new errors_1.ValidationError(`s3.serverSideEncryption must be one of ${SSE_ALGORITHMS.join(', ')}`, 's3.serverSideEncryption');
71
+ }
72
+ }
73
+ /**
74
+ * Validate the options every adapter shares, at construction. Each failure is
75
+ * a {@link ValidationError} whose `context.field` names the offending option,
76
+ * so a misconfiguration surfaces where it was written instead of as a raw AWS
77
+ * error on the first request.
78
+ */
79
+ function validateBaseAdapterOptions(options) {
80
+ validateTableName(options.tableName);
81
+ validateClientChoice(options);
82
+ if (options.ttl !== undefined)
83
+ (0, ttl_1.resolveTtlSeconds)(options.ttl);
84
+ if (options.retry !== undefined)
85
+ validateRetryPolicy(options.retry);
86
+ if (options.compression !== undefined)
87
+ validateCompression(options.compression);
88
+ if (options.s3 !== undefined)
89
+ validateS3(options.s3);
90
+ }
@@ -1,6 +1,11 @@
1
- import type { Redactable } from '../logging/redaction-walk';
2
- /** Throw {@link ValidationError} unless `value` is a non-empty string. */
1
+ /**
2
+ * Throw {@link ValidationError} unless `value` is a string with at least one
3
+ * non-whitespace character: a blank identifier is never intended and would
4
+ * otherwise become an invisible, un-greppable DynamoDB key.
5
+ */
3
6
  export declare function validateNonEmptyString(value: string, field: string): void;
7
+ /** Throw {@link ValidationError} if `value` exceeds `maxBytes` when encoded as UTF-8. */
8
+ export declare function assertMaxBytes(value: string, field: string, maxBytes: number): void;
4
9
  /** Throw {@link ValidationError} unless `value` is an integer within bounds. */
5
10
  export declare function validateInteger(value: number, field: string, bounds?: {
6
11
  min?: number;
@@ -14,12 +19,11 @@ export declare function assertNoControlChars(value: string, field: string): void
14
19
  export declare function assertNoSeparator(value: string, separator: string, field: string): void;
15
20
  /**
16
21
  * Validate a caller-supplied identifier that reaches a DynamoDB key: non-empty,
17
- * free of the reserved `separator`, and free of control characters. The last
18
- * rule matters even though DynamoDB itself accepts control characters — an
19
- * identifier is echoed into logs, so an unvalidated ANSI escape is a
20
- * log/terminal-injection surface for any app that writes these values out.
22
+ * at most `maxBytes` of UTF-8, free of the reserved `separator`, and free of
23
+ * control characters. The last rule matters even though DynamoDB itself
24
+ * accepts control characters — an identifier is echoed into logs, so an
25
+ * unvalidated ANSI escape is a log/terminal-injection surface for any app that
26
+ * writes these values out. The length check runs before the character scans so
27
+ * an oversized value is rejected without being walked.
21
28
  */
22
- export declare function validateIdentifier(value: string, separator: string, field: string): void;
23
- /** Throw {@link ValidationError} if nested-array depth exceeds `maxDepth`. */
24
- export declare function validateArrayMaxDepth(value: Redactable[], field: string, maxDepth: number): void;
25
- //# sourceMappingURL=primitives.d.ts.map
29
+ export declare function validateIdentifier(value: string, separator: string, field: string, maxBytes: number): void;
@@ -1,17 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateNonEmptyString = validateNonEmptyString;
4
+ exports.assertMaxBytes = assertMaxBytes;
4
5
  exports.validateInteger = validateInteger;
5
6
  exports.validateNonEmptyArray = validateNonEmptyArray;
6
7
  exports.assertNoControlChars = assertNoControlChars;
7
8
  exports.assertNoSeparator = assertNoSeparator;
8
9
  exports.validateIdentifier = validateIdentifier;
9
- exports.validateArrayMaxDepth = validateArrayMaxDepth;
10
10
  const errors_1 = require("../errors/errors");
11
- /** Throw {@link ValidationError} unless `value` is a non-empty string. */
11
+ /**
12
+ * Throw {@link ValidationError} unless `value` is a string with at least one
13
+ * non-whitespace character: a blank identifier is never intended and would
14
+ * otherwise become an invisible, un-greppable DynamoDB key.
15
+ */
12
16
  function validateNonEmptyString(value, field) {
13
- if (typeof value !== 'string' || value.length === 0) {
14
- throw new errors_1.ValidationError(`${field} must be a non-empty string`, field);
17
+ if (typeof value !== 'string' || value.trim().length === 0) {
18
+ throw new errors_1.ValidationError(`${field} must be a non-empty string (whitespace-only counts as empty)`, field);
19
+ }
20
+ }
21
+ /** Throw {@link ValidationError} if `value` exceeds `maxBytes` when encoded as UTF-8. */
22
+ function assertMaxBytes(value, field, maxBytes) {
23
+ const bytes = Buffer.byteLength(value, 'utf8');
24
+ if (bytes > maxBytes) {
25
+ throw new errors_1.ValidationError(`${field} must be at most ${maxBytes} bytes of UTF-8 (received ${bytes})`, field);
15
26
  }
16
27
  }
17
28
  /** Throw {@link ValidationError} unless `value` is an integer within bounds. */
@@ -56,29 +67,16 @@ function assertNoSeparator(value, separator, field) {
56
67
  }
57
68
  /**
58
69
  * Validate a caller-supplied identifier that reaches a DynamoDB key: non-empty,
59
- * free of the reserved `separator`, and free of control characters. The last
60
- * rule matters even though DynamoDB itself accepts control characters — an
61
- * identifier is echoed into logs, so an unvalidated ANSI escape is a
62
- * log/terminal-injection surface for any app that writes these values out.
70
+ * at most `maxBytes` of UTF-8, free of the reserved `separator`, and free of
71
+ * control characters. The last rule matters even though DynamoDB itself
72
+ * accepts control characters — an identifier is echoed into logs, so an
73
+ * unvalidated ANSI escape is a log/terminal-injection surface for any app that
74
+ * writes these values out. The length check runs before the character scans so
75
+ * an oversized value is rejected without being walked.
63
76
  */
64
- function validateIdentifier(value, separator, field) {
77
+ function validateIdentifier(value, separator, field, maxBytes) {
65
78
  validateNonEmptyString(value, field);
79
+ assertMaxBytes(value, field, maxBytes);
66
80
  assertNoSeparator(value, separator, field);
67
81
  assertNoControlChars(value, field);
68
82
  }
69
- /** Throw {@link ValidationError} if nested-array depth exceeds `maxDepth`. */
70
- function validateArrayMaxDepth(value, field, maxDepth) {
71
- const depthOf = (node, depth) => {
72
- if (!Array.isArray(node)) {
73
- return depth;
74
- }
75
- if (depth > maxDepth) {
76
- return depth;
77
- }
78
- return node.reduce((max, child) => Math.max(max, depthOf(child, depth + 1)), depth);
79
- };
80
- if (depthOf(value, 0) > maxDepth) {
81
- throw new errors_1.ValidationError(`${field} exceeds maximum array depth of ${maxDepth}`, field);
82
- }
83
- }
84
- //# sourceMappingURL=primitives.js.map
@@ -4,7 +4,11 @@ export type TtlOption = {
4
4
  } | {
5
5
  seconds: number;
6
6
  };
7
- /** Validate a {@link TtlOption} and resolve it to a positive number of seconds. */
7
+ /**
8
+ * Validate a {@link TtlOption} and resolve it to a positive number of seconds.
9
+ * Both forms share the same five-year cap, and an object carrying both keys is
10
+ * rejected instead of being resolved by whichever key happens to be checked first.
11
+ */
8
12
  export declare function resolveTtlSeconds(ttl: TtlOption): number;
9
13
  /**
10
14
  * Resolve a {@link TtlOption} into a DynamoDB TTL attribute value: the Unix
@@ -13,9 +17,12 @@ export declare function resolveTtlSeconds(ttl: TtlOption): number;
13
17
  * @param now - Clock seam returning epoch milliseconds. Defaults to `Date.now`.
14
18
  */
15
19
  export declare function calculateTtlTimestamp(ttl: TtlOption, now?: () => number): number;
16
- /** Resolve a {@link TtlOption} to whole days, rounded up so the S3 lifecycle
17
- * expiration never fires before DynamoDB's own TTL sweep (which can lag up
18
- * to ~48h past the TTL timestamp) — expiring the S3 object first would leave
19
- * a live DynamoDB item pointing at a deleted payload. */
20
- export declare function resolveTtlDaysCeil(ttl: TtlOption): number;
21
- //# sourceMappingURL=ttl.d.ts.map
20
+ /**
21
+ * Days for the S3 lifecycle rule that backs a TTL: the TTL rounded up to whole
22
+ * days plus {@link S3_LIFECYCLE_SWEEP_MARGIN_DAYS}. S3 expires an object at the
23
+ * first midnight UTC at least that many days after creation, while DynamoDB
24
+ * can keep the row up to ~48 h past its `ttl`; without the margin an
25
+ * `{ days: N }` TTL expired the object on day N exactly, stranding a live row
26
+ * that pointed at a deleted payload until the sweep caught up.
27
+ */
28
+ export declare function lifecycleExpirationDays(ttl: TtlOption): number;
@@ -2,17 +2,32 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveTtlSeconds = resolveTtlSeconds;
4
4
  exports.calculateTtlTimestamp = calculateTtlTimestamp;
5
- exports.resolveTtlDaysCeil = resolveTtlDaysCeil;
5
+ exports.lifecycleExpirationDays = lifecycleExpirationDays;
6
6
  const constants_1 = require("../constants");
7
+ const errors_1 = require("../errors/errors");
7
8
  const primitives_1 = require("./primitives");
8
9
  const SECONDS_PER_DAY = 24 * 60 * 60;
9
- /** Validate a {@link TtlOption} and resolve it to a positive number of seconds. */
10
+ /** Positive integer no greater than `max`, with a message that names what the cap means. */
11
+ function validateWithinCap(value, field, max) {
12
+ (0, primitives_1.validateInteger)(value, field, { min: 1 });
13
+ if (value > max) {
14
+ throw new errors_1.ValidationError(`${field} must be <= ${max} (five years)`, field);
15
+ }
16
+ }
17
+ /**
18
+ * Validate a {@link TtlOption} and resolve it to a positive number of seconds.
19
+ * Both forms share the same five-year cap, and an object carrying both keys is
20
+ * rejected instead of being resolved by whichever key happens to be checked first.
21
+ */
10
22
  function resolveTtlSeconds(ttl) {
23
+ if ('days' in ttl && 'seconds' in ttl) {
24
+ throw new errors_1.ValidationError('ttl must specify either ttl.days or ttl.seconds, not both', 'ttl');
25
+ }
11
26
  if ('days' in ttl) {
12
- (0, primitives_1.validateInteger)(ttl.days, 'ttl.days', { min: 1, max: constants_1.MAX_TTL_DAYS });
27
+ validateWithinCap(ttl.days, 'ttl.days', constants_1.MAX_TTL_DAYS);
13
28
  return ttl.days * SECONDS_PER_DAY;
14
29
  }
15
- (0, primitives_1.validateInteger)(ttl.seconds, 'ttl.seconds', { min: 1, max: constants_1.MAX_TTL_SECONDS });
30
+ validateWithinCap(ttl.seconds, 'ttl.seconds', constants_1.MAX_TTL_SECONDS);
16
31
  return ttl.seconds;
17
32
  }
18
33
  /**
@@ -24,11 +39,14 @@ function resolveTtlSeconds(ttl) {
24
39
  function calculateTtlTimestamp(ttl, now = Date.now) {
25
40
  return Math.floor(now() / 1000) + resolveTtlSeconds(ttl);
26
41
  }
27
- /** Resolve a {@link TtlOption} to whole days, rounded up so the S3 lifecycle
28
- * expiration never fires before DynamoDB's own TTL sweep (which can lag up
29
- * to ~48h past the TTL timestamp) — expiring the S3 object first would leave
30
- * a live DynamoDB item pointing at a deleted payload. */
31
- function resolveTtlDaysCeil(ttl) {
32
- return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY);
42
+ /**
43
+ * Days for the S3 lifecycle rule that backs a TTL: the TTL rounded up to whole
44
+ * days plus {@link S3_LIFECYCLE_SWEEP_MARGIN_DAYS}. S3 expires an object at the
45
+ * first midnight UTC at least that many days after creation, while DynamoDB
46
+ * can keep the row up to ~48 h past its `ttl`; without the margin an
47
+ * `{ days: N }` TTL expired the object on day N exactly, stranding a live row
48
+ * that pointed at a deleted payload until the sweep caught up.
49
+ */
50
+ function lifecycleExpirationDays(ttl) {
51
+ return Math.ceil(resolveTtlSeconds(ttl) / SECONDS_PER_DAY) + constants_1.S3_LIFECYCLE_SWEEP_MARGIN_DAYS;
33
52
  }
34
- //# sourceMappingURL=ttl.js.map
@@ -1,5 +1,13 @@
1
1
  import type { Item } from '@langchain/langgraph-checkpoint';
2
2
  import type { StoreContext } from '../internal/setup';
3
- /** Retrieve a single item by namespace and key (strongly consistent), or null. */
4
- export declare function getItem(context: StoreContext, namespace: string[], key: string): Promise<Item | null>;
5
- //# sourceMappingURL=get.d.ts.map
3
+ /**
4
+ * Retrieve a single item by namespace and key (strongly consistent), or null.
5
+ *
6
+ * An offloaded item can lose a race with a concurrent overwrite: between the
7
+ * row read and the S3 download the writer commits a new descriptor and deletes
8
+ * the object this read was about to fetch. That surfaces as `NoSuchKey`, and
9
+ * one strongly-consistent re-read settles it — the row now points at the new
10
+ * object (return that), is gone (null), or still points at the same missing
11
+ * object (a genuine loss, rethrown). Any other download failure propagates.
12
+ */
13
+ export declare function getItem(context: StoreContext, namespace: string[], key: string, signal?: AbortSignal): Promise<Item | null>;
@@ -1,35 +1,73 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getItem = getItem;
4
+ const clock_1 = require("../../shared/clock");
5
+ const codec_1 = require("../../shared/codec/codec");
6
+ const payload_loss_1 = require("../../shared/codec/payload-loss");
7
+ const expiry_1 = require("../../shared/dynamodb/expiry");
4
8
  const retry_1 = require("../../shared/dynamodb/retry");
9
+ const retry_policy_1 = require("../../shared/dynamodb/retry-policy");
5
10
  const item_mapper_1 = require("../internal/item-mapper");
6
11
  const keys_1 = require("../internal/keys");
7
12
  const validation_1 = require("../internal/validation");
8
- /** Retrieve a single item by namespace and key (strongly consistent), or null. */
9
- async function getItem(context, namespace, key) {
10
- (0, validation_1.validateNamespace)(namespace);
11
- (0, validation_1.validateKey)(key);
13
+ /**
14
+ * Read the row strongly consistently and narrow it rather than cast. A
15
+ * foreign row sharing this key has no `namespace`, and one carrying a `value`
16
+ * PayloadDescriptor in the same shape a store item uses (a checkpointer WRITE
17
+ * row) would otherwise decode cleanly and be handed back as the caller's own
18
+ * value.
19
+ */
20
+ async function readRow(context, namespace, key, signal) {
12
21
  const result = await (0, retry_1.withDynamoDBRetry)(() => context.client.get({
13
22
  TableName: context.tableName,
14
23
  Key: { PK: (0, keys_1.partitionKey)(namespace), SK: (0, keys_1.sortKey)(namespace, key) },
15
24
  ConsistentRead: true,
16
- }));
25
+ }), (0, retry_policy_1.retryFor)(context, signal));
17
26
  if (!result.Item)
18
- return null;
19
- /**
20
- * Narrow rather than cast. A foreign row sharing this key has no
21
- * `namespace`, and one carrying a `value` PayloadDescriptor in the same
22
- * shape a store item uses (a checkpointer WRITE row) would otherwise decode
23
- * cleanly and be handed back as the caller's own value.
24
- */
27
+ return undefined;
25
28
  const record = (0, item_mapper_1.narrowStoreRecord)(result.Item);
26
29
  if (!record) {
27
30
  context.logger.warn('store.get: ignored a row that is not a store item', {
28
31
  partitionKey: (0, keys_1.partitionKey)(namespace),
29
32
  sortKey: (0, keys_1.sortKey)(namespace, key),
30
33
  });
34
+ return undefined;
35
+ }
36
+ /** A row past its ttl is absent to every reader, however long DynamoDB's sweep lags. */
37
+ return (0, expiry_1.isExpiredRow)(record, (0, clock_1.nowSeconds)()) ? undefined : record;
38
+ }
39
+ /** True when both records point at the same offloaded object. */
40
+ function sameObject(a, b) {
41
+ return (a.value.location === codec_1.PayloadLocation.S3 &&
42
+ b.value.location === codec_1.PayloadLocation.S3 &&
43
+ a.value.s3Key === b.value.s3Key);
44
+ }
45
+ /**
46
+ * Retrieve a single item by namespace and key (strongly consistent), or null.
47
+ *
48
+ * An offloaded item can lose a race with a concurrent overwrite: between the
49
+ * row read and the S3 download the writer commits a new descriptor and deletes
50
+ * the object this read was about to fetch. That surfaces as `NoSuchKey`, and
51
+ * one strongly-consistent re-read settles it — the row now points at the new
52
+ * object (return that), is gone (null), or still points at the same missing
53
+ * object (a genuine loss, rethrown). Any other download failure propagates.
54
+ */
55
+ async function getItem(context, namespace, key, signal) {
56
+ (0, validation_1.validateStoreKey)(namespace, key);
57
+ const record = await readRow(context, namespace, key, signal);
58
+ if (!record)
31
59
  return null;
60
+ try {
61
+ return await (0, item_mapper_1.readStoreItem)(context, record);
62
+ }
63
+ catch (error) {
64
+ if (!(0, payload_loss_1.isMissingObjectError)(error))
65
+ throw error;
66
+ const fresh = await readRow(context, namespace, key, signal);
67
+ if (!fresh)
68
+ return null;
69
+ if (sameObject(record, fresh))
70
+ throw error;
71
+ return (0, item_mapper_1.readStoreItem)(context, fresh);
32
72
  }
33
- return (0, item_mapper_1.readStoreItem)(context, record);
34
73
  }
35
- //# sourceMappingURL=get.js.map
@@ -6,4 +6,3 @@ import type { StoreContext } from '../internal/setup';
6
6
  * the read to a native Query; otherwise it falls back to a filtered Scan.
7
7
  */
8
8
  export declare function listNamespaces(context: StoreContext, op: ListNamespacesOperation): Promise<string[][]>;
9
- //# sourceMappingURL=list-namespaces.d.ts.map