appium-xcuitest-driver 12.14.1 → 12.15.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 (24) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/lib/device/wda-host-ops.js +3 -0
  3. package/build/lib/device/wda-host-ops.js.map +1 -1
  4. package/lib/device/wda-host-ops.ts +3 -0
  5. package/node_modules/appium-ios-remotexpc/CHANGELOG.md +8 -0
  6. package/node_modules/appium-ios-remotexpc/package.json +3 -3
  7. package/node_modules/appium-ios-tuntap/CHANGELOG.md +7 -0
  8. package/node_modules/appium-ios-tuntap/lib/src/TunTap.d.ts.map +1 -1
  9. package/node_modules/appium-ios-tuntap/lib/src/TunTap.js +5 -7
  10. package/node_modules/appium-ios-tuntap/lib/src/TunTap.js.map +1 -1
  11. package/node_modules/appium-ios-tuntap/package.json +2 -2
  12. package/node_modules/appium-ios-tuntap/prebuilds/darwin-arm64/appium-ios-tuntap.node +0 -0
  13. package/node_modules/appium-ios-tuntap/prebuilds/linux-arm64/appium-ios-tuntap.node +0 -0
  14. package/node_modules/appium-ios-tuntap/prebuilds/linux-x64/appium-ios-tuntap.node +0 -0
  15. package/node_modules/appium-ios-tuntap/prebuilds/win32-x64/appium-ios-tuntap.node +0 -0
  16. package/node_modules/appium-ios-tuntap/src/TunTap.ts +5 -9
  17. package/node_modules/appium-ios-tuntap/src/native/tun_backend.h +8 -1
  18. package/node_modules/appium-ios-tuntap/src/native/tun_backend_darwin.cc +16 -10
  19. package/node_modules/appium-ios-tuntap/src/native/tun_backend_linux.cc +11 -7
  20. package/node_modules/appium-ios-tuntap/src/native/tun_backend_windows.cc +14 -11
  21. package/node_modules/appium-ios-tuntap/src/tuntap.cc +37 -2
  22. package/node_modules/appium-remote-debugger/CHANGELOG.md +8 -0
  23. package/node_modules/appium-remote-debugger/package.json +3 -3
  24. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [12.15.0](https://github.com/appium/appium-xcuitest-driver/compare/v12.14.1...v12.15.0) (2026-10-03)
2
+
3
+ ### Features
4
+
5
+ * support launching WDA on Duo ([#3000](https://github.com/appium/appium-xcuitest-driver/issues/3000)) ([a097de0](https://github.com/appium/appium-xcuitest-driver/commit/a097de0798995ffff1ee40882bab6a0e6eb430dd))
6
+
1
7
  ## [12.14.1](https://github.com/appium/appium-xcuitest-driver/compare/v12.14.0...v12.14.1) (2026-10-03)
2
8
 
3
9
  ### Bug Fixes
@@ -94,9 +94,12 @@ function stringifyLaunchEnvironment(env) {
94
94
  function createSimulatorHostOps(driver) {
95
95
  return {
96
96
  async launchPreinstalled({ bundleId, env }) {
97
+ // XCTest backgrounds a foreground runner with a Home-button press, which can
98
+ // stall on iPhone Duo. Start in the background, as xcodebuild does.
97
99
  await driver.device.launchApp(bundleId, {
98
100
  environment: stringifyLaunchEnvironment(env),
99
101
  terminateExisting: true,
102
+ activateSuspended: true,
100
103
  });
101
104
  },
102
105
  async terminate({ bundleId }) {
@@ -1 +1 @@
1
- {"version":3,"file":"wda-host-ops.js","sourceRoot":"","sources":["../../../lib/device/wda-host-ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wda-host-ops.js","sourceRoot":"","sources":["../../../lib/device/wda-host-ops.ts"],"names":[],"mappings":"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"}
@@ -148,9 +148,12 @@ function stringifyLaunchEnvironment(env: WdaLaunchEnvironment): Record<string, s
148
148
  function createSimulatorHostOps(driver: XCUITestDriver): SimulatorHostOps {
149
149
  return {
150
150
  async launchPreinstalled({bundleId, env}) {
151
+ // XCTest backgrounds a foreground runner with a Home-button press, which can
152
+ // stall on iPhone Duo. Start in the background, as xcodebuild does.
151
153
  await (driver.device as Simulator).launchApp(bundleId, {
152
154
  environment: stringifyLaunchEnvironment(env),
153
155
  terminateExisting: true,
156
+ activateSuspended: true,
154
157
  });
155
158
  },
156
159
 
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [5.24.5](https://github.com/appium/appium-ios/compare/appium-ios-remotexpc@5.24.4...appium-ios-remotexpc@5.24.5) (2026-10-03)
7
+
8
+ **Note:** Version bump only for package appium-ios-remotexpc
9
+
10
+
11
+
12
+
13
+
6
14
  ## [5.24.4](https://github.com/appium/appium-ios/compare/appium-ios-remotexpc@5.24.3...appium-ios-remotexpc@5.24.4) (2026-10-03)
7
15
 
8
16
  **Note:** Version bump only for package appium-ios-remotexpc
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-ios-remotexpc",
3
- "version": "5.24.4",
3
+ "version": "5.24.5",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "bugs": {
@@ -93,7 +93,7 @@
93
93
  "@appium/strongbox": "^2.0.0",
94
94
  "@appium/support": "^7.2.6",
95
95
  "@xmldom/xmldom": "^0.x",
96
- "appium-ios-tuntap": "^2.2.4",
96
+ "appium-ios-tuntap": "^2.2.5",
97
97
  "async-lock": "^1.4.1",
98
98
  "axios": "^1.18.0",
99
99
  "commander": "^14.0.1",
@@ -114,5 +114,5 @@
114
114
  "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
115
115
  "npm": ">=10"
116
116
  },
117
- "gitHead": "859be1d7288d86b5b276e621c10dc43ac34b65c0"
117
+ "gitHead": "bd9ba5fd86b87035b15023ae46d3bcec928266b5"
118
118
  }
@@ -3,6 +3,13 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [2.2.5](https://github.com/appium/appium-ios/compare/appium-ios-tuntap@2.2.4...appium-ios-tuntap@2.2.5) (2026-10-03)
7
+
8
+ ### Bug Fixes
9
+
10
+ * classify TunTap.open() errors by errno code instead of message text ([#34](https://github.com/appium/appium-ios/issues/34)) ([2663782](https://github.com/appium/appium-ios/commit/266378211eaf7629d8e154fa3f35eb5a41e77eb5))
11
+
12
+
6
13
  ## [2.2.4](https://github.com/appium/appium-ios/compare/appium-ios-tuntap@2.2.3...appium-ios-tuntap@2.2.4) (2026-10-03)
7
14
 
8
15
  ### Bug Fixes
@@ -1 +1 @@
1
- {"version":3,"file":"TunTap.d.ts","sourceRoot":"","sources":["../../src/TunTap.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,oBAAoB,EAAiB,MAAM,qBAAqB,CAAC;AAwC9E;;;;GAIG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAU;IAE3B;;;OAGG;gBACS,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B;IAO3E,sFAAsF;IACtF,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,gFAAgF;IAChF,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,0DAA0D;IAC1D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,kEAAkE;IAClE,IAAI,EAAE,IAAI,MAAM,CAEf;IAQD;;;;;;;OAOG;IACH,IAAI,IAAI,OAAO;IA2Bf;;;;;OAKG;IACH,KAAK,IAAI,OAAO;IAiBhB;;;;;;;;;OASG;IACH,IAAI,CAAC,OAAO,GAAE,MAAiC,GAAG,MAAM;IAgBxD;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAsB3B;;;;;;;;OAQG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1E;;;;;;OAMG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlD;;;;;;OAMG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrD;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAa/C;;OAEG;IACH,OAAO,CAAC,WAAW;CASpB"}
1
+ {"version":3,"file":"TunTap.d.ts","sourceRoot":"","sources":["../../src/TunTap.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,oBAAoB,EAAiB,MAAM,qBAAqB,CAAC;AAwC9E;;;;GAIG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAU;IAE3B;;;OAGG;gBACS,IAAI,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B;IAO3E,sFAAsF;IACtF,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,gFAAgF;IAChF,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,0DAA0D;IAC1D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,kEAAkE;IAClE,IAAI,EAAE,IAAI,MAAM,CAEf;IAQD;;;;;;;OAOG;IACH,IAAI,IAAI,OAAO;IAuBf;;;;;OAKG;IACH,KAAK,IAAI,OAAO;IAiBhB;;;;;;;;;OASG;IACH,IAAI,CAAC,OAAO,GAAE,MAAiC,GAAG,MAAM;IAgBxD;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAsB3B;;;;;;;;OAQG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1E;;;;;;OAMG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlD;;;;;;OAMG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrD;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAa/C;;OAEG;IACH,OAAO,CAAC,WAAW;CASpB"}
@@ -78,20 +78,18 @@ export class TunTap {
78
78
  }
79
79
  if (!this._isOpen) {
80
80
  try {
81
- this._isOpen = this.device.open();
82
- if (!this._isOpen) {
83
- throw new TunTapDeviceError('Failed to open TUN device');
84
- }
81
+ // Native open() throws on failure; it never returns false.
82
+ this.device.open();
85
83
  }
86
84
  catch (err) {
87
85
  const message = err.message ?? '';
88
- if (message.includes('Permission denied') ||
89
- message.includes('Operation not permitted') ||
90
- message.includes('sudo')) {
86
+ const code = err.code;
87
+ if (code === 'EACCES' || code === 'EPERM') {
91
88
  throw new TunTapPermissionError(message, { cause: err });
92
89
  }
93
90
  throw new TunTapDeviceError(message, { cause: err });
94
91
  }
92
+ this._isOpen = true;
95
93
  openDevices.add(this);
96
94
  }
97
95
  return this._isOpen;
@@ -1 +1 @@
1
- {"version":3,"file":"TunTap.js","sourceRoot":"","sources":["../../src/TunTap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TunTap.js","sourceRoot":"","sources":["../../src/TunTap.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-ios-tuntap",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
4
4
  "description": "Native TUN/TAP interface module for Node.js",
5
5
  "bugs": {
6
6
  "url": "https://github.com/appium/appium-ios/issues"
@@ -61,5 +61,5 @@
61
61
  "npm": ">=10"
62
62
  },
63
63
  "gypfile": true,
64
- "gitHead": "859be1d7288d86b5b276e621c10dc43ac34b65c0"
64
+ "gitHead": "bd9ba5fd86b87035b15023ae46d3bcec928266b5"
65
65
  }
@@ -108,21 +108,17 @@ export class TunTap {
108
108
 
109
109
  if (!this._isOpen) {
110
110
  try {
111
- this._isOpen = this.device.open();
112
- if (!this._isOpen) {
113
- throw new TunTapDeviceError('Failed to open TUN device');
114
- }
111
+ // Native open() throws on failure; it never returns false.
112
+ this.device.open();
115
113
  } catch (err: unknown) {
116
114
  const message = (err as Error).message ?? '';
117
- if (
118
- message.includes('Permission denied') ||
119
- message.includes('Operation not permitted') ||
120
- message.includes('sudo')
121
- ) {
115
+ const code = (err as NodeJS.ErrnoException).code;
116
+ if (code === 'EACCES' || code === 'EPERM') {
122
117
  throw new TunTapPermissionError(message, {cause: err});
123
118
  }
124
119
  throw new TunTapDeviceError(message, {cause: err});
125
120
  }
121
+ this._isOpen = true;
126
122
  openDevices.add(this);
127
123
  }
128
124
  return this._isOpen;
@@ -25,6 +25,13 @@ enum class ReadPacketStatus : std::uint8_t {
25
25
  Error,
26
26
  };
27
27
 
28
+ // Failure reported by `TunPlatformBackend::OpenDevice`.
29
+ struct TunError {
30
+ std::string message;
31
+ // POSIX errno behind the failure (Windows maps the Win32 error), or 0 when there is no OS cause.
32
+ int sys_errno = 0;
33
+ };
34
+
28
35
  /**
29
36
  * Backend abstraction that hides OS-specific TUN device handling from the
30
37
  * N-API surface. Each backend owns its native handle (POSIX file descriptor
@@ -34,7 +41,7 @@ class TunPlatformBackend {
34
41
  public:
35
42
  virtual ~TunPlatformBackend() = default;
36
43
 
37
- virtual bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, std::string& error) = 0;
44
+ virtual bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, TunError& error) = 0;
38
45
  virtual void CloseDevice() = 0;
39
46
  [[nodiscard]] virtual bool IsOpen() const = 0;
40
47
 
@@ -30,17 +30,19 @@ class DarwinTunBackend : public PosixTunBackend {
30
30
  public:
31
31
  static constexpr size_t kUtunHeaderSize = 4;
32
32
 
33
- bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, std::string& error) override {
33
+ bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, TunError& error) override {
34
34
  struct ctl_info ctl_info {};
35
35
  struct sockaddr_ctl socket_addr {};
36
36
 
37
37
  FileDescriptor temp_fd(socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL));
38
38
  if (!temp_fd.is_valid()) {
39
- error = std::string("Failed to create control socket: ") + strerror(errno);
39
+ error.sys_errno = errno;
40
+ error.message = std::string("Failed to create control socket: ") + strerror(error.sys_errno);
40
41
  return false;
41
42
  }
42
43
  if (fcntl(temp_fd.get(), F_SETFD, FD_CLOEXEC) < 0) {
43
- error = std::string("Failed to set close-on-exec on control socket: ") + strerror(errno);
44
+ error.sys_errno = errno;
45
+ error.message = std::string("Failed to set close-on-exec on control socket: ") + strerror(error.sys_errno);
44
46
  return false;
45
47
  }
46
48
 
@@ -49,7 +51,8 @@ class DarwinTunBackend : public PosixTunBackend {
49
51
  ctl_info.ctl_name[sizeof(ctl_info.ctl_name) - 1] = '\0';
50
52
 
51
53
  if (ioctl(temp_fd.get(), CTLIOCGINFO, &ctl_info) < 0) {
52
- error = std::string("Failed to get utun control info: ") + strerror(errno);
54
+ error.sys_errno = errno;
55
+ error.message = std::string("Failed to get utun control info: ") + strerror(error.sys_errno);
53
56
  return false;
54
57
  }
55
58
 
@@ -63,7 +66,8 @@ class DarwinTunBackend : public PosixTunBackend {
63
66
  if (utun_unit > 0) {
64
67
  socket_addr.sc_unit = utun_unit;
65
68
  if (connect(temp_fd.get(), reinterpret_cast<struct sockaddr*>(&socket_addr), sizeof(socket_addr)) < 0) {
66
- error = std::string("Failed to connect to utun with specified unit: ") + strerror(errno);
69
+ error.sys_errno = errno;
70
+ error.message = std::string("Failed to connect to utun with specified unit: ") + strerror(error.sys_errno);
67
71
  return false;
68
72
  }
69
73
  } else if (!ConnectFirstAvailableUnit(temp_fd.get(), socket_addr, error)) {
@@ -73,11 +77,12 @@ class DarwinTunBackend : public PosixTunBackend {
73
77
  std::array<char, 20> interface_name{};
74
78
  socklen_t interface_name_len = interface_name.size();
75
79
  if (getsockopt(temp_fd.get(), SYSPROTO_CONTROL, UTUN_OPT_IFNAME, interface_name.data(), &interface_name_len) < 0) {
76
- error = std::string("Failed to get utun interface name: ") + strerror(errno);
80
+ error.sys_errno = errno;
81
+ error.message = std::string("Failed to get utun interface name: ") + strerror(error.sys_errno);
77
82
  return false;
78
83
  }
79
84
 
80
- if (!SetNonBlocking(temp_fd.get(), error)) {
85
+ if (!SetNonBlocking(temp_fd.get(), error.message)) {
81
86
  return false;
82
87
  }
83
88
 
@@ -159,18 +164,19 @@ class DarwinTunBackend : public PosixTunBackend {
159
164
  }
160
165
  }
161
166
 
162
- static bool ConnectFirstAvailableUnit(int fd, struct sockaddr_ctl& socket_addr, std::string& error) {
167
+ static bool ConnectFirstAvailableUnit(int fd, struct sockaddr_ctl& socket_addr, TunError& error) {
163
168
  for (socket_addr.sc_unit = 1; socket_addr.sc_unit < 255; socket_addr.sc_unit++) {
164
169
  if (connect(fd, reinterpret_cast<struct sockaddr*>(&socket_addr), sizeof(socket_addr)) == 0) {
165
170
  return true;
166
171
  }
167
172
  if (errno != EBUSY) {
168
- error = std::string("Failed to connect to utun control socket: ") + strerror(errno);
173
+ error.sys_errno = errno;
174
+ error.message = std::string("Failed to connect to utun control socket: ") + strerror(error.sys_errno);
169
175
  return false;
170
176
  }
171
177
  }
172
178
 
173
- error = "Could not find an available utun device";
179
+ error.message = "Could not find an available utun device";
174
180
  return false;
175
181
  }
176
182
 
@@ -24,10 +24,11 @@ constexpr const char* kTunDevicePath = "/dev/net/tun";
24
24
 
25
25
  class LinuxTunBackend : public PosixTunBackend {
26
26
  public:
27
- bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, std::string& error) override {
27
+ bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, TunError& error) override {
28
28
  struct stat statbuf {};
29
29
  if (stat(kTunDevicePath, &statbuf) != 0) {
30
- error =
30
+ error.sys_errno = errno;
31
+ error.message =
31
32
  "TUN/TAP device not available: /dev/net/tun does not exist. "
32
33
  "Please ensure the TUN/TAP kernel module is loaded (modprobe tun).";
33
34
  return false;
@@ -35,9 +36,11 @@ class LinuxTunBackend : public PosixTunBackend {
35
36
 
36
37
  FileDescriptor temp_fd(open(kTunDevicePath, O_RDWR | O_CLOEXEC));
37
38
  if (!temp_fd.is_valid()) {
38
- error = std::string("Failed to open ") + kTunDevicePath + ": " + strerror(errno) +
39
- ". This usually means you don't have sufficient permissions. "
40
- "Try running with sudo or add your user to the 'tun' group.";
39
+ error.sys_errno = errno;
40
+ error.message = std::string("Failed to open ") + kTunDevicePath + ": " + strerror(error.sys_errno);
41
+ if (error.sys_errno == EACCES || error.sys_errno == EPERM) {
42
+ error.message += ". Try running with sudo or add your user to the 'tun' group.";
43
+ }
41
44
  return false;
42
45
  }
43
46
 
@@ -51,11 +54,12 @@ class LinuxTunBackend : public PosixTunBackend {
51
54
  }
52
55
 
53
56
  if (ioctl(temp_fd.get(), TUNSETIFF, &ifr) < 0) {
54
- error = std::string("Failed to configure TUN device: ") + strerror(errno);
57
+ error.sys_errno = errno;
58
+ error.message = std::string("Failed to configure TUN device: ") + strerror(error.sys_errno);
55
59
  return false;
56
60
  }
57
61
 
58
- if (!SetNonBlocking(temp_fd.get(), error)) {
62
+ if (!SetNonBlocking(temp_fd.get(), error.message)) {
59
63
  return false;
60
64
  }
61
65
 
@@ -5,6 +5,7 @@
5
5
  #include <windows.h>
6
6
 
7
7
  #include <atomic>
8
+ #include <cerrno>
8
9
  #include <chrono>
9
10
  #include <cstdint>
10
11
  #include <cstring>
@@ -41,23 +42,22 @@ class WindowsTunBackend : public TunPlatformBackend {
41
42
  WindowsTunBackend(WindowsTunBackend&&) = delete;
42
43
  WindowsTunBackend& operator=(WindowsTunBackend&&) = delete;
43
44
 
44
- bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, std::string& error) override {
45
+ bool OpenDevice(const std::string& requested_name, std::string& out_interface_name, TunError& error) override {
45
46
  auto& api = WintunApi::Instance();
46
- if (!api.Load(error)) {
47
+ if (!api.Load(error.message)) {
47
48
  return false;
48
49
  }
49
50
 
50
51
  std::wstring adapter_name = requested_name.empty() ? BuildDefaultAdapterName() : Utf8ToUtf16(requested_name);
51
52
  if (adapter_name.empty()) {
52
- error = "Failed to encode adapter name as UTF-16";
53
+ error.message = "Failed to encode adapter name as UTF-16";
53
54
  return false;
54
55
  }
55
56
 
56
57
  // Creating or opening a WinTun adapter requires the process to run with
57
58
  // administrator privileges (elevated). Without elevation `CreateAdapter`
58
- // fails with ERROR_ACCESS_DENIED, which `FormatLastError` surfaces in the
59
- // error string below. This mirrors the root (EUID 0) requirement of the
60
- // POSIX backends.
59
+ // fails with ERROR_ACCESS_DENIED, which is reported as EPERM below. This
60
+ // mirrors the root (EUID 0) requirement of the POSIX backends.
61
61
  //
62
62
  // Prefer creating a fresh adapter: `WintunCloseAdapter` removes only
63
63
  // adapters this process created. One obtained through the `OpenAdapter`
@@ -68,22 +68,25 @@ class WindowsTunBackend : public TunPlatformBackend {
68
68
  adapter_ = api.OpenAdapter(adapter_name.c_str());
69
69
  if (adapter_ == nullptr) {
70
70
  DWORD opened_err = ::GetLastError();
71
- error = "Failed to create or open WinTun adapter: create failed with " + FormatLastError(created_err) +
72
- "; open failed with " + FormatLastError(opened_err);
71
+ if (created_err == ERROR_ACCESS_DENIED || opened_err == ERROR_ACCESS_DENIED) {
72
+ error.sys_errno = EPERM;
73
+ }
74
+ error.message = "Failed to create or open WinTun adapter: create failed with " + FormatLastError(created_err) +
75
+ "; open failed with " + FormatLastError(opened_err);
73
76
  return false;
74
77
  }
75
78
  }
76
79
 
77
80
  session_ = api.StartSession(adapter_, kSessionCapacity);
78
81
  if (session_ == nullptr) {
79
- error = "Failed to start WinTun session: " + FormatLastError(::GetLastError());
82
+ error.message = "Failed to start WinTun session: " + FormatLastError(::GetLastError());
80
83
  CloseAdapterInternal();
81
84
  return false;
82
85
  }
83
86
 
84
87
  read_event_ = api.GetReadWaitEvent(session_);
85
88
  if (read_event_ == nullptr) {
86
- error = "Failed to acquire WinTun read-wait event: " + FormatLastError(::GetLastError());
89
+ error.message = "Failed to acquire WinTun read-wait event: " + FormatLastError(::GetLastError());
87
90
  EndSessionInternal();
88
91
  CloseAdapterInternal();
89
92
  return false;
@@ -91,7 +94,7 @@ class WindowsTunBackend : public TunPlatformBackend {
91
94
 
92
95
  interface_name_ = Utf16ToUtf8(adapter_name);
93
96
  if (interface_name_.empty()) {
94
- error = "Failed to encode adapter name as UTF-8";
97
+ error.message = "Failed to encode adapter name as UTF-8";
95
98
  EndSessionInternal();
96
99
  CloseAdapterInternal();
97
100
  return false;
@@ -1,5 +1,6 @@
1
1
  #include <napi.h>
2
2
 
3
+ #include <cerrno>
3
4
  #include <memory>
4
5
  #include <mutex>
5
6
  #include <string>
@@ -10,6 +11,36 @@
10
11
 
11
12
  namespace {
12
13
 
14
+ // Node.js-style `err.code` for the errno behind a backend failure, or nullptr when unmapped.
15
+ const char* ErrnoCode(int sys_errno) {
16
+ switch (sys_errno) {
17
+ case EACCES:
18
+ return "EACCES";
19
+ case EBUSY:
20
+ return "EBUSY";
21
+ case EINVAL:
22
+ return "EINVAL";
23
+ case EMFILE:
24
+ return "EMFILE";
25
+ case ENFILE:
26
+ return "ENFILE";
27
+ case ENOBUFS:
28
+ return "ENOBUFS";
29
+ case ENODEV:
30
+ return "ENODEV";
31
+ case ENOENT:
32
+ return "ENOENT";
33
+ case ENOMEM:
34
+ return "ENOMEM";
35
+ case ENXIO:
36
+ return "ENXIO";
37
+ case EPERM:
38
+ return "EPERM";
39
+ default:
40
+ return nullptr;
41
+ }
42
+ }
43
+
13
44
  class TunDevice : public Napi::ObjectWrap<TunDevice> {
14
45
  public:
15
46
  static Napi::Object Init(Napi::Env env, Napi::Object exports);
@@ -86,10 +117,14 @@ Napi::Value TunDevice::Open(const Napi::CallbackInfo& info) {
86
117
  return Napi::Boolean::New(env, false);
87
118
  }
88
119
 
89
- std::string error;
120
+ TunError error;
90
121
  std::string assigned_name;
91
122
  if (!backend_->OpenDevice(requested_name_, assigned_name, error)) {
92
- Napi::Error::New(env, error).ThrowAsJavaScriptException();
123
+ Napi::Error js_error = Napi::Error::New(env, error.message);
124
+ if (const char* code = ErrnoCode(error.sys_errno); code != nullptr) {
125
+ js_error.Set("code", Napi::String::New(env, code));
126
+ }
127
+ js_error.ThrowAsJavaScriptException();
93
128
  return Napi::Boolean::New(env, false);
94
129
  }
95
130
 
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [17.5.7](https://github.com/appium/appium-ios/compare/appium-remote-debugger@17.5.6...appium-remote-debugger@17.5.7) (2026-10-03)
7
+
8
+ **Note:** Version bump only for package appium-remote-debugger
9
+
10
+
11
+
12
+
13
+
6
14
  ## [17.5.6](https://github.com/appium/appium-ios/compare/appium-remote-debugger@17.5.5...appium-remote-debugger@17.5.6) (2026-10-03)
7
15
 
8
16
  **Note:** Version bump only for package appium-remote-debugger
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-remote-debugger",
3
- "version": "17.5.6",
3
+ "version": "17.5.7",
4
4
  "description": "Appium proxy for Remote Debugger protocol",
5
5
  "keywords": [
6
6
  "appium"
@@ -86,11 +86,11 @@
86
86
  "sinon": "^22.0.0"
87
87
  },
88
88
  "optionalDependencies": {
89
- "appium-ios-remotexpc": "^5.24.4"
89
+ "appium-ios-remotexpc": "^5.24.5"
90
90
  },
91
91
  "engines": {
92
92
  "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
93
93
  "npm": ">=10"
94
94
  },
95
- "gitHead": "ae92cce2dddf179de80385f2f60de0068ad43a1a"
95
+ "gitHead": "bd9ba5fd86b87035b15023ae46d3bcec928266b5"
96
96
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-xcuitest-driver",
3
- "version": "12.14.1",
3
+ "version": "12.15.0",
4
4
  "description": "Appium driver for iOS using XCUITest for backend",
5
5
  "keywords": [
6
6
  "appium",
@@ -47,7 +47,7 @@
47
47
  "@colors/colors": "1.6.1",
48
48
  "appium-ios-device": "3.1.24",
49
49
  "appium-ios-simulator": "10.7.0",
50
- "appium-remote-debugger": "17.5.6",
50
+ "appium-remote-debugger": "17.5.7",
51
51
  "appium-webdriveragent": "16.13.6",
52
52
  "appium-xcode": "7.2.3",
53
53
  "async-lock": "1.4.1",
@@ -68,7 +68,7 @@
68
68
  "appium": "^3.0.0-rc.2"
69
69
  },
70
70
  "optionalDependencies": {
71
- "appium-ios-remotexpc": "5.24.4",
71
+ "appium-ios-remotexpc": "5.24.5",
72
72
  "sharp": "0.35.5"
73
73
  },
74
74
  "engines": {