diff --git a/hassio/src/ingress-view/hassio-ingress-view.ts b/hassio/src/ingress-view/hassio-ingress-view.ts index ec899c7094..6a56522e9a 100644 --- a/hassio/src/ingress-view/hassio-ingress-view.ts +++ b/hassio/src/ingress-view/hassio-ingress-view.ts @@ -13,7 +13,10 @@ import { fetchHassioAddonInfo, HassioAddonDetails, } from "../../../src/data/hassio/addon"; -import { createHassioSession } from "../../../src/data/hassio/supervisor"; +import { + createHassioSession, + validateHassioSession, +} from "../../../src/data/hassio/ingress"; import "../../../src/layouts/hass-loading-screen"; import "../../../src/layouts/hass-subpage"; import { HomeAssistant, Route } from "../../../src/types"; @@ -35,6 +38,17 @@ class HassioIngressView extends LitElement { @property({ type: Boolean }) public narrow = false; + private _sessionKeepAlive?: number; + + public disconnectedCallback() { + super.disconnectedCallback(); + + if (this._sessionKeepAlive) { + clearInterval(this._sessionKeepAlive); + this._sessionKeepAlive = undefined; + } + } + protected render(): TemplateResult { if (!this._addon) { return html` `; @@ -83,10 +97,7 @@ class HassioIngressView extends LitElement { } private async _fetchData(addonSlug: string) { - const createSessionPromise = createHassioSession(this.hass).then( - () => true, - () => false - ); + const createSessionPromise = createHassioSession(this.hass); let addon; @@ -119,7 +130,11 @@ class HassioIngressView extends LitElement { return; } - if (!(await createSessionPromise)) { + let session; + + try { + session = await createSessionPromise; + } catch (err) { await showAlertDialog(this, { text: "Unable to create an Ingress session", title: addon.name, @@ -128,6 +143,17 @@ class HassioIngressView extends LitElement { return; } + if (this._sessionKeepAlive) { + clearInterval(this._sessionKeepAlive); + } + this._sessionKeepAlive = window.setInterval(async () => { + try { + await validateHassioSession(this.hass, session); + } catch (err) { + session = await createHassioSession(this.hass); + } + }, 60000); + this._addon = addon; } diff --git a/src/data/hassio/ingress.ts b/src/data/hassio/ingress.ts new file mode 100644 index 0000000000..ced84a2698 --- /dev/null +++ b/src/data/hassio/ingress.ts @@ -0,0 +1,26 @@ +import { HomeAssistant } from "../../types"; +import { HassioResponse } from "./common"; +import { CreateSessionResponse } from "./supervisor"; + +export const createHassioSession = async (hass: HomeAssistant) => { + const response = await hass.callApi>( + "POST", + "hassio/ingress/session" + ); + document.cookie = `ingress_session=${ + response.data.session + };path=/api/hassio_ingress/;SameSite=Strict${ + location.protocol === "https:" ? ";Secure" : "" + }`; + return response.data.session; +}; + +export const validateHassioSession = async ( + hass: HomeAssistant, + session: string +) => + await hass.callApi>( + "POST", + "hassio/ingress/validate_session", + { session } + ); diff --git a/src/data/hassio/supervisor.ts b/src/data/hassio/supervisor.ts index 9d2845f776..b21039bb1b 100644 --- a/src/data/hassio/supervisor.ts +++ b/src/data/hassio/supervisor.ts @@ -111,18 +111,6 @@ export const fetchHassioLogs = async ( return hass.callApi("GET", `hassio/${provider}/logs`); }; -export const createHassioSession = async (hass: HomeAssistant) => { - const response = await hass.callApi>( - "POST", - "hassio/ingress/session" - ); - document.cookie = `ingress_session=${ - response.data.session - };path=/api/hassio_ingress/;SameSite=Strict${ - location.protocol === "https:" ? ";Secure" : "" - }`; -}; - export const setSupervisorOption = async ( hass: HomeAssistant, data: SupervisorOptions diff --git a/test-mocha/hassio/create_session.spec.ts b/test-mocha/hassio/create_session.spec.ts index 79bf728ea7..5fb5e7f59d 100644 --- a/test-mocha/hassio/create_session.spec.ts +++ b/test-mocha/hassio/create_session.spec.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import { createHassioSession } from "../../src/data/hassio/supervisor"; +import { createHassioSession } from "../../src/data/hassio/ingress"; const sessionID = "fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh"; @@ -15,7 +15,7 @@ describe("Create hassio session", function () { return { data: { session: sessionID } }; }, }); - assert.equal( + assert.strictEqual( // @ts-ignore global.document.cookie, "ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict" @@ -32,7 +32,7 @@ describe("Create hassio session", function () { return { data: { session: sessionID } }; }, }); - assert.equal( + assert.strictEqual( // @ts-ignore global.document.cookie, "ingress_session=fhdsu73rh3io4h8f3irhjel8ousafehf8f3yh;path=/api/hassio_ingress/;SameSite=Strict;Secure" @@ -52,6 +52,6 @@ describe("Create hassio session", function () { () => true, () => false ); - assert.equal(await createSessionPromise, false); + assert.strictEqual(await createSessionPromise, false); }); });