quidproquo-actionprocessor-awslambda 0.1.12 → 0.1.14

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 (103) hide show
  1. package/lib/commonjs/getActionProcessor/core/event/dynamo/index.d.ts +1 -0
  2. package/lib/commonjs/getActionProcessor/core/event/dynamo/index.js +18 -0
  3. package/lib/commonjs/getActionProcessor/core/event/dynamo/index.js.map +1 -0
  4. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.d.ts +2 -0
  5. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.js +25 -0
  6. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.js.map +1 -0
  7. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.d.ts +2 -0
  8. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.js +88 -0
  9. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.js.map +1 -0
  10. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.d.ts +2 -0
  11. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.js +27 -0
  12. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.js.map +1 -0
  13. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.d.ts +2 -0
  14. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.js +30 -0
  15. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.js.map +1 -0
  16. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.d.ts +2 -0
  17. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.js +34 -0
  18. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.js.map +1 -0
  19. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/index.d.ts +2 -0
  20. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/index.js +22 -0
  21. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/index.js.map +1 -0
  22. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/types.d.ts +11 -0
  23. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/types.js +14 -0
  24. package/lib/commonjs/getActionProcessor/core/event/dynamo/streamEvent/types.js.map +1 -0
  25. package/lib/commonjs/getActionProcessor/core/event/index.d.ts +1 -0
  26. package/lib/commonjs/getActionProcessor/core/event/index.js +1 -0
  27. package/lib/commonjs/getActionProcessor/core/event/index.js.map +1 -1
  28. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +1 -1
  29. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js.map +1 -1
  30. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.d.ts +2 -0
  31. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.js +58 -0
  32. package/lib/commonjs/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.js.map +1 -0
  33. package/lib/commonjs/getActionProcessor/core/keyValueStore/index.js +2 -1
  34. package/lib/commonjs/getActionProcessor/core/keyValueStore/index.js.map +1 -1
  35. package/lib/commonjs/getLambdaEntries.js +1 -0
  36. package/lib/commonjs/getLambdaEntries.js.map +1 -1
  37. package/lib/commonjs/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.d.ts +3 -0
  38. package/lib/commonjs/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.js +10 -0
  39. package/lib/commonjs/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.js.map +1 -0
  40. package/lib/commonjs/lambdaHandlers/index.d.ts +1 -0
  41. package/lib/commonjs/lambdaHandlers/index.js +1 -0
  42. package/lib/commonjs/lambdaHandlers/index.js.map +1 -1
  43. package/lib/commonjs/lambdas/dynamoStreamEvent_kvsStreamEvent.d.ts +1 -0
  44. package/lib/commonjs/lambdas/dynamoStreamEvent_kvsStreamEvent.js +8 -0
  45. package/lib/commonjs/lambdas/dynamoStreamEvent_kvsStreamEvent.js.map +1 -0
  46. package/lib/commonjs/lambdas/index.d.ts +1 -0
  47. package/lib/commonjs/lambdas/index.js +16 -0
  48. package/lib/commonjs/lambdas/index.js.map +1 -1
  49. package/lib/commonjs/logic/dynamo/query.d.ts +1 -1
  50. package/lib/commonjs/logic/dynamo/query.js +5 -1
  51. package/lib/commonjs/logic/dynamo/query.js.map +1 -1
  52. package/lib/esm/getActionProcessor/core/event/dynamo/index.d.ts +1 -0
  53. package/lib/esm/getActionProcessor/core/event/dynamo/index.js +2 -0
  54. package/lib/esm/getActionProcessor/core/event/dynamo/index.js.map +1 -0
  55. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.d.ts +2 -0
  56. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.js +10 -0
  57. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.js.map +1 -0
  58. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.d.ts +2 -0
  59. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.js +71 -0
  60. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.js.map +1 -0
  61. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.d.ts +2 -0
  62. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.js +12 -0
  63. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.js.map +1 -0
  64. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.d.ts +2 -0
  65. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.js +15 -0
  66. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.js.map +1 -0
  67. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.d.ts +2 -0
  68. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.js +19 -0
  69. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.js.map +1 -0
  70. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/index.d.ts +2 -0
  71. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/index.js +13 -0
  72. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/index.js.map +1 -0
  73. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/types.d.ts +11 -0
  74. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/types.js +11 -0
  75. package/lib/esm/getActionProcessor/core/event/dynamo/streamEvent/types.js.map +1 -0
  76. package/lib/esm/getActionProcessor/core/event/index.d.ts +1 -0
  77. package/lib/esm/getActionProcessor/core/event/index.js +1 -0
  78. package/lib/esm/getActionProcessor/core/event/index.js.map +1 -1
  79. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js +1 -1
  80. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.js.map +1 -1
  81. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.d.ts +2 -0
  82. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.js +42 -0
  83. package/lib/esm/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.js.map +1 -0
  84. package/lib/esm/getActionProcessor/core/keyValueStore/index.js +2 -0
  85. package/lib/esm/getActionProcessor/core/keyValueStore/index.js.map +1 -1
  86. package/lib/esm/getLambdaEntries.js +1 -0
  87. package/lib/esm/getLambdaEntries.js.map +1 -1
  88. package/lib/esm/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.d.ts +3 -0
  89. package/lib/esm/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.js +6 -0
  90. package/lib/esm/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.js.map +1 -0
  91. package/lib/esm/lambdaHandlers/index.d.ts +1 -0
  92. package/lib/esm/lambdaHandlers/index.js +1 -0
  93. package/lib/esm/lambdaHandlers/index.js.map +1 -1
  94. package/lib/esm/lambdas/dynamoStreamEvent_kvsStreamEvent.d.ts +1 -0
  95. package/lib/esm/lambdas/dynamoStreamEvent_kvsStreamEvent.js +5 -0
  96. package/lib/esm/lambdas/dynamoStreamEvent_kvsStreamEvent.js.map +1 -0
  97. package/lib/esm/lambdas/index.d.ts +1 -0
  98. package/lib/esm/lambdas/index.js +1 -1
  99. package/lib/esm/lambdas/index.js.map +1 -1
  100. package/lib/esm/logic/dynamo/query.d.ts +1 -1
  101. package/lib/esm/logic/dynamo/query.js +5 -1
  102. package/lib/esm/logic/dynamo/query.js.map +1 -1
  103. package/package.json +7 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDynamoStreamEvent_kvsStreamEvent.js","sourceRoot":"","sources":["../../../src/lambdaHandlers/getDynamoStreamEvent_kvsStreamEvent.ts"],"names":[],"mappings":";;;AAAA,qDAAiF;AAIjF,8DAAyE;AACzE,yEAAsE;AACtE,uFAAoF;AAE7E,MAAM,mCAAmC,GAAG,CAAC,mBAAwC,EAAE,SAAoB,EAAE,EAAE,CACpH,IAAA,yDAA2B,EACzB,gCAAc,CAAC,gBAAgB,EAC/B,2CAAoB,EACpB,qDAAgC,EAChC,mBAAmB,EACnB,SAAS,CACV,CAAC;AAPS,QAAA,mCAAmC,uCAO5C","sourcesContent":["import { DynamicModuleLoader, QPQConfig, QpqRuntimeType } from 'quidproquo-core';\n\nimport { DynamoDBStreamEvent } from 'aws-lambda';\n\nimport { getDynamoKvsStreamEventProcessor } from '../getActionProcessor';\nimport { getBlankStorySession } from './helpers/getBlankStorySession';\nimport { getQpqLambdaRuntimeForEvent } from './helpers/getQpqLambdaRuntimeForEvent';\n\nexport const getDynamoStreamEvent_kvsStreamEvent = (dynamicModuleLoader: DynamicModuleLoader, qpqConfig: QPQConfig) =>\n getQpqLambdaRuntimeForEvent<DynamoDBStreamEvent>(\n QpqRuntimeType.KVS_STREAM_EVENT,\n getBlankStorySession,\n getDynamoKvsStreamEventProcessor,\n dynamicModuleLoader,\n qpqConfig,\n );\n"]}
@@ -1,3 +1,4 @@
1
+ export * from './getDynamoStreamEvent_kvsStreamEvent';
1
2
  export * from './getAnyExecuteServiceFunctionEvent_serviceFunction';
2
3
  export * from './getApiGatewayEventHandler';
3
4
  export * from './getApiGatewayEventHandler_redirect';
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./getDynamoStreamEvent_kvsStreamEvent"), exports);
17
18
  __exportStar(require("./getAnyExecuteServiceFunctionEvent_serviceFunction"), exports);
18
19
  __exportStar(require("./getApiGatewayEventHandler"), exports);
19
20
  __exportStar(require("./getApiGatewayEventHandler_redirect"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lambdaHandlers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sFAAoE;AACpE,8DAA4C;AAC5C,uEAAqD;AACrD,0FAAwE;AACxE,4EAA0D;AAC1D,4EAA0D;AAC1D,qFAAmE;AACnE,+EAA6D;AAC7D,qFAAmE;AACnE,qFAAmE;AACnE,0EAAwD;AACxD,oEAAkD;AAClD,yDAAuC;AACvC,2DAAyC;AACzC,4CAA0B;AAC1B,0CAAwB","sourcesContent":["export * from './getAnyExecuteServiceFunctionEvent_serviceFunction';\nexport * from './getApiGatewayEventHandler';\nexport * from './getApiGatewayEventHandler_redirect';\nexport * from './getApiGatwayEventWebsocketWithIdentity_websocketEvent';\nexport * from './getCloudFrontRequestEvent_originRequest';\nexport * from './getCloudFrontRequestEvent_viewerRequest';\nexport * from './getCustomMessageTriggerEvent_createAuthChallenge';\nexport * from './getCustomMessageTriggerEvent_customMessage';\nexport * from './getCustomMessageTriggerEvent_defineAuthChallenge';\nexport * from './getCustomMessageTriggerEvent_verifyAuthChallenge';\nexport * from './getEventBridgeEvent_recurringSchedule';\nexport * from './getEventBridgeEvent_stackDeploy';\nexport * from './getS3Event_fileEvent';\nexport * from './getSqsEvent_queueEvent';\nexport * from './helpers';\nexport * from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lambdaHandlers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wEAAsD;AACtD,sFAAoE;AACpE,8DAA4C;AAC5C,uEAAqD;AACrD,0FAAwE;AACxE,4EAA0D;AAC1D,4EAA0D;AAC1D,qFAAmE;AACnE,+EAA6D;AAC7D,qFAAmE;AACnE,qFAAmE;AACnE,0EAAwD;AACxD,oEAAkD;AAClD,yDAAuC;AACvC,2DAAyC;AACzC,4CAA0B;AAC1B,0CAAwB","sourcesContent":["export * from './getDynamoStreamEvent_kvsStreamEvent';\nexport * from './getAnyExecuteServiceFunctionEvent_serviceFunction';\nexport * from './getApiGatewayEventHandler';\nexport * from './getApiGatewayEventHandler_redirect';\nexport * from './getApiGatwayEventWebsocketWithIdentity_websocketEvent';\nexport * from './getCloudFrontRequestEvent_originRequest';\nexport * from './getCloudFrontRequestEvent_viewerRequest';\nexport * from './getCustomMessageTriggerEvent_createAuthChallenge';\nexport * from './getCustomMessageTriggerEvent_customMessage';\nexport * from './getCustomMessageTriggerEvent_defineAuthChallenge';\nexport * from './getCustomMessageTriggerEvent_verifyAuthChallenge';\nexport * from './getEventBridgeEvent_recurringSchedule';\nexport * from './getEventBridgeEvent_stackDeploy';\nexport * from './getS3Event_fileEvent';\nexport * from './getSqsEvent_queueEvent';\nexport * from './helpers';\nexport * from './types';\n"]}
@@ -0,0 +1 @@
1
+ export declare const dynamoStreamEvent_kvsStreamEvent: (event: import("aws-lambda").DynamoDBStreamEvent, context: import("aws-lambda").Context) => Promise<any>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dynamoStreamEvent_kvsStreamEvent = void 0;
4
+ const lambdaHandlers_1 = require("../lambdaHandlers");
5
+ const dynamicModuleLoader_1 = require("./dynamicModuleLoader");
6
+ const lambda_utils_1 = require("./lambda-utils");
7
+ exports.dynamoStreamEvent_kvsStreamEvent = (0, lambdaHandlers_1.getDynamoStreamEvent_kvsStreamEvent)(dynamicModuleLoader_1.dynamicModuleLoader, (0, lambda_utils_1.getQpqConfig)());
8
+ //# sourceMappingURL=dynamoStreamEvent_kvsStreamEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamoStreamEvent_kvsStreamEvent.js","sourceRoot":"","sources":["../../../src/lambdas/dynamoStreamEvent_kvsStreamEvent.ts"],"names":[],"mappings":";;;AAAA,sDAAwE;AACxE,+DAA4D;AAC5D,iDAA8C;AAEjC,QAAA,gCAAgC,GAAG,IAAA,oDAAmC,EAAC,yCAAmB,EAAE,IAAA,2BAAY,GAAE,CAAC,CAAC","sourcesContent":["import { getDynamoStreamEvent_kvsStreamEvent } from '../lambdaHandlers';\nimport { dynamicModuleLoader } from './dynamicModuleLoader';\nimport { getQpqConfig } from './lambda-utils';\n\nexport const dynamoStreamEvent_kvsStreamEvent = getDynamoStreamEvent_kvsStreamEvent(dynamicModuleLoader, getQpqConfig());\n"]}
@@ -0,0 +1 @@
1
+ export * from './dynamoStreamEvent_kvsStreamEvent';
@@ -1,4 +1,20 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./dynamoStreamEvent_kvsStreamEvent"), exports);
2
18
  // Deliberately empty. The files in this folder are bundler ENTRY POINTS, not
3
19
  // library code: each one imports the 'quidproquo-dynamic-loader' virtual module
4
20
  // that only exists inside a deploy bundle (see getLambdaEntries.ts). Re-exporting
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lambdas/index.ts"],"names":[],"mappings":";AAAA,6EAA6E;AAC7E,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF","sourcesContent":["// Deliberately empty. The files in this folder are bundler ENTRY POINTS, not\n// library code: each one imports the 'quidproquo-dynamic-loader' virtual module\n// that only exists inside a deploy bundle (see getLambdaEntries.ts). Re-exporting\n// them here would drag that unresolvable import into the package's own surface.\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lambdas/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qEAAmD;AACnD,6EAA6E;AAC7E,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF","sourcesContent":["export * from './dynamoStreamEvent_kvsStreamEvent';\n// Deliberately empty. The files in this folder are bundler ENTRY POINTS, not\n// library code: each one imports the 'quidproquo-dynamic-loader' virtual module\n// that only exists inside a deploy bundle (see getLambdaEntries.ts). Re-exporting\n// them here would drag that unresolvable import into the package's own surface.\n"]}
@@ -1,2 +1,2 @@
1
1
  import { KvsQueryOperation, QpqPagedData } from 'quidproquo-core';
2
- export declare function query<Item>(tableName: string, region: string, keyExpression: KvsQueryOperation, filterExpression?: KvsQueryOperation, pageKey?: string, indexName?: string, limit?: number, sortAscending?: boolean): Promise<QpqPagedData<Item>>;
2
+ export declare function query<Item>(tableName: string, region: string, keyExpression: KvsQueryOperation, filterExpression?: KvsQueryOperation, pageKey?: string, indexName?: string, limit?: number, sortAscending?: boolean, consistentRead?: boolean): Promise<QpqPagedData<Item>>;
@@ -16,7 +16,7 @@ const itemsToQpqPagedData_1 = require("./utils/itemsToQpqPagedData");
16
16
  const stringToLastEvaluatedKey_1 = require("./utils/stringToLastEvaluatedKey");
17
17
  const convertDynamoMapToObject_1 = require("./convertDynamoMapToObject");
18
18
  const qpqDynamoOrm_1 = require("./qpqDynamoOrm");
19
- function query(tableName, region, keyExpression, filterExpression, pageKey, indexName, limit, sortAscending) {
19
+ function query(tableName, region, keyExpression, filterExpression, pageKey, indexName, limit, sortAscending, consistentRead) {
20
20
  return __awaiter(this, void 0, void 0, function* () {
21
21
  const dynamoDBClient = (0, createAwsClient_1.createAwsClient)(client_dynamodb_1.DynamoDBClient, { region });
22
22
  const params = {
@@ -28,6 +28,10 @@ function query(tableName, region, keyExpression, filterExpression, pageKey, inde
28
28
  IndexName: indexName,
29
29
  Limit: limit,
30
30
  ScanIndexForward: sortAscending,
31
+ // Only set when asked. A strongly consistent read costs twice the RCU and cannot be served from a
32
+ // global secondary index, so it must stay opt-in — but without it a caller cannot read back what it
33
+ // just wrote, which some callers genuinely need.
34
+ ConsistentRead: consistentRead,
31
35
  };
32
36
  if (pageKey) {
33
37
  params.ExclusiveStartKey = (0, stringToLastEvaluatedKey_1.stringToLastEvaluatedKey)(pageKey);
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../src/logic/dynamo/query.ts"],"names":[],"mappings":";;;;;;;;;;;AAUA,sBAgCC;AAxCD,8DAA2F;AAE3F,wDAAqD;AACrD,qEAAkE;AAClE,+EAA4E;AAC5E,yEAAsE;AACtE,iDAA2H;AAE3H,SAAsB,KAAK,CACzB,SAAiB,EACjB,MAAc,EACd,aAAgC,EAChC,gBAAoC,EACpC,OAAgB,EAChB,SAAkB,EAClB,KAAc,EACd,aAAuB;;QAEvB,MAAM,cAAc,GAAG,IAAA,iCAAe,EAAC,gCAAc,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAsB;YAChC,SAAS,EAAE,SAAS;YACpB,sBAAsB,EAAE,IAAA,yCAA0B,EAAC,aAAa,CAAC;YACjE,gBAAgB,EAAE,gBAAgB,IAAI,IAAA,yCAA0B,EAAC,gBAAgB,CAAC;YAClF,yBAAyB,EAAE,IAAA,6CAA8B,EAAC,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;YAC5F,wBAAwB,EAAE,IAAA,4CAA6B,EAAC,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;YAC1F,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,KAAK;YACZ,gBAAgB,EAAE,aAAa;SAChC,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,iBAAiB,GAAG,IAAA,mDAAwB,EAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,8BAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mDAAwB,EAAC,IAAI,CAAC,CAAW,CAAC;QAEzF,OAAO,IAAA,yCAAmB,EAAO,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjE,CAAC;CAAA","sourcesContent":["import { KvsQueryOperation, QpqPagedData } from 'quidproquo-core';\n\nimport { DynamoDBClient, QueryCommand, QueryCommandInput } from '@aws-sdk/client-dynamodb';\n\nimport { createAwsClient } from '../createAwsClient';\nimport { itemsToQpqPagedData } from './utils/itemsToQpqPagedData';\nimport { stringToLastEvaluatedKey } from './utils/stringToLastEvaluatedKey';\nimport { convertDynamoMapToObject } from './convertDynamoMapToObject';\nimport { buildDynamoQueryExpression, buildExpressionAttributeNames, buildExpressionAttributeValues } from './qpqDynamoOrm';\n\nexport async function query<Item>(\n tableName: string,\n region: string,\n keyExpression: KvsQueryOperation,\n filterExpression?: KvsQueryOperation,\n pageKey?: string,\n indexName?: string,\n limit?: number,\n sortAscending?: boolean,\n): Promise<QpqPagedData<Item>> {\n const dynamoDBClient = createAwsClient(DynamoDBClient, { region });\n\n const params: QueryCommandInput = {\n TableName: tableName,\n KeyConditionExpression: buildDynamoQueryExpression(keyExpression),\n FilterExpression: filterExpression && buildDynamoQueryExpression(filterExpression),\n ExpressionAttributeValues: buildExpressionAttributeValues([keyExpression, filterExpression]),\n ExpressionAttributeNames: buildExpressionAttributeNames([keyExpression, filterExpression]),\n IndexName: indexName,\n Limit: limit,\n ScanIndexForward: sortAscending,\n };\n\n if (pageKey) {\n params.ExclusiveStartKey = stringToLastEvaluatedKey(pageKey);\n }\n\n const data = await dynamoDBClient.send(new QueryCommand(params));\n\n const items = (data.Items || []).map((item) => convertDynamoMapToObject(item)) as Item[];\n\n return itemsToQpqPagedData<Item>(items, data.LastEvaluatedKey);\n}\n"]}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../src/logic/dynamo/query.ts"],"names":[],"mappings":";;;;;;;;;;;AAUA,sBAqCC;AA7CD,8DAA2F;AAE3F,wDAAqD;AACrD,qEAAkE;AAClE,+EAA4E;AAC5E,yEAAsE;AACtE,iDAA2H;AAE3H,SAAsB,KAAK,CACzB,SAAiB,EACjB,MAAc,EACd,aAAgC,EAChC,gBAAoC,EACpC,OAAgB,EAChB,SAAkB,EAClB,KAAc,EACd,aAAuB,EACvB,cAAwB;;QAExB,MAAM,cAAc,GAAG,IAAA,iCAAe,EAAC,gCAAc,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAsB;YAChC,SAAS,EAAE,SAAS;YACpB,sBAAsB,EAAE,IAAA,yCAA0B,EAAC,aAAa,CAAC;YACjE,gBAAgB,EAAE,gBAAgB,IAAI,IAAA,yCAA0B,EAAC,gBAAgB,CAAC;YAClF,yBAAyB,EAAE,IAAA,6CAA8B,EAAC,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;YAC5F,wBAAwB,EAAE,IAAA,4CAA6B,EAAC,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;YAC1F,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,KAAK;YACZ,gBAAgB,EAAE,aAAa;YAC/B,kGAAkG;YAClG,oGAAoG;YACpG,iDAAiD;YACjD,cAAc,EAAE,cAAc;SAC/B,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,iBAAiB,GAAG,IAAA,mDAAwB,EAAC,OAAO,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,8BAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mDAAwB,EAAC,IAAI,CAAC,CAAW,CAAC;QAEzF,OAAO,IAAA,yCAAmB,EAAO,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjE,CAAC;CAAA","sourcesContent":["import { KvsQueryOperation, QpqPagedData } from 'quidproquo-core';\n\nimport { DynamoDBClient, QueryCommand, QueryCommandInput } from '@aws-sdk/client-dynamodb';\n\nimport { createAwsClient } from '../createAwsClient';\nimport { itemsToQpqPagedData } from './utils/itemsToQpqPagedData';\nimport { stringToLastEvaluatedKey } from './utils/stringToLastEvaluatedKey';\nimport { convertDynamoMapToObject } from './convertDynamoMapToObject';\nimport { buildDynamoQueryExpression, buildExpressionAttributeNames, buildExpressionAttributeValues } from './qpqDynamoOrm';\n\nexport async function query<Item>(\n tableName: string,\n region: string,\n keyExpression: KvsQueryOperation,\n filterExpression?: KvsQueryOperation,\n pageKey?: string,\n indexName?: string,\n limit?: number,\n sortAscending?: boolean,\n consistentRead?: boolean,\n): Promise<QpqPagedData<Item>> {\n const dynamoDBClient = createAwsClient(DynamoDBClient, { region });\n\n const params: QueryCommandInput = {\n TableName: tableName,\n KeyConditionExpression: buildDynamoQueryExpression(keyExpression),\n FilterExpression: filterExpression && buildDynamoQueryExpression(filterExpression),\n ExpressionAttributeValues: buildExpressionAttributeValues([keyExpression, filterExpression]),\n ExpressionAttributeNames: buildExpressionAttributeNames([keyExpression, filterExpression]),\n IndexName: indexName,\n Limit: limit,\n ScanIndexForward: sortAscending,\n // Only set when asked. A strongly consistent read costs twice the RCU and cannot be served from a\n // global secondary index, so it must stay opt-in — but without it a caller cannot read back what it\n // just wrote, which some callers genuinely need.\n ConsistentRead: consistentRead,\n };\n\n if (pageKey) {\n params.ExclusiveStartKey = stringToLastEvaluatedKey(pageKey);\n }\n\n const data = await dynamoDBClient.send(new QueryCommand(params));\n\n const items = (data.Items || []).map((item) => convertDynamoMapToObject(item)) as Item[];\n\n return itemsToQpqPagedData<Item>(items, data.LastEvaluatedKey);\n}\n"]}
@@ -0,0 +1 @@
1
+ export * from './streamEvent';
@@ -0,0 +1,2 @@
1
+ export * from './streamEvent';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/getActionProcessor/core/event/dynamo/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC","sourcesContent":["export * from './streamEvent';\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getEventAutoRespondActionProcessor: ActionProcessorListResolver;
@@ -0,0 +1,10 @@
1
+ import { actionResult, EventActionType, } from 'quidproquo-core';
2
+ const getProcessAutoRespond = (qpqConfig) => {
3
+ return async ({ qpqEventRecord, matchResult }) => {
4
+ return actionResult(null);
5
+ };
6
+ };
7
+ export const getEventAutoRespondActionProcessor = async (qpqConfig) => ({
8
+ [EventActionType.AutoRespond]: getProcessAutoRespond(qpqConfig),
9
+ });
10
+ //# sourceMappingURL=getEventAutoRespondActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEventAutoRespondActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/getEventAutoRespondActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AAIzB,MAAM,qBAAqB,GAAG,CAAC,SAAoB,EAA0F,EAAE;IAC7I,OAAO,KAAK,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE;QAC/C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kCAAkC,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IAC5I,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC,SAAS,CAAC;CAChE,CAAC,CAAC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n EventActionType,\n EventAutoRespondActionProcessor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { InternalEventOutput, InternalEventRecord, MatchResult } from './types';\n\nconst getProcessAutoRespond = (qpqConfig: QPQConfig): EventAutoRespondActionProcessor<InternalEventRecord, MatchResult, InternalEventOutput> => {\n return async ({ qpqEventRecord, matchResult }) => {\n return actionResult(null);\n };\n};\n\nexport const getEventAutoRespondActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [EventActionType.AutoRespond]: getProcessAutoRespond(qpqConfig),\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getEventGetRecordsActionProcessor: ActionProcessorListResolver;
@@ -0,0 +1,71 @@
1
+ import { actionResult, decomposeScopedKvsValue, EventActionType, KvsStreamEventType, } from 'quidproquo-core';
2
+ import { convertDynamoMapToObject } from '../../../../../logic/dynamo/convertDynamoMapToObject';
3
+ import { GLOBAL_KVS_STREAM_COALESCE, GLOBAL_KVS_STREAM_PARTITION_KEY, GLOBAL_KVS_STREAM_STORE_NAME } from './types';
4
+ // aws-lambda types the stream images with its own AttributeValue shape; the marshaller is
5
+ // the SDK's. Structurally identical, so this is a lens rather than a conversion.
6
+ const toObject = (image) => image ? convertDynamoMapToObject(image) : undefined;
7
+ // Switch on the closed union aws-lambda declares, not on `string`. Exhausting it means a
8
+ // stream event type we do not handle is a COMPILE error here, rather than a `default` branch
9
+ // quietly folding it into Modify — which for a REMOVE would report a delete as an edit.
10
+ const toEventType = (eventName) => {
11
+ switch (eventName) {
12
+ case 'INSERT':
13
+ return KvsStreamEventType.Insert;
14
+ case 'MODIFY':
15
+ return KvsStreamEventType.Modify;
16
+ case 'REMOVE':
17
+ return KvsStreamEventType.Remove;
18
+ case undefined:
19
+ // DynamoDB always sets this; its absence means a malformed record. Failing is right:
20
+ // the alternative is guessing, and every guess here misreports what happened to the item.
21
+ throw new Error('DynamoDB stream record has no eventName');
22
+ }
23
+ };
24
+ // Put the raw partition key back on an image, so nothing downstream ever sees the composed
25
+ // form. Mirrors what the scoped translator's `strip` does for an ordinary read.
26
+ const stripScope = (image, rawPartitionKey) => image && GLOBAL_KVS_STREAM_PARTITION_KEY ? { ...image, [GLOBAL_KVS_STREAM_PARTITION_KEY]: rawPartitionKey } : image;
27
+ const toInternalRecord = (record) => {
28
+ const keys = toObject(record.dynamodb?.Keys) ?? {};
29
+ // The stored partition key carries the scope; split it once here so every consumer gets a
30
+ // raw key plus an explicit scope, and none of them has to know the composition format.
31
+ const composedPartitionKey = GLOBAL_KVS_STREAM_PARTITION_KEY ? String(keys[GLOBAL_KVS_STREAM_PARTITION_KEY] ?? '') : '';
32
+ const { scope, rawValue } = decomposeScopedKvsValue(composedPartitionKey);
33
+ return {
34
+ keyValueStoreName: GLOBAL_KVS_STREAM_STORE_NAME,
35
+ eventType: toEventType(record.eventName),
36
+ scope,
37
+ keys: GLOBAL_KVS_STREAM_PARTITION_KEY ? { ...keys, [GLOBAL_KVS_STREAM_PARTITION_KEY]: rawValue } : keys,
38
+ newImage: stripScope(toObject(record.dynamodb?.NewImage), rawValue),
39
+ oldImage: stripScope(toObject(record.dynamodb?.OldImage), rawValue),
40
+ };
41
+ };
42
+ // Keep the LAST record for each partition key, preserving the batch's order of first
43
+ // appearance. Last rather than first because a projection wants the newest state, and a
44
+ // handler that re-derives from source only needs to be told the key changed once.
45
+ //
46
+ // The stream guarantees ordering within a partition key, so "last in the batch" is genuinely
47
+ // the most recent change, not an arbitrary pick.
48
+ //
49
+ // Grouped by SCOPE AND key, not key alone: keys are raw by this point, so two tenants can
50
+ // legitimately hold the same id, and collapsing on the raw key would drop one tenant's change
51
+ // on the floor because another tenant touched the same id in the same batch.
52
+ const coalesceByPartitionKey = (records) => {
53
+ if (!GLOBAL_KVS_STREAM_PARTITION_KEY) {
54
+ return records;
55
+ }
56
+ const latest = new Map();
57
+ for (const record of records) {
58
+ latest.set(`${record.scope ?? ''}\u0000${String(record.keys[GLOBAL_KVS_STREAM_PARTITION_KEY])}`, record);
59
+ }
60
+ return [...latest.values()];
61
+ };
62
+ const getProcessGetRecords = (qpqConfig) => {
63
+ return async ({ eventParams: [streamEvent] }) => {
64
+ const records = streamEvent.Records.map(toInternalRecord);
65
+ return actionResult(GLOBAL_KVS_STREAM_COALESCE ? coalesceByPartitionKey(records) : records);
66
+ };
67
+ };
68
+ export const getEventGetRecordsActionProcessor = async (qpqConfig) => ({
69
+ [EventActionType.GetRecords]: getProcessGetRecords(qpqConfig),
70
+ });
71
+ //# sourceMappingURL=getEventGetRecordsActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEventGetRecordsActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/getEventGetRecordsActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,uBAAuB,EACvB,eAAe,EAEf,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,sDAAsD,CAAC;AAChG,OAAO,EAAc,0BAA0B,EAAE,+BAA+B,EAAE,4BAA4B,EAAuB,MAAM,SAAS,CAAC;AAErJ,0FAA0F;AAC1F,iFAAiF;AACjF,MAAM,QAAQ,GAAG,CAAC,KAA+B,EAAE,EAAE,CACnD,KAAK,CAAC,CAAC,CAAE,wBAAwB,CAAC,KAAuC,CAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;AAErH,yFAAyF;AACzF,6FAA6F;AAC7F,wFAAwF;AACxF,MAAM,WAAW,GAAG,CAAC,SAAsC,EAAsB,EAAE;IACjF,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,MAAM,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,MAAM,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,MAAM,CAAC;QACnC,KAAK,SAAS;YACZ,qFAAqF;YACrF,0FAA0F;YAC1F,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,CAAC;AAEF,2FAA2F;AAC3F,gFAAgF;AAChF,MAAM,UAAU,GAAG,CAAC,KAA0C,EAAE,eAAuB,EAAuC,EAAE,CAC9H,KAAK,IAAI,+BAA+B,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,+BAA+B,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAEtH,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAAuB,EAAE;IACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnD,0FAA0F;IAC1F,uFAAuF;IACvF,MAAM,oBAAoB,GAAG,+BAA+B,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxH,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IAE1E,OAAO;QACL,iBAAiB,EAAE,4BAA4B;QAC/C,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,KAAK;QACL,IAAI,EAAE,+BAA+B,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,+BAA+B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI;QACvG,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACnE,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACpE,CAAC;AACJ,CAAC,CAAC;AAEF,qFAAqF;AACrF,wFAAwF;AACxF,kFAAkF;AAClF,EAAE;AACF,6FAA6F;AAC7F,iDAAiD;AACjD,EAAE;AACF,0FAA0F;AAC1F,8FAA8F;AAC9F,6EAA6E;AAC7E,MAAM,sBAAsB,GAAG,CAAC,OAA8B,EAAyB,EAAE;IACvF,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAAmE,EAAE;IACrH,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE1D,OAAO,YAAY,CAAC,0BAA0B,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC9F,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IAC3I,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;CAC9D,CAAC,CAAC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n decomposeScopedKvsValue,\n EventActionType,\n EventGetRecordsActionProcessor,\n KvsStreamEventType,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { DynamoDBRecord } from 'aws-lambda';\nimport { AttributeValue } from '@aws-sdk/client-dynamodb';\n\nimport { convertDynamoMapToObject } from '../../../../../logic/dynamo/convertDynamoMapToObject';\nimport { EventInput, GLOBAL_KVS_STREAM_COALESCE, GLOBAL_KVS_STREAM_PARTITION_KEY, GLOBAL_KVS_STREAM_STORE_NAME, InternalEventRecord } from './types';\n\n// aws-lambda types the stream images with its own AttributeValue shape; the marshaller is\n// the SDK's. Structurally identical, so this is a lens rather than a conversion.\nconst toObject = (image?: Record<string, unknown>) =>\n image ? (convertDynamoMapToObject(image as Record<string, AttributeValue>) as Record<string, unknown>) : undefined;\n\n// Switch on the closed union aws-lambda declares, not on `string`. Exhausting it means a\n// stream event type we do not handle is a COMPILE error here, rather than a `default` branch\n// quietly folding it into Modify — which for a REMOVE would report a delete as an edit.\nconst toEventType = (eventName: DynamoDBRecord['eventName']): KvsStreamEventType => {\n switch (eventName) {\n case 'INSERT':\n return KvsStreamEventType.Insert;\n case 'MODIFY':\n return KvsStreamEventType.Modify;\n case 'REMOVE':\n return KvsStreamEventType.Remove;\n case undefined:\n // DynamoDB always sets this; its absence means a malformed record. Failing is right:\n // the alternative is guessing, and every guess here misreports what happened to the item.\n throw new Error('DynamoDB stream record has no eventName');\n }\n};\n\n// Put the raw partition key back on an image, so nothing downstream ever sees the composed\n// form. Mirrors what the scoped translator's `strip` does for an ordinary read.\nconst stripScope = (image: Record<string, unknown> | undefined, rawPartitionKey: string): Record<string, unknown> | undefined =>\n image && GLOBAL_KVS_STREAM_PARTITION_KEY ? { ...image, [GLOBAL_KVS_STREAM_PARTITION_KEY]: rawPartitionKey } : image;\n\nconst toInternalRecord = (record: DynamoDBRecord): InternalEventRecord => {\n const keys = toObject(record.dynamodb?.Keys) ?? {};\n\n // The stored partition key carries the scope; split it once here so every consumer gets a\n // raw key plus an explicit scope, and none of them has to know the composition format.\n const composedPartitionKey = GLOBAL_KVS_STREAM_PARTITION_KEY ? String(keys[GLOBAL_KVS_STREAM_PARTITION_KEY] ?? '') : '';\n const { scope, rawValue } = decomposeScopedKvsValue(composedPartitionKey);\n\n return {\n keyValueStoreName: GLOBAL_KVS_STREAM_STORE_NAME,\n eventType: toEventType(record.eventName),\n scope,\n keys: GLOBAL_KVS_STREAM_PARTITION_KEY ? { ...keys, [GLOBAL_KVS_STREAM_PARTITION_KEY]: rawValue } : keys,\n newImage: stripScope(toObject(record.dynamodb?.NewImage), rawValue),\n oldImage: stripScope(toObject(record.dynamodb?.OldImage), rawValue),\n };\n};\n\n// Keep the LAST record for each partition key, preserving the batch's order of first\n// appearance. Last rather than first because a projection wants the newest state, and a\n// handler that re-derives from source only needs to be told the key changed once.\n//\n// The stream guarantees ordering within a partition key, so \"last in the batch\" is genuinely\n// the most recent change, not an arbitrary pick.\n//\n// Grouped by SCOPE AND key, not key alone: keys are raw by this point, so two tenants can\n// legitimately hold the same id, and collapsing on the raw key would drop one tenant's change\n// on the floor because another tenant touched the same id in the same batch.\nconst coalesceByPartitionKey = (records: InternalEventRecord[]): InternalEventRecord[] => {\n if (!GLOBAL_KVS_STREAM_PARTITION_KEY) {\n return records;\n }\n\n const latest = new Map<string, InternalEventRecord>();\n\n for (const record of records) {\n latest.set(`${record.scope ?? ''}\\u0000${String(record.keys[GLOBAL_KVS_STREAM_PARTITION_KEY])}`, record);\n }\n\n return [...latest.values()];\n};\n\nconst getProcessGetRecords = (qpqConfig: QPQConfig): EventGetRecordsActionProcessor<EventInput, InternalEventRecord> => {\n return async ({ eventParams: [streamEvent] }) => {\n const records = streamEvent.Records.map(toInternalRecord);\n\n return actionResult(GLOBAL_KVS_STREAM_COALESCE ? coalesceByPartitionKey(records) : records);\n };\n};\n\nexport const getEventGetRecordsActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [EventActionType.GetRecords]: getProcessGetRecords(qpqConfig),\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getEventGetStorySessionActionProcessor: ActionProcessorListResolver;
@@ -0,0 +1,12 @@
1
+ import { actionResult, EventActionType, } from 'quidproquo-core';
2
+ // A stream record carries no caller identity — the change already happened, under whatever
3
+ // authority wrote it. The handler runs with a blank session, like the storage drive event.
4
+ const getProcessGetStorySession = (qpqConfig) => {
5
+ return async ({ qpqEventRecord, eventParams }) => {
6
+ return actionResult(void 0);
7
+ };
8
+ };
9
+ export const getEventGetStorySessionActionProcessor = async (qpqConfig) => ({
10
+ [EventActionType.GetStorySession]: getProcessGetStorySession(qpqConfig),
11
+ });
12
+ //# sourceMappingURL=getEventGetStorySessionActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEventGetStorySessionActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/getEventGetStorySessionActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AAIzB,2FAA2F;AAC3F,2FAA2F;AAC3F,MAAM,yBAAyB,GAAG,CAAC,SAAoB,EAAqF,EAAE;IAC5I,OAAO,KAAK,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE;QAC/C,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sCAAsC,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IAChJ,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC;CACxE,CAAC,CAAC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n EventActionType,\n EventGetStorySessionActionProcessor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { EventInput, InternalEventRecord, MatchResult } from './types';\n\n// A stream record carries no caller identity — the change already happened, under whatever\n// authority wrote it. The handler runs with a blank session, like the storage drive event.\nconst getProcessGetStorySession = (qpqConfig: QPQConfig): EventGetStorySessionActionProcessor<EventInput, InternalEventRecord, MatchResult> => {\n return async ({ qpqEventRecord, eventParams }) => {\n return actionResult(void 0);\n };\n};\n\nexport const getEventGetStorySessionActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [EventActionType.GetStorySession]: getProcessGetStorySession(qpqConfig),\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getEventMatchStoryActionProcessor: ActionProcessorListResolver;
@@ -0,0 +1,15 @@
1
+ import { actionResult, EventActionType, } from 'quidproquo-core';
2
+ import { GLOBAL_KVS_STREAM_RUNTIME } from './types';
3
+ // One store, one handler — the runtime is stamped on the lambda by the CDK, so there is
4
+ // nothing to route on.
5
+ const getProcessMatchStory = (qpqConfig) => {
6
+ return async ({ qpqEventRecord }) => {
7
+ return actionResult({
8
+ runtime: GLOBAL_KVS_STREAM_RUNTIME,
9
+ });
10
+ };
11
+ };
12
+ export const getEventMatchStoryActionProcessor = async (qpqConfig) => ({
13
+ [EventActionType.MatchStory]: getProcessMatchStory(qpqConfig),
14
+ });
15
+ //# sourceMappingURL=getEventMatchStoryActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEventMatchStoryActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/getEventMatchStoryActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAc,yBAAyB,EAAoC,MAAM,SAAS,CAAC;AAElG,wFAAwF;AACxF,uBAAuB;AACvB,MAAM,oBAAoB,GAAG,CAAC,SAAoB,EAAgF,EAAE;IAClI,OAAO,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;QAClC,OAAO,YAAY,CAAc;YAC/B,OAAO,EAAE,yBAAyB;SACnC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IAC3I,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC;CAC9D,CAAC,CAAC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n EventActionType,\n EventMatchStoryActionProcessor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { EventInput, GLOBAL_KVS_STREAM_RUNTIME, InternalEventRecord, MatchResult } from './types';\n\n// One store, one handler — the runtime is stamped on the lambda by the CDK, so there is\n// nothing to route on.\nconst getProcessMatchStory = (qpqConfig: QPQConfig): EventMatchStoryActionProcessor<InternalEventRecord, MatchResult, EventInput> => {\n return async ({ qpqEventRecord }) => {\n return actionResult<MatchResult>({\n runtime: GLOBAL_KVS_STREAM_RUNTIME,\n });\n };\n};\n\nexport const getEventMatchStoryActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [EventActionType.MatchStory]: getProcessMatchStory(qpqConfig),\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getEventTransformResponseResultActionProcessor: ActionProcessorListResolver;
@@ -0,0 +1,19 @@
1
+ import { actionResult, actionResultError, ErrorTypeEnum, EventActionType, } from 'quidproquo-core';
2
+ // Throwing here fails the whole batch, which makes Lambda retry it and — by default —
3
+ // stall the shard until it succeeds or the records expire. That is the correct default for
4
+ // a projection (falling behind loudly beats silently skipping a change), but it is exactly
5
+ // why the event source mapping must be given a retry bound and a failure destination; see
6
+ // the stream construct.
7
+ const getProcessTransformResponseResult = (qpqConfig) => {
8
+ return async ({ eventParams, qpqEventRecordResponses }) => {
9
+ const onesThatErrored = qpqEventRecordResponses.filter((r) => !r.success);
10
+ if (onesThatErrored.length > 0) {
11
+ return actionResultError(ErrorTypeEnum.GenericError, `[${onesThatErrored.length}] stream records unable to be processed.`);
12
+ }
13
+ return actionResult(void 0);
14
+ };
15
+ };
16
+ export const getEventTransformResponseResultActionProcessor = async (qpqConfig) => ({
17
+ [EventActionType.TransformResponseResult]: getProcessTransformResponseResult(qpqConfig),
18
+ });
19
+ //# sourceMappingURL=getEventTransformResponseResultActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getEventTransformResponseResultActionProcessor.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/getEventTransformResponseResultActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AAIzB,sFAAsF;AACtF,2FAA2F;AAC3F,2FAA2F;AAC3F,0FAA0F;AAC1F,wBAAwB;AACxB,MAAM,iCAAiC,GAAG,CACxC,SAAoB,EACuE,EAAE;IAC7F,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE,EAAE,EAAE;QACxD,MAAM,eAAe,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,eAAe,CAAC,MAAM,0CAA0C,CAAC,CAAC;QAC7H,CAAC;QAED,OAAO,YAAY,CAAc,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8CAA8C,GAAgC,KAAK,EAC9F,SAAoB,EACU,EAAE,CAAC,CAAC;IAClC,CAAC,eAAe,CAAC,uBAAuB,CAAC,EAAE,iCAAiC,CAAC,SAAS,CAAC;CACxF,CAAC,CAAC","sourcesContent":["import {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n ErrorTypeEnum,\n EventActionType,\n EventTransformResponseResultActionProcessor,\n QPQConfig,\n} from 'quidproquo-core';\n\nimport { EventInput, EventOutput, InternalEventOutput, InternalEventRecord } from './types';\n\n// Throwing here fails the whole batch, which makes Lambda retry it and — by default —\n// stall the shard until it succeeds or the records expire. That is the correct default for\n// a projection (falling behind loudly beats silently skipping a change), but it is exactly\n// why the event source mapping must be given a retry bound and a failure destination; see\n// the stream construct.\nconst getProcessTransformResponseResult = (\n qpqConfig: QPQConfig,\n): EventTransformResponseResultActionProcessor<EventInput, InternalEventOutput, EventOutput> => {\n return async ({ eventParams, qpqEventRecordResponses }) => {\n const onesThatErrored = qpqEventRecordResponses.filter((r) => !r.success);\n if (onesThatErrored.length > 0) {\n return actionResultError(ErrorTypeEnum.GenericError, `[${onesThatErrored.length}] stream records unable to be processed.`);\n }\n\n return actionResult<EventOutput>(void 0);\n };\n};\n\nexport const getEventTransformResponseResultActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n): Promise<ActionProcessorList> => ({\n [EventActionType.TransformResponseResult]: getProcessTransformResponseResult(qpqConfig),\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getDynamoKvsStreamEventProcessor: ActionProcessorListResolver;
@@ -0,0 +1,13 @@
1
+ import { getEventAutoRespondActionProcessor } from './getEventAutoRespondActionProcessor';
2
+ import { getEventGetRecordsActionProcessor } from './getEventGetRecordsActionProcessor';
3
+ import { getEventGetStorySessionActionProcessor } from './getEventGetStorySessionActionProcessor';
4
+ import { getEventMatchStoryActionProcessor } from './getEventMatchStoryActionProcessor';
5
+ import { getEventTransformResponseResultActionProcessor } from './getEventTransformResponseResultActionProcessor';
6
+ export const getDynamoKvsStreamEventProcessor = async (qpqConfig, dynamicModuleLoader) => ({
7
+ ...(await getEventAutoRespondActionProcessor(qpqConfig, dynamicModuleLoader)),
8
+ ...(await getEventGetRecordsActionProcessor(qpqConfig, dynamicModuleLoader)),
9
+ ...(await getEventGetStorySessionActionProcessor(qpqConfig, dynamicModuleLoader)),
10
+ ...(await getEventMatchStoryActionProcessor(qpqConfig, dynamicModuleLoader)),
11
+ ...(await getEventTransformResponseResultActionProcessor(qpqConfig, dynamicModuleLoader)),
12
+ });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,8CAA8C,EAAE,MAAM,kDAAkD,CAAC;AAElH,MAAM,CAAC,MAAM,gCAAgC,GAAgC,KAAK,EAChF,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,kCAAkC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC7E,GAAG,CAAC,MAAM,iCAAiC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC5E,GAAG,CAAC,MAAM,sCAAsC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACjF,GAAG,CAAC,MAAM,iCAAiC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC5E,GAAG,CAAC,MAAM,8CAA8C,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CAC1F,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from 'quidproquo-core';\n\nimport { getEventAutoRespondActionProcessor } from './getEventAutoRespondActionProcessor';\nimport { getEventGetRecordsActionProcessor } from './getEventGetRecordsActionProcessor';\nimport { getEventGetStorySessionActionProcessor } from './getEventGetStorySessionActionProcessor';\nimport { getEventMatchStoryActionProcessor } from './getEventMatchStoryActionProcessor';\nimport { getEventTransformResponseResultActionProcessor } from './getEventTransformResponseResultActionProcessor';\n\nexport const getDynamoKvsStreamEventProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getEventAutoRespondActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getEventGetRecordsActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getEventGetStorySessionActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getEventMatchStoryActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getEventTransformResponseResultActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
@@ -0,0 +1,11 @@
1
+ import { KvsStreamEventResponse, KvsStreamRecord, MatchStoryResult, QpqFunctionRuntime } from 'quidproquo-core';
2
+ import { Context, DynamoDBStreamEvent } from 'aws-lambda';
3
+ export declare const GLOBAL_KVS_STREAM_STORE_NAME: string;
4
+ export declare const GLOBAL_KVS_STREAM_RUNTIME: QpqFunctionRuntime;
5
+ export declare const GLOBAL_KVS_STREAM_COALESCE: boolean;
6
+ export declare const GLOBAL_KVS_STREAM_PARTITION_KEY: string;
7
+ export type EventInput = [DynamoDBStreamEvent, Context];
8
+ export type EventOutput = void;
9
+ export type InternalEventRecord = KvsStreamRecord;
10
+ export type InternalEventOutput = KvsStreamEventResponse;
11
+ export type MatchResult = MatchStoryResult<any, any>;
@@ -0,0 +1,11 @@
1
+ // Customs — the CDK stamps these onto the projector lambda, the same way the storage drive
2
+ // event lambda is told which drive it serves.
3
+ export const GLOBAL_KVS_STREAM_STORE_NAME = process.env.keyValueStoreName;
4
+ export const GLOBAL_KVS_STREAM_RUNTIME = JSON.parse(process.env.kvsStreamEntry || '"/::"');
5
+ // Collapse each batch to one record per partition key. See KvsStreamSettings.
6
+ export const GLOBAL_KVS_STREAM_COALESCE = process.env.kvsStreamCoalesceByPartitionKey === 'true';
7
+ // The table's partition key attribute, needed to coalesce (the stream record's `Keys` map
8
+ // carries both partition and sort key, and only the partition key identifies the item's
9
+ // ordering group).
10
+ export const GLOBAL_KVS_STREAM_PARTITION_KEY = process.env.kvsStreamPartitionKey || '';
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../src/getActionProcessor/core/event/dynamo/streamEvent/types.ts"],"names":[],"mappings":"AAIA,2FAA2F;AAC3F,8CAA8C;AAC9C,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAkB,CAAC;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAuB,CAAC;AAEjH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,KAAK,MAAM,CAAC;AAEjG,0FAA0F;AAC1F,wFAAwF;AACxF,mBAAmB;AACnB,MAAM,CAAC,MAAM,+BAA+B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC","sourcesContent":["import { KvsStreamEventResponse, KvsStreamRecord, MatchStoryResult, QpqFunctionRuntime } from 'quidproquo-core';\n\nimport { Context, DynamoDBStreamEvent } from 'aws-lambda';\n\n// Customs — the CDK stamps these onto the projector lambda, the same way the storage drive\n// event lambda is told which drive it serves.\nexport const GLOBAL_KVS_STREAM_STORE_NAME = process.env.keyValueStoreName!;\nexport const GLOBAL_KVS_STREAM_RUNTIME = JSON.parse(process.env.kvsStreamEntry || '\"/::\"') as QpqFunctionRuntime;\n\n// Collapse each batch to one record per partition key. See KvsStreamSettings.\nexport const GLOBAL_KVS_STREAM_COALESCE = process.env.kvsStreamCoalesceByPartitionKey === 'true';\n\n// The table's partition key attribute, needed to coalesce (the stream record's `Keys` map\n// carries both partition and sort key, and only the partition key identifies the item's\n// ordering group).\nexport const GLOBAL_KVS_STREAM_PARTITION_KEY = process.env.kvsStreamPartitionKey || '';\n\n// Externals — the ins and outs of the external event\nexport type EventInput = [DynamoDBStreamEvent, Context];\nexport type EventOutput = void;\n\n// Internals — the ins and outs of each record in the event\nexport type InternalEventRecord = KvsStreamRecord;\nexport type InternalEventOutput = KvsStreamEventResponse;\n\nexport type MatchResult = MatchStoryResult<any, any>;\n"]}
@@ -1,6 +1,7 @@
1
1
  export * from './apiGatwayEvent';
2
2
  export * from './cloudFrontOriginRequest';
3
3
  export * from './cognito';
4
+ export * from './dynamo';
4
5
  export * from './eventBridgeEvent';
5
6
  export * from './lambda';
6
7
  export * from './s3';
@@ -1,6 +1,7 @@
1
1
  export * from './apiGatwayEvent';
2
2
  export * from './cloudFrontOriginRequest';
3
3
  export * from './cognito';
4
+ export * from './dynamo';
4
5
  export * from './eventBridgeEvent';
5
6
  export * from './lambda';
6
7
  export * from './s3';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/event/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,OAAO,CAAC","sourcesContent":["export * from './apiGatwayEvent';\nexport * from './cloudFrontOriginRequest';\nexport * from './cognito';\nexport * from './eventBridgeEvent';\nexport * from './lambda';\nexport * from './s3';\nexport * from './sqs';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/event/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,OAAO,CAAC","sourcesContent":["export * from './apiGatwayEvent';\nexport * from './cloudFrontOriginRequest';\nexport * from './cognito';\nexport * from './dynamo';\nexport * from './eventBridgeEvent';\nexport * from './lambda';\nexport * from './s3';\nexport * from './sqs';\n"]}
@@ -14,7 +14,7 @@ const getProcessKeyValueStoreQuery = (qpqConfig) => {
14
14
  // composed form (throws when the key condition never constrains the pk).
15
15
  const scoped = getScopedKvsTranslatorOrThrow(qpqConfig, keyValueStoreName, options?.scope);
16
16
  const effectiveKeyCondition = scoped.keyCondition(keyCondition);
17
- const items = await query(dynamoTableName, region, effectiveKeyCondition, scoped.filter(options?.filter), options?.nextPageKey, getDynamoTableIndexByConfigAndQuery(storeConfig, effectiveKeyCondition) ?? undefined, options?.limit, options?.sortAscending);
17
+ const items = await query(dynamoTableName, region, effectiveKeyCondition, scoped.filter(options?.filter), options?.nextPageKey, getDynamoTableIndexByConfigAndQuery(storeConfig, effectiveKeyCondition) ?? undefined, options?.limit, options?.sortAscending, options?.consistentRead);
18
18
  items.items = items.items.map((item) => scoped.strip(item));
19
19
  return actionResult(items);
20
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getKeyValueStoreQueryActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAGL,iBAAiB,EACjB,gCAAgC,EAChC,6BAA6B,EAE7B,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAqC,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAE5I,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAEzF,MAAM,4BAA4B,GAAG,CAAC,SAAoB,EAA0C,EAAE;IACpG,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5D,MAAM,eAAe,GAAG,+BAA+B,CAAC,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,4BAA4B,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAE/E,0EAA0E;YAC1E,yEAAyE;YACzE,MAAM,MAAM,GAAG,6BAA6B,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3F,MAAM,qBAAqB,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAEhE,MAAM,KAAK,GAAG,MAAM,KAAK,CACvB,eAAe,EACf,MAAM,EACN,qBAAqB,EACrB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,mCAAmC,CAAC,WAAW,EAAE,qBAAqB,CAAC,IAAI,SAAS,EACpF,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,aAAa,CACvB,CAAC;YAEF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAEjE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE;gBAC7C,mBAAmB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;gBAC3H,yBAAyB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;gBAC9H,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;gBAC5G,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC;aAClH,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IAC9I,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC,SAAS,CAAC;CACzE,CAAC,CAAC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResultError,\n actionResultErrorFromCaughtError,\n getScopedKvsTranslatorOrThrow,\n QPQConfig,\n resolveKvsStoreConfigOrThrow,\n} from 'quidproquo-core';\nimport { actionResult, KeyValueStoreActionType, KeyValueStoreQueryActionProcessor, KeyValueStoreQueryErrorTypeEnum } from 'quidproquo-core';\n\nimport { getKvsDynamoTableNameFromConfig } from '../../../awsNamingUtils';\nimport { query } from '../../../logic/dynamo';\nimport { getDynamoTableIndexByConfigAndQuery } from '../../../logic/dynamo/qpqDynamoOrm';\n\nconst getProcessKeyValueStoreQuery = (qpqConfig: QPQConfig): KeyValueStoreQueryActionProcessor<any> => {\n return async ({ keyValueStoreName, keyCondition, options }) => {\n const dynamoTableName = getKvsDynamoTableNameFromConfig(keyValueStoreName, qpqConfig, 'kvs');\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n try {\n const storeConfig = resolveKvsStoreConfigOrThrow(qpqConfig, keyValueStoreName);\n\n // Scope lives inside the pk values, so pk conditions are rewritten to the\n // composed form (throws when the key condition never constrains the pk).\n const scoped = getScopedKvsTranslatorOrThrow(qpqConfig, keyValueStoreName, options?.scope);\n const effectiveKeyCondition = scoped.keyCondition(keyCondition);\n\n const items = await query<any>(\n dynamoTableName,\n region,\n effectiveKeyCondition,\n scoped.filter(options?.filter),\n options?.nextPageKey,\n getDynamoTableIndexByConfigAndQuery(storeConfig, effectiveKeyCondition) ?? undefined,\n options?.limit,\n options?.sortAscending,\n );\n\n items.items = items.items.map((item: any) => scoped.strip(item));\n\n return actionResult(items);\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n InternalServerError: () => actionResultError(KeyValueStoreQueryErrorTypeEnum.ServiceUnavailable, 'KVS Service Unavailable'),\n ResourceNotFoundException: () => actionResultError(KeyValueStoreQueryErrorTypeEnum.ResourceNotFound, 'KVS Resource Not Found'),\n InvalidScopeError: (error) => actionResultError(KeyValueStoreQueryErrorTypeEnum.InvalidScope, error.message),\n KvsStoreNotFoundError: (error) => actionResultError(KeyValueStoreQueryErrorTypeEnum.StoreNotFound, error.message),\n });\n }\n };\n};\n\nexport const getKeyValueStoreQueryActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [KeyValueStoreActionType.Query]: getProcessKeyValueStoreQuery(qpqConfig),\n});\n"]}
1
+ {"version":3,"file":"getKeyValueStoreQueryActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/keyValueStore/getKeyValueStoreQueryActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAGL,iBAAiB,EACjB,gCAAgC,EAChC,6BAA6B,EAE7B,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAqC,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAE5I,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAEzF,MAAM,4BAA4B,GAAG,CAAC,SAAoB,EAA0C,EAAE;IACpG,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5D,MAAM,eAAe,GAAG,+BAA+B,CAAC,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,4BAA4B,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAE/E,0EAA0E;YAC1E,yEAAyE;YACzE,MAAM,MAAM,GAAG,6BAA6B,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC3F,MAAM,qBAAqB,GAAG,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAEhE,MAAM,KAAK,GAAG,MAAM,KAAK,CACvB,eAAe,EACf,MAAM,EACN,qBAAqB,EACrB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,mCAAmC,CAAC,WAAW,EAAE,qBAAqB,CAAC,IAAI,SAAS,EACpF,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,cAAc,CACxB,CAAC;YAEF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAEjE,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE;gBAC7C,mBAAmB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;gBAC3H,yBAAyB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;gBAC9H,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC;gBAC5G,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC;aAClH,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAgC,KAAK,EAAE,SAAoB,EAAgC,EAAE,CAAC,CAAC;IAC9I,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC,SAAS,CAAC;CACzE,CAAC,CAAC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResultError,\n actionResultErrorFromCaughtError,\n getScopedKvsTranslatorOrThrow,\n QPQConfig,\n resolveKvsStoreConfigOrThrow,\n} from 'quidproquo-core';\nimport { actionResult, KeyValueStoreActionType, KeyValueStoreQueryActionProcessor, KeyValueStoreQueryErrorTypeEnum } from 'quidproquo-core';\n\nimport { getKvsDynamoTableNameFromConfig } from '../../../awsNamingUtils';\nimport { query } from '../../../logic/dynamo';\nimport { getDynamoTableIndexByConfigAndQuery } from '../../../logic/dynamo/qpqDynamoOrm';\n\nconst getProcessKeyValueStoreQuery = (qpqConfig: QPQConfig): KeyValueStoreQueryActionProcessor<any> => {\n return async ({ keyValueStoreName, keyCondition, options }) => {\n const dynamoTableName = getKvsDynamoTableNameFromConfig(keyValueStoreName, qpqConfig, 'kvs');\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n try {\n const storeConfig = resolveKvsStoreConfigOrThrow(qpqConfig, keyValueStoreName);\n\n // Scope lives inside the pk values, so pk conditions are rewritten to the\n // composed form (throws when the key condition never constrains the pk).\n const scoped = getScopedKvsTranslatorOrThrow(qpqConfig, keyValueStoreName, options?.scope);\n const effectiveKeyCondition = scoped.keyCondition(keyCondition);\n\n const items = await query<any>(\n dynamoTableName,\n region,\n effectiveKeyCondition,\n scoped.filter(options?.filter),\n options?.nextPageKey,\n getDynamoTableIndexByConfigAndQuery(storeConfig, effectiveKeyCondition) ?? undefined,\n options?.limit,\n options?.sortAscending,\n options?.consistentRead,\n );\n\n items.items = items.items.map((item: any) => scoped.strip(item));\n\n return actionResult(items);\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n InternalServerError: () => actionResultError(KeyValueStoreQueryErrorTypeEnum.ServiceUnavailable, 'KVS Service Unavailable'),\n ResourceNotFoundException: () => actionResultError(KeyValueStoreQueryErrorTypeEnum.ResourceNotFound, 'KVS Resource Not Found'),\n InvalidScopeError: (error) => actionResultError(KeyValueStoreQueryErrorTypeEnum.InvalidScope, error.message),\n KvsStoreNotFoundError: (error) => actionResultError(KeyValueStoreQueryErrorTypeEnum.StoreNotFound, error.message),\n });\n }\n };\n};\n\nexport const getKeyValueStoreQueryActionProcessor: ActionProcessorListResolver = async (qpqConfig: QPQConfig): Promise<ActionProcessorList> => ({\n [KeyValueStoreActionType.Query]: getProcessKeyValueStoreQuery(qpqConfig),\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import { ActionProcessorListResolver } from 'quidproquo-core';
2
+ export declare const getKeyValueStoreScanAllScopesActionProcessor: ActionProcessorListResolver;
@@ -0,0 +1,42 @@
1
+ import { qpqConfigAwsUtils } from 'quidproquo-config-aws';
2
+ import { actionResult, actionResultError, actionResultErrorFromCaughtError, decomposeScopedKvsValue, KeyValueStoreActionType, KeyValueStoreScanAllScopesErrorTypeEnum, resolveKvsStoreConfigOrThrow, } from 'quidproquo-core';
3
+ import { getKvsDynamoTableNameFromConfig } from '../../../awsNamingUtils';
4
+ import { scan } from '../../../logic/dynamo';
5
+ // Every row in the table, scope and all. No scoped translator is involved: that is the whole
6
+ // point, and it is why this action is migration-only (see askKeyValueStoreScanAllScopes).
7
+ //
8
+ // The scope is composed into the partition key value, so each row is split back into the
9
+ // scope it belongs to plus its raw key, exactly as the stream processor does. The caller gets
10
+ // items indistinguishable from a scoped read, plus the scope beside them.
11
+ const getProcessKeyValueStoreScanAllScopes = (qpqConfig) => {
12
+ return async ({ keyValueStoreName, filterCondition, nextPageKey }) => {
13
+ const dynamoTableName = getKvsDynamoTableNameFromConfig(keyValueStoreName, qpqConfig, 'kvs');
14
+ const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
15
+ try {
16
+ const storeConfig = resolveKvsStoreConfigOrThrow(qpqConfig, keyValueStoreName);
17
+ const partitionKey = storeConfig.partitionKey.key;
18
+ const page = await scan(dynamoTableName, region, filterCondition, nextPageKey);
19
+ const items = page.items.map((item) => {
20
+ // Only a string partition key can carry a composed scope; anything else is unscoped
21
+ // by construction.
22
+ if (storeConfig.partitionKey.type !== 'string') {
23
+ return { item };
24
+ }
25
+ const { scope, rawValue } = decomposeScopedKvsValue(String(item[partitionKey] ?? ''));
26
+ return { scope, item: { ...item, [partitionKey]: rawValue } };
27
+ });
28
+ return actionResult({ items, nextPageKey: page.nextPageKey });
29
+ }
30
+ catch (error) {
31
+ return actionResultErrorFromCaughtError(error, {
32
+ InternalServerError: () => actionResultError(KeyValueStoreScanAllScopesErrorTypeEnum.ServiceUnavailable, 'KVS Service Unavailable'),
33
+ ResourceNotFoundException: () => actionResultError(KeyValueStoreScanAllScopesErrorTypeEnum.ResourceNotFound, 'KVS Resource Not Found'),
34
+ KvsStoreNotFoundError: (error) => actionResultError(KeyValueStoreScanAllScopesErrorTypeEnum.StoreNotFound, error.message),
35
+ });
36
+ }
37
+ };
38
+ };
39
+ export const getKeyValueStoreScanAllScopesActionProcessor = async (qpqConfig) => ({
40
+ [KeyValueStoreActionType.ScanAllScopes]: getProcessKeyValueStoreScanAllScopes(qpqConfig),
41
+ });
42
+ //# sourceMappingURL=getKeyValueStoreScanAllScopesActionProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getKeyValueStoreScanAllScopesActionProcessor.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/keyValueStore/getKeyValueStoreScanAllScopesActionProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAGL,YAAY,EACZ,iBAAiB,EACjB,gCAAgC,EAChC,uBAAuB,EACvB,uBAAuB,EAEvB,uCAAuC,EAGvC,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C,6FAA6F;AAC7F,0FAA0F;AAC1F,EAAE;AACF,yFAAyF;AACzF,8FAA8F;AAC9F,0EAA0E;AAC1E,MAAM,oCAAoC,GAAG,CAAC,SAAoB,EAAkD,EAAE;IACpH,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,EAAE;QACnE,MAAM,eAAe,GAAG,+BAA+B,CAAC,iBAAiB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,iBAAiB,CAAC,gCAAgC,CAAC,SAAS,CAAC,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,4BAA4B,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAC/E,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC;YAElD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAM,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;YAEpF,MAAM,KAAK,GAAyB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;gBAC/D,oFAAoF;gBACpF,mBAAmB;gBACnB,IAAI,WAAW,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC/C,OAAO,EAAE,IAAI,EAAE,CAAC;gBAClB,CAAC;gBAED,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAEtF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,gCAAgC,CAAC,KAAK,EAAE;gBAC7C,mBAAmB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,uCAAuC,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;gBACnI,yBAAyB,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,uCAAuC,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;gBACtI,qBAAqB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,uCAAuC,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC;aAC1H,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4CAA4C,GAAgC,KAAK,EAC5F,SAAoB,EACU,EAAE,CAAC,CAAC;IAClC,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,oCAAoC,CAAC,SAAS,CAAC;CACzF,CAAC,CAAC","sourcesContent":["import { qpqConfigAwsUtils } from 'quidproquo-config-aws';\nimport {\n ActionProcessorList,\n ActionProcessorListResolver,\n actionResult,\n actionResultError,\n actionResultErrorFromCaughtError,\n decomposeScopedKvsValue,\n KeyValueStoreActionType,\n KeyValueStoreScanAllScopesActionProcessor,\n KeyValueStoreScanAllScopesErrorTypeEnum,\n KvsScopedItem,\n QPQConfig,\n resolveKvsStoreConfigOrThrow,\n} from 'quidproquo-core';\n\nimport { getKvsDynamoTableNameFromConfig } from '../../../awsNamingUtils';\nimport { scan } from '../../../logic/dynamo';\n\n// Every row in the table, scope and all. No scoped translator is involved: that is the whole\n// point, and it is why this action is migration-only (see askKeyValueStoreScanAllScopes).\n//\n// The scope is composed into the partition key value, so each row is split back into the\n// scope it belongs to plus its raw key, exactly as the stream processor does. The caller gets\n// items indistinguishable from a scoped read, plus the scope beside them.\nconst getProcessKeyValueStoreScanAllScopes = (qpqConfig: QPQConfig): KeyValueStoreScanAllScopesActionProcessor<any> => {\n return async ({ keyValueStoreName, filterCondition, nextPageKey }) => {\n const dynamoTableName = getKvsDynamoTableNameFromConfig(keyValueStoreName, qpqConfig, 'kvs');\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n try {\n const storeConfig = resolveKvsStoreConfigOrThrow(qpqConfig, keyValueStoreName);\n const partitionKey = storeConfig.partitionKey.key;\n\n const page = await scan<any>(dynamoTableName, region, filterCondition, nextPageKey);\n\n const items: KvsScopedItem<any>[] = page.items.map((item: any) => {\n // Only a string partition key can carry a composed scope; anything else is unscoped\n // by construction.\n if (storeConfig.partitionKey.type !== 'string') {\n return { item };\n }\n\n const { scope, rawValue } = decomposeScopedKvsValue(String(item[partitionKey] ?? ''));\n\n return { scope, item: { ...item, [partitionKey]: rawValue } };\n });\n\n return actionResult({ items, nextPageKey: page.nextPageKey });\n } catch (error: unknown) {\n return actionResultErrorFromCaughtError(error, {\n InternalServerError: () => actionResultError(KeyValueStoreScanAllScopesErrorTypeEnum.ServiceUnavailable, 'KVS Service Unavailable'),\n ResourceNotFoundException: () => actionResultError(KeyValueStoreScanAllScopesErrorTypeEnum.ResourceNotFound, 'KVS Resource Not Found'),\n KvsStoreNotFoundError: (error) => actionResultError(KeyValueStoreScanAllScopesErrorTypeEnum.StoreNotFound, error.message),\n });\n }\n };\n};\n\nexport const getKeyValueStoreScanAllScopesActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n): Promise<ActionProcessorList> => ({\n [KeyValueStoreActionType.ScanAllScopes]: getProcessKeyValueStoreScanAllScopes(qpqConfig),\n});\n"]}
@@ -3,6 +3,7 @@ import { getKeyValueStoreGetActionProcessor } from './getKeyValueStoreGetActionP
3
3
  import { getKeyValueStoreGetAllActionProcessor } from './getKeyValueStoreGetAllActionProcessor';
4
4
  import { getKeyValueStoreQueryActionProcessor } from './getKeyValueStoreQueryActionProcessor';
5
5
  import { getKeyValueStoreScanActionProcessor } from './getKeyValueStoreScanActionProcessor';
6
+ import { getKeyValueStoreScanAllScopesActionProcessor } from './getKeyValueStoreScanAllScopesActionProcessor';
6
7
  import { getKeyValueStoreUpdateActionProcessor } from './getKeyValueStoreUpdateActionProcessor';
7
8
  import { getKeyValueStoreUpsertActionProcessor } from './getKeyValueStoreUpsertActionProcessor';
8
9
  export const getKeyValueStoreActionProcessor = async (qpqConfig, dynamicModuleLoader) => ({
@@ -13,5 +14,6 @@ export const getKeyValueStoreActionProcessor = async (qpqConfig, dynamicModuleLo
13
14
  ...(await getKeyValueStoreUpdateActionProcessor(qpqConfig, dynamicModuleLoader)),
14
15
  ...(await getKeyValueStoreQueryActionProcessor(qpqConfig, dynamicModuleLoader)),
15
16
  ...(await getKeyValueStoreScanActionProcessor(qpqConfig, dynamicModuleLoader)),
17
+ ...(await getKeyValueStoreScanAllScopesActionProcessor(qpqConfig, dynamicModuleLoader)),
16
18
  });
17
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/keyValueStore/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAC9F,OAAO,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAEhG,MAAM,CAAC,MAAM,+BAA+B,GAAgC,KAAK,EAC/E,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,kCAAkC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC7E,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,oCAAoC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC/E,GAAG,CAAC,MAAM,mCAAmC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CAC/E,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from 'quidproquo-core';\n\nimport { getKeyValueStoreDeleteActionProcessor } from './getKeyValueStoreDeleteActionProcessor';\nimport { getKeyValueStoreGetActionProcessor } from './getKeyValueStoreGetActionProcessor';\nimport { getKeyValueStoreGetAllActionProcessor } from './getKeyValueStoreGetAllActionProcessor';\nimport { getKeyValueStoreQueryActionProcessor } from './getKeyValueStoreQueryActionProcessor';\nimport { getKeyValueStoreScanActionProcessor } from './getKeyValueStoreScanActionProcessor';\nimport { getKeyValueStoreUpdateActionProcessor } from './getKeyValueStoreUpdateActionProcessor';\nimport { getKeyValueStoreUpsertActionProcessor } from './getKeyValueStoreUpsertActionProcessor';\n\nexport const getKeyValueStoreActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getKeyValueStoreDeleteActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreGetActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreGetAllActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreUpsertActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreUpdateActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreQueryActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreScanActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/getActionProcessor/core/keyValueStore/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAC9F,OAAO,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,4CAA4C,EAAE,MAAM,gDAAgD,CAAC;AAC9G,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAEhG,MAAM,CAAC,MAAM,+BAA+B,GAAgC,KAAK,EAC/E,SAAoB,EACpB,mBAAwC,EACV,EAAE,CAAC,CAAC;IAClC,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,kCAAkC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC7E,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,qCAAqC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAChF,GAAG,CAAC,MAAM,oCAAoC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC/E,GAAG,CAAC,MAAM,mCAAmC,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC9E,GAAG,CAAC,MAAM,4CAA4C,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;CACxF,CAAC,CAAC","sourcesContent":["import { ActionProcessorList, ActionProcessorListResolver, DynamicModuleLoader, QPQConfig } from 'quidproquo-core';\n\nimport { getKeyValueStoreDeleteActionProcessor } from './getKeyValueStoreDeleteActionProcessor';\nimport { getKeyValueStoreGetActionProcessor } from './getKeyValueStoreGetActionProcessor';\nimport { getKeyValueStoreGetAllActionProcessor } from './getKeyValueStoreGetAllActionProcessor';\nimport { getKeyValueStoreQueryActionProcessor } from './getKeyValueStoreQueryActionProcessor';\nimport { getKeyValueStoreScanActionProcessor } from './getKeyValueStoreScanActionProcessor';\nimport { getKeyValueStoreScanAllScopesActionProcessor } from './getKeyValueStoreScanAllScopesActionProcessor';\nimport { getKeyValueStoreUpdateActionProcessor } from './getKeyValueStoreUpdateActionProcessor';\nimport { getKeyValueStoreUpsertActionProcessor } from './getKeyValueStoreUpsertActionProcessor';\n\nexport const getKeyValueStoreActionProcessor: ActionProcessorListResolver = async (\n qpqConfig: QPQConfig,\n dynamicModuleLoader: DynamicModuleLoader,\n): Promise<ActionProcessorList> => ({\n ...(await getKeyValueStoreDeleteActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreGetActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreGetAllActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreUpsertActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreUpdateActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreQueryActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreScanActionProcessor(qpqConfig, dynamicModuleLoader)),\n ...(await getKeyValueStoreScanAllScopesActionProcessor(qpqConfig, dynamicModuleLoader)),\n});\n"]}
@@ -12,6 +12,7 @@ export const entryNames = [
12
12
  'customMessageTriggerEvent_defineAuthChallenge',
13
13
  'customMessageTriggerEvent_createAuthChallenge',
14
14
  'customMessageTriggerEvent_verifyAuthChallenge',
15
+ 'dynamoStreamEvent_kvsStreamEvent',
15
16
  'eventBridgeEvent_recurringSchedule',
16
17
  'eventBridgeEvent_stackDeploy',
17
18
  's3Event_fileEvent',
@@ -1 +1 @@
1
- {"version":3,"file":"getLambdaEntries.js","sourceRoot":"","sources":["../../src/getLambdaEntries.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,gFAAgF;AAChF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gDAAgD;IAEhD,iCAAiC;IACjC,wBAAwB;IAExB,oDAAoD;IAEpD,sCAAsC;IACtC,sCAAsC;IAEtC,yCAAyC;IACzC,+CAA+C;IAC/C,+CAA+C;IAC/C,+CAA+C;IAE/C,oCAAoC;IACpC,8BAA8B;IAE9B,mBAAmB;IACnB,qBAAqB;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAA2B,EAAE,CAC3D,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["import path from 'path';\n\n// One entry per lambda handler under ./lambdas; each name must match its source\n// filename exactly (yes, including the apiGatway spelling).\nexport const entryNames = [\n 'anyExecuteServiceFunctionEvent_serviceFunction',\n\n 'apiGatewayEventHandler_redirect',\n 'apiGatewayEventHandler',\n\n 'apiGatwayEventWebsocketWithIdentity_websocketEvent',\n\n 'cloudFrontRequestEvent_originRequest',\n 'cloudFrontRequestEvent_viewerRequest',\n\n 'customMessageTriggerEvent_customMessage',\n 'customMessageTriggerEvent_defineAuthChallenge',\n 'customMessageTriggerEvent_createAuthChallenge',\n 'customMessageTriggerEvent_verifyAuthChallenge',\n\n 'eventBridgeEvent_recurringSchedule',\n 'eventBridgeEvent_stackDeploy',\n\n 's3Event_fileEvent',\n 'sqsEvent_queueEvent',\n];\n\n/**\n * Maps each lambda entry name to its handler path, for deploy bundlers\n * (quidproquo-deploy-rspack/webpack) to use as bundle entry points.\n */\nexport const getLambdaEntries = (): Record<string, string> =>\n Object.fromEntries(entryNames.map((name) => [name, path.join(__dirname, `./lambdas/${name}`)]));\n"]}
1
+ {"version":3,"file":"getLambdaEntries.js","sourceRoot":"","sources":["../../src/getLambdaEntries.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,gFAAgF;AAChF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gDAAgD;IAEhD,iCAAiC;IACjC,wBAAwB;IAExB,oDAAoD;IAEpD,sCAAsC;IACtC,sCAAsC;IAEtC,yCAAyC;IACzC,+CAA+C;IAC/C,+CAA+C;IAC/C,+CAA+C;IAE/C,kCAAkC;IAElC,oCAAoC;IACpC,8BAA8B;IAE9B,mBAAmB;IACnB,qBAAqB;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAA2B,EAAE,CAC3D,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["import path from 'path';\n\n// One entry per lambda handler under ./lambdas; each name must match its source\n// filename exactly (yes, including the apiGatway spelling).\nexport const entryNames = [\n 'anyExecuteServiceFunctionEvent_serviceFunction',\n\n 'apiGatewayEventHandler_redirect',\n 'apiGatewayEventHandler',\n\n 'apiGatwayEventWebsocketWithIdentity_websocketEvent',\n\n 'cloudFrontRequestEvent_originRequest',\n 'cloudFrontRequestEvent_viewerRequest',\n\n 'customMessageTriggerEvent_customMessage',\n 'customMessageTriggerEvent_defineAuthChallenge',\n 'customMessageTriggerEvent_createAuthChallenge',\n 'customMessageTriggerEvent_verifyAuthChallenge',\n\n 'dynamoStreamEvent_kvsStreamEvent',\n\n 'eventBridgeEvent_recurringSchedule',\n 'eventBridgeEvent_stackDeploy',\n\n 's3Event_fileEvent',\n 'sqsEvent_queueEvent',\n];\n\n/**\n * Maps each lambda entry name to its handler path, for deploy bundlers\n * (quidproquo-deploy-rspack/webpack) to use as bundle entry points.\n */\nexport const getLambdaEntries = (): Record<string, string> =>\n Object.fromEntries(entryNames.map((name) => [name, path.join(__dirname, `./lambdas/${name}`)]));\n"]}