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 +6 -0
- package/build/src/lib/port-forwarding/device-port-forwarder.d.ts +9 -0
- package/build/src/lib/port-forwarding/device-port-forwarder.d.ts.map +1 -1
- package/build/src/lib/port-forwarding/device-port-forwarder.js +41 -3
- package/build/src/lib/port-forwarding/device-port-forwarder.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/port-forwarding/device-port-forwarder.ts +45 -4
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;
|
|
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
|
-
|
|
82
|
-
|
|
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":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAC,YAAY,EAAC,MAAM,UAAU,CAAC;AAItC;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IAC3C,MAAM,CAAU;IACP,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,IAAI,CAAS;IACb,gBAAgB,CAA0B;IAC1C,iBAAiB,CAA2B;IAC5C,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnD,YAAY,SAAiB,EAAE,UAAkB,EAAE,OAAmC;QACpF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QACxC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,WAAmB,EAAE,EAAE;YACjD,KAAK,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,aAAa,CAAC,KAAK,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAEQ,EAAE,CAA4C,SAAY,EAAE,QAAsC;QACzG,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,QAAwC,CAAS,CAAC;IAC/E,CAAC;IAEQ,IAAI,CAA4C,SAAY,EAAE,QAAsC;QAC3G,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAwC,CAAS,CAAC;IACjF,CAAC;IAEQ,GAAG,CAA4C,SAAY,EAAE,QAAsC;QAC1G,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,QAAwC,CAAS,CAAC;IAChF,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,WAAmB;QAC1D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAE1C,IAAI,
|
|
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
|
@@ -83,7 +83,33 @@ export class DevicePortForwarder extends EventEmitter {
|
|
|
83
83
|
this.activeSockets.add(localSocket);
|
|
84
84
|
this.emit('clientConnected', localSocket);
|
|
85
85
|
|
|
86
|
-
|
|
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
|
-
|
|
98
|
-
|
|
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);
|