@pulse-editor/shared-utils 0.1.1-alpha.51 → 0.1.1-alpha.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,9 @@ export declare class MessageReceiver {
3
3
  private handlerMap;
4
4
  private pendingTasks;
5
5
  private windowId;
6
- constructor(listenerMap: ReceiverHandlerMap, windowId: string);
6
+ private intent;
7
+ constructor(listenerMap: ReceiverHandlerMap, windowId: string, intent: string | undefined);
7
8
  receiveMessage(senderWindow: Window, message: IMCMessage): void;
8
9
  private acknowledgeSender;
10
+ private ignoreSender;
9
11
  }
package/dist/main.js CHANGED
@@ -57,8 +57,7 @@ var IMCMessageTypeEnum;
57
57
  IMCMessageTypeEnum["PlatformFileUpdate"] = "platform-file-update";
58
58
  // #endregion
59
59
  // #region Signal messages
60
- IMCMessageTypeEnum["SignalGetWindowId"] = "signal-get-window-id";
61
- IMCMessageTypeEnum["SignalReturnWindowId"] = "signal-return-window-id";
60
+ IMCMessageTypeEnum["SignalRequestOtherWindowId"] = "signal-request-other-window-id";
62
61
  // A message to notify sender that the message
63
62
  // has been received and finished processing
64
63
  IMCMessageTypeEnum["SignalAcknowledge"] = "signal-acknowledge";
@@ -66,6 +65,8 @@ var IMCMessageTypeEnum;
66
65
  IMCMessageTypeEnum["SignalAbort"] = "signal-abort";
67
66
  // Error
68
67
  IMCMessageTypeEnum["SignalError"] = "signal-error";
68
+ // Ignore
69
+ IMCMessageTypeEnum["SignalIgnore"] = "signal-ignore";
69
70
  // #endregion
70
71
  })(IMCMessageTypeEnum || (IMCMessageTypeEnum = {}));
71
72
  var ViewModeEnum;
@@ -112,10 +113,11 @@ var AccessEnum;
112
113
  // }
113
114
 
114
115
  class MessageReceiver {
115
- constructor(listenerMap, windowId) {
116
+ constructor(listenerMap, windowId, intent) {
116
117
  this.handlerMap = listenerMap;
117
118
  this.pendingTasks = new Map();
118
119
  this.windowId = windowId;
120
+ this.intent = intent;
119
121
  }
120
122
  receiveMessage(senderWindow, message) {
121
123
  // Not handling messages from self
@@ -133,41 +135,56 @@ class MessageReceiver {
133
135
  return;
134
136
  }
135
137
  const handler = this.handlerMap.get(message.type);
136
- if (handler) {
137
- // Create abort controller to listen for abort signal from sender.
138
- // Then save the message id and abort controller to the pending tasks.
139
- const controller = new AbortController();
140
- const signal = controller.signal;
141
- this.pendingTasks.set(message.messageId, {
142
- controller,
143
- });
144
- const promise = handler(senderWindow, message, signal);
145
- promise
146
- .then((result) => {
147
- // Don't send the result if the task has been aborted
148
- if (signal.aborted)
149
- return;
150
- // Acknowledge the sender with the result if the message type is not Acknowledge
151
- if (message.type !== IMCMessageTypeEnum.SignalAcknowledge) {
152
- this.acknowledgeSender(senderWindow, message.messageId, message.channelId, result);
153
- }
154
- })
155
- .catch((error) => {
156
- // Send the error message to the sender
157
- const errMsg = {
158
- messageId: message.messageId,
159
- channelId: message.channelId,
160
- type: IMCMessageTypeEnum.SignalError,
161
- payload: error.message,
162
- from: this.windowId,
163
- };
164
- console.error("Error handling message:", error);
165
- senderWindow.postMessage(errMsg, "*");
166
- })
167
- .finally(() => {
168
- this.pendingTasks.delete(message.messageId);
169
- });
138
+ if (!handler) {
139
+ if (this.intent === "connection-listener") {
140
+ // Ignore missing handler for connection listener,
141
+ // as it handles connection related messages only.
142
+ // There should be another channel created to handle other messages.
143
+ return;
144
+ }
145
+ console.warn(`No handler found for message type: ${message.type}`);
146
+ // Ignore the message if no handler is found
147
+ this.ignoreSender(senderWindow, message);
148
+ return;
170
149
  }
150
+ // Create abort controller to listen for abort signal from sender.
151
+ // Then save the message id and abort controller to the pending tasks.
152
+ const controller = new AbortController();
153
+ const signal = controller.signal;
154
+ this.pendingTasks.set(message.messageId, {
155
+ controller,
156
+ });
157
+ const promise = handler(senderWindow, message, signal);
158
+ promise
159
+ .then((result) => {
160
+ // Don't send the result if the task has been aborted
161
+ if (signal.aborted)
162
+ return;
163
+ // Acknowledge the sender with the result if the message type is not Acknowledge
164
+ if (message.type !== IMCMessageTypeEnum.SignalAcknowledge) {
165
+ this.acknowledgeSender(senderWindow, message.messageId, message.channelId, result);
166
+ }
167
+ })
168
+ .catch((error) => {
169
+ if (error.message === "Message ignored by receiver") {
170
+ // Ignore the message if no handler is found
171
+ this.ignoreSender(senderWindow, message);
172
+ return;
173
+ }
174
+ // Send the error message to the sender
175
+ const errMsg = {
176
+ messageId: message.messageId,
177
+ channelId: message.channelId,
178
+ type: IMCMessageTypeEnum.SignalError,
179
+ payload: error.message,
180
+ from: this.windowId,
181
+ };
182
+ console.error("Error handling message:", error);
183
+ senderWindow.postMessage(errMsg, "*");
184
+ })
185
+ .finally(() => {
186
+ this.pendingTasks.delete(message.messageId);
187
+ });
171
188
  }
172
189
  acknowledgeSender(senderWindow, messageId, channelId, payload) {
173
190
  const message = {
@@ -179,6 +196,16 @@ class MessageReceiver {
179
196
  };
180
197
  senderWindow.postMessage(message, "*");
181
198
  }
199
+ ignoreSender(senderWindow, message) {
200
+ // Ignore the message if no handler is found
201
+ senderWindow.postMessage({
202
+ messageId: message.messageId,
203
+ channelId: message.channelId,
204
+ type: IMCMessageTypeEnum.SignalIgnore,
205
+ payload: `No handler for message type: ${message.type}`,
206
+ from: this.windowId,
207
+ }, "*");
208
+ }
182
209
  }
183
210
 
184
211
  var byteToHex = [];
@@ -315,28 +342,31 @@ class InterModuleCommunication {
315
342
  }
316
343
  this.thisWindowId = thisWindowId;
317
344
  this.receiverHandlerMap = new Map();
318
- const receiver = new MessageReceiver(this.receiverHandlerMap, this.thisWindowId);
345
+ const receiver = new MessageReceiver(this.receiverHandlerMap, this.thisWindowId, this.intent);
319
346
  this.receiver = receiver;
320
347
  this.messageRecords = new Map();
321
348
  this.listener = (event) => {
322
- const messageId = event.data.messageId;
323
- const channelId = event.data.channelId;
324
- const type = event.data.type;
349
+ const message = event.data;
350
+ const messageId = message.messageId;
351
+ const channelId = message.channelId;
352
+ const type = message.type;
325
353
  // Return if the channel ID exists but does not match the current channel ID
326
- if (this.channelId !== undefined && channelId !== this.channelId) {
354
+ // (channel ID can be undefined during initial handshake)
355
+ if (this.channelId !== undefined &&
356
+ channelId !== undefined &&
357
+ channelId !== this.channelId) {
327
358
  return;
328
359
  }
329
360
  if (this.messageRecords?.has(messageId) &&
330
- type !== IMCMessageTypeEnum.SignalGetWindowId) {
331
- console.warn(`[${this.thisWindowId}]: Duplicate message received with message ID: ${messageId}. Ignoring this message. Message: ${JSON.stringify(event.data)}`);
361
+ type !== IMCMessageTypeEnum.SignalRequestOtherWindowId) {
362
+ console.warn(`[${this.thisWindowId}]: Duplicate message received with message ID: ${messageId}. Ignoring this message. Message: ${JSON.stringify(message)}`);
332
363
  return;
333
364
  }
334
- this.messageRecords?.set(messageId, event.data);
365
+ this.messageRecords?.set(messageId, message);
335
366
  if (!receiver) {
336
367
  throw new Error("Receiver not initialized at module " + this.thisWindowId);
337
368
  }
338
- const message = event.data;
339
- if (message.from !== undefined) {
369
+ if (message.from !== undefined && message.type !== IMCMessageTypeEnum.SignalIgnore) {
340
370
  console.log(`Module ${this.thisWindowId} received message from module ${message.from}:\n ${JSON.stringify(message)}`);
341
371
  }
342
372
  if (otherWindowId && message.from !== otherWindowId) {
@@ -361,7 +391,7 @@ class InterModuleCommunication {
361
391
  throw new Error("You must initialize the current window first.");
362
392
  }
363
393
  const message = event.data;
364
- const otherWindowId = message.windowId;
394
+ const otherWindowId = message.payload;
365
395
  this.otherWindowId = otherWindowId;
366
396
  const sender = new MessageSender(window, messageTimeout, this.thisWindowId, this.channelId);
367
397
  this.sender = sender;
@@ -377,7 +407,7 @@ class InterModuleCommunication {
377
407
  });
378
408
  this.otherWindow = window;
379
409
  this.otherWindow.postMessage({
380
- type: IMCMessageTypeEnum.SignalGetWindowId,
410
+ type: IMCMessageTypeEnum.SignalRequestOtherWindowId,
381
411
  from: this.thisWindowId,
382
412
  }, "*");
383
413
  });
@@ -436,22 +466,21 @@ class InterModuleCommunication {
436
466
  }
437
467
  });
438
468
  // Set get window ID handler in the receiver handler map.
439
- this.receiverHandlerMap?.set(IMCMessageTypeEnum.SignalGetWindowId, async (senderWindow, message) => {
469
+ this.receiverHandlerMap?.set(IMCMessageTypeEnum.SignalRequestOtherWindowId, async (senderWindow, message) => {
440
470
  console.log("Received window ID request. Sending current window ID to other window: ");
441
471
  const id = this.thisWindowId;
442
472
  if (!id) {
443
473
  throw new Error("This window ID is not defined.");
444
474
  }
445
- const msg = {
446
- messageId: message.messageId,
447
- channelId: message.channelId,
448
- type: IMCMessageTypeEnum.SignalReturnWindowId,
449
- payload: {
450
- windowId: id,
451
- },
452
- from: id,
453
- };
454
- senderWindow.postMessage(msg, "*");
475
+ return id;
476
+ });
477
+ // Handle ignore signal
478
+ this.receiverHandlerMap?.set(IMCMessageTypeEnum.SignalIgnore, async (senderWindow, message) => {
479
+ console.warn(`Message ignored by receiver. Message ID: ${message.messageId}, Payload: ${message.payload}`);
480
+ const pendingMessage = this.sender?.getPendingMessage(message.messageId);
481
+ if (pendingMessage) {
482
+ pendingMessage.reject(new Error("Message ignored by receiver"));
483
+ }
455
484
  });
456
485
  }
457
486
  }
@@ -479,7 +508,24 @@ class PolyIMC {
479
508
  if (!channels) {
480
509
  throw new Error("Channel not found for window ID " + targetWindowId);
481
510
  }
482
- const results = await Promise.all(channels.map(async (channel) => await channel.sendMessage(handlingType, payload, abortSignal)));
511
+ // - some channels here are not returning results
512
+ // - and the result now is an array instead of a single value
513
+ const results = [];
514
+ await Promise.all(channels.map(async (channel) => {
515
+ try {
516
+ const result = await channel.sendMessage(handlingType, payload, abortSignal);
517
+ results.push(result);
518
+ }
519
+ catch (error) {
520
+ // TODO: better ignore handling
521
+ if (error.message === "Message ignored by receiver") {
522
+ console.warn(`Message ignored by receiver (window ID ${targetWindowId})`, error);
523
+ // nothing returned, nothing pushed — completely skipped
524
+ return;
525
+ }
526
+ throw error; // rethrow real errors
527
+ }
528
+ }));
483
529
  return results;
484
530
  }
485
531
  updateBaseReceiverHandlerMap(handlerMap) {
@@ -575,7 +621,7 @@ class ConnectionListener {
575
621
  [
576
622
  IMCMessageTypeEnum.AppReady,
577
623
  async (senderWindow, message, abortSignal) => {
578
- this.handleExtReady(senderWindow, message, abortSignal);
624
+ await this.handleExtReady(senderWindow, message, abortSignal);
579
625
  },
580
626
  ],
581
627
  ]));
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":["../src/types/constants.ts","../src/types/types.ts","../src/imc/message-receiver.ts","../../../node_modules/uuid/dist/stringify.js","../../../node_modules/uuid/dist/rng.js","../../../node_modules/uuid/dist/native.js","../../../node_modules/uuid/dist/v4.js","../src/imc/message-sender.ts","../src/imc/inter-module-communication.ts","../src/imc/poly-imc.ts"],"sourcesContent":["export const messageTimeout = 300000;\r\n","// #region Inter-Module Communication\r\n/* Inter Module Communication messages */\r\nexport enum IMCMessageTypeEnum {\r\n // #region AI modality tools\r\n ModalityVAD = \"modality-vad\",\r\n ModalitySTT = \"modality-stt\",\r\n ModalityLLM = \"modality-llm\",\r\n ModalityTTS = \"modality-tts\",\r\n ModalitySpeech2Speech = \"modality-speech-to-speech\",\r\n // TODO: Do not use UseX2Y or Use__Gen in the future.\r\n // Instead, use a common AI IO adapter.\r\n ModalityImageGen = \"modality-image-gen\",\r\n ModalityVideoGen = \"modality-video-gen\",\r\n ModalityOCR = \"modality-ocr\",\r\n ModalityMusicGen = \"modality-music-gen\",\r\n // #endregion\r\n\r\n // #region App states\r\n // Notify Pulse that app window is available\r\n AppReady = \"app-ready\",\r\n // Notify Pulse that aoo is closing\r\n AppClose = \"app-close\",\r\n // #endregion\r\n\r\n // #region Editor states\r\n // Notify editor that app is loading or loaded\r\n EditorLoadingApp = \"editor-loading-app\",\r\n // App actions\r\n EditorRegisterAction = \"editor-register-action\",\r\n EditorRunAppAction = \"editor-run-app-action\",\r\n // Execute agent method\r\n EditorRunAgentMethod = \"editor-run-agent-method\",\r\n // Get theme\r\n EditorThemeUpdate = \"editor-theme-update\",\r\n EditorAppRequestTheme = \"editor-app-request-theme\",\r\n // Send notification\r\n EditorShowNotification = \"editor-show-notification\",\r\n // Get environment variables\r\n EditorGetEnv = \"editor-get-env\",\r\n // App state snapshot upon importing & exporting\r\n EditorAppStateSnapshotRestore = \"editor-app-state-snapshot-restore\",\r\n EditorAppStateSnapshotSave = \"editor-app-state-snapshot-save\",\r\n // Handle editor file selection or drop\r\n EditorAppReceiveFileUri = \"editor-app-receive-file-uri\",\r\n // App uses owned app\r\n EditorAppUseOwnedApp = \"editor-app-use-owned-app\",\r\n // #endregion\r\n\r\n // #region Platform API interaction messages (require OS-like environment)\r\n /* Terminal */\r\n PlatformCreateTerminal = \"platform-create-terminal\",\r\n // Update view file\r\n PlatformWriteFile = \"platform-write-file\",\r\n // Request view file\r\n PlatformReadFile = \"platform-read-file\",\r\n // File update (file watch notification from platform to view)\r\n PlatformFileUpdate = \"platform-file-update\",\r\n // #endregion\r\n\r\n // #region Signal messages\r\n SignalGetWindowId = \"signal-get-window-id\",\r\n SignalReturnWindowId = \"signal-return-window-id\",\r\n // A message to notify sender that the message\r\n // has been received and finished processing\r\n SignalAcknowledge = \"signal-acknowledge\",\r\n // Notify abort\r\n SignalAbort = \"signal-abort\",\r\n // Error\r\n SignalError = \"signal-error\",\r\n // #endregion\r\n}\r\n\r\nexport type IMCMessage = {\r\n messageId: string;\r\n channelId?: string;\r\n from: string;\r\n type: IMCMessageTypeEnum;\r\n payload?: any;\r\n};\r\n\r\nexport type ReceiverHandler = (\r\n senderWindow: Window,\r\n message: IMCMessage,\r\n abortSignal?: AbortSignal\r\n) => Promise<any>;\r\n\r\n// IMC receiver handler map\r\nexport type ReceiverHandlerMap = Map<IMCMessageTypeEnum, ReceiverHandler>;\r\n// #endregion\r\n\r\n/* File view */\r\nexport type TextFileSelection = {\r\n lineStart: number;\r\n lineEnd: number;\r\n text: string;\r\n};\r\n\r\nexport type ViewModel = {\r\n viewId: string;\r\n appConfig?: AppConfig;\r\n};\r\n\r\nexport enum ViewModeEnum {\r\n App = \"app\",\r\n Canvas = \"canvas\",\r\n Home = \"home\",\r\n}\r\n\r\n/* Fetch API */\r\nexport type FetchPayload = {\r\n uri: string;\r\n options?: RequestInit;\r\n};\r\n\r\n/* Notification */\r\nexport enum NotificationTypeEnum {\r\n Success = \"success\",\r\n Error = \"error\",\r\n Info = \"info\",\r\n Warning = \"warning\",\r\n}\r\n\r\n// #region App settings\r\nexport enum AppTypeEnum {\r\n Generic = \"generic\",\r\n FileView = \"file-view\",\r\n ConsoleView = \"console-view\",\r\n}\r\n\r\nexport type AppConfig = {\r\n id: string;\r\n version: string;\r\n libVersion?: string;\r\n visibility?: \"public\" | \"private\" | \"unlisted\";\r\n author?: string;\r\n displayName?: string;\r\n description?: string;\r\n materialIcon?: string;\r\n appType?: AppTypeEnum;\r\n fileTypes?: string[];\r\n thumbnail?: string;\r\n enabledPlatforms?: Record<string, boolean>;\r\n\r\n // App installed agents\r\n agents?: Agent[];\r\n // Exposed actions in the modular app\r\n preRegisteredActions?: Action[];\r\n // Recommended dimensions for app view in canvas\r\n recommendedHeight?: number;\r\n recommendedWidth?: number;\r\n};\r\n\r\nexport type Action = {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, TypedVariable>;\r\n returns: Record<string, TypedVariable>;\r\n handler?: (args: any) => Promise<any>;\r\n};\r\n// #endregion\r\n\r\n// #region Agent config\r\nexport type Agent = {\r\n name: string;\r\n version: string;\r\n systemPrompt: string;\r\n availableMethods: AgentMethod[];\r\n description: string;\r\n tools?: AgentTool[];\r\n LLMConfig?: LLMConfig;\r\n};\r\n\r\n/**\r\n * An agent method is a sub task that an agent can perform.\r\n */\r\nexport type AgentMethod = {\r\n access: AccessEnum;\r\n name: string;\r\n parameters: Record<string, TypedVariable>;\r\n prompt: string;\r\n returns: Record<string, TypedVariable>;\r\n // If this config does not exist, use the class's LLMConfig\r\n LLMConfig?: LLMConfig;\r\n};\r\n\r\nexport type TypedVariable = {\r\n type: TypedVariableType;\r\n // Describe the variable for LLM to better understand it\r\n description: string;\r\n optional?: boolean;\r\n defaultValue?: any;\r\n};\r\n\r\n/**\r\n * A tool that agent can use during method execution.\r\n *\r\n *\r\n * The tool may optionally return a value to the agent.\r\n */\r\nexport type AgentTool = {\r\n access: AccessEnum;\r\n name: string;\r\n description: string;\r\n parameters: Record<string, TypedVariable>;\r\n returns: Record<string, TypedVariable>;\r\n};\r\n// #endregion\r\n\r\nexport type TypedVariableType =\r\n | \"string\"\r\n | \"number\"\r\n | \"boolean\"\r\n | \"any\"\r\n // An app instance is a reference to another app.\r\n // This instance could be possessed by the owner,\r\n // or it can be initialized by the caller.\r\n | \"app-instance\"\r\n | TypedVariableObjectType\r\n | TypedVariableArrayType;\r\n\r\nexport type TypedVariableObjectType = {\r\n [key: string]: TypedVariable;\r\n};\r\n\r\nexport type TypedVariableArrayType = [TypedVariableType];\r\n\r\nexport function isArrayType(\r\n value: TypedVariableType\r\n): value is TypedVariableArrayType {\r\n return Array.isArray(value) && value.length === 1;\r\n}\r\n\r\nexport function isObjectType(\r\n value: TypedVariableType\r\n): value is TypedVariableObjectType {\r\n return typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nexport enum AccessEnum {\r\n public = \"public\",\r\n private = \"private\",\r\n}\r\n\r\n// #region AI settings\r\nexport type STTConfig = {\r\n provider: string;\r\n modelName: string;\r\n};\r\n\r\nexport type LLMConfig = {\r\n provider: string;\r\n modelName: string;\r\n temperature: number;\r\n};\r\n\r\nexport type TTSConfig = {\r\n provider: string;\r\n modelName: string;\r\n voice: string;\r\n};\r\n\r\nexport type ImageModelConfig = {\r\n provider: string;\r\n modelName: string;\r\n};\r\n\r\nexport type VideoModelConfig = {\r\n provider: string;\r\n modelName: string;\r\n};\r\n// #endregion\r\n\r\n// TODO: In the future, add a common AI IO adapter\r\n// where the input and output types are arbitrary\r\n// modalities. So we can plug in any AI model,\r\n// or even a program, for either input or output.\r\n// e.g. similar to how a function works.\r\n// export type FuncAdapter = {\r\n// input:\r\n// output:\r\n// }\r\n","import {\r\n IMCMessage,\r\n IMCMessageTypeEnum,\r\n ReceiverHandlerMap,\r\n} from \"../types/types\";\r\n\r\nexport class MessageReceiver {\r\n private handlerMap: ReceiverHandlerMap;\r\n private pendingTasks: Map<\r\n string,\r\n {\r\n controller: AbortController;\r\n }\r\n >;\r\n private windowId: string;\r\n\r\n constructor(listenerMap: ReceiverHandlerMap, windowId: string) {\r\n this.handlerMap = listenerMap;\r\n this.pendingTasks = new Map();\r\n this.windowId = windowId;\r\n }\r\n\r\n public receiveMessage(senderWindow: Window, message: IMCMessage) {\r\n // Not handling messages from self\r\n if (this.windowId === message.from) return;\r\n\r\n // Abort the task if the message type is Abort\r\n if (message.type === IMCMessageTypeEnum.SignalAbort) {\r\n const id = message.messageId;\r\n const pendingTask = this.pendingTasks.get(id);\r\n\r\n if (pendingTask) {\r\n console.log(\"Aborting task\", id);\r\n pendingTask.controller.abort();\r\n this.pendingTasks.delete(id);\r\n }\r\n\r\n return;\r\n }\r\n\r\n const handler = this.handlerMap.get(message.type);\r\n if (handler) {\r\n // Create abort controller to listen for abort signal from sender.\r\n // Then save the message id and abort controller to the pending tasks.\r\n const controller = new AbortController();\r\n const signal = controller.signal;\r\n this.pendingTasks.set(message.messageId, {\r\n controller,\r\n });\r\n\r\n const promise = handler(senderWindow, message, signal);\r\n promise\r\n .then((result) => {\r\n // Don't send the result if the task has been aborted\r\n if (signal.aborted) return;\r\n\r\n // Acknowledge the sender with the result if the message type is not Acknowledge\r\n if (message.type !== IMCMessageTypeEnum.SignalAcknowledge) {\r\n this.acknowledgeSender(\r\n senderWindow,\r\n message.messageId,\r\n message.channelId,\r\n result\r\n );\r\n }\r\n })\r\n .catch((error) => {\r\n // Send the error message to the sender\r\n const errMsg: IMCMessage = {\r\n messageId: message.messageId,\r\n channelId: message.channelId,\r\n type: IMCMessageTypeEnum.SignalError,\r\n payload: error.message,\r\n from: this.windowId,\r\n };\r\n\r\n console.error(\"Error handling message:\", error);\r\n\r\n senderWindow.postMessage(errMsg, \"*\");\r\n })\r\n .finally(() => {\r\n this.pendingTasks.delete(message.messageId);\r\n });\r\n }\r\n }\r\n\r\n private acknowledgeSender(\r\n senderWindow: Window,\r\n messageId: string,\r\n channelId: string | undefined,\r\n payload: any\r\n ): void {\r\n const message: IMCMessage = {\r\n messageId: messageId,\r\n channelId: channelId,\r\n type: IMCMessageTypeEnum.SignalAcknowledge,\r\n payload: payload,\r\n from: this.windowId,\r\n };\r\n senderWindow.postMessage(message, \"*\");\r\n }\r\n}\r\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","import { v4 } from \"uuid\";\r\nimport { IMCMessage, IMCMessageTypeEnum } from \"../types/types\";\r\n\r\nexport class MessageSender {\r\n private targetWindow: Window;\r\n private timeout: number;\r\n\r\n private pendingMessages: Map<\r\n string,\r\n { resolve: (value: any) => void; reject: (reason: any) => void }\r\n >;\r\n\r\n private moduleId: string;\r\n private channelId: string | undefined;\r\n\r\n constructor(\r\n targetWindow: Window,\r\n timeout: number,\r\n moduleId: string,\r\n channelId?: string\r\n ) {\r\n this.targetWindow = targetWindow;\r\n this.timeout = timeout;\r\n\r\n this.pendingMessages = new Map();\r\n this.moduleId = moduleId;\r\n this.channelId = channelId;\r\n }\r\n\r\n public async sendMessage(\r\n handlingType: IMCMessageTypeEnum,\r\n payload?: any,\r\n abortSignal?: AbortSignal\r\n ): Promise<any> {\r\n // Generate a unique id for the message using timestamp\r\n const id = v4() + new Date().getTime().toString();\r\n const message: IMCMessage = {\r\n messageId: id,\r\n channelId: this.channelId,\r\n type: handlingType,\r\n payload: payload,\r\n from: this.moduleId,\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n // If the signal is already aborted, reject immediately\r\n if (abortSignal?.aborted) {\r\n return reject(new Error(\"Request aborted\"));\r\n }\r\n\r\n const abortHandler = () => {\r\n this.pendingMessages.delete(id);\r\n // Notify the target window that the request has been aborted\r\n this.targetWindow.postMessage(\r\n {\r\n id,\r\n type: IMCMessageTypeEnum.SignalAbort,\r\n payload: JSON.stringify({\r\n status: \"Task aborted\",\r\n data: null,\r\n }),\r\n },\r\n \"*\"\r\n );\r\n reject(new Error(\"Request aborted\"));\r\n };\r\n // Attach abort listener\r\n abortSignal?.addEventListener(\"abort\", abortHandler);\r\n\r\n // Check timeout\r\n const timeoutId = setTimeout(() => {\r\n this.pendingMessages.delete(id);\r\n abortSignal?.removeEventListener(\"abort\", abortHandler);\r\n reject(new Error(\"Communication with Pulse Editor timeout.\"));\r\n }, this.timeout);\r\n // Ensure cleanup on resolution\r\n const onResolve = (value: any) => {\r\n clearTimeout(timeoutId);\r\n abortSignal?.removeEventListener(\"abort\", abortHandler);\r\n this.pendingMessages.delete(id);\r\n resolve(value);\r\n };\r\n\r\n const onReject = (reason: any) => {\r\n clearTimeout(timeoutId);\r\n abortSignal?.removeEventListener(\"abort\", abortHandler);\r\n this.pendingMessages.delete(id);\r\n reject(reason);\r\n };\r\n this.pendingMessages.set(id, {\r\n resolve: onResolve,\r\n reject: onReject,\r\n });\r\n\r\n // Send message\r\n this.targetWindow.postMessage(message, \"*\");\r\n });\r\n }\r\n\r\n public getPendingMessage(id: string) {\r\n return this.pendingMessages.get(id);\r\n }\r\n}\r\n","import { messageTimeout } from \"../types/constants\";\r\nimport {\r\n IMCMessage,\r\n IMCMessageTypeEnum,\r\n ReceiverHandlerMap,\r\n} from \"../types/types\";\r\nimport { MessageReceiver } from \"./message-receiver\";\r\nimport { MessageSender } from \"./message-sender\";\r\n\r\nexport class InterModuleCommunication {\r\n private thisWindow: Window | undefined;\r\n private otherWindow: Window | undefined;\r\n\r\n private receiver: MessageReceiver | undefined;\r\n private sender: MessageSender | undefined;\r\n\r\n private thisWindowId: string | undefined;\r\n private otherWindowId: string | undefined;\r\n\r\n private receiverHandlerMap: ReceiverHandlerMap | undefined;\r\n\r\n private listener: ((event: MessageEvent) => void) | undefined;\r\n\r\n private messageRecords: Map<string, IMCMessage> | undefined;\r\n\r\n public intent: string | undefined;\r\n public channelId: string | undefined;\r\n\r\n constructor(intent: string | undefined, channelId: string | undefined) {\r\n this.intent = intent;\r\n this.channelId = channelId;\r\n }\r\n\r\n /**\r\n * Initialize a receiver to receive message.\r\n * @param window The current window.\r\n * @param otherWindowId The ID of the other window. This is optional and can be undefined.\r\n * When defined, the receiver will only receive messages from window with the ID.\r\n */\r\n public initThisWindow(window: Window, otherWindowId?: string) {\r\n this.thisWindow = window;\r\n // @ts-expect-error viewId is injected by the browser\r\n const thisWindowId = window.viewId as string | undefined;\r\n if (!thisWindowId) {\r\n throw new Error(\"Current window's ID is not defined.\");\r\n }\r\n this.thisWindowId = thisWindowId;\r\n\r\n this.receiverHandlerMap = new Map();\r\n\r\n const receiver = new MessageReceiver(\r\n this.receiverHandlerMap,\r\n this.thisWindowId\r\n );\r\n this.receiver = receiver;\r\n\r\n this.messageRecords = new Map<string, IMCMessage>();\r\n\r\n this.listener = (event: MessageEvent<IMCMessage>) => {\r\n const messageId = event.data.messageId;\r\n const channelId = event.data.channelId;\r\n const type = event.data.type;\r\n\r\n // Return if the channel ID exists but does not match the current channel ID\r\n if (this.channelId !== undefined && channelId !== this.channelId) {\r\n return;\r\n }\r\n\r\n if (\r\n this.messageRecords?.has(messageId) &&\r\n type !== IMCMessageTypeEnum.SignalGetWindowId\r\n ) {\r\n console.warn(\r\n `[${\r\n this.thisWindowId\r\n }]: Duplicate message received with message ID: ${messageId}. Ignoring this message. Message: ${JSON.stringify(\r\n event.data\r\n )}`\r\n );\r\n return;\r\n }\r\n this.messageRecords?.set(messageId, event.data);\r\n\r\n if (!receiver) {\r\n throw new Error(\r\n \"Receiver not initialized at module \" + this.thisWindowId\r\n );\r\n }\r\n\r\n const message = event.data;\r\n if (message.from !== undefined) {\r\n console.log(\r\n `Module ${this.thisWindowId} received message from module ${\r\n message.from\r\n }:\\n ${JSON.stringify(message)}`\r\n );\r\n }\r\n\r\n if (otherWindowId && message.from !== otherWindowId) {\r\n return;\r\n }\r\n const win = event.source as Window;\r\n receiver.receiveMessage(win, message);\r\n };\r\n window.addEventListener(\"message\", this.listener);\r\n console.log(\"Adding IMC listener in \" + this.thisWindowId);\r\n // refresh the receiver handler map\r\n this.setBaseHandler();\r\n }\r\n\r\n /* Initialize a sender to send message ot the other window. */\r\n public async initOtherWindow(window: Window) {\r\n return new Promise<void>((resolve) => {\r\n if (!this.thisWindow || !this.thisWindowId) {\r\n throw new Error(\"You must initialize the current window first.\");\r\n }\r\n\r\n const onReceiveWindowID = (event: MessageEvent) => {\r\n if (!this.thisWindow || !this.thisWindowId) {\r\n throw new Error(\"You must initialize the current window first.\");\r\n }\r\n\r\n const message = event.data;\r\n const otherWindowId = message.windowId;\r\n this.otherWindowId = otherWindowId;\r\n\r\n const sender = new MessageSender(\r\n window,\r\n messageTimeout,\r\n this.thisWindowId,\r\n this.channelId\r\n );\r\n this.sender = sender;\r\n\r\n if (!this.receiverHandlerMap) {\r\n throw new Error(\"You must initialize the current window first.\");\r\n }\r\n\r\n this.setBaseHandler();\r\n resolve();\r\n };\r\n\r\n // Wait for the other window to send its ID.\r\n this.thisWindow.addEventListener(\"message\", onReceiveWindowID, {\r\n once: true,\r\n });\r\n\r\n this.otherWindow = window;\r\n this.otherWindow.postMessage(\r\n {\r\n type: IMCMessageTypeEnum.SignalGetWindowId,\r\n from: this.thisWindowId,\r\n },\r\n \"*\"\r\n );\r\n });\r\n }\r\n\r\n public close() {\r\n if (this.listener) {\r\n window.removeEventListener(\"message\", this.listener);\r\n }\r\n }\r\n\r\n public async sendMessage(\r\n type: IMCMessageTypeEnum,\r\n payload?: any,\r\n abortSignal?: AbortSignal\r\n ): Promise<any> {\r\n const sender = this.sender;\r\n if (!sender) {\r\n throw new Error(\"Sender not initialized\");\r\n }\r\n\r\n return await sender.sendMessage(type, payload, abortSignal);\r\n }\r\n\r\n public updateReceiverHandlerMap(\r\n receiverHandlerMap: ReceiverHandlerMap\r\n ): void {\r\n if (!this.receiver) {\r\n throw new Error(\"Receiver not initialized\");\r\n }\r\n\r\n // Clear all existing handlers except the acknowledgement handler.\r\n this.receiverHandlerMap?.clear();\r\n this.setBaseHandler();\r\n receiverHandlerMap.forEach((value, key) => {\r\n this.receiverHandlerMap?.set(key, value);\r\n });\r\n }\r\n\r\n public getThisWindowId(): string {\r\n if (!this.thisWindowId) {\r\n throw new Error(\"This window ID is not defined.\");\r\n }\r\n return this.thisWindowId;\r\n }\r\n\r\n public getOtherWindowId(): string {\r\n if (!this.otherWindowId) {\r\n throw new Error(\"Other window ID is not defined.\");\r\n }\r\n return this.otherWindowId;\r\n }\r\n\r\n private setBaseHandler() {\r\n // Add an acknowledgement handler in current window's receiver for results of sent messages.\r\n // This is to receive the acknowledgement from the other window, so that we know the other\r\n // window has received the message and finished processing it.\r\n // The current window must be initialized first. i.e. call initThisWindow() before initOtherWindow().\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalAcknowledge,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n const pendingMessage = this.sender?.getPendingMessage(\r\n message.messageId\r\n );\r\n if (pendingMessage) {\r\n pendingMessage.resolve(message.payload);\r\n }\r\n }\r\n );\r\n\r\n // Handle error message from the other window.\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalError,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n const pendingMessage = this.sender?.getPendingMessage(\r\n message.messageId\r\n );\r\n if (pendingMessage) {\r\n pendingMessage.reject(new Error(message.payload));\r\n }\r\n }\r\n );\r\n\r\n // Set get window ID handler in the receiver handler map.\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalGetWindowId,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n console.log(\r\n \"Received window ID request. Sending current window ID to other window: \"\r\n );\r\n const id = this.thisWindowId;\r\n if (!id) {\r\n throw new Error(\"This window ID is not defined.\");\r\n }\r\n const msg: IMCMessage = {\r\n messageId: message.messageId,\r\n channelId: message.channelId,\r\n type: IMCMessageTypeEnum.SignalReturnWindowId,\r\n payload: {\r\n windowId: id,\r\n },\r\n from: id,\r\n };\r\n senderWindow.postMessage(msg, \"*\");\r\n }\r\n );\r\n }\r\n}\r\n","import {\r\n IMCMessage,\r\n IMCMessageTypeEnum,\r\n ReceiverHandler,\r\n ReceiverHandlerMap,\r\n} from \"../types/types\";\r\nimport { InterModuleCommunication } from \"./inter-module-communication\";\r\n\r\n/**\r\n * Poly IMC establishes two-way inter-module communication channels,\r\n * where each channel consists of a sender and a receiver to send and\r\n * receive messages between host window and the other module's window.\r\n *\r\n * This assumes the other window has IMC or Poly-IMC setup.\r\n */\r\nexport class PolyIMC {\r\n // A map that maps the other window ID,\r\n // and IMC between current window and the other window.\r\n private channelsMap: Map<string, InterModuleCommunication[]>;\r\n private baseReceiverHandlerMap: ReceiverHandlerMap;\r\n private channelReceiverHandlerMapMap: Map<string, ReceiverHandlerMap>;\r\n\r\n /**\r\n *\r\n * @param baseReceiverHandlerMap A base receiver handler map for universal handlers.\r\n * E.g. Pulse Editor API handler\r\n */\r\n constructor(baseReceiverHandlerMap: ReceiverHandlerMap) {\r\n this.channelsMap = new Map();\r\n this.baseReceiverHandlerMap = baseReceiverHandlerMap;\r\n this.channelReceiverHandlerMapMap = new Map();\r\n }\r\n\r\n public async sendMessage(\r\n targetWindowId: string,\r\n handlingType: IMCMessageTypeEnum,\r\n payload?: any,\r\n abortSignal?: AbortSignal\r\n ) {\r\n const channels = this.channelsMap.get(targetWindowId);\r\n if (!channels) {\r\n throw new Error(\"Channel not found for window ID \" + targetWindowId);\r\n }\r\n\r\n const results = await Promise.all(\r\n channels.map(\r\n async (channel) =>\r\n await channel.sendMessage(handlingType, payload, abortSignal)\r\n )\r\n );\r\n\r\n return results;\r\n }\r\n\r\n public updateBaseReceiverHandlerMap(handlerMap: ReceiverHandlerMap) {\r\n this.baseReceiverHandlerMap = handlerMap;\r\n this.channelsMap.forEach((channels, key) => {\r\n const combinedMap = this.getCombinedHandlerMap(\r\n this.baseReceiverHandlerMap,\r\n this.channelReceiverHandlerMapMap.get(key)\r\n );\r\n channels.forEach((channel) => {\r\n channel.updateReceiverHandlerMap(combinedMap);\r\n });\r\n });\r\n }\r\n\r\n public updateChannelReceiverHandlerMap(\r\n targetWindowId: string,\r\n handlerMap: ReceiverHandlerMap\r\n ) {\r\n const channels = this.channelsMap.get(targetWindowId);\r\n if (!channels) {\r\n throw new Error(\"Channel not found for window ID \" + targetWindowId);\r\n }\r\n\r\n const combinedMap = this.getCombinedHandlerMap(\r\n this.baseReceiverHandlerMap,\r\n handlerMap\r\n );\r\n\r\n channels.forEach((channel) => {\r\n channel.updateReceiverHandlerMap(combinedMap);\r\n });\r\n\r\n this.channelReceiverHandlerMapMap.set(targetWindowId, handlerMap);\r\n }\r\n\r\n public async createChannel(\r\n targetWindow: Window,\r\n targetWindowId: string,\r\n intent: string,\r\n channelId?: string,\r\n receiverHandlerMap?: ReceiverHandlerMap\r\n ) {\r\n console.log(\"Creating channel for window ID: \" + targetWindowId);\r\n const channel = new InterModuleCommunication(intent, channelId);\r\n channel.initThisWindow(window, targetWindowId);\r\n await channel.initOtherWindow(targetWindow);\r\n\r\n const newChannels = this.channelsMap.get(targetWindowId) ?? [];\r\n // Add to existing channels\r\n newChannels.push(channel);\r\n\r\n this.channelsMap.set(targetWindowId, newChannels);\r\n\r\n // If there is a channel specific receiver handler map,\r\n // combine it with the base receiver handler map.\r\n if (receiverHandlerMap) {\r\n this.updateChannelReceiverHandlerMap(targetWindowId, receiverHandlerMap);\r\n } else {\r\n channel.updateReceiverHandlerMap(this.baseReceiverHandlerMap);\r\n }\r\n }\r\n\r\n public removeWindowChannels(targetWindowId: string) {\r\n const channels = this.channelsMap.get(targetWindowId);\r\n if (!channels) {\r\n throw new Error(\"Channel not found for window ID \" + targetWindowId);\r\n }\r\n\r\n channels.forEach((channel) => {\r\n channel.close();\r\n });\r\n this.channelsMap.delete(targetWindowId);\r\n this.channelReceiverHandlerMapMap.delete(targetWindowId);\r\n }\r\n\r\n public hasChannel(targetWindowId: string): boolean {\r\n return this.channelsMap.has(targetWindowId);\r\n }\r\n\r\n public close() {\r\n this.channelsMap.forEach((channels) =>\r\n channels.forEach((channel) => channel.close())\r\n );\r\n this.channelsMap.clear();\r\n this.channelReceiverHandlerMapMap.clear();\r\n }\r\n\r\n private getCombinedHandlerMap(\r\n map1?: ReceiverHandlerMap,\r\n map2?: ReceiverHandlerMap\r\n ): ReceiverHandlerMap {\r\n if (map1 && map2) {\r\n // Combine two maps\r\n const combinedMap = new Map([...map1, ...map2]);\r\n\r\n return combinedMap;\r\n } else if (map1) {\r\n return map1;\r\n } else if (map2) {\r\n return map2;\r\n } else {\r\n return new Map();\r\n }\r\n }\r\n}\r\n\r\nexport class ConnectionListener {\r\n private polyIMC: PolyIMC;\r\n private newConnectionReceiverHandlerMap: ReceiverHandlerMap;\r\n private onConnection?: (senderWindow: Window, message: IMCMessage) => void;\r\n\r\n private listener: InterModuleCommunication;\r\n\r\n /**\r\n *\r\n * @param polyIMC The polyIMC instance.\r\n * @param newConnectionReceiverHandlerMap Receiver handler map for newly established poly-IMC channel.\r\n * @param onConnection Callback function to be called when a new connection is established.\r\n * @param expectedOtherWindowId Optional expected other window ID to validate incoming connections.\r\n */\r\n constructor(\r\n polyIMC: PolyIMC,\r\n newConnectionReceiverHandlerMap: ReceiverHandlerMap,\r\n onConnection?: (senderWindow: Window, message: IMCMessage) => void,\r\n expectedOtherWindowId?: string\r\n ) {\r\n this.polyIMC = polyIMC;\r\n this.newConnectionReceiverHandlerMap = newConnectionReceiverHandlerMap;\r\n this.onConnection = onConnection;\r\n\r\n const listener = new InterModuleCommunication(\r\n \"connection-listener\",\r\n undefined\r\n );\r\n this.listener = listener;\r\n listener.initThisWindow(window, expectedOtherWindowId);\r\n\r\n listener.updateReceiverHandlerMap(\r\n new Map<IMCMessageTypeEnum, ReceiverHandler>([\r\n [\r\n IMCMessageTypeEnum.AppReady,\r\n async (\r\n senderWindow: Window,\r\n message: IMCMessage,\r\n abortSignal?: AbortSignal\r\n ) => {\r\n this.handleExtReady(senderWindow, message, abortSignal);\r\n },\r\n ],\r\n ])\r\n );\r\n }\r\n\r\n public close() {\r\n this.listener?.close();\r\n }\r\n\r\n public updateReceiverHandlerMap(\r\n newReceiverHandlerMap: ReceiverHandlerMap\r\n ): void {\r\n this.newConnectionReceiverHandlerMap = newReceiverHandlerMap;\r\n }\r\n\r\n private async handleExtReady(\r\n senderWindow: Window,\r\n message: IMCMessage,\r\n abortSignal?: AbortSignal\r\n ) {\r\n const targetWindowId = message.from;\r\n const { intent, channelId }: { intent: string; channelId?: string } =\r\n message.payload;\r\n\r\n if (!channelId) {\r\n throw new Error(\"Channel ID is missing in AppReady message.\");\r\n }\r\n\r\n // Create a new channel for the incoming connection\r\n await this.polyIMC.createChannel(\r\n senderWindow,\r\n targetWindowId,\r\n intent,\r\n channelId,\r\n this.newConnectionReceiverHandlerMap\r\n );\r\n\r\n if (this.onConnection) {\r\n this.onConnection(senderWindow, message);\r\n }\r\n }\r\n}\r\n"],"names":["byteToHex","i","push","toString","slice","unsafeStringify","arr","offset","arguments","length","undefined","toLowerCase","getRandomValues","rnds8","Uint8Array","rng","crypto","Error","bind","randomUUID","_v4","options","buf","_ref","_options$random","_options$rng","_options","rnds","random","call","v4","native"],"mappings":"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","x_google_ignoreList":[3,4,5,6]}
1
+ {"version":3,"file":"main.js","sources":["../src/types/constants.ts","../src/types/types.ts","../src/imc/message-receiver.ts","../../../node_modules/uuid/dist/stringify.js","../../../node_modules/uuid/dist/rng.js","../../../node_modules/uuid/dist/native.js","../../../node_modules/uuid/dist/v4.js","../src/imc/message-sender.ts","../src/imc/inter-module-communication.ts","../src/imc/poly-imc.ts"],"sourcesContent":["export const messageTimeout = 300000;\r\n","// #region Inter-Module Communication\r\n/* Inter Module Communication messages */\r\nexport enum IMCMessageTypeEnum {\r\n // #region AI modality tools\r\n ModalityVAD = \"modality-vad\",\r\n ModalitySTT = \"modality-stt\",\r\n ModalityLLM = \"modality-llm\",\r\n ModalityTTS = \"modality-tts\",\r\n ModalitySpeech2Speech = \"modality-speech-to-speech\",\r\n // TODO: Do not use UseX2Y or Use__Gen in the future.\r\n // Instead, use a common AI IO adapter.\r\n ModalityImageGen = \"modality-image-gen\",\r\n ModalityVideoGen = \"modality-video-gen\",\r\n ModalityOCR = \"modality-ocr\",\r\n ModalityMusicGen = \"modality-music-gen\",\r\n // #endregion\r\n\r\n // #region App states\r\n // Notify Pulse that app window is available\r\n AppReady = \"app-ready\",\r\n // Notify Pulse that aoo is closing\r\n AppClose = \"app-close\",\r\n // #endregion\r\n\r\n // #region Editor states\r\n // Notify editor that app is loading or loaded\r\n EditorLoadingApp = \"editor-loading-app\",\r\n // App actions\r\n EditorRegisterAction = \"editor-register-action\",\r\n EditorRunAppAction = \"editor-run-app-action\",\r\n // Execute agent method\r\n EditorRunAgentMethod = \"editor-run-agent-method\",\r\n // Get theme\r\n EditorThemeUpdate = \"editor-theme-update\",\r\n EditorAppRequestTheme = \"editor-app-request-theme\",\r\n // Send notification\r\n EditorShowNotification = \"editor-show-notification\",\r\n // Get environment variables\r\n EditorGetEnv = \"editor-get-env\",\r\n // App state snapshot upon importing & exporting\r\n EditorAppStateSnapshotRestore = \"editor-app-state-snapshot-restore\",\r\n EditorAppStateSnapshotSave = \"editor-app-state-snapshot-save\",\r\n // Handle editor file selection or drop\r\n EditorAppReceiveFileUri = \"editor-app-receive-file-uri\",\r\n // App uses owned app\r\n EditorAppUseOwnedApp = \"editor-app-use-owned-app\",\r\n // #endregion\r\n\r\n // #region Platform API interaction messages (require OS-like environment)\r\n /* Terminal */\r\n PlatformCreateTerminal = \"platform-create-terminal\",\r\n // Update view file\r\n PlatformWriteFile = \"platform-write-file\",\r\n // Request view file\r\n PlatformReadFile = \"platform-read-file\",\r\n // File update (file watch notification from platform to view)\r\n PlatformFileUpdate = \"platform-file-update\",\r\n // #endregion\r\n\r\n // #region Signal messages\r\n SignalRequestOtherWindowId = \"signal-request-other-window-id\",\r\n // A message to notify sender that the message\r\n // has been received and finished processing\r\n SignalAcknowledge = \"signal-acknowledge\",\r\n // Notify abort\r\n SignalAbort = \"signal-abort\",\r\n // Error\r\n SignalError = \"signal-error\",\r\n // Ignore\r\n SignalIgnore = \"signal-ignore\",\r\n // #endregion\r\n}\r\n\r\nexport type IMCMessage = {\r\n messageId: string;\r\n channelId?: string;\r\n from: string;\r\n type: IMCMessageTypeEnum;\r\n payload?: any;\r\n};\r\n\r\nexport type ReceiverHandler = (\r\n senderWindow: Window,\r\n message: IMCMessage,\r\n abortSignal?: AbortSignal\r\n) => Promise<any>;\r\n\r\n// IMC receiver handler map\r\nexport type ReceiverHandlerMap = Map<IMCMessageTypeEnum, ReceiverHandler>;\r\n// #endregion\r\n\r\n/* File view */\r\nexport type TextFileSelection = {\r\n lineStart: number;\r\n lineEnd: number;\r\n text: string;\r\n};\r\n\r\nexport type ViewModel = {\r\n viewId: string;\r\n appConfig?: AppConfig;\r\n};\r\n\r\nexport enum ViewModeEnum {\r\n App = \"app\",\r\n Canvas = \"canvas\",\r\n Home = \"home\",\r\n}\r\n\r\n/* Fetch API */\r\nexport type FetchPayload = {\r\n uri: string;\r\n options?: RequestInit;\r\n};\r\n\r\n/* Notification */\r\nexport enum NotificationTypeEnum {\r\n Success = \"success\",\r\n Error = \"error\",\r\n Info = \"info\",\r\n Warning = \"warning\",\r\n}\r\n\r\n// #region App settings\r\nexport enum AppTypeEnum {\r\n Generic = \"generic\",\r\n FileView = \"file-view\",\r\n ConsoleView = \"console-view\",\r\n}\r\n\r\nexport type AppConfig = {\r\n id: string;\r\n version: string;\r\n libVersion?: string;\r\n visibility?: \"public\" | \"private\" | \"unlisted\";\r\n author?: string;\r\n displayName?: string;\r\n description?: string;\r\n materialIcon?: string;\r\n appType?: AppTypeEnum;\r\n fileTypes?: string[];\r\n thumbnail?: string;\r\n enabledPlatforms?: Record<string, boolean>;\r\n\r\n // App installed agents\r\n agents?: Agent[];\r\n // Exposed actions in the modular app\r\n preRegisteredActions?: Action[];\r\n // Recommended dimensions for app view in canvas\r\n recommendedHeight?: number;\r\n recommendedWidth?: number;\r\n};\r\n\r\nexport type Action = {\r\n name: string;\r\n description: string;\r\n parameters: Record<string, TypedVariable>;\r\n returns: Record<string, TypedVariable>;\r\n handler?: (args: any) => Promise<any>;\r\n};\r\n// #endregion\r\n\r\n// #region Agent config\r\nexport type Agent = {\r\n name: string;\r\n version: string;\r\n systemPrompt: string;\r\n availableMethods: AgentMethod[];\r\n description: string;\r\n tools?: AgentTool[];\r\n LLMConfig?: LLMConfig;\r\n};\r\n\r\n/**\r\n * An agent method is a sub task that an agent can perform.\r\n */\r\nexport type AgentMethod = {\r\n access: AccessEnum;\r\n name: string;\r\n parameters: Record<string, TypedVariable>;\r\n prompt: string;\r\n returns: Record<string, TypedVariable>;\r\n // If this config does not exist, use the class's LLMConfig\r\n LLMConfig?: LLMConfig;\r\n};\r\n\r\nexport type TypedVariable = {\r\n type: TypedVariableType;\r\n // Describe the variable for LLM to better understand it\r\n description: string;\r\n optional?: boolean;\r\n defaultValue?: any;\r\n};\r\n\r\n/**\r\n * A tool that agent can use during method execution.\r\n *\r\n *\r\n * The tool may optionally return a value to the agent.\r\n */\r\nexport type AgentTool = {\r\n access: AccessEnum;\r\n name: string;\r\n description: string;\r\n parameters: Record<string, TypedVariable>;\r\n returns: Record<string, TypedVariable>;\r\n};\r\n// #endregion\r\n\r\nexport type TypedVariableType =\r\n | \"string\"\r\n | \"number\"\r\n | \"boolean\"\r\n | \"any\"\r\n // An app instance is a reference to another app.\r\n // This instance could be possessed by the owner,\r\n // or it can be initialized by the caller.\r\n | \"app-instance\"\r\n | TypedVariableObjectType\r\n | TypedVariableArrayType;\r\n\r\nexport type TypedVariableObjectType = {\r\n [key: string]: TypedVariable;\r\n};\r\n\r\nexport type TypedVariableArrayType = [TypedVariableType];\r\n\r\nexport function isArrayType(\r\n value: TypedVariableType\r\n): value is TypedVariableArrayType {\r\n return Array.isArray(value) && value.length === 1;\r\n}\r\n\r\nexport function isObjectType(\r\n value: TypedVariableType\r\n): value is TypedVariableObjectType {\r\n return typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nexport enum AccessEnum {\r\n public = \"public\",\r\n private = \"private\",\r\n}\r\n\r\n// #region AI settings\r\nexport type STTConfig = {\r\n provider: string;\r\n modelName: string;\r\n};\r\n\r\nexport type LLMConfig = {\r\n provider: string;\r\n modelName: string;\r\n temperature: number;\r\n};\r\n\r\nexport type TTSConfig = {\r\n provider: string;\r\n modelName: string;\r\n voice: string;\r\n};\r\n\r\nexport type ImageModelConfig = {\r\n provider: string;\r\n modelName: string;\r\n};\r\n\r\nexport type VideoModelConfig = {\r\n provider: string;\r\n modelName: string;\r\n};\r\n// #endregion\r\n\r\n// TODO: In the future, add a common AI IO adapter\r\n// where the input and output types are arbitrary\r\n// modalities. So we can plug in any AI model,\r\n// or even a program, for either input or output.\r\n// e.g. similar to how a function works.\r\n// export type FuncAdapter = {\r\n// input:\r\n// output:\r\n// }\r\n","import {\r\n IMCMessage,\r\n IMCMessageTypeEnum,\r\n ReceiverHandlerMap,\r\n} from \"../types/types\";\r\n\r\nexport class MessageReceiver {\r\n private handlerMap: ReceiverHandlerMap;\r\n private pendingTasks: Map<\r\n string,\r\n {\r\n controller: AbortController;\r\n }\r\n >;\r\n private windowId: string;\r\n private intent: string | undefined;\r\n\r\n constructor(\r\n listenerMap: ReceiverHandlerMap,\r\n windowId: string,\r\n intent: string | undefined\r\n ) {\r\n this.handlerMap = listenerMap;\r\n this.pendingTasks = new Map();\r\n this.windowId = windowId;\r\n this.intent = intent;\r\n }\r\n\r\n public receiveMessage(senderWindow: Window, message: IMCMessage) {\r\n // Not handling messages from self\r\n if (this.windowId === message.from) return;\r\n\r\n // Abort the task if the message type is Abort\r\n if (message.type === IMCMessageTypeEnum.SignalAbort) {\r\n const id = message.messageId;\r\n const pendingTask = this.pendingTasks.get(id);\r\n\r\n if (pendingTask) {\r\n console.log(\"Aborting task\", id);\r\n pendingTask.controller.abort();\r\n this.pendingTasks.delete(id);\r\n }\r\n\r\n return;\r\n }\r\n\r\n const handler = this.handlerMap.get(message.type);\r\n\r\n if (!handler) {\r\n if (this.intent === \"connection-listener\") {\r\n // Ignore missing handler for connection listener,\r\n // as it handles connection related messages only.\r\n // There should be another channel created to handle other messages.\r\n return;\r\n }\r\n\r\n console.warn(`No handler found for message type: ${message.type}`);\r\n\r\n // Ignore the message if no handler is found\r\n this.ignoreSender(senderWindow, message);\r\n\r\n return;\r\n }\r\n\r\n // Create abort controller to listen for abort signal from sender.\r\n // Then save the message id and abort controller to the pending tasks.\r\n const controller = new AbortController();\r\n const signal = controller.signal;\r\n this.pendingTasks.set(message.messageId, {\r\n controller,\r\n });\r\n\r\n const promise = handler(senderWindow, message, signal);\r\n promise\r\n .then((result) => {\r\n // Don't send the result if the task has been aborted\r\n if (signal.aborted) return;\r\n\r\n // Acknowledge the sender with the result if the message type is not Acknowledge\r\n if (message.type !== IMCMessageTypeEnum.SignalAcknowledge) {\r\n this.acknowledgeSender(\r\n senderWindow,\r\n message.messageId,\r\n message.channelId,\r\n result\r\n );\r\n }\r\n })\r\n .catch((error) => {\r\n if (error.message === \"Message ignored by receiver\") {\r\n // Ignore the message if no handler is found\r\n this.ignoreSender(senderWindow, message);\r\n return;\r\n }\r\n\r\n // Send the error message to the sender\r\n const errMsg: IMCMessage = {\r\n messageId: message.messageId,\r\n channelId: message.channelId,\r\n type: IMCMessageTypeEnum.SignalError,\r\n payload: error.message,\r\n from: this.windowId,\r\n };\r\n\r\n console.error(\"Error handling message:\", error);\r\n\r\n senderWindow.postMessage(errMsg, \"*\");\r\n })\r\n .finally(() => {\r\n this.pendingTasks.delete(message.messageId);\r\n });\r\n }\r\n\r\n private acknowledgeSender(\r\n senderWindow: Window,\r\n messageId: string,\r\n channelId: string | undefined,\r\n payload: any\r\n ): void {\r\n const message: IMCMessage = {\r\n messageId: messageId,\r\n channelId: channelId,\r\n type: IMCMessageTypeEnum.SignalAcknowledge,\r\n payload: payload,\r\n from: this.windowId,\r\n };\r\n senderWindow.postMessage(message, \"*\");\r\n }\r\n\r\n private ignoreSender(senderWindow: Window, message: IMCMessage) {\r\n // Ignore the message if no handler is found\r\n senderWindow.postMessage(\r\n {\r\n messageId: message.messageId,\r\n channelId: message.channelId,\r\n type: IMCMessageTypeEnum.SignalIgnore,\r\n payload: `No handler for message type: ${message.type}`,\r\n from: this.windowId,\r\n } as IMCMessage,\r\n \"*\"\r\n );\r\n }\r\n}\r\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n return _v4(options, buf, offset);\n}\nexport default v4;\n","import { v4 } from \"uuid\";\r\nimport { IMCMessage, IMCMessageTypeEnum } from \"../types/types\";\r\n\r\nexport class MessageSender {\r\n private targetWindow: Window;\r\n private timeout: number;\r\n\r\n private pendingMessages: Map<\r\n string,\r\n { resolve: (value: any) => void; reject: (reason: any) => void }\r\n >;\r\n\r\n private moduleId: string;\r\n private channelId: string | undefined;\r\n\r\n constructor(\r\n targetWindow: Window,\r\n timeout: number,\r\n moduleId: string,\r\n channelId?: string\r\n ) {\r\n this.targetWindow = targetWindow;\r\n this.timeout = timeout;\r\n\r\n this.pendingMessages = new Map();\r\n this.moduleId = moduleId;\r\n this.channelId = channelId;\r\n }\r\n\r\n public async sendMessage(\r\n handlingType: IMCMessageTypeEnum,\r\n payload?: any,\r\n abortSignal?: AbortSignal\r\n ): Promise<any> {\r\n // Generate a unique id for the message using timestamp\r\n const id = v4() + new Date().getTime().toString();\r\n const message: IMCMessage = {\r\n messageId: id,\r\n channelId: this.channelId,\r\n type: handlingType,\r\n payload: payload,\r\n from: this.moduleId,\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n // If the signal is already aborted, reject immediately\r\n if (abortSignal?.aborted) {\r\n return reject(new Error(\"Request aborted\"));\r\n }\r\n\r\n const abortHandler = () => {\r\n this.pendingMessages.delete(id);\r\n // Notify the target window that the request has been aborted\r\n this.targetWindow.postMessage(\r\n {\r\n id,\r\n type: IMCMessageTypeEnum.SignalAbort,\r\n payload: JSON.stringify({\r\n status: \"Task aborted\",\r\n data: null,\r\n }),\r\n },\r\n \"*\"\r\n );\r\n reject(new Error(\"Request aborted\"));\r\n };\r\n // Attach abort listener\r\n abortSignal?.addEventListener(\"abort\", abortHandler);\r\n\r\n // Check timeout\r\n const timeoutId = setTimeout(() => {\r\n this.pendingMessages.delete(id);\r\n abortSignal?.removeEventListener(\"abort\", abortHandler);\r\n reject(new Error(\"Communication with Pulse Editor timeout.\"));\r\n }, this.timeout);\r\n // Ensure cleanup on resolution\r\n const onResolve = (value: any) => {\r\n clearTimeout(timeoutId);\r\n abortSignal?.removeEventListener(\"abort\", abortHandler);\r\n this.pendingMessages.delete(id);\r\n resolve(value);\r\n };\r\n\r\n const onReject = (reason: any) => {\r\n clearTimeout(timeoutId);\r\n abortSignal?.removeEventListener(\"abort\", abortHandler);\r\n this.pendingMessages.delete(id);\r\n reject(reason);\r\n };\r\n \r\n this.pendingMessages.set(id, {\r\n resolve: onResolve,\r\n reject: onReject,\r\n });\r\n\r\n // Send message\r\n this.targetWindow.postMessage(message, \"*\");\r\n });\r\n }\r\n\r\n public getPendingMessage(id: string) {\r\n return this.pendingMessages.get(id);\r\n }\r\n}\r\n","import { messageTimeout } from \"../types/constants\";\r\nimport {\r\n IMCMessage,\r\n IMCMessageTypeEnum,\r\n ReceiverHandlerMap,\r\n} from \"../types/types\";\r\nimport { MessageReceiver } from \"./message-receiver\";\r\nimport { MessageSender } from \"./message-sender\";\r\n\r\nexport class InterModuleCommunication {\r\n private thisWindow: Window | undefined;\r\n private otherWindow: Window | undefined;\r\n\r\n private receiver: MessageReceiver | undefined;\r\n private sender: MessageSender | undefined;\r\n\r\n private thisWindowId: string | undefined;\r\n private otherWindowId: string | undefined;\r\n\r\n private receiverHandlerMap: ReceiverHandlerMap | undefined;\r\n\r\n private listener: ((event: MessageEvent) => void) | undefined;\r\n\r\n private messageRecords: Map<string, IMCMessage> | undefined;\r\n\r\n public intent: string | undefined;\r\n public channelId: string | undefined;\r\n\r\n constructor(intent: string | undefined, channelId: string | undefined) {\r\n this.intent = intent;\r\n this.channelId = channelId;\r\n }\r\n\r\n /**\r\n * Initialize a receiver to receive message.\r\n * @param window The current window.\r\n * @param otherWindowId The ID of the other window. This is optional and can be undefined.\r\n * When defined, the receiver will only receive messages from window with the ID.\r\n */\r\n public initThisWindow(window: Window, otherWindowId?: string) {\r\n this.thisWindow = window;\r\n // @ts-expect-error viewId is injected by the browser\r\n const thisWindowId = window.viewId as string | undefined;\r\n if (!thisWindowId) {\r\n throw new Error(\"Current window's ID is not defined.\");\r\n }\r\n this.thisWindowId = thisWindowId;\r\n\r\n this.receiverHandlerMap = new Map();\r\n\r\n const receiver = new MessageReceiver(\r\n this.receiverHandlerMap,\r\n this.thisWindowId,\r\n this.intent\r\n );\r\n this.receiver = receiver;\r\n\r\n this.messageRecords = new Map<string, IMCMessage>();\r\n\r\n this.listener = (event: MessageEvent<IMCMessage>) => {\r\n const message = event.data;\r\n const messageId = message.messageId;\r\n const channelId = message.channelId;\r\n const type = message.type;\r\n\r\n // Return if the channel ID exists but does not match the current channel ID\r\n // (channel ID can be undefined during initial handshake)\r\n if (\r\n this.channelId !== undefined &&\r\n channelId !== undefined &&\r\n channelId !== this.channelId\r\n ) {\r\n return;\r\n }\r\n\r\n if (\r\n this.messageRecords?.has(messageId) &&\r\n type !== IMCMessageTypeEnum.SignalRequestOtherWindowId\r\n ) {\r\n console.warn(\r\n `[${\r\n this.thisWindowId\r\n }]: Duplicate message received with message ID: ${messageId}. Ignoring this message. Message: ${JSON.stringify(\r\n message\r\n )}`\r\n );\r\n return;\r\n }\r\n this.messageRecords?.set(messageId, message);\r\n\r\n if (!receiver) {\r\n throw new Error(\r\n \"Receiver not initialized at module \" + this.thisWindowId\r\n );\r\n }\r\n\r\n if (message.from !== undefined && message.type !== IMCMessageTypeEnum.SignalIgnore) {\r\n console.log(\r\n `Module ${this.thisWindowId} received message from module ${\r\n message.from\r\n }:\\n ${JSON.stringify(message)}`\r\n );\r\n }\r\n\r\n if (otherWindowId && message.from !== otherWindowId) {\r\n return;\r\n }\r\n const win = event.source as Window;\r\n receiver.receiveMessage(win, message);\r\n };\r\n window.addEventListener(\"message\", this.listener);\r\n console.log(\"Adding IMC listener in \" + this.thisWindowId);\r\n // refresh the receiver handler map\r\n this.setBaseHandler();\r\n }\r\n\r\n /* Initialize a sender to send message ot the other window. */\r\n public async initOtherWindow(window: Window) {\r\n return new Promise<void>((resolve) => {\r\n if (!this.thisWindow || !this.thisWindowId) {\r\n throw new Error(\"You must initialize the current window first.\");\r\n }\r\n\r\n const onReceiveWindowID = (event: MessageEvent) => {\r\n if (!this.thisWindow || !this.thisWindowId) {\r\n throw new Error(\"You must initialize the current window first.\");\r\n }\r\n\r\n const message = event.data;\r\n const otherWindowId = message.payload;\r\n this.otherWindowId = otherWindowId;\r\n\r\n const sender = new MessageSender(\r\n window,\r\n messageTimeout,\r\n this.thisWindowId,\r\n this.channelId\r\n );\r\n this.sender = sender;\r\n\r\n if (!this.receiverHandlerMap) {\r\n throw new Error(\"You must initialize the current window first.\");\r\n }\r\n\r\n this.setBaseHandler();\r\n resolve();\r\n };\r\n\r\n // Wait for the other window to send its ID.\r\n this.thisWindow.addEventListener(\"message\", onReceiveWindowID, {\r\n once: true,\r\n });\r\n\r\n this.otherWindow = window;\r\n this.otherWindow.postMessage(\r\n {\r\n type: IMCMessageTypeEnum.SignalRequestOtherWindowId,\r\n from: this.thisWindowId,\r\n },\r\n \"*\"\r\n );\r\n });\r\n }\r\n\r\n public close() {\r\n if (this.listener) {\r\n window.removeEventListener(\"message\", this.listener);\r\n }\r\n }\r\n\r\n public async sendMessage(\r\n type: IMCMessageTypeEnum,\r\n payload?: any,\r\n abortSignal?: AbortSignal\r\n ): Promise<any> {\r\n const sender = this.sender;\r\n if (!sender) {\r\n throw new Error(\"Sender not initialized\");\r\n }\r\n\r\n return await sender.sendMessage(type, payload, abortSignal);\r\n }\r\n\r\n public updateReceiverHandlerMap(\r\n receiverHandlerMap: ReceiverHandlerMap\r\n ): void {\r\n if (!this.receiver) {\r\n throw new Error(\"Receiver not initialized\");\r\n }\r\n\r\n // Clear all existing handlers except the acknowledgement handler.\r\n this.receiverHandlerMap?.clear();\r\n this.setBaseHandler();\r\n receiverHandlerMap.forEach((value, key) => {\r\n this.receiverHandlerMap?.set(key, value);\r\n });\r\n }\r\n\r\n public getThisWindowId(): string {\r\n if (!this.thisWindowId) {\r\n throw new Error(\"This window ID is not defined.\");\r\n }\r\n return this.thisWindowId;\r\n }\r\n\r\n public getOtherWindowId(): string {\r\n if (!this.otherWindowId) {\r\n throw new Error(\"Other window ID is not defined.\");\r\n }\r\n return this.otherWindowId;\r\n }\r\n\r\n private setBaseHandler() {\r\n // Add an acknowledgement handler in current window's receiver for results of sent messages.\r\n // This is to receive the acknowledgement from the other window, so that we know the other\r\n // window has received the message and finished processing it.\r\n // The current window must be initialized first. i.e. call initThisWindow() before initOtherWindow().\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalAcknowledge,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n const pendingMessage = this.sender?.getPendingMessage(\r\n message.messageId\r\n );\r\n if (pendingMessage) {\r\n pendingMessage.resolve(message.payload);\r\n }\r\n }\r\n );\r\n\r\n // Handle error message from the other window.\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalError,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n const pendingMessage = this.sender?.getPendingMessage(\r\n message.messageId\r\n );\r\n if (pendingMessage) {\r\n pendingMessage.reject(new Error(message.payload));\r\n }\r\n }\r\n );\r\n\r\n // Set get window ID handler in the receiver handler map.\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalRequestOtherWindowId,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n console.log(\r\n \"Received window ID request. Sending current window ID to other window: \"\r\n );\r\n const id = this.thisWindowId;\r\n if (!id) {\r\n throw new Error(\"This window ID is not defined.\");\r\n }\r\n\r\n return id;\r\n }\r\n );\r\n\r\n // Handle ignore signal\r\n this.receiverHandlerMap?.set(\r\n IMCMessageTypeEnum.SignalIgnore,\r\n async (senderWindow: Window, message: IMCMessage) => {\r\n console.warn(\r\n `Message ignored by receiver. Message ID: ${message.messageId}, Payload: ${message.payload}`\r\n );\r\n const pendingMessage = this.sender?.getPendingMessage(\r\n message.messageId\r\n );\r\n if (pendingMessage) {\r\n pendingMessage.reject(new Error(\"Message ignored by receiver\"));\r\n }\r\n }\r\n );\r\n }\r\n}\r\n","import {\r\n IMCMessage,\r\n IMCMessageTypeEnum,\r\n ReceiverHandler,\r\n ReceiverHandlerMap,\r\n} from \"../types/types\";\r\nimport { InterModuleCommunication } from \"./inter-module-communication\";\r\n\r\n/**\r\n * Poly IMC establishes two-way inter-module communication channels,\r\n * where each channel consists of a sender and a receiver to send and\r\n * receive messages between host window and the other module's window.\r\n *\r\n * This assumes the other window has IMC or Poly-IMC setup.\r\n */\r\nexport class PolyIMC {\r\n // A map that maps the other window ID,\r\n // and IMC between current window and the other window.\r\n private channelsMap: Map<string, InterModuleCommunication[]>;\r\n private baseReceiverHandlerMap: ReceiverHandlerMap;\r\n private channelReceiverHandlerMapMap: Map<string, ReceiverHandlerMap>;\r\n\r\n /**\r\n *\r\n * @param baseReceiverHandlerMap A base receiver handler map for universal handlers.\r\n * E.g. Pulse Editor API handler\r\n */\r\n constructor(baseReceiverHandlerMap: ReceiverHandlerMap) {\r\n this.channelsMap = new Map();\r\n this.baseReceiverHandlerMap = baseReceiverHandlerMap;\r\n this.channelReceiverHandlerMapMap = new Map();\r\n }\r\n\r\n public async sendMessage(\r\n targetWindowId: string,\r\n handlingType: IMCMessageTypeEnum,\r\n payload?: any,\r\n abortSignal?: AbortSignal\r\n ) {\r\n const channels = this.channelsMap.get(targetWindowId);\r\n if (!channels) {\r\n throw new Error(\"Channel not found for window ID \" + targetWindowId);\r\n }\r\n\r\n // - some channels here are not returning results\r\n // - and the result now is an array instead of a single value\r\n\r\n const results: any[] = [];\r\n\r\n await Promise.all(\r\n channels.map(async (channel) => {\r\n try {\r\n const result = await channel.sendMessage(\r\n handlingType,\r\n payload,\r\n abortSignal\r\n );\r\n results.push(result);\r\n } catch (error: any) {\r\n // TODO: better ignore handling\r\n if (error.message === \"Message ignored by receiver\") {\r\n console.warn(\r\n `Message ignored by receiver (window ID ${targetWindowId})`,\r\n error\r\n );\r\n // nothing returned, nothing pushed — completely skipped\r\n return;\r\n }\r\n throw error; // rethrow real errors\r\n }\r\n })\r\n );\r\n\r\n return results;\r\n }\r\n\r\n public updateBaseReceiverHandlerMap(handlerMap: ReceiverHandlerMap) {\r\n this.baseReceiverHandlerMap = handlerMap;\r\n this.channelsMap.forEach((channels, key) => {\r\n const combinedMap = this.getCombinedHandlerMap(\r\n this.baseReceiverHandlerMap,\r\n this.channelReceiverHandlerMapMap.get(key)\r\n );\r\n channels.forEach((channel) => {\r\n channel.updateReceiverHandlerMap(combinedMap);\r\n });\r\n });\r\n }\r\n\r\n public updateChannelReceiverHandlerMap(\r\n targetWindowId: string,\r\n handlerMap: ReceiverHandlerMap\r\n ) {\r\n const channels = this.channelsMap.get(targetWindowId);\r\n if (!channels) {\r\n throw new Error(\"Channel not found for window ID \" + targetWindowId);\r\n }\r\n\r\n const combinedMap = this.getCombinedHandlerMap(\r\n this.baseReceiverHandlerMap,\r\n handlerMap\r\n );\r\n\r\n channels.forEach((channel) => {\r\n channel.updateReceiverHandlerMap(combinedMap);\r\n });\r\n\r\n this.channelReceiverHandlerMapMap.set(targetWindowId, handlerMap);\r\n }\r\n\r\n public async createChannel(\r\n targetWindow: Window,\r\n targetWindowId: string,\r\n intent: string,\r\n channelId?: string,\r\n receiverHandlerMap?: ReceiverHandlerMap\r\n ) {\r\n console.log(\"Creating channel for window ID: \" + targetWindowId);\r\n const channel = new InterModuleCommunication(intent, channelId);\r\n channel.initThisWindow(window, targetWindowId);\r\n await channel.initOtherWindow(targetWindow);\r\n\r\n const newChannels = this.channelsMap.get(targetWindowId) ?? [];\r\n // Add to existing channels\r\n newChannels.push(channel);\r\n\r\n this.channelsMap.set(targetWindowId, newChannels);\r\n\r\n // If there is a channel specific receiver handler map,\r\n // combine it with the base receiver handler map.\r\n if (receiverHandlerMap) {\r\n this.updateChannelReceiverHandlerMap(targetWindowId, receiverHandlerMap);\r\n } else {\r\n channel.updateReceiverHandlerMap(this.baseReceiverHandlerMap);\r\n }\r\n }\r\n\r\n public removeWindowChannels(targetWindowId: string) {\r\n const channels = this.channelsMap.get(targetWindowId);\r\n if (!channels) {\r\n throw new Error(\"Channel not found for window ID \" + targetWindowId);\r\n }\r\n\r\n channels.forEach((channel) => {\r\n channel.close();\r\n });\r\n this.channelsMap.delete(targetWindowId);\r\n this.channelReceiverHandlerMapMap.delete(targetWindowId);\r\n }\r\n\r\n public hasChannel(targetWindowId: string): boolean {\r\n return this.channelsMap.has(targetWindowId);\r\n }\r\n\r\n public close() {\r\n this.channelsMap.forEach((channels) =>\r\n channels.forEach((channel) => channel.close())\r\n );\r\n this.channelsMap.clear();\r\n this.channelReceiverHandlerMapMap.clear();\r\n }\r\n\r\n private getCombinedHandlerMap(\r\n map1?: ReceiverHandlerMap,\r\n map2?: ReceiverHandlerMap\r\n ): ReceiverHandlerMap {\r\n if (map1 && map2) {\r\n // Combine two maps\r\n const combinedMap = new Map([...map1, ...map2]);\r\n\r\n return combinedMap;\r\n } else if (map1) {\r\n return map1;\r\n } else if (map2) {\r\n return map2;\r\n } else {\r\n return new Map();\r\n }\r\n }\r\n}\r\n\r\nexport class ConnectionListener {\r\n private polyIMC: PolyIMC;\r\n private newConnectionReceiverHandlerMap: ReceiverHandlerMap;\r\n private onConnection?: (senderWindow: Window, message: IMCMessage) => void;\r\n\r\n private listener: InterModuleCommunication;\r\n\r\n /**\r\n *\r\n * @param polyIMC The polyIMC instance.\r\n * @param newConnectionReceiverHandlerMap Receiver handler map for newly established poly-IMC channel.\r\n * @param onConnection Callback function to be called when a new connection is established.\r\n * @param expectedOtherWindowId Optional expected other window ID to validate incoming connections.\r\n */\r\n constructor(\r\n polyIMC: PolyIMC,\r\n newConnectionReceiverHandlerMap: ReceiverHandlerMap,\r\n onConnection?: (senderWindow: Window, message: IMCMessage) => void,\r\n expectedOtherWindowId?: string\r\n ) {\r\n this.polyIMC = polyIMC;\r\n this.newConnectionReceiverHandlerMap = newConnectionReceiverHandlerMap;\r\n this.onConnection = onConnection;\r\n\r\n const listener = new InterModuleCommunication(\r\n \"connection-listener\",\r\n undefined\r\n );\r\n this.listener = listener;\r\n listener.initThisWindow(window, expectedOtherWindowId);\r\n\r\n listener.updateReceiverHandlerMap(\r\n new Map<IMCMessageTypeEnum, ReceiverHandler>([\r\n [\r\n IMCMessageTypeEnum.AppReady,\r\n async (\r\n senderWindow: Window,\r\n message: IMCMessage,\r\n abortSignal?: AbortSignal\r\n ) => {\r\n await this.handleExtReady(senderWindow, message, abortSignal);\r\n },\r\n ],\r\n ])\r\n );\r\n }\r\n\r\n public close() {\r\n this.listener?.close();\r\n }\r\n\r\n public updateReceiverHandlerMap(\r\n newReceiverHandlerMap: ReceiverHandlerMap\r\n ): void {\r\n this.newConnectionReceiverHandlerMap = newReceiverHandlerMap;\r\n }\r\n\r\n private async handleExtReady(\r\n senderWindow: Window,\r\n message: IMCMessage,\r\n abortSignal?: AbortSignal\r\n ) {\r\n const targetWindowId = message.from;\r\n const { intent, channelId }: { intent: string; channelId?: string } =\r\n message.payload;\r\n\r\n if (!channelId) {\r\n throw new Error(\"Channel ID is missing in AppReady message.\");\r\n }\r\n\r\n // Create a new channel for the incoming connection\r\n await this.polyIMC.createChannel(\r\n senderWindow,\r\n targetWindowId,\r\n intent,\r\n channelId,\r\n this.newConnectionReceiverHandlerMap\r\n );\r\n\r\n if (this.onConnection) {\r\n this.onConnection(senderWindow, message);\r\n }\r\n }\r\n}\r\n"],"names":["byteToHex","i","push","toString","slice","unsafeStringify","arr","offset","arguments","length","undefined","toLowerCase","getRandomValues","rnds8","Uint8Array","rng","crypto","Error","bind","randomUUID","_v4","options","buf","_ref","_options$random","_options$rng","_options","rnds","random","call","v4","native"],"mappings":"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","x_google_ignoreList":[3,4,5,6]}
@@ -26,11 +26,11 @@ export declare enum IMCMessageTypeEnum {
26
26
  PlatformWriteFile = "platform-write-file",
27
27
  PlatformReadFile = "platform-read-file",
28
28
  PlatformFileUpdate = "platform-file-update",
29
- SignalGetWindowId = "signal-get-window-id",
30
- SignalReturnWindowId = "signal-return-window-id",
29
+ SignalRequestOtherWindowId = "signal-request-other-window-id",
31
30
  SignalAcknowledge = "signal-acknowledge",
32
31
  SignalAbort = "signal-abort",
33
- SignalError = "signal-error"
32
+ SignalError = "signal-error",
33
+ SignalIgnore = "signal-ignore"
34
34
  }
35
35
  export type IMCMessage = {
36
36
  messageId: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pulse-editor/shared-utils",
3
- "version": "0.1.1-alpha.51",
3
+ "version": "0.1.1-alpha.53",
4
4
  "main": "dist/main.js",
5
5
  "files": [
6
6
  "dist"