@whereby.com/browser-sdk 2.0.0-beta2 → 2.0.0-beta4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -19
- package/dist/embed/index.d.ts +21 -4
- package/dist/embed/index.esm.js +156 -0
- package/dist/react/index.d.ts +829 -6
- package/dist/react/index.esm.js +8806 -0
- package/dist/utils/index.d.ts +5 -2
- package/dist/utils/{fakeWebcamFrame.js → index.esm.js} +68 -47
- package/dist/v2-beta4.js +16 -0
- package/package.json +26 -12
- package/dist/LocalMedia.d.ts +0 -70
- package/dist/LocalMedia.js +0 -208
- package/dist/RoomConnection.d.ts +0 -190
- package/dist/RoomConnection.js +0 -646
- package/dist/RoomParticipant.d.ts +0 -50
- package/dist/RoomParticipant.js +0 -48
- package/dist/api/ApiClient.d.ts +0 -26
- package/dist/api/ApiClient.js +0 -61
- package/dist/api/Credentials.d.ts +0 -17
- package/dist/api/Credentials.js +0 -16
- package/dist/api/HttpClient.d.ts +0 -16
- package/dist/api/HttpClient.js +0 -52
- package/dist/api/MultipartHttpClient.d.ts +0 -10
- package/dist/api/MultipartHttpClient.js +0 -25
- package/dist/api/OrganizationApiClient.d.ts +0 -16
- package/dist/api/OrganizationApiClient.js +0 -28
- package/dist/api/Response.d.ts +0 -29
- package/dist/api/Response.js +0 -9
- package/dist/api/credentialsService/index.d.ts +0 -27
- package/dist/api/credentialsService/index.js +0 -89
- package/dist/api/deviceService/index.d.ts +0 -9
- package/dist/api/deviceService/index.js +0 -23
- package/dist/api/extractUtils.d.ts +0 -16
- package/dist/api/extractUtils.js +0 -51
- package/dist/api/index.d.ts +0 -7
- package/dist/api/index.js +0 -7
- package/dist/api/localStorageWrapper/index.d.ts +0 -2
- package/dist/api/localStorageWrapper/index.js +0 -15
- package/dist/api/models/Account.d.ts +0 -20
- package/dist/api/models/Account.js +0 -24
- package/dist/api/models/Meeting.d.ts +0 -12
- package/dist/api/models/Meeting.js +0 -29
- package/dist/api/models/Organization.d.ts +0 -102
- package/dist/api/models/Organization.js +0 -81
- package/dist/api/models/Room.d.ts +0 -4
- package/dist/api/models/Room.js +0 -38
- package/dist/api/models/account/EmbeddedFreeTierStatus.d.ts +0 -13
- package/dist/api/models/account/EmbeddedFreeTierStatus.js +0 -17
- package/dist/api/modules/AbstractStore.d.ts +0 -5
- package/dist/api/modules/AbstractStore.js +0 -1
- package/dist/api/modules/ChromeStorageStore.d.ts +0 -10
- package/dist/api/modules/ChromeStorageStore.js +0 -21
- package/dist/api/modules/LocalStorageStore.d.ts +0 -9
- package/dist/api/modules/LocalStorageStore.js +0 -35
- package/dist/api/modules/tests/__mocks__/storage.d.ts +0 -10
- package/dist/api/modules/tests/__mocks__/storage.js +0 -19
- package/dist/api/organizationService/index.d.ts +0 -46
- package/dist/api/organizationService/index.js +0 -158
- package/dist/api/organizationServiceCache/index.d.ts +0 -13
- package/dist/api/organizationServiceCache/index.js +0 -16
- package/dist/api/parameterAssertUtils.d.ts +0 -13
- package/dist/api/parameterAssertUtils.js +0 -64
- package/dist/api/roomService/index.d.ts +0 -54
- package/dist/api/roomService/index.js +0 -160
- package/dist/api/test/helpers.d.ts +0 -7
- package/dist/api/test/helpers.js +0 -32
- package/dist/api/types.d.ts +0 -5
- package/dist/api/types.js +0 -1
- package/dist/embed/index.js +0 -124
- package/dist/react/VideoView.d.ts +0 -15
- package/dist/react/VideoView.js +0 -37
- package/dist/react/index.js +0 -4
- package/dist/react/useLocalMedia.d.ts +0 -29
- package/dist/react/useLocalMedia.js +0 -109
- package/dist/react/useRoomConnection.d.ts +0 -57
- package/dist/react/useRoomConnection.js +0 -340
- package/dist/utils/debounce.d.ts +0 -9
- package/dist/utils/debounce.js +0 -18
- package/dist/utils/fakeAudioStream.d.ts +0 -1
- package/dist/utils/fakeAudioStream.js +0 -18
- package/dist/utils/fakeWebcamFrame.d.ts +0 -1
- package/dist/utils/index.js +0 -2
- package/dist/v2-beta2.js +0 -2000
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -1
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
declare function fakeAudioStream(): MediaStream;
|
|
2
|
+
|
|
3
|
+
declare function fakeWebcamFrame(canvas: HTMLCanvasElement): void;
|
|
4
|
+
|
|
5
|
+
export { fakeAudioStream, fakeWebcamFrame };
|
|
@@ -1,49 +1,70 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const colors = ["red", "orange", "yellow", "green", "blue", "purple"];
|
|
19
|
-
for (let i = 0; i < numSlices; i++) {
|
|
20
|
-
context.beginPath();
|
|
21
|
-
context.moveTo(0, 0);
|
|
22
|
-
context.arc(0, 0, wheelRadius, i * sliceAngle, (i + 1) * sliceAngle);
|
|
23
|
-
context.fillStyle = colors[i % colors.length];
|
|
24
|
-
context.fill();
|
|
25
|
-
context.closePath();
|
|
26
|
-
}
|
|
27
|
-
context.restore();
|
|
28
|
-
context.fillStyle = "white";
|
|
29
|
-
context.font = "42px Arial";
|
|
30
|
-
const topText = "Whereby Media Stream";
|
|
31
|
-
const topTextWidth = context.measureText(topText).width;
|
|
32
|
-
context.fillText(topText, canvas.width / 2 - topTextWidth / 2, 50);
|
|
33
|
-
context.font = "32px Arial";
|
|
34
|
-
const now = new Date();
|
|
35
|
-
const timeText = `time: ${now.getHours().toString().padStart(2, "0")}:${now
|
|
36
|
-
.getMinutes()
|
|
37
|
-
.toString()
|
|
38
|
-
.padStart(2, "0")}:${now.getSeconds().toString().padStart(2, "0")}.${now
|
|
39
|
-
.getMilliseconds()
|
|
40
|
-
.toString()
|
|
41
|
-
.padStart(3, "0")}`;
|
|
42
|
-
context.fillText(timeText, 10, canvas.height - 20);
|
|
43
|
-
context.fillText(`rotation angle: ${rotationAngle.toFixed(2)}`, canvas.width - canvas.width / 2, canvas.height - 20);
|
|
44
|
-
rotationAngle += 0.01;
|
|
1
|
+
function fakeAudioStream() {
|
|
2
|
+
const audioCtx = new AudioContext();
|
|
3
|
+
const oscillator = audioCtx.createOscillator();
|
|
4
|
+
const destination = audioCtx.createMediaStreamDestination();
|
|
5
|
+
oscillator.connect(destination);
|
|
6
|
+
oscillator.frequency.value = 400;
|
|
7
|
+
oscillator.type = "sine";
|
|
8
|
+
setInterval(() => {
|
|
9
|
+
if (oscillator.frequency.value <= 900) {
|
|
10
|
+
oscillator.frequency.value += 10;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
oscillator.frequency.value = 200;
|
|
14
|
+
}
|
|
15
|
+
}, 20);
|
|
16
|
+
oscillator.start();
|
|
17
|
+
return destination.stream;
|
|
45
18
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
19
|
+
|
|
20
|
+
let rotationAngle = 0;
|
|
21
|
+
function drawWebcamFrame(canvas) {
|
|
22
|
+
const context = canvas.getContext("2d");
|
|
23
|
+
if (!context) {
|
|
24
|
+
console.error("Canvas context not available");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const wheelRadius = 100;
|
|
28
|
+
const wheelCenterX = canvas.width / 2;
|
|
29
|
+
const wheelCenterY = canvas.height / 2;
|
|
30
|
+
context.fillStyle = "darkgreen";
|
|
31
|
+
context.fillRect(0, 0, canvas.width, canvas.height);
|
|
32
|
+
context.save();
|
|
33
|
+
context.translate(wheelCenterX, wheelCenterY);
|
|
34
|
+
context.rotate(rotationAngle);
|
|
35
|
+
const numSlices = 12;
|
|
36
|
+
const sliceAngle = (2 * Math.PI) / numSlices;
|
|
37
|
+
const colors = ["red", "orange", "yellow", "green", "blue", "purple"];
|
|
38
|
+
for (let i = 0; i < numSlices; i++) {
|
|
39
|
+
context.beginPath();
|
|
40
|
+
context.moveTo(0, 0);
|
|
41
|
+
context.arc(0, 0, wheelRadius, i * sliceAngle, (i + 1) * sliceAngle);
|
|
42
|
+
context.fillStyle = colors[i % colors.length];
|
|
43
|
+
context.fill();
|
|
44
|
+
context.closePath();
|
|
45
|
+
}
|
|
46
|
+
context.restore();
|
|
47
|
+
context.fillStyle = "white";
|
|
48
|
+
context.font = "42px Arial";
|
|
49
|
+
const topText = "Whereby Media Stream";
|
|
50
|
+
const topTextWidth = context.measureText(topText).width;
|
|
51
|
+
context.fillText(topText, canvas.width / 2 - topTextWidth / 2, 50);
|
|
52
|
+
context.font = "32px Arial";
|
|
53
|
+
const now = new Date();
|
|
54
|
+
const timeText = `time: ${now.getHours().toString().padStart(2, "0")}:${now
|
|
55
|
+
.getMinutes()
|
|
56
|
+
.toString()
|
|
57
|
+
.padStart(2, "0")}:${now.getSeconds().toString().padStart(2, "0")}.${now
|
|
58
|
+
.getMilliseconds()
|
|
59
|
+
.toString()
|
|
60
|
+
.padStart(3, "0")}`;
|
|
61
|
+
context.fillText(timeText, 10, canvas.height - 20);
|
|
62
|
+
context.fillText(`rotation angle: ${rotationAngle.toFixed(2)}`, canvas.width - canvas.width / 2, canvas.height - 20);
|
|
63
|
+
rotationAngle += 0.01;
|
|
64
|
+
}
|
|
65
|
+
function fakeWebcamFrame(canvas) {
|
|
66
|
+
drawWebcamFrame(canvas);
|
|
67
|
+
requestAnimationFrame(() => fakeWebcamFrame(canvas));
|
|
49
68
|
}
|
|
69
|
+
|
|
70
|
+
export { fakeAudioStream, fakeWebcamFrame };
|
package/dist/v2-beta4.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*! (c) Andrea Giammarchi - ISC */
|
|
2
|
+
var e={};try{e.WeakMap=WeakMap}catch(t){e.WeakMap=function(e,t){var n=t.defineProperty,r=t.hasOwnProperty,s=o.prototype;return s.delete=function(e){return this.has(e)&&delete e[this._]},s.get=function(e){return this.has(e)?e[this._]:void 0},s.has=function(e){return r.call(e,this._)},s.set=function(e,t){return n(e,this._,{configurable:!0,value:t}),this},o;function o(t){n(this,"_",{value:"_@ungap/weakmap"+e++}),t&&t.forEach(a,this)}function a(e){this.set(e[0],e[1])}}(Math.random(),Object)}var t=e.WeakMap,n={};try{n.Event=new Event(".").constructor}catch(e){try{n.Event=new CustomEvent(".").constructor}catch(e){n.Event=function(e,t){t||(t={});var n=document.createEvent("Event"),r=!!t.bubbles,s=!!t.cancelable;n.initEvent(e,r,s);try{n.bubbles=r,n.cancelable=s}catch(n){}return n}}}var r=n.Event,s={};
|
|
3
|
+
/*! (c) Andrea Giammarchi - ISC */try{s.WeakSet=WeakSet}catch(e){!function(e){var t=new e,n=r.prototype;function r(n){t.set(this,new e),n&&n.forEach(this.add,this)}n.add=function(e){return t.get(this).set(e,1),this},n.delete=function(e){return t.get(this).delete(e)},n.has=function(e){return t.get(this).has(e)},s.WeakSet=r}(WeakMap)}var o,a,i,c=s.WeakSet,l="-"+Math.random().toFixed(6)+"%",u=!1;
|
|
4
|
+
/*! (c) Andrea Giammarchi - ISC */try{o=document.createElement("template"),i="tabindex",(a="content")in o&&(o.innerHTML="<p "+i+'="'+l+'"></p>',o[a].childNodes[0].getAttribute(i)==l)||(l="_dt: "+l.slice(1,-1)+";",u=!0)}catch(e){}var h="\x3c!--"+l+"--\x3e",f=8,d=1,p=3,g=/^(?:plaintext|script|style|textarea|title|xmp)$/i,m=/^(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)$/i;
|
|
5
|
+
/*! (c) Andrea Giammarchi - ISC */
|
|
6
|
+
function v(e){return e.join(h).replace(k,_).replace(x,A)}var b=" \\f\\n\\r\\t",y="[^"+b+"\\/>\"'=]+",w="["+b+"]+"+y,E="<([A-Za-z]+[A-Za-z0-9:._-]*)((?:",C="(?:\\s*=\\s*(?:'[^']*?'|\"[^\"]*?\"|<[^>]*?>|"+y.replace("\\/","")+"))?)",x=new RegExp(E+w+C+"+)(["+b+"]*/?>)","g"),k=new RegExp(E+w+C+"*)(["+b+"]*/>)","g"),N=new RegExp("("+w+"\\s*=\\s*)(['\"]?)"+h+"\\2","gi");function A(e,t,n,r){return"<"+t+n.replace(N,$)+r}function $(e,t,n){return t+(n||'"')+l+(n||'"')}function _(e,t,n){return m.test(t)?e:"<"+t+n+"></"+t+">"}const{isArray:S}=Array,{indexOf:j,slice:O}=[];var L=e=>({get:t=>e.get(t),set:(t,n)=>(e.set(t,n),n)});const M=(e,t)=>111===e.nodeType?1/t<0?t?(({firstChild:e,lastChild:t})=>{const n=document.createRange();return n.setStartAfter(e),n.setEndAfter(t),n.deleteContents(),e})(e):e.lastChild:t?e.valueOf():e.firstChild:e,T=e=>{const{childNodes:t}=e,{length:n}=t;if(n<2)return n?t[0]:e;const r=O.call(t,0);return{ELEMENT_NODE:1,nodeType:111,firstChild:r[0],lastChild:r[n-1],valueOf(){if(t.length!==n){let t=0;for(;t<n;)e.appendChild(r[t++])}return e}}};
|
|
7
|
+
/*! (c) Andrea Giammarchi - ISC */
|
|
8
|
+
var R=function(e){var t="fragment",n="template",r="content"in o(n)?function(e){var t=o(n);return t.innerHTML=e,t.content}:function(e){var r=o(t),a=o(n),i=null;if(/^[^\S]*?<(col(?:group)?|t(?:head|body|foot|r|d|h))/i.test(e)){var c=RegExp.$1;a.innerHTML="<table>"+e+"</table>",i=a.querySelectorAll(c)}else a.innerHTML=e,i=a.childNodes;return s(r,i),r};return function(e,t){return("svg"===t?a:r)(e)};function s(e,t){for(var n=t.length;n--;)e.appendChild(t[0])}function o(n){return n===t?e.createDocumentFragment():e.createElementNS("http://www.w3.org/1999/xhtml",n)}function a(e){var n=o(t),r=o("div");return r.innerHTML='<svg xmlns="http://www.w3.org/2000/svg">'+e+"</svg>",s(n,r.firstChild.childNodes),n}}(document),U=(e,t,n,r,s)=>{const o=n.length;let a=t.length,i=o,c=0,l=0,u=null;for(;c<a||l<i;)if(a===c){const t=i<o?l?r(n[l-1],-0).nextSibling:r(n[i-l],0):s;for(;l<i;)e.insertBefore(r(n[l++],1),t)}else if(i===l)for(;c<a;)u&&u.has(t[c])||e.removeChild(r(t[c],-1)),c++;else if(t[c]===n[l])c++,l++;else if(t[a-1]===n[i-1])a--,i--;else if(t[c]===n[i-1]&&n[l]===t[a-1]){const s=r(t[--a],-1).nextSibling;e.insertBefore(r(n[l++],1),r(t[c++],-1).nextSibling),e.insertBefore(r(n[--i],1),s),t[a]=n[i]}else{if(!u){u=new Map;let e=l;for(;e<i;)u.set(n[e],e++)}if(u.has(t[c])){const s=u.get(t[c]);if(l<s&&s<i){let o=c,h=1;for(;++o<a&&o<i&&u.get(t[o])===s+h;)h++;if(h>s-l){const o=r(t[c],0);for(;l<s;)e.insertBefore(r(n[l++],1),o)}else e.replaceChild(r(n[l++],1),r(t[c++],-1))}else c++}else e.removeChild(r(t[c++],-1))}return n},W=function(e,t,n,r,s){var o=s in e,a=e.createDocumentFragment();return a[t](e[r]("g")),a[t](e[r]("")),(o?e[s](a,!0):a[n](!0)).childNodes.length<2?function e(r,s){for(var o=r[n](),a=r.childNodes||[],i=a.length,c=0;s&&c<i;c++)o[t](e(a[c],s));return o}:o?e[s]:function(e,t){return e[n](!!t)}}(document,"appendChild","cloneNode","createTextNode","importNode"),P="".trim||function(){return String(this).replace(/^\s+|\s+/g,"")},Z=u?function(e,t){var n=t.join(" ");return t.slice.call(e,0).sort((function(e,t){return n.indexOf(e.name)<=n.indexOf(t.name)?-1:1}))}:function(e,t){return t.slice.call(e,0)};function B(e,t){for(var n=t.length,r=0;r<n;)e=e.childNodes[t[r++]];return e}function z(e,t,n,r){for(var s=e.childNodes,o=s.length,a=0;a<o;){var i=s[a];switch(i.nodeType){case d:var c=r.concat(a);D(i,t,n,c),z(i,t,n,c);break;case f:var u=i.textContent;if(u===l)n.shift(),t.push(g.test(e.nodeName)?H(e,r):V(i,r.concat(a)));else switch(u.slice(0,2)){case"/*":if("*/"!==u.slice(-2))break;case"👻":e.removeChild(i),a--,o--}break;case p:g.test(e.nodeName)&&P.call(i.textContent)===h&&(n.shift(),t.push(H(e,r)))}a++}}function D(e,t,n,r){for(var s=e.attributes,o=[],a=[],i=Z(s,n),c=i.length,f=0;f<c;){var d,p=i[f++],g=p.value===l;if(g||1<(d=p.value.split(h)).length){var m=p.name;if(o.indexOf(m)<0){o.push(m);var v=n.shift().replace(g?/^(?:|[\S\s]*?\s)(\S+?)\s*=\s*('|")?$/:new RegExp("^(?:|[\\S\\s]*?\\s)("+m+")\\s*=\\s*('|\")[\\S\\s]*","i"),"$1"),b=s[v]||s[v.toLowerCase()];if(g)t.push(F(b,r,v,null));else{for(var y=d.length-2;y--;)n.shift();t.push(F(b,r,v,d))}}a.push(p)}}f=0;for(var w=(0<(c=a.length)&&u&&!("ownerSVGElement"in e));f<c;){var E=a[f++];w&&(E.value=""),e.removeAttribute(E.name)}var C=e.nodeName;if(/^script$/i.test(C)){var x=document.createElement(C);for(c=s.length,f=0;f<c;)x.setAttributeNode(s[f++].cloneNode(!0));x.textContent=e.textContent,e.parentNode.replaceChild(x,e)}}function V(e,t){return{type:"any",node:e,path:t}}function F(e,t,n,r){return{type:"attr",node:e,path:t,name:n,sparse:r}}function H(e,t){return{type:"text",node:e,path:t}}var I=L(new t);function q(e,t){var n=(e.convert||v)(t),r=e.transform;r&&(n=r(n));var s=R(n,e.type);K(s);var o=[];return z(s,o,t.slice(0),[]),{content:s,updates:function(n){for(var r=[],s=o.length,a=0,i=0;a<s;){var c=o[a++],l=B(n,c.path);switch(c.type){case"any":r.push({fn:e.any(l,[]),sparse:!1});break;case"attr":var u=c.sparse,h=e.attribute(l,c.name,c.node);null===u?r.push({fn:h,sparse:!1}):(i+=u.length-2,r.push({fn:h,sparse:!0,values:u}));break;case"text":r.push({fn:e.text(l),sparse:!1}),l.textContent=""}}return s+=i,function(){var e=arguments.length;if(s!==e-1)throw new Error(e-1+" values instead of "+s+"\n"+t.join("${value}"));for(var o=1,a=1;o<e;){var i=r[o-a];if(i.sparse){var c=i.values,l=c[0],u=1,h=c.length;for(a+=h-2;u<h;)l+=arguments[o++]+c[u++];i.fn(l)}else i.fn(arguments[o++])}return n}}}}var G=[];function J(e){var t=G,n=K;return function(r){return t!==r&&(n=function(e,t){var n=I.get(t)||I.set(t,q(e,t));return n.updates(W.call(document,n.content,!0))}(e,t=r)),n.apply(null,arguments)}}function K(e){for(var t=e.childNodes,n=t.length;n--;){var r=t[n];1!==r.nodeType&&0===P.call(r.textContent).length&&e.removeChild(r)}}
|
|
9
|
+
/*! (c) Andrea Giammarchi - ISC */var Q=function(){var e=/acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i,t=/([^A-Z])([A-Z]+)/g;return function(e,t){return"ownerSVGElement"in e?function(e,t){var n;t?n=t.cloneNode(!0):(e.setAttribute("style","--hyper:style;"),n=e.getAttributeNode("style"));return n.value="",e.setAttributeNode(n),r(n,!0)}(e,t):r(e.style,!1)};function n(e,t,n){return t+"-"+n.toLowerCase()}function r(r,s){var o,a;return function(i){var c,l,u,h;switch(typeof i){case"object":if(i){if("object"===o){if(!s&&a!==i)for(l in a)l in i||(r[l]="")}else s?r.value="":r.cssText="";for(l in c=s?{}:r,i)u="number"!=typeof(h=i[l])||e.test(l)?h:h+"px",!s&&/^--/.test(l)?c.setProperty(l,u):c[l]=u;o="object",s?r.value=function(e){var r,s=[];for(r in e)s.push(r.replace(t,n),":",e[r],";");return s.join("")}(a=c):a=i;break}default:a!=i&&(o="string",a=i,s?r.value=i||"":r.cssText=i||"")}}}}();const X=(e,t)=>{let n,r=!0;const s=document.createAttributeNS(null,t);return t=>{n!==t&&(n=t,null==n?r||(e.removeAttributeNode(s),r=!0):(s.value=t,r&&(e.setAttributeNodeNS(s),r=!1)))}},Y=({dataset:e})=>t=>{for(const n in t){const r=t[n];null==r?delete e[n]:e[n]=r}},ee=(e,t)=>"dataset"===t?Y(e):n=>{e[t]=n},te=/^(?:form|list)$/i,ne=(e,t)=>e.ownerDocument.createTextNode(t);function re(e){return this.type=e,J(this)}function se(e){return e(this)}re.prototype={attribute(e,t,n){const r="svg"===this.type;switch(t){case"class":if(r)return X(e,t);t="className";case"props":return ee(e,t);case"aria":return(e=>t=>{for(const n in t){const r="role"===n?n:`aria-${n}`,s=t[n];null==s?e.removeAttribute(r):e.setAttribute(r,s)}})(e);case"style":return Q(e,n,r);case"ref":return(e=>t=>{"function"==typeof t?t(e):t.current=e})(e);case".dataset":return Y(e);default:return"."===t.slice(0,1)?ee(e,t.slice(1)):"?"===t.slice(0,1)?((e,t,n)=>r=>{n!==!!r&&((n=!!r)?e.setAttribute(t,""):e.removeAttribute(t))})(e,t.slice(1)):"on"===t.slice(0,2)?((e,t)=>{let n,r=t.slice(2);return!(t in e)&&t.toLowerCase()in e&&(r=r.toLowerCase()),t=>{const s=S(t)?t:[t,!1];n!==s[0]&&(n&&e.removeEventListener(r,n,s[1]),(n=s[0])&&e.addEventListener(r,n,s[1]))}})(e,t):!(t in e)||r||te.test(t)?X(e,t):((e,t)=>{let n;return r=>{n!==r&&(n=r,e[t]!==r&&(null==r?(e[t]="",e.removeAttribute(t)):e[t]=r))}})(e,t)}},any(e,t){const{type:n}=this;let r,s=!1;const o=a=>{switch(typeof a){case"string":case"number":case"boolean":s?r!==a&&(r=a,t[0].textContent=a):(s=!0,r=a,t=U(e.parentNode,t,[ne(e,a)],M,e));break;case"function":o(a(e));break;case"object":case"undefined":if(null==a){s=!1,t=U(e.parentNode,t,[],M,e);break}default:if(s=!1,r=a,S(a))if(0===a.length)t.length&&(t=U(e.parentNode,t,[],M,e));else switch(typeof a[0]){case"string":case"number":case"boolean":o(String(a));break;case"function":o(a.map(se,e));break;case"object":S(a[0])&&(a=a.concat.apply([],a));default:t=U(e.parentNode,t,a,M,e)}else"ELEMENT_NODE"in a?t=U(e.parentNode,t,11===a.nodeType?O.call(a.childNodes):[a],M,e):"text"in a?o(String(a.text)):"any"in a?o(a.any):"html"in a?t=U(e.parentNode,t,O.call(R([].concat(a.html).join(""),n).childNodes),M,e):"length"in a&&o(O.call(a))}};return o},text(e){let t;const n=r=>{if(t!==r){t=r;const s=typeof r;"object"===s&&r?"text"in r?n(String(r.text)):"any"in r?n(r.any):"html"in r?n([].concat(r.html).join("")):"length"in r&&n(O.call(r).join("")):"function"===s?n(r(e)):e.textContent=null==r?"":r}};return n}};const{create:oe,freeze:ae,keys:ie}=Object,ce=re.prototype,le=L(new t),ue=e=>({html:fe("html",e),svg:fe("svg",e),render(t,n){const r="function"==typeof n?n():n,s=le.get(t)||le.set(t,he()),o=r instanceof ge?de(e,s,r):r;return o!==s.wire&&(s.wire=o,t.textContent="",t.appendChild(o.valueOf())),t}}),he=()=>({stack:[],entry:null,wire:null}),fe=(e,n)=>{const r=L(new t);return s.for=(e,t)=>{const o=r.get(e)||r.set(e,oe(null));return o[t]||(o[t]=(e=>function(){return de(n,e,s.apply(null,arguments))})(he()))},s.node=function(){return de(n,he(),s.apply(null,arguments)).valueOf()},s;function s(){return new ge(e,ve.apply(null,arguments))}},de=(e,t,{type:n,template:r,values:s})=>{const{length:o}=s;pe(e,t,s,o);let{entry:a}=t;if(a&&a.template===r&&a.type===n)a.tag(r,...s);else{const o=new e(n);t.entry=a={type:n,template:r,tag:o,wire:T(o(r,...s))}}return a.wire},pe=(e,{stack:t},n,r)=>{for(let s=0;s<r;s++){const r=n[s];r instanceof me?n[s]=de(e,t[s]||(t[s]=he()),r):S(r)?pe(e,t[s]||(t[s]=he()),r,r.length):t[s]=null}r<t.length&&t.splice(r)};function ge(e,t){this.type=e,this.template=t.shift(),this.values=t}ae(ge);const me=ge;function ve(){let e=[],t=0,{length:n}=arguments;for(;t<n;)e.push(arguments[t++]);return e}ue(re);var be="function"==typeof cancelAnimationFrame,ye=be?cancelAnimationFrame:clearTimeout,we=be?requestAnimationFrame:setTimeout;function Ee(e){var t,n,r,s,o;return i(),function(e,i,l){return r=e,s=i,o=l,n||(n=we(a)),--t<0&&c(!0),c};function a(){i(),r.apply(s,o||[])}function i(){t=e||1/0,n=be?0:null}function c(e){var t=!!n;return t&&(ye(n),e&&a()),t}}
|
|
10
|
+
/*! (c) Andrea Giammarchi - ISC */let Ce=null;const xe=L(new WeakMap),ke=(e,t,n)=>{e.apply(t,n)},Ne={async:!1,always:!1},Ae=(e,t)=>"function"==typeof t?t(e):t,$e=(e,t,n,r)=>{const s=Ce.i++,{hook:o,args:a,stack:i,length:c}=Ce;s===c&&(Ce.length=i.push({}));const l=i[s];if(l.args=a,s===c){const s="function"==typeof n,{async:a,always:i}=(s?r:n)||r||Ne;l.$=s?n(t):Ae(void 0,t),l._=a?xe.get(o)||xe.set(o,Ee()):ke,l.f=t=>{const n=e(l.$,t);(i||l.$!==n)&&(l.$=n,l._(o,null,l.args))}}return[l.$,l.f]},_e=new WeakMap;function Se({hook:e}){return e===this.hook}const je=new WeakMap,Oe=L(je),Le=()=>{},Me=e=>(t,n)=>{const r=Ce.i++,{hook:s,after:o,stack:a,length:i}=Ce;if(r<i){const s=a[r],{update:i,values:c,stop:l}=s;if(!n||n.some(Pe,c)){s.values=n,e&&l(e);const{clean:r}=s;r&&(s.clean=null,r());const a=()=>{s.clean=t()};e?i(a):o.push(a)}}else{const r=e?Ee():Le,i={clean:null,update:r,values:n,stop:Le};Ce.length=a.push(i),(Oe.get(s)||Oe.set(s,[])).push(i);const c=()=>{i.clean=t()};e?i.stop=r(c):o.push(c)}},Te=e=>{(je.get(e)||[]).forEach((e=>{const{clean:t,stop:n}=e;n(),t&&(e.clean=null,t())}))};je.has.bind(je);const Re=Me(!0),Ue=Me(!1),We=(e,t)=>{const n=Ce.i++,{stack:r,length:s}=Ce;return n===s?Ce.length=r.push({$:e(),_:t}):t&&!t.some(Pe,r[n]._)||(r[n]={$:e(),_:t}),r[n].$};function Pe(e,t){return e!==this[t]}let Ze=null;try{Ze=new{o(){}}.o}catch(Bt){}let Be=e=>class extends e{};if(Ze){const{getPrototypeOf:e,setPrototypeOf:t}=Object,{construct:n}="object"==typeof Reflect?Reflect:{construct(e,n,r){const s=[null];for(let e=0;e<n.length;e++)s.push(n[e]);const o=e.bind.apply(e,s);return t(new o,r.prototype)}};Be=function(r,s){function o(){return n(s?e(r):r,arguments,o)}return t(o.prototype,r.prototype),t(o,r)}}const ze={map:{},re:null},De=e=>new RegExp(`<(/)?(${e.join("|")})([^A-Za-z0-9:._-])`,"g");let Ve=null;const Fe=(e,t)=>{const{map:n,re:r}=Ve||t;return e.replace(r,((e,t,r,s)=>{const{tagName:o,is:a,element:i}=n[r];return i?t?`</${a}>`:`<${a}${s}`:t?`</${o}>`:`<${o} is="${a}"${s}`}))},He=({tagName:e,is:t,element:n})=>n?t:`${e}[is="${t}"]`,Ie=()=>Ve,qe=e=>{Ve=e},Ge={useCallback:(e,t)=>We((()=>e),t),useContext:e=>{const{hook:t,args:n}=Ce,r=_e.get(e),s={hook:t,args:n};return r.some(Se,s)||r.push(s),e.value},useEffect:Re,useLayoutEffect:Ue,useMemo:We,useReducer:$e,useRef:e=>{const t=Ce.i++,{stack:n,length:r}=Ce;return t===r&&(Ce.length=n.push({current:e})),n[t]},useState:(e,t)=>$e(Ae,e,void 0,t)},{render:Je,html:Ke,svg:Qe}=(e=>{const t=oe(ce);return ie(e).forEach((n=>{t[n]=e[n](t[n]||("convert"===n?v:String))})),n.prototype=t,ue(n);function n(){return re.apply(this,arguments)}})({transform:()=>e=>Fe(e,ze)}),Xe="_🔥",{defineProperties:Ye}=Object,et=new t,tt=new t,nt=new t,rt=new c,st=!0,ot="attributeChangedCallback",at="connectedCallback",it=`dis${at}`,ct=(e,t,n)=>{if(n in e){const r=e[n];t[n]={configurable:st,value(){return wt.call(this),r.apply(this,arguments)}}}else t[n]={configurable:st,value:wt}},lt=e=>{const{prototype:n}=e,r=[],s={html:{configurable:st,get:vt},svg:{configurable:st,get:bt}};if(s[Xe]={value:{events:r,info:null}},"handleEvent"in n||(s.handleEvent={configurable:st,value:yt}),"render"in n&&n.render.length){const{oninit:e}=n;Ye(n,{oninit:{configurable:st,value(){const t=(e=>{const t=[];return function n(){const r=Ce,s=[];Ce={hook:n,args:arguments,stack:t,i:0,length:t.length,after:s};try{return e.apply(null,arguments)}finally{Ce=r;for(let e=0,{length:t}=s;e<t;e++)s[e]()}}})(this.render.bind(this,Ge));Ye(this,{render:{configurable:st,value:t}}),this.addEventListener("disconnected",Te.bind(null,t),!1),e&&e.apply(this,arguments)}}})}"oninit"in n&&(r.push("init"),ct(n,s,"render")),ct(n,s,ot),ct(n,s,at),ct(n,s,it),[[ot,"onattributechanged",Et],[at,"onconnected",Ct],[it,"ondisconnected",kt],[at,"render",xt]].forEach((([e,t,o])=>{if(!(e in n)&&t in n)if("render"!==t&&r.push(t.slice(2)),e in s){const t=s[e].value;s[e]={configurable:st,value(){return t.apply(this,arguments),o.apply(this,arguments)}}}else s[e]={configurable:st,value:o}}));const o=e.booleanAttributes||[];o.forEach((e=>{e in n||(s[e]={configurable:st,get(){return this.hasAttribute(e)},set(t){t&&"false"!==t?this.setAttribute(e,t):this.removeAttribute(e)}})}));const a=e.observedAttributes||[];a.forEach((e=>{e in n||(s[e]={configurable:st,get(){return this.getAttribute(e)},set(t){null==t?this.removeAttribute(e):this.setAttribute(e,t)}})}));(e.mappedAttributes||[]).forEach((e=>{const o=new t,a="on"+e in n;a&&r.push(e),s[e]={configurable:st,get(){return o.get(this)},set(t){if(o.set(this,t),a){const n=ut(e);if(n.detail=t,rt.has(this))this.dispatchEvent(n);else{const e=nt.get(this);e?e.push(n):nt.set(this,[n])}}}}})),Ye(n,s);const i=o.concat(a);return i.length?Ye(e,{observedAttributes:{configurable:st,get:()=>i}}):e},ut=e=>new r(e),ht=(...e)=>new me("html",e);ht.for=Ke.for;const ft=(...e)=>new me("svg",e);ft.for=Qe.for;const dt=(e,n,r)=>{const s=pt(e,n,new t);return r.set(e,s),s},pt=(e,t,n)=>(r,...s)=>{const o=n.get(r)||((e,t,{info:n})=>{const r=n?Fe(t.join(Xe),n).split(Xe):t;return e.set(t,r),r})(n,r,e[Xe]);return Je(e,(()=>t(o,...s)))};function gt(e){this.addEventListener(e,this)}function mt(e){this.dispatchEvent(e)}function vt(){return et.get(this)||dt(this,ht,et)}function bt(){return tt.get(this)||dt(this,ft,tt)}function yt(e){this[`on${e.type}`](e)}function wt(){if(!rt.has(this)){rt.add(this),this[Xe].events.forEach(gt,this),this.dispatchEvent(ut("init"));const e=nt.get(this);e&&(nt.delete(this),e.forEach(mt,this))}}function Et(e,t,n){const r=ut("attributechanged");r.attributeName=e,r.oldValue=t,r.newValue=n,this.dispatchEvent(r)}function Ct(){this.dispatchEvent(ut("connected"))}function xt(){this.render()}function kt(){this.dispatchEvent(ut("disconnected"))}const{create:Nt,defineProperty:At,defineProperties:$t,getOwnPropertyNames:_t,getOwnPropertySymbols:St,getOwnPropertyDescriptor:jt,keys:Ot}=Object,Lt={element:HTMLElement},Mt=new t;new t;const Tt=new t;new t;const Rt=e=>{const t=Nt(null),n=Nt(null),r={prototype:n,statics:t};return _t(e).concat(St(e)).forEach((r=>{const s=jt(e,r);switch(s.enumerable=!1,r){case"extends":r="tagName";case"contains":case"includes":case"name":case"booleanAttributes":case"mappedAttributes":case"observedAttributes":case"style":case"tagName":t[r]=s;break;default:n[r]=s}})),r},Ut=(e,t,n)=>{if(!/^([A-Z][A-Za-z0-9_]*)(<([A-Za-z0-9:._-]+)>|:([A-Za-z0-9:._-]+))?$/.test(e))throw"Invalid name";const{$1:r,$3:s,$4:o}=RegExp;let a=s||o||t.tagName||t.extends||"element";const i="fragment"===a;if(i)a="element";else if(!/^[A-Za-z0-9:._-]+$/.test(a))throw"Invalid tag";let c="",l="";a.indexOf("-")<0?(c=r.replace(/(([A-Z0-9])([A-Z0-9][a-z]))|(([a-z])([A-Z]))/g,"$2$5-$3$6").toLowerCase()+n,c.indexOf("-")<0&&(l="-heresy")):(c=a+n,a="element");const u=c+l;if(customElements.get(u))throw`Duplicated ${u} definition`;const h=Be("object"==typeof t?Tt.get(t)||((e,t)=>{const{statics:n,prototype:r}=Rt(e),s=Be(Lt[t]||(Lt[t]=document.createElement(t).constructor),!1);return $t(s.prototype,r),$t(s,n),Tt.set(e,lt(s)),s})(t,a):Mt.get(t)||(e=>{const t=Be(e,!1);return Mt.set(e,lt(t)),t})(t),!0),f="element"===a;if(At(h,"new",{value:f?()=>document.createElement(u):()=>document.createElement(a,{is:u})}),At(h.prototype,"is",{value:u}),""===n){const e=(e=>{const{length:t}=e;let n=0,r=0;for(;r<t;)n=(n<<5)-n+e.charCodeAt(r++),n&=n;return n.toString(36)})(c.toUpperCase());ze.map[r]=Wt(h,a,u,{id:e,i:0}),ze.re=De(Ot(ze.map))}if(i){const{render:e}=h.prototype;At(h.prototype,"render",{configurable:!0,value(){if(e&&e.apply(this,arguments),this.parentNode){const{firstChild:e}=this;let t=null;if(e){const n=document.createRange();n.setStartBefore(e),n.setEndAfter(this.lastChild),t=n.extractContents(),this.parentNode.replaceChild(t,this)}}}})}const d=[u,h];return f||d.push({extends:a}),customElements.define(...d),{Class:h,is:u,name:r,tagName:a}},Wt=(e,t,n,r)=>{const{prototype:s}=e,o=((e,t)=>({tagName:e,is:t,element:"element"===e}))(t,n),a=[He(o)],i=e.includes||e.contains;if(i){const e={};Ot(i).forEach((t=>{const n=`-${r.id}-${r.i++}`,{Class:s,is:o,name:c,tagName:l}=Ut(t,i[t],n);a.push(He(e[c]=Wt(s,l,o,r)))}));const t=De(Ot(e)),{events:n}=s[Xe],o={events:n,info:{map:e,re:t}};if(At(s,Xe,{value:o}),"render"in s){const{render:e}=s,{info:t}=o;At(s,"render",{configurable:!0,value(){const n=Ie();qe(t);const r=e.apply(this,arguments);return qe(n),r}})}}return"style"in e&&(e=>{if((e||"").length){const t=document.createElement("style");t.type="text/css",t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e));const n=document.head||document.querySelector("head");n.insertBefore(t,n.lastChild)}})(e.style(...a)),o};const Pt="2.0.0-beta4",Zt=["audio","background","cameraAccess","chat","people","embed","emptyRoomInvitation","help","leaveButton","precallReview","screenshare","video","floatSelf","recording","logo","locking","participantCount","settingsButton","pipButton","moreButton","personality","subgridLabels","lowData","breakout"];var Bt,zt;Bt="WherebyEmbed",zt={oninit(){this.iframe=((e,t)=>e?e[t]||(e[t]={current:null}):{current:null})()},onconnected(){window.addEventListener("message",this.onmessage.bind(this))},ondisconnected(){window.removeEventListener("message",this.onmessage.bind(this))},observedAttributes:["displayName","minimal","room","subdomain","lang","metadata","groups","virtualBackgroundUrl","avatarUrl","externalId","title",...Zt].map((e=>e.toLowerCase())),onattributechanged({attributeName:e,oldValue:t}){["room","subdomain"].includes(e)&&null==t||this.render()},style:e=>`\n ${e} {\n display: block;\n }\n ${e} iframe {\n border: none;\n height: 100%;\n width: 100%;\n }\n `,_postCommand(e,t=[]){this.iframe.current&&this.iframe.current.contentWindow.postMessage({command:e,args:t},this.roomUrl.origin)},startRecording(){this._postCommand("start_recording")},stopRecording(){this._postCommand("stop_recording")},startStreaming(){this._postCommand("start_streaming")},stopStreaming(){this._postCommand("stop_streaming")},toggleCamera(e){this._postCommand("toggle_camera",[e])},toggleMicrophone(e){this._postCommand("toggle_microphone",[e])},toggleScreenshare(e){this._postCommand("toggle_screenshare",[e])},toggleChat(e){this._postCommand("toggle_chat",[e])},onmessage({origin:e,data:t}){if(!this.roomUrl||e!==this.roomUrl.origin)return;const{type:n,payload:r}=t;this.dispatchEvent(new CustomEvent(n,{detail:r}))},render(){const{avatarurl:e,displayname:t,lang:n,metadata:r,externalid:s,minimal:o,room:a,groups:i,virtualbackgroundurl:c,title:l}=this;let u,h;try{({roomUrl:u,subdomain:h}=function(e,t){if(!e)throw new Error("Missing room attribute");const n=/https:\/\/([^.]+)(\.whereby\.com|-ip-\d+-\d+-\d+-\d+.hereby.dev:4443)\/.+/.exec(e),r=n&&n[1]||t;if(!r)throw new Error("Missing subdomain attribute");if(!n)throw new Error("Could not parse room URL");return{subdomain:r,roomUrl:new URL(e)}}(a,this.subdomain))}catch(e){return this.html`Whereby: ${e instanceof Error?e.message:"unknown error"}`}this.roomUrl=u,Object.entries(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({jsApi:!0,we:Pt,iframeSource:h},t&&{displayName:t}),n&&{lang:n}),r&&{metadata:r}),s&&{externalId:s}),i&&{groups:i}),c&&{virtualBackgroundUrl:c}),e&&{avatarUrl:e}),null!=o&&{embed:o}),Zt.reduce(((e,t)=>null!=this[t.toLowerCase()]?Object.assign(Object.assign({},e),{[t]:this[t.toLowerCase()]}):e),{}))).forEach((([e,t])=>{this.roomUrl.searchParams.has(e)||this.roomUrl.searchParams.set(e,t)})),this.html`
|
|
11
|
+
<iframe
|
|
12
|
+
title=${l||"Video calling component"}
|
|
13
|
+
ref=${this.iframe}
|
|
14
|
+
src=${this.roomUrl}
|
|
15
|
+
allow="autoplay; camera; microphone; fullscreen; speaker; display-capture" />
|
|
16
|
+
`}},("string"==typeof Bt?Ut(Bt,zt,""):Ut(Bt.name,Bt,"")).Class;var Dt={sdkVersion:Pt};export{Dt as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whereby.com/browser-sdk",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-beta4",
|
|
4
4
|
"description": "Modules for integration Whereby video in web apps",
|
|
5
5
|
"author": "Whereby AS",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,9 +11,18 @@
|
|
|
11
11
|
"browserslist": "> 0.5%, last 2 versions, not dead",
|
|
12
12
|
"source": "src/index.js",
|
|
13
13
|
"exports": {
|
|
14
|
-
"./react":
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
"./react": {
|
|
15
|
+
"import": "./dist/react/index.esm.js",
|
|
16
|
+
"types": "./dist/react/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./embed": {
|
|
19
|
+
"import": "./dist/embed/index.esm.js",
|
|
20
|
+
"types": "./dist/embed/index.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"./utils": {
|
|
23
|
+
"import": "./dist/utils/index.esm.js",
|
|
24
|
+
"types": "./dist/utils/index.d.ts"
|
|
25
|
+
}
|
|
17
26
|
},
|
|
18
27
|
"typesVersions": {
|
|
19
28
|
"*": {
|
|
@@ -34,8 +43,7 @@
|
|
|
34
43
|
],
|
|
35
44
|
"scripts": {
|
|
36
45
|
"prebuild": "rimraf dist",
|
|
37
|
-
"build": "
|
|
38
|
-
"postbuild": "tsc --project tsconfig.build.json",
|
|
46
|
+
"build": "rollup -c rollup.config.js",
|
|
39
47
|
"build:storybook": "storybook build",
|
|
40
48
|
"dev": "storybook dev -p 6006",
|
|
41
49
|
"install:e2e-sample-app": "cd test/sample-app && yarn custom_install",
|
|
@@ -55,10 +63,10 @@
|
|
|
55
63
|
"@babel/preset-react": "^7.22.15",
|
|
56
64
|
"@babel/preset-typescript": "^7.23.2",
|
|
57
65
|
"@playwright/test": "^1.38.1",
|
|
58
|
-
"@rollup/plugin-commonjs": "^
|
|
59
|
-
"@rollup/plugin-json": "^6.0.
|
|
60
|
-
"@rollup/plugin-node-resolve": "^
|
|
61
|
-
"@rollup/plugin-replace": "^
|
|
66
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
67
|
+
"@rollup/plugin-json": "^6.0.1",
|
|
68
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
69
|
+
"@rollup/plugin-replace": "^5.0.5",
|
|
62
70
|
"@storybook/addon-actions": "^7.5.2",
|
|
63
71
|
"@storybook/addon-essentials": "^7.5.2",
|
|
64
72
|
"@storybook/addon-links": "^7.5.2",
|
|
@@ -70,13 +78,13 @@
|
|
|
70
78
|
"@types/jest": "^29.2.4",
|
|
71
79
|
"@types/node": "^20.7.1",
|
|
72
80
|
"@types/react": "^18.0.26",
|
|
81
|
+
"@types/uuid": "^9.0.7",
|
|
73
82
|
"@typescript-eslint/eslint-plugin": "^5.46.1",
|
|
74
83
|
"@typescript-eslint/parser": "^5.46.1",
|
|
75
84
|
"babel-loader": "^8.2.5",
|
|
85
|
+
"deep-object-diff": "^1.1.9",
|
|
76
86
|
"dotenv": "^16.3.1",
|
|
77
87
|
"dotenv-run-script": "^0.4.1",
|
|
78
|
-
"esbuild": "^0.19.4",
|
|
79
|
-
"esbuild-plugin-replace": "^1.4.0",
|
|
80
88
|
"eslint": "^8.29.0",
|
|
81
89
|
"eslint-plugin-jest": "^26.5.3",
|
|
82
90
|
"jest": "29.4.3",
|
|
@@ -86,13 +94,19 @@
|
|
|
86
94
|
"react": "^18.2.0",
|
|
87
95
|
"react-dom": "^18.2.0",
|
|
88
96
|
"rimraf": "^3.0.2",
|
|
97
|
+
"rollup": "^4.3.0",
|
|
98
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
99
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
100
|
+
"rollup-plugin-typescript2": "^0.36.0",
|
|
89
101
|
"storybook": "^7.5.2",
|
|
90
102
|
"ts-jest": "29.0.5",
|
|
91
103
|
"tslib": "^2.4.1",
|
|
92
104
|
"typescript": "^4.9.4",
|
|
105
|
+
"uuid": "^9.0.1",
|
|
93
106
|
"yalc": "^1.0.0-pre.53"
|
|
94
107
|
},
|
|
95
108
|
"dependencies": {
|
|
109
|
+
"@reduxjs/toolkit": "^2.0.1",
|
|
96
110
|
"@swc/helpers": "^0.3.13",
|
|
97
111
|
"@whereby/jslib-media": "whereby/jslib-media.git#1.4.1",
|
|
98
112
|
"axios": "^1.2.3",
|
package/dist/LocalMedia.d.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import RtcManager from "@whereby/jslib-media/src/webrtc/RtcManager";
|
|
2
|
-
type CameraEnabledEvent = {
|
|
3
|
-
enabled: boolean;
|
|
4
|
-
};
|
|
5
|
-
type MicrophoneEnabledEvent = {
|
|
6
|
-
enabled: boolean;
|
|
7
|
-
};
|
|
8
|
-
type DeviceListUpdatedEvent = {
|
|
9
|
-
cameraDevices: MediaDeviceInfo[];
|
|
10
|
-
microphoneDevices: MediaDeviceInfo[];
|
|
11
|
-
speakerDevices: MediaDeviceInfo[];
|
|
12
|
-
};
|
|
13
|
-
type DeviceListUpdateErrorEvent = {
|
|
14
|
-
error: unknown;
|
|
15
|
-
};
|
|
16
|
-
type StreamUpdatedEvent = {
|
|
17
|
-
stream: MediaStream;
|
|
18
|
-
};
|
|
19
|
-
type StopResumeVideoEvent = {
|
|
20
|
-
track: MediaStreamTrack;
|
|
21
|
-
enable: boolean;
|
|
22
|
-
};
|
|
23
|
-
interface LocalMediaEventsMap {
|
|
24
|
-
camera_enabled: CustomEvent<CameraEnabledEvent>;
|
|
25
|
-
device_list_updated: CustomEvent<DeviceListUpdatedEvent>;
|
|
26
|
-
device_list_update_error: CustomEvent<DeviceListUpdateErrorEvent>;
|
|
27
|
-
microphone_enabled: CustomEvent<MicrophoneEnabledEvent>;
|
|
28
|
-
stream_updated: CustomEvent<StreamUpdatedEvent>;
|
|
29
|
-
stopresumevideo: CustomEvent<StopResumeVideoEvent>;
|
|
30
|
-
}
|
|
31
|
-
interface LocalMediaEventTarget extends EventTarget {
|
|
32
|
-
addEventListener<K extends keyof LocalMediaEventsMap>(type: K, listener: (ev: LocalMediaEventsMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
33
|
-
addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
|
|
34
|
-
}
|
|
35
|
-
declare const TypedLocalMediaEventTarget: new () => LocalMediaEventTarget;
|
|
36
|
-
export interface LocalMediaOptions {
|
|
37
|
-
audio: boolean;
|
|
38
|
-
video: boolean;
|
|
39
|
-
}
|
|
40
|
-
export default class LocalMedia extends TypedLocalMediaEventTarget {
|
|
41
|
-
private _options;
|
|
42
|
-
_rtcManagers: RtcManager[];
|
|
43
|
-
private _devices;
|
|
44
|
-
stream: MediaStream;
|
|
45
|
-
screenshareStream?: MediaStream;
|
|
46
|
-
private _cameraEnabled;
|
|
47
|
-
private _currentCameraDeviceId;
|
|
48
|
-
private _isTogglingCameraEnabled;
|
|
49
|
-
private _microphoneEnabled;
|
|
50
|
-
private _currentMicrophoneDeviceId;
|
|
51
|
-
constructor(optionsOrStream: LocalMediaOptions | MediaStream);
|
|
52
|
-
addRtcManager(rtcManager: RtcManager): void;
|
|
53
|
-
removeRtcManager(rtcManager: RtcManager): void;
|
|
54
|
-
getCameraDeviceId(): string | undefined;
|
|
55
|
-
getMicrophoneDeviceId(): string | undefined;
|
|
56
|
-
isCameraEnabled(): boolean;
|
|
57
|
-
isMicrophoneEnabled(): boolean;
|
|
58
|
-
toggleCameraEnabled(enabled?: boolean): Promise<void>;
|
|
59
|
-
toggleMichrophoneEnabled(enabled?: boolean): void;
|
|
60
|
-
startScreenshare(): Promise<MediaStream>;
|
|
61
|
-
stopScreenshare(): void;
|
|
62
|
-
private _getConstraintsOptions;
|
|
63
|
-
private _setDevice;
|
|
64
|
-
setCameraDevice(deviceId: string): Promise<void>;
|
|
65
|
-
setMicrophoneDevice(deviceId: string): Promise<void>;
|
|
66
|
-
private _updateDeviceList;
|
|
67
|
-
start(): Promise<MediaStream>;
|
|
68
|
-
stop(): void;
|
|
69
|
-
}
|
|
70
|
-
export {};
|
package/dist/LocalMedia.js
DELETED
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { getStream } from "@whereby/jslib-media/src/webrtc/MediaDevices";
|
|
3
|
-
class LocalMediaEvent extends CustomEvent {
|
|
4
|
-
constructor(eventType, eventInitDict) {
|
|
5
|
-
super(eventType, eventInitDict);
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
const TypedLocalMediaEventTarget = EventTarget;
|
|
9
|
-
export default class LocalMedia extends TypedLocalMediaEventTarget {
|
|
10
|
-
constructor(optionsOrStream) {
|
|
11
|
-
var _a, _b;
|
|
12
|
-
super();
|
|
13
|
-
this._options = null;
|
|
14
|
-
this._devices = [];
|
|
15
|
-
this._isTogglingCameraEnabled = false;
|
|
16
|
-
if (optionsOrStream instanceof MediaStream) {
|
|
17
|
-
this.stream = optionsOrStream;
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
this._options = optionsOrStream;
|
|
21
|
-
this.stream = new MediaStream();
|
|
22
|
-
}
|
|
23
|
-
this._cameraEnabled = ((_a = this.stream.getVideoTracks()[0]) === null || _a === void 0 ? void 0 : _a.enabled) || false;
|
|
24
|
-
this._microphoneEnabled = ((_b = this.stream.getAudioTracks()[0]) === null || _b === void 0 ? void 0 : _b.enabled) || false;
|
|
25
|
-
this._rtcManagers = [];
|
|
26
|
-
this.screenshareStream = undefined;
|
|
27
|
-
navigator.mediaDevices.addEventListener("devicechange", this._updateDeviceList.bind(this));
|
|
28
|
-
}
|
|
29
|
-
addRtcManager(rtcManager) {
|
|
30
|
-
this._rtcManagers.push(rtcManager);
|
|
31
|
-
}
|
|
32
|
-
removeRtcManager(rtcManager) {
|
|
33
|
-
this._rtcManagers = this._rtcManagers.filter((r) => r !== rtcManager);
|
|
34
|
-
}
|
|
35
|
-
getCameraDeviceId() {
|
|
36
|
-
return this._currentCameraDeviceId;
|
|
37
|
-
}
|
|
38
|
-
getMicrophoneDeviceId() {
|
|
39
|
-
return this._currentMicrophoneDeviceId;
|
|
40
|
-
}
|
|
41
|
-
isCameraEnabled() {
|
|
42
|
-
return this._cameraEnabled;
|
|
43
|
-
}
|
|
44
|
-
isMicrophoneEnabled() {
|
|
45
|
-
return this._microphoneEnabled;
|
|
46
|
-
}
|
|
47
|
-
toggleCameraEnabled(enabled) {
|
|
48
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
if (this._isTogglingCameraEnabled) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
let track = this.stream.getVideoTracks()[0];
|
|
53
|
-
const newValue = enabled !== null && enabled !== void 0 ? enabled : !(track === null || track === void 0 ? void 0 : track.enabled);
|
|
54
|
-
if (this._cameraEnabled === newValue) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
this._cameraEnabled = newValue;
|
|
58
|
-
this.dispatchEvent(new LocalMediaEvent("camera_enabled", { detail: { enabled: this._cameraEnabled } }));
|
|
59
|
-
const shouldStopTrack = !!this._options;
|
|
60
|
-
this._isTogglingCameraEnabled = true;
|
|
61
|
-
try {
|
|
62
|
-
if (this._cameraEnabled) {
|
|
63
|
-
if (track) {
|
|
64
|
-
track.enabled = true;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
yield getStream(Object.assign(Object.assign({}, this._getConstraintsOptions()), { audioId: false, videoId: this._currentCameraDeviceId, type: "exact" }), { replaceStream: this.stream });
|
|
68
|
-
track = this.stream.getVideoTracks()[0];
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
if (!track) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
track.enabled = false;
|
|
76
|
-
if (shouldStopTrack) {
|
|
77
|
-
track.stop();
|
|
78
|
-
this.stream.removeTrack(track);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
this.stream.dispatchEvent(new LocalMediaEvent("stopresumevideo", { detail: { track, enable: this._cameraEnabled } }));
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
}
|
|
85
|
-
this._isTogglingCameraEnabled = false;
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
toggleMichrophoneEnabled(enabled) {
|
|
89
|
-
const audioTrack = this.stream.getAudioTracks()[0];
|
|
90
|
-
if (!audioTrack) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
this._microphoneEnabled = enabled !== null && enabled !== void 0 ? enabled : !audioTrack.enabled;
|
|
94
|
-
this.dispatchEvent(new LocalMediaEvent("microphone_enabled", { detail: { enabled: this._microphoneEnabled } }));
|
|
95
|
-
audioTrack.enabled = this._microphoneEnabled;
|
|
96
|
-
}
|
|
97
|
-
startScreenshare() {
|
|
98
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
99
|
-
if (this.screenshareStream) {
|
|
100
|
-
return this.screenshareStream;
|
|
101
|
-
}
|
|
102
|
-
const screenshareStream = yield navigator.mediaDevices.getDisplayMedia();
|
|
103
|
-
this.screenshareStream = screenshareStream;
|
|
104
|
-
return this.screenshareStream;
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
stopScreenshare() {
|
|
108
|
-
var _a;
|
|
109
|
-
(_a = this.screenshareStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());
|
|
110
|
-
this.screenshareStream = undefined;
|
|
111
|
-
}
|
|
112
|
-
_getConstraintsOptions() {
|
|
113
|
-
return {
|
|
114
|
-
devices: this._devices,
|
|
115
|
-
options: {
|
|
116
|
-
disableAEC: false,
|
|
117
|
-
disableAGC: false,
|
|
118
|
-
hd: true,
|
|
119
|
-
lax: false,
|
|
120
|
-
lowDataMode: false,
|
|
121
|
-
simulcast: true,
|
|
122
|
-
widescreen: true,
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
_setDevice({ audioId, videoId }) {
|
|
127
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
-
const { replacedTracks } = yield getStream(Object.assign(Object.assign({}, this._getConstraintsOptions()), { audioId,
|
|
129
|
-
videoId, type: "exact" }), { replaceStream: this.stream });
|
|
130
|
-
if (replacedTracks) {
|
|
131
|
-
replacedTracks.forEach((oldTrack) => {
|
|
132
|
-
const newTrack = oldTrack.kind === "audio" ? this.stream.getAudioTracks()[0] : this.stream.getVideoTracks()[0];
|
|
133
|
-
this._rtcManagers.forEach((rtcManager) => {
|
|
134
|
-
rtcManager.replaceTrack(oldTrack, newTrack);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
this.dispatchEvent(new LocalMediaEvent("stream_updated", {
|
|
139
|
-
detail: { stream: this.stream },
|
|
140
|
-
}));
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
setCameraDevice(deviceId) {
|
|
144
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
-
this._currentCameraDeviceId = deviceId;
|
|
146
|
-
yield this._setDevice({ videoId: this._currentCameraDeviceId, audioId: false });
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
setMicrophoneDevice(deviceId) {
|
|
150
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
-
this._currentMicrophoneDeviceId = deviceId;
|
|
152
|
-
yield this._setDevice({ audioId: this._currentMicrophoneDeviceId, videoId: false });
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
_updateDeviceList() {
|
|
156
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
157
|
-
try {
|
|
158
|
-
const devices = yield navigator.mediaDevices.enumerateDevices();
|
|
159
|
-
this.dispatchEvent(new LocalMediaEvent("device_list_updated", {
|
|
160
|
-
detail: {
|
|
161
|
-
cameraDevices: devices.filter((d) => d.kind === "videoinput"),
|
|
162
|
-
microphoneDevices: devices.filter((d) => d.kind === "audioinput"),
|
|
163
|
-
speakerDevices: devices.filter((d) => d.kind === "audiooutput"),
|
|
164
|
-
},
|
|
165
|
-
}));
|
|
166
|
-
this._devices = devices;
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
this.dispatchEvent(new LocalMediaEvent("device_list_update_error", {
|
|
170
|
-
detail: {
|
|
171
|
-
error,
|
|
172
|
-
},
|
|
173
|
-
}));
|
|
174
|
-
throw error;
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
start() {
|
|
179
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
yield this._updateDeviceList();
|
|
181
|
-
if (this._options) {
|
|
182
|
-
yield getStream(Object.assign(Object.assign({}, this._getConstraintsOptions()), { audioId: this._options.audio, videoId: this._options.video }), { replaceStream: this.stream });
|
|
183
|
-
const cameraTrack = this.stream.getVideoTracks()[0];
|
|
184
|
-
if (cameraTrack) {
|
|
185
|
-
this._cameraEnabled = cameraTrack.enabled;
|
|
186
|
-
this._currentCameraDeviceId = cameraTrack.getSettings().deviceId;
|
|
187
|
-
}
|
|
188
|
-
const microphoneTrack = this.stream.getAudioTracks()[0];
|
|
189
|
-
if (microphoneTrack) {
|
|
190
|
-
this._microphoneEnabled = microphoneTrack.enabled;
|
|
191
|
-
this._currentMicrophoneDeviceId = microphoneTrack.getSettings().deviceId;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
this.dispatchEvent(new LocalMediaEvent("stream_updated", {
|
|
195
|
-
detail: { stream: this.stream },
|
|
196
|
-
}));
|
|
197
|
-
return this.stream;
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
stop() {
|
|
201
|
-
var _a;
|
|
202
|
-
if (this._options) {
|
|
203
|
-
(_a = this.stream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((t) => {
|
|
204
|
-
t.stop();
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|