UNPKG

@salutejs/jazz-sdk-electron-plugins

Version:

Jazz SDK electron plugins

2 lines (1 loc) 8.51 kB
import{createEventBus as e,createModule as t}from"@salutejs/jazz-sdk-electron/main";import{systemPreferences as s,desktopCapturer as r,session as o,ipcMain as n,webContents as a,shell as i}from"electron";import{platform as c,loadavg as u,freemem as d,totalmem as l,cpus as p,release as f,arch as y}from"os";import{createScope as g}from"rx-effects";import{token as m}from"ditox";import{pairwise as v,skip as h,tap as S,combineLatest as w,from as k,filter as b,map as A,interval as x,switchMap as M,catchError as C,EMPTY as $}from"rxjs";function L(e,t,s,r){return new(s||(s=Promise))((function(t,o){function n(e){try{i(r.next(e))}catch(e){o(e)}}function a(e){try{i(r.throw(e))}catch(e){o(e)}}function i(e){var r;e.done?t(e.value):(r=e.value,r instanceof s?r:new s((function(e){e(r)}))).then(n,a)}i((r=r.apply(e,[])).next())}))}const D="jazz-sdk-desktop-capturer-ipc-channel";const E=m({key:"JAZZ_SDK_MAIN_CONTEXT_TOKEN"});const I=t=>{const{logger:s,access:o,platform:n}=t,a=g(),i=a.createStore(void 0),u=a.createStore([]),d=e();a.subscribe(u.value$.pipe(v(),h(1),S((([e,t])=>{const{added:s,removed:r}=function(e,t){const s=new Map(t.map((e=>[e.id,e]))),r=new Map(e.map((e=>[e.id,e])));for(let t=0;t<e.length;t++)s.delete(e[t].id);for(let e=0;e<t.length;e++)r.delete(t[e].id);return{added:[...s.values()],removed:[...r.values()]}}(e,t);0===s.length&&0===r.length||d({type:"updateSources",payload:{sources:t,added:s,removed:r}})}))));const l=c();let p;let f=g();a.handle(w([i.value$,o.$screenAccessStatus.value$.pipe(b((e=>"granted"===e))),k(L(void 0,0,void 0,(function*(){var e,t,s;if("linux"!==l)return!1;if(void 0!==p)return p;const r=n.getLinuxSessionInfo();return p=!(!r||!r.waylandDisplay&&!(null===(e=r.xdgSessionType)||void 0===e?void 0:e.toLowerCase().includes("wayland"))&&!(null===(t=r.desktopSession)||void 0===t?void 0:t.toLowerCase().includes("plasma"))&&!(null===(s=r.xdgSessionType)||void 0===s?void 0:s.toLowerCase().includes("plasma")))}))).pipe(b((e=>!e)))]).pipe(A((e=>e[0]))),(e=>{if(!e)return f.destroy(),void(f=g());f.subscribe(x(2e3).pipe(M((()=>k(y({types:["screen","window"],images:e.images})))),S((e=>{"failure"!==e.type&&u.set(e.value.sources)})),C((e=>(s.error("Fail get desktop capture sources",e),$)))))}));const y=e=>L(void 0,0,void 0,(function*(){const{types:t,images:o}=e;s.debug("getDesktopCapturerSources with option",JSON.stringify(e));try{const e=yield r.getSources({types:t,thumbnailSize:o.isEnable?o.thumbnailSize:{height:0,width:0}});return{type:"success",value:{sources:e.filter((e=>"Gesture Blocking Overlay"!==e.name&&"App Icon Window"!==e.name&&!("window"===e.id.split(":")[0]&&"Window"===e.name))).map((e=>({id:e.id,name:e.name,type:e.id.split(":")[0],displayId:e.display_id,image:o.isEnable?e.thumbnail.toDataURL():void 0})))}}}catch(e){return{type:"failure",error:{message:e instanceof Error?e.message:"Failed to get sources"}}}})),m=()=>{const e=i.get();e&&(d({type:"finishProcess",payload:e}),i.set(void 0))};return{$processType:i,startProcess:e=>L(void 0,0,void 0,(function*(){return m(),i.set(e),d({type:"startProcess",payload:e}),y({types:["screen","window"],images:e.images})})),finishProcess:m,getDesktopCapturerSources:y,destroy:()=>{a.destroy()},event$:d.event$}};function P(){return L(this,0,void 0,(function*(){return t({name:"DesktopCapturerPlugin",imports:{sdkContext:E},factory:F})}))}function F(e){const{deps:{sdkContext:{logger:t,platform:r}}}=e,m=t.getLogger("DesktopCapturer"),v=g(),h=v.createController((()=>(e=>{const{logger:t}=e,r=g(),o=r.createStore("unknown"),n=r.createStore("unknown"),a=r.createStore("unknown");return{$cameraAccessStatus:n,$microphoneAccessStatus:o,$screenAccessStatus:a,getMediaAccessStatus:e=>{const{type:r}=e;t.debug("getMediaAccessStatus",r);const i="darwin"===process.platform||"win32"===process.platform,c=i?s.getMediaAccessStatus(r):"granted";return i?t.debug("getMediaAccessStatus has status:",c):t.debug("getMediaAccessStatus is unsupported"),"camera"===r?o.set(c):"microphone"===r?n.set(c):"screen"===r&&a.set(c),{status:c}},destroy:()=>{}}})({logger:m}))),S=v.createController((()=>I({logger:m,access:h,platform:r}))),w=c();o.defaultSession.setDisplayMediaRequestHandler(((e,t)=>{n.once("jazz-sdk-reply-display-media-stream",((e,s)=>{const{source:r,audio:o}=s;if(m.debug("Received DisplayMedia stream:",null==r?void 0:r.id,"audio:",o),!r)return;const n={video:{id:r.id,name:r.name}};"linux"!==w&&o&&(n.audio="loopback"),t(n)})),e.frame.send("jazz-sdk-ask-display-media-stream"),m.debug("Ask DisplayMedia stream")}));n.removeHandler(D),n.handle(D,((e,t)=>L(this,0,void 0,(function*(){switch(t.type){case"getDesktopCapturerSources":return x(t.payload);case"askForMediaAccess":return M(t.payload);case"getMediaAccessStatus":return C(t.payload);case"systemSettings":return $(t.payload);case"osInfo":return k();case"capturerSourcesStartProcess":return b(e,t.payload);case"capturerSourcesFinishProcess":return A();default:!function(e){throw new Error(`Unexpected value ${e}`)}(t)}})))),v.add((()=>n.removeHandler(D))),v.handle(S.event$,(e=>{var t;const s=S.$processType.get();s&&(null===(t=a.fromId(s.frameId))||void 0===t||t.send("jazz-sdk-capturer-sources-event",e))}));const k=()=>L(this,0,void 0,(function*(){const e=yield r.getLinuxDistributionInfo(),t=yield r.getLinuxSessionInfo();return{type:"osInfo",payload:{arch:y(),platform:c(),release:f(),cpus:p(),totalmem:l(),freemem:d(),loadavg:u(),linuxSessionInfo:t,linuxDistributionInfo:e}}})),b=(e,t)=>L(this,0,void 0,(function*(){return{type:"capturerSourcesStartProcess",payload:yield S.startProcess({frameId:e.frameId,images:(null==t?void 0:t.images)||{isEnable:!1}})}})),A=()=>L(this,0,void 0,(function*(){return S.finishProcess(),{type:"capturerSourcesFinishProcess"}})),x=e=>L(this,0,void 0,(function*(){return{type:"getDesktopCapturerSources",payload:yield S.getDesktopCapturerSources(e)}})),M=e=>L(this,0,void 0,(function*(){const{type:t}=e;return"darwin"===process.platform||"win32"===process.platform?z(t,m):(m.debug("AskForMediaAccess unsupported by OS"),{type:"askForMediaAccess",payload:{status:!0,type:t}})})),C=e=>L(this,0,void 0,(function*(){return{type:"getMediaAccessStatus",payload:h.getMediaAccessStatus(e)}})),$=e=>L(this,0,void 0,(function*(){const{key:t}=e,s=j(t);return s.length>0&&(yield i.openExternal(s)),{type:"systemSettings",payload:{key:t}}}));return{destroy:()=>{v.destroy()}}}function z(e,t){return L(this,0,void 0,(function*(){return s.askForMediaAccess(e).then((s=>(t.debug("AskForMediaAccess has status",s),{type:"askForMediaAccess",payload:{status:s,type:e}}))).catch((s=>(t.debug("AskForMediaAccess catch error",s),{type:"askForMediaAccess",payload:{status:!1,type:e}})))}))}function j(e){if("darwin"===process.platform)switch(e){case"microphone-security":return"x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone";case"camera-security":return"x-apple.systempreferences:com.apple.preference.security?Privacy_Camera";case"screen-share-security":return"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture";default:return"x-apple.systempreferences:"}if("win32"===process.platform)switch(e){case"microphone-security":return"ms-settings:privacy-microphone";case"camera-security":return"ms-settings:privacy-webcam";default:return"ms-settings:"}return""}const O={debug:"DEBUG",info:"INFO ",warn:"WARN ",error:"ERROR"};function _(e){const t=function(e){switch(e){case"debug":return console.debug;case"info":return console.log;case"warn":return console.warn;default:return console.error}}(e.level);t&&t(`${O[e.level]} [${e.tag}]`,...e.messages)}function R(e){return L(this,0,void 0,(function*(){return t({imports:{sdkContext:E},factory:t=>function(e){var t,s;const{deps:{sdkContext:r},options:o={}}=e,n=null!==(t=o.isEnableStdout)&&void 0!==t&&t,a=null!==(s=o.logLevel)&&void 0!==s?s:"info",i=o.subscribe,{logMessage:c,logLevelWeight:u,getLogBuffer:d}=r.logs,l=g();n&&l.createController((()=>function(e){const{logEvent$:t,logLevel:s,getLogBuffer:r,logLevelWeight:o}=e,n=o.info,a=g(),i=s?o[s]:n;a.handle(t,(e=>{u(e)&&_(e)}));const c=r();function u(e){return o[e.level]>=i}return c.length>0&&c.forEach((e=>{u(e)&&_(e)})),{destroy:a.destroy}}({logEvent$:c.event$,logLevel:a,getLogBuffer:d,logLevelWeight:u})));if(i){l.handle(c.event$,(e=>{i(e)}));const e=d();e.length>0&&e.forEach((e=>{i(e)}))}return{destroy:()=>{l.destroy()}}}(Object.assign(Object.assign({},t),{options:e}))})}))}export{P as desktopCapturerPlugin,j as getSystemSettingsUrl,z as handleAskForMediaAccess,R as logsPlugin};