291 lines
9.7 KiB
JavaScript
Executable File
291 lines
9.7 KiB
JavaScript
Executable File
/**
|
|
* Copyright (c) 2020
|
|
*
|
|
* CENTIRM HotelTV Background service module javascript.
|
|
*
|
|
* @summary short description for the file
|
|
* @author Joel <joel.kim@centirm.com>
|
|
*
|
|
* Created at : 2020-11-26 02:21:56
|
|
* Last modified : 2020-11-26 15:31:40
|
|
*/
|
|
// importScripts('./lib/hoteltv.js');
|
|
// importScripts('./lib/hoteltv.api.js');
|
|
|
|
const g_config = {};
|
|
var g_port = null;
|
|
var g_tmrHndl = null;
|
|
var g_tm_prev = {
|
|
"news": null,
|
|
"epg": null,
|
|
"weather": null,
|
|
"flight": null,
|
|
"report": null,
|
|
};
|
|
|
|
//// 비공개 매써드
|
|
/**
|
|
* API Wrapper Function::>
|
|
*/
|
|
function __svcfxn_get_base_url() {
|
|
var sz_base_url = "http://" + g_config.svrinfo.ipaddr + ":" + g_config.svrinfo.port;
|
|
return sz_base_url;
|
|
}
|
|
|
|
/**
|
|
* API Wrapper Function::>
|
|
* @param {string} api_type api type.
|
|
* @param {callback} callback is callback object
|
|
*/
|
|
function __svcfxn_get_api_url(api_type) {
|
|
var dic_api_url = {
|
|
"get_news": __svcfxn_get_base_url() + "/api/" + g_config.token.version + "/assets/" + g_config.dev_family + "/" + g_config.dev_snum + "/news",
|
|
"get_epg": __svcfxn_get_base_url() + "/api/" + g_config.token.version + "/assets/" + g_config.dev_family + "/" + g_config.dev_snum + "/epg",
|
|
"get_weather": __svcfxn_get_base_url() + "/api/" + g_config.token.version + "/assets/" + g_config.dev_family + "/" + g_config.dev_snum + "/weather",
|
|
"get_flight": __svcfxn_get_base_url() + "/api/" + g_config.token.version + "/assets/" + g_config.dev_family + "/" + g_config.dev_snum + "/flight",
|
|
}
|
|
|
|
if (api_type in dic_api_url) {
|
|
return dic_api_url[api_type];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* API Wrapper Function::> HOTELTV API
|
|
* @param {string} sz_url is API URL
|
|
* @param {string} api_type is API TYPE
|
|
* @param {dictionary} dic_param is PARAMETERs
|
|
*/
|
|
function __svcfxn_CallCmsApi(sz_url, api_type, dic_param) {
|
|
return new Promise((resolve, reject) => {
|
|
let isPostMsg = false;
|
|
let xhr = new XMLHttpRequest();
|
|
let formData = new FormData();
|
|
let _ret = { type: api_type, error: true, reason: null, data: null };
|
|
|
|
//xhr.timeout = 500;
|
|
if (dic_param !== null) {
|
|
isPostMsg = true;
|
|
for (_key in dic_param) {
|
|
formData.append(_key.toString(), dic_param[_key]);
|
|
}
|
|
}
|
|
|
|
xhr.onload = function() {
|
|
if (xhr.status === 200 || xhr.status === 201) {
|
|
_ret.error = false;
|
|
_ret.data = xhr.response;
|
|
resolve(_ret);
|
|
} else {
|
|
reject(_ret);
|
|
}
|
|
};
|
|
|
|
xhr.ontimeout = function(e) {
|
|
// XMLHttpRequest timed out. Do something here.
|
|
_ret.reason = "TIMEOUT";
|
|
reject(_ret);
|
|
};
|
|
|
|
xhr.onerror = function() {
|
|
_ret.reason = "FATAL";
|
|
reject(_ret);
|
|
}
|
|
|
|
|
|
if (isPostMsg) {
|
|
//console.log("Given api url is POST message")
|
|
xhr.open('POST', sz_url);
|
|
xhr.setRequestHeader("Accept", "application/json");
|
|
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
xhr.setRequestHeader("Authorization", "Bearer " + g_config.token.apikey);
|
|
xhr.send(formData); // 폼 데이터 객체 전송
|
|
} else {
|
|
//console.log("Given api url is GET message")
|
|
xhr.open('GET', sz_url, true);
|
|
xhr.setRequestHeader("Accept", "application/json");
|
|
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
xhr.setRequestHeader("Authorization", "Bearer " + g_config.token.apikey);
|
|
xhr.send(null);
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* HCAP Wrapper Function::> Get Device Properties(Realted HCAP API:hcap.property.getProperty)
|
|
* @param {string} sz_key property key name.
|
|
* @param {callback} callback is callback object
|
|
*/
|
|
async function sworker_service(args) {
|
|
return new Promise((resolve, reject) => {
|
|
let _bNeed_Update = {
|
|
"epg": false,
|
|
"news": false,
|
|
"flight": false,
|
|
"weather": false,
|
|
"report": false,
|
|
};
|
|
let _tm_cur = new Date();
|
|
|
|
// CHECK EPG INFORMATION UPDATE
|
|
if (g_tm_prev.epg == null) {
|
|
g_tm_prev.epg = new Date();
|
|
_bNeed_Update.epg = true;
|
|
} else {
|
|
let _tm_diff_ms = _tm_cur.getTime() - g_tm_prev.epg.getTime();
|
|
let _tm_diff_s = Math.floor(_tm_diff_ms / 1000);
|
|
|
|
//EPG정보는 매 30분 마다 한번씩 업데이트
|
|
if (_tm_diff_s > 1800) {
|
|
//if (_tm_diff_s > 60) {
|
|
g_tm_prev.epg = _tm_cur;
|
|
_bNeed_Update.epg = true;
|
|
}
|
|
}
|
|
|
|
// CHECK NEWS INFORMATION UPDATE
|
|
if (g_tm_prev.news == null) {
|
|
g_tm_prev.news = new Date();
|
|
_bNeed_Update.news = true;
|
|
} else {
|
|
let _tm_diff_ms = _tm_cur.getTime() - g_tm_prev.news.getTime();
|
|
let _tm_diff_s = Math.floor(_tm_diff_ms / 1000);
|
|
|
|
//NEWS정보는 매 20분 마다 한번씩 업데이트
|
|
if (_tm_diff_s > 1200) {
|
|
g_tm_prev.news = _tm_cur;
|
|
_bNeed_Update.news = true;
|
|
}
|
|
}
|
|
|
|
|
|
// CHECK FLIGHT INFORMATION UPDATE
|
|
if (g_tm_prev.flight == null) {
|
|
g_tm_prev.flight = new Date();
|
|
_bNeed_Update.flight = true;
|
|
} else {
|
|
let _tm_diff_ms = _tm_cur.getTime() - g_tm_prev.flight.getTime();
|
|
let _tm_diff_s = Math.floor(_tm_diff_ms / 1000);
|
|
|
|
//FLIGHT정보는 매 60분 마다 한번씩 업데이트
|
|
if (_tm_diff_s > 3600) {
|
|
g_tm_prev.flight = _tm_cur;
|
|
_bNeed_Update.flight = true;
|
|
}
|
|
}
|
|
|
|
// CHECK WEATHER INFORMATION UPDATE
|
|
if (g_tm_prev.weather == null) {
|
|
g_tm_prev.weather = new Date();
|
|
_bNeed_Update.weather = true;
|
|
} else {
|
|
let _tm_diff_ms = _tm_cur.getTime() - g_tm_prev.weather.getTime();
|
|
let _tm_diff_s = Math.floor(_tm_diff_ms / 1000);
|
|
|
|
//NEWS정보는 매 2시간 마다 한번씩 업데이트
|
|
if (_tm_diff_s > 7200) {
|
|
g_tm_prev.weather = _tm_cur;
|
|
_bNeed_Update.weather = true;
|
|
}
|
|
}
|
|
|
|
|
|
// CHECK REPORT INFORMATION UPDATE
|
|
if (g_tm_prev.report == null) {
|
|
g_tm_prev.report = new Date();
|
|
_bNeed_Update.report = true;
|
|
} else {
|
|
let _tm_diff_ms = _tm_cur.getTime() - g_tm_prev.report.getTime();
|
|
let _tm_diff_s = Math.floor(_tm_diff_ms / 1000);
|
|
|
|
//REPORT는 매 5초 마다 한번씩 업데이트
|
|
if (_tm_diff_s > 5) {
|
|
g_tm_prev.report = _tm_cur;
|
|
_bNeed_Update.report = true;
|
|
}
|
|
}
|
|
|
|
|
|
// 후처리(실제 데이터 가져오고 부모에세 메시지로 안내)
|
|
if (_bNeed_Update.epg === true) {
|
|
let sz_api_url = __svcfxn_get_api_url("get_epg");
|
|
__svcfxn_CallCmsApi(sz_api_url, "GetEpg", null).then(_result => {
|
|
g_port.postMessage({ "event": "update_epg", "ret": "OK", "data": JSON.parse(_result.data) });
|
|
}).catch(_error => {
|
|
g_port.postMessage({ "event": "update_epg", "ret": "ERROR", "data": null });
|
|
});
|
|
}
|
|
|
|
if (_bNeed_Update.news === true) {
|
|
let sz_api_url = __svcfxn_get_api_url("get_news");
|
|
__svcfxn_CallCmsApi(sz_api_url, "GetNews", null).then(_result => {
|
|
g_port.postMessage({ "event": "update_news", "ret": "OK", "data": JSON.parse(_result.data) });
|
|
}).catch(_error => {
|
|
g_port.postMessage({ "event": "update_news", "ret": "ERROR", "data": null });
|
|
});
|
|
}
|
|
|
|
if (_bNeed_Update.flight == true) {
|
|
let sz_api_url = __svcfxn_get_api_url("get_flight");
|
|
__svcfxn_CallCmsApi(sz_api_url, "GetFlight", null).then(_result => {
|
|
g_port.postMessage({ "event": "update_flight", "ret": "OK", "data": JSON.parse(_result.data) });
|
|
}).catch(_error => {
|
|
g_port.postMessage({ "event": "update_flight", "ret": "ERROR", "data": null });
|
|
});
|
|
}
|
|
|
|
if (_bNeed_Update.weather == true) {
|
|
g_port.postMessage({ "event": "update_weather", "ret": "OK", "data": _bNeed_Update.weather });
|
|
}
|
|
|
|
if (_bNeed_Update.report == true) {
|
|
g_port.postMessage({ "event": "update_report", "ret": "OK", "data": _bNeed_Update.report });
|
|
}
|
|
resolve();
|
|
});
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onconnect = function(e) {
|
|
if (g_port != null) {
|
|
return;
|
|
}
|
|
|
|
g_port = e.ports[0];
|
|
|
|
g_port.addEventListener('message', function(e) {
|
|
let recvMsg = e.data;
|
|
if (recvMsg.cmd === "start_service") {
|
|
let _param = recvMsg.param;
|
|
g_config.token = _param.token;
|
|
g_config.dev_family = _param.dev_family;
|
|
g_config.dev_snum = _param.dev_snum;
|
|
g_config.svrinfo = _param.svrinfo;
|
|
|
|
//Periodic polling HotelTV API service
|
|
if (g_tmrHndl == null) {
|
|
g_tmrHndl = setTimeout(async function svcTask() {
|
|
await sworker_service();
|
|
g_tmrHndl = setTimeout(svcTask, 1000);
|
|
}, 0);
|
|
}
|
|
}
|
|
});
|
|
|
|
g_port.start(); // Required when using addEventListener. Otherwise called implicitly by onmessage setter.
|
|
} |