@@ -13,11 +13,17 @@ export class MessageReceiver {
1313 }
1414 > ;
1515 private windowId : string ;
16+ private intent : string | undefined ;
1617
17- constructor ( listenerMap : ReceiverHandlerMap , windowId : string ) {
18+ constructor (
19+ listenerMap : ReceiverHandlerMap ,
20+ windowId : string ,
21+ intent : string | undefined
22+ ) {
1823 this . handlerMap = listenerMap ;
1924 this . pendingTasks = new Map ( ) ;
2025 this . windowId = windowId ;
26+ this . intent = intent ;
2127 }
2228
2329 public receiveMessage ( senderWindow : Window , message : IMCMessage ) {
@@ -39,49 +45,70 @@ export class MessageReceiver {
3945 }
4046
4147 const handler = this . handlerMap . get ( message . type ) ;
42- if ( handler ) {
43- // Create abort controller to listen for abort signal from sender.
44- // Then save the message id and abort controller to the pending tasks.
45- const controller = new AbortController ( ) ;
46- const signal = controller . signal ;
47- this . pendingTasks . set ( message . messageId , {
48- controller,
49- } ) ;
5048
51- const promise = handler ( senderWindow , message , signal ) ;
52- promise
53- . then ( ( result ) => {
54- // Don't send the result if the task has been aborted
55- if ( signal . aborted ) return ;
56-
57- // Acknowledge the sender with the result if the message type is not Acknowledge
58- if ( message . type !== IMCMessageTypeEnum . SignalAcknowledge ) {
59- this . acknowledgeSender (
60- senderWindow ,
61- message . messageId ,
62- message . channelId ,
63- result
64- ) ;
65- }
66- } )
67- . catch ( ( error ) => {
68- // Send the error message to the sender
69- const errMsg : IMCMessage = {
70- messageId : message . messageId ,
71- channelId : message . channelId ,
72- type : IMCMessageTypeEnum . SignalError ,
73- payload : error . message ,
74- from : this . windowId ,
75- } ;
76-
77- console . error ( "Error handling message:" , error ) ;
78-
79- senderWindow . postMessage ( errMsg , "*" ) ;
80- } )
81- . finally ( ( ) => {
82- this . pendingTasks . delete ( message . messageId ) ;
83- } ) ;
49+ if ( ! handler ) {
50+ if ( this . intent === "connection-listener" ) {
51+ // Ignore missing handler for connection listener,
52+ // as it handles connection related messages only.
53+ // There should be another channel created to handle other messages.
54+ return ;
55+ }
56+
57+ console . warn ( `No handler found for message type: ${ message . type } ` ) ;
58+
59+ // Ignore the message if no handler is found
60+ this . ignoreSender ( senderWindow , message ) ;
61+
62+ return ;
8463 }
64+
65+ // Create abort controller to listen for abort signal from sender.
66+ // Then save the message id and abort controller to the pending tasks.
67+ const controller = new AbortController ( ) ;
68+ const signal = controller . signal ;
69+ this . pendingTasks . set ( message . messageId , {
70+ controller,
71+ } ) ;
72+
73+ const promise = handler ( senderWindow , message , signal ) ;
74+ promise
75+ . then ( ( result ) => {
76+ // Don't send the result if the task has been aborted
77+ if ( signal . aborted ) return ;
78+
79+ // Acknowledge the sender with the result if the message type is not Acknowledge
80+ if ( message . type !== IMCMessageTypeEnum . SignalAcknowledge ) {
81+ this . acknowledgeSender (
82+ senderWindow ,
83+ message . messageId ,
84+ message . channelId ,
85+ result
86+ ) ;
87+ }
88+ } )
89+ . catch ( ( error ) => {
90+ if ( error . message === "Message ignored by receiver" ) {
91+ // Ignore the message if no handler is found
92+ this . ignoreSender ( senderWindow , message ) ;
93+ return ;
94+ }
95+
96+ // Send the error message to the sender
97+ const errMsg : IMCMessage = {
98+ messageId : message . messageId ,
99+ channelId : message . channelId ,
100+ type : IMCMessageTypeEnum . SignalError ,
101+ payload : error . message ,
102+ from : this . windowId ,
103+ } ;
104+
105+ console . error ( "Error handling message:" , error ) ;
106+
107+ senderWindow . postMessage ( errMsg , "*" ) ;
108+ } )
109+ . finally ( ( ) => {
110+ this . pendingTasks . delete ( message . messageId ) ;
111+ } ) ;
85112 }
86113
87114 private acknowledgeSender (
@@ -99,4 +126,18 @@ export class MessageReceiver {
99126 } ;
100127 senderWindow . postMessage ( message , "*" ) ;
101128 }
129+
130+ private ignoreSender ( senderWindow : Window , message : IMCMessage ) {
131+ // Ignore the message if no handler is found
132+ senderWindow . postMessage (
133+ {
134+ messageId : message . messageId ,
135+ channelId : message . channelId ,
136+ type : IMCMessageTypeEnum . SignalIgnore ,
137+ payload : `No handler for message type: ${ message . type } ` ,
138+ from : this . windowId ,
139+ } as IMCMessage ,
140+ "*"
141+ ) ;
142+ }
102143}
0 commit comments