@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.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/lib/assertNever.d.ts +1 -0
- package/lib/assertNever.js +10 -0
- package/lib/constants.d.ts +10 -0
- package/lib/constants.js +17 -0
- package/lib/definitions.d.ts +105 -0
- package/lib/definitions.js +116 -0
- package/lib/helpers/browser.d.ts +10 -0
- package/lib/helpers/browser.js +21 -0
- package/lib/helpers/dates.d.ts +2 -0
- package/lib/helpers/dates.js +22 -0
- package/lib/helpers/debug.d.ts +2 -0
- package/lib/helpers/debug.js +12 -0
- package/lib/helpers/elements-interactions.d.ts +17 -0
- package/lib/helpers/elements-interactions.js +111 -0
- package/lib/helpers/fetch.d.ts +6 -0
- package/lib/helpers/fetch.js +111 -0
- package/lib/helpers/navigation.d.ts +6 -0
- package/lib/helpers/navigation.js +39 -0
- package/lib/helpers/storage.d.ts +2 -0
- package/lib/helpers/storage.js +14 -0
- package/lib/helpers/transactions.d.ts +5 -0
- package/lib/helpers/transactions.js +47 -0
- package/lib/helpers/waiting.d.ts +13 -0
- package/lib/helpers/waiting.js +58 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +85 -0
- package/lib/scrapers/amex.d.ts +6 -0
- package/lib/scrapers/amex.js +17 -0
- package/lib/scrapers/amex.test.d.ts +1 -0
- package/lib/scrapers/amex.test.js +49 -0
- package/lib/scrapers/base-beinleumi-group.d.ts +66 -0
- package/lib/scrapers/base-beinleumi-group.js +428 -0
- package/lib/scrapers/base-isracard-amex.d.ts +23 -0
- package/lib/scrapers/base-isracard-amex.js +324 -0
- package/lib/scrapers/base-scraper-with-browser.d.ts +57 -0
- package/lib/scrapers/base-scraper-with-browser.js +291 -0
- package/lib/scrapers/base-scraper-with-browser.test.d.ts +1 -0
- package/lib/scrapers/base-scraper-with-browser.test.js +53 -0
- package/lib/scrapers/base-scraper.d.ts +19 -0
- package/lib/scrapers/base-scraper.js +91 -0
- package/lib/scrapers/behatsdaa.d.ts +11 -0
- package/lib/scrapers/behatsdaa.js +113 -0
- package/lib/scrapers/behatsdaa.test.d.ts +1 -0
- package/lib/scrapers/behatsdaa.test.js +46 -0
- package/lib/scrapers/beinleumi.d.ts +7 -0
- package/lib/scrapers/beinleumi.js +15 -0
- package/lib/scrapers/beinleumi.test.d.ts +1 -0
- package/lib/scrapers/beinleumi.test.js +47 -0
- package/lib/scrapers/beyahad-bishvilha.d.ts +30 -0
- package/lib/scrapers/beyahad-bishvilha.js +149 -0
- package/lib/scrapers/beyahad-bishvilha.test.d.ts +1 -0
- package/lib/scrapers/beyahad-bishvilha.test.js +47 -0
- package/lib/scrapers/discount.d.ts +22 -0
- package/lib/scrapers/discount.js +120 -0
- package/lib/scrapers/discount.test.d.ts +1 -0
- package/lib/scrapers/discount.test.js +49 -0
- package/lib/scrapers/errors.d.ts +16 -0
- package/lib/scrapers/errors.js +32 -0
- package/lib/scrapers/factory.d.ts +2 -0
- package/lib/scrapers/factory.js +70 -0
- package/lib/scrapers/factory.test.d.ts +1 -0
- package/lib/scrapers/factory.test.js +19 -0
- package/lib/scrapers/hapoalim.d.ts +24 -0
- package/lib/scrapers/hapoalim.js +198 -0
- package/lib/scrapers/hapoalim.test.d.ts +1 -0
- package/lib/scrapers/hapoalim.test.js +47 -0
- package/lib/scrapers/interface.d.ts +186 -0
- package/lib/scrapers/interface.js +6 -0
- package/lib/scrapers/isracard.d.ts +6 -0
- package/lib/scrapers/isracard.js +17 -0
- package/lib/scrapers/isracard.test.d.ts +1 -0
- package/lib/scrapers/isracard.test.js +49 -0
- package/lib/scrapers/leumi.d.ts +21 -0
- package/lib/scrapers/leumi.js +200 -0
- package/lib/scrapers/leumi.test.d.ts +1 -0
- package/lib/scrapers/leumi.test.js +47 -0
- package/lib/scrapers/massad.d.ts +7 -0
- package/lib/scrapers/massad.js +15 -0
- package/lib/scrapers/max.d.ts +37 -0
- package/lib/scrapers/max.js +299 -0
- package/lib/scrapers/max.test.d.ts +1 -0
- package/lib/scrapers/max.test.js +64 -0
- package/lib/scrapers/mercantile.d.ts +20 -0
- package/lib/scrapers/mercantile.js +18 -0
- package/lib/scrapers/mercantile.test.d.ts +1 -0
- package/lib/scrapers/mercantile.test.js +45 -0
- package/lib/scrapers/mizrahi.d.ts +35 -0
- package/lib/scrapers/mizrahi.js +265 -0
- package/lib/scrapers/mizrahi.test.d.ts +1 -0
- package/lib/scrapers/mizrahi.test.js +56 -0
- package/lib/scrapers/one-zero-queries.d.ts +2 -0
- package/lib/scrapers/one-zero-queries.js +560 -0
- package/lib/scrapers/one-zero.d.ts +36 -0
- package/lib/scrapers/one-zero.js +238 -0
- package/lib/scrapers/one-zero.test.d.ts +1 -0
- package/lib/scrapers/one-zero.test.js +51 -0
- package/lib/scrapers/otsar-hahayal.d.ts +7 -0
- package/lib/scrapers/otsar-hahayal.js +15 -0
- package/lib/scrapers/otsar-hahayal.test.d.ts +1 -0
- package/lib/scrapers/otsar-hahayal.test.js +47 -0
- package/lib/scrapers/pagi.d.ts +7 -0
- package/lib/scrapers/pagi.js +15 -0
- package/lib/scrapers/pagi.test.d.ts +1 -0
- package/lib/scrapers/pagi.test.js +47 -0
- package/lib/scrapers/union-bank.d.ts +23 -0
- package/lib/scrapers/union-bank.js +242 -0
- package/lib/scrapers/union-bank.test.d.ts +1 -0
- package/lib/scrapers/union-bank.test.js +47 -0
- package/lib/scrapers/visa-cal.d.ts +20 -0
- package/lib/scrapers/visa-cal.js +318 -0
- package/lib/scrapers/visa-cal.test.d.ts +1 -0
- package/lib/scrapers/visa-cal.test.js +49 -0
- package/lib/scrapers/yahav.d.ts +25 -0
- package/lib/scrapers/yahav.js +247 -0
- package/lib/scrapers/yahav.test.d.ts +1 -0
- package/lib/scrapers/yahav.test.js +49 -0
- package/lib/transactions.d.ts +47 -0
- package/lib/transactions.js +17 -0
- 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;
|