@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.
Files changed (283) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +4 -0
  3. package/.eslintrc.json +27 -0
  4. package/.github/CODEOWNERS +2 -0
  5. package/.github/workflows/build.yml +36 -0
  6. package/.github/workflows/eslint.yml +38 -0
  7. package/.github/workflows/mirror.yml +15 -0
  8. package/.gitignore +29 -0
  9. package/.husky/pre-commit +4 -0
  10. package/.prettierrc.json +10 -0
  11. package/dist/aws/infra/api/integration.js +52 -0
  12. package/dist/aws/infra/api/response.js +61 -0
  13. package/dist/aws/infra/api/responses.js +82 -0
  14. package/dist/aws/infra/api/static-integration.js +54 -0
  15. package/dist/aws/infra/canaries/canary-alarm.js +26 -0
  16. package/dist/aws/infra/canaries/canary-keys.js +7 -0
  17. package/dist/aws/infra/canaries/canary-parameters.js +3 -0
  18. package/dist/aws/infra/canaries/canary-role.js +46 -0
  19. package/dist/aws/infra/canaries/canary.js +32 -0
  20. package/dist/aws/infra/canaries/database-canary.js +70 -0
  21. package/dist/aws/infra/canaries/database-checker.js +103 -0
  22. package/dist/aws/infra/canaries/url-canary.js +47 -0
  23. package/dist/aws/infra/canaries/url-checker.js +252 -0
  24. package/dist/aws/infra/documentation.js +95 -0
  25. package/dist/aws/infra/scheduler.js +31 -0
  26. package/dist/aws/infra/security-rule.js +39 -0
  27. package/dist/aws/infra/sqs-integration.js +93 -0
  28. package/dist/aws/infra/sqs-queue.js +130 -0
  29. package/dist/aws/infra/stack/lambda-configs.js +105 -0
  30. package/dist/aws/infra/stack/monitoredfunction.js +143 -0
  31. package/dist/aws/infra/stack/rest_apis.js +185 -0
  32. package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
  33. package/dist/aws/infra/stack/stack.js +67 -0
  34. package/dist/aws/infra/stack/subscription.js +42 -0
  35. package/dist/aws/infra/usage-plans.js +42 -0
  36. package/dist/aws/runtime/apikey.js +13 -0
  37. package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
  38. package/dist/aws/runtime/environment.js +12 -0
  39. package/dist/aws/runtime/messaging.js +31 -0
  40. package/dist/aws/runtime/s3.js +30 -0
  41. package/dist/aws/runtime/secrets/dbsecret.js +96 -0
  42. package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
  43. package/dist/aws/runtime/secrets/rds-holder.js +27 -0
  44. package/dist/aws/runtime/secrets/secret-holder.js +76 -0
  45. package/dist/aws/runtime/secrets/secret.js +43 -0
  46. package/dist/aws/types/errors.js +16 -0
  47. package/dist/aws/types/lambda-response.js +33 -0
  48. package/dist/aws/types/mediatypes.js +16 -0
  49. package/dist/aws/types/model-with-reference.js +3 -0
  50. package/dist/aws/types/proxytypes.js +3 -0
  51. package/dist/aws/types/tags.js +7 -0
  52. package/dist/database/cached.js +32 -0
  53. package/dist/database/database.js +70 -0
  54. package/dist/database/last-updated.js +54 -0
  55. package/dist/database/models.js +3 -0
  56. package/dist/marine/id_utils.js +33 -0
  57. package/dist/marine/rtz.js +3 -0
  58. package/dist/test/asserter.js +45 -0
  59. package/dist/test/db-testutils.js +31 -0
  60. package/dist/test/httpserver.js +74 -0
  61. package/dist/test/secret.js +25 -0
  62. package/dist/test/secrets-manager.js +59 -0
  63. package/dist/test/testutils.js +44 -0
  64. package/dist/types/either.js +3 -0
  65. package/dist/types/input-error.js +7 -0
  66. package/dist/types/language.js +10 -0
  67. package/dist/types/traffictype.js +13 -0
  68. package/dist/types/validator.js +14 -0
  69. package/dist/utils/api-model.js +129 -0
  70. package/dist/utils/base64.js +21 -0
  71. package/dist/utils/date-utils.js +34 -0
  72. package/dist/utils/geojson-types.js +18 -0
  73. package/dist/utils/geometry.js +164 -0
  74. package/dist/utils/retry.js +50 -0
  75. package/dist/utils/slack.js +25 -0
  76. package/dist/utils/utils.js +75 -0
  77. package/jest.config.js +15 -0
  78. package/package.json +15 -13
  79. package/src/@types/geojson-validation/index.d.ts +4 -0
  80. package/src/aws/infra/api/integration.ts +73 -0
  81. package/src/aws/infra/api/response.ts +67 -0
  82. package/src/aws/infra/api/responses.ts +124 -0
  83. package/src/aws/infra/api/static-integration.ts +62 -0
  84. package/src/aws/infra/canaries/canary-alarm.ts +31 -0
  85. package/src/aws/infra/canaries/canary-keys.ts +3 -0
  86. package/{aws/infra/canaries/canary-parameters.d.ts → src/aws/infra/canaries/canary-parameters.ts} +7 -6
  87. package/src/aws/infra/canaries/canary-role.ts +47 -0
  88. package/src/aws/infra/canaries/canary.ts +46 -0
  89. package/src/aws/infra/canaries/database-canary.ts +98 -0
  90. package/src/aws/infra/canaries/database-checker.ts +155 -0
  91. package/src/aws/infra/canaries/url-canary.ts +74 -0
  92. package/src/aws/infra/canaries/url-checker.ts +366 -0
  93. package/src/aws/infra/documentation.ts +124 -0
  94. package/src/aws/infra/scheduler.ts +59 -0
  95. package/src/aws/infra/security-rule.ts +38 -0
  96. package/src/aws/infra/sqs-integration.ts +102 -0
  97. package/src/aws/infra/sqs-queue.ts +148 -0
  98. package/src/aws/infra/stack/lambda-configs.ts +207 -0
  99. package/src/aws/infra/stack/monitoredfunction.ts +342 -0
  100. package/src/aws/infra/stack/rest_apis.ts +223 -0
  101. package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
  102. package/src/aws/infra/stack/stack.ts +145 -0
  103. package/src/aws/infra/stack/subscription.ts +58 -0
  104. package/src/aws/infra/usage-plans.ts +41 -0
  105. package/src/aws/runtime/apikey.ts +9 -0
  106. package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
  107. package/src/aws/runtime/environment.ts +9 -0
  108. package/src/aws/runtime/messaging.ts +26 -0
  109. package/src/aws/runtime/s3.ts +44 -0
  110. package/src/aws/runtime/secrets/dbsecret.ts +116 -0
  111. package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
  112. package/src/aws/runtime/secrets/rds-holder.ts +33 -0
  113. package/src/aws/runtime/secrets/secret-holder.ts +116 -0
  114. package/src/aws/runtime/secrets/secret.ts +50 -0
  115. package/src/aws/types/errors.ts +14 -0
  116. package/src/aws/types/lambda-response.ts +43 -0
  117. package/{aws/types/mediatypes.d.ts → src/aws/types/mediatypes.ts} +4 -3
  118. package/{aws/types/model-with-reference.d.ts → src/aws/types/model-with-reference.ts} +2 -1
  119. package/src/aws/types/proxytypes.ts +27 -0
  120. package/src/aws/types/tags.ts +3 -0
  121. package/src/database/cached.ts +35 -0
  122. package/src/database/database.ts +96 -0
  123. package/src/database/last-updated.ts +59 -0
  124. package/{database/models.d.ts → src/database/models.ts} +1 -0
  125. package/src/marine/id_utils.ts +30 -0
  126. package/src/marine/rtz.ts +57 -0
  127. package/src/test/asserter.ts +48 -0
  128. package/src/test/db-testutils.ts +44 -0
  129. package/src/test/httpserver.ts +96 -0
  130. package/src/test/secret.ts +23 -0
  131. package/src/test/secrets-manager.ts +34 -0
  132. package/src/test/testutils.ts +39 -0
  133. package/src/types/either.ts +3 -0
  134. package/src/types/input-error.ts +2 -0
  135. package/src/types/language.ts +3 -0
  136. package/src/types/traffictype.ts +8 -0
  137. package/src/types/validator.ts +10 -0
  138. package/src/utils/api-model.ts +133 -0
  139. package/src/utils/base64.ts +16 -0
  140. package/src/utils/date-utils.ts +30 -0
  141. package/src/utils/geojson-types.ts +22 -0
  142. package/src/utils/geometry.ts +164 -0
  143. package/src/utils/retry.ts +49 -0
  144. package/src/utils/slack.ts +22 -0
  145. package/src/utils/utils.ts +105 -0
  146. package/test/marine/id_utils.test.ts +57 -0
  147. package/test/promise/promise.test.ts +143 -0
  148. package/test/secrets/dbsecret.test.ts +59 -0
  149. package/test/secrets/secret-holder.test.ts +143 -0
  150. package/test/secrets/secret.test.ts +49 -0
  151. package/test/test/httpserver.test.ts +128 -0
  152. package/test/utils/date-utils.test.ts +28 -0
  153. package/test/utils/geometry.test.ts +29 -0
  154. package/test/utils/utils.test.ts +64 -0
  155. package/tsconfig.eslint.json +4 -0
  156. package/tsconfig.json +22 -0
  157. package/yarn.lock +4060 -0
  158. package/aws/infra/api/integration.d.ts +0 -21
  159. package/aws/infra/api/integration.js +0 -52
  160. package/aws/infra/api/response.d.ts +0 -22
  161. package/aws/infra/api/response.js +0 -61
  162. package/aws/infra/api/responses.d.ts +0 -39
  163. package/aws/infra/api/responses.js +0 -79
  164. package/aws/infra/api/static-integration.d.ts +0 -15
  165. package/aws/infra/api/static-integration.js +0 -54
  166. package/aws/infra/canaries/canary-alarm.d.ts +0 -6
  167. package/aws/infra/canaries/canary-alarm.js +0 -26
  168. package/aws/infra/canaries/canary-parameters.js +0 -3
  169. package/aws/infra/canaries/canary-role.d.ts +0 -6
  170. package/aws/infra/canaries/canary-role.js +0 -46
  171. package/aws/infra/canaries/canary.d.ts +0 -8
  172. package/aws/infra/canaries/canary.js +0 -32
  173. package/aws/infra/canaries/database-canary.d.ts +0 -18
  174. package/aws/infra/canaries/database-canary.js +0 -55
  175. package/aws/infra/canaries/database-checker.d.ts +0 -21
  176. package/aws/infra/canaries/database-checker.js +0 -109
  177. package/aws/infra/canaries/url-canary.d.ts +0 -19
  178. package/aws/infra/canaries/url-canary.js +0 -46
  179. package/aws/infra/canaries/url-checker.d.ts +0 -46
  180. package/aws/infra/canaries/url-checker.js +0 -238
  181. package/aws/infra/documentation.d.ts +0 -56
  182. package/aws/infra/documentation.js +0 -95
  183. package/aws/infra/scheduler.d.ts +0 -12
  184. package/aws/infra/scheduler.js +0 -31
  185. package/aws/infra/security-rule.d.ts +0 -12
  186. package/aws/infra/security-rule.js +0 -39
  187. package/aws/infra/sqs-integration.d.ts +0 -7
  188. package/aws/infra/sqs-integration.js +0 -93
  189. package/aws/infra/sqs-queue.d.ts +0 -16
  190. package/aws/infra/sqs-queue.js +0 -130
  191. package/aws/infra/stack/lambda-configs.d.ts +0 -72
  192. package/aws/infra/stack/lambda-configs.js +0 -93
  193. package/aws/infra/stack/monitoredfunction.d.ts +0 -84
  194. package/aws/infra/stack/monitoredfunction.js +0 -135
  195. package/aws/infra/stack/rest_apis.d.ts +0 -41
  196. package/aws/infra/stack/rest_apis.js +0 -185
  197. package/aws/infra/stack/stack-checking-aspect.d.ts +0 -21
  198. package/aws/infra/stack/stack-checking-aspect.js +0 -174
  199. package/aws/infra/stack/stack.d.ts +0 -44
  200. package/aws/infra/stack/stack.js +0 -60
  201. package/aws/infra/stack/subscription.d.ts +0 -17
  202. package/aws/infra/stack/subscription.js +0 -41
  203. package/aws/infra/usage-plans.d.ts +0 -15
  204. package/aws/infra/usage-plans.js +0 -42
  205. package/aws/runtime/apikey.d.ts +0 -2
  206. package/aws/runtime/apikey.js +0 -13
  207. package/aws/runtime/digitraffic-integration-response.d.ts +0 -8
  208. package/aws/runtime/digitraffic-integration-response.js +0 -26
  209. package/aws/runtime/environment.d.ts +0 -1
  210. package/aws/runtime/environment.js +0 -12
  211. package/aws/runtime/messaging.d.ts +0 -10
  212. package/aws/runtime/messaging.js +0 -31
  213. package/aws/runtime/s3.d.ts +0 -2
  214. package/aws/runtime/s3.js +0 -30
  215. package/aws/runtime/secrets/dbsecret.d.ts +0 -54
  216. package/aws/runtime/secrets/dbsecret.js +0 -96
  217. package/aws/runtime/secrets/proxy-holder.d.ts +0 -9
  218. package/aws/runtime/secrets/proxy-holder.js +0 -26
  219. package/aws/runtime/secrets/rds-holder.d.ts +0 -9
  220. package/aws/runtime/secrets/rds-holder.js +0 -26
  221. package/aws/runtime/secrets/secret-holder.d.ts +0 -26
  222. package/aws/runtime/secrets/secret-holder.js +0 -73
  223. package/aws/runtime/secrets/secret.d.ts +0 -8
  224. package/aws/runtime/secrets/secret.js +0 -43
  225. package/aws/types/errors.d.ts +0 -4
  226. package/aws/types/errors.js +0 -9
  227. package/aws/types/lambda-response.d.ts +0 -12
  228. package/aws/types/lambda-response.js +0 -28
  229. package/aws/types/mediatypes.js +0 -15
  230. package/aws/types/model-with-reference.js +0 -3
  231. package/aws/types/proxytypes.d.ts +0 -26
  232. package/aws/types/proxytypes.js +0 -3
  233. package/aws/types/tags.d.ts +0 -2
  234. package/aws/types/tags.js +0 -7
  235. package/database/cached.d.ts +0 -7
  236. package/database/cached.js +0 -32
  237. package/database/database.d.ts +0 -19
  238. package/database/database.js +0 -62
  239. package/database/last-updated.d.ts +0 -16
  240. package/database/last-updated.js +0 -54
  241. package/database/models.js +0 -3
  242. package/index.d.ts +0 -1
  243. package/index.js +0 -18
  244. package/marine/id_utils.d.ts +0 -3
  245. package/marine/id_utils.js +0 -33
  246. package/marine/rtz.d.ts +0 -48
  247. package/marine/rtz.js +0 -3
  248. package/test/asserter.d.ts +0 -11
  249. package/test/asserter.js +0 -45
  250. package/test/db-testutils.d.ts +0 -2
  251. package/test/db-testutils.js +0 -31
  252. package/test/httpserver.d.ts +0 -18
  253. package/test/httpserver.js +0 -67
  254. package/test/secret.d.ts +0 -3
  255. package/test/secret.js +0 -25
  256. package/test/secrets-manager.d.ts +0 -9
  257. package/test/secrets-manager.js +0 -59
  258. package/test/testutils.d.ts +0 -12
  259. package/test/testutils.js +0 -44
  260. package/types/input-error.d.ts +0 -2
  261. package/types/input-error.js +0 -7
  262. package/types/language.d.ts +0 -5
  263. package/types/language.js +0 -10
  264. package/types/traffictype.d.ts +0 -8
  265. package/types/traffictype.js +0 -13
  266. package/types/validator.d.ts +0 -4
  267. package/types/validator.js +0 -14
  268. package/utils/api-model.d.ts +0 -87
  269. package/utils/api-model.js +0 -129
  270. package/utils/base64.d.ts +0 -12
  271. package/utils/base64.js +0 -21
  272. package/utils/date-utils.d.ts +0 -17
  273. package/utils/date-utils.js +0 -34
  274. package/utils/geojson-types.d.ts +0 -14
  275. package/utils/geojson-types.js +0 -18
  276. package/utils/geometry.d.ts +0 -36
  277. package/utils/geometry.js +0 -140
  278. package/utils/retry.d.ts +0 -13
  279. package/utils/retry.js +0 -50
  280. package/utils/slack.d.ts +0 -5
  281. package/utils/slack.js +0 -25
  282. package/utils/utils.d.ts +0 -30
  283. 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
@@ -1,5 +0,0 @@
1
- export declare class SlackApi {
2
- private readonly url;
3
- constructor(url: string);
4
- notify(text: string): Promise<void>;
5
- }
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=