@zigbang/honeyfarm-master
Version:
## DASH BOARD HoneyFarm Node에 등록 되어 있는 안드로이드 단말을 웹페이지에서 실시간으로 확인 및 사용 할수 있도록 구현된 웹
206 lines (205 loc) • 8.87 kB
JavaScript
"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();