@webiny/api-sync-to-opensearch 0.0.0-unstable.0d717d18dd

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/NotEnoughRemainingTimeError.d.ts +3 -0
  3. package/NotEnoughRemainingTimeError.js +6 -0
  4. package/NotEnoughRemainingTimeError.js.map +1 -0
  5. package/README.md +11 -0
  6. package/features/ExecuteSync/ExecuteSync.d.ts +16 -0
  7. package/features/ExecuteSync/ExecuteSync.js +103 -0
  8. package/features/ExecuteSync/ExecuteSync.js.map +1 -0
  9. package/features/ExecuteSync/abstraction.d.ts +14 -0
  10. package/features/ExecuteSync/abstraction.js +5 -0
  11. package/features/ExecuteSync/abstraction.js.map +1 -0
  12. package/features/ExecuteSync/feature.d.ts +4 -0
  13. package/features/ExecuteSync/feature.js +11 -0
  14. package/features/ExecuteSync/feature.js.map +1 -0
  15. package/features/ExecuteSyncWithRetry/ExecuteSyncWithRetry.d.ts +15 -0
  16. package/features/ExecuteSyncWithRetry/ExecuteSyncWithRetry.js +54 -0
  17. package/features/ExecuteSyncWithRetry/ExecuteSyncWithRetry.js.map +1 -0
  18. package/features/ExecuteSyncWithRetry/abstraction.d.ts +16 -0
  19. package/features/ExecuteSyncWithRetry/abstraction.js +5 -0
  20. package/features/ExecuteSyncWithRetry/abstraction.js.map +1 -0
  21. package/features/ExecuteSyncWithRetry/feature.d.ts +4 -0
  22. package/features/ExecuteSyncWithRetry/feature.js +11 -0
  23. package/features/ExecuteSyncWithRetry/feature.js.map +1 -0
  24. package/features/Operations/Operations.d.ts +18 -0
  25. package/features/Operations/Operations.js +49 -0
  26. package/features/Operations/Operations.js.map +1 -0
  27. package/features/Operations/OperationsFactory.d.ts +9 -0
  28. package/features/Operations/OperationsFactory.js +14 -0
  29. package/features/Operations/OperationsFactory.js.map +1 -0
  30. package/features/Operations/abstractions/Operations.d.ts +27 -0
  31. package/features/Operations/abstractions/Operations.js +5 -0
  32. package/features/Operations/abstractions/Operations.js.map +1 -0
  33. package/features/Operations/abstractions/OperationsFactory.d.ts +8 -0
  34. package/features/Operations/abstractions/OperationsFactory.js +5 -0
  35. package/features/Operations/abstractions/OperationsFactory.js.map +1 -0
  36. package/features/Operations/feature.d.ts +4 -0
  37. package/features/Operations/feature.js +11 -0
  38. package/features/Operations/feature.js.map +1 -0
  39. package/features/OperationsBuilder/abstraction.d.ts +11 -0
  40. package/features/OperationsBuilder/abstraction.js +5 -0
  41. package/features/OperationsBuilder/abstraction.js.map +1 -0
  42. package/features/SynchronizationBuilder/SynchronizationBuilder.d.ts +20 -0
  43. package/features/SynchronizationBuilder/SynchronizationBuilder.js +43 -0
  44. package/features/SynchronizationBuilder/SynchronizationBuilder.js.map +1 -0
  45. package/features/SynchronizationBuilder/abstraction.d.ts +12 -0
  46. package/features/SynchronizationBuilder/abstraction.js +5 -0
  47. package/features/SynchronizationBuilder/abstraction.js.map +1 -0
  48. package/features/SynchronizationBuilder/feature.d.ts +4 -0
  49. package/features/SynchronizationBuilder/feature.js +11 -0
  50. package/features/SynchronizationBuilder/feature.js.map +1 -0
  51. package/index.d.ts +12 -0
  52. package/index.js +12 -0
  53. package/package.json +42 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,3 @@
1
+ import { WebinyError } from "@webiny/error";
2
+ export declare class NotEnoughRemainingTimeError extends WebinyError {
3
+ }
@@ -0,0 +1,6 @@
1
+ import { WebinyError } from "@webiny/error";
2
+ class NotEnoughRemainingTimeError extends WebinyError {
3
+ }
4
+ export { NotEnoughRemainingTimeError };
5
+
6
+ //# sourceMappingURL=NotEnoughRemainingTimeError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotEnoughRemainingTimeError.js","sources":["../src/NotEnoughRemainingTimeError.ts"],"sourcesContent":["import { WebinyError } from \"@webiny/error\";\n\nexport class NotEnoughRemainingTimeError extends WebinyError {}\n"],"names":["NotEnoughRemainingTimeError","WebinyError"],"mappings":";AAEO,MAAMA,oCAAoCC;AAAa"}
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @webiny/api-sync-to-opensearch
2
+
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
6
+
7
+ 📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
8
+
9
+ ---
10
+
11
+ _This README file is automatically generated during the publish process._
@@ -0,0 +1,16 @@
1
+ import { ExecuteSync as ExecuteSyncAbstraction } from "./abstraction.js";
2
+ import { Env } from "@webiny/stdlib";
3
+ import { Timer } from "@webiny/utils/features/Timer/abstraction.js";
4
+ import { OpenSearchClient } from "@webiny/api-opensearch/exports/api/opensearch.js";
5
+ declare class ExecuteSyncImpl implements ExecuteSyncAbstraction.Interface {
6
+ private readonly env;
7
+ private readonly timer;
8
+ private readonly openSearchClient;
9
+ constructor(env: Env.Interface, timer: Timer.Interface, openSearchClient: OpenSearchClient.Interface);
10
+ execute(params: ExecuteSyncAbstraction.Params): Promise<void>;
11
+ private shouldShowLogs;
12
+ }
13
+ export declare const ExecuteSync: typeof ExecuteSyncImpl & {
14
+ __abstraction: import("@webiny/di").Abstraction<import("./abstraction.js").IExecuteSync>;
15
+ };
16
+ export {};
@@ -0,0 +1,103 @@
1
+ import { OpenSearchCatClusterHealthStatus, UnhealthyClusterError, WaitingHealthyClusterAbortedError, createWaitUntilHealthy } from "@webiny/api-opensearch";
2
+ import { WebinyError } from "@webiny/error";
3
+ import { ExecuteSync } from "./abstraction.js";
4
+ import { Env } from "@webiny/stdlib";
5
+ import { Timer } from "@webiny/utils/features/Timer/abstraction.js";
6
+ import { OpenSearchClient } from "@webiny/api-opensearch/exports/api/opensearch.js";
7
+ const getError = (item)=>{
8
+ if (!item.index?.error?.reason) return null;
9
+ const reason = item.index.error.reason;
10
+ if (null !== reason.match(/no such index \[([a-zA-Z0-9_-]+)\]/)) return "index";
11
+ return reason;
12
+ };
13
+ const checkErrors = (result)=>{
14
+ if (!result || !result.body || !result.body.items) return;
15
+ for (const item of result.body.items){
16
+ const err = getError(item);
17
+ if (err) {
18
+ if ("index" === err) {
19
+ if ("true" === process.env.DEBUG) console.error("Bulk response", JSON.stringify(result, null, 2));
20
+ continue;
21
+ }
22
+ console.error("Body item with error", item);
23
+ throw new WebinyError(err, "TO_OPENSEARCH_ERROR", item);
24
+ }
25
+ }
26
+ };
27
+ class ExecuteSyncImpl {
28
+ constructor(env, timer, openSearchClient){
29
+ this.env = env;
30
+ this.timer = timer;
31
+ this.openSearchClient = openSearchClient;
32
+ }
33
+ async execute(params) {
34
+ const { maxProcessorPercent, maxRunningTime, operations } = params;
35
+ if (0 === operations.total) return;
36
+ const remainingTime = this.timer.getRemainingSeconds();
37
+ const runningTime = maxRunningTime - remainingTime;
38
+ const maxWaitingTime = remainingTime - 90;
39
+ if (this.shouldShowLogs()) console.debug(`The Lambda is already running for ${runningTime}s. Setting Health Check max waiting time: ${maxWaitingTime}s`);
40
+ const healthCheck = createWaitUntilHealthy(this.openSearchClient.use(), {
41
+ minClusterHealthStatus: OpenSearchCatClusterHealthStatus.Yellow,
42
+ waitingTimeStep: 30,
43
+ maxProcessorPercent,
44
+ maxWaitingTime
45
+ });
46
+ try {
47
+ await healthCheck.wait({
48
+ async onUnhealthy ({ startedAt, runs, mustEndAt, waitingTimeStep, waitingReason }) {
49
+ console.debug(`Cluster is unhealthy on run #${runs}.`, {
50
+ startedAt,
51
+ mustEndAt,
52
+ waitingTimeStep,
53
+ waitingReason
54
+ });
55
+ },
56
+ async onTimeout ({ startedAt, runs, waitingTimeStep, mustEndAt, waitingReason }) {
57
+ console.error(`Cluster health check timeout on run #${runs}.`, {
58
+ startedAt,
59
+ mustEndAt,
60
+ waitingTimeStep,
61
+ waitingReason
62
+ });
63
+ }
64
+ });
65
+ } catch (ex) {
66
+ if (ex instanceof UnhealthyClusterError || ex instanceof WaitingHealthyClusterAbortedError) throw ex;
67
+ console.error("Cluster health check failed.", ex);
68
+ throw ex;
69
+ }
70
+ try {
71
+ const res = await this.openSearchClient.use().bulk({
72
+ body: operations.items
73
+ });
74
+ checkErrors(res);
75
+ } catch (error) {
76
+ console.error(error, {
77
+ tenant: "root"
78
+ });
79
+ if (this.shouldShowLogs()) {
80
+ const meta = error?.meta || {};
81
+ delete meta["meta"];
82
+ console.error("Bulk error", JSON.stringify(error, null, 2));
83
+ }
84
+ throw error;
85
+ }
86
+ if (this.shouldShowLogs()) console.info(`Transferred ${operations.total} record operations to OpenSearch.`);
87
+ }
88
+ shouldShowLogs() {
89
+ if (this.env.getBoolean("TESTING")) return false;
90
+ return this.env.getBoolean("DEBUG", false);
91
+ }
92
+ }
93
+ const ExecuteSync_ExecuteSync = ExecuteSync.createImplementation({
94
+ implementation: ExecuteSyncImpl,
95
+ dependencies: [
96
+ Env,
97
+ Timer,
98
+ OpenSearchClient
99
+ ]
100
+ });
101
+ export { ExecuteSync_ExecuteSync as ExecuteSync };
102
+
103
+ //# sourceMappingURL=ExecuteSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExecuteSync/ExecuteSync.js","sources":["../../../src/features/ExecuteSync/ExecuteSync.ts"],"sourcesContent":["import {\n createWaitUntilHealthy,\n OpenSearchCatClusterHealthStatus,\n UnhealthyClusterError,\n WaitingHealthyClusterAbortedError\n} from \"@webiny/api-opensearch\";\nimport type { ApiResponse } from \"@webiny/api-opensearch/types.js\";\nimport { WebinyError } from \"@webiny/error\";\nimport { ExecuteSync as ExecuteSyncAbstraction } from \"./abstraction.js\";\nimport { Env } from \"@webiny/stdlib\";\nimport { Timer } from \"@webiny/utils/features/Timer/abstraction.js\";\nimport { OpenSearchClient } from \"@webiny/api-opensearch/exports/api/opensearch.js\";\n\ninterface BulkOperationsResponseBodyItemIndexError {\n reason?: string;\n}\n\ninterface BulkOperationsResponseBodyItemIndex {\n error?: BulkOperationsResponseBodyItemIndexError;\n}\n\ninterface BulkOperationsResponseBodyItem {\n index?: BulkOperationsResponseBodyItemIndex;\n error?: string;\n}\n\nconst getError = (item: BulkOperationsResponseBodyItem): string | null => {\n if (!item.index?.error?.reason) {\n return null;\n }\n const reason = item.index.error.reason;\n if (reason.match(/no such index \\[([a-zA-Z0-9_-]+)\\]/) !== null) {\n return \"index\";\n }\n return reason;\n};\n\nconst checkErrors = (result?: ApiResponse): void => {\n if (!result || !result.body || !result.body.items) {\n return;\n }\n for (const item of result.body.items) {\n const err = getError(item);\n if (!err) {\n continue;\n } else if (err === \"index\") {\n if (process.env.DEBUG === \"true\") {\n console.error(\"Bulk response\", JSON.stringify(result, null, 2));\n }\n continue;\n }\n console.error(\"Body item with error\", item);\n throw new WebinyError(err, \"TO_OPENSEARCH_ERROR\", item);\n }\n};\n\nclass ExecuteSyncImpl implements ExecuteSyncAbstraction.Interface {\n public constructor(\n private readonly env: Env.Interface,\n private readonly timer: Timer.Interface,\n private readonly openSearchClient: OpenSearchClient.Interface\n ) {}\n\n public async execute(params: ExecuteSyncAbstraction.Params): Promise<void> {\n const { maxProcessorPercent, maxRunningTime, operations } = params;\n\n if (operations.total === 0) {\n return;\n }\n\n const remainingTime = this.timer.getRemainingSeconds();\n const runningTime = maxRunningTime - remainingTime;\n const maxWaitingTime = remainingTime - 90;\n\n if (this.shouldShowLogs()) {\n console.debug(\n `The Lambda is already running for ${runningTime}s. Setting Health Check max waiting time: ${maxWaitingTime}s`\n );\n }\n\n const healthCheck = createWaitUntilHealthy(this.openSearchClient.use(), {\n minClusterHealthStatus: OpenSearchCatClusterHealthStatus.Yellow,\n waitingTimeStep: 30,\n maxProcessorPercent,\n maxWaitingTime\n });\n\n try {\n await healthCheck.wait({\n async onUnhealthy({ startedAt, runs, mustEndAt, waitingTimeStep, waitingReason }) {\n console.debug(`Cluster is unhealthy on run #${runs}.`, {\n startedAt,\n mustEndAt,\n waitingTimeStep,\n waitingReason\n });\n },\n async onTimeout({ startedAt, runs, waitingTimeStep, mustEndAt, waitingReason }) {\n console.error(`Cluster health check timeout on run #${runs}.`, {\n startedAt,\n mustEndAt,\n waitingTimeStep,\n waitingReason\n });\n }\n });\n } catch (ex) {\n if (\n ex instanceof UnhealthyClusterError ||\n ex instanceof WaitingHealthyClusterAbortedError\n ) {\n throw ex;\n }\n console.error(`Cluster health check failed.`, ex);\n throw ex;\n }\n\n try {\n const res = await this.openSearchClient.use().bulk({\n body: operations.items\n });\n checkErrors(res);\n } catch (error) {\n console.error(error, { tenant: \"root\" });\n\n if (this.shouldShowLogs()) {\n const meta = error?.meta || {};\n delete meta[\"meta\"];\n console.error(\"Bulk error\", JSON.stringify(error, null, 2));\n }\n throw error;\n }\n if (this.shouldShowLogs()) {\n console.info(`Transferred ${operations.total} record operations to OpenSearch.`);\n }\n }\n\n private shouldShowLogs(): boolean {\n /**\n * Don't show logs during tests, really no point.\n */\n if (this.env.getBoolean(\"TESTING\")) {\n return false;\n }\n return this.env.getBoolean(\"DEBUG\", false);\n }\n}\n\nexport const ExecuteSync = ExecuteSyncAbstraction.createImplementation({\n implementation: ExecuteSyncImpl,\n dependencies: [Env, Timer, OpenSearchClient]\n});\n"],"names":["getError","item","reason","checkErrors","result","err","process","console","JSON","WebinyError","ExecuteSyncImpl","env","timer","openSearchClient","params","maxProcessorPercent","maxRunningTime","operations","remainingTime","runningTime","maxWaitingTime","healthCheck","createWaitUntilHealthy","OpenSearchCatClusterHealthStatus","startedAt","runs","mustEndAt","waitingTimeStep","waitingReason","ex","UnhealthyClusterError","WaitingHealthyClusterAbortedError","res","error","meta","ExecuteSync","ExecuteSyncAbstraction","Env","Timer","OpenSearchClient"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Operations } from "../Operations/abstractions/Operations.js";
2
+ export interface IExecuteSyncParams {
3
+ maxRunningTime: number;
4
+ maxProcessorPercent: number;
5
+ operations: Pick<Operations.Interface, "items" | "total">;
6
+ }
7
+ export interface IExecuteSync {
8
+ execute(params: IExecuteSyncParams): Promise<void>;
9
+ }
10
+ export declare const ExecuteSync: import("@webiny/di").Abstraction<IExecuteSync>;
11
+ export declare namespace ExecuteSync {
12
+ type Interface = IExecuteSync;
13
+ type Params = IExecuteSyncParams;
14
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const ExecuteSync = createAbstraction("Sync/ExecuteSync");
3
+ export { ExecuteSync };
4
+
5
+ //# sourceMappingURL=abstraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExecuteSync/abstraction.js","sources":["../../../src/features/ExecuteSync/abstraction.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Operations } from \"../Operations/abstractions/Operations.js\";\n\nexport interface IExecuteSyncParams {\n maxRunningTime: number;\n maxProcessorPercent: number;\n operations: Pick<Operations.Interface, \"items\" | \"total\">;\n}\n\nexport interface IExecuteSync {\n execute(params: IExecuteSyncParams): Promise<void>;\n}\n\nexport const ExecuteSync = createAbstraction<IExecuteSync>(\"Sync/ExecuteSync\");\n\nexport namespace ExecuteSync {\n export type Interface = IExecuteSync;\n export type Params = IExecuteSyncParams;\n}\n"],"names":["ExecuteSync","createAbstraction"],"mappings":";AAaO,MAAMA,cAAcC,kBAAgC"}
@@ -0,0 +1,4 @@
1
+ export declare const ExecuteSyncFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { ExecuteSync } from "./ExecuteSync.js";
3
+ const ExecuteSyncFeature = createFeature({
4
+ name: "sync.executeSync",
5
+ register (container) {
6
+ container.register(ExecuteSync);
7
+ }
8
+ });
9
+ export { ExecuteSyncFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExecuteSync/feature.js","sources":["../../../src/features/ExecuteSync/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ExecuteSync } from \"./ExecuteSync.js\";\n\nexport const ExecuteSyncFeature = createFeature({\n name: \"sync.executeSync\",\n register(container) {\n container.register(ExecuteSync);\n }\n});\n"],"names":["ExecuteSyncFeature","createFeature","container","ExecuteSync"],"mappings":";;AAGO,MAAMA,qBAAqBC,cAAc;IAC5C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,15 @@
1
+ import { ExecuteSync } from "../ExecuteSync/abstraction.js";
2
+ import { ExecuteSyncWithRetry as ExecuteSyncWithRetryAbstraction } from "./abstraction.js";
3
+ import { Env } from "@webiny/stdlib";
4
+ import { Timer } from "@webiny/utils/features/Timer/abstraction.js";
5
+ declare class ExecuteSyncWithRetryImpl implements ExecuteSyncWithRetryAbstraction.Interface {
6
+ private readonly timer;
7
+ private readonly executeSync;
8
+ private readonly env;
9
+ constructor(timer: Timer.Interface, executeSync: ExecuteSync.Interface, env: Env.Interface);
10
+ execute(params: ExecuteSyncWithRetryAbstraction.Params): Promise<void>;
11
+ }
12
+ export declare const ExecuteSyncWithRetry: typeof ExecuteSyncWithRetryImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("./abstraction.js").IExecuteSyncWithRetry>;
14
+ };
15
+ export {};
@@ -0,0 +1,54 @@
1
+ import p_retry from "p-retry";
2
+ import { ExecuteSync } from "../ExecuteSync/abstraction.js";
3
+ import { NotEnoughRemainingTimeError } from "../../NotEnoughRemainingTimeError.js";
4
+ import { ExecuteSyncWithRetry } from "./abstraction.js";
5
+ import { Env } from "@webiny/stdlib";
6
+ import { Timer } from "@webiny/utils/features/Timer/abstraction.js";
7
+ const minRemainingSecondsToTimeout = 120;
8
+ class ExecuteSyncWithRetryImpl {
9
+ constructor(timer, executeSync, env){
10
+ this.timer = timer;
11
+ this.executeSync = executeSync;
12
+ this.env = env;
13
+ }
14
+ async execute(params) {
15
+ const maxProcessorPercent = this.env.getNumber("MAX_ES_PROCESSOR", "test" === process.env.NODE_ENV ? 101 : 98);
16
+ const maxRetryTime = this.env.getNumber("WEBINY_TO_OPENSEARCH_MAX_RETRY_TIME", params.maxRetryTime || 300000);
17
+ const retries = this.env.getNumber("WEBINY_TO_OPENSEARCH_RETRIES", params.retries || 20);
18
+ const minTimeout = this.env.getNumber("WEBINY_TO_OPENSEARCH_MIN_TIMEOUT", params.minTimeout || 1500);
19
+ const maxTimeout = this.env.getNumber("WEBINY_TO_OPENSEARCH_MAX_TIMEOUT", params.maxTimeout || 30000);
20
+ try {
21
+ await p_retry(async ()=>{
22
+ await this.executeSync.execute({
23
+ maxRunningTime: params.maxRunningTime,
24
+ maxProcessorPercent: params.maxProcessorPercent || maxProcessorPercent,
25
+ operations: params.operations
26
+ });
27
+ }, {
28
+ maxRetryTime,
29
+ retries,
30
+ minTimeout,
31
+ maxTimeout,
32
+ onFailedAttempt: ({ error, attemptNumber })=>{
33
+ if (this.timer.getRemainingSeconds() < minRemainingSecondsToTimeout) throw new NotEnoughRemainingTimeError(error);
34
+ if (attemptNumber < 0.75 * retries) return;
35
+ console.error(`Attempt #${attemptNumber} failed.`);
36
+ console.error(error);
37
+ }
38
+ });
39
+ } catch (ex) {
40
+ throw ex;
41
+ }
42
+ }
43
+ }
44
+ const ExecuteSyncWithRetry_ExecuteSyncWithRetry = ExecuteSyncWithRetry.createImplementation({
45
+ implementation: ExecuteSyncWithRetryImpl,
46
+ dependencies: [
47
+ Timer,
48
+ ExecuteSync,
49
+ Env
50
+ ]
51
+ });
52
+ export { ExecuteSyncWithRetry_ExecuteSyncWithRetry as ExecuteSyncWithRetry };
53
+
54
+ //# sourceMappingURL=ExecuteSyncWithRetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExecuteSyncWithRetry/ExecuteSyncWithRetry.js","sources":["../../../src/features/ExecuteSyncWithRetry/ExecuteSyncWithRetry.ts"],"sourcesContent":["import pRetry from \"p-retry\";\nimport { ExecuteSync } from \"../ExecuteSync/abstraction.js\";\nimport { NotEnoughRemainingTimeError } from \"~/NotEnoughRemainingTimeError.js\";\nimport { ExecuteSyncWithRetry as ExecuteSyncWithRetryAbstraction } from \"./abstraction.js\";\nimport { Env } from \"@webiny/stdlib\";\nimport { Timer } from \"@webiny/utils/features/Timer/abstraction.js\";\n\nconst minRemainingSecondsToTimeout = 120;\n\nclass ExecuteSyncWithRetryImpl implements ExecuteSyncWithRetryAbstraction.Interface {\n public constructor(\n private readonly timer: Timer.Interface,\n private readonly executeSync: ExecuteSync.Interface,\n private readonly env: Env.Interface\n ) {}\n\n public async execute(params: ExecuteSyncWithRetryAbstraction.Params): Promise<void> {\n const maxProcessorPercent = this.env.getNumber(\n \"MAX_ES_PROCESSOR\",\n process.env.NODE_ENV === \"test\" ? 101 : 98\n );\n\n const maxRetryTime = this.env.getNumber(\n \"WEBINY_TO_OPENSEARCH_MAX_RETRY_TIME\",\n params.maxRetryTime || 300000\n );\n const retries = this.env.getNumber(\"WEBINY_TO_OPENSEARCH_RETRIES\", params.retries || 20);\n const minTimeout = this.env.getNumber(\n \"WEBINY_TO_OPENSEARCH_MIN_TIMEOUT\",\n params.minTimeout || 1500\n );\n const maxTimeout = this.env.getNumber(\n \"WEBINY_TO_OPENSEARCH_MAX_TIMEOUT\",\n params.maxTimeout || 30000\n );\n\n try {\n await pRetry(\n async () => {\n await this.executeSync.execute({\n maxRunningTime: params.maxRunningTime,\n maxProcessorPercent: params.maxProcessorPercent || maxProcessorPercent,\n operations: params.operations\n });\n },\n {\n maxRetryTime,\n retries,\n minTimeout,\n maxTimeout,\n onFailedAttempt: ({ error, attemptNumber }) => {\n if (this.timer.getRemainingSeconds() < minRemainingSecondsToTimeout) {\n throw new NotEnoughRemainingTimeError(error);\n }\n if (attemptNumber < retries * 0.75) {\n return;\n }\n console.error(`Attempt #${attemptNumber} failed.`);\n console.error(error);\n }\n }\n );\n } catch (ex) {\n throw ex;\n }\n }\n}\n\nexport const ExecuteSyncWithRetry = ExecuteSyncWithRetryAbstraction.createImplementation({\n implementation: ExecuteSyncWithRetryImpl,\n dependencies: [Timer, ExecuteSync, Env]\n});\n"],"names":["minRemainingSecondsToTimeout","ExecuteSyncWithRetryImpl","timer","executeSync","env","params","maxProcessorPercent","process","maxRetryTime","retries","minTimeout","maxTimeout","pRetry","error","attemptNumber","NotEnoughRemainingTimeError","console","ex","ExecuteSyncWithRetry","ExecuteSyncWithRetryAbstraction","Timer","ExecuteSync","Env"],"mappings":";;;;;;AAOA,MAAMA,+BAA+B;AAErC,MAAMC;IACF,YACqBC,KAAsB,EACtBC,WAAkC,EAClCC,GAAkB,CACrC;aAHmBF,KAAK,GAALA;aACAC,WAAW,GAAXA;aACAC,GAAG,GAAHA;IAClB;IAEH,MAAa,QAAQC,MAA8C,EAAiB;QAChF,MAAMC,sBAAsB,IAAI,CAAC,GAAG,CAAC,SAAS,CAC1C,oBACAC,AAAyB,WAAzBA,QAAQ,GAAG,CAAC,QAAQ,GAAc,MAAM;QAG5C,MAAMC,eAAe,IAAI,CAAC,GAAG,CAAC,SAAS,CACnC,uCACAH,OAAO,YAAY,IAAI;QAE3B,MAAMI,UAAU,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,gCAAgCJ,OAAO,OAAO,IAAI;QACrF,MAAMK,aAAa,IAAI,CAAC,GAAG,CAAC,SAAS,CACjC,oCACAL,OAAO,UAAU,IAAI;QAEzB,MAAMM,aAAa,IAAI,CAAC,GAAG,CAAC,SAAS,CACjC,oCACAN,OAAO,UAAU,IAAI;QAGzB,IAAI;YACA,MAAMO,QACF;gBACI,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;oBAC3B,gBAAgBP,OAAO,cAAc;oBACrC,qBAAqBA,OAAO,mBAAmB,IAAIC;oBACnD,YAAYD,OAAO,UAAU;gBACjC;YACJ,GACA;gBACIG;gBACAC;gBACAC;gBACAC;gBACA,iBAAiB,CAAC,EAAEE,KAAK,EAAEC,aAAa,EAAE;oBACtC,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAKd,8BACnC,MAAM,IAAIe,4BAA4BF;oBAE1C,IAAIC,gBAAgBL,AAAU,OAAVA,SAChB;oBAEJO,QAAQ,KAAK,CAAC,CAAC,SAAS,EAAEF,cAAc,QAAQ,CAAC;oBACjDE,QAAQ,KAAK,CAACH;gBAClB;YACJ;QAER,EAAE,OAAOI,IAAI;YACT,MAAMA;QACV;IACJ;AACJ;AAEO,MAAMC,4CAAuBC,qBAAAA,oBAAoD,CAAC;IACrF,gBAAgBlB;IAChB,cAAc;QAACmB;QAAOC;QAAaC;KAAI;AAC3C"}
@@ -0,0 +1,16 @@
1
+ import type { ExecuteSync } from "../ExecuteSync/abstraction.js";
2
+ export interface IExecuteSyncWithRetryParams extends Omit<ExecuteSync.Params, "maxProcessorPercent"> {
3
+ maxRetryTime?: number;
4
+ retries?: number;
5
+ minTimeout?: number;
6
+ maxTimeout?: number;
7
+ maxProcessorPercent?: number;
8
+ }
9
+ export interface IExecuteSyncWithRetry {
10
+ execute(params: IExecuteSyncWithRetryParams): Promise<void>;
11
+ }
12
+ export declare const ExecuteSyncWithRetry: import("@webiny/di").Abstraction<IExecuteSyncWithRetry>;
13
+ export declare namespace ExecuteSyncWithRetry {
14
+ type Interface = IExecuteSyncWithRetry;
15
+ type Params = IExecuteSyncWithRetryParams;
16
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const ExecuteSyncWithRetry = createAbstraction("Sync/ExecuteSyncWithRetry");
3
+ export { ExecuteSyncWithRetry };
4
+
5
+ //# sourceMappingURL=abstraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExecuteSyncWithRetry/abstraction.js","sources":["../../../src/features/ExecuteSyncWithRetry/abstraction.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { ExecuteSync } from \"../ExecuteSync/abstraction.js\";\n\nexport interface IExecuteSyncWithRetryParams extends Omit<\n ExecuteSync.Params,\n \"maxProcessorPercent\"\n> {\n maxRetryTime?: number;\n retries?: number;\n minTimeout?: number;\n maxTimeout?: number;\n maxProcessorPercent?: number;\n}\n\nexport interface IExecuteSyncWithRetry {\n execute(params: IExecuteSyncWithRetryParams): Promise<void>;\n}\n\nexport const ExecuteSyncWithRetry = createAbstraction<IExecuteSyncWithRetry>(\n \"Sync/ExecuteSyncWithRetry\"\n);\n\nexport namespace ExecuteSyncWithRetry {\n export type Interface = IExecuteSyncWithRetry;\n export type Params = IExecuteSyncWithRetryParams;\n}\n"],"names":["ExecuteSyncWithRetry","createAbstraction"],"mappings":";AAkBO,MAAMA,uBAAuBC,kBAChC"}
@@ -0,0 +1,4 @@
1
+ export declare const ExecuteSyncWithRetryFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { ExecuteSyncWithRetry } from "./ExecuteSyncWithRetry.js";
3
+ const ExecuteSyncWithRetryFeature = createFeature({
4
+ name: "sync.executeSyncWithRetry",
5
+ register (container) {
6
+ container.register(ExecuteSyncWithRetry);
7
+ }
8
+ });
9
+ export { ExecuteSyncWithRetryFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExecuteSyncWithRetry/feature.js","sources":["../../../src/features/ExecuteSyncWithRetry/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ExecuteSyncWithRetry } from \"./ExecuteSyncWithRetry.js\";\n\nexport const ExecuteSyncWithRetryFeature = createFeature({\n name: \"sync.executeSyncWithRetry\",\n register(container) {\n container.register(ExecuteSyncWithRetry);\n }\n});\n"],"names":["ExecuteSyncWithRetryFeature","createFeature","container","ExecuteSyncWithRetry"],"mappings":";;AAGO,MAAMA,8BAA8BC,cAAc;IACrD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,18 @@
1
+ import type { GenericRecord } from "@webiny/api/types.js";
2
+ import { Operations as OperationsAbstraction } from "./abstractions/Operations.js";
3
+ export declare enum OperationType {
4
+ INSERT = "INSERT",
5
+ MODIFY = "MODIFY",
6
+ REMOVE = "REMOVE"
7
+ }
8
+ export declare class Operations implements OperationsAbstraction.Interface {
9
+ private _items;
10
+ private _count;
11
+ get items(): GenericRecord[];
12
+ get total(): number;
13
+ get count(): number;
14
+ clear(): void;
15
+ insert(params: OperationsAbstraction.InsertParams): void;
16
+ modify(params: OperationsAbstraction.ModifyParams): void;
17
+ delete(params: OperationsAbstraction.DeleteParams): void;
18
+ }
@@ -0,0 +1,49 @@
1
+ var Operations_OperationType = /*#__PURE__*/ function(OperationType) {
2
+ OperationType["INSERT"] = "INSERT";
3
+ OperationType["MODIFY"] = "MODIFY";
4
+ OperationType["REMOVE"] = "REMOVE";
5
+ return OperationType;
6
+ }({});
7
+ class Operations {
8
+ get items() {
9
+ return this._items;
10
+ }
11
+ get total() {
12
+ return this.items.length;
13
+ }
14
+ get count() {
15
+ return this._count;
16
+ }
17
+ clear() {
18
+ this._items = [];
19
+ this._count = 0;
20
+ }
21
+ insert(params) {
22
+ this._count++;
23
+ this.items.push({
24
+ index: {
25
+ _id: params.id,
26
+ _index: params.index
27
+ }
28
+ }, params.data);
29
+ }
30
+ modify(params) {
31
+ this.insert(params);
32
+ }
33
+ delete(params) {
34
+ this._count++;
35
+ this.items.push({
36
+ delete: {
37
+ _id: params.id,
38
+ _index: params.index
39
+ }
40
+ });
41
+ }
42
+ constructor(){
43
+ this._items = [];
44
+ this._count = 0;
45
+ }
46
+ }
47
+ export { Operations, Operations_OperationType as OperationType };
48
+
49
+ //# sourceMappingURL=Operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/Operations/Operations.js","sources":["../../../src/features/Operations/Operations.ts"],"sourcesContent":["import type { GenericRecord } from \"@webiny/api/types.js\";\nimport { Operations as OperationsAbstraction } from \"./abstractions/Operations.js\";\n\nexport enum OperationType {\n INSERT = \"INSERT\",\n MODIFY = \"MODIFY\",\n REMOVE = \"REMOVE\"\n}\n\nexport class Operations implements OperationsAbstraction.Interface {\n private _items: GenericRecord[] = [];\n private _count = 0;\n\n public get items(): GenericRecord[] {\n return this._items;\n }\n\n public get total(): number {\n return this.items.length;\n }\n\n public get count(): number {\n return this._count;\n }\n\n public clear() {\n this._items = [];\n this._count = 0;\n }\n\n public insert(params: OperationsAbstraction.InsertParams): void {\n this._count++;\n this.items.push(\n {\n index: {\n _id: params.id,\n _index: params.index\n }\n },\n params.data\n );\n }\n\n public modify(params: OperationsAbstraction.ModifyParams): void {\n this.insert(params);\n }\n\n public delete(params: OperationsAbstraction.DeleteParams): void {\n this._count++;\n this.items.push({\n delete: {\n _id: params.id,\n _index: params.index\n }\n });\n }\n}\n"],"names":["OperationType","Operations","params"],"mappings":"AAGO,IAAKA,2BAAaA,WAAAA,GAAAA,SAAbA,aAAa;;;;WAAbA;;AAML,MAAMC;IAIT,IAAW,QAAyB;QAChC,OAAO,IAAI,CAAC,MAAM;IACtB;IAEA,IAAW,QAAgB;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;IAC5B;IAEA,IAAW,QAAgB;QACvB,OAAO,IAAI,CAAC,MAAM;IACtB;IAEO,QAAQ;QACX,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,MAAM,GAAG;IAClB;IAEO,OAAOC,MAA0C,EAAQ;QAC5D,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,KAAK,CAAC,IAAI,CACX;YACI,OAAO;gBACH,KAAKA,OAAO,EAAE;gBACd,QAAQA,OAAO,KAAK;YACxB;QACJ,GACAA,OAAO,IAAI;IAEnB;IAEO,OAAOA,MAA0C,EAAQ;QAC5D,IAAI,CAAC,MAAM,CAACA;IAChB;IAEO,OAAOA,MAA0C,EAAQ;QAC5D,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACZ,QAAQ;gBACJ,KAAKA,OAAO,EAAE;gBACd,QAAQA,OAAO,KAAK;YACxB;QACJ;IACJ;;aA7CQ,MAAM,GAAoB,EAAE;aAC5B,MAAM,GAAG;;AA6CrB"}
@@ -0,0 +1,9 @@
1
+ import { OperationsFactory as OperationsFactoryAbstraction } from "./abstractions/OperationsFactory.js";
2
+ import { Operations } from "./Operations.js";
3
+ declare class OperationsFactoryImpl implements OperationsFactoryAbstraction.Interface {
4
+ create(): Operations;
5
+ }
6
+ export declare const OperationsFactory: typeof OperationsFactoryImpl & {
7
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions/OperationsFactory.js").IOperationsFactory>;
8
+ };
9
+ export {};
@@ -0,0 +1,14 @@
1
+ import { OperationsFactory } from "./abstractions/OperationsFactory.js";
2
+ import { Operations } from "./Operations.js";
3
+ class OperationsFactoryImpl {
4
+ create() {
5
+ return new Operations();
6
+ }
7
+ }
8
+ const OperationsFactory_OperationsFactory = OperationsFactory.createImplementation({
9
+ implementation: OperationsFactoryImpl,
10
+ dependencies: []
11
+ });
12
+ export { OperationsFactory_OperationsFactory as OperationsFactory };
13
+
14
+ //# sourceMappingURL=OperationsFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/Operations/OperationsFactory.js","sources":["../../../src/features/Operations/OperationsFactory.ts"],"sourcesContent":["import { OperationsFactory as OperationsFactoryAbstraction } from \"./abstractions/OperationsFactory.js\";\nimport { Operations } from \"./Operations.js\";\n\nclass OperationsFactoryImpl implements OperationsFactoryAbstraction.Interface {\n public create() {\n return new Operations();\n }\n}\n\nexport const OperationsFactory = OperationsFactoryAbstraction.createImplementation({\n implementation: OperationsFactoryImpl,\n dependencies: []\n});\n"],"names":["OperationsFactoryImpl","Operations","OperationsFactory","OperationsFactoryAbstraction"],"mappings":";;AAGA,MAAMA;IACK,SAAS;QACZ,OAAO,IAAIC;IACf;AACJ;AAEO,MAAMC,sCAAoBC,kBAAAA,oBAAiD,CAAC;IAC/E,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,27 @@
1
+ import type { GenericRecord } from "@webiny/api/types.js";
2
+ export interface IInsertOperationParams {
3
+ id: string;
4
+ index: string;
5
+ data: GenericRecord;
6
+ }
7
+ export type IModifyOperationParams = IInsertOperationParams;
8
+ export interface IDeleteOperationParams {
9
+ id: string;
10
+ index: string;
11
+ }
12
+ export interface IOperations {
13
+ items: GenericRecord[];
14
+ total: number;
15
+ count: number;
16
+ clear(): void;
17
+ insert(params: IInsertOperationParams): void;
18
+ modify(params: IModifyOperationParams): void;
19
+ delete(params: IDeleteOperationParams): void;
20
+ }
21
+ export declare const Operations: import("@webiny/di").Abstraction<IOperations>;
22
+ export declare namespace Operations {
23
+ type Interface = IOperations;
24
+ type InsertParams = IInsertOperationParams;
25
+ type ModifyParams = IModifyOperationParams;
26
+ type DeleteParams = IDeleteOperationParams;
27
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const Operations = createAbstraction("Sync/Operations");
3
+ export { Operations };
4
+
5
+ //# sourceMappingURL=Operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/Operations/abstractions/Operations.js","sources":["../../../../src/features/Operations/abstractions/Operations.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\nexport interface IInsertOperationParams {\n id: string;\n index: string;\n data: GenericRecord;\n}\n\nexport type IModifyOperationParams = IInsertOperationParams;\n\nexport interface IDeleteOperationParams {\n id: string;\n index: string;\n}\n\nexport interface IOperations {\n items: GenericRecord[];\n total: number;\n count: number;\n clear(): void;\n insert(params: IInsertOperationParams): void;\n modify(params: IModifyOperationParams): void;\n delete(params: IDeleteOperationParams): void;\n}\n\nexport const Operations = createAbstraction<IOperations>(\"Sync/Operations\");\n\nexport namespace Operations {\n export type Interface = IOperations;\n export type InsertParams = IInsertOperationParams;\n export type ModifyParams = IModifyOperationParams;\n export type DeleteParams = IDeleteOperationParams;\n}\n"],"names":["Operations","createAbstraction"],"mappings":";AA0BO,MAAMA,aAAaC,kBAA+B"}
@@ -0,0 +1,8 @@
1
+ import type { Operations } from "./Operations.js";
2
+ export interface IOperationsFactory {
3
+ create(): Operations.Interface;
4
+ }
5
+ export declare const OperationsFactory: import("@webiny/di").Abstraction<IOperationsFactory>;
6
+ export declare namespace OperationsFactory {
7
+ type Interface = IOperationsFactory;
8
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const OperationsFactory = createAbstraction("Sync/OperationsFactory");
3
+ export { OperationsFactory };
4
+
5
+ //# sourceMappingURL=OperationsFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/Operations/abstractions/OperationsFactory.js","sources":["../../../../src/features/Operations/abstractions/OperationsFactory.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Operations } from \"./Operations.js\";\n\nexport interface IOperationsFactory {\n create(): Operations.Interface;\n}\n\nexport const OperationsFactory = createAbstraction<IOperationsFactory>(\"Sync/OperationsFactory\");\n\nexport namespace OperationsFactory {\n export type Interface = IOperationsFactory;\n}\n"],"names":["OperationsFactory","createAbstraction"],"mappings":";AAOO,MAAMA,oBAAoBC,kBAAsC"}
@@ -0,0 +1,4 @@
1
+ export declare const OperationsFactoryFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { OperationsFactory } from "./OperationsFactory.js";
3
+ const OperationsFactoryFeature = createFeature({
4
+ name: "sync.operationsFactory",
5
+ register (container) {
6
+ container.register(OperationsFactory);
7
+ }
8
+ });
9
+ export { OperationsFactoryFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/Operations/feature.js","sources":["../../../src/features/Operations/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { OperationsFactory } from \"./OperationsFactory.js\";\n\nexport const OperationsFactoryFeature = createFeature({\n name: \"sync.operationsFactory\",\n register(container) {\n container.register(OperationsFactory);\n }\n});\n"],"names":["OperationsFactoryFeature","createFeature","container","OperationsFactory"],"mappings":";;AAGO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,11 @@
1
+ import type { Operations } from "../Operations/abstractions/Operations.js";
2
+ export interface IOperationsBuilderBuildParams<TRecord = unknown> {
3
+ records: TRecord[];
4
+ }
5
+ export interface IOperationsBuilder<TRecord = unknown> {
6
+ build(params: IOperationsBuilderBuildParams<TRecord>): Promise<Operations.Interface>;
7
+ }
8
+ export declare const OperationsBuilder: import("@webiny/di").Abstraction<IOperationsBuilder<unknown>>;
9
+ export declare namespace OperationsBuilder {
10
+ type Interface<TRecord = unknown> = IOperationsBuilder<TRecord>;
11
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const OperationsBuilder = createAbstraction("Sync/OperationsBuilder");
3
+ export { OperationsBuilder };
4
+
5
+ //# sourceMappingURL=abstraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/OperationsBuilder/abstraction.js","sources":["../../../src/features/OperationsBuilder/abstraction.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Operations } from \"../Operations/abstractions/Operations.js\";\n\nexport interface IOperationsBuilderBuildParams<TRecord = unknown> {\n records: TRecord[];\n}\n\nexport interface IOperationsBuilder<TRecord = unknown> {\n build(params: IOperationsBuilderBuildParams<TRecord>): Promise<Operations.Interface>;\n}\n\nexport const OperationsBuilder = createAbstraction<IOperationsBuilder>(\"Sync/OperationsBuilder\");\n\nexport namespace OperationsBuilder {\n export type Interface<TRecord = unknown> = IOperationsBuilder<TRecord>;\n}\n"],"names":["OperationsBuilder","createAbstraction"],"mappings":";AAWO,MAAMA,oBAAoBC,kBAAsC"}
@@ -0,0 +1,20 @@
1
+ import { Operations } from "../Operations/abstractions/Operations.js";
2
+ import { OperationsFactory } from "../Operations/abstractions/OperationsFactory.js";
3
+ import { Timer } from "@webiny/utils/features/Timer/abstraction.js";
4
+ import { ExecuteSyncWithRetry } from "../ExecuteSyncWithRetry/abstraction.js";
5
+ import { SynchronizationBuilder as SynchronizationBuilderAbstraction } from "./abstraction.js";
6
+ declare class SynchronizationBuilderImpl implements SynchronizationBuilderAbstraction.Interface {
7
+ private readonly timer;
8
+ private readonly executeSyncWithRetry;
9
+ private readonly operationsFactory;
10
+ private readonly operations;
11
+ constructor(timer: Timer.Interface, executeSyncWithRetry: ExecuteSyncWithRetry.Interface, operationsFactory: OperationsFactory.Interface);
12
+ insert(params: Operations.InsertParams): void;
13
+ modify(params: Operations.ModifyParams): void;
14
+ delete(params: Operations.DeleteParams): void;
15
+ build(): (params?: Partial<ExecuteSyncWithRetry.Params>) => Promise<void>;
16
+ }
17
+ export declare const SynchronizationBuilder: typeof SynchronizationBuilderImpl & {
18
+ __abstraction: import("@webiny/di").Abstraction<import("./abstraction.js").ISynchronizationBuilder>;
19
+ };
20
+ export {};
@@ -0,0 +1,43 @@
1
+ import { OperationsFactory } from "../Operations/abstractions/OperationsFactory.js";
2
+ import { Timer } from "@webiny/utils/features/Timer/abstraction.js";
3
+ import { ExecuteSyncWithRetry } from "../ExecuteSyncWithRetry/abstraction.js";
4
+ import { SynchronizationBuilder } from "./abstraction.js";
5
+ class SynchronizationBuilderImpl {
6
+ constructor(timer, executeSyncWithRetry, operationsFactory){
7
+ this.timer = timer;
8
+ this.executeSyncWithRetry = executeSyncWithRetry;
9
+ this.operationsFactory = operationsFactory;
10
+ this.operations = this.operationsFactory.create();
11
+ }
12
+ insert(params) {
13
+ this.operations.insert(params);
14
+ }
15
+ modify(params) {
16
+ this.operations.modify(params);
17
+ }
18
+ delete(params) {
19
+ this.operations.delete(params);
20
+ }
21
+ build() {
22
+ return async (params)=>{
23
+ if (0 === this.operations.total) return;
24
+ await this.executeSyncWithRetry.execute({
25
+ ...params,
26
+ maxRunningTime: this.timer.getRemainingSeconds(),
27
+ operations: this.operations
28
+ });
29
+ this.operations.clear();
30
+ };
31
+ }
32
+ }
33
+ const SynchronizationBuilder_SynchronizationBuilder = SynchronizationBuilder.createImplementation({
34
+ implementation: SynchronizationBuilderImpl,
35
+ dependencies: [
36
+ Timer,
37
+ ExecuteSyncWithRetry,
38
+ OperationsFactory
39
+ ]
40
+ });
41
+ export { SynchronizationBuilder_SynchronizationBuilder as SynchronizationBuilder };
42
+
43
+ //# sourceMappingURL=SynchronizationBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/SynchronizationBuilder/SynchronizationBuilder.js","sources":["../../../src/features/SynchronizationBuilder/SynchronizationBuilder.ts"],"sourcesContent":["import { Operations } from \"../Operations/abstractions/Operations.js\";\nimport { OperationsFactory } from \"../Operations/abstractions/OperationsFactory.js\";\nimport { Timer } from \"@webiny/utils/features/Timer/abstraction.js\";\nimport { ExecuteSyncWithRetry } from \"../ExecuteSyncWithRetry/abstraction.js\";\nimport { SynchronizationBuilder as SynchronizationBuilderAbstraction } from \"./abstraction.js\";\n\nclass SynchronizationBuilderImpl implements SynchronizationBuilderAbstraction.Interface {\n private readonly operations: Operations.Interface;\n\n public constructor(\n private readonly timer: Timer.Interface,\n private readonly executeSyncWithRetry: ExecuteSyncWithRetry.Interface,\n private readonly operationsFactory: OperationsFactory.Interface\n ) {\n this.operations = this.operationsFactory.create();\n }\n\n public insert(params: Operations.InsertParams): void {\n this.operations.insert(params);\n }\n\n public modify(params: Operations.ModifyParams): void {\n this.operations.modify(params);\n }\n\n public delete(params: Operations.DeleteParams): void {\n this.operations.delete(params);\n }\n\n public build() {\n return async (params?: Partial<ExecuteSyncWithRetry.Params>) => {\n if (this.operations.total === 0) {\n return;\n }\n await this.executeSyncWithRetry.execute({\n ...params,\n maxRunningTime: this.timer.getRemainingSeconds(),\n operations: this.operations\n });\n this.operations.clear();\n };\n }\n}\n\nexport const SynchronizationBuilder = SynchronizationBuilderAbstraction.createImplementation({\n implementation: SynchronizationBuilderImpl,\n dependencies: [Timer, ExecuteSyncWithRetry, OperationsFactory]\n});\n"],"names":["SynchronizationBuilderImpl","timer","executeSyncWithRetry","operationsFactory","params","SynchronizationBuilder","SynchronizationBuilderAbstraction","Timer","ExecuteSyncWithRetry","OperationsFactory"],"mappings":";;;;AAMA,MAAMA;IAGF,YACqBC,KAAsB,EACtBC,oBAAoD,EACpDC,iBAA8C,CACjE;aAHmBF,KAAK,GAALA;aACAC,oBAAoB,GAApBA;aACAC,iBAAiB,GAAjBA;QAEjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM;IACnD;IAEO,OAAOC,MAA+B,EAAQ;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA;IAC3B;IAEO,OAAOA,MAA+B,EAAQ;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA;IAC3B;IAEO,OAAOA,MAA+B,EAAQ;QACjD,IAAI,CAAC,UAAU,CAAC,MAAM,CAACA;IAC3B;IAEO,QAAQ;QACX,OAAO,OAAOA;YACV,IAAI,AAA0B,MAA1B,IAAI,CAAC,UAAU,CAAC,KAAK,EACrB;YAEJ,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACpC,GAAGA,MAAM;gBACT,gBAAgB,IAAI,CAAC,KAAK,CAAC,mBAAmB;gBAC9C,YAAY,IAAI,CAAC,UAAU;YAC/B;YACA,IAAI,CAAC,UAAU,CAAC,KAAK;QACzB;IACJ;AACJ;AAEO,MAAMC,gDAAyBC,uBAAAA,oBAAsD,CAAC;IACzF,gBAAgBN;IAChB,cAAc;QAACO;QAAOC;QAAsBC;KAAkB;AAClE"}
@@ -0,0 +1,12 @@
1
+ import type { Operations } from "../Operations/abstractions/Operations.js";
2
+ import type { ExecuteSyncWithRetry } from "../ExecuteSyncWithRetry/abstraction.js";
3
+ export interface ISynchronizationBuilder {
4
+ insert(params: Operations.InsertParams): void;
5
+ modify(params: Operations.ModifyParams): void;
6
+ delete(params: Operations.DeleteParams): void;
7
+ build(): (params?: Partial<ExecuteSyncWithRetry.Params>) => Promise<void>;
8
+ }
9
+ export declare const SynchronizationBuilder: import("@webiny/di").Abstraction<ISynchronizationBuilder>;
10
+ export declare namespace SynchronizationBuilder {
11
+ type Interface = ISynchronizationBuilder;
12
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const SynchronizationBuilder = createAbstraction("Sync/SynchronizationBuilder");
3
+ export { SynchronizationBuilder };
4
+
5
+ //# sourceMappingURL=abstraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/SynchronizationBuilder/abstraction.js","sources":["../../../src/features/SynchronizationBuilder/abstraction.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Operations } from \"../Operations/abstractions/Operations.js\";\nimport type { ExecuteSyncWithRetry } from \"../ExecuteSyncWithRetry/abstraction.js\";\n\nexport interface ISynchronizationBuilder {\n insert(params: Operations.InsertParams): void;\n modify(params: Operations.ModifyParams): void;\n delete(params: Operations.DeleteParams): void;\n build(): (params?: Partial<ExecuteSyncWithRetry.Params>) => Promise<void>;\n}\n\nexport const SynchronizationBuilder = createAbstraction<ISynchronizationBuilder>(\n \"Sync/SynchronizationBuilder\"\n);\n\nexport namespace SynchronizationBuilder {\n export type Interface = ISynchronizationBuilder;\n}\n"],"names":["SynchronizationBuilder","createAbstraction"],"mappings":";AAWO,MAAMA,yBAAyBC,kBAClC"}
@@ -0,0 +1,4 @@
1
+ export declare const SynchronizationBuilderFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { SynchronizationBuilder } from "./SynchronizationBuilder.js";
3
+ const SynchronizationBuilderFeature = createFeature({
4
+ name: "sync.synchronizationBuilder",
5
+ register (container) {
6
+ container.register(SynchronizationBuilder);
7
+ }
8
+ });
9
+ export { SynchronizationBuilderFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/SynchronizationBuilder/feature.js","sources":["../../../src/features/SynchronizationBuilder/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { SynchronizationBuilder } from \"./SynchronizationBuilder.js\";\n\nexport const SynchronizationBuilderFeature = createFeature({\n name: \"sync.synchronizationBuilder\",\n register(container) {\n container.register(SynchronizationBuilder);\n }\n});\n"],"names":["SynchronizationBuilderFeature","createFeature","container","SynchronizationBuilder"],"mappings":";;AAGO,MAAMA,gCAAgCC,cAAc;IACvD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
package/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export { Operations } from "./features/Operations/abstractions/Operations.js";
2
+ export { OperationType } from "./features/Operations/Operations.js";
3
+ export { OperationsFactory } from "./features/Operations/abstractions/OperationsFactory.js";
4
+ export { OperationsFactoryFeature } from "./features/Operations/feature.js";
5
+ export { OperationsBuilder } from "./features/OperationsBuilder/abstraction.js";
6
+ export { ExecuteSync } from "./features/ExecuteSync/abstraction.js";
7
+ export { ExecuteSyncFeature } from "./features/ExecuteSync/feature.js";
8
+ export { ExecuteSyncWithRetry } from "./features/ExecuteSyncWithRetry/abstraction.js";
9
+ export { ExecuteSyncWithRetryFeature } from "./features/ExecuteSyncWithRetry/feature.js";
10
+ export { SynchronizationBuilder } from "./features/SynchronizationBuilder/abstraction.js";
11
+ export { SynchronizationBuilderFeature } from "./features/SynchronizationBuilder/feature.js";
12
+ export { NotEnoughRemainingTimeError } from "./NotEnoughRemainingTimeError.js";
package/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { Operations } from "./features/Operations/abstractions/Operations.js";
2
+ export { OperationType } from "./features/Operations/Operations.js";
3
+ export { OperationsFactory } from "./features/Operations/abstractions/OperationsFactory.js";
4
+ export { OperationsFactoryFeature } from "./features/Operations/feature.js";
5
+ export { OperationsBuilder } from "./features/OperationsBuilder/abstraction.js";
6
+ export { ExecuteSync } from "./features/ExecuteSync/abstraction.js";
7
+ export { ExecuteSyncFeature } from "./features/ExecuteSync/feature.js";
8
+ export { ExecuteSyncWithRetry } from "./features/ExecuteSyncWithRetry/abstraction.js";
9
+ export { ExecuteSyncWithRetryFeature } from "./features/ExecuteSyncWithRetry/feature.js";
10
+ export { SynchronizationBuilder } from "./features/SynchronizationBuilder/abstraction.js";
11
+ export { SynchronizationBuilderFeature } from "./features/SynchronizationBuilder/feature.js";
12
+ export { NotEnoughRemainingTimeError } from "./NotEnoughRemainingTimeError.js";
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@webiny/api-sync-to-opensearch",
3
+ "version": "0.0.0-unstable.0d717d18dd",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/webiny/webiny-js.git",
12
+ "directory": "packages/api-sync-to-opensearch"
13
+ },
14
+ "description": "Platform-agnostic OpenSearch synchronization with DI abstractions.",
15
+ "license": "MIT",
16
+ "author": "Webiny Ltd.",
17
+ "dependencies": {
18
+ "@webiny/api": "0.0.0-unstable.0d717d18dd",
19
+ "@webiny/api-opensearch": "0.0.0-unstable.0d717d18dd",
20
+ "@webiny/error": "0.0.0-unstable.0d717d18dd",
21
+ "@webiny/feature": "0.0.0-unstable.0d717d18dd",
22
+ "@webiny/stdlib": "0.0.15",
23
+ "@webiny/utils": "0.0.0-unstable.0d717d18dd",
24
+ "p-retry": "8.0.0"
25
+ },
26
+ "devDependencies": {
27
+ "@webiny/build-tools": "0.0.0-unstable.0d717d18dd",
28
+ "@webiny/plugins": "0.0.0-unstable.0d717d18dd",
29
+ "typescript": "7.0.2"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "adio": {
35
+ "ignoreDirs": [
36
+ "__tests__"
37
+ ]
38
+ },
39
+ "webiny": {
40
+ "publishFrom": "dist"
41
+ }
42
+ }