Skip to content

Commit

Permalink
update uws
Browse files Browse the repository at this point in the history
  • Loading branch information
snowinszu committed Oct 5, 2023
1 parent 26ca4c5 commit 3025083
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 28 deletions.
1 change: 1 addition & 0 deletions dist/uws-tracker.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export declare class UWebSocketsTracker {
run(): Promise<void>;
private validateAccess;
private buildApplication;
private readonly onUpgrade;
private readonly onOpen;
private readonly onMessage;
private readonly onClose;
Expand Down
22 changes: 16 additions & 6 deletions dist/uws-tracker.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,34 +51,43 @@ class UWebSocketsTracker {
_app.set(this, void 0);
this.webSocketsCount = 0;
this.validateOrigin = false;
this.onOpen = (ws, request) => {
this.onUpgrade = (res, req, context) => {
const secWebSocketKey = req.getHeader("sec-websocket-key");
const secWebSocketProtocol = req.getHeader("sec-websocket-protocol");
const secWebSocketExtensions = req.getHeader("sec-websocket-extensions");
const origin = req.getHeader("origin");
const url = req.getUrl();
const query = req.getQuery();
res.upgrade({ query: query, url: url, origin: origin }, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, context);
};
this.onOpen = (ws) => {
var _a, _b;
this.webSocketsCount++;
const { query, url, origin } = ws.getUserData();
if ((this.maxConnections !== 0) && (this.webSocketsCount > this.maxConnections)) {
if (debugRequestsEnabled) {
debugRequests(this.settings.server.host, this.settings.server.port, "ws-denied-max-connections url:", request.getUrl(), "query:", request.getQuery(), "origin:", request.getHeader("origin"), "total:", this.webSocketsCount);
debugRequests(this.settings.server.host, this.settings.server.port, "ws-denied-max-connections url:", url, "query:", query, "origin:", origin, "total:", this.webSocketsCount);
}
ws.close();
return;
}
if (debugWebSocketsEnabled) {
debugWebSockets("connected via URL", request.getUrl());
debugWebSockets("connected via URL", url);
}
if (this.validateOrigin) {
const origin = request.getHeader("origin");
const shoulDeny = ((this.settings.access.denyEmptyOrigin && (origin.length === 0))
|| (((_a = this.settings.access.denyOrigins) === null || _a === void 0 ? void 0 : _a.includes(origin)) === true)
|| (((_b = this.settings.access.allowOrigins) === null || _b === void 0 ? void 0 : _b.includes(origin)) === false));
if (shoulDeny) {
if (debugRequestsEnabled) {
debugRequests(this.settings.server.host, this.settings.server.port, "ws-denied url:", request.getUrl(), "query:", request.getQuery(), "origin:", origin, "total:", this.webSocketsCount);
debugRequests(this.settings.server.host, this.settings.server.port, "ws-denied url:", url, "query:", query, "origin:", origin, "total:", this.webSocketsCount);
}
ws.close();
return;
}
}
if (debugRequestsEnabled) {
debugRequests(this.settings.server.host, this.settings.server.port, "ws-open url:", request.getUrl(), "query:", request.getQuery(), "origin:", request.getHeader("origin"), "total:", this.webSocketsCount);
debugRequests(this.settings.server.host, this.settings.server.port, "ws-open url:", url, "query:", query, "origin:", origin, "total:", this.webSocketsCount);
}
};
this.onMessage = (ws, message) => {
Expand Down Expand Up @@ -183,6 +192,7 @@ class UWebSocketsTracker {
compression: this.settings.websockets.compression,
maxPayloadLength: this.settings.websockets.maxPayloadLength,
idleTimeout: this.settings.websockets.idleTimeout,
upgrade: this.onUpgrade,
open: this.onOpen,
drain: (ws) => {
if (debugWebSocketsEnabled) {
Expand Down
65 changes: 44 additions & 21 deletions lib/uws-tracker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { App, SSLApp, WebSocket, HttpRequest, TemplatedApp } from "uWebSockets.j
import * as Debug from "debug";
import { Tracker, TrackerError, PeerContext } from "./tracker";
import { ServerSettings, WebSocketsSettings, WebSocketsAccessSettings } from "./run-uws-tracker";
import { HttpResponse, us_socket_context_t } from "_uWebSockets.js@20.31.0@uWebSockets.js";

// eslint-disable-next-line new-cap
const debugWebSockets = Debug("wt-tracker:uws-tracker");
Expand Down Expand Up @@ -46,6 +47,12 @@ export interface PartialUwsTrackerSettings {
access?: Partial<WebSocketsAccessSettings>;
}

interface UserData {
query: string;
url: string;
origin: string;
}

export class UWebSocketsTracker {
public readonly settings: UwsTrackerSettings;

Expand Down Expand Up @@ -159,8 +166,9 @@ export class UWebSocketsTracker {
compression: this.settings.websockets.compression,
maxPayloadLength: this.settings.websockets.maxPayloadLength,
idleTimeout: this.settings.websockets.idleTimeout,
upgrade: this.onUpgrade,
open: this.onOpen,
drain: (ws: WebSocket) => {
drain: (ws: WebSocket<UserData>) => {
if (debugWebSocketsEnabled) {
debugWebSockets("drain", ws.getBufferedAmount());
}
Expand All @@ -171,20 +179,36 @@ export class UWebSocketsTracker {
);
}

private readonly onOpen = (ws: WebSocket, request: HttpRequest): void => {
this.webSocketsCount++;
private readonly onUpgrade = (res: HttpResponse, req: HttpRequest, context: us_socket_context_t): void => {
const secWebSocketKey = req.getHeader("sec-websocket-key");
const secWebSocketProtocol = req.getHeader("sec-websocket-protocol");
const secWebSocketExtensions = req.getHeader("sec-websocket-extensions");
const origin = req.getHeader("origin");
const url = req.getUrl();
const query = req.getQuery();
res.upgrade(
{ query: query, url: url, origin: origin },
secWebSocketKey,
secWebSocketProtocol,
secWebSocketExtensions,
context,
);
}

private readonly onOpen = (ws: WebSocket<UserData>): void => {
this.webSocketsCount++;
const { query, url, origin } = ws.getUserData();
if ((this.maxConnections !== 0) && (this.webSocketsCount > this.maxConnections)) {
if (debugRequestsEnabled) {
debugRequests(
this.settings.server.host,
this.settings.server.port,
"ws-denied-max-connections url:",
request.getUrl(),
url,
"query:",
request.getQuery(),
query,
"origin:",
request.getHeader("origin"),
origin,
"total:",
this.webSocketsCount,
);
Expand All @@ -194,11 +218,10 @@ export class UWebSocketsTracker {
}

if (debugWebSocketsEnabled) {
debugWebSockets("connected via URL", request.getUrl());
debugWebSockets("connected via URL",url);
}

if (this.validateOrigin) {
const origin = request.getHeader("origin");

const shoulDeny = (
(this.settings.access.denyEmptyOrigin && (origin.length === 0))
Expand All @@ -212,9 +235,9 @@ export class UWebSocketsTracker {
this.settings.server.host,
this.settings.server.port,
"ws-denied url:",
request.getUrl(),
url,
"query:",
request.getQuery(),
query,
"origin:",
origin,
"total:",
Expand All @@ -231,18 +254,18 @@ export class UWebSocketsTracker {
this.settings.server.host,
this.settings.server.port,
"ws-open url:",
request.getUrl(),
url,
"query:",
request.getQuery(),
query,
"origin:",
request.getHeader("origin"),
origin,
"total:",
this.webSocketsCount,
);
}
};

private readonly onMessage = (ws: WebSocket, message: ArrayBuffer): void => {
private readonly onMessage = (ws: WebSocket<UserData>, message: ArrayBuffer): void => {
debugWebSockets("message of size", message.byteLength);

let json: object | undefined = undefined;
Expand All @@ -254,14 +277,14 @@ export class UWebSocketsTracker {
return;
}

if (ws.sendMessage === undefined) {
ws.sendMessage = sendMessage;
if ((ws as any).sendMessage === undefined) {
(ws as any).sendMessage = sendMessage;
}

if (debugMessagesEnabled) {
debugMessages(
"in",
(ws.id === undefined) ? "unknown peer" : Buffer.from(ws.id).toString("hex"),
((ws as any).id === undefined) ? "unknown peer" : Buffer.from((ws as any).id).toString("hex"),
json,
);
}
Expand All @@ -278,23 +301,23 @@ export class UWebSocketsTracker {
}
};

private readonly onClose = (ws: WebSocket, code: number): void => {
private readonly onClose = (ws: WebSocket<UserData>, code: number): void => {
this.webSocketsCount--;

if (ws.sendMessage !== undefined) {
if ((ws as any).sendMessage !== undefined) {
this.tracker.disconnectPeer(ws as unknown as PeerContext);
}

debugWebSockets("closed with code", code);
};
}

function sendMessage(json: object, ws: WebSocket): void {
function sendMessage(json: object, ws: WebSocket<UserData>): void {
ws.send(JSON.stringify(json), false, false);
if (debugMessagesEnabled) {
debugMessages(
"out",
(ws.id === undefined) ? "unknown peer" : Buffer.from(ws.id).toString("hex"),
((ws as any).id === undefined) ? "unknown peer" : Buffer.from((ws as any).id).toString("hex"),
json,
);
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
},
"dependencies": {
"debug": "^4.1.1",
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v17.4.0"
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.31.0"
},
"devDependencies": {
"@types/chai": "^4.2.11",
Expand Down

0 comments on commit 3025083

Please sign in to comment.