code-server/packages/tunnel/src/client.ts
Kyle Carberry 85d2225e0c Featureful (#31)
* Fix loading within the CLI

* Remove app

* Remove promise handle

* Add initial travis file

* Add libxkbfile dependency

* Add libxkbfile-dev

* Add build script

* Fix malformed bash statement

* Remove yarn from script

* Improve build script

* Extract upx before usage

* Only run upx if on linux

* Ensure resource directory exists

* Pack runnable binary

* Export binary with platform

* Improve build process

* Install upx before running install script

* Update typescript version before running nexe

* Add os.release() function for multi-platform support

* Update travis.yml to improve deployment

* Add on CI

* Update to v1.31.0

* Add libsecret

* Update build target

* Skip cleanup

* Fix built-in extensions

* Add basics for apps

* Create custom DNS server

* Fix forking within CLI. Fixes TS language features

* Fix filename resolve

* Fix default extensions path

* Add custom dialog

* Store workspace path

* Remove outfiles

* Cleanup

* Always authed outside of CLI

* Use location.host for client

* Remove useless app interface

* Remove debug file for building wordlist

* Use chromes tcp host

* Update patch

* Build browser app before packaging

* Replace all css containing file:// URLs, fix webviews

* Fix save

* Fix mkdir
2019-02-21 11:55:42 -06:00

49 lines
1.3 KiB
TypeScript

import { Event, Emitter } from "@coder/events";
import { TunnelCloseCode } from "./common";
export interface TunnelCloseEvent {
readonly code: TunnelCloseCode;
readonly reason: string;
}
export interface ClientConnection {
readonly onData: Event<ArrayBuffer>;
readonly onClose: Event<TunnelCloseEvent>;
send(data: ArrayBuffer): void;
}
export const forward = (connectionUrl: string): Promise<ClientConnection> => {
return new Promise((resolve, reject): void => {
const socket = new WebSocket(connectionUrl);
const closeEmitter = new Emitter<TunnelCloseEvent>();
const dataEmitter = new Emitter<ArrayBuffer>();
const connection: ClientConnection = {
get onClose(): Event<TunnelCloseEvent> {
return closeEmitter.event;
},
get onData(): Event<ArrayBuffer> {
return dataEmitter.event;
},
send(data: ArrayBuffer): void {
socket.send(data);
},
};
socket.binaryType = "arraybuffer";
socket.addEventListener("message", (event) => {
dataEmitter.emit(event.data);
});
socket.addEventListener("error", (event) => {
reject("uncertain");
});
socket.addEventListener("open", () => {
resolve(connection);
});
socket.addEventListener("close", (event) => {
closeEmitter.emit({
code: event.code,
reason: event.reason,
});
});
});
};