{"version":3,"sources":["components/classes/version-mapping.js"],"names":["angular","module","service","registeredFunctions","$q","version","a","b","versionCompare","v1","v2","options","v2parts","lexicographical","zeroExtend","v1parts","length","split","isValidPart","x","test","every","NaN","push","map","Number","registerFunction","i","reg","name","func","sort","compare","recallFunction","functionName","getFrontendSettings","then","settings","configVersion","minConfigVersion","HomeServerVersion","defer","resolve","console","log","promise"],"mappings":"aACIA,QAGKC,OAAO,iCADLC,QACK,yBAAA,0BACC,KAEGC,SAAAA,EAAwBC,GAA5B,IAAID,KA2BME,SAAYA,EACdC,EAAAC,GACI,OAAAD,EAAAD,QAAAE,EAAAF,QACZ,EAHQC,EAAED,QAAUE,EAAEF,SAKtB,EAChB,EAuE+B,SAAUG,EAAYC,EAAAC,EAAAC,GACnBC,IAAAA,EAAmBD,GAAAA,EAAAE,gBACjCC,EAAAH,GAAAA,EAAAG,WAEiBC,EAAWC,EAAAA,MAAQ,KACpBA,EAAcN,EAAAO,MAAA,KAE1B,SAAAC,EAAAC,GAEc,OAAKP,EAAY,iBAAA,SAAAQ,KAAAD,GAGnB,IAAAJ,EAAAM,MAAAH,KAAAN,EAAAS,MAAAH,GACL,OAAAI,IAGX,GAAAR,EAAA,CAEkB,KAAKF,EAAQI,OAAQJ,EAAAI,QAAAD,EAAAQ,KAAA,KAC1B,KAAAX,EAAAI,OAAAD,EAAAC,QAAAJ,EAAAW,KAAA,KAIjBV,IAEOE,EAAAA,EAAAS,IAAAC,QACeC,EAAAA,EAAgBF,IAAAC,SAGrC,IAAA,IAAAE,EAAA,EAAAA,EAAAZ,EAAAC,SAAAW,EAAA,CAEP,GAAAf,EAAAI,SAAAW,EAEN,OAAA,EAxBoB,GAAIZ,EAAQY,KAAOf,EAAQe,GAEpB,OAAIZ,EAAQY,GAAKf,EAAQe,GACrB,GAEC,EAIhB,OAAIZ,EAAQC,SAAWJ,EAAQI,QACnB,EAGL,EAGX,OACIU,iBA7HKvB,SAA+ByB,GAChCzB,EAAkCyB,EAAAC,QACtC1B,EAAAyB,EAAAC,UAEQ1B,IAAAA,IAAAA,EAAoByB,EAAIC,EAAI1B,EAAoByB,EAACvB,MAASW,OAAAW,IAC1D,GAAAxB,EAAAyB,EAAAC,MAAAF,GAAAtB,UAAAuB,EAAAvB,QACJ,OAIgBF,EAAQyB,EAAAC,MAAAN,MAEPZ,QAAAA,EAAAA,QACfmB,KAAAF,EAAAE,KACNnB,QAAAiB,EAAAjB,UACAR,EAAoByB,EAAIC,MAAME,KAAKC,IA+GnCC,eAvFa,SAAe9B,EAAoB+B,GAC1B,IAAG/B,EAAAA,EAAAA,QA8CbU,OA1CUC,EAAYqB,sBAEtBC,KAAA,SAAAC,GACQ1B,GAAOR,EAEJQ,GAAQ2B,CACE3B,IAAQ4B,IAAAA,EAAAA,EAAAA,EAAAA,EAA4BD,GAAetB,OAAAW,IAAA,CAC1CG,IAAKA,EAAK3B,EAAA+B,GAAAP,GACZ,GAAAnB,EACQ6B,EAAAG,kBAEnBV,EAAAzB,SACDS,YAAA,KACJ,EAEH,CACkBgB,GAAKnB,GACJmB,EAAAnB,SACxBA,EAAA2B,cAAA,CACJ,GAAAR,EAAAnB,QAAA4B,kBAAA5B,EAAA2B,cAGR,OAFIG,EAAAC,QAAAZ,EAAAA,MACca,QAAgCC,IAAGV,aAAeJ,EAAAA,QACpEW,EAAAI,QAIR,SAKhB,OADAJ,EAAAC,QAAAZ,EAAAA,MACAW,EAAAI,SAM4CF,QAAIhC,MAAQG,iCAAUoB,EAAA,0CAAAG,EAAAG,sBAKlC3B,EAAegC,SAyC3BrC,eAAgBA","file":"version-mapping.js","sourcesContent":["(function() {\r\n 'use strict';\r\n\r\n angular\r\n .module('app.classes.versionMapping', [])\r\n .service(\"versionMappingService\", ['frontEndSettingsService', '$q',\r\n function(frontEndSettingsService, $q) {\r\n var registeredFunctions = {};\r\n\r\n /* Register function call as name with some version.\r\n Function with a name and version can be registered only once. */\r\n function registerFunction(reg) {\r\n if (!registeredFunctions[reg.name]) {\r\n registeredFunctions[reg.name] = [];\r\n }\r\n for (var i = 0; i < registeredFunctions[reg.name].length; i++) {\r\n if (registeredFunctions[reg.name][i].version === reg.version) {\r\n return;\r\n }\r\n }\r\n registeredFunctions[reg.name].push(\r\n {\r\n version: reg.version,\r\n func: reg.func,\r\n options: reg.options\r\n });\r\n /* sort desc by version (mutates state) */\r\n registeredFunctions[reg.name].sort(compare);\r\n }\r\n\r\n /* Sorts function call by version in descending order. */\r\n function compare(a, b) {\r\n if (a.version < b.version)\r\n return 1;\r\n if (a.version > b.version)\r\n return -1;\r\n return 0;\r\n }\r\n\r\n /* Return registered function with highest compatible server version. Example:\r\n already registered function getScenes v1.5.0.0,\r\n function getScenes v1.5.6.0,\r\n function getScenes v0.0.0.0 (default),\r\n the client would like to call getScenes and its Homeserver version is 1.4.6.5.\r\n 1.5.6.0 > 1.4.6.5 => next 1.5.0.0 > 1.4.6.5 => next 0.0.0.0 <= 1.4.6.5 => call 0.0.0.0 version. */\r\n function recallFunction(functionName, options) {\r\n let defer = $q.defer();\r\n\r\n frontEndSettingsService.getFrontendSettings()\r\n .then(function(settings) {\r\n if (registeredFunctions[functionName]) {\r\n for (var i = 0; i < registeredFunctions[functionName].length; i++) {\r\n const func = registeredFunctions[functionName][i];\r\n if (versionCompare(\r\n settings.HomeServerVersion,\r\n func.version,\r\n { zeroExtend: true }\r\n ) >= 0)\r\n {\r\n if (options\r\n && func.options\r\n && options.configVersion) {\r\n if (func.options.minConfigVersion <= options.configVersion) {\r\n defer.resolve(func.func);\r\n console.log('recalled: ' + func.func());\r\n return defer.promise;\r\n }\r\n else {\r\n continue;\r\n }\r\n }\r\n else {\r\n defer.resolve(func.func);\r\n return defer.promise;\r\n }\r\n }\r\n }\r\n console.error('Data for registered function \"' + functionName + '\" not available for HomeServer version ' + settings.HomeServerVersion);\r\n }\r\n });\r\n\r\n return defer.promise;\r\n }\r\n\r\n /* Compare two string versions, e.g. 1.5.1.0 and 1.5.0.0 as numeric versions.\r\n\r\n versionCompare('1.5.3.0','1.5.12.0') => -1\r\n versionCompare('1.5.12.0','1.5.3.0') => +1\r\n versionCompare('1.5.0.0','1.5.0.0') => 0\r\n\r\n https://stackoverflow.com/a/6832721 */\r\n function versionCompare(v1, v2, options) {\r\n var lexicographical = options && options.lexicographical,\r\n zeroExtend = options && options.zeroExtend,\r\n v1parts = v1.split('.'),\r\n v2parts = v2.split('.');\r\n\r\n function isValidPart(x) {\r\n return (lexicographical ? /^\\d+[A-Za-z]*$/ : /^\\d+$/).test(x);\r\n }\r\n\r\n if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {\r\n return NaN;\r\n }\r\n\r\n if (zeroExtend) {\r\n while (v1parts.length < v2parts.length) v1parts.push(\"0\");\r\n while (v2parts.length < v1parts.length) v2parts.push(\"0\");\r\n }\r\n\r\n if (!lexicographical) {\r\n v1parts = v1parts.map(Number);\r\n v2parts = v2parts.map(Number);\r\n }\r\n\r\n for (var i = 0; i < v1parts.length; ++i) {\r\n if (v2parts.length === i) {\r\n return 1;\r\n }\r\n\r\n if (v1parts[i] === v2parts[i]) {\r\n continue;\r\n } else if (v1parts[i] > v2parts[i]) {\r\n return 1;\r\n } else {\r\n return -1;\r\n }\r\n }\r\n\r\n if (v1parts.length !== v2parts.length) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n return {\r\n registerFunction: registerFunction,\r\n recallFunction: recallFunction,\r\n versionCompare: versionCompare\r\n };\r\n }\r\n ]);\r\n\r\n})();\r\n"],"sourceRoot":"../../../../app"}