gpt4 book ai didi

node.js - Nodejs ws模块: Heartbeat in TypeScript

转载 作者:行者123 更新时间:2023-12-03 12:14:59 28 4
gpt4 key购买 nike

我目前正在使用 TypeScript 在 NodeJs 上运行 WebSocket 服务器。作为 WebSocket 服务器实现,我使用的是 ws .除此之外,我使用 @types/ws打字包。
我希望服务器定期向每个连接的客户端发送一个 ping 包。 ws 模块的自述文件已经在 J​​avaScript 中提供了一个示例实现,我也想使用它。
您可以找到示例实现 here :
我面临的问题是示例实现将“isAlive”属性添加到套接字对象中,我显然无法在 TypeScript 中执行此操作,因为套接字类不存在“isAlive”属性。
我的问题:
将此属性添加到套接字类的最佳方法是什么?由于我将这些套接字对象作为参数传递,因此我想避免向我的所有文件添加某种额外的导入,这些文件以某种方式与套接字一起工作。
我想避免为此将套接字对象类型转换为任何对象。
我尝试围绕 ws 实现一个包装类,这样我就可以实例化我的 WebSocket 类并在整个应用程序中使用它。
我的课看起来像这样

import * as ws from "ws";


export default class WebSocketServer {
private wss: ws.Server;
private onSubscription: (socket: ws, deviceId: string, topicFilter: string) => void;

constructor(port: number, onSubscription: (socket: ws, deviceId: string, topicFilter: string) => void) {
this.wss = new ws.Server({ port });
this.onSubscription = onSubscription;
const conhandler = this.handleConnection.bind(this);
this.wss.on("connection", conhandler);
}

public static init(onSubscription: (socket: ws, deviceId: string, topicFilter: string) => void): WebSocketServer {
const port: number = Number(process.env.WSS_PORT);
if (!port) {
throw new Error("Unable to create the WebSocket server: Environment variable \"WSS_PORT\" is missing");
}

const server: WebSocketServer = new WebSocketServer(port, onSubscription);

console.info(`Websocket Server listening on port ${port}`);
return server;
}


private handleConnection(socket: ws): void {
const messageHandler: (socket: ws, data: ws.Data) => void = this.handleMessage.bind(this);
socket.on("message", data => messageHandler(socket, data));

/* This is where I try to add the isAlive attribute to a socket object */
/* but since ws does not have an attribute isAlive, TypeScript complains */
socket.on("pong", () => socket.isAlive = true);
}


private handleMessage(socket: ws, data: ws.Data): void {
/* Do stuff with the message */
}


public quit() {
this.wss.close();
}
}
编辑
正如评论者所提到的,我尝试了声明合并。我创建了一个名为“Augment.ts”的新文件并添加了以下代码:
import * as ws from "ws";
declare module "ws" {
interface WebSocket {
isAlive: boolean;
}
}
在包含我的 WebSocketServer 类的文件中,我添加了 Augment.ts 文件的导入,如下所示: import "./Augment" .结果是另一个错误消息(但以某种方式说明相同?): Property 'isAlive' does not exist on type 'import("c:/path/to/project/node_modules/@types/ws/index.d.ts")'.ts(2339)

最佳答案

我通过创建一个扩展 Web Socket 的自定义 Socket 接口(interface)让它工作。

interface CustomSocket extends WebSocket {
isAlive: boolean
}
export default class WebSocket {
private heartbeat: ReturnType<typeof setInterval>
private wss: WebSocket.Server


constructor(port: number) {
this.wss = new WebSocket.Server({port});

this.wss.on('connection', this.handleConnection)
}

private handleConnection(socket: CustomSocket) {
socket.on('pong', () => socket.isAlive = true)
}
}

关于node.js - Nodejs ws模块: Heartbeat in TypeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57906105/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com