Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/peermetrics/webrtc-stats
Helps you collect stats for peer connections
https://github.com/peermetrics/webrtc-stats
webrtc webrtc-stats webrtc-tools
Last synced: 2 days ago
JSON representation
Helps you collect stats for peer connections
- Host: GitHub
- URL: https://github.com/peermetrics/webrtc-stats
- Owner: peermetrics
- License: mit
- Created: 2019-04-10T06:52:15.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-10-09T08:06:32.000Z (3 months ago)
- Last Synced: 2024-10-30T08:54:11.570Z (2 months ago)
- Topics: webrtc, webrtc-stats, webrtc-tools
- Language: TypeScript
- Homepage: https://peermetrics.io
- Size: 516 KB
- Stars: 68
- Watchers: 5
- Forks: 13
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-webrtc - WebRTCStats - Helps you collect stats for peer connections. (Libraries / JavaScript)
README
# WebRTCStats
WebRTCStats is the most complete utility belt that helps with everything related to getting and parsing the stats for WebRTC `PeerConnection`s.
The main advantage of WebRTCStats is that it parses and groups the stats from `PeerConnection`s and offers them in a easy to read way
On top of that, it offers the `timeline` which is a list of all the events fired while setting up a `PeerConnection`. Optionally, you can also wrap `getUserMedia` to get a better picture.
WebRTCStats extends `EventEmitter` and uses the same event system to communicate with the rest of the app.
## Install
```sh
npm install @peermetrics/webrtc-stats
```## Usage
### Loading the module
WebRTC Stats can be loaded as an ES6 module, node module or directly in the browser.After loading, the library needs to be initialized. *See [Options](#options) for all the initialize options*
```js
import {WebRTCStats} from '@peermetrics/webrtc-stats'let webrtcStats = new WebRTCStats({
getStatsInterval: 5000
})
```
Add event listeners for `stats`:
```js
webrtcStats.on('stats', (ev) => {
console.log('stats', ev)
})
```
Use `addConnection` to add connections to the list of monitored peers:
```js
let pc1 = new RTCPeerConnection({...})
webrtcStats.addConnection({
pc: pc1, // RTCPeerConnection instance
peerId: '1', // any string that helps you identify this peer,
connectionId: '06d54adc-e478-4f95-9144-bbb3562a2aad', // optional, an id that you can use to keep track of this connection
remote: false // optional, override the global remote flag
})
```
Now every `5000` ms WebRTCStats will fire the `stats` event which will come with the object:
```js
{
event: 'stats',
tag: 'stats',
peerId: '1',
timestamp: 'Sun Mar 22 2020 18:02:02', // a timestamp when this was fired
data: {...}, // an object created after parsing the stats
timeTaken: 5, // how many ms the .getStats() call took
rawStats: RTCStatsReport, // the actual RTCStatsReport results from `getStats()`
statsObject: {}, // an object created from RTCStatsReport that uses the `id` for each report as a key
filteredStats: {}, // same as statsObject but with some report types filtered out (eg: `codec`, `certificate`)
}
```### Options
The module accepts the following options when initialized:
```js
let stats = new WebRTCStats({
// the interval in ms of how often we should get stats
getStatsInterval: 5000, // Default: 1000// if we should include the original RTCStatsReport map when firing the `stats` event
rawStats: false, // Default: false// include an object that resulted from transforming RTCStatsReport into an oject (`report.id` as the key)
statsObject: true, // Default: false
// if we should filter out some stats
filteredStats: false, // Default: false// If the data object should contain a remote attribute that will contain stats for the remote peer, from `remote-inbound-rtp`, etc
remote: true, // Default: true// If we should wrap the `geUserMedia` calls so we can gather events when the methods is called or success/error
wrapGetUserMedia: false, // Default: false
// If we should log messages
debug: false, // Default: false
// What kind of level of logs the lib should display. Values: 'none', 'error', 'warn', 'info', 'debug'
logLevel: 'warn' // Default: 'none'
})
```### API
#### `.addConnection(options)`
Adds a connection to the watch list.
`options`- `pc`: the `RTCPeerConnection` instance
- `peerId`: String a unique Id to identify this peer
Monitoring of a peer will automatically end when the connection is closed.
- `connectionId`: optional, string. A way to identify this connection. If a `connectionId` is not offered, the lib will assign a random oneReturns:
```js
{
connectionId: '', // the ID assigned to this connection
}
```#### `.removeConnection(options)`
Removes the `RTCPeerConnection` from the list of watched connections for that peer.
`options` object:
- `peerId`: the peer id for which we want to remove the connection
- `pc`: The `RTCPeerConnection` instance we want to remove
or
- `connectionId`: the id of the connection (the one returned when calling `.addConnection()`)
#### `.removePeer(peerId)`
Stop listening for events/stats on all connections for this peer
#### `.removeAllPeers()`
Used to stop listening to all the peers and connections added.
#### `.getTimeline([filter])`
Return the array of events from the timeline up to that point.
If the optional `filter` string is present it will filter out events. Possible values: `peer`, `connection`, `track`, `stats`, `getUserMedia`#### `.destroy()`
Stop listening to all event listeners and reset the state of the instance. Useful for cleanup.
A new instance of `WebRTCStats` should be used if you would like to start monitoring again.
#### `.clearTimeline()`
Clears the internal timeline array.
### Events
The module uses `EventEmitter` to emit events. You can listen to them using `.on()`
```js
stats.on('eventName', (ev) => {
})
```
`ev` will have the following structure:```js
{
// The event name. Usually the method called (addTrack, createAnswer)
event: '',
// The tag for this event. `stats`, `sdp`, `getUserMedia`, etc
tag: '',
// The id for the peer that fired this event
peerId: '',
// A timestamp for when the event happened
timestamp: '',
// Data for each event type
data: {},
// The following attrs appear at certain times
// The error that appeared in the method we were watching
error: {},
// These appear on the `stats` event
rawStats: {},
statsObject: {},
filteredStats: {}
}
```#### List of fired events
The tags for the events fired by `WebRTCStats` are:
- `timeline`: this will fire when something has been added to the timeline. This event is a duplicate of the following events
- `stats`: fired for each peer when we've collected stats for it
- `getUserMedia`: when `getUserMedia` is called initially
- `peer`: when a peer was added
- `track`: a track event: addTrack, removeTrack, mute, unmute, overconstrained
- `connection`: any event related to connection
- `datachannel`: any datachannel event## Developed by
[](https://peermetrics.io/)
## License
MIT