LCOV - code coverage report
Current view: top level - pkg/lib/cockpit/_internal - parentwebsocket.ts Coverage Total Hit
Test: cockpit Lines: 83.8 % 37 31
Test Date: 2026-07-03 14:25:32

            Line data    Source code
       1              : // SPDX-License-Identifier: LGPL-2.1-or-later
       2              : import { transport_origin } from './location-utils';
       3              : 
       4              : /*
       5              :  * A WebSocket that connects to parent frame. The mechanism
       6              :  * for doing this will eventually be documented publicly,
       7              :  * but for now:
       8              :  *
       9              :  *  * Forward raw cockpit1 string protocol messages via window.postMessage
      10              :  *  * Listen for cockpit1 string protocol messages via window.onmessage
      11              :  *  * Never accept or send messages to another origin
      12              :  *  * An empty string message means "close" (not completely used yet)
      13              :  */
      14          758 : export class ParentWebSocket {
      15          359 :     binaryType = 'arraybuffer' as const; // compatibility with Transport, which sets this
      16          359 :     readyState = 0;
      17              : 
      18              :     // essentially signal handlers: these are assigned to from Transport
      19            0 :     onopen(): void {
      20            0 :     }
      21              : 
      22            0 :     onclose(): void {
      23            0 :     }
      24              : 
      25            0 :     onmessage(_event: MessageEvent): void {
      26            0 :     }
      27              : 
      28          359 :     constructor(parent: Window) {
      29          358 :         window.addEventListener("message", event => {
      30          358 :             if (event.origin !== transport_origin || event.source !== parent)
      31          358 :                 return;
      32          358 :             const data = event.data;
      33           68 :             if (data === undefined || (data.length === undefined && data.byteLength === undefined))
      34          358 :                 return;
      35           63 :             if (data.length === 0) {
      36           63 :                 this.readyState = 3;
      37           63 :                 this.onclose();
      38           63 :             } else {
      39          358 :                 this.onmessage(event);
      40          358 :             }
      41          358 :         }, false);
      42              : 
      43          359 :         window.setTimeout(() => {
      44          359 :             this.readyState = 1;
      45          359 :             this.onopen();
      46          359 :         }, 0);
      47          359 :     }
      48              : 
      49              :     // same types as the real WebSocket
      50          381 :     send(message: string | ArrayBufferLike | Blob | ArrayBufferView): void {
      51          381 :         parent.postMessage(message, transport_origin);
      52          381 :     }
      53              : 
      54           76 :     close(): void {
      55           76 :         this.readyState = 3;
      56           76 :         parent.postMessage("", transport_origin);
      57           76 :         this.onclose();
      58           76 :     }
      59          758 : }
        

Generated by: LCOV version 2.0-1