chore: .cursor/rules/socket.mdc
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
---
|
||||
description: 即时通讯(Socket)
|
||||
globs:
|
||||
---
|
||||
# 即时通讯(Socket)
|
||||
|
||||
`cool-admin`即时通讯功能基于[Socket.io(v4)](https://socket.io/docs/v4)开发,[midwayjs 官方 Socket.io 文档](http://midwayjs.org/docs/extensions/socketio)
|
||||
|
||||
## 配置
|
||||
|
||||
`configuration.ts`
|
||||
|
||||
```ts
|
||||
import * as socketio from "@midwayjs/socketio";
|
||||
|
||||
@Configuration({
|
||||
imports: [
|
||||
// socketio http://www.midwayjs.org/docs/extensions/socketio
|
||||
socketio,
|
||||
],
|
||||
importConfigs: [join(__dirname, "./config")],
|
||||
})
|
||||
export class ContainerLifeCycle {
|
||||
@App()
|
||||
app: koa.Application;
|
||||
|
||||
async onReady() {}
|
||||
}
|
||||
```
|
||||
|
||||
## 配置`config/config.default.ts`
|
||||
|
||||
需要配置 redis 适配器,让进程之间能够进行通讯
|
||||
|
||||
```ts
|
||||
import { CoolConfig, MODETYPE } from "@cool-midway/core";
|
||||
import { MidwayConfig } from "@midwayjs/core";
|
||||
import * as fsStore from "@cool-midway/cache-manager-fs-hash";
|
||||
import { createAdapter } from "@socket.io/redis-adapter";
|
||||
// @ts-ignore
|
||||
import Redis from "ioredis";
|
||||
|
||||
const redis = {
|
||||
host: "127.0.0.1",
|
||||
port: 6379,
|
||||
password: "",
|
||||
db: 0,
|
||||
};
|
||||
|
||||
const pubClient = new Redis(redis);
|
||||
const subClient = pubClient.duplicate();
|
||||
|
||||
export default {
|
||||
// ...
|
||||
// socketio
|
||||
socketIO: {
|
||||
upgrades: ["websocket"], // 可升级的协议
|
||||
adapter: createAdapter(pubClient, subClient),
|
||||
},
|
||||
} as MidwayConfig;
|
||||
```
|
||||
|
||||
## 服务端
|
||||
|
||||
```ts
|
||||
import {
|
||||
WSController,
|
||||
OnWSConnection,
|
||||
Inject,
|
||||
OnWSMessage,
|
||||
} from "@midwayjs/core";
|
||||
import { Context } from "@midwayjs/socketio";
|
||||
/**
|
||||
* 测试
|
||||
*/
|
||||
@WSController("/")
|
||||
export class HelloController {
|
||||
@Inject()
|
||||
ctx: Context;
|
||||
|
||||
// 客户端连接
|
||||
@OnWSConnection()
|
||||
async onConnectionMethod() {
|
||||
console.log("on client connect", this.ctx.id);
|
||||
console.log("参数", this.ctx.handshake.query);
|
||||
this.ctx.emit("data", "连接成功");
|
||||
}
|
||||
|
||||
// 消息事件
|
||||
@OnWSMessage("myEvent")
|
||||
async gotMessage(data) {
|
||||
console.log("on data got", this.ctx.id, data);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 客户端
|
||||
|
||||
```ts
|
||||
const io = require("socket.io-client");
|
||||
|
||||
const socket = io("http://127.0.0.1:8001", {
|
||||
auth: {
|
||||
token: "xxx",
|
||||
},
|
||||
});
|
||||
|
||||
socket.on("data", (msg) => {
|
||||
console.log("服务端消息", msg);
|
||||
});
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
如果部署为多线程的,为了让进程之间能够进行通讯,需要配置 redis 适配器,[配置方式](http://midwayjs.org/docs/extensions/socketio#%E9%85%8D%E7%BD%AE-redis-%E9%80%82%E9%85%8D%E5%99%A8)
|
||||
|
||||
```ts
|
||||
// src/config/config.default
|
||||
import { createRedisAdapter } from "@midwayjs/socketio";
|
||||
|
||||
export default {
|
||||
// ...
|
||||
socketIO: {
|
||||
adapter: createRedisAdapter({ host: "127.0.0.1", port: 6379 }),
|
||||
},
|
||||
};
|
||||
```
|
||||
Reference in New Issue
Block a user