home-assistant-js-websocket
Advanced tools
Comparing version 0.1.2 to 0.1.3
@@ -1,1 +0,283 @@ | ||
"use strict";function auth(e){return{type:"auth",api_password:e}}function states(){return{type:"get_states"}}function config(){return{type:"get_config"}}function services(){return{type:"get_services"}}function panels(){return{type:"get_panels"}}function callService$1(e,n,t){var s={type:"call_service",domain:e,service:n};return t&&(s.service_data=t),s}function subscribeEvents$1(e){var n={type:"subscribe_events"};return e&&(n.event_type=e),n}function unsubscribeEvents(e){return{type:"unsubscribe_events",subscription:e}}function extractResult(e){return e.result}function createConnection(e,n){var t=new Connection(e,n);return t.connect()}Object.defineProperty(exports,"__esModule",{value:!0});var ERR_CANNOT_CONNECT=1,ERR_INVALID_AUTH=2,Connection=function(e,n){this.url=e,this.options=n||{},this.commandId=1,this.commands={},this.connectionTries=0,this.eventListeners={}};Connection.prototype.addEventListener=function(e,n){var t=this.eventListeners[e];t||(t=this.eventListeners[e]=[]),t.push(n)},Connection.prototype.fireEvent=function(e){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n)})},Connection.prototype.connect=function(){var e=this;return new Promise(function(n,t){var s=e.commands;Object.keys(s).forEach(function(e){var n=s[e];n.reject&&n.reject()});var o=!1;e.connectionTries+=1,e.socket=new WebSocket(e.url),e.socket.addEventListener("open",function(){e.connectionTries=0}),e.socket.addEventListener("message",function(r){var i=JSON.parse(r.data);switch(i.type){case"auth_required":e.sendMessage(auth(e.options.authToken));break;case"auth_invalid":t({code:ERR_INVALID_AUTH}),o=!0;break;case"auth_ok":n(e),e.fireEvent("ready"),e.commandId=1,e.commands={},Object.keys(s).forEach(function(n){var t=s[n];t.eventType&&e.subscribeEvents(t.eventCallback,t.eventType).then(function(e){t.unsubscribe=e})});break;case"event":e.commands[i.id].eventCallback(i.event);break;case"result":i.success?e.commands[i.id].resolve(i):e.commands[i.id].reject(i.error),delete e.commands[i.id]}}),e.socket.addEventListener("close",function(){if(!o){0===e.connectionTries?e.fireEvent("disconnected"):t(ERR_CANNOT_CONNECT);var n=1e3*Math.min(e.connectionTries,5);setTimeout(function(){return e.connect()},n)}})})},Connection.prototype.getStates=function(){return this.sendMessagePromise(states()).then(extractResult)},Connection.prototype.getServices=function(){return this.sendMessagePromise(services()).then(extractResult)},Connection.prototype.getPanels=function(){return this.sendMessagePromise(panels()).then(extractResult)},Connection.prototype.getConfig=function(){return this.sendMessagePromise(config()).then(extractResult)},Connection.prototype.callService=function(e,n,t){return this.sendMessagePromise(callService$1(e,n,t))},Connection.prototype.subscribeEvents=function(e,n){var t=this;return this.sendMessagePromise(subscribeEvents$1(n)).then(function(s){var o={eventCallback:e,eventType:n,unsubscribe:function(){return t.sendMessagePromise(unsubscribeEvents(s.id)).then(function(){delete t.commands[s.id]})}};return t.commands[s.id]=o,function(){return o.unsubscribe()}})},Connection.prototype.sendMessage=function(e){this.socket.send(JSON.stringify(e))},Connection.prototype.sendMessagePromise=function(e){var n=this;return new Promise(function(t,s){n.commandId+=1;var o=n.commandId;e.id=o,n.commands[o]={resolve:t,reject:s},n.sendMessage(e)})},exports.ERR_CANNOT_CONNECT=ERR_CANNOT_CONNECT,exports.ERR_INVALID_AUTH=ERR_INVALID_AUTH,exports.createConnection=createConnection,exports.default=createConnection; | ||
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
function auth(authToken) { | ||
return { | ||
type: 'auth', | ||
api_password: authToken, | ||
}; | ||
} | ||
function states() { | ||
return { | ||
type: 'get_states', | ||
}; | ||
} | ||
function config() { | ||
return { | ||
type: 'get_config', | ||
}; | ||
} | ||
function services() { | ||
return { | ||
type: 'get_services', | ||
}; | ||
} | ||
function panels() { | ||
return { | ||
type: 'get_panels', | ||
}; | ||
} | ||
function callService$1(domain, service, serviceData) { | ||
var message = { | ||
type: 'call_service', | ||
domain: domain, | ||
service: service, | ||
}; | ||
if (serviceData) { | ||
message.service_data = serviceData; | ||
} | ||
return message; | ||
} | ||
function subscribeEvents$1(eventType) { | ||
var message = { | ||
type: 'subscribe_events', | ||
}; | ||
if (eventType) { | ||
message.event_type = eventType; | ||
} | ||
return message; | ||
} | ||
function unsubscribeEvents(subscription) { | ||
return { | ||
type: 'unsubscribe_events', | ||
subscription: subscription, | ||
}; | ||
} | ||
var ERR_CANNOT_CONNECT = 1; | ||
var ERR_INVALID_AUTH = 2; | ||
function extractResult(message) { | ||
return message.result; | ||
} | ||
var Connection = function Connection(url, options) { | ||
this.url = url; | ||
this.options = options || {}; | ||
this.commandId = 1; | ||
this.commands = {}; | ||
this.connectionTries = 0; | ||
this.eventListeners = {}; | ||
this.closeRequested = false; | ||
}; | ||
Connection.prototype.addEventListener = function addEventListener (eventType, callback) { | ||
var listeners = this.eventListeners[eventType]; | ||
if (!listeners) { | ||
listeners = this.eventListeners[eventType] = []; | ||
} | ||
listeners.push(callback); | ||
}; | ||
Connection.prototype.fireEvent = function fireEvent (eventType) { | ||
var this$1 = this; | ||
(this.eventListeners[eventType] || []).forEach(function (callback) { return callback(this$1); }); | ||
}; | ||
Connection.prototype.connect = function connect () { | ||
var this$1 = this; | ||
return new Promise(function (resolve, reject) { | ||
// Used for resubscribing in the future | ||
var oldCommands = this$1.commands; | ||
Object.keys(oldCommands).forEach(function (id) { | ||
var info = oldCommands[id]; | ||
// Reject stuff still waiting for an answer | ||
if (info.reject) { | ||
info.reject(); | ||
} | ||
}); | ||
// If invalid auth, we will not try to reconnect. | ||
var invalidAuth = false; | ||
this$1.connectionTries += 1; | ||
this$1.socket = new WebSocket(this$1.url); | ||
this$1.socket.addEventListener('open', function () { | ||
this$1.connectionTries = 0; | ||
}); | ||
this$1.socket.addEventListener('message', function (event) { | ||
var message = JSON.parse(event.data); | ||
{ | ||
/* eslint-disable no-console */ | ||
console.log(message); | ||
/* eslint-enable no-console */ | ||
} | ||
switch (message.type) { | ||
case 'auth_required': | ||
this$1.sendMessage(auth(this$1.options.authToken)); | ||
break; | ||
case 'auth_invalid': | ||
reject({ code: ERR_INVALID_AUTH }); | ||
invalidAuth = true; | ||
break; | ||
case 'auth_ok': | ||
resolve(this$1); | ||
this$1.fireEvent('ready'); | ||
// Re-subscribe to events and update old location of unsub method | ||
// so old unsub method keeps working. | ||
this$1.commandId = 1; | ||
this$1.commands = {}; | ||
Object.keys(oldCommands).forEach(function (id) { | ||
var info = oldCommands[id]; | ||
if (info.eventType) { | ||
this$1.subscribeEvents(info.eventCallback, info.eventType) | ||
.then(function (unsub) { info.unsubscribe = unsub; }); | ||
} | ||
}); | ||
break; | ||
case 'event': | ||
this$1.commands[message.id].eventCallback(message.event); | ||
break; | ||
case 'result': | ||
if (message.success) { | ||
this$1.commands[message.id].resolve(message); | ||
} else { | ||
this$1.commands[message.id].reject(message.error); | ||
} | ||
delete this$1.commands[message.id]; | ||
break; | ||
default: | ||
{ | ||
/* eslint-disable no-console */ | ||
console.warn('Unhandled message', message); | ||
/* eslint-enable no-console */ | ||
} | ||
} | ||
}); | ||
this$1.socket.addEventListener('close', function () { | ||
if (invalidAuth || this$1.closeRequested) { | ||
// When we have invalid auth, let's not reconnect or we get banned. | ||
return; | ||
} else if (this$1.connectionTries === 0) { | ||
// We were connected at some point. | ||
this$1.fireEvent('disconnected'); | ||
} else { | ||
// We never were connected | ||
reject(ERR_CANNOT_CONNECT); | ||
} | ||
// Try again | ||
var waitTime = Math.min(this$1.connectionTries, 5) * 1000; | ||
setTimeout(function () { return this$1.connect(); }, waitTime); | ||
}); | ||
}); | ||
}; | ||
Connection.prototype.close = function close () { | ||
this.closeRequested = true; | ||
this.socket.close(); | ||
}; | ||
Connection.prototype.getStates = function getStates () { | ||
return this.sendMessagePromise(states()).then(extractResult); | ||
}; | ||
Connection.prototype.getServices = function getServices () { | ||
return this.sendMessagePromise(services()).then(extractResult); | ||
}; | ||
Connection.prototype.getPanels = function getPanels () { | ||
return this.sendMessagePromise(panels()).then(extractResult); | ||
}; | ||
Connection.prototype.getConfig = function getConfig () { | ||
return this.sendMessagePromise(config()).then(extractResult); | ||
}; | ||
Connection.prototype.callService = function callService (domain, service, serviceData) { | ||
return this.sendMessagePromise(callService$1(domain, service, serviceData)); | ||
}; | ||
// eventCallback will be called when a new event fires | ||
// Returned promise resolves to an unsubscribe function. | ||
Connection.prototype.subscribeEvents = function subscribeEvents (eventCallback, eventType) { | ||
var this$1 = this; | ||
return this.sendMessagePromise(subscribeEvents$1(eventType)).then( | ||
function (resultMessage) { | ||
// We store unsubscribe on info object. That way we can overwrite it in case | ||
// we get disconnected and we have to subscribe again. | ||
var info = { | ||
eventCallback: eventCallback, | ||
eventType: eventType, | ||
unsubscribe: function () { return this$1.sendMessagePromise(unsubscribeEvents(resultMessage.id)) | ||
.then(function () { delete this$1.commands[resultMessage.id]; }); }, | ||
}; | ||
this$1.commands[resultMessage.id] = info; | ||
return function () { return info.unsubscribe(); }; | ||
/* eslint-disable comma-dangle */ /* comma crashes Buble */ | ||
} | ||
/* eslint-enable comma-dangle */ | ||
); | ||
}; | ||
Connection.prototype.sendMessage = function sendMessage (message) { | ||
this.socket.send(JSON.stringify(message)); | ||
}; | ||
Connection.prototype.sendMessagePromise = function sendMessagePromise (message) { | ||
var this$1 = this; | ||
return new Promise(function (resolve, reject) { | ||
this$1.commandId += 1; | ||
var commandId = this$1.commandId; | ||
/* eslint-disable no-param-reassign */ | ||
message.id = commandId; | ||
/* eslint-enable no-param-reassign */ | ||
this$1.commands[commandId] = { resolve: resolve, reject: reject }; | ||
this$1.sendMessage(message); | ||
}); | ||
}; | ||
function createConnection(url, options) { | ||
var conn = new Connection(url, options); | ||
return conn.connect(); | ||
} | ||
exports.ERR_CANNOT_CONNECT = ERR_CANNOT_CONNECT; | ||
exports.ERR_INVALID_AUTH = ERR_INVALID_AUTH; | ||
exports.createConnection = createConnection; | ||
exports['default'] = createConnection; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uL2xpYi9tZXNzYWdlcy5qcyIsIi4uL2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYXV0aChhdXRoVG9rZW4pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYXV0aCcsXG4gICAgYXBpX3Bhc3N3b3JkOiBhdXRoVG9rZW4sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZXMoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2dldF9zdGF0ZXMnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfY29uZmlnJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VzKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfc2VydmljZXMnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFuZWxzKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfcGFuZWxzJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2aWNlKGRvbWFpbiwgc2VydmljZSwgc2VydmljZURhdGEpIHtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICB0eXBlOiAnY2FsbF9zZXJ2aWNlJyxcbiAgICBkb21haW4sXG4gICAgc2VydmljZSxcbiAgfTtcblxuICBpZiAoc2VydmljZURhdGEpIHtcbiAgICBtZXNzYWdlLnNlcnZpY2VfZGF0YSA9IHNlcnZpY2VEYXRhO1xuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVFdmVudHMoZXZlbnRUeXBlKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgdHlwZTogJ3N1YnNjcmliZV9ldmVudHMnLFxuICB9O1xuXG4gIGlmIChldmVudFR5cGUpIHtcbiAgICBtZXNzYWdlLmV2ZW50X3R5cGUgPSBldmVudFR5cGU7XG4gIH1cblxuICByZXR1cm4gbWVzc2FnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc3Vic2NyaWJlRXZlbnRzKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1bnN1YnNjcmliZV9ldmVudHMnLFxuICAgIHN1YnNjcmlwdGlvbixcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gJy4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY29uc3QgRVJSX0NBTk5PVF9DT05ORUNUID0gMTtcbmV4cG9ydCBjb25zdCBFUlJfSU5WQUxJRF9BVVRIID0gMjtcblxuZnVuY3Rpb24gZXh0cmFjdFJlc3VsdChtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnJlc3VsdDtcbn1cblxuY2xhc3MgQ29ubmVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHVybCwgb3B0aW9ucykge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5jb21tYW5kSWQgPSAxO1xuICAgIHRoaXMuY29tbWFuZHMgPSB7fTtcbiAgICB0aGlzLmNvbm5lY3Rpb25UcmllcyA9IDA7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IHt9O1xuICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50VHlwZV07XG5cbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldmVudFR5cGVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgZmlyZUV2ZW50KGV2ZW50VHlwZSkge1xuICAgICh0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50VHlwZV0gfHwgW10pLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2sodGhpcykpO1xuICB9XG5cbiAgY29ubmVjdCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gVXNlZCBmb3IgcmVzdWJzY3JpYmluZyBpbiB0aGUgZnV0dXJlXG4gICAgICBjb25zdCBvbGRDb21tYW5kcyA9IHRoaXMuY29tbWFuZHM7XG4gICAgICBPYmplY3Qua2V5cyhvbGRDb21tYW5kcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IG9sZENvbW1hbmRzW2lkXTtcblxuICAgICAgICAvLyBSZWplY3Qgc3R1ZmYgc3RpbGwgd2FpdGluZyBmb3IgYW4gYW5zd2VyXG4gICAgICAgIGlmIChpbmZvLnJlamVjdCkge1xuICAgICAgICAgIGluZm8ucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBpbnZhbGlkIGF1dGgsIHdlIHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICBsZXQgaW52YWxpZEF1dGggPSBmYWxzZTtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uVHJpZXMgKz0gMTtcbiAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7XG5cbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblRyaWVzID0gMDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuXG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdhdXRoX3JlcXVpcmVkJzpcbiAgICAgICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZXMuYXV0aCh0aGlzLm9wdGlvbnMuYXV0aFRva2VuKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2F1dGhfaW52YWxpZCc6XG4gICAgICAgICAgICByZWplY3QoeyBjb2RlOiBFUlJfSU5WQUxJRF9BVVRIIH0pO1xuICAgICAgICAgICAgaW52YWxpZEF1dGggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhdXRoX29rJzpcbiAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgncmVhZHknKTtcblxuICAgICAgICAgICAgLy8gUmUtc3Vic2NyaWJlIHRvIGV2ZW50cyBhbmQgdXBkYXRlIG9sZCBsb2NhdGlvbiBvZiB1bnN1YiBtZXRob2RcbiAgICAgICAgICAgIC8vIHNvIG9sZCB1bnN1YiBtZXRob2Qga2VlcHMgd29ya2luZy5cbiAgICAgICAgICAgIHRoaXMuY29tbWFuZElkID0gMTtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHMgPSB7fTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMob2xkQ29tbWFuZHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBvbGRDb21tYW5kc1tpZF07XG5cbiAgICAgICAgICAgICAgaWYgKGluZm8uZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoaW5mby5ldmVudENhbGxiYWNrLCBpbmZvLmV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKCh1bnN1YikgPT4geyBpbmZvLnVuc3Vic2NyaWJlID0gdW5zdWI7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnZXZlbnQnOlxuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1ttZXNzYWdlLmlkXS5ldmVudENhbGxiYWNrKG1lc3NhZ2UuZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICAgICAgaWYgKG1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdLnJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdLnJlamVjdChtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuaGFuZGxlZCBtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGlmIChpbnZhbGlkQXV0aCB8fCB0aGlzLmNsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGludmFsaWQgYXV0aCwgbGV0J3Mgbm90IHJlY29ubmVjdCBvciB3ZSBnZXQgYmFubmVkLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb25UcmllcyA9PT0gMCkge1xuICAgICAgICAgIC8vIFdlIHdlcmUgY29ubmVjdGVkIGF0IHNvbWUgcG9pbnQuXG4gICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIG5ldmVyIHdlcmUgY29ubmVjdGVkXG4gICAgICAgICAgcmVqZWN0KEVSUl9DQU5OT1RfQ09OTkVDVCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgYWdhaW5cbiAgICAgICAgY29uc3Qgd2FpdFRpbWUgPSBNYXRoLm1pbih0aGlzLmNvbm5lY3Rpb25UcmllcywgNSkgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCB3YWl0VGltZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gIH1cblxuICBnZXRTdGF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnN0YXRlcygpKS50aGVuKGV4dHJhY3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0U2VydmljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnNlcnZpY2VzKCkpLnRoZW4oZXh0cmFjdFJlc3VsdCk7XG4gIH1cblxuICBnZXRQYW5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnBhbmVscygpKS50aGVuKGV4dHJhY3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlcy5jb25maWcoKSkudGhlbihleHRyYWN0UmVzdWx0KTtcbiAgfVxuXG4gIGNhbGxTZXJ2aWNlKGRvbWFpbiwgc2VydmljZSwgc2VydmljZURhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVByb21pc2UobWVzc2FnZXMuY2FsbFNlcnZpY2UoZG9tYWluLCBzZXJ2aWNlLCBzZXJ2aWNlRGF0YSkpO1xuICB9XG5cbiAgLy8gZXZlbnRDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbmV3IGV2ZW50IGZpcmVzXG4gIC8vIFJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgdG8gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb24uXG4gIHN1YnNjcmliZUV2ZW50cyhldmVudENhbGxiYWNrLCBldmVudFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVByb21pc2UobWVzc2FnZXMuc3Vic2NyaWJlRXZlbnRzKGV2ZW50VHlwZSkpLnRoZW4oXG4gICAgICAocmVzdWx0TWVzc2FnZSkgPT4ge1xuICAgICAgICAvLyBXZSBzdG9yZSB1bnN1YnNjcmliZSBvbiBpbmZvIG9iamVjdC4gVGhhdCB3YXkgd2UgY2FuIG92ZXJ3cml0ZSBpdCBpbiBjYXNlXG4gICAgICAgIC8vIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHdlIGhhdmUgdG8gc3Vic2NyaWJlIGFnYWluLlxuICAgICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICAgIGV2ZW50Q2FsbGJhY2ssXG4gICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlcy51bnN1YnNjcmliZUV2ZW50cyhyZXN1bHRNZXNzYWdlLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7IGRlbGV0ZSB0aGlzLmNvbW1hbmRzW3Jlc3VsdE1lc3NhZ2UuaWRdOyB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNvbW1hbmRzW3Jlc3VsdE1lc3NhZ2UuaWRdID0gaW5mbztcblxuICAgICAgICByZXR1cm4gKCkgPT4gaW5mby51bnN1YnNjcmliZSgpO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgY29tbWEtZGFuZ2xlICovIC8qIGNvbW1hIGNyYXNoZXMgQnVibGUgKi9cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgY29tbWEtZGFuZ2xlICovXG4gICAgKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29tbWFuZElkICs9IDE7XG4gICAgICBjb25zdCBjb21tYW5kSWQgPSB0aGlzLmNvbW1hbmRJZDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgICBtZXNzYWdlLmlkID0gY29tbWFuZElkO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgdGhpcy5jb21tYW5kc1tjb21tYW5kSWRdID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24odXJsLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvbm4gPSBuZXcgQ29ubmVjdGlvbih1cmwsIG9wdGlvbnMpO1xuICByZXR1cm4gY29ubi5jb25uZWN0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbm5lY3Rpb247XG4iXSwibmFtZXMiOlsiY2FsbFNlcnZpY2UiLCJjb25zdCIsInN1YnNjcmliZUV2ZW50cyIsInRoaXMiLCJtZXNzYWdlcy5hdXRoIiwibWVzc2FnZXMuc3RhdGVzIiwibWVzc2FnZXMuc2VydmljZXMiLCJtZXNzYWdlcy5wYW5lbHMiLCJtZXNzYWdlcy5jb25maWciLCJtZXNzYWdlcy5jYWxsU2VydmljZSIsIm1lc3NhZ2VzLnN1YnNjcmliZUV2ZW50cyIsIm1lc3NhZ2VzLnVuc3Vic2NyaWJlRXZlbnRzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQU8sU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFO0VBQzlCLE9BQU87SUFDTCxJQUFJLEVBQUUsTUFBTTtJQUNaLFlBQVksRUFBRSxTQUFTO0dBQ3hCLENBQUM7Q0FDSDs7QUFFRCxBQUFPLFNBQVMsTUFBTSxHQUFHO0VBQ3ZCLE9BQU87SUFDTCxJQUFJLEVBQUUsWUFBWTtHQUNuQixDQUFDO0NBQ0g7O0FBRUQsQUFBTyxTQUFTLE1BQU0sR0FBRztFQUN2QixPQUFPO0lBQ0wsSUFBSSxFQUFFLFlBQVk7R0FDbkIsQ0FBQztDQUNIOztBQUVELEFBQU8sU0FBUyxRQUFRLEdBQUc7RUFDekIsT0FBTztJQUNMLElBQUksRUFBRSxjQUFjO0dBQ3JCLENBQUM7Q0FDSDs7QUFFRCxBQUFPLFNBQVMsTUFBTSxHQUFHO0VBQ3ZCLE9BQU87SUFDTCxJQUFJLEVBQUUsWUFBWTtHQUNuQixDQUFDO0NBQ0g7O0FBRUQsQUFBTyxTQUFTQSxhQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUU7RUFDeERDLElBQU0sT0FBTyxHQUFHO0lBQ2QsSUFBSSxFQUFFLGNBQWM7SUFDcEIsUUFBQSxNQUFNO0lBQ04sU0FBQSxPQUFPO0dBQ1IsQ0FBQzs7RUFFRixJQUFJLFdBQVcsRUFBRTtJQUNmLE9BQU8sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0dBQ3BDOztFQUVELE9BQU8sT0FBTyxDQUFDO0NBQ2hCOztBQUVELEFBQU8sU0FBU0MsaUJBQWUsQ0FBQyxTQUFTLEVBQUU7RUFDekNELElBQU0sT0FBTyxHQUFHO0lBQ2QsSUFBSSxFQUFFLGtCQUFrQjtHQUN6QixDQUFDOztFQUVGLElBQUksU0FBUyxFQUFF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 |
@@ -1,1 +0,276 @@ | ||
function auth(e){return{type:"auth",api_password:e}}function states(){return{type:"get_states"}}function config(){return{type:"get_config"}}function services(){return{type:"get_services"}}function panels(){return{type:"get_panels"}}function callService$1(e,n,t){var s={type:"call_service",domain:e,service:n};return t&&(s.service_data=t),s}function subscribeEvents$1(e){var n={type:"subscribe_events"};return e&&(n.event_type=e),n}function unsubscribeEvents(e){return{type:"unsubscribe_events",subscription:e}}function extractResult(e){return e.result}function createConnection(e,n){var t=new Connection(e,n);return t.connect()}var ERR_CANNOT_CONNECT=1,ERR_INVALID_AUTH=2,Connection=function(e,n){this.url=e,this.options=n||{},this.commandId=1,this.commands={},this.connectionTries=0,this.eventListeners={}};Connection.prototype.addEventListener=function(e,n){var t=this.eventListeners[e];t||(t=this.eventListeners[e]=[]),t.push(n)},Connection.prototype.fireEvent=function(e){var n=this;(this.eventListeners[e]||[]).forEach(function(e){return e(n)})},Connection.prototype.connect=function(){var e=this;return new Promise(function(n,t){var s=e.commands;Object.keys(s).forEach(function(e){var n=s[e];n.reject&&n.reject()});var o=!1;e.connectionTries+=1,e.socket=new WebSocket(e.url),e.socket.addEventListener("open",function(){e.connectionTries=0}),e.socket.addEventListener("message",function(r){var i=JSON.parse(r.data);switch(i.type){case"auth_required":e.sendMessage(auth(e.options.authToken));break;case"auth_invalid":t({code:ERR_INVALID_AUTH}),o=!0;break;case"auth_ok":n(e),e.fireEvent("ready"),e.commandId=1,e.commands={},Object.keys(s).forEach(function(n){var t=s[n];t.eventType&&e.subscribeEvents(t.eventCallback,t.eventType).then(function(e){t.unsubscribe=e})});break;case"event":e.commands[i.id].eventCallback(i.event);break;case"result":i.success?e.commands[i.id].resolve(i):e.commands[i.id].reject(i.error),delete e.commands[i.id]}}),e.socket.addEventListener("close",function(){if(!o){0===e.connectionTries?e.fireEvent("disconnected"):t(ERR_CANNOT_CONNECT);var n=1e3*Math.min(e.connectionTries,5);setTimeout(function(){return e.connect()},n)}})})},Connection.prototype.getStates=function(){return this.sendMessagePromise(states()).then(extractResult)},Connection.prototype.getServices=function(){return this.sendMessagePromise(services()).then(extractResult)},Connection.prototype.getPanels=function(){return this.sendMessagePromise(panels()).then(extractResult)},Connection.prototype.getConfig=function(){return this.sendMessagePromise(config()).then(extractResult)},Connection.prototype.callService=function(e,n,t){return this.sendMessagePromise(callService$1(e,n,t))},Connection.prototype.subscribeEvents=function(e,n){var t=this;return this.sendMessagePromise(subscribeEvents$1(n)).then(function(s){var o={eventCallback:e,eventType:n,unsubscribe:function(){return t.sendMessagePromise(unsubscribeEvents(s.id)).then(function(){delete t.commands[s.id]})}};return t.commands[s.id]=o,function(){return o.unsubscribe()}})},Connection.prototype.sendMessage=function(e){this.socket.send(JSON.stringify(e))},Connection.prototype.sendMessagePromise=function(e){var n=this;return new Promise(function(t,s){n.commandId+=1;var o=n.commandId;e.id=o,n.commands[o]={resolve:t,reject:s},n.sendMessage(e)})};export{ERR_CANNOT_CONNECT:ERR_CANNOT_CONNECT,ERR_INVALID_AUTH:ERR_INVALID_AUTH,createConnection:createConnection};export default createConnection; | ||
function auth(authToken) { | ||
return { | ||
type: 'auth', | ||
api_password: authToken, | ||
}; | ||
} | ||
function states() { | ||
return { | ||
type: 'get_states', | ||
}; | ||
} | ||
function config() { | ||
return { | ||
type: 'get_config', | ||
}; | ||
} | ||
function services() { | ||
return { | ||
type: 'get_services', | ||
}; | ||
} | ||
function panels() { | ||
return { | ||
type: 'get_panels', | ||
}; | ||
} | ||
function callService$1(domain, service, serviceData) { | ||
var message = { | ||
type: 'call_service', | ||
domain: domain, | ||
service: service, | ||
}; | ||
if (serviceData) { | ||
message.service_data = serviceData; | ||
} | ||
return message; | ||
} | ||
function subscribeEvents$1(eventType) { | ||
var message = { | ||
type: 'subscribe_events', | ||
}; | ||
if (eventType) { | ||
message.event_type = eventType; | ||
} | ||
return message; | ||
} | ||
function unsubscribeEvents(subscription) { | ||
return { | ||
type: 'unsubscribe_events', | ||
subscription: subscription, | ||
}; | ||
} | ||
var ERR_CANNOT_CONNECT = 1; | ||
var ERR_INVALID_AUTH = 2; | ||
function extractResult(message) { | ||
return message.result; | ||
} | ||
var Connection = function Connection(url, options) { | ||
this.url = url; | ||
this.options = options || {}; | ||
this.commandId = 1; | ||
this.commands = {}; | ||
this.connectionTries = 0; | ||
this.eventListeners = {}; | ||
this.closeRequested = false; | ||
}; | ||
Connection.prototype.addEventListener = function addEventListener (eventType, callback) { | ||
var listeners = this.eventListeners[eventType]; | ||
if (!listeners) { | ||
listeners = this.eventListeners[eventType] = []; | ||
} | ||
listeners.push(callback); | ||
}; | ||
Connection.prototype.fireEvent = function fireEvent (eventType) { | ||
var this$1 = this; | ||
(this.eventListeners[eventType] || []).forEach(function (callback) { return callback(this$1); }); | ||
}; | ||
Connection.prototype.connect = function connect () { | ||
var this$1 = this; | ||
return new Promise(function (resolve, reject) { | ||
// Used for resubscribing in the future | ||
var oldCommands = this$1.commands; | ||
Object.keys(oldCommands).forEach(function (id) { | ||
var info = oldCommands[id]; | ||
// Reject stuff still waiting for an answer | ||
if (info.reject) { | ||
info.reject(); | ||
} | ||
}); | ||
// If invalid auth, we will not try to reconnect. | ||
var invalidAuth = false; | ||
this$1.connectionTries += 1; | ||
this$1.socket = new WebSocket(this$1.url); | ||
this$1.socket.addEventListener('open', function () { | ||
this$1.connectionTries = 0; | ||
}); | ||
this$1.socket.addEventListener('message', function (event) { | ||
var message = JSON.parse(event.data); | ||
{ | ||
/* eslint-disable no-console */ | ||
console.log(message); | ||
/* eslint-enable no-console */ | ||
} | ||
switch (message.type) { | ||
case 'auth_required': | ||
this$1.sendMessage(auth(this$1.options.authToken)); | ||
break; | ||
case 'auth_invalid': | ||
reject({ code: ERR_INVALID_AUTH }); | ||
invalidAuth = true; | ||
break; | ||
case 'auth_ok': | ||
resolve(this$1); | ||
this$1.fireEvent('ready'); | ||
// Re-subscribe to events and update old location of unsub method | ||
// so old unsub method keeps working. | ||
this$1.commandId = 1; | ||
this$1.commands = {}; | ||
Object.keys(oldCommands).forEach(function (id) { | ||
var info = oldCommands[id]; | ||
if (info.eventType) { | ||
this$1.subscribeEvents(info.eventCallback, info.eventType) | ||
.then(function (unsub) { info.unsubscribe = unsub; }); | ||
} | ||
}); | ||
break; | ||
case 'event': | ||
this$1.commands[message.id].eventCallback(message.event); | ||
break; | ||
case 'result': | ||
if (message.success) { | ||
this$1.commands[message.id].resolve(message); | ||
} else { | ||
this$1.commands[message.id].reject(message.error); | ||
} | ||
delete this$1.commands[message.id]; | ||
break; | ||
default: | ||
{ | ||
/* eslint-disable no-console */ | ||
console.warn('Unhandled message', message); | ||
/* eslint-enable no-console */ | ||
} | ||
} | ||
}); | ||
this$1.socket.addEventListener('close', function () { | ||
if (invalidAuth || this$1.closeRequested) { | ||
// When we have invalid auth, let's not reconnect or we get banned. | ||
return; | ||
} else if (this$1.connectionTries === 0) { | ||
// We were connected at some point. | ||
this$1.fireEvent('disconnected'); | ||
} else { | ||
// We never were connected | ||
reject(ERR_CANNOT_CONNECT); | ||
} | ||
// Try again | ||
var waitTime = Math.min(this$1.connectionTries, 5) * 1000; | ||
setTimeout(function () { return this$1.connect(); }, waitTime); | ||
}); | ||
}); | ||
}; | ||
Connection.prototype.close = function close () { | ||
this.closeRequested = true; | ||
this.socket.close(); | ||
}; | ||
Connection.prototype.getStates = function getStates () { | ||
return this.sendMessagePromise(states()).then(extractResult); | ||
}; | ||
Connection.prototype.getServices = function getServices () { | ||
return this.sendMessagePromise(services()).then(extractResult); | ||
}; | ||
Connection.prototype.getPanels = function getPanels () { | ||
return this.sendMessagePromise(panels()).then(extractResult); | ||
}; | ||
Connection.prototype.getConfig = function getConfig () { | ||
return this.sendMessagePromise(config()).then(extractResult); | ||
}; | ||
Connection.prototype.callService = function callService (domain, service, serviceData) { | ||
return this.sendMessagePromise(callService$1(domain, service, serviceData)); | ||
}; | ||
// eventCallback will be called when a new event fires | ||
// Returned promise resolves to an unsubscribe function. | ||
Connection.prototype.subscribeEvents = function subscribeEvents (eventCallback, eventType) { | ||
var this$1 = this; | ||
return this.sendMessagePromise(subscribeEvents$1(eventType)).then( | ||
function (resultMessage) { | ||
// We store unsubscribe on info object. That way we can overwrite it in case | ||
// we get disconnected and we have to subscribe again. | ||
var info = { | ||
eventCallback: eventCallback, | ||
eventType: eventType, | ||
unsubscribe: function () { return this$1.sendMessagePromise(unsubscribeEvents(resultMessage.id)) | ||
.then(function () { delete this$1.commands[resultMessage.id]; }); }, | ||
}; | ||
this$1.commands[resultMessage.id] = info; | ||
return function () { return info.unsubscribe(); }; | ||
/* eslint-disable comma-dangle */ /* comma crashes Buble */ | ||
} | ||
/* eslint-enable comma-dangle */ | ||
); | ||
}; | ||
Connection.prototype.sendMessage = function sendMessage (message) { | ||
this.socket.send(JSON.stringify(message)); | ||
}; | ||
Connection.prototype.sendMessagePromise = function sendMessagePromise (message) { | ||
var this$1 = this; | ||
return new Promise(function (resolve, reject) { | ||
this$1.commandId += 1; | ||
var commandId = this$1.commandId; | ||
/* eslint-disable no-param-reassign */ | ||
message.id = commandId; | ||
/* eslint-enable no-param-reassign */ | ||
this$1.commands[commandId] = { resolve: resolve, reject: reject }; | ||
this$1.sendMessage(message); | ||
}); | ||
}; | ||
function createConnection(url, options) { | ||
var conn = new Connection(url, options); | ||
return conn.connect(); | ||
} | ||
export { ERR_CANNOT_CONNECT, ERR_INVALID_AUTH, createConnection };export default createConnection; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uL2xpYi9tZXNzYWdlcy5qcyIsIi4uL2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYXV0aChhdXRoVG9rZW4pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYXV0aCcsXG4gICAgYXBpX3Bhc3N3b3JkOiBhdXRoVG9rZW4sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZXMoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2dldF9zdGF0ZXMnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfY29uZmlnJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VzKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfc2VydmljZXMnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFuZWxzKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfcGFuZWxzJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2aWNlKGRvbWFpbiwgc2VydmljZSwgc2VydmljZURhdGEpIHtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICB0eXBlOiAnY2FsbF9zZXJ2aWNlJyxcbiAgICBkb21haW4sXG4gICAgc2VydmljZSxcbiAgfTtcblxuICBpZiAoc2VydmljZURhdGEpIHtcbiAgICBtZXNzYWdlLnNlcnZpY2VfZGF0YSA9IHNlcnZpY2VEYXRhO1xuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVFdmVudHMoZXZlbnRUeXBlKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgdHlwZTogJ3N1YnNjcmliZV9ldmVudHMnLFxuICB9O1xuXG4gIGlmIChldmVudFR5cGUpIHtcbiAgICBtZXNzYWdlLmV2ZW50X3R5cGUgPSBldmVudFR5cGU7XG4gIH1cblxuICByZXR1cm4gbWVzc2FnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc3Vic2NyaWJlRXZlbnRzKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1bnN1YnNjcmliZV9ldmVudHMnLFxuICAgIHN1YnNjcmlwdGlvbixcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gJy4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY29uc3QgRVJSX0NBTk5PVF9DT05ORUNUID0gMTtcbmV4cG9ydCBjb25zdCBFUlJfSU5WQUxJRF9BVVRIID0gMjtcblxuZnVuY3Rpb24gZXh0cmFjdFJlc3VsdChtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnJlc3VsdDtcbn1cblxuY2xhc3MgQ29ubmVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHVybCwgb3B0aW9ucykge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5jb21tYW5kSWQgPSAxO1xuICAgIHRoaXMuY29tbWFuZHMgPSB7fTtcbiAgICB0aGlzLmNvbm5lY3Rpb25UcmllcyA9IDA7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IHt9O1xuICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50VHlwZV07XG5cbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldmVudFR5cGVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgZmlyZUV2ZW50KGV2ZW50VHlwZSkge1xuICAgICh0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50VHlwZV0gfHwgW10pLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2sodGhpcykpO1xuICB9XG5cbiAgY29ubmVjdCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gVXNlZCBmb3IgcmVzdWJzY3JpYmluZyBpbiB0aGUgZnV0dXJlXG4gICAgICBjb25zdCBvbGRDb21tYW5kcyA9IHRoaXMuY29tbWFuZHM7XG4gICAgICBPYmplY3Qua2V5cyhvbGRDb21tYW5kcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IG9sZENvbW1hbmRzW2lkXTtcblxuICAgICAgICAvLyBSZWplY3Qgc3R1ZmYgc3RpbGwgd2FpdGluZyBmb3IgYW4gYW5zd2VyXG4gICAgICAgIGlmIChpbmZvLnJlamVjdCkge1xuICAgICAgICAgIGluZm8ucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBpbnZhbGlkIGF1dGgsIHdlIHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICBsZXQgaW52YWxpZEF1dGggPSBmYWxzZTtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uVHJpZXMgKz0gMTtcbiAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7XG5cbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblRyaWVzID0gMDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuXG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdhdXRoX3JlcXVpcmVkJzpcbiAgICAgICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZXMuYXV0aCh0aGlzLm9wdGlvbnMuYXV0aFRva2VuKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2F1dGhfaW52YWxpZCc6XG4gICAgICAgICAgICByZWplY3QoeyBjb2RlOiBFUlJfSU5WQUxJRF9BVVRIIH0pO1xuICAgICAgICAgICAgaW52YWxpZEF1dGggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhdXRoX29rJzpcbiAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgncmVhZHknKTtcblxuICAgICAgICAgICAgLy8gUmUtc3Vic2NyaWJlIHRvIGV2ZW50cyBhbmQgdXBkYXRlIG9sZCBsb2NhdGlvbiBvZiB1bnN1YiBtZXRob2RcbiAgICAgICAgICAgIC8vIHNvIG9sZCB1bnN1YiBtZXRob2Qga2VlcHMgd29ya2luZy5cbiAgICAgICAgICAgIHRoaXMuY29tbWFuZElkID0gMTtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHMgPSB7fTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMob2xkQ29tbWFuZHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBvbGRDb21tYW5kc1tpZF07XG5cbiAgICAgICAgICAgICAgaWYgKGluZm8uZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoaW5mby5ldmVudENhbGxiYWNrLCBpbmZvLmV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKCh1bnN1YikgPT4geyBpbmZvLnVuc3Vic2NyaWJlID0gdW5zdWI7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnZXZlbnQnOlxuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1ttZXNzYWdlLmlkXS5ldmVudENhbGxiYWNrKG1lc3NhZ2UuZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICAgICAgaWYgKG1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdLnJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdLnJlamVjdChtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuaGFuZGxlZCBtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGlmIChpbnZhbGlkQXV0aCB8fCB0aGlzLmNsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGludmFsaWQgYXV0aCwgbGV0J3Mgbm90IHJlY29ubmVjdCBvciB3ZSBnZXQgYmFubmVkLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb25UcmllcyA9PT0gMCkge1xuICAgICAgICAgIC8vIFdlIHdlcmUgY29ubmVjdGVkIGF0IHNvbWUgcG9pbnQuXG4gICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIG5ldmVyIHdlcmUgY29ubmVjdGVkXG4gICAgICAgICAgcmVqZWN0KEVSUl9DQU5OT1RfQ09OTkVDVCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgYWdhaW5cbiAgICAgICAgY29uc3Qgd2FpdFRpbWUgPSBNYXRoLm1pbih0aGlzLmNvbm5lY3Rpb25UcmllcywgNSkgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCB3YWl0VGltZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gIH1cblxuICBnZXRTdGF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnN0YXRlcygpKS50aGVuKGV4dHJhY3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0U2VydmljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnNlcnZpY2VzKCkpLnRoZW4oZXh0cmFjdFJlc3VsdCk7XG4gIH1cblxuICBnZXRQYW5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnBhbmVscygpKS50aGVuKGV4dHJhY3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlcy5jb25maWcoKSkudGhlbihleHRyYWN0UmVzdWx0KTtcbiAgfVxuXG4gIGNhbGxTZXJ2aWNlKGRvbWFpbiwgc2VydmljZSwgc2VydmljZURhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVByb21pc2UobWVzc2FnZXMuY2FsbFNlcnZpY2UoZG9tYWluLCBzZXJ2aWNlLCBzZXJ2aWNlRGF0YSkpO1xuICB9XG5cbiAgLy8gZXZlbnRDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbmV3IGV2ZW50IGZpcmVzXG4gIC8vIFJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgdG8gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb24uXG4gIHN1YnNjcmliZUV2ZW50cyhldmVudENhbGxiYWNrLCBldmVudFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVByb21pc2UobWVzc2FnZXMuc3Vic2NyaWJlRXZlbnRzKGV2ZW50VHlwZSkpLnRoZW4oXG4gICAgICAocmVzdWx0TWVzc2FnZSkgPT4ge1xuICAgICAgICAvLyBXZSBzdG9yZSB1bnN1YnNjcmliZSBvbiBpbmZvIG9iamVjdC4gVGhhdCB3YXkgd2UgY2FuIG92ZXJ3cml0ZSBpdCBpbiBjYXNlXG4gICAgICAgIC8vIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHdlIGhhdmUgdG8gc3Vic2NyaWJlIGFnYWluLlxuICAgICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICAgIGV2ZW50Q2FsbGJhY2ssXG4gICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlcy51bnN1YnNjcmliZUV2ZW50cyhyZXN1bHRNZXNzYWdlLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7IGRlbGV0ZSB0aGlzLmNvbW1hbmRzW3Jlc3VsdE1lc3NhZ2UuaWRdOyB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNvbW1hbmRzW3Jlc3VsdE1lc3NhZ2UuaWRdID0gaW5mbztcblxuICAgICAgICByZXR1cm4gKCkgPT4gaW5mby51bnN1YnNjcmliZSgpO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgY29tbWEtZGFuZ2xlICovIC8qIGNvbW1hIGNyYXNoZXMgQnVibGUgKi9cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgY29tbWEtZGFuZ2xlICovXG4gICAgKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29tbWFuZElkICs9IDE7XG4gICAgICBjb25zdCBjb21tYW5kSWQgPSB0aGlzLmNvbW1hbmRJZDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgICBtZXNzYWdlLmlkID0gY29tbWFuZElkO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgdGhpcy5jb21tYW5kc1tjb21tYW5kSWRdID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24odXJsLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvbm4gPSBuZXcgQ29ubmVjdGlvbih1cmwsIG9wdGlvbnMpO1xuICByZXR1cm4gY29ubi5jb25uZWN0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbm5lY3Rpb247XG4iXSwibmFtZXMiOlsiY2FsbFNlcnZpY2UiLCJjb25zdCIsInN1YnNjcmliZUV2ZW50cyIsInRoaXMiLCJtZXNzYWdlcy5hdXRoIiwibWVzc2FnZXMuc3RhdGVzIiwibWVzc2FnZXMuc2VydmljZXMiLCJtZXNzYWdlcy5wYW5lbHMiLCJtZXNzYWdlcy5jb25maWciLCJtZXNzYWdlcy5jYWxsU2VydmljZSIsIm1lc3NhZ2VzLnN1YnNjcmliZUV2ZW50cyIsIm1lc3NhZ2VzLnVuc3Vic2NyaWJlRXZlbnRzIl0sIm1hcHBpbmdzIjoiQUFBTyxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUU7RUFDOUIsT0FBTztJQUNMLElBQUksRUFBRSxNQUFNO0lBQ1osWUFBWSxFQUFFLFNBQVM7R0FDeEIsQ0FBQztDQUNIOztBQUVELEFBQU8sU0FBUyxNQUFNLEdBQUc7RUFDdkIsT0FBTztJQUNMLElBQUksRUFBRSxZQUFZO0dBQ25CLENBQUM7Q0FDSDs7QUFFRCxBQUFPLFNBQVMsTUFBTSxHQUFHO0VBQ3ZCLE9BQU87SUFDTCxJQUFJLEVBQUUsWUFBWTtHQUNuQixDQUFDO0NBQ0g7O0FBRUQsQUFBTyxTQUFTLFFBQVEsR0FBRztFQUN6QixPQUFPO0lBQ0wsSUFBSSxFQUFFLGNBQWM7R0FDckIsQ0FBQztDQUNIOztBQUVELEFBQU8sU0FBUyxNQUFNLEdBQUc7RUFDdkIsT0FBTztJQUNMLElBQUksRUFBRSxZQUFZO0dBQ25CLENBQUM7Q0FDSDs7QUFFRCxBQUFPLFNBQVNBLGFBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRTtFQUN4REMsSUFBTSxPQUFPLEdBQUc7SUFDZCxJQUFJLEVBQUUsY0FBYztJQUNwQixRQUFBLE1BQU07SUFDTixTQUFBLE9BQU87R0FDUixDQUFDOztFQUVGLElBQUksV0FBVyxFQUFFO0lBQ2YsT0FBTyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7R0FDcEM7O0VBRUQsT0FBTyxPQUFPLENBQUM7Q0FDaEI7O0FBRUQsQUFBTyxTQUFTQyxpQkFBZSxDQUFDLFNBQVMsRUFBRTtFQUN6Q0QsSUFBTSxPQUFPLEdBQUc7SUFDZCxJQUFJLEVBQUUsa0JBQWtCO0dBQ3pCLENBQUM7O0VBRUYsSUFBSSxTQUFTLEVBQUU7SUFD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 |
@@ -1,1 +0,289 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.HAWS=e.HAWS||{})}(this,function(e){"use strict";function t(e){return{type:"auth",api_password:e}}function n(){return{type:"get_states"}}function s(){return{type:"get_config"}}function r(){return{type:"get_services"}}function o(){return{type:"get_panels"}}function i(e,t,n){var s={type:"call_service",domain:e,service:t};return n&&(s.service_data=n),s}function c(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}function u(e){return{type:"unsubscribe_events",subscription:e}}function a(e){return e.result}function d(e,t){var n=new v(e,t);return n.connect()}var f=1,p=2,v=function(e,t){this.url=e,this.options=t||{},this.commandId=1,this.commands={},this.connectionTries=0,this.eventListeners={}};v.prototype.addEventListener=function(e,t){var n=this.eventListeners[e];n||(n=this.eventListeners[e]=[]),n.push(t)},v.prototype.fireEvent=function(e){var t=this;(this.eventListeners[e]||[]).forEach(function(e){return e(t)})},v.prototype.connect=function(){var e=this;return new Promise(function(n,s){var r=e.commands;Object.keys(r).forEach(function(e){var t=r[e];t.reject&&t.reject()});var o=!1;e.connectionTries+=1,e.socket=new WebSocket(e.url),e.socket.addEventListener("open",function(){e.connectionTries=0}),e.socket.addEventListener("message",function(i){var c=JSON.parse(i.data);switch(c.type){case"auth_required":e.sendMessage(t(e.options.authToken));break;case"auth_invalid":s({code:p}),o=!0;break;case"auth_ok":n(e),e.fireEvent("ready"),e.commandId=1,e.commands={},Object.keys(r).forEach(function(t){var n=r[t];n.eventType&&e.subscribeEvents(n.eventCallback,n.eventType).then(function(e){n.unsubscribe=e})});break;case"event":e.commands[c.id].eventCallback(c.event);break;case"result":c.success?e.commands[c.id].resolve(c):e.commands[c.id].reject(c.error),delete e.commands[c.id]}}),e.socket.addEventListener("close",function(){if(!o){0===e.connectionTries?e.fireEvent("disconnected"):s(f);var t=1e3*Math.min(e.connectionTries,5);setTimeout(function(){return e.connect()},t)}})})},v.prototype.getStates=function(){return this.sendMessagePromise(n()).then(a)},v.prototype.getServices=function(){return this.sendMessagePromise(r()).then(a)},v.prototype.getPanels=function(){return this.sendMessagePromise(o()).then(a)},v.prototype.getConfig=function(){return this.sendMessagePromise(s()).then(a)},v.prototype.callService=function(e,t,n){return this.sendMessagePromise(i(e,t,n))},v.prototype.subscribeEvents=function(e,t){var n=this;return this.sendMessagePromise(c(t)).then(function(s){var r={eventCallback:e,eventType:t,unsubscribe:function(){return n.sendMessagePromise(u(s.id)).then(function(){delete n.commands[s.id]})}};return n.commands[s.id]=r,function(){return r.unsubscribe()}})},v.prototype.sendMessage=function(e){this.socket.send(JSON.stringify(e))},v.prototype.sendMessagePromise=function(e){var t=this;return new Promise(function(n,s){t.commandId+=1;var r=t.commandId;e.id=r,t.commands[r]={resolve:n,reject:s},t.sendMessage(e)})},e.ERR_CANNOT_CONNECT=f,e.ERR_INVALID_AUTH=p,e.createConnection=d,e.default=d,Object.defineProperty(e,"__esModule",{value:!0})}); | ||
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | ||
typeof define === 'function' && define.amd ? define(['exports'], factory) : | ||
(factory((global.HAWS = global.HAWS || {}))); | ||
}(this, (function (exports) { 'use strict'; | ||
function auth(authToken) { | ||
return { | ||
type: 'auth', | ||
api_password: authToken, | ||
}; | ||
} | ||
function states() { | ||
return { | ||
type: 'get_states', | ||
}; | ||
} | ||
function config() { | ||
return { | ||
type: 'get_config', | ||
}; | ||
} | ||
function services() { | ||
return { | ||
type: 'get_services', | ||
}; | ||
} | ||
function panels() { | ||
return { | ||
type: 'get_panels', | ||
}; | ||
} | ||
function callService$1(domain, service, serviceData) { | ||
var message = { | ||
type: 'call_service', | ||
domain: domain, | ||
service: service, | ||
}; | ||
if (serviceData) { | ||
message.service_data = serviceData; | ||
} | ||
return message; | ||
} | ||
function subscribeEvents$1(eventType) { | ||
var message = { | ||
type: 'subscribe_events', | ||
}; | ||
if (eventType) { | ||
message.event_type = eventType; | ||
} | ||
return message; | ||
} | ||
function unsubscribeEvents(subscription) { | ||
return { | ||
type: 'unsubscribe_events', | ||
subscription: subscription, | ||
}; | ||
} | ||
var ERR_CANNOT_CONNECT = 1; | ||
var ERR_INVALID_AUTH = 2; | ||
function extractResult(message) { | ||
return message.result; | ||
} | ||
var Connection = function Connection(url, options) { | ||
this.url = url; | ||
this.options = options || {}; | ||
this.commandId = 1; | ||
this.commands = {}; | ||
this.connectionTries = 0; | ||
this.eventListeners = {}; | ||
this.closeRequested = false; | ||
}; | ||
Connection.prototype.addEventListener = function addEventListener (eventType, callback) { | ||
var listeners = this.eventListeners[eventType]; | ||
if (!listeners) { | ||
listeners = this.eventListeners[eventType] = []; | ||
} | ||
listeners.push(callback); | ||
}; | ||
Connection.prototype.fireEvent = function fireEvent (eventType) { | ||
var this$1 = this; | ||
(this.eventListeners[eventType] || []).forEach(function (callback) { return callback(this$1); }); | ||
}; | ||
Connection.prototype.connect = function connect () { | ||
var this$1 = this; | ||
return new Promise(function (resolve, reject) { | ||
// Used for resubscribing in the future | ||
var oldCommands = this$1.commands; | ||
Object.keys(oldCommands).forEach(function (id) { | ||
var info = oldCommands[id]; | ||
// Reject stuff still waiting for an answer | ||
if (info.reject) { | ||
info.reject(); | ||
} | ||
}); | ||
// If invalid auth, we will not try to reconnect. | ||
var invalidAuth = false; | ||
this$1.connectionTries += 1; | ||
this$1.socket = new WebSocket(this$1.url); | ||
this$1.socket.addEventListener('open', function () { | ||
this$1.connectionTries = 0; | ||
}); | ||
this$1.socket.addEventListener('message', function (event) { | ||
var message = JSON.parse(event.data); | ||
{ | ||
/* eslint-disable no-console */ | ||
console.log(message); | ||
/* eslint-enable no-console */ | ||
} | ||
switch (message.type) { | ||
case 'auth_required': | ||
this$1.sendMessage(auth(this$1.options.authToken)); | ||
break; | ||
case 'auth_invalid': | ||
reject({ code: ERR_INVALID_AUTH }); | ||
invalidAuth = true; | ||
break; | ||
case 'auth_ok': | ||
resolve(this$1); | ||
this$1.fireEvent('ready'); | ||
// Re-subscribe to events and update old location of unsub method | ||
// so old unsub method keeps working. | ||
this$1.commandId = 1; | ||
this$1.commands = {}; | ||
Object.keys(oldCommands).forEach(function (id) { | ||
var info = oldCommands[id]; | ||
if (info.eventType) { | ||
this$1.subscribeEvents(info.eventCallback, info.eventType) | ||
.then(function (unsub) { info.unsubscribe = unsub; }); | ||
} | ||
}); | ||
break; | ||
case 'event': | ||
this$1.commands[message.id].eventCallback(message.event); | ||
break; | ||
case 'result': | ||
if (message.success) { | ||
this$1.commands[message.id].resolve(message); | ||
} else { | ||
this$1.commands[message.id].reject(message.error); | ||
} | ||
delete this$1.commands[message.id]; | ||
break; | ||
default: | ||
{ | ||
/* eslint-disable no-console */ | ||
console.warn('Unhandled message', message); | ||
/* eslint-enable no-console */ | ||
} | ||
} | ||
}); | ||
this$1.socket.addEventListener('close', function () { | ||
if (invalidAuth || this$1.closeRequested) { | ||
// When we have invalid auth, let's not reconnect or we get banned. | ||
return; | ||
} else if (this$1.connectionTries === 0) { | ||
// We were connected at some point. | ||
this$1.fireEvent('disconnected'); | ||
} else { | ||
// We never were connected | ||
reject(ERR_CANNOT_CONNECT); | ||
} | ||
// Try again | ||
var waitTime = Math.min(this$1.connectionTries, 5) * 1000; | ||
setTimeout(function () { return this$1.connect(); }, waitTime); | ||
}); | ||
}); | ||
}; | ||
Connection.prototype.close = function close () { | ||
this.closeRequested = true; | ||
this.socket.close(); | ||
}; | ||
Connection.prototype.getStates = function getStates () { | ||
return this.sendMessagePromise(states()).then(extractResult); | ||
}; | ||
Connection.prototype.getServices = function getServices () { | ||
return this.sendMessagePromise(services()).then(extractResult); | ||
}; | ||
Connection.prototype.getPanels = function getPanels () { | ||
return this.sendMessagePromise(panels()).then(extractResult); | ||
}; | ||
Connection.prototype.getConfig = function getConfig () { | ||
return this.sendMessagePromise(config()).then(extractResult); | ||
}; | ||
Connection.prototype.callService = function callService (domain, service, serviceData) { | ||
return this.sendMessagePromise(callService$1(domain, service, serviceData)); | ||
}; | ||
// eventCallback will be called when a new event fires | ||
// Returned promise resolves to an unsubscribe function. | ||
Connection.prototype.subscribeEvents = function subscribeEvents (eventCallback, eventType) { | ||
var this$1 = this; | ||
return this.sendMessagePromise(subscribeEvents$1(eventType)).then( | ||
function (resultMessage) { | ||
// We store unsubscribe on info object. That way we can overwrite it in case | ||
// we get disconnected and we have to subscribe again. | ||
var info = { | ||
eventCallback: eventCallback, | ||
eventType: eventType, | ||
unsubscribe: function () { return this$1.sendMessagePromise(unsubscribeEvents(resultMessage.id)) | ||
.then(function () { delete this$1.commands[resultMessage.id]; }); }, | ||
}; | ||
this$1.commands[resultMessage.id] = info; | ||
return function () { return info.unsubscribe(); }; | ||
/* eslint-disable comma-dangle */ /* comma crashes Buble */ | ||
} | ||
/* eslint-enable comma-dangle */ | ||
); | ||
}; | ||
Connection.prototype.sendMessage = function sendMessage (message) { | ||
this.socket.send(JSON.stringify(message)); | ||
}; | ||
Connection.prototype.sendMessagePromise = function sendMessagePromise (message) { | ||
var this$1 = this; | ||
return new Promise(function (resolve, reject) { | ||
this$1.commandId += 1; | ||
var commandId = this$1.commandId; | ||
/* eslint-disable no-param-reassign */ | ||
message.id = commandId; | ||
/* eslint-enable no-param-reassign */ | ||
this$1.commands[commandId] = { resolve: resolve, reject: reject }; | ||
this$1.sendMessage(message); | ||
}); | ||
}; | ||
function createConnection(url, options) { | ||
var conn = new Connection(url, options); | ||
return conn.connect(); | ||
} | ||
exports.ERR_CANNOT_CONNECT = ERR_CANNOT_CONNECT; | ||
exports.ERR_INVALID_AUTH = ERR_INVALID_AUTH; | ||
exports.createConnection = createConnection; | ||
exports['default'] = createConnection; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
}))); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uL2xpYi9tZXNzYWdlcy5qcyIsIi4uL2xpYi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYXV0aChhdXRoVG9rZW4pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYXV0aCcsXG4gICAgYXBpX3Bhc3N3b3JkOiBhdXRoVG9rZW4sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGF0ZXMoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2dldF9zdGF0ZXMnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlnKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfY29uZmlnJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VzKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfc2VydmljZXMnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFuZWxzKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdnZXRfcGFuZWxzJyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGxTZXJ2aWNlKGRvbWFpbiwgc2VydmljZSwgc2VydmljZURhdGEpIHtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICB0eXBlOiAnY2FsbF9zZXJ2aWNlJyxcbiAgICBkb21haW4sXG4gICAgc2VydmljZSxcbiAgfTtcblxuICBpZiAoc2VydmljZURhdGEpIHtcbiAgICBtZXNzYWdlLnNlcnZpY2VfZGF0YSA9IHNlcnZpY2VEYXRhO1xuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVFdmVudHMoZXZlbnRUeXBlKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgdHlwZTogJ3N1YnNjcmliZV9ldmVudHMnLFxuICB9O1xuXG4gIGlmIChldmVudFR5cGUpIHtcbiAgICBtZXNzYWdlLmV2ZW50X3R5cGUgPSBldmVudFR5cGU7XG4gIH1cblxuICByZXR1cm4gbWVzc2FnZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc3Vic2NyaWJlRXZlbnRzKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1bnN1YnNjcmliZV9ldmVudHMnLFxuICAgIHN1YnNjcmlwdGlvbixcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gJy4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY29uc3QgRVJSX0NBTk5PVF9DT05ORUNUID0gMTtcbmV4cG9ydCBjb25zdCBFUlJfSU5WQUxJRF9BVVRIID0gMjtcblxuZnVuY3Rpb24gZXh0cmFjdFJlc3VsdChtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlLnJlc3VsdDtcbn1cblxuY2xhc3MgQ29ubmVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHVybCwgb3B0aW9ucykge1xuICAgIHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5jb21tYW5kSWQgPSAxO1xuICAgIHRoaXMuY29tbWFuZHMgPSB7fTtcbiAgICB0aGlzLmNvbm5lY3Rpb25UcmllcyA9IDA7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IHt9O1xuICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50VHlwZV07XG5cbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXJzID0gdGhpcy5ldmVudExpc3RlbmVyc1tldmVudFR5cGVdID0gW107XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgZmlyZUV2ZW50KGV2ZW50VHlwZSkge1xuICAgICh0aGlzLmV2ZW50TGlzdGVuZXJzW2V2ZW50VHlwZV0gfHwgW10pLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2sodGhpcykpO1xuICB9XG5cbiAgY29ubmVjdCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gVXNlZCBmb3IgcmVzdWJzY3JpYmluZyBpbiB0aGUgZnV0dXJlXG4gICAgICBjb25zdCBvbGRDb21tYW5kcyA9IHRoaXMuY29tbWFuZHM7XG4gICAgICBPYmplY3Qua2V5cyhvbGRDb21tYW5kcykuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IG9sZENvbW1hbmRzW2lkXTtcblxuICAgICAgICAvLyBSZWplY3Qgc3R1ZmYgc3RpbGwgd2FpdGluZyBmb3IgYW4gYW5zd2VyXG4gICAgICAgIGlmIChpbmZvLnJlamVjdCkge1xuICAgICAgICAgIGluZm8ucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBpbnZhbGlkIGF1dGgsIHdlIHdpbGwgbm90IHRyeSB0byByZWNvbm5lY3QuXG4gICAgICBsZXQgaW52YWxpZEF1dGggPSBmYWxzZTtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uVHJpZXMgKz0gMTtcbiAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybCk7XG5cbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblRyaWVzID0gMDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuXG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdhdXRoX3JlcXVpcmVkJzpcbiAgICAgICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZXMuYXV0aCh0aGlzLm9wdGlvbnMuYXV0aFRva2VuKSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2F1dGhfaW52YWxpZCc6XG4gICAgICAgICAgICByZWplY3QoeyBjb2RlOiBFUlJfSU5WQUxJRF9BVVRIIH0pO1xuICAgICAgICAgICAgaW52YWxpZEF1dGggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdhdXRoX29rJzpcbiAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB0aGlzLmZpcmVFdmVudCgncmVhZHknKTtcblxuICAgICAgICAgICAgLy8gUmUtc3Vic2NyaWJlIHRvIGV2ZW50cyBhbmQgdXBkYXRlIG9sZCBsb2NhdGlvbiBvZiB1bnN1YiBtZXRob2RcbiAgICAgICAgICAgIC8vIHNvIG9sZCB1bnN1YiBtZXRob2Qga2VlcHMgd29ya2luZy5cbiAgICAgICAgICAgIHRoaXMuY29tbWFuZElkID0gMTtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHMgPSB7fTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMob2xkQ29tbWFuZHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBvbGRDb21tYW5kc1tpZF07XG5cbiAgICAgICAgICAgICAgaWYgKGluZm8uZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVFdmVudHMoaW5mby5ldmVudENhbGxiYWNrLCBpbmZvLmV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgICAgIC50aGVuKCh1bnN1YikgPT4geyBpbmZvLnVuc3Vic2NyaWJlID0gdW5zdWI7IH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnZXZlbnQnOlxuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1ttZXNzYWdlLmlkXS5ldmVudENhbGxiYWNrKG1lc3NhZ2UuZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICAgICAgaWYgKG1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdLnJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdLnJlamVjdChtZXNzYWdlLmVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbW1hbmRzW21lc3NhZ2UuaWRdO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuaGFuZGxlZCBtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGlmIChpbnZhbGlkQXV0aCB8fCB0aGlzLmNsb3NlUmVxdWVzdGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGludmFsaWQgYXV0aCwgbGV0J3Mgbm90IHJlY29ubmVjdCBvciB3ZSBnZXQgYmFubmVkLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbm5lY3Rpb25UcmllcyA9PT0gMCkge1xuICAgICAgICAgIC8vIFdlIHdlcmUgY29ubmVjdGVkIGF0IHNvbWUgcG9pbnQuXG4gICAgICAgICAgdGhpcy5maXJlRXZlbnQoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIG5ldmVyIHdlcmUgY29ubmVjdGVkXG4gICAgICAgICAgcmVqZWN0KEVSUl9DQU5OT1RfQ09OTkVDVCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgYWdhaW5cbiAgICAgICAgY29uc3Qgd2FpdFRpbWUgPSBNYXRoLm1pbih0aGlzLmNvbm5lY3Rpb25UcmllcywgNSkgKiAxMDAwO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29ubmVjdCgpLCB3YWl0VGltZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gIH1cblxuICBnZXRTdGF0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnN0YXRlcygpKS50aGVuKGV4dHJhY3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0U2VydmljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnNlcnZpY2VzKCkpLnRoZW4oZXh0cmFjdFJlc3VsdCk7XG4gIH1cblxuICBnZXRQYW5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2VQcm9taXNlKG1lc3NhZ2VzLnBhbmVscygpKS50aGVuKGV4dHJhY3RSZXN1bHQpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlcy5jb25maWcoKSkudGhlbihleHRyYWN0UmVzdWx0KTtcbiAgfVxuXG4gIGNhbGxTZXJ2aWNlKGRvbWFpbiwgc2VydmljZSwgc2VydmljZURhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVByb21pc2UobWVzc2FnZXMuY2FsbFNlcnZpY2UoZG9tYWluLCBzZXJ2aWNlLCBzZXJ2aWNlRGF0YSkpO1xuICB9XG5cbiAgLy8gZXZlbnRDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbmV3IGV2ZW50IGZpcmVzXG4gIC8vIFJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgdG8gYW4gdW5zdWJzY3JpYmUgZnVuY3Rpb24uXG4gIHN1YnNjcmliZUV2ZW50cyhldmVudENhbGxiYWNrLCBldmVudFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWVzc2FnZVByb21pc2UobWVzc2FnZXMuc3Vic2NyaWJlRXZlbnRzKGV2ZW50VHlwZSkpLnRoZW4oXG4gICAgICAocmVzdWx0TWVzc2FnZSkgPT4ge1xuICAgICAgICAvLyBXZSBzdG9yZSB1bnN1YnNjcmliZSBvbiBpbmZvIG9iamVjdC4gVGhhdCB3YXkgd2UgY2FuIG92ZXJ3cml0ZSBpdCBpbiBjYXNlXG4gICAgICAgIC8vIHdlIGdldCBkaXNjb25uZWN0ZWQgYW5kIHdlIGhhdmUgdG8gc3Vic2NyaWJlIGFnYWluLlxuICAgICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICAgIGV2ZW50Q2FsbGJhY2ssXG4gICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlcy51bnN1YnNjcmliZUV2ZW50cyhyZXN1bHRNZXNzYWdlLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7IGRlbGV0ZSB0aGlzLmNvbW1hbmRzW3Jlc3VsdE1lc3NhZ2UuaWRdOyB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNvbW1hbmRzW3Jlc3VsdE1lc3NhZ2UuaWRdID0gaW5mbztcblxuICAgICAgICByZXR1cm4gKCkgPT4gaW5mby51bnN1YnNjcmliZSgpO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgY29tbWEtZGFuZ2xlICovIC8qIGNvbW1hIGNyYXNoZXMgQnVibGUgKi9cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgY29tbWEtZGFuZ2xlICovXG4gICAgKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0aGlzLnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKTtcbiAgfVxuXG4gIHNlbmRNZXNzYWdlUHJvbWlzZShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29tbWFuZElkICs9IDE7XG4gICAgICBjb25zdCBjb21tYW5kSWQgPSB0aGlzLmNvbW1hbmRJZDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgICBtZXNzYWdlLmlkID0gY29tbWFuZElkO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuICAgICAgdGhpcy5jb21tYW5kc1tjb21tYW5kSWRdID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24odXJsLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNvbm4gPSBuZXcgQ29ubmVjdGlvbih1cmwsIG9wdGlvbnMpO1xuICByZXR1cm4gY29ubi5jb25uZWN0KCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbm5lY3Rpb247XG4iXSwibmFtZXMiOlsiY2FsbFNlcnZpY2UiLCJjb25zdCIsInN1YnNjcmliZUV2ZW50cyIsInRoaXMiLCJtZXNzYWdlcy5hdXRoIiwibWVzc2FnZXMuc3RhdGVzIiwibWVzc2FnZXMuc2VydmljZXMiLCJtZXNzYWdlcy5wYW5lbHMiLCJtZXNzYWdlcy5jb25maWciLCJtZXNzYWdlcy5jYWxsU2VydmljZSIsIm1lc3NhZ2VzLnN1YnNjcmliZUV2ZW50cyIsIm1lc3NhZ2VzLnVuc3Vic2NyaWJlRXZlbnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTyxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUU7RUFDOUIsT0FBTztJQUNMLElBQUksRUFBRSxNQUFNO0lBQ1osWUFBWSxFQUFFLFNBQVM7R0FDeEIsQ0FBQztDQUNIOztBQUVELEFBQU8sU0FBUyxNQUFNLEdBQUc7RUFDdkIsT0FBTztJQUNMLElBQUksRUFBRSxZQUFZO0dBQ25CLENBQUM7Q0FDSDs7QUFFRCxBQUFPLFNBQVMsTUFBTSxHQUFHO0VBQ3ZCLE9BQU87SUFDTCxJQUFJLEVBQUUsWUFBWTtHQUNuQixDQUFDO0NBQ0g7O0FBRUQsQUFBTyxTQUFTLFFBQVEsR0FBRztFQUN6QixPQUFPO0lBQ0wsSUFBSSxFQUFFLGNBQWM7R0FDckIsQ0FBQztDQUNIOztBQUVELEFBQU8sU0FBUyxNQUFNLEdBQUc7RUFDdkIsT0FBTztJQUNMLElBQUksRUFBRSxZQUFZO0dBQ25CLENBQUM7Q0FDSDs7QUFFRCxBQUFPLFNBQVNBLGFBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRTtFQUN4REMsSUFBTSxPQUFPLEdBQUc7SUFDZCxJQUFJLEVBQUUsY0FBYztJQUNwQixRQUFBLE1BQU07SUFDTixTQUFBLE9BQU87R0FDUixDQUFDOztFQUVGLElBQUksV0FBVyxFQUFFO0lBQ2YsT0FBTyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7R0FDcEM7O0VBRUQsT0FBTyxPQUFPLENBQUM7Q0FDaEI7O0FBRUQsQUFBTyxTQUFTQyxpQkFBZSxDQUFDLFNBQVMsRUFBRTtFQUN6Q0QsSUFBTSxPQUFPLEdBQUc7SUFDZCxJQUFJLEVBQUUsa0JBQWtCO0dBQ3pCLENBQUM7O0VBRUYsSUFBSSxTQUFTLEVB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 |
{ | ||
"name": "home-assistant-js-websocket", | ||
"version": "0.1.2", | ||
"version": "0.1.3", | ||
"description": "Home Assistant websocket client", | ||
@@ -5,0 +5,0 @@ "main": "dist/haws.cjs.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
81538
894
1