Xverse_Room.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711
  1. import XverseAvatarManager from "./XverseAvatarManager.js"
  2. import Codes from "./enum/Codes.js"
  3. import PathManager from "./PathManager.js"
  4. import Camera from "./Camera.js"
  5. import Stats from "./Stats.js"
  6. import ActionsHandler from "./ActionsHandler.js"
  7. import Signal from "./Signal.js"
  8. import ModelManager from "./ModelManager.js"
  9. import {reporter} from "./Reporter.js"
  10. import util from "./util.js"
  11. import XverseEffectManager from "./XverseEffectManager.js"
  12. import TimeoutError from "./error/TimeoutError.js"
  13. import ParamError from "./error/ParamError.js"
  14. import MotionType from "./enum/MotionType.js"
  15. import NetworkController from "./NetworkController.js"
  16. import InitNetworkTimeoutError from "./error/InitNetworkTimeoutError.js"
  17. import InitConfigTimeoutError from "./error/InitConfigTimeoutError.js"
  18. import InitDecoderTimeoutError from "./error/InitDecoderTimeoutError.js"
  19. import InitEngineError from "./error/InitEngineError.js"
  20. import {eventsManager} from "./EventsManager.js"
  21. import EngineProxy from "./EngineProxy.js"
  22. import EventsController from "./EventsController.js"
  23. import EImageQuality from "./enum/EImageQuality.js"
  24. import Panorama from "./Panorama.js"
  25. import Debug from "./Debug.js"
  26. import Logger from "./Logger.js"
  27. import Response from "./Response.js"
  28. const logger = new Logger('xverse-room')
  29. export default class Xverse_Room extends EventEmitter {
  30. constructor(e) {
  31. super();
  32. E(this, "disableAutoTurn", !1);
  33. E(this, "options");
  34. E(this, "_currentNetworkOptions");
  35. E(this, "lastSkinId");
  36. E(this, "debug");
  37. E(this, "isFirstDataUsed", !1);
  38. E(this, "userId", null);
  39. E(this, "pathManager", new PathManager);
  40. E(this, "networkController");
  41. E(this, "_startTime", Date.now());
  42. E(this, "canvas");
  43. E(this, "modelManager");
  44. E(this, "eventsController");
  45. E(this, "panorama");
  46. E(this, "engineProxy");
  47. E(this, "_id");
  48. E(this, "skinList", []);
  49. E(this, "isHost", !1);
  50. E(this, "avatarManager", new XverseAvatarManager(this));
  51. E(this, "effectManager", new XverseEffectManager(this));
  52. E(this, "sceneManager");
  53. E(this, "scene");
  54. E(this, "breathPointManager");
  55. E(this, "_currentState");
  56. E(this, "joined", !1);
  57. E(this, "disableRotate", !1);
  58. E(this, "isPano", !1);
  59. E(this, "movingByClick", !0);
  60. E(this, "camera", new Camera(this));
  61. E(this, "stats", new Stats(this));
  62. E(this, "isUpdatedRawYUVData", !1);
  63. E(this, "actionsHandler", new ActionsHandler(this));
  64. E(this, "_currentClickingState", null);
  65. E(this, "signal", new Signal(this));
  66. E(this, "firstFrameTimestamp");
  67. E(this, "receiveRtcData", async()=>{
  68. logger.info("Invoke receiveRtcData");
  69. let e = !1
  70. , t = !1
  71. , r = !1
  72. , n = !1;
  73. return this.viewMode === "serverless" ? (logger.warn("set view mode to serverless"),
  74. this.setViewMode("observer").then(()=>this, ()=>this)) : new Promise(o=>{
  75. const a = this.networkController.rtcp.workers;
  76. a.registerFunction("signal", s=>{
  77. this.signal.handleSignal(s)
  78. });
  79. a.registerFunction("stream", s=>{
  80. // var l;
  81. // this.emit("streamTimestamp", {
  82. // timestamp: Date.now()
  83. // });
  84. // t || (t = !0,logger.info("Invoke stream event"));
  85. if (s.stream) {
  86. // r || (r = !0,logger.info("Invoke updateRawYUVData"));
  87. // this.isUpdatedRawYUVData = !1;
  88. // const fov = (l = this._currentState.skin) == null ? void 0 : l.fov;0
  89. // this.sceneManager.materialComponent.updateRawYUVData(s.stream, s.width, s.height, fov);
  90. this.isUpdatedRawYUVData = !0
  91. }
  92. if(!e){
  93. logger.info("Invoke isAfterRenderRegistered");
  94. e = !0;
  95. this.scene.registerAfterRender(()=>{
  96. if(this.engineProxy.frameRenderNumber >= 2){
  97. n || (n = !0,logger.info("Invoke registerAfterRender"));
  98. if(!this.isFirstDataUsed){
  99. logger.info("Invoke isStreamAvailable");
  100. this.isFirstDataUsed = !0;
  101. this.firstFrameTimestamp = Date.now();
  102. o(this);
  103. this.afterJoinRoom();
  104. }
  105. }
  106. })
  107. }
  108. });
  109. this.panorama.bindListener(()=>{
  110. o(this),
  111. this.afterJoinRoom()
  112. });
  113. // a.registerFunction("reconnectedFrame", ()=>{});
  114. // logger.info("Invoke decoderWorker.postMessage");
  115. // a.decoderWorker.postMessage({
  116. // t: 5
  117. // })
  118. }
  119. )
  120. }
  121. );
  122. E(this, "moveToExtra", "");
  123. this.options = e;
  124. this.options.wsServerUrl || (this.options.wsServerUrl = SERVER_URLS.DEV);
  125. this.modelManager = ModelManager.getInstance(e.appId, e.releaseId);
  126. // this.updateReporter();
  127. // const n = e
  128. // , {canvas: t} = n
  129. // , r = Oe(n, ["canvas"]);
  130. // logger.infoAndReportMeasurement({
  131. // metric: "startJoinRoomAt",
  132. // startTime: Date.now(),
  133. // group: "joinRoom",
  134. // extra: r,
  135. // value: 0
  136. // })
  137. }
  138. doRotate(angle){
  139. //this.sceneManager.materialComponent.initreceveFrames()
  140. // 获得相机旋转后的位置
  141. let cameraPostion0 = util.xversePosition2Ue4(this.sceneManager.cameraComponent.mainCamera.position.clone())
  142. let playerPosition = this.sceneManager.avatarComponent._mainUser.position
  143. let rotationQuaternion = BABYLON.Quaternion.RotationAxis( new BABYLON.Vector3(0, 0, 1), angle )
  144. let cameraPos = new BABYLON.Vector3( cameraPostion0.x, cameraPostion0.y, cameraPostion0.z )
  145. let cameraCenter = new BABYLON.Vector3( playerPosition.x, playerPosition.y, playerPosition.z )
  146. // console.error(cameraPos, cameraCenter)
  147. cameraPos.rotateByQuaternionAroundPointToRef(rotationQuaternion, cameraCenter, cameraPos)
  148. // 相机碰撞检测
  149. let cameraPosXverse = util.ue4Position2Xverse(cameraPos)
  150. let cameraCenterXverse = util.ue4Position2Xverse(playerPosition)
  151. cameraCenterXverse.y = cameraPosXverse.y
  152. if(!this.ray) this.ray = new BABYLON.Ray(new BABYLON.Vector3(0,0,0), new BABYLON.Vector3(0,0,1), 50);
  153. this.ray.origin = cameraCenterXverse
  154. this.ray.direction = BABYLON.Vector3.Normalize( cameraPosXverse.clone().subtract(cameraCenterXverse) )
  155. let info = this.ray.intersectsMeshes(this.sceneManager.getGround())[0];
  156. // todo 矫正
  157. const offset = 0.09
  158. if(info) {
  159. info.distance = Math.min(info.distance, 4.5 + offset)
  160. cameraPosXverse = cameraCenterXverse.add(this.ray.direction.clone().scale(Math.max( info.distance - offset, 0.1 )))
  161. cameraPos = util.xversePosition2Ue4(cameraPosXverse)
  162. }
  163. let cameraState = {
  164. "position": {
  165. "x": cameraPos.x,
  166. "y": cameraPos.y,
  167. "z": cameraPos.z
  168. },
  169. "angle": {
  170. "pitch": 0,
  171. "yaw": window.camera_endRotation,
  172. "roll": 0
  173. }
  174. }
  175. if(this.avatarManager.avatars.get(nickname).position){
  176. let response = JSON.parse(JSON.stringify(Response))
  177. response.signal.newUserStates[0].userId = nickname
  178. response.signal.newUserStates[0].playerState.player.position.x = this.avatarManager.avatars.get(nickname).position.x
  179. response.signal.newUserStates[0].playerState.player.position.y = this.avatarManager.avatars.get(nickname).position.y
  180. response.signal.newUserStates[0].playerState.player.position.z = this.avatarManager.avatars.get(nickname).position.z
  181. response.signal.newUserStates[0].playerState.player.angle.pitch = this.avatarManager.avatars.get(nickname).rotation.pitch
  182. response.signal.newUserStates[0].playerState.player.angle.yaw = this.avatarManager.avatars.get(nickname).rotation.yaw
  183. response.signal.newUserStates[0].playerState.player.angle.roll = this.avatarManager.avatars.get(nickname).rotation.roll
  184. response.signal.newUserStates[0].playerState.camera.position.x = cameraState.position.x
  185. response.signal.newUserStates[0].playerState.camera.position.y = cameraState.position.y
  186. response.signal.newUserStates[0].playerState.camera.position.z = cameraState.position.z
  187. response.signal.newUserStates[0].playerState.camera.angle.pitch = cameraState.angle.pitch
  188. response.signal.newUserStates[0].playerState.camera.angle.yaw = cameraState.angle.yaw
  189. response.signal.newUserStates[0].playerState.camera.angle.roll = cameraState.angle.roll
  190. response.signal.newUserStates[0].playerState.cameraCenter.x = this.avatarManager.avatars.get(nickname).position.x
  191. response.signal.newUserStates[0].playerState.cameraCenter.y = this.avatarManager.avatars.get(nickname).position.y
  192. response.signal.newUserStates[0].playerState.cameraCenter.z = this.avatarManager.avatars.get(nickname).position.z
  193. console.log('更新相机角度')
  194. this.signal.handleSignal(response)
  195. }
  196. }
  197. moveTo({ position, needTurnAround, isEnd }) {
  198. // console.error(position)
  199. let player = this.sceneManager.avatarComponent._mainUser
  200. let playerPos = new BABYLON.Vector3( player.position.x, player.position.y, player.position.z )
  201. let playerPosNew = new BABYLON.Vector3(position.x, position.y, position.z)
  202. let walkDistanceVec = playerPosNew.clone().subtract(playerPos)
  203. let angle = BABYLON.Vector3.GetAngleBetweenVectors(new BABYLON.Vector3(0, -1, 0), walkDistanceVec, new BABYLON.Vector3(0, 0, 1))
  204. let rotationQuaternion = BABYLON.Quaternion.RotationAxis( new BABYLON.Vector3(0, 0, 1), angle )
  205. let playerRotaTemp = rotationQuaternion.toEulerAngles()
  206. playerRotaTemp = new BABYLON.Vector3(playerRotaTemp.x, playerRotaTemp.z, playerRotaTemp.y) // 因为是用ue4pos算的,需要矫正一下
  207. let playerRotaNew = util.xverseRotation2Ue4(playerRotaTemp)
  208. let cameraPosTemp = util.xversePosition2Ue4(this.sceneManager.cameraComponent.mainCamera.position)
  209. let cameraPos = new BABYLON.Vector3( cameraPosTemp.x, cameraPosTemp.y, cameraPosTemp.z )
  210. let cameraPosNew = cameraPos.add(walkDistanceVec)
  211. let cameraRota = util.xverseRotation2Ue4(this.sceneManager.cameraComponent.mainCamera.rotation)
  212. if(player.position){
  213. let response = JSON.parse(JSON.stringify(Response))
  214. response.signal.newUserStates[0].userId = player.id
  215. response.signal.newUserStates[0].playerState.player.position.x = playerPosNew.x
  216. response.signal.newUserStates[0].playerState.player.position.y = playerPosNew.y
  217. response.signal.newUserStates[0].playerState.player.position.z = playerPosNew.z
  218. response.signal.newUserStates[0].playerState.player.angle.pitch = player.rotation.pitch
  219. response.signal.newUserStates[0].playerState.player.angle.yaw = needTurnAround ? playerRotaNew.yaw : player.rotation.yaw
  220. response.signal.newUserStates[0].playerState.player.angle.roll = player.rotation.roll
  221. response.signal.newUserStates[0].playerState.camera.position.x = cameraPosNew.x
  222. response.signal.newUserStates[0].playerState.camera.position.y = cameraPosNew.y
  223. response.signal.newUserStates[0].playerState.camera.position.z = cameraPosNew.z
  224. response.signal.newUserStates[0].playerState.camera.angle.pitch = cameraRota.pitch
  225. response.signal.newUserStates[0].playerState.camera.angle.yaw = cameraRota.yaw
  226. response.signal.newUserStates[0].playerState.camera.angle.roll = cameraRota.roll
  227. response.signal.newUserStates[0].playerState.cameraCenter.x = playerPosNew.x
  228. response.signal.newUserStates[0].playerState.cameraCenter.y = playerPosNew.y
  229. response.signal.newUserStates[0].playerState.cameraCenter.z = playerPosNew.z
  230. // 用于人物动画更新
  231. response.signal.newUserStates[0].renderInfo.isMoving = !isEnd
  232. console.log('角色行走')
  233. this.signal.handleSignal(response)
  234. }
  235. }
  236. get currentNetworkOptions() {
  237. return this._currentNetworkOptions
  238. }
  239. get viewMode() {
  240. var e;
  241. return ((e = this._currentState) == null ? void 0 : e.viewMode) || "full"
  242. }
  243. get id() {
  244. return this._id
  245. }
  246. get skinId() {
  247. return this._currentState.skinId
  248. }
  249. get skin() {
  250. return this._currentState.skin
  251. }
  252. get sessionId() {
  253. return this.currentNetworkOptions.sessionId
  254. }
  255. get pictureQualityLevel() {
  256. return this.currentState.pictureQualityLevel
  257. }
  258. get avatars() {
  259. return Array.from(this.avatarManager.avatars.values())
  260. }
  261. get currentState() {
  262. var e;
  263. return le(oe({}, this._currentState), {
  264. state: (e = this.networkController) == null ? void 0 : e._state
  265. })
  266. }
  267. get _userAvatar() {
  268. return this.avatars.find(e=>e.userId === this.userId)
  269. }
  270. get tvs() {
  271. return this.engineProxy._tvs
  272. }
  273. get tv() {
  274. return this.tvs[0]
  275. }
  276. get currentClickingState() {
  277. return this._currentClickingState
  278. }
  279. afterJoinRoomHook() {}
  280. beforeJoinRoomResolveHook() {}
  281. afterReconnectedHook() {}
  282. handleSignalHook(e) {}
  283. skinChangedHook() {}
  284. async beforeStartGameHook(e) {}
  285. loadAssetsHook() {}
  286. afterUserAvatarLoadedHook() {}
  287. audienceViewModeHook() {}
  288. setViewModeToObserver() {}
  289. handleVehicleHook(e) {}
  290. updateReporter() {
  291. const {avatarId: avatarId, skinId: skinId, userId: userId, roomId: roomId, role: role, appId: appId, wsServerUrl: wsServerUrl} = this.options;
  292. reporter.updateHeader({
  293. userId: userId
  294. }),
  295. reporter.updateBody({
  296. roomId: roomId,
  297. role: role,
  298. skinId: skinId,
  299. avatarId: avatarId,
  300. appId: appId,
  301. wsServerUrl: wsServerUrl
  302. })
  303. }
  304. async initRoom() {
  305. const {timeout: e=DEFAULT_JOINROOM_TIMEOUT} = this.options;
  306. if(util.isSupported()){
  307. //return this._initRoom()._timeout(e, new TimeoutError("initRoom timeout"))
  308. return this._initRoom()
  309. }
  310. else{
  311. return Promise.reject(new UnsupportedError)
  312. }
  313. }
  314. async _initRoom() {
  315. const e = this.validateOptions(this.options);
  316. if(e)
  317. {
  318. return logger.error("initRoom param error", e),
  319. Promise.reject(e);
  320. }
  321. const {canvas: canvas, avatarId: avatarId, skinId: skinId, userId: userId, wsServerUrl: wsServerUrl, role: role, token: token, pageSession: pageSession, rotationRenderType: rotationRenderType, isAllSync: isAllSync=!1, appId: f, camera: d, player: _, avatarComponents: g, nickname: nickname, avatarScale: v, firends: y=[], syncByEvent: b=!1, areaName: T, attitude: C=MotionType.Walk, pathName: A, viewMode: S="full", person: P, roomId: roomId, roomTypeId: M, hasAvatar: x=!1, syncToOthers: I=!1, prioritySync: w=!1, removeWhenDisconnected: O=!0, extra: D} = this.options;
  322. this.setCurrentNetworkOptions({
  323. avatarId: avatarId,
  324. skinId: skinId,
  325. roomId: roomId,
  326. userId: userId,
  327. wsServerUrl: wsServerUrl,
  328. role: role,
  329. token: token,
  330. pageSession: pageSession,
  331. rotationRenderType: rotationRenderType,
  332. isAllSync: isAllSync,
  333. appId: f,
  334. camera: d,
  335. player: _,
  336. avatarComponents: g,
  337. nickname: nickname,
  338. avatarScale: v,
  339. firends: y,
  340. syncByEvent: b,
  341. areaName: T,
  342. attitude: C,
  343. pathName: A,
  344. person: P,
  345. roomTypeId: M,
  346. hasAvatar: x,
  347. syncToOthers: I,
  348. prioritySync: w,
  349. extra: D,
  350. removeWhenDisconnected: O
  351. });
  352. this.userId = userId;
  353. this.canvas = canvas;
  354. T && (this.pathManager.currentArea = T);
  355. this.networkController = new NetworkController(this);
  356. this.setCurrentState({
  357. areaName: T,
  358. pathName: A,
  359. attitude: C,
  360. speed: 0,
  361. viewMode: S,
  362. state: this.networkController._state,
  363. skinId: skinId
  364. });
  365. try {
  366. await Promise.all([this.initNetwork(), this.initConfig()/*, this.initWasm()*/]);
  367. logger.info("network config wasm all ready, start to create game");
  368. const F = await this.requestCreateRoom({
  369. skinId: skinId
  370. })
  371. , V = F.routeList.find(L=>L.areaName === T)
  372. , N = ((V == null ? void 0 : V.step) || 7.5) * 30;
  373. this.updateCurrentState({
  374. skin: F,
  375. skinId: F.id,
  376. versionId: F.versionId,
  377. speed: N
  378. }),
  379. await this.initEngine(F)
  380. } catch (F) {
  381. return Promise.reject(F)
  382. }
  383. this.beforeJoinRoomResolve();
  384. return this.receiveRtcData()
  385. }
  386. beforeJoinRoomResolve() {
  387. this.setupStats(),
  388. this.eventsController = new EventsController(this),
  389. this.eventsController.bindEvents(),
  390. this.panorama = new Panorama(this),
  391. this.beforeJoinRoomResolveHook()
  392. }
  393. afterJoinRoom() {
  394. this.joined = !0,
  395. this.viewMode === "observer" && this.setViewModeToObserver(),
  396. logger.infoAndReportMeasurement({
  397. tag: this.viewMode,
  398. value: this.firstFrameTimestamp - this._startTime,
  399. startTime: Date.now(),
  400. metric: "joinRoom"
  401. }),
  402. this.camera.initialFov = this.sceneManager.cameraComponent.getCameraFov(),
  403. this.stats.on("stats", ({stats: e})=>{
  404. reporter.report("stats", oe({}, e))
  405. }
  406. ),
  407. this.debug = new Debug(this),
  408. this.afterJoinRoomHook()
  409. }
  410. afterReconnected() {
  411. this.avatarManager.clearOtherUsers(),
  412. this.afterReconnectedHook()
  413. }
  414. leave() {
  415. var e, t;
  416. return logger.info("Invoke room.leave"),
  417. (e = this.eventsController) == null || e.clearEvents(),
  418. (t = this.networkController) == null || t.quit(),
  419. this
  420. }
  421. validateOptions(e) {
  422. const {canvas: t, avatarId: avatarId, skinId: skinId, userId: userId, role: role, roomId: roomId, token: token, appId: appId, avatarComponents: avatarComponents} = e || {}
  423. const h = [];
  424. t instanceof HTMLCanvasElement || h.push(new ParamError("`canvas` must be instanceof of HTMLCanvasElement"));
  425. (!userId || typeof userId != "string") && h.push(new ParamError("`userId` must be string"));
  426. (!token || typeof token != "string") && h.push(new ParamError("`token` must be string"));
  427. (!appId || typeof appId != "string") && h.push(new ParamError("`appId` must be string"));
  428. role == "audience" || (!avatarId || !skinId) && h.push(new ParamError("`avatarId` and `skinId` is required when create room"));
  429. return h[0]
  430. }
  431. async initNetwork() {
  432. if (this.viewMode === "serverless")
  433. return Promise.resolve();
  434. const e = Date.now();
  435. try {
  436. await this.networkController.connect()._timeout(8e3, new InitNetworkTimeoutError),
  437. logger.infoAndReportMeasurement({
  438. metric: "networkInitAt",
  439. startTime: this._startTime,
  440. group: "joinRoom"
  441. }),
  442. logger.infoAndReportMeasurement({
  443. metric: "networkInitCost",
  444. startTime: e,
  445. group: "joinRoom"
  446. })
  447. } catch (t) {
  448. throw logger.infoAndReportMeasurement({
  449. metric: "networkInitAt",
  450. startTime: e,
  451. group: "joinRoom",
  452. error: t
  453. }),
  454. t
  455. }
  456. }
  457. async initConfig() {
  458. const e = Date.now();
  459. try {
  460. await this.modelManager.getApplicationConfig()._timeout(8e3, new InitConfigTimeoutError),
  461. logger.infoAndReportMeasurement({
  462. metric: "configInitAt",
  463. startTime: this._startTime,
  464. group: "joinRoom"
  465. }),
  466. logger.infoAndReportMeasurement({
  467. metric: "configInitCost",
  468. startTime: e,
  469. group: "joinRoom"
  470. })
  471. } catch (t) {
  472. throw logger.infoAndReportMeasurement({
  473. metric: "configInitAt",
  474. startTime: e,
  475. group: "joinRoom",
  476. error: t
  477. }),
  478. t
  479. }
  480. }
  481. async initEngine(e) {
  482. const t = Date.now();
  483. try {
  484. this.engineProxy = new EngineProxy(this),
  485. await this.engineProxy.initEngine(e),
  486. logger.infoAndReportMeasurement({
  487. metric: "webglInitAt",
  488. startTime: this._startTime,
  489. group: "joinRoom"
  490. }),
  491. logger.infoAndReportMeasurement({
  492. metric: "webglInitCost",
  493. startTime: t,
  494. group: "joinRoom"
  495. });
  496. return
  497. } catch (r) {
  498. let n = r;
  499. return r.code !== Codes.InitEngineTimeout && (n = new InitEngineError),
  500. logger.error(r),
  501. logger.infoAndReportMeasurement({
  502. metric: "webglInitAt",
  503. startTime: t,
  504. group: "joinRoom",
  505. error: n
  506. }),
  507. Promise.reject(n)
  508. }
  509. }
  510. async initWasm() {
  511. if (this.viewMode === "serverless")
  512. return Promise.resolve();
  513. const e = Date.now();
  514. try {
  515. await this.networkController.rtcp.workers.init(this.options.resolution)._timeout(8e3, new InitDecoderTimeoutError);
  516. this.networkController.rtcp.workers.registerFunction("error", t=>{
  517. logger.error("decode error", t);
  518. const {code: code, message: n} = t;
  519. this.emit("error", {
  520. code: code,
  521. msg: n
  522. })
  523. }
  524. ),
  525. logger.infoAndReportMeasurement({
  526. metric: "wasmInitAt",
  527. group: "joinRoom",
  528. startTime: this._startTime
  529. }),
  530. logger.infoAndReportMeasurement({
  531. metric: "wasmInitCost",
  532. group: "joinRoom",
  533. startTime: e
  534. }),
  535. eventsManager.on("traceId", t=>{
  536. this.networkController.rtcp.workers.onTraceId(t)
  537. }
  538. )
  539. } catch (t) {
  540. throw logger.infoAndReportMeasurement({
  541. metric: "wasmInitAt",
  542. group: "joinRoom",
  543. startTime: e,
  544. error: t
  545. }),
  546. t
  547. }
  548. }
  549. async requestCreateRoom({skinId: e}) {
  550. let t;
  551. if (e) {
  552. t = await this.getSkin(e);
  553. const r = await this.modelManager.findRoute(e, this.options.pathName);
  554. this.updateCurrentNetworkOptions({
  555. areaName: r.areaName,
  556. attitude: r.attitude,
  557. versionId: t.versionId
  558. });
  559. const {camera: n, player: player} = util.getRandomItem(r.birthPointList) || this.options;
  560. this.options.camera || this.updateCurrentNetworkOptions({
  561. camera: n
  562. }),
  563. this.options.player || this.updateCurrentNetworkOptions({
  564. player: player
  565. })
  566. }
  567. if (this.viewMode === "serverless")
  568. return t;
  569. try {
  570. await this.beforeStartGameHook(this.options);
  571. //const {room_id: room_id, data: n, session_id: session_id} = await this.networkController.startGame();
  572. const room_id = this.options.roomId;
  573. const n = JSON.stringify(this.options.camera);
  574. const session_id = '';
  575. this._id = room_id;
  576. const a = JSON.parse(n);
  577. this.isHost = a.IsHost,
  578. e = a.SkinID || e;
  579. const skin = await this.getSkin(e);
  580. this.updateCurrentNetworkOptions({
  581. roomId: room_id,
  582. sessionId: session_id
  583. });
  584. reporter.updateBody({
  585. roomId: room_id,
  586. skinId: e,
  587. serverSession: session_id
  588. });
  589. return skin
  590. } catch (r) {
  591. throw logger.error("Request create room error", r),
  592. r
  593. }
  594. }
  595. pause() {
  596. return this.engineProxy.pause()
  597. }
  598. resume() {
  599. return this.engineProxy.resume()
  600. }
  601. reconnect() {
  602. this.networkController.reconnect()
  603. }
  604. async setViewMode(e) {}
  605. handleRepetLogin() {
  606. logger.warn("receive " + Codes.RepeatLogin + " for repeat login"),
  607. this.emit("repeatLogin"),
  608. reporter.disable(),
  609. this.networkController.quit()
  610. }
  611. setPictureQualityLevel(e) {
  612. const t = {
  613. high: EImageQuality.high,
  614. low: EImageQuality.low,
  615. average: EImageQuality.mid
  616. };
  617. return this.updateCurrentState({
  618. pictureQualityLevel: e
  619. }),
  620. this.sceneManager.setImageQuality(t[e])
  621. }
  622. async getSkin(skinId) {
  623. let t = (this.skinList = await this.modelManager.getSkinsList()).find(skin=>skin.id === skinId || skin.id === skinId)
  624. if (t)
  625. return t;
  626. {
  627. const n = `skin is invalid: skinId: ${skinId}`;
  628. return Promise.reject(new ParamError(n))
  629. }
  630. }
  631. setupStats() {
  632. this.stats.assign({
  633. roomId: this.id,
  634. userId: this.userId
  635. }),
  636. setInterval(this.engineProxy.updateStats, 1e3)
  637. }
  638. proxyEvents(e, t) {
  639. this.emit(e, t)
  640. }
  641. setCurrentNetworkOptions(e) {
  642. this._currentNetworkOptions = e
  643. }
  644. updateCurrentNetworkOptions(e) {
  645. Object.assign(this._currentNetworkOptions, e),
  646. Object.assign(this.options, e)
  647. }
  648. setCurrentState(e) {
  649. this._currentState = e
  650. }
  651. updateCurrentState(e) {
  652. e.skinId && (this.lastSkinId = this.currentState.skinId,
  653. this.updateCurrentNetworkOptions({
  654. skinId: e.skinId
  655. })),
  656. e.versionId && this.updateCurrentNetworkOptions({
  657. versionId: e.versionId
  658. }),
  659. Object.assign(this._currentState, e)
  660. }
  661. }