appium-ios-remotexpc 5.16.1 → 5.16.2

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [5.16.2](https://github.com/appium/appium-ios-remotexpc/compare/v5.16.1...v5.16.2) (2026-08-27)
2
+
3
+ ### Bug Fixes
4
+
5
+ * **port-forwarding:** destroy upstream socket when client disconnects during connect ([#305](https://github.com/appium/appium-ios-remotexpc/issues/305)) ([957181d](https://github.com/appium/appium-ios-remotexpc/commit/957181d05a8ae4fdcfed7c0ddf73446408c5f444))
6
+
1
7
  ## [5.16.1](https://github.com/appium/appium-ios-remotexpc/compare/v5.16.0...v5.16.1) (2026-08-27)
2
8
 
3
9
  ### Bug Fixes
@@ -25,6 +25,15 @@ export declare class DevicePortForwarder extends EventEmitter {
25
25
  once<K extends keyof DevicePortForwarderEvents>(eventName: K, listener: DevicePortForwarderEvents[K]): this;
26
26
  off<K extends keyof DevicePortForwarderEvents>(eventName: K, listener: DevicePortForwarderEvents[K]): this;
27
27
  private handleDownstreamConnection;
28
+ /**
29
+ * Opens the upstream socket while watching for the client going away.
30
+ * Returns undefined after cleanup if the connect fails or the client disconnected meanwhile.
31
+ */
32
+ private openUpstreamForClient;
33
+ /**
34
+ * Pipes the two sockets together and tears both down when either side closes or errors.
35
+ */
36
+ private bridgeSockets;
28
37
  private openUpstreamSocket;
29
38
  }
30
39
  //# sourceMappingURL=device-port-forwarder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"device-port-forwarder.d.ts","sourceRoot":"","sources":["../../../../src/lib/port-forwarding/device-port-forwarder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAIzC,OAAO,KAAK,EAAC,yBAAyB,EAAE,0BAA0B,EAA0B,MAAM,YAAY,CAAC;AAE/G;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAA0B;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEvC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B;IAStF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBlB,EAAE,CAAC,CAAC,SAAS,MAAM,yBAAyB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIzG,IAAI,CAAC,CAAC,SAAS,MAAM,yBAAyB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3G,GAAG,CAAC,CAAC,SAAS,MAAM,yBAAyB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI;YAIrG,0BAA0B;YAyD1B,kBAAkB;CAUjC"}
1
+ {"version":3,"file":"device-port-forwarder.d.ts","sourceRoot":"","sources":["../../../../src/lib/port-forwarding/device-port-forwarder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAIzC,OAAO,KAAK,EAAC,yBAAyB,EAAE,0BAA0B,EAA0B,MAAM,YAAY,CAAC;AAE/G;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAA0B;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEvC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B;IAStF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBlB,EAAE,CAAC,CAAC,SAAS,MAAM,yBAAyB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIzG,IAAI,CAAC,CAAC,SAAS,MAAM,yBAAyB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3G,GAAG,CAAC,CAAC,SAAS,MAAM,yBAAyB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI;YAIrG,0BAA0B;IAcxC;;;OAGG;YACW,qBAAqB;IAqCnC;;OAEG;IACH,OAAO,CAAC,aAAa;YAwCP,kBAAkB;CAUjC"}
@@ -67,6 +67,29 @@ export class DevicePortForwarder extends EventEmitter {
67
67
  async handleDownstreamConnection(localSocket) {
68
68
  this.activeSockets.add(localSocket);
69
69
  this.emit('clientConnected', localSocket);
70
+ const upstreamSocket = await this.openUpstreamForClient(localSocket);
71
+ if (!upstreamSocket) {
72
+ return;
73
+ }
74
+ this.activeSockets.add(upstreamSocket);
75
+ this.emit('upstreamConnected', upstreamSocket);
76
+ this.bridgeSockets(localSocket, upstreamSocket);
77
+ }
78
+ /**
79
+ * Opens the upstream socket while watching for the client going away.
80
+ * Returns undefined after cleanup if the connect fails or the client disconnected meanwhile.
81
+ */
82
+ async openUpstreamForClient(localSocket) {
83
+ let clientError;
84
+ let clientClosed = false;
85
+ const onEarlyError = (err) => {
86
+ clientError = err;
87
+ };
88
+ const onEarlyClose = () => {
89
+ clientClosed = true;
90
+ };
91
+ localSocket.once('error', onEarlyError);
92
+ localSocket.once('close', onEarlyClose);
70
93
  let upstreamSocket;
71
94
  try {
72
95
  upstreamSocket = await this.openUpstreamSocket();
@@ -76,10 +99,25 @@ export class DevicePortForwarder extends EventEmitter {
76
99
  this.emit('upstreamConnectError', err);
77
100
  this.emit('clientDisconnected', localSocket, err);
78
101
  localSocket.destroy();
79
- return;
102
+ return undefined;
80
103
  }
81
- this.activeSockets.add(upstreamSocket);
82
- this.emit('upstreamConnected', upstreamSocket);
104
+ finally {
105
+ localSocket.off('error', onEarlyError);
106
+ localSocket.off('close', onEarlyClose);
107
+ }
108
+ if (clientClosed || localSocket.destroyed || clientError !== undefined) {
109
+ this.activeSockets.delete(localSocket);
110
+ this.emit('clientDisconnected', localSocket, clientError);
111
+ localSocket.destroy();
112
+ upstreamSocket.destroy();
113
+ return undefined;
114
+ }
115
+ return upstreamSocket;
116
+ }
117
+ /**
118
+ * Pipes the two sockets together and tears both down when either side closes or errors.
119
+ */
120
+ bridgeSockets(localSocket, upstreamSocket) {
83
121
  let cleanedUp = false;
84
122
  const teardown = () => {
85
123
  this.activeSockets.delete(localSocket);
@@ -1 +1 @@
1
- {"version":3,"file":"device-port-forwarder.js","sourceRoot":"","sources":["../../../../src/lib/port-forwarding/device-port-forwarder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"device-port-forwarder.js","sourceRoot":"","sources":["../../../../src/lib/port-forwarding/device-port-forwarder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-ios-remotexpc",
3
- "version": "5.16.1",
3
+ "version": "5.16.2",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "bugs": {
@@ -83,7 +83,33 @@ export class DevicePortForwarder extends EventEmitter {
83
83
  this.activeSockets.add(localSocket);
84
84
  this.emit('clientConnected', localSocket);
85
85
 
86
- let upstreamSocket: Socket | undefined;
86
+ const upstreamSocket = await this.openUpstreamForClient(localSocket);
87
+ if (!upstreamSocket) {
88
+ return;
89
+ }
90
+
91
+ this.activeSockets.add(upstreamSocket);
92
+ this.emit('upstreamConnected', upstreamSocket);
93
+ this.bridgeSockets(localSocket, upstreamSocket);
94
+ }
95
+
96
+ /**
97
+ * Opens the upstream socket while watching for the client going away.
98
+ * Returns undefined after cleanup if the connect fails or the client disconnected meanwhile.
99
+ */
100
+ private async openUpstreamForClient(localSocket: Socket): Promise<Socket | undefined> {
101
+ let clientError: Error | undefined;
102
+ let clientClosed = false;
103
+ const onEarlyError = (err: Error): void => {
104
+ clientError = err;
105
+ };
106
+ const onEarlyClose = (): void => {
107
+ clientClosed = true;
108
+ };
109
+ localSocket.once('error', onEarlyError);
110
+ localSocket.once('close', onEarlyClose);
111
+
112
+ let upstreamSocket: Socket;
87
113
  try {
88
114
  upstreamSocket = await this.openUpstreamSocket();
89
115
  } catch (err) {
@@ -91,12 +117,27 @@ export class DevicePortForwarder extends EventEmitter {
91
117
  this.emit('upstreamConnectError', err);
92
118
  this.emit('clientDisconnected', localSocket, err);
93
119
  localSocket.destroy();
94
- return;
120
+ return undefined;
121
+ } finally {
122
+ localSocket.off('error', onEarlyError);
123
+ localSocket.off('close', onEarlyClose);
95
124
  }
96
125
 
97
- this.activeSockets.add(upstreamSocket);
98
- this.emit('upstreamConnected', upstreamSocket);
126
+ if (clientClosed || localSocket.destroyed || clientError !== undefined) {
127
+ this.activeSockets.delete(localSocket);
128
+ this.emit('clientDisconnected', localSocket, clientError);
129
+ localSocket.destroy();
130
+ upstreamSocket.destroy();
131
+ return undefined;
132
+ }
133
+
134
+ return upstreamSocket;
135
+ }
99
136
 
137
+ /**
138
+ * Pipes the two sockets together and tears both down when either side closes or errors.
139
+ */
140
+ private bridgeSockets(localSocket: Socket, upstreamSocket: Socket): void {
100
141
  let cleanedUp = false;
101
142
  const teardown = (): void => {
102
143
  this.activeSockets.delete(localSocket);