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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/README.md +390 -193
  2. package/dist/{backfill → cjs/backfill}/backfill.d.ts +15 -12
  3. package/dist/cjs/backfill/backfill.js +177 -0
  4. package/dist/{checkpointer → cjs/checkpointer}/actions/delete-thread.d.ts +1 -1
  5. package/dist/cjs/checkpointer/actions/delete-thread.js +26 -0
  6. package/dist/{checkpointer → cjs/checkpointer}/actions/get-tuple.d.ts +4 -3
  7. package/dist/cjs/checkpointer/actions/get-tuple.js +22 -0
  8. package/dist/{checkpointer → cjs/checkpointer}/actions/list.d.ts +7 -4
  9. package/dist/cjs/checkpointer/actions/list.js +70 -0
  10. package/dist/{checkpointer → cjs/checkpointer}/actions/put-writes.d.ts +8 -6
  11. package/dist/cjs/checkpointer/actions/put-writes.js +21 -0
  12. package/dist/{checkpointer → cjs/checkpointer}/actions/put.d.ts +21 -15
  13. package/dist/cjs/checkpointer/actions/put.js +79 -0
  14. package/dist/{checkpointer → cjs/checkpointer}/internal/delta-history.d.ts +38 -26
  15. package/dist/cjs/checkpointer/internal/delta-history.js +131 -0
  16. package/dist/{checkpointer → cjs/checkpointer}/internal/listing.d.ts +4 -4
  17. package/dist/cjs/checkpointer/internal/listing.js +104 -0
  18. package/dist/{checkpointer → cjs/checkpointer}/internal/parse.d.ts +51 -15
  19. package/dist/cjs/checkpointer/internal/parse.js +184 -0
  20. package/dist/{checkpointer → cjs/checkpointer}/internal/pending-writes.d.ts +64 -25
  21. package/dist/cjs/checkpointer/internal/pending-writes.js +241 -0
  22. package/dist/{checkpointer → cjs/checkpointer}/internal/read.d.ts +15 -10
  23. package/dist/cjs/checkpointer/internal/read.js +132 -0
  24. package/dist/{checkpointer → cjs/checkpointer}/internal/rows.d.ts +94 -21
  25. package/dist/cjs/checkpointer/internal/rows.js +356 -0
  26. package/dist/{checkpointer → cjs/checkpointer}/internal/setup.d.ts +13 -20
  27. package/dist/cjs/checkpointer/internal/setup.js +25 -0
  28. package/dist/{checkpointer → cjs/checkpointer}/saver.d.ts +72 -36
  29. package/dist/cjs/checkpointer/saver.js +56 -0
  30. package/dist/{checkpointer → cjs/checkpointer}/types.d.ts +1 -1
  31. package/dist/cjs/checkpointer/types.js +2 -0
  32. package/dist/{factory → cjs/factory}/factory.d.ts +25 -20
  33. package/dist/cjs/factory/factory.js +137 -0
  34. package/dist/{factory → cjs/factory}/types.d.ts +12 -12
  35. package/dist/cjs/factory/types.js +2 -0
  36. package/dist/{history → cjs/history}/actions/add-messages.d.ts +18 -10
  37. package/dist/cjs/history/actions/add-messages.js +17 -0
  38. package/dist/{history → cjs/history}/actions/clear.d.ts +1 -1
  39. package/dist/cjs/history/actions/clear.js +29 -0
  40. package/dist/{history → cjs/history}/actions/get-messages.d.ts +11 -9
  41. package/dist/cjs/history/actions/get-messages.js +58 -0
  42. package/dist/{history → cjs/history}/actions/list-sessions.d.ts +3 -3
  43. package/dist/cjs/history/actions/list-sessions.js +67 -0
  44. package/dist/{history → cjs/history}/actions/reconcile-count.d.ts +13 -9
  45. package/dist/cjs/history/actions/reconcile-count.js +8 -0
  46. package/dist/{history → cjs/history}/chat-message-history.d.ts +62 -30
  47. package/dist/cjs/history/chat-message-history.js +61 -0
  48. package/dist/{history → cjs/history}/internal/append.d.ts +64 -32
  49. package/dist/cjs/history/internal/append.js +267 -0
  50. package/dist/{history → cjs/history}/internal/message-read.d.ts +3 -3
  51. package/dist/cjs/history/internal/message-read.js +93 -0
  52. package/dist/{history → cjs/history}/internal/parse.d.ts +2 -2
  53. package/dist/cjs/history/internal/parse.js +113 -0
  54. package/dist/{history → cjs/history}/internal/rows.d.ts +11 -10
  55. package/dist/cjs/history/internal/rows.js +96 -0
  56. package/dist/{history → cjs/history}/internal/session.d.ts +41 -22
  57. package/dist/cjs/history/internal/session.js +296 -0
  58. package/dist/{history → cjs/history}/internal/setup.d.ts +2 -2
  59. package/dist/cjs/history/internal/setup.js +60 -0
  60. package/dist/{history → cjs/history}/session-adapter.d.ts +0 -6
  61. package/dist/cjs/history/session-adapter.js +38 -0
  62. package/dist/{history → cjs/history}/types.d.ts +18 -15
  63. package/dist/cjs/history/types.js +2 -0
  64. package/dist/{index.d.ts → cjs/index.d.ts} +27 -27
  65. package/dist/cjs/index.js +25 -0
  66. package/dist/cjs/package.json +1 -0
  67. package/dist/{shared → cjs/shared}/adapter.d.ts +27 -16
  68. package/dist/cjs/shared/adapter.js +70 -0
  69. package/dist/cjs/shared/clock.js +14 -0
  70. package/dist/{shared → cjs/shared}/codec/codec.d.ts +37 -20
  71. package/dist/cjs/shared/codec/codec.js +162 -0
  72. package/dist/{shared → cjs/shared}/codec/compression.d.ts +9 -4
  73. package/dist/cjs/shared/codec/compression.js +45 -0
  74. package/dist/cjs/shared/codec/json-serde.js +58 -0
  75. package/dist/{shared → cjs/shared}/codec/s3/client-types.d.ts +2 -1
  76. package/dist/cjs/shared/codec/s3/client-types.js +6 -0
  77. package/dist/{shared → cjs/shared}/codec/s3/client.d.ts +25 -7
  78. package/dist/cjs/shared/codec/s3/client.js +78 -0
  79. package/dist/{shared → cjs/shared}/codec/s3/config.d.ts +12 -7
  80. package/dist/cjs/shared/codec/s3/config.js +92 -0
  81. package/dist/{shared → cjs/shared}/codec/s3/lifecycle.d.ts +71 -17
  82. package/dist/cjs/shared/codec/s3/lifecycle.js +223 -0
  83. package/dist/{shared → cjs/shared}/codec/s3/offloader.d.ts +42 -29
  84. package/dist/cjs/shared/codec/s3/offloader.js +289 -0
  85. package/dist/cjs/shared/concurrency.js +31 -0
  86. package/dist/{shared → cjs/shared}/dynamodb/abort.d.ts +2 -2
  87. package/dist/cjs/shared/dynamodb/abort.js +16 -0
  88. package/dist/{shared → cjs/shared}/dynamodb/batch-write.d.ts +2 -2
  89. package/dist/cjs/shared/dynamodb/batch-write.js +79 -0
  90. package/dist/cjs/shared/dynamodb/cancellation.js +37 -0
  91. package/dist/{shared → cjs/shared}/dynamodb/client.d.ts +24 -22
  92. package/dist/cjs/shared/dynamodb/client.js +40 -0
  93. package/dist/{shared → cjs/shared}/dynamodb/idempotent-write.d.ts +64 -19
  94. package/dist/cjs/shared/dynamodb/idempotent-write.js +173 -0
  95. package/dist/{shared → cjs/shared}/dynamodb/paginate.d.ts +2 -2
  96. package/dist/cjs/shared/dynamodb/paginate.js +90 -0
  97. package/dist/{shared → cjs/shared}/dynamodb/partition-delete.d.ts +6 -6
  98. package/dist/cjs/shared/dynamodb/partition-delete.js +177 -0
  99. package/dist/{shared → cjs/shared}/dynamodb/recency-index.d.ts +27 -15
  100. package/dist/cjs/shared/dynamodb/recency-index.js +146 -0
  101. package/dist/{shared → cjs/shared}/dynamodb/retry.d.ts +37 -6
  102. package/dist/cjs/shared/dynamodb/retry.js +193 -0
  103. package/dist/cjs/shared/dynamodb/row-size.d.ts +33 -0
  104. package/dist/cjs/shared/dynamodb/row-size.js +30 -0
  105. package/dist/{shared → cjs/shared}/dynamodb/table-schema.d.ts +27 -18
  106. package/dist/cjs/shared/dynamodb/table-schema.js +52 -0
  107. package/dist/{shared → cjs/shared}/errors/base-error.d.ts +42 -7
  108. package/dist/cjs/shared/errors/base-error.js +73 -0
  109. package/dist/{shared → cjs/shared}/errors/boundary.d.ts +29 -14
  110. package/dist/cjs/shared/errors/boundary.js +61 -0
  111. package/dist/cjs/shared/errors/classify.d.ts +206 -0
  112. package/dist/cjs/shared/errors/classify.js +232 -0
  113. package/dist/{shared → cjs/shared}/errors/error-code.d.ts +17 -10
  114. package/dist/cjs/shared/errors/error-code.js +27 -0
  115. package/dist/{shared → cjs/shared}/errors/errors.d.ts +75 -9
  116. package/dist/cjs/shared/errors/errors.js +123 -0
  117. package/dist/cjs/shared/logging/logger.js +30 -0
  118. package/dist/{shared → cjs/shared}/logging/redaction.d.ts +8 -4
  119. package/dist/cjs/shared/logging/redaction.js +145 -0
  120. package/dist/{shared → cjs/shared}/logging/secret-patterns.d.ts +30 -7
  121. package/dist/cjs/shared/logging/secret-patterns.js +93 -0
  122. package/dist/cjs/shared/logging/truncate.js +31 -0
  123. package/dist/{shared → cjs/shared}/options.d.ts +27 -11
  124. package/dist/cjs/shared/options.js +2 -0
  125. package/dist/cjs/shared/ulid.js +83 -0
  126. package/dist/{shared → cjs/shared}/validation/collaborators.d.ts +21 -2
  127. package/dist/cjs/shared/validation/collaborators.js +79 -0
  128. package/dist/{shared → cjs/shared}/validation/option-shape.d.ts +7 -5
  129. package/dist/cjs/shared/validation/option-shape.js +31 -0
  130. package/dist/{shared → cjs/shared}/validation/options.d.ts +4 -4
  131. package/dist/cjs/shared/validation/options.js +166 -0
  132. package/dist/cjs/shared/validation/primitives.js +114 -0
  133. package/dist/{shared → cjs/shared}/validation/ttl.d.ts +26 -9
  134. package/dist/cjs/shared/validation/ttl.js +52 -0
  135. package/dist/{store → cjs/store}/actions/list-namespaces.d.ts +5 -5
  136. package/dist/cjs/store/actions/list-namespaces.js +92 -0
  137. package/dist/{store → cjs/store}/actions/put.d.ts +11 -4
  138. package/dist/cjs/store/actions/put.js +49 -0
  139. package/dist/{store → cjs/store}/actions/reconcile-vector-index.d.ts +5 -5
  140. package/dist/cjs/store/actions/reconcile-vector-index.js +13 -0
  141. package/dist/{store → cjs/store}/actions/search.d.ts +2 -2
  142. package/dist/cjs/store/actions/search.js +26 -0
  143. package/dist/cjs/store/internal/batch-plan.d.ts +56 -0
  144. package/dist/cjs/store/internal/batch-plan.js +32 -0
  145. package/dist/{store → cjs/store}/internal/filter.d.ts +3 -3
  146. package/dist/cjs/store/internal/filter.js +64 -0
  147. package/dist/cjs/store/internal/get-item.d.ts +77 -0
  148. package/dist/cjs/store/internal/get-item.js +58 -0
  149. package/dist/{store → cjs/store}/internal/item-write.d.ts +72 -32
  150. package/dist/cjs/store/internal/item-write.js +181 -0
  151. package/dist/{store → cjs/store}/internal/parse.d.ts +15 -10
  152. package/dist/cjs/store/internal/parse.js +180 -0
  153. package/dist/{store → cjs/store}/internal/rows.d.ts +38 -34
  154. package/dist/cjs/store/internal/rows.js +166 -0
  155. package/dist/{store → cjs/store}/internal/semantic-search.d.ts +2 -2
  156. package/dist/cjs/store/internal/semantic-search.js +211 -0
  157. package/dist/{store → cjs/store}/internal/setup.d.ts +10 -15
  158. package/dist/cjs/store/internal/setup.js +103 -0
  159. package/dist/{store → cjs/store}/internal/table-search.d.ts +5 -5
  160. package/dist/cjs/store/internal/table-search.js +123 -0
  161. package/dist/{store → cjs/store}/internal/vector-index.d.ts +26 -15
  162. package/dist/cjs/store/internal/vector-index.js +269 -0
  163. package/dist/{store → cjs/store}/store.d.ts +82 -39
  164. package/dist/cjs/store/store.js +97 -0
  165. package/dist/{store → cjs/store}/types.d.ts +25 -10
  166. package/dist/cjs/store/types.js +2 -0
  167. package/dist/cjs/store/vector-backend.js +4 -0
  168. package/dist/esm/backfill/backfill.d.ts +171 -0
  169. package/dist/esm/backfill/backfill.js +170 -0
  170. package/dist/{checkpointer/actions/delete-thread.js → esm/checkpointer/actions/delete-thread.d.ts} +4 -26
  171. package/dist/esm/checkpointer/actions/delete-thread.js +23 -0
  172. package/dist/{checkpointer/actions/get-tuple.js → esm/checkpointer/actions/get-tuple.d.ts} +7 -24
  173. package/dist/esm/checkpointer/actions/get-tuple.js +19 -0
  174. package/dist/esm/checkpointer/actions/list.d.ts +55 -0
  175. package/dist/esm/checkpointer/actions/list.js +67 -0
  176. package/dist/{checkpointer/actions/put-writes.js → esm/checkpointer/actions/put-writes.d.ts} +10 -37
  177. package/dist/esm/checkpointer/actions/put-writes.js +18 -0
  178. package/dist/esm/checkpointer/actions/put.d.ts +95 -0
  179. package/dist/esm/checkpointer/actions/put.js +75 -0
  180. package/dist/esm/checkpointer/internal/delta-history.d.ts +124 -0
  181. package/dist/esm/checkpointer/internal/delta-history.js +126 -0
  182. package/dist/{checkpointer/internal/listing.js → esm/checkpointer/internal/listing.d.ts} +22 -118
  183. package/dist/esm/checkpointer/internal/listing.js +95 -0
  184. package/dist/esm/checkpointer/internal/parse.d.ts +298 -0
  185. package/dist/esm/checkpointer/internal/parse.js +169 -0
  186. package/dist/esm/checkpointer/internal/pending-writes.d.ts +314 -0
  187. package/dist/esm/checkpointer/internal/pending-writes.js +229 -0
  188. package/dist/esm/checkpointer/internal/read.d.ts +135 -0
  189. package/dist/esm/checkpointer/internal/read.js +125 -0
  190. package/dist/esm/checkpointer/internal/rows.d.ts +644 -0
  191. package/dist/esm/checkpointer/internal/rows.js +323 -0
  192. package/dist/esm/checkpointer/internal/setup.d.ts +47 -0
  193. package/dist/esm/checkpointer/internal/setup.js +21 -0
  194. package/dist/{checkpointer/saver.js → esm/checkpointer/saver.d.ts} +84 -87
  195. package/dist/esm/checkpointer/saver.js +52 -0
  196. package/dist/esm/checkpointer/types.d.ts +51 -0
  197. package/dist/esm/checkpointer/types.js +1 -0
  198. package/dist/esm/factory/factory.d.ts +154 -0
  199. package/dist/esm/factory/factory.js +133 -0
  200. package/dist/esm/factory/types.d.ts +76 -0
  201. package/dist/esm/factory/types.js +1 -0
  202. package/dist/{history/actions/add-messages.js → esm/history/actions/add-messages.d.ts} +20 -26
  203. package/dist/esm/history/actions/add-messages.js +14 -0
  204. package/dist/{history/actions/clear.js → esm/history/actions/clear.d.ts} +4 -35
  205. package/dist/esm/history/actions/clear.js +26 -0
  206. package/dist/esm/history/actions/get-messages.d.ts +60 -0
  207. package/dist/esm/history/actions/get-messages.js +55 -0
  208. package/dist/esm/history/actions/list-sessions.d.ts +55 -0
  209. package/dist/esm/history/actions/list-sessions.js +64 -0
  210. package/dist/{history/actions/reconcile-count.js → esm/history/actions/reconcile-count.d.ts} +14 -16
  211. package/dist/esm/history/actions/reconcile-count.js +5 -0
  212. package/dist/{history/chat-message-history.js → esm/history/chat-message-history.d.ts} +76 -87
  213. package/dist/esm/history/chat-message-history.js +57 -0
  214. package/dist/esm/history/internal/append.d.ts +244 -0
  215. package/dist/esm/history/internal/append.js +259 -0
  216. package/dist/esm/history/internal/message-read.d.ts +84 -0
  217. package/dist/esm/history/internal/message-read.js +89 -0
  218. package/dist/esm/history/internal/parse.d.ts +153 -0
  219. package/dist/esm/history/internal/parse.js +105 -0
  220. package/dist/{history/internal/rows.js → esm/history/internal/rows.d.ts} +58 -112
  221. package/dist/esm/history/internal/rows.js +83 -0
  222. package/dist/esm/history/internal/session.d.ts +350 -0
  223. package/dist/esm/history/internal/session.js +285 -0
  224. package/dist/esm/history/internal/setup.d.ts +64 -0
  225. package/dist/esm/history/internal/setup.js +56 -0
  226. package/dist/{history/session-adapter.js → esm/history/session-adapter.d.ts} +25 -39
  227. package/dist/esm/history/session-adapter.js +34 -0
  228. package/dist/esm/history/types.d.ts +102 -0
  229. package/dist/esm/history/types.js +1 -0
  230. package/dist/esm/index.d.ts +53 -0
  231. package/dist/esm/index.js +10 -0
  232. package/dist/esm/shared/adapter.d.ts +146 -0
  233. package/dist/esm/shared/adapter.js +65 -0
  234. package/dist/{shared/clock.js → esm/shared/clock.d.ts} +3 -14
  235. package/dist/esm/shared/clock.js +9 -0
  236. package/dist/esm/shared/codec/codec.d.ts +336 -0
  237. package/dist/esm/shared/codec/codec.js +150 -0
  238. package/dist/esm/shared/codec/compression.d.ts +66 -0
  239. package/dist/esm/shared/codec/compression.js +40 -0
  240. package/dist/esm/shared/codec/json-serde.d.ts +80 -0
  241. package/dist/esm/shared/codec/json-serde.js +54 -0
  242. package/dist/esm/shared/codec/s3/client-types.d.ts +54 -0
  243. package/dist/esm/shared/codec/s3/client-types.js +3 -0
  244. package/dist/esm/shared/codec/s3/client.d.ts +63 -0
  245. package/dist/esm/shared/codec/s3/client.js +40 -0
  246. package/dist/{shared/codec/s3/config.js → esm/shared/codec/s3/config.d.ts} +45 -93
  247. package/dist/esm/shared/codec/s3/config.js +79 -0
  248. package/dist/esm/shared/codec/s3/lifecycle.d.ts +220 -0
  249. package/dist/esm/shared/codec/s3/lifecycle.js +214 -0
  250. package/dist/esm/shared/codec/s3/offloader.d.ts +428 -0
  251. package/dist/esm/shared/codec/s3/offloader.js +278 -0
  252. package/dist/{shared/concurrency.js → esm/shared/concurrency.d.ts} +2 -37
  253. package/dist/esm/shared/concurrency.js +27 -0
  254. package/dist/{shared/dynamodb/abort.js → esm/shared/dynamodb/abort.d.ts} +4 -16
  255. package/dist/esm/shared/dynamodb/abort.js +12 -0
  256. package/dist/esm/shared/dynamodb/batch-write.d.ts +86 -0
  257. package/dist/esm/shared/dynamodb/batch-write.js +74 -0
  258. package/dist/{shared/dynamodb/cancellation.js → esm/shared/dynamodb/cancellation.d.ts} +25 -53
  259. package/dist/esm/shared/dynamodb/cancellation.js +30 -0
  260. package/dist/{shared/dynamodb/client.js → esm/shared/dynamodb/client.d.ts} +74 -64
  261. package/dist/esm/shared/dynamodb/client.js +35 -0
  262. package/dist/{shared/dynamodb/idempotent-write.js → esm/shared/dynamodb/idempotent-write.d.ts} +172 -169
  263. package/dist/esm/shared/dynamodb/idempotent-write.js +153 -0
  264. package/dist/esm/shared/dynamodb/paginate.d.ts +111 -0
  265. package/dist/esm/shared/dynamodb/paginate.js +84 -0
  266. package/dist/esm/shared/dynamodb/partition-delete.d.ts +204 -0
  267. package/dist/esm/shared/dynamodb/partition-delete.js +171 -0
  268. package/dist/esm/shared/dynamodb/recency-index.d.ts +243 -0
  269. package/dist/esm/shared/dynamodb/recency-index.js +136 -0
  270. package/dist/esm/shared/dynamodb/retry.d.ts +317 -0
  271. package/dist/esm/shared/dynamodb/retry.js +180 -0
  272. package/dist/esm/shared/dynamodb/row-size.d.ts +33 -0
  273. package/dist/esm/shared/dynamodb/row-size.js +26 -0
  274. package/dist/{shared/dynamodb/table-schema.js → esm/shared/dynamodb/table-schema.d.ts} +57 -67
  275. package/dist/esm/shared/dynamodb/table-schema.js +43 -0
  276. package/dist/esm/shared/errors/base-error.d.ts +231 -0
  277. package/dist/esm/shared/errors/base-error.js +64 -0
  278. package/dist/esm/shared/errors/boundary.d.ts +86 -0
  279. package/dist/esm/shared/errors/boundary.js +54 -0
  280. package/dist/esm/shared/errors/classify.d.ts +206 -0
  281. package/dist/esm/shared/errors/classify.js +220 -0
  282. package/dist/{shared/errors/error-code.js → esm/shared/errors/error-code.d.ts} +39 -43
  283. package/dist/esm/shared/errors/error-code.js +24 -0
  284. package/dist/{shared/errors/errors.js → esm/shared/errors/errors.d.ts} +92 -98
  285. package/dist/esm/shared/errors/errors.js +110 -0
  286. package/dist/{shared/logging/logger.js → esm/shared/logging/logger.d.ts} +22 -52
  287. package/dist/esm/shared/logging/logger.js +25 -0
  288. package/dist/esm/shared/logging/redaction.d.ts +123 -0
  289. package/dist/esm/shared/logging/redaction.js +140 -0
  290. package/dist/{shared/logging/secret-patterns.js → esm/shared/logging/secret-patterns.d.ts} +46 -87
  291. package/dist/esm/shared/logging/secret-patterns.js +83 -0
  292. package/dist/{shared/logging/truncate.js → esm/shared/logging/truncate.d.ts} +6 -40
  293. package/dist/esm/shared/logging/truncate.js +25 -0
  294. package/dist/esm/shared/options.d.ts +100 -0
  295. package/dist/esm/shared/options.js +1 -0
  296. package/dist/{shared/ulid.js → esm/shared/ulid.d.ts} +4 -84
  297. package/dist/esm/shared/ulid.js +77 -0
  298. package/dist/{shared/validation/collaborators.js → esm/shared/validation/collaborators.d.ts} +37 -65
  299. package/dist/esm/shared/validation/collaborators.js +70 -0
  300. package/dist/{shared/validation/option-shape.js → esm/shared/validation/option-shape.d.ts} +14 -36
  301. package/dist/esm/shared/validation/option-shape.js +24 -0
  302. package/dist/esm/shared/validation/options.d.ts +145 -0
  303. package/dist/esm/shared/validation/options.js +156 -0
  304. package/dist/{shared/validation/primitives.js → esm/shared/validation/primitives.d.ts} +30 -125
  305. package/dist/esm/shared/validation/primitives.js +100 -0
  306. package/dist/esm/shared/validation/ttl.d.ts +94 -0
  307. package/dist/esm/shared/validation/ttl.js +46 -0
  308. package/dist/esm/store/actions/list-namespaces.d.ts +79 -0
  309. package/dist/esm/store/actions/list-namespaces.js +86 -0
  310. package/dist/esm/store/actions/put.d.ts +43 -0
  311. package/dist/esm/store/actions/put.js +46 -0
  312. package/dist/{store/actions/reconcile-vector-index.js → esm/store/actions/reconcile-vector-index.d.ts} +8 -16
  313. package/dist/esm/store/actions/reconcile-vector-index.js +10 -0
  314. package/dist/esm/store/actions/search.d.ts +38 -0
  315. package/dist/esm/store/actions/search.js +23 -0
  316. package/dist/esm/store/internal/batch-plan.d.ts +56 -0
  317. package/dist/esm/store/internal/batch-plan.js +28 -0
  318. package/dist/esm/store/internal/filter.d.ts +43 -0
  319. package/dist/esm/store/internal/filter.js +60 -0
  320. package/dist/esm/store/internal/get-item.d.ts +77 -0
  321. package/dist/esm/store/internal/get-item.js +54 -0
  322. package/dist/esm/store/internal/item-write.d.ts +270 -0
  323. package/dist/esm/store/internal/item-write.js +173 -0
  324. package/dist/esm/store/internal/parse.d.ts +230 -0
  325. package/dist/esm/store/internal/parse.js +169 -0
  326. package/dist/{store/internal/rows.js → esm/store/internal/rows.d.ts} +111 -199
  327. package/dist/esm/store/internal/rows.js +147 -0
  328. package/dist/esm/store/internal/semantic-search.d.ts +168 -0
  329. package/dist/esm/store/internal/semantic-search.js +200 -0
  330. package/dist/esm/store/internal/setup.d.ts +96 -0
  331. package/dist/esm/store/internal/setup.js +98 -0
  332. package/dist/esm/store/internal/table-search.d.ts +100 -0
  333. package/dist/esm/store/internal/table-search.js +119 -0
  334. package/dist/esm/store/internal/vector-index.d.ts +258 -0
  335. package/dist/esm/store/internal/vector-index.js +256 -0
  336. package/dist/{store/store.js → esm/store/store.d.ts} +99 -133
  337. package/dist/esm/store/store.js +93 -0
  338. package/dist/esm/store/types.d.ts +111 -0
  339. package/dist/esm/store/types.js +1 -0
  340. package/dist/esm/store/vector-backend.d.ts +104 -0
  341. package/dist/esm/store/vector-backend.js +1 -0
  342. package/package.json +50 -44
  343. package/dist/backfill/backfill.js +0 -393
  344. package/dist/checkpointer/actions/list.js +0 -142
  345. package/dist/checkpointer/actions/put.js +0 -195
  346. package/dist/checkpointer/internal/delta-history.js +0 -252
  347. package/dist/checkpointer/internal/parse.js +0 -372
  348. package/dist/checkpointer/internal/pending-writes.js +0 -588
  349. package/dist/checkpointer/internal/read.js +0 -264
  350. package/dist/checkpointer/internal/rows.js +0 -834
  351. package/dist/checkpointer/internal/setup.js +0 -72
  352. package/dist/checkpointer/types.js +0 -12
  353. package/dist/factory/factory.js +0 -266
  354. package/dist/factory/types.js +0 -10
  355. package/dist/history/actions/get-messages.js +0 -141
  356. package/dist/history/actions/list-sessions.js +0 -156
  357. package/dist/history/internal/append.js +0 -500
  358. package/dist/history/internal/message-read.js +0 -204
  359. package/dist/history/internal/parse.js +0 -252
  360. package/dist/history/internal/session.js +0 -628
  361. package/dist/history/internal/setup.js +0 -106
  362. package/dist/history/types.js +0 -12
  363. package/dist/index.js +0 -51
  364. package/dist/shared/adapter.js +0 -143
  365. package/dist/shared/codec/codec.js +0 -441
  366. package/dist/shared/codec/compression.js +0 -89
  367. package/dist/shared/codec/json-serde.js +0 -191
  368. package/dist/shared/codec/s3/client-types.js +0 -26
  369. package/dist/shared/codec/s3/client.js +0 -97
  370. package/dist/shared/codec/s3/lifecycle.js +0 -355
  371. package/dist/shared/codec/s3/offloader.js +0 -658
  372. package/dist/shared/dynamodb/batch-write.js +0 -173
  373. package/dist/shared/dynamodb/paginate.js +0 -188
  374. package/dist/shared/dynamodb/partition-delete.js +0 -340
  375. package/dist/shared/dynamodb/recency-index.js +0 -377
  376. package/dist/shared/dynamodb/retry.js +0 -463
  377. package/dist/shared/errors/base-error.js +0 -174
  378. package/dist/shared/errors/boundary.js +0 -143
  379. package/dist/shared/errors/classify.d.ts +0 -97
  380. package/dist/shared/errors/classify.js +0 -257
  381. package/dist/shared/logging/redaction.js +0 -316
  382. package/dist/shared/options.js +0 -11
  383. package/dist/shared/validation/options.js +0 -328
  384. package/dist/shared/validation/ttl.js +0 -132
  385. package/dist/store/actions/list-namespaces.js +0 -197
  386. package/dist/store/actions/put.js +0 -78
  387. package/dist/store/actions/search.js +0 -66
  388. package/dist/store/internal/batch-plan.d.ts +0 -26
  389. package/dist/store/internal/batch-plan.js +0 -109
  390. package/dist/store/internal/filter.js +0 -137
  391. package/dist/store/internal/get-item.d.ts +0 -45
  392. package/dist/store/internal/get-item.js +0 -115
  393. package/dist/store/internal/item-write.js +0 -463
  394. package/dist/store/internal/parse.js +0 -350
  395. package/dist/store/internal/semantic-search.js +0 -389
  396. package/dist/store/internal/setup.js +0 -223
  397. package/dist/store/internal/table-search.js +0 -213
  398. package/dist/store/internal/vector-index.js +0 -546
  399. package/dist/store/types.js +0 -15
  400. package/dist/store/vector-backend.js +0 -17
  401. /package/dist/{shared → cjs/shared}/clock.d.ts +0 -0
  402. /package/dist/{shared → cjs/shared}/codec/json-serde.d.ts +0 -0
  403. /package/dist/{shared → cjs/shared}/concurrency.d.ts +0 -0
  404. /package/dist/{shared → cjs/shared}/dynamodb/cancellation.d.ts +0 -0
  405. /package/dist/{shared → cjs/shared}/logging/logger.d.ts +0 -0
  406. /package/dist/{shared → cjs/shared}/logging/truncate.d.ts +0 -0
  407. /package/dist/{shared → cjs/shared}/ulid.d.ts +0 -0
  408. /package/dist/{shared → cjs/shared}/validation/primitives.d.ts +0 -0
  409. /package/dist/{store → cjs/store}/vector-backend.d.ts +0 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Hides the recency index (record 8).
3
+ *
4
+ * A row that a cross-partition listing reaches carries two index keys: a
5
+ * partition that hashes its identity onto one of a fixed number of shards, and
6
+ * a sort key that orders it by time. A listing reads every shard at once,
7
+ * merges them newest first, and hands out an opaque cursor that resumes the
8
+ * merge. The shard function, the key format and the merge are decided here.
9
+ */
10
+ import { type PageLimit } from '../validation/primitives.js';
11
+ import type { AttributeMap, DynamoDBDocumentLike } from './client.js';
12
+ import { type RetryOptions } from './retry.js';
13
+ /** One page of a recency listing, and where the next one resumes. */
14
+ export interface IndexPage {
15
+ items: AttributeMap[];
16
+ /** Absent when the page is the last one. */
17
+ nextCursor?: string;
18
+ }
19
+ /**
20
+ * Read one page of a recency listing from the index, newest first.
21
+ *
22
+ * Each shard is read one DynamoDB page at a time and the pages are merged row
23
+ * by row: the newest buffered row goes onto the page, and a shard whose buffer
24
+ * runs dry reads its next page before another row is chosen. That is correct
25
+ * because each shard is already sorted and no row is chosen while a shard that
26
+ * may hold a newer one is unread. It is also what bounds memory: a listing
27
+ * holds the page it is building, up to `limit` rows, plus at most one DynamoDB
28
+ * page per shard, and a shard none of whose buffered rows the page takes is
29
+ * never followed. The price is that a dry shard is read again whenever the page
30
+ * still needs a row, even when every row still to come is another shard's,
31
+ * which can cost a query per shard per page whose rows the page never takes.
32
+ * The alternative — one query over an unsharded index — would make every
33
+ * listing hit one partition, which is what the sharding exists to avoid.
34
+ *
35
+ * This replaces a full-table `Scan` with a `FilterExpression`, which consumed
36
+ * read capacity for every row *evaluated*, collected the whole table in memory
37
+ * and sorted it there.
38
+ *
39
+ * Accepts: `limit` — a `PageLimit`, already checked against the package-wide
40
+ * page rule by the caller's parser. `0` returns an empty page with no cursor
41
+ * and issues no query — and is answered here rather than left to the merge,
42
+ * where an empty page with shards still unread would have read
43
+ * `items[items.length - 1]` off an empty array to build the cursor. `cursor`
44
+ * — from a previous page, or none to start at the newest. `shards` — must
45
+ * match what the writers used. `concurrency` — how many shards are queried at
46
+ * once.
47
+ *
48
+ * Returns: the page, newest first, and a `nextCursor` exactly while rows may
49
+ * remain: a shard still buffers a row the page did not take, or has not
50
+ * reported its end. A cursor is never withheld while rows remain, and none is
51
+ * issued once every shard has reported its end, even for a page filled
52
+ * exactly. DynamoDB can still report a `LastEvaluatedKey` on a page that ends
53
+ * at a shard's last row, so the page after such a cursor may come back empty.
54
+ *
55
+ * Throws: `VALIDATION` naming `cursor`; `RESULT_TRUNCATED`
56
+ * for a shard whose pages do not end within `MAX_LOOP_ITERATIONS`; whatever
57
+ * the queries throw, including an `ABORTED` error.
58
+ *
59
+ * Guarantees: at most `concurrency` shards are queried at once; each shard is
60
+ * followed across DynamoDB's 1 MB page boundary, but its next page is read only
61
+ * when its buffer is empty and the page still needs a row, so besides the page
62
+ * being built, up to `limit` rows, no more than one DynamoDB page per shard is
63
+ * held at a time.
64
+ */
65
+ export declare function queryRecencyIndex(options: IndexQueryOptions): Promise<IndexPage>;
66
+ /**
67
+ * Every row of one adapter's recency index, newest first, page by page.
68
+ *
69
+ * The streaming counterpart of {@link queryRecencyIndex}, for a caller that
70
+ * consumes rows until it has what it needs and then stops. It replaces a
71
+ * full-table `Scan` whose cost scaled with the table rather than with the
72
+ * answer.
73
+ *
74
+ * Accepts: as {@link queryRecencyIndex}, without `limit` and `cursor` — this
75
+ * walks the whole index, paging internally.
76
+ *
77
+ * Returns: an async generator over every row, newest first. An early `break`
78
+ * fetches no further page, so a caller that needs ten rows of a large index
79
+ * pays for one page.
80
+ *
81
+ * Throws: as {@link queryRecencyIndex}.
82
+ */
83
+ export declare function iterateRecencyIndex(options: Omit<IndexQueryOptions, 'limit' | 'cursor'>): AsyncGenerator<AttributeMap>;
84
+ /**
85
+ * The adapter tags that scope GSI1: the checkpointer's own partition tag, and
86
+ * `SESS` for the history's session rows — not its `HIST` partition tag, which
87
+ * names a whole conversation where this index lists one row of it.
88
+ */
89
+ export type IndexTag = 'CHKPT' | 'SESS';
90
+ /** How a row appears in the recency index: its adapter's tag, its identity, and its time. */
91
+ export interface IndexTarget {
92
+ tag: IndexTag;
93
+ id: string;
94
+ at: string;
95
+ }
96
+ /** The time a row that recorded none is indexed at, older than anything indexed since. */
97
+ export declare const BACKFILLED_AT = "1970-01-01T00:00:00.000Z";
98
+ /**
99
+ * The time a backfilled row is indexed at.
100
+ *
101
+ * Accepts: `recorded` — the row's own time attribute, whatever it holds.
102
+ *
103
+ * Returns: that time when it is a string, else {@link BACKFILLED_AT}.
104
+ *
105
+ * Throws: nothing.
106
+ */
107
+ export declare function backfilledAt(recorded: AttributeMap[string]): string;
108
+ /** The index's partition-key attribute: `<tag>#<shard>`, the one name every writer, the backfill and the listing spell. */
109
+ export declare const INDEX_PARTITION_ATTRIBUTE = "gsi1pk";
110
+ /** The index's sort-key attribute: `<updatedAt>#<id>`, or the digest form past the sort-key cap. */
111
+ export declare const INDEX_SORT_ATTRIBUTE = "gsi1sk";
112
+ /** The two attributes a row carries to appear in GSI1. */
113
+ export interface IndexKeys {
114
+ [INDEX_PARTITION_ATTRIBUTE]: string;
115
+ [INDEX_SORT_ATTRIBUTE]: string;
116
+ }
117
+ /** Default number of index partitions per adapter. */
118
+ export declare const DEFAULT_INDEX_SHARDS = 8;
119
+ /**
120
+ * The most shards a recency index may have. The indexed read builds every
121
+ * shard's partition key and issues at least one query per shard, so an
122
+ * unbounded value turns a config typo into an unbounded stream of requests and
123
+ * an out-of-memory crash. How many of those queries run at once is
124
+ * `readConcurrency`.
125
+ */
126
+ export declare const MAX_INDEX_SHARDS = 1024;
127
+ /**
128
+ * The GSI1 keys for a row that takes part in cross-partition listing.
129
+ *
130
+ * The partition key is the adapter tag plus a shard, because an index keyed by
131
+ * the tag alone is one partition per adapter — a single hot partition, which is
132
+ * worse than the table scan it replaces. AWS names the sharding requirement
133
+ * directly: mapping one identifier onto one partition key "will quickly create
134
+ * partition hot spots", and the answer is a secondary sharding model
135
+ * (https://docs.aws.amazon.com/whitepapers/latest/multi-tenant-saas-storage-strategies/multitenancy-on-dynamodb.html).
136
+ *
137
+ * The sort key leads with an ISO-8601 timestamp, used unparsed: its byte order
138
+ * already is its chronological order, so a recency listing is a key condition
139
+ * rather than an in-memory sort. The row's own id, or its SHA-256 digest once
140
+ * the composed key would pass DynamoDB's 1024-byte sort-key cap
141
+ * ({@link indexSortKey}), follows it, which makes the key total — two rows
142
+ * written in the same millisecond still order, so a cursor can never loop.
143
+ *
144
+ * Accepts: `tag` — the adapter's. `id` — the row's own identifier, which
145
+ * decides its shard and breaks ties in the sort key. `at` — an ISO-8601
146
+ * instant. `shards` — index partitions per adapter, at least 1; fixed for the
147
+ * table's life once rows carry keys, since `backfillRecencyIndex` writes keys
148
+ * only to rows that have none and so can never move a row already on a
149
+ * shard — raising the count is safe, since a listing still queries the old
150
+ * shards too, and lowering it hides the rows already on a dropped shard.
151
+ *
152
+ * Returns: the two index attributes; an id whose composed sort key would pass
153
+ * 1024 bytes is carried as its SHA-256 digest.
154
+ *
155
+ * Throws: `VALIDATION` naming `indexShards` for a count below 1 — the read
156
+ * side built an empty partition list from such a value and reported an empty
157
+ * table full of rows.
158
+ *
159
+ * Guarantees: the same row always lands on the same shard, so a listing that
160
+ * queries every shard sees every row exactly once.
161
+ */
162
+ export declare function indexKeys(tag: IndexTag, id: string, at: string, shards: number): IndexKeys;
163
+ /**
164
+ * Every index partition of one adapter.
165
+ *
166
+ * Accepts: `shards` — the same count the rows were written with; validated
167
+ * here as it is in {@link indexKeys}, because a listing that silently queried
168
+ * an empty partition list would return nothing for a table full of rows.
169
+ *
170
+ * Returns: one partition key per shard, which a recency listing queries in
171
+ * parallel and merges.
172
+ *
173
+ * Throws: `VALIDATION` naming `indexShards`.
174
+ */
175
+ export declare function indexPartitions(tag: IndexTag, shards: number): string[];
176
+ /** What a recency listing needs to read one page. */
177
+ export interface IndexQueryOptions {
178
+ client: DynamoDBDocumentLike;
179
+ tableName: string;
180
+ indexName: string;
181
+ tag: IndexTag;
182
+ shards: number;
183
+ /** Shards queried at once: the adapter's `readConcurrency`. */
184
+ concurrency: number;
185
+ /** Rows per page, checked by the caller's parser, so the query does not check it again. */
186
+ limit: PageLimit;
187
+ /** Opaque, from a previous page. */
188
+ cursor?: string;
189
+ retry?: RetryOptions;
190
+ signal?: AbortSignal;
191
+ }
192
+ /** Where one shard stands while a listing builds a page. */
193
+ export interface ShardReader {
194
+ partition: string;
195
+ /**
196
+ * The rows of the shard's last DynamoDB page that are not on the listing's
197
+ * page yet, oldest first, so the newest is the last element and leaves with
198
+ * `pop()`. Never more than one page.
199
+ */
200
+ buffer: AttributeMap[];
201
+ /** Where the shard's next page starts; absent before its first page. */
202
+ startKey: AttributeMap | undefined;
203
+ /** True once DynamoDB reported no data past the last page read. */
204
+ exhausted: boolean;
205
+ /** DynamoDB pages read from this shard so far. */
206
+ pages: number;
207
+ }
208
+ /**
209
+ * A reader placed before a shard's first page.
210
+ *
211
+ * Accepts: `partition` — the shard's index partition key.
212
+ *
213
+ * Returns: a reader with an empty buffer that is not exhausted, so a listing
214
+ * reads its first page before choosing any row.
215
+ *
216
+ * Throws: nothing.
217
+ */
218
+ export declare function shardReader(partition: string): ShardReader;
219
+ /**
220
+ * Read a shard's next DynamoDB page into its buffer.
221
+ *
222
+ * `Limit` bounds the items a `Query` *evaluates*, and a page also stops at
223
+ * 1 MB, so a shard of large rows answers with fewer than `limit` items and a
224
+ * `LastEvaluatedKey`. Taking that short page as the whole shard would drop
225
+ * rows and report the listing complete. The key is kept here
226
+ * instead, and the listing reads the next page once the shard's buffer is empty
227
+ * and its page still needs a row. One page at a time is what bounds a listing's
228
+ * memory to at most one DynamoDB page per shard, besides the page it is
229
+ * building.
230
+ *
231
+ * Accepts: `reader` — its buffer empty and the shard not exhausted. `before` —
232
+ * the sort key to read below, or none for the newest. `limit` — the rows the
233
+ * listing's page still needs, at least 1; the shard cannot contribute more.
234
+ *
235
+ * Returns: nothing. The reader's buffer holds the page's rows, and its key,
236
+ * `exhausted` and page count describe what is left.
237
+ *
238
+ * Throws: `RESULT_TRUNCATED` naming `maxIterations`, without issuing
239
+ * a query, when the shard has already read {@link MAX_LOOP_ITERATIONS} pages —
240
+ * a listing fails rather than hand back a partial shard; whatever the query
241
+ * throws, including an `ABORTED` error.
242
+ */
243
+ export declare function readShardPage(options: IndexQueryOptions, reader: ShardReader, before: string | undefined, limit: number): Promise<void>;
@@ -0,0 +1,136 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mapWithConcurrency } from '../concurrency.js';
3
+ import { validationError, resultTruncatedError } from '../errors/errors.js';
4
+ import { parseLimit } from '../validation/primitives.js';
5
+ import { MAX_LOOP_ITERATIONS } from './paginate.js';
6
+ import { withDynamoDBRetry } from './retry.js';
7
+ import { compareSortKeys, MAX_SORT_KEY_BYTES } from './table-schema.js';
8
+ function encodeCursor(sortKey) {
9
+ return Buffer.from(sortKey, 'utf8').toString('base64url');
10
+ }
11
+ function decodeCursor(cursor) {
12
+ const decoded = Buffer.from(cursor, 'base64url').toString('utf8');
13
+ if (!decoded.includes('#')) {
14
+ throw validationError('cursor is not one this adapter issued', 'cursor');
15
+ }
16
+ return decoded;
17
+ }
18
+ function isDry(reader) {
19
+ return reader.buffer.length === 0 && !reader.exhausted;
20
+ }
21
+ async function refillDryShards(options, readers, before, needed) {
22
+ for (let dry = readers.filter(isDry); dry.length > 0; dry = readers.filter(isDry)) {
23
+ await mapWithConcurrency(dry, options.concurrency, (reader) => readShardPage(options, reader, before, needed));
24
+ }
25
+ }
26
+ function takeNewest(readers) {
27
+ let newest;
28
+ let newestKey = '';
29
+ for (const reader of readers) {
30
+ const head = reader.buffer[reader.buffer.length - 1];
31
+ if (head !== undefined && compareSortKeys(head.gsi1sk, newestKey) > 0) {
32
+ newest = reader;
33
+ newestKey = head.gsi1sk;
34
+ }
35
+ }
36
+ return newest?.buffer.pop();
37
+ }
38
+ export async function queryRecencyIndex(options) {
39
+ if (options.limit === 0)
40
+ return { items: [] };
41
+ const before = options.cursor === undefined ? undefined : decodeCursor(options.cursor);
42
+ const readers = indexPartitions(options.tag, options.shards).map((partition) => shardReader(partition));
43
+ const items = [];
44
+ while (items.length < options.limit) {
45
+ await refillDryShards(options, readers, before, options.limit - items.length);
46
+ const row = takeNewest(readers);
47
+ if (row === undefined)
48
+ break;
49
+ items.push(row);
50
+ }
51
+ const remain = readers.some((reader) => reader.buffer.length > 0 || !reader.exhausted);
52
+ return {
53
+ items,
54
+ ...(remain ? { nextCursor: encodeCursor(items[items.length - 1].gsi1sk) } : {}),
55
+ };
56
+ }
57
+ const STREAM_PAGE_SIZE = parseLimit(100, 0);
58
+ export async function* iterateRecencyIndex(options) {
59
+ let cursor;
60
+ do {
61
+ const page = await queryRecencyIndex({ ...options, limit: STREAM_PAGE_SIZE, cursor });
62
+ for (const item of page.items)
63
+ yield item;
64
+ cursor = page.nextCursor;
65
+ } while (cursor !== undefined);
66
+ }
67
+ export const BACKFILLED_AT = '1970-01-01T00:00:00.000Z';
68
+ export function backfilledAt(recorded) {
69
+ return typeof recorded === 'string' ? recorded : BACKFILLED_AT;
70
+ }
71
+ export const INDEX_PARTITION_ATTRIBUTE = 'gsi1pk';
72
+ export const INDEX_SORT_ATTRIBUTE = 'gsi1sk';
73
+ export const DEFAULT_INDEX_SHARDS = 8;
74
+ export const MAX_INDEX_SHARDS = 1024;
75
+ function fnv1a(value) {
76
+ let hash = 0x811c9dc5;
77
+ for (let i = 0; i < value.length; i++) {
78
+ hash ^= value.charCodeAt(i);
79
+ hash = Math.imul(hash, 0x01000193) >>> 0;
80
+ }
81
+ return hash >>> 0;
82
+ }
83
+ function assertShardCount(shards) {
84
+ if (!Number.isInteger(shards) || shards < 1) {
85
+ throw validationError(`indexShards must be a positive integer (received ${shards}); a non-positive value would ` +
86
+ 'make every row share one index partition or produce an unusable key', 'indexShards');
87
+ }
88
+ }
89
+ function indexSortKey(at, id) {
90
+ const verbatim = `${at}#${id}`;
91
+ if (Buffer.byteLength(verbatim, 'utf8') <= MAX_SORT_KEY_BYTES)
92
+ return verbatim;
93
+ return `${at}#sha256:${createHash('sha256').update(id, 'utf8').digest('hex')}`;
94
+ }
95
+ export function indexKeys(tag, id, at, shards) {
96
+ assertShardCount(shards);
97
+ return {
98
+ gsi1pk: `${tag}#${fnv1a(id) % shards}`,
99
+ gsi1sk: indexSortKey(at, id),
100
+ };
101
+ }
102
+ export function indexPartitions(tag, shards) {
103
+ assertShardCount(shards);
104
+ return Array.from({ length: shards }, (_unused, shard) => `${tag}#${shard}`);
105
+ }
106
+ export function shardReader(partition) {
107
+ return { partition, buffer: [], startKey: undefined, exhausted: false, pages: 0 };
108
+ }
109
+ function shardQuery(options, reader, before, limit) {
110
+ return {
111
+ TableName: options.tableName,
112
+ IndexName: options.indexName,
113
+ KeyConditionExpression: before === undefined ? '#pk = :pk' : '#pk = :pk AND #sk < :before',
114
+ ExpressionAttributeNames: {
115
+ '#pk': INDEX_PARTITION_ATTRIBUTE,
116
+ ...(before === undefined ? {} : { '#sk': INDEX_SORT_ATTRIBUTE }),
117
+ },
118
+ ExpressionAttributeValues: {
119
+ ':pk': reader.partition,
120
+ ...(before === undefined ? {} : { ':before': before }),
121
+ },
122
+ ScanIndexForward: false,
123
+ Limit: limit,
124
+ ...(reader.startKey === undefined ? {} : { ExclusiveStartKey: reader.startKey }),
125
+ };
126
+ }
127
+ export async function readShardPage(options, reader, before, limit) {
128
+ if (reader.pages >= MAX_LOOP_ITERATIONS) {
129
+ throw resultTruncatedError('maxIterations', MAX_LOOP_ITERATIONS);
130
+ }
131
+ const result = await withDynamoDBRetry((request) => options.client.query(shardQuery(options, reader, before, limit), request), { ...options.retry, signal: options.signal });
132
+ reader.pages += 1;
133
+ reader.buffer = (result.Items ?? []).slice().reverse();
134
+ reader.startKey = result.LastEvaluatedKey;
135
+ reader.exhausted = reader.startKey === undefined;
136
+ }