Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var currentCryptoKey = null;//e2e
- var currentKeyIdentifier = 0;//e2e
- var mysecretkey = "videoroom";
- //e2e functions
- var senderTransforms = {}, receiverTransforms = {};
- for(var m of ["audio", "video"]) {
- senderTransforms[m] = new TransformStream({
- start() {
- // Called on startup.
- console.log("[Sender transform)] Startup");
- },
- transform(chunk, controller) {
- // Copy of the above mentioned demo's encodeFunction()
- const view = new DataView(chunk.data);
- const newData = new ArrayBuffer(chunk.data.byteLength + 5);
- const newView = new DataView(newData);
- for(let i=0; i<10; ++i) {
- newView.setInt8(i, view.getInt8(i));
- }
- // This is a bitwise xor of the key with the payload. This is not strong encryption, just a demo.
- for(let i=10; i<chunk.data.byteLength; ++i) {
- const keyByte = currentCryptoKey.charCodeAt(i % currentCryptoKey.length);
- newView.setInt8(i, view.getInt8(i) ^ keyByte);
- }
- newView.setUint8(chunk.data.byteLength, currentKeyIdentifier % 0xff);
- newView.setUint32(chunk.data.byteLength + 1, 0xDEADBEEF);
- chunk.data = newData;
- controller.enqueue(chunk);
- },
- flush() {
- // Called when the stream is about to be closed
- console.log("[Sender transform] Closing");
- }
- });
- receiverTransforms[m] = new TransformStream({
- start() {
- // Called on startup.
- console.log("[Receiver transform] Startup");
- },
- transform(chunk, controller) {
- // Copy of the above mentioned demo's decodeFunction()
- const view = new DataView(chunk.data);
- const checksum = view.getUint32(chunk.data.byteLength - 4);
- if(checksum !== 0xDEADBEEF) {
- console.log('Corrupted frame received');
- console.log(checksum.toString(16));
- return;
- }
- const keyIdentifier = view.getUint8(chunk.data.byteLength - 5);
- if(keyIdentifier !== currentKeyIdentifier) {
- console.log(`Key identifier mismatch, got ${keyIdentifier} expected ${currentKeyIdentifier}.`);
- return;
- }
- const newData = new ArrayBuffer(chunk.data.byteLength - 5);
- const newView = new DataView(newData);
- for(let i=0; i<10; ++i) {
- newView.setInt8(i, view.getInt8(i));
- }
- for(let i=10; i<chunk.data.byteLength - 5; ++i) {
- const keyByte = currentCryptoKey.charCodeAt(i % currentCryptoKey.length);
- newView.setInt8(i, view.getInt8(i) ^ keyByte);
- }
- chunk.data = newData;
- controller.enqueue(chunk);
- },
- flush() {
- // Called when the stream is about to be closed
- console.log("[Receiver transform] Closing");
- }
- });
- }
- function publishLocalFeed(audio, video) {
- return function (dispatch, getState) {
- .....
- // Publish our stream
- return new Promise(function (resolve, reject) {
- // Take note of the secret - e2e
- currentCryptoKey = mysecretkey;
- //currentKeyIdentifier++;
- currentKeyIdentifier=1;
- videoRoomLocal.createOffer({
- media: {
- audioRecv: false,
- videoRecv: false,
- audioSend: !!audio,
- videoSend: !!video,
- audio: audio,
- video: video,
- //data: dataSupport,
- }, // Publishers are sendonly
- senderTransforms: senderTransforms,
- receiverTransforms: receiverTransforms,
- .....
- // A new feed has been published, create a new plugin handle and attach to it as a listener
- function attachRemoteFeed(id, user) {
- return function (dispatch, getState) {
- .....
- janus.attach({
- .....
- onmessage: function onmessage(msg, jsep) {
- var event = msg.videoroom;
- if (event) {
- .....
- }
- if (jsep) {
- // Take note of the secret - e2e
- currentCryptoKey = mysecretkey;
- //currentKeyIdentifier++;
- currentKeyIdentifier=1;
- // Answer and attach
- feed.plugin.createAnswer({
- jsep: jsep,
- // We want recvonly audio/video
- media: { audioSend: false, videoSend: false },
- // Since we want to use Insertable Streams, - e2e
- // we specify the transform functions to use
- senderTransforms: senderTransforms,
- receiverTransforms: receiverTransforms,
- .....
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement