flarestart

Results 15 comments of flarestart

Yes, I have just add a test case for this feature, plz have a look.

@numtel thanks for your comments, I'll check my code more carefully.

和 HTTP 协议一样,你可以编写中间件从 ctx.header 中获取 cookie,通过 cookie 来进行鉴权。 由于 WebSocket 连接是由 HTTP 连接升级而来,因此浏览器发送的 WebSocket 握手携带的 header 都可以通过 ctx.header 进行获取。

@tmkmk 这个插件已经在正式项目中运行了很久才开源出来的,如果需要协助,请提供一个最小可复现你的问题的代码仓库

@MrWWY 目前这个插件提供的都是比较底层的功能,可以通过如下的方式来实现 1. 使用中间件为当前连接的 ctx 添加 uuid 来识别不同的连接 ```typescript // 在 router.ts 中配置中间件 import { v4 as uuidv4 } from 'uuid'; // 将中间件安装放在所有 app.ws.use 之前,这样 app.ws.route 才会用上中间件 app.ws.use(async (ctx, next)...

@caihaibin1991 由于 egg.js 是多进程的,因此不像其他服务器框架一样,可以在同一个进程上指定向某一个连接(用户)发送消息 向指定的用户发送消息,可以通过将每个用户加入一个与用户 ID 关联的房间名来实现

> 不过有点不是很理解,是走redis订阅发布,但是我启动4核,推送消息时,4个都能接收到,但是redis publish时确只显示推送了1个客户端. 然后我直接通过redis-cli subscribe channel, 再发布, 就有显示多一个...为啥? 没太看明白,可以把具体的代码以及执行的命令行指令发出来,可以帮你看一下 redis 发布订阅本身就是一对多的关系,同一个消息会发送给多个消息订阅的接收者

egg.js 的代码里面需要有加入 test 房间的代码,且需要有一个 WebSocket 客户端连接上 egg.js 服务器,再使用 redis 发送消息才会收到。插件不使用 `room.join` 方法时,并没有进行 Redis 的订阅操作

@caihaibin1991 另外,直接用 redis 的 publish 向房间发送消息时,发送字符串需要加上前缀 `s` string 发送 Binary 类型需要第一个字节是 `b` binary。WebSocket 客户端收到的数据类型有所区别。 参考源代码 https://github.com/flarestart/egg-websocket-plugin/blob/master/adapter/redis.ts#L20-L31

@caihaibin1991 4 个WebSocket 客户端如果都是连接的同一个进程,这种情况下,只有一个进程在进行订阅 `test` 房间,一个进程只会建立唯一 Redis 连接,因此不管有多少个 WebSocket 客户端订阅了 `test` 房间,一个进程内的房间订阅插件实现都会优化成一个 Redis 底层连接