Skip to content

Commit 4d3d1b8

Browse files
committed
Handle permessage-deflate on sockets
With this the extension host is working again.
1 parent 150138e commit 4d3d1b8

File tree

7 files changed

+30
-10
lines changed

7 files changed

+30
-10
lines changed

lib/vscode/src/vs/server/entry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ process.on('message', async (message: CodeServerMessage, socket) => {
6868
}
6969
break;
7070
case 'socket':
71-
vscode.handleWebSocket(socket, message.query);
71+
vscode.handleWebSocket(socket, message.query, message.permessageDeflate);
7272
break;
7373
}
7474
});

lib/vscode/src/vs/server/ipc.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type Query = { [key: string]: string | string[] | undefined | Query | Que
1919
export interface SocketMessage {
2020
type: 'socket';
2121
query: Query;
22+
permessageDeflate: boolean;
2223
}
2324

2425
export interface CliMessage {

lib/vscode/src/vs/server/node/connection.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { VSBuffer } from 'vs/base/common/buffer';
44
import { Emitter } from 'vs/base/common/event';
55
import { FileAccess } from 'vs/base/common/network';
66
import { ISocket } from 'vs/base/parts/ipc/common/ipc.net';
7-
import { NodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
7+
import { WebSocketNodeSocket } from 'vs/base/parts/ipc/node/ipc.net';
88
import { INativeEnvironmentService } from 'vs/platform/environment/common/environment';
99
import { getNlsConfiguration } from 'vs/server/node/nls';
1010
import { Protocol } from 'vs/server/node/protocol';
@@ -88,7 +88,7 @@ export class ExtensionHostConnection extends Connection {
8888
private readonly logger: Logger;
8989

9090
public constructor(
91-
locale:string, protocol: Protocol, buffer: VSBuffer, token: string,
91+
locale: string, protocol: Protocol, buffer: VSBuffer, token: string,
9292
private readonly environment: INativeEnvironmentService,
9393
) {
9494
super(protocol, token);
@@ -115,11 +115,18 @@ export class ExtensionHostConnection extends Connection {
115115
private sendInitMessage(buffer: VSBuffer): void {
116116
const socket = this.protocol.getUnderlyingSocket();
117117
socket.pause();
118+
119+
const wrapperSocket = this.protocol.getSocket();
120+
118121
this.logger.trace('Sending socket');
119122
this.process!.send({ // Process must be set at this point.
120123
type: 'VSCODE_EXTHOST_IPC_SOCKET',
121-
initialDataChunk: (buffer.buffer as Buffer).toString('base64'),
122-
skipWebSocketFrames: this.protocol.getSocket() instanceof NodeSocket,
124+
initialDataChunk: Buffer.from(buffer.buffer).toString('base64'),
125+
skipWebSocketFrames: !(wrapperSocket instanceof WebSocketNodeSocket),
126+
permessageDeflate: this.protocol.options.permessageDeflate,
127+
inflateBytes: wrapperSocket instanceof WebSocketNodeSocket
128+
? Buffer.from(wrapperSocket.recordedInflateBytes.buffer).toString('base64')
129+
: undefined,
123130
}, socket);
124131
}
125132

lib/vscode/src/vs/server/node/protocol.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,22 @@ export interface SocketOptions {
1010
readonly reconnectionToken: string;
1111
readonly reconnection: boolean;
1212
readonly skipWebSocketFrames: boolean;
13+
readonly permessageDeflate?: boolean;
14+
readonly inflateBytes?: VSBuffer;
15+
readonly recordInflateBytes?: boolean;
1316
}
1417

1518
export class Protocol extends PersistentProtocol {
1619
public constructor(socket: net.Socket, public readonly options: SocketOptions) {
1720
super(
1821
options.skipWebSocketFrames
1922
? new NodeSocket(socket)
20-
: new WebSocketNodeSocket(new NodeSocket(socket), false, null, false),
23+
: new WebSocketNodeSocket(
24+
new NodeSocket(socket),
25+
options.permessageDeflate || false,
26+
options.inflateBytes || null,
27+
options.recordInflateBytes || false,
28+
),
2129
);
2230
}
2331

lib/vscode/src/vs/server/node/server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,15 @@ export class Vscode {
120120
};
121121
}
122122

123-
public async handleWebSocket(socket: net.Socket, query: Query): Promise<true> {
123+
public async handleWebSocket(socket: net.Socket, query: Query, _permessageDeflate: boolean): Promise<true> {
124124
if (!query.reconnectionToken) {
125125
throw new Error('Reconnection token is missing from query parameters');
126126
}
127127
const protocol = new Protocol(socket, {
128128
reconnectionToken: <string>query.reconnectionToken,
129129
reconnection: query.reconnection === 'true',
130130
skipWebSocketFrames: query.skipWebSocketFrames === 'true',
131+
// TODO: permessageDeflate,
131132
});
132133
try {
133134
await this.connect(await protocol.handshake(), protocol);

src/node/routes/vscode.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,5 +207,8 @@ wsRouter.ws("/", ensureAuthenticated, async (req) => {
207207
`Sec-WebSocket-Accept: ${reply}`,
208208
].join("\r\n") + "\r\n\r\n",
209209
)
210-
await vscode.sendWebsocket(req.ws, req.query)
210+
// TODO: Parse this header properly. Currently unused so haven't bothered.
211+
const extensions = req.headers["sec-websocket-extensions"]
212+
const permessageDeflate = extensions ? extensions.includes("permessage-deflate") : false
213+
await vscode.sendWebsocket(req.ws, req.query, permessageDeflate)
211214
})

src/node/vscode.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ export class VscodeProvider {
120120
/**
121121
* VS Code expects a raw socket. It will handle all the web socket frames.
122122
*/
123-
public async sendWebsocket(socket: net.Socket, query: ipc.Query): Promise<void> {
123+
public async sendWebsocket(socket: net.Socket, query: ipc.Query, permessageDeflate: boolean): Promise<void> {
124124
const vscode = await this._vscode
125125
// TLS sockets cannot be transferred to child processes so we need an
126126
// in-between. Non-TLS sockets will be returned as-is.
127127
const socketProxy = await this.socketProvider.createProxy(socket)
128-
this.send({ type: "socket", query }, vscode, socketProxy)
128+
this.send({ type: "socket", query, permessageDeflate }, vscode, socketProxy)
129129
}
130130

131131
private send(message: ipc.CodeServerMessage, vscode?: cp.ChildProcess, socket?: net.Socket): void {

0 commit comments

Comments
 (0)