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-02 14:11:36

            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          280 : export class ParentWebSocket {
      15          120 :     binaryType = 'arraybuffer' as const; // compatibility with Transport, which sets this
      16          120 :     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          120 :     constructor(parent: Window) {
      29          120 :         window.addEventListener("message", event => {
      30          120 :             if (event.origin !== transport_origin || event.source !== parent)
      31          120 :                 return;
      32          120 :             const data = event.data;
      33           20 :             if (data === undefined || (data.length === undefined && data.byteLength === undefined))
      34          120 :                 return;
      35           19 :             if (data.length === 0) {
      36           19 :                 this.readyState = 3;
      37           19 :                 this.onclose();
      38           19 :             } else {
      39          120 :                 this.onmessage(event);
      40          120 :             }
      41          120 :         }, false);
      42              : 
      43          120 :         window.setTimeout(() => {
      44          120 :             this.readyState = 1;
      45          120 :             this.onopen();
      46          120 :         }, 0);
      47          120 :     }
      48              : 
      49              :     // same types as the real WebSocket
      50          129 :     send(message: string | ArrayBufferLike | Blob | ArrayBufferView): void {
      51          129 :         parent.postMessage(message, transport_origin);
      52          129 :     }
      53              : 
      54           20 :     close(): void {
      55           20 :         this.readyState = 3;
      56           20 :         parent.postMessage("", transport_origin);
      57           20 :         this.onclose();
      58           20 :     }
      59          280 : }
        

Generated by: LCOV version 2.0-1