diff --git a/.gitignore b/.gitignore index d9b320a..53a5c18 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,5 @@ xosmoRes HybridCLRData ARMazModuleData/Modules ARMazModuleData/Packages +WebApp/node_modules +WebApp/build diff --git a/WebApp/build/class/answer.js b/WebApp/build/class/answer.js deleted file mode 100644 index 7c7b3df..0000000 --- a/WebApp/build/class/answer.js +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var Answer = /** @class */ (function () { - function Answer(sdp, datetime) { - this.sdp = sdp; - this.datetime = datetime; - } - return Answer; -}()); -exports.default = Answer; -//# sourceMappingURL=answer.js.map \ No newline at end of file diff --git a/WebApp/build/class/answer.js.map b/WebApp/build/class/answer.js.map deleted file mode 100644 index 73dc344..0000000 --- a/WebApp/build/class/answer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"answer.js","sourceRoot":"","sources":["../../src/class/answer.ts"],"names":[],"mappings":";;AAAA;IAGE,gBAAY,GAAW,EAAE,QAAgB;QACvC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IACH,aAAC;AAAD,CAAC,AAPD,IAOC"} \ No newline at end of file diff --git a/WebApp/build/class/candidate.js b/WebApp/build/class/candidate.js deleted file mode 100644 index 9768269..0000000 --- a/WebApp/build/class/candidate.js +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var Candidate = /** @class */ (function () { - function Candidate(candidate, sdpMLineIndex, sdpMid, datetime) { - this.candidate = candidate; - this.sdpMLineIndex = sdpMLineIndex; - this.sdpMid = sdpMid; - this.datetime = datetime; - } - return Candidate; -}()); -exports.default = Candidate; -//# sourceMappingURL=candidate.js.map \ No newline at end of file diff --git a/WebApp/build/class/candidate.js.map b/WebApp/build/class/candidate.js.map deleted file mode 100644 index 65fa2c8..0000000 --- a/WebApp/build/class/candidate.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"candidate.js","sourceRoot":"","sources":["../../src/class/candidate.ts"],"names":[],"mappings":";;AAAA;IAKE,mBAAY,SAAiB,EAAE,aAAqB,EAAE,MAAc,EAAE,QAAgB;QACpF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IACH,gBAAC;AAAD,CAAC,AAXD,IAWC"} \ No newline at end of file diff --git a/WebApp/build/class/httphandler.js b/WebApp/build/class/httphandler.js deleted file mode 100644 index 9d12fa9..0000000 --- a/WebApp/build/class/httphandler.js +++ /dev/null @@ -1,372 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.postCandidate = exports.postAnswer = exports.postOffer = exports.deleteConnection = exports.createConnection = exports.deleteSession = exports.createSession = exports.getCandidate = exports.getAnswer = exports.getOffer = exports.getConnection = exports.getAll = exports.checkSessionId = exports.reset = void 0; -var offer_1 = require("./offer"); -var answer_1 = require("./answer"); -var candidate_1 = require("./candidate"); -var uuid_1 = require("uuid"); -var Disconnection = /** @class */ (function () { - function Disconnection(id, datetime) { - this.id = id; - this.datetime = datetime; - } - return Disconnection; -}()); -var TimeoutRequestedTime = 10000; // 10sec -var isPrivate; -// [{sessonId:[connectionId,...]}] -var clients = new Map(); -// [{sessonId:Date}] -var lastRequestedTime = new Map(); -// [{connectionId:[sessionId1, sessionId2]}] -var connectionPair = new Map(); // key = connectionId -// [{sessionId:[{connectionId:Offer},...]}] -var offers = new Map(); // key = sessionId -// [{sessionId:[{connectionId:Answer},...]}] -var answers = new Map(); // key = sessionId -// [{sessionId:[{connectionId:Candidate},...]}] -var candidates = new Map(); // key = sessionId -// [{sessionId:[Disconnection,...]}] -var disconnections = new Map(); // key = sessionId -function getOrCreateConnectionIds(sessionId) { - var connectionIds = null; - if (!clients.has(sessionId)) { - connectionIds = new Set(); - clients.set(sessionId, connectionIds); - } - connectionIds = clients.get(sessionId); - return connectionIds; -} -function reset(mode) { - isPrivate = mode == "private"; - clients.clear(); - connectionPair.clear(); - offers.clear(); - answers.clear(); - candidates.clear(); - disconnections.clear(); -} -exports.reset = reset; -function checkSessionId(req, res, next) { - if (req.url === '/') { - next(); - return; - } - var id = req.header('session-id'); - if (!clients.has(id)) { - res.sendStatus(404); - return; - } - lastRequestedTime.set(id, Date.now()); - next(); -} -exports.checkSessionId = checkSessionId; -function _deleteConnection(sessionId, connectionId, datetime) { - clients.get(sessionId).delete(connectionId); - if (isPrivate) { - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - var otherSessionId = pair[0] == sessionId ? pair[1] : pair[0]; - if (otherSessionId) { - if (clients.has(otherSessionId)) { - clients.get(otherSessionId).delete(connectionId); - var array1 = disconnections.get(otherSessionId); - array1.push(new Disconnection(connectionId, datetime)); - } - } - } - } - else { - disconnections.forEach(function (array, id) { - if (id == sessionId) - return; - array.push(new Disconnection(connectionId, datetime)); - }); - } - connectionPair.delete(connectionId); - offers.get(sessionId).delete(connectionId); - answers.get(sessionId).delete(connectionId); - candidates.get(sessionId).delete(connectionId); - var array2 = disconnections.get(sessionId); - array2.push(new Disconnection(connectionId, datetime)); -} -function _deleteSession(sessionId) { - if (clients.has(sessionId)) { - for (var _i = 0, _a = Array.from(clients.get(sessionId)); _i < _a.length; _i++) { - var connectionId = _a[_i]; - _deleteConnection(sessionId, connectionId, Date.now()); - } - } - offers.delete(sessionId); - answers.delete(sessionId); - candidates.delete(sessionId); - clients.delete(sessionId); - disconnections.delete(sessionId); -} -function _checkForTimedOutSessions() { - for (var _i = 0, _a = Array.from(clients.keys()); _i < _a.length; _i++) { - var sessionId = _a[_i]; - if (!lastRequestedTime.has(sessionId)) - continue; - if (lastRequestedTime.get(sessionId) > Date.now() - TimeoutRequestedTime) - continue; - _deleteSession(sessionId); - console.log("deleted sessionId:".concat(sessionId, " by timeout.")); - } -} -function _getConnection(sessionId) { - _checkForTimedOutSessions(); - return Array.from(clients.get(sessionId)); -} -function _getDisconnection(sessionId, fromTime) { - _checkForTimedOutSessions(); - var arrayDisconnections = []; - if (disconnections.size != 0 && disconnections.has(sessionId)) { - arrayDisconnections = disconnections.get(sessionId); - } - if (fromTime > 0) { - arrayDisconnections = arrayDisconnections.filter(function (v) { return v.datetime >= fromTime; }); - } - return arrayDisconnections; -} -function _getOffer(sessionId, fromTime) { - var arrayOffers = []; - if (offers.size != 0) { - if (isPrivate) { - if (offers.has(sessionId)) { - arrayOffers = Array.from(offers.get(sessionId)); - } - } - else { - var otherSessionMap = Array.from(offers).filter(function (x) { return x[0] != sessionId; }); - arrayOffers = [].concat.apply([], Array.from(otherSessionMap, function (x) { return Array.from(x[1], function (y) { return [y[0], y[1]]; }); })); - } - } - if (fromTime > 0) { - arrayOffers = arrayOffers.filter(function (v) { return v[1].datetime >= fromTime; }); - } - return arrayOffers; -} -function _getAnswer(sessionId, fromTime) { - var arrayAnswers = []; - if (answers.size != 0 && answers.has(sessionId)) { - arrayAnswers = Array.from(answers.get(sessionId)); - } - if (fromTime > 0) { - arrayAnswers = arrayAnswers.filter(function (v) { return v[1].datetime >= fromTime; }); - } - return arrayAnswers; -} -function _getCandidate(sessionId, fromTime) { - var connectionIds = Array.from(clients.get(sessionId)); - var arr = []; - for (var _i = 0, connectionIds_1 = connectionIds; _i < connectionIds_1.length; _i++) { - var connectionId = connectionIds_1[_i]; - var pair = connectionPair.get(connectionId); - if (pair == null) { - continue; - } - var otherSessionId = sessionId === pair[0] ? pair[1] : pair[0]; - if (!candidates.get(otherSessionId) || !candidates.get(otherSessionId).get(connectionId)) { - continue; - } - var arrayCandidates = candidates.get(otherSessionId).get(connectionId) - .filter(function (v) { return v.datetime >= fromTime; }); - if (arrayCandidates.length === 0) { - continue; - } - for (var _a = 0, arrayCandidates_1 = arrayCandidates; _a < arrayCandidates_1.length; _a++) { - var candidate = arrayCandidates_1[_a]; - arr.push([connectionId, candidate]); - } - } - return arr; -} -function getAnswer(req, res) { - // get `fromtime` parameter from request query - var fromTime = req.query.fromtime ? Number(req.query.fromtime) : 0; - var sessionId = req.header('session-id'); - var answers = _getAnswer(sessionId, fromTime); - res.json({ answers: answers.map(function (v) { return ({ connectionId: v[0], sdp: v[1].sdp, type: "answer", datetime: v[1].datetime }); }) }); -} -exports.getAnswer = getAnswer; -function getConnection(req, res) { - // get `fromtime` parameter from request query - var sessionId = req.header('session-id'); - var connections = _getConnection(sessionId); - res.json({ connections: connections.map(function (v) { return ({ connectionId: v, type: "connect", datetime: Date.now() }); }) }); -} -exports.getConnection = getConnection; -function getOffer(req, res) { - // get `fromtime` parameter from request query - var fromTime = req.query.fromtime ? Number(req.query.fromtime) : 0; - var sessionId = req.header('session-id'); - var offers = _getOffer(sessionId, fromTime); - res.json({ offers: offers.map(function (v) { return ({ connectionId: v[0], sdp: v[1].sdp, polite: v[1].polite, type: "offer", datetime: v[1].datetime }); }) }); -} -exports.getOffer = getOffer; -function getCandidate(req, res) { - // get `fromtime` parameter from request query - var fromTime = req.query.fromtime ? Number(req.query.fromtime) : 0; - var sessionId = req.header('session-id'); - var candidates = _getCandidate(sessionId, fromTime); - res.json({ candidates: candidates.map(function (v) { return ({ connectionId: v[0], candidate: v[1].candidate, sdpMLineIndex: v[1].sdpMLineIndex, sdpMid: v[1].sdpMid, type: "candidate", datetime: v[1].datetime }); }) }); -} -exports.getCandidate = getCandidate; -function getAll(req, res) { - var fromTime = req.query.fromtime ? Number(req.query.fromtime) : 0; - var sessionId = req.header('session-id'); - var connections = _getConnection(sessionId); - var offers = _getOffer(sessionId, fromTime); - var answers = _getAnswer(sessionId, fromTime); - var candidates = _getCandidate(sessionId, fromTime); - var disconnections = _getDisconnection(sessionId, fromTime); - var datetime = lastRequestedTime.get(sessionId); - var array = []; - array = array.concat(connections.map(function (v) { return ({ connectionId: v, type: "connect", datetime: datetime }); })); - array = array.concat(offers.map(function (v) { return ({ connectionId: v[0], sdp: v[1].sdp, polite: v[1].polite, type: "offer", datetime: v[1].datetime }); })); - array = array.concat(answers.map(function (v) { return ({ connectionId: v[0], sdp: v[1].sdp, type: "answer", datetime: v[1].datetime }); })); - array = array.concat(candidates.map(function (v) { return ({ connectionId: v[0], candidate: v[1].candidate, sdpMLineIndex: v[1].sdpMLineIndex, sdpMid: v[1].sdpMid, type: "candidate", datetime: v[1].datetime }); })); - array = array.concat(disconnections.map(function (v) { return ({ connectionId: v.id, type: "disconnect", datetime: v.datetime }); })); - array.sort(function (a, b) { return a.datetime - b.datetime; }); - res.json({ messages: array, datetime: datetime }); -} -exports.getAll = getAll; -function createSession(req, res) { - var sessionId = typeof req === "string" ? req : (0, uuid_1.v4)(); - clients.set(sessionId, new Set()); - offers.set(sessionId, new Map()); - answers.set(sessionId, new Map()); - candidates.set(sessionId, new Map()); - disconnections.set(sessionId, []); - res.json({ sessionId: sessionId }); -} -exports.createSession = createSession; -function deleteSession(req, res) { - var id = req.header('session-id'); - _deleteSession(id); - res.sendStatus(200); -} -exports.deleteSession = deleteSession; -function createConnection(req, res) { - var sessionId = req.header('session-id'); - var connectionId = req.body.connectionId; - var datetime = lastRequestedTime.get(sessionId); - if (connectionId == null) { - res.status(400).send({ error: new Error("connectionId is required") }); - return; - } - var polite = true; - if (isPrivate) { - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - if (pair[0] != null && pair[1] != null) { - var err = new Error("".concat(connectionId, ": This connection id is already used.")); - console.log(err); - res.status(400).send({ error: err }); - return; - } - else if (pair[0] != null) { - connectionPair.set(connectionId, [pair[0], sessionId]); - var map = getOrCreateConnectionIds(pair[0]); - map.add(connectionId); - } - } - else { - connectionPair.set(connectionId, [sessionId, null]); - polite = false; - } - } - var connectionIds = getOrCreateConnectionIds(sessionId); - connectionIds.add(connectionId); - res.json({ connectionId: connectionId, polite: polite, type: "connect", datetime: datetime }); -} -exports.createConnection = createConnection; -function deleteConnection(req, res) { - var sessionId = req.header('session-id'); - var connectionId = req.body.connectionId; - var datetime = lastRequestedTime.get(sessionId); - _deleteConnection(sessionId, connectionId, datetime); - res.json({ connectionId: connectionId }); -} -exports.deleteConnection = deleteConnection; -function postOffer(req, res) { - var sessionId = req.header('session-id'); - var connectionId = req.body.connectionId; - var datetime = lastRequestedTime.get(sessionId); - var keySessionId = null; - var polite = false; - if (isPrivate) { - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - keySessionId = pair[0] == sessionId ? pair[1] : pair[0]; - if (keySessionId != null) { - polite = true; - var map_1 = offers.get(keySessionId); - map_1.set(connectionId, new offer_1.default(req.body.sdp, datetime, polite)); - } - } - res.sendStatus(200); - return; - } - if (!connectionPair.has(connectionId)) { - connectionPair.set(connectionId, [sessionId, null]); - } - keySessionId = sessionId; - var map = offers.get(keySessionId); - map.set(connectionId, new offer_1.default(req.body.sdp, datetime, polite)); - res.sendStatus(200); -} -exports.postOffer = postOffer; -function postAnswer(req, res) { - var sessionId = req.header('session-id'); - var connectionId = req.body.connectionId; - var datetime = lastRequestedTime.get(sessionId); - var connectionIds = getOrCreateConnectionIds(sessionId); - connectionIds.add(connectionId); - if (!connectionPair.has(connectionId)) { - res.sendStatus(200); - return; - } - // add connectionPair - var pair = connectionPair.get(connectionId); - var otherSessionId = pair[0] == sessionId ? pair[1] : pair[0]; - if (!clients.has(otherSessionId)) { - // already deleted - res.sendStatus(200); - return; - } - if (!isPrivate) { - connectionPair.set(connectionId, [otherSessionId, sessionId]); - } - var map = answers.get(otherSessionId); - map.set(connectionId, new answer_1.default(req.body.sdp, datetime)); - // update datetime for candidates - var mapCandidates = candidates.get(otherSessionId); - if (mapCandidates) { - var arrayCandidates = mapCandidates.get(connectionId); - if (arrayCandidates) { - for (var _i = 0, arrayCandidates_2 = arrayCandidates; _i < arrayCandidates_2.length; _i++) { - var candidate = arrayCandidates_2[_i]; - candidate.datetime = datetime; - } - } - } - res.sendStatus(200); -} -exports.postAnswer = postAnswer; -function postCandidate(req, res) { - var sessionId = req.header('session-id'); - var connectionId = req.body.connectionId; - var datetime = lastRequestedTime.get(sessionId); - var map = candidates.get(sessionId); - if (!map.has(connectionId)) { - map.set(connectionId, []); - } - var arr = map.get(connectionId); - var candidate = new candidate_1.default(req.body.candidate, req.body.sdpMLineIndex, req.body.sdpMid, datetime); - arr.push(candidate); - res.sendStatus(200); -} -exports.postCandidate = postCandidate; -//# sourceMappingURL=httphandler.js.map \ No newline at end of file diff --git a/WebApp/build/class/httphandler.js.map b/WebApp/build/class/httphandler.js.map deleted file mode 100644 index 7919a4b..0000000 --- a/WebApp/build/class/httphandler.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"httphandler.js","sourceRoot":"","sources":["../../src/class/httphandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/WebApp/build/class/offer.js b/WebApp/build/class/offer.js deleted file mode 100644 index a06ec68..0000000 --- a/WebApp/build/class/offer.js +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var Offer = /** @class */ (function () { - function Offer(sdp, datetime, polite) { - this.sdp = sdp; - this.datetime = datetime; - this.polite = polite; - } - return Offer; -}()); -exports.default = Offer; -//# sourceMappingURL=offer.js.map \ No newline at end of file diff --git a/WebApp/build/class/offer.js.map b/WebApp/build/class/offer.js.map deleted file mode 100644 index 1d6a575..0000000 --- a/WebApp/build/class/offer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"offer.js","sourceRoot":"","sources":["../../src/class/offer.ts"],"names":[],"mappings":";;AAAA;IAIE,eAAY,GAAW,EAAE,QAAgB,EAAE,MAAe;QACxD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IACH,YAAC;AAAD,CAAC,AATD,IASC"} \ No newline at end of file diff --git a/WebApp/build/class/options.js b/WebApp/build/class/options.js deleted file mode 100644 index 0dfad07..0000000 --- a/WebApp/build/class/options.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/WebApp/build/class/options.js.map b/WebApp/build/class/options.js.map deleted file mode 100644 index 24f5a48..0000000 --- a/WebApp/build/class/options.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/class/options.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/WebApp/build/class/websockethandler.js b/WebApp/build/class/websockethandler.js deleted file mode 100644 index 18347d0..0000000 --- a/WebApp/build/class/websockethandler.js +++ /dev/null @@ -1,141 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.onCandidate = exports.onAnswer = exports.onOffer = exports.onDisconnect = exports.onConnect = exports.remove = exports.add = exports.reset = void 0; -var offer_1 = require("./offer"); -var answer_1 = require("./answer"); -var candidate_1 = require("./candidate"); -var isPrivate; -// [{sessonId:[connectionId,...]}] -var clients = new Map(); -// [{connectionId:[sessionId1, sessionId2]}] -var connectionPair = new Map(); -function getOrCreateConnectionIds(session) { - var connectionIds = null; - if (!clients.has(session)) { - connectionIds = new Set(); - clients.set(session, connectionIds); - } - connectionIds = clients.get(session); - return connectionIds; -} -function reset(mode) { - isPrivate = mode == "private"; -} -exports.reset = reset; -function add(ws) { - clients.set(ws, new Set()); -} -exports.add = add; -function remove(ws) { - var connectionIds = clients.get(ws); - connectionIds.forEach(function (connectionId) { - var pair = connectionPair.get(connectionId); - if (pair) { - var otherSessionWs = pair[0] == ws ? pair[1] : pair[0]; - if (otherSessionWs) { - otherSessionWs.send(JSON.stringify({ type: "disconnect", connectionId: connectionId })); - } - } - connectionPair.delete(connectionId); - }); - clients.delete(ws); -} -exports.remove = remove; -function onConnect(ws, connectionId) { - var polite = true; - if (isPrivate) { - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - if (pair[0] != null && pair[1] != null) { - ws.send(JSON.stringify({ type: "error", message: "".concat(connectionId, ": This connection id is already used.") })); - return; - } - else if (pair[0] != null) { - connectionPair.set(connectionId, [pair[0], ws]); - } - } - else { - connectionPair.set(connectionId, [ws, null]); - polite = false; - } - } - var connectionIds = getOrCreateConnectionIds(ws); - connectionIds.add(connectionId); - ws.send(JSON.stringify({ type: "connect", connectionId: connectionId, polite: polite })); -} -exports.onConnect = onConnect; -function onDisconnect(ws, connectionId) { - var connectionIds = clients.get(ws); - connectionIds.delete(connectionId); - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - var otherSessionWs = pair[0] == ws ? pair[1] : pair[0]; - if (otherSessionWs) { - otherSessionWs.send(JSON.stringify({ type: "disconnect", connectionId: connectionId })); - } - } - connectionPair.delete(connectionId); - ws.send(JSON.stringify({ type: "disconnect", connectionId: connectionId })); -} -exports.onDisconnect = onDisconnect; -function onOffer(ws, message) { - var connectionId = message.connectionId; - var newOffer = new offer_1.default(message.sdp, Date.now(), false); - if (isPrivate) { - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - var otherSessionWs = pair[0] == ws ? pair[1] : pair[0]; - if (otherSessionWs) { - newOffer.polite = true; - otherSessionWs.send(JSON.stringify({ from: connectionId, to: "", type: "offer", data: newOffer })); - } - } - return; - } - connectionPair.set(connectionId, [ws, null]); - clients.forEach(function (_v, k) { - if (k == ws) { - return; - } - k.send(JSON.stringify({ from: connectionId, to: "", type: "offer", data: newOffer })); - }); -} -exports.onOffer = onOffer; -function onAnswer(ws, message) { - var connectionId = message.connectionId; - var connectionIds = getOrCreateConnectionIds(ws); - connectionIds.add(connectionId); - var newAnswer = new answer_1.default(message.sdp, Date.now()); - if (!connectionPair.has(connectionId)) { - return; - } - var pair = connectionPair.get(connectionId); - var otherSessionWs = pair[0] == ws ? pair[1] : pair[0]; - if (!isPrivate) { - connectionPair.set(connectionId, [otherSessionWs, ws]); - } - otherSessionWs.send(JSON.stringify({ from: connectionId, to: "", type: "answer", data: newAnswer })); -} -exports.onAnswer = onAnswer; -function onCandidate(ws, message) { - var connectionId = message.connectionId; - var candidate = new candidate_1.default(message.candidate, message.sdpMLineIndex, message.sdpMid, Date.now()); - if (isPrivate) { - if (connectionPair.has(connectionId)) { - var pair = connectionPair.get(connectionId); - var otherSessionWs = pair[0] == ws ? pair[1] : pair[0]; - if (otherSessionWs) { - otherSessionWs.send(JSON.stringify({ from: connectionId, to: "", type: "candidate", data: candidate })); - } - } - return; - } - clients.forEach(function (_v, k) { - if (k === ws) { - return; - } - k.send(JSON.stringify({ from: connectionId, to: "", type: "candidate", data: candidate })); - }); -} -exports.onCandidate = onCandidate; -//# sourceMappingURL=websockethandler.js.map \ No newline at end of file diff --git a/WebApp/build/class/websockethandler.js.map b/WebApp/build/class/websockethandler.js.map deleted file mode 100644 index 2287941..0000000 --- a/WebApp/build/class/websockethandler.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"websockethandler.js","sourceRoot":"","sources":["../../src/class/websockethandler.ts"],"names":[],"mappings":";;;AAAA,iCAA4B;AAC5B,mCAA8B;AAC9B,yCAAoC;AAEpC,IAAI,SAAkB,CAAC;AAEvB,kCAAkC;AAClC,IAAM,OAAO,GAAgC,IAAI,GAAG,EAA0B,CAAC;AAE/E,4CAA4C;AAC5C,IAAM,cAAc,GAAwC,IAAI,GAAG,EAAkC,CAAC;AAEtG,SAAS,wBAAwB,CAAC,OAAkB;IAClD,IAAI,aAAa,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QACzB,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACrC;IACD,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,SAAS,GAAG,IAAI,IAAI,SAAS,CAAC;AAChC,CAAC;AAgIQ,sBAAK;AA9Hd,SAAS,GAAG,CAAC,EAAa;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;AACrC,CAAC;AA4He,kBAAG;AA1HnB,SAAS,MAAM,CAAC,EAAa;IAC3B,IAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,aAAa,CAAC,OAAO,CAAC,UAAA,YAAY;QAChC,IAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,IAAI,EAAE;YACR,IAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,cAAc,EAAE;gBAClB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;aACzF;SACF;QACD,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACrB,CAAC;AA4GoB,wBAAM;AA1G3B,SAAS,SAAS,CAAC,EAAa,EAAE,YAAoB;IACpD,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,SAAS,EAAE;QACb,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACpC,IAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAE9C,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;gBACtC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAG,YAAY,0CAAuC,EAAE,CAAC,CAAC,CAAC;gBAC5G,OAAO;aACR;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;gBAC1B,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;aACjD;SACF;aAAM;YACL,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,GAAG,KAAK,CAAC;SAChB;KACF;IAED,IAAM,aAAa,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC3F,CAAC;AAqF4B,8BAAS;AAnFtC,SAAS,YAAY,CAAC,EAAa,EAAE,YAAoB;IACvD,IAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACtC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAEnC,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;QACpC,IAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,cAAc,EAAE;YAClB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;SACzF;KACF;IACD,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACpC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC;AAsEuC,oCAAY;AApEpD,SAAS,OAAO,CAAC,EAAa,EAAE,OAAY;IAC1C,IAAM,YAAY,GAAG,OAAO,CAAC,YAAsB,CAAC;IACpD,IAAM,QAAQ,GAAG,IAAI,eAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAE3D,IAAI,SAAS,EAAE;QACb,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACpC,IAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,cAAc,EAAE;gBAClB,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC;gBACvB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;aACpG;SACF;QACD,OAAO;KACR;IAED,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,OAAO,CAAC,UAAC,EAAE,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,EAAE,EAAE;YACX,OAAO;SACR;QACD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC;AA6CqD,0BAAO;AA3C7D,SAAS,QAAQ,CAAC,EAAa,EAAE,OAAY;IAC3C,IAAM,YAAY,GAAG,OAAO,CAAC,YAAsB,CAAC;IACpD,IAAM,aAAa,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,IAAM,SAAS,GAAG,IAAI,gBAAM,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;QACrC,OAAO;KACR;IAED,IAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC9C,IAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC,SAAS,EAAE;QACd,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;KACxD;IAED,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AACvG,CAAC;AAyB8D,4BAAQ;AAvBvE,SAAS,WAAW,CAAC,EAAa,EAAE,OAAY;IAC9C,IAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,IAAM,SAAS,GAAG,IAAI,mBAAS,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtG,IAAI,SAAS,EAAE;QACb,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;YACpC,IAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,cAAc,EAAE;gBAClB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;aACzG;SACF;QACD,OAAO;KACR;IAED,OAAO,CAAC,OAAO,CAAC,UAAC,EAAE,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,EAAE,EAAE;YACZ,OAAO;SACR;QACD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC;AAEwE,kCAAW"} \ No newline at end of file diff --git a/WebApp/build/index.js b/WebApp/build/index.js deleted file mode 100644 index ea80d26..0000000 --- a/WebApp/build/index.js +++ /dev/null @@ -1,99 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RenderStreaming = void 0; -var commander_1 = require("commander"); -var https = require("https"); -var fs = require("fs"); -var os = require("os"); -var server_1 = require("./server"); -var websocket_1 = require("./websocket"); -var RenderStreaming = /** @class */ (function () { - function RenderStreaming(options) { - var _this = this; - this.options = options; - this.app = (0, server_1.createServer)(this.options); - if (this.options.secure) { - this.server = https.createServer({ - key: fs.readFileSync(options.keyfile), - cert: fs.readFileSync(options.certfile), - }, this.app).listen(this.options.port, function () { - var port = _this.server.address().port; - var addresses = _this.getIPAddress(); - for (var _i = 0, addresses_1 = addresses; _i < addresses_1.length; _i++) { - var address = addresses_1[_i]; - console.log("https://".concat(address, ":").concat(port)); - } - }); - } - else { - this.server = this.app.listen(this.options.port, function () { - var port = _this.server.address().port; - var addresses = _this.getIPAddress(); - for (var _i = 0, addresses_2 = addresses; _i < addresses_2.length; _i++) { - var address = addresses_2[_i]; - console.log("http://".concat(address, ":").concat(port)); - } - }); - } - if (this.options.type == 'http') { - console.log("Use http polling for signaling server."); - } - else if (this.options.type != 'websocket') { - console.log("signaling type should be set \"websocket\" or \"http\". ".concat(this.options.type, " is not supported.")); - console.log("Changing signaling type to websocket."); - this.options.type = 'websocket'; - } - if (this.options.type == 'websocket') { - console.log("Use websocket for signaling server ws://".concat(this.getIPAddress()[0])); - //Start Websocket Signaling server - new websocket_1.default(this.server, this.options.mode); - } - console.log("start as ".concat(this.options.mode, " mode")); - } - RenderStreaming.run = function (argv) { - var program = new commander_1.Command(); - var readOptions = function () { - if (Array.isArray(argv)) { - program - .usage('[options] ') - .option('-p, --port ', 'Port to start the server on.', process.env.PORT || "80") - .option('-s, --secure', 'Enable HTTPS (you need server.key and server.cert).', process.env.SECURE || false) - .option('-k, --keyfile ', 'https key file.', process.env.KEYFILE || 'server.key') - .option('-c, --certfile ', 'https cert file.', process.env.CERTFILE || 'server.cert') - .option('-t, --type ', 'Type of signaling protocol, Choose websocket or http.', process.env.TYPE || 'websocket') - .option('-m, --mode ', 'Choose Communication mode public or private.', process.env.MODE || 'public') - .option('-l, --logging ', 'Choose http logging type combined, dev, short, tiny or none.', process.env.LOGGING || 'dev') - .parse(argv); - var option = program.opts(); - return { - port: option.port, - secure: option.secure == undefined ? false : option.secure, - keyfile: option.keyfile, - certfile: option.certfile, - type: option.type == undefined ? 'websocket' : option.type, - mode: option.mode, - logging: option.logging, - }; - } - }; - var options = readOptions(); - return new RenderStreaming(options); - }; - RenderStreaming.prototype.getIPAddress = function () { - var interfaces = os.networkInterfaces(); - var addresses = []; - for (var k in interfaces) { - for (var k2 in interfaces[k]) { - var address = interfaces[k][k2]; - if (address.family === 'IPv4') { - addresses.push(address.address); - } - } - } - return addresses; - }; - return RenderStreaming; -}()); -exports.RenderStreaming = RenderStreaming; -RenderStreaming.run(process.argv); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/WebApp/build/index.js.map b/WebApp/build/index.js.map deleted file mode 100644 index ae33237..0000000 --- a/WebApp/build/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAEpC,6BAA+B;AAE/B,uBAAyB;AACzB,uBAAyB;AACzB,mCAAwC;AAExC,yCAAsC;AAGtC;IAqCE,yBAAY,OAAgB;QAA5B,iBAuCC;QAtCC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;gBAC/B,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;gBACrC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;aACxC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC7B,IAAA,IAAI,GAAK,KAAI,CAAC,MAAM,CAAC,OAAO,EAAiB,KAAzC,CAA0C;gBACtD,IAAM,SAAS,GAAG,KAAI,CAAC,YAAY,EAAE,CAAC;gBACtC,KAAsB,UAAS,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE;oBAA5B,IAAM,OAAO,kBAAA;oBAChB,OAAO,CAAC,GAAG,CAAC,kBAAW,OAAO,cAAI,IAAI,CAAE,CAAC,CAAC;iBAC3C;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACvC,IAAA,IAAI,GAAK,KAAI,CAAC,MAAM,CAAC,OAAO,EAAiB,KAAzC,CAA0C;gBACtD,IAAM,SAAS,GAAG,KAAI,CAAC,YAAY,EAAE,CAAC;gBACtC,KAAsB,UAAS,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE;oBAA5B,IAAM,OAAO,kBAAA;oBAChB,OAAO,CAAC,GAAG,CAAC,iBAAU,OAAO,cAAI,IAAI,CAAE,CAAC,CAAC;iBAC1C;YACH,CAAC,CAAC,CAAC;SACJ;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;SACvD;aACI,IAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,kEAAuD,IAAI,CAAC,OAAO,CAAC,IAAI,uBAAoB,CAAC,CAAC;YAC1G,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;SACjC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,kDAA2C,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YAEjF,kCAAkC;YAClC,IAAI,mBAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACjD;QAED,OAAO,CAAC,GAAG,CAAC,mBAAY,IAAI,CAAC,OAAO,CAAC,IAAI,UAAO,CAAC,CAAC;IACpD,CAAC;IA3Ea,mBAAG,GAAjB,UAAkB,IAAc;QAC9B,IAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;QAC9B,IAAM,WAAW,GAAG;YAClB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACvB,OAAO;qBACJ,KAAK,CAAC,qBAAqB,CAAC;qBAC5B,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;qBAClF,MAAM,CAAC,cAAc,EAAE,qDAAqD,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;qBAC1G,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,YAAY,CAAC;qBACtF,MAAM,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;qBAC1F,MAAM,CAAC,mBAAmB,EAAE,uDAAuD,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;qBACrH,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC;qBACzG,MAAM,CAAC,sBAAsB,EAAE,8DAA8D,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC;qBAC5H,KAAK,CAAC,IAAI,CAAC,CAAC;gBACf,IAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC9B,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;oBAC1D,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;oBAC1D,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB,CAAC;aACH;QACH,CAAC,CAAC;QACF,IAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAC9B,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAiDD,sCAAY,GAAZ;QACE,IAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC1C,IAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAM,CAAC,IAAI,UAAU,EAAE;YAC1B,KAAK,IAAM,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE;gBAC9B,IAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE;oBAC7B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;iBACjC;aACF;SACF;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACH,sBAAC;AAAD,CAAC,AA3FD,IA2FC;AA3FY,0CAAe;AA6F5B,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/WebApp/build/log.js b/WebApp/build/log.js deleted file mode 100644 index 692ced6..0000000 --- a/WebApp/build/log.js +++ /dev/null @@ -1,35 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.log = exports.LogLevel = void 0; -var isDebug = true; -var LogLevel; -(function (LogLevel) { - LogLevel[LogLevel["info"] = 0] = "info"; - LogLevel[LogLevel["log"] = 1] = "log"; - LogLevel[LogLevel["warn"] = 2] = "warn"; - LogLevel[LogLevel["error"] = 3] = "error"; -})(LogLevel = exports.LogLevel || (exports.LogLevel = {})); -function log(level) { - var args = []; - for (var _i = 1; _i < arguments.length; _i++) { - args[_i - 1] = arguments[_i]; - } - if (isDebug) { - switch (level) { - case LogLevel.log: - console.log.apply(console, args); - break; - case LogLevel.info: - console.info.apply(console, args); - break; - case LogLevel.warn: - console.warn.apply(console, args); - break; - case LogLevel.error: - console.error.apply(console, args); - break; - } - } -} -exports.log = log; -//# sourceMappingURL=log.js.map \ No newline at end of file diff --git a/WebApp/build/log.js.map b/WebApp/build/log.js.map deleted file mode 100644 index aa52bfc..0000000 --- a/WebApp/build/log.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":";;;AAAA,IAAM,OAAO,GAAG,IAAI,CAAC;AAErB,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,uCAAI,CAAA;IACJ,qCAAG,CAAA;IACH,uCAAI,CAAA;IACJ,yCAAK,CAAA;AACP,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AAED,SAAgB,GAAG,CAAC,KAAe;IAAE,cAAc;SAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;QAAd,6BAAc;;IACjD,IAAI,OAAO,EAAE;QACX,QAAQ,KAAK,EAAE;YACb,KAAK,QAAQ,CAAC,GAAG;gBACf,OAAO,CAAC,GAAG,OAAX,OAAO,EAAQ,IAAI,EAAE;gBACrB,MAAM;YACR,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,CAAC,IAAI,OAAZ,OAAO,EAAS,IAAI,EAAE;gBACtB,MAAM;YACR,KAAK,QAAQ,CAAC,IAAI;gBAChB,OAAO,CAAC,IAAI,OAAZ,OAAO,EAAS,IAAI,EAAE;gBACtB,MAAM;YACR,KAAK,QAAQ,CAAC,KAAK;gBACjB,OAAO,CAAC,KAAK,OAAb,OAAO,EAAU,IAAI,EAAE;gBACvB,MAAM;SACT;KACF;AACH,CAAC;AAjBD,kBAiBC"} \ No newline at end of file diff --git a/WebApp/build/server.js b/WebApp/build/server.js deleted file mode 100644 index 9829ed7..0000000 --- a/WebApp/build/server.js +++ /dev/null @@ -1,42 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createServer = void 0; -var express = require("express"); -var path = require("path"); -var fs = require("fs"); -var morgan = require("morgan"); -var signaling_1 = require("./signaling"); -var log_1 = require("./log"); -var httphandler_1 = require("./class/httphandler"); -var cors = require('cors'); -var createServer = function (config) { - var app = express(); - (0, httphandler_1.reset)(config.mode); - // logging http access - if (config.logging != "none") { - app.use(morgan(config.logging)); - } - // const signal = require('./signaling'); - app.use(cors({ origin: '*' })); - app.use(express.urlencoded({ extended: true })); - app.use(express.json()); - app.get('/config', function (req, res) { return res.json({ useWebSocket: config.type == 'websocket', startupMode: config.mode, logging: config.logging }); }); - app.use('/signaling', signaling_1.default); - app.use(express.static(path.join(__dirname, '../client/public'))); - app.use('/module', express.static(path.join(__dirname, '../client/src'))); - app.get('/', function (req, res) { - var indexPagePath = path.join(__dirname, '../client/public/index.html'); - fs.access(indexPagePath, function (err) { - if (err) { - (0, log_1.log)(log_1.LogLevel.warn, "Can't find file ' ".concat(indexPagePath)); - res.status(404).send("Can't find file ".concat(indexPagePath)); - } - else { - res.sendFile(indexPagePath); - } - }); - }); - return app; -}; -exports.createServer = createServer; -//# sourceMappingURL=server.js.map \ No newline at end of file diff --git a/WebApp/build/server.js.map b/WebApp/build/server.js.map deleted file mode 100644 index 24ff108..0000000 --- a/WebApp/build/server.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AACnC,2BAA6B;AAC7B,uBAAyB;AACzB,+BAAiC;AACjC,yCAAoC;AACpC,6BAAsC;AAEtC,mDAA2D;AAE3D,IAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtB,IAAM,YAAY,GAAG,UAAC,MAAe;IAC1C,IAAM,GAAG,GAAwB,OAAO,EAAE,CAAC;IAC3C,IAAA,mBAAY,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,sBAAsB;IACtB,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,EAAE;QAC5B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;KACjC;IACD,yCAAyC;IACzC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,UAAC,GAAG,EAAE,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAzG,CAAyG,CAAC,CAAC;IAC5I,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,mBAAS,CAAC,CAAC;IACjC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAClE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAC,GAAG,EAAE,GAAG;QACpB,IAAM,aAAa,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAClF,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,UAAC,GAAG;YAC3B,IAAI,GAAG,EAAE;gBACP,IAAA,SAAG,EAAC,cAAQ,CAAC,IAAI,EAAE,4BAAqB,aAAa,CAAE,CAAC,CAAC;gBACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0BAAmB,aAAa,CAAE,CAAC,CAAC;aAC1D;iBAAM;gBACL,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;aAC7B;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AA3BW,QAAA,YAAY,gBA2BvB"} \ No newline at end of file diff --git a/WebApp/build/signaling.js b/WebApp/build/signaling.js deleted file mode 100644 index 31906da..0000000 --- a/WebApp/build/signaling.js +++ /dev/null @@ -1,20 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var express = require("express"); -var handler = require("./class/httphandler"); -var router = express.Router(); -router.use(handler.checkSessionId); -router.get('/connection', handler.getConnection); -router.get('/offer', handler.getOffer); -router.get('/answer', handler.getAnswer); -router.get('/candidate', handler.getCandidate); -router.get('', handler.getAll); -router.put('', handler.createSession); -router.delete('', handler.deleteSession); -router.put('/connection', handler.createConnection); -router.delete('/connection', handler.deleteConnection); -router.post('/offer', handler.postOffer); -router.post('/answer', handler.postAnswer); -router.post('/candidate', handler.postCandidate); -exports.default = router; -//# sourceMappingURL=signaling.js.map \ No newline at end of file diff --git a/WebApp/build/signaling.js.map b/WebApp/build/signaling.js.map deleted file mode 100644 index 0868714..0000000 --- a/WebApp/build/signaling.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"signaling.js","sourceRoot":"","sources":["../src/signaling.ts"],"names":[],"mappings":";;AAAA,iCAAmC;AACnC,6CAA8C;AAE9C,IAAM,MAAM,GAAmB,OAAO,CAAC,MAAM,EAAE,CAAC;AAChD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AACnC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AACzC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;AAC/C,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;AAC/B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AACzC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACvD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AACzC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;AAEjD,kBAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/WebApp/build/websocket.js b/WebApp/build/websocket.js deleted file mode 100644 index bfd75e1..0000000 --- a/WebApp/build/websocket.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var websocket = require("ws"); -var handler = require("./class/websockethandler"); -var WSSignaling = /** @class */ (function () { - function WSSignaling(server, mode) { - var _this = this; - this.server = server; - this.wss = new websocket.Server({ server: server }); - handler.reset(mode); - this.wss.on('connection', function (ws) { - handler.add(ws); - ws.onclose = function () { - handler.remove(ws); - }; - ws.onmessage = function (event) { - // type: connect, disconnect JSON Schema - // connectionId: connect or disconnect connectionId - // type: offer, answer, candidate JSON Schema - // from: from connection id - // to: to connection id - // data: any message data structure - var msg = JSON.parse(event.data); - if (!msg || !_this) { - return; - } - console.log(msg); - switch (msg.type) { - case "connect": - handler.onConnect(ws, msg.connectionId); - break; - case "disconnect": - handler.onDisconnect(ws, msg.connectionId); - break; - case "offer": - handler.onOffer(ws, msg.data); - break; - case "answer": - handler.onAnswer(ws, msg.data); - break; - case "candidate": - handler.onCandidate(ws, msg.data); - break; - default: - break; - } - }; - }); - } - return WSSignaling; -}()); -exports.default = WSSignaling; -//# sourceMappingURL=websocket.js.map \ No newline at end of file diff --git a/WebApp/build/websocket.js.map b/WebApp/build/websocket.js.map deleted file mode 100644 index 1f34525..0000000 --- a/WebApp/build/websocket.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":";;AAAA,8BAAgC;AAEhC,kDAAoD;AAEpD;IAIE,qBAAY,MAAc,EAAE,IAAY;QAAxC,iBAmDC;QAlDC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,QAAA,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,UAAC,EAAa;YAEtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,EAAE,CAAC,OAAO,GAAG;gBACX,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC,CAAC;YAEF,EAAE,CAAC,SAAS,GAAG,UAAC,KAAmB;gBAEjC,wCAAwC;gBACxC,mDAAmD;gBAEnD,6CAA6C;gBAC7C,2BAA2B;gBAC3B,uBAAuB;gBACvB,mCAAmC;gBAEnC,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAI,EAAE;oBACjB,OAAO;iBACR;gBAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEjB,QAAQ,GAAG,CAAC,IAAI,EAAE;oBAChB,KAAK,SAAS;wBACZ,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;wBACxC,MAAM;oBACR,KAAK,YAAY;wBACf,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;wBAC3C,MAAM;oBACR,KAAK,OAAO;wBACV,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC9B,MAAM;oBACR,KAAK,QAAQ;wBACX,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC/B,MAAM;oBACR,KAAK,WAAW;wBACd,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;wBAClC,MAAM;oBACR;wBACE,MAAM;iBACT;YACH,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IACH,kBAAC;AAAD,CAAC,AAxDD,IAwDC"} \ No newline at end of file diff --git a/WebApp/client/public/onebyone/chatmessage.js b/WebApp/client/public/onebyone/chatmessage.js index 9abee02..90f81bf 100644 --- a/WebApp/client/public/onebyone/chatmessage.js +++ b/WebApp/client/public/onebyone/chatmessage.js @@ -76,9 +76,9 @@ export function handleChatMessage(data) { const messageType = isImage ? 'file' : 'text'; // 显示通知 - if (!message.isSelf) { - const content = isImage ? '[图片]' : message.content; - showNotification(`${message.senderName}: ${content.substring(0, 20)}${content.length > 20 ? '...' : ''}`); + if (!data.isSelf) { + const content = isImage ? '[图片]' : data.content; + showNotification(`${data.senderName}: ${content.substring(0, 20)}${content.length > 20 ? '...' : ''}`); } } diff --git a/WebApp/client/public/onebyone/renderer.js b/WebApp/client/public/onebyone/renderer.js index 4be8910..701e1b0 100644 --- a/WebApp/client/public/onebyone/renderer.js +++ b/WebApp/client/public/onebyone/renderer.js @@ -234,10 +234,20 @@ class UIRenderer { } if (this.elements.remoteStatus) { - this.elements.remoteStatus.textContent = this.getStatusText(remoteUser.status); + // 显示与黄框中一致的状态 + if (!remoteUser.mediaState.audio) { + this.elements.remoteStatus.textContent = '静音中'; + } else if (!remoteUser.mediaState.video) { + this.elements.remoteStatus.textContent = '视频关闭'; + } else { + this.elements.remoteStatus.textContent = this.getStatusText(remoteUser.status); + } } } + // 同步更新侧边栏用户列表 + this.renderUserList(this.stateManager.getState().session.localUser, remoteUser); + // 当远程视频关闭时显示占位符 if (this.elements.remoteVideoPlaceholder) { const shouldShowPlaceholder = !remoteUser.mediaState.video; @@ -479,14 +489,15 @@ class UIRenderer { // 计算通话成员总数 let userCount = 1; // 至少有本地用户 - if (remoteUser.status === 'online' || remoteUser.status === 'connecting') { - userCount++; // 只有当远程用户在线或连接中时,增加计数 - } + if (remoteUser.status !== 'offline') { + userCount++; // 如果远程用户在线,增加计数 + } // 更新通话成员总数显示 - if (this.elements.userCountDisplay) { - this.elements.userCountDisplay.textContent = `通话成员 (${userCount})`; - } + const userCountElement = this.elements.userList.closest('div').querySelector('h3.text-sm.font-medium.text-gray-400'); + if (userCountElement) { + userCountElement.textContent = `通话成员 (${userCount})`; + } // 渲染本地用户 const localUserElement = this.elements.userList.querySelector('[data-user-id="local"]'); diff --git a/WebApp/client/public/onebyone/store.js b/WebApp/client/public/onebyone/store.js index 0d67247..e32b856 100644 --- a/WebApp/client/public/onebyone/store.js +++ b/WebApp/client/public/onebyone/store.js @@ -336,6 +336,13 @@ class CallStateManager { this.state.session.status = 'ongoing'; this.notify({ type: 'CALL_STATUS_CHANGE', status: 'ongoing' }); + // 连接建立后发送本地用户信息 + this.sendMessage('user-info', { + id: this.state.session.localUser.id, + name: this.state.session.localUser.name, + avatar: this.state.session.localUser.avatar + }); + if (this.state.localStream) { const tracks = this.state.localStream.getTracks(); // 获取本地媒体轨道 for (const track of tracks) { @@ -383,6 +390,12 @@ class CallStateManager { this.updateRemoteUserStatus('online'); // 更新远程用户网络质量为好 this.updateRemoteUserNetworkQuality('good'); + + this.sendMessage('user-info', { + id: this.state.session.localUser.id, + name: this.state.session.localUser.name, + avatar: this.state.session.localUser.avatar + }); // 启动通话时长计时器 this.durationInterval = setInterval(() => { this.state.session.duration++; @@ -406,17 +419,39 @@ class CallStateManager { if (data.type === 'chat-message') { // 处理聊天 // 添加到列表并更新UI - chatMessage.handleChatMessage(data.message); + // 从消息中提取用户信息并更新remoteUser + if (data.message && data.message.senderId !== this.state.session.localUser.id) { + this.state.session.remoteUser = { + ...this.state.session.remoteUser, + id: data.message.senderId, + name: data.message.senderName, + avatar: data.message.senderAvatar + }; + this.notify({ type: 'REMOTE_MEDIA_CHANGE', mediaState: this.state.session.remoteUser.mediaState }); + } } else if (data.type === 'media-state-changed') { // 处理媒体状态变化 console.log('收到媒体状态变化:', data.data); // 更新远程用户的媒体状态 this.updateRemoteMedia(data.data); - } else if (data.type === 'on-message') { + } else if (data.type === 'user-info') { + // 处理用户信息更新 + console.log('收到用户信息:', data.data); + if (data.data) { + this.state.session.remoteUser = { + ...this.state.session.remoteUser, + id: data.data.id || this.state.session.remoteUser.id, + name: data.data.name || this.state.session.remoteUser.name, + avatar: data.data.avatar || this.state.session.remoteUser.avatar + }; + this.notify({ type: 'REMOTE_MEDIA_CHANGE', mediaState: this.state.session.remoteUser.mediaState }); + } } }; + + // 启动WebRTC连接 await this.renderstreaming.start(); await this.renderstreaming.createConnection(connectionId); @@ -466,6 +501,21 @@ class CallStateManager { this.state.session.status = 'ended'; this.notify({ type: 'CALL_ENDED' }); } + + /** + * 发送消息 + * @param {string} type - 消息类型 + * @param {Object} data - 消息数据 + */ + sendMessage(type, data) { + if (this.renderstreaming) { + this.renderstreaming.sendMessage({ + type: type, + data: data + }); + } + } + /** * 设置编解码器偏好 */ diff --git a/WebApp/package-lock.json b/WebApp/package-lock.json index a6747e4..4679f12 100644 --- a/WebApp/package-lock.json +++ b/WebApp/package-lock.json @@ -15,6 +15,7 @@ "debug": "~4.3.4", "express": "~4.18.1", "morgan": "^1.10.0", + "multer": "^2.1.1", "swagger-jsdoc": "^6.2.1", "swagger-ui-express": "^4.5.0", "uuid": "^9.0.0", @@ -2289,6 +2290,11 @@ "node": ">= 8" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -2653,8 +2659,18 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } }, "node_modules/bytes": { "version": "3.1.2", @@ -2895,6 +2911,33 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -6244,6 +6287,24 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", + "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "type-is": "^1.6.18" + }, + "engines": { + "node": ">= 10.16.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/multistream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", @@ -7773,11 +7834,18 @@ "readable-stream": "^2.1.4" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -8263,6 +8331,11 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "node_modules/typescript": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", @@ -8334,8 +8407,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -10403,6 +10475,11 @@ "picomatch": "^2.0.4" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -10690,8 +10767,15 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } }, "bytes": { "version": "3.1.2", @@ -10871,6 +10955,29 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -13408,6 +13515,17 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz", + "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "type-is": "^1.6.18" + } + }, "multistream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", @@ -14573,11 +14691,15 @@ "readable-stream": "^2.1.4" } }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -14912,6 +15034,11 @@ "mime-types": "~2.1.24" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, "typescript": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", @@ -14964,8 +15091,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", diff --git a/WebApp/package.json b/WebApp/package.json index 9be94db..8904246 100644 --- a/WebApp/package.json +++ b/WebApp/package.json @@ -19,6 +19,7 @@ "debug": "~4.3.4", "express": "~4.18.1", "morgan": "^1.10.0", + "multer": "^2.1.1", "swagger-jsdoc": "^6.2.1", "swagger-ui-express": "^4.5.0", "uuid": "^9.0.0", diff --git a/WebApp/src/server.ts b/WebApp/src/server.ts index d65522b..e2d6171 100644 --- a/WebApp/src/server.ts +++ b/WebApp/src/server.ts @@ -9,6 +9,7 @@ import { reset as resetHandler }from './class/httphandler'; import { initSwagger } from './swagger'; const cors = require('cors'); +const multer = require('multer'); export const createServer = (config: Options): express.Express => { const app: express.Express = express(); @@ -39,5 +40,50 @@ export const createServer = (config: Options): express.Express => { // 初始化Swagger initSwagger(app, config); + // 配置multer存储 + const storage = multer.diskStorage({ + destination: function (req: any, file: any, cb: (error: Error | null, destination: string) => void) { + // 确保上传目录存在 + const uploadDir = path.join(__dirname, '../client/public/uploads/avatars'); + if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); + } + cb(null, uploadDir); + }, + filename: function (req: any, file: any, cb: (error: Error | null, filename: string) => void) { + // 临时使用原始文件名,稍后在API处理中重命名 + cb(null, file.originalname); + } + }); + + const upload = multer({ storage: storage }); + + // 头像上传API + app.post('/api/upload/avatar', upload.single('avatar'), (req: any, res: express.Response) => { + if (!req.file) { + return res.status(400).json({ success: false, message: 'No file uploaded' }); + } + + const userId = req.body.userId || 'unknown'; + const ext = path.extname(req.file.originalname); + const oldPath = req.file.path; + const newFilename = `${userId}${ext}`; + const newPath = path.join(path.dirname(oldPath), newFilename); + + // 重命名文件 + fs.rename(oldPath, newPath, (err) => { + if (err) { + console.error('Error renaming file:', err); + return res.status(500).json({ success: false, message: '文件重命名失败' }); + } + + const avatarUrl = `/uploads/avatars/${newFilename}`; + res.json({ success: true, avatarUrl: avatarUrl }); + }); + }); + + // 确保uploads目录可访问 + app.use('/uploads', express.static(path.join(__dirname, '../client/public/uploads'))); + return app; };