UNPKG

@salutejs/jazz-sdk-electron-plugins

Version:

Jazz SDK electron plugins

2 lines (1 loc) 6.29 kB
import{token as e}from"ditox";import{createEventBus as t,createKeyQueue as s,isNotEmpty as o,filterByType as i,DeniedBySystemError as r,createModule as n}from"@salutejs/jazz-sdk-web";import{createScope as c}from"rx-effects";import{filter as a,switchMap as d,Observable as u,map as p,firstValueFrom as l}from"rxjs";const y=e({key:"JAZZ_SDK_CONTEXT_TOKEN"}),f=e({key:"JAZZ_SDK_DESKTOP_CAPTURER_TOKEN"}),v=2e3;function S(e,t,s,o){return new(s||(s=Promise))((function(i,r){function n(e){try{a(o.next(e))}catch(e){r(e)}}function c(e){try{a(o.throw(e))}catch(e){r(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(n,c)}a((o=o.apply(e,t||[])).next())}))}function h(e){const{ipcMain:t,logger:s}=e,o=c();function i(e){return S(this,void 0,void 0,(function*(){s.debug("Request media access status for",e);const{status:o}=yield t.getMediaAccessStatus(e);return s.debug("Response media access status is",o),o}))}function n(e){return S(this,void 0,void 0,(function*(){return yield t.askForMediaAccess(e)}))}const a=e=>S(this,void 0,void 0,(function*(){const t=function(e){switch(e){case"audio":return"microphone";case"video":return"camera";case"displayScreen":return"screen";default:!function(e){throw new Error(`Unexpected value ${e}`)}(e)}}(e),o=yield i(t);if(s.debug("Received desktop media access status",o),"not-determined"!==o)return o;if("screen"===t)return o;yield n(t);return yield i(t)}));return{askForMediaAccess:n,getMediaAccessStatus:i,requestDesktopMediaPermissions:e=>S(this,void 0,void 0,(function*(){for(const t of e){if("denied"===(yield a(t)))throw new r("audio"===t,"video"===t)}})),requestDesktopMediaAccess:a,openSystemSettings:function(e){return S(this,void 0,void 0,(function*(){s.debug("Request openSystemSettings",e),yield t.openSystemSettings(e)}))},destroy:()=>{o.destroy()}}}function g(){return S(this,void 0,void 0,(function*(){return n({name:"DesktopCapturerPlugin",imports:{sdkContext:y},factory:m,exports:{desktopCapturer:f}})}))}function m(e){const{sdkContext:{logger:r,localDevices:n}}=e.deps,y=r.getLogger(e.name),f=c(),{ipcMain:v}=function(){const e=window["jazz-sdk-desktop-capturer-bridge"];if(void 0===e)throw new Error("Failed connect to the preload layer. Please setup @salutejs/jazz-sdk-electron-plugins/preload/desktopCapturerPlugin to preload layer of electron");return e}(),g=f.createController((()=>h({ipcMain:v,logger:y}))),{$status:m,$accessStatus:k,$sources:w,$isSupportedShareDisplayAudio:D,cancel:b,event$:A,selectSource:M}=f.createController((()=>function(e){const{ipcMain:r,logger:n,mediaAccess:y}=e,f=c(),v=t(),h=f.createStore(void 0),g=s(),m=f.createStore("finished"),k=f.createStore([]),w=f.createStore(!0);r.osInfo().then((e=>{w.set("linux"!==e.platform)}));const D=e=>{n.debug("received sources",e.map((e=>e.id))),e.sort(((e,t)=>e.name<t.name?1:-1)),k.set(e)};let b;r.capturerSourcesFinishProcess();const A=()=>S(this,void 0,void 0,(function*(){var e;if(void 0!==b)return b;const t=yield r.osInfo();return t&&"linux"===t.platform&&t.linuxSessionInfo&&(null===(e=t.linuxSessionInfo.xdgSessionType)||void 0===e?void 0:e.toLowerCase().includes("wayland"))?(b=!0,b):(b=!1,b)}));window.JazzScreenObtainer={openDesktopPicker:(e,t)=>S(this,void 0,void 0,(function*(){n.debug("Request to open desktop capture picker");const e=yield A();e?n.debug("view desktop picker is disabled!"):m.set("pending"),r.capturerSourcesStartProcess().then((s=>{if(h.set({onSourceChoose:t}),"failure"!==s.type){if(e&&s.value.sources.length){const e=s.value.sources[0];return n.debug("auto select desktop source",e),t(e.id),v({type:"selectDesktopSource",payload:{source:e,isShareDisplayAudio:w.get()}}),void M()}m.set("started"),D(s.value.sources),v({type:"sources",payload:{sources:s.value.sources}})}else $()}))}))},f.add((()=>{window.JazzScreenObtainer=void 0,r.capturerSourcesFinishProcess()}));const M=()=>S(this,void 0,void 0,(function*(){h.set(void 0),k.set([]),yield r.capturerSourcesFinishProcess(),m.set("finished")})),P=()=>S(this,void 0,void 0,(function*(){var e;"finished"!==m.get()&&"finished"!==(yield l(m.value$.pipe(a((e=>"pending"!==e)))))&&(null===(e=h.get())||void 0===e||e.onSourceChoose(),v({type:"cancel",payload:{action:"cancel"}}),yield M())})),$=()=>S(this,void 0,void 0,(function*(){yield g.waitKey("selectSource"),yield g.add({key:"cancel",cb:P})})),x=(e,...t)=>S(this,[e,...t],void 0,(function*(e,t=!1){if("finished"===m.get())return;if("finished"===(yield l(m.value$.pipe(a((e=>"pending"!==e))))))return;const s=h.get();if(!s)return;s.onSourceChoose(e.id);const o=w.get()&&t;v({type:"selectDesktopSource",payload:{source:e,isShareDisplayAudio:o}}),yield M()})),C=f.createStore(!1),z=f.createStore(void 0);return f.handle(k.value$.pipe(a(o)),(()=>S(this,void 0,void 0,(function*(){if(C.get())return;C.set(!0);const e=yield y.getMediaAccessStatus("screen");z.set(e)})))),f.handle(v.event$.pipe(i("selectDesktopSource"),d((({payload:e})=>new u((e=>{r.once("askDisplayMediaStream",(()=>{e.next("askDisplayMediaStream")}))})).pipe(p((()=>e)))))),(({source:e,isShareDisplayAudio:t})=>{r.replyDisplayMediaStream(e,t)})),f.add(r.subscribe("updateSources",(e=>{D(e.sources),v({type:"updateSources",payload:e})}))),f.add(r.subscribe("startProcess",(e=>{v({type:"startProcess",payload:e})}))),f.add(r.subscribe("finishProcess",(e=>{v({type:"finishProcess",payload:e})}))),{$accessStatus:z,$sources:k,$status:m,$isSupportedShareDisplayAudio:w,event$:v.event$,cancel:$,selectSource:(e,...t)=>S(this,[e,...t],void 0,(function*(e,t=!1){yield g.waitKey("cancel"),yield g.add({key:"selectSource",cb:()=>x(e,t)})})),destroy:()=>{f.destroy()}}}({ipcMain:v,logger:y,mediaAccess:g}))),P=n.hooks.requestMediaPermissions.tap((e=>S(this,void 0,void 0,(function*(){yield g.requestDesktopMediaPermissions(e)}))));return f.add((()=>P())),{desktopCapturer:{sources:w,accessStatus:k,status:m,isSupportedShareDisplayAudio:D,getMediaAccessStatus:g.getMediaAccessStatus,requestDesktopMediaAccess:g.requestDesktopMediaAccess,selectSource:M,openSystemSettings:g.openSystemSettings,cancel:b,event$:A},destroy:()=>{f.destroy()}}}function k(e){return e.container.resolve(f)}export{v as INTERVAL_CHECK_ACTUAL_SOURCE,y as JAZZ_SDK_CONTEXT_TOKEN,f as JAZZ_SDK_DESKTOP_CAPTURER_TOKEN,g as desktopCapturerPlugin,k as getDesktopCapturer};