c医p l衣i roomKey m噂i. T衣k"8¤{0"QVR"x "TqqoKf"u胤 8逢嬰c g穎i kèm trong yêu c亥u v隠 signaling server.
12.Server khi nh壱n yêu c亥u t瑛 các peer, s胤 kh荏i t衣o mã OTP d詠a theo fingerprint 8«"n逢w"v瑛vt逢噂c.
13.Server ti院n hành so sánh OTP t詠 kh荏i t衣o và OTP nh壱p"8逢嬰c t瑛 yêu c亥u. N院u không trùng kh噂p, h羽 th嘘ng s胤vj»pi"dƒq"pi逢運i dùng không xác th詠c và không g穎i tr違 v隠 roomKey m噂i.
14.N院u trùng kh噂p, Server g穎i tr違 cho extension roomKey v瑛c"8逢嬰c t衣o.
15.Extension s胤 g穎i v隠 cho 泳ng d映ng h瓜i ngh鵜 tr詠c tuy院n roomKey m噂i nh壱n 8逢嬰c.
16.永ng d映ng h瓜i ngh鵜 s胤 vjc{"8鰻k"tqqoMg{"e "d茨ng roomKey v瑛a nh壱p"8逢嬰c cho InStream và OutStream.
17.永ng d映ng h瓜i ngh鵜 tr詠c tuy院n s穎 d映pi"KpugtvcdngUvtgco"8吋 mã hóa d英 li羽u media d詠a trên roomKey m噂i.
18.Pi逢運i tham gia s胤 g穎i d英 li羽w"ogfkc"8«"8逢嬰c mã hóa cho các peer trong cu瓜c h瓜i tho衣i.
19.Khi nh壱p"8逢嬰c gói d英 li羽w"ogfkc"8«"8逢嬰e"o«"j„c."pi逢運i nh壱n s胤 ti院n hành gi違i mã gói d英 li羽u d詠a trên roomKey m噂i và ti院p t映c g穎i d英 li羽u v隠 các peer mjƒe"pj逢"eƒe"d逢噂c nêu trên.
Thi院t k院 giao ti院p h羽 th嘘ng
V噂i các cách th泳c ho衣v"8瓜ng c栄a h羽 th嘘ng nêu trên, bài lu壱p"x<p"8逢c"tc"vjk院t k院 trong giao ti院p gi英a client và server. Các giao ti院p client-server cho 泳ng d映ng h瓜i ngh鵜 tr詠c tuy院p"8逢嬰c th吋 hi羽p"pj逢"j·pj"50:0
35
Khi kh荏i t衣o phòng h丑p, client s胤 g穎k"vj»pi"8k羽p ugpfOguucig"*ÒEtgcvgTqqoÓ."
data: {title, listparticipants})." vtqpi" 8„." title là tên c栄a room c亥p" 8逢嬰c t衣o, listparticipants n "fcpj"uƒej"pi逢運i dùng tham gia vào cu瓜c h丑p tr詠c tuy院n này. Server sau khi kh荏i t衣o room s胤 g穎k"vj»pi"8k羽p sendMessage ('roomCreated', room) v隠 cho client v噂i room là thông tin c栄c"rj”pi"8逢嬰c kh荏i t衣o g欝m title và listparticipants."8欝ng th運i s胤 yêu c亥u OTP b茨pi"vj»pi"8k羽p sendMessage ('requestOTP').
V噂i lu欝ng tham gia cu瓜c h丑r." pi逢運i tham gia s胤 g穎k" vj»pi" 8k羽p sendMessage ('joinRoom', data: {roomId}) v噂i roomId là s嘘 hi羽u phòng h丑p c亥p"vjco"ikc"8院n server. T衣k"8¤{"u胤e„"jck"vt逢運ng h嬰p có th吋 x違y ra:
‚ N院u thành công xác th詠e"pi逢運i dùng, server s胤 g穎k"vj»pi"8k羽p v隠ejq"pi逢運i m噂i tham gia room sendMessage ('roomJoined', room) x "8欝ng th運i broadcast 8院n các peer khác b茨pi"vj»pi"8k羽p sendMessage ('newComer', data: {userId}) v噂i userId là s嘘 hi羽u c栄c"pi逢運i m噂i tham gia phòng.
‚ Vtqpi" vt逢運ng h嬰p không xác th詠c thành công, server s胤 g穎k" vj»pi" 8k羽p sendMessage ('Unauthorize') v隠pi逢運i m噂i tham gia.
36
V噂i lu欝pi" vtcq" 8鰻i thông tin offer - answer gi英a các client, client s胤 g穎i sendMessage ('offer', data: {pcId, pcDescription}) v噂i pvId là peer connection Id, pcDescription m員e"8鵜nh là r厩ng v隠 cho server, server s胤 chuy吋n ti院p offer này cho client khác v噂k"épi"vj»pi"8k羽r"8«"pj壱p0"Pi逢運i nh壱n s胤 tr違 l運k"vj»pi"8k羽p này v噂i sendMessage ('answer', data: {pcId, pcDescription}) x "ugtxgt"e pi"u胤 chuy吋n ti院r"vj»pi"8k羽p này 8院p"pi逢運i g穎i.
V噂i lu欝ng yêu c亥w"KEG"Ecpfkfcvg."v逢挨pi"v詠pj逢"nw欝pi"vtcq"8鰻i thông tin gi英a các enkgpv." pi逢運i g穎i s胤 g穎k" vj»pi" 8k羽p sendMessage ('Candidate', data: {pcId, pcDescription}) 8院p"pi逢運i nh壱n thông qua s詠 chuy吋n ti院p c栄a server.
A嘘i v噂i giao ti院p Client-Server trong 泳ng d映ng xác th詠c, lu壱p"x<p"vj吋 hi羽n giao ti院r"p {"pj逢"vt·pj"d {"荏 hình 3.9.
Trong giao ti院p này, ch雨 có m瓜t giao ti院p là giao ti院r"mj„c"8逢嬰c th詠c hi羽n gi英a client-server. T衣k" 8¤{." ugtxgt" i穎k" vj»pi" 8k羽p sendMessage ('newRoomKey', data: {roomUuid}) v噂i Uuid là s嘘 hi羽w"rj”pi"Wpkxgtucn"Wpkswg"Kfgpvkhgtf́pi"8吋 che d医u rqqoKf"vt‒p"8逢運ng truy隠n, thông báo có roomKey m噂i. Client g穎k"vj»pi"8k羽p yêu c亥u khóa sendMessage ('requestRoomKey', data: {OTP, roomUuid}) cho server. Lúc này, e„"jck"vt逢運ng h嬰p x違y ra cho k院t qu違 c栄a server:
‚ N院u thành công xác th詠e"pi逢運i dùng, server s胤 g穎k"vj»pi"8k羽p v隠ejq"pi逢運i yêu c亥u sendMessage ('roomKey', data: {roomKey}) v噂i roomKey là khóa m噂k"8逢嬰c kh荏i t衣o
37
‚ Vtqpi" vt逢運ng h嬰p không xác th詠c thành công, server s胤 g穎k" vj»pi" 8k羽p sendMessage ('Unauthorize') v隠pi逢運i yêu c亥u.
C医u trúc mã ngu欝n h羽 th嘘ng CXu trúc quVn lý
V噂i các thi院t k院 trên, lu壱p"x<p"e„"8逢嬰c thi院t k院 khái ni羽m v隠 h羽 th嘘ng h瓜i ngh鵜 tr詠c tuy院n s穎 d映ng h羽 th嘘ng xác th詠e"x "o«"j„c"8亥u cu嘘i. T瑛8„."nw壱p"x<p"u胤8隠 c壱r"u¤w"j挨p" 8院n t亥ng mã ngu欝n, c医u trúc mã ngu欝p"x "rj逢挨pi"rjƒr"sw違n lý các thành ph亥n trong mã ngu欝p0"X·"8員c tính c栄a h羽 th嘘pi"p {"j逢噂pi"8院n giao ti院p client-server và cách trao 8鰻i thông tin gi英a các thành ph亥n, lu壱n án ch丑p"rj逢挨pi"rjƒr"vjk院t k院 mã ngu欝n theo ki院n trúc ba l噂p (Three Layer Architecture) bao g欝m l噂p Module, l噂p Controller và l噂p Rtqxkfgt"8逢嬰c áp d映ng trong n吋n t違ng c栄a NestJS:
‚ L噂p Module: Module có nhi羽m v映 8„pi"i„k"pj英ng logic liên quan c栄a các ch泳e"p<pi"e亥n tri吋p"mjck"8院n client m瓜v"eƒej"8瓜c l壱p. M瓜t module là class 8逢嬰c 8鵜pj"pij c"x噂i @Module(). @Module() s胤 cung c医p metadata mà h羽 th嘘ng s穎 d映pi"8吋 t鰻 ch泳c c医u trúc 泳ng d映ng.
‚ L噂p Controller: có nhi羽m v映 x穎 lý các request và tr違 v隠 tgurqpug"ejq"pi逢運i dùng. M厩i controller s胤 ch泳a các router th詠c hi羽p"j pj"8瓜ng và nhi羽m v映 kjƒe" pjcw" 8逢嬰c yêu c亥u t瑛 enkgpv0" Eqpvtqnngt" 8逢嬰e" 8鵜pj" pij c" x噂i @Controller(). @Controller() s胤 có nhi羽m v映 liên k院v"encuu"Eqpvtqnngt"8„"x噂i tgswguv"v逢挨pi"泳ng. L噂p controller có th吋 qu違n lý các Data Transfer Object *fvq+"8吋 truy隠n t衣i d英 li羽u t瑛enkgpv"8院n ugtxgt"x "pi逢嬰c l衣i.
‚ L噂r"Rtqxkfgt<"n "p挨k"ewpi"e医p các services, repositories, factories, helpers, ... cho Controller trong m瓜t module s穎 d映ng. Trong l噂p Provider, có th吋 k吋8院n các l噂p ch泳e"p<pi"ucw<
o L噂p Service: L噂p này ch泳a m瓜t s嘘 logic mà khi controller x穎 lý request c栄a client s胤 c亥p"f́pi"8吋 tính toán ra response tr違 v隠.
o L噂p Entity: L噂p này ho衣v"8瓜pi"8吋 qu違n lý các th詠c th吋 trong h羽 th嘘ng, f́pi"8吋 kh荏i t衣o và c壱p nh壱t th詠c th吋."pj逢"mj荏i t衣q"pi逢運i dùng, kh荏i t衣o phòng h丑r."È
38
o L噂p Gateway: là m瓜t l噂r"ugtxkeg"pj逢pi"n "n噂p ch泳c n員pi"8員c bi羽t vì p„"8„pi"xck"vt”"n o"rj亥n t穎 c亥u n嘘i và ch雨 tham gia vào h羽 th嘘ng khi có yêu c亥u giao ti院p t瑛enkgpv"8院n server.
Ngoài ra, tùy vào m映e"8 ej"d違o m壱t, s胤 có các l噂p qu違n lý nh英ng ch泳e"p<pi"d違o m壱v"mjƒe"pj逢<
‚ L噂p Guard: vj逢運pi"8逢嬰c g丑i là l噂p authorization, b違o v羽 zƒe"8鵜nh li羽u m瓜t yêu c亥u nh医v"8鵜pj"e„"8逢嬰c x穎 lý b荏i trình x穎 lý tuy院p"8逢運ng hay không, tùy thu瓜e"x q"eƒe"8k隠u ki羽n nh医v"8鵜pj"*pj逢"sw{隠n, vai trò, ACL, v.v.) hi羽n có t衣i th運k"8k吋m run-time.
‚ L噂p Strategy: e”p"8逢嬰c g丑i là l噂p authentication, nh茨m thi院t l壱p ho員c ch泳ng th詠c kh違p<pi"8ƒpi"vkp"e壱y c栄c"pi逢運k"f́pi."tgswguvÈ"vj»pi"swc"wugtpcog"1" password, JSON Web Token (JWT) ho員c identity token.
C映 th吋, h羽 th嘘pi"vj逢"o映c và qu違n lý mã ngu欝p"8逢嬰e"vt·pj"d {"pj逢"j·pj 3.10.
Vjgq"u挨"8欝 trên, toàn b瓜 泳ng d映ng s胤 8逢嬰c kh荏i t衣o và qu違n lý t瑛 Module g嘘c (root) mang tên app.module0" Vtqpi" 8„."app.module s胤 qu違n lý hai l噂p c栄a nó là app.controller và app.service. Ngoài ra, app.module s胤 ch鵜u trách nhi羽m kh荏i t衣o ba module con bao g欝m auth.module, conference-socket.module và room.module.
V逢挨pi"v詠 v噂i app.module, module auth.module s胤 qu違n lý hai l噂p còn l衣i c栄a nó là controller và service. V噂i module room.module."x·"8¤{"n "oqfwng"vjw瓜c nhóm th詠c
39
th吋 (entity), vì v壱y nó s胤 qu違n lý l噂p room.entity và rooms.service0" E”p" 8嘘i v噂i conference-socket.module."x·"8¤{"n "o瓜t l噂r"8吋 qu違n lý giao ti院p gi英a cient Î server, nó s胤 qu違n lý m瓜t l噂p có d衣ng là gateway.module.
Cu嘘i cùng, module user.module 8逢嬰c g丑i là module chia s飲 (share module), là oqfwng"8„pi"xck"vt”"n "vj pj"rj亥n h厩 tr嬰 ho衣v"8瓜ng c栄c"oqfwng"mjƒe."pj逢"auth.module và conference-soket.module0"V逢挨pi"v詠 pj逢"room.module."8¤{"n "f衣ng module qu違n lý th詠c th吋 nên nó s胤 qu違n lý user.entity và hai l噂p còn l衣i là users.service và users.controller.
Ngoài các thành ph亥n k飲 trên, 泳ng d映ng còn có m瓜t s嘘 thành ph亥n dùng chung mjƒe"8逢嬰e"8員v"vtqpi"vj逢"o映c utils.
Rj⇔¬pi"vjとc hoTv"8じng
V噂i cách tu違n lý mã ngu欝n nj逢"vt‒p."nw壱n án phân tích s詠 v逢挨pi"vƒe" ik英a các module và các l噂r"8吋 h羽 th嘘ng ho衣v"8瓜ng hi羽u qu違. C医u trúc ho衣v"8瓜pi"x "v逢挨pi"vƒe"ik英a eƒe"oqfwng"8逢嬰c trình bày trong hình 3.11.
V噂k"u挨"8欝rj逢挨pi"vj泳c ho衣v"8瓜ng trên, yêu c亥u s胤8k"8院n t瑛 hai ngu欝p"ej pj."8„"n " tgswguv"8院n module auth.module 8吋 ph映c v映 yêu c亥u xác th詠c t瑛pi逢運i dùng và request 8院n conference-socket.module 8吋 th詠c hi羽n các giao ti院p trong h羽 th嘘ng.
40
V噂i lu欝ng yêu c亥u xác th詠e"8<pi"pj壱p, request s胤8逢嬰c auth.controller ti院p nh壱n và x穎n#0"Pj逢"8«"vt·pj"d {"pj逢"vt‒p."eqpvtqnngt"u胤 s穎 d映pi"eƒe"j o"nqike"8逢嬰e"8鵜pj"pij c" 荏 auth.service 8吋 x穎 lý yêu c亥u này, bao g欝m xác th詠e"pi逢運i dùng validateUser và x穎 n#" 8<pi" pj壱p. Ngoài ra, auth.controller còn s穎 d映ng local-auth.guard 8吋 x穎 lý cwvjqtk¦cvkqp" mjk" pi逢運k" 8<pi" pj壱p và s穎 d映ng jwt-user.dto cùng v噂i login- credentials.dto 8吋 x穎 lý jwt token và ch泳ng ch雨 8<pi" pj壱p c栄c" pi逢運i dùng. V噂i auth.service, l噂p này s穎 d映ng jwt-user.dto e pi"8吋 x穎 lý thông tin thông tin jwt c栄a pi逢運k"f́pi"mjk"8<pi"pj壱p, bên c衣pj"8„"f́pi"users.service e pi"pj逢"vtw{"zw医t trong user.entity 8吋 tìm ki院o"vj»pi"vkp"pi逢運k"8<pi"pj壱p, t瑛8„"zƒe"vj詠e"pi逢運i dùng. Service này có s穎a d映ng hàm isPasswordCorrect trong password-utils 8吋 xác th詠e"v pj"8¿pi"8逸n c栄a m壱t kh育u. Ngoài ra, trong v医p"8隠 authentication, jwt.strategy e pi"f́pi"user.entity 8吋 xác th詠c payload c栄c"pi逢運i dùng, cùng v噂i local.strategy s胤 tr違 k院t qu違 authentication pi逢運i dùng thông qua hàm tính toán validateUser c栄a auth.service.
A嘘i v噂i lu欝ng th詠c hi羽n các giao ti院p trong h羽 th嘘pi."tgswguv"8逢嬰c conference- socket.gateway ti羽p nh壱n và x穎 lý. T衣i l噂p này, nó s胤 x穎 lý k院t n嘘i c栄c"pi逢運k"f́pi"e pi" pj逢"eƒe"z穎n#"v́{"x q"vj»pi"8k羽p mà client g穎k"8院n. Các thông 8k羽r"*oguucig+"8逢嬰c x穎 lý trong l噂p này bao g欝m:
‚ createRoom: hàm l医{"vj»pi"vkp"fcpj"uƒej"pi逢運i dùng thông qua users.service v違 kh荏i t衣o phòng h丑p thông qua hàm create trong rooms.service và t衣o th詠c th吋 thông qua room.entity. Bên c衣pj"8„."n噂p kh荏i t衣o roomKey m噂i cho phòng h丑p b茨ng hàm generateRoomKey n茨m trong otp-utils.
‚ joinRoom: s穎 d映ng rooms.service 8吋 tìm ki院m phòng h丑p c亥n tham gia và dùng user.entity 8吋 l医{"vj»pi"vkp"pi逢運i tham gia.
‚ Offer-Answer và Candidate: S穎 d映pi"Kf"pi逢運k"f́pi"8吋 chuy吋n ti院p thông tin vj»pi"8k羽p message.
‚ requestRoomKey: s穎 d映ng user.entity 8吋 l医{"fgxkegKf"8吋 kh荏i t衣o OTP, sau 8„"uq"uƒpj"x噂k"QVR"8逢嬰c g穎i trong request tr違 thông tin roomKey.
Ngoài ra, trong user.module s胤 có user.controller ph映 trách nhi羽m v映 l医y và c壱p nh壱t thông tin c栄c"pi逢運k"f́pi"8吋 h厩 tr嬰 ho衣v"8瓜ng c栄c"eƒe"oqfwng"mjƒe"vtqpi"8„"u胤 s穎 d映ng các dto phù h嬰p tùy thu瓜c vào yêu c亥u t瑛 phía các module khác bao g欝m: create-
41
user.dto 8吋 t衣q" pi逢運i dùng, user.dto 8吋 l医{" vj»pi" vkp" pi逢運i dùng. Các ho衣v" 8瓜ng user.controller s胤8違m nhi羽m bao g欝m:
‚ L医{"vj»pi"vkp"pi逢運k"f́pi"pj逢"n医y username, id.
‚ X穎 lý các ho衣v"8瓜pi"8逢嬰c g丑i t瑛oqfwng"mjƒe"pj逢"xcnkfcvgWugt."xgtkh{QVR." verifyVerificationCode.
‚ Ghi và tìm ki院o"pi逢運i dùng m噂i
Nó s胤 s穎 d映ng users.service 8吋 t瑛8„"e„"eƒe"nqike"mj荏i t衣q"pi逢運i dùng, tìm ki院m vj»pi"vkp"pi逢運i dùng và c壱p nh壱v"vj»pi"vkp"pi逢運k"f́pi0"A吋 h厩 tr嬰 các ho衣v"8瓜ng trên, users.service s胤 s穎 d映ng user.entity pj逢"n "o磯u th詠c th吋8吋 kh荏i t衣o d英 li羽w"pi逢運i dùng. Vì c亥n c壱p nh壱t và kh荏i t衣o d英 li羽u, users.service s胤 s穎 d映ng encrypt và decrypt c栄a crypto-utils, hashPassword trong password-utils và generateOTPSecret trong otp-utils.
Cu嘘i cùng v噂i room.module, rooms.service s胤e„"nqike"8吋 kh荏i t衣o room bao g欝m vk‒w"8隠 x "fcpj"uƒej"pi逢運i tham gia thông qua m磯u d英 li羽u room.entity và hai dto là create-room.dto và update-room.dto. Ngoài ra, room.entity s胤 t衣o m嘘i quan h羽 1:N v噂i user.entity, s胤8逢嬰c gi違i thích t衣i m映c 3.4.4.
Quy trình hoTv"8じng
V隠 t鰻ng th吋, quy trình ho衣v"8瓜ng c栄a 泳ng d映ng tr違k"swc"dc"ikck"8q衣n chính, bao g欝m: kh荏i t衣o, Xác th詠c, X穎 lý và Ch医m d泳t. Quy trình ho衣v"8瓜ng c栄a mã ngu欝p"8逢嬰c th吋 hi羽p"pj逢"j·pj"50340
42
Vtqpi" ikck" 8q衣n kh荏i t衣o, h羽 th嘘ng s胤 kh荏k" 8瓜ng bootstrapping, kh荏i t衣o các module c亥n thi院t onModuleInit, t瑛 module g嘘e"8院n module con, và b逸v"8亥u kh荏k"8瓜ng Listener 8吋 ch運 x穎 lý yêu c亥w"pi逢運i dùng.
Vtqpi"ikck"8q衣n xác th詠c, s胤e„"eƒe"d逢噂c chính bao d欝m Authentication Handler, Validate User Handler và Exception Handler. T衣k" d逢噂c Authentication Handler, h羽 th嘘ng ch鵜u trách nhi羽m x穎 lý xác th詠e"mjk"pi逢運k"f́pi"8<pi"pj壱p. V噂k"d逢噂c Validate User Handler, tùy vào t瑛pi"ikck"8q衣n và yêu c亥u t瑛rj c"pi逢運i dùng, h羽 th嘘ng xác th詠c s胤 xác th詠e"vj»pi"vkp"pi逢運k"f́pi"pj逢"zƒe"vj詠e"gockn"pi逢運i dùng, xác th詠c mã xác th詠c mjk"pi逢運i d映ng nh壱p t瑛 email và xác th詠c OTP sau m厩i th運i gian h羽 th嘘ng. Sau khi xác th詠e"pi逢運i dùng và xác th詠e"8<pi"pj壱p, h羽 th嘘ng tr違 k院t qu違 v隠ejq"pi逢運i dùng cùng v噂i qu違n lý các l厩i h羽 th嘘ng x違y ra v噂i Exception Handler0"Ucwm"jk"8«"jq p"vj pj"zƒe" th詠c, h羽 th嘘ng s胤8院p"ikck"8q衣n x穎 lý.
43
Vtqpi"ikck"8q衣n x穎 lý, Conference Socket Handler qu違n lý yêu c亥u c栄c"pi逢運i dùng, Connection Handler qu違n lý tình tr衣ng k院t n嘘i (connect) và ng逸t k院t n嘘i (disconnect) c栄c"pi逢運k"f́pi0"Ucw"8„."v́{"x q"{‒w"e亥u mà h羽 th嘘ng s胤 x穎 lý v噂k"eƒe"vj»pi"8k羽r"8«" 8<pi"m#"*Uwduetkdg"Oguucig+0"V衣k"8¤{."u胤 có hai lu欝pi"vj»pi"8k羽p x穎 lý cho h羽 th嘘ng, bao g欝o"vj»pi"8k羽r"pi逢運k"f́pi"x "vj»pi"8k羽p phòng. V噂k"vj»pi"8k羽p phòng, s胤 có yêu c亥u t衣o room và tham gia room, còn v噂k"vj»pi"8k羽r"pi逢運i dùng, s胤 e„"eƒe"vj»pi"8k羽p: tham gia phòng, offer-answer, yêu c亥u ICE Candidate, và yêu c亥u khóa phòng. Cu嘘i cùng, sau kh雨 x穎n#"eƒe"vj»pi"8k羽r"8逢嬰c g穎k"8院n, h羽 th嘘ng s胤 tr違 k院t qu違 v隠ejq"pi逢運i dùng cùng v噂i thành ph亥n qu違n lý l厩i n院u trong quá trình x穎 lý có l厩i x違y ra.
X q"ikck"8q衣n Ch医m d泳v."8吋 h羽 th嘘ng ng瑛ng ho衣v"8瓜ng, h羽 th嘘ng s胤 phá h栄y các oqfwng"8«"mj荏i t衣o onModuleDestroy, ng瑛ng ho衣v"8瓜ng Listener và thoát kh臼i h羽 th嘘ng ProcessExits.
CXu trúc dの liうu
V隠 t鰻 ch泳c c医u trúc d英 li羽u, lu壱p"x<p"vt·pj"d {"pj逢"j·pj"50350"Vtqpi"8„."j羽 th嘘ng ch雨 qu違n lý hai th詠c th吋ej pj"n "pi逢運i dùng (user) và phòng h丑p (room).
A吋8挨p"ik違n hóa h羽 th嘘ng ph映c v映 cho m映e"vk‒w"8隠 ra 荏 8亥w"8隠 lu壱p"x<p."nw壱n án quy院v"8鵜nh xây d詠ng c医u trúc d英 li羽u có tính ch医t sau:
‚ Ch雨 m瓜t phòng h丑r"*tqqo+"8逢嬰c kh荏i t衣o trong m瓜t th運k"8k吋o"x "pi逢運i dùng ch雨 có th吋 tham gia vào phòng h丑r"8„"vtqpi"épi"vj運k"8k吋m. T泳c là, nh英ng pi逢運i dùng khác nhau không th吋 kh荏i t衣o nhi隠u phòng h丑p trong cùng th運i 8k吋m.
44
‚ Nhi隠w"pi逢運i dùng có th吋 tham gia trong cùng phòng h丑p
Vtqpi"8„."x噂i b違ng user, ta có khóa chính là userId và m瓜t khóa ngo衣i là RoomId, d衣ng d英 li羽u Integer. M嘘i quan h羽 gi英a b違pi"wugt"x "tqqo"n "P<30"Eƒe"vt逢運ng trong user g欝m có:
‚ firstName, LastName: Tên và h丑 c栄c"pi逢運i dùng, d衣ng d英 li羽u String.
‚ wugtpcog."rcuuyqtf<"vj»pi"vkp"8<pi"pj壱p c栄c"pi逢運k"f́pi."vtqpi"8„"rcuuyqtf" là chu厩k"8逢嬰c hash b茨ng Bcrypt. D衣ng d英 li羽u là String.
‚ eockn<"Gockn"e pi"pi逢運i dùng, d衣ng d英 li羽u String.
‚ deviceId: là fingerprint c栄c"pi逢運i dùng, d衣ng d英 li羽u String.
‚ isActive: tr衣ng thái ho衣v"8瓜ng c栄c"pi逢運i dùng, d衣ng d英 li羽u Boolean.
V噂i b違ng room, ta có khóa chính là RoomId, d衣ng d英 li羽u Integer. M嘘i quan h羽 gi英a b違pi"tqqo"x "wugt"n "3<P0"Eƒe"vt逢運ng trong room g欝m có: ‚ title: Tên phòng h丑p, d衣ng d穎 li羽u String
‚ date: Ngày kh荏i t衣o phòng h丑p, d衣ng d英 li羽u Date
‚ Uuid: mã duy nh医t (unique) c栄a phòng h丑p, d衣ng d英 li羽w"Uvtkpi."f́pi"8吋 che d医w"tqqoKf"vt‒p"8逢運ng truy隠n.
Aq"n逢運ng ch医v"n逢嬰ng ch医v"n逢嬰ng d鵜ch v映
A吋8q"n逢運ng ch医v"n逢嬰pi"8亥u ra c栄a h羽 th嘘ng 泳ng d映ng h瓜i ngh鵜 tr詠c tuy院n, h羽 th嘘ng tích h嬰p v噂i m瓜t 泳ng d映ng th泳 ba là CallStats.io. CallStats.io là 泳ng d映pi"8逢嬰c xây d詠ng b荏i công ty 8x8 Open Communications Platform. V噂i 泳ng d映ng này, công ty cung c医p gi違k"rjƒr"8q"8衣c các ch雨 s嘘 8亥w"tc."f́pi"8吋 giá và qu違n lý ch医v"n逢嬰ng c栄a các 泳ng d映ng h瓜i ngh鵜 tr詠c tuy院n nói riêng và các 泳ng d映ng ho衣v" 8瓜ng d詠a trên n隠n m衣ng (Network-based Application) nói chung. 永ng d映ng này cung c医p Application Rtqitcookpi"Kpvgthceg"*CRK+"8吋 tích h嬰p vào m瓜t h羽 th嘘ng th泳 dc"f́pi"8吋 8q"n逢運ng 8亥w"tc"e„"rj逢挨pi"vj泳c ho衣v"8瓜pi"pj逢"j·pj"50360
45
Trong lu壱p"x<p."d k"pijk‒p"e泳u s胤 ti院n hành g逸n API c栄a CallStats.io vào hai peer 8吋 ti院p"j pj"8q"8衣c các thông s嘘8亥u vào Î8亥u ra c栄a cu瓜c h瓜i ngh鵜 tr詠c tuy院n. Sau khi thu th壱p d英 li羽u này, CallStats.io s胤 g穎i t医t c違 d英 li羽u thu th壱r"8逢嬰c lên m瓜t h羽 th嘘ng thu th壱p d英 li羽w"vt‒p"8ƒo"o¤{"*Enqwf+ c栄c"p„0"Ucw"8„."f英 li羽u s胤8逢嬰c x穎 lý, tính toán và g穎i các thông s嘘8«"z穎n#"8院p"fcujdqctf"pj逢"j·pj"50370"V瑛8„."nw壱p"x<p"u胤 ti院n hành thu th壱p d英 li羽u và so sánh v噂i các tiêu chu育p"8逢嬰e"8隠 xu医v"pj逢"8«"8隠 c壱p t衣i m映c 2.6.
Hình 3.14. U挨"8欝 ho衣v"8瓜ng CallStats.io
46
TH衛C NGHI烏M VÀ K蔭T QU謂 Gi違8鵜pj"x "8員c t違 th詠c nghi羽m
Apc tV phZn mzm
V噂i nh英ng nghiên c泳w"8«"8逢嬰c nêu 荏 các m映c trên, lu壱p"x<p"u胤 d詠a vào các thi院t k院8„"8吋 xây d詠ng nên h羽 th嘘ng h瓜i ngh鵜 tr詠c tuy院n có h羽 th嘘ng xác th詠e"x "o«"j„c"8亥u cu嘘i. C映 th吋, các công ngh羽 và n隠n t違ng mà lu壱p"x<p"8«"u穎 d映ng trong bài th詠c nghi羽m