@digitraffic/common 2022.10.25-1 → 2022.10.31-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/.editorconfig +9 -0
- package/.eslintignore +4 -0
- package/.eslintrc.json +27 -0
- package/.github/CODEOWNERS +2 -0
- package/.github/workflows/build.yml +36 -0
- package/.github/workflows/eslint.yml +38 -0
- package/.github/workflows/mirror.yml +15 -0
- package/.gitignore +29 -0
- package/.husky/pre-commit +4 -0
- package/.prettierrc.json +10 -0
- package/dist/aws/infra/api/integration.js +52 -0
- package/dist/aws/infra/api/response.js +61 -0
- package/dist/aws/infra/api/responses.js +82 -0
- package/dist/aws/infra/api/static-integration.js +54 -0
- package/dist/aws/infra/canaries/canary-alarm.js +26 -0
- package/dist/aws/infra/canaries/canary-keys.js +7 -0
- package/dist/aws/infra/canaries/canary-parameters.js +3 -0
- package/dist/aws/infra/canaries/canary-role.js +46 -0
- package/dist/aws/infra/canaries/canary.js +32 -0
- package/dist/aws/infra/canaries/database-canary.js +70 -0
- package/dist/aws/infra/canaries/database-checker.js +103 -0
- package/dist/aws/infra/canaries/url-canary.js +47 -0
- package/dist/aws/infra/canaries/url-checker.js +252 -0
- package/dist/aws/infra/documentation.js +95 -0
- package/dist/aws/infra/scheduler.js +31 -0
- package/dist/aws/infra/security-rule.js +39 -0
- package/dist/aws/infra/sqs-integration.js +93 -0
- package/dist/aws/infra/sqs-queue.js +130 -0
- package/dist/aws/infra/stack/lambda-configs.js +105 -0
- package/dist/aws/infra/stack/monitoredfunction.js +143 -0
- package/dist/aws/infra/stack/rest_apis.js +185 -0
- package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
- package/dist/aws/infra/stack/stack.js +67 -0
- package/dist/aws/infra/stack/subscription.js +42 -0
- package/dist/aws/infra/usage-plans.js +42 -0
- package/dist/aws/runtime/apikey.js +13 -0
- package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
- package/dist/aws/runtime/environment.js +12 -0
- package/dist/aws/runtime/messaging.js +31 -0
- package/dist/aws/runtime/s3.js +30 -0
- package/dist/aws/runtime/secrets/dbsecret.js +96 -0
- package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
- package/dist/aws/runtime/secrets/rds-holder.js +27 -0
- package/dist/aws/runtime/secrets/secret-holder.js +76 -0
- package/dist/aws/runtime/secrets/secret.js +43 -0
- package/dist/aws/types/errors.js +16 -0
- package/dist/aws/types/lambda-response.js +33 -0
- package/dist/aws/types/mediatypes.js +16 -0
- package/dist/aws/types/model-with-reference.js +3 -0
- package/dist/aws/types/proxytypes.js +3 -0
- package/dist/aws/types/tags.js +7 -0
- package/dist/database/cached.js +32 -0
- package/dist/database/database.js +70 -0
- package/dist/database/last-updated.js +54 -0
- package/dist/database/models.js +3 -0
- package/dist/marine/id_utils.js +33 -0
- package/dist/marine/rtz.js +3 -0
- package/dist/test/asserter.js +45 -0
- package/dist/test/db-testutils.js +31 -0
- package/dist/test/httpserver.js +74 -0
- package/dist/test/secret.js +25 -0
- package/dist/test/secrets-manager.js +59 -0
- package/dist/test/testutils.js +44 -0
- package/dist/types/either.js +3 -0
- package/dist/types/input-error.js +7 -0
- package/dist/types/language.js +10 -0
- package/dist/types/traffictype.js +13 -0
- package/dist/types/validator.js +14 -0
- package/dist/utils/api-model.js +129 -0
- package/dist/utils/base64.js +21 -0
- package/dist/utils/date-utils.js +34 -0
- package/dist/utils/geojson-types.js +18 -0
- package/dist/utils/geometry.js +164 -0
- package/dist/utils/retry.js +50 -0
- package/dist/utils/slack.js +25 -0
- package/dist/utils/utils.js +75 -0
- package/jest.config.js +15 -0
- package/package.json +15 -13
- package/src/@types/geojson-validation/index.d.ts +4 -0
- package/src/aws/infra/api/integration.ts +73 -0
- package/src/aws/infra/api/response.ts +67 -0
- package/src/aws/infra/api/responses.ts +124 -0
- package/src/aws/infra/api/static-integration.ts +62 -0
- package/src/aws/infra/canaries/canary-alarm.ts +31 -0
- package/src/aws/infra/canaries/canary-keys.ts +3 -0
- package/{aws/infra/canaries/canary-parameters.d.ts → src/aws/infra/canaries/canary-parameters.ts} +7 -6
- package/src/aws/infra/canaries/canary-role.ts +47 -0
- package/src/aws/infra/canaries/canary.ts +46 -0
- package/src/aws/infra/canaries/database-canary.ts +98 -0
- package/src/aws/infra/canaries/database-checker.ts +155 -0
- package/src/aws/infra/canaries/url-canary.ts +74 -0
- package/src/aws/infra/canaries/url-checker.ts +366 -0
- package/src/aws/infra/documentation.ts +124 -0
- package/src/aws/infra/scheduler.ts +59 -0
- package/src/aws/infra/security-rule.ts +38 -0
- package/src/aws/infra/sqs-integration.ts +102 -0
- package/src/aws/infra/sqs-queue.ts +148 -0
- package/src/aws/infra/stack/lambda-configs.ts +207 -0
- package/src/aws/infra/stack/monitoredfunction.ts +342 -0
- package/src/aws/infra/stack/rest_apis.ts +223 -0
- package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
- package/src/aws/infra/stack/stack.ts +145 -0
- package/src/aws/infra/stack/subscription.ts +58 -0
- package/src/aws/infra/usage-plans.ts +41 -0
- package/src/aws/runtime/apikey.ts +9 -0
- package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
- package/src/aws/runtime/environment.ts +9 -0
- package/src/aws/runtime/messaging.ts +26 -0
- package/src/aws/runtime/s3.ts +44 -0
- package/src/aws/runtime/secrets/dbsecret.ts +116 -0
- package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
- package/src/aws/runtime/secrets/rds-holder.ts +33 -0
- package/src/aws/runtime/secrets/secret-holder.ts +116 -0
- package/src/aws/runtime/secrets/secret.ts +50 -0
- package/src/aws/types/errors.ts +14 -0
- package/src/aws/types/lambda-response.ts +43 -0
- package/{aws/types/mediatypes.d.ts → src/aws/types/mediatypes.ts} +4 -3
- package/{aws/types/model-with-reference.d.ts → src/aws/types/model-with-reference.ts} +2 -1
- package/src/aws/types/proxytypes.ts +27 -0
- package/src/aws/types/tags.ts +3 -0
- package/src/database/cached.ts +35 -0
- package/src/database/database.ts +96 -0
- package/src/database/last-updated.ts +59 -0
- package/{database/models.d.ts → src/database/models.ts} +1 -0
- package/src/marine/id_utils.ts +30 -0
- package/src/marine/rtz.ts +57 -0
- package/src/test/asserter.ts +48 -0
- package/src/test/db-testutils.ts +44 -0
- package/src/test/httpserver.ts +96 -0
- package/src/test/secret.ts +23 -0
- package/src/test/secrets-manager.ts +34 -0
- package/src/test/testutils.ts +39 -0
- package/src/types/either.ts +3 -0
- package/src/types/input-error.ts +2 -0
- package/src/types/language.ts +3 -0
- package/src/types/traffictype.ts +8 -0
- package/src/types/validator.ts +10 -0
- package/src/utils/api-model.ts +133 -0
- package/src/utils/base64.ts +16 -0
- package/src/utils/date-utils.ts +30 -0
- package/src/utils/geojson-types.ts +22 -0
- package/src/utils/geometry.ts +164 -0
- package/src/utils/retry.ts +49 -0
- package/src/utils/slack.ts +22 -0
- package/src/utils/utils.ts +105 -0
- package/test/marine/id_utils.test.ts +57 -0
- package/test/promise/promise.test.ts +143 -0
- package/test/secrets/dbsecret.test.ts +59 -0
- package/test/secrets/secret-holder.test.ts +143 -0
- package/test/secrets/secret.test.ts +49 -0
- package/test/test/httpserver.test.ts +128 -0
- package/test/utils/date-utils.test.ts +28 -0
- package/test/utils/geometry.test.ts +29 -0
- package/test/utils/utils.test.ts +64 -0
- package/tsconfig.eslint.json +4 -0
- package/tsconfig.json +22 -0
- package/yarn.lock +4060 -0
- package/aws/infra/api/integration.d.ts +0 -21
- package/aws/infra/api/integration.js +0 -52
- package/aws/infra/api/response.d.ts +0 -22
- package/aws/infra/api/response.js +0 -61
- package/aws/infra/api/responses.d.ts +0 -39
- package/aws/infra/api/responses.js +0 -79
- package/aws/infra/api/static-integration.d.ts +0 -15
- package/aws/infra/api/static-integration.js +0 -54
- package/aws/infra/canaries/canary-alarm.d.ts +0 -6
- package/aws/infra/canaries/canary-alarm.js +0 -26
- package/aws/infra/canaries/canary-parameters.js +0 -3
- package/aws/infra/canaries/canary-role.d.ts +0 -6
- package/aws/infra/canaries/canary-role.js +0 -46
- package/aws/infra/canaries/canary.d.ts +0 -8
- package/aws/infra/canaries/canary.js +0 -32
- package/aws/infra/canaries/database-canary.d.ts +0 -18
- package/aws/infra/canaries/database-canary.js +0 -55
- package/aws/infra/canaries/database-checker.d.ts +0 -21
- package/aws/infra/canaries/database-checker.js +0 -109
- package/aws/infra/canaries/url-canary.d.ts +0 -19
- package/aws/infra/canaries/url-canary.js +0 -46
- package/aws/infra/canaries/url-checker.d.ts +0 -46
- package/aws/infra/canaries/url-checker.js +0 -238
- package/aws/infra/documentation.d.ts +0 -56
- package/aws/infra/documentation.js +0 -95
- package/aws/infra/scheduler.d.ts +0 -12
- package/aws/infra/scheduler.js +0 -31
- package/aws/infra/security-rule.d.ts +0 -12
- package/aws/infra/security-rule.js +0 -39
- package/aws/infra/sqs-integration.d.ts +0 -7
- package/aws/infra/sqs-integration.js +0 -93
- package/aws/infra/sqs-queue.d.ts +0 -16
- package/aws/infra/sqs-queue.js +0 -130
- package/aws/infra/stack/lambda-configs.d.ts +0 -72
- package/aws/infra/stack/lambda-configs.js +0 -93
- package/aws/infra/stack/monitoredfunction.d.ts +0 -84
- package/aws/infra/stack/monitoredfunction.js +0 -135
- package/aws/infra/stack/rest_apis.d.ts +0 -41
- package/aws/infra/stack/rest_apis.js +0 -185
- package/aws/infra/stack/stack-checking-aspect.d.ts +0 -21
- package/aws/infra/stack/stack-checking-aspect.js +0 -174
- package/aws/infra/stack/stack.d.ts +0 -44
- package/aws/infra/stack/stack.js +0 -60
- package/aws/infra/stack/subscription.d.ts +0 -17
- package/aws/infra/stack/subscription.js +0 -41
- package/aws/infra/usage-plans.d.ts +0 -15
- package/aws/infra/usage-plans.js +0 -42
- package/aws/runtime/apikey.d.ts +0 -2
- package/aws/runtime/apikey.js +0 -13
- package/aws/runtime/digitraffic-integration-response.d.ts +0 -8
- package/aws/runtime/digitraffic-integration-response.js +0 -26
- package/aws/runtime/environment.d.ts +0 -1
- package/aws/runtime/environment.js +0 -12
- package/aws/runtime/messaging.d.ts +0 -10
- package/aws/runtime/messaging.js +0 -31
- package/aws/runtime/s3.d.ts +0 -2
- package/aws/runtime/s3.js +0 -30
- package/aws/runtime/secrets/dbsecret.d.ts +0 -54
- package/aws/runtime/secrets/dbsecret.js +0 -96
- package/aws/runtime/secrets/proxy-holder.d.ts +0 -9
- package/aws/runtime/secrets/proxy-holder.js +0 -26
- package/aws/runtime/secrets/rds-holder.d.ts +0 -9
- package/aws/runtime/secrets/rds-holder.js +0 -26
- package/aws/runtime/secrets/secret-holder.d.ts +0 -26
- package/aws/runtime/secrets/secret-holder.js +0 -73
- package/aws/runtime/secrets/secret.d.ts +0 -8
- package/aws/runtime/secrets/secret.js +0 -43
- package/aws/types/errors.d.ts +0 -4
- package/aws/types/errors.js +0 -9
- package/aws/types/lambda-response.d.ts +0 -12
- package/aws/types/lambda-response.js +0 -28
- package/aws/types/mediatypes.js +0 -15
- package/aws/types/model-with-reference.js +0 -3
- package/aws/types/proxytypes.d.ts +0 -26
- package/aws/types/proxytypes.js +0 -3
- package/aws/types/tags.d.ts +0 -2
- package/aws/types/tags.js +0 -7
- package/database/cached.d.ts +0 -7
- package/database/cached.js +0 -32
- package/database/database.d.ts +0 -19
- package/database/database.js +0 -62
- package/database/last-updated.d.ts +0 -16
- package/database/last-updated.js +0 -54
- package/database/models.js +0 -3
- package/index.d.ts +0 -1
- package/index.js +0 -18
- package/marine/id_utils.d.ts +0 -3
- package/marine/id_utils.js +0 -33
- package/marine/rtz.d.ts +0 -48
- package/marine/rtz.js +0 -3
- package/test/asserter.d.ts +0 -11
- package/test/asserter.js +0 -45
- package/test/db-testutils.d.ts +0 -2
- package/test/db-testutils.js +0 -31
- package/test/httpserver.d.ts +0 -18
- package/test/httpserver.js +0 -67
- package/test/secret.d.ts +0 -3
- package/test/secret.js +0 -25
- package/test/secrets-manager.d.ts +0 -9
- package/test/secrets-manager.js +0 -59
- package/test/testutils.d.ts +0 -12
- package/test/testutils.js +0 -44
- package/types/input-error.d.ts +0 -2
- package/types/input-error.js +0 -7
- package/types/language.d.ts +0 -5
- package/types/language.js +0 -10
- package/types/traffictype.d.ts +0 -8
- package/types/traffictype.js +0 -13
- package/types/validator.d.ts +0 -4
- package/types/validator.js +0 -14
- package/utils/api-model.d.ts +0 -87
- package/utils/api-model.js +0 -129
- package/utils/base64.d.ts +0 -12
- package/utils/base64.js +0 -21
- package/utils/date-utils.d.ts +0 -17
- package/utils/date-utils.js +0 -34
- package/utils/geojson-types.d.ts +0 -14
- package/utils/geojson-types.js +0 -18
- package/utils/geometry.d.ts +0 -36
- package/utils/geometry.js +0 -140
- package/utils/retry.d.ts +0 -13
- package/utils/retry.js +0 -50
- package/utils/slack.d.ts +0 -5
- package/utils/slack.js +0 -25
- package/utils/utils.d.ts +0 -30
- package/utils/utils.js +0 -64
package/utils/geometry.js
DELETED
@@ -1,140 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.positionToList = exports.createGmlLineString = exports.distanceBetweenPositionsInM = exports.areDistinctPositions = exports.distanceBetweenPositionsInKm = exports.isFeatureCollection = exports.isValidGeoJson = exports.createFeatureCollection = exports.createGeometry = exports.SRID_WGS84 = void 0;
|
4
|
-
exports.SRID_WGS84 = 4326;
|
5
|
-
/**
|
6
|
-
* Creates WKT geometry from GeoJSON geometry
|
7
|
-
* @param geometry GeoJson geometry to convert to WKT
|
8
|
-
*/
|
9
|
-
function createGeometry(geometry) {
|
10
|
-
if (geometry.type === 'LineString') {
|
11
|
-
const coordinates = linestring(geometry.coordinates);
|
12
|
-
return `LINESTRING(${coordinates})`;
|
13
|
-
}
|
14
|
-
else if (geometry.type === 'Point') {
|
15
|
-
const coordinates = coordinatePair(geometry.coordinates);
|
16
|
-
return `POINT(${coordinates})`;
|
17
|
-
}
|
18
|
-
else if (geometry.type === 'Polygon') {
|
19
|
-
const coordinates = polygon(geometry.coordinates);
|
20
|
-
return `POLYGON(${coordinates})`;
|
21
|
-
}
|
22
|
-
else if (geometry.type === 'MultiPolygon') {
|
23
|
-
const coordinates = multiPolygon(geometry.coordinates);
|
24
|
-
return `MULTIPOLYGON(${coordinates})`;
|
25
|
-
}
|
26
|
-
console.error("unsupported locationType=%s", geometry.type);
|
27
|
-
return "POLYGON EMPTY";
|
28
|
-
}
|
29
|
-
exports.createGeometry = createGeometry;
|
30
|
-
function linestring(coordinates) {
|
31
|
-
return coordinates.map((c) => coordinatePair(c)).join(',');
|
32
|
-
}
|
33
|
-
function polygon(coordinates) {
|
34
|
-
const list = coordinates.map((c) => linestring(c)).join(',');
|
35
|
-
return `(${list})`;
|
36
|
-
}
|
37
|
-
function multiPolygon(coordinates) {
|
38
|
-
const list = coordinates.map((c) => polygon(c)).join(',');
|
39
|
-
return `(${list})`;
|
40
|
-
}
|
41
|
-
function coordinatePair(coordinate) {
|
42
|
-
return `${coordinate[0]} ${coordinate[1]}`;
|
43
|
-
}
|
44
|
-
/**
|
45
|
-
* Create a GeoJSON FeatureCollection from a list of GeoJSON features with a 'last updated' property
|
46
|
-
* @param features List of Features
|
47
|
-
* @param lastUpdated Last updated date
|
48
|
-
*/
|
49
|
-
function createFeatureCollection(features, lastUpdated) {
|
50
|
-
return {
|
51
|
-
type: "FeatureCollection",
|
52
|
-
lastUpdated: lastUpdated,
|
53
|
-
features: features,
|
54
|
-
};
|
55
|
-
}
|
56
|
-
exports.createFeatureCollection = createFeatureCollection;
|
57
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
58
|
-
const geoJsonValidator = require('geojson-validation');
|
59
|
-
function isValidGeoJson(json) {
|
60
|
-
return geoJsonValidator.valid(json);
|
61
|
-
}
|
62
|
-
exports.isValidGeoJson = isValidGeoJson;
|
63
|
-
function isFeatureCollection(json) {
|
64
|
-
return geoJsonValidator.isFeatureCollection(json);
|
65
|
-
}
|
66
|
-
exports.isFeatureCollection = isFeatureCollection;
|
67
|
-
const DEGREES_TO_RADIANS = 0.017453292519943295; // = Math.PI / 180
|
68
|
-
const EARTH_RADIUS_KM = 6371;
|
69
|
-
/**
|
70
|
-
* Returns the distance between this and given GeoJSON point in kilometers. Doesn't take in account altitude.
|
71
|
-
* Based on the following Stack Overflow question:
|
72
|
-
* http://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula,
|
73
|
-
* which is based on https://en.wikipedia.org/wiki/Haversine_formula (error rate: ~0.55%).
|
74
|
-
*/
|
75
|
-
function distanceBetweenWGS84PointsInKm(fromXLon, fromYLat, toXLon, toYLat) {
|
76
|
-
const diffLat = toRadians(toYLat - fromYLat);
|
77
|
-
const diffLon = toRadians(toXLon - fromXLon);
|
78
|
-
const a = Math.sin(diffLat / 2) * Math.sin(diffLat / 2) +
|
79
|
-
Math.cos(toRadians(fromYLat)) * Math.cos(toRadians(toYLat)) *
|
80
|
-
Math.sin(diffLon / 2) * Math.sin(diffLon / 2);
|
81
|
-
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
82
|
-
return EARTH_RADIUS_KM * c;
|
83
|
-
}
|
84
|
-
/**
|
85
|
-
* Calculates distance between two GeoJSON points (WGS84)
|
86
|
-
* @param pos1
|
87
|
-
* @param pos2
|
88
|
-
*/
|
89
|
-
function distanceBetweenPositionsInKm(pos1, pos2) {
|
90
|
-
return distanceBetweenWGS84PointsInKm(pos1[0], pos1[1], pos2[0], pos2[1]);
|
91
|
-
}
|
92
|
-
exports.distanceBetweenPositionsInKm = distanceBetweenPositionsInKm;
|
93
|
-
function areDistinctPositions(previous, next) {
|
94
|
-
return previous[0] !== next[0] || previous[1] !== next[1];
|
95
|
-
}
|
96
|
-
exports.areDistinctPositions = areDistinctPositions;
|
97
|
-
/**
|
98
|
-
* Calculates distance between two GeoJSON points (WGS84)
|
99
|
-
* @param pos1
|
100
|
-
* @param pos2
|
101
|
-
*/
|
102
|
-
function distanceBetweenPositionsInM(pos1, pos2) {
|
103
|
-
return distanceBetweenPositionsInKm(pos1, pos2) * 1000; // km -> m
|
104
|
-
}
|
105
|
-
exports.distanceBetweenPositionsInM = distanceBetweenPositionsInM;
|
106
|
-
function createGmlLineString(geometry, srsName = 'EPSG:4326') {
|
107
|
-
const posList = createPosList(geometry);
|
108
|
-
return {
|
109
|
-
srsName,
|
110
|
-
posList,
|
111
|
-
};
|
112
|
-
}
|
113
|
-
exports.createGmlLineString = createGmlLineString;
|
114
|
-
function createPosList(geometry) {
|
115
|
-
if (geometry.type === 'Point') {
|
116
|
-
return positionToList(geometry.coordinates);
|
117
|
-
}
|
118
|
-
else if (geometry.type === 'LineString') {
|
119
|
-
return lineStringToList(geometry.coordinates);
|
120
|
-
}
|
121
|
-
else if (geometry.type === 'Polygon') {
|
122
|
-
return polygonToList(geometry.coordinates);
|
123
|
-
}
|
124
|
-
throw new Error("unknown geometry type " + JSON.stringify(geometry));
|
125
|
-
}
|
126
|
-
function polygonToList(positions, precision = 8) {
|
127
|
-
return positions.map(p => lineStringToList(p, precision)).join(' ');
|
128
|
-
}
|
129
|
-
function lineStringToList(positions, precision = 8) {
|
130
|
-
return positions.map(p => positionToList(p, precision)).join(' ');
|
131
|
-
}
|
132
|
-
function positionToList(position, precision = 8) {
|
133
|
-
return position.map(n => n.toPrecision(precision)).join(' ');
|
134
|
-
}
|
135
|
-
exports.positionToList = positionToList;
|
136
|
-
// Converts numeric degrees to radians
|
137
|
-
function toRadians(angdeg) {
|
138
|
-
return angdeg * DEGREES_TO_RADIANS;
|
139
|
-
}
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZ2VvbWV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS2EsUUFBQSxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBRS9COzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxRQUFrQjtJQUM3QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckQsT0FBTyxjQUFjLFdBQVcsR0FBRyxDQUFDO0tBQ3ZDO1NBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtRQUNsQyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpELE9BQU8sU0FBUyxXQUFXLEdBQUcsQ0FBQztLQUNsQztTQUFNLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDcEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxPQUFPLFdBQVcsV0FBVyxHQUFHLENBQUM7S0FDcEM7U0FBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkQsT0FBTyxnQkFBZ0IsV0FBVyxHQUFHLENBQUM7S0FDekM7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RCxPQUFPLGVBQWUsQ0FBQztBQUMzQixDQUFDO0FBckJELHdDQXFCQztBQUVELFNBQVMsVUFBVSxDQUFDLFdBQXVCO0lBQ3ZDLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVcsRUFB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O0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLFNBQXVCLEVBQUUsU0FBUyxHQUFHLENBQUM7SUFDekQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFNBQXFCLEVBQUUsU0FBUyxHQUFHLENBQUM7SUFDMUQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLFFBQWtCLEVBQUUsU0FBUyxHQUFHLENBQUM7SUFDNUQsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRkQsd0NBRUM7QUFFRCxzQ0FBc0M7QUFDdEMsU0FBUyxTQUFTLENBQUMsTUFBYTtJQUM1QixPQUFPLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW9KU09OIGZ1bmN0aW9ucyBhbmQgdG9vbHNcbiAqL1xuaW1wb3J0IHtGZWF0dXJlLCBGZWF0dXJlQ29sbGVjdGlvbiwgR2VvbWV0cnksIFBvc2l0aW9ufSBmcm9tIFwiZ2VvanNvblwiO1xuXG5leHBvcnQgY29uc3QgU1JJRF9XR1M4NCA9IDQzMjY7XG5cbi8qKlxuICogQ3JlYXRlcyBXS1QgZ2VvbWV0cnkgZnJvbSBHZW9KU09OIGdlb21ldHJ5XG4gKiBAcGFyYW0gZ2VvbWV0cnkgR2VvSnNvbiBnZW9tZXRyeSB0byBjb252ZXJ0IHRvIFdLVFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR2VvbWV0cnkoZ2VvbWV0cnk6IEdlb21ldHJ5KTogc3RyaW5nIHtcbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gbGluZXN0cmluZyhnZW9tZXRyeS5jb29yZGluYXRlcyk7XG5cbiAgICAgICAgcmV0dXJuIGBMSU5FU1RSSU5HKCR7Y29vcmRpbmF0ZXN9KWA7XG4gICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZVBhaXIoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuXG4gICAgICAgIHJldHVybiBgUE9JTlQoJHtjb29yZGluYXRlc30pYDtcbiAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHBvbHlnb24oZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuXG4gICAgICAgIHJldHVybiBgUE9MWUdPTigke2Nvb3JkaW5hdGVzfSlgO1xuICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBtdWx0aVBvbHlnb24oZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuXG4gICAgICAgIHJldHVybiBgTVVMVElQT0xZR09OKCR7Y29vcmRpbmF0ZXN9KWA7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihcInVuc3VwcG9ydGVkIGxvY2F0aW9uVHlwZT0lc1wiLCBnZW9tZXRyeS50eXBlKTtcbiAgICByZXR1cm4gXCJQT0xZR09OIEVNUFRZXCI7XG59XG5cbmZ1bmN0aW9uIGxpbmVzdHJpbmcoY29vcmRpbmF0ZXM6IFBvc2l0aW9uW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBjb29yZGluYXRlcy5tYXAoKGM6IFBvc2l0aW9uKSA9PiAgY29vcmRpbmF0ZVBhaXIoYykpLmpvaW4oJywnKTtcbn1cblxuZnVuY3Rpb24gcG9seWdvbihjb29yZGluYXRlczogUG9zaXRpb25bXVtdKTpzdHJpbmcge1xuICAgIGNvbnN0IGxpc3QgPSBjb29yZGluYXRlcy5tYXAoKGM6IFBvc2l0aW9uW10pID0+IGxpbmVzdHJpbmcoYykpLmpvaW4oJywnKTtcbiAgICByZXR1cm4gYCgke2xpc3R9KWA7XG59XG5cbmZ1bmN0aW9uIG11bHRpUG9seWdvbihjb29yZGluYXRlczogUG9zaXRpb25bXVtdW10pOnN0cmluZyB7XG4gICAgY29uc3QgbGlzdCA9IGNvb3JkaW5hdGVzLm1hcCgoYzogUG9zaXRpb25bXVtdKSA9PiBwb2x5Z29uKGMpKS5qb2luKCcsJyk7XG4gICAgcmV0dXJuIGAoJHtsaXN0fSlgO1xufVxuXG5mdW5jdGlvbiBjb29yZGluYXRlUGFpcihjb29yZGluYXRlOiBQb3NpdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2Nvb3JkaW5hdGVbMF19ICR7Y29vcmRpbmF0ZVsxXX1gO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIEdlb0pTT04gRmVhdHVyZUNvbGxlY3Rpb24gZnJvbSBhIGxpc3Qgb2YgR2VvSlNPTiBmZWF0dXJlcyB3aXRoIGEgJ2xhc3QgdXBkYXRlZCcgcHJvcGVydHlcbiAqIEBwYXJhbSBmZWF0dXJlcyBMaXN0IG9mIEZlYXR1cmVzXG4gKiBAcGFyYW0gbGFzdFVwZGF0ZWQgTGFzdCB1cGRhdGVkIGRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmVDb2xsZWN0aW9uKGZlYXR1cmVzOiBGZWF0dXJlW10sIGxhc3RVcGRhdGVkOiBEYXRlIHwgbnVsbCk6IEZlYXR1cmVDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gICAgICAgIGxhc3RVcGRhdGVkOiBsYXN0VXBkYXRlZCxcbiAgICAgICAgZmVhdHVyZXM6IGZlYXR1cmVzLFxuICAgIH0gYXMgRmVhdHVyZUNvbGxlY3Rpb247XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCBnZW9Kc29uVmFsaWRhdG9yID0gcmVxdWlyZSgnZ2VvanNvbi12YWxpZGF0aW9uJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkR2VvSnNvbjxUPihqc29uOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdlb0pzb25WYWxpZGF0b3IudmFsaWQoanNvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVDb2xsZWN0aW9uPFQ+KGpzb246IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2VvSnNvblZhbGlkYXRvci5pc0ZlYXR1cmVDb2xsZWN0aW9uKGpzb24pO1xufVxuXG5jb25zdCBERUdSRUVTX1RPX1JBRElBTlMgPSAwLjAxNzQ1MzI5MjUxOTk0MzI5NTsgLy8gPSBNYXRoLlBJIC8gMTgwXG5jb25zdCBFQVJUSF9SQURJVVNfS00gPSA2MzcxO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIGFuZCBnaXZlbiBHZW9KU09OIHBvaW50IGluIGtpbG9tZXRlcnMuIERvZXNuJ3QgdGFrZSBpbiBhY2NvdW50IGFsdGl0dWRlLlxuICogQmFzZWQgb24gdGhlIGZvbGxvd2luZyBTdGFjayBPdmVyZmxvdyBxdWVzdGlvbjpcbiAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc5MjgvY2FsY3VsYXRlLWRpc3RhbmNlLWJldHdlZW4tdHdvLWxhdGl0dWRlLWxvbmdpdHVkZS1wb2ludHMtaGF2ZXJzaW5lLWZvcm11bGEsXG4gKiB3aGljaCBpcyBiYXNlZCBvbiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXZlcnNpbmVfZm9ybXVsYSAoZXJyb3IgcmF0ZTogfjAuNTUlKS5cbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuV0dTODRQb2ludHNJbkttKGZyb21YTG9uOm51bWJlciwgZnJvbVlMYXQ6bnVtYmVyLCB0b1hMb246bnVtYmVyLCB0b1lMYXQ6bnVtYmVyKTogbnVtYmVyICB7XG5cbiAgICBjb25zdCBkaWZmTGF0ID0gdG9SYWRpYW5zKHRvWUxhdCAtIGZyb21ZTGF0KTtcbiAgICBjb25zdCBkaWZmTG9uID0gdG9SYWRpYW5zKHRvWExvbiAtIGZyb21YTG9uKTtcblxuICAgIGNvbnN0IGEgPVxuICAgICAgICBNYXRoLnNpbihkaWZmTGF0IC8gMikgKiBNYXRoLnNpbihkaWZmTGF0IC8gMikgK1xuICAgICAgICBNYXRoLmNvcyh0b1JhZGlhbnMoZnJvbVlMYXQpKSAqIE1hdGguY29zKHRvUmFkaWFucyh0b1lMYXQpKSAqXG4gICAgICAgIE1hdGguc2luKGRpZmZMb24gLyAyKSAqIE1hdGguc2luKGRpZmZMb24gLyAyKTtcbiAgICBjb25zdCBjID0gMiAqIE1hdGguYXRhbjIoTWF0aC5zcXJ0KGEpLCBNYXRoLnNxcnQoMSAtIGEpKTtcbiAgICByZXR1cm4gRUFSVEhfUkFESVVTX0tNICogYztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW4gdHdvIEdlb0pTT04gcG9pbnRzIChXR1M4NClcbiAqIEBwYXJhbSBwb3MxXG4gKiBAcGFyYW0gcG9zMlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuUG9zaXRpb25zSW5LbShwb3MxOiBQb3NpdGlvbiwgcG9zMjogUG9zaXRpb24pIHtcbiAgICByZXR1cm4gZGlzdGFuY2VCZXR3ZWVuV0dTODRQb2ludHNJbkttKHBvczFbMF0sIHBvczFbMV0sIHBvczJbMF0sIHBvczJbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJlRGlzdGluY3RQb3NpdGlvbnMocHJldmlvdXM6IFBvc2l0aW9uLCBuZXh0OiBQb3NpdGlvbikge1xuICAgIHJldHVybiBwcmV2aW91c1swXSAhPT0gbmV4dFswXSB8fCBwcmV2aW91c1sxXSAhPT0gbmV4dFsxXTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGRpc3RhbmNlIGJldHdlZW4gdHdvIEdlb0pTT04gcG9pbnRzIChXR1M4NClcbiAqIEBwYXJhbSBwb3MxXG4gKiBAcGFyYW0gcG9zMlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuUG9zaXRpb25zSW5NKHBvczE6IFBvc2l0aW9uLCBwb3MyOiBQb3NpdGlvbikge1xuICAgIHJldHVybiBkaXN0YW5jZUJldHdlZW5Qb3NpdGlvbnNJbkttKHBvczEsIHBvczIpICogMTAwMDsgLy8ga20gLT4gbVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlR21sTGluZVN0cmluZyhnZW9tZXRyeTogR2VvbWV0cnksIHNyc05hbWUgPSAnRVBTRzo0MzI2Jykge1xuICAgIGNvbnN0IHBvc0xpc3QgPSBjcmVhdGVQb3NMaXN0KGdlb21ldHJ5KTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNyc05hbWUsXG4gICAgICAgIHBvc0xpc3QsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUG9zTGlzdChnZW9tZXRyeTogR2VvbWV0cnkpIHtcbiAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICByZXR1cm4gcG9zaXRpb25Ub0xpc3QoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBsaW5lU3RyaW5nVG9MaXN0KGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICByZXR1cm4gcG9seWdvblRvTGlzdChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBnZW9tZXRyeSB0eXBlIFwiICsgSlNPTi5zdHJpbmdpZnkoZ2VvbWV0cnkpKTtcbn1cblxuZnVuY3Rpb24gcG9seWdvblRvTGlzdChwb3NpdGlvbnM6IFBvc2l0aW9uW11bXSwgcHJlY2lzaW9uID0gOCkge1xuICAgIHJldHVybiBwb3NpdGlvbnMubWFwKHAgPT4gbGluZVN0cmluZ1RvTGlzdChwLCBwcmVjaXNpb24pKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIGxpbmVTdHJpbmdUb0xpc3QocG9zaXRpb25zOiBQb3NpdGlvbltdLCBwcmVjaXNpb24gPSA4KSB7XG4gICAgcmV0dXJuIHBvc2l0aW9ucy5tYXAocCA9PiBwb3NpdGlvblRvTGlzdChwLCBwcmVjaXNpb24pKS5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvblRvTGlzdChwb3NpdGlvbjogUG9zaXRpb24sIHByZWNpc2lvbiA9IDgpIHtcbiAgICByZXR1cm4gcG9zaXRpb24ubWFwKG4gPT4gbi50b1ByZWNpc2lvbihwcmVjaXNpb24pKS5qb2luKCcgJyk7XG59XG5cbi8vIENvbnZlcnRzIG51bWVyaWMgZGVncmVlcyB0byByYWRpYW5zXG5mdW5jdGlvbiB0b1JhZGlhbnMoYW5nZGVnOm51bWJlcikge1xuICAgIHJldHVybiBhbmdkZWcgKiBERUdSRUVTX1RPX1JBRElBTlM7XG59XG4iXX0=
|
package/utils/retry.d.ts
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
export declare enum RetryLogError {
|
2
|
-
LOG_ALL_AS_ERRORS = 0,
|
3
|
-
LOG_LAST_RETRY_AS_ERROR_OTHERS_AS_WARNS = 1,
|
4
|
-
NO_LOGGING = 2
|
5
|
-
}
|
6
|
-
/**
|
7
|
-
* Utility function for retrying async functions.
|
8
|
-
* @param asyncFn Function
|
9
|
-
* @param retries Amount of retries, default is 3. If set to <= 0, no retries will be done. Using non-finite numbers will throw an error. The maximum allowed retry count is 100.
|
10
|
-
* @param logError Logging options
|
11
|
-
* @return Promise return value
|
12
|
-
*/
|
13
|
-
export declare function retry<T>(asyncFn: () => Promise<T>, retries?: number, logError?: RetryLogError): Promise<T>;
|
package/utils/retry.js
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.retry = exports.RetryLogError = void 0;
|
4
|
-
var RetryLogError;
|
5
|
-
(function (RetryLogError) {
|
6
|
-
RetryLogError[RetryLogError["LOG_ALL_AS_ERRORS"] = 0] = "LOG_ALL_AS_ERRORS";
|
7
|
-
RetryLogError[RetryLogError["LOG_LAST_RETRY_AS_ERROR_OTHERS_AS_WARNS"] = 1] = "LOG_LAST_RETRY_AS_ERROR_OTHERS_AS_WARNS";
|
8
|
-
RetryLogError[RetryLogError["NO_LOGGING"] = 2] = "NO_LOGGING";
|
9
|
-
})(RetryLogError = exports.RetryLogError || (exports.RetryLogError = {}));
|
10
|
-
/**
|
11
|
-
* Utility function for retrying async functions.
|
12
|
-
* @param asyncFn Function
|
13
|
-
* @param retries Amount of retries, default is 3. If set to <= 0, no retries will be done. Using non-finite numbers will throw an error. The maximum allowed retry count is 100.
|
14
|
-
* @param logError Logging options
|
15
|
-
* @return Promise return value
|
16
|
-
*/
|
17
|
-
async function retry(asyncFn, retries = 3, logError = RetryLogError.LOG_LAST_RETRY_AS_ERROR_OTHERS_AS_WARNS) {
|
18
|
-
if (!isFinite(retries)) {
|
19
|
-
throw new Error('Only finite numbers are supported');
|
20
|
-
}
|
21
|
-
if (retries > 100) {
|
22
|
-
throw new Error('Exceeded the maximum retry count of 100');
|
23
|
-
}
|
24
|
-
try {
|
25
|
-
return await asyncFn();
|
26
|
-
}
|
27
|
-
catch (error) {
|
28
|
-
const remainingRetries = retries - 1;
|
29
|
-
const errorMessage = 'method=retry error';
|
30
|
-
if (logError === RetryLogError.LOG_ALL_AS_ERRORS) {
|
31
|
-
console.error(errorMessage, error);
|
32
|
-
}
|
33
|
-
else if (logError === RetryLogError.LOG_LAST_RETRY_AS_ERROR_OTHERS_AS_WARNS) {
|
34
|
-
if (remainingRetries < 0) {
|
35
|
-
console.error(errorMessage, error);
|
36
|
-
}
|
37
|
-
else {
|
38
|
-
console.warn(errorMessage, error);
|
39
|
-
}
|
40
|
-
}
|
41
|
-
if (remainingRetries < 0) {
|
42
|
-
console.warn('method=retry no retries left');
|
43
|
-
throw new Error('No retries left');
|
44
|
-
}
|
45
|
-
console.warn('method=retry invocation failed, retrying with remaining retries %d', remainingRetries);
|
46
|
-
return retry(asyncFn, remainingRetries, logError);
|
47
|
-
}
|
48
|
-
}
|
49
|
-
exports.retry = retry;
|
50
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxhQUlYO0FBSkQsV0FBWSxhQUFhO0lBQ3JCLDJFQUFpQixDQUFBO0lBQ2pCLHVIQUF1QyxDQUFBO0lBQ3ZDLDZEQUFVLENBQUE7QUFDZCxDQUFDLEVBSlcsYUFBYSxHQUFiLHFCQUFhLEtBQWIscUJBQWEsUUFJeEI7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsS0FBSyxDQUFJLE9BQXlCLEVBQ3BELE9BQU8sR0FBRyxDQUFDLEVBQ1gsUUFBUSxHQUFHLGFBQWEsQ0FBQyx1Q0FBdUM7SUFFaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxJQUFJLE9BQU8sR0FBRyxHQUFHLEVBQUU7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7S0FDOUQ7SUFDRCxJQUFJO1FBQ0EsT0FBTyxNQUFNLE9BQU8sRUFBRSxDQUFDO0tBQzFCO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDWixNQUFNLGdCQUFnQixHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFckMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7UUFDMUMsSUFBSSxRQUFRLEtBQUssYUFBYSxDQUFDLGlCQUFpQixFQUFFO1lBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxRQUFRLEtBQUssYUFBYSxDQUFDLHVDQUF1QyxFQUFFO1lBQzNFLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO2dCQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN0QztpQkFBTTtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNyQztTQUNKO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN0QztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRyxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQ2hCLGdCQUFnQixFQUNoQixRQUFRLENBQUMsQ0FBQztLQUNqQjtBQUNMLENBQUM7QUFuQ0Qsc0JBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gUmV0cnlMb2dFcnJvciB7XG4gICAgTE9HX0FMTF9BU19FUlJPUlMsXG4gICAgTE9HX0xBU1RfUkVUUllfQVNfRVJST1JfT1RIRVJTX0FTX1dBUk5TLFxuICAgIE5PX0xPR0dJTkdcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyeWluZyBhc3luYyBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gYXN5bmNGbiBGdW5jdGlvblxuICogQHBhcmFtIHJldHJpZXMgQW1vdW50IG9mIHJldHJpZXMsIGRlZmF1bHQgaXMgMy4gSWYgc2V0IHRvIDw9IDAsIG5vIHJldHJpZXMgd2lsbCBiZSBkb25lLiBVc2luZyBub24tZmluaXRlIG51bWJlcnMgd2lsbCB0aHJvdyBhbiBlcnJvci4gVGhlIG1heGltdW0gYWxsb3dlZCByZXRyeSBjb3VudCBpcyAxMDAuXG4gKiBAcGFyYW0gbG9nRXJyb3IgTG9nZ2luZyBvcHRpb25zXG4gKiBAcmV0dXJuIFByb21pc2UgcmV0dXJuIHZhbHVlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeTxUPihhc3luY0ZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICAgIHJldHJpZXMgPSAzLFxuICAgIGxvZ0Vycm9yID0gUmV0cnlMb2dFcnJvci5MT0dfTEFTVF9SRVRSWV9BU19FUlJPUl9PVEhFUlNfQVNfV0FSTlMpOiBQcm9taXNlPFQ+IHtcblxuICAgIGlmICghaXNGaW5pdGUocmV0cmllcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IGZpbml0ZSBudW1iZXJzIGFyZSBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHJldHJpZXMgPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeGNlZWRlZCB0aGUgbWF4aW11bSByZXRyeSBjb3VudCBvZiAxMDAnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jRm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCByZW1haW5pbmdSZXRyaWVzID0gcmV0cmllcyAtIDE7XG5cbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ21ldGhvZD1yZXRyeSBlcnJvcic7XG4gICAgICAgIGlmIChsb2dFcnJvciA9PT0gUmV0cnlMb2dFcnJvci5MT0dfQUxMX0FTX0VSUk9SUykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2dFcnJvciA9PT0gUmV0cnlMb2dFcnJvci5MT0dfTEFTVF9SRVRSWV9BU19FUlJPUl9PVEhFUlNfQVNfV0FSTlMpIHtcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmdSZXRyaWVzIDwgMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JNZXNzYWdlLCBlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvck1lc3NhZ2UsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW1haW5pbmdSZXRyaWVzIDwgMCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdtZXRob2Q9cmV0cnkgbm8gcmV0cmllcyBsZWZ0Jyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJldHJpZXMgbGVmdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybignbWV0aG9kPXJldHJ5IGludm9jYXRpb24gZmFpbGVkLCByZXRyeWluZyB3aXRoIHJlbWFpbmluZyByZXRyaWVzICVkJywgcmVtYWluaW5nUmV0cmllcyk7XG4gICAgICAgIHJldHVybiByZXRyeShhc3luY0ZuLFxuICAgICAgICAgICAgcmVtYWluaW5nUmV0cmllcyxcbiAgICAgICAgICAgIGxvZ0Vycm9yKTtcbiAgICB9XG59XG4iXX0=
|
package/utils/slack.d.ts
DELETED
package/utils/slack.js
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
-
};
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.SlackApi = void 0;
|
7
|
-
const axios_1 = __importDefault(require("axios"));
|
8
|
-
class SlackApi {
|
9
|
-
constructor(url) {
|
10
|
-
this.url = url;
|
11
|
-
}
|
12
|
-
async notify(text) {
|
13
|
-
try {
|
14
|
-
console.info('method=notify Notifying Slack');
|
15
|
-
await axios_1.default.post(this.url, {
|
16
|
-
text,
|
17
|
-
});
|
18
|
-
}
|
19
|
-
catch (error) {
|
20
|
-
console.error('method=notify Slack notify failed!');
|
21
|
-
}
|
22
|
-
}
|
23
|
-
}
|
24
|
-
exports.SlackApi = SlackApi;
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2xhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0RBQTBCO0FBRTFCLE1BQWEsUUFBUTtJQUlqQixZQUFZLEdBQVc7UUFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUNyQixJQUFJO1lBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN2QixJQUFJO2FBQ1AsQ0FBQyxDQUFDO1NBQ047UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7Q0FFSjtBQW5CRCw0QkFtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5cbmV4cG9ydCBjbGFzcyBTbGFja0FwaSB7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodXJsIDpzdHJpbmcpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgfVxuXG4gICAgYXN5bmMgbm90aWZ5KHRleHQ6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdtZXRob2Q9bm90aWZ5IE5vdGlmeWluZyBTbGFjaycpO1xuICAgICAgICAgICAgYXdhaXQgYXhpb3MucG9zdCh0aGlzLnVybCwge1xuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ21ldGhvZD1ub3RpZnkgU2xhY2sgbm90aWZ5IGZhaWxlZCEnKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19
|
package/utils/utils.d.ts
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* Check if arrays have only elements that also exists also in other array.
|
3
|
-
* Individual element count doesn't matter.
|
4
|
-
* Function works only for primitive types and for other it just checks the reference to object.
|
5
|
-
*
|
6
|
-
* Some examples
|
7
|
-
* bothArraysHasSameValues( [a, b], [b, a] ) => true
|
8
|
-
* bothArraysHasSameValues( [a, a], [a, a, a] ) => true
|
9
|
-
* bothArraysHasSameValues( [a, b], [a] ) => false
|
10
|
-
*
|
11
|
-
* Object references:
|
12
|
-
* const o1 = { a: 1, b: 2};
|
13
|
-
* const o2 = { a: 1, b: 2};
|
14
|
-
* // Arrays has references to same objects
|
15
|
-
* bothArraysHasSameValues([o1], [o1])) => true
|
16
|
-
* Arrays have references to different objects
|
17
|
-
* bothArraysHasSameValues([o1], [o2])) => false
|
18
|
-
*
|
19
|
-
* @param a first array to compare
|
20
|
-
* @param b second array to compare
|
21
|
-
*/
|
22
|
-
export declare function bothArraysHasSameValues(a: null | undefined | unknown[], b: null | undefined | unknown[]): boolean;
|
23
|
-
/**
|
24
|
-
* Returns the last item on the array. If the array is empty, throws an error!
|
25
|
-
*/
|
26
|
-
export declare function getLast<T>(array: T[], sortFunction?: (a: T) => number): T;
|
27
|
-
/**
|
28
|
-
* Returns the first item on the array. If the array is empty, throws an error!
|
29
|
-
*/
|
30
|
-
export declare function getFirst<T>(array: T[], sortFunction?: (a: T) => number): T;
|
package/utils/utils.js
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.getFirst = exports.getLast = exports.bothArraysHasSameValues = void 0;
|
4
|
-
/**
|
5
|
-
* Check if arrays have only elements that also exists also in other array.
|
6
|
-
* Individual element count doesn't matter.
|
7
|
-
* Function works only for primitive types and for other it just checks the reference to object.
|
8
|
-
*
|
9
|
-
* Some examples
|
10
|
-
* bothArraysHasSameValues( [a, b], [b, a] ) => true
|
11
|
-
* bothArraysHasSameValues( [a, a], [a, a, a] ) => true
|
12
|
-
* bothArraysHasSameValues( [a, b], [a] ) => false
|
13
|
-
*
|
14
|
-
* Object references:
|
15
|
-
* const o1 = { a: 1, b: 2};
|
16
|
-
* const o2 = { a: 1, b: 2};
|
17
|
-
* // Arrays has references to same objects
|
18
|
-
* bothArraysHasSameValues([o1], [o1])) => true
|
19
|
-
* Arrays have references to different objects
|
20
|
-
* bothArraysHasSameValues([o1], [o2])) => false
|
21
|
-
*
|
22
|
-
* @param a first array to compare
|
23
|
-
* @param b second array to compare
|
24
|
-
*/
|
25
|
-
function bothArraysHasSameValues(a, b) {
|
26
|
-
if ((a && !b) || (!a && b)) {
|
27
|
-
return false;
|
28
|
-
}
|
29
|
-
else if (!a && !b) {
|
30
|
-
return true;
|
31
|
-
}
|
32
|
-
const aSet = new Set(a);
|
33
|
-
const bSet = new Set(b);
|
34
|
-
if (aSet.size !== bSet.size) {
|
35
|
-
return false;
|
36
|
-
}
|
37
|
-
return Array.from(aSet).every((value) => bSet.has(value));
|
38
|
-
}
|
39
|
-
exports.bothArraysHasSameValues = bothArraysHasSameValues;
|
40
|
-
/**
|
41
|
-
* Returns the last item on the array. If the array is empty, throws an error!
|
42
|
-
*/
|
43
|
-
function getLast(array, sortFunction) {
|
44
|
-
return getFirstOrLast(false, array, sortFunction);
|
45
|
-
}
|
46
|
-
exports.getLast = getLast;
|
47
|
-
/**
|
48
|
-
* Returns the first item on the array. If the array is empty, throws an error!
|
49
|
-
*/
|
50
|
-
function getFirst(array, sortFunction) {
|
51
|
-
return getFirstOrLast(true, array, sortFunction);
|
52
|
-
}
|
53
|
-
exports.getFirst = getFirst;
|
54
|
-
function getFirstOrLast(getFirst, array, sortFunction) {
|
55
|
-
if (array.length == 0) {
|
56
|
-
throw new Error(`can't get ${getFirst ? "first" : "last"} from empty array!`);
|
57
|
-
}
|
58
|
-
const index = getFirst ? 0 : array.length - 1;
|
59
|
-
if (sortFunction) {
|
60
|
-
return array.sort(sortFunction)[index];
|
61
|
-
}
|
62
|
-
return array[index];
|
63
|
-
}
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ25DLENBQStCLEVBQy9CLENBQStCO0lBRS9CLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQztLQUNmO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDekIsT0FBTyxLQUFLLENBQUM7S0FDaEI7SUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQWZELDBEQWVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQUksS0FBVSxFQUFFLFlBQStCO0lBQ2xFLE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUZELDBCQUVDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixRQUFRLENBQUksS0FBVSxFQUFFLFlBQStCO0lBQ25FLE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUZELDRCQUVDO0FBRUQsU0FBUyxjQUFjLENBQ25CLFFBQWlCLEVBQ2pCLEtBQVUsRUFDVixZQUErQjtJQUUvQixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ1gsYUFBYSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxvQkFBb0IsQ0FDL0QsQ0FBQztLQUNMO0lBRUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLElBQUksWUFBWSxFQUFFO1FBQ2QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzFDO0lBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2hlY2sgaWYgYXJyYXlzIGhhdmUgb25seSBlbGVtZW50cyB0aGF0IGFsc28gZXhpc3RzIGFsc28gaW4gb3RoZXIgYXJyYXkuXG4gKiBJbmRpdmlkdWFsIGVsZW1lbnQgY291bnQgZG9lc24ndCBtYXR0ZXIuXG4gKiBGdW5jdGlvbiB3b3JrcyBvbmx5IGZvciBwcmltaXRpdmUgdHlwZXMgYW5kIGZvciBvdGhlciBpdCBqdXN0IGNoZWNrcyB0aGUgcmVmZXJlbmNlIHRvIG9iamVjdC5cbiAqXG4gKiBTb21lIGV4YW1wbGVzXG4gKiBib3RoQXJyYXlzSGFzU2FtZVZhbHVlcyggW2EsIGJdLCBbYiwgYV0gKSAgICA9PiB0cnVlXG4gKiBib3RoQXJyYXlzSGFzU2FtZVZhbHVlcyggW2EsIGFdLCBbYSwgYSwgYV0gKSA9PiB0cnVlXG4gKiBib3RoQXJyYXlzSGFzU2FtZVZhbHVlcyggW2EsIGJdLCBbYV0gKSAgICAgICA9PiBmYWxzZVxuICpcbiAqIE9iamVjdCByZWZlcmVuY2VzOlxuICogY29uc3QgbzEgPSB7IGE6IDEsIGI6IDJ9O1xuICogY29uc3QgbzIgPSB7IGE6IDEsIGI6IDJ9O1xuICogLy8gQXJyYXlzIGhhcyByZWZlcmVuY2VzIHRvIHNhbWUgb2JqZWN0c1xuICogYm90aEFycmF5c0hhc1NhbWVWYWx1ZXMoW28xXSwgW28xXSkpICAgICAgICAgPT4gdHJ1ZVxuICogQXJyYXlzIGhhdmUgcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgb2JqZWN0c1xuICogYm90aEFycmF5c0hhc1NhbWVWYWx1ZXMoW28xXSwgW28yXSkpICAgICAgICAgPT4gZmFsc2VcbiAqXG4gKiBAcGFyYW0gYSBmaXJzdCBhcnJheSB0byBjb21wYXJlXG4gKiBAcGFyYW0gYiBzZWNvbmQgYXJyYXkgdG8gY29tcGFyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYm90aEFycmF5c0hhc1NhbWVWYWx1ZXMoXG4gICAgYTogbnVsbCB8IHVuZGVmaW5lZCB8IHVua25vd25bXSxcbiAgICBiOiBudWxsIHwgdW5kZWZpbmVkIHwgdW5rbm93bltdXG4pOiBib29sZWFuIHtcbiAgICBpZiAoKGEgJiYgIWIpIHx8ICghYSAmJiBiKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghYSAmJiAhYikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYVNldCA9IG5ldyBTZXQoYSk7XG4gICAgY29uc3QgYlNldCA9IG5ldyBTZXQoYik7XG4gICAgaWYgKGFTZXQuc2l6ZSAhPT0gYlNldC5zaXplKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20oYVNldCkuZXZlcnkoKHZhbHVlKSA9PiBiU2V0Lmhhcyh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxhc3QgaXRlbSBvbiB0aGUgYXJyYXkuICBJZiB0aGUgYXJyYXkgaXMgZW1wdHksIHRocm93cyBhbiBlcnJvciFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3Q8VD4oYXJyYXk6IFRbXSwgc29ydEZ1bmN0aW9uPzogKGE6IFQpID0+IG51bWJlcik6IFQge1xuICAgIHJldHVybiBnZXRGaXJzdE9yTGFzdChmYWxzZSwgYXJyYXksIHNvcnRGdW5jdGlvbik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgaXRlbSBvbiB0aGUgYXJyYXkuICBJZiB0aGUgYXJyYXkgaXMgZW1wdHksIHRocm93cyBhbiBlcnJvciFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0PFQ+KGFycmF5OiBUW10sIHNvcnRGdW5jdGlvbj86IChhOiBUKSA9PiBudW1iZXIpOiBUIHtcbiAgICByZXR1cm4gZ2V0Rmlyc3RPckxhc3QodHJ1ZSwgYXJyYXksIHNvcnRGdW5jdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldEZpcnN0T3JMYXN0PFQ+KFxuICAgIGdldEZpcnN0OiBib29sZWFuLFxuICAgIGFycmF5OiBUW10sXG4gICAgc29ydEZ1bmN0aW9uPzogKGE6IFQpID0+IG51bWJlclxuKTogVCB7XG4gICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBjYW4ndCBnZXQgJHtnZXRGaXJzdCA/IFwiZmlyc3RcIiA6IFwibGFzdFwifSBmcm9tIGVtcHR5IGFycmF5IWBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IGdldEZpcnN0ID8gMCA6IGFycmF5Lmxlbmd0aCAtIDE7XG5cbiAgICBpZiAoc29ydEZ1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhcnJheS5zb3J0KHNvcnRGdW5jdGlvbilbaW5kZXhdO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheVtpbmRleF07XG59XG4iXX0=
|