MCPcopy Index your code
hub / github.com/scriptscat/scriptcat / CustomEventMessage

Class CustomEventMessage

packages/message/custom_event_message.ts:35–192  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

33
34// 使用CustomEvent来进行通讯, 可以在content与inject中传递一些dom对象
35export class CustomEventMessage implements Message {
36 EE = new EventEmitter<string, any>();
37 readonly receiveFlag: string;
38 readonly sendFlag: string;
39
40 // 关联dom目标
41 relatedTarget: Map<number, EventTarget> = new Map();
42 readyWrap: ReadyWrap = new ReadyWrap();
43
44 constructor(
45 eventFlag: string,
46 protected readonly isInbound: boolean,
47 public readonly envTag: ScriptEnvTag | "" = ""
48 ) {
49 const messageFlag = `${eventFlag}${envTag}`;
50 this.receiveFlag = `${messageFlag}${isInbound ? DefinedFlags.inboundFlag : DefinedFlags.outboundFlag}${DefinedFlags.domEvent}`;
51 this.sendFlag = `${messageFlag}${isInbound ? DefinedFlags.outboundFlag : DefinedFlags.inboundFlag}${DefinedFlags.domEvent}`;
52 pageAddEventListener(this.receiveFlag, (event: Event) => {
53 if (event instanceof MouseEventClone && event.movementX === 0 && event.cancelable) {
54 event.preventDefault(); // 告知另一端这边已准备好
55 this.readyWrap.setReady(); // 两端已准备好,则 setReady()
56 } else if (event instanceof MouseEventClone && event.movementX && event.relatedTarget) {
57 if (event.cancelable) event.preventDefault(); // 告知另一端
58 relatedTargetMap.set(event.movementX, event.relatedTarget);
59 } else if (event instanceof CustomEventClone) {
60 this.messageHandle(event.detail, new CustomEventPostMessage(this));
61 }
62 });
63 const ev = createMouseEvent(this.sendFlag, {
64 movementX: 0,
65 cancelable: true,
66 });
67 // 如另一端已准备好,则 setReady()
68 if (pageDispatchEvent(ev) === false) this.readyWrap.setReady();
69 }
70
71 messageHandle(data: WindowMessageBody, target: PostMessage) {
72 // 处理消息
73 if (data.type === "sendMessage") {
74 // 接收到消息
75 this.EE.emit("message", data.data, (resp: any) => {
76 // 发送响应消息
77 // 无消息id则不发送响应消息
78 if (!data.messageId) {
79 return;
80 }
81 const body: WindowMessageBody = {
82 messageId: data.messageId,
83 type: "respMessage",
84 data: resp,
85 };
86 target.postMessage(body);
87 });
88 } else if (data.type === "respMessage") {
89 // 接收到响应消息
90 this.EE.emit(`response:${data.messageId}`, data);
91 } else if (data.type === "connect") {
92 this.EE.emit("connect", data.data, new WindowMessageConnect(data.messageId, this.EE, target));

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected