Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

home-assistant-js-websocket

Package Overview
Dependencies
Maintainers
1
Versions
102
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

home-assistant-js-websocket - npm Package Compare versions

Comparing version 3.0.0-rc3 to 3.0.0-rc4

17

dist/auth.d.ts
declare type AuthData = {
hassUrl: string;
clientId: string;
expires: number;

@@ -8,13 +9,15 @@ refresh_token: string;

};
declare type SaveCacheFunc = (data: AuthData) => void;
declare type LoadCacheFunc = () => Promise<AuthData>;
declare type SaveTokensFunc = (data: AuthData) => void;
declare type LoadTokensFunc = () => Promise<AuthData | undefined>;
declare type getAuthOptions = {
hassUrl?: string;
saveCache?: SaveCacheFunc;
loadCache?: LoadCacheFunc;
clientId?: string;
redirectUrl?: string;
saveTokens?: SaveTokensFunc;
loadTokens?: LoadTokensFunc;
};
export declare class Auth {
private _saveCache?;
private _saveTokens?;
data: AuthData;
constructor(data: AuthData, saveCache?: SaveCacheFunc);
constructor(data: AuthData, saveTokens?: SaveTokensFunc);
readonly wsUrl: string;

@@ -25,3 +28,3 @@ readonly accessToken: string;

}
export default function getAuth({ hassUrl, loadCache, saveCache }?: getAuthOptions): Promise<Auth>;
export default function getAuth(options?: getAuthOptions): Promise<Auth>;
export {};

@@ -1,4 +0,4 @@

import { HassConfig } from "./types";
import { HassConfig, UnsubscribeFunc } from "./types";
import { Connection } from "./connection";
declare const _default: (conn: Connection, onChange: (state: HassConfig) => void) => import("../../../../../../Users/paulus/dev/hass/home-assistant-js-websocket/lib/types").UnsubscribeFunc;
declare const _default: (conn: Connection, onChange: (state: HassConfig) => void) => UnsubscribeFunc;
export default _default;

@@ -1,4 +0,4 @@

import { HassEntities } from "./types";
import { HassEntities, UnsubscribeFunc } from "./types";
import { Connection } from "./connection";
declare const _default: (conn: Connection, onChange: (state: HassEntities) => void) => import("../../../../../../Users/paulus/dev/hass/home-assistant-js-websocket/lib/types").UnsubscribeFunc;
declare const _default: (conn: Connection, onChange: (state: HassEntities) => void) => UnsubscribeFunc;
export default _default;

@@ -1,2 +0,2 @@

function e(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){e.done?s(e.value):new n(function(t){t(e.value)}).then(o,c)}a((r=r.apply(e,t||[])).next())})}function t(e,t){var n,r,s,i,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(s=(s=o.trys).length>0&&s[s.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){o.label=i[1];break}if(6===i[0]&&o.label<s[1]){o.label=s[1],s=i;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(i);break}s[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var n=1,r=2,s=3,i=4,o="auth_required",c="auth_invalid",a="auth_ok",u="auth_callback";function h(){return location.protocol+"//"+location.host+"/"}function f(e,t){var n=location.protocol+"//"+location.host+location.pathname+location.search;n+=n.includes("?")?"&":"?",n+=u+"=1",document.location.href=function(e,t,n,r){var s=e+"/auth/authorize?response_type=code&client_id="+encodeURIComponent(t)+"&redirect_uri="+encodeURIComponent(n);return r&&(s+="&state="+encodeURIComponent(r)),s}(e,h(),n,t)}function l(n,r,s){return e(this,void 0,void 0,function(){var e,i,o;return t(this,function(t){switch(t.label){case 0:return(e=new FormData).append("client_id",r),Object.keys(s).forEach(function(t){e.append(t,s[t])}),[4,fetch(n+"/auth/token",{method:"POST",body:e})];case 1:if(!(i=t.sent()).ok)throw new Error("Unable to fetch tokens");return[4,i.json()];case 2:return(o=t.sent()).hassUrl=n,o.expires=1e3*o.expires_in+Date.now(),[2,o]}})})}var d=function(){function n(e,t){this.data=e,this._saveCache=t}return Object.defineProperty(n.prototype,"wsUrl",{get:function(){return"ws"+this.data.hassUrl.substr(4)+"/api/websocket"},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"accessToken",{get:function(){return this.data.access_token},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"expired",{get:function(){return Date.now()>this.data.expires-1e4},enumerable:!0,configurable:!0}),n.prototype.refreshAccessToken=function(){return e(this,void 0,void 0,function(){var e;return t(this,function(t){switch(t.label){case 0:return e=this,[4,(n=this.data.hassUrl,r=h(),s=this.data.refresh_token,l(n,r,{grant_type:"refresh_token",refresh_token:s}))];case 1:return e.data=t.sent(),this._saveCache&&this._saveCache(this.data),[2]}var n,r,s})})},n}();function v(n){var r=void 0===n?{}:n,s=r.hassUrl,o=r.loadCache,c=r.saveCache;return e(this,void 0,void 0,function(){var e,n,r;return t(this,function(t){switch(t.label){case 0:if(!("auth_callback"in(e=function(e){for(var t={},n=e.split("&"),r=0;r<n.length;r++){var s=n[r].split("="),i=decodeURIComponent(s[0]),o=s.length>1?decodeURIComponent(s[1]):void 0;t[i]=o}return t}(location.search.substr(1)))))return[3,4];r=JSON.parse(atob(e.state)),t.label=1;case 1:return t.trys.push([1,3,,4]),[4,function(e,t,n){return l(e,t,{code:n,grant_type:"authorization_code"})}(r.hassUrl,h(),e.code)];case 2:return n=t.sent(),c&&c(n),[3,4];case 3:return t.sent(),[3,4];case 4:return n||!o?[3,6]:[4,o()];case 5:n=t.sent(),t.label=6;case 6:if(!n&&s)return f(s,function(e){return btoa(JSON.stringify(e))}({hassUrl:s})),[2,new Promise(function(){})];if(n)return[2,new d(n,c)];throw i}})})}var p=function(){function e(e){this._noSub=e,this.listeners=[]}return e.prototype.action=function(e){var t=this,n=function(e){return t.setState(e,!1)};return function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var i=e.apply(void 0,[t.state].concat(r));if(null!=i)return"then"in i?i.then(n):n(i)}},e.prototype.setState=function(e,t){this.state=t?e:Object.assign({},this.state,e);for(var n=this.listeners,r=0;r<n.length;r++)n[r](this.state)},e.prototype.subscribe=function(e){var t=this;return this.listeners.push(e),void 0!==this.state&&e(this.state),function(){t.unsubscribe(e)}},e.prototype.unsubscribe=function(e){for(var t=e,n=[],r=this.listeners,s=0;s<r.length;s++)r[s]===t?t=null:n.push(r[s]);this.listeners=n,0===n.length&&this._noSub()},e}();function b(n,r,s,i,o){if(n in i)return i[n](o);var c,a=new p(function(){c.then(function(e){return e()}),i.removeEventListener("ready",u),delete i[n]});function u(){return e(this,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:return n=(e=a).setState,[4,r(i)];case 1:return n.apply(e,[t.sent(),!0]),[2]}})})}return i[n]=a.subscribe,c=s(i,a),i.addEventListener("ready",u),u(),a.subscribe(o)}var m=function(){function n(e,t){this.options=t,this.commandId=1,this.commands={},this.eventListeners={},this.closeRequested=!1,this._handleClose=this._handleClose.bind(this),this.setSocket(e)}return n.prototype.setSocket=function(e){var t=this,n=this.socket;if(this.socket=e,e.addEventListener("message",function(e){return t._handleMessage(e)}),e.addEventListener("close",this._handleClose),n){var r=this.commands;this.commandId=1,this.commands={},Object.keys(r).forEach(function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})}),this.fireEvent("ready")}},n.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},n.prototype.removeEventListener=function(e,t){var n=this.eventListeners[e];if(n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}},n.prototype.fireEvent=function(e,t){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n,t)})},n.prototype.close=function(){this.closeRequested=!0,this.socket.close()},n.prototype.getStates=function(){return this.sendMessagePromise({type:"get_states"})},n.prototype.getServices=function(){return this.sendMessagePromise({type:"get_services"})},n.prototype.getConfig=function(){return this.sendMessagePromise({type:"get_config"})},n.prototype.callService=function(e,t,n){return this.sendMessagePromise(function(e,t,n){var r={type:"call_service",domain:e,service:t};return n&&(r.service_data=n),r}(e,t,n))},n.prototype.subscribeEvents=function(n,r){return e(this,void 0,void 0,function(){var s,i,o=this;return t(this,function(c){switch(c.label){case 0:return s=this._genCmdId(),[4,this.sendMessagePromise(function(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}(r),s)];case 1:return c.sent(),this.commands[s]=i={eventCallback:n,eventType:r,unsubscribe:function(){return e(o,void 0,void 0,function(){return t(this,function(e){switch(e.label){case 0:return[4,this.sendMessagePromise((t=s,{type:"unsubscribe_events",subscription:t}))];case 1:return e.sent(),delete this.commands[s],[2]}var t})})}},[2,function(){return i.unsubscribe()}]}})})},n.prototype.ping=function(){return this.sendMessagePromise({type:"ping"})},n.prototype.sendMessage=function(e,t){t||(t=this._genCmdId()),e.id=t,this.socket.send(JSON.stringify(e))},n.prototype.sendMessagePromise=function(e,t){var n=this;return new Promise(function(r,s){t||(t=n._genCmdId()),n.commands[t]={resolve:r,reject:s},n.sendMessage(e,t)})},n.prototype._handleMessage=function(e){var t=JSON.parse(e.data);switch(t.type){case"event":this.commands[t.id].eventCallback(t.event);break;case"result":t.id in this.commands&&(1==t.success?this.commands[t.id].resolve(t.result):this.commands[t.id].reject(t.error),delete this.commands[t.id])}},n.prototype._handleClose=function(){var n=this;if(Object.keys(this.commands).forEach(function(e){var t=n.commands[e].reject;t&&t({type:"result",success:!1,error:{code:3,message:"Connection lost"}})}),!this.closeRequested){this.fireEvent("disconnected");var s=Object.assign({},this.options,{setupRetry:0}),i=function(o){setTimeout(function(){return e(n,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:t.label=1;case 1:return t.trys.push([1,3,,4]),[4,s.createSocket(s)];case 2:return e=t.sent(),this.setSocket(e),[3,4];case 3:return(n=t.sent())===r?this.fireEvent("reconnect-error",n):i(o+1),[3,4];case 4:return[2]}})})},1e3*Math.min(o,5))};i(0)}},n.prototype._genCmdId=function(){return this.commandId+=1,this.commandId},n}(),y={setupRetry:0,createSocket:function(s){if(!s.auth)throw i;var u=s.auth,h=u.wsUrl;return new Promise(function(i,f){return function s(i,f,l){var d=this,v=new WebSocket(h),p=!1,b=function(){if(v.removeEventListener("close",b),p)l(r);else if(0!==i){var e=-1===i?-1:i-1;setTimeout(function(){return s(e,f,l)},1e3)}else l(n)},m=function(n){return e(d,void 0,void 0,function(){return t(this,function(e){switch(e.label){case 0:switch(JSON.parse(n.data).type){case o:return[3,1];case c:return[3,6];case a:return[3,7]}return[3,8];case 1:return e.trys.push([1,4,,5]),u.expired?[4,u.refreshAccessToken()]:[3,3];case 2:e.sent(),e.label=3;case 3:return v.send(JSON.stringify({type:"auth",access_token:u.accessToken})),[3,5];case 4:return e.sent(),p=!0,v.close(),[3,5];case 5:return[3,9];case 6:return p=!0,v.close(),[3,9];case 7:return v.removeEventListener("message",m),v.removeEventListener("close",b),v.removeEventListener("error",b),f(v),[3,9];case 8:e.label=9;case 9:return[2]}})})};v.addEventListener("message",m),v.addEventListener("close",b),v.addEventListener("error",b)}(s.setupRetry,i,f)})}};function g(n){return e(this,void 0,void 0,function(){var e,r;return t(this,function(t){switch(t.label){case 0:return[4,(e=Object.assign({},y,n)).createSocket(e)];case 1:return r=t.sent(),[2,new m(r,e)]}})})}function _(e,t){return void 0===e?null:{components:e.components.concat(t.data.component)}}var w=function(e){return e.getConfig()},k=function(e,t){return e.subscribeEvents(t.action(_),"component_loaded")};function E(e,t){return b("_cnf",w,k,e,t)}function S(e,t){var n,r;if(void 0===e)return null;var s=t.data,i=s.domain,o=Object.assign({},e[i],((n={})[s.service]={description:"",fields:{}},n));return(r={})[i]=o,r}function C(e,t){var n;if(void 0===e)return null;var r=t.data,s=r.domain,i=r.service,o=e[s];if(!(o&&i in o))return null;var c={};return Object.keys(o).forEach(function(e){e!==i&&(c[e]=o[e])}),(n={})[s]=c,n}var O=function(e){return e.getServices()},L=function(e,t){return Promise.all([e.subscribeEvents(t.action(S),"service_registered"),e.subscribeEvents(t.action(C),"service_removed")]).then(function(e){return function(){return e.forEach(function(e){return e()})}})};function P(e,t){return b("_srv",O,L,e,t)}function j(n){return e(this,void 0,void 0,function(){var e,r,s,i;return t(this,function(t){switch(t.label){case 0:return[4,n.getStates()];case 1:for(e=t.sent(),r={},s=0;s<e.length;s++)r[(i=e[s]).entity_id]=i;return[2,r]}})})}var U=function(e,t){return e.subscribeEvents(function(e){return function(e,t){var n,r=e.state;if(void 0!==r){var s=t.data,i=s.entity_id,o=s.new_state;if(o)e.setState(((n={})[o.entity_id]=o,n));else{var c=Object.assign({},r);delete c[i],e.setState(c,!0)}}}(t,e)},"state_changed")};function I(e,t){return b("_ent",j,U,e,t)}export{n as ERR_CANNOT_CONNECT,r as ERR_INVALID_AUTH,s as ERR_CONNECTION_LOST,i as ERR_HASS_HOST_REQUIRED,v as getAuth,b as createCollection,g as createConnection,E as subscribeConfig,P as subscribeServices,I as subscribeEntities};
function e(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){e.done?s(e.value):new n(function(t){t(e.value)}).then(o,c)}a((r=r.apply(e,t||[])).next())})}function t(e,t){var n,r,s,i,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(s=(s=o.trys).length>0&&s[s.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){o.label=i[1];break}if(6===i[0]&&o.label<s[1]){o.label=s[1],s=i;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(i);break}s[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var n=1,r=2,s=3,i=4,o="auth_required",c="auth_invalid",a="auth_ok",u="auth_callback";function h(e,t,n,r){n+=n.includes("?")?"&":"?",n+=u+"=1",document.location.href=function(e,t,n,r){var s=e+"/auth/authorize?response_type=code&client_id="+encodeURIComponent(t)+"&redirect_uri="+encodeURIComponent(n);return r&&(s+="&state="+encodeURIComponent(r)),s}(e,t,n,r)}function l(n,s,i){return e(this,void 0,void 0,function(){var e,o,c;return t(this,function(t){switch(t.label){case 0:return(e=new FormData).append("client_id",s),Object.keys(i).forEach(function(t){e.append(t,i[t])}),[4,fetch(n+"/auth/token",{method:"POST",body:e})];case 1:if(!(o=t.sent()).ok)throw 400===o.status||403===o.status?r:new Error("Unable to fetch tokens");return[4,o.json()];case 2:return(c=t.sent()).hassUrl=n,c.clientId=s,c.expires=1e3*c.expires_in+Date.now(),[2,c]}})})}var f=function(){function n(e,t){this.data=e,this._saveTokens=t}return Object.defineProperty(n.prototype,"wsUrl",{get:function(){return"ws"+this.data.hassUrl.substr(4)+"/api/websocket"},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"accessToken",{get:function(){return this.data.access_token},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"expired",{get:function(){return Date.now()>this.data.expires},enumerable:!0,configurable:!0}),n.prototype.refreshAccessToken=function(){return e(this,void 0,void 0,function(){var n;return t(this,function(r){switch(r.label){case 0:return n=this,[4,function(n,r,s){return e(this,void 0,void 0,function(){var e;return t(this,function(t){switch(t.label){case 0:return[4,l(n,r,{grant_type:"refresh_token",refresh_token:s})];case 1:return(e=t.sent()).refresh_token=s,[2,e]}})})}(this.data.hassUrl,this.data.clientId,this.data.refresh_token)];case 1:return n.data=r.sent(),this._saveTokens&&this._saveTokens(this.data),[2]}})})},n}();function d(n){return void 0===n&&(n={}),e(this,void 0,void 0,function(){var e,r,s,o,c,a,u,d,v;return t(this,function(t){switch(t.label){case 0:if(e=n.loadTokens,r=n.saveTokens,!("auth_callback"in(s=function(e){for(var t={},n=e.split("&"),r=0;r<n.length;r++){var s=n[r].split("="),i=decodeURIComponent(s[0]),o=s.length>1?decodeURIComponent(s[1]):void 0;t[i]=o}return t}(location.search.substr(1)))))return[3,4];c=JSON.parse(atob(s.state)),t.label=1;case 1:return t.trys.push([1,3,,4]),[4,function(e,t,n){return l(e,t,{code:n,grant_type:"authorization_code"})}(c.hassUrl,c.clientId,s.code)];case 2:return o=t.sent(),r&&r(o),[3,4];case 3:return a=t.sent(),console.log("Unable to fetch access token",a),[3,4];case 4:return o||!e?[3,6]:[4,e()];case 5:o=t.sent(),t.label=6;case 6:if(o)return[2,new f(o,r)];if(void 0===(u=n.hassUrl))throw i;return"/"===u[u.length-1]&&(u=u.substr(0,u.length-1)),d=n.clientId||location.protocol+"//"+location.host+"/",v=n.redirectUrl||location.protocol+"//"+location.host+location.pathname+location.search,h(u,d,v,function(e){return btoa(JSON.stringify(e))}({hassUrl:u,clientId:d})),[2,new Promise(function(){})]}})})}var v=function(){function e(e){this._noSub=e,this.listeners=[]}return e.prototype.action=function(e){var t=this,n=function(e){return t.setState(e,!1)};return function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var i=e.apply(void 0,[t.state].concat(r));if(null!=i)return"then"in i?i.then(n):n(i)}},e.prototype.setState=function(e,t){this.state=t?e:Object.assign({},this.state,e);for(var n=this.listeners,r=0;r<n.length;r++)n[r](this.state)},e.prototype.subscribe=function(e){var t=this;return this.listeners.push(e),void 0!==this.state&&e(this.state),function(){t.unsubscribe(e)}},e.prototype.unsubscribe=function(e){for(var t=e,n=[],r=this.listeners,s=0;s<r.length;s++)r[s]===t?t=null:n.push(r[s]);this.listeners=n,0===n.length&&this._noSub()},e}();function p(n,r,s,i,o){if(n in i)return i[n](o);var c,a=new v(function(){c.then(function(e){return e()}),i.removeEventListener("ready",u),delete i[n]});function u(){return e(this,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:return n=(e=a).setState,[4,r(i)];case 1:return n.apply(e,[t.sent(),!0]),[2]}})})}return i[n]=a.subscribe,c=s(i,a),i.addEventListener("ready",u),u(),a.subscribe(o)}var b=function(){function n(e,t){this.options=t,this.commandId=1,this.commands={},this.eventListeners={},this.closeRequested=!1,this._handleClose=this._handleClose.bind(this),this.setSocket(e)}return n.prototype.setSocket=function(e){var t=this,n=this.socket;if(this.socket=e,e.addEventListener("message",function(e){return t._handleMessage(e)}),e.addEventListener("close",this._handleClose),n){var r=this.commands;this.commandId=1,this.commands={},Object.keys(r).forEach(function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})}),this.fireEvent("ready")}},n.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},n.prototype.removeEventListener=function(e,t){var n=this.eventListeners[e];if(n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}},n.prototype.fireEvent=function(e,t){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n,t)})},n.prototype.close=function(){this.closeRequested=!0,this.socket.close()},n.prototype.getStates=function(){return this.sendMessagePromise({type:"get_states"})},n.prototype.getServices=function(){return this.sendMessagePromise({type:"get_services"})},n.prototype.getConfig=function(){return this.sendMessagePromise({type:"get_config"})},n.prototype.callService=function(e,t,n){return this.sendMessagePromise(function(e,t,n){var r={type:"call_service",domain:e,service:t};return n&&(r.service_data=n),r}(e,t,n))},n.prototype.subscribeEvents=function(n,r){return e(this,void 0,void 0,function(){var s,i,o=this;return t(this,function(c){switch(c.label){case 0:return s=this._genCmdId(),[4,this.sendMessagePromise(function(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}(r),s)];case 1:return c.sent(),this.commands[s]=i={eventCallback:n,eventType:r,unsubscribe:function(){return e(o,void 0,void 0,function(){return t(this,function(e){switch(e.label){case 0:return[4,this.sendMessagePromise((t=s,{type:"unsubscribe_events",subscription:t}))];case 1:return e.sent(),delete this.commands[s],[2]}var t})})}},[2,function(){return i.unsubscribe()}]}})})},n.prototype.ping=function(){return this.sendMessagePromise({type:"ping"})},n.prototype.sendMessage=function(e,t){t||(t=this._genCmdId()),e.id=t,this.socket.send(JSON.stringify(e))},n.prototype.sendMessagePromise=function(e,t){var n=this;return new Promise(function(r,s){t||(t=n._genCmdId()),n.commands[t]={resolve:r,reject:s},n.sendMessage(e,t)})},n.prototype._handleMessage=function(e){var t=JSON.parse(e.data);switch(t.type){case"event":this.commands[t.id].eventCallback(t.event);break;case"result":t.id in this.commands&&(1==t.success?this.commands[t.id].resolve(t.result):this.commands[t.id].reject(t.error),delete this.commands[t.id])}},n.prototype._handleClose=function(){var n=this;if(Object.keys(this.commands).forEach(function(e){var t=n.commands[e].reject;t&&t({type:"result",success:!1,error:{code:3,message:"Connection lost"}})}),!this.closeRequested){this.fireEvent("disconnected");var s=Object.assign({},this.options,{setupRetry:0}),i=function(o){setTimeout(function(){return e(n,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:t.label=1;case 1:return t.trys.push([1,3,,4]),[4,s.createSocket(s)];case 2:return e=t.sent(),this.setSocket(e),[3,4];case 3:return(n=t.sent())===r?this.fireEvent("reconnect-error",n):i(o+1),[3,4];case 4:return[2]}})})},1e3*Math.min(o,5))};i(0)}},n.prototype._genCmdId=function(){return this.commandId+=1,this.commandId},n}(),m={setupRetry:0,createSocket:function(s){if(!s.auth)throw i;var u=s.auth,h=u.wsUrl;return new Promise(function(i,l){return function s(i,l,f){var d=this,v=new WebSocket(h),p=!1,b=function(){if(v.removeEventListener("close",b),p)f(r);else if(0!==i){var e=-1===i?-1:i-1;setTimeout(function(){return s(e,l,f)},1e3)}else f(n)},m=function(n){return e(d,void 0,void 0,function(){var e;return t(this,function(t){switch(t.label){case 0:switch(JSON.parse(n.data).type){case o:return[3,1];case c:return[3,6];case a:return[3,7]}return[3,8];case 1:return t.trys.push([1,4,,5]),u.expired?[4,u.refreshAccessToken()]:[3,3];case 2:t.sent(),t.label=3;case 3:return v.send(JSON.stringify({type:"auth",access_token:u.accessToken})),[3,5];case 4:return e=t.sent(),p=e===r,v.close(),[3,5];case 5:return[3,9];case 6:return p=!0,v.close(),[3,9];case 7:return v.removeEventListener("message",m),v.removeEventListener("close",b),v.removeEventListener("error",b),l(v),[3,9];case 8:t.label=9;case 9:return[2]}})})};v.addEventListener("message",m),v.addEventListener("close",b),v.addEventListener("error",b)}(s.setupRetry,i,l)})}};function y(n){return e(this,void 0,void 0,function(){var e,r;return t(this,function(t){switch(t.label){case 0:return[4,(e=Object.assign({},m,n)).createSocket(e)];case 1:return r=t.sent(),[2,new b(r,e)]}})})}function g(e,t){return void 0===e?null:{components:e.components.concat(t.data.component)}}var _=function(e){return e.getConfig()},k=function(e,t){return e.subscribeEvents(t.action(g),"component_loaded")};function w(e,t){return p("_cnf",_,k,e,t)}function E(e,t){var n,r;if(void 0===e)return null;var s=t.data,i=s.domain,o=Object.assign({},e[i],((n={})[s.service]={description:"",fields:{}},n));return(r={})[i]=o,r}function S(e,t){var n;if(void 0===e)return null;var r=t.data,s=r.domain,i=r.service,o=e[s];if(!(o&&i in o))return null;var c={};return Object.keys(o).forEach(function(e){e!==i&&(c[e]=o[e])}),(n={})[s]=c,n}var C=function(e){return e.getServices()},O=function(e,t){return Promise.all([e.subscribeEvents(t.action(E),"service_registered"),e.subscribeEvents(t.action(S),"service_removed")]).then(function(e){return function(){return e.forEach(function(e){return e()})}})};function I(e,t){return p("_srv",C,O,e,t)}function L(n){return e(this,void 0,void 0,function(){var e,r,s,i;return t(this,function(t){switch(t.label){case 0:return[4,n.getStates()];case 1:for(e=t.sent(),r={},s=0;s<e.length;s++)r[(i=e[s]).entity_id]=i;return[2,r]}})})}var P=function(e,t){return e.subscribeEvents(function(e){return function(e,t){var n,r=e.state;if(void 0!==r){var s=t.data,i=s.entity_id,o=s.new_state;if(o)e.setState(((n={})[o.entity_id]=o,n));else{var c=Object.assign({},r);delete c[i],e.setState(c,!0)}}}(t,e)},"state_changed")};function j(e,t){return p("_ent",L,P,e,t)}export{n as ERR_CANNOT_CONNECT,r as ERR_INVALID_AUTH,s as ERR_CONNECTION_LOST,i as ERR_HASS_HOST_REQUIRED,d as getAuth,p as createCollection,y as createConnection,w as subscribeConfig,I as subscribeServices,j as subscribeEntities};
//# sourceMappingURL=haws.es.js.map

@@ -1,2 +0,2 @@

function e(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){e.done?s(e.value):new n(function(t){t(e.value)}).then(o,c)}a((r=r.apply(e,t||[])).next())})}function t(e,t){var n,r,s,i,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(s=(s=o.trys).length>0&&s[s.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){o.label=i[1];break}if(6===i[0]&&o.label<s[1]){o.label=s[1],s=i;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(i);break}s[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var n=1,r=2,s=4,i="auth_required",o="auth_invalid",c="auth_ok",a="auth_callback";function u(){return location.protocol+"//"+location.host+"/"}function h(e,t){var n=location.protocol+"//"+location.host+location.pathname+location.search;n+=n.includes("?")?"&":"?",n+=a+"=1",document.location.href=function(e,t,n,r){var s=e+"/auth/authorize?response_type=code&client_id="+encodeURIComponent(t)+"&redirect_uri="+encodeURIComponent(n);return r&&(s+="&state="+encodeURIComponent(r)),s}(e,u(),n,t)}function f(n,r,s){return e(this,void 0,void 0,function(){var e,i,o;return t(this,function(t){switch(t.label){case 0:return(e=new FormData).append("client_id",r),Object.keys(s).forEach(function(t){e.append(t,s[t])}),[4,fetch(n+"/auth/token",{method:"POST",body:e})];case 1:if(!(i=t.sent()).ok)throw new Error("Unable to fetch tokens");return[4,i.json()];case 2:return(o=t.sent()).hassUrl=n,o.expires=1e3*o.expires_in+Date.now(),[2,o]}})})}var l=function(){function n(e,t){this.data=e,this._saveCache=t}return Object.defineProperty(n.prototype,"wsUrl",{get:function(){return"ws"+this.data.hassUrl.substr(4)+"/api/websocket"},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"accessToken",{get:function(){return this.data.access_token},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"expired",{get:function(){return Date.now()>this.data.expires-1e4},enumerable:!0,configurable:!0}),n.prototype.refreshAccessToken=function(){return e(this,void 0,void 0,function(){var e;return t(this,function(t){switch(t.label){case 0:return e=this,[4,(n=this.data.hassUrl,r=u(),s=this.data.refresh_token,f(n,r,{grant_type:"refresh_token",refresh_token:s}))];case 1:return e.data=t.sent(),this._saveCache&&this._saveCache(this.data),[2]}var n,r,s})})},n}();var d=function(){function e(e){this._noSub=e,this.listeners=[]}return e.prototype.action=function(e){var t=this,n=function(e){return t.setState(e,!1)};return function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var i=e.apply(void 0,[t.state].concat(r));if(null!=i)return"then"in i?i.then(n):n(i)}},e.prototype.setState=function(e,t){this.state=t?e:Object.assign({},this.state,e);for(var n=this.listeners,r=0;r<n.length;r++)n[r](this.state)},e.prototype.subscribe=function(e){var t=this;return this.listeners.push(e),void 0!==this.state&&e(this.state),function(){t.unsubscribe(e)}},e.prototype.unsubscribe=function(e){for(var t=e,n=[],r=this.listeners,s=0;s<r.length;s++)r[s]===t?t=null:n.push(r[s]);this.listeners=n,0===n.length&&this._noSub()},e}();function v(n,r,s,i,o){if(n in i)return i[n](o);var c,a=new d(function(){c.then(function(e){return e()}),i.removeEventListener("ready",u),delete i[n]});function u(){return e(this,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:return n=(e=a).setState,[4,r(i)];case 1:return n.apply(e,[t.sent(),!0]),[2]}})})}return i[n]=a.subscribe,c=s(i,a),i.addEventListener("ready",u),u(),a.subscribe(o)}var p=function(){function n(e,t){this.options=t,this.commandId=1,this.commands={},this.eventListeners={},this.closeRequested=!1,this._handleClose=this._handleClose.bind(this),this.setSocket(e)}return n.prototype.setSocket=function(e){var t=this,n=this.socket;if(this.socket=e,e.addEventListener("message",function(e){return t._handleMessage(e)}),e.addEventListener("close",this._handleClose),n){var r=this.commands;this.commandId=1,this.commands={},Object.keys(r).forEach(function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})}),this.fireEvent("ready")}},n.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},n.prototype.removeEventListener=function(e,t){var n=this.eventListeners[e];if(n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}},n.prototype.fireEvent=function(e,t){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n,t)})},n.prototype.close=function(){this.closeRequested=!0,this.socket.close()},n.prototype.getStates=function(){return this.sendMessagePromise({type:"get_states"})},n.prototype.getServices=function(){return this.sendMessagePromise({type:"get_services"})},n.prototype.getConfig=function(){return this.sendMessagePromise({type:"get_config"})},n.prototype.callService=function(e,t,n){return this.sendMessagePromise(function(e,t,n){var r={type:"call_service",domain:e,service:t};return n&&(r.service_data=n),r}(e,t,n))},n.prototype.subscribeEvents=function(n,r){return e(this,void 0,void 0,function(){var s,i,o=this;return t(this,function(c){switch(c.label){case 0:return s=this._genCmdId(),[4,this.sendMessagePromise(function(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}(r),s)];case 1:return c.sent(),this.commands[s]=i={eventCallback:n,eventType:r,unsubscribe:function(){return e(o,void 0,void 0,function(){return t(this,function(e){switch(e.label){case 0:return[4,this.sendMessagePromise((t=s,{type:"unsubscribe_events",subscription:t}))];case 1:return e.sent(),delete this.commands[s],[2]}var t})})}},[2,function(){return i.unsubscribe()}]}})})},n.prototype.ping=function(){return this.sendMessagePromise({type:"ping"})},n.prototype.sendMessage=function(e,t){t||(t=this._genCmdId()),e.id=t,this.socket.send(JSON.stringify(e))},n.prototype.sendMessagePromise=function(e,t){var n=this;return new Promise(function(r,s){t||(t=n._genCmdId()),n.commands[t]={resolve:r,reject:s},n.sendMessage(e,t)})},n.prototype._handleMessage=function(e){var t=JSON.parse(e.data);switch(t.type){case"event":this.commands[t.id].eventCallback(t.event);break;case"result":t.id in this.commands&&(1==t.success?this.commands[t.id].resolve(t.result):this.commands[t.id].reject(t.error),delete this.commands[t.id])}},n.prototype._handleClose=function(){var n=this;if(Object.keys(this.commands).forEach(function(e){var t=n.commands[e].reject;t&&t({type:"result",success:!1,error:{code:3,message:"Connection lost"}})}),!this.closeRequested){this.fireEvent("disconnected");var s=Object.assign({},this.options,{setupRetry:0}),i=function(o){setTimeout(function(){return e(n,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:t.label=1;case 1:return t.trys.push([1,3,,4]),[4,s.createSocket(s)];case 2:return e=t.sent(),this.setSocket(e),[3,4];case 3:return(n=t.sent())===r?this.fireEvent("reconnect-error",n):i(o+1),[3,4];case 4:return[2]}})})},1e3*Math.min(o,5))};i(0)}},n.prototype._genCmdId=function(){return this.commandId+=1,this.commandId},n}(),b={setupRetry:0,createSocket:function(a){if(!a.auth)throw s;var u=a.auth,h=u.wsUrl;return new Promise(function(s,f){return function s(a,f,l){var d=this,v=new WebSocket(h),p=!1,b=function(){if(v.removeEventListener("close",b),p)l(r);else if(0!==a){var e=-1===a?-1:a-1;setTimeout(function(){return s(e,f,l)},1e3)}else l(n)},m=function(n){return e(d,void 0,void 0,function(){return t(this,function(e){switch(e.label){case 0:switch(JSON.parse(n.data).type){case i:return[3,1];case o:return[3,6];case c:return[3,7]}return[3,8];case 1:return e.trys.push([1,4,,5]),u.expired?[4,u.refreshAccessToken()]:[3,3];case 2:e.sent(),e.label=3;case 3:return v.send(JSON.stringify({type:"auth",access_token:u.accessToken})),[3,5];case 4:return e.sent(),p=!0,v.close(),[3,5];case 5:return[3,9];case 6:return p=!0,v.close(),[3,9];case 7:return v.removeEventListener("message",m),v.removeEventListener("close",b),v.removeEventListener("error",b),f(v),[3,9];case 8:e.label=9;case 9:return[2]}})})};v.addEventListener("message",m),v.addEventListener("close",b),v.addEventListener("error",b)}(a.setupRetry,s,f)})}};function m(e,t){return void 0===e?null:{components:e.components.concat(t.data.component)}}var y=function(e){return e.getConfig()},g=function(e,t){return e.subscribeEvents(t.action(m),"component_loaded")};function _(e,t){var n,r;if(void 0===e)return null;var s=t.data,i=s.domain,o=Object.assign({},e[i],((n={})[s.service]={description:"",fields:{}},n));return(r={})[i]=o,r}function w(e,t){var n;if(void 0===e)return null;var r=t.data,s=r.domain,i=r.service,o=e[s];if(!(o&&i in o))return null;var c={};return Object.keys(o).forEach(function(e){e!==i&&(c[e]=o[e])}),(n={})[s]=c,n}var E=function(e){return e.getServices()},k=function(e,t){return Promise.all([e.subscribeEvents(t.action(_),"service_registered"),e.subscribeEvents(t.action(w),"service_removed")]).then(function(e){return function(){return e.forEach(function(e){return e()})}})};function S(n){return e(this,void 0,void 0,function(){var e,r,s,i;return t(this,function(t){switch(t.label){case 0:return[4,n.getStates()];case 1:for(e=t.sent(),r={},s=0;s<e.length;s++)r[(i=e[s]).entity_id]=i;return[2,r]}})})}var C=function(e,t){return e.subscribeEvents(function(e){return function(e,t){var n,r=e.state;if(void 0!==r){var s=t.data,i=s.entity_id,o=s.new_state;if(o)e.setState(((n={})[o.entity_id]=o,n));else{var c=Object.assign({},r);delete c[i],e.setState(c,!0)}}}(t,e)},"state_changed")};exports.ERR_CANNOT_CONNECT=n,exports.ERR_INVALID_AUTH=r,exports.ERR_CONNECTION_LOST=3,exports.ERR_HASS_HOST_REQUIRED=s,exports.getAuth=function(n){var r=void 0===n?{}:n,i=r.hassUrl,o=r.loadCache,c=r.saveCache;return e(this,void 0,void 0,function(){var e,n,r;return t(this,function(t){switch(t.label){case 0:if(!("auth_callback"in(e=function(e){for(var t={},n=e.split("&"),r=0;r<n.length;r++){var s=n[r].split("="),i=decodeURIComponent(s[0]),o=s.length>1?decodeURIComponent(s[1]):void 0;t[i]=o}return t}(location.search.substr(1)))))return[3,4];r=JSON.parse(atob(e.state)),t.label=1;case 1:return t.trys.push([1,3,,4]),[4,function(e,t,n){return f(e,t,{code:n,grant_type:"authorization_code"})}(r.hassUrl,u(),e.code)];case 2:return n=t.sent(),c&&c(n),[3,4];case 3:return t.sent(),[3,4];case 4:return n||!o?[3,6]:[4,o()];case 5:n=t.sent(),t.label=6;case 6:if(!n&&i)return h(i,function(e){return btoa(JSON.stringify(e))}({hassUrl:i})),[2,new Promise(function(){})];if(n)return[2,new l(n,c)];throw s}})})},exports.createCollection=v,exports.createConnection=function(n){return e(this,void 0,void 0,function(){var e,r;return t(this,function(t){switch(t.label){case 0:return[4,(e=Object.assign({},b,n)).createSocket(e)];case 1:return r=t.sent(),[2,new p(r,e)]}})})},exports.subscribeConfig=function(e,t){return v("_cnf",y,g,e,t)},exports.subscribeServices=function(e,t){return v("_srv",E,k,e,t)},exports.subscribeEntities=function(e,t){return v("_ent",S,C,e,t)};
function e(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){e.done?s(e.value):new n(function(t){t(e.value)}).then(o,c)}a((r=r.apply(e,t||[])).next())})}function t(e,t){var n,r,s,i,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(s=(s=o.trys).length>0&&s[s.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){o.label=i[1];break}if(6===i[0]&&o.label<s[1]){o.label=s[1],s=i;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(i);break}s[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var n=1,r=2,s=4,i="auth_required",o="auth_invalid",c="auth_ok",a="auth_callback";function u(e,t,n,r){n+=n.includes("?")?"&":"?",n+=a+"=1",document.location.href=function(e,t,n,r){var s=e+"/auth/authorize?response_type=code&client_id="+encodeURIComponent(t)+"&redirect_uri="+encodeURIComponent(n);return r&&(s+="&state="+encodeURIComponent(r)),s}(e,t,n,r)}function h(n,s,i){return e(this,void 0,void 0,function(){var e,o,c;return t(this,function(t){switch(t.label){case 0:return(e=new FormData).append("client_id",s),Object.keys(i).forEach(function(t){e.append(t,i[t])}),[4,fetch(n+"/auth/token",{method:"POST",body:e})];case 1:if(!(o=t.sent()).ok)throw 400===o.status||403===o.status?r:new Error("Unable to fetch tokens");return[4,o.json()];case 2:return(c=t.sent()).hassUrl=n,c.clientId=s,c.expires=1e3*c.expires_in+Date.now(),[2,c]}})})}var l=function(){function n(e,t){this.data=e,this._saveTokens=t}return Object.defineProperty(n.prototype,"wsUrl",{get:function(){return"ws"+this.data.hassUrl.substr(4)+"/api/websocket"},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"accessToken",{get:function(){return this.data.access_token},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"expired",{get:function(){return Date.now()>this.data.expires},enumerable:!0,configurable:!0}),n.prototype.refreshAccessToken=function(){return e(this,void 0,void 0,function(){var n;return t(this,function(r){switch(r.label){case 0:return n=this,[4,function(n,r,s){return e(this,void 0,void 0,function(){var e;return t(this,function(t){switch(t.label){case 0:return[4,h(n,r,{grant_type:"refresh_token",refresh_token:s})];case 1:return(e=t.sent()).refresh_token=s,[2,e]}})})}(this.data.hassUrl,this.data.clientId,this.data.refresh_token)];case 1:return n.data=r.sent(),this._saveTokens&&this._saveTokens(this.data),[2]}})})},n}();var f=function(){function e(e){this._noSub=e,this.listeners=[]}return e.prototype.action=function(e){var t=this,n=function(e){return t.setState(e,!1)};return function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var i=e.apply(void 0,[t.state].concat(r));if(null!=i)return"then"in i?i.then(n):n(i)}},e.prototype.setState=function(e,t){this.state=t?e:Object.assign({},this.state,e);for(var n=this.listeners,r=0;r<n.length;r++)n[r](this.state)},e.prototype.subscribe=function(e){var t=this;return this.listeners.push(e),void 0!==this.state&&e(this.state),function(){t.unsubscribe(e)}},e.prototype.unsubscribe=function(e){for(var t=e,n=[],r=this.listeners,s=0;s<r.length;s++)r[s]===t?t=null:n.push(r[s]);this.listeners=n,0===n.length&&this._noSub()},e}();function d(n,r,s,i,o){if(n in i)return i[n](o);var c,a=new f(function(){c.then(function(e){return e()}),i.removeEventListener("ready",u),delete i[n]});function u(){return e(this,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:return n=(e=a).setState,[4,r(i)];case 1:return n.apply(e,[t.sent(),!0]),[2]}})})}return i[n]=a.subscribe,c=s(i,a),i.addEventListener("ready",u),u(),a.subscribe(o)}var v=function(){function n(e,t){this.options=t,this.commandId=1,this.commands={},this.eventListeners={},this.closeRequested=!1,this._handleClose=this._handleClose.bind(this),this.setSocket(e)}return n.prototype.setSocket=function(e){var t=this,n=this.socket;if(this.socket=e,e.addEventListener("message",function(e){return t._handleMessage(e)}),e.addEventListener("close",this._handleClose),n){var r=this.commands;this.commandId=1,this.commands={},Object.keys(r).forEach(function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})}),this.fireEvent("ready")}},n.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},n.prototype.removeEventListener=function(e,t){var n=this.eventListeners[e];if(n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}},n.prototype.fireEvent=function(e,t){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n,t)})},n.prototype.close=function(){this.closeRequested=!0,this.socket.close()},n.prototype.getStates=function(){return this.sendMessagePromise({type:"get_states"})},n.prototype.getServices=function(){return this.sendMessagePromise({type:"get_services"})},n.prototype.getConfig=function(){return this.sendMessagePromise({type:"get_config"})},n.prototype.callService=function(e,t,n){return this.sendMessagePromise(function(e,t,n){var r={type:"call_service",domain:e,service:t};return n&&(r.service_data=n),r}(e,t,n))},n.prototype.subscribeEvents=function(n,r){return e(this,void 0,void 0,function(){var s,i,o=this;return t(this,function(c){switch(c.label){case 0:return s=this._genCmdId(),[4,this.sendMessagePromise(function(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}(r),s)];case 1:return c.sent(),this.commands[s]=i={eventCallback:n,eventType:r,unsubscribe:function(){return e(o,void 0,void 0,function(){return t(this,function(e){switch(e.label){case 0:return[4,this.sendMessagePromise((t=s,{type:"unsubscribe_events",subscription:t}))];case 1:return e.sent(),delete this.commands[s],[2]}var t})})}},[2,function(){return i.unsubscribe()}]}})})},n.prototype.ping=function(){return this.sendMessagePromise({type:"ping"})},n.prototype.sendMessage=function(e,t){t||(t=this._genCmdId()),e.id=t,this.socket.send(JSON.stringify(e))},n.prototype.sendMessagePromise=function(e,t){var n=this;return new Promise(function(r,s){t||(t=n._genCmdId()),n.commands[t]={resolve:r,reject:s},n.sendMessage(e,t)})},n.prototype._handleMessage=function(e){var t=JSON.parse(e.data);switch(t.type){case"event":this.commands[t.id].eventCallback(t.event);break;case"result":t.id in this.commands&&(1==t.success?this.commands[t.id].resolve(t.result):this.commands[t.id].reject(t.error),delete this.commands[t.id])}},n.prototype._handleClose=function(){var n=this;if(Object.keys(this.commands).forEach(function(e){var t=n.commands[e].reject;t&&t({type:"result",success:!1,error:{code:3,message:"Connection lost"}})}),!this.closeRequested){this.fireEvent("disconnected");var s=Object.assign({},this.options,{setupRetry:0}),i=function(o){setTimeout(function(){return e(n,void 0,void 0,function(){var e,n;return t(this,function(t){switch(t.label){case 0:t.label=1;case 1:return t.trys.push([1,3,,4]),[4,s.createSocket(s)];case 2:return e=t.sent(),this.setSocket(e),[3,4];case 3:return(n=t.sent())===r?this.fireEvent("reconnect-error",n):i(o+1),[3,4];case 4:return[2]}})})},1e3*Math.min(o,5))};i(0)}},n.prototype._genCmdId=function(){return this.commandId+=1,this.commandId},n}(),p={setupRetry:0,createSocket:function(a){if(!a.auth)throw s;var u=a.auth,h=u.wsUrl;return new Promise(function(s,l){return function s(a,l,f){var d=this,v=new WebSocket(h),p=!1,b=function(){if(v.removeEventListener("close",b),p)f(r);else if(0!==a){var e=-1===a?-1:a-1;setTimeout(function(){return s(e,l,f)},1e3)}else f(n)},m=function(n){return e(d,void 0,void 0,function(){var e;return t(this,function(t){switch(t.label){case 0:switch(JSON.parse(n.data).type){case i:return[3,1];case o:return[3,6];case c:return[3,7]}return[3,8];case 1:return t.trys.push([1,4,,5]),u.expired?[4,u.refreshAccessToken()]:[3,3];case 2:t.sent(),t.label=3;case 3:return v.send(JSON.stringify({type:"auth",access_token:u.accessToken})),[3,5];case 4:return e=t.sent(),p=e===r,v.close(),[3,5];case 5:return[3,9];case 6:return p=!0,v.close(),[3,9];case 7:return v.removeEventListener("message",m),v.removeEventListener("close",b),v.removeEventListener("error",b),l(v),[3,9];case 8:t.label=9;case 9:return[2]}})})};v.addEventListener("message",m),v.addEventListener("close",b),v.addEventListener("error",b)}(a.setupRetry,s,l)})}};function b(e,t){return void 0===e?null:{components:e.components.concat(t.data.component)}}var m=function(e){return e.getConfig()},y=function(e,t){return e.subscribeEvents(t.action(b),"component_loaded")};function g(e,t){var n,r;if(void 0===e)return null;var s=t.data,i=s.domain,o=Object.assign({},e[i],((n={})[s.service]={description:"",fields:{}},n));return(r={})[i]=o,r}function _(e,t){var n;if(void 0===e)return null;var r=t.data,s=r.domain,i=r.service,o=e[s];if(!(o&&i in o))return null;var c={};return Object.keys(o).forEach(function(e){e!==i&&(c[e]=o[e])}),(n={})[s]=c,n}var k=function(e){return e.getServices()},w=function(e,t){return Promise.all([e.subscribeEvents(t.action(g),"service_registered"),e.subscribeEvents(t.action(_),"service_removed")]).then(function(e){return function(){return e.forEach(function(e){return e()})}})};function E(n){return e(this,void 0,void 0,function(){var e,r,s,i;return t(this,function(t){switch(t.label){case 0:return[4,n.getStates()];case 1:for(e=t.sent(),r={},s=0;s<e.length;s++)r[(i=e[s]).entity_id]=i;return[2,r]}})})}var S=function(e,t){return e.subscribeEvents(function(e){return function(e,t){var n,r=e.state;if(void 0!==r){var s=t.data,i=s.entity_id,o=s.new_state;if(o)e.setState(((n={})[o.entity_id]=o,n));else{var c=Object.assign({},r);delete c[i],e.setState(c,!0)}}}(t,e)},"state_changed")};exports.ERR_CANNOT_CONNECT=n,exports.ERR_INVALID_AUTH=r,exports.ERR_CONNECTION_LOST=3,exports.ERR_HASS_HOST_REQUIRED=s,exports.getAuth=function(n){return void 0===n&&(n={}),e(this,void 0,void 0,function(){var e,r,i,o,c,a,f,d,v;return t(this,function(t){switch(t.label){case 0:if(e=n.loadTokens,r=n.saveTokens,!("auth_callback"in(i=function(e){for(var t={},n=e.split("&"),r=0;r<n.length;r++){var s=n[r].split("="),i=decodeURIComponent(s[0]),o=s.length>1?decodeURIComponent(s[1]):void 0;t[i]=o}return t}(location.search.substr(1)))))return[3,4];c=JSON.parse(atob(i.state)),t.label=1;case 1:return t.trys.push([1,3,,4]),[4,function(e,t,n){return h(e,t,{code:n,grant_type:"authorization_code"})}(c.hassUrl,c.clientId,i.code)];case 2:return o=t.sent(),r&&r(o),[3,4];case 3:return a=t.sent(),console.log("Unable to fetch access token",a),[3,4];case 4:return o||!e?[3,6]:[4,e()];case 5:o=t.sent(),t.label=6;case 6:if(o)return[2,new l(o,r)];if(void 0===(f=n.hassUrl))throw s;return"/"===f[f.length-1]&&(f=f.substr(0,f.length-1)),d=n.clientId||location.protocol+"//"+location.host+"/",v=n.redirectUrl||location.protocol+"//"+location.host+location.pathname+location.search,u(f,d,v,function(e){return btoa(JSON.stringify(e))}({hassUrl:f,clientId:d})),[2,new Promise(function(){})]}})})},exports.createCollection=d,exports.createConnection=function(n){return e(this,void 0,void 0,function(){var e,r;return t(this,function(t){switch(t.label){case 0:return[4,(e=Object.assign({},p,n)).createSocket(e)];case 1:return r=t.sent(),[2,new v(r,e)]}})})},exports.subscribeConfig=function(e,t){return d("_cnf",m,y,e,t)},exports.subscribeServices=function(e,t){return d("_srv",k,w,e,t)},exports.subscribeEntities=function(e,t){return d("_ent",E,S,e,t)};
//# sourceMappingURL=haws.js.map

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.HAWS={})}(this,function(e){function t(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){e.done?s(e.value):new n(function(t){t(e.value)}).then(o,c)}a((r=r.apply(e,t||[])).next())})}function n(e,t){var n,r,s,i,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(s=(s=o.trys).length>0&&s[s.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){o.label=i[1];break}if(6===i[0]&&o.label<s[1]){o.label=s[1],s=i;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(i);break}s[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var r=1,s=2,i=4,o="auth_required",c="auth_invalid",a="auth_ok",u="auth_callback";function h(){return location.protocol+"//"+location.host+"/"}function f(e,t){var n=location.protocol+"//"+location.host+location.pathname+location.search;n+=n.includes("?")?"&":"?",n+=u+"=1",document.location.href=function(e,t,n,r){var s=e+"/auth/authorize?response_type=code&client_id="+encodeURIComponent(t)+"&redirect_uri="+encodeURIComponent(n);return r&&(s+="&state="+encodeURIComponent(r)),s}(e,h(),n,t)}function d(e,r,s){return t(this,void 0,void 0,function(){var t,i,o;return n(this,function(n){switch(n.label){case 0:return(t=new FormData).append("client_id",r),Object.keys(s).forEach(function(e){t.append(e,s[e])}),[4,fetch(e+"/auth/token",{method:"POST",body:t})];case 1:if(!(i=n.sent()).ok)throw new Error("Unable to fetch tokens");return[4,i.json()];case 2:return(o=n.sent()).hassUrl=e,o.expires=1e3*o.expires_in+Date.now(),[2,o]}})})}var l=function(){function e(e,t){this.data=e,this._saveCache=t}return Object.defineProperty(e.prototype,"wsUrl",{get:function(){return"ws"+this.data.hassUrl.substr(4)+"/api/websocket"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"accessToken",{get:function(){return this.data.access_token},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"expired",{get:function(){return Date.now()>this.data.expires-1e4},enumerable:!0,configurable:!0}),e.prototype.refreshAccessToken=function(){return t(this,void 0,void 0,function(){var e;return n(this,function(t){switch(t.label){case 0:return e=this,[4,(n=this.data.hassUrl,r=h(),s=this.data.refresh_token,d(n,r,{grant_type:"refresh_token",refresh_token:s}))];case 1:return e.data=t.sent(),this._saveCache&&this._saveCache(this.data),[2]}var n,r,s})})},e}();var v=function(){function e(e){this._noSub=e,this.listeners=[]}return e.prototype.action=function(e){var t=this,n=function(e){return t.setState(e,!1)};return function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var i=e.apply(void 0,[t.state].concat(r));if(null!=i)return"then"in i?i.then(n):n(i)}},e.prototype.setState=function(e,t){this.state=t?e:Object.assign({},this.state,e);for(var n=this.listeners,r=0;r<n.length;r++)n[r](this.state)},e.prototype.subscribe=function(e){var t=this;return this.listeners.push(e),void 0!==this.state&&e(this.state),function(){t.unsubscribe(e)}},e.prototype.unsubscribe=function(e){for(var t=e,n=[],r=this.listeners,s=0;s<r.length;s++)r[s]===t?t=null:n.push(r[s]);this.listeners=n,0===n.length&&this._noSub()},e}();function p(e,r,s,i,o){if(e in i)return i[e](o);var c,a=new v(function(){c.then(function(e){return e()}),i.removeEventListener("ready",u),delete i[e]});function u(){return t(this,void 0,void 0,function(){var e,t;return n(this,function(n){switch(n.label){case 0:return t=(e=a).setState,[4,r(i)];case 1:return t.apply(e,[n.sent(),!0]),[2]}})})}return i[e]=a.subscribe,c=s(i,a),i.addEventListener("ready",u),u(),a.subscribe(o)}var b=function(){function e(e,t){this.options=t,this.commandId=1,this.commands={},this.eventListeners={},this.closeRequested=!1,this._handleClose=this._handleClose.bind(this),this.setSocket(e)}return e.prototype.setSocket=function(e){var t=this,n=this.socket;if(this.socket=e,e.addEventListener("message",function(e){return t._handleMessage(e)}),e.addEventListener("close",this._handleClose),n){var r=this.commands;this.commandId=1,this.commands={},Object.keys(r).forEach(function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})}),this.fireEvent("ready")}},e.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},e.prototype.removeEventListener=function(e,t){var n=this.eventListeners[e];if(n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}},e.prototype.fireEvent=function(e,t){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n,t)})},e.prototype.close=function(){this.closeRequested=!0,this.socket.close()},e.prototype.getStates=function(){return this.sendMessagePromise({type:"get_states"})},e.prototype.getServices=function(){return this.sendMessagePromise({type:"get_services"})},e.prototype.getConfig=function(){return this.sendMessagePromise({type:"get_config"})},e.prototype.callService=function(e,t,n){return this.sendMessagePromise(function(e,t,n){var r={type:"call_service",domain:e,service:t};return n&&(r.service_data=n),r}(e,t,n))},e.prototype.subscribeEvents=function(e,r){return t(this,void 0,void 0,function(){var s,i,o=this;return n(this,function(c){switch(c.label){case 0:return s=this._genCmdId(),[4,this.sendMessagePromise(function(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}(r),s)];case 1:return c.sent(),this.commands[s]=i={eventCallback:e,eventType:r,unsubscribe:function(){return t(o,void 0,void 0,function(){return n(this,function(e){switch(e.label){case 0:return[4,this.sendMessagePromise((t=s,{type:"unsubscribe_events",subscription:t}))];case 1:return e.sent(),delete this.commands[s],[2]}var t})})}},[2,function(){return i.unsubscribe()}]}})})},e.prototype.ping=function(){return this.sendMessagePromise({type:"ping"})},e.prototype.sendMessage=function(e,t){t||(t=this._genCmdId()),e.id=t,this.socket.send(JSON.stringify(e))},e.prototype.sendMessagePromise=function(e,t){var n=this;return new Promise(function(r,s){t||(t=n._genCmdId()),n.commands[t]={resolve:r,reject:s},n.sendMessage(e,t)})},e.prototype._handleMessage=function(e){var t=JSON.parse(e.data);switch(t.type){case"event":this.commands[t.id].eventCallback(t.event);break;case"result":t.id in this.commands&&(1==t.success?this.commands[t.id].resolve(t.result):this.commands[t.id].reject(t.error),delete this.commands[t.id])}},e.prototype._handleClose=function(){var e=this;if(Object.keys(this.commands).forEach(function(t){var n=e.commands[t].reject;n&&n({type:"result",success:!1,error:{code:3,message:"Connection lost"}})}),!this.closeRequested){this.fireEvent("disconnected");var r=Object.assign({},this.options,{setupRetry:0}),i=function(o){setTimeout(function(){return t(e,void 0,void 0,function(){var e,t;return n(this,function(n){switch(n.label){case 0:n.label=1;case 1:return n.trys.push([1,3,,4]),[4,r.createSocket(r)];case 2:return e=n.sent(),this.setSocket(e),[3,4];case 3:return(t=n.sent())===s?this.fireEvent("reconnect-error",t):i(o+1),[3,4];case 4:return[2]}})})},1e3*Math.min(o,5))};i(0)}},e.prototype._genCmdId=function(){return this.commandId+=1,this.commandId},e}(),m={setupRetry:0,createSocket:function(e){if(!e.auth)throw i;var u=e.auth,h=u.wsUrl;return new Promise(function(i,f){return function e(i,f,d){var l=this,v=new WebSocket(h),p=!1,b=function(){if(v.removeEventListener("close",b),p)d(s);else if(0!==i){var t=-1===i?-1:i-1;setTimeout(function(){return e(t,f,d)},1e3)}else d(r)},m=function(e){return t(l,void 0,void 0,function(){return n(this,function(t){switch(t.label){case 0:switch(JSON.parse(e.data).type){case o:return[3,1];case c:return[3,6];case a:return[3,7]}return[3,8];case 1:return t.trys.push([1,4,,5]),u.expired?[4,u.refreshAccessToken()]:[3,3];case 2:t.sent(),t.label=3;case 3:return v.send(JSON.stringify({type:"auth",access_token:u.accessToken})),[3,5];case 4:return t.sent(),p=!0,v.close(),[3,5];case 5:return[3,9];case 6:return p=!0,v.close(),[3,9];case 7:return v.removeEventListener("message",m),v.removeEventListener("close",b),v.removeEventListener("error",b),f(v),[3,9];case 8:t.label=9;case 9:return[2]}})})};v.addEventListener("message",m),v.addEventListener("close",b),v.addEventListener("error",b)}(e.setupRetry,i,f)})}};function y(e,t){return void 0===e?null:{components:e.components.concat(t.data.component)}}var g=function(e){return e.getConfig()},_=function(e,t){return e.subscribeEvents(t.action(y),"component_loaded")};function w(e,t){var n,r;if(void 0===e)return null;var s=t.data,i=s.domain,o=Object.assign({},e[i],((n={})[s.service]={description:"",fields:{}},n));return(r={})[i]=o,r}function E(e,t){var n;if(void 0===e)return null;var r=t.data,s=r.domain,i=r.service,o=e[s];if(!(o&&i in o))return null;var c={};return Object.keys(o).forEach(function(e){e!==i&&(c[e]=o[e])}),(n={})[s]=c,n}var k=function(e){return e.getServices()},S=function(e,t){return Promise.all([e.subscribeEvents(t.action(w),"service_registered"),e.subscribeEvents(t.action(E),"service_removed")]).then(function(e){return function(){return e.forEach(function(e){return e()})}})};function C(e){return t(this,void 0,void 0,function(){var t,r,s,i;return n(this,function(n){switch(n.label){case 0:return[4,e.getStates()];case 1:for(t=n.sent(),r={},s=0;s<t.length;s++)r[(i=t[s]).entity_id]=i;return[2,r]}})})}var O=function(e,t){return e.subscribeEvents(function(e){return function(e,t){var n,r=e.state;if(void 0!==r){var s=t.data,i=s.entity_id,o=s.new_state;if(o)e.setState(((n={})[o.entity_id]=o,n));else{var c=Object.assign({},r);delete c[i],e.setState(c,!0)}}}(t,e)},"state_changed")};e.ERR_CANNOT_CONNECT=r,e.ERR_INVALID_AUTH=s,e.ERR_CONNECTION_LOST=3,e.ERR_HASS_HOST_REQUIRED=i,e.getAuth=function(e){var r=void 0===e?{}:e,s=r.hassUrl,o=r.loadCache,c=r.saveCache;return t(this,void 0,void 0,function(){var e,t,r;return n(this,function(n){switch(n.label){case 0:if(!("auth_callback"in(e=function(e){for(var t={},n=e.split("&"),r=0;r<n.length;r++){var s=n[r].split("="),i=decodeURIComponent(s[0]),o=s.length>1?decodeURIComponent(s[1]):void 0;t[i]=o}return t}(location.search.substr(1)))))return[3,4];r=JSON.parse(atob(e.state)),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,function(e,t,n){return d(e,t,{code:n,grant_type:"authorization_code"})}(r.hassUrl,h(),e.code)];case 2:return t=n.sent(),c&&c(t),[3,4];case 3:return n.sent(),[3,4];case 4:return t||!o?[3,6]:[4,o()];case 5:t=n.sent(),n.label=6;case 6:if(!t&&s)return f(s,function(e){return btoa(JSON.stringify(e))}({hassUrl:s})),[2,new Promise(function(){})];if(t)return[2,new l(t,c)];throw i}})})},e.createCollection=p,e.createConnection=function(e){return t(this,void 0,void 0,function(){var t,r;return n(this,function(n){switch(n.label){case 0:return[4,(t=Object.assign({},m,e)).createSocket(t)];case 1:return r=n.sent(),[2,new b(r,t)]}})})},e.subscribeConfig=function(e,t){return p("_cnf",g,_,e,t)},e.subscribeServices=function(e,t){return p("_srv",k,S,e,t)},e.subscribeEntities=function(e,t){return p("_ent",C,O,e,t)}});
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.HAWS={})}(this,function(e){function t(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){e.done?s(e.value):new n(function(t){t(e.value)}).then(o,c)}a((r=r.apply(e,t||[])).next())})}function n(e,t){var n,r,s,i,o={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(s=2&i[0]?r.return:i[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,i[1])).done)return s;switch(r=0,s&&(i=[2&i[0],s.value]),i[0]){case 0:case 1:s=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(s=(s=o.trys).length>0&&s[s.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!s||i[1]>s[0]&&i[1]<s[3])){o.label=i[1];break}if(6===i[0]&&o.label<s[1]){o.label=s[1],s=i;break}if(s&&o.label<s[2]){o.label=s[2],o.ops.push(i);break}s[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=s=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var r=1,s=2,i=4,o="auth_required",c="auth_invalid",a="auth_ok",u="auth_callback";function f(e,t,n,r){n+=n.includes("?")?"&":"?",n+=u+"=1",document.location.href=function(e,t,n,r){var s=e+"/auth/authorize?response_type=code&client_id="+encodeURIComponent(t)+"&redirect_uri="+encodeURIComponent(n);return r&&(s+="&state="+encodeURIComponent(r)),s}(e,t,n,r)}function h(e,r,i){return t(this,void 0,void 0,function(){var t,o,c;return n(this,function(n){switch(n.label){case 0:return(t=new FormData).append("client_id",r),Object.keys(i).forEach(function(e){t.append(e,i[e])}),[4,fetch(e+"/auth/token",{method:"POST",body:t})];case 1:if(!(o=n.sent()).ok)throw 400===o.status||403===o.status?s:new Error("Unable to fetch tokens");return[4,o.json()];case 2:return(c=n.sent()).hassUrl=e,c.clientId=r,c.expires=1e3*c.expires_in+Date.now(),[2,c]}})})}var l=function(){function e(e,t){this.data=e,this._saveTokens=t}return Object.defineProperty(e.prototype,"wsUrl",{get:function(){return"ws"+this.data.hassUrl.substr(4)+"/api/websocket"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"accessToken",{get:function(){return this.data.access_token},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"expired",{get:function(){return Date.now()>this.data.expires},enumerable:!0,configurable:!0}),e.prototype.refreshAccessToken=function(){return t(this,void 0,void 0,function(){var e;return n(this,function(r){switch(r.label){case 0:return e=this,[4,function(e,r,s){return t(this,void 0,void 0,function(){var t;return n(this,function(n){switch(n.label){case 0:return[4,h(e,r,{grant_type:"refresh_token",refresh_token:s})];case 1:return(t=n.sent()).refresh_token=s,[2,t]}})})}(this.data.hassUrl,this.data.clientId,this.data.refresh_token)];case 1:return e.data=r.sent(),this._saveTokens&&this._saveTokens(this.data),[2]}})})},e}();var d=function(){function e(e){this._noSub=e,this.listeners=[]}return e.prototype.action=function(e){var t=this,n=function(e){return t.setState(e,!1)};return function(){for(var r=[],s=0;s<arguments.length;s++)r[s]=arguments[s];var i=e.apply(void 0,[t.state].concat(r));if(null!=i)return"then"in i?i.then(n):n(i)}},e.prototype.setState=function(e,t){this.state=t?e:Object.assign({},this.state,e);for(var n=this.listeners,r=0;r<n.length;r++)n[r](this.state)},e.prototype.subscribe=function(e){var t=this;return this.listeners.push(e),void 0!==this.state&&e(this.state),function(){t.unsubscribe(e)}},e.prototype.unsubscribe=function(e){for(var t=e,n=[],r=this.listeners,s=0;s<r.length;s++)r[s]===t?t=null:n.push(r[s]);this.listeners=n,0===n.length&&this._noSub()},e}();function v(e,r,s,i,o){if(e in i)return i[e](o);var c,a=new d(function(){c.then(function(e){return e()}),i.removeEventListener("ready",u),delete i[e]});function u(){return t(this,void 0,void 0,function(){var e,t;return n(this,function(n){switch(n.label){case 0:return t=(e=a).setState,[4,r(i)];case 1:return t.apply(e,[n.sent(),!0]),[2]}})})}return i[e]=a.subscribe,c=s(i,a),i.addEventListener("ready",u),u(),a.subscribe(o)}var p=function(){function e(e,t){this.options=t,this.commandId=1,this.commands={},this.eventListeners={},this.closeRequested=!1,this._handleClose=this._handleClose.bind(this),this.setSocket(e)}return e.prototype.setSocket=function(e){var t=this,n=this.socket;if(this.socket=e,e.addEventListener("message",function(e){return t._handleMessage(e)}),e.addEventListener("close",this._handleClose),n){var r=this.commands;this.commandId=1,this.commands={},Object.keys(r).forEach(function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})}),this.fireEvent("ready")}},e.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},e.prototype.removeEventListener=function(e,t){var n=this.eventListeners[e];if(n){var r=n.indexOf(t);-1!==r&&n.splice(r,1)}},e.prototype.fireEvent=function(e,t){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n,t)})},e.prototype.close=function(){this.closeRequested=!0,this.socket.close()},e.prototype.getStates=function(){return this.sendMessagePromise({type:"get_states"})},e.prototype.getServices=function(){return this.sendMessagePromise({type:"get_services"})},e.prototype.getConfig=function(){return this.sendMessagePromise({type:"get_config"})},e.prototype.callService=function(e,t,n){return this.sendMessagePromise(function(e,t,n){var r={type:"call_service",domain:e,service:t};return n&&(r.service_data=n),r}(e,t,n))},e.prototype.subscribeEvents=function(e,r){return t(this,void 0,void 0,function(){var s,i,o=this;return n(this,function(c){switch(c.label){case 0:return s=this._genCmdId(),[4,this.sendMessagePromise(function(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}(r),s)];case 1:return c.sent(),this.commands[s]=i={eventCallback:e,eventType:r,unsubscribe:function(){return t(o,void 0,void 0,function(){return n(this,function(e){switch(e.label){case 0:return[4,this.sendMessagePromise((t=s,{type:"unsubscribe_events",subscription:t}))];case 1:return e.sent(),delete this.commands[s],[2]}var t})})}},[2,function(){return i.unsubscribe()}]}})})},e.prototype.ping=function(){return this.sendMessagePromise({type:"ping"})},e.prototype.sendMessage=function(e,t){t||(t=this._genCmdId()),e.id=t,this.socket.send(JSON.stringify(e))},e.prototype.sendMessagePromise=function(e,t){var n=this;return new Promise(function(r,s){t||(t=n._genCmdId()),n.commands[t]={resolve:r,reject:s},n.sendMessage(e,t)})},e.prototype._handleMessage=function(e){var t=JSON.parse(e.data);switch(t.type){case"event":this.commands[t.id].eventCallback(t.event);break;case"result":t.id in this.commands&&(1==t.success?this.commands[t.id].resolve(t.result):this.commands[t.id].reject(t.error),delete this.commands[t.id])}},e.prototype._handleClose=function(){var e=this;if(Object.keys(this.commands).forEach(function(t){var n=e.commands[t].reject;n&&n({type:"result",success:!1,error:{code:3,message:"Connection lost"}})}),!this.closeRequested){this.fireEvent("disconnected");var r=Object.assign({},this.options,{setupRetry:0}),i=function(o){setTimeout(function(){return t(e,void 0,void 0,function(){var e,t;return n(this,function(n){switch(n.label){case 0:n.label=1;case 1:return n.trys.push([1,3,,4]),[4,r.createSocket(r)];case 2:return e=n.sent(),this.setSocket(e),[3,4];case 3:return(t=n.sent())===s?this.fireEvent("reconnect-error",t):i(o+1),[3,4];case 4:return[2]}})})},1e3*Math.min(o,5))};i(0)}},e.prototype._genCmdId=function(){return this.commandId+=1,this.commandId},e}(),b={setupRetry:0,createSocket:function(e){if(!e.auth)throw i;var u=e.auth,f=u.wsUrl;return new Promise(function(i,h){return function e(i,h,l){var d=this,v=new WebSocket(f),p=!1,b=function(){if(v.removeEventListener("close",b),p)l(s);else if(0!==i){var t=-1===i?-1:i-1;setTimeout(function(){return e(t,h,l)},1e3)}else l(r)},m=function(e){return t(d,void 0,void 0,function(){var t;return n(this,function(n){switch(n.label){case 0:switch(JSON.parse(e.data).type){case o:return[3,1];case c:return[3,6];case a:return[3,7]}return[3,8];case 1:return n.trys.push([1,4,,5]),u.expired?[4,u.refreshAccessToken()]:[3,3];case 2:n.sent(),n.label=3;case 3:return v.send(JSON.stringify({type:"auth",access_token:u.accessToken})),[3,5];case 4:return t=n.sent(),p=t===s,v.close(),[3,5];case 5:return[3,9];case 6:return p=!0,v.close(),[3,9];case 7:return v.removeEventListener("message",m),v.removeEventListener("close",b),v.removeEventListener("error",b),h(v),[3,9];case 8:n.label=9;case 9:return[2]}})})};v.addEventListener("message",m),v.addEventListener("close",b),v.addEventListener("error",b)}(e.setupRetry,i,h)})}};function m(e,t){return void 0===e?null:{components:e.components.concat(t.data.component)}}var y=function(e){return e.getConfig()},g=function(e,t){return e.subscribeEvents(t.action(m),"component_loaded")};function _(e,t){var n,r;if(void 0===e)return null;var s=t.data,i=s.domain,o=Object.assign({},e[i],((n={})[s.service]={description:"",fields:{}},n));return(r={})[i]=o,r}function k(e,t){var n;if(void 0===e)return null;var r=t.data,s=r.domain,i=r.service,o=e[s];if(!(o&&i in o))return null;var c={};return Object.keys(o).forEach(function(e){e!==i&&(c[e]=o[e])}),(n={})[s]=c,n}var w=function(e){return e.getServices()},E=function(e,t){return Promise.all([e.subscribeEvents(t.action(_),"service_registered"),e.subscribeEvents(t.action(k),"service_removed")]).then(function(e){return function(){return e.forEach(function(e){return e()})}})};function S(e){return t(this,void 0,void 0,function(){var t,r,s,i;return n(this,function(n){switch(n.label){case 0:return[4,e.getStates()];case 1:for(t=n.sent(),r={},s=0;s<t.length;s++)r[(i=t[s]).entity_id]=i;return[2,r]}})})}var C=function(e,t){return e.subscribeEvents(function(e){return function(e,t){var n,r=e.state;if(void 0!==r){var s=t.data,i=s.entity_id,o=s.new_state;if(o)e.setState(((n={})[o.entity_id]=o,n));else{var c=Object.assign({},r);delete c[i],e.setState(c,!0)}}}(t,e)},"state_changed")};e.ERR_CANNOT_CONNECT=r,e.ERR_INVALID_AUTH=s,e.ERR_CONNECTION_LOST=3,e.ERR_HASS_HOST_REQUIRED=i,e.getAuth=function(e){return void 0===e&&(e={}),t(this,void 0,void 0,function(){var t,r,s,o,c,a,u,d,v;return n(this,function(n){switch(n.label){case 0:if(t=e.loadTokens,r=e.saveTokens,!("auth_callback"in(s=function(e){for(var t={},n=e.split("&"),r=0;r<n.length;r++){var s=n[r].split("="),i=decodeURIComponent(s[0]),o=s.length>1?decodeURIComponent(s[1]):void 0;t[i]=o}return t}(location.search.substr(1)))))return[3,4];c=JSON.parse(atob(s.state)),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,function(e,t,n){return h(e,t,{code:n,grant_type:"authorization_code"})}(c.hassUrl,c.clientId,s.code)];case 2:return o=n.sent(),r&&r(o),[3,4];case 3:return a=n.sent(),console.log("Unable to fetch access token",a),[3,4];case 4:return o||!t?[3,6]:[4,t()];case 5:o=n.sent(),n.label=6;case 6:if(o)return[2,new l(o,r)];if(void 0===(u=e.hassUrl))throw i;return"/"===u[u.length-1]&&(u=u.substr(0,u.length-1)),d=e.clientId||location.protocol+"//"+location.host+"/",v=e.redirectUrl||location.protocol+"//"+location.host+location.pathname+location.search,f(u,d,v,function(e){return btoa(JSON.stringify(e))}({hassUrl:u,clientId:d})),[2,new Promise(function(){})]}})})},e.createCollection=v,e.createConnection=function(e){return t(this,void 0,void 0,function(){var t,r;return n(this,function(n){switch(n.label){case 0:return[4,(t=Object.assign({},b,e)).createSocket(t)];case 1:return r=n.sent(),[2,new p(r,t)]}})})},e.subscribeConfig=function(e,t){return v("_cnf",y,g,e,t)},e.subscribeServices=function(e,t){return v("_srv",w,E,e,t)},e.subscribeEntities=function(e,t){return v("_ent",S,C,e,t)}});
//# sourceMappingURL=haws.umd.js.map

@@ -1,4 +0,4 @@

import { HassServices } from "./types";
import { HassServices, UnsubscribeFunc } from "./types";
import { Connection } from "./connection";
declare const _default: (conn: Connection, onChange: (state: HassServices) => void) => import("../../../../../../Users/paulus/dev/hass/home-assistant-js-websocket/lib/types").UnsubscribeFunc;
declare const _default: (conn: Connection, onChange: (state: HassServices) => void) => UnsubscribeFunc;
export default _default;

@@ -5,3 +5,3 @@ {

"sideEffects": false,
"version": "3.0.0-rc3",
"version": "3.0.0-rc4",
"description": "Home Assistant websocket client",

@@ -26,3 +26,3 @@ "source": "lib/index.ts",

"lint-staged": "^7.2.0",
"microbundle": "^0.5.1",
"microbundle": "^0.6.0",
"mocha": "^5.1.1",

@@ -29,0 +29,0 @@ "prettier": "1.14.0",

@@ -7,3 +7,3 @@ # :aerial_tramway: JavaScript websocket client for Home Assistant

We've included an [example client](https://github.com/home-assistant/home-assistant-js-websocket/blob/master/example.html) based on this lib so that it's easy to try it out:
Check [the demo](https://hass-auth-demo.glitch.me/). The repository also includes an [example client](https://github.com/home-assistant/home-assistant-js-websocket/blob/master/example.html):

@@ -18,6 +18,4 @@ ```bash

### Initializing connection
To initialize a connection, you need an authentication token for the instance that you want to connect to. This library implements the necessary steps to guide the user to authenticate your website with their Home Assistant instance and give you a token. All you need from the user is the url of their instance.
To initialize a connection, you need an authentication token for the instance that you want to connect to. This library implements the necessary steps to guide the user to authenticate your website with their Home Assistant instance and give you a token. All you need from the user is ask the url of their instance.
```js

@@ -35,2 +33,3 @@ // Example connect code

try {
// Try to pick up authentication after user logs in
auth = await getAuth();

@@ -43,2 +42,3 @@ } catch (err) {

);
// Redirect user to log in on their instance
auth = await getAuth({ hassUrl });

@@ -57,24 +57,60 @@ } else {

Connections to the websocket API are initiated by calling `createConnection(options)`. This method will return a promise that will resolve to either a `Connection` object or rejects with error codes `ERR_INVALID_AUTH` or `ERR_CANNOT_CONNECT`.
### `getAuth()`
#### Available options
Use this method to get authentication from a server via OAuth2. This method will handle redirecting to an instance and fetchin the token after the user successful logs in.
Currently the following options are available:
You can pass options using the syntax:
| Option | Description |
| ------------ | -------------------------------------------------------------------------------------------------------------------- |
| setupRetry | Number of times to retry initial connection when it fails. Set to -1 for infinite retries. Default is 0 (no retries) |
| createSocket | Override the createSocket method with your own. `(auth, options) => Promise<WebSocket>` |
```js
getAuth({ hassUrl: "http://localhost:8123" });
```
#### Possible error codes
| Option | Description |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| hassUrl | The url where the Home Assistant instance can be reached. This option is needed so we know where to redirect the user for authentication. Once redirected back, it is not needed to pass this option in. |
| clientId | Client ID to use. Client IDs for Home Assistant is the url of your application. Defaults to domain of current page. |
| redirectUrl | The url to redirect back to when the user has logged in. Defaults to current page. |
| saveTokens | Function to store an object containing the token information. |
| loadTokens | Function that returns a promise that resolves to previously stored token information object or undefined if no info available. |
Currently the following error codes can be expected:
In certain instances `getAuth` will raise an error. These errors can be imported from the package:
| Error | Description |
| ---------------------- | ----------------------------------------------------------------------- |
| ERR_CANNOT_CONNECT | If the client was unable to connect to the websocket API. |
| ERR_INVALID_AUTH | If the supplied authentication was invalid. |
| ERR_CONNECTION_LOST | Raised if connection closed while waiting for a message to be returned. |
| ERR_HASS_HOST_REQUIRED | If the authentication requires a host to be defined. |
```js
// When bundling your application
import {
ERR_HASS_HOST_REQUIRED,
ERR_INVALID_AUTH
} from "home-assistant-js-websocket";
// When using the UMD build
HAWS.ERR_HASS_HOST_REQUIRED;
```
| Error | Description |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ERR_HASS_HOST_REQUIRED` | You need to pass in `hassUrl` to `getAuth` to continue getting auth. This option is not needed when the user is redirected back after successfully logging in. |
| `ERR_INVALID_AUTH` | This error will be raised if the url contains an authorization code that is no longer valid. |
| Other errors | Unknown error! |
### `createConnection()`
You need to either provide `auth` or `createSocket` as options to createConnection:
```js
createConnection({ auth });
```
| Option | Description |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| auth | Auth object to use to create a connection. |
| createSocket | Override the createSocket method with your own. `(options) => Promise<WebSocket>`. Needs to return a connection that is already authenticated. |
| setupRetry | Number of times to retry initial connection when it fails. Set to -1 for infinite retries. Default is 0 (no retries) |
Currently the following error codes can be raised by createConnection:
| Error | Description |
| ------------------ | --------------------------------------------------------- |
| ERR_CANNOT_CONNECT | If the client was unable to connect to the websocket API. |
| ERR_INVALID_AUTH | If the supplied authentication was invalid. |
You can import them into your code as follows:

@@ -89,3 +125,3 @@

#### Automatic reconnecting
### Automatic reconnecting

@@ -240,11 +276,24 @@ The connection object will automatically try to reconnect to the server when the connection gets lost. On reconnect, it will automatically resubscribe the event listeners.

##### `conn.sendMessagePromise(message)`
Send a message to the server. Returns a promise that resolves or rejects based on the result of the server. Special case rejection is `ERR_CONNECTION_LOST` if the connection is lost while the command is in progress.
## Using this in NodeJS
To use this package in NodeJS, install the [ws package](https://www.npmjs.com/package/ws) and make it available as `WebSocket` on the `global` object before importing this package.
To use this package in NodeJS, you will want to define your own `createSocket` method for `createConnection` to use. Your createSocket function will need to set up the web socket connection with Home Assistant and handle the auth.
```js
const WebSocket = require("ws");
global.WebSocket = WebSocket;
createConnection({
createSocket() {
// Open connection
const ws = new WebSocket("ws://localhost:8123");
// Functions to handle authentication with Home Assistant
// Implement yourself :)
return ws;
}
});
```
You'll also need to instantiate your own Auth object.
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc