dm-web-react
Version:
The DM web client with React.
77 lines (69 loc) • 3.02 kB
text/typescript
import { SocketIOService } from "./socketIoService";
import { SocketIoInnodealingWorkerMessage } from "../models/workerMessage/socketIoInnodealingWorkerMessage";
import { SocketIoEventWorkerMessage } from "../models/workerMessage/socketIoEventWorkerMessage";
import { PreloadingHeartbeatWorkerMessage } from "../models/workerMessage/preloadingHeartbeatWorkerMessage";
import { WorkerMessage } from "../models/workerMessage/workerMessage";
import { WorkerMessageType } from "../models/enum/workerMessageType";
import { plainToClass } from "class-transformer";
console.log("backgroundSharedWorker");
SocketIOService.Instance.connect();
const messagePortMap = new Map<MessagePort, Date>();
SocketIOService.Instance.register(handleSocketIoInnodealingMessage);
onconnect = (e: MessageEvent) => {
console.log("connnect success");
const port: MessagePort = e.ports[0];
messagePortMap.set(port, new Date());
port.addEventListener(
"message",
evt => {
console.log("on message");
const data = evt.data as WorkerMessage;
if (data.messageType === WorkerMessageType.PRELOADING_HEARTBEAT) {
const msg = plainToClass<PreloadingHeartbeatWorkerMessage, object>(PreloadingHeartbeatWorkerMessage, data);
transpondPreloadingHeartbeat(msg);
} else if (data.messageType === WorkerMessageType.MESSAGE_PORT_HEART_BEAT) {
console.log("messagePortHeartbeat: ", data.messageId);
if (e.source instanceof MessagePort) {
const matchedPortValue = messagePortMap.get(e.source);
console.log("find matched port value: ", matchedPortValue);
messagePortMap.set(e.source, new Date());
}
}
},
false
);
port.start();
self.setInterval(() => {
checkMessagePortValid();
}, 30000);
};
function handleSocketIoInnodealingMessage(data: SocketIoInnodealingWorkerMessage | SocketIoEventWorkerMessage) {
messagePortMap.forEach((value, key) => {
key.postMessage(data);
});
}
function transpondPreloadingHeartbeat(heartbeatMessage: PreloadingHeartbeatWorkerMessage) {
console.log("transpondPreloadingHeartbeat: ", heartbeatMessage.messageId);
messagePortMap.forEach((value, key) => {
key.postMessage(heartbeatMessage);
});
}
// need check messageport disconnect from shared worker.
function checkMessagePortValid() {
// 用户休眠 逻辑会错误
// console.log("checkMessagePortValid start");
// const now = new Date();
// const needRemoveKeys: MessagePort[] = [];
// messagePortMap.forEach((value, key) => {
// if (now.getTime() - value.getTime() > 60000) {
// needRemoveKeys.push(key);
// }
// });
// console.log("need remove message port length: ", needRemoveKeys.length);
// for (const key of needRemoveKeys) {
// messagePortMap.delete(key);
// key.close();
// }
// console.log("current messsage port count", messagePortMap.size);
// console.log("checkMessagePortValid end");
}