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 : }
|