|
@@ -0,0 +1,642 @@
|
|
|
+import XverseAvatarManager from "./XverseAvatarManager.js";
|
|
|
+import Codes from "./enum/Codes.js";
|
|
|
+import PathManager from "./PathManager.js";
|
|
|
+import Camera from "./Camera.js";
|
|
|
+import Stats from "./Stats.js";
|
|
|
+import ActionsHandler from "./ActionsHandler.js";
|
|
|
+import Signal from "./Signal.js";
|
|
|
+import ModelManager from "./ModelManager.js";
|
|
|
+import { reporter } from "./Reporter.js";
|
|
|
+import util from "./util.js";
|
|
|
+import XverseEffectManager from "./XverseEffectManager.js";
|
|
|
+import TimeoutError from "./error/TimeoutError.js";
|
|
|
+import ParamError from "./error/ParamError.js";
|
|
|
+import MotionType from "./enum/MotionType.js";
|
|
|
+import NetworkController from "./NetworkController.js";
|
|
|
+import InitNetworkTimeoutError from "./error/InitNetworkTimeoutError.js";
|
|
|
+import InitConfigTimeoutError from "./error/InitConfigTimeoutError.js";
|
|
|
+import InitDecoderTimeoutError from "./error/InitDecoderTimeoutError.js";
|
|
|
+import InitEngineError from "./error/InitEngineError.js";
|
|
|
+import { eventsManager } from "./EventsManager.js";
|
|
|
+import EngineProxy from "./EngineProxy.js";
|
|
|
+import EventsController from "./EventsController.js";
|
|
|
+import EImageQuality from "./enum/EImageQuality.js";
|
|
|
+import Panorama from "./Panorama.js";
|
|
|
+import Debug from "./Debug.js";
|
|
|
+import Logger from "./Logger.js";
|
|
|
+import NewUserStateType from "./enum/NewUserStateType.js";
|
|
|
+import {tracker} from "./Tracker.js"
|
|
|
+import ByPasser from "./ByPasser.js";
|
|
|
+import XEngineOption from "./XEngineOption.js";
|
|
|
+import QueueType from "./enum/QueueType.js"
|
|
|
+
|
|
|
+const logger = new Logger("xverse-room");
|
|
|
+export default class XRoom extends EventEmitter {
|
|
|
+ constructor(s) {
|
|
|
+ super();
|
|
|
+ this.disableAutoTurn = !1;
|
|
|
+ this.options = null;
|
|
|
+ this._currentNetworkOptions = null;
|
|
|
+ this.lastSkinId = null;
|
|
|
+ this.debug = null;
|
|
|
+ this.bypasser = null;
|
|
|
+ this.isFirstDataUsed = !1;
|
|
|
+ this.userId = null;
|
|
|
+ this.pathManager = new PathManager;
|
|
|
+ this.networkController = null;
|
|
|
+ this._startTime = Date.now();
|
|
|
+ this.canvas = null;
|
|
|
+ this.modelManager = null;
|
|
|
+ this.eventsController = null;
|
|
|
+ this.panorama = null;
|
|
|
+ this.engineProxy = null;
|
|
|
+ this._id = null;
|
|
|
+ this.skinList = [];
|
|
|
+ this.isHost = !1;
|
|
|
+ this.avatarManager = new XverseAvatarManager(this);
|
|
|
+ this.effectManager = new XverseAvatarManager(this);
|
|
|
+ this.sceneManager = null;
|
|
|
+ this.scene = null;
|
|
|
+ this.breathPointManager = null;
|
|
|
+ this._currentState = null;
|
|
|
+ this.joined = !1;
|
|
|
+ this.disableRotate = !1;
|
|
|
+ this.isPano = !1;
|
|
|
+ this.movingByClick = !1;
|
|
|
+ this.camera = new Camera(this);
|
|
|
+ this.stats = new Stats(this);
|
|
|
+ this.isUpdatedRawYUVData = !1;
|
|
|
+ this.actionsHandler = new ActionsHandler(this);
|
|
|
+ this._currentClickingState = null;
|
|
|
+ this.signal = new Signal(this);
|
|
|
+ this.allowRender = !0;
|
|
|
+ this.firstFrameTimestamp = null;
|
|
|
+ this.receiveRtcData = async()=>{
|
|
|
+ logger.info("Invoke receiveRtcData");
|
|
|
+ let s = !1
|
|
|
+ , c = !1
|
|
|
+ , _ = !1
|
|
|
+ , b = !1;
|
|
|
+ return this.viewMode === "serverless" ? (logger.warn("set view mode to serverless"),
|
|
|
+ this.setViewMode("observer").then(()=>this)) : new Promise((k,j)=>{
|
|
|
+ const $ = this.networkController.rtcp.workers;
|
|
|
+ $.registerFunction("signal", _e=>{
|
|
|
+ this.signal.handleSignal(_e, j)
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ $.registerFunction("stream", _e=>{
|
|
|
+ var et;
|
|
|
+ if (this.emit("streamTimestamp", {
|
|
|
+ timestamp: Date.now()
|
|
|
+ }),
|
|
|
+ c || (c = !0,
|
|
|
+ logger.info("Invoke stream event")),
|
|
|
+ _e.stream) {
|
|
|
+ _ || (_ = !0,
|
|
|
+ logger.info("Invoke updateRawYUVData")),
|
|
|
+ this.isUpdatedRawYUVData = !1;
|
|
|
+ const tt = (et = this._currentState.skin) == null ? void 0 : et.fov;
|
|
|
+ this.sceneManager.materialComponent.updateRawYUVData(_e.stream, _e.width, _e.height, tt),
|
|
|
+ this.isUpdatedRawYUVData = !0
|
|
|
+ }
|
|
|
+ s || (logger.info("Invoke isAfterRenderRegistered"),
|
|
|
+ s = !0,
|
|
|
+ this.scene.registerAfterRender(()=>{
|
|
|
+ this.engineProxy.frameRenderNumber >= 2 && (b || (b = !0,
|
|
|
+ logger.info("Invoke registerAfterRender")),
|
|
|
+ this.isFirstDataUsed || (logger.info("Invoke isStreamAvailable"),
|
|
|
+ this.isFirstDataUsed = !0,
|
|
|
+ this.firstFrameTimestamp = Date.now(),
|
|
|
+ k(this),
|
|
|
+ this.afterJoinRoom()))
|
|
|
+ }
|
|
|
+ ))
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ this.panorama.bindListener(()=>{
|
|
|
+ k(this),
|
|
|
+ this.afterJoinRoom()
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ $.registerFunction("reconnectedFrame", ()=>{}
|
|
|
+ ),
|
|
|
+ logger.info("Invoke decoderWorker.postMessage"),
|
|
|
+ $.decoderWorker.postMessage({
|
|
|
+ t: 5
|
|
|
+ })
|
|
|
+ }
|
|
|
+ )
|
|
|
+ }
|
|
|
+ this.moveToExtra = "";
|
|
|
+ this.options = s,
|
|
|
+ this.options.wsServerUrl || (this.options.wsServerUrl = SERVER_URLS.DEV),
|
|
|
+ this.modelManager = ModelManager.getInstance(s.appId, s.releaseId);
|
|
|
+ const c = s.nicknameOptions;
|
|
|
+ c && (s.extra = Object.assign({}, s.extra, {
|
|
|
+ nicknameOptions: c
|
|
|
+ })),
|
|
|
+ this.updateReporter();
|
|
|
+ const {canvas: _, ...b} = s;
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "startJoinRoomAt",
|
|
|
+ startTime: Date.now(),
|
|
|
+ group: "joinRoom",
|
|
|
+ extra: b,
|
|
|
+ value: 0
|
|
|
+ }),
|
|
|
+ this.bypasser = new ByPasser(s.bypassTag || 0)
|
|
|
+ }
|
|
|
+ get currentNetworkOptions() {
|
|
|
+ return this._currentNetworkOptions
|
|
|
+ }
|
|
|
+ get viewMode() {
|
|
|
+ var s;
|
|
|
+ return ((s = this._currentState) == null ? void 0 : s.viewMode) || "full"
|
|
|
+ }
|
|
|
+ get id() {
|
|
|
+ return this._id
|
|
|
+ }
|
|
|
+ get skinId() {
|
|
|
+ return this._currentState.skinId
|
|
|
+ }
|
|
|
+ get skin() {
|
|
|
+ return this._currentState.skin
|
|
|
+ }
|
|
|
+ get sessionId() {
|
|
|
+ return this.currentNetworkOptions.sessionId
|
|
|
+ }
|
|
|
+ get pictureQualityLevel() {
|
|
|
+ return this.currentState.pictureQualityLevel
|
|
|
+ }
|
|
|
+ get avatars() {
|
|
|
+ return Array.from(this.avatarManager.avatars.values())
|
|
|
+ }
|
|
|
+ get currentState() {
|
|
|
+ var s;
|
|
|
+ return {
|
|
|
+ ...this._currentState,
|
|
|
+ state: (s = this.networkController) == null ? void 0 : s._state
|
|
|
+ }
|
|
|
+ }
|
|
|
+ get _userAvatar() {
|
|
|
+ return this.avatars.find(s=>s.userId === this.userId)
|
|
|
+ }
|
|
|
+ get userAvatar() {
|
|
|
+ return this.avatars.find(s=>s.userId === this.userId)
|
|
|
+ }
|
|
|
+ get tvs() {
|
|
|
+ return this.engineProxy._tvs
|
|
|
+ }
|
|
|
+ get tv() {
|
|
|
+ return this.tvs[0]
|
|
|
+ }
|
|
|
+ get currentClickingState() {
|
|
|
+ return this._currentClickingState
|
|
|
+ }
|
|
|
+ afterJoinRoomHook() {}
|
|
|
+ beforeJoinRoomResolveHook() {}
|
|
|
+ afterReconnectedHook() {}
|
|
|
+ handleSignalHook(s) {}
|
|
|
+ skinChangedHook() {}
|
|
|
+ async beforeStartGameSendHook() {}
|
|
|
+ async beforeStartGameHook(s) {}
|
|
|
+ afterLoadAssetsHook() {}
|
|
|
+ afterUserAvatarLoadedHook() {}
|
|
|
+ audienceViewModeHook(s) {}
|
|
|
+ setViewModeToObserver() {}
|
|
|
+ handleVehicleHook(s) {}
|
|
|
+ updateReporter() {
|
|
|
+ const {avatarId: s, skinId: c, userId: _, roomId: b, role: k, appId: j, wsServerUrl: $} = this.options;
|
|
|
+ reporter.updateHeader({
|
|
|
+ userId: _
|
|
|
+ }),
|
|
|
+ reporter.updateBody({
|
|
|
+ roomId: b,
|
|
|
+ role: k,
|
|
|
+ skinId: c,
|
|
|
+ avatarId: s,
|
|
|
+ appId: j,
|
|
|
+ wsServerUrl: $
|
|
|
+ }),
|
|
|
+ tracker.updateHeader({
|
|
|
+ userId: _,
|
|
|
+ roomId: b,
|
|
|
+ role: k,
|
|
|
+ skinId: c,
|
|
|
+ appId: j,
|
|
|
+ wsServerUrl: $
|
|
|
+ })
|
|
|
+ }
|
|
|
+ async initRoom() {
|
|
|
+ const {timeout: s=DEFAULT_JOINROOM_TIMEOUT} = this.options;
|
|
|
+ return util.isSupported() ? this._initRoom()._timeout(s, new TimeoutError("initRoom timeout")) : Promise.reject(new UnsupportedError)
|
|
|
+ }
|
|
|
+ async _initRoom() {
|
|
|
+ const s = this.validateOptions(this.options);
|
|
|
+ if (s)
|
|
|
+ return logger.error("initRoom param error", s),
|
|
|
+ Promise.reject(s);
|
|
|
+ const {canvas: c, avatarId: _, skinId: b, pathId: k, userId: j, wsServerUrl: $, role: _e, token: et, pageSession: tt, appId: rt, camera: it, player: nt, avatarComponents: at, nickname: ot, avatarScale: st, viewMode: lt="full", roomId: ut, roomTypeId: ct, hasAvatar: ht=!1, syncToOthers: dt=!1, prioritySync: ft=!1, removeWhenDisconnected: pt=!0, avatarURL: gt, extra: _t} = this.options;
|
|
|
+ this.setCurrentNetworkOptions({
|
|
|
+ avatarId: _,
|
|
|
+ skinId: b,
|
|
|
+ roomId: ut,
|
|
|
+ userId: j,
|
|
|
+ wsServerUrl: $,
|
|
|
+ role: _e,
|
|
|
+ token: et,
|
|
|
+ pageSession: tt,
|
|
|
+ appId: rt,
|
|
|
+ camera: it,
|
|
|
+ player: nt,
|
|
|
+ avatarComponents: at,
|
|
|
+ nickname: ot,
|
|
|
+ avatarScale: st,
|
|
|
+ roomTypeId: ct,
|
|
|
+ hasAvatar: ht,
|
|
|
+ syncToOthers: dt,
|
|
|
+ prioritySync: ft,
|
|
|
+ extra: _t,
|
|
|
+ avatarURL: gt,
|
|
|
+ removeWhenDisconnected: pt,
|
|
|
+ pathId: k
|
|
|
+ }),
|
|
|
+ this.userId = j,
|
|
|
+ this.canvas = c,
|
|
|
+ this.networkController = new NetworkController(this),
|
|
|
+ this.setCurrentState({
|
|
|
+ speed: 0,
|
|
|
+ viewMode: lt,
|
|
|
+ state: this.networkController._state,
|
|
|
+ skinId: b
|
|
|
+ });
|
|
|
+ try {
|
|
|
+ await Promise.all([this.initNetwork(), this.initConfig(), this.initWasm()]),
|
|
|
+ logger.info("network config wasm all ready, start to create game");
|
|
|
+ const mt = await this.requestCreateRoom({
|
|
|
+ skinId: b
|
|
|
+ });
|
|
|
+ await this.initEngine(mt)
|
|
|
+ } catch (mt) {
|
|
|
+ return Promise.reject(mt)
|
|
|
+ }
|
|
|
+ return this.beforeJoinRoomResolve(),
|
|
|
+ this.receiveRtcData()
|
|
|
+ }
|
|
|
+ beforeJoinRoomResolve() {
|
|
|
+ this.setupStats(),
|
|
|
+ this.eventsController = new EventsController(this),
|
|
|
+ this.eventsController.bindEvents(),
|
|
|
+ this.panorama = new Panorama(this),
|
|
|
+ this.beforeJoinRoomResolveHook()
|
|
|
+ }
|
|
|
+ afterJoinRoom() {
|
|
|
+ this.joined = !0,
|
|
|
+ this.viewMode === "observer" && this.setViewModeToObserver(),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ tag: this.viewMode,
|
|
|
+ value: (this.firstFrameTimestamp || Date.now()) - this._startTime,
|
|
|
+ startTime: Date.now(),
|
|
|
+ metric: "joinRoom",
|
|
|
+ reportOptions: {
|
|
|
+ immediate: !0
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ tracker.trackEvent("joinRoom", {
|
|
|
+ code: Codes.Success,
|
|
|
+ viewMode: this.viewMode
|
|
|
+ }),
|
|
|
+ this.stats.on("stats", ({stats: s})=>{
|
|
|
+ reporter.report("stats", {
|
|
|
+ ...s
|
|
|
+ })
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ this.debug = new Debug(this),
|
|
|
+ this.afterJoinRoomHook(),
|
|
|
+ setInterval(()=>{
|
|
|
+ this.currentState.state === "connected" && this.actionsHandler.getNewUserState(NewUserStateType.NUST_Undefined).then(s=>{
|
|
|
+ this.avatarManager.handleAvatar(s)
|
|
|
+ }
|
|
|
+ ).catch(()=>{}
|
|
|
+ )
|
|
|
+ }
|
|
|
+ , 2e3)
|
|
|
+ }
|
|
|
+ afterReconnected() {
|
|
|
+ this.avatarManager.clearOtherUsers(),
|
|
|
+ this.afterReconnectedHook()
|
|
|
+ }
|
|
|
+ leave() {
|
|
|
+ var s, c;
|
|
|
+ return logger.info("Invoke room.leave"),
|
|
|
+ (s = this.eventsController) == null || s.clearEvents(),
|
|
|
+ (c = this.networkController) == null || c.quit(),
|
|
|
+ this
|
|
|
+ }
|
|
|
+ validateOptions(s) {
|
|
|
+ const {canvas: c, avatarId: _, skinId: b, userId: k, role: j, roomId: $, token: _e, appId: et, avatarComponents: tt} = s || {}
|
|
|
+ , rt = [];
|
|
|
+ return c instanceof HTMLCanvasElement || rt.push(new ParamError("`canvas` must be instanceof of HTMLCanvasElement")),
|
|
|
+ (!k || typeof k != "string") && rt.push(new ParamError("`userId` must be string")),
|
|
|
+ (!_e || typeof _e != "string") && rt.push(new ParamError("`token` must be string")),
|
|
|
+ (!et || typeof et != "string") && rt.push(new ParamError("`appId` must be string")),
|
|
|
+ j == "audience" || (!_ || !b) && rt.push(new ParamError("`avatarId` and `skinId` is required when create room")),
|
|
|
+ rt[0]
|
|
|
+ }
|
|
|
+ async initNetwork() {
|
|
|
+ if (this.viewMode === "serverless")
|
|
|
+ return Promise.resolve();
|
|
|
+ const s = Date.now();
|
|
|
+ try {
|
|
|
+ await this.networkController.connect()._timeout(8e3, new InitNetworkTimeoutError),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "networkInitAt",
|
|
|
+ startTime: this._startTime,
|
|
|
+ group: "joinRoom"
|
|
|
+ }),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "networkInitCost",
|
|
|
+ startTime: s,
|
|
|
+ group: "joinRoom"
|
|
|
+ })
|
|
|
+ } catch (c) {
|
|
|
+ throw logger.infoAndReportMeasurement({
|
|
|
+ metric: "networkInitAt",
|
|
|
+ startTime: s,
|
|
|
+ group: "joinRoom",
|
|
|
+ error: c
|
|
|
+ }),
|
|
|
+ c
|
|
|
+ }
|
|
|
+ }
|
|
|
+ async initConfig() {
|
|
|
+ const s = Date.now();
|
|
|
+ try {
|
|
|
+ await this.modelManager.getApplicationConfig()._timeout(8e3, new InitConfigTimeoutError),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "configInitAt",
|
|
|
+ startTime: this._startTime,
|
|
|
+ group: "joinRoom"
|
|
|
+ }),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "configInitCost",
|
|
|
+ startTime: s,
|
|
|
+ group: "joinRoom"
|
|
|
+ })
|
|
|
+ } catch (c) {
|
|
|
+ throw logger.infoAndReportMeasurement({
|
|
|
+ metric: "configInitAt",
|
|
|
+ startTime: s,
|
|
|
+ group: "joinRoom",
|
|
|
+ error: c
|
|
|
+ }),
|
|
|
+ c
|
|
|
+ }
|
|
|
+ }
|
|
|
+ async initEngine(s) {
|
|
|
+ const c = Date.now();
|
|
|
+ try {
|
|
|
+ logger.debug("GEngine.init bypass is:", this.options.bypassTag);
|
|
|
+ const _ = new XEngineOption(this.options.bypassTag);
|
|
|
+ GEngine.init(this.options.canvas, _),
|
|
|
+ logger.debug("GEngine.init options is:", _),
|
|
|
+ this.engineProxy = new EngineProxy(this),
|
|
|
+ await this.engineProxy.initEngine(s)._timeout(8e3, new InitEngineError("init engine timeout in 8s")),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "webglInitAt",
|
|
|
+ startTime: this._startTime,
|
|
|
+ group: "joinRoom"
|
|
|
+ }),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "webglInitCost",
|
|
|
+ startTime: c,
|
|
|
+ group: "joinRoom"
|
|
|
+ });
|
|
|
+ return
|
|
|
+ } catch (_) {
|
|
|
+ let b = _;
|
|
|
+ return _.code !== Codes.InitEngineTimeout && (b = new InitEngineError(_)),
|
|
|
+ logger.error(_),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "webglInitAt",
|
|
|
+ startTime: c,
|
|
|
+ group: "joinRoom",
|
|
|
+ error: b
|
|
|
+ }),
|
|
|
+ Promise.reject(b)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ async initWasm() {
|
|
|
+ if (this.viewMode === "serverless")
|
|
|
+ return Promise.resolve();
|
|
|
+ const s = Date.now();
|
|
|
+ try {
|
|
|
+ await this.networkController.rtcp.workers.init({
|
|
|
+ width: 1920,
|
|
|
+ height: 1080,
|
|
|
+ userID: this.userId,
|
|
|
+ pageSession: this.options.pageSession,
|
|
|
+ serverSession: "",
|
|
|
+ bypasserList: this.bypasser.getSwitches("decode")
|
|
|
+ })._timeout(8e3, new InitDecoderTimeoutError),
|
|
|
+ this.networkController.rtcp.workers.registerFunction("error", c=>{
|
|
|
+ logger.error("decode error", c);
|
|
|
+ const {code: _, message: b} = c;
|
|
|
+ this.emit("error", {
|
|
|
+ code: _,
|
|
|
+ msg: b
|
|
|
+ })
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "wasmInitAt",
|
|
|
+ group: "joinRoom",
|
|
|
+ startTime: this._startTime
|
|
|
+ }),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "wasmInitCost",
|
|
|
+ group: "joinRoom",
|
|
|
+ startTime: s
|
|
|
+ }),
|
|
|
+ eventsManager.on("traceId", c=>{
|
|
|
+ this.networkController.rtcp.workers.onTraceId(c)
|
|
|
+ }
|
|
|
+ )
|
|
|
+ } catch (c) {
|
|
|
+ throw logger.infoAndReportMeasurement({
|
|
|
+ metric: "wasmInitAt",
|
|
|
+ group: "joinRoom",
|
|
|
+ startTime: s,
|
|
|
+ error: c
|
|
|
+ }),
|
|
|
+ c
|
|
|
+ }
|
|
|
+ }
|
|
|
+ async requestCreateRoom({skinId: s}) {
|
|
|
+ await this.beforeStartGameHook(this.options);
|
|
|
+ let c;
|
|
|
+ if (s) {
|
|
|
+ c = await this.getSkin(s),
|
|
|
+ this.updateCurrentState({
|
|
|
+ skin: c
|
|
|
+ });
|
|
|
+ const _ = await this.modelManager.findPath(s, this.options.pathId);
|
|
|
+ this.updateCurrentNetworkOptions({
|
|
|
+ versionId: c.versionId
|
|
|
+ });
|
|
|
+ const {camera: b, player: k} = getRandomItem(_.birthPointList) || this.options;
|
|
|
+ this.options.camera || this.updateCurrentNetworkOptions({
|
|
|
+ camera: b
|
|
|
+ }),
|
|
|
+ this.options.player || this.updateCurrentNetworkOptions({
|
|
|
+ player: k
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (this.viewMode === "serverless")
|
|
|
+ return c;
|
|
|
+ try {
|
|
|
+ await this.beforeStartGameSendHook();
|
|
|
+ const {room_id: _, data: b, session_id: k} = await this.networkController.startGame();
|
|
|
+ this._id = _;
|
|
|
+ const j = JSON.parse(b);
|
|
|
+ this.isHost = j.IsHost,
|
|
|
+ s = j.SkinID || s;
|
|
|
+ const $ = await this.getSkin(s);
|
|
|
+ this.updateCurrentNetworkOptions({
|
|
|
+ roomId: _,
|
|
|
+ sessionId: k
|
|
|
+ }),
|
|
|
+ reporter.updateBody({
|
|
|
+ roomId: _,
|
|
|
+ skinId: s,
|
|
|
+ serverSession: k
|
|
|
+ }),
|
|
|
+ tracker.updateHeader({
|
|
|
+ roomId: _,
|
|
|
+ skinId: s,
|
|
|
+ serverSession: k
|
|
|
+ });
|
|
|
+ const _e = $.pathList.find(tt=>tt.id === this.options.pathId)
|
|
|
+ , et = ((_e == null ? void 0 : _e.step) || 7.5) * 30;
|
|
|
+ return this.updateCurrentState({
|
|
|
+ skin: $,
|
|
|
+ skinId: $.id,
|
|
|
+ versionId: $.versionId,
|
|
|
+ speed: et
|
|
|
+ }),
|
|
|
+ $
|
|
|
+ } catch (_) {
|
|
|
+ return logger.error("requestCreateRoom error:", _),
|
|
|
+ Promise.reject(_)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pause() {
|
|
|
+ return this.engineProxy.pause()
|
|
|
+ }
|
|
|
+ resume() {
|
|
|
+ return this.engineProxy.resume()
|
|
|
+ }
|
|
|
+ reconnect() {
|
|
|
+ this.networkController.reconnect()
|
|
|
+ }
|
|
|
+ async setViewMode(s) {}
|
|
|
+ handleRepetLogin() {
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "repeatLogin",
|
|
|
+ startTime: Date.now(),
|
|
|
+ code: Codes.RepeatLogin,
|
|
|
+ reportOptions: {
|
|
|
+ immediate: !0
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ this.emit("repeatLogin"),
|
|
|
+ reporter.disable(),
|
|
|
+ this.networkController.quit()
|
|
|
+ }
|
|
|
+ setPictureQualityLevel(s) {
|
|
|
+ const c = {
|
|
|
+ high: EImageQuality.high,
|
|
|
+ low: EImageQuality.low,
|
|
|
+ average: EImageQuality.mid
|
|
|
+ };
|
|
|
+ return this.updateCurrentState({
|
|
|
+ pictureQualityLevel: s
|
|
|
+ }),
|
|
|
+ this.sceneManager.setImageQuality(c[s])
|
|
|
+ }
|
|
|
+ async getSkin(s) {
|
|
|
+ let c = null;
|
|
|
+ if (c = (this.skinList = await this.modelManager.getSkinsList()).find(b=>b.id === s || b.id === s),
|
|
|
+ c)
|
|
|
+ return c;
|
|
|
+ {
|
|
|
+ const b = `skin is invalid: skinId: ${s}`;
|
|
|
+ return Promise.reject(new ParamError(b))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ setupStats() {
|
|
|
+ this.stats.assign({
|
|
|
+ roomId: this.id,
|
|
|
+ userId: this.userId
|
|
|
+ }),
|
|
|
+ setInterval(this.engineProxy.updateStats, 1e3)
|
|
|
+ }
|
|
|
+ proxyEvents(s, c) {
|
|
|
+ this.emit(s, c)
|
|
|
+ }
|
|
|
+ setCurrentNetworkOptions(s) {
|
|
|
+ this._currentNetworkOptions = s
|
|
|
+ }
|
|
|
+ updateCurrentNetworkOptions(s) {
|
|
|
+ Object.assign(this._currentNetworkOptions, s),
|
|
|
+ Object.assign(this.options, s)
|
|
|
+ }
|
|
|
+ setCurrentState(s) {
|
|
|
+ this._currentState = s
|
|
|
+ }
|
|
|
+ updateCurrentState(s) {
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "updateCurrentState",
|
|
|
+ startTime: Date.now(),
|
|
|
+ extra: s
|
|
|
+ }),
|
|
|
+ s.skinId && (this.lastSkinId = this.currentState.skinId,
|
|
|
+ this.updateCurrentNetworkOptions({
|
|
|
+ skinId: s.skinId
|
|
|
+ })),
|
|
|
+ s.versionId && this.updateCurrentNetworkOptions({
|
|
|
+ versionId: s.versionId
|
|
|
+ }),
|
|
|
+ Object.assign(this._currentState, s)
|
|
|
+ }
|
|
|
+ afterSetUrlHook() {}
|
|
|
+ afterTvStopedHook() {}
|
|
|
+ afterTvPlayedHook() {}
|
|
|
+ pageShowHandler() {
|
|
|
+ var s;
|
|
|
+ (s = this.engineProxy) == null || s.setEnv(this.skin),
|
|
|
+ this.allowRender = !0,
|
|
|
+ this.avatars.forEach(async c=>{
|
|
|
+ var $, _e, et;
|
|
|
+ const _ = c.statusSyncQueue.queue.filter(tt=>tt.type === QueueType.Move)
|
|
|
+ , k = ((($ = c.statusSyncQueue.currentAction) == null ? void 0 : $.type) === QueueType.Move ? c.statusSyncQueue.currentAction : void 0) || _.slice(-1)[0]
|
|
|
+ , j = (et = (_e = k == null ? void 0 : k.userState) == null ? void 0 : _e.event) == null ? void 0 : et.points;
|
|
|
+ if (j) {
|
|
|
+ const tt = await this.modelManager.findPath(this.skinId, c.currentPathName)
|
|
|
+ , rt = ((tt == null ? void 0 : tt.step) || 7.5) * 25
|
|
|
+ , it = j[j.length - 1];
|
|
|
+ c.move({
|
|
|
+ start: it,
|
|
|
+ end: it,
|
|
|
+ walkSpeed: rt
|
|
|
+ })
|
|
|
+ }
|
|
|
+ c.statusSyncQueue.reject()
|
|
|
+ }
|
|
|
+ )
|
|
|
+ }
|
|
|
+ pageHideHandler() {
|
|
|
+ this.allowRender = !1
|
|
|
+ }
|
|
|
+}
|