@webiny/api-elasticsearch-tasks 6.0.0-beta.0 → 6.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -9
- package/abstractions/DbRegistry.d.ts +11 -0
- package/abstractions/DbRegistry.js +4 -0
- package/abstractions/DbRegistry.js.map +1 -0
- package/abstractions/OpensearchTenantIndexFactory.d.ts +14 -0
- package/abstractions/OpensearchTenantIndexFactory.js +4 -0
- package/abstractions/OpensearchTenantIndexFactory.js.map +1 -0
- package/abstractions/SynchronizationContext.d.ts +6 -0
- package/abstractions/SynchronizationContext.js +4 -0
- package/abstractions/SynchronizationContext.js.map +1 -0
- package/errors/IndexSettingsGetError.d.ts +1 -1
- package/errors/IndexSettingsGetError.js +2 -10
- package/errors/IndexSettingsGetError.js.map +1 -1
- package/errors/IndexSettingsSetError.d.ts +1 -1
- package/errors/IndexSettingsSetError.js +2 -10
- package/errors/IndexSettingsSetError.js.map +1 -1
- package/errors/IndexingDisableError.js +1 -8
- package/errors/IndexingDisableError.js.map +1 -1
- package/errors/IndexingEnableError.js +1 -8
- package/errors/IndexingEnableError.js.map +1 -1
- package/errors/index.d.ts +4 -4
- package/errors/index.js +4 -49
- package/errors/index.js.map +1 -1
- package/helpers/getClients.d.ts +5 -0
- package/helpers/getClients.js +14 -0
- package/helpers/getClients.js.map +1 -0
- package/helpers/scan.d.ts +5 -5
- package/helpers/scan.js +5 -12
- package/helpers/scan.js.map +1 -1
- package/index.d.ts +5 -5
- package/index.js +14 -25
- package/index.js.map +1 -1
- package/package.json +33 -34
- package/settings/DisableIndexing.d.ts +2 -2
- package/settings/DisableIndexing.js +3 -10
- package/settings/DisableIndexing.js.map +1 -1
- package/settings/EnableIndexing.d.ts +2 -2
- package/settings/EnableIndexing.js +5 -11
- package/settings/EnableIndexing.js.map +1 -1
- package/settings/IndexManager.d.ts +6 -3
- package/settings/IndexManager.js +21 -17
- package/settings/IndexManager.js.map +1 -1
- package/settings/IndexSettingsManager.d.ts +2 -2
- package/settings/IndexSettingsManager.js +4 -11
- package/settings/IndexSettingsManager.js.map +1 -1
- package/settings/index.d.ts +1 -1
- package/settings/index.js +1 -16
- package/settings/index.js.map +1 -1
- package/settings/types.d.ts +1 -1
- package/settings/types.js +1 -5
- package/settings/types.js.map +1 -1
- package/tasks/Manager.d.ts +17 -26
- package/tasks/Manager.js +10 -36
- package/tasks/Manager.js.map +1 -1
- package/tasks/createIndexes/CreateIndexesTask.d.ts +23 -0
- package/tasks/createIndexes/CreateIndexesTask.js +53 -0
- package/tasks/createIndexes/CreateIndexesTask.js.map +1 -0
- package/tasks/createIndexes/CreateIndexesTaskRunner.d.ts +14 -7
- package/tasks/createIndexes/CreateIndexesTaskRunner.js +23 -38
- package/tasks/createIndexes/CreateIndexesTaskRunner.js.map +1 -1
- package/tasks/createIndexes/OnBeforeTrigger.d.ts +10 -0
- package/tasks/createIndexes/OnBeforeTrigger.js +51 -0
- package/tasks/createIndexes/OnBeforeTrigger.js.map +1 -0
- package/tasks/createIndexes/createIndex.d.ts +5 -0
- package/tasks/createIndexes/createIndex.js +20 -0
- package/tasks/createIndexes/createIndex.js.map +1 -0
- package/tasks/createIndexes/index.d.ts +2 -3
- package/tasks/createIndexes/index.js +17 -44
- package/tasks/createIndexes/index.js.map +1 -1
- package/tasks/createIndexes/listIndexes.d.ts +4 -0
- package/tasks/createIndexes/listIndexes.js +20 -0
- package/tasks/createIndexes/listIndexes.js.map +1 -0
- package/tasks/createIndexes/types.js +1 -5
- package/tasks/dataSynchronization/DataSynchronizationTask.d.ts +34 -0
- package/tasks/dataSynchronization/DataSynchronizationTask.js +69 -0
- package/tasks/dataSynchronization/DataSynchronizationTask.js.map +1 -0
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.d.ts +18 -0
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.js +45 -0
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.js.map +1 -0
- package/tasks/dataSynchronization/createFactories.d.ts +2 -0
- package/tasks/dataSynchronization/createFactories.js +10 -0
- package/tasks/dataSynchronization/createFactories.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.d.ts +10 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js +91 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js.map +1 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.d.ts +12 -0
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js +70 -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 +70 -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 +3 -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 +3 -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 +6 -0
- package/tasks/dataSynchronization/elasticsearch/shouldIgnoreEsResponseError.js.map +1 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.d.ts +10 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.js +24 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.js.map +1 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.d.ts +8 -0
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.js +12 -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 +22 -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 +5 -0
- package/tasks/dataSynchronization/entities/index.js.map +1 -0
- package/tasks/dataSynchronization/index.d.ts +3 -0
- package/tasks/dataSynchronization/index.js +28 -0
- package/tasks/dataSynchronization/index.js.map +1 -0
- package/tasks/dataSynchronization/types.d.ts +39 -0
- package/tasks/dataSynchronization/types.js +3 -0
- package/tasks/dataSynchronization/types.js.map +1 -0
- package/tasks/enableIndexing/EnableIndexingTaskRunner.d.ts +6 -6
- package/tasks/enableIndexing/EnableIndexingTaskRunner.js +5 -13
- package/tasks/enableIndexing/EnableIndexingTaskRunner.js.map +1 -1
- package/tasks/enableIndexing/index.d.ts +2 -3
- package/tasks/enableIndexing/index.js +40 -44
- package/tasks/enableIndexing/index.js.map +1 -1
- package/tasks/enableIndexing/types.js +1 -5
- package/tasks/index.d.ts +4 -3
- package/tasks/index.js +4 -38
- package/tasks/index.js.map +1 -1
- package/tasks/reindexing/ReindexingTaskRunner.d.ts +5 -6
- package/tasks/reindexing/ReindexingTaskRunner.js +23 -27
- package/tasks/reindexing/ReindexingTaskRunner.js.map +1 -1
- package/tasks/reindexing/index.d.ts +1 -1
- package/tasks/reindexing/index.js +1 -16
- package/tasks/reindexing/index.js.map +1 -1
- package/tasks/reindexing/reindexingTaskDefinition.d.ts +2 -2
- package/tasks/reindexing/reindexingTaskDefinition.js +43 -42
- package/tasks/reindexing/reindexingTaskDefinition.js.map +1 -1
- package/types.d.ts +22 -22
- package/types.js +1 -5
- package/types.js.map +1 -1
- package/definitions/entry.d.ts +0 -7
- package/definitions/entry.js +0 -36
- package/definitions/entry.js.map +0 -1
- package/definitions/index.d.ts +0 -2
- package/definitions/index.js +0 -29
- package/definitions/index.js.map +0 -1
- package/definitions/table.d.ts +0 -7
- package/definitions/table.js +0 -23
- package/definitions/table.js.map +0 -1
- package/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin.d.ts +0 -23
- package/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin.js +0 -25
- package/tasks/createIndexes/CreateElasticsearchIndexTaskPlugin.js.map +0 -1
|
@@ -1,37 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class CreateIndexesTaskRunner {
|
|
9
|
-
constructor(manager, indexManager) {
|
|
10
|
-
this.manager = manager;
|
|
1
|
+
import { listIndexes } from "./listIndexes.js";
|
|
2
|
+
import { createIndexFactory } from "./createIndex.js";
|
|
3
|
+
export class CreateIndexesTaskRunner {
|
|
4
|
+
constructor(tenantContext, listTenantsUseCase, indexFactories, manager, indexManager) {
|
|
5
|
+
this.tenantContext = tenantContext;
|
|
6
|
+
this.listTenantsUseCase = listTenantsUseCase;
|
|
7
|
+
this.indexFactories = indexFactories;
|
|
11
8
|
this.indexManager = indexManager;
|
|
9
|
+
this.taskController = manager.controller;
|
|
12
10
|
}
|
|
13
11
|
async execute(matching, done) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return this.manager.response.done("No index plugins found.");
|
|
17
|
-
}
|
|
18
|
-
const indexes = [];
|
|
19
|
-
const tenants = await this.manager.context.tenancy.listTenants();
|
|
20
|
-
for (const tenant of tenants) {
|
|
21
|
-
const locales = await this.manager.context.i18n.getLocales();
|
|
22
|
-
for (const locale of locales) {
|
|
23
|
-
for (const plugin of plugins) {
|
|
24
|
-
const results = await plugin.getIndexList({
|
|
25
|
-
context: this.manager.context,
|
|
26
|
-
tenant: tenant.id,
|
|
27
|
-
locale: locale.code
|
|
28
|
-
});
|
|
29
|
-
indexes.push(...results);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
12
|
+
if (this.indexFactories.length === 0) {
|
|
13
|
+
return this.taskController.response.done("No index plugins found.");
|
|
32
14
|
}
|
|
15
|
+
const tenantsResult = await this.listTenantsUseCase.execute();
|
|
16
|
+
const tenants = tenantsResult.value;
|
|
17
|
+
const indexes = await listIndexes(this.tenantContext, tenants, this.indexFactories);
|
|
33
18
|
if (indexes.length === 0) {
|
|
34
|
-
return this.
|
|
19
|
+
return this.taskController.response.done("No indexes found.");
|
|
35
20
|
}
|
|
36
21
|
const isIndexAllowed = index => {
|
|
37
22
|
if (typeof matching !== "string" || !matching) {
|
|
@@ -39,14 +24,15 @@ class CreateIndexesTaskRunner {
|
|
|
39
24
|
}
|
|
40
25
|
return index.includes(matching);
|
|
41
26
|
};
|
|
27
|
+
const createIndex = createIndexFactory(this.indexManager);
|
|
42
28
|
for (const {
|
|
43
29
|
index,
|
|
44
30
|
settings
|
|
45
31
|
} of indexes) {
|
|
46
|
-
if (this.
|
|
47
|
-
return this.
|
|
48
|
-
} else if (this.
|
|
49
|
-
return this.
|
|
32
|
+
if (this.taskController.runtime.isAborted()) {
|
|
33
|
+
return this.taskController.response.aborted();
|
|
34
|
+
} else if (this.taskController.runtime.isCloseToTimeout()) {
|
|
35
|
+
return this.taskController.response.continue({
|
|
50
36
|
done
|
|
51
37
|
});
|
|
52
38
|
}
|
|
@@ -61,25 +47,24 @@ class CreateIndexesTaskRunner {
|
|
|
61
47
|
continue;
|
|
62
48
|
}
|
|
63
49
|
done.push(index);
|
|
64
|
-
await
|
|
65
|
-
await this.
|
|
50
|
+
await createIndex.create(index, settings);
|
|
51
|
+
await this.taskController.logger.info({
|
|
66
52
|
message: `Index "${index}" created.`,
|
|
67
53
|
data: {
|
|
68
54
|
index
|
|
69
55
|
}
|
|
70
56
|
});
|
|
71
57
|
} catch (ex) {
|
|
72
|
-
await this.
|
|
58
|
+
await this.taskController.logger.error({
|
|
73
59
|
message: `Failed to create index "${index}".`,
|
|
74
60
|
error: ex
|
|
75
61
|
});
|
|
76
62
|
}
|
|
77
63
|
}
|
|
78
|
-
return this.
|
|
64
|
+
return this.taskController.response.done("Indexes created.", {
|
|
79
65
|
done
|
|
80
66
|
});
|
|
81
67
|
}
|
|
82
68
|
}
|
|
83
|
-
exports.CreateIndexesTaskRunner = CreateIndexesTaskRunner;
|
|
84
69
|
|
|
85
70
|
//# sourceMappingURL=CreateIndexesTaskRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["listIndexes","createIndexFactory","CreateIndexesTaskRunner","constructor","tenantContext","listTenantsUseCase","indexFactories","manager","indexManager","taskController","controller","execute","matching","done","length","response","tenantsResult","tenants","value","indexes","isIndexAllowed","index","includes","createIndex","settings","runtime","isAborted","aborted","isCloseToTimeout","continue","exists","indexExists","push","create","logger","info","message","data","ex","error"],"sources":["CreateIndexesTaskRunner.ts"],"sourcesContent":["import type { Manager } from \"~/tasks/Manager.js\";\nimport type { IndexManager } from \"~/settings/index.js\";\nimport type { IElasticsearchCreateIndexesTaskInput } from \"./types.js\";\nimport { listIndexes } from \"./listIndexes.js\";\nimport { createIndexFactory } from \"./createIndex.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { OpensearchTenantIndexFactory } from \"~/abstractions/OpensearchTenantIndexFactory.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/index.js\";\n\nexport class CreateIndexesTaskRunner {\n private taskController: TaskController.Interface;\n\n public constructor(\n private tenantContext: TenantContext.Interface,\n private listTenantsUseCase: ListTenantsUseCase.Interface,\n private indexFactories: OpensearchTenantIndexFactory.Interface[],\n manager: Manager<IElasticsearchCreateIndexesTaskInput>,\n private indexManager: IndexManager\n ) {\n this.taskController = manager.controller;\n }\n\n public async execute(\n matching: string | undefined,\n done: string[]\n ): Promise<TaskDefinition.Result> {\n if (this.indexFactories.length === 0) {\n return this.taskController.response.done(\"No index plugins found.\");\n }\n\n const tenantsResult = await this.listTenantsUseCase.execute();\n const tenants = tenantsResult.value;\n\n const indexes = await listIndexes(this.tenantContext, tenants, this.indexFactories);\n\n if (indexes.length === 0) {\n return this.taskController.response.done(\"No indexes found.\");\n }\n\n const isIndexAllowed = (index: string): boolean => {\n if (typeof matching !== \"string\" || !matching) {\n return true;\n }\n return index.includes(matching);\n };\n\n const createIndex = createIndexFactory(this.indexManager);\n\n for (const { index, settings } of indexes) {\n if (this.taskController.runtime.isAborted()) {\n return this.taskController.response.aborted();\n } else if (this.taskController.runtime.isCloseToTimeout()) {\n return this.taskController.response.continue({\n done\n });\n }\n try {\n if (done.includes(index)) {\n continue;\n } else if (isIndexAllowed(index) === false) {\n continue;\n }\n const exists = await this.indexManager.indexExists(index);\n if (exists) {\n continue;\n }\n done.push(index);\n await createIndex.create(index, settings);\n await this.taskController.logger.info({\n message: `Index \"${index}\" created.`,\n data: { index }\n });\n } catch (ex) {\n await this.taskController.logger.error({\n message: `Failed to create index \"${index}\".`,\n error: ex\n });\n }\n }\n\n return this.taskController.response.done(\"Indexes created.\", {\n done\n });\n }\n}\n"],"mappings":"AAGA,SAASA,WAAW;AACpB,SAASC,kBAAkB;AAO3B,OAAO,MAAMC,uBAAuB,CAAC;EAG1BC,WAAWA,CACNC,aAAsC,EACtCC,kBAAgD,EAChDC,cAAwD,EAChEC,OAAsD,EAC9CC,YAA0B,EACpC;IAAA,KALUJ,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,kBAAgD,GAAhDA,kBAAgD;IAAA,KAChDC,cAAwD,GAAxDA,cAAwD;IAAA,KAExDE,YAA0B,GAA1BA,YAA0B;IAElC,IAAI,CAACC,cAAc,GAAGF,OAAO,CAACG,UAAU;EAC5C;EAEA,MAAaC,OAAOA,CAChBC,QAA4B,EAC5BC,IAAc,EACgB;IAC9B,IAAI,IAAI,CAACP,cAAc,CAACQ,MAAM,KAAK,CAAC,EAAE;MAClC,OAAO,IAAI,CAACL,cAAc,CAACM,QAAQ,CAACF,IAAI,CAAC,yBAAyB,CAAC;IACvE;IAEA,MAAMG,aAAa,GAAG,MAAM,IAAI,CAACX,kBAAkB,CAACM,OAAO,CAAC,CAAC;IAC7D,MAAMM,OAAO,GAAGD,aAAa,CAACE,KAAK;IAEnC,MAAMC,OAAO,GAAG,MAAMnB,WAAW,CAAC,IAAI,CAACI,aAAa,EAAEa,OAAO,EAAE,IAAI,CAACX,cAAc,CAAC;IAEnF,IAAIa,OAAO,CAACL,MAAM,KAAK,CAAC,EAAE;MACtB,OAAO,IAAI,CAACL,cAAc,CAACM,QAAQ,CAACF,IAAI,CAAC,mBAAmB,CAAC;IACjE;IAEA,MAAMO,cAAc,GAAIC,KAAa,IAAc;MAC/C,IAAI,OAAOT,QAAQ,KAAK,QAAQ,IAAI,CAACA,QAAQ,EAAE;QAC3C,OAAO,IAAI;MACf;MACA,OAAOS,KAAK,CAACC,QAAQ,CAACV,QAAQ,CAAC;IACnC,CAAC;IAED,MAAMW,WAAW,GAAGtB,kBAAkB,CAAC,IAAI,CAACO,YAAY,CAAC;IAEzD,KAAK,MAAM;MAAEa,KAAK;MAAEG;IAAS,CAAC,IAAIL,OAAO,EAAE;MACvC,IAAI,IAAI,CAACV,cAAc,CAACgB,OAAO,CAACC,SAAS,CAAC,CAAC,EAAE;QACzC,OAAO,IAAI,CAACjB,cAAc,CAACM,QAAQ,CAACY,OAAO,CAAC,CAAC;MACjD,CAAC,MAAM,IAAI,IAAI,CAAClB,cAAc,CAACgB,OAAO,CAACG,gBAAgB,CAAC,CAAC,EAAE;QACvD,OAAO,IAAI,CAACnB,cAAc,CAACM,QAAQ,CAACc,QAAQ,CAAC;UACzChB;QACJ,CAAC,CAAC;MACN;MACA,IAAI;QACA,IAAIA,IAAI,CAACS,QAAQ,CAACD,KAAK,CAAC,EAAE;UACtB;QACJ,CAAC,MAAM,IAAID,cAAc,CAACC,KAAK,CAAC,KAAK,KAAK,EAAE;UACxC;QACJ;QACA,MAAMS,MAAM,GAAG,MAAM,IAAI,CAACtB,YAAY,CAACuB,WAAW,CAACV,KAAK,CAAC;QACzD,IAAIS,MAAM,EAAE;UACR;QACJ;QACAjB,IAAI,CAACmB,IAAI,CAACX,KAAK,CAAC;QAChB,MAAME,WAAW,CAACU,MAAM,CAACZ,KAAK,EAAEG,QAAQ,CAAC;QACzC,MAAM,IAAI,CAACf,cAAc,CAACyB,MAAM,CAACC,IAAI,CAAC;UAClCC,OAAO,EAAE,UAAUf,KAAK,YAAY;UACpCgB,IAAI,EAAE;YAAEhB;UAAM;QAClB,CAAC,CAAC;MACN,CAAC,CAAC,OAAOiB,EAAE,EAAE;QACT,MAAM,IAAI,CAAC7B,cAAc,CAACyB,MAAM,CAACK,KAAK,CAAC;UACnCH,OAAO,EAAE,2BAA2Bf,KAAK,IAAI;UAC7CkB,KAAK,EAAED;QACX,CAAC,CAAC;MACN;IACJ;IAEA,OAAO,IAAI,CAAC7B,cAAc,CAACM,QAAQ,CAACF,IAAI,CAAC,kBAAkB,EAAE;MACzDA;IACJ,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IndexManager } from "../../settings/index.js";
|
|
2
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
3
|
+
import { OpensearchTenantIndexFactory } from "../../abstractions/OpensearchTenantIndexFactory.js";
|
|
4
|
+
export declare class OnBeforeTrigger {
|
|
5
|
+
private indexManager;
|
|
6
|
+
private tenantContext;
|
|
7
|
+
private indexFactories;
|
|
8
|
+
constructor(indexManager: IndexManager, tenantContext: TenantContext.Interface, indexFactories: OpensearchTenantIndexFactory.Interface[]);
|
|
9
|
+
run(targets: string[] | undefined): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { listIndexes } from "./listIndexes.js";
|
|
2
|
+
import { createIndexFactory } from "./createIndex.js";
|
|
3
|
+
export class OnBeforeTrigger {
|
|
4
|
+
constructor(indexManager, tenantContext, indexFactories) {
|
|
5
|
+
this.indexManager = indexManager;
|
|
6
|
+
this.tenantContext = tenantContext;
|
|
7
|
+
this.indexFactories = indexFactories;
|
|
8
|
+
}
|
|
9
|
+
async run(targets) {
|
|
10
|
+
const tenant = this.tenantContext.getTenant();
|
|
11
|
+
if (!tenant) {
|
|
12
|
+
throw new Error("Something went wrong, tenant not found when triggering a task.");
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const allIndexes = await listIndexes(this.tenantContext, [tenant], this.indexFactories);
|
|
16
|
+
const indexes = allIndexes.filter(index => {
|
|
17
|
+
if (!targets?.length) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
for (const t of targets) {
|
|
21
|
+
if (index.index.includes(t)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
});
|
|
27
|
+
if (indexes.length === 0) {
|
|
28
|
+
console.warn("There are no indexes to create before triggering the Create indexes task.", {
|
|
29
|
+
targets
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const createIndex = createIndexFactory(this.indexManager);
|
|
34
|
+
for (const {
|
|
35
|
+
index,
|
|
36
|
+
settings
|
|
37
|
+
} of indexes) {
|
|
38
|
+
try {
|
|
39
|
+
console.log("Creating index", index);
|
|
40
|
+
await createIndex.createIfNotExists(index, settings);
|
|
41
|
+
} catch (ex) {
|
|
42
|
+
console.error(`Failed to create index "${index}".`, ex);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
} catch (ex) {
|
|
46
|
+
console.error(ex);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=OnBeforeTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["listIndexes","createIndexFactory","OnBeforeTrigger","constructor","indexManager","tenantContext","indexFactories","run","targets","tenant","getTenant","Error","allIndexes","indexes","filter","index","length","t","includes","console","warn","createIndex","settings","log","createIfNotExists","ex","error"],"sources":["OnBeforeTrigger.ts"],"sourcesContent":["import type { IndexManager } from \"~/settings/index.js\";\nimport { listIndexes } from \"./listIndexes.js\";\nimport { createIndexFactory } from \"~/tasks/createIndexes/createIndex.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { OpensearchTenantIndexFactory } from \"~/abstractions/OpensearchTenantIndexFactory.js\";\n\nexport class OnBeforeTrigger {\n public constructor(\n private indexManager: IndexManager,\n private tenantContext: TenantContext.Interface,\n private indexFactories: OpensearchTenantIndexFactory.Interface[]\n ) {}\n\n public async run(targets: string[] | undefined): Promise<void> {\n const tenant = this.tenantContext.getTenant();\n if (!tenant) {\n throw new Error(\"Something went wrong, tenant not found when triggering a task.\");\n }\n\n try {\n const allIndexes = await listIndexes(this.tenantContext, [tenant], this.indexFactories);\n\n const indexes = allIndexes.filter(index => {\n if (!targets?.length) {\n return true;\n }\n for (const t of targets) {\n if (index.index.includes(t)) {\n return true;\n }\n }\n return false;\n });\n if (indexes.length === 0) {\n console.warn(\n \"There are no indexes to create before triggering the Create indexes task.\",\n {\n targets\n }\n );\n return;\n }\n\n const createIndex = createIndexFactory(this.indexManager);\n\n for (const { index, settings } of indexes) {\n try {\n console.log(\"Creating index\", index);\n await createIndex.createIfNotExists(index, settings);\n } catch (ex) {\n console.error(`Failed to create index \"${index}\".`, ex);\n }\n }\n } catch (ex) {\n console.error(ex);\n }\n }\n}\n"],"mappings":"AACA,SAASA,WAAW;AACpB,SAASC,kBAAkB;AAI3B,OAAO,MAAMC,eAAe,CAAC;EAClBC,WAAWA,CACNC,YAA0B,EAC1BC,aAAsC,EACtCC,cAAwD,EAClE;IAAA,KAHUF,YAA0B,GAA1BA,YAA0B;IAAA,KAC1BC,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,cAAwD,GAAxDA,cAAwD;EACjE;EAEH,MAAaC,GAAGA,CAACC,OAA6B,EAAiB;IAC3D,MAAMC,MAAM,GAAG,IAAI,CAACJ,aAAa,CAACK,SAAS,CAAC,CAAC;IAC7C,IAAI,CAACD,MAAM,EAAE;MACT,MAAM,IAAIE,KAAK,CAAC,gEAAgE,CAAC;IACrF;IAEA,IAAI;MACA,MAAMC,UAAU,GAAG,MAAMZ,WAAW,CAAC,IAAI,CAACK,aAAa,EAAE,CAACI,MAAM,CAAC,EAAE,IAAI,CAACH,cAAc,CAAC;MAEvF,MAAMO,OAAO,GAAGD,UAAU,CAACE,MAAM,CAACC,KAAK,IAAI;QACvC,IAAI,CAACP,OAAO,EAAEQ,MAAM,EAAE;UAClB,OAAO,IAAI;QACf;QACA,KAAK,MAAMC,CAAC,IAAIT,OAAO,EAAE;UACrB,IAAIO,KAAK,CAACA,KAAK,CAACG,QAAQ,CAACD,CAAC,CAAC,EAAE;YACzB,OAAO,IAAI;UACf;QACJ;QACA,OAAO,KAAK;MAChB,CAAC,CAAC;MACF,IAAIJ,OAAO,CAACG,MAAM,KAAK,CAAC,EAAE;QACtBG,OAAO,CAACC,IAAI,CACR,2EAA2E,EAC3E;UACIZ;QACJ,CACJ,CAAC;QACD;MACJ;MAEA,MAAMa,WAAW,GAAGpB,kBAAkB,CAAC,IAAI,CAACG,YAAY,CAAC;MAEzD,KAAK,MAAM;QAAEW,KAAK;QAAEO;MAAS,CAAC,IAAIT,OAAO,EAAE;QACvC,IAAI;UACAM,OAAO,CAACI,GAAG,CAAC,gBAAgB,EAAER,KAAK,CAAC;UACpC,MAAMM,WAAW,CAACG,iBAAiB,CAACT,KAAK,EAAEO,QAAQ,CAAC;QACxD,CAAC,CAAC,OAAOG,EAAE,EAAE;UACTN,OAAO,CAACO,KAAK,CAAC,2BAA2BX,KAAK,IAAI,EAAEU,EAAE,CAAC;QAC3D;MACJ;IACJ,CAAC,CAAC,OAAOA,EAAE,EAAE;MACTN,OAAO,CAACO,KAAK,CAACD,EAAE,CAAC;IACrB;EACJ;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IndexManager } from "../../settings/index.js";
|
|
2
|
+
export declare const createIndexFactory: (manager: IndexManager) => {
|
|
3
|
+
create: (index: string, settings?: Record<string, any>) => Promise<void>;
|
|
4
|
+
createIfNotExists: (index: string, settings?: Record<string, any>) => Promise<void>;
|
|
5
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const createIndexFactory = manager => {
|
|
2
|
+
return {
|
|
3
|
+
create: async (index, settings) => {
|
|
4
|
+
return manager.createIndex(index, settings);
|
|
5
|
+
},
|
|
6
|
+
createIfNotExists: async (index, settings) => {
|
|
7
|
+
try {
|
|
8
|
+
const exists = await manager.indexExists(index);
|
|
9
|
+
if (exists) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
} catch {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
return await manager.createIndex(index, settings);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=createIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createIndexFactory","manager","create","index","settings","createIndex","createIfNotExists","exists","indexExists"],"sources":["createIndex.ts"],"sourcesContent":["import type { IndexManager } from \"~/settings/index.js\";\n\nexport const createIndexFactory = (manager: IndexManager) => {\n return {\n create: async (index: string, settings?: Record<string, any>): Promise<void> => {\n return manager.createIndex(index, settings);\n },\n createIfNotExists: async (index: string, settings?: Record<string, any>): Promise<void> => {\n try {\n const exists = await manager.indexExists(index);\n if (exists) {\n return;\n }\n } catch {\n return;\n }\n\n return await manager.createIndex(index, settings);\n }\n };\n};\n"],"mappings":"AAEA,OAAO,MAAMA,kBAAkB,GAAIC,OAAqB,IAAK;EACzD,OAAO;IACHC,MAAM,EAAE,MAAAA,CAAOC,KAAa,EAAEC,QAA8B,KAAoB;MAC5E,OAAOH,OAAO,CAACI,WAAW,CAACF,KAAK,EAAEC,QAAQ,CAAC;IAC/C,CAAC;IACDE,iBAAiB,EAAE,MAAAA,CAAOH,KAAa,EAAEC,QAA8B,KAAoB;MACvF,IAAI;QACA,MAAMG,MAAM,GAAG,MAAMN,OAAO,CAACO,WAAW,CAACL,KAAK,CAAC;QAC/C,IAAII,MAAM,EAAE;UACR;QACJ;MACJ,CAAC,CAAC,MAAM;QACJ;MACJ;MAEA,OAAO,MAAMN,OAAO,CAACI,WAAW,CAACF,KAAK,EAAEC,QAAQ,CAAC;IACrD;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import { Context, IElasticsearchTaskConfig } from "../../types";
|
|
2
|
-
|
|
3
|
-
export declare const createIndexesTaskDefinition: (params?: IElasticsearchTaskConfig) => import("@webiny/tasks").TaskDefinitionPlugin<Context, IElasticsearchCreateIndexesTaskInput, import("@webiny/tasks").ITaskResponseDoneResultOutput>;
|
|
1
|
+
import type { Context, IElasticsearchTaskConfig } from "../../types.js";
|
|
2
|
+
export declare const createIndexesTaskDefinition: (params?: Partial<IElasticsearchTaskConfig>) => import("@webiny/api").ContextPlugin<Context>;
|
|
@@ -1,49 +1,22 @@
|
|
|
1
|
-
|
|
1
|
+
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
|
+
import { createContextPlugin } from "@webiny/api";
|
|
3
|
+
import { getClients } from "../../helpers/getClients.js";
|
|
4
|
+
import { CreateIndexesTaskDefinition } from "./CreateIndexesTask.js";
|
|
5
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
6
|
+
import { ListTenantsUseCase } from "@webiny/api-core/features/tenancy/ListTenants/index.js";
|
|
7
|
+
import { OpensearchTenantIndexFactory } from "../../abstractions/OpensearchTenantIndexFactory.js";
|
|
8
|
+
export const createIndexesTaskDefinition = params => {
|
|
9
|
+
return createContextPlugin(async context => {
|
|
10
|
+
const clients = getClients(context, params);
|
|
2
11
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
}) => {
|
|
26
|
-
const {
|
|
27
|
-
Manager
|
|
28
|
-
} = await import( /* webpackChunkName: "ElasticsearchTaskManager" */"../Manager");
|
|
29
|
-
const {
|
|
30
|
-
IndexManager
|
|
31
|
-
} = await import( /* webpackChunkName: "ElasticsearchTaskSettings" */"../../settings");
|
|
32
|
-
const manager = new Manager({
|
|
33
|
-
elasticsearchClient: params?.elasticsearchClient,
|
|
34
|
-
documentClient: params?.documentClient,
|
|
35
|
-
response,
|
|
36
|
-
context,
|
|
37
|
-
isAborted,
|
|
38
|
-
isCloseToTimeout,
|
|
39
|
-
store
|
|
40
|
-
});
|
|
41
|
-
const indexManager = new IndexManager(manager.elasticsearch, {});
|
|
42
|
-
const createIndexesTaskRunner = new _CreateIndexesTaskRunner.CreateIndexesTaskRunner(manager, indexManager);
|
|
43
|
-
return createIndexesTaskRunner.execute(input.matching, Array.from(input.done || []));
|
|
44
|
-
}
|
|
12
|
+
// Register the task definition
|
|
13
|
+
context.container.registerFactory(TaskDefinition, () => {
|
|
14
|
+
const tenantContext = context.container.resolve(TenantContext);
|
|
15
|
+
const listTenantsUseCase = context.container.resolve(ListTenantsUseCase);
|
|
16
|
+
const indexFactories = context.container.resolveAll(OpensearchTenantIndexFactory);
|
|
17
|
+
return new CreateIndexesTaskDefinition(clients.elasticsearchClient, clients.documentClient, tenantContext, listTenantsUseCase, indexFactories);
|
|
18
|
+
});
|
|
45
19
|
});
|
|
46
20
|
};
|
|
47
|
-
exports.createIndexesTaskDefinition = createIndexesTaskDefinition;
|
|
48
21
|
|
|
49
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["TaskDefinition","createContextPlugin","getClients","CreateIndexesTaskDefinition","TenantContext","ListTenantsUseCase","OpensearchTenantIndexFactory","createIndexesTaskDefinition","params","context","clients","container","registerFactory","tenantContext","resolve","listTenantsUseCase","indexFactories","resolveAll","elasticsearchClient","documentClient"],"sources":["index.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { Context, IElasticsearchTaskConfig } from \"~/types.js\";\nimport { createContextPlugin } from \"@webiny/api\";\nimport { getClients } from \"~/helpers/getClients.js\";\nimport { CreateIndexesTaskDefinition } from \"~/tasks/createIndexes/CreateIndexesTask.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { OpensearchTenantIndexFactory } from \"~/abstractions/OpensearchTenantIndexFactory.js\";\n\nexport const createIndexesTaskDefinition = (params?: Partial<IElasticsearchTaskConfig>) => {\n return createContextPlugin<Context>(async context => {\n const clients = getClients(context, params);\n\n // Register the task definition\n context.container.registerFactory(TaskDefinition, () => {\n const tenantContext = context.container.resolve(TenantContext);\n const listTenantsUseCase = context.container.resolve(ListTenantsUseCase);\n const indexFactories = context.container.resolveAll(OpensearchTenantIndexFactory);\n\n return new CreateIndexesTaskDefinition(\n clients.elasticsearchClient,\n clients.documentClient,\n tenantContext,\n listTenantsUseCase,\n indexFactories\n );\n });\n });\n};\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,wDAAwD;AAEvF,SAASC,mBAAmB,QAAQ,aAAa;AACjD,SAASC,UAAU;AACnB,SAASC,2BAA2B;AACpC,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASC,kBAAkB,QAAQ,wDAAwD;AAC3F,SAASC,4BAA4B;AAErC,OAAO,MAAMC,2BAA2B,GAAIC,MAA0C,IAAK;EACvF,OAAOP,mBAAmB,CAAU,MAAMQ,OAAO,IAAI;IACjD,MAAMC,OAAO,GAAGR,UAAU,CAACO,OAAO,EAAED,MAAM,CAAC;;IAE3C;IACAC,OAAO,CAACE,SAAS,CAACC,eAAe,CAACZ,cAAc,EAAE,MAAM;MACpD,MAAMa,aAAa,GAAGJ,OAAO,CAACE,SAAS,CAACG,OAAO,CAACV,aAAa,CAAC;MAC9D,MAAMW,kBAAkB,GAAGN,OAAO,CAACE,SAAS,CAACG,OAAO,CAACT,kBAAkB,CAAC;MACxE,MAAMW,cAAc,GAAGP,OAAO,CAACE,SAAS,CAACM,UAAU,CAACX,4BAA4B,CAAC;MAEjF,OAAO,IAAIH,2BAA2B,CAClCO,OAAO,CAACQ,mBAAmB,EAC3BR,OAAO,CAACS,cAAc,EACtBN,aAAa,EACbE,kBAAkB,EAClBC,cACJ,CAAC;IACL,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { OpensearchTenantIndexFactory } from "../../abstractions/OpensearchTenantIndexFactory.js";
|
|
2
|
+
import type { Tenant } from "@webiny/api-core/types/tenancy.js";
|
|
3
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
4
|
+
export declare const listIndexes: (tenantContext: TenantContext.Interface, tenants: Tenant[], indexFactories: OpensearchTenantIndexFactory.Interface[]) => Promise<OpensearchTenantIndexFactory.IndexConfig[]>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const listIndexes = async (tenantContext, tenants, indexFactories) => {
|
|
2
|
+
if (indexFactories.length === 0) {
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
const indexes = [];
|
|
6
|
+
await tenantContext.withEachTenant(tenants, async tenant => {
|
|
7
|
+
for (const factory of indexFactories) {
|
|
8
|
+
const results = await factory.getIndexList(tenant);
|
|
9
|
+
for (const result of results) {
|
|
10
|
+
if (indexes.some(i => i.index === result.index)) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
indexes.push(result);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return indexes;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=listIndexes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["listIndexes","tenantContext","tenants","indexFactories","length","indexes","withEachTenant","tenant","factory","results","getIndexList","result","some","i","index","push"],"sources":["listIndexes.ts"],"sourcesContent":["import { OpensearchTenantIndexFactory } from \"~/abstractions/OpensearchTenantIndexFactory.js\";\nimport type { Tenant } from \"@webiny/api-core/types/tenancy.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nexport const listIndexes = async (\n tenantContext: TenantContext.Interface,\n tenants: Tenant[],\n indexFactories: OpensearchTenantIndexFactory.Interface[]\n): Promise<OpensearchTenantIndexFactory.IndexConfig[]> => {\n if (indexFactories.length === 0) {\n return [];\n }\n\n const indexes: OpensearchTenantIndexFactory.IndexConfig[] = [];\n await tenantContext.withEachTenant(tenants, async tenant => {\n for (const factory of indexFactories) {\n const results = await factory.getIndexList(tenant);\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 return indexes;\n};\n"],"mappings":"AAIA,OAAO,MAAMA,WAAW,GAAG,MAAAA,CACvBC,aAAsC,EACtCC,OAAiB,EACjBC,cAAwD,KACF;EACtD,IAAIA,cAAc,CAACC,MAAM,KAAK,CAAC,EAAE;IAC7B,OAAO,EAAE;EACb;EAEA,MAAMC,OAAmD,GAAG,EAAE;EAC9D,MAAMJ,aAAa,CAACK,cAAc,CAACJ,OAAO,EAAE,MAAMK,MAAM,IAAI;IACxD,KAAK,MAAMC,OAAO,IAAIL,cAAc,EAAE;MAClC,MAAMM,OAAO,GAAG,MAAMD,OAAO,CAACE,YAAY,CAACH,MAAM,CAAC;MAClD,KAAK,MAAMI,MAAM,IAAIF,OAAO,EAAE;QAC1B,IAAIJ,OAAO,CAACO,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,KAAK,KAAKH,MAAM,CAACG,KAAK,CAAC,EAAE;UAC7C;QACJ;QACAT,OAAO,CAACU,IAAI,CAACJ,MAAM,CAAC;MACxB;IACJ;EACJ,CAAC,CAAC;EAEF,OAAON,OAAO;AAClB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
|
+
import type { IElasticsearchTaskConfig } from "../../types.js";
|
|
3
|
+
import type { IDataSynchronizationInput, IDataSynchronizationOutput } from "../../tasks/dataSynchronization/types.js";
|
|
4
|
+
import { ElasticsearchSynchronize } from "../../tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js";
|
|
5
|
+
export declare const DATA_SYNCHRONIZATION_TASK = "dataSynchronization";
|
|
6
|
+
export declare class DataSynchronizationTask implements TaskDefinition.Interface<IDataSynchronizationInput, IDataSynchronizationOutput> {
|
|
7
|
+
private elasticsearchClient;
|
|
8
|
+
private documentClient;
|
|
9
|
+
private elasticsearchSynchronize;
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
description: string;
|
|
13
|
+
isPrivate: boolean;
|
|
14
|
+
maxIterations: number;
|
|
15
|
+
databaseLogs: boolean;
|
|
16
|
+
constructor(elasticsearchClient: IElasticsearchTaskConfig["elasticsearchClient"], documentClient: IElasticsearchTaskConfig["documentClient"], elasticsearchSynchronize: ElasticsearchSynchronize);
|
|
17
|
+
run({ input, controller }: TaskDefinition.RunParams<IDataSynchronizationInput, IDataSynchronizationOutput>): Promise<import("~/tasks/dataSynchronization/types.js").ISynchronizationRunResult>;
|
|
18
|
+
createInputValidation({ validator }: TaskDefinition.CreateInputValidationParams): {
|
|
19
|
+
flow: import("zod").ZodEnum<["elasticsearchToDynamoDb"]>;
|
|
20
|
+
elasticsearchToDynamoDb: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodObject<{
|
|
21
|
+
finished: import("zod").ZodDefault<import("zod").ZodOptional<import("zod").ZodBoolean>>;
|
|
22
|
+
index: import("zod").ZodOptional<import("zod").ZodString>;
|
|
23
|
+
cursor: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
|
|
24
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
25
|
+
finished: boolean;
|
|
26
|
+
index?: string | undefined;
|
|
27
|
+
cursor?: string[] | undefined;
|
|
28
|
+
}, {
|
|
29
|
+
index?: string | undefined;
|
|
30
|
+
cursor?: string[] | undefined;
|
|
31
|
+
finished?: boolean | undefined;
|
|
32
|
+
}>>>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export const DATA_SYNCHRONIZATION_TASK = "dataSynchronization";
|
|
2
|
+
export class DataSynchronizationTask {
|
|
3
|
+
id = DATA_SYNCHRONIZATION_TASK;
|
|
4
|
+
title = "Data Synchronization";
|
|
5
|
+
description = "Synchronize data between Elasticsearch and DynamoDB";
|
|
6
|
+
isPrivate = false;
|
|
7
|
+
maxIterations = 100;
|
|
8
|
+
databaseLogs = false;
|
|
9
|
+
constructor(elasticsearchClient, documentClient, elasticsearchSynchronize) {
|
|
10
|
+
this.elasticsearchClient = elasticsearchClient;
|
|
11
|
+
this.documentClient = documentClient;
|
|
12
|
+
this.elasticsearchSynchronize = elasticsearchSynchronize;
|
|
13
|
+
}
|
|
14
|
+
async run({
|
|
15
|
+
input,
|
|
16
|
+
controller
|
|
17
|
+
}) {
|
|
18
|
+
if (controller.runtime.isAborted()) {
|
|
19
|
+
return controller.response.aborted();
|
|
20
|
+
}
|
|
21
|
+
const {
|
|
22
|
+
Manager
|
|
23
|
+
} = await import(/* webpackChunkName: "Manager" */"../Manager.js");
|
|
24
|
+
const {
|
|
25
|
+
IndexManager
|
|
26
|
+
} = await import(/* webpackChunkName: "IndexManager" */"../../settings/index.js");
|
|
27
|
+
const manager = new Manager({
|
|
28
|
+
elasticsearchClient: this.elasticsearchClient,
|
|
29
|
+
documentClient: this.documentClient,
|
|
30
|
+
controller
|
|
31
|
+
});
|
|
32
|
+
const indexManager = new IndexManager(manager.elasticsearch, {});
|
|
33
|
+
const {
|
|
34
|
+
DataSynchronizationTaskRunner
|
|
35
|
+
} = await import(/* webpackChunkName: "DataSynchronizationTaskRunner" */"./DataSynchronizationTaskRunner.js");
|
|
36
|
+
const {
|
|
37
|
+
createFactories
|
|
38
|
+
} = await import(/* webpackChunkName: "createFactories" */"./createFactories.js");
|
|
39
|
+
try {
|
|
40
|
+
const dataSynchronization = new DataSynchronizationTaskRunner({
|
|
41
|
+
manager,
|
|
42
|
+
indexManager,
|
|
43
|
+
factories: createFactories(),
|
|
44
|
+
elasticsearchSynchronize: this.elasticsearchSynchronize
|
|
45
|
+
});
|
|
46
|
+
return await dataSynchronization.run({
|
|
47
|
+
...input
|
|
48
|
+
});
|
|
49
|
+
} catch (ex) {
|
|
50
|
+
return controller.response.error(ex);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
createInputValidation({
|
|
54
|
+
validator
|
|
55
|
+
}) {
|
|
56
|
+
return {
|
|
57
|
+
flow: validator.enum(["elasticsearchToDynamoDb"]),
|
|
58
|
+
elasticsearchToDynamoDb: validator.object({
|
|
59
|
+
finished: validator.boolean().optional().default(false),
|
|
60
|
+
index: validator.string().optional(),
|
|
61
|
+
cursor: validator.array(validator.string()).optional()
|
|
62
|
+
}).optional().default({
|
|
63
|
+
finished: false
|
|
64
|
+
})
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=DataSynchronizationTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DATA_SYNCHRONIZATION_TASK","DataSynchronizationTask","id","title","description","isPrivate","maxIterations","databaseLogs","constructor","elasticsearchClient","documentClient","elasticsearchSynchronize","run","input","controller","runtime","isAborted","response","aborted","Manager","IndexManager","manager","indexManager","elasticsearch","DataSynchronizationTaskRunner","createFactories","dataSynchronization","factories","ex","error","createInputValidation","validator","flow","enum","elasticsearchToDynamoDb","object","finished","boolean","optional","default","index","string","cursor","array"],"sources":["DataSynchronizationTask.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { IElasticsearchTaskConfig } from \"~/types.js\";\nimport type {\n IDataSynchronizationInput,\n IDataSynchronizationOutput\n} from \"~/tasks/dataSynchronization/types.js\";\nimport { ElasticsearchSynchronize } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js\";\n\nexport const DATA_SYNCHRONIZATION_TASK = \"dataSynchronization\";\n\nexport class DataSynchronizationTask\n implements TaskDefinition.Interface<IDataSynchronizationInput, IDataSynchronizationOutput>\n{\n id = DATA_SYNCHRONIZATION_TASK;\n title = \"Data Synchronization\";\n description = \"Synchronize data between Elasticsearch and DynamoDB\";\n isPrivate = false;\n maxIterations = 100;\n databaseLogs = false;\n\n constructor(\n private elasticsearchClient: IElasticsearchTaskConfig[\"elasticsearchClient\"],\n private documentClient: IElasticsearchTaskConfig[\"documentClient\"],\n private elasticsearchSynchronize: ElasticsearchSynchronize\n ) {}\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IDataSynchronizationInput, IDataSynchronizationOutput>) {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n const { Manager } = await import(\n /* webpackChunkName: \"Manager\" */\n \"../Manager.js\"\n );\n\n const { IndexManager } = await import(\n /* webpackChunkName: \"IndexManager\" */ \"~/settings/index.js\"\n );\n\n const manager = new Manager<IDataSynchronizationInput, IDataSynchronizationOutput>({\n elasticsearchClient: this.elasticsearchClient,\n documentClient: this.documentClient,\n controller\n });\n\n const indexManager = new IndexManager(manager.elasticsearch, {});\n\n const { DataSynchronizationTaskRunner } = await import(\n /* webpackChunkName: \"DataSynchronizationTaskRunner\" */ \"./DataSynchronizationTaskRunner.js\"\n );\n\n const { createFactories } = await import(\n /* webpackChunkName: \"createFactories\" */ \"./createFactories.js\"\n );\n\n try {\n const dataSynchronization = new DataSynchronizationTaskRunner({\n manager,\n indexManager,\n factories: createFactories(),\n elasticsearchSynchronize: this.elasticsearchSynchronize\n });\n\n return await dataSynchronization.run({\n ...input\n });\n } catch (ex) {\n return controller.response.error(ex);\n }\n }\n\n createInputValidation({ validator }: TaskDefinition.CreateInputValidationParams) {\n return {\n flow: validator.enum([\"elasticsearchToDynamoDb\"]),\n elasticsearchToDynamoDb: validator\n .object({\n finished: validator.boolean().optional().default(false),\n index: validator.string().optional(),\n cursor: validator.array(validator.string()).optional()\n })\n .optional()\n .default({\n finished: false\n })\n };\n }\n}\n"],"mappings":"AAQA,OAAO,MAAMA,yBAAyB,GAAG,qBAAqB;AAE9D,OAAO,MAAMC,uBAAuB,CAEpC;EACIC,EAAE,GAAGF,yBAAyB;EAC9BG,KAAK,GAAG,sBAAsB;EAC9BC,WAAW,GAAG,qDAAqD;EACnEC,SAAS,GAAG,KAAK;EACjBC,aAAa,GAAG,GAAG;EACnBC,YAAY,GAAG,KAAK;EAEpBC,WAAWA,CACCC,mBAAoE,EACpEC,cAA0D,EAC1DC,wBAAkD,EAC5D;IAAA,KAHUF,mBAAoE,GAApEA,mBAAoE;IAAA,KACpEC,cAA0D,GAA1DA,cAA0D;IAAA,KAC1DC,wBAAkD,GAAlDA,wBAAkD;EAC3D;EAEH,MAAMC,GAAGA,CAAC;IACNC,KAAK;IACLC;EAC6E,CAAC,EAAE;IAChF,IAAIA,UAAU,CAACC,OAAO,CAACC,SAAS,CAAC,CAAC,EAAE;MAChC,OAAOF,UAAU,CAACG,QAAQ,CAACC,OAAO,CAAC,CAAC;IACxC;IAEA,MAAM;MAAEC;IAAQ,CAAC,GAAG,MAAM,MAAM,CAC5B,gDAEJ,CAAC;IAED,MAAM;MAAEC;IAAa,CAAC,GAAG,MAAM,MAAM,CACjC,+DACJ,CAAC;IAED,MAAMC,OAAO,GAAG,IAAIF,OAAO,CAAwD;MAC/EV,mBAAmB,EAAE,IAAI,CAACA,mBAAmB;MAC7CC,cAAc,EAAE,IAAI,CAACA,cAAc;MACnCI;IACJ,CAAC,CAAC;IAEF,MAAMQ,YAAY,GAAG,IAAIF,YAAY,CAACC,OAAO,CAACE,aAAa,EAAE,CAAC,CAAC,CAAC;IAEhE,MAAM;MAAEC;IAA8B,CAAC,GAAG,MAAM,MAAM,CAClD,2FACJ,CAAC;IAED,MAAM;MAAEC;IAAgB,CAAC,GAAG,MAAM,MAAM,CACpC,+DACJ,CAAC;IAED,IAAI;MACA,MAAMC,mBAAmB,GAAG,IAAIF,6BAA6B,CAAC;QAC1DH,OAAO;QACPC,YAAY;QACZK,SAAS,EAAEF,eAAe,CAAC,CAAC;QAC5Bd,wBAAwB,EAAE,IAAI,CAACA;MACnC,CAAC,CAAC;MAEF,OAAO,MAAMe,mBAAmB,CAACd,GAAG,CAAC;QACjC,GAAGC;MACP,CAAC,CAAC;IACN,CAAC,CAAC,OAAOe,EAAE,EAAE;MACT,OAAOd,UAAU,CAACG,QAAQ,CAACY,KAAK,CAACD,EAAE,CAAC;IACxC;EACJ;EAEAE,qBAAqBA,CAAC;IAAEC;EAAsD,CAAC,EAAE;IAC7E,OAAO;MACHC,IAAI,EAAED,SAAS,CAACE,IAAI,CAAC,CAAC,yBAAyB,CAAC,CAAC;MACjDC,uBAAuB,EAAEH,SAAS,CAC7BI,MAAM,CAAC;QACJC,QAAQ,EAAEL,SAAS,CAACM,OAAO,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,KAAK,CAAC;QACvDC,KAAK,EAAET,SAAS,CAACU,MAAM,CAAC,CAAC,CAACH,QAAQ,CAAC,CAAC;QACpCI,MAAM,EAAEX,SAAS,CAACY,KAAK,CAACZ,SAAS,CAACU,MAAM,CAAC,CAAC,CAAC,CAACH,QAAQ,CAAC;MACzD,CAAC,CAAC,CACDA,QAAQ,CAAC,CAAC,CACVC,OAAO,CAAC;QACLH,QAAQ,EAAE;MACd,CAAC;IACT,CAAC;EACL;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IDataSynchronizationInput, IDataSynchronizationManager, IFactories } from "../../tasks/dataSynchronization/types.js";
|
|
2
|
+
import type { IIndexManager } from "../../settings/types.js";
|
|
3
|
+
import { ElasticsearchSynchronize } from "../../tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js";
|
|
4
|
+
export interface IDataSynchronizationTaskRunnerParams {
|
|
5
|
+
manager: IDataSynchronizationManager;
|
|
6
|
+
indexManager: IIndexManager;
|
|
7
|
+
factories: IFactories;
|
|
8
|
+
elasticsearchSynchronize: ElasticsearchSynchronize;
|
|
9
|
+
}
|
|
10
|
+
export declare class DataSynchronizationTaskRunner {
|
|
11
|
+
private readonly manager;
|
|
12
|
+
private readonly indexManager;
|
|
13
|
+
private readonly factories;
|
|
14
|
+
private readonly elasticsearchSynchronize;
|
|
15
|
+
constructor(params: IDataSynchronizationTaskRunnerParams);
|
|
16
|
+
run(input: IDataSynchronizationInput): Promise<import("~/tasks/dataSynchronization/types.js").ISynchronizationRunResult>;
|
|
17
|
+
private validateFlow;
|
|
18
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ElasticsearchFetcher } from "./elasticsearch/ElasticsearchFetcher.js";
|
|
2
|
+
export class DataSynchronizationTaskRunner {
|
|
3
|
+
constructor(params) {
|
|
4
|
+
this.manager = params.manager;
|
|
5
|
+
this.indexManager = params.indexManager;
|
|
6
|
+
this.factories = params.factories;
|
|
7
|
+
this.elasticsearchSynchronize = params.elasticsearchSynchronize;
|
|
8
|
+
}
|
|
9
|
+
async run(input) {
|
|
10
|
+
this.validateFlow(input);
|
|
11
|
+
/**
|
|
12
|
+
* Go through the Elasticsearch and delete records which do not exist in the Elasticsearch table.
|
|
13
|
+
*/
|
|
14
|
+
//
|
|
15
|
+
if (input.flow === "elasticsearchToDynamoDb" && !input.elasticsearchToDynamoDb?.finished) {
|
|
16
|
+
const sync = this.factories.elasticsearchToDynamoDb({
|
|
17
|
+
manager: this.manager,
|
|
18
|
+
indexManager: this.indexManager,
|
|
19
|
+
synchronize: this.elasticsearchSynchronize,
|
|
20
|
+
fetcher: new ElasticsearchFetcher({
|
|
21
|
+
client: this.manager.elasticsearch
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
return await sync.run(input);
|
|
26
|
+
} catch (ex) {
|
|
27
|
+
return this.manager.controller.response.error(ex);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* We are done.
|
|
32
|
+
*/
|
|
33
|
+
return this.manager.controller.response.done();
|
|
34
|
+
}
|
|
35
|
+
validateFlow(input) {
|
|
36
|
+
if (!input.flow) {
|
|
37
|
+
throw new Error(`Missing "flow" in the input.`);
|
|
38
|
+
} else if (this.factories[input.flow]) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`Invalid flow "${input.flow}". Allowed flows: ${Object.keys(this.factories).join(", ")}.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=DataSynchronizationTaskRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ElasticsearchFetcher","DataSynchronizationTaskRunner","constructor","params","manager","indexManager","factories","elasticsearchSynchronize","run","input","validateFlow","flow","elasticsearchToDynamoDb","finished","sync","synchronize","fetcher","client","elasticsearch","ex","controller","response","error","done","Error","Object","keys","join"],"sources":["DataSynchronizationTaskRunner.ts"],"sourcesContent":["import type {\n IDataSynchronizationInput,\n IDataSynchronizationManager,\n IFactories\n} from \"~/tasks/dataSynchronization/types.js\";\nimport type { IIndexManager } from \"~/settings/types.js\";\nimport { ElasticsearchSynchronize } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js\";\nimport { ElasticsearchFetcher } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js\";\n\nexport interface IDataSynchronizationTaskRunnerParams {\n manager: IDataSynchronizationManager;\n indexManager: IIndexManager;\n factories: IFactories;\n elasticsearchSynchronize: ElasticsearchSynchronize;\n}\n\nexport class DataSynchronizationTaskRunner {\n private readonly manager: IDataSynchronizationManager;\n private readonly indexManager: IIndexManager;\n private readonly factories: IFactories;\n private readonly elasticsearchSynchronize: ElasticsearchSynchronize;\n\n public constructor(params: IDataSynchronizationTaskRunnerParams) {\n this.manager = params.manager;\n this.indexManager = params.indexManager;\n this.factories = params.factories;\n this.elasticsearchSynchronize = params.elasticsearchSynchronize;\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: this.elasticsearchSynchronize,\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.controller.response.error(ex);\n }\n }\n /**\n * We are done.\n */\n return this.manager.controller.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":"AAOA,SAASA,oBAAoB;AAS7B,OAAO,MAAMC,6BAA6B,CAAC;EAMhCC,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;IACjC,IAAI,CAACC,wBAAwB,GAAGJ,MAAM,CAACI,wBAAwB;EACnE;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,CAACR,SAAS,CAACM,uBAAuB,CAAC;QAChDR,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBC,YAAY,EAAE,IAAI,CAACA,YAAY;QAC/BU,WAAW,EAAE,IAAI,CAACR,wBAAwB;QAC1CS,OAAO,EAAE,IAAIhB,oBAAoB,CAAC;UAC9BiB,MAAM,EAAE,IAAI,CAACb,OAAO,CAACc;QACzB,CAAC;MACL,CAAC,CAAC;MACF,IAAI;QACA,OAAO,MAAMJ,IAAI,CAACN,GAAG,CAACC,KAAK,CAAC;MAChC,CAAC,CAAC,OAAOU,EAAE,EAAE;QACT,OAAO,IAAI,CAACf,OAAO,CAACgB,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACH,EAAE,CAAC;MACrD;IACJ;IACA;AACR;AACA;IACQ,OAAO,IAAI,CAACf,OAAO,CAACgB,UAAU,CAACC,QAAQ,CAACE,IAAI,CAAC,CAAC;EAClD;EAEQb,YAAYA,CAACD,KAAgC,EAAQ;IACzD,IAAI,CAACA,KAAK,CAACE,IAAI,EAAE;MACb,MAAM,IAAIa,KAAK,CAAC,8BAA8B,CAAC;IACnD,CAAC,MAAM,IAAI,IAAI,CAAClB,SAAS,CAACG,KAAK,CAACE,IAAI,CAAC,EAAE;MACnC;IACJ;IACA,MAAM,IAAIa,KAAK,CACX,iBAAiBf,KAAK,CAACE,IAAI,qBAAqBc,MAAM,CAACC,IAAI,CAAC,IAAI,CAACpB,SAAS,CAAC,CAACqB,IAAI,CAC5E,IACJ,CAAC,GACL,CAAC;EACL;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ElasticsearchToDynamoDbSynchronization } from "./elasticsearch/ElasticsearchToDynamoDbSynchronization.js";
|
|
2
|
+
export const createFactories = () => {
|
|
3
|
+
return {
|
|
4
|
+
elasticsearchToDynamoDb: params => {
|
|
5
|
+
return new ElasticsearchToDynamoDbSynchronization(params);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=createFactories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ElasticsearchToDynamoDbSynchronization","createFactories","elasticsearchToDynamoDb","params"],"sources":["createFactories.ts"],"sourcesContent":["import type { IFactories } from \"./types.js\";\nimport { ElasticsearchToDynamoDbSynchronization } from \"./elasticsearch/ElasticsearchToDynamoDbSynchronization.js\";\n\nexport const createFactories = (): IFactories => {\n return {\n elasticsearchToDynamoDb: params => {\n return new ElasticsearchToDynamoDbSynchronization(params);\n }\n };\n};\n"],"mappings":"AACA,SAASA,sCAAsC;AAE/C,OAAO,MAAMC,eAAe,GAAGA,CAAA,KAAkB;EAC7C,OAAO;IACHC,uBAAuB,EAAEC,MAAM,IAAI;MAC/B,OAAO,IAAIH,sCAAsC,CAACG,MAAM,CAAC;IAC7D;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
|