Skip to content

Commit 5509a96

Browse files
committed
Add BrowserWebSocketFactory
1 parent 5a97b52 commit 5509a96

2 files changed

Lines changed: 96 additions & 2 deletions

File tree

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { IWebSocketFactory, IConnectCallback } from 'vs/platform/remote/common/remoteAgentConnection';
7+
import { ISocket } from 'vs/base/parts/ipc/common/ipc.net';
8+
import { VSBuffer } from 'vs/base/common/buffer';
9+
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
10+
import { onUnexpectedError } from 'vs/base/common/errors';
11+
12+
class BrowserSocket implements ISocket {
13+
public readonly socket: WebSocket;
14+
15+
constructor(socket: WebSocket) {
16+
this.socket = socket;
17+
}
18+
19+
public dispose(): void {
20+
this.socket.close();
21+
}
22+
23+
public onData(_listener: (e: VSBuffer) => void): IDisposable {
24+
const fileReader = new FileReader();
25+
const queue: Blob[] = [];
26+
let isReading = false;
27+
fileReader.onload = function (event) {
28+
isReading = false;
29+
const buff = <ArrayBuffer>(<any>event.target).result;
30+
31+
try {
32+
_listener(VSBuffer.wrap(new Uint8Array(buff)));
33+
} catch (err) {
34+
onUnexpectedError(err);
35+
}
36+
37+
if (queue.length > 0) {
38+
enqueue(queue.shift()!);
39+
}
40+
};
41+
const enqueue = (blob: Blob) => {
42+
if (isReading) {
43+
queue.push(blob);
44+
return;
45+
}
46+
isReading = true;
47+
fileReader.readAsArrayBuffer(blob);
48+
};
49+
const listener = (e: MessageEvent) => {
50+
enqueue(<Blob>e.data);
51+
};
52+
this.socket.addEventListener('message', listener);
53+
return {
54+
dispose: () => this.socket.removeEventListener('message', listener)
55+
};
56+
}
57+
58+
public onClose(listener: () => void): IDisposable {
59+
this.socket.addEventListener('close', listener);
60+
return {
61+
dispose: () => this.socket.removeEventListener('close', listener)
62+
};
63+
}
64+
65+
public onEnd(listener: () => void): IDisposable {
66+
return Disposable.None;
67+
}
68+
69+
public write(buffer: VSBuffer): void {
70+
this.socket.send(buffer.buffer);
71+
}
72+
73+
public end(): void {
74+
this.socket.close();
75+
}
76+
77+
}
78+
79+
export const browserWebSocketFactory = new class implements IWebSocketFactory {
80+
connect(host: string, port: number, query: string, callback: IConnectCallback): void {
81+
const errorListener = (err: any) => callback(err, undefined);
82+
const socket = new WebSocket(`ws://${host}:${port}/?${query}&skipWebSocketFrames=false`);
83+
socket.onopen = function (event) {
84+
socket.removeEventListener('error', errorListener);
85+
callback(undefined, new BrowserSocket(socket));
86+
};
87+
socket.addEventListener('error', errorListener);
88+
}
89+
};

src/vs/workbench/services/remote/browser/remoteAgentServiceImpl.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,25 @@
66
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
77
import { IRemoteAgentConnection } from 'vs/workbench/services/remote/common/remoteAgentService';
88
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
9-
import { AbstractRemoteAgentService } from 'vs/workbench/services/remote/common/abstractRemoteAgentService';
9+
import { AbstractRemoteAgentService, RemoteAgentConnection } from 'vs/workbench/services/remote/common/abstractRemoteAgentService';
1010
import { IProductService } from 'vs/platform/product/common/product';
11+
import { browserWebSocketFactory } from 'vs/platform/remote/browser/browserWebSocketFactory';
1112

1213
export class RemoteAgentService extends AbstractRemoteAgentService {
1314

15+
private readonly _connection: IRemoteAgentConnection | null = null;
16+
1417
constructor(
1518
@IEnvironmentService environmentService: IEnvironmentService,
1619
@IProductService productService: IProductService,
1720
@IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService
1821
) {
1922
super(environmentService);
23+
const authority = document.location.host;
24+
this._connection = this._register(new RemoteAgentConnection(authority, productService.commit, browserWebSocketFactory, environmentService, remoteAuthorityResolverService));
2025
}
2126

2227
getConnection(): IRemoteAgentConnection | null {
23-
return null;
28+
return this._connection;
2429
}
2530
}

0 commit comments

Comments
 (0)