forked from webxdc/webxdc-dev
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebxdc.ts
111 lines (92 loc) · 2.83 KB
/
webxdc.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { JsonValue, WebXdc } from "../types/webxdc";
import {
Transport,
TransportMessageCallback,
TransportConnectCallback,
createWebXdc,
Info,
} from "./create";
import { overwriteConsole, alterUi } from "./ui";
const url = `ws://${document.location.host}/webxdc`;
type SocketMessageListener = (event: Event) => void;
export class DevServerTransport implements Transport {
socket: WebSocket;
messageListener: SocketMessageListener | null = null;
promise: Promise<Info>;
resolveInfo!: (info: Info) => void;
constructor(url: string) {
this.socket = new WebSocket(url);
this.promise = new Promise((resolve, reject) => {
this.resolveInfo = resolve;
});
}
send(data: JsonValue): void {
this.socket.send(JSON.stringify(data));
}
onMessage(callback: TransportMessageCallback): void {
if (this.messageListener != null) {
this.socket.removeEventListener("message", this.messageListener);
}
const listener = (event: Event): void => {
callback(JSON.parse((event as any).data));
};
this.messageListener = listener;
this.socket.addEventListener("message", listener);
}
onConnect(callback: TransportConnectCallback): void {
const readyState = this.socket.readyState;
if (readyState === 0) {
// if the socket is connecting, we send the information
// as soon as we're open
const listener = (): void => {
callback();
// only listen to open once
this.socket.removeEventListener("open", listener);
};
this.socket.addEventListener("open", callback);
} else if (readyState === 1) {
// if it's already open, we send the information immediately
callback();
} else {
throw new Error(`SocketTransport: socket not ready: ${readyState}`);
}
}
clear() {
window.localStorage.clear();
window.sessionStorage.clear();
// XXX what about indexedDB?
// we want to reload the window otherwise we won't take the
// cleared localstorage into account
window.location.reload();
}
address() {
return `instance@${document.location.port}`;
}
name() {
return `Instance ${document.location.port}`;
}
setInfo(info: Info): void {
this.resolveInfo(info);
}
async getInfo(): Promise<Info> {
return this.promise;
}
}
function getWebXdc(): WebXdc {
return (window as any).webxdc;
}
const transport = new DevServerTransport(url);
(window as any).webxdc = createWebXdc(transport, (...args) => {
console.info(...args);
});
overwriteConsole(document.location.port, transport);
window.addEventListener("load", () => alterUi(getWebXdc().selfName, transport));
// listen to messages coming into iframe
window.addEventListener("message", (event) => {
if (event.origin.indexOf("localhost:") === -1) {
return;
}
if (event.data === "reload") {
window.location.reload();
}
});