UNPKG

@zigbang/honeyfarm-master

Version:

## DASH BOARD HoneyFarm Node에 등록 되어 있는 안드로이드 단말을 웹페이지에서 실시간으로 확인 및 사용 할수 있도록 구현된 웹

206 lines (205 loc) 8.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var common_1 = require("@nestjs/common"); var reqTimeout = 6 * 60 * 1000; var SessionRouter = /** @class */ (function () { function SessionRouter() { this.routeMap = {}; this.commandRunTimeMap = {}; this.commandIntervalTime = undefined; this.newCommandTime = 0; this.checkNodeDeviceTimeMap = {}; this.checkNodeDeviceTimer = undefined; this.checkNodeDeviceTime = 60 * 1000; } SessionRouter.prototype.lsResource = function () { return Object.keys(SessionRouter.resources).length > 0 ? SessionRouter.resources : undefined; }; SessionRouter.prototype.findIp = function (platform, udid, version) { if (udid) { var resource = Object.entries(SessionRouter.resources) .filter(function (_a) { var key = _a[0], value = _a[1]; return value.status === "FREE"; }) .filter(function (_a) { var key = _a[0], value = _a[1]; return value.platform.toLowerCase() === platform.toLowerCase(); }) .filter(function (_a) { var key = _a[0], value = _a[1]; return value.udid === udid; }) .find(function (_a) { var key = _a[0], value = _a[1]; if (!version) { return true; } if (version === "*") { return true; } var regexPattern = new RegExp("" + version, "g"); return value.version.match(regexPattern); }); return resource && resource[0]; } else { var resource = Object.entries(SessionRouter.resources) .filter(function (_a) { var key = _a[0], value = _a[1]; return value.status === "FREE"; }) .filter(function (_a) { var key = _a[0], value = _a[1]; return value.platform.toLowerCase() === platform.toLowerCase(); }) .find(function (_a) { var key = _a[0], value = _a[1]; if (!version) { return true; } if (version === "*") { return true; } var regexPattern = new RegExp("" + version, "g"); return value.version.match(regexPattern); }); return resource && resource[0]; } }; SessionRouter.prototype.findUDID = function (ip) { return SessionRouter.resources[ip].udid; }; SessionRouter.prototype.findVersion = function (ip) { return SessionRouter.resources[ip].version; }; SessionRouter.prototype.findName = function (ip) { return SessionRouter.resources[ip].name; }; SessionRouter.prototype.findWDAPort = function (ip) { return SessionRouter.resources[ip].wdaPort; }; SessionRouter.prototype.findmjpegServerPort = function (ip) { return SessionRouter.resources[ip].mjpegServerPort; }; SessionRouter.prototype.findIpWithSession = function (session) { return "http://" + this.routeMap[session]; }; SessionRouter.prototype.setStatus = function (ip, status) { var resource = SessionRouter.resources[ip]; if (resource && resource.status) { SessionRouter.resources[ip].status = status; } }; SessionRouter.prototype.onSessionCreated = function (session, ip) { var _this = this; console.log("Session Created " + session + " with " + ip); this.routeMap[session] = ip; this.commandRunTimeMap[session] = Date.now().valueOf(); if (!this.commandIntervalTime) { this.commandIntervalTime = setInterval(function () { _this.checkCommandWaitTime(); }, 10000); } }; SessionRouter.prototype.onSessionDeleted = function (session, ip) { console.log("Session Deleted " + session + " ip " + ip); this.setStatus(ip.replace("http://", ""), "FREE"); delete this.routeMap[session]; delete this.commandRunTimeMap[session]; if (Object.keys(this.commandRunTimeMap).length === 0 && this.commandIntervalTime) { clearInterval(this.commandIntervalTime); this.commandIntervalTime = undefined; } }; SessionRouter.prototype.setNewCommandTimeOut = function (time) { if (time * 1000 > this.newCommandTime || Object.keys(this.routeMap).length == 0) { this.newCommandTime = time * 1000; } }; SessionRouter.prototype.getDeviceResource = function (addr) { if (false === SessionRouter.resources.hasOwnProperty(addr)) { return null; } return SessionRouter.resources[addr]; }; SessionRouter.prototype.updateDeviceResource = function (addr, resource) { SessionRouter.resources[addr] = resource; console.log("updateDeviceResource", SessionRouter.resources); }; SessionRouter.prototype.deleteDeviceResource = function (addr) { delete SessionRouter.resources[addr]; console.log("deleteDeviceResource", SessionRouter.resources); }; SessionRouter.prototype.findDeviceResource = function (ip, platform, version, udid) { var _this = this; if (!this.checkNodeDeviceTimer) { this.checkNodeDeviceTimer = setInterval(function () { _this.checkNodeDevice(); }, this.checkNodeDeviceTime); } var result = Object.entries(SessionRouter.resources).some(function (_a) { var key = _a[0], value = _a[1]; return key === ip && value.platform === platform && value.version === version && (!udid || value.udid === udid); }); if (result) { this.checkNodeDeviceTimeMap[ip] = Date.now().valueOf(); } return result; }; SessionRouter.prototype.router = function (userReq) { var session = userReq.originalUrl.match(/\/wd\/hub\/session\/((\d|\w|\-)*)\//); if (!session) { throw new common_1.NotFoundException(); } userReq.setTimeout(reqTimeout); this.commandRunTimeMap[session[1]] = Date.now().valueOf(); return this.routeMap[session[1]]; }; SessionRouter.prototype.pathResolver = function (userReq) { return userReq.originalUrl; }; SessionRouter.prototype.userResDecorator = function (proxyRes, // tslint:disable-next-line: no-any proxyResData, userReq, userRes) { if (userReq.path === "/wd/hub/session") { console.error("Unreachable Code!!!!!!"); } return proxyResData; }; SessionRouter.prototype.checkCommandWaitTime = function () { for (var _i = 0, _a = Object.entries(this.commandRunTimeMap); _i < _a.length; _i++) { var _b = _a[_i], session = _b[0], value = _b[1]; var currentTime = Date.now().valueOf(); if (currentTime - value > this.newCommandTime) { var ip = this.findIpWithSession(session); this.onSessionDeleted(session, ip); } } }; // https://github.com/zigbang/zbee/issues/45 // 일정시간(현재 60초)마다 돌면서 현재 노드에서 신호를 보내지 않는 단말 제거 // - 각 노드에서 10초 마다 단말을 갱신하기 위해 현재 단말 정보를 마스터로 보내고 마스터에서는 그 정보에 해당하는 단말이 있는지 여부를 보냄 // - 이때 각 단말의 ID( ip와 port)를 키로하는 오브젝트를 만들어서 현재 시간을 계속 갱신함 // - 만약 노드가 종료 되었다면 단말의 업데이트를 위한 정보를 보내지 않으므로 일정 시간 후 그 단말 정보를 삭제함 SessionRouter.prototype.checkNodeDevice = function () { for (var _i = 0, _a = Object.entries(this.checkNodeDeviceTimeMap); _i < _a.length; _i++) { var _b = _a[_i], ip = _b[0], value = _b[1]; var currentTime = Date.now().valueOf(); if (currentTime - value > this.checkNodeDeviceTime) { this.deleteDeviceResource(ip); delete this.checkNodeDeviceTimeMap[ip]; } if (Object.keys(this.checkNodeDeviceTimeMap).length === 0 && this.checkNodeDeviceTimer) { clearInterval(this.checkNodeDeviceTimer); this.checkNodeDeviceTimer = undefined; } } }; SessionRouter.resources = {}; return SessionRouter; }()); exports.default = new SessionRouter();