|
// retoor <retoor@molodetz.nl>
|
|
|
|
const WRONG_WORKER_CODE = 4013;
|
|
const WRONG_WORKER_RETRY_MS = 200;
|
|
const RECONNECT_DELAY_MS = 1500;
|
|
|
|
export class SeoProgressSocket {
|
|
constructor(uid, handlers) {
|
|
this.handlers = handlers || {};
|
|
this.ws = null;
|
|
this._shouldRun = true;
|
|
const scheme = location.protocol === "https:" ? "wss://" : "ws://";
|
|
this.url = `${scheme}${location.host}/tools/seo/${encodeURIComponent(uid)}/ws`;
|
|
}
|
|
|
|
connect() {
|
|
this._shouldRun = true;
|
|
this._open();
|
|
}
|
|
|
|
_open() {
|
|
this.ws = new WebSocket(this.url);
|
|
this.ws.addEventListener("message", (event) => {
|
|
let frame;
|
|
try {
|
|
frame = JSON.parse(event.data);
|
|
} catch {
|
|
return;
|
|
}
|
|
this._emit("onMessage", frame);
|
|
});
|
|
this.ws.addEventListener("close", (event) => {
|
|
if (event.code === WRONG_WORKER_CODE && this._shouldRun) {
|
|
window.setTimeout(() => this._open(), WRONG_WORKER_RETRY_MS);
|
|
return;
|
|
}
|
|
this._emit("onClose");
|
|
});
|
|
this.ws.addEventListener("error", () => this._emit("onError"));
|
|
}
|
|
|
|
close() {
|
|
this._shouldRun = false;
|
|
if (this.ws) this.ws.close();
|
|
}
|
|
|
|
_emit(name, payload) {
|
|
const handler = this.handlers[name];
|
|
if (typeof handler === "function") handler(payload);
|
|
}
|
|
}
|