webserv
Version:
a quick, flexible, fully typed development server
81 lines • 3.42 kB
JavaScript
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "../log", "../upgrades/websocket.upgrade"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const log_1 = require("../log");
const websocket_upgrade_1 = require("../upgrades/websocket.upgrade");
class Connection {
constructor(id, client) {
this.id = id;
this.client = client;
}
}
exports.Connection = Connection;
/**
* This extends the functionality of websocket.upgrade to provide more robust connection tracking of
* WebSocket connections.
*
* Connections are given a unique ID that can retrieve the user's WebSocket client via ConnectionMethods
* or can be used to link internal data (such as user name or other user information) to the connection.
*/
exports.realtimeUpgrade = ({ onInit, onConnect, onDisconnect, onError, onMessage }) => {
var _a;
const connections = new Map();
const methods = {
get(socketId) {
return connections.get(socketId);
},
getAll() {
return connections.values();
},
getSize() {
return connections.size;
}
};
(_a = onInit) === null || _a === void 0 ? void 0 : _a(methods);
return websocket_upgrade_1.websocket({
onClose(socketId, code, reason) {
var _a;
log_1.log.debug(`[WS] {${socketId}} connection closed (${code}).${reason ? ` Reason: ${reason}` : ''}`);
const con = connections.get(socketId);
if (con) {
connections.delete(socketId);
(_a = onDisconnect) === null || _a === void 0 ? void 0 : _a(con, methods);
}
else {
log_1.log.warn(`[WS] Unregistered user ${socketId} closed connection!`);
}
},
onConnection(client, socketId) {
var _a;
log_1.log.debug(`[WS] {${socketId}} connected`);
const con = new Connection(socketId, client);
connections.set(con.id, con);
(_a = onConnect) === null || _a === void 0 ? void 0 : _a(con, methods);
},
onError(socketId, err) {
var _a;
log_1.log.debug(`[WS] {${socketId}} errored. ${err && err.message}`);
const con = connections.get(socketId);
(_a = onError) === null || _a === void 0 ? void 0 : _a(err, con || socketId);
},
onMessage(socketId, data) {
log_1.log.debug(`[WS] {${socketId}} says: ${data}`);
if (onMessage) {
const con = connections.get(socketId);
if (con) {
onMessage(data, con, methods);
}
}
}
});
};
});
//# sourceMappingURL=realtime.upgrade.js.map