donobu 2.18.3 → 2.18.5

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 (171) hide show
  1. package/dist/assets/control-panel.js +7 -1
  2. package/dist/assets/generated/parameter-schemas.json +44 -0
  3. package/dist/assets/generated/version +1 -1
  4. package/dist/assets/page-interactions-tracker.js +27 -30
  5. package/dist/bindings/PageInteractionTracker.d.ts.map +1 -1
  6. package/dist/bindings/PageInteractionTracker.js +1 -1
  7. package/dist/bindings/PageInteractionTracker.js.map +1 -1
  8. package/dist/esm/assets/control-panel.js +7 -1
  9. package/dist/esm/assets/generated/parameter-schemas.json +44 -0
  10. package/dist/esm/assets/generated/version +1 -1
  11. package/dist/esm/assets/page-interactions-tracker.js +27 -30
  12. package/dist/esm/bindings/PageInteractionTracker.d.ts.map +1 -1
  13. package/dist/esm/bindings/PageInteractionTracker.js +1 -1
  14. package/dist/esm/bindings/PageInteractionTracker.js.map +1 -1
  15. package/dist/esm/lib/testExtension.d.ts.map +1 -1
  16. package/dist/esm/lib/testExtension.js +9 -9
  17. package/dist/esm/lib/testExtension.js.map +1 -1
  18. package/dist/esm/managers/CodeGenerator.d.ts.map +1 -1
  19. package/dist/esm/managers/CodeGenerator.js +34 -1
  20. package/dist/esm/managers/CodeGenerator.js.map +1 -1
  21. package/dist/esm/managers/ControlPanel.d.ts.map +1 -1
  22. package/dist/esm/managers/ControlPanel.js +7 -5
  23. package/dist/esm/managers/ControlPanel.js.map +1 -1
  24. package/dist/esm/managers/DonobuFlow.d.ts +3 -4
  25. package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
  26. package/dist/esm/managers/DonobuFlow.js +59 -44
  27. package/dist/esm/managers/DonobuFlow.js.map +1 -1
  28. package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
  29. package/dist/esm/managers/DonobuFlowsManager.js +12 -12
  30. package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
  31. package/dist/esm/managers/ToolManager.d.ts.map +1 -1
  32. package/dist/esm/managers/ToolManager.js +4 -2
  33. package/dist/esm/managers/ToolManager.js.map +1 -1
  34. package/dist/esm/models/FlowMetadata.d.ts +52 -0
  35. package/dist/esm/models/FlowMetadata.d.ts.map +1 -1
  36. package/dist/esm/persistence/flows/FlowsPersistence.d.ts +11 -9
  37. package/dist/esm/persistence/flows/FlowsPersistence.d.ts.map +1 -1
  38. package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts +4 -5
  39. package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +1 -1
  40. package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js +76 -77
  41. package/dist/esm/persistence/flows/FlowsPersistenceAwsS3.js.map +1 -1
  42. package/dist/esm/persistence/flows/FlowsPersistenceFactoryImpl.js +2 -2
  43. package/dist/esm/persistence/flows/FlowsPersistenceFactoryImpl.js.map +1 -1
  44. package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.d.ts +7 -7
  45. package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.d.ts.map +1 -1
  46. package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.js +51 -60
  47. package/dist/esm/persistence/flows/FlowsPersistenceFilesystem.js.map +1 -1
  48. package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +4 -5
  49. package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +1 -1
  50. package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +40 -41
  51. package/dist/esm/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +1 -1
  52. package/dist/esm/persistence/flows/FlowsPersistenceSqlite.d.ts +4 -4
  53. package/dist/esm/persistence/flows/FlowsPersistenceSqlite.d.ts.map +1 -1
  54. package/dist/esm/persistence/flows/FlowsPersistenceSqlite.js +40 -40
  55. package/dist/esm/persistence/flows/FlowsPersistenceSqlite.js.map +1 -1
  56. package/dist/esm/persistence/flows/FlowsPersistenceSupabase.d.ts +4 -5
  57. package/dist/esm/persistence/flows/FlowsPersistenceSupabase.d.ts.map +1 -1
  58. package/dist/esm/persistence/flows/FlowsPersistenceSupabase.js +37 -37
  59. package/dist/esm/persistence/flows/FlowsPersistenceSupabase.js.map +1 -1
  60. package/dist/esm/persistence/flows/FlowsPersistenceVolatile.d.ts +7 -7
  61. package/dist/esm/persistence/flows/FlowsPersistenceVolatile.d.ts.map +1 -1
  62. package/dist/esm/persistence/flows/FlowsPersistenceVolatile.js +35 -33
  63. package/dist/esm/persistence/flows/FlowsPersistenceVolatile.js.map +1 -1
  64. package/dist/esm/tools/AssertPageTool.d.ts +34 -0
  65. package/dist/esm/tools/AssertPageTool.d.ts.map +1 -0
  66. package/dist/esm/tools/AssertPageTool.js +156 -0
  67. package/dist/esm/tools/AssertPageTool.js.map +1 -0
  68. package/dist/esm/tools/AssertTool.js +1 -1
  69. package/dist/esm/tools/AssertTool.js.map +1 -1
  70. package/dist/esm/tools/ClickTool.d.ts.map +1 -1
  71. package/dist/esm/tools/ClickTool.js +3 -0
  72. package/dist/esm/tools/ClickTool.js.map +1 -1
  73. package/dist/esm/tools/DetectBrokenLinksTool.js +1 -1
  74. package/dist/esm/tools/DetectBrokenLinksTool.js.map +1 -1
  75. package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
  76. package/dist/esm/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
  77. package/dist/esm/tools/SolveMfaChallenge.d.ts +2 -1
  78. package/dist/esm/tools/SolveMfaChallenge.d.ts.map +1 -1
  79. package/dist/esm/tools/SolveMfaChallenge.js +51 -25
  80. package/dist/esm/tools/SolveMfaChallenge.js.map +1 -1
  81. package/dist/esm/utils/BrowserUtils.d.ts +52 -0
  82. package/dist/esm/utils/BrowserUtils.d.ts.map +1 -0
  83. package/dist/esm/utils/BrowserUtils.js +340 -0
  84. package/dist/esm/utils/BrowserUtils.js.map +1 -0
  85. package/dist/esm/utils/PlaywrightUtils.d.ts +15 -11
  86. package/dist/esm/utils/PlaywrightUtils.d.ts.map +1 -1
  87. package/dist/esm/utils/PlaywrightUtils.js +79 -122
  88. package/dist/esm/utils/PlaywrightUtils.js.map +1 -1
  89. package/dist/lib/autoTest.d.ts +2 -0
  90. package/dist/lib/autoTest.d.ts.map +1 -0
  91. package/dist/lib/autoTest.js +17 -0
  92. package/dist/lib/autoTest.js.map +1 -0
  93. package/dist/lib/testExtension.d.ts.map +1 -1
  94. package/dist/lib/testExtension.js +9 -9
  95. package/dist/lib/testExtension.js.map +1 -1
  96. package/dist/managers/CodeGenerator.d.ts.map +1 -1
  97. package/dist/managers/CodeGenerator.js +34 -1
  98. package/dist/managers/CodeGenerator.js.map +1 -1
  99. package/dist/managers/ControlPanel.d.ts.map +1 -1
  100. package/dist/managers/ControlPanel.js +7 -5
  101. package/dist/managers/ControlPanel.js.map +1 -1
  102. package/dist/managers/DonobuFlow.d.ts +3 -4
  103. package/dist/managers/DonobuFlow.d.ts.map +1 -1
  104. package/dist/managers/DonobuFlow.js +59 -44
  105. package/dist/managers/DonobuFlow.js.map +1 -1
  106. package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
  107. package/dist/managers/DonobuFlowsManager.js +12 -12
  108. package/dist/managers/DonobuFlowsManager.js.map +1 -1
  109. package/dist/managers/ToolManager.d.ts.map +1 -1
  110. package/dist/managers/ToolManager.js +4 -2
  111. package/dist/managers/ToolManager.js.map +1 -1
  112. package/dist/models/BrowserFramework.d.ts +2 -12
  113. package/dist/models/BrowserFramework.d.ts.map +1 -1
  114. package/dist/models/BrowserFramework.js +91 -66
  115. package/dist/models/BrowserFramework.js.map +1 -1
  116. package/dist/models/FlowMetadata.d.ts +52 -0
  117. package/dist/models/FlowMetadata.d.ts.map +1 -1
  118. package/dist/persistence/flows/FlowsPersistence.d.ts +11 -9
  119. package/dist/persistence/flows/FlowsPersistence.d.ts.map +1 -1
  120. package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts +4 -5
  121. package/dist/persistence/flows/FlowsPersistenceAwsS3.d.ts.map +1 -1
  122. package/dist/persistence/flows/FlowsPersistenceAwsS3.js +76 -77
  123. package/dist/persistence/flows/FlowsPersistenceAwsS3.js.map +1 -1
  124. package/dist/persistence/flows/FlowsPersistenceFactoryImpl.js +2 -2
  125. package/dist/persistence/flows/FlowsPersistenceFactoryImpl.js.map +1 -1
  126. package/dist/persistence/flows/FlowsPersistenceFilesystem.d.ts +7 -7
  127. package/dist/persistence/flows/FlowsPersistenceFilesystem.d.ts.map +1 -1
  128. package/dist/persistence/flows/FlowsPersistenceFilesystem.js +51 -60
  129. package/dist/persistence/flows/FlowsPersistenceFilesystem.js.map +1 -1
  130. package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts +4 -5
  131. package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.d.ts.map +1 -1
  132. package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js +40 -41
  133. package/dist/persistence/flows/FlowsPersistenceGoogleCloudStorage.js.map +1 -1
  134. package/dist/persistence/flows/FlowsPersistenceSqlite.d.ts +4 -4
  135. package/dist/persistence/flows/FlowsPersistenceSqlite.d.ts.map +1 -1
  136. package/dist/persistence/flows/FlowsPersistenceSqlite.js +40 -40
  137. package/dist/persistence/flows/FlowsPersistenceSqlite.js.map +1 -1
  138. package/dist/persistence/flows/FlowsPersistenceSupabase.d.ts +4 -5
  139. package/dist/persistence/flows/FlowsPersistenceSupabase.d.ts.map +1 -1
  140. package/dist/persistence/flows/FlowsPersistenceSupabase.js +37 -37
  141. package/dist/persistence/flows/FlowsPersistenceSupabase.js.map +1 -1
  142. package/dist/persistence/flows/FlowsPersistenceVolatile.d.ts +7 -7
  143. package/dist/persistence/flows/FlowsPersistenceVolatile.d.ts.map +1 -1
  144. package/dist/persistence/flows/FlowsPersistenceVolatile.js +35 -33
  145. package/dist/persistence/flows/FlowsPersistenceVolatile.js.map +1 -1
  146. package/dist/tools/AssertPageTool.d.ts +34 -0
  147. package/dist/tools/AssertPageTool.d.ts.map +1 -0
  148. package/dist/tools/AssertPageTool.js +156 -0
  149. package/dist/tools/AssertPageTool.js.map +1 -0
  150. package/dist/tools/AssertTool.js +1 -1
  151. package/dist/tools/AssertTool.js.map +1 -1
  152. package/dist/tools/ClickTool.d.ts.map +1 -1
  153. package/dist/tools/ClickTool.js +3 -0
  154. package/dist/tools/ClickTool.js.map +1 -1
  155. package/dist/tools/DetectBrokenLinksTool.js +1 -1
  156. package/dist/tools/DetectBrokenLinksTool.js.map +1 -1
  157. package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js +1 -1
  158. package/dist/tools/ExtractGoogleStreetviewEntityDataTool.js.map +1 -1
  159. package/dist/tools/SolveMfaChallenge.d.ts +2 -1
  160. package/dist/tools/SolveMfaChallenge.d.ts.map +1 -1
  161. package/dist/tools/SolveMfaChallenge.js +51 -25
  162. package/dist/tools/SolveMfaChallenge.js.map +1 -1
  163. package/dist/utils/BrowserUtils.d.ts +52 -0
  164. package/dist/utils/BrowserUtils.d.ts.map +1 -0
  165. package/dist/utils/BrowserUtils.js +340 -0
  166. package/dist/utils/BrowserUtils.js.map +1 -0
  167. package/dist/utils/PlaywrightUtils.d.ts +15 -11
  168. package/dist/utils/PlaywrightUtils.d.ts.map +1 -1
  169. package/dist/utils/PlaywrightUtils.js +79 -122
  170. package/dist/utils/PlaywrightUtils.js.map +1 -1
  171. package/package.json +1 -1
@@ -22,19 +22,22 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
22
22
  if (!mfaCode) {
23
23
  throw new Error('Could not find MFA code in emails after multiple attempts');
24
24
  }
25
- // Input the MFA code into the element
25
+ // Input the MFA code into the element.
26
+ //
27
+ // Note: We focus the element then send raw keyboard events rather than
28
+ // doing 'element.press' since some MFA systems automatically progress
29
+ // focus across input fields when each character is entered.
30
+ await element.focus();
26
31
  for (const char of mfaCode) {
27
- await element.press(char, {
32
+ await context.page.current.keyboard.press(char, {
28
33
  delay: MiscUtils_1.MiscUtils.generateHumanLikeKeyPressDurationInMs(char),
29
- timeout: 3000,
30
34
  });
31
35
  }
32
36
  // Submit the form if necessary
33
37
  try {
34
38
  const char = 'Enter';
35
- await element.press(char, {
39
+ await context.page.current.keyboard.press(char, {
36
40
  delay: MiscUtils_1.MiscUtils.generateHumanLikeKeyPressDurationInMs(char),
37
- timeout: 3000,
38
41
  });
39
42
  }
40
43
  catch (_error) {
@@ -44,6 +47,7 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
44
47
  return `Successfully retrieved and inputted MFA code: ${mfaCode}`;
45
48
  }
46
49
  async getMfaCodeFromEmails(context, gmail, waitTimeSeconds) {
50
+ const seenIds = new Set();
47
51
  const startTime = Date.now();
48
52
  const endTime = startTime + waitTimeSeconds * 1000;
49
53
  let attempt = 0;
@@ -53,7 +57,7 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
53
57
  attempt++;
54
58
  Logger_1.appLogger.info(`Attempt ${attempt} of ${SolveMfaChallengeTool.MAX_RETRIES} to find MFA code in emails`);
55
59
  // Get the body of the latest email for the user.
56
- const emailBody = await this.getLatestEmailBody(gmail);
60
+ const emailBody = await this.fetchLatestMfaEmail(gmail, seenIds);
57
61
  // Only process if the email body has changed.
58
62
  if (emailBody && emailBody !== lastEmailBody) {
59
63
  lastEmailBody = emailBody;
@@ -71,29 +75,51 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
71
75
  }
72
76
  return null;
73
77
  }
74
- async getLatestEmailBody(gmail) {
75
- // Build search query to only get recent emails (last 2 minutes)
76
- const query = 'subject:(code OR security OR authentication OR verification OR confirm OR verify) newer_than:2m';
77
- // fetch a few recent message IDs (Gmail API already returns them newest-first)
78
- const res = await gmail.users.messages.list({
78
+ async fetchLatestMfaEmail(gmail, seenIds) {
79
+ const lookbackMinutes = 2;
80
+ const cutoff = Date.now() - lookbackMinutes * 60000;
81
+ const threadRes = await gmail.users.threads.list({
79
82
  userId: 'me',
80
- q: query,
81
- maxResults: 10, // small buffer in case of threading
83
+ q: 'subject:(code OR security OR authentication OR verification OR confirm OR verify) ' +
84
+ 'is:unread in:inbox',
85
+ maxResults: 25,
86
+ fields: 'threads(id)',
82
87
  });
83
- if (!res.data.messages?.length) {
84
- Logger_1.appLogger.info('No matching emails found');
88
+ const candidates = [];
89
+ for (const th of threadRes.data.threads ?? []) {
90
+ const t = await gmail.users.threads.get({
91
+ userId: 'me',
92
+ id: th.id,
93
+ format: 'metadata',
94
+ fields: 'messages(id,internalDate,labelIds)',
95
+ });
96
+ const m = t.data.messages.at(-1); // newest in that thread
97
+ if (!m || seenIds.has(m.id)) {
98
+ continue;
99
+ }
100
+ else if (!m.labelIds?.includes('UNREAD')) {
101
+ continue;
102
+ }
103
+ const ts = Number(m.internalDate);
104
+ if (ts < cutoff) {
105
+ continue;
106
+ }
107
+ candidates.push({ id: m.id, ts });
108
+ }
109
+ if (!candidates.length) {
85
110
  return null;
86
111
  }
87
- // fetch metadata for each candidate, then pick the newest by internalDate
88
- const detailed = await Promise.all(res.data.messages.map((m) => gmail.users.messages.get({
112
+ const winner = candidates.sort((a, b) => b.ts - a.ts)[0];
113
+ seenIds.add(winner.id);
114
+ const full = await gmail.users.messages.get({
89
115
  userId: 'me',
90
- id: m.id,
116
+ id: winner.id,
91
117
  format: 'full',
92
- })));
93
- detailed.sort((a, b) => Number(b.data.internalDate) - Number(a.data.internalDate));
94
- const email = detailed[0];
95
- // Extract email body
96
- const parts = email.data.payload?.parts;
118
+ });
119
+ return this.extractBody(full.data);
120
+ }
121
+ extractBody(email) {
122
+ const parts = email.payload?.parts;
97
123
  let body = '';
98
124
  if (parts) {
99
125
  // Try to find plain text part first
@@ -109,9 +135,9 @@ class SolveMfaChallengeTool extends ReplayableInteraction_1.ReplayableInteractio
109
135
  }
110
136
  }
111
137
  }
112
- else if (email.data.payload?.body?.data) {
138
+ else if (email.payload?.body?.data) {
113
139
  // Handle case where email has no parts
114
- body = this.decodeBase64Url(email.data.payload.body.data);
140
+ body = this.decodeBase64Url(email.payload.body.data);
115
141
  }
116
142
  if (!body) {
117
143
  Logger_1.appLogger.warn('Email found but body could not be decoded');
@@ -1 +1 @@
1
- {"version":3,"file":"SolveMfaChallenge.js","sourceRoot":"","sources":["../../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SolveMfaChallenge.js","sourceRoot":"","sources":["../../../src/tools/SolveMfaChallenge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { BrowserContext } from 'playwright';
2
+ import { BrowserDevice } from '../models/BrowserDevice';
3
+ import { BrowserStorageState } from '../models/BrowserStorageState';
4
+ import { BrowserConfig } from '../models/BrowserConfig';
5
+ export declare class BrowserUtils {
6
+ private static readonly DEFAULT_DEVICE_NAME;
7
+ /**
8
+ * Loads all the pre-canned browser device configurations from the local
9
+ * filesystem.
10
+ *
11
+ * The returned map keys the devices by their name (ex: 'Desktop Firefox').
12
+ *
13
+ * See `assets/devices.json` for details.
14
+ */
15
+ static getSupportedDevices(): Map<string, BrowserDevice>;
16
+ static create(browserConfig: BrowserConfig, outputDir: string, storageState?: BrowserStorageState): Promise<BrowserContext>;
17
+ /**
18
+ * Gets the browser storage state including cookies, localStorage, and sessionStorage.
19
+ *
20
+ * @param browserContext The browser context to extract storage state from.
21
+ * @returns A promise that resolves to the complete browser storage state.
22
+ */
23
+ static getBrowserStorageState(browserContext: BrowserContext): Promise<BrowserStorageState>;
24
+ /**
25
+ * Connects to an existing Chromium browser using the Chrome DevTools Protocol (CDP) at the given
26
+ * URL.
27
+ */
28
+ private static forRemoteBrowser;
29
+ /**
30
+ * If {@link storageState} is present, must be an object conforming to what is returned by
31
+ * {@link BrowserContext.storageState()}.
32
+ */
33
+ private static forDevice;
34
+ /**
35
+ * Creates a BrowserBase session. Using this method requires the
36
+ * BROWSERBASE_API_KEY environment variable to be set.
37
+ *
38
+ * The returned browserBaseData object conforms to the response of the session
39
+ * creation API endpoint. See...
40
+ * https://docs.browserbase.com/reference/api/create-a-session#response-id
41
+ */
42
+ private static forBrowserBase;
43
+ /**
44
+ * Establishes a BrowserBase session. The returned structure matches the
45
+ * response structore from the BrowserBase session API. See...
46
+ * https://docs.browserbase.com/reference/api/create-a-session#response-id
47
+ */
48
+ private static establishBrowserBaseSession;
49
+ private static attachSessionStorageToBrowserContext;
50
+ private static patchClose;
51
+ }
52
+ //# sourceMappingURL=BrowserUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/BrowserUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAGf,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAA0B,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAIhF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IACjE;;;;;;;OAOG;WACW,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;WAY3C,MAAM,CACxB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,mBAAmB,GACjC,OAAO,CAAC,cAAc,CAAC;IA8E1B;;;;;OAKG;WACiB,sBAAsB,CACxC,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IA6E/B;;;OAGG;mBACkB,gBAAgB;IAiCrC;;;OAGG;mBACkB,SAAS;IAiF9B;;;;;;;OAOG;mBACkB,cAAc;IA2BnC;;;;OAIG;mBACkB,2BAA2B;mBAkC3B,oCAAoC;IA2CzD,OAAO,CAAC,MAAM,CAAC,UAAU;CAgB1B"}
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BrowserUtils = void 0;
7
+ const playwright_1 = require("playwright");
8
+ const JsonUtils_1 = require("./JsonUtils");
9
+ const InvalidParamValueException_1 = require("../exceptions/InvalidParamValueException");
10
+ const path_1 = __importDefault(require("path"));
11
+ const envVars_1 = require("../envVars");
12
+ const Logger_1 = require("./Logger");
13
+ class BrowserUtils {
14
+ /**
15
+ * Loads all the pre-canned browser device configurations from the local
16
+ * filesystem.
17
+ *
18
+ * The returned map keys the devices by their name (ex: 'Desktop Firefox').
19
+ *
20
+ * See `assets/devices.json` for details.
21
+ */
22
+ static getSupportedDevices() {
23
+ const rawDevices = JsonUtils_1.JsonUtils.readResourceAsJson(path_1.default.join('devices.json'));
24
+ if (!rawDevices) {
25
+ throw new Error('Failed to load devices configuration');
26
+ }
27
+ return new Map(Object.entries(rawDevices));
28
+ }
29
+ static async create(browserConfig, outputDir, storageState) {
30
+ const type = browserConfig.using.type;
31
+ let browser;
32
+ let browserContext;
33
+ switch (type) {
34
+ case 'device': {
35
+ ({ browser, browserContext } = await BrowserUtils.forDevice(browserConfig.using.deviceName ?? BrowserUtils.DEFAULT_DEVICE_NAME, browserConfig.using.headless ?? false, outputDir, storageState));
36
+ BrowserUtils.patchClose(browserContext, () => browser.close());
37
+ break;
38
+ }
39
+ case 'remoteInstance': {
40
+ ({ browser, browserContext } = await BrowserUtils.forRemoteBrowser(browserConfig.using.url, outputDir, storageState));
41
+ BrowserUtils.patchClose(browserContext, () => browser.close());
42
+ break;
43
+ }
44
+ case 'browserBase': {
45
+ let browserBaseData;
46
+ ({ browser, browserContext, browserBaseData } =
47
+ await BrowserUtils.forBrowserBase(browserConfig.using.sessionArgs, outputDir, storageState));
48
+ BrowserUtils.patchClose(browserContext, async () => {
49
+ try {
50
+ await browser.close();
51
+ }
52
+ catch (_error) {
53
+ // Ignore, the browser may have already been closed and that is fine.
54
+ }
55
+ const body = {
56
+ projectId: browserBaseData.projectId,
57
+ status: 'REQUEST_RELEASE',
58
+ };
59
+ const password = process.env[envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY] ?? '';
60
+ const options = {
61
+ method: 'POST',
62
+ headers: {
63
+ 'X-BB-API-Key': password,
64
+ 'Content-Type': 'application/json',
65
+ },
66
+ body: JSON.stringify(body),
67
+ };
68
+ try {
69
+ await fetch(`https://api.browserbase.com/v1/sessions/${browserBaseData.id}`, options);
70
+ }
71
+ catch (error) {
72
+ // Ignore, BrowserBase sessions expire automatically anyway.
73
+ Logger_1.appLogger.warn('Failed to release BrowserBase session', error);
74
+ }
75
+ });
76
+ break;
77
+ }
78
+ default: {
79
+ throw new InvalidParamValueException_1.InvalidParamValueException('type', type);
80
+ }
81
+ }
82
+ await BrowserUtils.attachSessionStorageToBrowserContext(browserContext, storageState);
83
+ return browserContext;
84
+ }
85
+ /**
86
+ * Gets the browser storage state including cookies, localStorage, and sessionStorage.
87
+ *
88
+ * @param browserContext The browser context to extract storage state from.
89
+ * @returns A promise that resolves to the complete browser storage state.
90
+ */
91
+ static async getBrowserStorageState(browserContext) {
92
+ let result;
93
+ try {
94
+ // First get the standard storage state (cookies and localStorage)
95
+ result = await browserContext.storageState({
96
+ indexedDB: true,
97
+ });
98
+ }
99
+ catch (error) {
100
+ Logger_1.appLogger.warn('Failed to get storage state with indexedDB, falling back to cookies only', error);
101
+ result = await browserContext.storageState({
102
+ indexedDB: false,
103
+ });
104
+ }
105
+ // Get all pages in the context
106
+ const pages = browserContext.pages();
107
+ // Process each page to collect sessionStorage data
108
+ for (const page of pages) {
109
+ try {
110
+ // Get the origin for the current page
111
+ const pageOrigin = new URL(page.url()).origin;
112
+ // Find if we already have an entry for this origin
113
+ let originEntry = result.origins.find((entry) => entry.origin === pageOrigin);
114
+ // If not, create a new entry
115
+ if (!originEntry) {
116
+ originEntry = {
117
+ origin: pageOrigin,
118
+ localStorage: [],
119
+ sessionStorage: [],
120
+ };
121
+ result.origins.push(originEntry);
122
+ }
123
+ else if (!('sessionStorage' in originEntry)) {
124
+ // If the entry exists but doesn't have sessionStorage yet, add the property
125
+ originEntry.sessionStorage = [];
126
+ }
127
+ // Extract sessionStorage from the page
128
+ const sessionStorageItems = await page.evaluate(() => {
129
+ const items = [];
130
+ for (let i = 0; i < sessionStorage.length; i++) {
131
+ const name = sessionStorage.key(i);
132
+ if (name) {
133
+ items.push({
134
+ name,
135
+ value: sessionStorage.getItem(name) || '',
136
+ });
137
+ }
138
+ }
139
+ return items;
140
+ });
141
+ // Add sessionStorage items to the origin entry
142
+ originEntry.sessionStorage = sessionStorageItems;
143
+ }
144
+ catch (error) {
145
+ Logger_1.appLogger.warn(`Failed to extract sessionStorage for page: ${page.url()}`, error);
146
+ // Skip pages that might have navigation errors or are about:blank.
147
+ continue;
148
+ }
149
+ }
150
+ return result;
151
+ }
152
+ /**
153
+ * Connects to an existing Chromium browser using the Chrome DevTools Protocol (CDP) at the given
154
+ * URL.
155
+ */
156
+ static async forRemoteBrowser(remoteBrowserInstanceUrl, outputDir, storageState) {
157
+ try {
158
+ const browser = await playwright_1.chromium.connectOverCDP(remoteBrowserInstanceUrl);
159
+ try {
160
+ const contextOptions = {
161
+ recordVideo: { dir: outputDir },
162
+ };
163
+ if (storageState) {
164
+ contextOptions.storageState = storageState;
165
+ }
166
+ return {
167
+ browser: browser,
168
+ browserContext: await browser.newContext(contextOptions),
169
+ };
170
+ }
171
+ catch (error) {
172
+ await browser.close();
173
+ throw error;
174
+ }
175
+ }
176
+ catch (_) {
177
+ throw new InvalidParamValueException_1.InvalidParamValueException('remoteBrowserInstanceUrl', remoteBrowserInstanceUrl);
178
+ }
179
+ }
180
+ /**
181
+ * If {@link storageState} is present, must be an object conforming to what is returned by
182
+ * {@link BrowserContext.storageState()}.
183
+ */
184
+ static async forDevice(deviceName, headless, outputDir, storageState) {
185
+ const device = BrowserUtils.getSupportedDevices().get(deviceName);
186
+ if (!device) {
187
+ throw new InvalidParamValueException_1.InvalidParamValueException('deviceName', deviceName);
188
+ }
189
+ const contextOptions = {
190
+ userAgent: device.userAgent,
191
+ recordVideo: {
192
+ dir: outputDir,
193
+ size: {
194
+ width: device.viewport?.width ?? 1280,
195
+ height: device.viewport?.height ?? 720,
196
+ },
197
+ },
198
+ viewport: {
199
+ width: device.viewport?.width ?? 1280,
200
+ height: device.viewport?.height ?? 720,
201
+ },
202
+ screen: {
203
+ width: device.screen?.width ?? device.viewport?.width ?? 1280,
204
+ height: device.screen?.height ?? device.viewport?.height ?? 720,
205
+ },
206
+ deviceScaleFactor: device.deviceScaleFactor ?? 1.0,
207
+ isMobile: device.isMobile ?? false,
208
+ hasTouch: device.hasTouch ?? false,
209
+ };
210
+ if (storageState) {
211
+ contextOptions.storageState = storageState;
212
+ }
213
+ const launchOptions = {
214
+ headless,
215
+ args: [
216
+ '--ignore-certificate-errors',
217
+ '--disable-blink-features=AutomationControlled',
218
+ ],
219
+ };
220
+ let browser;
221
+ switch (device.defaultBrowserType.toLowerCase()) {
222
+ case 'firefox':
223
+ browser = await playwright_1.firefox.launch(launchOptions);
224
+ break;
225
+ case 'chromium':
226
+ browser = await playwright_1.chromium.launch(launchOptions);
227
+ break;
228
+ case 'chrome':
229
+ browser = await playwright_1.chromium.launch({
230
+ ...launchOptions,
231
+ channel: 'chrome',
232
+ });
233
+ break;
234
+ case 'webkit':
235
+ case 'ios':
236
+ browser = await playwright_1.webkit.launch(launchOptions);
237
+ break;
238
+ default:
239
+ throw new InvalidParamValueException_1.InvalidParamValueException('browserType', device.defaultBrowserType);
240
+ }
241
+ try {
242
+ const browserContext = await browser.newContext(contextOptions);
243
+ return { browser, browserContext };
244
+ }
245
+ catch (error) {
246
+ await browser.close();
247
+ throw error;
248
+ }
249
+ }
250
+ /**
251
+ * Creates a BrowserBase session. Using this method requires the
252
+ * BROWSERBASE_API_KEY environment variable to be set.
253
+ *
254
+ * The returned browserBaseData object conforms to the response of the session
255
+ * creation API endpoint. See...
256
+ * https://docs.browserbase.com/reference/api/create-a-session#response-id
257
+ */
258
+ static async forBrowserBase(sessionArgs, outputDir, storageState) {
259
+ const browserBaseData = await BrowserUtils.establishBrowserBaseSession(sessionArgs);
260
+ const browser = await playwright_1.chromium.connectOverCDP(browserBaseData.connectUrl);
261
+ const contextOptions = {
262
+ recordVideo: { dir: outputDir },
263
+ };
264
+ if (storageState) {
265
+ contextOptions.storageState = storageState;
266
+ }
267
+ return {
268
+ browser: browser,
269
+ browserContext: await browser.newContext(contextOptions),
270
+ browserBaseData: browserBaseData,
271
+ };
272
+ }
273
+ /**
274
+ * Establishes a BrowserBase session. The returned structure matches the
275
+ * response structore from the BrowserBase session API. See...
276
+ * https://docs.browserbase.com/reference/api/create-a-session#response-id
277
+ */
278
+ static async establishBrowserBaseSession(sessionArgs) {
279
+ const password = process.env[envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY];
280
+ if (!password) {
281
+ throw new InvalidParamValueException_1.InvalidParamValueException(envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY, null);
282
+ }
283
+ const options = {
284
+ method: 'POST',
285
+ headers: { 'X-BB-API-Key': password, 'Content-Type': 'application/json' },
286
+ body: JSON.stringify(sessionArgs),
287
+ };
288
+ const browserBaseData = await fetch('https://api.browserbase.com/v1/sessions', options).then((response) => response.json());
289
+ if (browserBaseData.error) {
290
+ throw new InvalidParamValueException_1.InvalidParamValueException(envVars_1.ENV_VAR_NAMES.BROWSERBASE_API_KEY, '(redacted)', `${browserBaseData.error}: ${browserBaseData.message}`);
291
+ }
292
+ return browserBaseData;
293
+ }
294
+ static async attachSessionStorageToBrowserContext(browserContext, storageState) {
295
+ // Add init script to restore sessionStorage if storage state is provided
296
+ if (storageState && storageState.origins) {
297
+ // Transform the storage state to map origins to their sessionStorage
298
+ const sessionStorageByOrigin = {};
299
+ for (const origin of storageState.origins) {
300
+ if (origin.sessionStorage && origin.sessionStorage.length > 0) {
301
+ // Create a key-value map for this origin's sessionStorage
302
+ const sessionStorageMap = {};
303
+ for (const item of origin.sessionStorage) {
304
+ sessionStorageMap[item.name] = item.value;
305
+ }
306
+ sessionStorageByOrigin[origin.origin] = sessionStorageMap;
307
+ }
308
+ }
309
+ // Add the init script to restore sessionStorage based on the page's origin
310
+ await browserContext.addInitScript((storageData) => {
311
+ // Get current origin
312
+ const currentOrigin = window.location.origin;
313
+ // Check if we have sessionStorage data for this origin
314
+ if (storageData[currentOrigin]) {
315
+ // Restore the sessionStorage items
316
+ for (const [key, value] of Object.entries(storageData[currentOrigin])) {
317
+ window.sessionStorage.setItem(key, value);
318
+ }
319
+ console.log(`Restored ${Object.keys(storageData[currentOrigin]).length} sessionStorage items for ${currentOrigin}`);
320
+ }
321
+ }, sessionStorageByOrigin);
322
+ }
323
+ }
324
+ static patchClose(ctx, extra) {
325
+ const original = ctx.close.bind(ctx);
326
+ ctx.close = async (...args) => {
327
+ try {
328
+ await original(...args);
329
+ }
330
+ catch { }
331
+ try {
332
+ await extra();
333
+ }
334
+ catch { }
335
+ };
336
+ }
337
+ }
338
+ exports.BrowserUtils = BrowserUtils;
339
+ BrowserUtils.DEFAULT_DEVICE_NAME = 'Desktop Chromium';
340
+ //# sourceMappingURL=BrowserUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserUtils.js","sourceRoot":"","sources":["../../../src/utils/BrowserUtils.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,21 @@ export declare class PlaywrightUtils {
28
28
  * Note that if the Donobu control panel is present in the page, it will be
29
29
  * excluded from the screenshot.
30
30
  */
31
- static takeScreenshot(page: Page, type?: 'png' | 'jpeg'): Promise<Buffer>;
31
+ static takeViewportScreenshot(page: Page, type?: 'png' | 'jpeg'): Promise<Buffer>;
32
+ /**
33
+ * Captures up to three screenshots of the given page.
34
+ *
35
+ * - `viewport`  : exact current viewport
36
+ * - `aboveViewport` : up to half-viewport preview just above the fold, or `null`
37
+ * - `belowViewport` : up to half-viewport preview just below the fold, or `null`
38
+ *
39
+ * All images are returned as JPEG buffers.
40
+ */
41
+ static takePageScreenshots(page: Page): Promise<{
42
+ aboveViewport: Buffer | null;
43
+ viewport: Buffer;
44
+ belowViewport: Buffer | null;
45
+ }>;
32
46
  /**
33
47
  * Generate valid selectors for the given element. The generated selectors are
34
48
  * in a priority order based on their ability to identify the given element.
@@ -59,15 +73,5 @@ export declare class PlaywrightUtils {
59
73
  * it is logged and ignored. If page is null, this function has no effect.
60
74
  */
61
75
  static waitForPageStability(page: Page | null): Promise<void>;
62
- /**
63
- * Takes a screenshot of the webpage as if it were scrolled down by one viewport.
64
- * If the page cannot be scrolled as a whole, tries to find and scroll individual
65
- * scrollable elements on the page. After taking the screenshot, it reverts to
66
- * the original scroll position.
67
- *
68
- * @param page The Playwright Page to take a screenshot of
69
- * @returns An image buffer of the scrolled down view, or undefined if scrolling isn't possible
70
- */
71
- static getScrolledDownScreenShot(page: Page): Promise<Buffer | undefined>;
72
76
  }
73
77
  //# sourceMappingURL=PlaywrightUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlaywrightUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUlD;;;GAGG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CACkB;IAE3E;;;;;OAKG;IACH,gBAAuB,oCAAoC,SACmB;IAE9E;;;;;;;;OAQG;WACiB,cAAc,CAChC,IAAI,EAAE,IAAI,EACV,IAAI,GAAE,KAAK,GAAG,MAAe,GAC5B,OAAO,CAAC,MAAM,CAAC;IAgBlB;;;;;;OAMG;WACiB,iBAAiB,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KAC/C,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMrB;;;;;OAKG;WACiB,wBAAwB,CAC1C,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IAWhB;;;OAGG;WACW,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;WAkBhC,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;WAI7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDnE;;;;OAIG;WACiB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1E;;;;;;;;OAQG;WACiB,yBAAyB,CAC3C,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CA4I/B"}
1
+ {"version":3,"file":"PlaywrightUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/PlaywrightUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAUlD;;;GAGG;AACH,qBAAa,eAAe;IAC1B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CACkB;IAE3E;;;;;OAKG;IACH,gBAAuB,oCAAoC,SACmB;IAE9E;;;;;;;;OAQG;WACiB,sBAAsB,CACxC,IAAI,EAAE,IAAI,EACV,IAAI,GAAE,KAAK,GAAG,MAAe,GAC5B,OAAO,CAAC,MAAM,CAAC;IAgBlB;;;;;;;;OAQG;WACiB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAC3D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IAwFF;;;;;;OAMG;WACiB,iBAAiB,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;KAC/C,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMrB;;;;;OAKG;WACiB,wBAAwB,CAC1C,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC;IAWhB;;;OAGG;WACW,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;WAkBhC,4BAA4B,IAAI,OAAO,CAAC,IAAI,CAAC;WAI7C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDnE;;;;OAIG;WACiB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB3E"}