From 07f6297977c7f3d41f5d5134d967243aab3bbf20 Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Wed, 9 Sep 2020 21:33:38 +0200 Subject: [PATCH] chore: remove ws connect method (denoland/deno#7403) --- examples/chat/server_test.ts | 24 +++++++----- ws/README.md | 73 ++---------------------------------- ws/example_client.ts | 61 ------------------------------ ws/example_test.ts | 1 - ws/mod.ts | 41 -------------------- ws/test.ts | 12 ------ 6 files changed, 18 insertions(+), 194 deletions(-) delete mode 100644 ws/example_client.ts diff --git a/examples/chat/server_test.ts b/examples/chat/server_test.ts index 8a5bf5471fc8..336b188e9311 100644 --- a/examples/chat/server_test.ts +++ b/examples/chat/server_test.ts @@ -2,7 +2,6 @@ import { assert, assertEquals } from "../../testing/asserts.ts"; import { TextProtoReader } from "../../textproto/mod.ts"; import { BufReader } from "../../io/bufio.ts"; -import { connectWebSocket, WebSocket } from "../../ws/mod.ts"; import { delay } from "../../async/delay.ts"; import { resolve, dirname, fromFileUrl } from "../../path/mod.ts"; @@ -57,18 +56,25 @@ Deno.test({ name: "[examples/chat] GET /ws should upgrade conn to ws", async fn() { const server = await startServer(); - let ws: WebSocket | undefined; + let ws: WebSocket; try { - ws = await connectWebSocket("http://127.0.0.1:8080/ws"); - const it = ws[Symbol.asyncIterator](); - - assertEquals((await it.next()).value, "Connected: [1]"); - ws.send("Hello"); - assertEquals((await it.next()).value, "[1]: Hello"); + ws = new WebSocket("ws://127.0.0.1:8080/ws"); + await new Promise((resolve) => { + ws.onmessage = ((message) => { + assertEquals(message.data, "Connected: [1]"); + ws.onmessage = ((message) => { + assertEquals(message.data, "[1]: Hello"); + ws.close(); + resolve(); + }); + ws.send("Hello"); + }); + }); + } catch (err) { + console.log(err); } finally { server.close(); server.stdout.close(); - ws!.conn.close(); } }, }); diff --git a/ws/README.md b/ws/README.md index bcfa5d189cf4..54efc57cc54a 100644 --- a/ws/README.md +++ b/ws/README.md @@ -1,11 +1,11 @@ # ws -ws module is made to provide helpers to create WebSocket client/server. +ws module is made to provide helpers to create WebSocket server. For client +WebSockets, use the +[WebSocket API](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API). ## Usage -### Server - ```ts // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. import { serve } from "https://deno.land/std/http/server.ts"; @@ -67,67 +67,6 @@ if (import.meta.main) { } ``` -### Client - -```ts -import { - connectWebSocket, - isWebSocketCloseEvent, - isWebSocketPingEvent, - isWebSocketPongEvent, -} from "https://deno.land/std/ws/mod.ts"; -import { encode } from "https://deno.land/std/encoding/utf8.ts"; -import { BufReader } from "https://deno.land/std/io/bufio.ts"; -import { TextProtoReader } from "https://deno.land/std/textproto/mod.ts"; -import { blue, green, red, yellow } from "https://deno.land/std/fmt/colors.ts"; - -const endpoint = Deno.args[0] || "ws://127.0.0.1:8080"; -/** simple websocket cli */ -try { - const sock = await connectWebSocket(endpoint); - console.log(green("ws connected! (type 'close' to quit)")); - - const messages = async (): Promise => { - for await (const msg of sock) { - if (typeof msg === "string") { - console.log(yellow(`< ${msg}`)); - } else if (isWebSocketPingEvent(msg)) { - console.log(blue("< ping")); - } else if (isWebSocketPongEvent(msg)) { - console.log(blue("< pong")); - } else if (isWebSocketCloseEvent(msg)) { - console.log(red(`closed: code=${msg.code}, reason=${msg.reason}`)); - } - } - }; - - const cli = async (): Promise => { - const tpr = new TextProtoReader(new BufReader(Deno.stdin)); - while (true) { - await Deno.stdout.write(encode("> ")); - const line = await tpr.readLine(); - if (line === null || line === "close") { - break; - } else if (line === "ping") { - await sock.ping(); - } else { - await sock.send(line); - } - } - }; - - await Promise.race([messages(), cli()]).catch(console.error); - - if (!sock.isClosed) { - await sock.close(1000).catch(console.error); - } -} catch (err) { - console.error(red(`Could not connect to WebSocket: '${err}'`)); -} - -Deno.exit(0); -``` - ## API ### isWebSocketCloseEvent @@ -173,9 +112,3 @@ Upgrade inputted TCP connection into WebSocket connection. ### createSecKey Returns base64 encoded 16 bytes string for Sec-WebSocket-Key header. - -### connectWebSocket - -Connect to WebSocket endpoint url with inputted endpoint string and headers. - -- note: Endpoint must be acceptable for URL. diff --git a/ws/example_client.ts b/ws/example_client.ts deleted file mode 100644 index 93f2f5c7bd98..000000000000 --- a/ws/example_client.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { - connectWebSocket, - isWebSocketCloseEvent, - isWebSocketPingEvent, - isWebSocketPongEvent, -} from "./mod.ts"; -import { encode } from "../encoding/utf8.ts"; -import { BufReader } from "../io/bufio.ts"; -import { TextProtoReader } from "../textproto/mod.ts"; -import { blue, green, red, yellow } from "../fmt/colors.ts"; - -if (import.meta.main) { - const endpoint = Deno.args[0] || "ws://127.0.0.1:8080"; - /** simple websocket cli */ - try { - const sock = await connectWebSocket(endpoint); - console.log(green("ws connected! (type 'close' to quit)")); - - const messages = async (): Promise => { - for await (const msg of sock) { - if (typeof msg === "string") { - console.log(yellow(`< ${msg}`)); - } else if (isWebSocketPingEvent(msg)) { - console.log(blue("< ping")); - } else if (isWebSocketPongEvent(msg)) { - console.log(blue("< pong")); - } else if (isWebSocketCloseEvent(msg)) { - console.log(red(`closed: code=${msg.code}, reason=${msg.reason}`)); - } - } - }; - - const cli = async (): Promise => { - const tpr = new TextProtoReader(new BufReader(Deno.stdin)); - while (true) { - await Deno.stdout.write(encode("> ")); - const line = await tpr.readLine(); - if (line === null) { - break; - } - if (line === "close") { - break; - } else if (line === "ping") { - await sock.ping(); - } else { - await sock.send(line); - } - } - }; - - await Promise.race([messages(), cli()]).catch(console.error); - - if (!sock.isClosed) { - await sock.close(1000).catch(console.error); - } - } catch (err) { - console.error(red(`Could not connect to WebSocket: '${err}'`)); - } - - Deno.exit(0); -} diff --git a/ws/example_test.ts b/ws/example_test.ts index 7e68dc38b4b8..2fcea5506b93 100644 --- a/ws/example_test.ts +++ b/ws/example_test.ts @@ -1,2 +1 @@ -import "./example_client.ts"; import "./example_server.ts"; diff --git a/ws/mod.ts b/ws/mod.ts index 5f0219cfcc58..ea6e751d7cb2 100644 --- a/ws/mod.ts +++ b/ws/mod.ts @@ -191,11 +191,6 @@ export async function readFrame(buf: BufReader): Promise { }; } -// Create client-to-server mask, random 32bit number -function createMask(): Uint8Array { - return crypto.getRandomValues(new Uint8Array(4)); -} - class WebSocketImpl implements WebSocket { readonly conn: Deno.Conn; private readonly mask?: Uint8Array; @@ -514,42 +509,6 @@ export async function handshake( } } -/** - * Connect to given websocket endpoint url. - * Endpoint must be acceptable for URL. - */ -export async function connectWebSocket( - endpoint: string, - headers: Headers = new Headers(), -): Promise { - const url = new URL(endpoint); - const { hostname } = url; - let conn: Deno.Conn; - if (url.protocol === "http:" || url.protocol === "ws:") { - const port = parseInt(url.port || "80"); - conn = await Deno.connect({ hostname, port }); - } else if (url.protocol === "https:" || url.protocol === "wss:") { - const port = parseInt(url.port || "443"); - conn = await Deno.connectTls({ hostname, port }); - } else { - throw new Error("ws: unsupported protocol: " + url.protocol); - } - const bufWriter = new BufWriter(conn); - const bufReader = new BufReader(conn); - try { - await handshake(url, headers, bufReader, bufWriter); - } catch (err) { - conn.close(); - throw err; - } - return new WebSocketImpl({ - conn, - bufWriter, - bufReader, - mask: createMask(), - }); -} - export function createWebSocket(params: { conn: Deno.Conn; bufWriter?: BufWriter; diff --git a/ws/test.ts b/ws/test.ts index 87cf549ec3ce..787cb76e2335 100644 --- a/ws/test.ts +++ b/ws/test.ts @@ -5,7 +5,6 @@ import { TextProtoReader } from "../textproto/mod.ts"; import * as bytes from "../bytes/mod.ts"; import { acceptable, - connectWebSocket, createSecAccept, createSecKey, handshake, @@ -194,17 +193,6 @@ Deno.test("[ws] acceptable should return false when headers invalid", () => { ); }); -Deno.test( - "[ws] connectWebSocket should throw invalid scheme of url", - async (): Promise => { - await assertThrowsAsync( - async (): Promise => { - await connectWebSocket("file://hoge/hoge"); - }, - ); - }, -); - Deno.test("[ws] write and read masked frame", async () => { const mask = new Uint8Array([0, 1, 2, 3]); const msg = "hello";