64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import EventEmitter from 'eventemitter3';
|
|
import { v4 as uuidv4 } from 'uuid';
|
|
|
|
export interface Server {
|
|
onConnect: (callback: (con: Connect) => void) => void;
|
|
}
|
|
|
|
export interface Connect {
|
|
postMessage: (message: unknown) => void;
|
|
onMessage: (callback: (message: unknown) => void) => void;
|
|
onDisconnect: (callback: () => void) => void;
|
|
disconnect: () => void;
|
|
}
|
|
|
|
// 消息通道, 通过连接封装消息通道
|
|
export class MessageChannel {
|
|
private EE: EventEmitter;
|
|
// 实例id
|
|
private id: string;
|
|
|
|
constructor(private connect: Connect) {
|
|
this.EE = new EventEmitter();
|
|
this.id = uuidv4();
|
|
connect.onMessage((message) => {
|
|
// 判断消息是否为连接消息
|
|
if (message && typeof message === 'object') {
|
|
const data = message as { type: string; id: string };
|
|
// 判断实例
|
|
if (data.id == this.id) {
|
|
switch (data.type) {
|
|
case 'connect':
|
|
// 建立连接
|
|
break;
|
|
case 'message':
|
|
// 发送消息
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// 发送一次消息并接收结果
|
|
async send(message: unknown) {
|
|
return new Promise((resolve) => {
|
|
const callback = (message: unknown) => {
|
|
this.connect.onMessage(callback);
|
|
resolve(message);
|
|
};
|
|
this.connect.onMessage(callback);
|
|
this.connect.postMessage(message);
|
|
});
|
|
}
|
|
|
|
// 发送消息
|
|
postMessage(message: unknown) {
|
|
this.connect.postMessage({
|
|
type: 'message',
|
|
id: this.id,
|
|
data: message,
|
|
});
|
|
}
|
|
}
|