feat: refactor send

This commit is contained in:
手瓜一十雪 2024-07-22 18:49:25 +08:00
parent ab22f36b8a
commit 6a16a42d0c

View File

@ -7,6 +7,7 @@ import { MsgListener, onGroupFileInfoUpdateParamType } from '@/core/listeners';
import { GeneralCallResult } from '@/core/services/common'; import { GeneralCallResult } from '@/core/services/common';
import { randomUUID } from 'crypto'; import { randomUUID } from 'crypto';
import { MessageUnique } from '../../../common/utils/MessageUnique'; import { MessageUnique } from '../../../common/utils/MessageUnique';
import { NTEventDispatch } from '@/common/utils/EventTask';
setTimeout(() => { setTimeout(() => {
napCatCore.onLoginSuccess(() => { napCatCore.onLoginSuccess(() => {
@ -34,7 +35,7 @@ setTimeout(() => {
}); });
}, 100); }, 100);
const sendMessagePool: Record<string, ((sendSuccessMsg: RawMessage) => void | Promise<void>) | null> = {};// peerUid: callbackFunc // const sendMessagePool: Record<string, ((sendSuccessMsg: RawMessage) => void | Promise<void>) | null> = {};// peerUid: callbackFunc
const sendSuccessCBMap: Record<string, ((sendSuccessMsg: RawMessage) => boolean | Promise<boolean>) | null> = {};// uuid: callbackFunc const sendSuccessCBMap: Record<string, ((sendSuccessMsg: RawMessage) => boolean | Promise<boolean>) | null> = {};// uuid: callbackFunc
@ -51,19 +52,19 @@ msgListener.onGroupFileInfoUpdate = (groupFileListResult: onGroupFileInfoUpdateP
} }
}; };
msgListener.onAddSendMsg = (msgRecord: RawMessage) => { // msgListener.onAddSendMsg = (msgRecord: RawMessage) => {
// console.log("sent msg", msgRecord, sendMessagePool); // // console.log("sent msg", msgRecord, sendMessagePool);
for (const [uuid, cb] of sentMsgTasks) { // for (const [uuid, cb] of sentMsgTasks) {
cb(msgRecord); // cb(msgRecord);
sentMsgTasks.delete(uuid); // sentMsgTasks.delete(uuid);
} // }
if (sendMessagePool[msgRecord.peerUid]) { // if (sendMessagePool[msgRecord.peerUid]) {
const r = sendMessagePool[msgRecord.peerUid]?.(msgRecord); // const r = sendMessagePool[msgRecord.peerUid]?.(msgRecord);
if (r instanceof Promise) { // if (r instanceof Promise) {
r.then().catch(logError); // r.then().catch(logError);
} // }
} // }
}; // };
msgListener.onMsgInfoListUpdate = (msgInfoList: RawMessage[]) => { msgListener.onMsgInfoListUpdate = (msgInfoList: RawMessage[]) => {
msgInfoList.forEach(msg => { msgInfoList.forEach(msg => {
@ -166,59 +167,72 @@ export class NTQQMsgApi {
peerUid: peer.peerUid peerUid: peer.peerUid
}, msgIds); }, msgIds);
} }
static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000) {
static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000): Promise<RawMessage> { let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime());
const peerUid = peer.peerUid; let data = await NTEventDispatch.CallNormalEvent<(msgId: string, peer: Peer, msgElements: SendMessageElement[], map: Map<any, any>) => Promise<unknown>, (msgList: RawMessage[]) => void>(
// 等待上一个相同的peer发送完 'NodeIKernelMsgService/sendMsg',
let checkLastSendUsingTime = 0; 'NodeIKernelMsgListener/onMsgInfoListUpdate',
const waitLastSend: () => Promise<void> = async () => { timeout,
if (checkLastSendUsingTime > timeout) { 1,
throw ('发送超时'); () => true,
} msgId,
const lastSending = sendMessagePool[peer.peerUid]; peer,
if (lastSending) { msgElements,
// log("有正在发送的消息,等待中...") new Map()
await sleep(500); );
checkLastSendUsingTime += 500; //const result = napCatCore.session.getMsgService().sendMsg(msgId, peer, msgElements, new Map());
return await waitLastSend();
} else {
return;
}
};
await waitLastSend();
return new Promise(async (resolve, reject) => {
let completed = false;
let sentMessage: RawMessage | null = null;
const sendSuccessCBId = randomUUID() as string;
sendSuccessCBMap[sendSuccessCBId] = (msgRecord: RawMessage) => {
console.log(msgRecord);
if (msgRecord.msgId === sentMessage?.msgId) {
if (msgRecord.sendStatus === 2) {
delete sendSuccessCBMap[sendSuccessCBId];
completed = true;
resolve(msgRecord);
return true;
}
return false;
}
return false;
};
sendMessagePool[peerUid] = async (rawMessage: RawMessage) => {
// console.log('收到sent 消息', rawMessage.msgId);
delete sendMessagePool[peerUid];
sentMessage = rawMessage;
};
setTimeout(() => {
if (completed) return;
delete sendMessagePool[peerUid];
delete sendSuccessCBMap[sendSuccessCBId];
reject('发送超时');
}, timeout);
let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime());
const result = napCatCore.session.getMsgService().sendMsg(msgId, peer, msgElements, new Map());
});
} }
// static async sendMsg(peer: Peer, msgElements: SendMessageElement[], waitComplete = true, timeout = 10000): Promise<RawMessage> {
// const peerUid = peer.peerUid;
// // 等待上一个相同的peer发送完
// let checkLastSendUsingTime = 0;
// const waitLastSend: () => Promise<void> = async () => {
// if (checkLastSendUsingTime > timeout) {
// throw ('发送超时');
// }
// const lastSending = sendMessagePool[peer.peerUid];
// if (lastSending) {
// // log("有正在发送的消息,等待中...")
// await sleep(500);
// checkLastSendUsingTime += 500;
// return await waitLastSend();
// } else {
// return;
// }
// };
// await waitLastSend();
// return new Promise(async (resolve, reject) => {
// let completed = false;
// let sentMessage: RawMessage | null = null;
// const sendSuccessCBId = randomUUID() as string;
// sendSuccessCBMap[sendSuccessCBId] = (msgRecord: RawMessage) => {
// if (msgRecord.msgId === sentMessage?.msgId) {
// if (msgRecord.sendStatus === 2) {
// delete sendSuccessCBMap[sendSuccessCBId];
// completed = true;
// resolve(msgRecord);
// return true;
// }
// return false;
// }
// return false;
// };
// sendMessagePool[peerUid] = async (rawMessage: RawMessage) => {
// // console.log('收到sent 消息', rawMessage.msgId);
// delete sendMessagePool[peerUid];
// sentMessage = rawMessage;
// };
// setTimeout(() => {
// if (completed) return;
// delete sendMessagePool[peerUid];
// delete sendSuccessCBMap[sendSuccessCBId];
// reject('发送超时');
// }, timeout);
// let msgId = await NTQQMsgApi.getMsgUnique(await NTQQMsgApi.getServerTime());
// const result = napCatCore.session.getMsgService().sendMsg(msgId, peer, msgElements, new Map());
// });
// }
static async getMsgUnique(time: string) { static async getMsgUnique(time: string) {
return napCatCore.session.getMsgService().getMsgUniqueId(time); return napCatCore.session.getMsgService().getMsgUniqueId(time);
} }