Back to Rrweb

rrweb canvas webrtc plugin

packages/plugins/rrweb-plugin-canvas-webrtc-replay/Readme.md

1.0.212.8 KB
Original Source

rrweb canvas webrtc plugin

Plugin that live streams contents of canvas elements via webrtc

Example of live streaming via yarn live-stream

https://user-images.githubusercontent.com/4106/186701616-fd71a107-5d53-423c-ba09-0395a3a0252f.mov

Instructions

Record side

js
// 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

js
// 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

More info

https://github.com/rrweb-io/rrweb/pull/976

Sponsors

Become a sponsor and get your logo on our README on Github with a link to your site.

Gold Sponsors 🥇

<div dir="auto">

<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>

Silver Sponsors 🥈

<div dir="auto">

<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>

Bronze Sponsors 🥉

<div dir="auto">

<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>

Backers

<a href="https://opencollective.com/rrweb#sponsor" rel="nofollow"></a>

Core Team Members

<table> <tr> <td align="center"> <a href="https://github.com/Yuyz0112">

<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>

Who's using rrweb?

<table> <tr> <td align="center"> <a href="http://www.smartx.com/" target="_blank">
  </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>
</tr> <tr> <td align="center"> <a href="https://cux.io" target="_blank">
  </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>
</tr> <tr> <td align="center"> <a href="https://requestly.io" target="_blank">
  </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>
</tr> </table>