@salutejs/jazz-sdk-electron-plugins
Version:
Jazz SDK electron plugins
2 lines (1 loc) • 5.98 kB
JavaScript
;var e=require("ditox"),s=require("@salutejs/jazz-sdk-web"),t=require("rx-effects"),r=require("nrgy"),o=require("nrgy/rxjs"),a=require("rxjs");const i=e.token({key:"JAZZ_SDK_CONTEXT_TOKEN"}),c=e.token({key:"JAZZ_SDK_DESKTOP_CAPTURER_TOKEN"});function n(e){const{ipcMain:t,logger:i,mediaAccess:c}=e,n=r.createScope(),u=s.createEventBus(),d=s.createEventBus(),p=n.atom(void 0),l=s.createKeyQueue(),y=n.atom("finished"),S=n.atom([]),f=n.atom(!0),m=n.atom(!1),g=n.atom(void 0);t.osInfo().then((e=>{f.set("linux"!==e.platform),m.set("linux"===e.platform),g.set(e.linuxSessionInfo)})).catch((e=>{i.error("Failed get osInfo",e)}));const k=e=>{i.debug("received sources",e.map((e=>e.id))),e.sort(((e,s)=>e.name<s.name?1:-1)),S.set(e)};let w;t.capturerSourcesFinishProcess();const A=n.atom(void 0);window.JazzScreenObtainer={openDesktopPicker:async(e,s)=>{i.debug("Request to open desktop capture picker");if(await(async()=>{if(void 0!==w)return w;const e=m(),s=g();return e&&s&&s.xdgSessionType?.toLowerCase().includes("wayland")?(w=!0,w):(w=!1,w)})())return i.debug("view desktop picker is disabled!"),i.debug("send to main auto select first screen"),d({type:"select",payload:{source:"autoSelectFirstSource",isShareDisplayAudio:f()}}),void s("autoSelectFirstSource");y.set("pending");const r=await async function(){const e=await c.getMediaAccessStatus("screen");return A.set(e),e}();if("denied"===r)return y.set("failed"),void s();t.capturerSourcesStartProcess().then((async e=>{if(p.set({onSourceChoose:s}),"failure"===e.type)return s(),await D(),y.set("failed"),void("accessDenied"===e.error.type&&A.set("denied"));y.set("started"),k(e.value.sources),u({type:"sources",payload:{sources:e.value.sources}})}))}},n.onDestroy((()=>{window.JazzScreenObtainer=void 0,t.capturerSourcesFinishProcess()}));const D=async()=>{p.set(void 0),S.set([]),await t.capturerSourcesFinishProcess(),y.set("finished")},h=async()=>{if("finished"===y())return;"finished"!==await a.firstValueFrom(o.observe(y,{sync:!0}).pipe(a.filter((e=>"pending"!==e))))&&(p()?.onSourceChoose(),u({type:"cancel",payload:{action:"cancel"}}),await D())};return n.onDestroy(t.subscribe("autoSelectSource",(({audio:e,source:s})=>{u({type:"selectDesktopSource",payload:{source:s,isShareDisplayAudio:e}})}))),n.add(d.event$.pipe(s.filterByType("select"),a.switchMap((({payload:e})=>new a.Observable((e=>{t.once("askDisplayMediaStream",(()=>{e.next("askDisplayMediaStream")}))})).pipe(a.map((()=>e)))))).subscribe((({source:e,isShareDisplayAudio:s})=>{t.replyDisplayMediaStream(e,s)}))),n.onDestroy(t.subscribe("updateSources",(e=>{k(e.sources),u({type:"updateSources",payload:e})}))),n.onDestroy(t.subscribe("startProcess",(e=>{u({type:"startProcess",payload:e})}))),n.onDestroy(t.subscribe("finishProcess",(e=>{u({type:"finishProcess",payload:e})}))),{accessStatus:A,sources:S,status:y,isSupportedShareDisplayAudio:f,event$:u.event$,cancel:async()=>{await l.add({key:"cancel",execute:h})},selectSource:async(e,t=!1)=>{await l.add({key:"selectSource",execute:()=>(async(e,t=!1)=>{if("finished"===y())return;if("finished"===await a.firstValueFrom(o.observe(y,{sync:!0}).pipe(a.filter((e=>"pending"!==e)))))return;const r=p();if(!r)return;performance.mark(s.COLLECT_METRICS_MARKS.tracks.runScreenShare);const i=f()&&t;d({type:"select",payload:{source:e,isShareDisplayAudio:i}}),u({type:"selectDesktopSource",payload:{source:e,isShareDisplayAudio:i}}),r.onSourceChoose(e.id),await D()})(e,t)})},destroy:()=>{n.destroy()}}}function u(e){const{ipcMain:r,logger:o}=e,a=t.createScope();async function i(e){o.debug("Request media access status for",e);const{status:s}=await r.getMediaAccessStatus(e);return o.debug("Response media access status is",s),s}async function c(e){return await r.askForMediaAccess(e)}const n=async e=>{const s=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),t=await i(s);if(o.debug("Received desktop media access status",t),"not-determined"!==t)return t;if("screen"===s)return t;await c(s);return await i(s)};return{askForMediaAccess:c,getMediaAccessStatus:i,requestDesktopMediaPermissions:async e=>{for(const t of e){if("denied"===await n(t))throw new s.DeniedBySystemError("audio"===t,"video"===t)}},requestDesktopMediaAccess:n,openSystemSettings:async function(e){o.debug("Request openSystemSettings",e),await r.openSystemSettings(e)},destroy:()=>{a.destroy()}}}function d(e){const{sdkContext:{logger:r,localDevices:o,emitter:a}}=e.deps;a.once("pluginsResolved",(()=>{a.send("screenCapturePluginAdded",{pluginName:e.name})}));const i=r.getLogger(e.name),c=t.createScope(),{ipcMain:d}=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}(),p=c.createController((()=>u({ipcMain:d,logger:i}))),{status:l,accessStatus:y,sources:S,isSupportedShareDisplayAudio:f,cancel:m,event$:g,selectSource:k}=c.createController((()=>n({ipcMain:d,logger:i,mediaAccess:p}))),w=o.hooks.requestMediaPermissions.tap((async e=>{await p.requestDesktopMediaPermissions(e)}));return c.add((()=>w())),{desktopCapturer:{sources:s.toQueryAtom(S),accessStatus:s.toQueryAtom(y),status:s.toQueryAtom(l),isSupportedShareDisplayAudio:s.toQueryAtom(f),getMediaAccessStatus:p.getMediaAccessStatus,requestDesktopMediaAccess:p.requestDesktopMediaAccess,selectSource:k,openSystemSettings:p.openSystemSettings,cancel:m,event$:g},destroy:()=>{c.destroy()}}}exports.INTERVAL_CHECK_ACTUAL_SOURCE=2e3,exports.JAZZ_SDK_CONTEXT_TOKEN=i,exports.JAZZ_SDK_DESKTOP_CAPTURER_TOKEN=c,exports.desktopCapturerPlugin=async function(){return s.createModule({name:"DesktopCapturerPlugin",imports:{sdkContext:i},factory:d,exports:{desktopCapturer:c}})},exports.getDesktopCapturer=function(e){return e.container.resolve(c)};