@milaboratories/pl-middle-layer 1.41.1 → 1.41.3

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/dist/index.js CHANGED
@@ -4,7 +4,7 @@
4
4
  errors: ${t};
5
5
  mean in ms: ${r};
6
6
  median in ms: ${n};
7
- `;return{ok:t===0,details:i}}function _a(s){const e=s.map(n=>n.elapsedMs).sort(),t=e.reduce((n,i)=>n+i)/e.length;let r;if(e.length>0){const n=Math.floor(e.length/2);r=e.length%2?e[n]:(e[n-1]+e[n])/2}return{mean:t,median:r}}async function Ka(s,e,t){try{const r=await Ha(s,e,t);return r!==`Hello, ${t}`?{status:"failed",message:`Template uploading failed: expected: ${t}, got: ${r}`}:{status:"ok",message:`Template uploading succeeded: ${r}`}}catch(r){return{status:"failed",message:`Template uploading failed: error occurred: ${r}`}}}async function Ha(s,e,t){var n;const r=await Re(e,me.Templates["check_network.upload_template"],!0,i=>({name:i.createValue(h.Pl.JsonObject,JSON.stringify(t))}),["greeting"]);try{return JSON.parse(w.notEmpty((n=(await he(e,r.greeting)).data)==null?void 0:n.toString()))}finally{r!=null&&await ke(e,Object.values(r))}}async function Wa(s,e,t,r,n,i){try{const o=await za(s,e,t,r,n,i);return o.type.name!=="Blob"?{status:"failed",message:`File uploading failed: ${o.type.name}`}:{status:"ok",message:`File uploading succeeded: ${o.type.name}`}}catch(o){return{status:"failed",message:`File uploading failed: error occurred: ${o}`}}}async function za(s,e,t,r,n,i){var c;const o=await t.getLocalFileHandle(i),a=await Re(n,me.Templates["check_network.upload_blob"],!0,l=>({file:l.createValue(h.Pl.JsonObject,JSON.stringify(o))}),["progress","file"]);try{const l=await he(n,a.progress);if(H.isUpload(l)){const u=H.ImportFileHandleUploadData.parse(JSON.parse(w.notEmpty((c=l.data)==null?void 0:c.toString())));H.isSignMatch(e,u.localPath,u.pathSignature)&&await H.uploadBlob(s,r,l,u,()=>!1,{nPartsWithThisUploadSpeed:10,nPartsToIncreaseUpload:10,currentSpeed:10,maxSpeed:10})}return await he(n,a.file)}finally{await ke(n,Object.values(a))}}async function Xa(s,e,t,r,n,i,o){try{const a=await Ya(s,e,t,r,n,i);return a!==o?{status:"failed",message:`File downloading failed: expected: ${o}, got: ${a}`}:{status:"ok",message:`File downloading succeeded: ${a}`}}catch(a){return{status:"failed",message:`File downloading failed: error occurred: ${a}`}}}async function Ya(s,e,t,r,n,i){var c;const o=await t.getLocalFileHandle(i),a=await Re(e,me.Templates["check_network.download_blob"],!0,l=>({file:l.createValue(h.Pl.JsonObject,JSON.stringify(o))}),["progress","file"]);try{const l=await he(e,a.progress);await H.uploadBlob(s,r,l,H.ImportFileHandleUploadData.parse(JSON.parse(w.notEmpty((c=l.data)==null?void 0:c.toString()))),()=>!1,{nPartsWithThisUploadSpeed:1,nPartsToIncreaseUpload:1,currentSpeed:1,maxSpeed:1});const u=await he(e,a.file),{content:d}=await n.downloadBlob(u);return await Jn.text(d)}finally{await ke(e,Object.values(a))}}async function Qa(s){try{const e=await Za(s);return e!==`Hello from go binary
7
+ `;return{ok:t===0,details:i}}function _a(s){const e=s.map(n=>n.elapsedMs).sort(),t=e.reduce((n,i)=>n+i)/e.length;let r;if(e.length>0){const n=Math.floor(e.length/2);r=e.length%2?e[n]:(e[n-1]+e[n])/2}return{mean:t,median:r}}async function Ka(s,e,t){try{const r=await Ha(s,e,t);return r!==`Hello, ${t}`?{status:"failed",message:`Template uploading failed: expected: ${t}, got: ${r}`}:{status:"ok",message:`Template uploading succeeded: ${r}`}}catch(r){return{status:"failed",message:`Template uploading failed: error occurred: ${r}`}}}async function Ha(s,e,t){var n;const r=await Re(e,me.Templates["check_network.upload_template"],!0,i=>({name:i.createValue(h.Pl.JsonObject,JSON.stringify(t))}),["greeting"]);try{return JSON.parse(w.notEmpty((n=(await he(e,r.greeting)).data)==null?void 0:n.toString()))}finally{r!=null&&await ke(e,Object.values(r))}}async function Wa(s,e,t,r,n,i){try{const o=await za(s,e,t,r,n,i);return o.type.name!=="Blob"?{status:"failed",message:`File uploading failed: ${o.type.name}`}:{status:"ok",message:`File uploading succeeded: ${o.type.name}`}}catch(o){return{status:"failed",message:`File uploading failed: error occurred: ${o}`}}}async function za(s,e,t,r,n,i){var c;const o=await t.getLocalFileHandle(i),a=await Re(n,me.Templates["check_network.upload_blob"],!0,l=>({file:l.createValue(h.Pl.JsonObject,JSON.stringify(o))}),["progress","file"]);try{const l=await he(n,a.progress);if(H.isUpload(l)){const u=H.ImportFileHandleUploadData.parse(JSON.parse(w.notEmpty((c=l.data)==null?void 0:c.toString())));H.isSignMatch(e,u.localPath,u.pathSignature)&&await H.uploadBlob(s,r,l,u,()=>!1,{nPartsWithThisUploadSpeed:10,nPartsToIncreaseUpload:10,currentSpeed:10,maxSpeed:10})}return await he(n,a.file)}finally{await ke(n,Object.values(a))}}async function Xa(s,e,t,r,n,i,o){try{const a=await Ya(s,e,t,r,n,i);return a!==o?{status:"failed",message:`File downloading failed: expected: ${o}, got: ${a}`}:{status:"ok",message:`File downloading succeeded: ${a}`}}catch(a){return{status:"failed",message:`File downloading failed: error occurred: ${a}`}}}async function Ya(s,e,t,r,n,i){var c;const o=await t.getLocalFileHandle(i),a=await Re(e,me.Templates["check_network.download_blob"],!0,l=>({file:l.createValue(h.Pl.JsonObject,JSON.stringify(o))}),["progress","file"]);try{const l=await he(e,a.progress);await H.uploadBlob(s,r,l,H.ImportFileHandleUploadData.parse(JSON.parse(w.notEmpty((c=l.data)==null?void 0:c.toString()))),()=>!1,{nPartsWithThisUploadSpeed:1,nPartsToIncreaseUpload:1,currentSpeed:1,maxSpeed:1});const u=await he(e,a.file);return await n.withBlobContent(u,{},{},async d=>await Jn.text(d))}finally{await ke(e,Object.values(a))}}async function Qa(s){try{const e=await Za(s);return e!==`Hello from go binary
8
8
  `?{status:"failed",message:`Software check failed: got: ${e}`}:{status:"ok",message:`Software check succeeded: ${e}`}}catch(e){return{status:"failed",message:`Software check failed: error occurred: ${e}`}}}async function Za(s){var t;const e=await Re(s,me.Templates["check_network.run_hello_world"],!0,r=>({}),["greeting"]);try{return w.notEmpty((t=(await he(s,e.greeting)).data)==null?void 0:t.toString())}finally{await ke(s,Object.values(e))}}async function ec(s,e){try{const t=await tc(s,e);return t!==`Hello, ${e}!
9
9
  `?{status:"failed",message:`Python software check failed: got: ${t}`}:{status:"ok",message:`Python software check succeeded: ${t}`}}catch(t){return{status:"failed",message:`Python software check failed: error occurred: ${t}`}}}async function tc(s,e){var r;const t=await Re(s,me.Templates["check_network.run_hello_world_py"],!0,n=>({name:n.createValue(h.Pl.JsonObject,JSON.stringify(e))}),["greeting"]);try{return w.notEmpty((r=(await he(s,t.greeting)).data)==null?void 0:r.toString())}finally{await ke(s,Object.values(t))}}async function rc(s,e,t,r){var n,i;try{const o=await t.getStorageList(),a={};for(const c of o){const l=await sc(t,c,r.nFilesToCheck,r.minFileSize,r.maxFileSize,r.minLsRequests);if(l.file===void 0){a[c.name]={status:"warn",message:`No file between ${r.minFileSize} and ${r.maxFileSize} bytes found in storage ${c.name}, checked ${l.nCheckedFiles} files, did ${l.nLsRequests} ls requests`};continue}s.info(`Downloading file ${JSON.stringify(l)} from storage ${c.name}`);const u=await Re(e,me.Templates["check_network.create_workdir_from_storage"],!0,d=>({file:d.createValue(h.Pl.JsonObject,JSON.stringify(l.file.handle))}),["workdirTypeName"]);try{const d=JSON.parse(Buffer.from((await he(e,u.workdirTypeName)).data).toString());d!=null&&d.startsWith("WorkingDirectory")?a[c.name]={status:"ok",message:`Workdir creation succeeded, size of file: ${(n=l.file)==null?void 0:n.size}, checked ${l.nCheckedFiles} files, did ${l.nLsRequests} ls requests`}:a[c.name]={status:"failed",message:`Workdir creation failed: ${d}, size of file: ${(i=l.file)==null?void 0:i.size}, checked ${l.nCheckedFiles} files, did ${l.nLsRequests} ls requests`}}finally{await ke(e,Object.values(u))}}return a}catch(o){return{unknown:{status:"failed",message:`Download from every storage failed: error occurred: ${o}`}}}}async function sc(s,e,t,r,n,i){const o=Dn(s,e,"",0);let a,c=0,l=0;for await(const{file:u,nLsRequests:d}of o){if(l=Math.max(l,d),c>=t&&l>i)return{file:a,nLsRequests:l,nCheckedFiles:c};if(c++,r<=u.size&&u.size<=n)return{file:u,nLsRequests:l,nCheckedFiles:c};u.size<r&&(a=u)}return{file:a,nLsRequests:l,nCheckedFiles:c}}async function*Dn(s,e,t,r){r++;const n=await s.listRemoteFilesWithAdditionalInfo(e.handle,t);for(const i of n.entries)if(i.type==="file"&&i.fullPath.startsWith(t))yield{file:i,nLsRequests:r};else if(i.type==="dir")for await(const o of Dn(s,e,i.fullPath,r))r=Math.max(o.nLsRequests,r),yield o}async function nc(){const s=_.join(Qs.tmpdir(),`check-network-big-temp-${Date.now()}.bin`),e=20*1024*1024,t=te.randomBytes(e);return await De.appendFile(s,t),{filePath:s}}async function oc(){const s=_.join(Qs.tmpdir(),`check-network-temp-${Date.now()}.txt`),e="Hello, world! "+new Date().toISOString();return await De.writeFile(s,e),{filePath:s,fileContent:e}}async function Re(s,e,t,r,n){return await s.withWriteTx("TemplateRender",async i=>{const o=await vr(e),a=Be(i,o),c=tt(i,a,t,r(i),n),l={};for(const u of n){const d=h.field(s.clientRoot,u);i.createField(d,"Dynamic",c[u]),l[u]=await h.toGlobalFieldId(d)}return await i.commit(),l})}async function he(s,e){return await h.poll(s,async t=>{const r=await t.tx.getField(e);if(h.isNotNullResourceId(r.error)){const n=await t.tx.getResourceData(r.error,!0);throw new Error(`getFieldValue of "${e.fieldName}" field failed: ${n.data}`)}if(h.isNullResourceId(r.value))throw new h.ContinuePolling;return await t.tx.getResourceData(r.value,!0)})}async function ke(s,e){await s.withWriteTx("DeleteFields",async t=>{for(const r of e)t.resetField(r);await t.commit()})}async function ic(s,e,t,r={}){const n=[];cc.forEach(i=>{qn.channel(i).subscribe(a=>{var u,d;const c=new Date().toISOString(),l={...a};(u=l==null?void 0:l.response)!=null&&u.headers&&(l.response={...l.response},l.response.headers=l.response.headers.slice(),l.response.headers=l.response.headers.map(p=>p.toString())),(d=l==null?void 0:l.request)!=null&&d.body&&(l.request={...l.request},l.request.body="too big"),n.push(JSON.stringify({timestamp:c,event:i,data:l}))})});try{const{logger:i,plConfig:o,client:a,signer:c,downloadClient:l,uploadBlobClient:u,lsDriver:d,httpClient:p,ops:f}=await $n(s,e,t,r),{filePath:y,fileContent:g}=await oc(),{filePath:b}=await nc(),F={plPings:await Va(f,o),blockRegistryOverviewChecks:await Ua(f,p),blockGARegistryOverviewChecks:await Ma(f,p),blockRegistryUiChecks:await qa(f,p),blockGARegistryUiChecks:await Ja(f,p),autoUpdateCdnChecks:await Ga(f,p),uploadTemplateCheck:await Ka(i,a,"Jack"),uploadFileCheck:await Wa(i,c,d,u,a,b),downloadFileCheck:await Xa(i,a,d,u,l,y,g),softwareCheck:await Qa(a),pythonSoftwareCheck:await ec(a,"Jack"),storageToDownloadReport:await rc(i,a,d,{minLsRequests:f.everyStorageMinLsRequests,bytesLimit:f.everyStorageBytesLimit,minFileSize:f.everyStorageMinFileSize,maxFileSize:f.everyStorageMaxFileSize,nFilesToCheck:f.everyStorageNFilesToCheck})};return ac(F,s,f,n)}catch(i){return`Unhandled error while checking the network: ${i}`}}async function $n(s,e,t,r={}){const n={pingCheckDurationMs:1e4,pingTimeoutMs:3e3,maxPingsPerSecond:50,httpTimeoutMs:3e3,blockRegistryDurationMs:3e3,maxRegistryChecksPerSecond:1,blockRegistryUrl:"https://blocks.pl-open.science",blockGARegistryUrl:"https://blocks-ga.pl-open.science",blockOverviewPath:"v2/overview.json",blockUiPath:"v2/milaboratories/samples-and-data/1.7.0/ui.tgz",autoUpdateCdnDurationMs:5e3,maxAutoUpdateCdnChecksPerSecond:1,autoUpdateCdnUrl:"https://cdn.platforma.bio/software/platforma-desktop-v2/windows/amd64/latest.yml",bodyLimit:300,everyStorageBytesLimit:1024,everyStorageMinFileSize:1024,everyStorageMaxFileSize:209715200,everyStorageNFilesToCheck:300,everyStorageMinLsRequests:50,...r},i=h.plAddressToConfig(s,{defaultRequestTimeout:n.pingTimeoutMs});i.alternativeRoot=`check_network_${te.randomUUID()}`;const o=new h.UnauthenticatedPlClient(i);let a={};e&&t&&(a=await o.login(e,t));const c=await h.PlClient.init(s,{authInformation:a}),l=o.ll.httpDispatcher,u=new w.ConsoleLoggerAdapter,d=new w.HmacSha256Signer("localSecret"),p=H.createDownloadClient(u,c,[]),f=H.createUploadBlobClient(c,u),y=await H.LsDriver.init(u,c,d,[],()=>Promise.resolve([]),[]);return{logger:u,plConfig:i,client:c,signer:d,downloadClient:p,uploadBlobClient:f,lsDriver:y,httpClient:l,ops:n,terminate:async()=>{p.close(),f.close(),await l.close(),await c.close()}}}function ac(s,e,t,r){const n=s.plPings.filter(b=>b.response.ok),i=s.plPings.filter(b=>!b.response.ok),o=[...new Set(n.map(b=>JSON.stringify(b.response.value)))],a=b=>b?"OK":"FAILED",c=b=>b.status==="ok"?"OK":b.status==="warn"?"WARN":"FAILED",l=be(s.plPings),u=be(s.blockRegistryOverviewChecks),d=be(s.blockGARegistryOverviewChecks),p=be(s.blockRegistryUiChecks),f=be(s.blockGARegistryUiChecks),y=be(s.autoUpdateCdnChecks),g=Object.entries(s.storageToDownloadReport).map(([b,F])=>`${c(F)} ${b} storage check`).join(`
10
10
  `);return`