mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 09:31:22 -05:00
doc: Improved ws example and README (#5636)
This commit is contained in:
parent
a04166e9fa
commit
430beebc46
4 changed files with 91 additions and 84 deletions
|
@ -7,58 +7,62 @@ ws module is made to provide helpers to create WebSocket client/server.
|
|||
### Server
|
||||
|
||||
```ts
|
||||
import { serve } from "https://deno.land/std/http/server.ts";
|
||||
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
||||
import { serve } from "../../http/server.ts";
|
||||
import {
|
||||
acceptWebSocket,
|
||||
isWebSocketCloseEvent,
|
||||
isWebSocketPingEvent,
|
||||
} from "https://deno.land/std/ws/mod.ts";
|
||||
|
||||
/** websocket echo server */
|
||||
const port = Deno.args[0] || "8080";
|
||||
console.log(`websocket server is running on :${port}`);
|
||||
for await (const req of serve(`:${port}`)) {
|
||||
const { conn, r: bufReader, w: bufWriter, headers } = req;
|
||||
WebSocket,
|
||||
} from "../../ws/mod.ts";
|
||||
|
||||
async function handleWs(sock: WebSocket) {
|
||||
console.log("socket connected!");
|
||||
try {
|
||||
const sock = await acceptWebSocket({
|
||||
for await (const ev of sock) {
|
||||
if (typeof ev === "string") {
|
||||
// text message
|
||||
console.log("ws:Text", ev);
|
||||
await sock.send(ev);
|
||||
} else if (ev instanceof Uint8Array) {
|
||||
// binary message
|
||||
console.log("ws:Binary", ev);
|
||||
} else if (isWebSocketPingEvent(ev)) {
|
||||
const [, body] = ev;
|
||||
// ping
|
||||
console.log("ws:Ping", body);
|
||||
} else if (isWebSocketCloseEvent(ev)) {
|
||||
// close
|
||||
const { code, reason } = ev;
|
||||
console.log("ws:Close", code, reason);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`failed to receive frame: ${err}`);
|
||||
|
||||
if (!sock.isClosed) {
|
||||
await sock.close(1000).catch(console.error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
/** websocket echo server */
|
||||
const port = Deno.args[0] || "8080";
|
||||
console.log(`websocket server is running on :${port}`);
|
||||
for await (const req of serve(`:${port}`)) {
|
||||
const { conn, r: bufReader, w: bufWriter, headers } = req;
|
||||
acceptWebSocket({
|
||||
conn,
|
||||
bufReader,
|
||||
bufWriter,
|
||||
headers,
|
||||
});
|
||||
|
||||
console.log("socket connected!");
|
||||
|
||||
try {
|
||||
for await (const ev of sock) {
|
||||
if (typeof ev === "string") {
|
||||
// text message
|
||||
console.log("ws:Text", ev);
|
||||
await sock.send(ev);
|
||||
} else if (ev instanceof Uint8Array) {
|
||||
// binary message
|
||||
console.log("ws:Binary", ev);
|
||||
} else if (isWebSocketPingEvent(ev)) {
|
||||
const [, body] = ev;
|
||||
// ping
|
||||
console.log("ws:Ping", body);
|
||||
} else if (isWebSocketCloseEvent(ev)) {
|
||||
// close
|
||||
const { code, reason } = ev;
|
||||
console.log("ws:Close", code, reason);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`failed to receive frame: ${err}`);
|
||||
|
||||
if (!sock.isClosed) {
|
||||
await sock.close(1000).catch(console.error);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`failed to accept websocket: ${err}`);
|
||||
await req.respond({ status: 400 });
|
||||
})
|
||||
.then(handleWs)
|
||||
.catch(async (e) => {
|
||||
console.error(`failed to accept websocket: ${err}`);
|
||||
await req.respond({ status: 400 });
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
|
|
@ -4,54 +4,55 @@ import {
|
|||
acceptWebSocket,
|
||||
isWebSocketCloseEvent,
|
||||
isWebSocketPingEvent,
|
||||
WebSocket,
|
||||
} from "./mod.ts";
|
||||
|
||||
async function handleWs(sock: WebSocket): Promise<void> {
|
||||
console.log("socket connected!");
|
||||
try {
|
||||
for await (const ev of sock) {
|
||||
if (typeof ev === "string") {
|
||||
// text message
|
||||
console.log("ws:Text", ev);
|
||||
await sock.send(ev);
|
||||
} else if (ev instanceof Uint8Array) {
|
||||
// binary message
|
||||
console.log("ws:Binary", ev);
|
||||
} else if (isWebSocketPingEvent(ev)) {
|
||||
const [, body] = ev;
|
||||
// ping
|
||||
console.log("ws:Ping", body);
|
||||
} else if (isWebSocketCloseEvent(ev)) {
|
||||
// close
|
||||
const { code, reason } = ev;
|
||||
console.log("ws:Close", code, reason);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`failed to receive frame: ${err}`);
|
||||
|
||||
if (!sock.isClosed) {
|
||||
await sock.close(1000).catch(console.error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (import.meta.main) {
|
||||
/** websocket echo server */
|
||||
const port = Deno.args[0] || "8080";
|
||||
console.log(`websocket server is running on :${port}`);
|
||||
for await (const req of serve(`:${port}`)) {
|
||||
const { conn, r: bufReader, w: bufWriter, headers } = req;
|
||||
|
||||
try {
|
||||
const sock = await acceptWebSocket({
|
||||
conn,
|
||||
bufReader,
|
||||
bufWriter,
|
||||
headers,
|
||||
acceptWebSocket({
|
||||
conn,
|
||||
bufReader,
|
||||
bufWriter,
|
||||
headers,
|
||||
})
|
||||
.then(handleWs)
|
||||
.catch(async (e) => {
|
||||
console.error(`failed to accept websocket: ${e}`);
|
||||
await req.respond({ status: 400 });
|
||||
});
|
||||
|
||||
console.log("socket connected!");
|
||||
|
||||
try {
|
||||
for await (const ev of sock) {
|
||||
if (typeof ev === "string") {
|
||||
// text message
|
||||
console.log("ws:Text", ev);
|
||||
await sock.send(ev);
|
||||
} else if (ev instanceof Uint8Array) {
|
||||
// binary message
|
||||
console.log("ws:Binary", ev);
|
||||
} else if (isWebSocketPingEvent(ev)) {
|
||||
const [, body] = ev;
|
||||
// ping
|
||||
console.log("ws:Ping", body);
|
||||
} else if (isWebSocketCloseEvent(ev)) {
|
||||
// close
|
||||
const { code, reason } = ev;
|
||||
console.log("ws:Close", code, reason);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`failed to receive frame: ${err}`);
|
||||
|
||||
if (!sock.isClosed) {
|
||||
await sock.close(1000).catch(console.error);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`failed to accept websocket: ${err}`);
|
||||
await req.respond({ status: 400 });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
2
std/ws/example_test.ts
Normal file
2
std/ws/example_test.ts
Normal file
|
@ -0,0 +1,2 @@
|
|||
import "./example_client.ts";
|
||||
import "./example_server.ts";
|
|
@ -283,8 +283,8 @@ function dummyConn(r: Reader, w: Writer): Conn {
|
|||
return {
|
||||
rid: -1,
|
||||
closeWrite: (): void => {},
|
||||
read: (x): Promise<number | null> => r.read(x),
|
||||
write: (x): Promise<number> => w.write(x),
|
||||
read: (x: Uint8Array): Promise<number | null> => r.read(x),
|
||||
write: (x: Uint8Array): Promise<number> => w.write(x),
|
||||
close: (): void => {},
|
||||
localAddr: { transport: "tcp", hostname: "0.0.0.0", port: 0 },
|
||||
remoteAddr: { transport: "tcp", hostname: "0.0.0.0", port: 0 },
|
||||
|
|
Loading…
Add table
Reference in a new issue