@google-psat/analysis-utils 0.9.0-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/.eslintrc.json +7 -0
  2. package/README.md +4 -0
  3. package/dist/browserManagement/collateCookieData.js +35 -0
  4. package/dist/browserManagement/collateCookieData.js.map +1 -0
  5. package/dist/browserManagement/index.js +532 -0
  6. package/dist/browserManagement/index.js.map +1 -0
  7. package/dist/browserManagement/parseNetworkDataToCookieData.js +187 -0
  8. package/dist/browserManagement/parseNetworkDataToCookieData.js.map +1 -0
  9. package/dist/browserManagement/types.js +18 -0
  10. package/dist/browserManagement/types.js.map +1 -0
  11. package/dist/index.js +33 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/procedures/analyzeCookiesUrlsAndFetchResources.js +71 -0
  14. package/dist/procedures/analyzeCookiesUrlsAndFetchResources.js.map +1 -0
  15. package/dist/procedures/analyzeCookiesUrlsInBatchesAndFetchResources.js +54 -0
  16. package/dist/procedures/analyzeCookiesUrlsInBatchesAndFetchResources.js.map +1 -0
  17. package/dist/procedures/analyzeTechnologiesUrlsInBatches.js +64 -0
  18. package/dist/procedures/analyzeTechnologiesUrlsInBatches.js.map +1 -0
  19. package/dist/procedures/index.js +25 -0
  20. package/dist/procedures/index.js.map +1 -0
  21. package/dist/types.js +3 -0
  22. package/dist/types.js.map +1 -0
  23. package/dist-types/browserManagement/collateCookieData.d.ts +11 -0
  24. package/dist-types/browserManagement/index.d.ts +53 -0
  25. package/dist-types/browserManagement/parseNetworkDataToCookieData.d.ts +6 -0
  26. package/dist-types/browserManagement/types.d.ts +37 -0
  27. package/dist-types/index.d.ts +1 -0
  28. package/dist-types/procedures/analyzeCookiesUrlsAndFetchResources.d.ts +10 -0
  29. package/dist-types/procedures/analyzeCookiesUrlsInBatchesAndFetchResources.d.ts +29 -0
  30. package/dist-types/procedures/analyzeTechnologiesUrlsInBatches.d.ts +14 -0
  31. package/dist-types/procedures/index.d.ts +3 -0
  32. package/dist-types/types.d.ts +80 -0
  33. package/package.json +49 -0
  34. package/tsconfig.json +16 -0
package/.eslintrc.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "rules": {
3
+ "no-console": "off",
4
+ "no-await-in-loop": "off"
5
+ },
6
+ "ignorePatterns": ["dist/**", "dist-types/**"]
7
+ }
package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # analysis-utils
2
+
3
+ ## Description
4
+ A package for managing puppeteer for various site analysis
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Collate network and JS cookie data.
5
+ * @param cookieDataFromNetwork Cookie data from network.
6
+ * @param cookieDataFromJS cookie data from JS.
7
+ * @returns cookieDataFromNetwork Cookie data from network and JS if it exits.
8
+ */
9
+ function collateCookieData(cookieDataFromNetwork, cookieDataFromJS) {
10
+ Object.entries(cookieDataFromJS).forEach(([frameUrl, { frameCookies }]) => {
11
+ Object.entries(frameCookies).forEach(([key, cookie]) => {
12
+ // Check if the frame's data exists. if not create frame data object
13
+ if (!cookieDataFromNetwork[frameUrl]) {
14
+ cookieDataFromNetwork[frameUrl] = {
15
+ frameCookies: {
16
+ [key]: {
17
+ parsedCookie: cookie.parsedCookie,
18
+ headerType: 'javascript',
19
+ },
20
+ },
21
+ };
22
+ }
23
+ // Check if the cookie's data exists. if not add cookie data object to frame cookies. Otherwise cookie data from network stream will be used.
24
+ else if (!cookieDataFromNetwork[frameUrl].frameCookies[key]) {
25
+ cookieDataFromNetwork[frameUrl].frameCookies[key] = {
26
+ parsedCookie: cookie.parsedCookie,
27
+ headerType: 'javascript',
28
+ };
29
+ }
30
+ });
31
+ });
32
+ return cookieDataFromNetwork;
33
+ }
34
+ exports.default = collateCookieData;
35
+ //# sourceMappingURL=collateCookieData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collateCookieData.js","sourceRoot":"","sources":["../../src/browserManagement/collateCookieData.ts"],"names":[],"mappings":";;AAoBA;;;;;GAKG;AACH,SAAwB,iBAAiB,CACvC,qBAA4C,EAC5C,gBAAuC;IAEvC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;QACxE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;YACrD,qEAAqE;YACrE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,qBAAqB,CAAC,QAAQ,CAAC,GAAG;oBAChC,YAAY,EAAE;wBACZ,CAAC,GAAG,CAAC,EAAE;4BACL,YAAY,EAAE,MAAM,CAAC,YAAY;4BACjC,UAAU,EAAE,YAAY;yBACzB;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,6IAA6I;iBACxI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5D,qBAAqB,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG;oBAClD,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,UAAU,EAAE,YAAY;iBACzB,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AA5BD,oCA4BC"}
@@ -0,0 +1,532 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2023 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * https://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.BrowserManagement = void 0;
31
+ /**
32
+ * External dependencies.
33
+ */
34
+ const puppeteer_1 = __importDefault(require("puppeteer"));
35
+ const simple_cookie_1 = require("simple-cookie");
36
+ const common_1 = require("@google-psat/common");
37
+ const parseNetworkDataToCookieData_1 = require("./parseNetworkDataToCookieData");
38
+ const collateCookieData_1 = __importDefault(require("./collateCookieData"));
39
+ class BrowserManagement {
40
+ constructor(viewportConfig, isHeadless, pageWaitTime, shouldLogDebug) {
41
+ this.viewportConfig = viewportConfig;
42
+ this.browser = null;
43
+ this.isHeadless = isHeadless;
44
+ this.pageWaitTime = pageWaitTime;
45
+ this.pages = {};
46
+ this.pageFrames = {};
47
+ this.pageResponses = {};
48
+ this.pageRequests = {};
49
+ this.shouldLogDebug = shouldLogDebug;
50
+ this.pageResourcesMaps = {};
51
+ }
52
+ debugLog(msg) {
53
+ if (this.shouldLogDebug) {
54
+ console.log(msg);
55
+ }
56
+ }
57
+ initializeBrowser(enable3pCookiePhaseout) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ const args = [];
60
+ if (enable3pCookiePhaseout) {
61
+ args.push('--test-third-party-cookie-phaseout');
62
+ args.push('--enable-features="FirstPartySets,StorageAccessAPI,StorageAccessAPIForOriginExtension,PageInfoCookiesSubpage,PrivacySandboxFirstPartySetsUI,TpcdMetadataGrants,TpcdSupportSettings,TpcdHeuristicsGrants:TpcdReadHeuristicsGrants/true/TpcdWritePopupCurrentInteractionHeuristicsGrants/30d/TpcdBackfillPopupHeuristicsGrants/30d/TpcdPopupHeuristicEnableForIframeInitiator/all/TpcdWriteRedirectHeuristicGrants/15m/TpcdRedirectHeuristicRequireABAFlow/true/TpcdRedirectHeuristicRequireCurrentInteraction/true"');
63
+ }
64
+ this.browser = yield puppeteer_1.default.launch({
65
+ devtools: true,
66
+ headless: this.isHeadless,
67
+ args,
68
+ });
69
+ this.debugLog('browser intialized');
70
+ });
71
+ }
72
+ clickOnAcceptBanner(url) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ const page = this.pages[url];
75
+ if (!page) {
76
+ throw new Error('no page with the provided id was found');
77
+ }
78
+ yield page.evaluate(() => {
79
+ var _a, _b;
80
+ const bannerNodes = Array.from((((_a = document.querySelector('body')) === null || _a === void 0 ? void 0 : _a.childNodes) || []))
81
+ .filter((node) => node && (node === null || node === void 0 ? void 0 : node.tagName) === 'DIV')
82
+ .filter((node) => {
83
+ if (!node || !(node === null || node === void 0 ? void 0 : node.textContent)) {
84
+ return false;
85
+ }
86
+ const regex = /\b(consent|policy|cookie policy|privacy policy|personalize|preferences)\b/;
87
+ return regex.test(node.textContent.toLowerCase());
88
+ });
89
+ const buttonToClick = bannerNodes
90
+ .map((node) => {
91
+ const buttonNodes = Array.from(node.getElementsByTagName('button'));
92
+ const isButtonForAccept = buttonNodes.filter((cnode) => cnode.textContent &&
93
+ (cnode.textContent.toLowerCase().includes('accept') ||
94
+ cnode.textContent.toLowerCase().includes('allow') ||
95
+ cnode.textContent.toLowerCase().includes('agree')));
96
+ return isButtonForAccept[0];
97
+ })
98
+ .filter((button) => button);
99
+ (_b = buttonToClick[0]) === null || _b === void 0 ? void 0 : _b.click();
100
+ });
101
+ yield (0, common_1.delay)(this.pageWaitTime / 2);
102
+ });
103
+ }
104
+ openPage() {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ if (!this.browser) {
107
+ throw new Error('Browser not intialized');
108
+ }
109
+ const sitePage = yield this.browser.newPage();
110
+ yield sitePage.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36');
111
+ sitePage.setViewport({
112
+ width: 1440,
113
+ height: 790,
114
+ deviceScaleFactor: 1,
115
+ });
116
+ this.debugLog('Page opened');
117
+ return sitePage;
118
+ });
119
+ }
120
+ navigateToPage(url) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ const page = this.pages[url];
123
+ if (!page) {
124
+ throw new Error('no page with the provided id was found');
125
+ }
126
+ this.debugLog(`starting navigation to url ${url}`);
127
+ try {
128
+ yield page.goto(url, { timeout: 10000 });
129
+ this.debugLog(`done with navigation to url:${url}`);
130
+ }
131
+ catch (error) {
132
+ this.debugLog(`navigation did not finish in 10 seconds moving on to scrolling`);
133
+ //ignore
134
+ }
135
+ });
136
+ }
137
+ pageScroll(url) {
138
+ return __awaiter(this, void 0, void 0, function* () {
139
+ const page = this.pages[url];
140
+ if (!page) {
141
+ throw new Error('no page with the provided id was found');
142
+ }
143
+ try {
144
+ yield page.evaluate(() => {
145
+ window.scrollBy(0, 10000);
146
+ });
147
+ }
148
+ catch (error) {
149
+ this.debugLog(`scrolling the page to the end.`);
150
+ //ignore
151
+ }
152
+ this.debugLog(`scrolling on url:${url}`);
153
+ });
154
+ }
155
+ responseEventListener(pageId, response) {
156
+ var _a, _b, _c, _d;
157
+ if (((_b = (_a = response === null || response === void 0 ? void 0 : response.headers()) === null || _a === void 0 ? void 0 : _a['content-type']) === null || _b === void 0 ? void 0 : _b.includes('javascript')) ||
158
+ ((_d = (_c = response === null || response === void 0 ? void 0 : response.headers()) === null || _c === void 0 ? void 0 : _c['content-type']) === null || _d === void 0 ? void 0 : _d.includes('html'))) {
159
+ response
160
+ .text()
161
+ .then((content) => {
162
+ var _a, _b;
163
+ this.pageResourcesMaps[pageId][response.url()] = {
164
+ origin: response.url(),
165
+ type: ((_b = (_a = response === null || response === void 0 ? void 0 : response.headers()) === null || _a === void 0 ? void 0 : _a['content-type']) === null || _b === void 0 ? void 0 : _b.includes('javascript'))
166
+ ? 'Script'
167
+ : 'Document',
168
+ content,
169
+ };
170
+ })
171
+ .catch(() => undefined);
172
+ }
173
+ }
174
+ responseReceivedListener(pageId, { requestId, frameId, response }) {
175
+ var _a, _b;
176
+ if (!this.pageResponses[pageId][requestId]) {
177
+ this.pageResponses[pageId][requestId] = {
178
+ frameId,
179
+ url: response.url,
180
+ cookies: [],
181
+ };
182
+ }
183
+ else {
184
+ const parsedCookies = (_a = this.pageResponses[pageId][requestId]) === null || _a === void 0 ? void 0 : _a.cookies.map((cookie) => {
185
+ if (!cookie.url) {
186
+ cookie.url = response.url;
187
+ }
188
+ if (!cookie.parsedCookie.domain) {
189
+ cookie.parsedCookie.domain = new URL(response.url).hostname;
190
+ }
191
+ if (cookie.parsedCookie.domain[0] !== '.') {
192
+ cookie.parsedCookie.domain = '.' + cookie.parsedCookie.domain;
193
+ }
194
+ return cookie;
195
+ });
196
+ (_b = this.pageResponses[pageId][requestId]) === null || _b === void 0 ? void 0 : _b.cookies.forEach((cookie) => {
197
+ var _a;
198
+ (_a = cookie.networkEvents) === null || _a === void 0 ? void 0 : _a.responseEvents.map((event) => {
199
+ if (event.requestId === requestId) {
200
+ event.url = response.url;
201
+ }
202
+ return event;
203
+ });
204
+ });
205
+ this.pageResponses[pageId][requestId] = {
206
+ frameId,
207
+ url: response.url,
208
+ cookies: parsedCookies,
209
+ };
210
+ }
211
+ }
212
+ responseReceivedExtraInfoListener(pageId, { headers, cookiePartitionKey, blockedCookies, requestId, exemptedCookies, }) {
213
+ var _a, _b, _c, _d;
214
+ const headersToBeParsed = (_a = headers['set-cookie']) !== null && _a !== void 0 ? _a : headers['Set-Cookie'];
215
+ if (!headersToBeParsed) {
216
+ return;
217
+ }
218
+ const cookies = headersToBeParsed
219
+ .split('\n')
220
+ .map((headerLine) => {
221
+ var _a;
222
+ const parsedCookie = (0, simple_cookie_1.parse)(headerLine);
223
+ const partitionKey = headerLine.includes('Partitioned')
224
+ ? cookiePartitionKey
225
+ : undefined;
226
+ const url = (_a = this.pageResponses[pageId][requestId]) === null || _a === void 0 ? void 0 : _a.url;
227
+ if (!parsedCookie.domain && url) {
228
+ parsedCookie.domain = new URL(url).hostname;
229
+ }
230
+ if (parsedCookie.domain && parsedCookie.domain[0] !== '.') {
231
+ parsedCookie.domain = '.' + parsedCookie.domain;
232
+ }
233
+ const exemptedEntry = exemptedCookies === null || exemptedCookies === void 0 ? void 0 : exemptedCookies.find(({ cookie }) => {
234
+ return (cookie === null || cookie === void 0 ? void 0 : cookie.name) === parsedCookie.name;
235
+ });
236
+ const blockedEntry = blockedCookies.find((c) => {
237
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
238
+ if (c.cookie) {
239
+ return (((_b = (_a = c.cookie) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()) === ((_c = parsedCookie.name) === null || _c === void 0 ? void 0 : _c.trim()) &&
240
+ ((_d = c.cookie.domain) === null || _d === void 0 ? void 0 : _d.trim()) === ((_e = parsedCookie.domain) === null || _e === void 0 ? void 0 : _e.trim()) &&
241
+ ((_f = c.cookie.path) === null || _f === void 0 ? void 0 : _f.trim()) === ((_g = parsedCookie.path) === null || _g === void 0 ? void 0 : _g.trim()));
242
+ }
243
+ else {
244
+ const temporaryParsedCookie = (0, simple_cookie_1.parse)(c.cookieLine);
245
+ return (((_h = temporaryParsedCookie.name) === null || _h === void 0 ? void 0 : _h.trim()) ===
246
+ ((_j = parsedCookie.name) === null || _j === void 0 ? void 0 : _j.trim()) &&
247
+ ((_k = temporaryParsedCookie.domain) === null || _k === void 0 ? void 0 : _k.trim()) ===
248
+ ((_l = parsedCookie.domain) === null || _l === void 0 ? void 0 : _l.trim()) &&
249
+ ((_m = temporaryParsedCookie.path) === null || _m === void 0 ? void 0 : _m.trim()) === ((_o = parsedCookie.path) === null || _o === void 0 ? void 0 : _o.trim()));
250
+ }
251
+ });
252
+ return {
253
+ parsedCookie: {
254
+ name: parsedCookie.name,
255
+ domain: parsedCookie.domain,
256
+ path: parsedCookie.path || '/',
257
+ value: parsedCookie.value,
258
+ sameSite: parsedCookie.samesite || 'Lax',
259
+ expires: parsedCookie.expires || 'Session',
260
+ httpOnly: parsedCookie.httponly || false,
261
+ secure: parsedCookie.secure || false,
262
+ partitionKey,
263
+ },
264
+ networkEvents: {
265
+ responseEvents: [
266
+ {
267
+ type: common_1.RESPONSE_EVENT.CDP_RESPONSE_RECEIVED_EXTRA_INFO,
268
+ requestId,
269
+ url,
270
+ blocked: Boolean(blockedEntry),
271
+ timeStamp: Date.now(),
272
+ },
273
+ ],
274
+ requestEvents: [],
275
+ },
276
+ isBlocked: Boolean(blockedEntry),
277
+ blockedReasons: blockedEntry === null || blockedEntry === void 0 ? void 0 : blockedEntry.blockedReasons,
278
+ exemptionReason: exemptedEntry === null || exemptedEntry === void 0 ? void 0 : exemptedEntry.exemptionReason,
279
+ url,
280
+ headerType: 'response',
281
+ };
282
+ });
283
+ const prevCookies = ((_b = this.pageResponses[pageId][requestId]) === null || _b === void 0 ? void 0 : _b.cookies) || [];
284
+ const mergedCookies = [...prevCookies, ...(cookies || [])];
285
+ this.pageResponses[pageId][requestId] = {
286
+ frameId: ((_c = this.pageResponses[pageId][requestId]) === null || _c === void 0 ? void 0 : _c.frameId) || '',
287
+ url: ((_d = this.pageResponses[pageId][requestId]) === null || _d === void 0 ? void 0 : _d.url) || '',
288
+ // @ts-ignore TODO: fix expires type mismatch
289
+ cookies: mergedCookies,
290
+ };
291
+ }
292
+ requestWillBeSentListener(pageId, { requestId, request, frameId }) {
293
+ this.pageRequests[pageId][requestId] = Object.assign(Object.assign({}, (this.pageRequests[pageId][requestId] || {})), { frameId, url: request.url });
294
+ }
295
+ requestWillBeSentExtraInfoListener(pageId, { associatedCookies, requestId, }) {
296
+ if (!associatedCookies || associatedCookies.length === 0) {
297
+ return;
298
+ }
299
+ const cookies = associatedCookies.map((associatedCookie) => {
300
+ var _a, _b;
301
+ return {
302
+ parsedCookie: {
303
+ name: associatedCookie.cookie.name,
304
+ domain: associatedCookie.cookie.domain,
305
+ path: associatedCookie.cookie.path || '/',
306
+ value: associatedCookie.cookie.value,
307
+ sameSite: associatedCookie.cookie.sameSite || 'Lax',
308
+ expires: associatedCookie.cookie.expires || 'Session',
309
+ httpOnly: associatedCookie.cookie.httpOnly || false,
310
+ secure: associatedCookie.cookie.secure || false,
311
+ partitionKey: associatedCookie.cookie.partitionKey,
312
+ },
313
+ networkEvents: {
314
+ requestEvents: [
315
+ {
316
+ type: common_1.REQUEST_EVENT.CDP_REQUEST_WILL_BE_SENT_EXTRA_INFO,
317
+ requestId,
318
+ url: ((_a = this.pageRequests[pageId][requestId]) === null || _a === void 0 ? void 0 : _a.url) || '',
319
+ blocked: associatedCookie.blockedReasons.length > 0,
320
+ timeStamp: Date.now(),
321
+ },
322
+ ],
323
+ responseEvents: [],
324
+ },
325
+ isBlocked: associatedCookie.blockedReasons.length > 0,
326
+ blockedReasons: associatedCookie.blockedReasons,
327
+ exemptionReason: associatedCookie === null || associatedCookie === void 0 ? void 0 : associatedCookie.exemptionReason,
328
+ url: ((_b = this.pageRequests[pageId][requestId]) === null || _b === void 0 ? void 0 : _b.url) || '',
329
+ headerType: 'request',
330
+ };
331
+ });
332
+ this.pageRequests[pageId][requestId] = Object.assign(Object.assign({}, (this.pageRequests[pageId][requestId] || {})), { cookies });
333
+ }
334
+ pageFrameAttachedListener(pageId, { frameId, parentFrameId }) {
335
+ if (!this.pageFrames[pageId]) {
336
+ this.pageFrames[pageId] = {};
337
+ }
338
+ this.pageFrames[pageId][frameId] = parentFrameId;
339
+ }
340
+ getMainframeIds() {
341
+ return __awaiter(this, void 0, void 0, function* () {
342
+ var _a;
343
+ const pageTargetIds = {};
344
+ // This gets targets for all pages.
345
+ const cdpSession = yield Object.values(this.pages)[0].createCDPSession();
346
+ const res = yield cdpSession.send('Target.getTargets');
347
+ for (const [_url, page] of Object.entries(this.pages)) {
348
+ const constructedUrl = page.url();
349
+ const mainFrameTargetId = (_a = res.targetInfos.find(({ url, type }) => constructedUrl === url && type === 'page')) === null || _a === void 0 ? void 0 : _a.targetId;
350
+ pageTargetIds[_url] = mainFrameTargetId || '';
351
+ }
352
+ return pageTargetIds;
353
+ });
354
+ }
355
+ attachListenersToPage(pageId) {
356
+ return __awaiter(this, void 0, void 0, function* () {
357
+ const page = this.pages[pageId];
358
+ if (!page) {
359
+ throw new Error(`no page with the provided id was found:${pageId}`);
360
+ }
361
+ const cdpSession = yield page.createCDPSession();
362
+ yield cdpSession.send('Target.setAutoAttach', {
363
+ // If this is set to true, debugger will be attached to every new target that is added to the current target.
364
+ autoAttach: true,
365
+ waitForDebuggerOnStart: false,
366
+ //Enables "flat" access to the session via specifying sessionId attribute in the commands.
367
+ // If this is set to true the debugger is also attached to the child targets of that the target it has been attached to.
368
+ flatten: true,
369
+ });
370
+ yield cdpSession.send('Network.enable');
371
+ yield cdpSession.send('Page.enable');
372
+ this.pageRequests[pageId] = {};
373
+ this.pageResponses[pageId] = {};
374
+ this.pageResourcesMaps[pageId] = {};
375
+ page.on('response', (ev) => this.responseEventListener(pageId, ev));
376
+ cdpSession.on('Network.responseReceived', (ev) => this.responseReceivedListener(pageId, ev));
377
+ cdpSession.on('Network.responseReceivedExtraInfo', (ev) => this.responseReceivedExtraInfoListener(pageId, ev));
378
+ cdpSession.on('Network.requestWillBeSent', (ev) => this.requestWillBeSentListener(pageId, ev));
379
+ cdpSession.on('Network.requestWillBeSentExtraInfo', (ev) => this.requestWillBeSentExtraInfoListener(pageId, ev));
380
+ cdpSession.on('Page.frameAttached', (ev) => this.pageFrameAttachedListener(pageId, ev));
381
+ this.debugLog('done attaching network event listeners');
382
+ });
383
+ }
384
+ getJSCookies(page) {
385
+ return __awaiter(this, void 0, void 0, function* () {
386
+ const frames = page.frames();
387
+ const cookies = {};
388
+ yield Promise.all(frames.map((frame) => __awaiter(this, void 0, void 0, function* () {
389
+ if (!frame.url().includes('http')) {
390
+ return;
391
+ }
392
+ const _JSCookies = yield (0, common_1.resolveWithTimeout)(frame.evaluate(() => {
393
+ // @ts-ignore
394
+ return cookieStore.getAll();
395
+ }), [], 200);
396
+ const frameCookies = {};
397
+ _JSCookies.forEach((cookie) => {
398
+ if (!cookie.domain) {
399
+ cookie.domain = new URL(frame.url()).hostname;
400
+ }
401
+ if (cookie.domain[0] !== '.') {
402
+ cookie.domain = '.' + cookie.domain;
403
+ }
404
+ const key = cookie.name + ':' + cookie.domain + ':' + cookie.path;
405
+ frameCookies[key] = { parsedCookie: cookie };
406
+ });
407
+ const frameUrl = new URL(frame.url()).origin;
408
+ cookies[frameUrl] = { frameCookies };
409
+ })));
410
+ return cookies;
411
+ });
412
+ }
413
+ getResources(urls) {
414
+ const allFetchedResources = {};
415
+ urls.forEach((url) => {
416
+ var _a;
417
+ const page = this.pages[url];
418
+ const resources = this.pageResourcesMaps[url];
419
+ if (!page || !resources) {
420
+ allFetchedResources[url] = [];
421
+ return;
422
+ }
423
+ const mainFrameUrl = new URL(page.url()).origin;
424
+ allFetchedResources[mainFrameUrl] = Array.from((_a = Object.values(resources)) !== null && _a !== void 0 ? _a : []);
425
+ });
426
+ return allFetchedResources;
427
+ }
428
+ insertAndRunDOMQueryFunctions(url, Libraries) {
429
+ return __awaiter(this, void 0, void 0, function* () {
430
+ const page = this.pages[url];
431
+ if (!page) {
432
+ throw new Error('no page with the provided id was found');
433
+ }
434
+ const domQueryMatches = {};
435
+ yield Promise.all(Libraries.map((_a) => __awaiter(this, [_a], void 0, function* ({ domQueryFunction, name }) {
436
+ if (domQueryFunction && name) {
437
+ yield page.addScriptTag({
438
+ content: `window.${name.replaceAll('-', '')} = ${domQueryFunction}`,
439
+ });
440
+ const queryResult = yield page.evaluate((library) => {
441
+ //@ts-ignore
442
+ const functionDOMQuery = window[`${library}`];
443
+ if (!functionDOMQuery) {
444
+ return [];
445
+ }
446
+ return functionDOMQuery();
447
+ }, name.replaceAll('-', ''));
448
+ domQueryMatches[name] = {
449
+ domQuerymatches: queryResult,
450
+ };
451
+ }
452
+ })));
453
+ const mainFrameUrl = new URL(page.url()).origin;
454
+ return { [mainFrameUrl]: domQueryMatches };
455
+ });
456
+ }
457
+ analyzeCookies(userProvidedUrls, shouldSkipAcceptBanner, Libraries) {
458
+ return __awaiter(this, void 0, void 0, function* () {
459
+ let consolidatedDOMQueryMatches = {};
460
+ // Open tabs and attach network listeners
461
+ yield Promise.all(userProvidedUrls.map((url) => __awaiter(this, void 0, void 0, function* () {
462
+ const sitePage = yield this.openPage();
463
+ this.pages[url] = sitePage;
464
+ yield this.attachListenersToPage(url);
465
+ })));
466
+ // Navigate to URLs
467
+ yield Promise.all(userProvidedUrls.map((url) => __awaiter(this, void 0, void 0, function* () {
468
+ yield this.navigateToPage(url);
469
+ })));
470
+ // Delay for page to load resources
471
+ yield (0, common_1.delay)(this.pageWaitTime / 2);
472
+ // Accept Banners
473
+ if (shouldSkipAcceptBanner) {
474
+ // delay
475
+ yield Promise.all(userProvidedUrls.map((url) => __awaiter(this, void 0, void 0, function* () {
476
+ yield this.clickOnAcceptBanner(url);
477
+ })));
478
+ }
479
+ // Scroll to bottom of the page
480
+ yield Promise.all(userProvidedUrls.map((url) => __awaiter(this, void 0, void 0, function* () {
481
+ yield this.pageScroll(url);
482
+ })));
483
+ yield Promise.all(userProvidedUrls.map((url) => __awaiter(this, void 0, void 0, function* () {
484
+ const newMatches = yield this.insertAndRunDOMQueryFunctions(url, Libraries);
485
+ consolidatedDOMQueryMatches = Object.assign(Object.assign({}, consolidatedDOMQueryMatches), newMatches);
486
+ })));
487
+ // Delay for page to load more resources
488
+ yield (0, common_1.delay)(this.pageWaitTime / 2);
489
+ const mainFrameUrlIdMap = yield this.getMainframeIds();
490
+ Object.entries(mainFrameUrlIdMap).forEach(([_url, id]) => {
491
+ if (!this.pageFrames[_url]) {
492
+ this.pageFrames[_url] = {
493
+ [id]: '0',
494
+ };
495
+ }
496
+ else {
497
+ this.pageFrames[_url][id] = '0';
498
+ }
499
+ });
500
+ const result = yield Promise.all(userProvidedUrls.map((userProvidedUrl) => __awaiter(this, void 0, void 0, function* () {
501
+ const _responses = this.pageResponses[userProvidedUrl];
502
+ const _requests = this.pageRequests[userProvidedUrl];
503
+ const _page = this.pages[userProvidedUrl];
504
+ const _pageFrames = this.pageFrames[userProvidedUrl];
505
+ if (!_responses || !_requests || !_page) {
506
+ return {
507
+ url: userProvidedUrl,
508
+ cookieData: {},
509
+ };
510
+ }
511
+ const cookieDataFromNetwork = yield (0, parseNetworkDataToCookieData_1.parseNetworkDataToCookieData)(_responses, _requests, _page, _pageFrames);
512
+ const cookieDataFromJS = yield this.getJSCookies(_page);
513
+ const mainFrameUrl = new URL(_page.url()).origin;
514
+ const collatedCookieData = (0, collateCookieData_1.default)(cookieDataFromNetwork, cookieDataFromJS);
515
+ return {
516
+ // Page may redirect. page.url() gives the redirected URL
517
+ url: mainFrameUrl,
518
+ cookieData: collatedCookieData,
519
+ };
520
+ })));
521
+ return { result, consolidatedDOMQueryMatches };
522
+ });
523
+ }
524
+ deinitialize() {
525
+ return __awaiter(this, void 0, void 0, function* () {
526
+ var _a;
527
+ yield ((_a = this.browser) === null || _a === void 0 ? void 0 : _a.close());
528
+ });
529
+ }
530
+ }
531
+ exports.BrowserManagement = BrowserManagement;
532
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browserManagement/index.ts"],"names":[],"mappings":"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"}