Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions mod.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Copyright 2020 the oak authors. All rights reserved. MIT license.

export { responseTimeHeader } from "./observability/response_time_header.ts";
export { WebSocketMiddleware } from "./websocket/enable_websockets.ts";
49 changes: 49 additions & 0 deletions websocket/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
The following is a re-implementation of the example server in [std/ws](https://deno.land/[email protected]/ws):

```ts
import { WebSocketMiddleware } from "https://deno.land/x/oak-middleware/mod.ts";
import { Application } from "https://deno.land/x/oak/mod.ts";
import {
isWebSocketCloseEvent,
isWebSocketPingEvent,
WebSocket,
} from "https://deno.land/[email protected]/ws/mod.ts";

async function handleWs(sock: WebSocket) {
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);
}
}
}

const app = new App();
app.use(WebSocketMiddleware(handleWs));

// other middleware

await app.listen(":80");

```
14 changes: 14 additions & 0 deletions websocket/enable_websockets.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Middleware, Context } from "https://deno.land/x/[email protected]/mod.ts";
import { WebSocket, acceptable } from 'https://deno.land/[email protected]/ws/mod.ts'
export type WebSocketHandler = (socket: WebSocket, url: URL, headers: Headers) => Promise<void>;

export function WebSocketMiddleware(handler: WebSocketHandler){
return async function real_middleware(ctx: Context, next: () => Promise<void>) {
if(acceptable(ctx.request)) {
let ws = await ctx.upgrade();
await handler(ws, ctx.request.url, ctx.request.headers);
} else {
return await next();
}
};
}