4a91a7d2e2
* fix repo in api client Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * web: re-organise files to match their interface Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * core: include version in script tags Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * cleanup maybe broken Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * revert rename Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * web: get rid of Client.ts Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * move more to common Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * more moving Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * format Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * unfuck files that vscode fucked, thanks Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * move more Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * finish moving (maybe) Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * ok more moving Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * fix more stuff that vs code destroyed Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * get rid "web" prefix for virtual package Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * fix locales Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * use custom base element Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * fix css file Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * don't run autoDetectLanguage when importing locale Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * fix circular dependencies Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> * web: fix build Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org> Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
import { EVENT_MESSAGE, EVENT_WS_MESSAGE } from "@goauthentik/common/constants";
|
|
import { MessageLevel } from "@goauthentik/common/messages";
|
|
|
|
import { t } from "@lingui/macro";
|
|
|
|
export interface WSMessage {
|
|
message_type: string;
|
|
}
|
|
|
|
export class WebsocketClient {
|
|
messageSocket?: WebSocket;
|
|
retryDelay = 200;
|
|
|
|
constructor() {
|
|
try {
|
|
this.connect();
|
|
} catch (error) {
|
|
console.warn(`authentik/ws: failed to connect to ws ${error}`);
|
|
}
|
|
}
|
|
|
|
connect(): void {
|
|
if (navigator.webdriver) return;
|
|
const wsUrl = `${window.location.protocol.replace("http", "ws")}//${
|
|
window.location.host
|
|
}/ws/client/`;
|
|
this.messageSocket = new WebSocket(wsUrl);
|
|
this.messageSocket.addEventListener("open", () => {
|
|
console.debug(`authentik/ws: connected to ${wsUrl}`);
|
|
this.retryDelay = 200;
|
|
});
|
|
this.messageSocket.addEventListener("close", (e) => {
|
|
console.debug(`authentik/ws: closed ws connection: ${e}`);
|
|
if (this.retryDelay > 6000) {
|
|
window.dispatchEvent(
|
|
new CustomEvent(EVENT_MESSAGE, {
|
|
bubbles: true,
|
|
composed: true,
|
|
detail: {
|
|
level: MessageLevel.error,
|
|
message: t`Connection error, reconnecting...`,
|
|
},
|
|
}),
|
|
);
|
|
}
|
|
setTimeout(() => {
|
|
console.debug(`authentik/ws: reconnecting ws in ${this.retryDelay}ms`);
|
|
this.connect();
|
|
}, this.retryDelay);
|
|
this.retryDelay = this.retryDelay * 2;
|
|
});
|
|
this.messageSocket.addEventListener("message", (e) => {
|
|
const data = JSON.parse(e.data);
|
|
window.dispatchEvent(
|
|
new CustomEvent(EVENT_WS_MESSAGE, {
|
|
bubbles: true,
|
|
composed: true,
|
|
detail: data as WSMessage,
|
|
}),
|
|
);
|
|
});
|
|
this.messageSocket.addEventListener("error", () => {
|
|
this.retryDelay = this.retryDelay * 2;
|
|
});
|
|
}
|
|
}
|