packages/plugins/rrweb-plugin-canvas-webrtc-replay/Readme.md
Plugin that live streams contents of canvas elements via webrtc
yarn live-streamhttps://user-images.githubusercontent.com/4106/186701616-fd71a107-5d53-423c-ba09-0395a3a0252f.mov
// Record side
import { record } from '@rrweb/record';
import { RRWebPluginCanvasWebRTCRecord } from '@rrweb/rrweb-plugin-canvas-webrtc-record';
const webRTCRecordPlugin = new RRWebPluginCanvasWebRTCRecord({
signalSendCallback: (msg) => {
// provides webrtc sdp offer signal & connect message
// make sure you send this to the replayer's `webRTCReplayPlugin.signalReceive(signal)`
sendSignalToReplayer(msg); // example of function that sends the signal to the replayer
},
});
record({
emit: (event) => {
// send these events to the `replayer.addEvent(event)`, how you do that is up to you
// you can send them to a server for example which can then send them to the replayer
sendEventToReplayer(event); // example of function that sends the event to the replayer
},
plugins: [
// add the plugin to the list of plugins, and initialize it via `.initPlugin()`
webRTCRecordPlugin.initPlugin(),
],
recordCanvas: false, // we don't want canvas recording turned on, we're going to do that via the plugin
});
// Replay side
import { Replayer } from '@rrweb/replay';
import { RRWebPluginCanvasWebRTCReplay } from '@rrweb/rrweb-plugin-canvas-webrtc-replay';
const webRTCReplayPlugin = new RRWebPluginCanvasWebRTCReplay({
canvasFoundCallback(canvas, context) {
console.log('canvas', canvas);
// send the canvas id to `webRTCRecordPlugin.setupStream(id)`, how you do that is up to you
// you can send them to a server for example which can then send them to the replayer
sendCanvasIdToRecordScript(context.id); // example of function that sends the id to the record script
},
signalSendCallback(signal) {
// provides webrtc sdp offer signal & connect message
// make sure you send this to the record script's `webRTCRecordPlugin.signalReceive(signal)`
sendSignalToRecordScript(signal); // example of function that sends the signal to the record script
},
});
const replayer = new Replayer([], {
UNSAFE_replayCanvas: true, // turn canvas replay on!
liveMode: true, // live mode is needed to stream events to the replayer
plugins: [webRTCReplayPlugin.initPlugin()],
});
replayer.startLive(); // start the replayer in live mode
replayer.addEvent(event); // call this whenever an event is received from the record script
https://github.com/rrweb-io/rrweb/pull/976
Become a sponsor and get your logo on our README on Github with a link to your site.
<a href="https://opencollective.com/rrweb/tiers/gold-sponsor/0/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/gold-sponsor/1/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/gold-sponsor/2/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/gold-sponsor/3/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/gold-sponsor/4/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/gold-sponsor/5/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/gold-sponsor/6/website?requireActive=false" target="_blank"></a>
</div><a href="https://opencollective.com/rrweb/tiers/silver-sponsor/0/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/silver-sponsor/1/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/silver-sponsor/2/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/silver-sponsor/3/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/silver-sponsor/4/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/silver-sponsor/5/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/silver-sponsor/6/website?requireActive=false" target="_blank"></a>
</div><a href="https://opencollective.com/rrweb/tiers/sponsors/0/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/1/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/2/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/3/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/4/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/5/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/6/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/7/website?requireActive=false" target="_blank"></a> <a href="https://opencollective.com/rrweb/tiers/sponsors/8/website?requireActive=false" target="_blank"></a>
</div><a href="https://opencollective.com/rrweb#sponsor" rel="nofollow"></a>
<sub><b>Yuyz0112</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/YunFeng0817">
<sub><b>Yun Feng</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/eoghanmurray">
<sub><b>eoghanmurray</b></sub>
</a>
</td>
<td align="center">
<a href="https://github.com/Juice10">
<sub><b>Juice10</b></sub>
<sub>open for rrweb consulting</sub> </a> </td>
</tr> </table> </a>
</td>
<td align="center">
<a href="https://posthog.com?utm_source=rrweb&utm_medium=sponsorship&utm_campaign=open-source-sponsorship" target="_blank">
</a>
</td>
<td align="center">
<a href="https://statcounter.com/session-replay/" target="_blank">
</a>
</td>
<td align="center">
<a href="https://recordonce.com/" target="_blank">
</a>
</td>
</a>
</td>
<td align="center">
<a href="https://remsupp.com" target="_blank">
</a>
</td>
<td align="center">
<a href="https://highlight.io" target="_blank">
</a>
</td>
<td align="center">
<a href="https://analyzee.io" target="_blank">
</a>
</td>
</a>
</td>
<td align="center">
<a href="https://gleap.io" target="_blank">
</a>
</td>
<td align="center">
<a href="https://uxwizz.com" target="_blank">
</a>
</td>
<td align="center">
<a href="https://www.howdygo.com" target="_blank">
</a>
</td>