|
@@ -3,7 +3,32 @@ import {logger} from "./Logger.js"
|
|
|
import Socket from "./Socket.js"
|
|
|
import Rtcp from "./Rtcp.js"
|
|
|
import NetworkMonitor from "./NetworkMonitor.js"
|
|
|
+import Stream from "./Stream.js"
|
|
|
|
|
|
+var workerSourceCode = `onmessage = function (event) {
|
|
|
+ const data = event.data
|
|
|
+ if (!data) return
|
|
|
+
|
|
|
+ if (data.type === 'start') {
|
|
|
+ const startTime = Date.now()
|
|
|
+ const request = new XMLHttpRequest()
|
|
|
+ request.open('GET', data.url)
|
|
|
+ try {
|
|
|
+ request.send()
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error)
|
|
|
+ }
|
|
|
+ request.addEventListener('readystatechange', () => {
|
|
|
+ if (request.readyState == 4) {
|
|
|
+ if (request.status == 200) {
|
|
|
+ postMessage(Date.now() - startTime)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ `;
|
|
|
+
|
|
|
export default class NetworkController extends EventEmitter {
|
|
|
constructor(e) {
|
|
|
super();
|
|
@@ -22,26 +47,27 @@ export default class NetworkController extends EventEmitter {
|
|
|
logger.info("network changed, online:", this._networkMonitor.isOnline),
|
|
|
this._state === "disconnected" && this._networkMonitor.isOnline && (logger.info("network back to online, try to reconnect"),
|
|
|
this.reconnect())
|
|
|
- }
|
|
|
- ),
|
|
|
- checkNetworkQuality(this.room.currentNetworkOptions.wsServerUrl),
|
|
|
- this._networkMonitor.start(),
|
|
|
+ });
|
|
|
+
|
|
|
+ this.checkNetworkQuality(this.room.currentNetworkOptions.wsServerUrl);
|
|
|
+ this._networkMonitor.start();
|
|
|
+
|
|
|
new VisibilityChangeHandler().subscribe(r=>{
|
|
|
- var n, o;
|
|
|
- r ? ((o = this.room.stats) == null || o.disable(),
|
|
|
- logger.infoAndReportMeasurement({
|
|
|
- metric: "pageHide",
|
|
|
- startTime: Date.now()
|
|
|
- })) : ((n = this.room.stats) == null || n.enable(),
|
|
|
- logger.infoAndReportMeasurement({
|
|
|
- metric: "pageShow",
|
|
|
- startTime: Date.now(),
|
|
|
- extra: {
|
|
|
- state: this._state
|
|
|
- }
|
|
|
- }),
|
|
|
- this._state === "disconnected" && this.reconnect())
|
|
|
- }
|
|
|
+ var n, o;
|
|
|
+ r ? ((o = this.room.stats) == null || o.disable(),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "pageHide",
|
|
|
+ startTime: Date.now()
|
|
|
+ })) : ((n = this.room.stats) == null || n.enable(),
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "pageShow",
|
|
|
+ startTime: Date.now(),
|
|
|
+ extra: {
|
|
|
+ state: this._state
|
|
|
+ }
|
|
|
+ }),
|
|
|
+ this._state === "disconnected" && this.reconnect())
|
|
|
+ }
|
|
|
)
|
|
|
}
|
|
|
|
|
@@ -84,10 +110,10 @@ export default class NetworkController extends EventEmitter {
|
|
|
return this.connect(e).then(this.startGame)
|
|
|
}
|
|
|
async connect(e=!1) {
|
|
|
- return this.room.updateCurrentNetworkOptions({
|
|
|
+ this.room.updateCurrentNetworkOptions({
|
|
|
reconnect: e
|
|
|
- }),
|
|
|
- new Promise((t,r)=>{
|
|
|
+ });
|
|
|
+ return new Promise((t,r)=>{
|
|
|
this.rtcp.on("rtcConnected", ()=>{
|
|
|
this.setState("connected"),
|
|
|
t()
|
|
@@ -220,4 +246,52 @@ export default class NetworkController extends EventEmitter {
|
|
|
this.socket.quit(),
|
|
|
this.sendRtcData(t)
|
|
|
}
|
|
|
+
|
|
|
+ checkNetworkQuality(i) {
|
|
|
+ let worker = null
|
|
|
+ if (!i)
|
|
|
+ return;
|
|
|
+ const e = Date.now();
|
|
|
+ if (this.pingOthers("https://www.baidu.com", function(t, r) {
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "baiduRtt",
|
|
|
+ group: "http",
|
|
|
+ value: r,
|
|
|
+ startTime: e
|
|
|
+ })
|
|
|
+ }),
|
|
|
+ !worker) {
|
|
|
+ const t = new Blob([workerSourceCode],{
|
|
|
+ type: "application/javascript"
|
|
|
+ });
|
|
|
+ worker = new Worker(URL.createObjectURL(t)),
|
|
|
+ worker.onmessage = function(r) {
|
|
|
+ logger.infoAndReportMeasurement({
|
|
|
+ metric: "workerRtt",
|
|
|
+ group: "http",
|
|
|
+ startTime: e,
|
|
|
+ value: r.data
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pingOthers(i, e) {
|
|
|
+ let t = !1;
|
|
|
+ const r = new Image;
|
|
|
+ r.onload = o,
|
|
|
+ r.onerror = a;
|
|
|
+ const n = Date.now();
|
|
|
+ function o(l) {
|
|
|
+ t = !0,
|
|
|
+ s()
|
|
|
+ }
|
|
|
+ function a(l) {}
|
|
|
+ function s() {
|
|
|
+ const l = Date.now() - n;
|
|
|
+ if (typeof e == "function")
|
|
|
+ return t ? e(null, l) : (console.error("error loading resource"),
|
|
|
+ e("error", l))
|
|
|
+ }
|
|
|
+ r.src = i + "/favicon.ico?" + +new Date
|
|
|
+ }
|
|
|
}
|