Skip to content

v20.17.0

Compare
Choose a tag to compare
@uNetworkingAB uNetworkingAB released this 08 Jan 20:24
· 765 commits to binaries since this release

TypeScript updates for C++ alignment

The typings are now more strict and more aligned with the C++ interface. This means that documentation for TypeScript is more applicable to C++ and vice versa. In fact, the C++ examples are in many aspects identical to what you would write in TypeScript (ignoring syntax differences).

The biggest change is that you can no longer attach any key/value pair to WebSocket. You must define a static interface of the members up front. This means the type of WebSocket is now WebSocket<UserData> and WebSocket.getUserData() returns UserData.

Here is a complete example in TypeScript:

interface UserData {
    openDate: number;
}

uWS.App().ws<UserData>("/", {
    open: (ws) => {
        ws.getUserData().openDate = Date.now();
    },
    close: (ws, code, message) => {
        console.log("WebSocket with openDate " + ws.getUserData().openDate + " left.");
    }
}).listen(3000, (listenSocket) => {
    
});

and for comparison here is the equivalent example in C++:

struct UserData {
    time_t openDate;
}

uWS::App().ws<UserData>("/", {
    .open = [](auto *ws) {
        ws->getUserData()->openDate = clock();
    },
    .close = [](auto *ws, auto code, auto message) {
        std::cout << "WebSocket with openDate " << ws->getUserData()->openDate << " left." << std::endl;
    }
}).listen(3000, [](auto *listenSocket) {
    
});

Obviously, this only applies to TypeScript users. JavaScript users can still attach anything to anything without limitation and do not need to use getUserData(). So JavaScript code is unaffected by this change.