/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/@scrypted/client@1.3.26/dist/packages/client/src/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,r,t,o){void 0===o&&(o=t);var n=Object.getOwnPropertyDescriptor(r,t);n&&!("get"in n?!r.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,o,n)}:function(e,r,t,o){void 0===o&&(o=t),e[o]=r[t]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,r){Object.defineProperty(e,"default",{enumerable:!0,value:r})}:function(e,r){e.default=r}),__importStar=this&&this.__importStar||function(){var e=function(r){return e=Object.getOwnPropertyNames||function(e){var r=[];for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[r.length]=t);return r},e(r)};return function(r){if(r&&r.__esModule)return r;var t={};if(null!=r)for(var o=e(r),n=0;n<o.length;n++)"default"!==o[n]&&__createBinding(t,r,o[n]);return __setModuleDefault(t,r),t}}(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.ScryptedClientLoginError=exports.rpc_serializer=exports.rpc=void 0,exports.logoutScryptedClient=logoutScryptedClient,exports.getCurrentBaseUrl=getCurrentBaseUrl,exports.loginScryptedClient=loginScryptedClient,exports.checkScryptedClientLogin=checkScryptedClientLogin,exports.redirectScryptedLogin=redirectScryptedLogin,exports.combineBaseUrl=combineBaseUrl,exports.redirectScryptedLogout=redirectScryptedLogout,exports.connectScryptedClient=connectScryptedClient;const eio=__importStar(require("engine.io-client")),promise_utils_1=require("../../../common/src/promise-utils"),mediaobject_1=require("../../../server/src/plugin/mediaobject"),plugin_remote_1=require("../../../server/src/plugin/plugin-remote"),rpc_1=require("../../../server/src/rpc"),rpc_serializer_1=require("../../../server/src/rpc-serializer"),package_json_1=__importDefault(require("../package.json")),ip_1=require("./ip"),fetch_1=require("../../../server/src/fetch"),http_fetch_1=require("../../../server/src/fetch/http-fetch");let fetcher;exports.rpc=__importStar(require("../../../server/src/rpc")),exports.rpc_serializer=__importStar(require("../../../server/src/rpc-serializer"));try{if("browser"===process.arch)throw new Error;require("net"),require("events"),fetcher=http_fetch_1.httpFetch}catch(e){fetcher=fetch_1.domFetch}const sourcePeerId=rpc_1.RpcPeer.generateId();function once(e,r){return new Promise(((t,o)=>{const n=e=>{i(),o(e)},s=(...e)=>{i(),t(e)},i=()=>{e.removeListener("error",n),e.removeListener(r,s)};e.once("error",n),e.once(r,s)}))}function isInstalledApp(){return globalThis.navigator?.userAgent.includes("InstalledApp")}function isRunningStandalone(){return globalThis.matchMedia?.("(display-mode: standalone)").matches||isInstalledApp()}async function logoutScryptedClient(e){const r=combineBaseUrl(e,"logout");return(await fetcher({url:r,withCredentials:!0,responseType:"json",rejectUnauthorized:!1})).body}function getCurrentBaseUrl(){const e=new URL(window.location.href);e.search="",e.hash="";const r=window.location.pathname.split("/"),t=r.findIndex((e=>"endpoint"===e));if(-1===t)return;const o=r.slice(0,t);return o.push(""),e.pathname=o.join("/"),e.toString()}async function loginScryptedClient(e){let{baseUrl:r,username:t,password:o,change_password:n,maxAge:s}=e;!s&&isRunningStandalone()&&(s=31536e6);const i=combineBaseUrl(r,"login"),c=await fetcher({url:i,body:{username:t,password:o,change_password:n,maxAge:s},rejectUnauthorized:!1,withCredentials:!0,responseType:"json"});if(200!==c.statusCode)throw new Error("status "+c.statusCode);const{body:a}=c;return{error:a.error,authorization:a.authorization,queryToken:a.queryToken,token:a.token,addresses:a.addresses,externalAddresses:a.externalAddresses,hostname:a.hostname,scryptedCloud:"true"===c.headers.get("x-scrypted-cloud"),directAddress:c.headers.get("x-scrypted-direct-address"),cloudAddress:c.headers.get("x-scrypted-cloud-address"),serverId:c.headers.get("x-scrypted-server-id")}}async function checkScryptedClientLogin(e){let{baseUrl:r}=e||{},t=combineBaseUrl(r,"login");const o=new Headers;if(e?.previousLoginResult?.queryToken){const r=e?.previousLoginResult.username+":"+e.previousLoginResult.token,t=Buffer.from(r).toString("base64");o.set("Authorization",`Basic ${t}`)}const n=await fetcher({url:t,withCredentials:!0,headers:o,rejectUnauthorized:!1,responseType:"json"}),{body:s}=n;return{baseUrl:r,hostname:s.hostname,redirect:s.redirect,username:s.username,expiration:s.expiration,hasLogin:!!s.hasLogin,error:s.error,authorization:s.authorization,queryToken:s.queryToken,token:s.token,addresses:s.addresses,externalAddresses:s.externalAddresses,scryptedCloud:"true"===n.headers.get("x-scrypted-cloud"),directAddress:n.headers.get("x-scrypted-direct-address"),cloudAddress:n.headers.get("x-scrypted-cloud-address"),serverId:n.headers.get("x-scrypted-server-id")}}class ScryptedClientLoginError extends Error{result;constructor(e){super(e.error),this.result=e}}function redirectScryptedLogin(e){let{baseUrl:r,redirect:t}=e||{};if(t=t||"/endpoint/@scrypted/core/public/",r){const e=new URL(t,r);e.searchParams.set("redirect_uri",window.location.href),t=e.toString()}else t=`${t}?redirect_uri=${encodeURIComponent(window.location.href)}`;const o=t;console.log("redirect_uri",o),globalThis.location.href=o}function combineBaseUrl(e,r){return e?new URL(r,e).toString():"/"+r}async function redirectScryptedLogout(e){globalThis.location.href=combineBaseUrl(e,"logout")}async function connectScryptedClient(e){const r=Date.now();let t,o,n,s,i,c,a,d,l,u,{baseUrl:p,pluginId:g,clientName:h,username:f,password:y}=e;console.log("@scrypted/client",package_json_1.default.version);const m={},w=globalThis.navigator?.userAgent.includes("Chrome"),_=!w||isInstalledApp();let v,b=!1;if(f&&y){const E=await loginScryptedClient(e);E.authorization&&(m.Authorization=E.authorization),n=E.addresses,s=E.externalAddresses,i=E.scryptedCloud,c=E.directAddress,a=E.cloudAddress,t=E.authorization,o=E.queryToken,l=E.token,d=E.hostname,u=E.serverId,console.log("login result",Date.now()-r,E)}else{const H=new Set;if(e?.previousLoginResult?.token){for(const V of[...e?.previousLoginResult?.localAddresses||[],e?.previousLoginResult?.directAddress])V&&(_||e.direct)&&H.add(V);for(const W of[...e?.previousLoginResult?.externalAddresses||[],e?.previousLoginResult?.cloudAddress])W&&H.add(W)}function $(e){if(e.error||e.redirect)throw new ScryptedClientLoginError(e);if(!e.authorization||!e.username||!e.queryToken)throw console.error(e),new Error("malformed login result");return e}const F=[...H].map((r=>checkScryptedClientLogin({baseUrl:r,previousLoginResult:e?.previousLoginResult}).then($))),N=checkScryptedClientLogin({baseUrl:p,previousLoginResult:e?.previousLoginResult}).then($);let J;F.push(N);try{J=await Promise.any(F),b||=J.baseUrl!==p}catch(G){J=await N}if(b&&console.log("Found direct login. Allowing alternate addresses."),J.error||J.redirect)throw new ScryptedClientLoginError(J);n=J.addresses,s=J.externalAddresses,i=J.scryptedCloud,c=J.directAddress,a=J.cloudAddress,f=J.username,t=J.authorization,o=J.queryToken,l=J.token,d=J.hostname,u=J.serverId,console.log("login checked",Date.now()-r,J)}const S=`endpoint/${g}/engine.io/api`,x=p?new URL(S,p).pathname:"/"+S,k=Math.random().toString(36).substring(3,10),C={path:x,query:{cacheBust:k},withCredentials:!0,extraHeaders:m,rejectUnauthorized:!1,transports:e?.transports},T=p||`${globalThis.location.protocol}//${globalThis.location.host}`,A=[],L=_;b||=i,(b&&void 0===e.local&&L||e.local)&&n&&A.push(...n);const R=c&&(_||!(0,ip_1.isIPAddress)(c));if((b&&void 0===e.direct&&R||e.direct)&&c&&A.push(c),b&&void 0===e.direct||e.direct){a&&A.push(a);for(const K of s||[])A.push(K)}const j=!!A.length;console.log({tryLocalAddressess:j});const P={...C,extraHeaders:{...C.extraHeaders}};P.extraHeaders.Authorization||=t;let z=[];const U=[];if(j)for(const Q of new Set(A)){console.log("trying",Q);const X=new eio.Socket(Q,P);z.push(X),U.push((async()=>(await once(X,"open"),{connectionType:"http-direct",ready:X,address:Q}))())}const M=[...U];U.push((async()=>{const e=j?1e3:0;if(console.log("waiting",e),e)try{const r=Promise.any(M);return await(0,promise_utils_1.timeoutPromise)(e,r),void console.log("found direct connection, aborting scrypted cloud connection")}catch(e){}const r=new eio.Socket(T,C);return z.push(r),await once(r,"open"),{ready:r,address:T,connectionType:i?"http-cloud":"http"}})());const q=Promise.any(U);let{ready:B,connectionType:I,address:O,rpcPeer:D}=await q;console.log("connected",I,O),v=B,z=z.filter((e=>e!==B)),z.forEach((e=>{try{e.close()}catch(e){}}));try{if(!D){const ge=(0,rpc_serializer_1.createRpcSerializer)({sendMessageBuffer:e=>v.send(e),sendMessageFinish:e=>v.send(JSON.stringify(e))});D=new rpc_1.RpcPeer(h||"engine.io-client","api",((e,r,t)=>{try{ge.sendMessage(e,r,t)}catch(e){r?.(e)}})),v.on("message",(e=>{e.constructor===Buffer||e.constructor===ArrayBuffer?ge.onMessageBuffer(Buffer.from(e)):ge.onMessageFinish(JSON.parse(e))})),ge.setupRpcPeer(D)}const Y=await(0,plugin_remote_1.attachPluginRemote)(D,void 0),{serverVersion:Z,systemManager:ee,deviceManager:re,endpointManager:te,mediaManager:oe,clusterManager:ne}=Y;console.log("api attached",Date.now()-r),oe.createMediaObject=async(e,r,t)=>new mediaobject_1.MediaObject(r,e,t);const[se]=await Promise.all([(async()=>{try{return!!await ee.getComponent("info")}catch(e){}return!1})()]);console.log("api initialized",Date.now()-r);const ie=Object.keys(ee.getSystemState()).map((e=>ee.getDeviceById(e))).find((e=>"@scrypted/core"===e.pluginId&&e.nativeId===`user:${f}`)),ce=new Map,ae=new FinalizationRegistry((e=>{e.kill("object finalized")})),de=(r,t)=>{if(!t?.dedicatedTransport){let e=ce.get(r.port);if(e)return e}const n=(async()=>{const n={path:new URL("engine.io/connectRPCObject",O).pathname,query:{cacheBust:k,clusterObject:JSON.stringify(r),...o},withCredentials:!0,extraHeaders:m,rejectUnauthorized:!1,transports:e?.transports},s=new eio.Socket(O,n);let i,c,a,d=!1;const l=()=>{i&&(clearTimeout(i),i=void 0),c&&(clearTimeout(c),c=void 0)},u=t?.dedicatedTransport?.receiveTimeout?()=>{i&&clearTimeout(i),i=setTimeout((()=>{a&&a.kill("receive timeout")}),t.dedicatedTransport.receiveTimeout)}:void 0,p=t?.dedicatedTransport?.sendTimeout?()=>{c&&clearTimeout(c),c=setTimeout((()=>{a&&a.kill("send timeout")}),t.dedicatedTransport.sendTimeout)}:void 0;s.on("close",(()=>{if(a?.kill("socket closed"),t?.dedicatedTransport||ce.delete(r.port),!d)throw new Error("peer disconnected before setup completed")}));try{await once(s,"open");const e=(0,rpc_serializer_1.createRpcDuplexSerializer)({write:e=>{p?.(),s.send(e)}});return s.on("message",(r=>{u?.(),e.onData(Buffer.from(r))})),a=new rpc_1.RpcPeer(h||"engine.io-client","cluster-proxy",((r,t,o)=>{try{p?.(),e.sendMessage(r,t,o)}catch(e){t?.(e)}})),a.killedSafe.finally((()=>{l(),s.close()})),e.setupRpcPeer(a),a.tags.localPort=sourcePeerId,d=!0,u?.(),p?.(),a}catch(e){throw l(),console.error("failure ipc connect",e),s.close(),e}})();return t?.dedicatedTransport||ce.set(r.port,n),n},le=async(e,r)=>{const t=await ce.get(r);return t?.remoteWeakProxies?Object.values(t.remoteWeakProxies).find((r=>r.deref()?.__cluster?.proxyId==e))?.deref():null},ue=async(e,r)=>{const t=e?.__cluster;if(!t)return e;const{port:o,proxyId:n}=t,s=await le(n,o);if(s)return s;try{const e=de(t,r),o=await e,n=await o.getParam("connectRPCObject");try{const e=await n(t);if(!e)throw new Error("ipc object not found?");return r?.dedicatedTransport&&ae.register(e,o),e}catch(e){throw r?.dedicatedTransport&&o.kill("connectRPCObject failed"),e}}catch(r){return console.error("failure ipc",r),e}},pe={userId:ie?.id,serverVersion:Z,username:f,pluginRemoteAPI:void 0,address:O,connectionType:I,admin:se,systemManager:ee,clusterManager:ne,deviceManager:re,endpointManager:te,mediaManager:oe,disconnect(){D.kill("disconnect requested")},pluginHostAPI:void 0,rpcPeer:D,loginResult:{username:f,token:l,directAddress:c,localAddresses:n,externalAddresses:s,scryptedCloud:i,queryToken:o,authorization:t,cloudAddress:a,hostname:d,serverId:u},connectRPCObject:ue,fork:void 0,connect:void 0};return v.on("close",(()=>{D.kill("socket closed")})),D.killed.finally((()=>{v.close(),pe.onClose?.()})),pe}catch(he){throw v.close(),he}}exports.ScryptedClientLoginError=ScryptedClientLoginError;
//# sourceMappingURL=/sm/74b491433c8088a61b961d81a05fc3eee35c3738d0b06088b06ce7d27bd3b299.map