@webiny/api-elasticsearch-tasks 0.0.0-unstable.06b2ede40f
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/LICENSE +21 -0
- package/README.md +10 -0
- package/definitions/entry.d.ts +11 -0
- package/definitions/entry.js +43 -0
- package/definitions/entry.js.map +1 -0
- package/definitions/index.d.ts +2 -0
- package/definitions/index.js +29 -0
- package/definitions/index.js.map +1 -0
- package/definitions/table.d.ts +7 -0
- package/definitions/table.js +23 -0
- package/definitions/table.js.map +1 -0
- package/errors/IndexSettingsGetError.d.ts +6 -0
- package/errors/IndexSettingsGetError.js +20 -0
- package/errors/IndexSettingsGetError.js.map +1 -0
- package/errors/IndexSettingsSetError.d.ts +6 -0
- package/errors/IndexSettingsSetError.js +20 -0
- package/errors/IndexSettingsSetError.js.map +1 -0
- package/errors/IndexingDisableError.d.ts +2 -0
- package/errors/IndexingDisableError.js +10 -0
- package/errors/IndexingDisableError.js.map +1 -0
- package/errors/IndexingEnableError.d.ts +2 -0
- package/errors/IndexingEnableError.js +10 -0
- package/errors/IndexingEnableError.js.map +1 -0
- package/errors/index.d.ts +4 -0
- package/errors/index.js +51 -0
- package/errors/index.js.map +1 -0
- package/helpers/scan.d.ts +10 -0
- package/helpers/scan.js +24 -0
- package/helpers/scan.js.map +1 -0
- package/index.d.ts +5 -0
- package/index.js +28 -0
- package/index.js.map +1 -0
- package/package.json +59 -0
- package/settings/DisableIndexing.d.ts +7 -0
- package/settings/DisableIndexing.js +27 -0
- package/settings/DisableIndexing.js.map +1 -0
- package/settings/EnableIndexing.d.ts +7 -0
- package/settings/EnableIndexing.js +27 -0
- package/settings/EnableIndexing.js.map +1 -0
- package/settings/IndexManager.d.ts +20 -0
- package/settings/IndexManager.js +100 -0
- package/settings/IndexManager.js.map +1 -0
- package/settings/IndexSettingsManager.d.ts +8 -0
- package/settings/IndexSettingsManager.js +44 -0
- package/settings/IndexSettingsManager.js.map +1 -0
- package/settings/index.d.ts +1 -0
- package/settings/index.js +18 -0
- package/settings/index.js.map +1 -0
- package/settings/types.d.ts +9 -0
- package/settings/types.js +7 -0
- package/settings/types.js.map +1 -0
- package/tasks/Manager.d.ts +33 -0
- package/tasks/Manager.js +51 -0
- package/tasks/Manager.js.map +1 -0
- package/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin.d.ts +23 -0
- package/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin.js +25 -0
- package/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin.js.map +1 -0
- package/tasks/createIndexes/CreateIndexesTaskRunner.d.ts +10 -0
- package/tasks/createIndexes/CreateIndexesTaskRunner.js +77 -0
- package/tasks/createIndexes/CreateIndexesTaskRunner.js.map +1 -0
- package/tasks/createIndexes/OnBeforeTrigger.d.ts +12 -0
- package/tasks/createIndexes/OnBeforeTrigger.js +68 -0
- package/tasks/createIndexes/OnBeforeTrigger.js.map +1 -0
- package/tasks/createIndexes/createIndex.d.ts +5 -0
- package/tasks/createIndexes/createIndex.js +27 -0
- package/tasks/createIndexes/createIndex.js.map +1 -0
- package/tasks/createIndexes/index.d.ts +3 -0
- package/tasks/createIndexes/index.js +68 -0
- package/tasks/createIndexes/index.js.map +1 -0
- package/tasks/createIndexes/listCreateElasticsearchIndexTaskPlugin.d.ts +4 -0
- package/tasks/createIndexes/listCreateElasticsearchIndexTaskPlugin.js +13 -0
- package/tasks/createIndexes/listCreateElasticsearchIndexTaskPlugin.js.map +1 -0
- package/tasks/createIndexes/listIndexes.d.ts +12 -0
- package/tasks/createIndexes/listIndexes.js +53 -0
- package/tasks/createIndexes/listIndexes.js.map +1 -0
- package/tasks/createIndexes/types.d.ts +4 -0
- package/tasks/createIndexes/types.js +7 -0
- package/tasks/createIndexes/types.js.map +1 -0
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.d.ts +15 -0
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.js +55 -0
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.js.map +1 -0
- package/tasks/dataSynchronization/createFactories.d.ts +2 -0
- package/tasks/dataSynchronization/createFactories.js +17 -0
- package/tasks/dataSynchronization/createFactories.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.d.ts +10 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js +98 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.d.ts +14 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js +76 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchToDynamoDbSynchronization.d.ts +10 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchToDynamoDbSynchronization.js +77 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchToDynamoDbSynchronization.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchFetcher.d.ts +21 -0
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchFetcher.js +7 -0
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchFetcher.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchSynchronize.d.ts +17 -0
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchSynchronize.js +7 -0
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchSynchronize.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/shouldIgnoreEsResponseError.d.ts +2 -0
- package/tasks/dataSynchronization/elasticsearch/shouldIgnoreEsResponseError.js +13 -0
- package/tasks/dataSynchronization/elasticsearch/shouldIgnoreEsResponseError.js.map +1 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.d.ts +713 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.js +46 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.js.map +1 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.d.ts +11 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.js +29 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.js.map +1 -0
- package/tasks/dataSynchronization/entities/getTable.d.ts +7 -0
- package/tasks/dataSynchronization/entities/getTable.js +29 -0
- package/tasks/dataSynchronization/entities/getTable.js.map +1 -0
- package/tasks/dataSynchronization/entities/index.d.ts +3 -0
- package/tasks/dataSynchronization/entities/index.js +40 -0
- package/tasks/dataSynchronization/entities/index.js.map +1 -0
- package/tasks/dataSynchronization/index.d.ts +4 -0
- package/tasks/dataSynchronization/index.js +80 -0
- package/tasks/dataSynchronization/index.js.map +1 -0
- package/tasks/dataSynchronization/types.d.ts +38 -0
- package/tasks/dataSynchronization/types.js +7 -0
- package/tasks/dataSynchronization/types.js.map +1 -0
- package/tasks/enableIndexing/EnableIndexingTaskRunner.d.ts +11 -0
- package/tasks/enableIndexing/EnableIndexingTaskRunner.js +49 -0
- package/tasks/enableIndexing/EnableIndexingTaskRunner.js.map +1 -0
- package/tasks/enableIndexing/index.d.ts +3 -0
- package/tasks/enableIndexing/index.js +51 -0
- package/tasks/enableIndexing/index.js.map +1 -0
- package/tasks/enableIndexing/types.d.ts +5 -0
- package/tasks/enableIndexing/types.js +7 -0
- package/tasks/enableIndexing/types.js.map +1 -0
- package/tasks/index.d.ts +4 -0
- package/tasks/index.js +51 -0
- package/tasks/index.js.map +1 -0
- package/tasks/reindexing/ReindexingTaskRunner.d.ts +16 -0
- package/tasks/reindexing/ReindexingTaskRunner.js +137 -0
- package/tasks/reindexing/ReindexingTaskRunner.js.map +1 -0
- package/tasks/reindexing/index.d.ts +1 -0
- package/tasks/reindexing/index.js +18 -0
- package/tasks/reindexing/index.js.map +1 -0
- package/tasks/reindexing/reindexingTaskDefinition.d.ts +2 -0
- package/tasks/reindexing/reindexingTaskDefinition.js +49 -0
- package/tasks/reindexing/reindexingTaskDefinition.js.map +1 -0
- package/types.d.ts +59 -0
- package/types.js +7 -0
- package/types.js.map +1 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createIndexesTaskDefinition = void 0;
|
|
7
|
+
var _tasks = require("@webiny/tasks");
|
|
8
|
+
var _CreateIndexesTaskRunner = require("./CreateIndexesTaskRunner");
|
|
9
|
+
const createIndexesTaskDefinition = params => {
|
|
10
|
+
return (0, _tasks.createTaskDefinition)({
|
|
11
|
+
id: "elasticsearchCreateIndexes",
|
|
12
|
+
title: "Create Missing Elasticsearch Indexes",
|
|
13
|
+
/**
|
|
14
|
+
* Maximum number of iterations before the task goes into the error state.
|
|
15
|
+
* No point in having more than 2 runs, as the create index operations should not even take 1 full run, no matter how much indeexs is there to create.
|
|
16
|
+
*/
|
|
17
|
+
maxIterations: 2,
|
|
18
|
+
run: async ({
|
|
19
|
+
response,
|
|
20
|
+
context,
|
|
21
|
+
isCloseToTimeout,
|
|
22
|
+
isAborted,
|
|
23
|
+
store,
|
|
24
|
+
input,
|
|
25
|
+
timer
|
|
26
|
+
}) => {
|
|
27
|
+
const {
|
|
28
|
+
Manager
|
|
29
|
+
} = await import(/* webpackChunkName: "Manager" */"../Manager");
|
|
30
|
+
const {
|
|
31
|
+
IndexManager
|
|
32
|
+
} = await import(/* webpackChunkName: "IndexManager" */"../../settings");
|
|
33
|
+
const manager = new Manager({
|
|
34
|
+
elasticsearchClient: params?.elasticsearchClient,
|
|
35
|
+
documentClient: params?.documentClient,
|
|
36
|
+
response,
|
|
37
|
+
context,
|
|
38
|
+
isAborted,
|
|
39
|
+
isCloseToTimeout,
|
|
40
|
+
store,
|
|
41
|
+
timer
|
|
42
|
+
});
|
|
43
|
+
const indexManager = new IndexManager(manager.elasticsearch, {});
|
|
44
|
+
const createIndexesTaskRunner = new _CreateIndexesTaskRunner.CreateIndexesTaskRunner(manager, indexManager);
|
|
45
|
+
return createIndexesTaskRunner.execute(input.matching, Array.from(input.done || []));
|
|
46
|
+
},
|
|
47
|
+
async onBeforeTrigger({
|
|
48
|
+
context
|
|
49
|
+
}) {
|
|
50
|
+
// Let's create a new index for the tasks first.
|
|
51
|
+
const {
|
|
52
|
+
IndexManager
|
|
53
|
+
} = await import(/* webpackChunkName: "IndexManager" */"../../settings");
|
|
54
|
+
const indexManager = new IndexManager(context.elasticsearch, {});
|
|
55
|
+
const {
|
|
56
|
+
OnBeforeTrigger
|
|
57
|
+
} = await import(/* webpackChunkName: "OnBeforeTrigger" */"./OnBeforeTrigger");
|
|
58
|
+
const onBeforeTrigger = new OnBeforeTrigger({
|
|
59
|
+
indexManager,
|
|
60
|
+
context
|
|
61
|
+
});
|
|
62
|
+
await onBeforeTrigger.run(["webinytask"]);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
exports.createIndexesTaskDefinition = createIndexesTaskDefinition;
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_tasks","require","_CreateIndexesTaskRunner","createIndexesTaskDefinition","params","createTaskDefinition","id","title","maxIterations","run","response","context","isCloseToTimeout","isAborted","store","input","timer","Manager","IndexManager","manager","elasticsearchClient","documentClient","indexManager","elasticsearch","createIndexesTaskRunner","CreateIndexesTaskRunner","execute","matching","Array","from","done","onBeforeTrigger","OnBeforeTrigger","exports"],"sources":["index.ts"],"sourcesContent":["import { createTaskDefinition } from \"@webiny/tasks\";\nimport type { Context, IElasticsearchTaskConfig } from \"~/types\";\nimport type { IElasticsearchCreateIndexesTaskInput } from \"~/tasks/createIndexes/types\";\nimport { CreateIndexesTaskRunner } from \"./CreateIndexesTaskRunner\";\n\nexport const createIndexesTaskDefinition = (params?: IElasticsearchTaskConfig) => {\n return createTaskDefinition<Context, IElasticsearchCreateIndexesTaskInput>({\n id: \"elasticsearchCreateIndexes\",\n title: \"Create Missing Elasticsearch Indexes\",\n /**\n * Maximum number of iterations before the task goes into the error state.\n * No point in having more than 2 runs, as the create index operations should not even take 1 full run, no matter how much indeexs is there to create.\n */\n maxIterations: 2,\n run: async ({ response, context, isCloseToTimeout, isAborted, store, input, timer }) => {\n const { Manager } = await import(\n /* webpackChunkName: \"Manager\" */\n \"../Manager\"\n );\n const { IndexManager } = await import(\n /* webpackChunkName: \"IndexManager\" */ \"~/settings\"\n );\n\n const manager = new Manager<IElasticsearchCreateIndexesTaskInput>({\n elasticsearchClient: params?.elasticsearchClient,\n documentClient: params?.documentClient,\n response,\n context,\n isAborted,\n isCloseToTimeout,\n store,\n timer\n });\n\n const indexManager = new IndexManager(manager.elasticsearch, {});\n\n const createIndexesTaskRunner = new CreateIndexesTaskRunner(manager, indexManager);\n\n return createIndexesTaskRunner.execute(input.matching, Array.from(input.done || []));\n },\n async onBeforeTrigger({ context }) {\n // Let's create a new index for the tasks first.\n const { IndexManager } = await import(\n /* webpackChunkName: \"IndexManager\" */ \"~/settings\"\n );\n const indexManager = new IndexManager(context.elasticsearch, {});\n const { OnBeforeTrigger } = await import(\n /* webpackChunkName: \"OnBeforeTrigger\" */\n \"./OnBeforeTrigger\"\n );\n\n const onBeforeTrigger = new OnBeforeTrigger({\n indexManager,\n context\n });\n await onBeforeTrigger.run([\"webinytask\"]);\n }\n });\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,wBAAA,GAAAD,OAAA;AAEO,MAAME,2BAA2B,GAAIC,MAAiC,IAAK;EAC9E,OAAO,IAAAC,2BAAoB,EAAgD;IACvEC,EAAE,EAAE,4BAA4B;IAChCC,KAAK,EAAE,sCAAsC;IAC7C;AACR;AACA;AACA;IACQC,aAAa,EAAE,CAAC;IAChBC,GAAG,EAAE,MAAAA,CAAO;MAAEC,QAAQ;MAAEC,OAAO;MAAEC,gBAAgB;MAAEC,SAAS;MAAEC,KAAK;MAAEC,KAAK;MAAEC;IAAM,CAAC,KAAK;MACpF,MAAM;QAAEC;MAAQ,CAAC,GAAG,MAAM,MAAM,CAC5B,6CAEJ,CAAC;MACD,MAAM;QAAEC;MAAa,CAAC,GAAG,MAAM,MAAM,CACjC,sDACJ,CAAC;MAED,MAAMC,OAAO,GAAG,IAAIF,OAAO,CAAuC;QAC9DG,mBAAmB,EAAEhB,MAAM,EAAEgB,mBAAmB;QAChDC,cAAc,EAAEjB,MAAM,EAAEiB,cAAc;QACtCX,QAAQ;QACRC,OAAO;QACPE,SAAS;QACTD,gBAAgB;QAChBE,KAAK;QACLE;MACJ,CAAC,CAAC;MAEF,MAAMM,YAAY,GAAG,IAAIJ,YAAY,CAACC,OAAO,CAACI,aAAa,EAAE,CAAC,CAAC,CAAC;MAEhE,MAAMC,uBAAuB,GAAG,IAAIC,gDAAuB,CAACN,OAAO,EAAEG,YAAY,CAAC;MAElF,OAAOE,uBAAuB,CAACE,OAAO,CAACX,KAAK,CAACY,QAAQ,EAAEC,KAAK,CAACC,IAAI,CAACd,KAAK,CAACe,IAAI,IAAI,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,MAAMC,eAAeA,CAAC;MAAEpB;IAAQ,CAAC,EAAE;MAC/B;MACA,MAAM;QAAEO;MAAa,CAAC,GAAG,MAAM,MAAM,CACjC,sDACJ,CAAC;MACD,MAAMI,YAAY,GAAG,IAAIJ,YAAY,CAACP,OAAO,CAACY,aAAa,EAAE,CAAC,CAAC,CAAC;MAChE,MAAM;QAAES;MAAgB,CAAC,GAAG,MAAM,MAAM,CACpC,4DAEJ,CAAC;MAED,MAAMD,eAAe,GAAG,IAAIC,eAAe,CAAC;QACxCV,YAAY;QACZX;MACJ,CAAC,CAAC;MACF,MAAMoB,eAAe,CAACtB,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAC7C;EACJ,CAAC,CAAC;AACN,CAAC;AAACwB,OAAA,CAAA9B,2BAAA,GAAAA,2BAAA","ignoreList":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CreateElasticsearchIndexTaskPlugin } from "./CreateElasticsearchIndexTaskPlugin";
|
|
2
|
+
import type { Context } from "../../types";
|
|
3
|
+
import type { PluginsContainer } from "@webiny/plugins";
|
|
4
|
+
export declare const listCreateElasticsearchIndexTaskPlugin: <C extends Context = Context>(plugins: PluginsContainer) => CreateElasticsearchIndexTaskPlugin<C>[];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.listCreateElasticsearchIndexTaskPlugin = void 0;
|
|
7
|
+
var _CreateElasticsearchIndexTaskPlugin = require("./CreateElasticsearchIndexTaskPlugin");
|
|
8
|
+
const listCreateElasticsearchIndexTaskPlugin = plugins => {
|
|
9
|
+
return plugins.byType(_CreateElasticsearchIndexTaskPlugin.CreateElasticsearchIndexTaskPlugin.type);
|
|
10
|
+
};
|
|
11
|
+
exports.listCreateElasticsearchIndexTaskPlugin = listCreateElasticsearchIndexTaskPlugin;
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=listCreateElasticsearchIndexTaskPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_CreateElasticsearchIndexTaskPlugin","require","listCreateElasticsearchIndexTaskPlugin","plugins","byType","CreateElasticsearchIndexTaskPlugin","type","exports"],"sources":["listCreateElasticsearchIndexTaskPlugin.ts"],"sourcesContent":["import { CreateElasticsearchIndexTaskPlugin } from \"~/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin\";\nimport type { Context } from \"~/types\";\nimport type { PluginsContainer } from \"@webiny/plugins\";\n\nexport const listCreateElasticsearchIndexTaskPlugin = <C extends Context = Context>(\n plugins: PluginsContainer\n): CreateElasticsearchIndexTaskPlugin<C>[] => {\n return plugins.byType<CreateElasticsearchIndexTaskPlugin<Context>>(\n CreateElasticsearchIndexTaskPlugin.type\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,mCAAA,GAAAC,OAAA;AAIO,MAAMC,sCAAsC,GAC/CC,OAAyB,IACiB;EAC1C,OAAOA,OAAO,CAACC,MAAM,CACjBC,sEAAkC,CAACC,IACvC,CAAC;AACL,CAAC;AAACC,OAAA,CAAAL,sCAAA,GAAAA,sCAAA","ignoreList":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CreateElasticsearchIndexTaskPluginIndex } from "./CreateElasticsearchIndexTaskPlugin";
|
|
2
|
+
import type { CreateElasticsearchIndexTaskPlugin } from "./CreateElasticsearchIndexTaskPlugin";
|
|
3
|
+
import type { Context } from "../../types";
|
|
4
|
+
import type { Tenant } from "@webiny/api-tenancy/types";
|
|
5
|
+
import type { I18NLocale } from "@webiny/api-i18n/types";
|
|
6
|
+
export interface IListIndexesParams {
|
|
7
|
+
context: Context;
|
|
8
|
+
plugins: CreateElasticsearchIndexTaskPlugin<Context>[];
|
|
9
|
+
tenants?: Tenant[];
|
|
10
|
+
locales?: I18NLocale[];
|
|
11
|
+
}
|
|
12
|
+
export declare const listIndexes: (params: IListIndexesParams) => Promise<CreateElasticsearchIndexTaskPluginIndex[]>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.listIndexes = void 0;
|
|
7
|
+
const listIndexes = async params => {
|
|
8
|
+
const {
|
|
9
|
+
context,
|
|
10
|
+
plugins,
|
|
11
|
+
tenants: inputTenants,
|
|
12
|
+
locales: inputLocales
|
|
13
|
+
} = params;
|
|
14
|
+
if (plugins.length === 0) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
const indexes = [];
|
|
18
|
+
const tenants = inputTenants || (await context.tenancy.listTenants());
|
|
19
|
+
const initialTenant = context.tenancy.getCurrentTenant();
|
|
20
|
+
try {
|
|
21
|
+
for (const tenant of tenants) {
|
|
22
|
+
context.tenancy.setCurrentTenant(tenant);
|
|
23
|
+
let locales = inputLocales ? [...inputLocales] : [];
|
|
24
|
+
if (locales.length === 0) {
|
|
25
|
+
const [localesResult] = await context.i18n.locales.listLocales({
|
|
26
|
+
limit: 10000
|
|
27
|
+
});
|
|
28
|
+
locales = localesResult;
|
|
29
|
+
}
|
|
30
|
+
for (const locale of locales) {
|
|
31
|
+
for (const plugin of plugins) {
|
|
32
|
+
const results = await plugin.getIndexList({
|
|
33
|
+
context,
|
|
34
|
+
tenant: tenant.id,
|
|
35
|
+
locale: locale.code
|
|
36
|
+
});
|
|
37
|
+
for (const result of results) {
|
|
38
|
+
if (indexes.some(i => i.index === result.index)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
indexes.push(result);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
} finally {
|
|
47
|
+
context.tenancy.setCurrentTenant(initialTenant);
|
|
48
|
+
}
|
|
49
|
+
return indexes;
|
|
50
|
+
};
|
|
51
|
+
exports.listIndexes = listIndexes;
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=listIndexes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["listIndexes","params","context","plugins","tenants","inputTenants","locales","inputLocales","length","indexes","tenancy","listTenants","initialTenant","getCurrentTenant","tenant","setCurrentTenant","localesResult","i18n","listLocales","limit","locale","plugin","results","getIndexList","id","code","result","some","i","index","push","exports"],"sources":["listIndexes.ts"],"sourcesContent":["import type { CreateElasticsearchIndexTaskPluginIndex } from \"~/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin\";\nimport type { CreateElasticsearchIndexTaskPlugin } from \"~/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin\";\nimport type { Context } from \"~/types\";\nimport type { Tenant } from \"@webiny/api-tenancy/types\";\nimport type { I18NLocale } from \"@webiny/api-i18n/types\";\n\nexport interface IListIndexesParams {\n context: Context;\n plugins: CreateElasticsearchIndexTaskPlugin<Context>[];\n tenants?: Tenant[];\n locales?: I18NLocale[];\n}\n\nexport const listIndexes = async (\n params: IListIndexesParams\n): Promise<CreateElasticsearchIndexTaskPluginIndex[]> => {\n const { context, plugins, tenants: inputTenants, locales: inputLocales } = params;\n if (plugins.length === 0) {\n return [];\n }\n\n const indexes: CreateElasticsearchIndexTaskPluginIndex[] = [];\n const tenants = inputTenants || (await context.tenancy.listTenants());\n const initialTenant = context.tenancy.getCurrentTenant();\n try {\n for (const tenant of tenants) {\n context.tenancy.setCurrentTenant(tenant);\n\n let locales = inputLocales ? [...inputLocales] : [];\n if (locales.length === 0) {\n const [localesResult] = await context.i18n.locales.listLocales({\n limit: 10000\n });\n locales = localesResult;\n }\n\n for (const locale of locales) {\n for (const plugin of plugins) {\n const results = await plugin.getIndexList({\n context,\n tenant: tenant.id,\n locale: locale.code\n });\n for (const result of results) {\n if (indexes.some(i => i.index === result.index)) {\n continue;\n }\n indexes.push(result);\n }\n }\n }\n }\n } finally {\n context.tenancy.setCurrentTenant(initialTenant);\n }\n\n return indexes;\n};\n"],"mappings":";;;;;;AAaO,MAAMA,WAAW,GAAG,MACvBC,MAA0B,IAC2B;EACrD,MAAM;IAAEC,OAAO;IAAEC,OAAO;IAAEC,OAAO,EAAEC,YAAY;IAAEC,OAAO,EAAEC;EAAa,CAAC,GAAGN,MAAM;EACjF,IAAIE,OAAO,CAACK,MAAM,KAAK,CAAC,EAAE;IACtB,OAAO,EAAE;EACb;EAEA,MAAMC,OAAkD,GAAG,EAAE;EAC7D,MAAML,OAAO,GAAGC,YAAY,KAAK,MAAMH,OAAO,CAACQ,OAAO,CAACC,WAAW,CAAC,CAAC,CAAC;EACrE,MAAMC,aAAa,GAAGV,OAAO,CAACQ,OAAO,CAACG,gBAAgB,CAAC,CAAC;EACxD,IAAI;IACA,KAAK,MAAMC,MAAM,IAAIV,OAAO,EAAE;MAC1BF,OAAO,CAACQ,OAAO,CAACK,gBAAgB,CAACD,MAAM,CAAC;MAExC,IAAIR,OAAO,GAAGC,YAAY,GAAG,CAAC,GAAGA,YAAY,CAAC,GAAG,EAAE;MACnD,IAAID,OAAO,CAACE,MAAM,KAAK,CAAC,EAAE;QACtB,MAAM,CAACQ,aAAa,CAAC,GAAG,MAAMd,OAAO,CAACe,IAAI,CAACX,OAAO,CAACY,WAAW,CAAC;UAC3DC,KAAK,EAAE;QACX,CAAC,CAAC;QACFb,OAAO,GAAGU,aAAa;MAC3B;MAEA,KAAK,MAAMI,MAAM,IAAId,OAAO,EAAE;QAC1B,KAAK,MAAMe,MAAM,IAAIlB,OAAO,EAAE;UAC1B,MAAMmB,OAAO,GAAG,MAAMD,MAAM,CAACE,YAAY,CAAC;YACtCrB,OAAO;YACPY,MAAM,EAAEA,MAAM,CAACU,EAAE;YACjBJ,MAAM,EAAEA,MAAM,CAACK;UACnB,CAAC,CAAC;UACF,KAAK,MAAMC,MAAM,IAAIJ,OAAO,EAAE;YAC1B,IAAIb,OAAO,CAACkB,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,KAAK,KAAKH,MAAM,CAACG,KAAK,CAAC,EAAE;cAC7C;YACJ;YACApB,OAAO,CAACqB,IAAI,CAACJ,MAAM,CAAC;UACxB;QACJ;MACJ;IACJ;EACJ,CAAC,SAAS;IACNxB,OAAO,CAACQ,OAAO,CAACK,gBAAgB,CAACH,aAAa,CAAC;EACnD;EAEA,OAAOH,OAAO;AAClB,CAAC;AAACsB,OAAA,CAAA/B,WAAA,GAAAA,WAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["export interface IElasticsearchCreateIndexesTaskInput {\n matching?: string;\n done?: string[];\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IDataSynchronizationInput, IDataSynchronizationManager, IFactories } from "./types";
|
|
2
|
+
import type { IIndexManager } from "../../settings/types";
|
|
3
|
+
export interface IDataSynchronizationTaskRunnerParams {
|
|
4
|
+
manager: IDataSynchronizationManager;
|
|
5
|
+
indexManager: IIndexManager;
|
|
6
|
+
factories: IFactories;
|
|
7
|
+
}
|
|
8
|
+
export declare class DataSynchronizationTaskRunner {
|
|
9
|
+
private readonly manager;
|
|
10
|
+
private readonly indexManager;
|
|
11
|
+
private readonly factories;
|
|
12
|
+
constructor(params: IDataSynchronizationTaskRunnerParams);
|
|
13
|
+
run(input: IDataSynchronizationInput): Promise<import("@webiny/tasks").ITaskResponseErrorResult | import("@webiny/tasks").ITaskResponseAbortedResult | import("@webiny/tasks").ITaskResponseDoneResult<import("@webiny/tasks").ITaskResponseDoneResultOutput> | import("@webiny/tasks").ITaskResponseContinueResult<IDataSynchronizationInput>>;
|
|
14
|
+
private validateFlow;
|
|
15
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DataSynchronizationTaskRunner = void 0;
|
|
7
|
+
var _ElasticsearchSynchronize = require("./elasticsearch/ElasticsearchSynchronize");
|
|
8
|
+
var _ElasticsearchFetcher = require("./elasticsearch/ElasticsearchFetcher");
|
|
9
|
+
class DataSynchronizationTaskRunner {
|
|
10
|
+
constructor(params) {
|
|
11
|
+
this.manager = params.manager;
|
|
12
|
+
this.indexManager = params.indexManager;
|
|
13
|
+
this.factories = params.factories;
|
|
14
|
+
}
|
|
15
|
+
async run(input) {
|
|
16
|
+
this.validateFlow(input);
|
|
17
|
+
/**
|
|
18
|
+
* Go through the Elasticsearch and delete records which do not exist in the Elasticsearch table.
|
|
19
|
+
*/
|
|
20
|
+
//
|
|
21
|
+
if (input.flow === "elasticsearchToDynamoDb" && !input.elasticsearchToDynamoDb?.finished) {
|
|
22
|
+
const sync = this.factories.elasticsearchToDynamoDb({
|
|
23
|
+
manager: this.manager,
|
|
24
|
+
indexManager: this.indexManager,
|
|
25
|
+
synchronize: new _ElasticsearchSynchronize.ElasticsearchSynchronize({
|
|
26
|
+
context: this.manager.context,
|
|
27
|
+
timer: this.manager.timer
|
|
28
|
+
}),
|
|
29
|
+
fetcher: new _ElasticsearchFetcher.ElasticsearchFetcher({
|
|
30
|
+
client: this.manager.elasticsearch
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
return await sync.run(input);
|
|
35
|
+
} catch (ex) {
|
|
36
|
+
return this.manager.response.error(ex);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* We are done.
|
|
41
|
+
*/
|
|
42
|
+
return this.manager.response.done();
|
|
43
|
+
}
|
|
44
|
+
validateFlow(input) {
|
|
45
|
+
if (!input.flow) {
|
|
46
|
+
throw new Error(`Missing "flow" in the input.`);
|
|
47
|
+
} else if (this.factories[input.flow]) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`Invalid flow "${input.flow}". Allowed flows: ${Object.keys(this.factories).join(", ")}.`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.DataSynchronizationTaskRunner = DataSynchronizationTaskRunner;
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=DataSynchronizationTaskRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ElasticsearchSynchronize","require","_ElasticsearchFetcher","DataSynchronizationTaskRunner","constructor","params","manager","indexManager","factories","run","input","validateFlow","flow","elasticsearchToDynamoDb","finished","sync","synchronize","ElasticsearchSynchronize","context","timer","fetcher","ElasticsearchFetcher","client","elasticsearch","ex","response","error","done","Error","Object","keys","join","exports"],"sources":["DataSynchronizationTaskRunner.ts"],"sourcesContent":["import type {\n IDataSynchronizationInput,\n IDataSynchronizationManager,\n IFactories\n} from \"~/tasks/dataSynchronization/types\";\nimport type { IIndexManager } from \"~/settings/types\";\nimport { ElasticsearchSynchronize } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize\";\nimport { ElasticsearchFetcher } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher\";\n\nexport interface IDataSynchronizationTaskRunnerParams {\n manager: IDataSynchronizationManager;\n indexManager: IIndexManager;\n factories: IFactories;\n}\n\nexport class DataSynchronizationTaskRunner {\n private readonly manager: IDataSynchronizationManager;\n private readonly indexManager: IIndexManager;\n private readonly factories: IFactories;\n\n public constructor(params: IDataSynchronizationTaskRunnerParams) {\n this.manager = params.manager;\n this.indexManager = params.indexManager;\n this.factories = params.factories;\n }\n\n public async run(input: IDataSynchronizationInput) {\n this.validateFlow(input);\n /**\n * Go through the Elasticsearch and delete records which do not exist in the Elasticsearch table.\n */\n //\n if (input.flow === \"elasticsearchToDynamoDb\" && !input.elasticsearchToDynamoDb?.finished) {\n const sync = this.factories.elasticsearchToDynamoDb({\n manager: this.manager,\n indexManager: this.indexManager,\n synchronize: new ElasticsearchSynchronize({\n context: this.manager.context,\n timer: this.manager.timer\n }),\n fetcher: new ElasticsearchFetcher({\n client: this.manager.elasticsearch\n })\n });\n try {\n return await sync.run(input);\n } catch (ex) {\n return this.manager.response.error(ex);\n }\n }\n /**\n * We are done.\n */\n return this.manager.response.done();\n }\n\n private validateFlow(input: IDataSynchronizationInput): void {\n if (!input.flow) {\n throw new Error(`Missing \"flow\" in the input.`);\n } else if (this.factories[input.flow]) {\n return;\n }\n throw new Error(\n `Invalid flow \"${input.flow}\". Allowed flows: ${Object.keys(this.factories).join(\n \", \"\n )}.`\n );\n }\n}\n"],"mappings":";;;;;;AAMA,IAAAA,yBAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AAQO,MAAME,6BAA6B,CAAC;EAKhCC,WAAWA,CAACC,MAA4C,EAAE;IAC7D,IAAI,CAACC,OAAO,GAAGD,MAAM,CAACC,OAAO;IAC7B,IAAI,CAACC,YAAY,GAAGF,MAAM,CAACE,YAAY;IACvC,IAAI,CAACC,SAAS,GAAGH,MAAM,CAACG,SAAS;EACrC;EAEA,MAAaC,GAAGA,CAACC,KAAgC,EAAE;IAC/C,IAAI,CAACC,YAAY,CAACD,KAAK,CAAC;IACxB;AACR;AACA;IACQ;IACA,IAAIA,KAAK,CAACE,IAAI,KAAK,yBAAyB,IAAI,CAACF,KAAK,CAACG,uBAAuB,EAAEC,QAAQ,EAAE;MACtF,MAAMC,IAAI,GAAG,IAAI,CAACP,SAAS,CAACK,uBAAuB,CAAC;QAChDP,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BS,WAAW,EAAE,IAAIC,kDAAwB,CAAC;UACtCC,OAAO,EAAE,IAAI,CAACZ,OAAO,CAACY,OAAO;UAC7BC,KAAK,EAAE,IAAI,CAACb,OAAO,CAACa;QACxB,CAAC,CAAC;QACFC,OAAO,EAAE,IAAIC,0CAAoB,CAAC;UAC9BC,MAAM,EAAE,IAAI,CAAChB,OAAO,CAACiB;QACzB,CAAC;MACL,CAAC,CAAC;MACF,IAAI;QACA,OAAO,MAAMR,IAAI,CAACN,GAAG,CAACC,KAAK,CAAC;MAChC,CAAC,CAAC,OAAOc,EAAE,EAAE;QACT,OAAO,IAAI,CAAClB,OAAO,CAACmB,QAAQ,CAACC,KAAK,CAACF,EAAE,CAAC;MAC1C;IACJ;IACA;AACR;AACA;IACQ,OAAO,IAAI,CAAClB,OAAO,CAACmB,QAAQ,CAACE,IAAI,CAAC,CAAC;EACvC;EAEQhB,YAAYA,CAACD,KAAgC,EAAQ;IACzD,IAAI,CAACA,KAAK,CAACE,IAAI,EAAE;MACb,MAAM,IAAIgB,KAAK,CAAC,8BAA8B,CAAC;IACnD,CAAC,MAAM,IAAI,IAAI,CAACpB,SAAS,CAACE,KAAK,CAACE,IAAI,CAAC,EAAE;MACnC;IACJ;IACA,MAAM,IAAIgB,KAAK,CACX,iBAAiBlB,KAAK,CAACE,IAAI,qBAAqBiB,MAAM,CAACC,IAAI,CAAC,IAAI,CAACtB,SAAS,CAAC,CAACuB,IAAI,CAC5E,IACJ,CAAC,GACL,CAAC;EACL;AACJ;AAACC,OAAA,CAAA7B,6BAAA,GAAAA,6BAAA","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createFactories = void 0;
|
|
7
|
+
var _ElasticsearchToDynamoDbSynchronization = require("./elasticsearch/ElasticsearchToDynamoDbSynchronization");
|
|
8
|
+
const createFactories = () => {
|
|
9
|
+
return {
|
|
10
|
+
elasticsearchToDynamoDb: params => {
|
|
11
|
+
return new _ElasticsearchToDynamoDbSynchronization.ElasticsearchToDynamoDbSynchronization(params);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
exports.createFactories = createFactories;
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=createFactories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ElasticsearchToDynamoDbSynchronization","require","createFactories","elasticsearchToDynamoDb","params","ElasticsearchToDynamoDbSynchronization","exports"],"sources":["createFactories.ts"],"sourcesContent":["import type { IFactories } from \"./types\";\nimport { ElasticsearchToDynamoDbSynchronization } from \"./elasticsearch/ElasticsearchToDynamoDbSynchronization\";\n\nexport const createFactories = (): IFactories => {\n return {\n elasticsearchToDynamoDb: params => {\n return new ElasticsearchToDynamoDbSynchronization(params);\n }\n };\n};\n"],"mappings":";;;;;;AACA,IAAAA,uCAAA,GAAAC,OAAA;AAEO,MAAMC,eAAe,GAAGA,CAAA,KAAkB;EAC7C,OAAO;IACHC,uBAAuB,EAAEC,MAAM,IAAI;MAC/B,OAAO,IAAIC,8EAAsC,CAACD,MAAM,CAAC;IAC7D;EACJ,CAAC;AACL,CAAC;AAACE,OAAA,CAAAJ,eAAA,GAAAA,eAAA","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Client } from "@webiny/api-elasticsearch";
|
|
2
|
+
import type { IElasticsearchFetcher, IElasticsearchFetcherFetchParams, IElasticsearchFetcherFetchResponse } from "./abstractions/ElasticsearchFetcher";
|
|
3
|
+
export interface IElasticsearchFetcherParams {
|
|
4
|
+
client: Client;
|
|
5
|
+
}
|
|
6
|
+
export declare class ElasticsearchFetcher implements IElasticsearchFetcher {
|
|
7
|
+
private readonly client;
|
|
8
|
+
constructor(params: IElasticsearchFetcherParams);
|
|
9
|
+
fetch({ index, cursor, limit }: IElasticsearchFetcherFetchParams): Promise<IElasticsearchFetcherFetchResponse>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ElasticsearchFetcher = void 0;
|
|
7
|
+
var _shouldIgnoreEsResponseError = require("./shouldIgnoreEsResponseError");
|
|
8
|
+
var _nodeUtil = require("node:util");
|
|
9
|
+
class ElasticsearchFetcher {
|
|
10
|
+
constructor(params) {
|
|
11
|
+
this.client = params.client;
|
|
12
|
+
}
|
|
13
|
+
async fetch({
|
|
14
|
+
index,
|
|
15
|
+
cursor,
|
|
16
|
+
limit
|
|
17
|
+
}) {
|
|
18
|
+
let response;
|
|
19
|
+
try {
|
|
20
|
+
response = await this.client.search({
|
|
21
|
+
index,
|
|
22
|
+
body: {
|
|
23
|
+
query: {
|
|
24
|
+
match_all: {}
|
|
25
|
+
},
|
|
26
|
+
sort: {
|
|
27
|
+
"id.keyword": {
|
|
28
|
+
order: "asc"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
size: limit + 1,
|
|
32
|
+
track_total_hits: true,
|
|
33
|
+
search_after: cursor,
|
|
34
|
+
_source: false
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
} catch (ex) {
|
|
38
|
+
/**
|
|
39
|
+
* If we ignore the error, we can continue with the next index.
|
|
40
|
+
*/
|
|
41
|
+
if ((0, _shouldIgnoreEsResponseError.shouldIgnoreEsResponseError)(ex)) {
|
|
42
|
+
if (process.env.DEBUG === "true") {
|
|
43
|
+
console.error((0, _nodeUtil.inspect)(ex, {
|
|
44
|
+
depth: 5,
|
|
45
|
+
showHidden: true
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
done: true,
|
|
50
|
+
totalCount: 0,
|
|
51
|
+
items: []
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
console.error("Failed to fetch data from Elasticsearch.", ex);
|
|
55
|
+
throw ex;
|
|
56
|
+
}
|
|
57
|
+
const {
|
|
58
|
+
hits,
|
|
59
|
+
total
|
|
60
|
+
} = response.body.hits;
|
|
61
|
+
if (hits.length === 0) {
|
|
62
|
+
return {
|
|
63
|
+
done: true,
|
|
64
|
+
cursor: undefined,
|
|
65
|
+
totalCount: total.value,
|
|
66
|
+
items: []
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const hasMoreItems = hits.length > limit;
|
|
70
|
+
let nextCursor;
|
|
71
|
+
if (hasMoreItems) {
|
|
72
|
+
hits.pop();
|
|
73
|
+
nextCursor = hits.at(-1)?.sort;
|
|
74
|
+
}
|
|
75
|
+
const items = hits.reduce((collection, hit) => {
|
|
76
|
+
const [PK, SK] = hit._id.split(":");
|
|
77
|
+
if (!PK || !SK) {
|
|
78
|
+
return collection;
|
|
79
|
+
}
|
|
80
|
+
collection.push({
|
|
81
|
+
PK,
|
|
82
|
+
SK,
|
|
83
|
+
_id: hit._id,
|
|
84
|
+
index: hit._index
|
|
85
|
+
});
|
|
86
|
+
return collection;
|
|
87
|
+
}, []);
|
|
88
|
+
return {
|
|
89
|
+
totalCount: total.value,
|
|
90
|
+
cursor: nextCursor,
|
|
91
|
+
done: !nextCursor,
|
|
92
|
+
items
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.ElasticsearchFetcher = ElasticsearchFetcher;
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=ElasticsearchFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_shouldIgnoreEsResponseError","require","_nodeUtil","ElasticsearchFetcher","constructor","params","client","fetch","index","cursor","limit","response","search","body","query","match_all","sort","order","size","track_total_hits","search_after","_source","ex","shouldIgnoreEsResponseError","process","env","DEBUG","console","error","inspect","depth","showHidden","done","totalCount","items","hits","total","length","undefined","value","hasMoreItems","nextCursor","pop","at","reduce","collection","hit","PK","SK","_id","split","push","_index","exports"],"sources":["ElasticsearchFetcher.ts"],"sourcesContent":["import type { Client } from \"@webiny/api-elasticsearch\";\nimport type {\n IElasticsearchFetcher,\n IElasticsearchFetcherFetchParams,\n IElasticsearchFetcherFetchResponse,\n IElasticsearchFetcherFetchResponseItem\n} from \"./abstractions/ElasticsearchFetcher\";\nimport type { ElasticsearchSearchResponse, PrimitiveValue } from \"@webiny/api-elasticsearch/types\";\nimport { shouldIgnoreEsResponseError } from \"./shouldIgnoreEsResponseError\";\nimport { inspect } from \"node:util\";\n\nexport interface IElasticsearchFetcherParams {\n client: Client;\n}\n\nexport class ElasticsearchFetcher implements IElasticsearchFetcher {\n private readonly client: Client;\n\n public constructor(params: IElasticsearchFetcherParams) {\n this.client = params.client;\n }\n public async fetch({\n index,\n cursor,\n limit\n }: IElasticsearchFetcherFetchParams): Promise<IElasticsearchFetcherFetchResponse> {\n let response: ElasticsearchSearchResponse<undefined>;\n try {\n response = await this.client.search({\n index,\n body: {\n query: {\n match_all: {}\n },\n sort: {\n \"id.keyword\": {\n order: \"asc\"\n }\n },\n size: limit + 1,\n track_total_hits: true,\n search_after: cursor,\n _source: false\n }\n });\n } catch (ex) {\n /**\n * If we ignore the error, we can continue with the next index.\n */\n if (shouldIgnoreEsResponseError(ex)) {\n if (process.env.DEBUG === \"true\") {\n console.error(\n inspect(ex, {\n depth: 5,\n showHidden: true\n })\n );\n }\n return {\n done: true,\n totalCount: 0,\n items: []\n };\n }\n console.error(\"Failed to fetch data from Elasticsearch.\", ex);\n throw ex;\n }\n\n const { hits, total } = response.body.hits;\n if (hits.length === 0) {\n return {\n done: true,\n cursor: undefined,\n totalCount: total.value,\n items: []\n };\n }\n\n const hasMoreItems = hits.length > limit;\n let nextCursor: PrimitiveValue[] | undefined;\n if (hasMoreItems) {\n hits.pop();\n nextCursor = hits.at(-1)?.sort;\n }\n const items = hits.reduce<IElasticsearchFetcherFetchResponseItem[]>((collection, hit) => {\n const [PK, SK] = hit._id.split(\":\");\n if (!PK || !SK) {\n return collection;\n }\n collection.push({\n PK,\n SK,\n _id: hit._id,\n index: hit._index\n });\n\n return collection;\n }, []);\n\n return {\n totalCount: total.value,\n cursor: nextCursor,\n done: !nextCursor,\n items\n };\n }\n}\n"],"mappings":";;;;;;AAQA,IAAAA,4BAAA,GAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AAMO,MAAME,oBAAoB,CAAkC;EAGxDC,WAAWA,CAACC,MAAmC,EAAE;IACpD,IAAI,CAACC,MAAM,GAAGD,MAAM,CAACC,MAAM;EAC/B;EACA,MAAaC,KAAKA,CAAC;IACfC,KAAK;IACLC,MAAM;IACNC;EAC8B,CAAC,EAA+C;IAC9E,IAAIC,QAAgD;IACpD,IAAI;MACAA,QAAQ,GAAG,MAAM,IAAI,CAACL,MAAM,CAACM,MAAM,CAAC;QAChCJ,KAAK;QACLK,IAAI,EAAE;UACFC,KAAK,EAAE;YACHC,SAAS,EAAE,CAAC;UAChB,CAAC;UACDC,IAAI,EAAE;YACF,YAAY,EAAE;cACVC,KAAK,EAAE;YACX;UACJ,CAAC;UACDC,IAAI,EAAER,KAAK,GAAG,CAAC;UACfS,gBAAgB,EAAE,IAAI;UACtBC,YAAY,EAAEX,MAAM;UACpBY,OAAO,EAAE;QACb;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOC,EAAE,EAAE;MACT;AACZ;AACA;MACY,IAAI,IAAAC,wDAA2B,EAACD,EAAE,CAAC,EAAE;QACjC,IAAIE,OAAO,CAACC,GAAG,CAACC,KAAK,KAAK,MAAM,EAAE;UAC9BC,OAAO,CAACC,KAAK,CACT,IAAAC,iBAAO,EAACP,EAAE,EAAE;YACRQ,KAAK,EAAE,CAAC;YACRC,UAAU,EAAE;UAChB,CAAC,CACL,CAAC;QACL;QACA,OAAO;UACHC,IAAI,EAAE,IAAI;UACVC,UAAU,EAAE,CAAC;UACbC,KAAK,EAAE;QACX,CAAC;MACL;MACAP,OAAO,CAACC,KAAK,CAAC,0CAA0C,EAAEN,EAAE,CAAC;MAC7D,MAAMA,EAAE;IACZ;IAEA,MAAM;MAAEa,IAAI;MAAEC;IAAM,CAAC,GAAGzB,QAAQ,CAACE,IAAI,CAACsB,IAAI;IAC1C,IAAIA,IAAI,CAACE,MAAM,KAAK,CAAC,EAAE;MACnB,OAAO;QACHL,IAAI,EAAE,IAAI;QACVvB,MAAM,EAAE6B,SAAS;QACjBL,UAAU,EAAEG,KAAK,CAACG,KAAK;QACvBL,KAAK,EAAE;MACX,CAAC;IACL;IAEA,MAAMM,YAAY,GAAGL,IAAI,CAACE,MAAM,GAAG3B,KAAK;IACxC,IAAI+B,UAAwC;IAC5C,IAAID,YAAY,EAAE;MACdL,IAAI,CAACO,GAAG,CAAC,CAAC;MACVD,UAAU,GAAGN,IAAI,CAACQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE3B,IAAI;IAClC;IACA,MAAMkB,KAAK,GAAGC,IAAI,CAACS,MAAM,CAA2C,CAACC,UAAU,EAAEC,GAAG,KAAK;MACrF,MAAM,CAACC,EAAE,EAAEC,EAAE,CAAC,GAAGF,GAAG,CAACG,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC;MACnC,IAAI,CAACH,EAAE,IAAI,CAACC,EAAE,EAAE;QACZ,OAAOH,UAAU;MACrB;MACAA,UAAU,CAACM,IAAI,CAAC;QACZJ,EAAE;QACFC,EAAE;QACFC,GAAG,EAAEH,GAAG,CAACG,GAAG;QACZzC,KAAK,EAAEsC,GAAG,CAACM;MACf,CAAC,CAAC;MAEF,OAAOP,UAAU;IACrB,CAAC,EAAE,EAAE,CAAC;IAEN,OAAO;MACHZ,UAAU,EAAEG,KAAK,CAACG,KAAK;MACvB9B,MAAM,EAAEgC,UAAU;MAClBT,IAAI,EAAE,CAACS,UAAU;MACjBP;IACJ,CAAC;EACL;AACJ;AAACmB,OAAA,CAAAlD,oBAAA,GAAAA,oBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ITimer } from "@webiny/handler-aws";
|
|
2
|
+
import type { Context } from "../../../types";
|
|
3
|
+
import type { IElasticsearchSynchronize, IElasticsearchSynchronizeExecuteParams, IElasticsearchSynchronizeExecuteResponse } from "./abstractions/ElasticsearchSynchronize";
|
|
4
|
+
export interface IElasticsearchSynchronizeParams {
|
|
5
|
+
timer: ITimer;
|
|
6
|
+
context: Context;
|
|
7
|
+
}
|
|
8
|
+
export declare class ElasticsearchSynchronize implements IElasticsearchSynchronize {
|
|
9
|
+
private readonly timer;
|
|
10
|
+
private readonly context;
|
|
11
|
+
constructor(params: IElasticsearchSynchronizeParams);
|
|
12
|
+
execute(params: IElasticsearchSynchronizeExecuteParams): Promise<IElasticsearchSynchronizeExecuteResponse>;
|
|
13
|
+
private getEntity;
|
|
14
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ElasticsearchSynchronize = void 0;
|
|
7
|
+
var _dbDynamodb = require("@webiny/db-dynamodb");
|
|
8
|
+
var _apiDynamodbToElasticsearch = require("@webiny/api-dynamodb-to-elasticsearch");
|
|
9
|
+
var _entities = require("../entities");
|
|
10
|
+
class ElasticsearchSynchronize {
|
|
11
|
+
constructor(params) {
|
|
12
|
+
this.timer = params.timer;
|
|
13
|
+
this.context = params.context;
|
|
14
|
+
}
|
|
15
|
+
async execute(params) {
|
|
16
|
+
const {
|
|
17
|
+
items,
|
|
18
|
+
done,
|
|
19
|
+
index
|
|
20
|
+
} = params;
|
|
21
|
+
if (items.length === 0) {
|
|
22
|
+
return {
|
|
23
|
+
done: true
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const table = (0, _entities.getTable)({
|
|
27
|
+
type: "es",
|
|
28
|
+
context: this.context
|
|
29
|
+
});
|
|
30
|
+
const readableItems = items.map(item => {
|
|
31
|
+
const entity = this.getEntity(item);
|
|
32
|
+
return entity.item.getBatch({
|
|
33
|
+
PK: item.PK,
|
|
34
|
+
SK: item.SK
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
const tableItems = await (0, _dbDynamodb.batchReadAll)({
|
|
38
|
+
items: readableItems,
|
|
39
|
+
table
|
|
40
|
+
});
|
|
41
|
+
const elasticsearchSyncBuilder = (0, _apiDynamodbToElasticsearch.createSynchronizationBuilder)({
|
|
42
|
+
timer: this.timer,
|
|
43
|
+
context: this.context
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* We need to find the items we have in the Elasticsearch but not in the DynamoDB-Elasticsearch table.
|
|
47
|
+
*/
|
|
48
|
+
for (const item of items) {
|
|
49
|
+
const exists = tableItems.some(ddbItem => {
|
|
50
|
+
return ddbItem.PK === item.PK && ddbItem.SK === item.SK;
|
|
51
|
+
});
|
|
52
|
+
if (exists) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
elasticsearchSyncBuilder.delete({
|
|
56
|
+
index,
|
|
57
|
+
id: item._id
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const executeWithRetry = elasticsearchSyncBuilder.build();
|
|
61
|
+
await executeWithRetry();
|
|
62
|
+
return {
|
|
63
|
+
done
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
getEntity(params) {
|
|
67
|
+
const type = (0, _entities.getElasticsearchEntityType)(params);
|
|
68
|
+
return (0, _entities.getElasticsearchEntity)({
|
|
69
|
+
type,
|
|
70
|
+
context: this.context
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.ElasticsearchSynchronize = ElasticsearchSynchronize;
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=ElasticsearchSynchronize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_dbDynamodb","require","_apiDynamodbToElasticsearch","_entities","ElasticsearchSynchronize","constructor","params","timer","context","execute","items","done","index","length","table","getTable","type","readableItems","map","item","entity","getEntity","getBatch","PK","SK","tableItems","batchReadAll","elasticsearchSyncBuilder","createSynchronizationBuilder","exists","some","ddbItem","delete","id","_id","executeWithRetry","build","getElasticsearchEntityType","getElasticsearchEntity","exports"],"sources":["ElasticsearchSynchronize.ts"],"sourcesContent":["import { batchReadAll } from \"@webiny/db-dynamodb\";\nimport { createSynchronizationBuilder } from \"@webiny/api-dynamodb-to-elasticsearch\";\nimport type { IGetElasticsearchEntityTypeParams } from \"~/tasks/dataSynchronization/entities\";\nimport {\n getElasticsearchEntity,\n getElasticsearchEntityType,\n getTable\n} from \"~/tasks/dataSynchronization/entities\";\nimport type { ITimer } from \"@webiny/handler-aws\";\nimport type { Context } from \"~/types\";\nimport type {\n IElasticsearchSynchronize,\n IElasticsearchSynchronizeExecuteParams,\n IElasticsearchSynchronizeExecuteResponse\n} from \"./abstractions/ElasticsearchSynchronize\";\n\nexport interface IElasticsearchSynchronizeParams {\n timer: ITimer;\n context: Context;\n}\n\ninterface IDynamoDbItem {\n PK: string;\n SK: string;\n}\n\nexport class ElasticsearchSynchronize implements IElasticsearchSynchronize {\n private readonly timer: ITimer;\n private readonly context: Context;\n\n public constructor(params: IElasticsearchSynchronizeParams) {\n this.timer = params.timer;\n this.context = params.context;\n }\n\n public async execute(\n params: IElasticsearchSynchronizeExecuteParams\n ): Promise<IElasticsearchSynchronizeExecuteResponse> {\n const { items, done, index } = params;\n if (items.length === 0) {\n return {\n done: true\n };\n }\n\n const table = getTable({\n type: \"es\",\n context: this.context\n });\n\n const readableItems = items.map(item => {\n const entity = this.getEntity(item);\n return entity.item.getBatch({\n PK: item.PK,\n SK: item.SK\n });\n });\n\n const tableItems = await batchReadAll<IDynamoDbItem>({\n items: readableItems,\n table\n });\n\n const elasticsearchSyncBuilder = createSynchronizationBuilder({\n timer: this.timer,\n context: this.context\n });\n /**\n * We need to find the items we have in the Elasticsearch but not in the DynamoDB-Elasticsearch table.\n */\n for (const item of items) {\n const exists = tableItems.some(ddbItem => {\n return ddbItem.PK === item.PK && ddbItem.SK === item.SK;\n });\n if (exists) {\n continue;\n }\n elasticsearchSyncBuilder.delete({\n index,\n id: item._id\n });\n }\n\n const executeWithRetry = elasticsearchSyncBuilder.build();\n await executeWithRetry();\n\n return {\n done\n };\n }\n\n private getEntity(\n params: IGetElasticsearchEntityTypeParams\n ): ReturnType<typeof getElasticsearchEntity> {\n const type = getElasticsearchEntityType(params);\n return getElasticsearchEntity({\n type,\n context: this.context\n });\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,2BAAA,GAAAD,OAAA;AAEA,IAAAE,SAAA,GAAAF,OAAA;AAuBO,MAAMG,wBAAwB,CAAsC;EAIhEC,WAAWA,CAACC,MAAuC,EAAE;IACxD,IAAI,CAACC,KAAK,GAAGD,MAAM,CAACC,KAAK;IACzB,IAAI,CAACC,OAAO,GAAGF,MAAM,CAACE,OAAO;EACjC;EAEA,MAAaC,OAAOA,CAChBH,MAA8C,EACG;IACjD,MAAM;MAAEI,KAAK;MAAEC,IAAI;MAAEC;IAAM,CAAC,GAAGN,MAAM;IACrC,IAAII,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;MACpB,OAAO;QACHF,IAAI,EAAE;MACV,CAAC;IACL;IAEA,MAAMG,KAAK,GAAG,IAAAC,kBAAQ,EAAC;MACnBC,IAAI,EAAE,IAAI;MACVR,OAAO,EAAE,IAAI,CAACA;IAClB,CAAC,CAAC;IAEF,MAAMS,aAAa,GAAGP,KAAK,CAACQ,GAAG,CAACC,IAAI,IAAI;MACpC,MAAMC,MAAM,GAAG,IAAI,CAACC,SAAS,CAACF,IAAI,CAAC;MACnC,OAAOC,MAAM,CAACD,IAAI,CAACG,QAAQ,CAAC;QACxBC,EAAE,EAAEJ,IAAI,CAACI,EAAE;QACXC,EAAE,EAAEL,IAAI,CAACK;MACb,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,MAAMC,UAAU,GAAG,MAAM,IAAAC,wBAAY,EAAgB;MACjDhB,KAAK,EAAEO,aAAa;MACpBH;IACJ,CAAC,CAAC;IAEF,MAAMa,wBAAwB,GAAG,IAAAC,wDAA4B,EAAC;MAC1DrB,KAAK,EAAE,IAAI,CAACA,KAAK;MACjBC,OAAO,EAAE,IAAI,CAACA;IAClB,CAAC,CAAC;IACF;AACR;AACA;IACQ,KAAK,MAAMW,IAAI,IAAIT,KAAK,EAAE;MACtB,MAAMmB,MAAM,GAAGJ,UAAU,CAACK,IAAI,CAACC,OAAO,IAAI;QACtC,OAAOA,OAAO,CAACR,EAAE,KAAKJ,IAAI,CAACI,EAAE,IAAIQ,OAAO,CAACP,EAAE,KAAKL,IAAI,CAACK,EAAE;MAC3D,CAAC,CAAC;MACF,IAAIK,MAAM,EAAE;QACR;MACJ;MACAF,wBAAwB,CAACK,MAAM,CAAC;QAC5BpB,KAAK;QACLqB,EAAE,EAAEd,IAAI,CAACe;MACb,CAAC,CAAC;IACN;IAEA,MAAMC,gBAAgB,GAAGR,wBAAwB,CAACS,KAAK,CAAC,CAAC;IACzD,MAAMD,gBAAgB,CAAC,CAAC;IAExB,OAAO;MACHxB;IACJ,CAAC;EACL;EAEQU,SAASA,CACbf,MAAyC,EACA;IACzC,MAAMU,IAAI,GAAG,IAAAqB,oCAA0B,EAAC/B,MAAM,CAAC;IAC/C,OAAO,IAAAgC,gCAAsB,EAAC;MAC1BtB,IAAI;MACJR,OAAO,EAAE,IAAI,CAACA;IAClB,CAAC,CAAC;EACN;AACJ;AAAC+B,OAAA,CAAAnC,wBAAA,GAAAA,wBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IDataSynchronizationInput, IElasticsearchSyncParams, ISynchronization, ISynchronizationRunResult } from "../types";
|
|
2
|
+
export declare class ElasticsearchToDynamoDbSynchronization implements ISynchronization {
|
|
3
|
+
private readonly manager;
|
|
4
|
+
private readonly indexManager;
|
|
5
|
+
private readonly synchronize;
|
|
6
|
+
private readonly fetcher;
|
|
7
|
+
constructor(params: IElasticsearchSyncParams);
|
|
8
|
+
run(input: IDataSynchronizationInput): Promise<ISynchronizationRunResult>;
|
|
9
|
+
private fetchAllIndexes;
|
|
10
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ElasticsearchToDynamoDbSynchronization = void 0;
|
|
7
|
+
class ElasticsearchToDynamoDbSynchronization {
|
|
8
|
+
constructor(params) {
|
|
9
|
+
this.manager = params.manager;
|
|
10
|
+
this.indexManager = params.indexManager;
|
|
11
|
+
this.synchronize = params.synchronize;
|
|
12
|
+
this.fetcher = params.fetcher;
|
|
13
|
+
}
|
|
14
|
+
async run(input) {
|
|
15
|
+
const lastIndex = input.elasticsearchToDynamoDb?.index;
|
|
16
|
+
let cursor = input.elasticsearchToDynamoDb?.cursor;
|
|
17
|
+
const indexes = await this.fetchAllIndexes();
|
|
18
|
+
let next = 0;
|
|
19
|
+
if (lastIndex) {
|
|
20
|
+
next = indexes.findIndex(index => index === lastIndex);
|
|
21
|
+
}
|
|
22
|
+
let currentIndex = indexes[next];
|
|
23
|
+
while (currentIndex) {
|
|
24
|
+
if (this.manager.isAborted()) {
|
|
25
|
+
return this.manager.response.aborted();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* We will put 180 seconds because we are writing to the Elasticsearch/OpenSearch directly.
|
|
29
|
+
* We want to leave enough time for possible retries.
|
|
30
|
+
*/
|
|
31
|
+
//
|
|
32
|
+
else if (this.manager.isCloseToTimeout(180)) {
|
|
33
|
+
return this.manager.response.continue({
|
|
34
|
+
...input,
|
|
35
|
+
elasticsearchToDynamoDb: {
|
|
36
|
+
...input.elasticsearchToDynamoDb,
|
|
37
|
+
index: currentIndex,
|
|
38
|
+
cursor
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const result = await this.fetcher.fetch({
|
|
43
|
+
index: currentIndex,
|
|
44
|
+
cursor,
|
|
45
|
+
limit: 100
|
|
46
|
+
});
|
|
47
|
+
const syncResult = await this.synchronize.execute({
|
|
48
|
+
done: result.done,
|
|
49
|
+
index: currentIndex,
|
|
50
|
+
items: result.items
|
|
51
|
+
});
|
|
52
|
+
if (!syncResult.done && result.cursor) {
|
|
53
|
+
cursor = result.cursor;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
cursor = undefined;
|
|
57
|
+
const next = indexes.findIndex(index => index === currentIndex) + 1;
|
|
58
|
+
currentIndex = indexes[next];
|
|
59
|
+
}
|
|
60
|
+
return this.manager.response.continue({
|
|
61
|
+
...input,
|
|
62
|
+
elasticsearchToDynamoDb: {
|
|
63
|
+
finished: true
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async fetchAllIndexes() {
|
|
68
|
+
const result = await this.indexManager.list();
|
|
69
|
+
if (result.length > 0) {
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
throw new Error("No Elasticsearch / OpenSearch indexes found.");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.ElasticsearchToDynamoDbSynchronization = ElasticsearchToDynamoDbSynchronization;
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=ElasticsearchToDynamoDbSynchronization.js.map
|