Skip to content

Commit f88b276

Browse files
review
1 parent b7ec0dd commit f88b276

3 files changed

Lines changed: 68 additions & 68 deletions

File tree

packages/actor-scraper/web-scraper/src/internals/crawler_setup.ts

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -225,40 +225,35 @@ export class CrawlerSetup implements CrawlerSetupOptions {
225225
this.initPromise = this._initializeAsync();
226226
}
227227

228-
// DevToolsServer must be started only once per actor process
229-
private static _devToolsStartPromise: Promise<void> | null = null;
230-
private static _devToolsServer: any | null = null;
231-
private static _devToolsExitHookRegistered = false;
228+
private static devToolsStartPromise: Promise<DevToolsServer | null> | null =
229+
null;
232230

233-
private static async _startDevToolsServerOnce(): Promise<void> {
234-
if (this._devToolsStartPromise) return this._devToolsStartPromise;
231+
private static async getDevToolsServer(): Promise<DevToolsServer | null> {
232+
if (this.devToolsStartPromise) return this.devToolsStartPromise;
235233

236-
this._devToolsStartPromise = (async () => {
234+
this.devToolsStartPromise = (async () => {
237235
const url = process.env.ACTOR_WEB_SERVER_URL;
238236
const portRaw = process.env.ACTOR_WEB_SERVER_PORT;
239-
240-
if (!url || !portRaw) return;
237+
if (!url || !portRaw) return null;
241238

242239
const port = Number(portRaw);
243-
if (!Number.isFinite(port)) return;
240+
if (!Number.isFinite(port)) return null;
244241

245-
this._devToolsServer = new DevToolsServer({
242+
const server = new DevToolsServer({
246243
containerHost: new URL(url).host,
247-
devToolsServerPort: process.env.ACTOR_WEB_SERVER_PORT,
244+
devToolsServerPort: port,
248245
chromeRemoteDebuggingPort: CHROME_DEBUGGER_PORT,
249246
});
250247

251-
await this._devToolsServer.start();
248+
await server.start();
252249

253-
if (!this._devToolsExitHookRegistered) {
254-
this._devToolsExitHookRegistered = true;
255-
Actor.on('exit', () => {
256-
this._devToolsServer?.stop?.();
257-
});
258-
}
250+
Actor.on('exit', () => {
251+
server.stop?.();
252+
});
253+
return server;
259254
})();
260255

261-
return this._devToolsStartPromise;
256+
return this.devToolsStartPromise;
262257
}
263258

264259
private async _initializeAsync() {
@@ -348,8 +343,7 @@ export class CrawlerSetup implements CrawlerSetupOptions {
348343
preLaunchHooks: [
349344
async () => {
350345
if (!this.isDevRun) return;
351-
// eslint-disable-next-line no-underscore-dangle
352-
await CrawlerSetup._startDevToolsServerOnce();
346+
await CrawlerSetup.getDevToolsServer();
353347
},
354348
],
355349
},

packages/actor-scraper/web-scraper/test/bundle.browser.test.ts

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
import { launchPuppeteer } from '@crawlee/puppeteer';
22
import type { Browser, Page } from 'puppeteer';
3-
import {
4-
afterAll,
5-
afterEach,
6-
beforeAll,
7-
beforeEach,
8-
describe,
9-
expect,
10-
it,
11-
vi,
12-
} from 'vitest';
133

144
import { createBundle } from '../src/internals/bundle.browser';
155

@@ -109,40 +99,4 @@ describe('Bundle', () => {
10999
});
110100
});
111101
});
112-
113-
describe('DevToolsServer (regression)', () => {
114-
it('starts only once even if preLaunchHook calls it multiple times', async () => {
115-
const oldEnv = process.env;
116-
process.env = { ...oldEnv };
117-
118-
process.env.ACTOR_WEB_SERVER_URL = 'http://127.0.0.1:4321';
119-
process.env.ACTOR_WEB_SERVER_PORT = '4321';
120-
121-
const startMock = vi.fn(async () => {});
122-
const stopMock = vi.fn(() => {});
123-
const DevToolsCtorMock = vi.fn(() => ({
124-
start: startMock,
125-
stop: stopMock,
126-
}));
127-
128-
vi.resetModules();
129-
vi.doMock('devtools-server', () => ({ default: DevToolsCtorMock }));
130-
vi.doMock('apify', () => ({ Actor: { on: vi.fn() } }));
131-
132-
const mod = await import('../src/internals/crawler_setup.ts');
133-
const { CrawlerSetup } = mod as any;
134-
135-
await Promise.all(
136-
Array.from({ length: 10 }, () =>
137-
// eslint-disable-next-line no-underscore-dangle
138-
CrawlerSetup._startDevToolsServerOnce(),
139-
),
140-
);
141-
142-
expect(DevToolsCtorMock).toHaveBeenCalledTimes(1);
143-
expect(startMock).toHaveBeenCalledTimes(1);
144-
145-
process.env = oldEnv;
146-
});
147-
});
148102
});
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { describe, expect, it, vi } from 'vitest';
2+
3+
describe('DevToolsServer (regression)', () => {
4+
it('starts only once even if preLaunchHook calls it multiple times', async () => {
5+
const oldEnv = process.env;
6+
const actorOnMock = vi.fn();
7+
8+
const startMock = vi.fn(async () => {});
9+
const stopMock = vi.fn(() => {});
10+
const DevToolsCtorMock = vi.fn(() => ({
11+
start: startMock,
12+
stop: stopMock,
13+
}));
14+
15+
try {
16+
process.env = { ...oldEnv };
17+
process.env.ACTOR_WEB_SERVER_URL = 'http://127.0.0.1:4321';
18+
process.env.ACTOR_WEB_SERVER_PORT = '4321';
19+
20+
vi.resetModules();
21+
vi.doMock('devtools-server', () => ({ default: DevToolsCtorMock }));
22+
vi.doMock('apify', () => ({ Actor: { on: actorOnMock } }));
23+
24+
const mod = await import(
25+
new URL('../src/internals/crawler_setup.ts', import.meta.url)
26+
.href
27+
);
28+
const { CrawlerSetup } = mod as any;
29+
30+
CrawlerSetup.devToolsServerPromise = null;
31+
32+
const fn =
33+
CrawlerSetup.getDevToolsServer ??
34+
CrawlerSetup.startDevToolsServerOnce;
35+
36+
await Promise.all(
37+
Array.from({ length: 10 }, () => fn.call(CrawlerSetup)),
38+
);
39+
40+
expect(DevToolsCtorMock).toHaveBeenCalledTimes(1);
41+
expect(startMock).toHaveBeenCalledTimes(1);
42+
expect(actorOnMock).toHaveBeenCalledTimes(1);
43+
expect(actorOnMock).toHaveBeenCalledWith(
44+
'exit',
45+
expect.any(Function),
46+
);
47+
} finally {
48+
process.env = oldEnv;
49+
vi.resetModules();
50+
}
51+
});
52+
});

0 commit comments

Comments
 (0)