@lvce-editor/test-with-playwright-worker 14.7.0 → 15.0.0

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 (2) hide show
  1. package/dist/workerMain.js +50 -24
  2. package/package.json +2 -2
@@ -962,27 +962,39 @@ const runTest = async ({
962
962
  traceFocus
963
963
  }) => {
964
964
  const start = performance.now();
965
- const url = getUrlFromTestFile(test, port, traceFocus);
966
- await page.goto(url, {
967
- waitUntil: 'networkidle'
968
- });
969
- const testOverlay = page.locator('#TestOverlay');
970
- await expect(testOverlay).toBeVisible({
971
- timeout
972
- });
973
- const text = await testOverlay.textContent();
974
- const testOverlayState = await testOverlay.getAttribute('data-state');
975
- // @ts-ignore
976
- const testState = getTestState(testOverlayState);
977
- const end = performance.now();
978
- return {
965
+ try {
966
+ const url = getUrlFromTestFile(test, port, traceFocus);
967
+ await page.goto(url, {
968
+ waitUntil: 'networkidle'
969
+ });
970
+ const testOverlay = page.locator('#TestOverlay');
971
+ await expect(testOverlay).toBeVisible({
972
+ timeout
973
+ });
974
+ const text = await testOverlay.textContent();
975
+ const testOverlayState = await testOverlay.getAttribute('data-state');
979
976
  // @ts-ignore
980
- ...testState,
981
- end,
982
- error: text,
983
- name: test,
984
- start
985
- };
977
+ const testState = getTestState(testOverlayState);
978
+ const end = performance.now();
979
+ return {
980
+ // @ts-ignore
981
+ ...testState,
982
+ end,
983
+ error: text,
984
+ name: test,
985
+ start
986
+ };
987
+ } catch (error) {
988
+ const end = performance.now();
989
+ const message = error instanceof Error ? error.message : `${error}`;
990
+ return {
991
+ end,
992
+ error: message,
993
+ name: test,
994
+ start,
995
+ status: Fail
996
+ };
997
+ }
986
998
  };
987
999
 
988
1000
  /**
@@ -1055,6 +1067,11 @@ const lockedPorts = {
1055
1067
  // and a new young set for locked ports are created.
1056
1068
  const releaseOldLockedPortsIntervalMs = 1000 * 15;
1057
1069
 
1070
+ // Keep `reserve` deliberately process-wide by port number.
1071
+ // It is meant to avoid in-process races, not to model every possible
1072
+ // IPv4/IPv6 or host-specific bind combination.
1073
+ const reservedPorts = new Set();
1074
+
1058
1075
  // Lazily create timeout on first use
1059
1076
  let timeout;
1060
1077
  const getLocalHosts = () => {
@@ -1101,11 +1118,16 @@ const getAvailablePort = async (options, hosts) => {
1101
1118
  }
1102
1119
  return options.port;
1103
1120
  };
1121
+ const isLockedPort = port => lockedPorts.old.has(port) || lockedPorts.young.has(port) || reservedPorts.has(port);
1104
1122
  const portCheckSequence = function* (ports) {
1105
1123
  yield 0; // Fall back to 0 if anything else failed
1106
1124
  };
1107
1125
  async function getPorts(options) {
1108
1126
  let exclude = new Set();
1127
+ const {
1128
+ reserve,
1129
+ ...netOptions
1130
+ } = {};
1109
1131
  if (timeout === undefined) {
1110
1132
  timeout = setTimeout(() => {
1111
1133
  timeout = undefined;
@@ -1125,19 +1147,23 @@ async function getPorts(options) {
1125
1147
  continue;
1126
1148
  }
1127
1149
  let availablePort = await getAvailablePort({
1128
- ...options,
1150
+ ...netOptions,
1129
1151
  port
1130
1152
  }, hosts); // eslint-disable-line no-await-in-loop
1131
- while (lockedPorts.old.has(availablePort) || lockedPorts.young.has(availablePort)) {
1153
+ while (isLockedPort(availablePort)) {
1132
1154
  if (port !== 0) {
1133
1155
  throw new Locked(port);
1134
1156
  }
1135
1157
  availablePort = await getAvailablePort({
1136
- ...options,
1158
+ ...netOptions,
1137
1159
  port
1138
1160
  }, hosts); // eslint-disable-line no-await-in-loop
1139
1161
  }
1140
- lockedPorts.young.add(availablePort);
1162
+ if (reserve) {
1163
+ reservedPorts.add(availablePort);
1164
+ } else {
1165
+ lockedPorts.young.add(availablePort);
1166
+ }
1141
1167
  return availablePort;
1142
1168
  } catch (error) {
1143
1169
  if (!['EADDRINUSE', 'EACCES'].includes(error.code) && !(error instanceof Locked)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/test-with-playwright-worker",
3
- "version": "14.7.0",
3
+ "version": "15.0.0",
4
4
  "description": "Worker package for test-with-playwright",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,7 +12,7 @@
12
12
  "type": "module",
13
13
  "main": "dist/workerMain.js",
14
14
  "dependencies": {
15
- "@playwright/test": "1.58.2"
15
+ "@playwright/test": "1.59.0"
16
16
  },
17
17
  "engines": {
18
18
  "node": ">=24"