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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. package/README.md +1720 -154
  2. package/dist/backfill/backfill.d.ts +168 -0
  3. package/dist/backfill/backfill.js +393 -0
  4. package/dist/checkpointer/actions/delete-thread.d.ts +47 -6
  5. package/dist/checkpointer/actions/delete-thread.js +58 -21
  6. package/dist/checkpointer/actions/get-tuple.d.ts +29 -4
  7. package/dist/checkpointer/actions/get-tuple.js +44 -10
  8. package/dist/checkpointer/actions/list.d.ts +46 -4
  9. package/dist/checkpointer/actions/list.js +121 -66
  10. package/dist/checkpointer/actions/put-writes.d.ts +41 -9
  11. package/dist/checkpointer/actions/put-writes.js +62 -77
  12. package/dist/checkpointer/actions/put.d.ts +83 -4
  13. package/dist/checkpointer/actions/put.js +177 -25
  14. package/dist/checkpointer/internal/delta-history.d.ts +112 -0
  15. package/dist/checkpointer/internal/delta-history.js +252 -0
  16. package/dist/checkpointer/internal/listing.d.ts +149 -0
  17. package/dist/checkpointer/internal/listing.js +245 -0
  18. package/dist/checkpointer/internal/parse.d.ts +262 -0
  19. package/dist/checkpointer/internal/parse.js +372 -0
  20. package/dist/checkpointer/internal/pending-writes.d.ts +275 -0
  21. package/dist/checkpointer/internal/pending-writes.js +588 -0
  22. package/dist/checkpointer/internal/read.d.ts +130 -0
  23. package/dist/checkpointer/internal/read.js +264 -0
  24. package/dist/checkpointer/internal/rows.d.ts +571 -0
  25. package/dist/checkpointer/internal/rows.js +834 -0
  26. package/dist/checkpointer/internal/setup.d.ts +42 -19
  27. package/dist/checkpointer/internal/setup.js +65 -29
  28. package/dist/checkpointer/saver.d.ts +256 -16
  29. package/dist/checkpointer/saver.js +275 -29
  30. package/dist/checkpointer/types.d.ts +39 -39
  31. package/dist/checkpointer/types.js +10 -1
  32. package/dist/factory/factory.d.ts +134 -28
  33. package/dist/factory/factory.js +240 -21
  34. package/dist/factory/types.d.ts +76 -0
  35. package/dist/factory/types.js +10 -0
  36. package/dist/history/actions/add-messages.d.ts +31 -4
  37. package/dist/history/actions/add-messages.js +38 -58
  38. package/dist/history/actions/clear.d.ts +49 -6
  39. package/dist/history/actions/clear.js +66 -14
  40. package/dist/history/actions/get-messages.d.ts +54 -6
  41. package/dist/history/actions/get-messages.js +126 -43
  42. package/dist/history/actions/list-sessions.d.ts +52 -10
  43. package/dist/history/actions/list-sessions.js +139 -40
  44. package/dist/history/actions/reconcile-count.d.ts +42 -10
  45. package/dist/history/actions/reconcile-count.js +45 -45
  46. package/dist/history/chat-message-history.d.ts +220 -33
  47. package/dist/history/chat-message-history.js +240 -43
  48. package/dist/history/internal/append.d.ts +212 -0
  49. package/dist/history/internal/append.js +500 -0
  50. package/dist/history/internal/message-read.d.ts +84 -0
  51. package/dist/history/internal/message-read.js +204 -0
  52. package/dist/history/internal/parse.d.ts +153 -0
  53. package/dist/history/internal/parse.js +252 -0
  54. package/dist/history/internal/rows.d.ts +195 -0
  55. package/dist/history/internal/rows.js +250 -0
  56. package/dist/history/internal/session.d.ts +331 -0
  57. package/dist/history/internal/session.js +628 -0
  58. package/dist/history/internal/setup.d.ts +52 -17
  59. package/dist/history/internal/setup.js +92 -21
  60. package/dist/history/session-adapter.d.ts +102 -7
  61. package/dist/history/session-adapter.js +103 -9
  62. package/dist/history/types.d.ts +80 -29
  63. package/dist/history/types.js +10 -1
  64. package/dist/index.d.ts +42 -11
  65. package/dist/index.js +33 -12
  66. package/dist/shared/adapter.d.ts +135 -0
  67. package/dist/shared/adapter.js +143 -0
  68. package/dist/shared/clock.d.ts +51 -2
  69. package/dist/shared/clock.js +57 -2
  70. package/dist/shared/codec/codec.d.ts +288 -13
  71. package/dist/shared/codec/codec.js +416 -19
  72. package/dist/shared/codec/compression.d.ts +43 -7
  73. package/dist/shared/codec/compression.js +53 -13
  74. package/dist/shared/codec/json-serde.d.ts +76 -4
  75. package/dist/shared/codec/json-serde.js +181 -8
  76. package/dist/shared/codec/s3/client-types.d.ts +53 -0
  77. package/dist/shared/codec/s3/client-types.js +26 -0
  78. package/dist/shared/codec/s3/client.d.ts +43 -10
  79. package/dist/shared/codec/s3/client.js +82 -9
  80. package/dist/shared/codec/s3/config.d.ts +242 -11
  81. package/dist/shared/codec/s3/config.js +293 -11
  82. package/dist/shared/codec/s3/lifecycle.d.ts +164 -6
  83. package/dist/shared/codec/s3/lifecycle.js +335 -27
  84. package/dist/shared/codec/s3/offloader.d.ts +393 -18
  85. package/dist/shared/codec/s3/offloader.js +595 -37
  86. package/dist/shared/concurrency.d.ts +43 -0
  87. package/dist/shared/concurrency.js +78 -0
  88. package/dist/shared/dynamodb/abort.d.ts +47 -0
  89. package/dist/shared/dynamodb/abort.js +59 -0
  90. package/dist/shared/dynamodb/batch-write.d.ts +77 -14
  91. package/dist/shared/dynamodb/batch-write.js +146 -27
  92. package/dist/shared/dynamodb/cancellation.d.ts +121 -4
  93. package/dist/shared/dynamodb/cancellation.js +147 -3
  94. package/dist/shared/dynamodb/client.d.ts +162 -8
  95. package/dist/shared/dynamodb/client.js +153 -5
  96. package/dist/shared/dynamodb/idempotent-write.d.ts +551 -0
  97. package/dist/shared/dynamodb/idempotent-write.js +593 -0
  98. package/dist/shared/dynamodb/paginate.d.ts +105 -9
  99. package/dist/shared/dynamodb/paginate.js +175 -7
  100. package/dist/shared/dynamodb/partition-delete.d.ts +185 -14
  101. package/dist/shared/dynamodb/partition-delete.js +314 -44
  102. package/dist/shared/dynamodb/recency-index.d.ts +231 -0
  103. package/dist/shared/dynamodb/recency-index.js +377 -0
  104. package/dist/shared/dynamodb/retry.d.ts +276 -8
  105. package/dist/shared/dynamodb/retry.js +433 -23
  106. package/dist/shared/dynamodb/table-schema.d.ts +190 -0
  107. package/dist/shared/dynamodb/table-schema.js +209 -0
  108. package/dist/shared/errors/base-error.d.ts +184 -10
  109. package/dist/shared/errors/base-error.js +160 -14
  110. package/dist/shared/errors/boundary.d.ts +71 -0
  111. package/dist/shared/errors/boundary.js +143 -0
  112. package/dist/shared/errors/classify.d.ts +97 -0
  113. package/dist/shared/errors/classify.js +257 -0
  114. package/dist/shared/errors/error-code.d.ts +77 -2
  115. package/dist/shared/errors/error-code.js +83 -1
  116. package/dist/shared/errors/errors.d.ts +158 -59
  117. package/dist/shared/errors/errors.js +219 -92
  118. package/dist/shared/logging/logger.d.ts +69 -3
  119. package/dist/shared/logging/logger.js +97 -3
  120. package/dist/shared/logging/redaction.d.ts +92 -8
  121. package/dist/shared/logging/redaction.js +273 -17
  122. package/dist/shared/logging/secret-patterns.d.ts +149 -19
  123. package/dist/shared/logging/secret-patterns.js +188 -27
  124. package/dist/shared/logging/truncate.d.ts +197 -0
  125. package/dist/shared/logging/truncate.js +231 -0
  126. package/dist/shared/options.d.ts +59 -7
  127. package/dist/shared/options.js +9 -1
  128. package/dist/shared/ulid.d.ts +77 -7
  129. package/dist/shared/ulid.js +103 -8
  130. package/dist/shared/validation/collaborators.d.ts +141 -0
  131. package/dist/shared/validation/collaborators.js +188 -0
  132. package/dist/shared/validation/option-shape.d.ts +89 -0
  133. package/dist/shared/validation/option-shape.js +113 -0
  134. package/dist/shared/validation/options.d.ts +145 -0
  135. package/dist/shared/validation/options.js +328 -0
  136. package/dist/shared/validation/primitives.d.ts +288 -21
  137. package/dist/shared/validation/primitives.js +353 -50
  138. package/dist/shared/validation/ttl.d.ts +66 -10
  139. package/dist/shared/validation/ttl.js +113 -15
  140. package/dist/store/actions/list-namespaces.d.ts +76 -6
  141. package/dist/store/actions/list-namespaces.js +166 -24
  142. package/dist/store/actions/put.d.ts +33 -8
  143. package/dist/store/actions/put.js +53 -60
  144. package/dist/store/actions/reconcile-vector-index.d.ts +31 -10
  145. package/dist/store/actions/reconcile-vector-index.js +34 -15
  146. package/dist/store/actions/search.d.ts +34 -6
  147. package/dist/store/actions/search.js +56 -51
  148. package/dist/store/internal/batch-plan.d.ts +26 -0
  149. package/dist/store/internal/batch-plan.js +109 -0
  150. package/dist/store/internal/filter.d.ts +36 -3
  151. package/dist/store/internal/filter.js +66 -15
  152. package/dist/store/internal/get-item.d.ts +45 -0
  153. package/dist/store/internal/get-item.js +115 -0
  154. package/dist/store/internal/item-write.d.ts +230 -0
  155. package/dist/store/internal/item-write.js +463 -0
  156. package/dist/store/internal/parse.d.ts +225 -0
  157. package/dist/store/internal/parse.js +350 -0
  158. package/dist/store/internal/rows.d.ts +355 -0
  159. package/dist/store/internal/rows.js +447 -0
  160. package/dist/store/internal/semantic-search.d.ts +161 -6
  161. package/dist/store/internal/semantic-search.js +360 -18
  162. package/dist/store/internal/setup.d.ts +77 -20
  163. package/dist/store/internal/setup.js +178 -47
  164. package/dist/store/internal/table-search.d.ts +100 -0
  165. package/dist/store/internal/table-search.js +213 -0
  166. package/dist/store/internal/vector-index.d.ts +247 -0
  167. package/dist/store/internal/vector-index.js +546 -0
  168. package/dist/store/store.d.ts +270 -17
  169. package/dist/store/store.js +329 -38
  170. package/dist/store/types.d.ts +76 -26
  171. package/dist/store/types.js +13 -1
  172. package/dist/store/vector-backend.d.ts +64 -4
  173. package/dist/store/vector-backend.js +15 -1
  174. package/package.json +58 -36
  175. package/dist/checkpointer/actions/delete-thread.d.ts.map +0 -1
  176. package/dist/checkpointer/actions/delete-thread.js.map +0 -1
  177. package/dist/checkpointer/actions/get-tuple.d.ts.map +0 -1
  178. package/dist/checkpointer/actions/get-tuple.js.map +0 -1
  179. package/dist/checkpointer/actions/list.d.ts.map +0 -1
  180. package/dist/checkpointer/actions/list.js.map +0 -1
  181. package/dist/checkpointer/actions/put-writes.d.ts.map +0 -1
  182. package/dist/checkpointer/actions/put-writes.js.map +0 -1
  183. package/dist/checkpointer/actions/put.d.ts.map +0 -1
  184. package/dist/checkpointer/actions/put.js.map +0 -1
  185. package/dist/checkpointer/internal/assemble.d.ts +0 -10
  186. package/dist/checkpointer/internal/assemble.d.ts.map +0 -1
  187. package/dist/checkpointer/internal/assemble.js +0 -37
  188. package/dist/checkpointer/internal/assemble.js.map +0 -1
  189. package/dist/checkpointer/internal/configurable.d.ts +0 -13
  190. package/dist/checkpointer/internal/configurable.d.ts.map +0 -1
  191. package/dist/checkpointer/internal/configurable.js +0 -23
  192. package/dist/checkpointer/internal/configurable.js.map +0 -1
  193. package/dist/checkpointer/internal/fetch.d.ts +0 -10
  194. package/dist/checkpointer/internal/fetch.d.ts.map +0 -1
  195. package/dist/checkpointer/internal/fetch.js +0 -46
  196. package/dist/checkpointer/internal/fetch.js.map +0 -1
  197. package/dist/checkpointer/internal/filter-match.d.ts +0 -12
  198. package/dist/checkpointer/internal/filter-match.d.ts.map +0 -1
  199. package/dist/checkpointer/internal/filter-match.js +0 -14
  200. package/dist/checkpointer/internal/filter-match.js.map +0 -1
  201. package/dist/checkpointer/internal/item-reader.d.ts +0 -55
  202. package/dist/checkpointer/internal/item-reader.d.ts.map +0 -1
  203. package/dist/checkpointer/internal/item-reader.js +0 -88
  204. package/dist/checkpointer/internal/item-reader.js.map +0 -1
  205. package/dist/checkpointer/internal/item-writer.d.ts +0 -26
  206. package/dist/checkpointer/internal/item-writer.d.ts.map +0 -1
  207. package/dist/checkpointer/internal/item-writer.js +0 -92
  208. package/dist/checkpointer/internal/item-writer.js.map +0 -1
  209. package/dist/checkpointer/internal/keys.d.ts +0 -31
  210. package/dist/checkpointer/internal/keys.d.ts.map +0 -1
  211. package/dist/checkpointer/internal/keys.js +0 -87
  212. package/dist/checkpointer/internal/keys.js.map +0 -1
  213. package/dist/checkpointer/internal/query.d.ts +0 -20
  214. package/dist/checkpointer/internal/query.d.ts.map +0 -1
  215. package/dist/checkpointer/internal/query.js +0 -36
  216. package/dist/checkpointer/internal/query.js.map +0 -1
  217. package/dist/checkpointer/internal/setup.d.ts.map +0 -1
  218. package/dist/checkpointer/internal/setup.js.map +0 -1
  219. package/dist/checkpointer/internal/special-write-cas.d.ts +0 -30
  220. package/dist/checkpointer/internal/special-write-cas.d.ts.map +0 -1
  221. package/dist/checkpointer/internal/special-write-cas.js +0 -104
  222. package/dist/checkpointer/internal/special-write-cas.js.map +0 -1
  223. package/dist/checkpointer/internal/special-write-cleanup.d.ts +0 -24
  224. package/dist/checkpointer/internal/special-write-cleanup.d.ts.map +0 -1
  225. package/dist/checkpointer/internal/special-write-cleanup.js +0 -47
  226. package/dist/checkpointer/internal/special-write-cleanup.js.map +0 -1
  227. package/dist/checkpointer/internal/special-write-verify.d.ts +0 -54
  228. package/dist/checkpointer/internal/special-write-verify.d.ts.map +0 -1
  229. package/dist/checkpointer/internal/special-write-verify.js +0 -65
  230. package/dist/checkpointer/internal/special-write-verify.js.map +0 -1
  231. package/dist/checkpointer/internal/validation.d.ts +0 -13
  232. package/dist/checkpointer/internal/validation.d.ts.map +0 -1
  233. package/dist/checkpointer/internal/validation.js +0 -30
  234. package/dist/checkpointer/internal/validation.js.map +0 -1
  235. package/dist/checkpointer/internal/write-guard.d.ts +0 -13
  236. package/dist/checkpointer/internal/write-guard.d.ts.map +0 -1
  237. package/dist/checkpointer/internal/write-guard.js +0 -39
  238. package/dist/checkpointer/internal/write-guard.js.map +0 -1
  239. package/dist/checkpointer/internal/write-index.d.ts +0 -37
  240. package/dist/checkpointer/internal/write-index.d.ts.map +0 -1
  241. package/dist/checkpointer/internal/write-index.js +0 -42
  242. package/dist/checkpointer/internal/write-index.js.map +0 -1
  243. package/dist/checkpointer/saver.d.ts.map +0 -1
  244. package/dist/checkpointer/saver.js.map +0 -1
  245. package/dist/checkpointer/types.d.ts.map +0 -1
  246. package/dist/checkpointer/types.js.map +0 -1
  247. package/dist/factory/factory.d.ts.map +0 -1
  248. package/dist/factory/factory.js.map +0 -1
  249. package/dist/history/actions/add-messages.d.ts.map +0 -1
  250. package/dist/history/actions/add-messages.js.map +0 -1
  251. package/dist/history/actions/clear.d.ts.map +0 -1
  252. package/dist/history/actions/clear.js.map +0 -1
  253. package/dist/history/actions/get-messages.d.ts.map +0 -1
  254. package/dist/history/actions/get-messages.js.map +0 -1
  255. package/dist/history/actions/list-sessions.d.ts.map +0 -1
  256. package/dist/history/actions/list-sessions.js.map +0 -1
  257. package/dist/history/actions/reconcile-count.d.ts.map +0 -1
  258. package/dist/history/actions/reconcile-count.js.map +0 -1
  259. package/dist/history/chat-message-history.d.ts.map +0 -1
  260. package/dist/history/chat-message-history.js.map +0 -1
  261. package/dist/history/internal/append-saga.d.ts +0 -20
  262. package/dist/history/internal/append-saga.d.ts.map +0 -1
  263. package/dist/history/internal/append-saga.js +0 -35
  264. package/dist/history/internal/append-saga.js.map +0 -1
  265. package/dist/history/internal/compensation.d.ts +0 -21
  266. package/dist/history/internal/compensation.d.ts.map +0 -1
  267. package/dist/history/internal/compensation.js +0 -84
  268. package/dist/history/internal/compensation.js.map +0 -1
  269. package/dist/history/internal/item-mapper.d.ts +0 -12
  270. package/dist/history/internal/item-mapper.d.ts.map +0 -1
  271. package/dist/history/internal/item-mapper.js +0 -33
  272. package/dist/history/internal/item-mapper.js.map +0 -1
  273. package/dist/history/internal/keys.d.ts +0 -17
  274. package/dist/history/internal/keys.d.ts.map +0 -1
  275. package/dist/history/internal/keys.js +0 -49
  276. package/dist/history/internal/keys.js.map +0 -1
  277. package/dist/history/internal/message-chunker.d.ts +0 -14
  278. package/dist/history/internal/message-chunker.d.ts.map +0 -1
  279. package/dist/history/internal/message-chunker.js +0 -68
  280. package/dist/history/internal/message-chunker.js.map +0 -1
  281. package/dist/history/internal/message-transaction.d.ts +0 -26
  282. package/dist/history/internal/message-transaction.d.ts.map +0 -1
  283. package/dist/history/internal/message-transaction.js +0 -60
  284. package/dist/history/internal/message-transaction.js.map +0 -1
  285. package/dist/history/internal/query.d.ts +0 -10
  286. package/dist/history/internal/query.d.ts.map +0 -1
  287. package/dist/history/internal/query.js +0 -31
  288. package/dist/history/internal/query.js.map +0 -1
  289. package/dist/history/internal/session-count.d.ts +0 -41
  290. package/dist/history/internal/session-count.d.ts.map +0 -1
  291. package/dist/history/internal/session-count.js +0 -109
  292. package/dist/history/internal/session-count.js.map +0 -1
  293. package/dist/history/internal/session-title.d.ts +0 -20
  294. package/dist/history/internal/session-title.d.ts.map +0 -1
  295. package/dist/history/internal/session-title.js +0 -44
  296. package/dist/history/internal/session-title.js.map +0 -1
  297. package/dist/history/internal/session-update.d.ts +0 -28
  298. package/dist/history/internal/session-update.d.ts.map +0 -1
  299. package/dist/history/internal/session-update.js +0 -70
  300. package/dist/history/internal/session-update.js.map +0 -1
  301. package/dist/history/internal/setup.d.ts.map +0 -1
  302. package/dist/history/internal/setup.js.map +0 -1
  303. package/dist/history/internal/title-generator.d.ts +0 -13
  304. package/dist/history/internal/title-generator.d.ts.map +0 -1
  305. package/dist/history/internal/title-generator.js +0 -25
  306. package/dist/history/internal/title-generator.js.map +0 -1
  307. package/dist/history/internal/ttl-anchor.d.ts +0 -25
  308. package/dist/history/internal/ttl-anchor.d.ts.map +0 -1
  309. package/dist/history/internal/ttl-anchor.js +0 -38
  310. package/dist/history/internal/ttl-anchor.js.map +0 -1
  311. package/dist/history/internal/validation.d.ts +0 -9
  312. package/dist/history/internal/validation.d.ts.map +0 -1
  313. package/dist/history/internal/validation.js +0 -16
  314. package/dist/history/internal/validation.js.map +0 -1
  315. package/dist/history/session-adapter.d.ts.map +0 -1
  316. package/dist/history/session-adapter.js.map +0 -1
  317. package/dist/history/types.d.ts.map +0 -1
  318. package/dist/history/types.js.map +0 -1
  319. package/dist/index.d.ts.map +0 -1
  320. package/dist/index.js.map +0 -1
  321. package/dist/shared/clock.d.ts.map +0 -1
  322. package/dist/shared/clock.js.map +0 -1
  323. package/dist/shared/codec/codec.d.ts.map +0 -1
  324. package/dist/shared/codec/codec.js.map +0 -1
  325. package/dist/shared/codec/compression.d.ts.map +0 -1
  326. package/dist/shared/codec/compression.js.map +0 -1
  327. package/dist/shared/codec/descriptor-keys.d.ts +0 -4
  328. package/dist/shared/codec/descriptor-keys.d.ts.map +0 -1
  329. package/dist/shared/codec/descriptor-keys.js +0 -14
  330. package/dist/shared/codec/descriptor-keys.js.map +0 -1
  331. package/dist/shared/codec/json-serde.d.ts.map +0 -1
  332. package/dist/shared/codec/json-serde.js.map +0 -1
  333. package/dist/shared/codec/s3/client.d.ts.map +0 -1
  334. package/dist/shared/codec/s3/client.js.map +0 -1
  335. package/dist/shared/codec/s3/config.d.ts.map +0 -1
  336. package/dist/shared/codec/s3/config.js.map +0 -1
  337. package/dist/shared/codec/s3/delete.d.ts +0 -8
  338. package/dist/shared/codec/s3/delete.d.ts.map +0 -1
  339. package/dist/shared/codec/s3/delete.js +0 -29
  340. package/dist/shared/codec/s3/delete.js.map +0 -1
  341. package/dist/shared/codec/s3/lifecycle.d.ts.map +0 -1
  342. package/dist/shared/codec/s3/lifecycle.js.map +0 -1
  343. package/dist/shared/codec/s3/offloader.d.ts.map +0 -1
  344. package/dist/shared/codec/s3/offloader.js.map +0 -1
  345. package/dist/shared/codec/s3/orphans.d.ts +0 -18
  346. package/dist/shared/codec/s3/orphans.d.ts.map +0 -1
  347. package/dist/shared/codec/s3/orphans.js +0 -58
  348. package/dist/shared/codec/s3/orphans.js.map +0 -1
  349. package/dist/shared/codec/s3/read-write.d.ts +0 -14
  350. package/dist/shared/codec/s3/read-write.d.ts.map +0 -1
  351. package/dist/shared/codec/s3/read-write.js +0 -43
  352. package/dist/shared/codec/s3/read-write.js.map +0 -1
  353. package/dist/shared/codec/s3/retry.d.ts +0 -5
  354. package/dist/shared/codec/s3/retry.d.ts.map +0 -1
  355. package/dist/shared/codec/s3/retry.js +0 -25
  356. package/dist/shared/codec/s3/retry.js.map +0 -1
  357. package/dist/shared/constants.d.ts +0 -64
  358. package/dist/shared/constants.d.ts.map +0 -1
  359. package/dist/shared/constants.js +0 -67
  360. package/dist/shared/constants.js.map +0 -1
  361. package/dist/shared/dynamodb/backoff.d.ts +0 -15
  362. package/dist/shared/dynamodb/backoff.d.ts.map +0 -1
  363. package/dist/shared/dynamodb/backoff.js +0 -48
  364. package/dist/shared/dynamodb/backoff.js.map +0 -1
  365. package/dist/shared/dynamodb/batch-write.d.ts.map +0 -1
  366. package/dist/shared/dynamodb/batch-write.js.map +0 -1
  367. package/dist/shared/dynamodb/cancellation.d.ts.map +0 -1
  368. package/dist/shared/dynamodb/cancellation.js.map +0 -1
  369. package/dist/shared/dynamodb/client.d.ts.map +0 -1
  370. package/dist/shared/dynamodb/client.js.map +0 -1
  371. package/dist/shared/dynamodb/conditional-put.d.ts +0 -51
  372. package/dist/shared/dynamodb/conditional-put.d.ts.map +0 -1
  373. package/dist/shared/dynamodb/conditional-put.js +0 -59
  374. package/dist/shared/dynamodb/conditional-put.js.map +0 -1
  375. package/dist/shared/dynamodb/drain-unprocessed.d.ts +0 -19
  376. package/dist/shared/dynamodb/drain-unprocessed.d.ts.map +0 -1
  377. package/dist/shared/dynamodb/drain-unprocessed.js +0 -44
  378. package/dist/shared/dynamodb/drain-unprocessed.js.map +0 -1
  379. package/dist/shared/dynamodb/paginate-core.d.ts +0 -22
  380. package/dist/shared/dynamodb/paginate-core.d.ts.map +0 -1
  381. package/dist/shared/dynamodb/paginate-core.js +0 -52
  382. package/dist/shared/dynamodb/paginate-core.js.map +0 -1
  383. package/dist/shared/dynamodb/paginate.d.ts.map +0 -1
  384. package/dist/shared/dynamodb/paginate.js.map +0 -1
  385. package/dist/shared/dynamodb/partition-delete.d.ts.map +0 -1
  386. package/dist/shared/dynamodb/partition-delete.js.map +0 -1
  387. package/dist/shared/dynamodb/retry-classifier.d.ts +0 -9
  388. package/dist/shared/dynamodb/retry-classifier.d.ts.map +0 -1
  389. package/dist/shared/dynamodb/retry-classifier.js +0 -87
  390. package/dist/shared/dynamodb/retry-classifier.js.map +0 -1
  391. package/dist/shared/dynamodb/retry.d.ts.map +0 -1
  392. package/dist/shared/dynamodb/retry.js.map +0 -1
  393. package/dist/shared/dynamodb/scan.d.ts +0 -15
  394. package/dist/shared/dynamodb/scan.d.ts.map +0 -1
  395. package/dist/shared/dynamodb/scan.js +0 -20
  396. package/dist/shared/dynamodb/scan.js.map +0 -1
  397. package/dist/shared/dynamodb/types.d.ts +0 -24
  398. package/dist/shared/dynamodb/types.d.ts.map +0 -1
  399. package/dist/shared/dynamodb/types.js +0 -3
  400. package/dist/shared/dynamodb/types.js.map +0 -1
  401. package/dist/shared/errors/base-error.d.ts.map +0 -1
  402. package/dist/shared/errors/base-error.js.map +0 -1
  403. package/dist/shared/errors/error-code.d.ts.map +0 -1
  404. package/dist/shared/errors/error-code.js.map +0 -1
  405. package/dist/shared/errors/errors.d.ts.map +0 -1
  406. package/dist/shared/errors/errors.js.map +0 -1
  407. package/dist/shared/errors/wrap-error.d.ts +0 -16
  408. package/dist/shared/errors/wrap-error.d.ts.map +0 -1
  409. package/dist/shared/errors/wrap-error.js +0 -30
  410. package/dist/shared/errors/wrap-error.js.map +0 -1
  411. package/dist/shared/logging/logger.d.ts.map +0 -1
  412. package/dist/shared/logging/logger.js.map +0 -1
  413. package/dist/shared/logging/redaction-walk.d.ts +0 -23
  414. package/dist/shared/logging/redaction-walk.d.ts.map +0 -1
  415. package/dist/shared/logging/redaction-walk.js +0 -92
  416. package/dist/shared/logging/redaction-walk.js.map +0 -1
  417. package/dist/shared/logging/redaction.d.ts.map +0 -1
  418. package/dist/shared/logging/redaction.js.map +0 -1
  419. package/dist/shared/logging/secret-patterns.d.ts.map +0 -1
  420. package/dist/shared/logging/secret-patterns.js.map +0 -1
  421. package/dist/shared/options.d.ts.map +0 -1
  422. package/dist/shared/options.js.map +0 -1
  423. package/dist/shared/ulid.d.ts.map +0 -1
  424. package/dist/shared/ulid.js.map +0 -1
  425. package/dist/shared/validation/primitives.d.ts.map +0 -1
  426. package/dist/shared/validation/primitives.js.map +0 -1
  427. package/dist/shared/validation/ttl.d.ts.map +0 -1
  428. package/dist/shared/validation/ttl.js.map +0 -1
  429. package/dist/store/actions/get.d.ts +0 -5
  430. package/dist/store/actions/get.d.ts.map +0 -1
  431. package/dist/store/actions/get.js +0 -35
  432. package/dist/store/actions/get.js.map +0 -1
  433. package/dist/store/actions/list-namespaces.d.ts.map +0 -1
  434. package/dist/store/actions/list-namespaces.js.map +0 -1
  435. package/dist/store/actions/put.d.ts.map +0 -1
  436. package/dist/store/actions/put.js.map +0 -1
  437. package/dist/store/actions/reconcile-vector-index.d.ts.map +0 -1
  438. package/dist/store/actions/reconcile-vector-index.js.map +0 -1
  439. package/dist/store/actions/search.d.ts.map +0 -1
  440. package/dist/store/actions/search.js.map +0 -1
  441. package/dist/store/internal/backend-search.d.ts +0 -5
  442. package/dist/store/internal/backend-search.d.ts.map +0 -1
  443. package/dist/store/internal/backend-search.js +0 -68
  444. package/dist/store/internal/backend-search.js.map +0 -1
  445. package/dist/store/internal/filter.d.ts.map +0 -1
  446. package/dist/store/internal/filter.js.map +0 -1
  447. package/dist/store/internal/index-reconcile.d.ts +0 -22
  448. package/dist/store/internal/index-reconcile.d.ts.map +0 -1
  449. package/dist/store/internal/index-reconcile.js +0 -105
  450. package/dist/store/internal/index-reconcile.js.map +0 -1
  451. package/dist/store/internal/index-sync.d.ts +0 -11
  452. package/dist/store/internal/index-sync.d.ts.map +0 -1
  453. package/dist/store/internal/index-sync.js +0 -26
  454. package/dist/store/internal/index-sync.js.map +0 -1
  455. package/dist/store/internal/item-mapper.d.ts +0 -25
  456. package/dist/store/internal/item-mapper.d.ts.map +0 -1
  457. package/dist/store/internal/item-mapper.js +0 -53
  458. package/dist/store/internal/item-mapper.js.map +0 -1
  459. package/dist/store/internal/keys.d.ts +0 -18
  460. package/dist/store/internal/keys.d.ts.map +0 -1
  461. package/dist/store/internal/keys.js +0 -42
  462. package/dist/store/internal/keys.js.map +0 -1
  463. package/dist/store/internal/namespace-match.d.ts +0 -12
  464. package/dist/store/internal/namespace-match.d.ts.map +0 -1
  465. package/dist/store/internal/namespace-match.js +0 -41
  466. package/dist/store/internal/namespace-match.js.map +0 -1
  467. package/dist/store/internal/overwrite-swap.d.ts +0 -33
  468. package/dist/store/internal/overwrite-swap.d.ts.map +0 -1
  469. package/dist/store/internal/overwrite-swap.js +0 -62
  470. package/dist/store/internal/overwrite-swap.js.map +0 -1
  471. package/dist/store/internal/persist.d.ts +0 -27
  472. package/dist/store/internal/persist.d.ts.map +0 -1
  473. package/dist/store/internal/persist.js +0 -59
  474. package/dist/store/internal/persist.js.map +0 -1
  475. package/dist/store/internal/query.d.ts +0 -6
  476. package/dist/store/internal/query.d.ts.map +0 -1
  477. package/dist/store/internal/query.js +0 -32
  478. package/dist/store/internal/query.js.map +0 -1
  479. package/dist/store/internal/ranker.d.ts +0 -13
  480. package/dist/store/internal/ranker.d.ts.map +0 -1
  481. package/dist/store/internal/ranker.js +0 -31
  482. package/dist/store/internal/ranker.js.map +0 -1
  483. package/dist/store/internal/read-existing.d.ts +0 -19
  484. package/dist/store/internal/read-existing.d.ts.map +0 -1
  485. package/dist/store/internal/read-existing.js +0 -29
  486. package/dist/store/internal/read-existing.js.map +0 -1
  487. package/dist/store/internal/score-direction.d.ts +0 -32
  488. package/dist/store/internal/score-direction.d.ts.map +0 -1
  489. package/dist/store/internal/score-direction.js +0 -39
  490. package/dist/store/internal/score-direction.js.map +0 -1
  491. package/dist/store/internal/search-filter.d.ts +0 -4
  492. package/dist/store/internal/search-filter.d.ts.map +0 -1
  493. package/dist/store/internal/search-filter.js +0 -11
  494. package/dist/store/internal/search-filter.js.map +0 -1
  495. package/dist/store/internal/semantic-search.d.ts.map +0 -1
  496. package/dist/store/internal/semantic-search.js.map +0 -1
  497. package/dist/store/internal/setup.d.ts.map +0 -1
  498. package/dist/store/internal/setup.js.map +0 -1
  499. package/dist/store/internal/validation.d.ts +0 -13
  500. package/dist/store/internal/validation.d.ts.map +0 -1
  501. package/dist/store/internal/validation.js +0 -35
  502. package/dist/store/internal/validation.js.map +0 -1
  503. package/dist/store/internal/write-verify.d.ts +0 -37
  504. package/dist/store/internal/write-verify.d.ts.map +0 -1
  505. package/dist/store/internal/write-verify.js +0 -68
  506. package/dist/store/internal/write-verify.js.map +0 -1
  507. package/dist/store/store.d.ts.map +0 -1
  508. package/dist/store/store.js.map +0 -1
  509. package/dist/store/types.d.ts.map +0 -1
  510. package/dist/store/types.js.map +0 -1
  511. package/dist/store/vector-backend.d.ts.map +0 -1
  512. package/dist/store/vector-backend.js.map +0 -1
@@ -1,44 +1,441 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides how a value becomes a stored payload and back.
4
+ *
5
+ * A value is serialized by the configured serde, gzipped when that pays, and
6
+ * kept inline in its row or offloaded to S3 under a key its row can be traced
7
+ * from, behind a versioned descriptor the row stores. Reading reverses that,
8
+ * and a failure that means the payload can never be read again — a corrupt
9
+ * body, a missing object, a descriptor no reader understands — is told apart
10
+ * here from one a retry might cure.
11
+ */
2
12
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PayloadLocation = void 0;
4
- exports.encodePayload = encodePayload;
13
+ exports.DESCRIPTOR_SCHEMA_VERSION = exports.PayloadLocation = exports.MAX_INLINE_PAYLOAD_BYTES = void 0;
14
+ exports.codecDepsOf = codecDepsOf;
15
+ exports.readPayloadBytes = readPayloadBytes;
16
+ exports.loadPayloadValue = loadPayloadValue;
5
17
  exports.decodePayload = decodePayload;
18
+ exports.encodePayload = encodePayload;
19
+ exports.collectS3Keys = collectS3Keys;
20
+ exports.isMissingObjectError = isMissingObjectError;
21
+ exports.isPermanentPayloadLoss = isPermanentPayloadLoss;
22
+ const base_error_1 = require("../errors/base-error");
23
+ const classify_1 = require("../errors/classify");
24
+ const error_code_1 = require("../errors/error-code");
25
+ const errors_1 = require("../errors/errors");
26
+ const truncate_1 = require("../logging/truncate");
6
27
  const compression_1 = require("./compression");
28
+ const json_serde_1 = require("./json-serde");
29
+ /**
30
+ * Largest serialized payload stored inline when no S3 offloader is configured:
31
+ * DynamoDB's 400 KB item cap less 8 KB of headroom for the item's keys,
32
+ * attribute names and descriptor fields. Exceeding it fails before the write
33
+ * with a typed error instead of a raw `ValidationException` after it.
34
+ */
35
+ exports.MAX_INLINE_PAYLOAD_BYTES = 400 * 1024 - 8 * 1024;
7
36
  /** Where an encoded payload lives. */
8
37
  var PayloadLocation;
9
38
  (function (PayloadLocation) {
10
39
  PayloadLocation["INLINE"] = "INLINE";
11
40
  PayloadLocation["S3"] = "S3";
12
41
  })(PayloadLocation || (exports.PayloadLocation = PayloadLocation = {}));
13
- function requireOffloader(deps) {
42
+ /**
43
+ * Version of the persisted descriptor shape. Absent on rows written before it
44
+ * existed, which read as version 1; a higher value marks a row written by a
45
+ * newer library and is refused rather than misread.
46
+ */
47
+ exports.DESCRIPTOR_SCHEMA_VERSION = 1;
48
+ /**
49
+ * The codec collaborators an adapter context carries, with a call's signal.
50
+ *
51
+ * Accepts: `source` — the adapter's serde, compression and offloader.
52
+ * `signal` — the call's cancellation, carried into the S3 request a payload
53
+ * needs.
54
+ *
55
+ * Returns: the collaborators the codec takes.
56
+ *
57
+ * Throws: nothing.
58
+ */
59
+ function codecDepsOf(source, signal) {
60
+ return {
61
+ serde: source.serde,
62
+ compression: source.compression,
63
+ offloader: source.offloader,
64
+ signal,
65
+ };
66
+ }
67
+ function configuredOffloader(deps) {
14
68
  if (!deps.offloader) {
15
- throw new Error('Cannot decode an S3 payload without an offloader');
69
+ throw (0, errors_1.validationError)("this row's payload is offloaded to S3 but the adapter has no `s3` configuration; " +
70
+ 'configure the bucket the writer used', 's3');
16
71
  }
17
72
  return deps.offloader;
18
73
  }
19
74
  /**
20
- * Encode `value`: serialize via serde, compress (if configured), then offload
21
- * to S3 when the compressed bytes exceed the offloader's threshold. Returns a
22
- * descriptor recording how to read it back.
75
+ * Refuse a descriptor this version cannot read: one that is not an object at
76
+ * all, one whose schema is newer, or one whose location is unknown. A row can
77
+ * hold anything its writer stored, and reading `.schemaVersion` off `null`
78
+ * raised a raw `TypeError` out of a public method.
79
+ *
80
+ * The newer schema is the one of the three that is **not** the payload's own
81
+ * fault, and it is coded apart from the other two for that reason. A descriptor
82
+ * that is not an object, and one naming a location no release ever wrote at
83
+ * this schema, condemn themselves: no upgrade and no configuration makes those
84
+ * bytes readable, so a reader may write them off. A forward `schemaVersion`
85
+ * says the opposite — the payload is intact and the release that wrote it reads
86
+ * it perfectly — so it is `FORMAT_UNSUPPORTED`, exactly as a forward `v` on the
87
+ * row around it is, naming the attribute that carried the version. Sharing the
88
+ * `descriptor` field put it in the permanent-loss bucket, where history's
89
+ * default `skip` silently dropped during a rollback or a canary the very turns
90
+ * the store and the saver refused to serve.
91
+ *
92
+ * Both of the values these messages quote come off the row, so both go through
93
+ * `truncateForLog`. The version is declared a number and the comparison
94
+ * coerces, so a row carrying a thousand digits as a string passes it and
95
+ * reaches the message; the location is quoted as JSON, which a row can make
96
+ * any length at all.
97
+ */
98
+ function assertReadableDescriptor(descriptor) {
99
+ if (descriptor === null || typeof descriptor !== 'object') {
100
+ throw (0, errors_1.validationError)(`payload descriptor is ${descriptor === null ? 'null' : typeof descriptor}, not a descriptor ` +
101
+ 'this library wrote', 'descriptor');
102
+ }
103
+ const version = descriptor.schemaVersion ?? exports.DESCRIPTOR_SCHEMA_VERSION;
104
+ if (version > exports.DESCRIPTOR_SCHEMA_VERSION) {
105
+ // Declared a number, read off a row, and the comparison coerces a string.
106
+ const written = (0, truncate_1.truncateForLog)(String(version));
107
+ throw new base_error_1.DynamoDBLangGraphError(`this payload was written in descriptor schema version ${written}; this version of the ` +
108
+ `library reads up to ${exports.DESCRIPTOR_SCHEMA_VERSION} — upgrade to read it`, error_code_1.ErrorCode.FORMAT_UNSUPPORTED, { field: 'schemaVersion' });
109
+ }
110
+ const locations = Object.values(PayloadLocation);
111
+ if (!locations.includes(descriptor.location)) {
112
+ // The location is whatever the row holds, and the row is what this refuses.
113
+ const location = (0, truncate_1.truncateForLog)(String(JSON.stringify(descriptor.location)));
114
+ throw (0, errors_1.validationError)(`payload descriptor has an unknown location ${location}`, 'descriptor');
115
+ }
116
+ }
117
+ /**
118
+ * The payload bytes a descriptor stands for: downloaded when offloaded, then
119
+ * decompressed. Infrastructure only, no deserialization — a caller that needs
120
+ * to tell a transport or permission failure from bad data does this step and
121
+ * {@link loadPayloadValue} separately (see
122
+ * `src/history/actions/get-messages.ts`).
123
+ *
124
+ * Accepts: `descriptor` — as written by {@link encodePayload}; a
125
+ * `schemaVersion` above this release's, or a `location` it does not know, is
126
+ * refused rather than guessed at. `deps.offloader` — required only for an `S3`
127
+ * descriptor. `scope` — the row's own leading key parts (`[threadId]`,
128
+ * `[...namespace, key]`, `[sessionId]`); `[]` degrades the check to the
129
+ * configured prefix. `deps.signal` — cancels the download of an offloaded
130
+ * payload, request and all; an inline one reads no bytes and ignores it.
131
+ *
132
+ * Returns: the decoded bytes.
133
+ *
134
+ * Throws: `VALIDATION` naming `descriptor` for a shape no reader could
135
+ * make sense of and `s3` for an offloaded row with no offloader configured;
136
+ * `FORMAT_UNSUPPORTED` naming `schemaVersion` for a payload a newer release
137
+ * wrote, which a newer reader reads fine; `VALIDATION` naming `s3Key` when
138
+ * the key lies outside `scope`; `ABORTED` when the signal fires during the
139
+ * download; `S3_OFFLOAD_FAILED` from the download; `COMPRESSION_LIMIT` or
140
+ * `PAYLOAD_CORRUPT` from decompression.
141
+ *
142
+ * Guarantees: an offloaded object is downloaded only when its key lies under
143
+ * the path `scope` produces, so a row can never point this adapter at an
144
+ * object it does not own.
145
+ */
146
+ async function readPayloadBytes(descriptor, deps, scope) {
147
+ assertReadableDescriptor(descriptor);
148
+ let raw;
149
+ if (descriptor.location === PayloadLocation.S3) {
150
+ const offloader = configuredOffloader(deps);
151
+ offloader.assertOwnedKey(descriptor.s3Key, scope);
152
+ raw = await offloader.download(descriptor.s3Key, deps.signal);
153
+ }
154
+ else {
155
+ raw = descriptor.bytes;
156
+ }
157
+ return (0, compression_1.decompress)(raw, descriptor.compressed, deps.compression?.maxDecompressedBytes);
158
+ }
159
+ /**
160
+ * The value stored bytes hold, with a serde that refuses them branded rather
161
+ * than left bare.
162
+ *
163
+ * Accepts: `serdeType` — the row's own, handed to the serde unchanged, and the
164
+ * declared form {@link bytesHoldDeclaredForm} checks the bytes against.
165
+ * `bytes` — what {@link readPayloadBytes} returned. `deps.serde` — the
166
+ * serializer the adapter was configured with, which may be the caller's.
167
+ *
168
+ * Returns: whatever the serde reconstructs, typed as the caller declares.
169
+ *
170
+ * Throws: the serde's own error whenever it is already one of this library's,
171
+ * so `PAYLOAD_CORRUPT` from `JSON_SERDE` stays exactly what it was — as does
172
+ * its refusal of a `serdeType` it has no grammar for, which it brands the same
173
+ * `VALIDATION` naming `serde` that the classifier below reaches for on the
174
+ * identical row under any other serde; `PAYLOAD_CORRUPT` when the bytes are no
175
+ * longer the form the row declares, on whatever serde raised it; anything else
176
+ * as a `VALIDATION` error naming `serde`, carrying the refusal as `cause`.
177
+ *
178
+ * Guarantees: no error leaves a decode unbranded, and which serde the adapter
179
+ * was configured with never decides *which* brand. A rotted row read through
180
+ * `JSON_SERDE` reported `PAYLOAD_CORRUPT` while the identical row read through
181
+ * the checkpointer's own default reported the refusal below, so a caller
182
+ * quarantining on `PAYLOAD_CORRUPT` never matched and `history.getMessages`
183
+ * lost a whole conversation where it promises one dropped message. A row
184
+ * declaring a form neither serde writes ran the same divergence the other way,
185
+ * and reached further: `JSON_SERDE` ignored the declared type, so its own
186
+ * `JSON.parse` failure arrived here already branded and the classifier was
187
+ * never consulted. The serializer honours the declared form now, which is what
188
+ * keeps this the one place the distinction is drawn.
189
+ *
190
+ * The refusal is what remains once the bytes are known to be intact: the
191
+ * serializer would not reconstruct the value they name. A stored `lc`
192
+ * constructor record naming a class outside LangChain's allow-list is refused
193
+ * by `load()` with a plain `Error`, which a public boundary could only rebrand
194
+ * as an `UNEXPECTED_ERROR` — reporting a row's own content to the caller as an AWS
195
+ * failure. It is deliberately *not* classified as payload loss, for
196
+ * `assertKeyInScope`'s reason rather than `PAYLOAD_CORRUPT`'s: the bytes are
197
+ * undamaged and parse, and which classes revive is a property of **this**
198
+ * reader — the serde it was given, and what that serde's allow-list carries —
199
+ * not of the payload. A refusal that says only "this reader may not
200
+ * reconstruct that" is a misconfigured serde or a planted row, both of which an
201
+ * operator must see; writing it off would let `history.getMessages` answer with
202
+ * a silently shorter conversation for the one row shape most worth noticing.
203
+ */
204
+ async function loadPayloadValue(serdeType, bytes, deps) {
205
+ try {
206
+ return await deps.serde.loadsTyped(serdeType, bytes);
207
+ }
208
+ catch (error) {
209
+ const refusal = (0, base_error_1.toError)(error);
210
+ if ((0, base_error_1.isDynamoDBLangGraphError)(refusal))
211
+ throw refusal;
212
+ if (!(0, json_serde_1.bytesHoldDeclaredForm)(serdeType, bytes)) {
213
+ throw new base_error_1.DynamoDBLangGraphError('the stored payload is no longer the form this row declares, so no serde could decode ' +
214
+ 'it; the refusal that proved it is attached as `cause`', error_code_1.ErrorCode.PAYLOAD_CORRUPT, {}, refusal);
215
+ }
216
+ throw (0, errors_1.validationError)('the configured serde refused the payload stored in this row: the bytes parse, but the ' +
217
+ 'serializer would not reconstruct the value they name — a stored `lc` constructor record ' +
218
+ 'naming a class outside its allow-list reads this way, as does a serde that did not ' +
219
+ 'write these bytes. The refusal itself is attached as `cause`', 'serde', refusal);
220
+ }
221
+ }
222
+ /**
223
+ * The value a descriptor stands for: {@link readPayloadBytes} followed by
224
+ * {@link loadPayloadValue}.
225
+ *
226
+ * Accepts: as {@link readPayloadBytes}; `scope` has the same meaning.
227
+ *
228
+ * Returns: whatever the serde reconstructs, typed as the caller declares.
229
+ *
230
+ * Throws: everything {@link readPayloadBytes} throws, plus everything
231
+ * {@link loadPayloadValue} throws for bytes the serde will not accept —
232
+ * `PAYLOAD_CORRUPT` for bytes that are no longer the form the row declares,
233
+ * whichever serde is configured, `VALIDATION` naming `serde` for a refusal
234
+ * of bytes that are still intact.
235
+ *
236
+ * Guarantees: the bytes are read first, in a statement of their own. Passing
237
+ * `descriptor.serdeType` and the awaited read as two arguments to one call read
238
+ * the property *before* the guard ran, since arguments evaluate left to right —
239
+ * so a row whose payload is `null` raised a bare `TypeError` carrying no code,
240
+ * which a public boundary can only rebrand as an `UNEXPECTED_ERROR`. Every read
241
+ * path now answers such a row with the `VALIDATION` error naming `descriptor` that
242
+ * the history adapter, which reads its bytes separately, already produced.
243
+ */
244
+ async function decodePayload(descriptor, deps, scope) {
245
+ const bytes = await readPayloadBytes(descriptor, deps, scope);
246
+ return loadPayloadValue(descriptor.serdeType, bytes, deps);
247
+ }
248
+ /**
249
+ * Reject bytes that cannot be stored inline. Without an offloader the only
250
+ * alternative is a raw `ValidationException` from DynamoDB after the network
251
+ * round trip, which names neither the cause nor the remedy.
252
+ */
253
+ function assertInlinePayloadFits(bytes, deps) {
254
+ if (bytes.length <= exports.MAX_INLINE_PAYLOAD_BYTES)
255
+ return;
256
+ const hint = deps.compression?.enabled
257
+ ? ''
258
+ : ', or enable compression if the data compresses well';
259
+ throw (0, errors_1.validationError)(`payload of ${bytes.length} bytes exceeds the ${exports.MAX_INLINE_PAYLOAD_BYTES}-byte inline limit ` +
260
+ `(DynamoDB items are capped at 400 KB); configure s3 offloading${hint}`, 'payload');
261
+ }
262
+ /**
263
+ * Reject a value the serde turned into no bytes at all. Zero bytes is not a
264
+ * small payload: it is not a document in any format a reader can parse, so the
265
+ * row is written happily and every later read of it fails. Checked before
266
+ * compression, so an inline and an offloaded payload are refused identically
267
+ * and nothing is uploaded for a payload no reader could ever use.
268
+ *
269
+ * What reaches it under the default `JsonPlusSerializer` is a value that is
270
+ * *itself* a function or a symbol. A bare `undefined` is not one of them — it
271
+ * encodes to a 27-byte marker — and neither is a function or symbol nested in
272
+ * an object or an array, which is dropped from the document instead of
273
+ * emptying it, silently and out of this check's sight.
274
+ *
275
+ * The rule binds every serde, not only the defaults. A `serde` whose encoding
276
+ * of some legitimate value is genuinely empty — a message format whose empty
277
+ * message is zero bytes — cannot store that value through this package, and
278
+ * would have to give it a byte of its own.
279
+ */
280
+ function assertSerialisedToBytes(raw) {
281
+ if (raw.length > 0)
282
+ return;
283
+ throw (0, errors_1.validationError)('value serialises to zero bytes, which no reader can parse back: a function, a symbol ' +
284
+ 'or any value the configured serde drops encodes to nothing. Store a value the serde ' +
285
+ 'can represent, or configure one that refuses it.', 'value');
286
+ }
287
+ /**
288
+ * The descriptor recording how to read `value` back: serialized, compressed if
289
+ * configured, and offloaded to S3 if large enough.
290
+ *
291
+ * Accepts: `value` — anything the serde can represent as at least one byte;
292
+ * what it cannot represent is the serde's own error, and what it represents as
293
+ * nothing is refused here (see {@link assertSerialisedToBytes}), whichever
294
+ * serde is configured. `deps.compression` — absent or `enabled: false` stores the
295
+ * serialized bytes as they are. `deps.offloader` — absent stores every payload
296
+ * inline. `deps.signal` — cancels the upload of an offloaded payload; an
297
+ * inline one is never sent anywhere and ignores it. `options` — the row's
298
+ * identity, the write's object id and the row's DynamoDB key (see
299
+ * {@link EncodeOptions}).
300
+ *
301
+ * Returns: an `S3` descriptor when an offloader is configured and
302
+ * `shouldOffload` accepts the compressed size, otherwise an `INLINE`
303
+ * descriptor carrying the bytes. Both record `serdeType` and `compressed`, so
304
+ * neither is ever inferred from the bytes on read.
305
+ *
306
+ * Throws: whatever `serde.dumpsTyped` throws; `ABORTED` when the signal
307
+ * fires during the upload; `S3_OFFLOAD_FAILED` from the upload; and two
308
+ * distinguishable `VALIDATION` errors. One names `payload` — the bytes are too
309
+ * large to store inline — and is raised only when there is **no** offloader
310
+ * and they exceed `MAX_INLINE_PAYLOAD_BYTES`. With an offloader that
311
+ * cell cannot arise: `s3.thresholdBytes` is itself capped at that limit
312
+ * (`src/shared/validation/options.ts`, `assertS3`), so bytes too large
313
+ * to store inline are always at or above the threshold and offload instead.
314
+ * The other names `value` — it serialises to nothing (see
315
+ * {@link assertSerialisedToBytes}) — and is raised for an offloaded payload
316
+ * and an inline one alike, before either is stored.
23
317
  */
24
318
  async function encodePayload(value, deps, options) {
25
319
  const [serdeType, raw] = await deps.serde.dumpsTyped(value);
320
+ assertSerialisedToBytes(raw);
26
321
  const { bytes, compressed } = deps.compression
27
322
  ? await (0, compression_1.compress)(raw, deps.compression)
28
323
  : { bytes: raw, compressed: false };
324
+ // `writeId` is set here rather than at each call site so both descriptor
325
+ // kinds and every adapter inherit one identity from one statement. It does
326
+ // not raise `DESCRIPTOR_SCHEMA_VERSION`: the version is refused by a reader
327
+ // that is older than it, and this field is additive and ignorable, so
328
+ // announcing it would cost readability of these rows for nothing.
329
+ const base = {
330
+ schemaVersion: exports.DESCRIPTOR_SCHEMA_VERSION,
331
+ serdeType,
332
+ compressed,
333
+ writeId: options.objectId,
334
+ };
29
335
  if (deps.offloader && deps.offloader.shouldOffload(bytes)) {
30
- const s3Key = deps.offloader.buildKey(options.keyParts);
31
- await deps.offloader.upload(s3Key, bytes);
32
- return { location: PayloadLocation.S3, serdeType, compressed, s3Key };
336
+ const s3Key = deps.offloader.buildKey(options.keyParts, options.objectId);
337
+ await deps.offloader.upload(s3Key, bytes, options.row, deps.signal);
338
+ return { ...base, location: PayloadLocation.S3, s3Key };
33
339
  }
34
- return { location: PayloadLocation.INLINE, serdeType, compressed, bytes };
340
+ if (!deps.offloader)
341
+ assertInlinePayloadFits(bytes, deps);
342
+ return { ...base, location: PayloadLocation.INLINE, bytes };
35
343
  }
36
- /** Decode a {@link PayloadDescriptor} produced by {@link encodePayload}. */
37
- async function decodePayload(descriptor, deps) {
38
- const raw = descriptor.location === PayloadLocation.S3
39
- ? await requireOffloader(deps).download(descriptor.s3Key)
40
- : descriptor.bytes;
41
- const bytes = await (0, compression_1.decompress)(raw, descriptor.compressed, deps.compression?.maxDecompressedBytes);
42
- return deps.serde.loadsTyped(descriptor.serdeType, bytes);
344
+ /**
345
+ * The S3 keys of whichever descriptors are offloaded.
346
+ *
347
+ * Accepts: `descriptors` — any mix of inline and offloaded, including a
348
+ * projection that carries only `location` and `s3Key`, and including none. An
349
+ * offloaded descriptor missing its key is skipped rather than deleted blindly,
350
+ * and so is an entry that is not a descriptor at all: several callers read
351
+ * these straight off a row, and a row this library did not write can hold
352
+ * `null` where the descriptor belongs, or omit the attribute entirely. Widening
353
+ * the parameter rather than making each caller filter is what lets the `Throws`
354
+ * clause below hold for every caller instead of only the careful ones.
355
+ *
356
+ * Returns: the keys, in the order given; an inline payload contributes none,
357
+ * and neither does an absent one.
358
+ *
359
+ * Throws: nothing — this feeds cleanup, which must not fail the operation it
360
+ * follows.
361
+ */
362
+ function collectS3Keys(descriptors) {
363
+ const keys = [];
364
+ for (const descriptor of descriptors) {
365
+ if (descriptor?.location === PayloadLocation.S3 && descriptor.s3Key !== undefined) {
366
+ keys.push(descriptor.s3Key);
367
+ }
368
+ }
369
+ return keys;
370
+ }
371
+ /**
372
+ * True when an offloaded object no longer exists.
373
+ *
374
+ * Accepts: `error` — any error; only `S3_OFFLOAD_FAILED` carrying a `NoSuchKey`
375
+ * cause matches. An error with no `cause`, or one whose cause names another
376
+ * S3 failure, is not a missing object. Anything else a `throw` can produce —
377
+ * `null`, `undefined`, a primitive — carries no code and is not one either.
378
+ *
379
+ * Returns: whether the object is gone — a lifecycle sweep removed it, or a
380
+ * competing overwrite deleted it between a row read and the download.
381
+ *
382
+ * Throws: **nothing**, for any value. A caught value that cannot carry a
383
+ * property answers `false`, as `isDynamoDBLangGraphError` does, rather than
384
+ * raising a `TypeError` inside the `catch` that is reporting the download
385
+ * failure this test exists to classify.
386
+ */
387
+ function isMissingObjectError(error) {
388
+ return ((0, base_error_1.hasErrorCode)(error, error_code_1.ErrorCode.S3_OFFLOAD_FAILED) &&
389
+ error.cause !== undefined &&
390
+ (0, classify_1.isMissingObject)(error.cause));
391
+ }
392
+ /**
393
+ * True when a row's payload descriptor is not one *any* reader could make sense
394
+ * of: it is absent, it is not an object, or it names a location no release of
395
+ * this library ever wrote at the schema it declares. The row condemns its own
396
+ * payload — no retry and no configuration change makes those bytes readable,
397
+ * and no other reader would fare better.
398
+ *
399
+ * Two refusals from the same guard are deliberately *not* matched here, both
400
+ * because the sentence above would be false of them. A `VALIDATION` error naming
401
+ * `s3Key` says the reader may not follow the key, not that the payload is
402
+ * unreadable (see `assertKeyInScope`). A `FORMAT_UNSUPPORTED` naming
403
+ * `schemaVersion` says the payload was written by a newer release — which reads
404
+ * it perfectly — so it is the one descriptor refusal a newer reader *does* fare
405
+ * better on, and writing it off silently dropped turns during a rollback or a
406
+ * canary (see `assertReadableDescriptor`).
407
+ */
408
+ function isUnreadableDescriptor(error) {
409
+ return (0, base_error_1.hasErrorCode)(error, error_code_1.ErrorCode.VALIDATION) && error.context.field === 'descriptor';
410
+ }
411
+ /**
412
+ * True when a payload can never be read again, as opposed to a failure that may
413
+ * succeed on retry or after a configuration fix (throttling, network,
414
+ * permissions).
415
+ *
416
+ * Accepts: `error` — any error. Permanent are: its object is gone
417
+ * ({@link isMissingObjectError}), its bytes are not the form the row declares
418
+ * (`PAYLOAD_CORRUPT`), it trips the decompression guard (`COMPRESSION_LIMIT`),
419
+ * or the row's own descriptor is unreadable ({@link isUnreadableDescriptor}).
420
+ * Everything else is false, including an error that carries no code at all, and
421
+ * including three refusals that look like loss and are not. The `s3Key` scope
422
+ * refusal: a row pointing outside its own path is a configuration or tenancy
423
+ * fault to report, not a payload to write off. The `serde` refusal, on the same
424
+ * reasoning: the bytes are checked against the form the row declares before
425
+ * that code is chosen, so reaching it means they are undamaged and a serializer
426
+ * declining to reconstruct the class they name says what *this* reader may do,
427
+ * not what the payload is (see `loadPayloadValue`). And `FORMAT_UNSUPPORTED`,
428
+ * on a row or on a payload: newer is not lost.
429
+ *
430
+ * Returns: whether a caller should report rather than retry.
431
+ *
432
+ * Throws: **nothing**, for any value a `throw` can produce. One that cannot
433
+ * carry a code is not permanent loss, which is the same answer an uncoded
434
+ * `Error` gets.
435
+ */
436
+ function isPermanentPayloadLoss(error) {
437
+ return ((0, base_error_1.hasErrorCode)(error, error_code_1.ErrorCode.COMPRESSION_LIMIT) ||
438
+ (0, base_error_1.hasErrorCode)(error, error_code_1.ErrorCode.PAYLOAD_CORRUPT) ||
439
+ isMissingObjectError(error) ||
440
+ isUnreadableDescriptor(error));
43
441
  }
44
- //# sourceMappingURL=codec.js.map
@@ -1,3 +1,18 @@
1
+ /**
2
+ * Hides whether a stored payload's bytes are gzipped.
3
+ *
4
+ * When gzip is attempted, when its output is not worth keeping, and how a read
5
+ * refuses a gzip bomb or a stream that is not gzip are decided here. A caller
6
+ * carries only the flag this module returns, recorded beside the bytes, so
7
+ * compression is never guessed from the bytes and the thresholds can change
8
+ * without touching the codec that stores them.
9
+ */
10
+ /** Default minimum payload size before gzip compression is attempted. */
11
+ export declare const DEFAULT_COMPRESSION_MIN_BYTES = 1024;
12
+ /** Default gzip compression level (balanced speed/ratio). */
13
+ export declare const DEFAULT_COMPRESSION_LEVEL = 6;
14
+ /** Default gzip-bomb guard: maximum decompressed output (50 MiB). */
15
+ export declare const DEFAULT_MAX_DECOMPRESSED_BYTES: number;
1
16
  /** Configuration for payload compression. */
2
17
  export interface CompressionConfig {
3
18
  enabled: boolean;
@@ -11,15 +26,36 @@ export interface CompressionResult {
11
26
  compressed: boolean;
12
27
  }
13
28
  /**
14
- * Gzip `data` when it is at least `minSizeBytes` and compression actually saves
15
- * space. Returns the bytes to store and a `compressed` flag the caller records
16
- * in the payload descriptor; compression is never inferred from the bytes.
29
+ * The bytes to store for `data`, gzipped when that is worth doing.
30
+ *
31
+ * Accepts: `data` — any length, including empty. `config.enabled` — `false`
32
+ * returns the input untouched. `config.minSizeBytes` — the size below which
33
+ * gzip is not attempted, default {@link DEFAULT_COMPRESSION_MIN_BYTES}.
34
+ * `config.level` — zlib level 0–9, default {@link DEFAULT_COMPRESSION_LEVEL}.
35
+ * `config.maxDecompressedBytes` is read on the way back, not here.
36
+ *
37
+ * Returns: `compressed: true` only when gzip beat the input by more than 10%;
38
+ * otherwise the input bytes and `compressed: false`. The flag is recorded in
39
+ * the payload descriptor, so compression is never inferred from the bytes on
40
+ * read.
41
+ *
42
+ * Throws: whatever `zlib.gzip` rejects with.
17
43
  */
18
44
  export declare function compress(data: Uint8Array, config: CompressionConfig): Promise<CompressionResult>;
19
45
  /**
20
- * Gunzip `data` when `compressed` is true; otherwise return it unchanged. Throws
21
- * a {@link DynamoDbLangGraphError} with code `COMPRESSION_LIMIT` if the output
22
- * would exceed `maxBytes` (bomb guard).
46
+ * The payload bytes `data` stands for, gunzipped when the row says so.
47
+ *
48
+ * Accepts: `data` — the bytes as stored. `compressed` — the descriptor's own
49
+ * flag; `false` returns `data` unchanged and inspects nothing. `maxBytes` — the
50
+ * decompressed-output cap, default {@link DEFAULT_MAX_DECOMPRESSED_BYTES}; a
51
+ * reader that configures no compression uses that default whatever the writer
52
+ * used.
53
+ *
54
+ * Returns: the decoded bytes.
55
+ *
56
+ * Throws: `COMPRESSION_LIMIT` when the output would exceed `maxBytes`, and
57
+ * `PAYLOAD_CORRUPT` when `compressed` is true but the bytes are not gzip. Both
58
+ * are permanent for that payload ({@link isPermanentPayloadLoss}), so a caller
59
+ * reports rather than retries.
23
60
  */
24
61
  export declare function decompress(data: Uint8Array, compressed: boolean, maxBytes?: number): Promise<Uint8Array>;
25
- //# sourceMappingURL=compression.d.ts.map
@@ -1,38 +1,79 @@
1
1
  "use strict";
2
+ /**
3
+ * Hides whether a stored payload's bytes are gzipped.
4
+ *
5
+ * When gzip is attempted, when its output is not worth keeping, and how a read
6
+ * refuses a gzip bomb or a stream that is not gzip are decided here. A caller
7
+ * carries only the flag this module returns, recorded beside the bytes, so
8
+ * compression is never guessed from the bytes and the thresholds can change
9
+ * without touching the codec that stores them.
10
+ */
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DEFAULT_MAX_DECOMPRESSED_BYTES = exports.DEFAULT_COMPRESSION_LEVEL = exports.DEFAULT_COMPRESSION_MIN_BYTES = void 0;
3
13
  exports.compress = compress;
4
14
  exports.decompress = decompress;
5
15
  const node_util_1 = require("node:util");
6
16
  const node_zlib_1 = require("node:zlib");
7
- const constants_1 = require("../constants");
8
17
  const base_error_1 = require("../errors/base-error");
9
18
  const error_code_1 = require("../errors/error-code");
10
19
  const gzipAsync = (0, node_util_1.promisify)(node_zlib_1.gzip);
11
20
  const gunzipAsync = (0, node_util_1.promisify)(node_zlib_1.gunzip);
12
21
  /** Minimum fraction of the original size the gzip output must beat to be kept. */
13
22
  const COMPRESSION_GAIN_RATIO = 0.9;
23
+ /** Default minimum payload size before gzip compression is attempted. */
24
+ exports.DEFAULT_COMPRESSION_MIN_BYTES = 1024;
25
+ /** Default gzip compression level (balanced speed/ratio). */
26
+ exports.DEFAULT_COMPRESSION_LEVEL = 6;
27
+ /** Default gzip-bomb guard: maximum decompressed output (50 MiB). */
28
+ exports.DEFAULT_MAX_DECOMPRESSED_BYTES = 50 * 1024 * 1024;
14
29
  /**
15
- * Gzip `data` when it is at least `minSizeBytes` and compression actually saves
16
- * space. Returns the bytes to store and a `compressed` flag the caller records
17
- * in the payload descriptor; compression is never inferred from the bytes.
30
+ * The bytes to store for `data`, gzipped when that is worth doing.
31
+ *
32
+ * Accepts: `data` — any length, including empty. `config.enabled` — `false`
33
+ * returns the input untouched. `config.minSizeBytes` — the size below which
34
+ * gzip is not attempted, default {@link DEFAULT_COMPRESSION_MIN_BYTES}.
35
+ * `config.level` — zlib level 0–9, default {@link DEFAULT_COMPRESSION_LEVEL}.
36
+ * `config.maxDecompressedBytes` is read on the way back, not here.
37
+ *
38
+ * Returns: `compressed: true` only when gzip beat the input by more than 10%;
39
+ * otherwise the input bytes and `compressed: false`. The flag is recorded in
40
+ * the payload descriptor, so compression is never inferred from the bytes on
41
+ * read.
42
+ *
43
+ * Throws: whatever `zlib.gzip` rejects with.
18
44
  */
19
45
  async function compress(data, config) {
20
- const minSize = config.minSizeBytes ?? constants_1.DEFAULT_COMPRESSION_MIN_BYTES;
46
+ const minSize = config.minSizeBytes ?? exports.DEFAULT_COMPRESSION_MIN_BYTES;
21
47
  if (!config.enabled || data.length < minSize)
22
48
  return { bytes: data, compressed: false };
23
- const level = config.level ?? constants_1.DEFAULT_COMPRESSION_LEVEL;
49
+ const level = config.level ?? exports.DEFAULT_COMPRESSION_LEVEL;
24
50
  const gzipped = new Uint8Array(await gzipAsync(data, { level }));
25
51
  if (gzipped.length >= data.length * COMPRESSION_GAIN_RATIO) {
26
52
  return { bytes: data, compressed: false };
27
53
  }
28
54
  return { bytes: gzipped, compressed: true };
29
55
  }
56
+ /** The error a payload raises when its bytes are not the form its row declares. */
57
+ function corruptPayload(cause) {
58
+ return new base_error_1.DynamoDBLangGraphError('the stored payload is marked compressed but is not valid gzip, so it cannot be decoded', error_code_1.ErrorCode.PAYLOAD_CORRUPT, {}, cause);
59
+ }
30
60
  /**
31
- * Gunzip `data` when `compressed` is true; otherwise return it unchanged. Throws
32
- * a {@link DynamoDbLangGraphError} with code `COMPRESSION_LIMIT` if the output
33
- * would exceed `maxBytes` (bomb guard).
61
+ * The payload bytes `data` stands for, gunzipped when the row says so.
62
+ *
63
+ * Accepts: `data` — the bytes as stored. `compressed` — the descriptor's own
64
+ * flag; `false` returns `data` unchanged and inspects nothing. `maxBytes` — the
65
+ * decompressed-output cap, default {@link DEFAULT_MAX_DECOMPRESSED_BYTES}; a
66
+ * reader that configures no compression uses that default whatever the writer
67
+ * used.
68
+ *
69
+ * Returns: the decoded bytes.
70
+ *
71
+ * Throws: `COMPRESSION_LIMIT` when the output would exceed `maxBytes`, and
72
+ * `PAYLOAD_CORRUPT` when `compressed` is true but the bytes are not gzip. Both
73
+ * are permanent for that payload ({@link isPermanentPayloadLoss}), so a caller
74
+ * reports rather than retries.
34
75
  */
35
- async function decompress(data, compressed, maxBytes = constants_1.DEFAULT_MAX_DECOMPRESSED_BYTES) {
76
+ async function decompress(data, compressed, maxBytes = exports.DEFAULT_MAX_DECOMPRESSED_BYTES) {
36
77
  if (!compressed)
37
78
  return data;
38
79
  try {
@@ -41,9 +82,8 @@ async function decompress(data, compressed, maxBytes = constants_1.DEFAULT_MAX_D
41
82
  catch (error) {
42
83
  const err = error;
43
84
  if (err.code === 'ERR_BUFFER_TOO_LARGE') {
44
- throw new base_error_1.DynamoDbLangGraphError(`Refusing to decompress: output would exceed ${maxBytes} bytes`, error_code_1.ErrorCode.COMPRESSION_LIMIT, {}, error);
85
+ throw new base_error_1.DynamoDBLangGraphError(`Refusing to decompress: output would exceed ${maxBytes} bytes`, error_code_1.ErrorCode.COMPRESSION_LIMIT, {}, error);
45
86
  }
46
- throw error;
87
+ throw corruptPayload(error);
47
88
  }
48
89
  }
49
- //# sourceMappingURL=compression.js.map