@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
@@ -1,377 +0,0 @@
1
- "use strict";
2
- /**
3
- * Hides the recency index (record 8).
4
- *
5
- * A row that a cross-partition listing reaches carries two index keys: a
6
- * partition that hashes its identity onto one of a fixed number of shards, and
7
- * a sort key that orders it by time. A listing reads every shard at once,
8
- * merges them newest first, and hands out an opaque cursor that resumes the
9
- * merge. The shard function, the key format and the merge are decided here.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.MAX_INDEX_SHARDS = exports.DEFAULT_INDEX_SHARDS = exports.BACKFILLED_AT = void 0;
13
- exports.queryRecencyIndex = queryRecencyIndex;
14
- exports.iterateRecencyIndex = iterateRecencyIndex;
15
- exports.backfilledAt = backfilledAt;
16
- exports.indexKeys = indexKeys;
17
- exports.indexPartitions = indexPartitions;
18
- exports.shardReader = shardReader;
19
- exports.readShardPage = readShardPage;
20
- const concurrency_1 = require("../concurrency");
21
- const errors_1 = require("../errors/errors");
22
- const primitives_1 = require("../validation/primitives");
23
- const paginate_1 = require("./paginate");
24
- const retry_1 = require("./retry");
25
- const table_schema_1 = require("./table-schema");
26
- /**
27
- * A cursor is the sort key of the last row handed out.
28
- *
29
- * That is all it needs to be: `gsi1sk` is `<timestamp>#<id>`, which is unique
30
- * and totally ordered, so the next page is simply "everything below this". It
31
- * is also why the cursor is not a `LastEvaluatedKey` — one per shard would have
32
- * to be carried, and a shard count change would silently invalidate them.
33
- * Opaque to the caller all the same: its shape is not a promise.
34
- *
35
- * The key handed here is always the last row {@link takeNewest} chose, and
36
- * that is the only reason the cursor is sound: the merge hands rows out in
37
- * descending {@link compareSortKeys} order, so the last one is the smallest
38
- * key on the page in the server's own order, which is exactly what
39
- * `#sk < :before` resumes below. There is no second comparison to keep in step
40
- * — one comparator decides the order, and the cursor is a row it chose.
41
- */
42
- function encodeCursor(sortKey) {
43
- return Buffer.from(sortKey, 'utf8').toString('base64url');
44
- }
45
- /**
46
- * The sort key a cursor encodes.
47
- *
48
- * Accepts: `cursor` — as a previous page returned it.
49
- *
50
- * Returns: the `gsi1sk` to resume below.
51
- *
52
- * Throws: `VALIDATION` naming `cursor` when the decoded value carries no
53
- * `#`. `gsi1sk` is `<timestamp>#<id>`, so such a value was issued by something
54
- * else — a scan cursor, a page token from another API — and using it as a bound
55
- * would quietly return the wrong page rather than say so. A value that carries
56
- * a `#` is not checked further.
57
- */
58
- function decodeCursor(cursor) {
59
- const decoded = Buffer.from(cursor, 'base64url').toString('utf8');
60
- if (!decoded.includes('#')) {
61
- throw (0, errors_1.validationError)('cursor is not one this adapter issued', 'cursor');
62
- }
63
- return decoded;
64
- }
65
- /** A shard with no row to offer that may still hold one. */
66
- function isDry(reader) {
67
- return reader.buffer.length === 0 && !reader.exhausted;
68
- }
69
- /**
70
- * Read the next page of every dry shard, at most `concurrency` at once, until
71
- * no shard is dry. A page can hold no rows and still carry a key, and a shard
72
- * in that state may hold the newest row of all, so choosing a row before it is
73
- * read again could put an older row on the page first.
74
- *
75
- * The loop carries no iteration cap of its own, and that is a decision rather
76
- * than an omission. Every pass calls {@link readShardPage} on every dry shard,
77
- * and that call either advances the shard or, once the shard has read
78
- * `MAX_LOOP_ITERATIONS` pages, throws `RESULT_TRUNCATED` without issuing a
79
- * query — so a shard that answers with empty pages forever ends the listing
80
- * there. A second cap here could only ever fire after that one, which makes it
81
- * a branch no test could reach: {@link mapWithConcurrency}'s own floor (in
82
- * `shared/concurrency.ts`) never starts zero workers, even for a
83
- * non-integer or zero `concurrency`, so a pass here always advances at least
84
- * one dry shard or reads nothing because none is dry. A collaborator that
85
- * could silently spin without reading anything belongs fixed at that floor,
86
- * not papered over by a cap here.
87
- */
88
- async function refillDryShards(options, readers, before, needed) {
89
- for (let dry = readers.filter(isDry); dry.length > 0; dry = readers.filter(isDry)) {
90
- await (0, concurrency_1.mapWithConcurrency)(dry, options.concurrency, (reader) => readShardPage(options, reader, before, needed));
91
- }
92
- }
93
- /**
94
- * Move the newest buffered row off its shard; undefined when every buffer is
95
- * empty.
96
- *
97
- * "Newest" is {@link compareSortKeys}, not `>`: the row this picks is the one
98
- * the resumed `#sk < :before` query will agree is newest, and the two orders
99
- * part company at an astral id. `''` is a safe starting bound because a
100
- * DynamoDB key attribute is never the empty string, so no row can lose to it.
101
- */
102
- function takeNewest(readers) {
103
- let newest;
104
- let newestKey = '';
105
- for (const reader of readers) {
106
- const head = reader.buffer[reader.buffer.length - 1];
107
- if (head !== undefined && (0, table_schema_1.compareSortKeys)(head.gsi1sk, newestKey) > 0) {
108
- newest = reader;
109
- newestKey = head.gsi1sk;
110
- }
111
- }
112
- return newest?.buffer.pop();
113
- }
114
- /**
115
- * Read one page of a recency listing from the index, newest first.
116
- *
117
- * Each shard is read one DynamoDB page at a time and the pages are merged row
118
- * by row: the newest buffered row goes onto the page, and a shard whose buffer
119
- * runs dry reads its next page before another row is chosen. That is correct
120
- * because each shard is already sorted and no row is chosen while a shard that
121
- * may hold a newer one is unread. It is also what bounds memory: a listing
122
- * holds the page it is building, up to `limit` rows, plus at most one DynamoDB
123
- * page per shard, and a shard none of whose buffered rows the page takes is
124
- * never followed. The price is that a dry shard is read again whenever the page
125
- * still needs a row, even when every row still to come is another shard's,
126
- * which can cost a query per shard per page whose rows the page never takes.
127
- * The alternative — one query over an unsharded index — would make every
128
- * listing hit one partition, which is what the sharding exists to avoid.
129
- *
130
- * This replaces a full-table `Scan` with a `FilterExpression`, which consumed
131
- * read capacity for every row *evaluated*, collected the whole table in memory
132
- * and sorted it there.
133
- *
134
- * Accepts: `limit` — a `PageLimit`, already checked against the package-wide
135
- * page rule by the caller's parser. `0` returns an empty page with no cursor
136
- * and issues no query — and is answered here rather than left to the merge,
137
- * where an empty page with shards still unread would have read
138
- * `items[items.length - 1]` off an empty array to build the cursor. `cursor`
139
- * — from a previous page, or none to start at the newest. `shards` — must
140
- * match what the writers used. `concurrency` — how many shards are queried at
141
- * once.
142
- *
143
- * Returns: the page, newest first, and a `nextCursor` exactly while rows may
144
- * remain: a shard still buffers a row the page did not take, or has not
145
- * reported its end. A cursor is never withheld while rows remain, and none is
146
- * issued once every shard has reported its end, even for a page filled
147
- * exactly. DynamoDB can still report a `LastEvaluatedKey` on a page that ends
148
- * at a shard's last row, so the page after such a cursor may come back empty.
149
- *
150
- * Throws: `VALIDATION` naming `cursor`; `RESULT_TRUNCATED`
151
- * for a shard whose pages do not end within `MAX_LOOP_ITERATIONS`; whatever
152
- * the queries throw, including an `ABORTED` error.
153
- *
154
- * Guarantees: at most `concurrency` shards are queried at once; each shard is
155
- * followed across DynamoDB's 1 MB page boundary, but its next page is read only
156
- * when its buffer is empty and the page still needs a row, so besides the page
157
- * being built, up to `limit` rows, no more than one DynamoDB page per shard is
158
- * held at a time.
159
- */
160
- async function queryRecencyIndex(options) {
161
- if (options.limit === 0)
162
- return { items: [] };
163
- const before = options.cursor === undefined ? undefined : decodeCursor(options.cursor);
164
- const readers = indexPartitions(options.tag, options.shards).map((partition) => shardReader(partition));
165
- const items = [];
166
- while (items.length < options.limit) {
167
- await refillDryShards(options, readers, before, options.limit - items.length);
168
- const row = takeNewest(readers);
169
- if (row === undefined)
170
- break;
171
- items.push(row);
172
- }
173
- // Rows remain when a shard still buffers a row or has not reported its end.
174
- // Either way the loop stopped on a full page, so the page is non-empty and
175
- // its last row is the right place to resume.
176
- const remain = readers.some((reader) => reader.buffer.length > 0 || !reader.exhausted);
177
- return {
178
- items,
179
- ...(remain ? { nextCursor: encodeCursor(items[items.length - 1].gsi1sk) } : {}),
180
- };
181
- }
182
- /** Rows per page when a caller streams the whole index rather than paging it. */
183
- const STREAM_PAGE_SIZE = (0, primitives_1.parseLimit)(100, 0);
184
- /**
185
- * Every row of one adapter's recency index, newest first, page by page.
186
- *
187
- * The streaming counterpart of {@link queryRecencyIndex}, for a caller that
188
- * consumes rows until it has what it needs and then stops. It replaces a
189
- * full-table `Scan` whose cost scaled with the table rather than with the
190
- * answer.
191
- *
192
- * Accepts: as {@link queryRecencyIndex}, without `limit` and `cursor` — this
193
- * walks the whole index, paging internally.
194
- *
195
- * Returns: an async generator over every row, newest first. An early `break`
196
- * fetches no further page, so a caller that needs ten rows of a large index
197
- * pays for one page.
198
- *
199
- * Throws: as {@link queryRecencyIndex}.
200
- */
201
- async function* iterateRecencyIndex(options) {
202
- let cursor;
203
- do {
204
- const page = await queryRecencyIndex({ ...options, limit: STREAM_PAGE_SIZE, cursor });
205
- for (const item of page.items)
206
- yield item;
207
- cursor = page.nextCursor;
208
- } while (cursor !== undefined);
209
- }
210
- /** The time a row that recorded none is indexed at, older than anything indexed since. */
211
- exports.BACKFILLED_AT = '1970-01-01T00:00:00.000Z';
212
- /**
213
- * The time a backfilled row is indexed at.
214
- *
215
- * Accepts: `recorded` — the row's own time attribute, whatever it holds.
216
- *
217
- * Returns: that time when it is a string, else {@link BACKFILLED_AT}.
218
- *
219
- * Throws: nothing.
220
- */
221
- function backfilledAt(recorded) {
222
- return typeof recorded === 'string' ? recorded : exports.BACKFILLED_AT;
223
- }
224
- /** Default number of index partitions per adapter. */
225
- exports.DEFAULT_INDEX_SHARDS = 8;
226
- /**
227
- * The most shards a recency index may have. The indexed read builds every
228
- * shard's partition key and issues at least one query per shard, so an
229
- * unbounded value turns a config typo into an unbounded stream of requests and
230
- * an out-of-memory crash. How many of those queries run at once is
231
- * `readConcurrency`.
232
- */
233
- exports.MAX_INDEX_SHARDS = 1024;
234
- /**
235
- * A stable 32-bit FNV-1a hash of `value`.
236
- *
237
- * Deterministic and dependency-free, which is what a shard assignment needs: a
238
- * row's index entry must be findable and deletable without a scan, so the same
239
- * id must always map to the same shard — across processes, releases and
240
- * machines. A cryptographic hash would cost more per write for a property
241
- * nothing here depends on.
242
- */
243
- function fnv1a(value) {
244
- let hash = 0x811c9dc5;
245
- for (let i = 0; i < value.length; i++) {
246
- hash ^= value.charCodeAt(i);
247
- hash = Math.imul(hash, 0x01000193) >>> 0;
248
- }
249
- return hash >>> 0;
250
- }
251
- /** Refuse a shard count that would make the index unusable in either direction. */
252
- function assertShardCount(shards) {
253
- if (!Number.isInteger(shards) || shards < 1) {
254
- throw (0, errors_1.validationError)(`indexShards must be a positive integer (received ${shards}); a non-positive value would ` +
255
- 'make every row share one index partition or produce an unusable key', 'indexShards');
256
- }
257
- }
258
- /**
259
- * The GSI1 keys for a row that takes part in cross-partition listing.
260
- *
261
- * The partition key is the adapter tag plus a shard, because an index keyed by
262
- * the tag alone is one partition per adapter — a single hot partition, which is
263
- * worse than the table scan it replaces. AWS names the sharding requirement
264
- * directly: mapping one identifier onto one partition key "will quickly create
265
- * partition hot spots", and the answer is a secondary sharding model
266
- * (https://docs.aws.amazon.com/whitepapers/latest/multi-tenant-saas-storage-strategies/multitenancy-on-dynamodb.html).
267
- *
268
- * The sort key leads with an ISO-8601 timestamp, used unparsed: its byte order
269
- * already is its chronological order, so a recency listing is a key condition
270
- * rather than an in-memory sort. The row's own id follows it, which makes the
271
- * key total — two rows written in the same millisecond still order, so a cursor
272
- * can never loop.
273
- *
274
- * Accepts: `tag` — the adapter's. `id` — the row's own identifier, which
275
- * decides its shard and breaks ties in the sort key. `at` — an ISO-8601
276
- * instant. `shards` — index partitions per adapter, at least 1; fixed at table
277
- * creation, since changing it changes every row's shard and requires a
278
- * backfill.
279
- *
280
- * Returns: the two index attributes.
281
- *
282
- * Throws: `VALIDATION` naming `indexShards` for a count below 1 — the read
283
- * side built an empty partition list from such a value and reported an empty
284
- * table full of rows.
285
- *
286
- * Guarantees: the same row always lands on the same shard, so a listing that
287
- * queries every shard sees every row exactly once.
288
- */
289
- function indexKeys(tag, id, at, shards) {
290
- assertShardCount(shards);
291
- return {
292
- gsi1pk: `${tag}#${fnv1a(id) % shards}`,
293
- gsi1sk: `${at}#${id}`,
294
- };
295
- }
296
- /**
297
- * Every index partition of one adapter.
298
- *
299
- * Accepts: `shards` — the same count the rows were written with; validated
300
- * here as it is in {@link indexKeys}, because a listing that silently queried
301
- * an empty partition list would return nothing for a table full of rows.
302
- *
303
- * Returns: one partition key per shard, which a recency listing queries in
304
- * parallel and merges.
305
- *
306
- * Throws: `VALIDATION` naming `indexShards`.
307
- */
308
- function indexPartitions(tag, shards) {
309
- assertShardCount(shards);
310
- return Array.from({ length: shards }, (_unused, shard) => `${tag}#${shard}`);
311
- }
312
- /**
313
- * A reader placed before a shard's first page.
314
- *
315
- * Accepts: `partition` — the shard's index partition key.
316
- *
317
- * Returns: a reader with an empty buffer that is not exhausted, so a listing
318
- * reads its first page before choosing any row.
319
- *
320
- * Throws: nothing.
321
- */
322
- function shardReader(partition) {
323
- return { partition, buffer: [], startKey: undefined, exhausted: false, pages: 0 };
324
- }
325
- /** The `Query` for one page of one shard. */
326
- function shardQuery(options, reader, before, limit) {
327
- return {
328
- TableName: options.tableName,
329
- IndexName: options.indexName,
330
- KeyConditionExpression: before === undefined ? '#pk = :pk' : '#pk = :pk AND #sk < :before',
331
- ExpressionAttributeNames: {
332
- '#pk': 'gsi1pk',
333
- ...(before === undefined ? {} : { '#sk': 'gsi1sk' }),
334
- },
335
- ExpressionAttributeValues: {
336
- ':pk': reader.partition,
337
- ...(before === undefined ? {} : { ':before': before }),
338
- },
339
- ScanIndexForward: false,
340
- Limit: limit,
341
- ...(reader.startKey === undefined ? {} : { ExclusiveStartKey: reader.startKey }),
342
- };
343
- }
344
- /**
345
- * Read a shard's next DynamoDB page into its buffer.
346
- *
347
- * `Limit` bounds the items a `Query` *evaluates*, and a page also stops at
348
- * 1 MB, so a shard of large rows answers with fewer than `limit` items and a
349
- * `LastEvaluatedKey`. Taking that short page as the whole shard would drop
350
- * rows and report the listing complete. The key is kept here
351
- * instead, and the listing reads the next page once the shard's buffer is empty
352
- * and its page still needs a row. One page at a time is what bounds a listing's
353
- * memory to at most one DynamoDB page per shard, besides the page it is
354
- * building.
355
- *
356
- * Accepts: `reader` — its buffer empty and the shard not exhausted. `before` —
357
- * the sort key to read below, or none for the newest. `limit` — the rows the
358
- * listing's page still needs, at least 1; the shard cannot contribute more.
359
- *
360
- * Returns: nothing. The reader's buffer holds the page's rows, and its key,
361
- * `exhausted` and page count describe what is left.
362
- *
363
- * Throws: `RESULT_TRUNCATED` naming `maxIterations`, without issuing
364
- * a query, when the shard has already read {@link MAX_LOOP_ITERATIONS} pages —
365
- * a listing fails rather than hand back a partial shard; whatever the query
366
- * throws, including an `ABORTED` error.
367
- */
368
- async function readShardPage(options, reader, before, limit) {
369
- if (reader.pages >= paginate_1.MAX_LOOP_ITERATIONS) {
370
- throw (0, errors_1.resultTruncatedError)('maxIterations', paginate_1.MAX_LOOP_ITERATIONS);
371
- }
372
- const result = await (0, retry_1.withDynamoDBRetry)((request) => options.client.query(shardQuery(options, reader, before, limit), request), { ...options.retry, signal: options.signal });
373
- reader.pages += 1;
374
- reader.buffer = (result.Items ?? []).slice().reverse();
375
- reader.startKey = result.LastEvaluatedKey;
376
- reader.exhausted = reader.startKey === undefined;
377
- }