in appservice/src/TunnelProxy.ts [38:108]
public connect(): void {
ext.outputChannel.appendLog('[Proxy Server] socket init');
// Pause socket until tunnel connection has been established to make sure we don't lose data
this._socket.pause();
this._socket.on('data', (data: Buffer) => {
if (this._wsConnection) {
this._wsConnection.send(data);
}
});
this._socket.on('close', () => {
ext.outputChannel.appendLog(`[Proxy Server] client disconnected ${this._socket.remoteAddress}:${this._socket.remotePort}`);
this.dispose();
this.emit('close');
});
this._socket.on('error', (err: Error) => {
ext.outputChannel.appendLog(`[Proxy Server] socket error: ${err}`);
this.dispose();
this.emit('error', err);
});
this._wsClient.on('connect', (connection: websocket.connection) => {
ext.outputChannel.appendLog('[WebSocket] client connected');
this._wsConnection = connection;
// Resume socket after connection
this._socket.resume();
connection.on('close', () => {
ext.outputChannel.appendLog('[WebSocket] client closed');
this.dispose();
this.emit('close');
});
connection.on('error', (err: Error) => {
ext.outputChannel.appendLog(`[WebSocket] error: ${err}`);
this.dispose();
this.emit('error', err);
});
connection.on('message', (data: websocket.IMessage) => {
if (data.binaryData) {
this._socket.write(data.binaryData);
}
});
});
this._wsClient.on('connectFailed', (err: Error) => {
ext.outputChannel.appendLog(`[WebSocket] connectFailed: ${err}`);
this.dispose();
this.emit('error', err);
});
this._wsClient.connect(
`wss://${this._site.kuduHostName}/AppServiceTunnel/Tunnel.ashx`,
undefined,
undefined,
{
'User-Agent': 'vscode-azuretools',
'Cache-Control': 'no-cache',
Pragma: 'no-cache'
},
{
auth: `${this._publishCredential.publishingUserName}:${this._publishCredential.publishingPassword}`
}
);
}