arudradey commited on
Commit
2e6fbe5
·
verified ·
1 Parent(s): dea198f

Update src/lib/browser.ts

Browse files
Files changed (1) hide show
  1. src/lib/browser.ts +95 -20
src/lib/browser.ts CHANGED
@@ -20,14 +20,40 @@ function getLaunchArgs(): string[] {
20
  ];
21
  }
22
 
23
- export async function initBrowser(_url?: string): Promise<void> {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  await closeBrowser();
 
 
 
 
 
25
 
26
  browser = await chromium.launch({
27
  headless: true,
28
  args: getLaunchArgs(),
29
- // optional:
30
- // channel: "chromium",
 
 
 
 
 
 
 
31
  });
32
 
33
  context = await browser.newContext({
@@ -38,38 +64,76 @@ export async function initBrowser(_url?: string): Promise<void> {
38
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
39
  });
40
 
41
- context.setDefaultTimeout(10000);
42
- context.setDefaultNavigationTimeout(15000);
43
 
44
  page = await context.newPage();
45
 
46
  await page.route("**/*.{woff,woff2,ttf,otf,eot}", (route) => route.abort());
47
 
 
 
 
 
 
48
  await page.setExtraHTTPHeaders({
49
  "Accept-Language": "en-US,en;q=0.9",
50
  });
51
 
52
- // Fast local sanity check only
53
- await page.goto("about:blank", { timeout: 5000 });
54
  console.log("[Browser] Ready on about:blank");
55
  }
56
 
57
  export async function navigateTo(url: string): Promise<void> {
58
- if (!page) throw new Error("No active browser page");
 
 
59
 
60
  console.log(`[Browser] Navigating to ${url}`);
61
 
62
- // Fastest success condition first
63
- const response = await page.goto(url, {
64
- waitUntil: "commit",
65
- timeout: 15000,
66
- });
67
 
68
- console.log("[Browser] commit ok:", response?.status());
69
 
70
- // Best-effort follow-up only
71
- await page.waitForLoadState("domcontentloaded", { timeout: 8000 }).catch(() => {});
72
- await page.waitForTimeout(1200);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  }
74
 
75
  export function getPage(): Page | null {
@@ -82,13 +146,24 @@ export function isBrowserAlive(): boolean {
82
 
83
  export async function closeBrowser(): Promise<void> {
84
  try {
85
- if (page && !page.isClosed()) await page.close().catch(() => {});
 
 
86
  page = null;
87
 
88
- if (context) await context.close().catch(() => {});
 
 
89
  context = null;
90
 
91
- if (browser && browser.isConnected()) await browser.close().catch(() => {});
 
 
 
 
 
 
 
92
  browser = null;
93
  } finally {
94
  console.log("[Browser] Session closed cleanly.");
 
20
  ];
21
  }
22
 
23
+ function ensureNodeRuntimeEnv() {
24
+ process.env.HOME = process.env.HOME || "/home/node";
25
+ process.env.XDG_CACHE_HOME =
26
+ process.env.XDG_CACHE_HOME || "/home/node/.cache";
27
+ process.env.XDG_CONFIG_HOME =
28
+ process.env.XDG_CONFIG_HOME || "/home/node/.config";
29
+ process.env.XDG_RUNTIME_DIR =
30
+ process.env.XDG_RUNTIME_DIR || "/tmp/runtime-node";
31
+ process.env.DBUS_SESSION_BUS_ADDRESS =
32
+ process.env.DBUS_SESSION_BUS_ADDRESS || "disabled";
33
+ process.env.PLAYWRIGHT_BROWSERS_PATH =
34
+ process.env.PLAYWRIGHT_BROWSERS_PATH || "/home/node/.cache/ms-playwright";
35
+ }
36
+
37
+ export async function initBrowser(): Promise<void> {
38
  await closeBrowser();
39
+ ensureNodeRuntimeEnv();
40
+
41
+ console.log(`[Browser] UID : ${process.getuid?.() ?? "unknown"}`);
42
+ console.log(`[Browser] HOME : ${process.env.HOME}`);
43
+ console.log(`[Browser] PW path : ${process.env.PLAYWRIGHT_BROWSERS_PATH}`);
44
 
45
  browser = await chromium.launch({
46
  headless: true,
47
  args: getLaunchArgs(),
48
+ env: {
49
+ ...process.env,
50
+ HOME: process.env.HOME,
51
+ XDG_CACHE_HOME: process.env.XDG_CACHE_HOME,
52
+ XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
53
+ XDG_RUNTIME_DIR: process.env.XDG_RUNTIME_DIR,
54
+ DBUS_SESSION_BUS_ADDRESS: process.env.DBUS_SESSION_BUS_ADDRESS,
55
+ PLAYWRIGHT_BROWSERS_PATH: process.env.PLAYWRIGHT_BROWSERS_PATH,
56
+ },
57
  });
58
 
59
  context = await browser.newContext({
 
64
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
65
  });
66
 
67
+ context.setDefaultTimeout(10_000);
68
+ context.setDefaultNavigationTimeout(15_000);
69
 
70
  page = await context.newPage();
71
 
72
  await page.route("**/*.{woff,woff2,ttf,otf,eot}", (route) => route.abort());
73
 
74
+ await page.route(
75
+ "**/{analytics,gtag,ga.js,fbq,hotjar,clarity,segment,mixpanel}*",
76
+ (route) => route.abort()
77
+ );
78
+
79
  await page.setExtraHTTPHeaders({
80
  "Accept-Language": "en-US,en;q=0.9",
81
  });
82
 
83
+ await page.goto("about:blank", { timeout: 5_000 });
84
+
85
  console.log("[Browser] Ready on about:blank");
86
  }
87
 
88
  export async function navigateTo(url: string): Promise<void> {
89
+ if (!page) {
90
+ throw new Error("No active browser page");
91
+ }
92
 
93
  console.log(`[Browser] Navigating to ${url}`);
94
 
95
+ try {
96
+ const response = await page.goto(url, {
97
+ waitUntil: "commit",
98
+ timeout: 15_000,
99
+ });
100
 
101
+ console.log("[Browser] commit ok:", response?.status() ?? "no-response");
102
 
103
+ await page
104
+ .waitForLoadState("domcontentloaded", { timeout: 8_000 })
105
+ .catch(() => {});
106
+ await page.waitForTimeout(1200);
107
+
108
+ return;
109
+ } catch (err) {
110
+ console.warn("[Browser] commit failed, retrying with domcontentloaded", err);
111
+ }
112
+
113
+ try {
114
+ await page.goto(url, {
115
+ waitUntil: "domcontentloaded",
116
+ timeout: 15_000,
117
+ });
118
+
119
+ console.log("[Browser] Navigation OK (domcontentloaded)");
120
+ await page.waitForTimeout(1200);
121
+ return;
122
+ } catch (err) {
123
+ console.warn("[Browser] domcontentloaded failed, waiting for body", err);
124
+ }
125
+
126
+ try {
127
+ await page.waitForSelector("body", {
128
+ timeout: 8_000,
129
+ });
130
+
131
+ console.log("[Browser] Body detected");
132
+ await page.waitForTimeout(800);
133
+ return;
134
+ } catch {
135
+ throw new Error(`Navigation failed for ${url}`);
136
+ }
137
  }
138
 
139
  export function getPage(): Page | null {
 
146
 
147
  export async function closeBrowser(): Promise<void> {
148
  try {
149
+ if (page && !page.isClosed()) {
150
+ await page.close().catch(() => {});
151
+ }
152
  page = null;
153
 
154
+ if (context) {
155
+ await context.close().catch(() => {});
156
+ }
157
  context = null;
158
 
159
+ if (browser && browser.isConnected()) {
160
+ await browser.close().catch(() => {});
161
+ }
162
+ browser = null;
163
+ } catch (e) {
164
+ console.warn("[Browser] Close warning:", e);
165
+ page = null;
166
+ context = null;
167
  browser = null;
168
  } finally {
169
  console.log("[Browser] Session closed cleanly.");