@webiny/api-opensearch-aws 0.0.0-unstable.5387e5f7c8 → 0.0.0-unstable.a85ef555b2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-opensearch-aws",
3
- "version": "0.0.0-unstable.5387e5f7c8",
3
+ "version": "0.0.0-unstable.a85ef555b2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -15,15 +15,15 @@
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
17
  "@opensearch-project/opensearch": "3.6.0",
18
- "@webiny/api": "0.0.0-unstable.5387e5f7c8",
19
- "@webiny/api-opensearch": "0.0.0-unstable.5387e5f7c8",
20
- "@webiny/aws-sdk": "0.0.0-unstable.5387e5f7c8",
21
- "@webiny/db-dynamodb": "0.0.0-unstable.5387e5f7c8",
22
- "@webiny/error": "0.0.0-unstable.5387e5f7c8",
23
- "@webiny/feature": "0.0.0-unstable.5387e5f7c8"
18
+ "@webiny/api": "0.0.0-unstable.a85ef555b2",
19
+ "@webiny/api-opensearch": "0.0.0-unstable.a85ef555b2",
20
+ "@webiny/aws-sdk": "0.0.0-unstable.a85ef555b2",
21
+ "@webiny/db-dynamodb": "0.0.0-unstable.a85ef555b2",
22
+ "@webiny/error": "0.0.0-unstable.a85ef555b2",
23
+ "@webiny/feature": "0.0.0-unstable.a85ef555b2"
24
24
  },
25
25
  "devDependencies": {
26
- "@webiny/build-tools": "0.0.0-unstable.5387e5f7c8",
26
+ "@webiny/build-tools": "0.0.0-unstable.a85ef555b2",
27
27
  "rimraf": "6.1.3",
28
28
  "typescript": "7.0.2",
29
29
  "vitest": "4.1.11"
@@ -73,15 +73,7 @@ const processBatchWrite = async (documentClient, handler, params)=>{
73
73
  Key: DeleteRequest.Key,
74
74
  TableName: process.env.DB_TABLE_OPENSEARCH
75
75
  });
76
- if (Item) {
77
- if (!Item.index) {
78
- const { PK, SK } = Item;
79
- throw new Error(`Missing index value on the record in the elasticsearch table "${process.env.DB_TABLE_OPENSEARCH}" with keys PK "${PK}" and SK "${SK}". Make sure that you stored Elasticsearch entry in the Elasticsearch table.`);
80
- }
81
- } else {
82
- const { PK, SK } = DeleteRequest.Key;
83
- throw new Error(`Missing record in the elasticsearch table "${process.env.DB_TABLE_OPENSEARCH}" with keys PK "${PK}" and SK "${SK}". Make sure that record you are deleting is stored in the Elasticsearch table.`);
84
- }
76
+ if (!Item || !Item.index) continue;
85
77
  const record = createDynamoStreamRecord("REMOVE", {
86
78
  Keys: DeleteRequest.Key,
87
79
  OldImage: Item
@@ -100,6 +92,7 @@ const processBatchWrite = async (documentClient, handler, params)=>{
100
92
  records.push(record);
101
93
  }
102
94
  }
95
+ if (0 === records.length) return;
103
96
  await handler(createDynamoStreamEvent(...records));
104
97
  };
105
98
  const processing = {
@@ -1 +1 @@
1
- {"version":3,"file":"testing/processing.js","sources":["../../src/testing/processing.ts"],"sourcesContent":["import { marshall } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { PutCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { UpdateCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { DeleteCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { BatchWriteCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport type { DynamoDBDocument } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\n\nconst streamTableName = process.env.DB_TABLE_OPENSEARCH;\n\nconst isOpenSearchStreamTable = (table: string) => {\n return table === streamTableName;\n};\n\nconst createMarshalledObject = (target: Record<string, unknown> | undefined) => {\n if (!target) {\n return undefined;\n }\n return marshall(target, {\n convertEmptyValues: true,\n removeUndefinedValues: true\n });\n};\n\nexport const createDynamoStreamEvent = (...records: Record<string, unknown>[]) => {\n return { Records: records };\n};\n\nexport const createDynamoStreamRecord = (\n eventName: string,\n data: {\n Keys?: Record<string, unknown>;\n NewImage?: Record<string, unknown>;\n OldImage?: Record<string, unknown>;\n } = {}\n) => {\n const { Keys = {}, NewImage = {}, OldImage = {} } = data;\n return {\n eventID: \"2cb5ad3ffabca3639e4f7858e3bdd138\",\n eventName,\n eventVersion: \"1.1\",\n eventSource: \"aws:dynamodb\",\n awsRegion: \"eu-central-1\",\n dynamodb: {\n ApproximateCreationDateTime: 1613939165,\n Keys: marshall(Keys),\n NewImage: createMarshalledObject(NewImage),\n OldImage: createMarshalledObject(OldImage),\n SequenceNumber: \"300000000029551639656\",\n SizeBytes: 14,\n StreamViewType: \"NEW_AND_OLD_IMAGES\"\n },\n eventSourceARN:\n \"arn:aws:dynamodb:eu-central-1:111111111111:table/streams-11111111/stream/2021-02-21T20:12:44.976\"\n };\n};\n\ntype StreamHandler = (event: Record<string, unknown>) => Promise<void>;\n\nconst processDelete = async (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n) => {\n if (isOpenSearchStreamTable(params.input?.TableName) === false) {\n return;\n }\n const { Key, TableName } = params.input;\n const { Item } = await documentClient.get({ Key, TableName });\n\n if (!Item || !Item.index) {\n return;\n }\n const record = createDynamoStreamRecord(\"REMOVE\", { Keys: Key, OldImage: Item });\n const event = createDynamoStreamEvent(record);\n\n await handler(event);\n};\n\nconst processPut = async (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n) => {\n const tableName = params.input?.TableName;\n if (isOpenSearchStreamTable(tableName) === false) {\n return;\n }\n\n const item = params.input.Item;\n if (!item) {\n return;\n }\n const { PK, SK } = item;\n\n const record = createDynamoStreamRecord(\"INSERT\", { Keys: { PK, SK }, NewImage: item });\n const event = createDynamoStreamEvent(record);\n\n await handler(event);\n};\n\nconst processBatchWrite = async (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n) => {\n const operations = params?.input?.RequestItems?.[streamTableName!];\n if (!Array.isArray(operations)) {\n return;\n }\n\n const records = [];\n for (const operation of operations) {\n const { PutRequest, DeleteRequest } = operation;\n if (DeleteRequest) {\n const { Item } = await documentClient.get({\n Key: DeleteRequest.Key,\n TableName: process.env.DB_TABLE_OPENSEARCH\n });\n\n if (!Item) {\n const { PK, SK } = DeleteRequest.Key;\n throw new Error(\n `Missing record in the elasticsearch table \"${process.env.DB_TABLE_OPENSEARCH}\" with keys PK \"${PK}\" and SK \"${SK}\". Make sure that record you are deleting is stored in the Elasticsearch table.`\n );\n } else if (!Item.index) {\n const { PK, SK } = Item;\n throw new Error(\n `Missing index value on the record in the elasticsearch table \"${process.env.DB_TABLE_OPENSEARCH}\" with keys PK \"${PK}\" and SK \"${SK}\". Make sure that you stored Elasticsearch entry in the Elasticsearch table.`\n );\n }\n const record = createDynamoStreamRecord(\"REMOVE\", {\n Keys: DeleteRequest.Key,\n OldImage: Item\n });\n records.push(record);\n }\n\n if (PutRequest) {\n const { Item } = PutRequest;\n const record = createDynamoStreamRecord(\"INSERT\", {\n Keys: { PK: Item.PK, SK: Item.SK },\n NewImage: Item\n });\n records.push(record);\n }\n }\n await handler(createDynamoStreamEvent(...records));\n};\n\nexport const processing: Record<\n string,\n (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n ) => Promise<void>\n> = {\n put: processPut,\n update: processPut,\n delete: processDelete,\n batchWrite: processBatchWrite\n};\n\nexport const getCommandName = (command: unknown): string | null => {\n if (!command) {\n return null;\n }\n if (command instanceof PutCommand) {\n return \"put\";\n } else if (command instanceof UpdateCommand) {\n return \"update\";\n } else if (command instanceof DeleteCommand) {\n return \"delete\";\n } else if (command instanceof BatchWriteCommand) {\n return \"batchWrite\";\n }\n return null;\n};\n"],"names":["streamTableName","process","isOpenSearchStreamTable","table","createMarshalledObject","target","marshall","createDynamoStreamEvent","records","createDynamoStreamRecord","eventName","data","Keys","NewImage","OldImage","processDelete","documentClient","handler","params","Key","TableName","Item","record","event","processPut","tableName","item","PK","SK","processBatchWrite","operations","Array","operation","PutRequest","DeleteRequest","Error","processing","getCommandName","command","PutCommand","UpdateCommand","DeleteCommand","BatchWriteCommand"],"mappings":"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"}
1
+ {"version":3,"file":"testing/processing.js","sources":["../../src/testing/processing.ts"],"sourcesContent":["import { marshall } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { PutCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { UpdateCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { DeleteCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport { BatchWriteCommand } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\nimport type { DynamoDBDocument } from \"@webiny/aws-sdk/client-dynamodb/index.js\";\n\nconst streamTableName = process.env.DB_TABLE_OPENSEARCH;\n\nconst isOpenSearchStreamTable = (table: string) => {\n return table === streamTableName;\n};\n\nconst createMarshalledObject = (target: Record<string, unknown> | undefined) => {\n if (!target) {\n return undefined;\n }\n return marshall(target, {\n convertEmptyValues: true,\n removeUndefinedValues: true\n });\n};\n\nexport const createDynamoStreamEvent = (...records: Record<string, unknown>[]) => {\n return { Records: records };\n};\n\nexport const createDynamoStreamRecord = (\n eventName: string,\n data: {\n Keys?: Record<string, unknown>;\n NewImage?: Record<string, unknown>;\n OldImage?: Record<string, unknown>;\n } = {}\n) => {\n const { Keys = {}, NewImage = {}, OldImage = {} } = data;\n return {\n eventID: \"2cb5ad3ffabca3639e4f7858e3bdd138\",\n eventName,\n eventVersion: \"1.1\",\n eventSource: \"aws:dynamodb\",\n awsRegion: \"eu-central-1\",\n dynamodb: {\n ApproximateCreationDateTime: 1613939165,\n Keys: marshall(Keys),\n NewImage: createMarshalledObject(NewImage),\n OldImage: createMarshalledObject(OldImage),\n SequenceNumber: \"300000000029551639656\",\n SizeBytes: 14,\n StreamViewType: \"NEW_AND_OLD_IMAGES\"\n },\n eventSourceARN:\n \"arn:aws:dynamodb:eu-central-1:111111111111:table/streams-11111111/stream/2021-02-21T20:12:44.976\"\n };\n};\n\ntype StreamHandler = (event: Record<string, unknown>) => Promise<void>;\n\nconst processDelete = async (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n) => {\n if (isOpenSearchStreamTable(params.input?.TableName) === false) {\n return;\n }\n const { Key, TableName } = params.input;\n const { Item } = await documentClient.get({ Key, TableName });\n\n if (!Item || !Item.index) {\n return;\n }\n const record = createDynamoStreamRecord(\"REMOVE\", { Keys: Key, OldImage: Item });\n const event = createDynamoStreamEvent(record);\n\n await handler(event);\n};\n\nconst processPut = async (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n) => {\n const tableName = params.input?.TableName;\n if (isOpenSearchStreamTable(tableName) === false) {\n return;\n }\n\n const item = params.input.Item;\n if (!item) {\n return;\n }\n const { PK, SK } = item;\n\n const record = createDynamoStreamRecord(\"INSERT\", { Keys: { PK, SK }, NewImage: item });\n const event = createDynamoStreamEvent(record);\n\n await handler(event);\n};\n\nconst processBatchWrite = async (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n) => {\n const operations = params?.input?.RequestItems?.[streamTableName!];\n if (!Array.isArray(operations)) {\n return;\n }\n\n const records = [];\n for (const operation of operations) {\n const { PutRequest, DeleteRequest } = operation;\n if (DeleteRequest) {\n const { Item } = await documentClient.get({\n Key: DeleteRequest.Key,\n TableName: process.env.DB_TABLE_OPENSEARCH\n });\n\n // A missing record (or one without an index) emits no REMOVE record, like DynamoDB\n // streams for a delete of a missing item and like `processDelete`.\n if (!Item || !Item.index) {\n continue;\n }\n const record = createDynamoStreamRecord(\"REMOVE\", {\n Keys: DeleteRequest.Key,\n OldImage: Item\n });\n records.push(record);\n }\n\n if (PutRequest) {\n const { Item } = PutRequest;\n const record = createDynamoStreamRecord(\"INSERT\", {\n Keys: { PK: Item.PK, SK: Item.SK },\n NewImage: Item\n });\n records.push(record);\n }\n }\n if (records.length === 0) {\n return;\n }\n await handler(createDynamoStreamEvent(...records));\n};\n\nexport const processing: Record<\n string,\n (\n documentClient: DynamoDBDocument,\n handler: StreamHandler,\n params: Record<string, any>\n ) => Promise<void>\n> = {\n put: processPut,\n update: processPut,\n delete: processDelete,\n batchWrite: processBatchWrite\n};\n\nexport const getCommandName = (command: unknown): string | null => {\n if (!command) {\n return null;\n }\n if (command instanceof PutCommand) {\n return \"put\";\n } else if (command instanceof UpdateCommand) {\n return \"update\";\n } else if (command instanceof DeleteCommand) {\n return \"delete\";\n } else if (command instanceof BatchWriteCommand) {\n return \"batchWrite\";\n }\n return null;\n};\n"],"names":["streamTableName","process","isOpenSearchStreamTable","table","createMarshalledObject","target","marshall","createDynamoStreamEvent","records","createDynamoStreamRecord","eventName","data","Keys","NewImage","OldImage","processDelete","documentClient","handler","params","Key","TableName","Item","record","event","processPut","tableName","item","PK","SK","processBatchWrite","operations","Array","operation","PutRequest","DeleteRequest","processing","getCommandName","command","PutCommand","UpdateCommand","DeleteCommand","BatchWriteCommand"],"mappings":"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"}