@farukada/aws-langgraph-dynamodb-ts 0.3.1 → 0.4.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.
- package/README.md +12 -5
- package/dist/checkpointer/actions/delete-thread.js +1 -1
- package/dist/checkpointer/actions/delete-thread.js.map +1 -1
- package/dist/checkpointer/actions/get-tuple.js.map +1 -1
- package/dist/checkpointer/actions/list.d.ts.map +1 -1
- package/dist/checkpointer/actions/list.js +3 -1
- package/dist/checkpointer/actions/list.js.map +1 -1
- package/dist/checkpointer/actions/put-writes.d.ts +6 -0
- package/dist/checkpointer/actions/put-writes.d.ts.map +1 -1
- package/dist/checkpointer/actions/put-writes.js +77 -10
- package/dist/checkpointer/actions/put-writes.js.map +1 -1
- package/dist/checkpointer/actions/put.js.map +1 -1
- package/dist/checkpointer/internal/assemble.js.map +1 -1
- package/dist/checkpointer/internal/configurable.js.map +1 -1
- package/dist/checkpointer/internal/fetch.js.map +1 -1
- package/dist/checkpointer/internal/filter-match.d.ts.map +1 -1
- package/dist/checkpointer/internal/filter-match.js.map +1 -1
- package/dist/checkpointer/internal/item-reader.js.map +1 -1
- package/dist/checkpointer/internal/item-writer.d.ts +13 -2
- package/dist/checkpointer/internal/item-writer.d.ts.map +1 -1
- package/dist/checkpointer/internal/item-writer.js +15 -3
- package/dist/checkpointer/internal/item-writer.js.map +1 -1
- package/dist/checkpointer/internal/keys.js.map +1 -1
- package/dist/checkpointer/internal/query.d.ts +5 -1
- package/dist/checkpointer/internal/query.d.ts.map +1 -1
- package/dist/checkpointer/internal/query.js +5 -2
- package/dist/checkpointer/internal/query.js.map +1 -1
- package/dist/checkpointer/internal/setup.d.ts.map +1 -1
- package/dist/checkpointer/internal/setup.js +8 -1
- package/dist/checkpointer/internal/setup.js.map +1 -1
- package/dist/checkpointer/internal/validation.js.map +1 -1
- package/dist/checkpointer/saver.d.ts +9 -0
- package/dist/checkpointer/saver.d.ts.map +1 -1
- package/dist/checkpointer/saver.js +14 -0
- package/dist/checkpointer/saver.js.map +1 -1
- package/dist/factory/factory.d.ts +4 -4
- package/dist/factory/factory.d.ts.map +1 -1
- package/dist/factory/factory.js +4 -6
- package/dist/factory/factory.js.map +1 -1
- package/dist/history/actions/add-messages.d.ts.map +1 -1
- package/dist/history/actions/add-messages.js +4 -3
- package/dist/history/actions/add-messages.js.map +1 -1
- package/dist/history/actions/clear.d.ts +6 -3
- package/dist/history/actions/clear.d.ts.map +1 -1
- package/dist/history/actions/clear.js +28 -15
- package/dist/history/actions/clear.js.map +1 -1
- package/dist/history/actions/get-messages.d.ts.map +1 -1
- package/dist/history/actions/get-messages.js +2 -0
- package/dist/history/actions/get-messages.js.map +1 -1
- package/dist/history/actions/list-sessions.d.ts +4 -1
- package/dist/history/actions/list-sessions.d.ts.map +1 -1
- package/dist/history/actions/list-sessions.js +3 -1
- package/dist/history/actions/list-sessions.js.map +1 -1
- package/dist/history/actions/reconcile-count.d.ts +4 -1
- package/dist/history/actions/reconcile-count.d.ts.map +1 -1
- package/dist/history/actions/reconcile-count.js +21 -9
- package/dist/history/actions/reconcile-count.js.map +1 -1
- package/dist/history/chat-message-history.d.ts +13 -1
- package/dist/history/chat-message-history.d.ts.map +1 -1
- package/dist/history/chat-message-history.js +16 -2
- package/dist/history/chat-message-history.js.map +1 -1
- package/dist/history/internal/append-saga.d.ts +6 -3
- package/dist/history/internal/append-saga.d.ts.map +1 -1
- package/dist/history/internal/append-saga.js +28 -14
- package/dist/history/internal/append-saga.js.map +1 -1
- package/dist/history/internal/item-mapper.js.map +1 -1
- package/dist/history/internal/keys.js.map +1 -1
- package/dist/history/internal/message-chunker.js.map +1 -1
- package/dist/history/internal/message-transaction.d.ts +4 -0
- package/dist/history/internal/message-transaction.d.ts.map +1 -1
- package/dist/history/internal/message-transaction.js +6 -0
- package/dist/history/internal/message-transaction.js.map +1 -1
- package/dist/history/internal/query.js.map +1 -1
- package/dist/history/internal/session-update.d.ts +6 -1
- package/dist/history/internal/session-update.d.ts.map +1 -1
- package/dist/history/internal/session-update.js +6 -2
- package/dist/history/internal/session-update.js.map +1 -1
- package/dist/history/internal/setup.d.ts.map +1 -1
- package/dist/history/internal/setup.js +8 -1
- package/dist/history/internal/setup.js.map +1 -1
- package/dist/history/internal/title-generator.js.map +1 -1
- package/dist/history/internal/ttl-anchor.d.ts +20 -7
- package/dist/history/internal/ttl-anchor.d.ts.map +1 -1
- package/dist/history/internal/ttl-anchor.js +19 -7
- package/dist/history/internal/ttl-anchor.js.map +1 -1
- package/dist/history/session-adapter.d.ts.map +1 -1
- package/dist/history/session-adapter.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/shared/clock.js.map +1 -1
- package/dist/shared/codec/codec.js.map +1 -1
- package/dist/shared/codec/compression.js.map +1 -1
- package/dist/shared/codec/descriptor-keys.js.map +1 -1
- package/dist/shared/codec/s3/client.d.ts +7 -1
- package/dist/shared/codec/s3/client.d.ts.map +1 -1
- package/dist/shared/codec/s3/client.js +8 -2
- package/dist/shared/codec/s3/client.js.map +1 -1
- package/dist/shared/codec/s3/config.d.ts +9 -1
- package/dist/shared/codec/s3/config.d.ts.map +1 -1
- package/dist/shared/codec/s3/config.js +14 -2
- package/dist/shared/codec/s3/config.js.map +1 -1
- package/dist/shared/codec/s3/delete.js.map +1 -1
- package/dist/shared/codec/s3/lifecycle.js.map +1 -1
- package/dist/shared/codec/s3/offloader.d.ts +2 -1
- package/dist/shared/codec/s3/offloader.d.ts.map +1 -1
- package/dist/shared/codec/s3/offloader.js +15 -8
- package/dist/shared/codec/s3/offloader.js.map +1 -1
- package/dist/shared/codec/s3/orphans.d.ts +4 -2
- package/dist/shared/codec/s3/orphans.d.ts.map +1 -1
- package/dist/shared/codec/s3/orphans.js +8 -23
- package/dist/shared/codec/s3/orphans.js.map +1 -1
- package/dist/shared/codec/s3/read-write.d.ts.map +1 -1
- package/dist/shared/codec/s3/read-write.js +14 -13
- package/dist/shared/codec/s3/read-write.js.map +1 -1
- package/dist/shared/codec/s3/retry.d.ts +5 -0
- package/dist/shared/codec/s3/retry.d.ts.map +1 -0
- package/dist/shared/codec/s3/retry.js +25 -0
- package/dist/shared/codec/s3/retry.js.map +1 -0
- package/dist/shared/constants.d.ts +12 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +13 -1
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/dynamodb/backoff.js.map +1 -1
- package/dist/shared/dynamodb/batch-write.d.ts +5 -2
- package/dist/shared/dynamodb/batch-write.d.ts.map +1 -1
- package/dist/shared/dynamodb/batch-write.js +19 -3
- package/dist/shared/dynamodb/batch-write.js.map +1 -1
- package/dist/shared/dynamodb/client.js +1 -1
- package/dist/shared/dynamodb/client.js.map +1 -1
- package/dist/shared/dynamodb/drain-unprocessed.js.map +1 -1
- package/dist/shared/dynamodb/paginate-core.js.map +1 -1
- package/dist/shared/dynamodb/paginate.js.map +1 -1
- package/dist/shared/dynamodb/retry-classifier.d.ts.map +1 -1
- package/dist/shared/dynamodb/retry-classifier.js +3 -0
- package/dist/shared/dynamodb/retry-classifier.js.map +1 -1
- package/dist/shared/dynamodb/retry.js.map +1 -1
- package/dist/shared/dynamodb/scan.js.map +1 -1
- package/dist/shared/errors/base-error.d.ts.map +1 -1
- package/dist/shared/errors/base-error.js.map +1 -1
- package/dist/shared/errors/error-code.js.map +1 -1
- package/dist/shared/errors/errors.d.ts +13 -0
- package/dist/shared/errors/errors.d.ts.map +1 -1
- package/dist/shared/errors/errors.js +22 -1
- package/dist/shared/errors/errors.js.map +1 -1
- package/dist/shared/errors/wrap-error.js.map +1 -1
- package/dist/shared/logging/logger.js.map +1 -1
- package/dist/shared/logging/redaction.d.ts.map +1 -1
- package/dist/shared/logging/redaction.js +13 -8
- package/dist/shared/logging/redaction.js.map +1 -1
- package/dist/shared/ulid.js.map +1 -1
- package/dist/shared/validation/primitives.js.map +1 -1
- package/dist/shared/validation/ttl.d.ts +5 -0
- package/dist/shared/validation/ttl.d.ts.map +1 -1
- package/dist/shared/validation/ttl.js +8 -0
- package/dist/shared/validation/ttl.js.map +1 -1
- package/dist/store/actions/get.js.map +1 -1
- package/dist/store/actions/list-namespaces.js.map +1 -1
- package/dist/store/actions/put.d.ts +6 -4
- package/dist/store/actions/put.d.ts.map +1 -1
- package/dist/store/actions/put.js +32 -13
- package/dist/store/actions/put.js.map +1 -1
- package/dist/store/actions/reconcile-vector-index.js.map +1 -1
- package/dist/store/actions/search.d.ts.map +1 -1
- package/dist/store/actions/search.js +29 -9
- package/dist/store/actions/search.js.map +1 -1
- package/dist/store/internal/filter.d.ts.map +1 -1
- package/dist/store/internal/filter.js +12 -8
- package/dist/store/internal/filter.js.map +1 -1
- package/dist/store/internal/index-reconcile.d.ts.map +1 -1
- package/dist/store/internal/index-reconcile.js +5 -5
- package/dist/store/internal/index-reconcile.js.map +1 -1
- package/dist/store/internal/index-sync.js.map +1 -1
- package/dist/store/internal/item-mapper.d.ts +2 -1
- package/dist/store/internal/item-mapper.d.ts.map +1 -1
- package/dist/store/internal/item-mapper.js +1 -1
- package/dist/store/internal/item-mapper.js.map +1 -1
- package/dist/store/internal/keys.js.map +1 -1
- package/dist/store/internal/namespace-match.js.map +1 -1
- package/dist/store/internal/query.js.map +1 -1
- package/dist/store/internal/ranker.d.ts.map +1 -1
- package/dist/store/internal/ranker.js +3 -1
- package/dist/store/internal/ranker.js.map +1 -1
- package/dist/store/internal/semantic-search.js.map +1 -1
- package/dist/store/internal/setup.d.ts +1 -0
- package/dist/store/internal/setup.d.ts.map +1 -1
- package/dist/store/internal/setup.js +8 -1
- package/dist/store/internal/setup.js.map +1 -1
- package/dist/store/internal/validation.js.map +1 -1
- package/dist/store/store.d.ts +9 -0
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +14 -0
- package/dist/store/store.js.map +1 -1
- package/dist/store/types.d.ts +2 -0
- package/dist/store/types.d.ts.map +1 -1
- package/package.json +28 -26
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DynamoDBClient,
|
|
1
|
+
import type { DynamoDBClient, DynamoDBClientConfig } from '@aws-sdk/client-dynamodb';
|
|
2
2
|
import { DynamoDBSaver } from '../checkpointer/saver';
|
|
3
3
|
import type { DynamoDBSaverOptions } from '../checkpointer/types';
|
|
4
4
|
import { DynamoDBChatMessageHistory } from '../history/chat-message-history';
|
|
@@ -14,9 +14,9 @@ export interface FactoryBaseOptions {
|
|
|
14
14
|
}
|
|
15
15
|
/** Per-adapter options for {@link DynamoDBFactory.createAll} (client is shared). */
|
|
16
16
|
export interface CreateAllOptions {
|
|
17
|
-
saver: Omit<DynamoDBSaverOptions, 'client'>;
|
|
18
|
-
store: Omit<DynamoDBStoreOptions, 'client'>;
|
|
19
|
-
history: Omit<DynamoDBChatMessageHistoryOptions, 'client'>;
|
|
17
|
+
saver: Omit<DynamoDBSaverOptions, 'client' | 'clientConfig' | 'createClient'>;
|
|
18
|
+
store: Omit<DynamoDBStoreOptions, 'client' | 'clientConfig' | 'createClient'>;
|
|
19
|
+
history: Omit<DynamoDBChatMessageHistoryOptions, 'client' | 'clientConfig' | 'createClient'>;
|
|
20
20
|
}
|
|
21
21
|
/** The three adapters sharing one client, plus a combined `destroy`. */
|
|
22
22
|
export interface CreatedAdapters {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/factory/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,cAAc,CAAC;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,oFAAoF;AACpF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;IAC9E,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;IAC9E,OAAO,EAAE,IAAI,CAAC,iCAAiC,EAAE,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;CAC9F;AAED,wEAAwE;AACxE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,0BAA0B,CAAC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,GAAE,kBAAuB,EAAI;IAE9D,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAExD;IAED,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAExD;IAED,wBAAwB,CAAC,OAAO,EAAE,iCAAiC,GAAG,0BAA0B,CAE/F;IAED,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAiBpD;CACF"}
|
package/dist/factory/factory.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DynamoDBFactory = void 0;
|
|
4
|
-
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
-
const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
|
|
6
4
|
const saver_1 = require("../checkpointer/saver");
|
|
7
5
|
const chat_message_history_1 = require("../history/chat-message-history");
|
|
6
|
+
const client_1 = require("../shared/dynamodb/client");
|
|
8
7
|
const store_1 = require("../store/store");
|
|
9
8
|
/**
|
|
10
9
|
* Convenience constructors for the adapters. Individual `create*` methods each
|
|
@@ -26,9 +25,8 @@ class DynamoDBFactory {
|
|
|
26
25
|
return new chat_message_history_1.DynamoDBChatMessageHistory({ ...this.base, ...options });
|
|
27
26
|
}
|
|
28
27
|
createAll(options) {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
const client = lib_dynamodb_1.DynamoDBDocument.from(ddbClient);
|
|
28
|
+
const resolved = (0, client_1.resolveDynamoDBClient)(this.base);
|
|
29
|
+
const client = resolved.client;
|
|
32
30
|
const saver = new saver_1.DynamoDBSaver({ ...this.base, ...options.saver, client });
|
|
33
31
|
const store = new store_1.DynamoDBStore({ ...this.base, ...options.store, client });
|
|
34
32
|
const history = new chat_message_history_1.DynamoDBChatMessageHistory({ ...this.base, ...options.history, client });
|
|
@@ -40,7 +38,7 @@ class DynamoDBFactory {
|
|
|
40
38
|
saver.destroy();
|
|
41
39
|
store.destroy();
|
|
42
40
|
history.destroy();
|
|
43
|
-
ddbClient
|
|
41
|
+
resolved.ddbClient?.destroy();
|
|
44
42
|
},
|
|
45
43
|
};
|
|
46
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/factory/factory.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/factory/factory.ts"],"names":[],"mappings":";;;AAEA,iDAAsD;AAEtD,0EAA6E;AAE7E,sDAAkE;AAElE,0CAA+C;AAyB/C;;;;GAIG;AACH;IAC+B,IAAI;IAAjC,YAA6B,IAAI,GAAuB,EAAE;oBAA7B,IAAI;IAA4B,CAAC;IAE9D,WAAW,CAAC,OAA6B;QACvC,OAAO,IAAI,qBAAa,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CAAC,OAA6B;QACvC,OAAO,IAAI,qBAAa,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,wBAAwB,CAAC,OAA0C;QACjE,OAAO,IAAI,iDAA0B,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,SAAS,CAAC,OAAyB;QACjC,MAAM,QAAQ,GAAG,IAAA,8BAAqB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,qBAAa,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,IAAI,qBAAa,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAI,iDAA0B,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,OAAO;YACL,KAAK;YACL,KAAK;YACL,OAAO;YACP,OAAO,EAAE,GAAG,EAAE;gBACZ,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChB,KAAK,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;YAChC,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/add-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA4BxD;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"add-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/add-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,0BAA0B,CAAC;AAQlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA4BxD;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -42,15 +42,16 @@ async function addMessages(context, sessionId, messages) {
|
|
|
42
42
|
if (messages.length === 0)
|
|
43
43
|
return;
|
|
44
44
|
const stored = (0, messages_1.mapChatMessagesToStoredMessages)(messages);
|
|
45
|
-
const
|
|
45
|
+
const anchor = context.ttl
|
|
46
46
|
? await (0, ttl_anchor_1.resolveTtlAnchor)(context, sessionId, (0, ttl_1.calculateTtlTimestamp)(context.ttl))
|
|
47
47
|
: undefined;
|
|
48
|
-
const items = await buildItems(context, sessionId, stored, ttlTimestamp);
|
|
48
|
+
const items = await buildItems(context, sessionId, stored, anchor?.ttlTimestamp);
|
|
49
49
|
const chunks = (0, message_chunker_1.chunkBySize)(items, MAX_MESSAGES_PER_TRANSACTION, MAX_TRANSACTION_BYTES);
|
|
50
50
|
await (0, append_saga_1.appendChunks)(context, sessionId, chunks, {
|
|
51
51
|
now: (0, clock_1.nowIso)(),
|
|
52
52
|
title: (0, title_generator_1.deriveTitle)(stored),
|
|
53
|
-
ttlTimestamp,
|
|
53
|
+
ttlTimestamp: anchor?.ttlTimestamp,
|
|
54
|
+
forceTtlRefresh: anchor?.refresh,
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
//# sourceMappingURL=add-messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-messages.js","sourceRoot":"","sources":["../../../src/history/actions/add-messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add-messages.js","sourceRoot":"","sources":["../../../src/history/actions/add-messages.ts"],"names":[],"mappings":";;;AAAA,uDAIkC;AAElC,8CAA4C;AAC5C,mEAA4E;AAC5E,qDAAoE;AACpE,yDAAuD;AACvD,yDAA2D;AAC3D,iEAA0D;AAE1D,iEAA0D;AAC1D,uDAA0D;AAG1D,yFAAyF;AACzF,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAExC;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAExC,KAAK,UAAU,UAAU,CACvB,OAAuB,EACvB,SAAiB,EACjB,MAAuB,EACvB,YAAqB;IAErB,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,IAAA,8BAAgB,EAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,sBACV,OAAuB,EACvB,SAAiB,EACjB,QAAuB;IAEvB,IAAA,mCAAsB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,MAAM,MAAM,GAAG,IAAA,0CAA+B,EAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG;QACxB,CAAC,CAAC,MAAM,IAAA,6BAAgB,EAAC,OAAO,EAAE,SAAS,EAAE,IAAA,2BAAqB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,IAAA,6BAAW,EAAC,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;IACvF,MAAM,IAAA,0BAAY,EAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;QAC7C,GAAG,EAAE,IAAA,cAAM,GAAE;QACb,KAAK,EAAE,IAAA,6BAAW,EAAC,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,EAAE,YAAY;QAClC,eAAe,EAAE,MAAM,EAAE,OAAO;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { HistoryContext } from '../internal/setup';
|
|
2
2
|
/**
|
|
3
|
-
* Delete a whole session: every message item plus the metadata item,
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Delete a whole session: every message item plus the metadata item, flushed
|
|
4
|
+
* in bounded batches as they're listed, plus best-effort S3 cleanup. Streams
|
|
5
|
+
* the partition with unbounded pagination so a session of any size is
|
|
6
|
+
* deleted to completion with bounded memory — never silently truncated at
|
|
7
|
+
* the in-memory page caps, and never discards already-flushed progress if a
|
|
8
|
+
* later batch fails.
|
|
6
9
|
*/
|
|
7
10
|
export declare function clearSession(context: HistoryContext, sessionId: string): Promise<void>;
|
|
8
11
|
//# sourceMappingURL=clear.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2BxD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5F"}
|
|
@@ -3,31 +3,44 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.clearSession = clearSession;
|
|
4
4
|
const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
|
|
5
5
|
const orphans_1 = require("../../shared/codec/s3/orphans");
|
|
6
|
+
const constants_1 = require("../../shared/constants");
|
|
6
7
|
const batch_write_1 = require("../../shared/dynamodb/batch-write");
|
|
7
8
|
const paginate_1 = require("../../shared/dynamodb/paginate");
|
|
8
9
|
const query_1 = require("../internal/query");
|
|
10
|
+
async function flushBuffer(context, buffer) {
|
|
11
|
+
if (buffer.keys.length === 0)
|
|
12
|
+
return;
|
|
13
|
+
await (0, batch_write_1.batchWriteAll)(context.client, context.tableName, buffer.keys.map((Key) => ({ DeleteRequest: { Key } })));
|
|
14
|
+
if (context.offloader) {
|
|
15
|
+
await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)(buffer.descriptors), 'history.clear', context.logger);
|
|
16
|
+
}
|
|
17
|
+
buffer.keys = [];
|
|
18
|
+
buffer.descriptors = [];
|
|
19
|
+
}
|
|
9
20
|
/**
|
|
10
|
-
* Delete a whole session: every message item plus the metadata item,
|
|
11
|
-
*
|
|
12
|
-
*
|
|
21
|
+
* Delete a whole session: every message item plus the metadata item, flushed
|
|
22
|
+
* in bounded batches as they're listed, plus best-effort S3 cleanup. Streams
|
|
23
|
+
* the partition with unbounded pagination so a session of any size is
|
|
24
|
+
* deleted to completion with bounded memory — never silently truncated at
|
|
25
|
+
* the in-memory page caps, and never discards already-flushed progress if a
|
|
26
|
+
* later batch fails.
|
|
13
27
|
*/
|
|
14
28
|
async function clearSession(context, sessionId) {
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
for await (const raw of (0, paginate_1.paginateQuery)({
|
|
29
|
+
const buffer = { keys: [], descriptors: [] };
|
|
30
|
+
const pages = (0, paginate_1.paginateQuery)({
|
|
18
31
|
client: context.client,
|
|
19
32
|
params: (0, query_1.sessionItemsQuery)(context.tableName, sessionId),
|
|
20
|
-
|
|
33
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
34
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
35
|
+
});
|
|
36
|
+
for await (const raw of pages) {
|
|
21
37
|
const item = raw;
|
|
22
|
-
|
|
38
|
+
buffer.keys.push({ PK: item.PK, SK: item.SK });
|
|
23
39
|
if (item.message)
|
|
24
|
-
descriptors.push(item.message);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return;
|
|
28
|
-
await (0, batch_write_1.batchWriteAll)(context.client, context.tableName, deletes);
|
|
29
|
-
if (context.offloader) {
|
|
30
|
-
await (0, orphans_1.cleanUpS3Orphans)(context.offloader, (0, descriptor_keys_1.collectS3Keys)(descriptors), 'history.clear', context.logger);
|
|
40
|
+
buffer.descriptors.push(item.message);
|
|
41
|
+
if (buffer.keys.length >= constants_1.BATCH_WRITE_MAX)
|
|
42
|
+
await flushBuffer(context, buffer);
|
|
31
43
|
}
|
|
44
|
+
await flushBuffer(context, buffer);
|
|
32
45
|
}
|
|
33
46
|
//# sourceMappingURL=clear.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/history/actions/clear.ts"],"names":[],"mappings":";;;AACA,wEAAmE;AACnE,2DAAiE;AACjE,sDAAyD;AACzD,mEAAkE;AAClE,6DAA+D;AAC/D,6CAAsD;AAStD,KAAK,UAAU,WAAW,CAAC,OAAuB,EAAE,MAAoB;IACtE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACrC,MAAM,IAAA,2BAAa,EACjB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,SAAS,EACjB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CACvD,CAAC;IACF,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,IAAA,0BAAgB,EACpB,OAAO,CAAC,SAAS,EACjB,IAAA,+BAAa,EAAC,MAAM,CAAC,WAAW,CAAC,EACjC,eAAe,EACf,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,uBAAuB,OAAuB,EAAE,SAAiB;IAC3E,MAAM,MAAM,GAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAA,wBAAa,EAAC;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,IAAA,yBAAiB,EAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;QACvD,QAAQ,EAAE,MAAM,CAAC,iBAAiB;QAClC,aAAa,EAAE,MAAM,CAAC,iBAAiB;KACxC,CAAC,CAAC;IACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAsB,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,2BAAe;YAAE,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"get-messages.d.ts","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAGjB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOxD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,CAcxB"}
|
|
@@ -19,6 +19,8 @@ async function getMessages(context, sessionId) {
|
|
|
19
19
|
for await (const raw of (0, paginate_1.paginateQuery)({
|
|
20
20
|
client: context.client,
|
|
21
21
|
params: (0, query_1.messageQuery)(context.tableName, sessionId),
|
|
22
|
+
maxItems: Number.POSITIVE_INFINITY,
|
|
23
|
+
maxIterations: Number.POSITIVE_INFINITY,
|
|
22
24
|
})) {
|
|
23
25
|
const item = raw;
|
|
24
26
|
if (isExpired(item, nowSeconds))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-messages.js","sourceRoot":"","sources":["../../../src/history/actions/get-messages.ts"],"names":[],"mappings":";;;AAAA,uDAIkC;AAElC,6DAA+D;AAC/D,yDAA4D;AAC5D,6CAAiD;AAIjD,SAAS,SAAS,CAAC,IAAqB,EAAE,UAAkB;IAC1D,OAAO,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACI,KAAK,sBACV,OAAuB,EACvB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAA,wBAAa,EAAC;QACpC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,IAAA,oBAAY,EAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;QAClD,QAAQ,EAAE,MAAM,CAAC,iBAAiB;QAClC,aAAa,EAAE,MAAM,CAAC,iBAAiB;KACxC,CAAC,EAAE,CAAC;QACH,MAAM,IAAI,GAAG,GAAsB,CAAC;QACpC,IAAI,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;YAAE,SAAS;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,IAAA,+BAAiB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAA,0CAA+B,EAAC,MAAM,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -5,5 +5,8 @@ import type { SessionMetadata } from '../types';
|
|
|
5
5
|
* filtered to session items so the adapter works on a table shared with the
|
|
6
6
|
* checkpointer/store; foreign rows are also skipped defensively.
|
|
7
7
|
*/
|
|
8
|
-
export declare function listSessions(context: HistoryContext
|
|
8
|
+
export declare function listSessions(context: HistoryContext, options?: {
|
|
9
|
+
maxIterations?: number;
|
|
10
|
+
maxItems?: number;
|
|
11
|
+
}): Promise<SessionMetadata[]>;
|
|
9
12
|
//# sourceMappingURL=list-sessions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-sessions.d.ts","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,UAAU,CAAC;AAEjE;;;;GAIG;AACH,wBAAsB,YAAY,
|
|
1
|
+
{"version":3,"file":"list-sessions.d.ts","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,UAAU,CAAC;AAEjE;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,eAAe,EAAE,CAAC,CAyB5B"}
|
|
@@ -8,7 +8,7 @@ const keys_1 = require("../internal/keys");
|
|
|
8
8
|
* filtered to session items so the adapter works on a table shared with the
|
|
9
9
|
* checkpointer/store; foreign rows are also skipped defensively.
|
|
10
10
|
*/
|
|
11
|
-
async function listSessions(context) {
|
|
11
|
+
async function listSessions(context, options) {
|
|
12
12
|
const sessions = [];
|
|
13
13
|
for await (const raw of (0, scan_1.paginateScan)({
|
|
14
14
|
client: context.client,
|
|
@@ -18,6 +18,8 @@ async function listSessions(context) {
|
|
|
18
18
|
ExpressionAttributeNames: { '#sk': 'SK' },
|
|
19
19
|
ExpressionAttributeValues: { ':session': keys_1.SESSION_SORT_KEY },
|
|
20
20
|
},
|
|
21
|
+
maxIterations: options?.maxIterations,
|
|
22
|
+
maxItems: options?.maxItems,
|
|
21
23
|
})) {
|
|
22
24
|
const item = raw;
|
|
23
25
|
if (item.SK !== keys_1.SESSION_SORT_KEY || typeof item.sessionId !== 'string')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/history/actions/list-sessions.ts"],"names":[],"mappings":";;;AAAA,qDAA0D;AAC1D,2CAAoD;AAIpD;;;;GAIG;AACI,KAAK,uBACV,OAAuB,EACvB,OAAuD;IAEvD,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAA,mBAAY,EAAC;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE;YACN,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,gBAAgB;YAClC,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;YACzC,yBAAyB,EAAE,EAAE,UAAU,EAAE,uBAAgB,EAAE;SAC5D;QACD,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,QAAQ,EAAE,OAAO,EAAE,QAAQ;KAC5B,CAAC,EAAE,CAAC;QACH,MAAM,IAAI,GAAG,GAAsB,CAAC;QACpC,IAAI,IAAI,CAAC,EAAE,KAAK,uBAAgB,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;YAAE,SAAS;QACjF,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -4,7 +4,10 @@ import type { HistoryContext } from '../internal/setup';
|
|
|
4
4
|
* and write it back, repairing any drift. A repair tool: the append path keeps
|
|
5
5
|
* the count consistent transactionally, so this is only needed after external
|
|
6
6
|
* corruption. Run it when the session is quiescent — it `SET`s the count, so a
|
|
7
|
-
* concurrent append's increment could be clobbered.
|
|
7
|
+
* concurrent append's increment could be clobbered. Requires the session to
|
|
8
|
+
* already exist; reconciling a nonexistent session throws {@link ConflictError}
|
|
9
|
+
* rather than creating a permanent, TTL-less metadata-only row. Returns the
|
|
10
|
+
* reconciled count.
|
|
8
11
|
*/
|
|
9
12
|
export declare function reconcileMessageCount(context: HistoryContext, sessionId: string): Promise<number>;
|
|
10
13
|
//# sourceMappingURL=reconcile-count.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-count.d.ts","sourceRoot":"","sources":["../../../src/history/actions/reconcile-count.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reconcile-count.d.ts","sourceRoot":"","sources":["../../../src/history/actions/reconcile-count.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgBxD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.reconcileMessageCount = reconcileMessageCount;
|
|
4
4
|
const retry_1 = require("../../shared/dynamodb/retry");
|
|
5
|
+
const errors_1 = require("../../shared/errors/errors");
|
|
5
6
|
const primitives_1 = require("../../shared/validation/primitives");
|
|
6
7
|
const keys_1 = require("../internal/keys");
|
|
7
8
|
const query_1 = require("../internal/query");
|
|
8
|
-
/** Count a session's message items with a server-side `COUNT` query, all pages. */
|
|
9
9
|
async function countMessages(context, sessionId) {
|
|
10
10
|
const base = (0, query_1.messageQuery)(context.tableName, sessionId);
|
|
11
11
|
let total = 0;
|
|
@@ -22,18 +22,30 @@ async function countMessages(context, sessionId) {
|
|
|
22
22
|
* and write it back, repairing any drift. A repair tool: the append path keeps
|
|
23
23
|
* the count consistent transactionally, so this is only needed after external
|
|
24
24
|
* corruption. Run it when the session is quiescent — it `SET`s the count, so a
|
|
25
|
-
* concurrent append's increment could be clobbered.
|
|
25
|
+
* concurrent append's increment could be clobbered. Requires the session to
|
|
26
|
+
* already exist; reconciling a nonexistent session throws {@link ConflictError}
|
|
27
|
+
* rather than creating a permanent, TTL-less metadata-only row. Returns the
|
|
28
|
+
* reconciled count.
|
|
26
29
|
*/
|
|
27
30
|
async function reconcileMessageCount(context, sessionId) {
|
|
28
31
|
(0, primitives_1.validateNonEmptyString)(sessionId, 'sessionId');
|
|
29
32
|
const count = await countMessages(context, sessionId);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
try {
|
|
34
|
+
await (0, retry_1.withDynamoDBRetry)(() => context.client.update({
|
|
35
|
+
TableName: context.tableName,
|
|
36
|
+
Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
|
|
37
|
+
UpdateExpression: 'SET #count = :count',
|
|
38
|
+
ExpressionAttributeNames: { '#count': 'messageCount' },
|
|
39
|
+
ExpressionAttributeValues: { ':count': count },
|
|
40
|
+
ConditionExpression: 'attribute_exists(PK)',
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error.name === 'ConditionalCheckFailedException') {
|
|
45
|
+
throw new errors_1.ConflictError(`Cannot reconcile messageCount: session "${sessionId}" does not exist`, error);
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
37
49
|
return count;
|
|
38
50
|
}
|
|
39
51
|
//# sourceMappingURL=reconcile-count.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-count.js","sourceRoot":"","sources":["../../../src/history/actions/reconcile-count.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reconcile-count.js","sourceRoot":"","sources":["../../../src/history/actions/reconcile-count.ts"],"names":[],"mappings":";;;AAEA,uDAAgE;AAChE,uDAA2D;AAC3D,mEAA4E;AAC5E,2CAAsE;AACtE,6CAAiD;AAGjD,KAAK,UAAU,aAAa,CAAC,OAAuB,EAAE,SAAiB;IACrE,MAAM,IAAI,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAA0D,CAAC;IAC/D,GAAG,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAChF,CAAC;QACF,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACzB,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACnC,CAAC,QAAQ,QAAQ,EAAE;IACnB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,gCACV,OAAuB,EACvB,SAAiB;IAEjB,IAAA,mCAAsB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,IAAA,yBAAiB,EAAC,GAAG,EAAE,CAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC,EAAE,EAAE,EAAE,uBAAgB,EAAE;YAC9D,gBAAgB,EAAE,qBAAqB;YACvC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;YACtD,yBAAyB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC9C,mBAAmB,EAAE,sBAAsB;SAC5C,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA2B,CAAC,IAAI,KAAK,iCAAiC,EAAE,CAAC;YAC5E,MAAM,IAAI,sBAAa,CACrB,2CAA2C,SAAS,kBAAkB,EACtE,KAAc,CACf,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -22,7 +22,10 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
22
22
|
/** Delete a session and any offloaded payload. */
|
|
23
23
|
clear(sessionId: string): Promise<void>;
|
|
24
24
|
/** List all sessions as metadata summaries. */
|
|
25
|
-
listSessions(
|
|
25
|
+
listSessions(options?: {
|
|
26
|
+
maxIterations?: number;
|
|
27
|
+
maxItems?: number;
|
|
28
|
+
}): Promise<SessionMetadata[]>;
|
|
26
29
|
/**
|
|
27
30
|
* Recompute and repair a session's `messageCount` from the stored messages.
|
|
28
31
|
* A maintenance tool for external corruption; run it when the session is idle.
|
|
@@ -32,5 +35,14 @@ export declare class DynamoDBChatMessageHistory {
|
|
|
32
35
|
forSession(sessionId: string): DynamoDBSessionChatMessageHistory;
|
|
33
36
|
/** Release owned resources (the underlying client and any S3 client). */
|
|
34
37
|
destroy(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Best-effort provision an S3 lifecycle expiration rule matching the
|
|
40
|
+
* configured TTL, so offloaded objects don't outlive their DynamoDB item
|
|
41
|
+
* forever. No-ops when S3 offload or TTL isn't configured. Requires the
|
|
42
|
+
* `s3:GetLifecycleConfiguration`/`s3:PutLifecycleConfiguration` bucket-level
|
|
43
|
+
* permissions (broader than the object-level CRUD the rest of S3 offload
|
|
44
|
+
* needs) — call this once during deployment/provisioning, not per-request.
|
|
45
|
+
*/
|
|
46
|
+
ensureS3LifecycleRule(): Promise<void>;
|
|
35
47
|
}
|
|
36
48
|
//# sourceMappingURL=chat-message-history.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message-history.d.ts","sourceRoot":"","sources":["../../src/history/chat-message-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-message-history.d.ts","sourceRoot":"","sources":["../../src/history/chat-message-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAS5D,OAAO,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,iCAAiC,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAElF;;;;;;GAMG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IAEzE,YAAY,OAAO,EAAE,iCAAiC,EAKrD;IAED,yCAAyC;IACzC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAErD;IAED,oCAAoC;IACpC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;IAED,4CAA4C;IAC5C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;IAED,kDAAkD;IAClD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtC;IAED,+CAA+C;IAC/C,YAAY,CAAC,OAAO,CAAC,EAAE;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAE7B;IAED;;;OAGG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAExD;IAED,8DAA8D;IAC9D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,iCAAiC,CAE/D;IAED,yEAAyE;IACzE,OAAO,IAAI,IAAI,CAGd;IAED;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3C;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DynamoDBChatMessageHistory = void 0;
|
|
4
|
+
const ttl_1 = require("../shared/validation/ttl");
|
|
4
5
|
const add_messages_1 = require("./actions/add-messages");
|
|
5
6
|
const clear_1 = require("./actions/clear");
|
|
6
7
|
const get_messages_1 = require("./actions/get-messages");
|
|
@@ -42,8 +43,8 @@ class DynamoDBChatMessageHistory {
|
|
|
42
43
|
return (0, clear_1.clearSession)(this.context, sessionId);
|
|
43
44
|
}
|
|
44
45
|
/** List all sessions as metadata summaries. */
|
|
45
|
-
listSessions() {
|
|
46
|
-
return (0, list_sessions_1.listSessions)(this.context);
|
|
46
|
+
listSessions(options) {
|
|
47
|
+
return (0, list_sessions_1.listSessions)(this.context, options);
|
|
47
48
|
}
|
|
48
49
|
/**
|
|
49
50
|
* Recompute and repair a session's `messageCount` from the stored messages.
|
|
@@ -62,6 +63,19 @@ class DynamoDBChatMessageHistory {
|
|
|
62
63
|
if (this.ownsClient)
|
|
63
64
|
this.ddbClient?.destroy();
|
|
64
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Best-effort provision an S3 lifecycle expiration rule matching the
|
|
68
|
+
* configured TTL, so offloaded objects don't outlive their DynamoDB item
|
|
69
|
+
* forever. No-ops when S3 offload or TTL isn't configured. Requires the
|
|
70
|
+
* `s3:GetLifecycleConfiguration`/`s3:PutLifecycleConfiguration` bucket-level
|
|
71
|
+
* permissions (broader than the object-level CRUD the rest of S3 offload
|
|
72
|
+
* needs) — call this once during deployment/provisioning, not per-request.
|
|
73
|
+
*/
|
|
74
|
+
async ensureS3LifecycleRule() {
|
|
75
|
+
if (!this.context.offloader || !this.context.ttl)
|
|
76
|
+
return;
|
|
77
|
+
await this.context.offloader.ensureLifecycleRule((0, ttl_1.resolveTtlDaysCeil)(this.context.ttl));
|
|
78
|
+
}
|
|
65
79
|
}
|
|
66
80
|
exports.DynamoDBChatMessageHistory = DynamoDBChatMessageHistory;
|
|
67
81
|
//# sourceMappingURL=chat-message-history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message-history.js","sourceRoot":"","sources":["../../src/history/chat-message-history.ts"],"names":[],"mappings":";;;AAEA,yDAA0E;AAC1E,2CAA+C;AAC/C,yDAA0E;AAC1E,2DAA6E;AAC7E,+DAAiG;AACjG,4CAAqE;AACrE,uDAAsE;AAGtE;;;;;;GAMG;AACH
|
|
1
|
+
{"version":3,"file":"chat-message-history.js","sourceRoot":"","sources":["../../src/history/chat-message-history.ts"],"names":[],"mappings":";;;AAEA,kDAA8D;AAC9D,yDAA0E;AAC1E,2CAA+C;AAC/C,yDAA0E;AAC1E,2DAA6E;AAC7E,+DAAiG;AACjG,4CAAqE;AACrE,uDAAsE;AAGtE;;;;;;GAMG;AACH;IACmB,OAAO,CAAiB;IACxB,UAAU,CAAU;IACpB,SAAS,CAA+C;IAEzE,YAAY,OAA0C;QACpD,MAAM,KAAK,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACnC,CAAC;IAED,yCAAyC;IACzC,WAAW,CAAC,SAAiB;QAC3B,OAAO,IAAA,0BAAiB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED,oCAAoC;IACpC,WAAW,CAAC,SAAiB,EAAE,QAAuB;QACpD,OAAO,IAAA,0BAAiB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,4CAA4C;IAC5C,UAAU,CAAC,SAAiB,EAAE,OAAoB;QAChD,OAAO,IAAA,0BAAiB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAA,oBAAY,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,+CAA+C;IAC/C,YAAY,CAAC,OAGZ;QACC,OAAO,IAAA,4BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,qBAAqB,CAAC,SAAiB;QACrC,OAAO,IAAA,uCAA2B,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,8DAA8D;IAC9D,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,mDAAiC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,yEAAyE;IACzE,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU;YAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IACjD,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,OAAO;QACzD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAA,wBAAkB,EAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,CAAC;CACF"}
|
|
@@ -5,13 +5,16 @@ export interface AppendFields {
|
|
|
5
5
|
now: string;
|
|
6
6
|
title?: string;
|
|
7
7
|
ttlTimestamp?: number;
|
|
8
|
+
forceTtlRefresh?: boolean;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Append message chunks with caller-observed atomicity. Each chunk commits its
|
|
11
12
|
* messages and count in one transaction; if a later chunk fails, every
|
|
12
|
-
* already-committed chunk is deleted and its count reverted, and
|
|
13
|
-
* objects are cleaned, restoring the pre-call
|
|
14
|
-
*
|
|
13
|
+
* already-committed chunk is deleted and its count reverted, and the batch's
|
|
14
|
+
* S3 objects are cleaned once their rows are gone, restoring the pre-call
|
|
15
|
+
* state before the error is rethrown. Except on a failed rollback, which
|
|
16
|
+
* surfaces as {@link CompensationFailedError} and deliberately leaves the
|
|
17
|
+
* committed chunks' S3 objects behind, since their rows may survive.
|
|
15
18
|
*/
|
|
16
19
|
export declare function appendChunks(context: HistoryContext, sessionId: string, chunks: ChatMessageItem[][], fields: AppendFields): Promise<void>;
|
|
17
20
|
//# sourceMappingURL=append-saga.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append-saga.d.ts","sourceRoot":"","sources":["../../../src/history/internal/append-saga.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"append-saga.d.ts","sourceRoot":"","sources":["../../../src/history/internal/append-saga.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,0EAA0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAmGD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,EAAE,EAAE,EAC3B,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.appendChunks = appendChunks;
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
4
5
|
const descriptor_keys_1 = require("../../shared/codec/descriptor-keys");
|
|
5
6
|
const orphans_1 = require("../../shared/codec/s3/orphans");
|
|
6
7
|
const batch_write_1 = require("../../shared/dynamodb/batch-write");
|
|
@@ -13,15 +14,21 @@ const message_transaction_1 = require("./message-transaction");
|
|
|
13
14
|
async function revertSessionCount(context, sessionId, delta) {
|
|
14
15
|
if (delta === 0)
|
|
15
16
|
return;
|
|
16
|
-
|
|
17
|
+
const update = {
|
|
17
18
|
TableName: context.tableName,
|
|
18
19
|
Key: { PK: (0, keys_1.sessionPartition)(sessionId), SK: keys_1.SESSION_SORT_KEY },
|
|
19
20
|
UpdateExpression: 'ADD #count :neg',
|
|
20
21
|
ExpressionAttributeNames: { '#count': 'messageCount' },
|
|
21
22
|
ExpressionAttributeValues: { ':neg': -delta },
|
|
22
|
-
}
|
|
23
|
+
};
|
|
24
|
+
const input = { TransactItems: [{ Update: update }], ClientRequestToken: (0, node_crypto_1.randomUUID)() };
|
|
25
|
+
await (0, retry_1.withDynamoDBRetry)(() => context.client.transactWrite(input));
|
|
23
26
|
}
|
|
24
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Best-effort delete the offloaded S3 objects of the `chunks` slice given.
|
|
29
|
+
* {@link compensate} calls it once per commit status, never for the whole
|
|
30
|
+
* batch, so a committed chunk's objects arrive only once its rows are gone.
|
|
31
|
+
*/
|
|
25
32
|
async function cleanBatchS3(context, chunks) {
|
|
26
33
|
if (!context.offloader)
|
|
27
34
|
return;
|
|
@@ -38,10 +45,13 @@ async function rollbackCommitted(context, sessionId, committed) {
|
|
|
38
45
|
await revertSessionCount(context, sessionId, total);
|
|
39
46
|
}
|
|
40
47
|
/**
|
|
41
|
-
* Undo a failed batch
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
48
|
+
* Undo a failed batch. Always throws. S3 cleanup is split by commit status so
|
|
49
|
+
* no live row is ever left pointing at a deleted object: the never-committed
|
|
50
|
+
* suffix is cleaned immediately, the committed prefix only after its rows are
|
|
51
|
+
* confirmed deleted. If the rollback itself fails, the committed chunks' S3
|
|
52
|
+
* objects are deliberately left in place (their rows may survive) and it
|
|
53
|
+
* raises {@link CompensationFailedError} carrying both the trigger and the
|
|
54
|
+
* rollback error; otherwise it rethrows the trigger.
|
|
45
55
|
*/
|
|
46
56
|
async function compensate(context, sessionId, chunks, committed, trigger) {
|
|
47
57
|
if (committed.length > 0) {
|
|
@@ -50,7 +60,8 @@ async function compensate(context, sessionId, chunks, committed, trigger) {
|
|
|
50
60
|
committedChunks: committed.length,
|
|
51
61
|
});
|
|
52
62
|
}
|
|
53
|
-
|
|
63
|
+
/** The failed/never-attempted suffix never had a DynamoDB row, so it's safe to clean now. */
|
|
64
|
+
await cleanBatchS3(context, chunks.slice(committed.length));
|
|
54
65
|
try {
|
|
55
66
|
await rollbackCommitted(context, sessionId, committed);
|
|
56
67
|
}
|
|
@@ -59,27 +70,30 @@ async function compensate(context, sessionId, chunks, committed, trigger) {
|
|
|
59
70
|
sessionId,
|
|
60
71
|
committedChunks: committed.length,
|
|
61
72
|
});
|
|
73
|
+
/** Skip S3 cleanup here: rollback may have failed, so committed rows might still reference these objects. */
|
|
62
74
|
throw new errors_1.CompensationFailedError(trigger, (0, wrap_error_1.toError)(rollbackError));
|
|
63
75
|
}
|
|
76
|
+
/** Only now that committed rows are confirmed deleted is it safe to delete their S3 objects. */
|
|
77
|
+
await cleanBatchS3(context, chunks.slice(0, committed.length));
|
|
64
78
|
throw trigger;
|
|
65
79
|
}
|
|
66
80
|
/**
|
|
67
81
|
* Append message chunks with caller-observed atomicity. Each chunk commits its
|
|
68
82
|
* messages and count in one transaction; if a later chunk fails, every
|
|
69
|
-
* already-committed chunk is deleted and its count reverted, and
|
|
70
|
-
* objects are cleaned, restoring the pre-call
|
|
71
|
-
*
|
|
83
|
+
* already-committed chunk is deleted and its count reverted, and the batch's
|
|
84
|
+
* S3 objects are cleaned once their rows are gone, restoring the pre-call
|
|
85
|
+
* state before the error is rethrown. Except on a failed rollback, which
|
|
86
|
+
* surfaces as {@link CompensationFailedError} and deliberately leaves the
|
|
87
|
+
* committed chunks' S3 objects behind, since their rows may survive.
|
|
72
88
|
*/
|
|
73
89
|
async function appendChunks(context, sessionId, chunks, fields) {
|
|
74
90
|
const committed = [];
|
|
75
91
|
for (const chunk of chunks) {
|
|
76
92
|
try {
|
|
77
93
|
await (0, message_transaction_1.writeMessageChunk)(context, chunk, {
|
|
94
|
+
...fields,
|
|
78
95
|
sessionId,
|
|
79
96
|
count: chunk.length,
|
|
80
|
-
now: fields.now,
|
|
81
|
-
title: fields.title,
|
|
82
|
-
ttlTimestamp: fields.ttlTimestamp,
|
|
83
97
|
});
|
|
84
98
|
committed.push({
|
|
85
99
|
keys: chunk.map((item) => ({ PK: item.PK, SK: item.SK })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append-saga.js","sourceRoot":"","sources":["../../../src/history/internal/append-saga.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"append-saga.js","sourceRoot":"","sources":["../../../src/history/internal/append-saga.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-mapper.js","sourceRoot":"","sources":["../../../src/history/internal/item-mapper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"item-mapper.js","sourceRoot":"","sources":["../../../src/history/internal/item-mapper.ts"],"names":[],"mappings":";;;;AAEA,oDAAwF;AAExF,iCAA0D;AAG1D,SAAS,SAAS,CAAC,OAAuB;IACxC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACI,KAAK,2BACV,OAAuB,EACvB,SAAiB,EACjB,IAAY,EACZ,OAAsB,EACtB,YAAqB;IAErB,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAa,EAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE;QAClE,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,IAAI,GAAoB;QAC5B,EAAE,EAAE,IAAA,uBAAgB,EAAC,SAAS,CAAC;QAC/B,EAAE,EAAE,IAAA,qBAAc,EAAC,IAAI,CAAC;QACxB,SAAS;QACT,OAAO,EAAE,UAAU;KACpB,CAAC;IACF,IAAI,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iEAAiE;AAC1D,KAAK,4BACV,OAAuB,EACvB,IAAqB;IAErB,OAAO,IAAA,qBAAa,EAAgB,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/history/internal/keys.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/history/internal/keys.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAwD;AAC3C,QAAA,gBAAgB,GAAG,SAAS,CAAC;AAE1C,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B,+DAA+D;AAC/D,0BAAiC,SAAiB;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yEAAyE;AACzE,wBAA+B,IAAY;IACzC,OAAO,GAAG,cAAc,GAAG,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,sEAAsE;AACtE;IACE,OAAO,cAAc,CAAC;AACxB,CAAC"}
|