@tomerh2001/israeli-bank-scrapers 6.3.11

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 (121) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +425 -0
  3. package/lib/assertNever.d.ts +1 -0
  4. package/lib/assertNever.js +10 -0
  5. package/lib/constants.d.ts +10 -0
  6. package/lib/constants.js +17 -0
  7. package/lib/definitions.d.ts +105 -0
  8. package/lib/definitions.js +116 -0
  9. package/lib/helpers/browser.d.ts +10 -0
  10. package/lib/helpers/browser.js +21 -0
  11. package/lib/helpers/dates.d.ts +2 -0
  12. package/lib/helpers/dates.js +22 -0
  13. package/lib/helpers/debug.d.ts +2 -0
  14. package/lib/helpers/debug.js +12 -0
  15. package/lib/helpers/elements-interactions.d.ts +17 -0
  16. package/lib/helpers/elements-interactions.js +111 -0
  17. package/lib/helpers/fetch.d.ts +6 -0
  18. package/lib/helpers/fetch.js +111 -0
  19. package/lib/helpers/navigation.d.ts +6 -0
  20. package/lib/helpers/navigation.js +39 -0
  21. package/lib/helpers/storage.d.ts +2 -0
  22. package/lib/helpers/storage.js +14 -0
  23. package/lib/helpers/transactions.d.ts +5 -0
  24. package/lib/helpers/transactions.js +47 -0
  25. package/lib/helpers/waiting.d.ts +13 -0
  26. package/lib/helpers/waiting.js +58 -0
  27. package/lib/index.d.ts +7 -0
  28. package/lib/index.js +85 -0
  29. package/lib/scrapers/amex.d.ts +6 -0
  30. package/lib/scrapers/amex.js +17 -0
  31. package/lib/scrapers/amex.test.d.ts +1 -0
  32. package/lib/scrapers/amex.test.js +49 -0
  33. package/lib/scrapers/base-beinleumi-group.d.ts +66 -0
  34. package/lib/scrapers/base-beinleumi-group.js +428 -0
  35. package/lib/scrapers/base-isracard-amex.d.ts +23 -0
  36. package/lib/scrapers/base-isracard-amex.js +324 -0
  37. package/lib/scrapers/base-scraper-with-browser.d.ts +57 -0
  38. package/lib/scrapers/base-scraper-with-browser.js +291 -0
  39. package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
  40. package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
  41. package/lib/scrapers/base-scraper.d.ts +19 -0
  42. package/lib/scrapers/base-scraper.js +91 -0
  43. package/lib/scrapers/behatsdaa.d.ts +11 -0
  44. package/lib/scrapers/behatsdaa.js +113 -0
  45. package/lib/scrapers/behatsdaa.test.d.ts +1 -0
  46. package/lib/scrapers/behatsdaa.test.js +46 -0
  47. package/lib/scrapers/beinleumi.d.ts +7 -0
  48. package/lib/scrapers/beinleumi.js +15 -0
  49. package/lib/scrapers/beinleumi.test.d.ts +1 -0
  50. package/lib/scrapers/beinleumi.test.js +47 -0
  51. package/lib/scrapers/beyahad-bishvilha.d.ts +30 -0
  52. package/lib/scrapers/beyahad-bishvilha.js +149 -0
  53. package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
  54. package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
  55. package/lib/scrapers/discount.d.ts +22 -0
  56. package/lib/scrapers/discount.js +120 -0
  57. package/lib/scrapers/discount.test.d.ts +1 -0
  58. package/lib/scrapers/discount.test.js +49 -0
  59. package/lib/scrapers/errors.d.ts +16 -0
  60. package/lib/scrapers/errors.js +32 -0
  61. package/lib/scrapers/factory.d.ts +2 -0
  62. package/lib/scrapers/factory.js +70 -0
  63. package/lib/scrapers/factory.test.d.ts +1 -0
  64. package/lib/scrapers/factory.test.js +19 -0
  65. package/lib/scrapers/hapoalim.d.ts +24 -0
  66. package/lib/scrapers/hapoalim.js +198 -0
  67. package/lib/scrapers/hapoalim.test.d.ts +1 -0
  68. package/lib/scrapers/hapoalim.test.js +47 -0
  69. package/lib/scrapers/interface.d.ts +186 -0
  70. package/lib/scrapers/interface.js +6 -0
  71. package/lib/scrapers/isracard.d.ts +6 -0
  72. package/lib/scrapers/isracard.js +17 -0
  73. package/lib/scrapers/isracard.test.d.ts +1 -0
  74. package/lib/scrapers/isracard.test.js +49 -0
  75. package/lib/scrapers/leumi.d.ts +21 -0
  76. package/lib/scrapers/leumi.js +200 -0
  77. package/lib/scrapers/leumi.test.d.ts +1 -0
  78. package/lib/scrapers/leumi.test.js +47 -0
  79. package/lib/scrapers/massad.d.ts +7 -0
  80. package/lib/scrapers/massad.js +15 -0
  81. package/lib/scrapers/max.d.ts +37 -0
  82. package/lib/scrapers/max.js +299 -0
  83. package/lib/scrapers/max.test.d.ts +1 -0
  84. package/lib/scrapers/max.test.js +64 -0
  85. package/lib/scrapers/mercantile.d.ts +20 -0
  86. package/lib/scrapers/mercantile.js +18 -0
  87. package/lib/scrapers/mercantile.test.d.ts +1 -0
  88. package/lib/scrapers/mercantile.test.js +45 -0
  89. package/lib/scrapers/mizrahi.d.ts +35 -0
  90. package/lib/scrapers/mizrahi.js +265 -0
  91. package/lib/scrapers/mizrahi.test.d.ts +1 -0
  92. package/lib/scrapers/mizrahi.test.js +56 -0
  93. package/lib/scrapers/one-zero-queries.d.ts +2 -0
  94. package/lib/scrapers/one-zero-queries.js +560 -0
  95. package/lib/scrapers/one-zero.d.ts +36 -0
  96. package/lib/scrapers/one-zero.js +238 -0
  97. package/lib/scrapers/one-zero.test.d.ts +1 -0
  98. package/lib/scrapers/one-zero.test.js +51 -0
  99. package/lib/scrapers/otsar-hahayal.d.ts +7 -0
  100. package/lib/scrapers/otsar-hahayal.js +15 -0
  101. package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
  102. package/lib/scrapers/otsar-hahayal.test.js +47 -0
  103. package/lib/scrapers/pagi.d.ts +7 -0
  104. package/lib/scrapers/pagi.js +15 -0
  105. package/lib/scrapers/pagi.test.d.ts +1 -0
  106. package/lib/scrapers/pagi.test.js +47 -0
  107. package/lib/scrapers/union-bank.d.ts +23 -0
  108. package/lib/scrapers/union-bank.js +242 -0
  109. package/lib/scrapers/union-bank.test.d.ts +1 -0
  110. package/lib/scrapers/union-bank.test.js +47 -0
  111. package/lib/scrapers/visa-cal.d.ts +20 -0
  112. package/lib/scrapers/visa-cal.js +318 -0
  113. package/lib/scrapers/visa-cal.test.d.ts +1 -0
  114. package/lib/scrapers/visa-cal.test.js +49 -0
  115. package/lib/scrapers/yahav.d.ts +25 -0
  116. package/lib/scrapers/yahav.js +247 -0
  117. package/lib/scrapers/yahav.test.d.ts +1 -0
  118. package/lib/scrapers/yahav.test.js +49 -0
  119. package/lib/transactions.d.ts +47 -0
  120. package/lib/transactions.js +17 -0
  121. package/package.json +91 -0
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LoginResults = exports.BaseScraperWithBrowser = void 0;
7
+ var _puppeteer = _interopRequireDefault(require("puppeteer"));
8
+ var _definitions = require("../definitions");
9
+ var _debug = require("../helpers/debug");
10
+ var _elementsInteractions = require("../helpers/elements-interactions");
11
+ var _navigation = require("../helpers/navigation");
12
+ var _baseScraper = require("./base-scraper");
13
+ var _errors = require("./errors");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const debug = (0, _debug.getDebug)('base-scraper-with-browser');
16
+ var LoginBaseResults = /*#__PURE__*/function (LoginBaseResults) {
17
+ LoginBaseResults["Success"] = "SUCCESS";
18
+ LoginBaseResults["UnknownError"] = "UNKNOWN_ERROR";
19
+ return LoginBaseResults;
20
+ }(LoginBaseResults || {});
21
+ const {
22
+ Timeout,
23
+ Generic,
24
+ General,
25
+ ...rest
26
+ } = _errors.ScraperErrorTypes;
27
+ const LoginResults = exports.LoginResults = {
28
+ ...rest,
29
+ ...LoginBaseResults
30
+ };
31
+
32
+ // eslint-disable-next-line @typescript-eslint/no-redeclare
33
+
34
+ async function getKeyByValue(object, value, page) {
35
+ const keys = Object.keys(object);
36
+ for (const key of keys) {
37
+ // @ts-ignore
38
+ const conditions = object[key];
39
+ for (const condition of conditions) {
40
+ let result = false;
41
+ if (condition instanceof RegExp) {
42
+ result = condition.test(value);
43
+ } else if (typeof condition === 'function') {
44
+ result = await condition({
45
+ page,
46
+ value
47
+ });
48
+ } else {
49
+ result = value.toLowerCase() === condition.toLowerCase();
50
+ }
51
+ if (result) {
52
+ // @ts-ignore
53
+ return Promise.resolve(key);
54
+ }
55
+ }
56
+ }
57
+ return Promise.resolve(LoginResults.UnknownError);
58
+ }
59
+ function createGeneralError() {
60
+ return {
61
+ success: false,
62
+ errorType: _errors.ScraperErrorTypes.General
63
+ };
64
+ }
65
+ async function safeCleanup(cleanup) {
66
+ try {
67
+ await cleanup();
68
+ } catch (e) {
69
+ debug(`Cleanup function failed: ${e.message}`);
70
+ }
71
+ }
72
+ class BaseScraperWithBrowser extends _baseScraper.BaseScraper {
73
+ cleanups = [];
74
+ defaultViewportSize = {
75
+ width: 1024,
76
+ height: 768
77
+ };
78
+
79
+ // NOTICE - it is discouraged to use bang (!) in general. It is used here because
80
+ // all the classes that inherit from this base assume is it mandatory.
81
+
82
+ getViewPort() {
83
+ return this.options.viewportSize ?? this.defaultViewportSize;
84
+ }
85
+ async initialize() {
86
+ await super.initialize();
87
+ debug('initialize scraper');
88
+ this.emitProgress(_definitions.ScraperProgressTypes.Initializing);
89
+ const page = await this.initializePage();
90
+ await page.setCacheEnabled(false); // Clear cache and avoid 300's response status
91
+
92
+ if (!page) {
93
+ debug('failed to initiate a browser page, exit');
94
+ return;
95
+ }
96
+ this.page = page;
97
+ this.cleanups.push(() => page.close());
98
+ if (this.options.defaultTimeout) {
99
+ this.page.setDefaultTimeout(this.options.defaultTimeout);
100
+ }
101
+ if (this.options.preparePage) {
102
+ debug("execute 'preparePage' interceptor provided in options");
103
+ await this.options.preparePage(this.page);
104
+ }
105
+ const viewport = this.getViewPort();
106
+ debug(`set viewport to width ${viewport.width}, height ${viewport.height}`);
107
+ await this.page.setViewport({
108
+ width: viewport.width,
109
+ height: viewport.height
110
+ });
111
+ this.page.on('requestfailed', request => {
112
+ debug('Request failed: %s %s', request.failure()?.errorText, request.url());
113
+ });
114
+ }
115
+ async initializePage() {
116
+ debug('initialize browser page');
117
+ if ('browserContext' in this.options) {
118
+ debug('Using the browser context provided in options');
119
+ return this.options.browserContext.newPage();
120
+ }
121
+ if ('browser' in this.options) {
122
+ debug('Using the browser instance provided in options');
123
+ const {
124
+ browser
125
+ } = this.options;
126
+
127
+ /**
128
+ * For backward compatibility, we will close the browser even if we didn't create it
129
+ */
130
+ if (!this.options.skipCloseBrowser) {
131
+ this.cleanups.push(async () => {
132
+ debug('closing the browser');
133
+ await browser.close();
134
+ });
135
+ }
136
+ return browser.newPage();
137
+ }
138
+ const {
139
+ timeout,
140
+ args,
141
+ executablePath,
142
+ showBrowser
143
+ } = this.options;
144
+ const headless = !showBrowser;
145
+ debug(`launch a browser with headless mode = ${headless}`);
146
+ const browser = await _puppeteer.default.launch({
147
+ env: this.options.verbose ? {
148
+ DEBUG: '*',
149
+ ...process.env
150
+ } : undefined,
151
+ headless,
152
+ executablePath,
153
+ args,
154
+ timeout
155
+ });
156
+ this.cleanups.push(async () => {
157
+ debug('closing the browser');
158
+ await browser.close();
159
+ });
160
+ if (this.options.prepareBrowser) {
161
+ debug("execute 'prepareBrowser' interceptor provided in options");
162
+ await this.options.prepareBrowser(browser);
163
+ }
164
+ debug('create a new browser page');
165
+ return browser.newPage();
166
+ }
167
+ async navigateTo(url, waitUntil = 'load', retries = this.options.navigationRetryCount ?? 0) {
168
+ const response = await this.page?.goto(url, {
169
+ waitUntil
170
+ });
171
+ if (response === null) {
172
+ // note: response will be null when navigating to same url while changing the hash part.
173
+ // the condition below will always accept null as valid result.
174
+ return;
175
+ }
176
+ if (!response) {
177
+ throw new Error(`Error while trying to navigate to url ${url}, response is undefined`);
178
+ }
179
+ if (!response.ok()) {
180
+ const status = response.status();
181
+ if (retries > 0) {
182
+ debug(`Failed to navigate to url ${url}, status code: ${status}, retrying ${retries} more times`);
183
+ await this.navigateTo(url, waitUntil, retries - 1);
184
+ } else {
185
+ throw new Error(`Failed to navigate to url ${url}, status code: ${status}`);
186
+ }
187
+ }
188
+ }
189
+
190
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
191
+ getLoginOptions(_credentials) {
192
+ throw new Error(`getLoginOptions() is not created in ${this.options.companyId}`);
193
+ }
194
+ async fillInputs(pageOrFrame, fields) {
195
+ const modified = [...fields];
196
+ const input = modified.shift();
197
+ if (!input) {
198
+ return;
199
+ }
200
+ await (0, _elementsInteractions.fillInput)(pageOrFrame, input.selector, input.value);
201
+ if (modified.length) {
202
+ await this.fillInputs(pageOrFrame, modified);
203
+ }
204
+ }
205
+ async login(credentials) {
206
+ if (!credentials || !this.page) {
207
+ return createGeneralError();
208
+ }
209
+ debug('execute login process');
210
+ const loginOptions = this.getLoginOptions(credentials);
211
+ if (loginOptions.userAgent) {
212
+ debug('set custom user agent provided in options');
213
+ await this.page.setUserAgent(loginOptions.userAgent);
214
+ }
215
+ debug('navigate to login url');
216
+ await this.navigateTo(loginOptions.loginUrl, loginOptions.waitUntil);
217
+ if (loginOptions.checkReadiness) {
218
+ debug("execute 'checkReadiness' interceptor provided in login options");
219
+ await loginOptions.checkReadiness();
220
+ } else if (typeof loginOptions.submitButtonSelector === 'string') {
221
+ debug('wait until submit button is available');
222
+ await (0, _elementsInteractions.waitUntilElementFound)(this.page, loginOptions.submitButtonSelector);
223
+ }
224
+ let loginFrameOrPage = this.page;
225
+ if (loginOptions.preAction) {
226
+ debug("execute 'preAction' interceptor provided in login options");
227
+ loginFrameOrPage = (await loginOptions.preAction()) || this.page;
228
+ }
229
+ debug('fill login components input with relevant values');
230
+ await this.fillInputs(loginFrameOrPage, loginOptions.fields);
231
+ debug('click on login submit button');
232
+ if (typeof loginOptions.submitButtonSelector === 'string') {
233
+ await (0, _elementsInteractions.clickButton)(loginFrameOrPage, loginOptions.submitButtonSelector);
234
+ } else {
235
+ await loginOptions.submitButtonSelector();
236
+ }
237
+ this.emitProgress(_definitions.ScraperProgressTypes.LoggingIn);
238
+ if (loginOptions.postAction) {
239
+ debug("execute 'postAction' interceptor provided in login options");
240
+ await loginOptions.postAction();
241
+ } else {
242
+ debug('wait for page navigation');
243
+ await (0, _navigation.waitForNavigation)(this.page);
244
+ }
245
+ debug('check login result');
246
+ const current = await (0, _navigation.getCurrentUrl)(this.page, true);
247
+ const loginResult = await getKeyByValue(loginOptions.possibleResults, current, this.page);
248
+ debug(`handle login results ${loginResult}`);
249
+ return this.handleLoginResult(loginResult);
250
+ }
251
+ async terminate(_success) {
252
+ debug(`terminating browser with success = ${_success}`);
253
+ this.emitProgress(_definitions.ScraperProgressTypes.Terminating);
254
+ if (!_success && !!this.options.storeFailureScreenShotPath) {
255
+ debug(`create a snapshot before terminated in ${this.options.storeFailureScreenShotPath}`);
256
+ await this.page.screenshot({
257
+ path: this.options.storeFailureScreenShotPath,
258
+ fullPage: true
259
+ });
260
+ }
261
+ await Promise.all(this.cleanups.reverse().map(safeCleanup));
262
+ this.cleanups = [];
263
+ }
264
+ handleLoginResult(loginResult) {
265
+ switch (loginResult) {
266
+ case LoginResults.Success:
267
+ this.emitProgress(_definitions.ScraperProgressTypes.LoginSuccess);
268
+ return {
269
+ success: true
270
+ };
271
+ case LoginResults.InvalidPassword:
272
+ case LoginResults.UnknownError:
273
+ this.emitProgress(_definitions.ScraperProgressTypes.LoginFailed);
274
+ return {
275
+ success: false,
276
+ errorType: loginResult === LoginResults.InvalidPassword ? _errors.ScraperErrorTypes.InvalidPassword : _errors.ScraperErrorTypes.General,
277
+ errorMessage: `Login failed with ${loginResult} error`
278
+ };
279
+ case LoginResults.ChangePassword:
280
+ this.emitProgress(_definitions.ScraperProgressTypes.ChangePassword);
281
+ return {
282
+ success: false,
283
+ errorType: _errors.ScraperErrorTypes.ChangePassword
284
+ };
285
+ default:
286
+ throw new Error(`unexpected login result "${loginResult}"`);
287
+ }
288
+ }
289
+ }
290
+ exports.BaseScraperWithBrowser = BaseScraperWithBrowser;
291
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHVwcGV0ZWVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZGVmaW5pdGlvbnMiLCJfZGVidWciLCJfZWxlbWVudHNJbnRlcmFjdGlvbnMiLCJfbmF2aWdhdGlvbiIsIl9iYXNlU2NyYXBlciIsIl9lcnJvcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImdldERlYnVnIiwiTG9naW5CYXNlUmVzdWx0cyIsIlRpbWVvdXQiLCJHZW5lcmljIiwiR2VuZXJhbCIsInJlc3QiLCJTY3JhcGVyRXJyb3JUeXBlcyIsIkxvZ2luUmVzdWx0cyIsImV4cG9ydHMiLCJnZXRLZXlCeVZhbHVlIiwib2JqZWN0IiwidmFsdWUiLCJwYWdlIiwia2V5cyIsIk9iamVjdCIsImtleSIsImNvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJyZXN1bHQiLCJSZWdFeHAiLCJ0ZXN0IiwidG9Mb3dlckNhc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsIlVua25vd25FcnJvciIsImNyZWF0ZUdlbmVyYWxFcnJvciIsInN1Y2Nlc3MiLCJlcnJvclR5cGUiLCJzYWZlQ2xlYW51cCIsImNsZWFudXAiLCJtZXNzYWdlIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsIkJhc2VTY3JhcGVyIiwiY2xlYW51cHMiLCJkZWZhdWx0Vmlld3BvcnRTaXplIiwid2lkdGgiLCJoZWlnaHQiLCJnZXRWaWV3UG9ydCIsIm9wdGlvbnMiLCJ2aWV3cG9ydFNpemUiLCJpbml0aWFsaXplIiwiZW1pdFByb2dyZXNzIiwiU2NyYXBlclByb2dyZXNzVHlwZXMiLCJJbml0aWFsaXppbmciLCJpbml0aWFsaXplUGFnZSIsInNldENhY2hlRW5hYmxlZCIsInB1c2giLCJjbG9zZSIsImRlZmF1bHRUaW1lb3V0Iiwic2V0RGVmYXVsdFRpbWVvdXQiLCJwcmVwYXJlUGFnZSIsInZpZXdwb3J0Iiwic2V0Vmlld3BvcnQiLCJvbiIsInJlcXVlc3QiLCJmYWlsdXJlIiwiZXJyb3JUZXh0IiwidXJsIiwiYnJvd3NlckNvbnRleHQiLCJuZXdQYWdlIiwiYnJvd3NlciIsInNraXBDbG9zZUJyb3dzZXIiLCJ0aW1lb3V0IiwiYXJncyIsImV4ZWN1dGFibGVQYXRoIiwic2hvd0Jyb3dzZXIiLCJoZWFkbGVzcyIsInB1cHBldGVlciIsImxhdW5jaCIsImVudiIsInZlcmJvc2UiLCJERUJVRyIsInByb2Nlc3MiLCJ1bmRlZmluZWQiLCJwcmVwYXJlQnJvd3NlciIsIm5hdmlnYXRlVG8iLCJ3YWl0VW50aWwiLCJyZXRyaWVzIiwibmF2aWdhdGlvblJldHJ5Q291bnQiLCJyZXNwb25zZSIsImdvdG8iLCJFcnJvciIsIm9rIiwic3RhdHVzIiwiZ2V0TG9naW5PcHRpb25zIiwiX2NyZWRlbnRpYWxzIiwiY29tcGFueUlkIiwiZmlsbElucHV0cyIsInBhZ2VPckZyYW1lIiwiZmllbGRzIiwibW9kaWZpZWQiLCJpbnB1dCIsInNoaWZ0IiwiZmlsbElucHV0Iiwic2VsZWN0b3IiLCJsZW5ndGgiLCJsb2dpbiIsImNyZWRlbnRpYWxzIiwibG9naW5PcHRpb25zIiwidXNlckFnZW50Iiwic2V0VXNlckFnZW50IiwibG9naW5VcmwiLCJjaGVja1JlYWRpbmVzcyIsInN1Ym1pdEJ1dHRvblNlbGVjdG9yIiwid2FpdFVudGlsRWxlbWVudEZvdW5kIiwibG9naW5GcmFtZU9yUGFnZSIsInByZUFjdGlvbiIsImNsaWNrQnV0dG9uIiwiTG9nZ2luZ0luIiwicG9zdEFjdGlvbiIsIndhaXRGb3JOYXZpZ2F0aW9uIiwiY3VycmVudCIsImdldEN1cnJlbnRVcmwiLCJsb2dpblJlc3VsdCIsInBvc3NpYmxlUmVzdWx0cyIsImhhbmRsZUxvZ2luUmVzdWx0IiwidGVybWluYXRlIiwiX3N1Y2Nlc3MiLCJUZXJtaW5hdGluZyIsInN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoIiwic2NyZWVuc2hvdCIsInBhdGgiLCJmdWxsUGFnZSIsImFsbCIsInJldmVyc2UiLCJtYXAiLCJTdWNjZXNzIiwiTG9naW5TdWNjZXNzIiwiSW52YWxpZFBhc3N3b3JkIiwiTG9naW5GYWlsZWQiLCJlcnJvck1lc3NhZ2UiLCJDaGFuZ2VQYXNzd29yZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXItd2l0aC1icm93c2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBGcmFtZSwgdHlwZSBQYWdlLCB0eXBlIFB1cHBldGVlckxpZmVDeWNsZUV2ZW50IH0gZnJvbSAncHVwcGV0ZWVyJztcbmltcG9ydCB7IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0gZnJvbSAnLi4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgZ2V0RGVidWcgfSBmcm9tICcuLi9oZWxwZXJzL2RlYnVnJztcbmltcG9ydCB7IGNsaWNrQnV0dG9uLCBmaWxsSW5wdXQsIHdhaXRVbnRpbEVsZW1lbnRGb3VuZCB9IGZyb20gJy4uL2hlbHBlcnMvZWxlbWVudHMtaW50ZXJhY3Rpb25zJztcbmltcG9ydCB7IGdldEN1cnJlbnRVcmwsIHdhaXRGb3JOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vaGVscGVycy9uYXZpZ2F0aW9uJztcbmltcG9ydCB7IEJhc2VTY3JhcGVyIH0gZnJvbSAnLi9iYXNlLXNjcmFwZXInO1xuaW1wb3J0IHsgU2NyYXBlckVycm9yVHlwZXMgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFNjcmFwZXJDcmVkZW50aWFscywgdHlwZSBTY3JhcGVyU2NyYXBpbmdSZXN1bHQgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoJ2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXInKTtcblxuZW51bSBMb2dpbkJhc2VSZXN1bHRzIHtcbiAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgVW5rbm93bkVycm9yID0gJ1VOS05PV05fRVJST1InLFxufVxuXG5jb25zdCB7IFRpbWVvdXQsIEdlbmVyaWMsIEdlbmVyYWwsIC4uLnJlc3QgfSA9IFNjcmFwZXJFcnJvclR5cGVzO1xuZXhwb3J0IGNvbnN0IExvZ2luUmVzdWx0cyA9IHtcbiAgLi4ucmVzdCxcbiAgLi4uTG9naW5CYXNlUmVzdWx0cyxcbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVkZWNsYXJlXG5leHBvcnQgdHlwZSBMb2dpblJlc3VsdHMgPVxuICB8IEV4Y2x1ZGU8U2NyYXBlckVycm9yVHlwZXMsIFNjcmFwZXJFcnJvclR5cGVzLlRpbWVvdXQgfCBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmljIHwgU2NyYXBlckVycm9yVHlwZXMuR2VuZXJhbD5cbiAgfCBMb2dpbkJhc2VSZXN1bHRzO1xuXG5leHBvcnQgdHlwZSBQb3NzaWJsZUxvZ2luUmVzdWx0cyA9IHtcbiAgW2tleSBpbiBMb2dpblJlc3VsdHNdPzogKHN0cmluZyB8IFJlZ0V4cCB8ICgob3B0aW9ucz86IHsgcGFnZT86IFBhZ2UgfSkgPT4gUHJvbWlzZTxib29sZWFuPikpW107XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luT3B0aW9ucyB7XG4gIGxvZ2luVXJsOiBzdHJpbmc7XG4gIGNoZWNrUmVhZGluZXNzPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZmllbGRzOiB7IHNlbGVjdG9yOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdO1xuICBzdWJtaXRCdXR0b25TZWxlY3Rvcjogc3RyaW5nIHwgKCgpID0+IFByb21pc2U8dm9pZD4pO1xuICBwcmVBY3Rpb24/OiAoKSA9PiBQcm9taXNlPEZyYW1lIHwgdm9pZD47XG4gIHBvc3RBY3Rpb24/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwb3NzaWJsZVJlc3VsdHM6IFBvc3NpYmxlTG9naW5SZXN1bHRzO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIHdhaXRVbnRpbD86IFB1cHBldGVlckxpZmVDeWNsZUV2ZW50O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRLZXlCeVZhbHVlKG9iamVjdDogUG9zc2libGVMb2dpblJlc3VsdHMsIHZhbHVlOiBzdHJpbmcsIHBhZ2U6IFBhZ2UpOiBQcm9taXNlPExvZ2luUmVzdWx0cz4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBjb25kaXRpb25zID0gb2JqZWN0W2tleV07XG5cbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgIGlmIChjb25kaXRpb24gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmVzdWx0ID0gY29uZGl0aW9uLnRlc3QodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbmRpdGlvbih7IHBhZ2UsIHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gY29uZGl0aW9uLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShMb2dpblJlc3VsdHMuVW5rbm93bkVycm9yKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR2VuZXJhbEVycm9yKCk6IFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgc3VjY2VzczogZmFsc2UsXG4gICAgZXJyb3JUeXBlOiBTY3JhcGVyRXJyb3JUeXBlcy5HZW5lcmFsLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYWZlQ2xlYW51cChjbGVhbnVwOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xlYW51cCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGVidWcoYENsZWFudXAgZnVuY3Rpb24gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG5cbmNsYXNzIEJhc2VTY3JhcGVyV2l0aEJyb3dzZXI8VENyZWRlbnRpYWxzIGV4dGVuZHMgU2NyYXBlckNyZWRlbnRpYWxzPiBleHRlbmRzIEJhc2VTY3JhcGVyPFRDcmVkZW50aWFscz4ge1xuICBwcml2YXRlIGNsZWFudXBzOiBBcnJheTwoKSA9PiBQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gIHByaXZhdGUgZGVmYXVsdFZpZXdwb3J0U2l6ZSA9IHtcbiAgICB3aWR0aDogMTAyNCxcbiAgICBoZWlnaHQ6IDc2OCxcbiAgfTtcblxuICAvLyBOT1RJQ0UgLSBpdCBpcyBkaXNjb3VyYWdlZCB0byB1c2UgYmFuZyAoISkgaW4gZ2VuZXJhbC4gSXQgaXMgdXNlZCBoZXJlIGJlY2F1c2VcbiAgLy8gYWxsIHRoZSBjbGFzc2VzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgYmFzZSBhc3N1bWUgaXMgaXQgbWFuZGF0b3J5LlxuICBwcm90ZWN0ZWQgcGFnZSE6IFBhZ2U7XG5cbiAgcHJvdGVjdGVkIGdldFZpZXdQb3J0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmlld3BvcnRTaXplID8/IHRoaXMuZGVmYXVsdFZpZXdwb3J0U2l6ZTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gICAgYXdhaXQgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIGRlYnVnKCdpbml0aWFsaXplIHNjcmFwZXInKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Jbml0aWFsaXppbmcpO1xuXG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVBhZ2UoKTtcbiAgICBhd2FpdCBwYWdlLnNldENhY2hlRW5hYmxlZChmYWxzZSk7IC8vIENsZWFyIGNhY2hlIGFuZCBhdm9pZCAzMDAncyByZXNwb25zZSBzdGF0dXNcblxuICAgIGlmICghcGFnZSkge1xuICAgICAgZGVidWcoJ2ZhaWxlZCB0byBpbml0aWF0ZSBhIGJyb3dzZXIgcGFnZSwgZXhpdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG5cbiAgICB0aGlzLmNsZWFudXBzLnB1c2goKCkgPT4gcGFnZS5jbG9zZSgpKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGVmYXVsdFRpbWVvdXQpIHtcbiAgICAgIHRoaXMucGFnZS5zZXREZWZhdWx0VGltZW91dCh0aGlzLm9wdGlvbnMuZGVmYXVsdFRpbWVvdXQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucHJlcGFyZVBhZ2UpIHtcbiAgICAgIGRlYnVnKFwiZXhlY3V0ZSAncHJlcGFyZVBhZ2UnIGludGVyY2VwdG9yIHByb3ZpZGVkIGluIG9wdGlvbnNcIik7XG4gICAgICBhd2FpdCB0aGlzLm9wdGlvbnMucHJlcGFyZVBhZ2UodGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld1BvcnQoKTtcbiAgICBkZWJ1Zyhgc2V0IHZpZXdwb3J0IHRvIHdpZHRoICR7dmlld3BvcnQud2lkdGh9LCBoZWlnaHQgJHt2aWV3cG9ydC5oZWlnaHR9YCk7XG4gICAgYXdhaXQgdGhpcy5wYWdlLnNldFZpZXdwb3J0KHtcbiAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgIGhlaWdodDogdmlld3BvcnQuaGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWdlLm9uKCdyZXF1ZXN0ZmFpbGVkJywgcmVxdWVzdCA9PiB7XG4gICAgICBkZWJ1ZygnUmVxdWVzdCBmYWlsZWQ6ICVzICVzJywgcmVxdWVzdC5mYWlsdXJlKCk/LmVycm9yVGV4dCwgcmVxdWVzdC51cmwoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVQYWdlKCkge1xuICAgIGRlYnVnKCdpbml0aWFsaXplIGJyb3dzZXIgcGFnZScpO1xuICAgIGlmICgnYnJvd3NlckNvbnRleHQnIGluIHRoaXMub3B0aW9ucykge1xuICAgICAgZGVidWcoJ1VzaW5nIHRoZSBicm93c2VyIGNvbnRleHQgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5icm93c2VyQ29udGV4dC5uZXdQYWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKCdicm93c2VyJyBpbiB0aGlzLm9wdGlvbnMpIHtcbiAgICAgIGRlYnVnKCdVc2luZyB0aGUgYnJvd3NlciBpbnN0YW5jZSBwcm92aWRlZCBpbiBvcHRpb25zJyk7XG4gICAgICBjb25zdCB7IGJyb3dzZXIgfSA9IHRoaXMub3B0aW9ucztcblxuICAgICAgLyoqXG4gICAgICAgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2Ugd2lsbCBjbG9zZSB0aGUgYnJvd3NlciBldmVuIGlmIHdlIGRpZG4ndCBjcmVhdGUgaXRcbiAgICAgICAqL1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcENsb3NlQnJvd3Nlcikge1xuICAgICAgICB0aGlzLmNsZWFudXBzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGRlYnVnKCdjbG9zaW5nIHRoZSBicm93c2VyJyk7XG4gICAgICAgICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJyb3dzZXIubmV3UGFnZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGltZW91dCwgYXJncywgZXhlY3V0YWJsZVBhdGgsIHNob3dCcm93c2VyIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCBoZWFkbGVzcyA9ICFzaG93QnJvd3NlcjtcbiAgICBkZWJ1ZyhgbGF1bmNoIGEgYnJvd3NlciB3aXRoIGhlYWRsZXNzIG1vZGUgPSAke2hlYWRsZXNzfWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goe1xuICAgICAgZW52OiB0aGlzLm9wdGlvbnMudmVyYm9zZSA/IHsgREVCVUc6ICcqJywgLi4ucHJvY2Vzcy5lbnYgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGhlYWRsZXNzLFxuICAgICAgZXhlY3V0YWJsZVBhdGgsXG4gICAgICBhcmdzLFxuICAgICAgdGltZW91dCxcbiAgICB9KTtcblxuICAgIHRoaXMuY2xlYW51cHMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICBkZWJ1ZygnY2xvc2luZyB0aGUgYnJvd3NlcicpO1xuICAgICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wcmVwYXJlQnJvd3Nlcikge1xuICAgICAgZGVidWcoXCJleGVjdXRlICdwcmVwYXJlQnJvd3NlcicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IHRoaXMub3B0aW9ucy5wcmVwYXJlQnJvd3Nlcihicm93c2VyKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnY3JlYXRlIGEgbmV3IGJyb3dzZXIgcGFnZScpO1xuICAgIHJldHVybiBicm93c2VyLm5ld1BhZ2UoKTtcbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG8oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgd2FpdFVudGlsOiBQdXBwZXRlZXJMaWZlQ3ljbGVFdmVudCB8IHVuZGVmaW5lZCA9ICdsb2FkJyxcbiAgICByZXRyaWVzID0gdGhpcy5vcHRpb25zLm5hdmlnYXRpb25SZXRyeUNvdW50ID8/IDAsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wYWdlPy5nb3RvKHVybCwgeyB3YWl0VW50aWwgfSk7XG4gICAgaWYgKHJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgICAvLyBub3RlOiByZXNwb25zZSB3aWxsIGJlIG51bGwgd2hlbiBuYXZpZ2F0aW5nIHRvIHNhbWUgdXJsIHdoaWxlIGNoYW5naW5nIHRoZSBoYXNoIHBhcnQuXG4gICAgICAvLyB0aGUgY29uZGl0aW9uIGJlbG93IHdpbGwgYWx3YXlzIGFjY2VwdCBudWxsIGFzIHZhbGlkIHJlc3VsdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIHRyeWluZyB0byBuYXZpZ2F0ZSB0byB1cmwgJHt1cmx9LCByZXNwb25zZSBpcyB1bmRlZmluZWRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKCkpIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cygpO1xuICAgICAgaWYgKHJldHJpZXMgPiAwKSB7XG4gICAgICAgIGRlYnVnKGBGYWlsZWQgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfSwgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfSwgcmV0cnlpbmcgJHtyZXRyaWVzfSBtb3JlIHRpbWVzYCk7XG4gICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGVUbyh1cmwsIHdhaXRVbnRpbCwgcmV0cmllcyAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbmF2aWdhdGUgdG8gdXJsICR7dXJsfSwgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZ2V0TG9naW5PcHRpb25zKF9jcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogTG9naW5PcHRpb25zIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdldExvZ2luT3B0aW9ucygpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGxJbnB1dHMocGFnZU9yRnJhbWU6IFBhZ2UgfCBGcmFtZSwgZmllbGRzOiB7IHNlbGVjdG9yOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbW9kaWZpZWQgPSBbLi4uZmllbGRzXTtcbiAgICBjb25zdCBpbnB1dCA9IG1vZGlmaWVkLnNoaWZ0KCk7XG5cbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZpbGxJbnB1dChwYWdlT3JGcmFtZSwgaW5wdXQuc2VsZWN0b3IsIGlucHV0LnZhbHVlKTtcbiAgICBpZiAobW9kaWZpZWQubGVuZ3RoKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGxJbnB1dHMocGFnZU9yRnJhbWUsIG1vZGlmaWVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dpbihjcmVkZW50aWFsczogU2NyYXBlckNyZWRlbnRpYWxzKTogUHJvbWlzZTxTY3JhcGVyU2NyYXBpbmdSZXN1bHQ+IHtcbiAgICBpZiAoIWNyZWRlbnRpYWxzIHx8ICF0aGlzLnBhZ2UpIHtcbiAgICAgIHJldHVybiBjcmVhdGVHZW5lcmFsRXJyb3IoKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnZXhlY3V0ZSBsb2dpbiBwcm9jZXNzJyk7XG4gICAgY29uc3QgbG9naW5PcHRpb25zID0gdGhpcy5nZXRMb2dpbk9wdGlvbnMoY3JlZGVudGlhbHMpO1xuXG4gICAgaWYgKGxvZ2luT3B0aW9ucy51c2VyQWdlbnQpIHtcbiAgICAgIGRlYnVnKCdzZXQgY3VzdG9tIHVzZXIgYWdlbnQgcHJvdmlkZWQgaW4gb3B0aW9ucycpO1xuICAgICAgYXdhaXQgdGhpcy5wYWdlLnNldFVzZXJBZ2VudChsb2dpbk9wdGlvbnMudXNlckFnZW50KTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnbmF2aWdhdGUgdG8gbG9naW4gdXJsJyk7XG4gICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvKGxvZ2luT3B0aW9ucy5sb2dpblVybCwgbG9naW5PcHRpb25zLndhaXRVbnRpbCk7XG4gICAgaWYgKGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcykge1xuICAgICAgZGVidWcoXCJleGVjdXRlICdjaGVja1JlYWRpbmVzcycgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5jaGVja1JlYWRpbmVzcygpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvZ2luT3B0aW9ucy5zdWJtaXRCdXR0b25TZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRlYnVnKCd3YWl0IHVudGlsIHN1Ym1pdCBidXR0b24gaXMgYXZhaWxhYmxlJyk7XG4gICAgICBhd2FpdCB3YWl0VW50aWxFbGVtZW50Rm91bmQodGhpcy5wYWdlLCBsb2dpbk9wdGlvbnMuc3VibWl0QnV0dG9uU2VsZWN0b3IpO1xuICAgIH1cblxuICAgIGxldCBsb2dpbkZyYW1lT3JQYWdlOiBQYWdlIHwgRnJhbWUgfCBudWxsID0gdGhpcy5wYWdlO1xuICAgIGlmIChsb2dpbk9wdGlvbnMucHJlQWN0aW9uKSB7XG4gICAgICBkZWJ1ZyhcImV4ZWN1dGUgJ3ByZUFjdGlvbicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGxvZ2luRnJhbWVPclBhZ2UgPSAoYXdhaXQgbG9naW5PcHRpb25zLnByZUFjdGlvbigpKSB8fCB0aGlzLnBhZ2U7XG4gICAgfVxuXG4gICAgZGVidWcoJ2ZpbGwgbG9naW4gY29tcG9uZW50cyBpbnB1dCB3aXRoIHJlbGV2YW50IHZhbHVlcycpO1xuICAgIGF3YWl0IHRoaXMuZmlsbElucHV0cyhsb2dpbkZyYW1lT3JQYWdlLCBsb2dpbk9wdGlvbnMuZmllbGRzKTtcbiAgICBkZWJ1ZygnY2xpY2sgb24gbG9naW4gc3VibWl0IGJ1dHRvbicpO1xuICAgIGlmICh0eXBlb2YgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgYXdhaXQgY2xpY2tCdXR0b24obG9naW5GcmFtZU9yUGFnZSwgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgbG9naW5PcHRpb25zLnN1Ym1pdEJ1dHRvblNlbGVjdG9yKCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2dpbmdJbik7XG5cbiAgICBpZiAobG9naW5PcHRpb25zLnBvc3RBY3Rpb24pIHtcbiAgICAgIGRlYnVnKFwiZXhlY3V0ZSAncG9zdEFjdGlvbicgaW50ZXJjZXB0b3IgcHJvdmlkZWQgaW4gbG9naW4gb3B0aW9uc1wiKTtcbiAgICAgIGF3YWl0IGxvZ2luT3B0aW9ucy5wb3N0QWN0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCd3YWl0IGZvciBwYWdlIG5hdmlnYXRpb24nKTtcbiAgICAgIGF3YWl0IHdhaXRGb3JOYXZpZ2F0aW9uKHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2NoZWNrIGxvZ2luIHJlc3VsdCcpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRDdXJyZW50VXJsKHRoaXMucGFnZSwgdHJ1ZSk7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBnZXRLZXlCeVZhbHVlKGxvZ2luT3B0aW9ucy5wb3NzaWJsZVJlc3VsdHMsIGN1cnJlbnQsIHRoaXMucGFnZSk7XG4gICAgZGVidWcoYGhhbmRsZSBsb2dpbiByZXN1bHRzICR7bG9naW5SZXN1bHR9YCk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9naW5SZXN1bHQobG9naW5SZXN1bHQpO1xuICB9XG5cbiAgYXN5bmMgdGVybWluYXRlKF9zdWNjZXNzOiBib29sZWFuKSB7XG4gICAgZGVidWcoYHRlcm1pbmF0aW5nIGJyb3dzZXIgd2l0aCBzdWNjZXNzID0gJHtfc3VjY2Vzc31gKTtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5UZXJtaW5hdGluZyk7XG5cbiAgICBpZiAoIV9zdWNjZXNzICYmICEhdGhpcy5vcHRpb25zLnN0b3JlRmFpbHVyZVNjcmVlblNob3RQYXRoKSB7XG4gICAgICBkZWJ1ZyhgY3JlYXRlIGEgc25hcHNob3QgYmVmb3JlIHRlcm1pbmF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuc3RvcmVGYWlsdXJlU2NyZWVuU2hvdFBhdGh9YCk7XG4gICAgICBhd2FpdCB0aGlzLnBhZ2Uuc2NyZWVuc2hvdCh7XG4gICAgICAgIHBhdGg6IHRoaXMub3B0aW9ucy5zdG9yZUZhaWx1cmVTY3JlZW5TaG90UGF0aCxcbiAgICAgICAgZnVsbFBhZ2U6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmNsZWFudXBzLnJldmVyc2UoKS5tYXAoc2FmZUNsZWFudXApKTtcbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvZ2luUmVzdWx0KGxvZ2luUmVzdWx0OiBMb2dpblJlc3VsdHMpIHtcbiAgICBzd2l0Y2ggKGxvZ2luUmVzdWx0KSB7XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5TdWNjZXNzOlxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Mb2dpblN1Y2Nlc3MpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5JbnZhbGlkUGFzc3dvcmQ6XG4gICAgICBjYXNlIExvZ2luUmVzdWx0cy5Vbmtub3duRXJyb3I6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkxvZ2luRmFpbGVkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6XG4gICAgICAgICAgICBsb2dpblJlc3VsdCA9PT0gTG9naW5SZXN1bHRzLkludmFsaWRQYXNzd29yZFxuICAgICAgICAgICAgICA/IFNjcmFwZXJFcnJvclR5cGVzLkludmFsaWRQYXNzd29yZFxuICAgICAgICAgICAgICA6IFNjcmFwZXJFcnJvclR5cGVzLkdlbmVyYWwsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBgTG9naW4gZmFpbGVkIHdpdGggJHtsb2dpblJlc3VsdH0gZXJyb3JgLFxuICAgICAgICB9O1xuICAgICAgY2FzZSBMb2dpblJlc3VsdHMuQ2hhbmdlUGFzc3dvcmQ6XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLkNoYW5nZVBhc3N3b3JkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvclR5cGU6IFNjcmFwZXJFcnJvclR5cGVzLkNoYW5nZVBhc3N3b3JkLFxuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIGxvZ2luIHJlc3VsdCBcIiR7bG9naW5SZXN1bHR9XCJgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxxQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBQTZDLFNBQUFELHVCQUFBUSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRzdDLE1BQU1HLEtBQUssR0FBRyxJQUFBQyxlQUFRLEVBQUMsMkJBQTJCLENBQUM7QUFBQyxJQUUvQ0MsZ0JBQWdC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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _testsUtils = require("../tests/tests-utils");
4
+ var _baseScraperWithBrowser = require("./base-scraper-with-browser");
5
+ const testsConfig = (0, _testsUtils.getTestsConfig)();
6
+ function isNoSandbox(browser) {
7
+ // eslint-disable-next-line no-underscore-dangle
8
+ const args = browser._process.spawnargs;
9
+ return args.includes('--no-sandbox');
10
+ }
11
+ describe('Base scraper with browser', () => {
12
+ beforeAll(() => {
13
+ (0, _testsUtils.extendAsyncTimeout)(); // The default timeout is 5 seconds per async test, this function extends the timeout value
14
+ });
15
+ xtest('should pass custom args to scraper if provided', async () => {
16
+ const options = {
17
+ ...testsConfig.options,
18
+ companyId: 'test',
19
+ showBrowser: false,
20
+ args: []
21
+ };
22
+
23
+ // avoid false-positive result by confirming that --no-sandbox is not a default flag provided by puppeteer
24
+ let baseScraperWithBrowser = new _baseScraperWithBrowser.BaseScraperWithBrowser(options);
25
+ try {
26
+ await baseScraperWithBrowser.initialize();
27
+ // @ts-ignore
28
+ expect(baseScraperWithBrowser.browser).toBeDefined();
29
+ // @ts-ignore
30
+ expect(isNoSandbox(baseScraperWithBrowser.browser)).toBe(false);
31
+ await baseScraperWithBrowser.terminate(true);
32
+ } catch (e) {
33
+ await baseScraperWithBrowser.terminate(false);
34
+ throw e;
35
+ }
36
+
37
+ // set --no-sandbox flag and expect it to be passed by puppeteer.lunch to the new created browser instance
38
+ options.args = ['--no-sandbox', '--disable-gpu', '--window-size=1920x1080'];
39
+ baseScraperWithBrowser = new _baseScraperWithBrowser.BaseScraperWithBrowser(options);
40
+ try {
41
+ await baseScraperWithBrowser.initialize();
42
+ // @ts-ignore
43
+ expect(baseScraperWithBrowser.browser).toBeDefined();
44
+ // @ts-ignore
45
+ expect(isNoSandbox(baseScraperWithBrowser.browser)).toBe(true);
46
+ await baseScraperWithBrowser.terminate(true);
47
+ } catch (e) {
48
+ await baseScraperWithBrowser.terminate(false);
49
+ throw e;
50
+ }
51
+ });
52
+ });
53
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdGVzdHNVdGlscyIsInJlcXVpcmUiLCJfYmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsInRlc3RzQ29uZmlnIiwiZ2V0VGVzdHNDb25maWciLCJpc05vU2FuZGJveCIsImJyb3dzZXIiLCJhcmdzIiwiX3Byb2Nlc3MiLCJzcGF3bmFyZ3MiLCJpbmNsdWRlcyIsImRlc2NyaWJlIiwiYmVmb3JlQWxsIiwiZXh0ZW5kQXN5bmNUaW1lb3V0IiwieHRlc3QiLCJvcHRpb25zIiwiY29tcGFueUlkIiwic2hvd0Jyb3dzZXIiLCJiYXNlU2NyYXBlcldpdGhCcm93c2VyIiwiQmFzZVNjcmFwZXJXaXRoQnJvd3NlciIsImluaXRpYWxpemUiLCJleHBlY3QiLCJ0b0JlRGVmaW5lZCIsInRvQmUiLCJ0ZXJtaW5hdGUiLCJlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmFwZXJzL2Jhc2Utc2NyYXBlci13aXRoLWJyb3dzZXIudGVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRlbmRBc3luY1RpbWVvdXQsIGdldFRlc3RzQ29uZmlnIH0gZnJvbSAnLi4vdGVzdHMvdGVzdHMtdXRpbHMnO1xuaW1wb3J0IHsgQmFzZVNjcmFwZXJXaXRoQnJvd3NlciB9IGZyb20gJy4vYmFzZS1zY3JhcGVyLXdpdGgtYnJvd3Nlcic7XG5cbmNvbnN0IHRlc3RzQ29uZmlnID0gZ2V0VGVzdHNDb25maWcoKTtcblxuZnVuY3Rpb24gaXNOb1NhbmRib3goYnJvd3NlcjogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuICBjb25zdCBhcmdzID0gYnJvd3Nlci5fcHJvY2Vzcy5zcGF3bmFyZ3M7XG4gIHJldHVybiBhcmdzLmluY2x1ZGVzKCctLW5vLXNhbmRib3gnKTtcbn1cblxuZGVzY3JpYmUoJ0Jhc2Ugc2NyYXBlciB3aXRoIGJyb3dzZXInLCAoKSA9PiB7XG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgZXh0ZW5kQXN5bmNUaW1lb3V0KCk7IC8vIFRoZSBkZWZhdWx0IHRpbWVvdXQgaXMgNSBzZWNvbmRzIHBlciBhc3luYyB0ZXN0LCB0aGlzIGZ1bmN0aW9uIGV4dGVuZHMgdGhlIHRpbWVvdXQgdmFsdWVcbiAgfSk7XG5cbiAgeHRlc3QoJ3Nob3VsZCBwYXNzIGN1c3RvbSBhcmdzIHRvIHNjcmFwZXIgaWYgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIC4uLnRlc3RzQ29uZmlnLm9wdGlvbnMsXG4gICAgICBjb21wYW55SWQ6ICd0ZXN0JyxcbiAgICAgIHNob3dCcm93c2VyOiBmYWxzZSxcbiAgICAgIGFyZ3M6IFtdLFxuICAgIH07XG5cbiAgICAvLyBhdm9pZCBmYWxzZS1wb3NpdGl2ZSByZXN1bHQgYnkgY29uZmlybWluZyB0aGF0IC0tbm8tc2FuZGJveCBpcyBub3QgYSBkZWZhdWx0IGZsYWcgcHJvdmlkZWQgYnkgcHVwcGV0ZWVyXG4gICAgbGV0IGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgPSBuZXcgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcihvcHRpb25zKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5pbml0aWFsaXplKCk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBleHBlY3QoYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5icm93c2VyKS50b0JlRGVmaW5lZCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGlzTm9TYW5kYm94KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikpLnRvQmUoZmFsc2UpO1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci50ZXJtaW5hdGUodHJ1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci50ZXJtaW5hdGUoZmFsc2UpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICAvLyBzZXQgLS1uby1zYW5kYm94IGZsYWcgYW5kIGV4cGVjdCBpdCB0byBiZSBwYXNzZWQgYnkgcHVwcGV0ZWVyLmx1bmNoIHRvIHRoZSBuZXcgY3JlYXRlZCBicm93c2VyIGluc3RhbmNlXG4gICAgb3B0aW9ucy5hcmdzID0gWyctLW5vLXNhbmRib3gnLCAnLS1kaXNhYmxlLWdwdScsICctLXdpbmRvdy1zaXplPTE5MjB4MTA4MCddO1xuICAgIGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIgPSBuZXcgQmFzZVNjcmFwZXJXaXRoQnJvd3NlcihvcHRpb25zKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5pbml0aWFsaXplKCk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBleHBlY3QoYmFzZVNjcmFwZXJXaXRoQnJvd3Nlci5icm93c2VyKS50b0JlRGVmaW5lZCgpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZXhwZWN0KGlzTm9TYW5kYm94KGJhc2VTY3JhcGVyV2l0aEJyb3dzZXIuYnJvd3NlcikpLnRvQmUodHJ1ZSk7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZSh0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhd2FpdCBiYXNlU2NyYXBlcldpdGhCcm93c2VyLnRlcm1pbmF0ZShmYWxzZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxXQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyx1QkFBQSxHQUFBRCxPQUFBO0FBRUEsTUFBTUUsV0FBVyxHQUFHLElBQUFDLDBCQUFjLEVBQUMsQ0FBQztBQUVwQyxTQUFTQyxXQUFXQSxDQUFDQyxPQUFZLEVBQUU7RUFDakM7RUFDQSxNQUFNQyxJQUFJLEdBQUdELE9BQU8sQ0FBQ0UsUUFBUSxDQUFDQyxTQUFTO0VBQ3ZDLE9BQU9GLElBQUksQ0FBQ0csUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUN0QztBQUVBQyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsTUFBTTtFQUMxQ0MsU0FBUyxDQUFDLE1BQU07SUFDZCxJQUFBQyw4QkFBa0IsRUFBQyxDQUFDLENBQUMsQ0FBQztFQUN4QixDQUFDLENBQUM7RUFFRkMsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLFlBQVk7SUFDbEUsTUFBTUMsT0FBTyxHQUFHO01BQ2QsR0FBR1osV0FBVyxDQUFDWSxPQUFPO01BQ3RCQyxTQUFTLEVBQUUsTUFBTTtNQUNqQkMsV0FBVyxFQUFFLEtBQUs7TUFDbEJWLElBQUksRUFBRTtJQUNSLENBQUM7O0lBRUQ7SUFDQSxJQUFJVyxzQkFBc0IsR0FBRyxJQUFJQyw4Q0FBc0IsQ0FBQ0osT0FBTyxDQUFDO0lBQ2hFLElBQUk7TUFDRixNQUFNRyxzQkFBc0IsQ0FBQ0UsVUFBVSxDQUFDLENBQUM7TUFDekM7TUFDQUMsTUFBTSxDQUFDSCxzQkFBc0IsQ0FBQ1osT0FBTyxDQUFDLENBQUNnQixXQUFXLENBQUMsQ0FBQztNQUNwRDtNQUNBRCxNQUFNLENBQUNoQixXQUFXLENBQUNhLHNCQUFzQixDQUFDWixPQUFPLENBQUMsQ0FBQyxDQUFDaUIsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUMvRCxNQUFNTCxzQkFBc0IsQ0FBQ00sU0FBUyxDQUFDLElBQUksQ0FBQztJQUM5QyxDQUFDLENBQUMsT0FBT0MsQ0FBQyxFQUFFO01BQ1YsTUFBTVAsc0JBQXNCLENBQUNNLFNBQVMsQ0FBQyxLQUFLLENBQUM7TUFDN0MsTUFBTUMsQ0FBQztJQUNUOztJQUVBO0lBQ0FWLE9BQU8sQ0FBQ1IsSUFBSSxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsQ0FBQztJQUMzRVcsc0JBQXNCLEdBQUcsSUFBSUMsOENBQXNCLENBQUNKLE9BQU8sQ0FBQztJQUM1RCxJQUFJO01BQ0YsTUFBTUcsc0JBQXNCLENBQUNFLFVBQVUsQ0FBQyxDQUFDO01BQ3pDO01BQ0FDLE1BQU0sQ0FBQ0gsc0JBQXNCLENBQUNaLE9BQU8sQ0FBQyxDQUFDZ0IsV0FBVyxDQUFDLENBQUM7TUFDcEQ7TUFDQUQsTUFBTSxDQUFDaEIsV0FBVyxDQUFDYSxzQkFBc0IsQ0FBQ1osT0FBTyxDQUFDLENBQUMsQ0FBQ2lCLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDOUQsTUFBTUwsc0JBQXNCLENBQUNNLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDOUMsQ0FBQyxDQUFDLE9BQU9DLENBQUMsRUFBRTtNQUNWLE1BQU1QLHNCQUFzQixDQUFDTSxTQUFTLENBQUMsS0FBSyxDQUFDO01BQzdDLE1BQU1DLENBQUM7SUFDVDtFQUNGLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,19 @@
1
+ import { type CompanyTypes, ScraperProgressTypes } from '../definitions';
2
+ import { type Scraper, type ScraperCredentials, type ScraperGetLongTermTwoFactorTokenResult, type ScraperLoginResult, type ScraperOptions, type ScraperScrapingResult, type ScraperTwoFactorAuthTriggerResult } from './interface';
3
+ export declare class BaseScraper<TCredentials extends ScraperCredentials> implements Scraper<TCredentials> {
4
+ options: ScraperOptions;
5
+ private eventEmitter;
6
+ constructor(options: ScraperOptions);
7
+ initialize(): Promise<void>;
8
+ scrape(credentials: TCredentials): Promise<ScraperScrapingResult>;
9
+ triggerTwoFactorAuth(_phoneNumber: string): Promise<ScraperTwoFactorAuthTriggerResult>;
10
+ getLongTermTwoFactorToken(_otpCode: string): Promise<ScraperGetLongTermTwoFactorTokenResult>;
11
+ protected login(_credentials: TCredentials): Promise<ScraperLoginResult>;
12
+ protected fetchData(): Promise<ScraperScrapingResult>;
13
+ protected terminate(_success: boolean): Promise<void>;
14
+ protected emitProgress(type: ScraperProgressTypes): void;
15
+ protected emit(eventName: string, payload: Record<string, any>): void;
16
+ onProgress(func: (companyId: CompanyTypes, payload: {
17
+ type: ScraperProgressTypes;
18
+ }) => void): void;
19
+ }
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BaseScraper = void 0;
7
+ var _events = require("events");
8
+ var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
9
+ var _definitions = require("../definitions");
10
+ var _waiting = require("../helpers/waiting");
11
+ var _errors = require("./errors");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ const SCRAPE_PROGRESS = 'SCRAPE_PROGRESS';
14
+ class BaseScraper {
15
+ eventEmitter = new _events.EventEmitter();
16
+ constructor(options) {
17
+ this.options = options;
18
+ }
19
+
20
+ // eslint-disable-next-line @typescript-eslint/require-await
21
+ async initialize() {
22
+ this.emitProgress(_definitions.ScraperProgressTypes.Initializing);
23
+ _momentTimezone.default.tz.setDefault('Asia/Jerusalem');
24
+ }
25
+ async scrape(credentials) {
26
+ this.emitProgress(_definitions.ScraperProgressTypes.StartScraping);
27
+ await this.initialize();
28
+ let loginResult;
29
+ try {
30
+ loginResult = await this.login(credentials);
31
+ } catch (e) {
32
+ loginResult = e instanceof _waiting.TimeoutError ? (0, _errors.createTimeoutError)(e.message) : (0, _errors.createGenericError)(e.message);
33
+ }
34
+ let scrapeResult;
35
+ if (loginResult.success) {
36
+ try {
37
+ scrapeResult = await this.fetchData();
38
+ } catch (e) {
39
+ scrapeResult = e instanceof _waiting.TimeoutError ? (0, _errors.createTimeoutError)(e.message) : (0, _errors.createGenericError)(e.message);
40
+ }
41
+ } else {
42
+ scrapeResult = loginResult;
43
+ }
44
+ try {
45
+ const success = scrapeResult && scrapeResult.success === true;
46
+ await this.terminate(success);
47
+ } catch (e) {
48
+ scrapeResult = (0, _errors.createGenericError)(e.message);
49
+ }
50
+ this.emitProgress(_definitions.ScraperProgressTypes.EndScraping);
51
+ return scrapeResult;
52
+ }
53
+
54
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
55
+ triggerTwoFactorAuth(_phoneNumber) {
56
+ throw new Error(`triggerOtp() is not created in ${this.options.companyId}`);
57
+ }
58
+
59
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
60
+ getLongTermTwoFactorToken(_otpCode) {
61
+ throw new Error(`getPermanentOtpToken() is not created in ${this.options.companyId}`);
62
+ }
63
+
64
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
65
+ async login(_credentials) {
66
+ throw new Error(`login() is not created in ${this.options.companyId}`);
67
+ }
68
+
69
+ // eslint-disable-next-line @typescript-eslint/require-await
70
+ async fetchData() {
71
+ throw new Error(`fetchData() is not created in ${this.options.companyId}`);
72
+ }
73
+
74
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
75
+ async terminate(_success) {
76
+ this.emitProgress(_definitions.ScraperProgressTypes.Terminating);
77
+ }
78
+ emitProgress(type) {
79
+ this.emit(SCRAPE_PROGRESS, {
80
+ type
81
+ });
82
+ }
83
+ emit(eventName, payload) {
84
+ this.eventEmitter.emit(eventName, this.options.companyId, payload);
85
+ }
86
+ onProgress(func) {
87
+ this.eventEmitter.on(SCRAPE_PROGRESS, func);
88
+ }
89
+ }
90
+ exports.BaseScraper = BaseScraper;
91
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZGVmaW5pdGlvbnMiLCJfd2FpdGluZyIsIl9lcnJvcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJTQ1JBUEVfUFJPR1JFU1MiLCJCYXNlU2NyYXBlciIsImV2ZW50RW1pdHRlciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImluaXRpYWxpemUiLCJlbWl0UHJvZ3Jlc3MiLCJTY3JhcGVyUHJvZ3Jlc3NUeXBlcyIsIkluaXRpYWxpemluZyIsIm1vbWVudCIsInR6Iiwic2V0RGVmYXVsdCIsInNjcmFwZSIsImNyZWRlbnRpYWxzIiwiU3RhcnRTY3JhcGluZyIsImxvZ2luUmVzdWx0IiwibG9naW4iLCJUaW1lb3V0RXJyb3IiLCJjcmVhdGVUaW1lb3V0RXJyb3IiLCJtZXNzYWdlIiwiY3JlYXRlR2VuZXJpY0Vycm9yIiwic2NyYXBlUmVzdWx0Iiwic3VjY2VzcyIsImZldGNoRGF0YSIsInRlcm1pbmF0ZSIsIkVuZFNjcmFwaW5nIiwidHJpZ2dlclR3b0ZhY3RvckF1dGgiLCJfcGhvbmVOdW1iZXIiLCJFcnJvciIsImNvbXBhbnlJZCIsImdldExvbmdUZXJtVHdvRmFjdG9yVG9rZW4iLCJfb3RwQ29kZSIsIl9jcmVkZW50aWFscyIsIl9zdWNjZXNzIiwiVGVybWluYXRpbmciLCJ0eXBlIiwiZW1pdCIsImV2ZW50TmFtZSIsInBheWxvYWQiLCJvblByb2dyZXNzIiwiZnVuYyIsIm9uIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JhcGVycy9iYXNlLXNjcmFwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcbmltcG9ydCB7IHR5cGUgQ29tcGFueVR5cGVzLCBTY3JhcGVyUHJvZ3Jlc3NUeXBlcyB9IGZyb20gJy4uL2RlZmluaXRpb25zJztcbmltcG9ydCB7IFRpbWVvdXRFcnJvciB9IGZyb20gJy4uL2hlbHBlcnMvd2FpdGluZyc7XG5pbXBvcnQgeyBjcmVhdGVHZW5lcmljRXJyb3IsIGNyZWF0ZVRpbWVvdXRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIHR5cGUgU2NyYXBlcixcbiAgdHlwZSBTY3JhcGVyQ3JlZGVudGlhbHMsXG4gIHR5cGUgU2NyYXBlckdldExvbmdUZXJtVHdvRmFjdG9yVG9rZW5SZXN1bHQsXG4gIHR5cGUgU2NyYXBlckxvZ2luUmVzdWx0LFxuICB0eXBlIFNjcmFwZXJPcHRpb25zLFxuICB0eXBlIFNjcmFwZXJTY3JhcGluZ1Jlc3VsdCxcbiAgdHlwZSBTY3JhcGVyVHdvRmFjdG9yQXV0aFRyaWdnZXJSZXN1bHQsXG59IGZyb20gJy4vaW50ZXJmYWNlJztcblxuY29uc3QgU0NSQVBFX1BST0dSRVNTID0gJ1NDUkFQRV9QUk9HUkVTUyc7XG5cbmV4cG9ydCBjbGFzcyBCYXNlU2NyYXBlcjxUQ3JlZGVudGlhbHMgZXh0ZW5kcyBTY3JhcGVyQ3JlZGVudGlhbHM+IGltcGxlbWVudHMgU2NyYXBlcjxUQ3JlZGVudGlhbHM+IHtcbiAgcHJpdmF0ZSBldmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG9wdGlvbnM6IFNjcmFwZXJPcHRpb25zKSB7fVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcbiAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmVtaXRQcm9ncmVzcyhTY3JhcGVyUHJvZ3Jlc3NUeXBlcy5Jbml0aWFsaXppbmcpO1xuICAgIG1vbWVudC50ei5zZXREZWZhdWx0KCdBc2lhL0plcnVzYWxlbScpO1xuICB9XG5cbiAgYXN5bmMgc2NyYXBlKGNyZWRlbnRpYWxzOiBUQ3JlZGVudGlhbHMpOiBQcm9taXNlPFNjcmFwZXJTY3JhcGluZ1Jlc3VsdD4ge1xuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLlN0YXJ0U2NyYXBpbmcpO1xuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgbGV0IGxvZ2luUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBsb2dpblJlc3VsdCA9IGF3YWl0IHRoaXMubG9naW4oY3JlZGVudGlhbHMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2luUmVzdWx0ID1cbiAgICAgICAgZSBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvciA/IGNyZWF0ZVRpbWVvdXRFcnJvcigoZSBhcyBFcnJvcikubWVzc2FnZSkgOiBjcmVhdGVHZW5lcmljRXJyb3IoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxldCBzY3JhcGVSZXN1bHQ7XG4gICAgaWYgKGxvZ2luUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNjcmFwZVJlc3VsdCA9IGF3YWl0IHRoaXMuZmV0Y2hEYXRhKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNjcmFwZVJlc3VsdCA9XG4gICAgICAgICAgZSBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvclxuICAgICAgICAgICAgPyBjcmVhdGVUaW1lb3V0RXJyb3IoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpXG4gICAgICAgICAgICA6IGNyZWF0ZUdlbmVyaWNFcnJvcigoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmFwZVJlc3VsdCA9IGxvZ2luUmVzdWx0O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gc2NyYXBlUmVzdWx0ICYmIHNjcmFwZVJlc3VsdC5zdWNjZXNzID09PSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy50ZXJtaW5hdGUoc3VjY2Vzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2NyYXBlUmVzdWx0ID0gY3JlYXRlR2VuZXJpY0Vycm9yKChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0UHJvZ3Jlc3MoU2NyYXBlclByb2dyZXNzVHlwZXMuRW5kU2NyYXBpbmcpO1xuXG4gICAgcmV0dXJuIHNjcmFwZVJlc3VsdDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0XG4gIHRyaWdnZXJUd29GYWN0b3JBdXRoKF9waG9uZU51bWJlcjogc3RyaW5nKTogUHJvbWlzZTxTY3JhcGVyVHdvRmFjdG9yQXV0aFRyaWdnZXJSZXN1bHQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRyaWdnZXJPdHAoKSBpcyBub3QgY3JlYXRlZCBpbiAke3RoaXMub3B0aW9ucy5jb21wYW55SWR9YCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdFxuICBnZXRMb25nVGVybVR3b0ZhY3RvclRva2VuKF9vdHBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFNjcmFwZXJHZXRMb25nVGVybVR3b0ZhY3RvclRva2VuUmVzdWx0PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBnZXRQZXJtYW5lbnRPdHBUb2tlbigpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9yZXF1aXJlLWF3YWl0XG4gIHByb3RlY3RlZCBhc3luYyBsb2dpbihfY3JlZGVudGlhbHM6IFRDcmVkZW50aWFscyk6IFByb21pc2U8U2NyYXBlckxvZ2luUmVzdWx0PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBsb2dpbigpIGlzIG5vdCBjcmVhdGVkIGluICR7dGhpcy5vcHRpb25zLmNvbXBhbnlJZH1gKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcbiAgcHJvdGVjdGVkIGFzeW5jIGZldGNoRGF0YSgpOiBQcm9taXNlPFNjcmFwZXJTY3JhcGluZ1Jlc3VsdD4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgZmV0Y2hEYXRhKCkgaXMgbm90IGNyZWF0ZWQgaW4gJHt0aGlzLm9wdGlvbnMuY29tcGFueUlkfWApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcbiAgcHJvdGVjdGVkIGFzeW5jIHRlcm1pbmF0ZShfc3VjY2VzczogYm9vbGVhbikge1xuICAgIHRoaXMuZW1pdFByb2dyZXNzKFNjcmFwZXJQcm9ncmVzc1R5cGVzLlRlcm1pbmF0aW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0UHJvZ3Jlc3ModHlwZTogU2NyYXBlclByb2dyZXNzVHlwZXMpIHtcbiAgICB0aGlzLmVtaXQoU0NSQVBFX1BST0dSRVNTLCB7IHR5cGUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdChldmVudE5hbWU6IHN0cmluZywgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoZXZlbnROYW1lLCB0aGlzLm9wdGlvbnMuY29tcGFueUlkLCBwYXlsb2FkKTtcbiAgfVxuXG4gIG9uUHJvZ3Jlc3MoZnVuYzogKGNvbXBhbnlJZDogQ29tcGFueVR5cGVzLCBwYXlsb2FkOiB7IHR5cGU6IFNjcmFwZXJQcm9ncmVzc1R5cGVzIH0pID0+IHZvaWQpIHtcbiAgICB0aGlzLmV2ZW50RW1pdHRlci5vbihTQ1JBUEVfUFJPR1JFU1MsIGZ1bmMpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFFBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUFrRSxTQUFBRSx1QkFBQUksQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQVdsRSxNQUFNRyxlQUFlLEdBQUcsaUJBQWlCO0FBRWxDLE1BQU1DLFdBQVcsQ0FBMkU7RUFDekZDLFlBQVksR0FBRyxJQUFJQyxvQkFBWSxDQUFDLENBQUM7RUFFekNDLFdBQVdBLENBQVFDLE9BQXVCLEVBQUU7SUFBQSxLQUF6QkEsT0FBdUIsR0FBdkJBLE9BQXVCO0VBQUc7O0VBRTdDO0VBQ0EsTUFBTUMsVUFBVUEsQ0FBQSxFQUFHO0lBQ2pCLElBQUksQ0FBQ0MsWUFBWSxDQUFDQyxpQ0FBb0IsQ0FBQ0MsWUFBWSxDQUFDO0lBQ3BEQyx1QkFBTSxDQUFDQyxFQUFFLENBQUNDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztFQUN4QztFQUVBLE1BQU1DLE1BQU1BLENBQUNDLFdBQXlCLEVBQWtDO0lBQ3RFLElBQUksQ0FBQ1AsWUFBWSxDQUFDQyxpQ0FBb0IsQ0FBQ08sYUFBYSxDQUFDO0lBQ3JELE1BQU0sSUFBSSxDQUFDVCxVQUFVLENBQUMsQ0FBQztJQUV2QixJQUFJVSxXQUFXO0lBQ2YsSUFBSTtNQUNGQSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0gsV0FBVyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxPQUFPakIsQ0FBQyxFQUFFO01BQ1ZtQixXQUFXLEdBQ1RuQixDQUFDLFlBQVlxQixxQkFBWSxHQUFHLElB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
@@ -0,0 +1,11 @@
1
+ import { BaseScraperWithBrowser, type LoginOptions } from './base-scraper-with-browser';
2
+ import { type ScraperScrapingResult } from './interface';
3
+ type ScraperSpecificCredentials = {
4
+ id: string;
5
+ password: string;
6
+ };
7
+ declare class BehatsdaaScraper extends BaseScraperWithBrowser<ScraperSpecificCredentials> {
8
+ getLoginOptions(credentials: ScraperSpecificCredentials): LoginOptions;
9
+ fetchData(): Promise<ScraperScrapingResult>;
10
+ }
11
+ export default BehatsdaaScraper;