MCPcopy Create free account
hub / github.com/Sandpack/nodebox-runtime / MessageSender

Class MessageSender

packages/nodebox/src/messages.ts:214–365  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

212}
213
214export class MessageSender {
215 private emitter: EventTarget;
216 private channel: MessageChannel;
217 private receiverPort: MessagePort;
218 private receiverReadyPromise: DeferredPromise<void>;
219
220 constructor(private readonly target: Window) {
221 this.emitter = new EventTarget();
222 this.channel = new MessageChannel();
223 this.receiverPort = this.channel.port1;
224
225 const receiverReadyPromise = new DeferredPromise<void>();
226 const handshakeListener = (message: MessageEvent) => {
227 if (message.data.type === 'internal/ready') {
228 debug('[message-sender]: runtime is ready');
229 receiverReadyPromise.resolve();
230 }
231 };
232 window.addEventListener('message', handshakeListener);
233 receiverReadyPromise.then(() => {
234 window.removeEventListener('message', handshakeListener);
235 });
236 this.receiverReadyPromise = receiverReadyPromise;
237
238 // Attach a message listener once.
239 this.receiverPort.onmessage = (evt) => {
240 const data = evt.data;
241 if (data.type != null) {
242 debug('[message-sender]: emitting "%s" event...', data.type, data.payload);
243 this.emitter.dispatchEvent(new MessageEvent(data.type, { data: data.payload }));
244 }
245 };
246 }
247
248 public async handshake(): Promise<void> {
249 const handshakePromise = new DeferredPromise<void>();
250
251 await this.receiverReadyPromise;
252
253 debug('[message-sender]: sending handshake');
254 this.target.postMessage(
255 {
256 type: 'internal/handshake',
257 },
258 '*',
259 [this.channel.port2]
260 );
261
262 this.on('internal/handshake/done', () => {
263 handshakePromise.resolve();
264 clearTimeout(rejectionTimeout);
265 });
266
267 const rejectionTimeout = setTimeout(() => {
268 handshakePromise.reject(new Error('MessageSender: Handshake timeout'));
269 }, 5000);
270
271 return handshakePromise;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected