@farukada/aws-langgraph-dynamodb-ts 0.0.10 → 0.1.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 (134) hide show
  1. package/README.md +353 -242
  2. package/dist/checkpointer/actions/delete-thread.d.ts +3 -3
  3. package/dist/checkpointer/actions/delete-thread.d.ts.map +1 -1
  4. package/dist/checkpointer/actions/delete-thread.js +95 -52
  5. package/dist/checkpointer/actions/delete-thread.js.map +1 -1
  6. package/dist/checkpointer/actions/get-tuple.d.ts +8 -1
  7. package/dist/checkpointer/actions/get-tuple.d.ts.map +1 -1
  8. package/dist/checkpointer/actions/get-tuple.js +72 -20
  9. package/dist/checkpointer/actions/get-tuple.js.map +1 -1
  10. package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
  11. package/dist/checkpointer/actions/put-writes.js +27 -22
  12. package/dist/checkpointer/actions/put-writes.js.map +1 -1
  13. package/dist/checkpointer/actions/put.d.ts +6 -2
  14. package/dist/checkpointer/actions/put.d.ts.map +1 -1
  15. package/dist/checkpointer/actions/put.js +80 -19
  16. package/dist/checkpointer/actions/put.js.map +1 -1
  17. package/dist/checkpointer/index.d.ts +43 -2
  18. package/dist/checkpointer/index.d.ts.map +1 -1
  19. package/dist/checkpointer/index.js +226 -11
  20. package/dist/checkpointer/index.js.map +1 -1
  21. package/dist/checkpointer/types/index.d.ts +66 -4
  22. package/dist/checkpointer/types/index.d.ts.map +1 -1
  23. package/dist/checkpointer/types/index.js +10 -0
  24. package/dist/checkpointer/types/index.js.map +1 -1
  25. package/dist/checkpointer/utils/deserialization.d.ts +8 -3
  26. package/dist/checkpointer/utils/deserialization.d.ts.map +1 -1
  27. package/dist/checkpointer/utils/deserialization.js +23 -5
  28. package/dist/checkpointer/utils/deserialization.js.map +1 -1
  29. package/dist/checkpointer/utils/validation.d.ts +1 -1
  30. package/dist/checkpointer/utils/validation.js +1 -1
  31. package/dist/checkpointer/utils/validation.js.map +1 -1
  32. package/dist/factory.d.ts +8 -6
  33. package/dist/factory.d.ts.map +1 -1
  34. package/dist/factory.js +16 -4
  35. package/dist/factory.js.map +1 -1
  36. package/dist/history/actions/add-message.d.ts +2 -1
  37. package/dist/history/actions/add-message.d.ts.map +1 -1
  38. package/dist/history/actions/add-message.js +22 -18
  39. package/dist/history/actions/add-message.js.map +1 -1
  40. package/dist/history/actions/add-messages.d.ts +3 -2
  41. package/dist/history/actions/add-messages.d.ts.map +1 -1
  42. package/dist/history/actions/add-messages.js +30 -20
  43. package/dist/history/actions/add-messages.js.map +1 -1
  44. package/dist/history/actions/clear.d.ts +4 -3
  45. package/dist/history/actions/clear.d.ts.map +1 -1
  46. package/dist/history/actions/clear.js +47 -12
  47. package/dist/history/actions/clear.js.map +1 -1
  48. package/dist/history/actions/get-messages.d.ts +2 -1
  49. package/dist/history/actions/get-messages.d.ts.map +1 -1
  50. package/dist/history/actions/get-messages.js +41 -15
  51. package/dist/history/actions/get-messages.js.map +1 -1
  52. package/dist/history/actions/list-sessions.d.ts +11 -0
  53. package/dist/history/actions/list-sessions.d.ts.map +1 -1
  54. package/dist/history/actions/list-sessions.js +23 -3
  55. package/dist/history/actions/list-sessions.js.map +1 -1
  56. package/dist/history/index.d.ts +8 -0
  57. package/dist/history/index.d.ts.map +1 -1
  58. package/dist/history/index.js +22 -2
  59. package/dist/history/index.js.map +1 -1
  60. package/dist/history/types/index.d.ts +27 -5
  61. package/dist/history/types/index.d.ts.map +1 -1
  62. package/dist/history/types/index.js +1 -0
  63. package/dist/history/types/index.js.map +1 -1
  64. package/dist/history/utils/title-generator.js.map +1 -1
  65. package/dist/history/utils/update-expression-builder.d.ts +45 -21
  66. package/dist/history/utils/update-expression-builder.d.ts.map +1 -1
  67. package/dist/history/utils/update-expression-builder.js +105 -38
  68. package/dist/history/utils/update-expression-builder.js.map +1 -1
  69. package/dist/history/utils/validation.d.ts +8 -0
  70. package/dist/history/utils/validation.d.ts.map +1 -1
  71. package/dist/history/utils/validation.js +22 -0
  72. package/dist/history/utils/validation.js.map +1 -1
  73. package/dist/index.d.ts +2 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +5 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/shared/utils/batch-write.d.ts +36 -0
  78. package/dist/shared/utils/batch-write.d.ts.map +1 -0
  79. package/dist/shared/utils/batch-write.js +62 -0
  80. package/dist/shared/utils/batch-write.js.map +1 -0
  81. package/dist/shared/utils/compressor.d.ts +48 -0
  82. package/dist/shared/utils/compressor.d.ts.map +1 -0
  83. package/dist/shared/utils/compressor.js +68 -0
  84. package/dist/shared/utils/compressor.js.map +1 -0
  85. package/dist/shared/utils/constants.d.ts +2 -0
  86. package/dist/shared/utils/constants.d.ts.map +1 -1
  87. package/dist/shared/utils/constants.js +3 -7
  88. package/dist/shared/utils/constants.js.map +1 -1
  89. package/dist/shared/utils/index.d.ts +4 -0
  90. package/dist/shared/utils/index.d.ts.map +1 -1
  91. package/dist/shared/utils/index.js +4 -0
  92. package/dist/shared/utils/index.js.map +1 -1
  93. package/dist/shared/utils/logger.d.ts +48 -0
  94. package/dist/shared/utils/logger.d.ts.map +1 -0
  95. package/dist/shared/utils/logger.js +62 -0
  96. package/dist/shared/utils/logger.js.map +1 -0
  97. package/dist/shared/utils/retry.d.ts +1 -1
  98. package/dist/shared/utils/retry.d.ts.map +1 -1
  99. package/dist/shared/utils/retry.js +13 -6
  100. package/dist/shared/utils/retry.js.map +1 -1
  101. package/dist/shared/utils/s3-offloader.d.ts +146 -0
  102. package/dist/shared/utils/s3-offloader.d.ts.map +1 -0
  103. package/dist/shared/utils/s3-offloader.js +271 -0
  104. package/dist/shared/utils/s3-offloader.js.map +1 -0
  105. package/dist/shared/utils/ttl.d.ts +8 -1
  106. package/dist/shared/utils/ttl.d.ts.map +1 -1
  107. package/dist/shared/utils/ttl.js +12 -8
  108. package/dist/shared/utils/ttl.js.map +1 -1
  109. package/dist/store/actions/get-operation.js +2 -2
  110. package/dist/store/actions/get-operation.js.map +1 -1
  111. package/dist/store/actions/put-operation.d.ts.map +1 -1
  112. package/dist/store/actions/put-operation.js +2 -1
  113. package/dist/store/actions/put-operation.js.map +1 -1
  114. package/dist/store/actions/search-operation.d.ts +6 -0
  115. package/dist/store/actions/search-operation.d.ts.map +1 -1
  116. package/dist/store/actions/search-operation.js +41 -21
  117. package/dist/store/actions/search-operation.js.map +1 -1
  118. package/dist/store/index.d.ts +10 -2
  119. package/dist/store/index.d.ts.map +1 -1
  120. package/dist/store/index.js +28 -5
  121. package/dist/store/index.js.map +1 -1
  122. package/dist/store/types/index.d.ts +7 -5
  123. package/dist/store/types/index.d.ts.map +1 -1
  124. package/dist/store/utils/index.d.ts +0 -1
  125. package/dist/store/utils/index.d.ts.map +1 -1
  126. package/dist/store/utils/index.js +0 -1
  127. package/dist/store/utils/index.js.map +1 -1
  128. package/dist/store/utils/validation.js +1 -1
  129. package/dist/store/utils/validation.js.map +1 -1
  130. package/package.json +41 -24
  131. package/dist/store/utils/result.d.ts +0 -42
  132. package/dist/store/utils/result.d.ts.map +0 -1
  133. package/dist/store/utils/result.js +0 -51
  134. package/dist/store/utils/result.js.map +0 -1
@@ -1,59 +1,126 @@
1
1
  "use strict";
2
2
  /**
3
- * Update expression builder for chat message history
4
- * Provides centralized logic for building DynamoDB update expressions
3
+ * Item builder utilities for per-message chat history storage
4
+ * Builds DynamoDB items for metadata and individual messages
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.buildMessageUpdateExpression = buildMessageUpdateExpression;
7
+ exports.formatMessageIndex = formatMessageIndex;
8
+ exports.buildMessageSK = buildMessageSK;
9
+ exports.buildMessageItems = buildMessageItems;
10
+ exports.buildMetadataUpdateExpression = buildMetadataUpdateExpression;
11
+ exports.buildAtomicMetadataUpdate = buildAtomicMetadataUpdate;
12
+ const messages_1 = require("@langchain/core/messages");
8
13
  const shared_1 = require("../../shared");
9
14
  /**
10
- * Build DynamoDB update expression for adding messages to a session
11
- * Handles both single messages and message arrays
15
+ * Format a message index as a zero-padded 6-digit string
16
+ * Supports up to 999,999 messages per session while maintaining sort order
17
+ */
18
+ function formatMessageIndex(index) {
19
+ return String(index).padStart(6, '0');
20
+ }
21
+ /**
22
+ * Build the sort key for a message item
23
+ *
24
+ * @param sessionId - Session identifier
25
+ * @param messageIndex - Zero-based message index
26
+ * @returns Composite SK like "sessionId#msg#000001"
27
+ */
28
+ function buildMessageSK(sessionId, messageIndex) {
29
+ return `${sessionId}#msg#${formatMessageIndex(messageIndex)}`;
30
+ }
31
+ /**
32
+ * Build DynamoDB message items from BaseMessage array
12
33
  *
13
- * @param params - Parameters for building the expression
14
- * @returns Update expression and attribute values
34
+ * @param userId - User identifier
35
+ * @param sessionId - Session identifier
36
+ * @param messages - Messages to serialize
37
+ * @param startIndex - Starting message index (for appending to existing session)
38
+ * @param ttlDays - Optional TTL in days
39
+ * @returns Array of DynamoDB message items
15
40
  */
16
- function buildMessageUpdateExpression(params) {
17
- const { messages, title, ttlDays } = params;
41
+ function buildMessageItems(userId, sessionId, messages, startIndex, ttlDays) {
42
+ const storedMessages = (0, messages_1.mapChatMessagesToStoredMessages)(messages);
43
+ const ttl = ttlDays !== undefined ? (0, shared_1.calculateTTLTimestamp)(ttlDays) : undefined;
44
+ return storedMessages.map((storedMessage, i) => {
45
+ const messageIndex = startIndex + i;
46
+ const item = {
47
+ userId,
48
+ sessionId: buildMessageSK(sessionId, messageIndex),
49
+ itemType: 'message',
50
+ messageIndex,
51
+ message: storedMessage,
52
+ };
53
+ if (ttl !== undefined) {
54
+ item.ttl = ttl;
55
+ }
56
+ return item;
57
+ });
58
+ }
59
+ /**
60
+ * Build or update a session metadata item
61
+ *
62
+ * @param userId - User identifier
63
+ * @param sessionId - Session identifier
64
+ * @param title - Session title
65
+ * @param messageCount - New total message count
66
+ * @param ttlDays - Optional TTL in days
67
+ * @param isNew - Whether this is a new session (sets createdAt)
68
+ */
69
+ function buildMetadataUpdateExpression(title, messageCount, ttlDays) {
18
70
  const now = Date.now();
19
- const isArray = Array.isArray(messages);
20
- const messageArray = isArray ? messages : [messages];
21
- const messageCount = messageArray.length;
22
- // Build update expression parts
23
- const updateExpressionParts = ['updatedAt = :updatedAt'];
71
+ const updateParts = [
72
+ 'updatedAt = :updatedAt',
73
+ 'messageCount = :messageCount',
74
+ 'itemType = :itemType',
75
+ 'title = if_not_exists(title, :title)',
76
+ 'createdAt = if_not_exists(createdAt, :createdAt)',
77
+ ];
24
78
  const expressionAttributeValues = {
25
79
  ':updatedAt': now,
26
80
  ':createdAt': now,
27
- ':emptyList': [],
28
- ':zero': 0,
81
+ ':messageCount': messageCount,
82
+ ':itemType': 'metadata',
83
+ ':title': title,
29
84
  };
30
- // Add title if provided
31
- if (title) {
32
- updateExpressionParts.push('title = if_not_exists(title, :title)');
33
- expressionAttributeValues[':title'] = title;
34
- }
35
- // Add messages
36
- if (isArray) {
37
- updateExpressionParts.push('messages = list_append(if_not_exists(messages, :emptyList), :messages)');
38
- updateExpressionParts.push('messageCount = if_not_exists(messageCount, :zero) + :messageCount');
39
- expressionAttributeValues[':messages'] = messageArray;
40
- expressionAttributeValues[':messageCount'] = messageCount;
41
- }
42
- else {
43
- updateExpressionParts.push('messages = list_append(if_not_exists(messages, :emptyList), :message)');
44
- updateExpressionParts.push('messageCount = if_not_exists(messageCount, :zero) + :one');
45
- expressionAttributeValues[':message'] = messageArray;
46
- expressionAttributeValues[':one'] = 1;
85
+ if (ttlDays !== undefined) {
86
+ updateParts.push('ttl = :ttl');
87
+ expressionAttributeValues[':ttl'] = (0, shared_1.calculateTTLTimestamp)(ttlDays);
47
88
  }
48
- // Add TTL if configured
89
+ return {
90
+ updateExpression: `SET ${updateParts.join(', ')}`,
91
+ expressionAttributeValues,
92
+ };
93
+ }
94
+ /**
95
+ * Build an atomic metadata update expression using DynamoDB's ADD operation
96
+ * Atomically increments messageCount by incrementBy, preventing race conditions
97
+ *
98
+ * @param title - Session title (only set if not already present via if_not_exists)
99
+ * @param incrementBy - Number to add to messageCount
100
+ * @param ttlDays - Optional TTL in days
101
+ * @returns UpdateExpression and ExpressionAttributeValues for DynamoDB update
102
+ */
103
+ function buildAtomicMetadataUpdate(title, incrementBy, ttlDays) {
104
+ const now = Date.now();
105
+ const setParts = [
106
+ 'updatedAt = :updatedAt',
107
+ 'itemType = :itemType',
108
+ 'title = if_not_exists(title, :title)',
109
+ 'createdAt = if_not_exists(createdAt, :createdAt)',
110
+ ];
111
+ const expressionAttributeValues = {
112
+ ':updatedAt': now,
113
+ ':createdAt': now,
114
+ ':inc': incrementBy,
115
+ ':itemType': 'metadata',
116
+ ':title': title,
117
+ };
49
118
  if (ttlDays !== undefined) {
50
- updateExpressionParts.push('ttl = :ttl');
119
+ setParts.push('ttl = :ttl');
51
120
  expressionAttributeValues[':ttl'] = (0, shared_1.calculateTTLTimestamp)(ttlDays);
52
121
  }
53
- // Build final update expression
54
- const updateExpression = `SET ${updateExpressionParts.join(', ')}, createdAt = if_not_exists(createdAt, :createdAt)`;
55
122
  return {
56
- updateExpression,
123
+ updateExpression: `SET ${setParts.join(', ')} ADD messageCount :inc`,
57
124
  expressionAttributeValues,
58
125
  };
59
126
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update-expression-builder.js","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAmCH,oEAuDC;AAtFD,yCAAqD;AAwBrD;;;;;;GAMG;AACH,SAAgB,4BAA4B,CAC1C,MAA0C;IAE1C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;IAEzC,gCAAgC;IAChC,MAAM,qBAAqB,GAAa,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,yBAAyB,GAAwB;QACrD,YAAY,EAAE,GAAG;QACjB,YAAY,EAAE,GAAG;QACjB,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,CAAC;KACX,CAAC;IAEF,wBAAwB;IACxB,IAAI,KAAK,EAAE,CAAC;QACV,qBAAqB,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACnE,yBAAyB,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAC9C,CAAC;IAED,eAAe;IACf,IAAI,OAAO,EAAE,CAAC;QACZ,qBAAqB,CAAC,IAAI,CACxB,wEAAwE,CACzE,CAAC;QACF,qBAAqB,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAChG,yBAAyB,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;QACtD,yBAAyB,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,qBAAqB,CAAC,IAAI,CACxB,uEAAuE,CACxE,CAAC;QACF,qBAAqB,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACvF,yBAAyB,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QACrD,yBAAyB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,yBAAyB,CAAC,MAAM,CAAC,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,gCAAgC;IAChC,MAAM,gBAAgB,GAAG,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,oDAAoD,CAAC;IAErH,OAAO;QACL,gBAAgB;QAChB,yBAAyB;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"update-expression-builder.js","sourceRoot":"","sources":["../../../src/history/utils/update-expression-builder.ts"],"names":[],"mappings":"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"}
@@ -57,4 +57,12 @@ export declare function validateLimit(limit: any): void;
57
57
  * @throws HistoryValidationError if validation fails
58
58
  */
59
59
  export declare function validateTTLDays(ttlDays: number | undefined): void;
60
+ /**
61
+ * Validate total estimated size of messages for DynamoDB transaction limits.
62
+ * Prevents runtime `TransactionCanceledException` due to 4MB size exceeded.
63
+ *
64
+ * @param messages - Array of BaseMessage objects to validate
65
+ * @throws HistoryValidationError if estimated size exceeds 4MB
66
+ */
67
+ export declare function validateMessagesSize(messages: BaseMessage[]): void;
60
68
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAoBhD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAoBtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAyB9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAc9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAgB9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOjE"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAoBhD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAoBtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAa1D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAyB9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAc9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAgB9C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOjE;AAOD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAYlE"}
@@ -11,6 +11,7 @@ exports.validateMessages = validateMessages;
11
11
  exports.validateTitle = validateTitle;
12
12
  exports.validateLimit = validateLimit;
13
13
  exports.validateTTLDays = validateTTLDays;
14
+ exports.validateMessagesSize = validateMessagesSize;
14
15
  const utils_1 = require("../../shared/utils");
15
16
  const MAX_USER_ID_LENGTH = 256;
16
17
  const MAX_SESSION_ID_LENGTH = 256;
@@ -168,4 +169,25 @@ function validateTTLDays(ttlDays) {
168
169
  throw new HistoryValidationError(error instanceof Error ? error.message : String(error));
169
170
  }
170
171
  }
172
+ /** DynamoDB transactWrite limit: 4MB total across all items */
173
+ const MAX_TRANSACTION_SIZE_BYTES = 4 * 1024 * 1024;
174
+ /** Estimated per-item overhead: PK, SK, itemType, messageIndex, ttl, DynamoDB encoding */
175
+ const PER_ITEM_OVERHEAD_BYTES = 500;
176
+ /**
177
+ * Validate total estimated size of messages for DynamoDB transaction limits.
178
+ * Prevents runtime `TransactionCanceledException` due to 4MB size exceeded.
179
+ *
180
+ * @param messages - Array of BaseMessage objects to validate
181
+ * @throws HistoryValidationError if estimated size exceeds 4MB
182
+ */
183
+ function validateMessagesSize(messages) {
184
+ let totalSize = 0;
185
+ for (const message of messages) {
186
+ const content = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
187
+ totalSize += new TextEncoder().encode(content).byteLength + PER_ITEM_OVERHEAD_BYTES;
188
+ }
189
+ if (totalSize > MAX_TRANSACTION_SIZE_BYTES) {
190
+ throw new HistoryValidationError(`Estimated batch size (~${Math.round(totalSize / 1024)}KB) exceeds DynamoDB transaction limit of 4MB`);
191
+ }
192
+ }
171
193
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA4BH,wCAoBC;AAQD,8CAoBC;AAQD,0CAaC;AAQD,4CAyBC;AAQD,sCAcC;AAQD,sCAgBC;AAQD,0CAOC;AA3LD,8CAA0E;AAE1E,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B;;GAEG;AACH,MAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,MAAW;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,sBAAsB,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACvC,MAAM,IAAI,sBAAsB,CAC9B,qCAAqC,kBAAkB,aAAa,CACrE,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,4CAA4C;IAC5C,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,sBAAsB,CAAC,2CAA2C,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,SAAc;IAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,sBAAsB,CAAC,6BAA6B,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QAC7C,MAAM,IAAI,sBAAsB,CAC9B,wCAAwC,qBAAqB,aAAa,CAC3E,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,4CAA4C;IAC5C,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,sBAAsB,CAAC,8CAA8C,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,OAAoB;IAClD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,sBAAsB,CAAC,qCAAqC,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,sBAAsB,CAAC,sCAAsC,CAAC,CAAC;IAC3E,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,sBAAsB,CAAC,sCAAsC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,QAAuB;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,sBAAsB,CAAC,2BAA2B,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,sBAAsB,CAAC,gCAAgC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QAC7C,MAAM,IAAI,sBAAsB,CAC9B,wBAAwB,QAAQ,CAAC,MAAM,wBAAwB,sBAAsB,EAAE,CACxF,CAAC;IACJ,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,sBAAsB;YAC9B,uDAAuD;YACvD,4BAA4B,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3F,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,KAAU;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,sBAAsB,CAC9B,mCAAmC,gBAAgB,aAAa,CACjE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,KAAU;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,sBAAsB,CAAC,0BAA0B,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,sBAAsB,CAAC,wBAAwB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;QAC3B,MAAM,IAAI,sBAAsB,CAAC,uBAAuB,cAAc,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,OAA2B;IACzD,IAAI,CAAC;QACH,IAAA,uBAAiB,EAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,MAAM,IAAI,sBAAsB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/history/utils/validation.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,4 +5,6 @@ export type { DynamoDBStoreOptions } from './store/types';
5
5
  export { DynamoDBChatMessageHistory } from './history';
6
6
  export type { DynamoDBChatMessageHistoryOptions, SessionMetadata } from './history/types';
7
7
  export { DynamoDBFactory } from './factory';
8
+ export { setGlobalLogger, getLogger, resetLogger } from './shared/utils/logger';
9
+ export type { Logger } from './shared/utils/logger';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChF,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DynamoDBFactory = exports.DynamoDBChatMessageHistory = exports.DynamoDBStore = exports.DynamoDBSaver = void 0;
3
+ exports.resetLogger = exports.getLogger = exports.setGlobalLogger = exports.DynamoDBFactory = exports.DynamoDBChatMessageHistory = exports.DynamoDBStore = exports.DynamoDBSaver = void 0;
4
4
  var checkpointer_1 = require("./checkpointer");
5
5
  Object.defineProperty(exports, "DynamoDBSaver", { enumerable: true, get: function () { return checkpointer_1.DynamoDBSaver; } });
6
6
  var store_1 = require("./store");
@@ -9,4 +9,8 @@ var history_1 = require("./history");
9
9
  Object.defineProperty(exports, "DynamoDBChatMessageHistory", { enumerable: true, get: function () { return history_1.DynamoDBChatMessageHistory; } });
10
10
  var factory_1 = require("./factory");
11
11
  Object.defineProperty(exports, "DynamoDBFactory", { enumerable: true, get: function () { return factory_1.DynamoDBFactory; } });
12
+ var logger_1 = require("./shared/utils/logger");
13
+ Object.defineProperty(exports, "setGlobalLogger", { enumerable: true, get: function () { return logger_1.setGlobalLogger; } });
14
+ Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return logger_1.getLogger; } });
15
+ Object.defineProperty(exports, "resetLogger", { enumerable: true, get: function () { return logger_1.resetLogger; } });
12
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAAtC,6GAAA,aAAa,OAAA;AAEtB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAEtB,qCAAuD;AAA9C,qHAAA,0BAA0B,OAAA;AAEnC,qCAA4C;AAAnC,0GAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAAtC,6GAAA,aAAa,OAAA;AAEtB,iCAAwC;AAA/B,sGAAA,aAAa,OAAA;AAEtB,qCAAuD;AAA9C,qHAAA,0BAA0B,OAAA;AAEnC,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AACxB,gDAAgF;AAAvE,yGAAA,eAAe,OAAA;AAAE,mGAAA,SAAS,OAAA;AAAE,qGAAA,WAAW,OAAA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Shared batch write utilities with UnprocessedItems retry logic
3
+ * Eliminates duplication of the retry pattern across checkpointer, store, and history modules
4
+ */
5
+ import type { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
6
+ interface PutWriteRequest {
7
+ PutRequest: {
8
+ Item: object;
9
+ };
10
+ }
11
+ interface DeleteWriteRequest {
12
+ DeleteRequest: {
13
+ Key: object;
14
+ };
15
+ }
16
+ type WriteRequest = PutWriteRequest | DeleteWriteRequest;
17
+ /**
18
+ * Execute a single batchWrite call with exponential backoff retry for UnprocessedItems
19
+ *
20
+ * @param client - DynamoDB Document client
21
+ * @param tableName - Target DynamoDB table name
22
+ * @param requestItems - Array of write requests (PutRequest or DeleteRequest objects)
23
+ * @throws Error if retries are exhausted with remaining unprocessed items
24
+ */
25
+ export declare function batchWriteWithRetry(client: DynamoDBDocument, tableName: string, requestItems: WriteRequest[]): Promise<void>;
26
+ /**
27
+ * Execute batch writes for an arbitrary number of items, chunking into batches of 25
28
+ *
29
+ * @param client - DynamoDB Document client
30
+ * @param tableName - Target DynamoDB table name
31
+ * @param requestItems - Array of write requests (can exceed 25)
32
+ * @throws Error if any batch fails after exhausting retries
33
+ */
34
+ export declare function batchWriteAllWithRetry(client: DynamoDBDocument, tableName: string, requestItems: WriteRequest[]): Promise<void>;
35
+ export {};
36
+ //# sourceMappingURL=batch-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-write.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/batch-write.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D,UAAU,eAAe;IACvB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED,UAAU,kBAAkB;IAC1B,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC;AAED,KAAK,YAAY,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * Shared batch write utilities with UnprocessedItems retry logic
4
+ * Eliminates duplication of the retry pattern across checkpointer, store, and history modules
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.batchWriteWithRetry = batchWriteWithRetry;
8
+ exports.batchWriteAllWithRetry = batchWriteAllWithRetry;
9
+ const constants_1 = require("./constants");
10
+ const retry_1 = require("./retry");
11
+ /**
12
+ * Execute a single batchWrite call with exponential backoff retry for UnprocessedItems
13
+ *
14
+ * @param client - DynamoDB Document client
15
+ * @param tableName - Target DynamoDB table name
16
+ * @param requestItems - Array of write requests (PutRequest or DeleteRequest objects)
17
+ * @throws Error if retries are exhausted with remaining unprocessed items
18
+ */
19
+ async function batchWriteWithRetry(client, tableName, requestItems) {
20
+ if (requestItems.length === 0)
21
+ return;
22
+ await (0, retry_1.withDynamoDBRetry)(async () => {
23
+ const result = await client.batchWrite({
24
+ RequestItems: {
25
+ [tableName]: requestItems,
26
+ },
27
+ });
28
+ let unprocessed = result.UnprocessedItems?.[tableName];
29
+ let retryDelay = 100;
30
+ let retryCount = 0;
31
+ while (unprocessed && unprocessed.length > 0) {
32
+ retryCount++;
33
+ if (retryCount > constants_1.MAX_UNPROCESSED_RETRIES) {
34
+ throw new Error(`Failed to process all items after ${constants_1.MAX_UNPROCESSED_RETRIES} retries. ` +
35
+ `${unprocessed.length} items remain unprocessed.`);
36
+ }
37
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
38
+ retryDelay = Math.min(retryDelay * 2, 5000);
39
+ const retryResult = await client.batchWrite({
40
+ RequestItems: { [tableName]: unprocessed },
41
+ });
42
+ unprocessed = retryResult.UnprocessedItems?.[tableName];
43
+ }
44
+ });
45
+ }
46
+ /**
47
+ * Execute batch writes for an arbitrary number of items, chunking into batches of 25
48
+ *
49
+ * @param client - DynamoDB Document client
50
+ * @param tableName - Target DynamoDB table name
51
+ * @param requestItems - Array of write requests (can exceed 25)
52
+ * @throws Error if any batch fails after exhausting retries
53
+ */
54
+ async function batchWriteAllWithRetry(client, tableName, requestItems) {
55
+ if (requestItems.length === 0)
56
+ return;
57
+ for (let i = 0; i < requestItems.length; i += constants_1.BATCH_WRITE_MAX) {
58
+ const batch = requestItems.slice(i, i + constants_1.BATCH_WRITE_MAX);
59
+ await batchWriteWithRetry(client, tableName, batch);
60
+ }
61
+ }
62
+ //# sourceMappingURL=batch-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-write.js","sourceRoot":"","sources":["../../../src/shared/utils/batch-write.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAyBH,kDAiCC;AAUD,wDAWC;AA3ED,2CAAuE;AACvE,mCAA4C;AAY5C;;;;;;;GAOG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAwB,EACxB,SAAiB,EACjB,YAA4B;IAE5B,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEtC,MAAM,IAAA,yBAAiB,EAAC,KAAK,IAAI,EAAE;QACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACrC,YAAY,EAAE;gBACZ,CAAC,SAAS,CAAC,EAAE,YAAY;aAC1B;SACF,CAAC,CAAC;QAEH,IAAI,WAAW,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,UAAU,GAAG,GAAG,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,OAAO,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,UAAU,EAAE,CAAC;YACb,IAAI,UAAU,GAAG,mCAAuB,EAAE,CAAC;gBACzC,MAAM,IAAI,KAAK,CACb,qCAAqC,mCAAuB,YAAY;oBACtE,GAAG,WAAW,CAAC,MAAM,4BAA4B,CACpD,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;YAChE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBAC1C,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE;aAC3C,CAAC,CAAC;YACH,WAAW,GAAG,WAAW,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,sBAAsB,CAC1C,MAAwB,EACxB,SAAiB,EACjB,YAA4B;IAE5B,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,2BAAe,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,2BAAe,CAAC,CAAC;QACzD,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Checkpoint compression utility using Node.js built-in zlib
3
+ * Provides transparent gzip compression/decompression with smart thresholds
4
+ */
5
+ /**
6
+ * Configuration for checkpoint compression
7
+ */
8
+ export interface CompressionConfig {
9
+ /** Whether compression is enabled (default: false) */
10
+ enabled: boolean;
11
+ /** Minimum payload size in bytes to trigger compression (default: 1024 = 1KB) */
12
+ minSizeBytes?: number;
13
+ /** Gzip compression level 1-9 (default: 6 = balanced speed/ratio) */
14
+ level?: number;
15
+ }
16
+ /**
17
+ * Compressor for checkpoint data using gzip
18
+ *
19
+ * Features:
20
+ * - Smart threshold: skips compression for payloads below `minSizeBytes`
21
+ * - Auto-detection: `decompress()` transparently handles both compressed and uncompressed data
22
+ * - Zero dependencies: uses Node.js built-in `zlib`
23
+ */
24
+ export declare class Compressor {
25
+ private readonly minSizeBytes;
26
+ private readonly level;
27
+ constructor(config: CompressionConfig);
28
+ /**
29
+ * Compress data if above the minimum size threshold
30
+ *
31
+ * @param data - Raw data to compress
32
+ * @returns Compressed data (gzip) or original data if below threshold
33
+ */
34
+ compress(data: Uint8Array): Promise<Uint8Array>;
35
+ /**
36
+ * Decompress data if gzip magic header is detected, otherwise passthrough
37
+ * This provides full backward compatibility with uncompressed data
38
+ *
39
+ * @param data - Potentially compressed data
40
+ * @returns Decompressed data
41
+ */
42
+ decompress(data: Uint8Array): Promise<Uint8Array>;
43
+ /**
44
+ * Check if data starts with the gzip magic number
45
+ */
46
+ static isGzipped(data: Uint8Array): boolean;
47
+ }
48
+ //# sourceMappingURL=compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/compressor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,MAAM,EAAE,iBAAiB;IAKrC;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBrD;;;;;;OAMG;IACG,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAQvD;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;CAG5C"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Checkpoint compression utility using Node.js built-in zlib
4
+ * Provides transparent gzip compression/decompression with smart thresholds
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Compressor = void 0;
8
+ const node_util_1 = require("node:util");
9
+ const node_zlib_1 = require("node:zlib");
10
+ const gzipAsync = (0, node_util_1.promisify)(node_zlib_1.gzip);
11
+ const gunzipAsync = (0, node_util_1.promisify)(node_zlib_1.gunzip);
12
+ /** Gzip magic number bytes for auto-detection */
13
+ const GZIP_MAGIC = new Uint8Array([0x1f, 0x8b]);
14
+ /**
15
+ * Compressor for checkpoint data using gzip
16
+ *
17
+ * Features:
18
+ * - Smart threshold: skips compression for payloads below `minSizeBytes`
19
+ * - Auto-detection: `decompress()` transparently handles both compressed and uncompressed data
20
+ * - Zero dependencies: uses Node.js built-in `zlib`
21
+ */
22
+ class Compressor {
23
+ minSizeBytes;
24
+ level;
25
+ constructor(config) {
26
+ this.minSizeBytes = config.minSizeBytes ?? 1024;
27
+ this.level = config.level ?? 6;
28
+ }
29
+ /**
30
+ * Compress data if above the minimum size threshold
31
+ *
32
+ * @param data - Raw data to compress
33
+ * @returns Compressed data (gzip) or original data if below threshold
34
+ */
35
+ async compress(data) {
36
+ if (data.length < this.minSizeBytes) {
37
+ return data;
38
+ }
39
+ const compressed = new Uint8Array(await gzipAsync(data, { level: this.level }));
40
+ // Only use compressed output if it saves at least 10% space.
41
+ // This avoids data expansion for already-compressed or random binary payloads.
42
+ if (compressed.length >= data.length * 0.9) {
43
+ return data;
44
+ }
45
+ return compressed;
46
+ }
47
+ /**
48
+ * Decompress data if gzip magic header is detected, otherwise passthrough
49
+ * This provides full backward compatibility with uncompressed data
50
+ *
51
+ * @param data - Potentially compressed data
52
+ * @returns Decompressed data
53
+ */
54
+ async decompress(data) {
55
+ if (!Compressor.isGzipped(data)) {
56
+ return data;
57
+ }
58
+ return new Uint8Array(await gunzipAsync(data));
59
+ }
60
+ /**
61
+ * Check if data starts with the gzip magic number
62
+ */
63
+ static isGzipped(data) {
64
+ return data.length >= 2 && data[0] === GZIP_MAGIC[0] && data[1] === GZIP_MAGIC[1];
65
+ }
66
+ }
67
+ exports.Compressor = Compressor;
68
+ //# sourceMappingURL=compressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../../src/shared/utils/compressor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAAsC;AACtC,yCAAyC;AAEzC,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,gBAAI,CAAC,CAAC;AAClC,MAAM,WAAW,GAAG,IAAA,qBAAS,EAAC,kBAAM,CAAC,CAAC;AAEtC,iDAAiD;AACjD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAchD;;;;;;;GAOG;AACH,MAAa,UAAU;IACJ,YAAY,CAAS;IACrB,KAAK,CAAS;IAE/B,YAAY,MAAyB;QACnC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAgB;QAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEhF,6DAA6D;QAC7D,+EAA+E;QAC/E,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,IAAgB;QAC/B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,UAAU,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,IAAgB;QAC/B,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;CACF;AApDD,gCAoDC"}
@@ -4,6 +4,8 @@
4
4
  export declare const MAX_TTL_DAYS: number;
5
5
  export declare const MAX_LOOP_ITERATIONS = 100;
6
6
  export declare const MAX_TOTAL_ITEMS_IN_MEMORY = 10000;
7
+ export declare const BATCH_WRITE_MAX = 25;
8
+ export declare const MAX_UNPROCESSED_RETRIES = 10;
7
9
  /**
8
10
  * Validate TTL days (shared logic)
9
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,YAAY,QAAU,CAAC;AACpC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAE/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAuBjE"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,YAAY,QAAU,CAAC;AACpC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAC/C,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgBjE"}
@@ -3,12 +3,14 @@
3
3
  * Shared constants for validation across store and checkpointer
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.MAX_TOTAL_ITEMS_IN_MEMORY = exports.MAX_LOOP_ITERATIONS = exports.MAX_TTL_DAYS = void 0;
6
+ exports.MAX_UNPROCESSED_RETRIES = exports.BATCH_WRITE_MAX = exports.MAX_TOTAL_ITEMS_IN_MEMORY = exports.MAX_LOOP_ITERATIONS = exports.MAX_TTL_DAYS = void 0;
7
7
  exports.validateTTLDays = validateTTLDays;
8
8
  // Common DynamoDB limits
9
9
  exports.MAX_TTL_DAYS = 365 * 5; // 5 years
10
10
  exports.MAX_LOOP_ITERATIONS = 100; // Maximum loop iterations to prevent infinite loops
11
11
  exports.MAX_TOTAL_ITEMS_IN_MEMORY = 10000; // Maximum items to collect in memory
12
+ exports.BATCH_WRITE_MAX = 25; // DynamoDB BatchWriteItem limit per request
13
+ exports.MAX_UNPROCESSED_RETRIES = 10; // Maximum retries for UnprocessedItems loops
12
14
  /**
13
15
  * Validate TTL days (shared logic)
14
16
  */
@@ -25,11 +27,5 @@ function validateTTLDays(ttlDays) {
25
27
  if (ttlDays > exports.MAX_TTL_DAYS) {
26
28
  throw new Error(`TTL days cannot exceed ${exports.MAX_TTL_DAYS}`);
27
29
  }
28
- // Check for overflow when converting to Unix timestamp
29
- const futureTimestamp = Math.floor(Date.now() / 1000) + ttlDays * 24 * 60 * 60;
30
- if (futureTimestamp > 2147483647) {
31
- // Max 32-bit integer
32
- throw new Error('TTL would overflow Unix timestamp (max date: 2038-01-19)');
33
- }
34
30
  }
35
31
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/shared/utils/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAUH,0CAuBC;AA/BD,yBAAyB;AACZ,QAAA,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU;AAClC,QAAA,mBAAmB,GAAG,GAAG,CAAC,CAAC,oDAAoD;AAC/E,QAAA,yBAAyB,GAAG,KAAK,CAAC,CAAC,qCAAqC;AAErF;;GAEG;AACH,SAAgB,eAAe,CAAC,OAA2B;IACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,GAAG,oBAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,oBAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,uDAAuD;IACvD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC/E,IAAI,eAAe,GAAG,UAAU,EAAE,CAAC;QACjC,qBAAqB;QACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/shared/utils/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAYH,0CAgBC;AA1BD,yBAAyB;AACZ,QAAA,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU;AAClC,QAAA,mBAAmB,GAAG,GAAG,CAAC,CAAC,oDAAoD;AAC/E,QAAA,yBAAyB,GAAG,KAAK,CAAC,CAAC,qCAAqC;AACxE,QAAA,eAAe,GAAG,EAAE,CAAC,CAAC,4CAA4C;AAClE,QAAA,uBAAuB,GAAG,EAAE,CAAC,CAAC,6CAA6C;AAExF;;GAEG;AACH,SAAgB,eAAe,CAAC,OAA2B;IACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,GAAG,oBAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0BAA0B,oBAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -1,7 +1,11 @@
1
1
  /**
2
2
  * Shared utilities and types
3
3
  */
4
+ export * from './compressor';
4
5
  export * from './constants';
6
+ export * from './logger';
5
7
  export * from './retry';
8
+ export * from './s3-offloader';
9
+ export * from './batch-write';
6
10
  export * from './ttl';
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,OAAO,CAAC"}
@@ -17,7 +17,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
17
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./compressor"), exports);
20
21
  __exportStar(require("./constants"), exports);
22
+ __exportStar(require("./logger"), exports);
21
23
  __exportStar(require("./retry"), exports);
24
+ __exportStar(require("./s3-offloader"), exports);
25
+ __exportStar(require("./batch-write"), exports);
22
26
  __exportStar(require("./ttl"), exports);
23
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,0CAAwB;AACxB,wCAAsB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,8CAA4B;AAC5B,2CAAyB;AACzB,0CAAwB;AACxB,iDAA+B;AAC/B,gDAA8B;AAC9B,wCAAsB"}