Skip to content

Commit 9a47d42

Browse files
perf: decrease ts transformation latency (#1117)
* perf: preload worker modules * perf: preload wdio in worker * perf: lazy load nodejs/browser runner * perf: preload webdriver/webdriverio * perf: optimize imports * perf: preload test reader/parser modules in worker * perf: init session while parsing tests * perf: use lazy-load in custom commands * perf: wait for launched driver more aggressively * perf: perform isolation while preparing session * perf: remove extra logic from new-browser * perf: decrease ts transformation latency
1 parent 5b1357f commit 9a47d42

61 files changed

Lines changed: 3159 additions & 3746 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package-lock.json

Lines changed: 2709 additions & 2880 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
"debug": "2.6.9",
8181
"edgedriver": "5.6.1",
8282
"error-stack-parser": "2.1.4",
83+
"esbuild": "0.25.8",
8384
"expect-webdriverio": "3.6.0",
8485
"extract-zip": "2.0.1",
8586
"fastq": "1.13.0",
@@ -88,11 +89,13 @@
8889
"gemini-configparser": "1.4.1",
8990
"get-port": "5.1.1",
9091
"import-meta-resolve": "4.0.0",
92+
"load-esm": "1.0.2",
9193
"local-pkg": "0.4.3",
9294
"lodash": "4.17.21",
9395
"looks-same": "9.0.1",
9496
"micromatch": "4.0.5",
9597
"mocha": "10.2.0",
98+
"pirates": "4.0.7",
9699
"plugins-loader": "1.3.4",
97100
"png-validator": "1.1.0",
98101
"recast": "0.23.6",
@@ -114,19 +117,13 @@
114117
"yallist": "3.1.1"
115118
},
116119
"devDependencies": {
117-
"@babel/core": "7.24.1",
118-
"@babel/plugin-transform-modules-commonjs": "7.24.1",
119-
"@babel/plugin-transform-react-jsx": "7.23.4",
120-
"@babel/preset-react": "7.24.1",
121-
"@babel/preset-typescript": "7.24.1",
122120
"@commitlint/cli": "^19.0.3",
123121
"@commitlint/config-conventional": "^19.0.3",
124122
"@cspotcode/source-map-support": "0.8.0",
125123
"@sinonjs/fake-timers": "10.3.0",
126-
"@swc/core": "1.9.2",
124+
"@swc/core": "1.13.3",
127125
"@testplane/wdio-types": "9.5.3",
128126
"@types/babel__code-frame": "7.0.6",
129-
"@types/babel__core": "7.20.5",
130127
"@types/browserify": "12.0.40",
131128
"@types/chai": "4.3.4",
132129
"@types/chai-as-promised": "7.1.5",
@@ -158,7 +155,6 @@
158155
"concurrently": "8.2.2",
159156
"copyfiles": "2.4.1",
160157
"doctoc": "2.2.0",
161-
"esbuild": "0.18.20",
162158
"eslint": "8.25.0",
163159
"eslint-config-gemini-testing": "2.8.0",
164160
"eslint-config-prettier": "8.7.0",
@@ -169,7 +165,6 @@
169165
"jsdom": "^24.0.0",
170166
"jsdom-global": "3.0.2",
171167
"onchange": "7.1.0",
172-
"pirates": "4.0.6",
173168
"prettier": "2.8.4",
174169
"proxyquire": "1.8.0",
175170
"rimraf": "4.1.2",

src/base-testplane.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
Interceptor,
1212
} from "./events";
1313
import Errors from "./errors";
14-
import { tryToRegisterTsNode } from "./utils/typescript";
14+
import { registerTransformHook } from "./utils/typescript";
1515
import { ConfigInput } from "./config/types";
1616

1717
export abstract class BaseTestplane extends AsyncEmitter {
@@ -30,7 +30,7 @@ export abstract class BaseTestplane extends AsyncEmitter {
3030

3131
this._interceptors = [];
3232

33-
tryToRegisterTsNode(this.isWorker());
33+
registerTransformHook(this.isWorker());
3434

3535
this._config = Config.create(config);
3636
this._setLogLevel();

src/browser-installer/chrome/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { spawn, type ChildProcess } from "child_process";
22
import getPort from "get-port";
33
import waitPort from "wait-port";
44
import { pipeLogsWithPrefix } from "../../dev-server/utils";
5-
import { DRIVER_WAIT_TIMEOUT } from "../constants";
5+
import { DRIVER_WAIT_INTERVAL, DRIVER_WAIT_TIMEOUT } from "../constants";
66
import { getMilestone } from "../utils";
77
import { installChrome, resolveLatestChromeVersion } from "./browser";
88
import { installChromeDriver } from "./driver";
@@ -36,7 +36,12 @@ export const runChromeDriver = async (
3636

3737
process.once("exit", () => chromeDriver.kill());
3838

39-
await waitPort({ port: randomPort, output: "silent", timeout: DRIVER_WAIT_TIMEOUT });
39+
await waitPort({
40+
port: randomPort,
41+
output: "silent",
42+
timeout: DRIVER_WAIT_TIMEOUT,
43+
interval: DRIVER_WAIT_INTERVAL,
44+
});
4045

4146
return { gridUrl, process: chromeDriver, port: randomPort };
4247
};

src/browser-installer/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const MIN_CHROMIUM_MAC_ARM_VERSION = 93;
2020
export const MIN_CHROMIUM_VERSION = 73;
2121
export const MIN_FIREFOX_VERSION = 60;
2222
export const MIN_EDGEDRIVER_VERSION = 94;
23+
export const DRIVER_WAIT_INTERVAL = 25; // 25ms
2324
export const DRIVER_WAIT_TIMEOUT = 10 * 1000; // 10s
2425
export const LINUX_UBUNTU_RELEASE_ID = "ubuntu";
2526
export const LINUX_RUNTIME_LIBRARIES_PATH_ENV_NAME = "LD_LIBRARY_PATH";

src/browser-installer/edge/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { spawn, type ChildProcess } from "child_process";
33
import getPort from "get-port";
44
import waitPort from "wait-port";
55
import { pipeLogsWithPrefix } from "../../dev-server/utils";
6-
import { DRIVER_WAIT_TIMEOUT } from "../constants";
6+
import { DRIVER_WAIT_INTERVAL, DRIVER_WAIT_TIMEOUT } from "../constants";
77

88
export { resolveEdgeVersion } from "./browser";
99
export { installEdgeDriver };
@@ -27,7 +27,12 @@ export const runEdgeDriver = async (
2727

2828
process.once("exit", () => edgeDriver.kill());
2929

30-
await waitPort({ port: randomPort, output: "silent", timeout: DRIVER_WAIT_TIMEOUT });
30+
await waitPort({
31+
port: randomPort,
32+
output: "silent",
33+
timeout: DRIVER_WAIT_TIMEOUT,
34+
interval: DRIVER_WAIT_INTERVAL,
35+
});
3136

3237
return { gridUrl, process: edgeDriver, port: randomPort };
3338
};

src/browser-installer/firefox/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import waitPort from "wait-port";
55
import { installFirefox, resolveLatestFirefoxVersion } from "./browser";
66
import { installLatestGeckoDriver } from "./driver";
77
import { pipeLogsWithPrefix } from "../../dev-server/utils";
8-
import { DRIVER_WAIT_TIMEOUT } from "../constants";
8+
import { DRIVER_WAIT_INTERVAL, DRIVER_WAIT_TIMEOUT } from "../constants";
99
import { getUbuntuLinkerEnv, isUbuntu } from "../ubuntu-packages";
1010

1111
export { installFirefox, resolveLatestFirefoxVersion, installLatestGeckoDriver };
@@ -41,7 +41,12 @@ export const runGeckoDriver = async (
4141

4242
process.once("exit", () => geckoDriver.kill());
4343

44-
await waitPort({ port: randomPort, output: "silent", timeout: DRIVER_WAIT_TIMEOUT });
44+
await waitPort({
45+
port: randomPort,
46+
output: "silent",
47+
timeout: DRIVER_WAIT_TIMEOUT,
48+
interval: DRIVER_WAIT_INTERVAL,
49+
});
4550

4651
return { gridUrl, process: geckoDriver, port: randomPort };
4752
};

src/browser-installer/safari/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { spawn, type ChildProcess } from "child_process";
22
import getPort from "get-port";
33
import waitPort from "wait-port";
44
import { pipeLogsWithPrefix } from "../../dev-server/utils";
5-
import { DRIVER_WAIT_TIMEOUT, SAFARIDRIVER_PATH } from "../constants";
5+
import { DRIVER_WAIT_INTERVAL, DRIVER_WAIT_TIMEOUT, SAFARIDRIVER_PATH } from "../constants";
66

77
export { resolveSafariVersion } from "./browser";
88

@@ -26,7 +26,12 @@ export const runSafariDriver = async ({ debug = false }: { debug?: boolean } = {
2626

2727
process.once("exit", () => safariDriver.kill());
2828

29-
await waitPort({ port: randomPort, output: "silent", timeout: DRIVER_WAIT_TIMEOUT });
29+
await waitPort({
30+
port: randomPort,
31+
output: "silent",
32+
timeout: DRIVER_WAIT_TIMEOUT,
33+
interval: DRIVER_WAIT_INTERVAL,
34+
});
3035

3136
return { gridUrl, process: safariDriver, port: randomPort };
3237
};

src/browser-pool/basic-pool.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import debug from "debug";
22
import _ from "lodash";
33

4-
import { NewBrowser } from "../browser/new-browser";
4+
import type { NewBrowser } from "../browser/new-browser";
55
import { CancelledError } from "./cancelled-error";
66
import { AsyncEmitter, MasterEvents } from "../events";
77
import { BrowserOpts, Pool } from "./types";
@@ -32,6 +32,7 @@ export class BasicPool implements Pool {
3232
}
3333

3434
async getBrowser(id: string, opts: BrowserOpts = {}): Promise<NewBrowser> {
35+
const { NewBrowser } = await import("../browser/new-browser");
3536
const browser = NewBrowser.create(this._config, { ...opts, id, wdPool: this._wdPool, emitter: this._emitter });
3637

3738
try {

src/browser-pool/webdriver-pool.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { ChildProcess } from "child_process";
2-
import { resolveBrowserVersion, runBrowserDriver } from "../browser-installer";
32
import { getNormalizedBrowserName } from "../utils/browser";
43
import type { SupportedBrowser } from "../browser-installer";
54

@@ -33,6 +32,7 @@ export class WebdriverPool {
3332
);
3433
}
3534

35+
const { resolveBrowserVersion } = await import("../browser-installer");
3636
const browserVersionNormalized = browserVersion || (await resolveBrowserVersion(browserNameNormalized));
3737

3838
const wdProcesses = this.driverProcess.get(browserNameNormalized)?.get(browserVersionNormalized) ?? {};
@@ -76,6 +76,7 @@ export class WebdriverPool {
7676
browserVersion: string,
7777
{ debug = false } = {},
7878
): Promise<WdProcess> {
79+
const { runBrowserDriver } = await import("../browser-installer");
7980
const driver = await runBrowserDriver(browserName, browserVersion, { debug });
8081

8182
if (!this.driverProcess.has(browserName)) {

0 commit comments

Comments
 (0)