API & Config
# Create instance
# var engine = new P2PEngineShaka(player, {p2pConfig: [opts]});
Create a new P2PEngineShaka instance, player is an instance of Shaka Player .
If opts is specified, then the default options (shown below) will be overridden.
Field | Type | Default | Description |
---|---|---|---|
logLevel | string|boolean | 'error' | Print log level(warn, error, none,false=none, true=warn). |
wsSignalerAddr | string | 'wss://signal.cdnbye.com' | The address of signal server. |
announce | string | 'https://tracker.cdnbye.com/v1' | The address of tracker server. |
memoryCacheLimit | Object | {"pc": 1024 * 1024 * 512, "mobile": 1024 * 1024 * 256} | The max size of binary data that can be stored in the cache. |
p2pEnabled | boolean | true | Enable or disable p2p engine. |
wifiOnly | boolean | false | Only allow uploading on Wi-Fi and Ethernet. |
dcDownloadTimeout | number | 25 | Max download timeout for WebRTC datachannel. |
webRTCConfig | Object | {} | A Configuration dictionary providing options to configure WebRTC connections. |
useHttpRange | boolean | false | Use HTTP ranges requests where it is possible. Allows to continue (and not start over) aborted P2P downloads over HTTP(True in live mode by default). |
channelIdPrefix | string | '' | Required while using customized channelId(5 <= length <= 15), recommended to set it as the unique identifier of your organization. |
# P2PEngineShaka API
# P2PEngineShaka.version (static)
Get the version of P2PEngineShaka.
# P2PEngineShaka.protocolVersion (static)
Get the version of P2P protocol.
# P2PEngineShaka.isSupported() (static method)
Returns true if WebRTC data channel is supported by the browser.
# engine.enableP2P()
Resume P2P if it has been stopped.
# engine.disableP2P()
Disable engine to stop p2p and free used resources.
# engine.destroy()
Stop p2p and free used resources.
# P2PEngineShaka Events
# engine.on('peerId', function (peerId) {})
Emitted when the peer Id of this client is obtained from server.
# engine.on('peers', function (peers) {})
Emitted when successfully connected with new peer.
# engine.on('stats', function (stats) {})
Emitted when data is downloaded/uploaded.
stats.totalHTTPDownloaded: total data downloaded by HTTP(KB).
stats.totalP2PDownloaded: total data downloaded by P2P(KB).
stats.totalP2PUploaded: total data uploaded by P2P(KB).
stats.p2pDownloadSpeed: p2p download speed(KB/s).
# engine.on('serverConnected', function (connected) {})
Emitted when websocket is opened/closed.
# engine.on('exception', function (e) {})
Emitted when exception occured.
e.code: Exception identifier(TRACKER_EXPT SIGNAL_EXPT)
e.message: Exception message
e.stack: Exception stack
# Get p2p information from p2pConfig
p2pConfig: {
getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded, p2pDownloadSpeed) {
// get the downloading statistics
},
getPeerId: function (peerId) {
// get peer Id
},
getPeersInfo: function (peers) {
// get peers information
}
}
# Advanced Usage
# Dynamic m3u8/mpd path issue
Some m3u8/mpd urls play the same live/vod but have different paths on them. For example, example.com/clientId1/streamId.mpd and example.com/clientId2/streamId.mpd. In this case, you can format a common channelId for them.
// Set channelIdPrefix in p2pConfig before setting channelId!
p2pConfig: {
channelIdPrefix: YOUR_UNIQUE_ID,
channelId: function (mpdUrl) {
const videoId = extractVideoIdFromUrl(mpdUrl); // make a channelId by removing the different part which is defined by yourself
return videoId;
}
}
# Dynamic segment path issue
Like dynamic mpd path issue, you should format a common segmentId for the same segment file. You can override the segment ID like this:
p2pConfig: {
/*
segmentUrl: The url of segment
range: bytes range of segmentUrl
*/
segmentId: function (segmentUrl, range) {
const segId = extractSegmentIdFromUrl(segmentUrl, range);
return segId;
}
}
# Config STUN Servers
p2pConfig: {
webRTCConfig: {
config: { // custom webrtc configuration (used by RTCPeerConnection constructor)
iceServers: [
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'stun:global.stun.twilio.com:3478?transport=udp' }
]
}
}
}
# Allow Http Range Request
If http range request is activated, we are able to get chunks of data from peer and then complete the segments by getting other chunks from the CDN, thus, reducing your CDN bandwidth. Besides, the code below is needed:
p2pConfig: {
useHttpRange: true,
}