Skip to content
This repository has been archived by the owner on May 18, 2022. It is now read-only.

Commit

Permalink
feat: add the game/network monitor
Browse files Browse the repository at this point in the history
  • Loading branch information
Mafrans committed Feb 21, 2021
1 parent bed7352 commit 0ae9ec4
Show file tree
Hide file tree
Showing 10 changed files with 598 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .parcel-plugin-textrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"extensions":[
"txtjs"
]
}
5 changes: 5 additions & 0 deletions custom.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ declare module '*.scss' {
export default content;
}

declare module '*.txtjs' {
const content: string;
export default content;
}

declare module '*.json' {
const value: never;
export default value;
Expand Down
35 changes: 35 additions & 0 deletions modules/main/src/MonitorRunnable.txtjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
class StadiaPlusNetworkMonitor {
originalRTC = [];
peerConnections = [];

constructor() {
const self = this;
this.originalRTC = RTCPeerConnection;
(function (OriginalRTCConnection) {
self.originalRTC = OriginalRTCConnection;

RTCPeerConnection = function (args) {
const connection = new OriginalRTCConnection(args);
self.peerConnections.push(connection);
return connection;
};
RTCPeerConnection.prototype = OriginalRTCConnection.prototype;
}(RTCPeerConnection));

setInterval(this.poll.bind(this), 1000);
}

async poll() {
const data = [];
for (const connection of this.peerConnections.filter(it => it.connectionState === 'connected')) {
data.push(Array.from(await connection.getStats()));
}

window.postMessage({
source: "StadiaPlusNetworkMonitor",
stats: data
}, "*");
}
}

window.StadiaPlusNetworkMonitor = new StadiaPlusNetworkMonitor();
186 changes: 186 additions & 0 deletions modules/main/src/RTCStatistics.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
export namespace RTCStatistics {
export interface RTCStatistic {
type: 'audio' | 'certificate' | 'codec'
| 'data-channel' | 'candidate-pair' | 'inbound-rtp'
| 'outbound-rtp' | 'track' | 'remote-candidate'
| 'local-candidate' | 'stream' | 'transport'
id: string
timestamp: number
}

export interface RTCPeerConnection extends RTCStatistic {
dataChannelsClosed: number,
dataChannelsOpened: number,
}

export interface RTCAudioSource extends RTCStatistic {
audioLevel: number
totalAudioEnergy: number
totalSamplesDuration: number
kind: 'audio' | 'video'
trackIdentifier: string
}

export interface RTCCertificate extends RTCStatistic {
base64Certificate: string
fingerprint: string
fingerprintAlgorithm: string
}

export interface RTCCodec extends RTCStatistic {
direction: 'inbound' | 'outbound'
channels: number
clockRate: number
mimeType: 'audio/opus'
payloadType: number
sdpFmtpLine: string
}

export interface RTCDataChannel extends RTCStatistic {
bytesReceived: number
bytesSent: number
dataChannelIdentifier: number
label: 'streamer_data_channel'
messagesReceived: number
messagesSent: number
protocol: string
state: 'open' | 'closed'
}

export interface RTCIceCandidatePair extends RTCStatistic {
availableOutgoingBitrate: number
bytesReceived: number
bytesSent: number
consentRequestsSent: 7
currentRoundTripTime: number
localCandidateId: string
nominated: boolean
priority: number
remoteCandidateId: string
requestsReceived: number
requestsSent: number
responsesReceived: number
responsesSent: number
state: 'succeeded'
totalRoundTripTime: number
transportId: string
}

export interface RTCIceCandidate extends RTCStatistic {
candidateType: 'host' | 'client'
deleted: boolean
ip: string
isRemote: boolean
port: number
priority: number
protocol: 'tcp' | 'udp'
transportId: string
}

export interface RTCGenericRTPStream extends RTCStatistic {
direction: 'inbound' | 'outbound'
bytesSent?: number
bytesReceived?: number
codecId: string
headerBytesSent?: number
headerBytesReceived?: number
isRemote: boolean
kind: 'audio' | 'video'
lastPacketReceivedTimestamp: number
mediaType: 'audio' | 'video'
packetsSent?: number
packetsReceived?: number
packetsLost?: number
retransmittedBytesSent?: number
retransmittedPacketsSent?: number
ssrc: number
trackId?: string
transportId: string
mediaSourceId?: string
}

export interface RTCAudioRTPStream extends RTCGenericRTPStream {
audioLevel: number
concealedSamples: number
concealmentEvents: number
fecPacketsDiscarded: number
fecPacketsReceived: number
insertedSamplesForDeceleration: number
jitter: number
jitterBufferDelay: number
jitterBufferEmittedCount: number
removedSamplesForAcceleration: number
silentConcealedSamples: number
totalAudioEnergy: number
totalSamplesDuration: number
totalSamplesReceived: number
}

export interface RTCVideoRTPStream extends RTCGenericRTPStream {
decoderImplementation: 'ExternalDecoder' | 'libvpx'
firCount: number
frameHeight: number
frameWidth: number
framesDecoded: number
framesDropped: number
framesPerSecond: number
framesReceived: number
keyFramesDecoded: number
nackCount: number
pliCount: number
totalDecodeTime: number
totalInterFrameDelay: number
totalSquaredInterFrameDelay: number
trackId: string
}

export interface RTCMediaStreamTrack extends RTCStatistic {
role: 'sender' | 'receiver'
detached: boolean
ended: boolean
jitterBufferDelay: number
jitterBufferEmittedCount: number
kind: 'audio' | 'video'
remoteSource: boolean
trackIdentifier: string
mediaSourceId?: string

// Audio Data
audioLevel?: number
concealedSamples?: number
concealmentEvents?: number
insertedSamplesForDeceleration?: number
removedSamplesForAcceleration?: number
silentConcealedSamples?: number
totalAudioEnergy?: number
totalSamplesDuration?: number
totalSamplesReceived?: number

// VideoData
frameHeight?: number
frameWidth?: number
framesDecoded?: number
framesDropped?: number
framesReceived?: number
}

export interface RTCMediaStream extends RTCStatistic {
streamIdentifier: 'stream_label' | string
trackIds: string[]
}

export interface RTCTransport extends RTCStatistic {
bytesReceived: number
bytesSent: number
dtlsCipler: string
dtlsState: string
localCertificateId: string
packetsReceived: number
packetsSent: number
remoteCertificateId: string
selectedCandidatePairChanges: number
selectedCandidatePairId: string
srtpCipher: string
tlsVersion: string
}
}
7 changes: 7 additions & 0 deletions modules/main/src/Util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,11 @@ export default class Util {

if (newRenderer != null) this.renderer = newRenderer;
}

static desandbox(javascript: string) {
const script = document.createElement('script');
script.innerHTML = javascript;
document.body.appendChild(script);
script.remove();
}
}
Loading

0 comments on commit 0ae9ec4

Please sign in to comment.