web: separate websocket connection from messages
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		| @ -1,9 +1,10 @@ | ||||
| import { t } from "@lingui/macro"; | ||||
| import { LitElement, html, customElement, TemplateResult, property, CSSResult, css } from "lit-element"; | ||||
| import "./Message"; | ||||
| import { APIMessage, MessageLevel } from "./Message"; | ||||
| import { APIMessage } from "./Message"; | ||||
| import PFAlertGroup from "@patternfly/patternfly/components/AlertGroup/alert-group.css"; | ||||
| import PFBase from "@patternfly/patternfly/patternfly-base.css"; | ||||
| import { EVENT_WS_MESSAGE, WS_MSG_TYPE_MESSAGE } from "../../constants"; | ||||
| import { WSMessage } from "../../common/ws"; | ||||
|  | ||||
| export function showMessage(message: APIMessage): void { | ||||
|     const container = document.querySelector<MessageContainer>("ak-message-container"); | ||||
| @ -20,9 +21,6 @@ export class MessageContainer extends LitElement { | ||||
|     @property({attribute: false}) | ||||
|     messages: APIMessage[] = []; | ||||
|  | ||||
|     messageSocket?: WebSocket; | ||||
|     retryDelay = 200; | ||||
|  | ||||
|     static get styles(): CSSResult[] { | ||||
|         return [PFBase, PFAlertGroup, css` | ||||
|             /* Fix spacing between messages */ | ||||
| @ -34,11 +32,10 @@ export class MessageContainer extends LitElement { | ||||
|  | ||||
|     constructor() { | ||||
|         super(); | ||||
|         try { | ||||
|             this.connect(); | ||||
|         } catch (error) { | ||||
|             console.warn(`authentik/messages: failed to connect to ws ${error}`); | ||||
|         } | ||||
|         this.addEventListener(EVENT_WS_MESSAGE, ((e: CustomEvent<WSMessage>) => { | ||||
|             if (e.detail.type !== WS_MSG_TYPE_MESSAGE) return; | ||||
|             this.addMessage(e.detail as unknown as APIMessage); | ||||
|         }) as EventListener); | ||||
|     } | ||||
|  | ||||
|     // add a new message, but only if the message isn't currently shown. | ||||
| @ -49,40 +46,6 @@ export class MessageContainer extends LitElement { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     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/messages: connected to ${wsUrl}`); | ||||
|             this.retryDelay = 200; | ||||
|         }); | ||||
|         this.messageSocket.addEventListener("close", (e) => { | ||||
|             console.debug(`authentik/messages: closed ws connection: ${e}`); | ||||
|             if (this.retryDelay > 3000) { | ||||
|                 showMessage({ | ||||
|                     level: MessageLevel.error, | ||||
|                     message: t`Connection error, reconnecting...` | ||||
|                 }); | ||||
|             } | ||||
|             setTimeout(() => { | ||||
|                 console.debug(`authentik/messages: 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); | ||||
|             this.addMessage(data); | ||||
|             this.requestUpdate(); | ||||
|         }); | ||||
|         this.messageSocket.addEventListener("error", () => { | ||||
|             this.retryDelay = this.retryDelay * 2; | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     render(): TemplateResult { | ||||
|         return html`<ul class="pf-c-alert-group pf-m-toast"> | ||||
|             ${this.messages.map((m) => { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer