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 360 : binaryType = 'arraybuffer' as const; // compatibility with Transport, which sets this
16 360 : 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 360 : constructor(parent: Window) {
29 360 : window.addEventListener("message", event => {
30 360 : if (event.origin !== transport_origin || event.source !== parent)
31 360 : return;
32 360 : const data = event.data;
33 70 : if (data === undefined || (data.length === undefined && data.byteLength === undefined))
34 360 : return;
35 65 : if (data.length === 0) {
36 65 : this.readyState = 3;
37 65 : this.onclose();
38 65 : } else {
39 360 : this.onmessage(event);
40 360 : }
41 360 : }, false);
42 :
43 360 : window.setTimeout(() => {
44 360 : this.readyState = 1;
45 360 : this.onopen();
46 360 : }, 0);
47 360 : }
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 : }
|