@webiny/api-opensearch 6.5.0-beta.4 → 6.5.0-beta.6
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/features/OpenSearchQueryBuilderOperator/operators/Between.js +1 -1
- package/features/OpenSearchQueryBuilderOperator/operators/Between.js.map +1 -1
- package/features/OpenSearchQueryBuilderOperator/operators/NotBetween.js +1 -1
- package/features/OpenSearchQueryBuilderOperator/operators/NotBetween.js.map +1 -1
- package/package.json +12 -12
- package/utils/waitUntilHealthy/WaitUntilHealthy.js +1 -2
- package/utils/waitUntilHealthy/WaitUntilHealthy.js.map +1 -1
|
@@ -6,7 +6,7 @@ class BetweenImpl {
|
|
|
6
6
|
apply(query, params) {
|
|
7
7
|
const { value, basePath, name } = params;
|
|
8
8
|
if (false === Array.isArray(value)) throw new Error(`You cannot filter field path "${name}" with between query and not send an array of values.`);
|
|
9
|
-
if (2 !== value.length) throw new Error(`You must pass 2 values in the array for field path "${name}" filtering.`);
|
|
9
|
+
else if (2 !== value.length) throw new Error(`You must pass 2 values in the array for field path "${name}" filtering.`);
|
|
10
10
|
const [gte, lte] = value;
|
|
11
11
|
query.filter.push({
|
|
12
12
|
range: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/OpenSearchQueryBuilderOperator/operators/Between.js","sources":["../../../../src/features/OpenSearchQueryBuilderOperator/operators/Between.ts"],"sourcesContent":["import { OpenSearchQueryBuilderOperator } from \"../abstractions/OpenSearchQueryBuilderOperator.js\";\n\nclass BetweenImpl implements OpenSearchQueryBuilderOperator.Interface {\n public getOperator(): string {\n return \"between\";\n }\n\n public apply(\n query: OpenSearchQueryBuilderOperator.Query,\n params: OpenSearchQueryBuilderOperator.Params\n ): void {\n const { value, basePath, name } = params;\n if (Array.isArray(value) === false) {\n throw new Error(\n `You cannot filter field path \"${name}\" with between query and not send an array of values.`\n );\n } else if (value.length !== 2) {\n throw new Error(\n `You must pass 2 values in the array for field path \"${name}\" filtering.`\n );\n }\n const [gte, lte] = value;\n query.filter.push({\n range: {\n [basePath]: {\n lte,\n gte\n }\n }\n });\n }\n}\n\nexport const Between = OpenSearchQueryBuilderOperator.createImplementation({\n implementation: BetweenImpl,\n dependencies: []\n});\n"],"names":["BetweenImpl","query","params","value","basePath","name","Array","Error","gte","lte","Between","OpenSearchQueryBuilderOperator"],"mappings":";AAEA,MAAMA;IACK,cAAsB;QACzB,OAAO;IACX;IAEO,MACHC,KAA2C,EAC3CC,MAA6C,EACzC;QACJ,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGH;QAClC,IAAII,AAAyB,UAAzBA,MAAM,OAAO,CAACH,QACd,MAAM,IAAII,MACN,CAAC,8BAA8B,EAAEF,KAAK,qDAAqD,CAAC;
|
|
1
|
+
{"version":3,"file":"features/OpenSearchQueryBuilderOperator/operators/Between.js","sources":["../../../../src/features/OpenSearchQueryBuilderOperator/operators/Between.ts"],"sourcesContent":["import { OpenSearchQueryBuilderOperator } from \"../abstractions/OpenSearchQueryBuilderOperator.js\";\n\nclass BetweenImpl implements OpenSearchQueryBuilderOperator.Interface {\n public getOperator(): string {\n return \"between\";\n }\n\n public apply(\n query: OpenSearchQueryBuilderOperator.Query,\n params: OpenSearchQueryBuilderOperator.Params\n ): void {\n const { value, basePath, name } = params;\n if (Array.isArray(value) === false) {\n throw new Error(\n `You cannot filter field path \"${name}\" with between query and not send an array of values.`\n );\n } else if (value.length !== 2) {\n throw new Error(\n `You must pass 2 values in the array for field path \"${name}\" filtering.`\n );\n }\n const [gte, lte] = value;\n query.filter.push({\n range: {\n [basePath]: {\n lte,\n gte\n }\n }\n });\n }\n}\n\nexport const Between = OpenSearchQueryBuilderOperator.createImplementation({\n implementation: BetweenImpl,\n dependencies: []\n});\n"],"names":["BetweenImpl","query","params","value","basePath","name","Array","Error","gte","lte","Between","OpenSearchQueryBuilderOperator"],"mappings":";AAEA,MAAMA;IACK,cAAsB;QACzB,OAAO;IACX;IAEO,MACHC,KAA2C,EAC3CC,MAA6C,EACzC;QACJ,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGH;QAClC,IAAII,AAAyB,UAAzBA,MAAM,OAAO,CAACH,QACd,MAAM,IAAII,MACN,CAAC,8BAA8B,EAAEF,KAAK,qDAAqD,CAAC;aAE7F,IAAIF,AAAiB,MAAjBA,MAAM,MAAM,EACnB,MAAM,IAAII,MACN,CAAC,oDAAoD,EAAEF,KAAK,YAAY,CAAC;QAGjF,MAAM,CAACG,KAAKC,IAAI,GAAGN;QACnBF,MAAM,MAAM,CAAC,IAAI,CAAC;YACd,OAAO;gBACH,CAACG,SAAS,EAAE;oBACRK;oBACAD;gBACJ;YACJ;QACJ;IACJ;AACJ;AAEO,MAAME,UAAUC,+BAA+B,oBAAoB,CAAC;IACvE,gBAAgBX;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -6,7 +6,7 @@ class NotBetweenImpl {
|
|
|
6
6
|
apply(query, params) {
|
|
7
7
|
const { value, basePath, name } = params;
|
|
8
8
|
if (false === Array.isArray(value)) throw new Error(`You cannot filter field path "${name}" with "not_between" query and not send an array of values.`);
|
|
9
|
-
if (2 !== value.length) throw new Error(`You must pass 2 values in the array for field path "${name}" filtering.`);
|
|
9
|
+
else if (2 !== value.length) throw new Error(`You must pass 2 values in the array for field path "${name}" filtering.`);
|
|
10
10
|
const [gte, lte] = value;
|
|
11
11
|
query.must_not.push({
|
|
12
12
|
range: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/OpenSearchQueryBuilderOperator/operators/NotBetween.js","sources":["../../../../src/features/OpenSearchQueryBuilderOperator/operators/NotBetween.ts"],"sourcesContent":["import { OpenSearchQueryBuilderOperator } from \"../abstractions/OpenSearchQueryBuilderOperator.js\";\n\nclass NotBetweenImpl implements OpenSearchQueryBuilderOperator.Interface {\n public getOperator(): string {\n return \"not_between\";\n }\n\n public apply(\n query: OpenSearchQueryBuilderOperator.Query,\n params: OpenSearchQueryBuilderOperator.Params\n ): void {\n const { value, basePath, name } = params;\n if (Array.isArray(value) === false) {\n throw new Error(\n `You cannot filter field path \"${name}\" with \"not_between\" query and not send an array of values.`\n );\n } else if (value.length !== 2) {\n throw new Error(\n `You must pass 2 values in the array for field path \"${name}\" filtering.`\n );\n }\n const [gte, lte] = value;\n query.must_not.push({\n range: {\n [basePath]: {\n lte,\n gte\n }\n }\n });\n }\n}\n\nexport const NotBetween = OpenSearchQueryBuilderOperator.createImplementation({\n implementation: NotBetweenImpl,\n dependencies: []\n});\n"],"names":["NotBetweenImpl","query","params","value","basePath","name","Array","Error","gte","lte","NotBetween","OpenSearchQueryBuilderOperator"],"mappings":";AAEA,MAAMA;IACK,cAAsB;QACzB,OAAO;IACX;IAEO,MACHC,KAA2C,EAC3CC,MAA6C,EACzC;QACJ,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGH;QAClC,IAAII,AAAyB,UAAzBA,MAAM,OAAO,CAACH,QACd,MAAM,IAAII,MACN,CAAC,8BAA8B,EAAEF,KAAK,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"features/OpenSearchQueryBuilderOperator/operators/NotBetween.js","sources":["../../../../src/features/OpenSearchQueryBuilderOperator/operators/NotBetween.ts"],"sourcesContent":["import { OpenSearchQueryBuilderOperator } from \"../abstractions/OpenSearchQueryBuilderOperator.js\";\n\nclass NotBetweenImpl implements OpenSearchQueryBuilderOperator.Interface {\n public getOperator(): string {\n return \"not_between\";\n }\n\n public apply(\n query: OpenSearchQueryBuilderOperator.Query,\n params: OpenSearchQueryBuilderOperator.Params\n ): void {\n const { value, basePath, name } = params;\n if (Array.isArray(value) === false) {\n throw new Error(\n `You cannot filter field path \"${name}\" with \"not_between\" query and not send an array of values.`\n );\n } else if (value.length !== 2) {\n throw new Error(\n `You must pass 2 values in the array for field path \"${name}\" filtering.`\n );\n }\n const [gte, lte] = value;\n query.must_not.push({\n range: {\n [basePath]: {\n lte,\n gte\n }\n }\n });\n }\n}\n\nexport const NotBetween = OpenSearchQueryBuilderOperator.createImplementation({\n implementation: NotBetweenImpl,\n dependencies: []\n});\n"],"names":["NotBetweenImpl","query","params","value","basePath","name","Array","Error","gte","lte","NotBetween","OpenSearchQueryBuilderOperator"],"mappings":";AAEA,MAAMA;IACK,cAAsB;QACzB,OAAO;IACX;IAEO,MACHC,KAA2C,EAC3CC,MAA6C,EACzC;QACJ,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,IAAI,EAAE,GAAGH;QAClC,IAAII,AAAyB,UAAzBA,MAAM,OAAO,CAACH,QACd,MAAM,IAAII,MACN,CAAC,8BAA8B,EAAEF,KAAK,2DAA2D,CAAC;aAEnG,IAAIF,AAAiB,MAAjBA,MAAM,MAAM,EACnB,MAAM,IAAII,MACN,CAAC,oDAAoD,EAAEF,KAAK,YAAY,CAAC;QAGjF,MAAM,CAACG,KAAKC,IAAI,GAAGN;QACnBF,MAAM,QAAQ,CAAC,IAAI,CAAC;YAChB,OAAO;gBACH,CAACG,SAAS,EAAE;oBACRK;oBACAD;gBACJ;YACJ;QACJ;IACJ;AACJ;AAEO,MAAME,aAAaC,+BAA+B,oBAAoB,CAAC;IAC1E,gBAAgBX;IAChB,cAAc,EAAE;AACpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-opensearch",
|
|
3
|
-
"version": "6.5.0-beta.
|
|
3
|
+
"version": "6.5.0-beta.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -17,21 +17,21 @@
|
|
|
17
17
|
],
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@opensearch-project/opensearch": "3.
|
|
21
|
-
"@webiny/api": "6.5.0-beta.
|
|
22
|
-
"@webiny/aws-sdk": "6.5.0-beta.
|
|
23
|
-
"@webiny/db-dynamodb": "6.5.0-beta.
|
|
24
|
-
"@webiny/error": "6.5.0-beta.
|
|
25
|
-
"@webiny/feature": "6.5.0-beta.
|
|
26
|
-
"@webiny/handler": "6.5.0-beta.
|
|
20
|
+
"@opensearch-project/opensearch": "3.9.0",
|
|
21
|
+
"@webiny/api": "6.5.0-beta.6",
|
|
22
|
+
"@webiny/aws-sdk": "6.5.0-beta.6",
|
|
23
|
+
"@webiny/db-dynamodb": "6.5.0-beta.6",
|
|
24
|
+
"@webiny/error": "6.5.0-beta.6",
|
|
25
|
+
"@webiny/feature": "6.5.0-beta.6",
|
|
26
|
+
"@webiny/handler": "6.5.0-beta.6"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@webiny/build-tools": "6.5.0-beta.
|
|
30
|
-
"@webiny/di": "1.0
|
|
31
|
-
"@webiny/project-utils": "6.5.0-beta.
|
|
29
|
+
"@webiny/build-tools": "6.5.0-beta.6",
|
|
30
|
+
"@webiny/di": "1.1.0",
|
|
31
|
+
"@webiny/project-utils": "6.5.0-beta.6",
|
|
32
32
|
"rimraf": "6.1.3",
|
|
33
33
|
"typescript": "7.0.2",
|
|
34
|
-
"vitest": "
|
|
34
|
+
"vitest": "5.0.2"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
|
@@ -33,8 +33,7 @@ class WaitUntilHealthy {
|
|
|
33
33
|
runs
|
|
34
34
|
});
|
|
35
35
|
throw new UnhealthyClusterError(this.options.maxWaitingTime);
|
|
36
|
-
}
|
|
37
|
-
if (options?.onUnhealthy) await options.onUnhealthy({
|
|
36
|
+
} else if (options?.onUnhealthy) await options.onUnhealthy({
|
|
38
37
|
startedAt,
|
|
39
38
|
mustEndAt,
|
|
40
39
|
waitingTimeStep,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils/waitUntilHealthy/WaitUntilHealthy.js","sources":["../../../src/utils/waitUntilHealthy/WaitUntilHealthy.ts"],"sourcesContent":["import type { Client } from \"~/client.js\";\nimport { OpenSearchCatHealth } from \"~/operations/OpenSearchCatHealth.js\";\nimport { OpenSearchCatNodes } from \"~/operations/OpenSearchCatNodes.js\";\nimport type {\n IOpenSearchCatHealthResponse,\n IOpenSearchCatNodesResponse\n} from \"~/operations/types.js\";\nimport { OpenSearchCatClusterHealthStatus } from \"~/operations/types.js\";\nimport { UnhealthyClusterError } from \"~/utils/waitUntilHealthy/UnhealthyClusterError.js\";\nimport type { ClusterHealthReason, MemoryReason, ProcessorReason } from \"./reason/index.js\";\nimport {\n createClusterHealthStatusReason,\n createMemoryReason,\n createProcessorReason\n} from \"./reason/index.js\";\nimport { WaitingHealthyClusterAbortedError } from \"./WaitingHealthyClusterAbortedError.js\";\n\nconst WAITING_TIME_STEP = 10;\n\nexport type WaitingReason = ProcessorReason | MemoryReason | ClusterHealthReason;\n\nexport interface IWaitUntilHealthyParams {\n /**\n * Minimum status allowed, otherwise the cluster is considered unhealthy.\n */\n minClusterHealthStatus:\n | OpenSearchCatClusterHealthStatus.Green\n | OpenSearchCatClusterHealthStatus.Yellow;\n /**\n * Maximum processor percent allowed, otherwise the cluster is considered unhealthy.\n */\n maxProcessorPercent: number;\n /**\n * Maximum RAM percent allowed, otherwise the cluster is considered unhealthy.\n */\n maxRamPercent?: number;\n /**\n * Maximum time to wait in seconds.\n * This is to prevent infinite waiting in case the cluster never becomes healthy.\n */\n maxWaitingTime: number;\n /**\n * Time in seconds to wait between each check.\n * This is to prevent spamming the cluster with requests.\n * Default is WAITING_TIME_STEP seconds.\n */\n waitingTimeStep?: number;\n}\n\nexport interface IWaitOptionsOnUnhealthyParams {\n startedAt: Date;\n mustEndAt: Date;\n waitingTimeStep: number;\n runs: number;\n waitingReason: WaitingReason;\n}\n\nexport interface IWaitOptionsOnTimeoutParams {\n startedAt: Date;\n mustEndAt: Date;\n waitingTimeStep: number;\n runs: number;\n waitingReason: WaitingReason;\n}\n\nexport interface IWaitOptions {\n onUnhealthy?(params: IWaitOptionsOnUnhealthyParams): Promise<void>;\n onTimeout?(params: IWaitOptionsOnTimeoutParams): Promise<void>;\n}\n\nexport interface IWaitUntilHealthyWaitResponse {\n runningTime: number;\n runs: number;\n}\n\nclass WaitUntilHealthy {\n private readonly client: Client;\n private readonly options: IWaitUntilHealthyParams;\n\n private readonly catHealth: OpenSearchCatHealth;\n private readonly catNodes: OpenSearchCatNodes;\n\n private aborted = false;\n\n public constructor(client: Client, options: IWaitUntilHealthyParams) {\n this.client = client;\n this.options = options;\n\n this.catHealth = new OpenSearchCatHealth(this.client);\n this.catNodes = new OpenSearchCatNodes(this.client);\n }\n\n public abort(): void {\n this.aborted = true;\n }\n /**\n * @throws UnhealthyClusterError\n * @throws WaitingHealthyClusterAbortedError\n */\n public async wait(options?: IWaitOptions): Promise<IWaitUntilHealthyWaitResponse> {\n if (this.aborted) {\n throw new WaitingHealthyClusterAbortedError(\n `Waiting for the cluster to become healthy was aborted even before it started.`\n );\n }\n const startedAt = new Date();\n const mustEndAt = new Date(startedAt.getTime() + this.options.maxWaitingTime * 1000);\n const waitingTimeStep = this.options.waitingTimeStep || WAITING_TIME_STEP;\n let runs = 1;\n let waitingReason: WaitingReason | false;\n while ((waitingReason = await this.shouldWait())) {\n if (new Date() >= mustEndAt) {\n if (options?.onTimeout) {\n await options.onTimeout({\n startedAt,\n mustEndAt,\n waitingTimeStep,\n waitingReason,\n runs\n });\n }\n throw new UnhealthyClusterError(this.options.maxWaitingTime);\n } else if (options?.onUnhealthy) {\n await options.onUnhealthy({\n startedAt,\n mustEndAt,\n waitingTimeStep,\n waitingReason,\n runs\n });\n }\n /**\n * Abort check is separated from other IFs because it can be aborted in onUnhealthy callback.\n */\n if (this.aborted) {\n throw new WaitingHealthyClusterAbortedError();\n }\n runs++;\n await new Promise(resolve => {\n setTimeout(resolve, waitingTimeStep * 1000);\n });\n }\n\n const runningTime = new Date().getTime() - startedAt.getTime();\n\n return {\n runningTime,\n runs\n };\n }\n\n private async shouldWait(): Promise<WaitingReason | false> {\n let health: IOpenSearchCatHealthResponse;\n let nodes: IOpenSearchCatNodesResponse;\n try {\n health = await this.catHealth.getHealth();\n } catch (ex) {\n return createClusterHealthStatusReason({\n description: ex.message,\n minimum: this.options.minClusterHealthStatus,\n current: OpenSearchCatClusterHealthStatus.Red\n });\n }\n try {\n nodes = await this.catNodes.getNodes();\n } catch (ex) {\n return createClusterHealthStatusReason({\n description: ex.message,\n minimum: this.options.minClusterHealthStatus,\n current: OpenSearchCatClusterHealthStatus.Red\n });\n }\n\n const currentStatus = this.toClusterHealthStatus(health.status);\n const clusterHealthStatus = this.transformClusterHealthStatus(currentStatus);\n const minClusterHealthStatus = this.transformClusterHealthStatus(\n this.options.minClusterHealthStatus\n );\n if (clusterHealthStatus > minClusterHealthStatus) {\n return createClusterHealthStatusReason({\n minimum: this.options.minClusterHealthStatus,\n current: currentStatus\n });\n }\n\n const processorPercent = this.getProcessorPercent(nodes);\n if (processorPercent > this.options.maxProcessorPercent) {\n return createProcessorReason({\n maximum: this.options.maxProcessorPercent,\n current: processorPercent\n });\n }\n /**\n * Possibly no max ram definition?\n */\n if (this.options.maxRamPercent === undefined) {\n return false;\n }\n\n const ramPercent = this.getRamPercent(nodes);\n if (ramPercent > this.options.maxRamPercent) {\n return createMemoryReason({\n maximum: this.options.maxRamPercent,\n current: ramPercent\n });\n }\n return false;\n }\n\n private getProcessorPercent(nodes: IOpenSearchCatNodesResponse): number {\n const total = nodes.reduce<number>((total, node) => {\n return total + parseFloat(node.cpu || \"0\");\n }, 0);\n return total / nodes.length;\n }\n\n private getRamPercent(nodes: IOpenSearchCatNodesResponse): number {\n const total = nodes.reduce<number>((total, node) => {\n return total + parseFloat(node[\"ram.percent\"] || \"0\");\n }, 0);\n return total / nodes.length;\n }\n\n private toClusterHealthStatus(status?: string): OpenSearchCatClusterHealthStatus {\n switch (status) {\n case \"green\":\n return OpenSearchCatClusterHealthStatus.Green;\n case \"yellow\":\n return OpenSearchCatClusterHealthStatus.Yellow;\n default:\n return OpenSearchCatClusterHealthStatus.Red;\n }\n }\n\n private transformClusterHealthStatus(status: OpenSearchCatClusterHealthStatus): number {\n switch (status) {\n case OpenSearchCatClusterHealthStatus.Green:\n return 1;\n case OpenSearchCatClusterHealthStatus.Yellow:\n return 2;\n case OpenSearchCatClusterHealthStatus.Red:\n return 3;\n default:\n return 99;\n }\n }\n}\n\nexport type { WaitUntilHealthy };\n\nexport const createWaitUntilHealthy = (\n client: Client,\n params: IWaitUntilHealthyParams\n): WaitUntilHealthy => {\n return new WaitUntilHealthy(client, params);\n};\n"],"names":["WAITING_TIME_STEP","WaitUntilHealthy","client","options","OpenSearchCatHealth","OpenSearchCatNodes","WaitingHealthyClusterAbortedError","startedAt","Date","mustEndAt","waitingTimeStep","runs","waitingReason","UnhealthyClusterError","Promise","resolve","setTimeout","runningTime","health","nodes","ex","createClusterHealthStatusReason","OpenSearchCatClusterHealthStatus","currentStatus","clusterHealthStatus","minClusterHealthStatus","processorPercent","createProcessorReason","undefined","ramPercent","createMemoryReason","total","node","parseFloat","status","createWaitUntilHealthy","params"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils/waitUntilHealthy/WaitUntilHealthy.js","sources":["../../../src/utils/waitUntilHealthy/WaitUntilHealthy.ts"],"sourcesContent":["import type { Client } from \"~/client.js\";\nimport { OpenSearchCatHealth } from \"~/operations/OpenSearchCatHealth.js\";\nimport { OpenSearchCatNodes } from \"~/operations/OpenSearchCatNodes.js\";\nimport type {\n IOpenSearchCatHealthResponse,\n IOpenSearchCatNodesResponse\n} from \"~/operations/types.js\";\nimport { OpenSearchCatClusterHealthStatus } from \"~/operations/types.js\";\nimport { UnhealthyClusterError } from \"~/utils/waitUntilHealthy/UnhealthyClusterError.js\";\nimport type { ClusterHealthReason, MemoryReason, ProcessorReason } from \"./reason/index.js\";\nimport {\n createClusterHealthStatusReason,\n createMemoryReason,\n createProcessorReason\n} from \"./reason/index.js\";\nimport { WaitingHealthyClusterAbortedError } from \"./WaitingHealthyClusterAbortedError.js\";\n\nconst WAITING_TIME_STEP = 10;\n\nexport type WaitingReason = ProcessorReason | MemoryReason | ClusterHealthReason;\n\nexport interface IWaitUntilHealthyParams {\n /**\n * Minimum status allowed, otherwise the cluster is considered unhealthy.\n */\n minClusterHealthStatus:\n | OpenSearchCatClusterHealthStatus.Green\n | OpenSearchCatClusterHealthStatus.Yellow;\n /**\n * Maximum processor percent allowed, otherwise the cluster is considered unhealthy.\n */\n maxProcessorPercent: number;\n /**\n * Maximum RAM percent allowed, otherwise the cluster is considered unhealthy.\n */\n maxRamPercent?: number;\n /**\n * Maximum time to wait in seconds.\n * This is to prevent infinite waiting in case the cluster never becomes healthy.\n */\n maxWaitingTime: number;\n /**\n * Time in seconds to wait between each check.\n * This is to prevent spamming the cluster with requests.\n * Default is WAITING_TIME_STEP seconds.\n */\n waitingTimeStep?: number;\n}\n\nexport interface IWaitOptionsOnUnhealthyParams {\n startedAt: Date;\n mustEndAt: Date;\n waitingTimeStep: number;\n runs: number;\n waitingReason: WaitingReason;\n}\n\nexport interface IWaitOptionsOnTimeoutParams {\n startedAt: Date;\n mustEndAt: Date;\n waitingTimeStep: number;\n runs: number;\n waitingReason: WaitingReason;\n}\n\nexport interface IWaitOptions {\n onUnhealthy?(params: IWaitOptionsOnUnhealthyParams): Promise<void>;\n onTimeout?(params: IWaitOptionsOnTimeoutParams): Promise<void>;\n}\n\nexport interface IWaitUntilHealthyWaitResponse {\n runningTime: number;\n runs: number;\n}\n\nclass WaitUntilHealthy {\n private readonly client: Client;\n private readonly options: IWaitUntilHealthyParams;\n\n private readonly catHealth: OpenSearchCatHealth;\n private readonly catNodes: OpenSearchCatNodes;\n\n private aborted = false;\n\n public constructor(client: Client, options: IWaitUntilHealthyParams) {\n this.client = client;\n this.options = options;\n\n this.catHealth = new OpenSearchCatHealth(this.client);\n this.catNodes = new OpenSearchCatNodes(this.client);\n }\n\n public abort(): void {\n this.aborted = true;\n }\n /**\n * @throws UnhealthyClusterError\n * @throws WaitingHealthyClusterAbortedError\n */\n public async wait(options?: IWaitOptions): Promise<IWaitUntilHealthyWaitResponse> {\n if (this.aborted) {\n throw new WaitingHealthyClusterAbortedError(\n `Waiting for the cluster to become healthy was aborted even before it started.`\n );\n }\n const startedAt = new Date();\n const mustEndAt = new Date(startedAt.getTime() + this.options.maxWaitingTime * 1000);\n const waitingTimeStep = this.options.waitingTimeStep || WAITING_TIME_STEP;\n let runs = 1;\n let waitingReason: WaitingReason | false;\n while ((waitingReason = await this.shouldWait())) {\n if (new Date() >= mustEndAt) {\n if (options?.onTimeout) {\n await options.onTimeout({\n startedAt,\n mustEndAt,\n waitingTimeStep,\n waitingReason,\n runs\n });\n }\n throw new UnhealthyClusterError(this.options.maxWaitingTime);\n } else if (options?.onUnhealthy) {\n await options.onUnhealthy({\n startedAt,\n mustEndAt,\n waitingTimeStep,\n waitingReason,\n runs\n });\n }\n /**\n * Abort check is separated from other IFs because it can be aborted in onUnhealthy callback.\n */\n if (this.aborted) {\n throw new WaitingHealthyClusterAbortedError();\n }\n runs++;\n await new Promise(resolve => {\n setTimeout(resolve, waitingTimeStep * 1000);\n });\n }\n\n const runningTime = new Date().getTime() - startedAt.getTime();\n\n return {\n runningTime,\n runs\n };\n }\n\n private async shouldWait(): Promise<WaitingReason | false> {\n let health: IOpenSearchCatHealthResponse;\n let nodes: IOpenSearchCatNodesResponse;\n try {\n health = await this.catHealth.getHealth();\n } catch (ex) {\n return createClusterHealthStatusReason({\n description: ex.message,\n minimum: this.options.minClusterHealthStatus,\n current: OpenSearchCatClusterHealthStatus.Red\n });\n }\n try {\n nodes = await this.catNodes.getNodes();\n } catch (ex) {\n return createClusterHealthStatusReason({\n description: ex.message,\n minimum: this.options.minClusterHealthStatus,\n current: OpenSearchCatClusterHealthStatus.Red\n });\n }\n\n const currentStatus = this.toClusterHealthStatus(health.status);\n const clusterHealthStatus = this.transformClusterHealthStatus(currentStatus);\n const minClusterHealthStatus = this.transformClusterHealthStatus(\n this.options.minClusterHealthStatus\n );\n if (clusterHealthStatus > minClusterHealthStatus) {\n return createClusterHealthStatusReason({\n minimum: this.options.minClusterHealthStatus,\n current: currentStatus\n });\n }\n\n const processorPercent = this.getProcessorPercent(nodes);\n if (processorPercent > this.options.maxProcessorPercent) {\n return createProcessorReason({\n maximum: this.options.maxProcessorPercent,\n current: processorPercent\n });\n }\n /**\n * Possibly no max ram definition?\n */\n if (this.options.maxRamPercent === undefined) {\n return false;\n }\n\n const ramPercent = this.getRamPercent(nodes);\n if (ramPercent > this.options.maxRamPercent) {\n return createMemoryReason({\n maximum: this.options.maxRamPercent,\n current: ramPercent\n });\n }\n return false;\n }\n\n private getProcessorPercent(nodes: IOpenSearchCatNodesResponse): number {\n const total = nodes.reduce<number>((total, node) => {\n return total + parseFloat(node.cpu || \"0\");\n }, 0);\n return total / nodes.length;\n }\n\n private getRamPercent(nodes: IOpenSearchCatNodesResponse): number {\n const total = nodes.reduce<number>((total, node) => {\n return total + parseFloat(node[\"ram.percent\"] || \"0\");\n }, 0);\n return total / nodes.length;\n }\n\n private toClusterHealthStatus(status?: string): OpenSearchCatClusterHealthStatus {\n switch (status) {\n case \"green\":\n return OpenSearchCatClusterHealthStatus.Green;\n case \"yellow\":\n return OpenSearchCatClusterHealthStatus.Yellow;\n default:\n return OpenSearchCatClusterHealthStatus.Red;\n }\n }\n\n private transformClusterHealthStatus(status: OpenSearchCatClusterHealthStatus): number {\n switch (status) {\n case OpenSearchCatClusterHealthStatus.Green:\n return 1;\n case OpenSearchCatClusterHealthStatus.Yellow:\n return 2;\n case OpenSearchCatClusterHealthStatus.Red:\n return 3;\n default:\n return 99;\n }\n }\n}\n\nexport type { WaitUntilHealthy };\n\nexport const createWaitUntilHealthy = (\n client: Client,\n params: IWaitUntilHealthyParams\n): WaitUntilHealthy => {\n return new WaitUntilHealthy(client, params);\n};\n"],"names":["WAITING_TIME_STEP","WaitUntilHealthy","client","options","OpenSearchCatHealth","OpenSearchCatNodes","WaitingHealthyClusterAbortedError","startedAt","Date","mustEndAt","waitingTimeStep","runs","waitingReason","UnhealthyClusterError","Promise","resolve","setTimeout","runningTime","health","nodes","ex","createClusterHealthStatusReason","OpenSearchCatClusterHealthStatus","currentStatus","clusterHealthStatus","minClusterHealthStatus","processorPercent","createProcessorReason","undefined","ramPercent","createMemoryReason","total","node","parseFloat","status","createWaitUntilHealthy","params"],"mappings":"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"}
|