@milaboratories/pl-drivers 1.5.53 → 1.5.55

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.
Files changed (34) hide show
  1. package/dist/drivers/{download_blob.d.ts → download_blob/download_blob.d.ts} +7 -8
  2. package/dist/drivers/download_blob/download_blob.d.ts.map +1 -0
  3. package/dist/drivers/{download_blob_task.d.ts → download_blob/download_blob_task.d.ts} +1 -1
  4. package/dist/drivers/download_blob/download_blob_task.d.ts.map +1 -0
  5. package/dist/drivers/helpers/files_cache.d.ts.map +1 -1
  6. package/dist/drivers/logs.d.ts +1 -1
  7. package/dist/drivers/logs.d.ts.map +1 -1
  8. package/dist/drivers/upload_task.d.ts +2 -0
  9. package/dist/drivers/upload_task.d.ts.map +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.mjs +714 -709
  15. package/dist/index.mjs.map +1 -1
  16. package/package.json +8 -11
  17. package/src/clients/download.test.ts +1 -1
  18. package/src/clients/upload.test.ts +2 -1
  19. package/src/drivers/{download_blob.test.ts → download_blob/download_blob.test.ts} +3 -3
  20. package/src/drivers/{download_blob.ts → download_blob/download_blob.ts} +59 -42
  21. package/src/drivers/{download_blob_task.ts → download_blob/download_blob_task.ts} +3 -3
  22. package/src/drivers/download_blob_url/driver.ts +1 -1
  23. package/src/drivers/download_blob_url/url.test.ts +1 -1
  24. package/src/drivers/download_url.test.ts +1 -1
  25. package/src/drivers/helpers/files_cache.test.ts +1 -1
  26. package/src/drivers/helpers/files_cache.ts +10 -3
  27. package/src/drivers/logs.test.ts +2 -2
  28. package/src/drivers/logs.ts +1 -1
  29. package/src/drivers/ls.test.ts +1 -1
  30. package/src/drivers/upload.test.ts +1 -1
  31. package/src/drivers/upload_task.ts +2 -2
  32. package/src/index.ts +1 -1
  33. package/dist/drivers/download_blob.d.ts.map +0 -1
  34. package/dist/drivers/download_blob_task.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var it=Object.defineProperty;var at=(s,e,t)=>e in s?it(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var h=(s,e,t)=>at(s,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("@milaboratories/pl-client"),lt=require("node:fs/promises"),ke=require("undici"),y=require("@protobuf-ts/runtime-rpc"),i=require("@protobuf-ts/runtime"),p=require("@milaboratories/ts-helpers"),F=require("node:fs"),b=require("node:path"),L=require("node:stream"),se=require("node:stream/consumers"),f=require("@milaboratories/computable"),m=require("@milaboratories/pl-tree"),ct=require("denque"),P=require("node:crypto"),Le=require("node:os"),dt=require("node:readline/promises"),k=require("zod"),ht=require("node:zlib"),ut=require("tar-fs"),pt=require("decompress"),Pe=require("node:timers/promises"),gt=require("node:assert"),ft=require("@milaboratories/pl-model-common"),mt=require("node:util"),wt=require("node:child_process");function U(s){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const t in s)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(s,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>s[t]})}}return e.default=s,Object.freeze(e)}const w=U(lt),ie=U(F),T=U(b),me=U(Le),yt=U(dt),Ue=U(ht),ee=U(ut);class Tt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Tt;class bt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Init",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new bt;class kt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Init.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Lt=new kt;class Pt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Init.Response",[{no:1,name:"parts_count",kind:"scalar",T:4,L:0},{no:2,name:"uploaded_parts",kind:"scalar",repeat:1,T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.partsCount=0n,t.uploadedParts=[],e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.partsCount=e.uint64().toBigInt();break;case 2:if(d===i.WireType.LengthDelimited)for(let z=e.int32()+e.pos;e.pos<z;)o.uploadedParts.push(e.uint64().toBigInt());else o.uploadedParts.push(e.uint64().toBigInt());break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){if(e.partsCount!==0n&&t.tag(1,i.WireType.Varint).uint64(e.partsCount),e.uploadedParts.length){t.tag(2,i.WireType.LengthDelimited).fork();for(let o=0;o<e.uploadedParts.length;o++)t.uint64(e.uploadedParts[o]);t.join()}const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ut=new Pt;class It extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.UpdateProgress",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new It;class Rt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.UpdateProgress.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"bytes_processed",kind:"scalar",T:3,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.bytesProcessed=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.bytesProcessed=e.int64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.bytesProcessed!==0n&&t.tag(2,i.WireType.Varint).int64(e.bytesProcessed);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Dt=new Rt;class St extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.UpdateProgress.Response",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const vt=new St;class Nt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Nt;class Bt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"part_number",kind:"scalar",T:4,L:0},{no:3,name:"uploaded_part_size",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.partNumber=0n,t.uploadedPartSize=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.partNumber=e.uint64().toBigInt();break;case 3:o.uploadedPartSize=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.partNumber!==0n&&t.tag(2,i.WireType.Varint).uint64(e.partNumber),e.uploadedPartSize!==0n&&t.tag(3,i.WireType.Varint).uint64(e.uploadedPartSize);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ct=new Bt;class $t extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL.HTTPHeader",[{no:1,name:"Name",kind:"scalar",jsonName:"Name",T:9},{no:2,name:"Value",kind:"scalar",jsonName:"Value",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.name="",t.value="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.name=e.string();break;case 2:o.value=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.name!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.name),e.value!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.value);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const x=new $t;class Ft extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL.Response",[{no:1,name:"upload_url",kind:"scalar",T:9},{no:2,name:"method",kind:"scalar",T:9},{no:3,name:"headers",kind:"message",repeat:1,T:()=>x},{no:4,name:"chunk_start",kind:"scalar",T:4,L:0},{no:5,name:"chunk_end",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.uploadUrl="",t.method="",t.headers=[],t.chunkStart=0n,t.chunkEnd=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.uploadUrl=e.string();break;case 2:o.method=e.string();break;case 3:o.headers.push(x.internalBinaryRead(e,e.uint32(),n));break;case 4:o.chunkStart=e.uint64().toBigInt();break;case 5:o.chunkEnd=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.uploadUrl!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.uploadUrl),e.method!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.method);for(let o=0;o<e.headers.length;o++)x.internalBinaryWrite(e.headers[o],t.tag(3,i.WireType.LengthDelimited).fork(),n).join();e.chunkStart!==0n&&t.tag(4,i.WireType.Varint).uint64(e.chunkStart),e.chunkEnd!==0n&&t.tag(5,i.WireType.Varint).uint64(e.chunkEnd);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Wt=new Ft;class _t extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Finalize",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new _t;class Mt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Finalize.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Et=new Mt;class Ot extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Finalize.Response",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ht=new Ot,A=new y.ServiceType("MiLaboratories.Controller.Shared.Upload",[{name:"Init",options:{},I:Lt,O:Ut},{name:"GetPartURL",options:{},I:Ct,O:Wt},{name:"UpdateProgress",options:{},I:Dt,O:vt},{name:"Finalize",options:{},I:Et,O:Ht}]);class zt{constructor(e){h(this,"typeName",A.typeName);h(this,"methods",A.methods);h(this,"options",A.options);this._transport=e}init(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}getPartURL(e,t){const n=this.methods[1],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}updateProgress(e,t){const n=this.methods[2],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}finalize(e,t){const n=this.methods[3],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}function Ie(s,e,t){const n=Object.fromEntries(s.map(({name:r,value:o})=>[r,o]));return e!==void 0&&t!==void 0&&(n.Range=`bytes=${e}-${t}`),n}class ae extends Error{}class le extends Error{}class ce extends Error{}class de extends Error{}class Re{constructor(e,t,n,r){h(this,"grpcClient");this.grpcTransport=e,this.httpClient=t,this.logger=r,this.grpcClient=new zt(this.grpcTransport)}close(){}async initUpload({id:e,type:t},n){const r=await this.grpcInit(e,t,n);return{overall:r.partsCount,toUpload:this.partsToUpload(r.partsCount,r.uploadedParts)}}async partUpload({id:e,type:t},n,r,o,l){const a=await this.grpcGetPartUrl({id:e,type:t},o,0n,l),d=await xt(n,a.chunkStart,a.chunkEnd);await jt(n,r);try{const{body:c,statusCode:u,headers:z}=await ke.request(a.uploadUrl,{dispatcher:this.httpClient,body:d,headersTimeout:6e4,bodyTimeout:6e4,headers:Ie(a.headers),method:a.method.toUpperCase()}),st=await c.text();Gt(u,st,z,a)}catch(c){throw c instanceof ce?c:new Error(`partUpload: error ${JSON.stringify(c)} happened while trying to do part upload to the url ${a.uploadUrl}, headers: ${JSON.stringify(a.headers)}`)}await this.grpcUpdateProgress({id:e,type:t},BigInt(a.chunkEnd-a.chunkStart),l)}async finalize(e,t){return await this.grpcFinalize(e,t)}partsToUpload(e,t){const n=[],r=new Set(t);for(let o=1n;o<=e;o++)r.has(o)||n.push(o);return n}async grpcInit(e,t,n){return await this.grpcClient.init({resourceId:e},g.addRTypeToMetadata(t,n)).response}async grpcGetPartUrl({id:e,type:t},n,r,o){return await this.grpcClient.getPartURL({resourceId:e,partNumber:n,uploadedPartSize:r},g.addRTypeToMetadata(t,o)).response}async grpcUpdateProgress({id:e,type:t},n,r){await this.grpcClient.updateProgress({resourceId:e,bytesProcessed:n},g.addRTypeToMetadata(t,r)).response}async grpcFinalize({id:e,type:t},n){return await this.grpcClient.finalize({resourceId:e},g.addRTypeToMetadata(t,n)).response}}async function xt(s,e,t){let n;try{n=await w.open(s);const r=Number(t-e),o=Number(e),l=Buffer.alloc(r),a=await At(n,l,r,o);return l.subarray(0,a)}catch(r){throw r&&typeof r=="object"&&"code"in r&&r.code=="ENOENT"?new de(`there is no file ${s} for uploading`):r}finally{await(n==null?void 0:n.close())}}async function At(s,e,t,n){let r=0;for(;r<t;){const{bytesRead:o}=await s.read(e,r,t-r,n+r);if(o===0)throw new le("file ended earlier than expected.");r+=o}return r}async function jt(s,e){const t=BigInt(Math.floor((await w.stat(s)).mtimeMs/1e3));if(t>e)throw new ae(`file was modified, expected mtime: ${e}, got: ${t}.`)}function Gt(s,e,t,n){if(s!=200)throw new ce(`response is not ok, status code: ${s}, body: ${e}, headers: ${JSON.stringify(t)}, url: ${n.uploadUrl}`)}class Vt extends i.MessageType{constructor(){super("google.protobuf.Duration",[{no:1,name:"seconds",kind:"scalar",T:3,L:0},{no:2,name:"nanos",kind:"scalar",T:5}])}internalJsonWrite(e,t){const n=i.PbLong.from(e.seconds).toNumber();if(n>315576e6||n<-315576e6)throw new Error("Duration value out of range.");let r=e.seconds.toString();if(n===0&&e.nanos<0&&(r="-"+r),e.nanos!==0){let o=Math.abs(e.nanos).toString();o="0".repeat(9-o.length)+o,o.substring(3)==="000000"?o=o.substring(0,3):o.substring(6)==="000"&&(o=o.substring(0,6)),r+="."+o}return r+"s"}internalJsonRead(e,t,n){if(typeof e!="string")throw new Error("Unable to parse Duration from JSON "+i.typeofJsonValue(e)+". Expected string.");const r=e.match(/^(-?)([0-9]+)(?:\.([0-9]+))?s/);if(r===null)throw new Error("Unable to parse Duration from JSON string. Invalid format.");n||(n=this.create());const[,o,l,a]=r,d=i.PbLong.from(o+l);if(d.toNumber()>315576e6||d.toNumber()<-315576e6)throw new Error("Unable to parse Duration from JSON string. Value out of range.");if(n.seconds=d.toBigInt(),typeof a=="string"){const c=o+a+"0".repeat(9-a.length);n.nanos=parseInt(c)}return n}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.seconds=0n,t.nanos=0,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.seconds=e.int64().toBigInt();break;case 2:o.nanos=e.int32();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.seconds!==0n&&t.tag(1,i.WireType.Varint).int64(e.seconds),e.nanos!==0&&t.tag(2,i.WireType.Varint).int32(e.nanos);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const $=new Vt;class qt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new qt;class Jt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.Report",[{no:1,name:"progress",kind:"scalar",T:2},{no:2,name:"bytes_processed",kind:"scalar",T:4,L:0},{no:3,name:"bytes_total",kind:"scalar",T:4,L:0},{no:4,name:"done",kind:"scalar",T:8},{no:5,name:"name",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.progress=0,t.bytesProcessed=0n,t.bytesTotal=0n,t.done=!1,t.name="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.progress=e.float();break;case 2:o.bytesProcessed=e.uint64().toBigInt();break;case 3:o.bytesTotal=e.uint64().toBigInt();break;case 4:o.done=e.bool();break;case 5:o.name=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.progress!==0&&t.tag(1,i.WireType.Bit32).float(e.progress),e.bytesProcessed!==0n&&t.tag(2,i.WireType.Varint).uint64(e.bytesProcessed),e.bytesTotal!==0n&&t.tag(3,i.WireType.Varint).uint64(e.bytesTotal),e.done!==!1&&t.tag(4,i.WireType.Varint).bool(e.done),e.name!==""&&t.tag(5,i.WireType.LengthDelimited).string(e.name);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const R=new Jt;class Zt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.GetStatus",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Zt;class Qt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.GetStatus.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Xt=new Qt;class Kt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.GetStatus.Response",[{no:1,name:"report",kind:"message",T:()=>R}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.report=R.internalBinaryRead(e,e.uint32(),n,o.report);break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.report&&R.internalBinaryWrite(e.report,t.tag(1,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Yt=new Kt;class en extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.RealtimeStatus",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new en;class tn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.RealtimeStatus.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"update_interval",kind:"message",T:()=>$}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.updateInterval=$.internalBinaryRead(e,e.uint32(),n,o.updateInterval);break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.updateInterval&&$.internalBinaryWrite(e.updateInterval,t.tag(2,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const nn=new tn;class rn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.RealtimeStatus.Response",[{no:1,name:"report",kind:"message",T:()=>R}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.report=R.internalBinaryRead(e,e.uint32(),n,o.report);break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.report&&R.internalBinaryWrite(e.report,t.tag(1,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const on=new rn,j=new y.ServiceType("MiLaboratories.Controller.Shared.Progress",[{name:"GetStatus",options:{"google.api.http":{get:"/resources/{resource_id}/get-progress"}},I:Xt,O:Yt},{name:"RealtimeStatus",serverStreaming:!0,options:{},I:nn,O:on}]);class sn{constructor(e){h(this,"typeName",j.typeName);h(this,"methods",j.methods);h(this,"options",j.options);this._transport=e}getStatus(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}realtimeStatus(e,t){const n=this.methods[1],r=this._transport.mergeOptions(t);return y.stackIntercept("serverStreaming",this._transport,n,r,e)}}class De{constructor(e,t,n,r){h(this,"grpcClient");this.grpcTransport=e,this.client=n,this.logger=r,this.grpcClient=new sn(this.grpcTransport)}close(){}async getStatus({id:e,type:t},n){const r=await this.grpcClient.getStatus({resourceId:e},g.addRTypeToMetadata(t,n)),o=p.notEmpty(r.response.report);return{done:o.done,progress:o.progress,bytesProcessed:String(o.bytesProcessed),bytesTotal:String(o.bytesTotal)}}async*realtimeStatus({id:e,type:t},n=100,r){r=g.addRTypeToMetadata(t,r);const o=Math.floor(n/1e3),l=(n-o*1e3)*1e6,a=$.create({seconds:BigInt(o),nanos:l});try{const{responses:d}=this.grpcClient.realtimeStatus({resourceId:e,updateInterval:a},r);yield*d}catch(d){throw this.logger.warn("Failed to get realtime status"+String(d)),d}}}class M extends Error{}class Se{constructor(e){this.httpClient=e}async download(e,t,n){const{statusCode:r,body:o,headers:l}=await ke.request(e,{dispatcher:this.httpClient,headers:t,signal:n}),a=L.Readable.toWeb(o);return await an(r,a,e),{content:a,size:Number(l["content-length"])}}}async function an(s,e,t){if(s!=200&&s!=206){const n=(await se.text(e)).substring(0,1e3);throw 400<=s&&s<500?new M(`Http error: statusCode: ${s} url: ${t.toString()}, beginning of body: ${n}`):new Error(`Http error: statusCode: ${s} url: ${t.toString()}`)}}function I(s){if(!b.isAbsolute(s))throw new Error(`Path ${s} is not absolute.`);return s}class ln extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new ln;class cn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new cn;class dn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const hn=new dn;class un extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL.HTTPHeader",[{no:1,name:"Name",kind:"scalar",jsonName:"Name",T:9},{no:2,name:"Value",kind:"scalar",jsonName:"Value",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.name="",t.value="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.name=e.string();break;case 2:o.value=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.name!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.name),e.value!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.value);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const G=new un;class pn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL.Response",[{no:1,name:"download_url",kind:"scalar",T:9},{no:2,name:"headers",kind:"message",repeat:1,T:()=>G}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.downloadUrl="",t.headers=[],e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.downloadUrl=e.string();break;case 2:o.headers.push(G.internalBinaryRead(e,e.uint32(),n));break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.downloadUrl!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.downloadUrl);for(let o=0;o<e.headers.length;o++)G.internalBinaryWrite(e.headers[o],t.tag(2,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const gn=new pn,V=new y.ServiceType("MiLaboratories.Controller.Shared.Download",[{name:"GetDownloadURL",options:{"google.api.http":{get:"/resources/{resource_id}/get-download-url"}},I:hn,O:gn}]);class fn{constructor(e){h(this,"typeName",V.typeName);h(this,"methods",V.methods);h(this,"options",V.options);this._transport=e}getDownloadURL(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}class ve{constructor(e,t,n,r){h(this,"grpcClient");h(this,"remoteFileDownloader");h(this,"localStorageIdsToRoot");this.grpcTransport=e,this.httpClient=t,this.logger=n,this.grpcClient=new fn(this.grpcTransport),this.remoteFileDownloader=new Se(t),this.localStorageIdsToRoot=Ce(r)}close(){}async downloadBlob(e,t,n,r,o){const{downloadUrl:l,headers:a}=await this.grpcGetDownloadUrl(e,t,n),d=Ie(a,r,o);return this.logger.info(`download blob from url ${l}, headers: ${JSON.stringify(d)}`),wn(l)?await this.readLocalFile(l,r,o):await this.remoteFileDownloader.download(l,d,n)}async readLocalFile(e,t,n){const{storageId:r,relativePath:o}=Ne(e),l=Be(r,this.localStorageIdsToRoot,o);return{content:L.Readable.toWeb(ie.createReadStream(l,{start:t,end:n})),size:(await w.stat(l)).size}}async grpcGetDownloadUrl({id:e,type:t},n,r){const o=n??{};return o.abort=r,await this.grpcClient.getDownloadURL({resourceId:e},g.addRTypeToMetadata(t,o)).response}}function Ne(s){const e=new URL(s);if(e.pathname=="")throw new E(`url for local filepath ${s} does not match url scheme`);return{storageId:e.host,relativePath:decodeURIComponent(e.pathname.slice(1))}}function Be(s,e,t){const n=e.get(s);if(n===void 0)throw new O(`Unknown storage location: ${s}`);return n===""?t:T.join(n,t)}const mn="storage://";function wn(s){return s.startsWith(mn)}class E extends Error{}class O extends Error{}function Ce(s){const e=new Map;for(const t of s)t.localPath!==""&&I(t.localPath),e.set(t.storageId,t.localPath);return e}class yn extends i.MessageType{constructor(){super("google.protobuf.Timestamp",[{no:1,name:"seconds",kind:"scalar",T:3,L:0},{no:2,name:"nanos",kind:"scalar",T:5}])}now(){const e=this.create(),t=Date.now();return e.seconds=i.PbLong.from(Math.floor(t/1e3)).toBigInt(),e.nanos=t%1e3*1e6,e}toDate(e){return new Date(i.PbLong.from(e.seconds).toNumber()*1e3+Math.ceil(e.nanos/1e6))}fromDate(e){const t=this.create(),n=e.getTime();return t.seconds=i.PbLong.from(Math.floor(n/1e3)).toBigInt(),t.nanos=n%1e3*1e6,t}internalJsonWrite(e,t){const n=i.PbLong.from(e.seconds).toNumber()*1e3;if(n<Date.parse("0001-01-01T00:00:00Z")||n>Date.parse("9999-12-31T23:59:59Z"))throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");if(e.nanos<0)throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative.");let r="Z";if(e.nanos>0){const o=(e.nanos+1e9).toString().substring(1);o.substring(3)==="000000"?r="."+o.substring(0,3)+"Z":o.substring(6)==="000"?r="."+o.substring(0,6)+"Z":r="."+o+"Z"}return new Date(n).toISOString().replace(".000Z",r)}internalJsonRead(e,t,n){if(typeof e!="string")throw new Error("Unable to parse Timestamp from JSON "+i.typeofJsonValue(e)+".");const r=e.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);if(!r)throw new Error("Unable to parse Timestamp from JSON. Invalid format.");const o=Date.parse(r[1]+"-"+r[2]+"-"+r[3]+"T"+r[4]+":"+r[5]+":"+r[6]+(r[8]?r[8]:"Z"));if(Number.isNaN(o))throw new Error("Unable to parse Timestamp from JSON. Invalid value.");if(o<Date.parse("0001-01-01T00:00:00Z")||o>Date.parse("9999-12-31T23:59:59Z"))throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");return n||(n=this.create()),n.seconds=i.PbLong.from(o/1e3).toBigInt(),n.nanos=0,r[7]&&(n.nanos=parseInt("1"+r[7]+"0".repeat(9-r[7].length))-1e9),n}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.seconds=0n,t.nanos=0,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.seconds=e.int64().toBigInt();break;case 2:o.nanos=e.int32();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.seconds!==0n&&t.tag(1,i.WireType.Varint).int64(e.seconds),e.nanos!==0&&t.tag(2,i.WireType.Varint).int32(e.nanos);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const q=new yn;class Tn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Tn;class bn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.ListItem",[{no:1,name:"name",kind:"scalar",T:9},{no:2,name:"size",kind:"scalar",T:4,L:0},{no:3,name:"is_dir",kind:"scalar",T:8},{no:10,name:"full_name",kind:"scalar",T:9},{no:11,name:"directory",kind:"scalar",T:9},{no:12,name:"last_modified",kind:"message",T:()=>q},{no:13,name:"version",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.name="",t.size=0n,t.isDir=!1,t.fullName="",t.directory="",t.version="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.name=e.string();break;case 2:o.size=e.uint64().toBigInt();break;case 3:o.isDir=e.bool();break;case 10:o.fullName=e.string();break;case 11:o.directory=e.string();break;case 12:o.lastModified=q.internalBinaryRead(e,e.uint32(),n,o.lastModified);break;case 13:o.version=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.name!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.name),e.size!==0n&&t.tag(2,i.WireType.Varint).uint64(e.size),e.isDir!==!1&&t.tag(3,i.WireType.Varint).bool(e.isDir),e.fullName!==""&&t.tag(10,i.WireType.LengthDelimited).string(e.fullName),e.directory!==""&&t.tag(11,i.WireType.LengthDelimited).string(e.directory),e.lastModified&&q.internalBinaryWrite(e.lastModified,t.tag(12,i.WireType.LengthDelimited).fork(),n).join(),e.version!==""&&t.tag(13,i.WireType.LengthDelimited).string(e.version);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const J=new bn;class kn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new kn;class Ln extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"location",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.location="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.location=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.location!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.location);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Pn=new Ln;class Un extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List.Response",[{no:1,name:"items",kind:"message",repeat:1,T:()=>J},{no:2,name:"delimiter",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.items=[],t.delimiter="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.items.push(J.internalBinaryRead(e,e.uint32(),n));break;case 2:o.delimiter=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){for(let o=0;o<e.items.length;o++)J.internalBinaryWrite(e.items[o],t.tag(1,i.WireType.LengthDelimited).fork(),n).join();e.delimiter!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.delimiter);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const In=new Un,Z=new y.ServiceType("MiLaboratories.Controller.Shared.LS",[{name:"List",options:{},I:Pn,O:In}]);class Rn{constructor(e){h(this,"typeName",Z.typeName);h(this,"methods",Z.methods);h(this,"options",Z.options);this._transport=e}list(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}class $e{constructor(e,t){h(this,"grpcClient");this.logger=t,this.grpcClient=new Rn(e)}close(){}async list(e,t,n){return await this.grpcClient.list({resourceId:e.id,location:t},g.addRTypeToMetadata(e.type,n)).response}}class Dn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Dn;class Sn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.StreamBinary",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:11,name:"chunk_size",kind:"scalar",opt:!0,T:13},{no:20,name:"read_limit",kind:"scalar",opt:!0,T:3,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 11:o.chunkSize=e.uint32();break;case 20:o.readLimit=e.int64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.chunkSize!==void 0&&t.tag(11,i.WireType.Varint).uint32(e.chunkSize),e.readLimit!==void 0&&t.tag(20,i.WireType.Varint).int64(e.readLimit);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const vn=new Sn;class Nn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.ReadBinary",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:11,name:"chunk_size",kind:"scalar",opt:!0,T:13}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 11:o.chunkSize=e.uint32();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.chunkSize!==void 0&&t.tag(11,i.WireType.Varint).uint32(e.chunkSize);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Bn=new Nn;class Cn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.StreamText",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:20,name:"read_limit",kind:"scalar",opt:!0,T:3,L:0},{no:21,name:"search",kind:"scalar",opt:!0,T:9},{no:22,name:"search_re",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 20:o.readLimit=e.int64().toBigInt();break;case 21:o.search=e.string();break;case 22:o.searchRe=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.readLimit!==void 0&&t.tag(20,i.WireType.Varint).int64(e.readLimit),e.search!==void 0&&t.tag(21,i.WireType.LengthDelimited).string(e.search),e.searchRe!==void 0&&t.tag(22,i.WireType.LengthDelimited).string(e.searchRe);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const $n=new Cn;class Fn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.ReadText",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:20,name:"read_limit",kind:"scalar",opt:!0,T:3,L:0},{no:21,name:"search",kind:"scalar",opt:!0,T:9},{no:22,name:"search_re",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 20:o.readLimit=e.int64().toBigInt();break;case 21:o.search=e.string();break;case 22:o.searchRe=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.readLimit!==void 0&&t.tag(20,i.WireType.Varint).int64(e.readLimit),e.search!==void 0&&t.tag(21,i.WireType.LengthDelimited).string(e.search),e.searchRe!==void 0&&t.tag(22,i.WireType.LengthDelimited).string(e.searchRe);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Wn=new Fn;class _n extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.LastLines",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",opt:!0,T:3,L:0},{no:3,name:"line_count",kind:"scalar",opt:!0,T:5},{no:21,name:"search",kind:"scalar",opt:!0,T:9},{no:22,name:"search_re",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 3:o.lineCount=e.int32();break;case 21:o.search=e.string();break;case 22:o.searchRe=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==void 0&&t.tag(2,i.WireType.Varint).int64(e.offset),e.lineCount!==void 0&&t.tag(3,i.WireType.Varint).int32(e.lineCount),e.search!==void 0&&t.tag(21,i.WireType.LengthDelimited).string(e.search),e.searchRe!==void 0&&t.tag(22,i.WireType.LengthDelimited).string(e.searchRe);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Mn=new _n;class En extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.Response",[{no:1,name:"data",kind:"scalar",T:12},{no:2,name:"size",kind:"scalar",T:4,L:0},{no:3,name:"new_offset",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.data=new Uint8Array(0),t.size=0n,t.newOffset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.data=e.bytes();break;case 2:o.size=e.uint64().toBigInt();break;case 3:o.newOffset=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.data.length&&t.tag(1,i.WireType.LengthDelimited).bytes(e.data),e.size!==0n&&t.tag(2,i.WireType.Varint).uint64(e.size),e.newOffset!==0n&&t.tag(3,i.WireType.Varint).uint64(e.newOffset);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const D=new En,Q=new y.ServiceType("MiLaboratories.Controller.Shared.Streaming",[{name:"StreamBinary",serverStreaming:!0,options:{},I:vn,O:D},{name:"ReadBinary",options:{},I:Bn,O:D},{name:"StreamText",serverStreaming:!0,options:{},I:$n,O:D},{name:"ReadText",options:{},I:Wn,O:D},{name:"LastLines",options:{},I:Mn,O:D}]);class On{constructor(e){h(this,"typeName",Q.typeName);h(this,"methods",Q.methods);h(this,"options",Q.options);this._transport=e}streamBinary(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("serverStreaming",this._transport,n,r,e)}readBinary(e,t){const n=this.methods[1],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}streamText(e,t){const n=this.methods[2],r=this._transport.mergeOptions(t);return y.stackIntercept("serverStreaming",this._transport,n,r,e)}readText(e,t){const n=this.methods[3],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}lastLines(e,t){const n=this.methods[4],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}class Fe{constructor(e,t,n){h(this,"grpcClient");this.grpcTransport=e,this.httpClient=t,this.logger=n,this.grpcClient=new On(this.grpcTransport)}close(){}async lastLines({id:e,type:t},n,r=0n,o,l){return(await this.grpcClient.lastLines({resourceId:e,lineCount:n,offset:r,search:o},g.addRTypeToMetadata(t,l))).response}async readText({id:e,type:t},n,r=0n,o,l){return(await this.grpcClient.readText({resourceId:p.notEmpty(e),readLimit:BigInt(n),offset:r,search:o},g.addRTypeToMetadata(t,l))).response}}function Hn(s,e,t){return e.getDriver({name:"DownloadBlob",init:(n,r,o)=>new ve(r,o,s,t)})}function zn(s,e){return s.getDriver({name:"StreamLogs",init:(t,n,r)=>new Fe(n,r,e)})}function xn(s,e){return s.getDriver({name:"UploadProgress",init:(t,n,r)=>new De(n,r,s,e)})}function An(s,e){return s.getDriver({name:"UploadBlob",init:(t,n,r)=>new Re(n,r,s,e)})}function We(s,e){return s.getDriver({name:"LsFiles",init:(t,n,r)=>new $e(n,e)})}class jn{constructor(e,t,n,r,o){h(this,"counter",new p.CallersCounter);h(this,"change",new f.ChangeSource);h(this,"signalCtl",new AbortController);h(this,"error");h(this,"done",!1);h(this,"size",0);this.logger=e,this.clientDownload=t,this.rInfo=n,this.path=r,this.handle=o}info(){return{rInfo:this.rInfo,path:this.path,done:this.done,size:this.size,error:this.error}}attach(e,t){this.counter.inc(t),this.done||this.change.attachWatcher(e)}async download(){try{const e=await this.ensureDownloaded();this.setDone(e),this.change.markChanged()}catch(e){throw he(e)&&(this.setError(e),this.change.markChanged(),await w.rm(this.path)),e}}async ensureDownloaded(){if(await p.ensureDirExists(T.dirname(this.path)),await p.fileExists(this.path))return this.logger.info(`a blob was already downloaded: ${this.path}`),(await w.stat(this.path)).size;const{content:e,size:t}=await this.clientDownload.downloadBlob(this.rInfo);return await p.createPathAtomically(this.logger,this.path,async n=>{const r=L.Writable.toWeb(F.createWriteStream(n,{flags:"wx"}));await e.pipeTo(r)}),t}abort(e){this.signalCtl.abort(new _e(e))}getBlob(){return this.done?this.error?{done:!0,result:{ok:!1,error:this.error}}:{done:!0,result:{ok:!0,value:{handle:this.handle,size:this.size}}}:{done:!1}}setDone(e){this.done=!0,this.size=e}setError(e){this.done=!0,this.error=e}}function he(s){return s instanceof _e||s instanceof M||s instanceof O||s instanceof E||(s==null?void 0:s.code)=="ENOENT"||s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED")}class _e extends Error{}class ue{constructor(e){h(this,"cache",new Map);h(this,"totalSizeBytes",0);this.softSizeBytes=e}existsFile(e){return this.cache.get(e)!=null}getFile(e,t){const n=this.cache.get(e);return n!=null&&n.counter.inc(t),n}removeFile(e,t){return p.mapGet(this.cache,e).counter.dec(t),this.toDelete()}toDelete(){if(this.totalSizeBytes<=this.softSizeBytes)return[];const e=[];let t=0;return p.mapEntries(this.cache).filter(([n,r])=>r.counter.isZero()).forEach(([n,r])=>{if(this.totalSizeBytes-t<=this.softSizeBytes)return;const o=p.mapGet(this.cache,n);t+=o.size,e.push(o)}),e}addCache(e,t){const n=this.cache.get(e.path)==null;if(this.cache.set(e.path,e),e.counter.inc(t),e.size<0)throw new Error(`empty sizeBytes: ${e}`);n&&(this.totalSizeBytes+=e.size)}removeCache(e){this.cache.delete(e.path),this.totalSizeBytes-=e.size}}const Me=/^blob\+local:\/\/download\/(?<path>.*)#(?<signature>.*)$/;function Gn(s,e){return`blob+local://download/${s}#${e.sign(s)}`}function Vn(s){return!!s.match(Me)}function X(s,e){const t=s.match(Me);if(t===null)throw new Error(`Local handle is malformed: ${s}, matches: ${t}`);const{path:n,signature:r}=t.groups;return e.verify(n,r,`Signature verification failed for: ${s}`),{path:n,signature:r}}const Ee=m.rsSchema({kv:{"ctl/file/blobInfo":k.z.object({sizeBytes:k.z.coerce.number()})}});function Oe(s){return s.kv["ctl/file/blobInfo"].sizeBytes}const v=k.z.object({localPath:k.z.string(),pathSignature:k.z.string(),sizeBytes:k.z.string(),modificationTime:k.z.string()}),pe=k.z.object({storageId:k.z.string(),path:k.z.string()}),qn=k.z.union([v,pe]),He=m.rsSchema({data:v,fields:{blob:!1}}),ze=m.rsSchema({fields:{incarnation:!1}}),xe=/^blob\+remote:\/\/download\/(?<content>(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*))#(?<signature>.*)$/;function Jn(s,e){const t=`${s.type.name}/${s.type.version}/${BigInt(s.id)}`;return`blob+remote://download/${t}#${e.sign(t)}`}function Zn(s){return!!s.match(xe)}function Qn(s,e){const t=s.match(xe);if(t===null)throw new Error(`Remote handle is malformed: ${s}, matches: ${t}`);const{content:n,resourceType:r,resourceVersion:o,resourceId:l,signature:a}=t.groups;return e.verify(n,a,`Signature verification failed for ${s}`),{id:g.bigintToResourceId(BigInt(l)),type:{name:r,version:o}}}function Ae(s,e){return s?`log+live://log/${e.type.name}/${e.type.version}/${BigInt(e.id)}`:`log+ready://log/${e.type.name}/${e.type.version}/${BigInt(e.id)}`}const je=/^log\+live:\/\/log\/(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*)$/;function W(s){return je.test(s)}const Ge=/^log\+ready:\/\/log\/(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*)$/;function Xn(s){return Ge.test(s)}function _(s){let e;if(W(s))e=s.match(je);else if(Xn(s))e=s.match(Ge);else throw new Error(`Log handle is malformed: ${s}`);if(e==null)throw new Error(`Log handle wasn't parsed: ${s}`);const{resourceType:t,resourceVersion:n,resourceId:r}=e.groups;return{id:g.bigintToResourceId(BigInt(r)),type:{name:t,version:n}}}class H extends Error{}class Ve{constructor(e){h(this,"updating");this.onUpdate=e}schedule(){this.updating==null&&(this.updating=(async()=>{try{await this.onUpdate()}catch(e){console.log(`error while updating in Updater: ${e}`)}finally{this.updating=void 0}})())}}class Kn{constructor(e,t,n,r,o,l){h(this,"idToDownload",new Map);h(this,"cache");h(this,"downloadQueue");h(this,"idToOnDemand",new Map);h(this,"idToLastLines",new Map);h(this,"idToProgressLog",new Map);h(this,"saveDir");this.logger=e,this.clientDownload=t,this.clientLogs=n,this.signer=o,this.cache=new ue(l.cacheSoftSizeBytes),this.downloadQueue=new p.TaskProcessor(this.logger,l.nConcurrentDownloads),this.saveDir=T.resolve(r)}getDownloadedBlob(e,t){if(t===void 0)return f.Computable.make(l=>this.getDownloadedBlob(e,l));const n=m.treeEntryToResourceInfo(e,t),r=P.randomUUID();t.addOnDestroy(()=>this.releaseBlob(n.id,r));const o=this.getDownloadedBlobNoCtx(t.watcher,n,r);return o==null&&t.markUnstable("download blob is still undefined"),o}getDownloadedBlobNoCtx(e,t,n){S("getDownloadedBlob",t.type);let r=this.idToDownload.get(t.id);if(r===void 0){const l=this.setNewDownloadTask(t);this.downloadQueue.push({fn:()=>this.downloadBlob(l,n),recoverableErrorPredicate:a=>!he(a)}),r=l}r.attach(e,n);const o=r.getBlob();if(o.done){if(o.result.ok)return o.result.value;throw o.result.error}}setNewDownloadTask(e){const t=this.getFilePath(e.id),n=new jn(this.logger,this.clientDownload,e,t,Gn(t,this.signer));return this.idToDownload.set(e.id,n),n}async downloadBlob(e,t){await e.download();const n=e.getBlob();n.done&&n.result.ok&&this.cache.addCache(e,t)}getOnDemandBlob(e,t){if(t===void 0)return f.Computable.make(l=>this.getOnDemandBlob(e,l));const n=m.isPlTreeEntry(e)?m.makeResourceSnapshot(e,Ee,t):e,r=P.randomUUID();return t.addOnDestroy(()=>this.releaseOnDemandBlob(n.id,r)),this.getOnDemandBlobNoCtx(n,r)}getOnDemandBlobNoCtx(e,t){S("getOnDemandBlob",e.type);let n=this.idToOnDemand.get(e.id);return n===void 0&&(n=new Yn(Oe(e),Jn(e,this.signer)),this.idToOnDemand.set(e.id,n)),n.attach(t),n.getHandle()}getLocalPath(e){const{path:t}=X(e,this.signer);return t}async getContent(e){if(Vn(e))return await tr(this.getLocalPath(e));if(Zn(e)){const t=Qn(e,this.signer),{content:n}=await this.clientDownload.downloadBlob(t);return await se.buffer(n)}throw new Error("Malformed remote handle")}getComputableContent(e){return f.Computable.make(t=>this.getDownloadedBlob(e,t),{postprocessValue:t=>t?this.getContent(t.handle):void 0}).withStableType()}getLastLogs(e,t,n){if(n==null)return f.Computable.make(a=>this.getLastLogs(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=P.randomUUID();n.addOnDestroy(()=>this.releaseBlob(r.id,o));const l=this.getLastLogsNoCtx(n.watcher,r,t,o);return l==null&&n.markUnstable("either a file was not downloaded or logs was not read"),l}getLastLogsNoCtx(e,t,n,r){S("getLastLogs",t.type);const o=this.getDownloadedBlobNoCtx(e,t,r);if(o==null)return;const{path:l}=X(o.handle,this.signer);let a=this.idToLastLines.get(t.id);if(a==null){const c=new we(l,n);this.idToLastLines.set(t.id,c),a=c}const d=a.getOrSchedule(e);if(d.error)throw d.error;return d.log}getProgressLog(e,t,n){if(n==null)return f.Computable.make(a=>this.getProgressLog(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=P.randomUUID();n.addOnDestroy(()=>this.releaseBlob(r.id,o));const l=this.getProgressLogNoCtx(n.watcher,r,t,o);return l===void 0&&n.markUnstable("either a file was not downloaded or a progress log was not read"),l}getProgressLogNoCtx(e,t,n,r){S("getProgressLog",t.type);const o=this.getDownloadedBlobNoCtx(e,t,r);if(o==null)return;const{path:l}=X(o.handle,this.signer);let a=this.idToProgressLog.get(t.id);if(a==null){const c=new we(l,1,n);this.idToProgressLog.set(t.id,c),a=c}const d=a.getOrSchedule(e);if(d.error)throw d.error;return d.log}getLogHandle(e,t){if(t==null)return f.Computable.make(r=>this.getLogHandle(e,r));const n=m.treeEntryToResourceInfo(e,t);return this.getLogHandleNoCtx(n)}getLogHandleNoCtx(e){return S("getLogHandle",e.type),Ae(!1,e)}async lastLines(e,t,n,r){const o=await this.clientLogs.lastLines(_(e),t,BigInt(n??0),r);return{live:!1,shouldUpdateHandle:!1,data:o.data,size:Number(o.size),newOffset:Number(o.newOffset)}}async readText(e,t,n,r){const o=await this.clientLogs.readText(_(e),t,BigInt(n??0),r);return{live:!1,shouldUpdateHandle:!1,data:o.data,size:Number(o.size),newOffset:Number(o.newOffset)}}async releaseBlob(e,t){const n=this.idToDownload.get(e);if(n!=null)if(this.cache.existsFile(n.path)){const r=this.cache.removeFile(n.path,t);await Promise.all(r.map(async o=>{await w.rm(o.path),this.cache.removeCache(o),this.removeTask(o,`the task ${g.stringifyWithResourceId(o.info())} was removedfrom cache along with ${g.stringifyWithResourceId(r.map(l=>l.info()))}`)}))}else n.counter.dec(t)&&this.removeTask(n,`the task ${g.stringifyWithResourceId(n.info())} was removed from cache`)}removeTask(e,t){e.abort(t),e.change.markChanged(),this.idToDownload.delete(e.rInfo.id),this.idToLastLines.delete(e.rInfo.id),this.idToProgressLog.delete(e.rInfo.id)}async releaseOnDemandBlob(e,t){var r;(((r=this.idToOnDemand.get(e))==null?void 0:r.release(t))??!1)&&this.idToOnDemand.delete(e)}async releaseAll(){this.downloadQueue.stop(),this.idToDownload.forEach((e,t)=>{this.idToDownload.delete(t),e.change.markChanged()})}getFilePath(e){return T.resolve(this.saveDir,String(BigInt(e)))}}class Yn{constructor(e,t){h(this,"counter",new p.CallersCounter);this.size=e,this.handle=t}getHandle(){return{handle:this.handle,size:this.size}}attach(e){this.counter.inc(e)}release(e){return this.counter.dec(e)}}class we{constructor(e,t,n){h(this,"updater");h(this,"log");h(this,"change",new f.ChangeSource);h(this,"error");this.path=e,this.lines=t,this.patternToSearch=n,this.updater=new Ve(async()=>this.update())}getOrSchedule(e){return this.change.attachWatcher(e),this.updater.schedule(),{log:this.log,error:this.error}}async update(){try{const e=await er(this.path,this.lines,this.patternToSearch);this.log!=e&&this.change.markChanged(),this.log=e}catch(e){if(e.name=="RpcError"&&e.code=="NOT_FOUND"){this.log="",this.error=e,this.change.markChanged();return}throw e}}}function er(s,e,t){const n=ie.createReadStream(s),r=new L.Writable;return new Promise((o,l)=>{const a=yt.createInterface(n,r),d=new ct;a.on("line",function(c){t!=null&&!c.includes(t)||(d.push(c),d.length>e&&d.shift())}),a.on("error",l),a.on("close",function(){o(d.toArray().join(me.EOL)+me.EOL)})})}async function tr(s){return await se.buffer(L.Readable.toWeb(ie.createReadStream(s)))}function S(s,e){if(!e.name.startsWith("Blob/")){let t=`${s}: wrong resource type: ${e.name}, expected: a resource of type that starts with 'Blob/'.`;throw e.name=="Blob"&&(t+=" If it's called from workflow, should a file be exported with 'file.exportFile' function?"),new H(t)}}const qe=m.rsSchema({});function Je(s,e){const t=m.isPlTreeEntry(s)?e.accessor(s).node():m.isPlTreeEntryAccessor(s)?s.node():s;return m.makeResourceSnapshot(t,qe)}function nr(s,e,t){const n=b.relative(e,t);return`plblob+folder://${s.sign(n)}.${n}.blob`}function rr(s){return new URL(s).protocol=="plblob+folder:"}function or(s,e,t){const n=new URL(e),[r,o,l]=n.host.split(".");s.verify(o,r,`signature verification failed for url: ${e}, subfolder: ${o}`);let a=sr(b.join(t,`${o}`),n.pathname.slice(1));return(n.pathname==""||n.pathname=="/")&&(a=b.join(a,"index.html")),b.resolve(a)}function sr(s,e){const t=b.resolve(s,e),n=b.resolve(s);if(!t.startsWith(n))throw new Error("Path validation failed.");return t}class ir{constructor(e,t,n,r,o,l,a){h(this,"counter",new p.CallersCounter);h(this,"change",new f.ChangeSource);h(this,"signalCtl",new AbortController);h(this,"error");h(this,"done",!1);h(this,"size",0);h(this,"url");h(this,"state");this.logger=e,this.signer=t,this.saveDir=n,this.path=r,this.rInfo=o,this.format=l,this.clientDownload=a}info(){return{rInfo:this.rInfo,format:this.format,path:this.path,done:this.done,size:this.size,error:this.error,taskHistory:this.state}}attach(e,t){this.counter.inc(t),this.done||this.change.attachWatcher(e)}async download(){try{const e=await this.downloadAndDecompress(this.signalCtl.signal);this.setDone(e),this.change.markChanged(),this.logger.info(`blob to URL task is done: ${g.stringifyWithResourceId(this.info())}`)}catch(e){if(this.logger.warn(`a error was produced: ${e} for blob to URL task: ${g.stringifyWithResourceId(this.info())}`),ar(e)){this.setError(e),this.change.markChanged(),await te(this.path);return}throw e}}async downloadAndDecompress(e){if(this.state={},this.state.parentDir=b.dirname(this.path),await p.ensureDirExists(this.state.parentDir),this.state.fileExisted=await p.fileExists(this.path),this.state.fileExisted)return await Ze(this.path);const{content:t,size:n}=await this.clientDownload.downloadBlob(this.rInfo,{},e);return this.state.downloaded=!0,await p.createPathAtomically(this.logger,this.path,async r=>{switch(this.state.tempPath=r,this.state.archiveFormat=this.format,this.format){case"tar":await w.mkdir(r);const o=L.Writable.toWeb(ee.extract(r));await t.pipeTo(o,{signal:e});return;case"tgz":await w.mkdir(r);const l=L.Transform.toWeb(Ue.createGunzip()),a=L.Writable.toWeb(ee.extract(r));await t.pipeThrough(l,{signal:e}).pipeTo(a,{signal:e});return;case"zip":this.state.zipPath=this.path+".zip";const d=L.Writable.toWeb(F.createWriteStream(this.state.zipPath));await t.pipeTo(d,{signal:e}),this.state.zipPathCreated=!0,await pt(this.state.zipPath,r,{filter:c=>!c.path.endsWith("/")}),this.state.zipDecompressed=!0,await F.promises.rm(this.state.zipPath),this.state.zipPathDeleted=!0;return;default:i.assertNever(this.format)}}),this.state.pathCreated=!0,n}getURL(){if(this.done)return{url:p.notEmpty(this.url)};if(this.error)return{error:this.error}}setDone(e){this.done=!0,this.size=e,this.url=nr(this.signer,this.saveDir,this.path)}setError(e){this.error=String(e)}abort(e){this.signalCtl.abort(new Qe(e))}}async function Ze(s){const e=await w.readdir(s,{withFileTypes:!0});return(await Promise.all(e.map(async n=>{const r=b.join(s,n.name);return n.isDirectory()?await Ze(r):(await w.stat(r)).size}))).reduce((n,r)=>n+r,0)}async function te(s){await w.rm(s,{recursive:!0,force:!0})}let Qe=class extends Error{};function ar(s){return s instanceof Qe||s instanceof M||s instanceof O||s instanceof E||(s==null?void 0:s.code)=="ENOENT"||s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED")||String(s).includes("incorrect header check")}function N(s,e){return`id:${String(BigInt(s))}-${e}`}class lr{constructor(e,t,n,r,o={cacheSoftSizeBytes:50*1024*1024,nConcurrentDownloads:50}){h(this,"idToDownload",new Map);h(this,"downloadQueue");h(this,"cache");this.logger=e,this.signer=t,this.clientDownload=n,this.saveDir=r,this.opts=o,this.downloadQueue=new p.TaskProcessor(this.logger,this.opts.nConcurrentDownloads,{type:"exponentialWithMaxDelayBackoff",initialDelay:1e4,maxDelay:3e4,backoffMultiplier:1.5,jitter:.5}),this.cache=new ue(this.opts.cacheSoftSizeBytes)}info(){return{saveDir:this.saveDir,opts:this.opts,idToDownloadSize:this.idToDownload.size,idToDownloadKeys:this.idToDownload.keys(),idToDownload:Array.from(this.idToDownload.entries()).map(([e,t])=>[e,t.info()])}}getPathForCustomProtocol(e){if(rr(e))return or(this.signer,e,this.saveDir);throw new Error(`getPathForCustomProtocol: ${e} is invalid`)}extractArchiveAndGetURL(e,t,n){if(n===void 0)return f.Computable.make(a=>this.extractArchiveAndGetURL(e,t,a));const r=m.isPlTreeEntry(e)?Je(e,n):e,o=P.randomUUID();n.addOnDestroy(()=>this.releasePath(r.id,t,o));const l=this.extractArchiveAndGetURLNoCtx(r,t,n.watcher,o);if((l==null?void 0:l.url)===void 0&&n.markUnstable(`a path to the downloaded archive might be undefined. The current result: ${l}`),(l==null?void 0:l.error)!==void 0)throw l==null?void 0:l.error;return l==null?void 0:l.url}extractArchiveAndGetURLNoCtx(e,t,n,r){const o=this.idToDownload.get(N(e.id,t));if(o!=null)return o.attach(n,r),o.getURL();const l=this.setNewTask(n,e,t,r);return this.downloadQueue.push({fn:async()=>this.downloadUrl(l,r),recoverableErrorPredicate:a=>!he(a)}),l.getURL()}async downloadUrl(e,t){var n;await e.download(),((n=e.getURL())==null?void 0:n.url)!=null&&this.cache.addCache(e,t)}async releasePath(e,t,n){const r=this.idToDownload.get(N(e,t));if(r!=null)if(this.cache.existsFile(r.path)){const o=this.cache.removeFile(r.path,n);await Promise.all(o.map(async l=>{await te(l.path),this.cache.removeCache(l),this.removeTask(l,`the task ${g.stringifyWithResourceId(l.info())} was removedfrom cache along with ${g.stringifyWithResourceId(o.map(a=>a.info()))}`)}))}else r.counter.dec(n)&&this.removeTask(r,`the task ${g.stringifyWithResourceId(r.info())} was removed from cache`)}async releaseAll(){this.downloadQueue.stop(),await Promise.all(Array.from(this.idToDownload.entries()).map(async([e,t])=>{await te(t.path),this.cache.removeCache(t),this.removeTask(t,`the task ${g.stringifyWithResourceId(t.info())} was released when the driver was closed`)}))}setNewTask(e,t,n,r){const o=new ir(this.logger,this.signer,this.saveDir,this.getFilePath(t.id,n),t,n,this.clientDownload);return o.attach(e,r),this.idToDownload.set(N(t.id,n),o),o}removeTask(e,t){e.abort(t),e.change.markChanged(),this.idToDownload.delete(N(e.rInfo.id,e.format))}getFilePath(e,t){return T.join(this.saveDir,`${String(BigInt(e))}_${t}`)}}class Xe{constructor(e,t,n,r,o,l){h(this,"change",new f.ChangeSource);h(this,"counter",new p.CallersCounter);h(this,"nMaxUploads");h(this,"nPartsWithThisUploadSpeed",0);h(this,"nPartsToIncreaseUpload",10);h(this,"uploadData");h(this,"progress");h(this,"failed");h(this,"alreadyExisted",!1);this.logger=e,this.clientBlob=t,this.clientProgress=n,this.maxNConcurrentPartsUpload=r,this.res=l,this.nMaxUploads=this.maxNConcurrentPartsUpload;const{uploadData:a,progress:d}=cr(l,o);this.uploadData=a,this.progress=d}getProgress(e,t){if(this.incCounter(e,t),this.failed)throw this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`),new Error(this.progress.lastError);return dr(this.progress)}shouldScheduleUpload(){return Ye(this.progress)}async uploadBlobTask(){try{await Ke(this.logger,this.clientBlob,this.res,this.uploadData,this.isComputableDone.bind(this),{nPartsWithThisUploadSpeed:this.nPartsWithThisUploadSpeed,nPartsToIncreaseUpload:this.nPartsToIncreaseUpload,currentSpeed:this.nMaxUploads,maxSpeed:this.maxNConcurrentPartsUpload}),this.change.markChanged()}catch(e){if(this.setRetriableError(e),re(e)){this.logger.warn(`resource was deleted while uploading a blob: ${e}`),this.change.markChanged(),this.setDone(!0);return}if(this.logger.error(`error while uploading a blob: ${e}`),this.change.markChanged(),ge(e)){this.setTerminalError(e);return}throw fr(e)&&(this.nMaxUploads=wr(this.logger,this.nMaxUploads,1)),e}}async updateStatus(){var e;try{const t=await this.clientProgress.getStatus(this.res,{timeout:1e4}),n=this.progress.status,r=gr(this.alreadyExisted,pr(t));this.progress.status=r,this.setDone(t.done),(t.done||this.progress.status.progress!=(n==null?void 0:n.progress))&&this.change.markChanged()}catch(t){if(this.setRetriableError(t),t.name=="RpcError"&&t.code=="DEADLINE_EXCEEDED"||(e=t==null?void 0:t.message)!=null&&e.includes("DEADLINE_EXCEEDED")){this.logger.warn("deadline exceeded while getting a status of BlobImport");return}if(re(t)){this.logger.warn(`resource was not found while updating a status of BlobImport: ${t}, ${g.stringifyWithResourceId(this.res)}`),this.change.markChanged(),this.setDone(!0);return}this.logger.error(`retryable error while updating a status of BlobImport: ${t}`)}}setRetriableError(e){this.progress.lastError=String(e)}setTerminalError(e){this.progress.lastError=String(e),this.progress.done=!1,this.failed=!0}setDoneIfOutputSet(e){hr(e)&&(this.setDone(!0),this.alreadyExisted=!0)}setDone(e){this.progress.done=e,e&&(this.progress.lastError=void 0)}incCounter(e,t){this.change.attachWatcher(e),this.counter.inc(t)}decCounter(e){return this.counter.dec(e)}isComputableDone(){return this.counter.isZero()}}async function Ke(s,e,t,n,r,o){gt(ne(t),"the upload operation can be done only for BlobUploads");const l=1e4;if(r())return;const a=await e.initUpload(t,{timeout:l});s.info(`started to upload blob ${t.id}, parts overall: ${a.overall}, parts remained: ${a.toUpload.length}, number of concurrent uploads: ${o.currentSpeed}`);const d=c=>async u=>{r()||(await e.partUpload(t,n.localPath,BigInt(n.modificationTime),c,{timeout:l}),s.info(`uploaded chunk ${c}/${a.overall} of resource: ${t.id}`),o.nPartsWithThisUploadSpeed++,o.nPartsWithThisUploadSpeed>=o.nPartsToIncreaseUpload&&(o.nPartsWithThisUploadSpeed=0,o.currentSpeed=mr(s,o.currentSpeed,o.maxSpeed),u.setConcurrency(o.currentSpeed)))};await p.asyncPool(o.currentSpeed,a.toUpload.map(d)),!r()&&(await e.finalize(t,{timeout:l}),s.info(`uploading of resource ${t.id} finished.`))}function cr(s,e){let t,n;return ne(s)&&(n=v.parse(s.data),t=ur(e,n.localPath,n.pathSignature)),{uploadData:n,progress:{done:!1,status:void 0,isUpload:ne(s),isUploadSignMatch:t,lastError:void 0}}}function Ye(s){return s.isUpload&&(s.isUploadSignMatch??!1)}function dr(s){return s.done,s.isUpload,s.isUploadSignMatch,s.lastError,s.status&&(s.status.progress,s.status.bytesProcessed,s.status.bytesTotal),s}function hr(s){return"blob"in s.fields?s.fields.blob!==void 0:s.fields.incarnation!==void 0}function ne(s){return s.type.name.startsWith("BlobUpload")}function ur(s,e,t){try{return s.verify(e,t),!0}catch{return!1}}function pr(s){return{progress:s.progress??0,bytesProcessed:Number(s.bytesProcessed),bytesTotal:Number(s.bytesTotal)}}function gr(s,e){return s&&e.bytesTotal!=0&&e.bytesProcessed==0?{progress:1,bytesProcessed:Number(e.bytesTotal),bytesTotal:Number(e.bytesTotal)}:e}function re(s){return s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED"||s.code=="ALREADY_EXISTS")}function ge(s){return s instanceof ae||s instanceof le||s instanceof de}function fr(s){return s==null?void 0:s.message.includes("UND_ERR_HEADERS_TIMEOUT")}function mr(s,e,t){const n=Math.min(e+2,t);return n!=e&&s.info(`uploadTask.increaseConcurrency: increased from ${e} to ${n}`),n}function wr(s,e,t){const n=Math.max(Math.round(e/2),t);return n!=e&&s.info(`uploadTask.decreaseConcurrency: decreased from ${e} to ${n}`),n}function et(s,e){const t=m.isPlTreeEntry(s)?e.accessor(s).node():m.isPlTreeEntryAccessor(s)?s.node():s;return t.resourceType.name.startsWith("BlobUpload")?m.makeResourceSnapshot(t,He):m.makeResourceSnapshot(t,ze)}class yr{constructor(e,t,n,r,o={nConcurrentPartUploads:10,nConcurrentGetProgresses:10,pollingInterval:1e3,stopPollingDelay:1e3}){h(this,"idToProgress",new Map);h(this,"uploadQueue");h(this,"hooks");h(this,"scheduledOnNextState",[]);h(this,"keepRunning",!1);h(this,"currentLoop");this.logger=e,this.signer=t,this.clientBlob=n,this.clientProgress=r,this.opts=o,this.uploadQueue=new p.TaskProcessor(this.logger,1,{type:"exponentialWithMaxDelayBackoff",initialDelay:20,maxDelay:15e3,backoffMultiplier:1.5,jitter:.5}),this.hooks=new f.PollingComputableHooks(()=>this.startUpdating(),()=>this.stopUpdating(),{stopDebounce:o.stopPollingDelay},(l,a)=>this.scheduleOnNextState(l,a))}getProgressId(e,t){if(t==null)return f.Computable.make(l=>this.getProgressId(e,l));const n=m.isPlTreeEntry(e)?et(e,t):e,r=P.randomUUID();return t.attacheHooks(this.hooks),t.addOnDestroy(()=>this.release(n.id,r)),this.getProgressIdNoCtx(t.watcher,n,r)}getProgressIdNoCtx(e,t,n){br("getProgressId",t.type);const r=this.idToProgress.get(t.id);if(r!=null)return r.setDoneIfOutputSet(t),r.getProgress(e,n);const o=new Xe(this.logger,this.clientBlob,this.clientProgress,this.opts.nConcurrentPartUploads,this.signer,t);return this.idToProgress.set(t.id,o),o.shouldScheduleUpload()&&this.uploadQueue.push({fn:()=>o.uploadBlobTask(),recoverableErrorPredicate:l=>!ge(l)}),o.setDoneIfOutputSet(t),o.getProgress(e,n)}async release(e,t){const n=this.idToProgress.get(e);if(n===void 0)return;n.decCounter(t)&&this.idToProgress.delete(e)}async releaseAll(){this.uploadQueue.stop()}scheduleOnNextState(e,t){this.scheduledOnNextState.push({resolve:e,reject:t})}startUpdating(){this.keepRunning=!0,this.currentLoop===void 0&&(this.currentLoop=this.mainLoop())}stopUpdating(){this.keepRunning=!1}async mainLoop(){for(;this.keepRunning;){const e=this.scheduledOnNextState;this.scheduledOnNextState=[];try{await p.asyncPool(this.opts.nConcurrentGetProgresses,this.getAllNotDoneProgresses().map(t=>async()=>await t.updateStatus())),e.forEach(t=>t.resolve())}catch(t){console.error(t),e.forEach(n=>n.reject(t))}if(!this.keepRunning)break;await Pe.scheduler.wait(this.opts.pollingInterval)}this.currentLoop=void 0}getAllNotDoneProgresses(){return Array.from(this.idToProgress.entries()).filter(([e,t])=>!Tr(t.progress)).map(([e,t])=>t)}}function Tr(s){var e;return s.done&&(((e=s.status)==null?void 0:e.progress)??0)>=1}function br(s,e){if(!e.name.startsWith("BlobUpload")&&!e.name.startsWith("BlobIndex"))throw new H(`${s}: wrong resource type: ${e.name}, expected: a resource of either type 'BlobUpload' or 'BlobIndex'.`)}class kr{constructor(e,t,n={nConcurrentGetLogs:10,pollingInterval:1e3,stopPollingDelay:1e3}){h(this,"idToLastLines",new Map);h(this,"idToProgressLog",new Map);h(this,"hooks");h(this,"scheduledOnNextState",[]);h(this,"keepRunning",!1);h(this,"currentLoop");this.logger=e,this.clientLogs=t,this.opts=n,this.hooks=new f.PollingComputableHooks(()=>this.startUpdating(),()=>this.stopUpdating(),{stopDebounce:n.stopPollingDelay},(r,o)=>this.scheduleOnNextState(r,o))}getLastLogs(e,t,n){if(n==null)return f.Computable.make(a=>this.getLastLogs(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=P.randomUUID();n.attacheHooks(this.hooks),n.addOnDestroy(()=>this.releaseLastLogs(r.id,o));const l=this.getLastLogsNoCtx(n.watcher,r,t,o);return n.markUnstable("The logs are from stream, so we consider them unstable. Final values will be got from blobs."),l}getLastLogsNoCtx(e,t,n,r){K("getLastLogs",t.type);let o=this.idToLastLines.get(t.id);if(o==null){const a=new ye(this.logger,this.clientLogs,t,n);this.idToLastLines.set(t.id,a),o=a}o.attach(e,r);const l=o.getLog();if(l.error!=null)throw l.error;return l.log}getProgressLog(e,t,n){if(n==null)return f.Computable.make(a=>this.getProgressLog(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=P.randomUUID();n.attacheHooks(this.hooks),n.addOnDestroy(()=>this.releaseProgressLog(r.id,o));const l=this.getProgressLogNoCtx(n.watcher,r,t,o);return n.markUnstable("The progress log is from the stream, so we consider it unstable. Final value will be got from blobs."),l}getProgressLogNoCtx(e,t,n,r){K("getProgressLog",t.type);let o=this.idToProgressLog.get(t.id);if(o==null){const a=new ye(this.logger,this.clientLogs,t,1,n);this.idToProgressLog.set(t.id,a),o=a}o.attach(e,r);const l=o.getLog();if(l.error)throw l.error;return l.log}getLogHandle(e,t){if(t==null)return f.Computable.make(o=>this.getLogHandle(e,o));const n=m.treeEntryToResourceInfo(e,t),r=this.getLogHandleNoCtx(n);return t.markUnstable(`live_log:${g.resourceIdToString(n.id)}`),r}getLogHandleNoCtx(e){return K("getLogHandle",e.type),Ae(!0,e)}async lastLines(e,t,n,r){return await this.tryWithNotFound(e,()=>this.clientLogs.lastLines(_(e),t,BigInt(n??0),r))}async readText(e,t,n,r){return await this.tryWithNotFound(e,()=>this.clientLogs.readText(_(e),t,BigInt(n??0),r))}async tryWithNotFound(e,t){if(!W(e))throw new Error(`Not live log handle was passed to live log driver, handle: ${e}`);try{const n=await t();return{live:!0,shouldUpdateHandle:!1,data:n.data,size:Number(n.size),newOffset:Number(n.newOffset)}}catch(n){if(n.name=="RpcError"&&n.code=="NOT_FOUND")return{shouldUpdateHandle:!0};throw n}}async releaseLastLogs(e,t){var r;((r=this.idToLastLines.get(e))==null?void 0:r.release(t))&&this.idToLastLines.delete(e)}async releaseProgressLog(e,t){var r;((r=this.idToProgressLog.get(e))==null?void 0:r.release(t))&&this.idToProgressLog.delete(e)}async releaseAll(){}scheduleOnNextState(e,t){this.scheduledOnNextState.push({resolve:e,reject:t})}startUpdating(){this.keepRunning=!0,this.currentLoop===void 0&&(this.currentLoop=this.mainLoop())}stopUpdating(){this.keepRunning=!1}async mainLoop(){for(;this.keepRunning;){const e=this.scheduledOnNextState;this.scheduledOnNextState=[];try{const t=this.getAllLogs();await p.asyncPool(this.opts.nConcurrentGetLogs,t.map(n=>async()=>await n.update())),e.forEach(n=>n.resolve())}catch(t){console.error(t),e.forEach(n=>n.reject(t))}if(!this.keepRunning)break;await Pe.scheduler.wait(this.opts.pollingInterval)}this.currentLoop=void 0}getAllLogs(){return Array.from(this.idToLastLines.entries()).concat(Array.from(this.idToProgressLog.entries())).map(([e,t])=>t)}}class ye{constructor(e,t,n,r,o){h(this,"logs");h(this,"error");h(this,"change",new f.ChangeSource);h(this,"counter",new p.CallersCounter);this.logger=e,this.clientLogs=t,this.rInfo=n,this.lines=r,this.patternToSearch=o}getLog(){return{log:this.logs,error:this.error}}attach(e,t){this.change.attachWatcher(e),this.counter.inc(t)}release(e){return this.counter.dec(e)}async update(){try{const t=(await this.clientLogs.lastLines(this.rInfo,this.lines,0n,this.patternToSearch)).data.toString();this.logs!=t&&this.change.markChanged(),this.logs=t,this.error=void 0;return}catch(e){if(e.name=="RpcError"&&e.code=="NOT_FOUND"){this.logs="",this.error=e,this.change.markChanged();return}throw this.logger.error(`Stream log lines for ${g.stringifyWithResourceId(this.rInfo.id)} failed, reason: ${e}`),e}}}function K(s,e){if(!e.name.startsWith("StreamWorkdir"))throw new H(`${s}: wrong resource type: ${e.name}, expected: a resource of type 'StreamWorkdir'.`)}class Lr{constructor(e,t,n){this.logger=e,this.logsStreamDriver=t,this.downloadDriver=n}getLastLogs(e,t,n){if(n===void 0)return f.Computable.make(o=>this.getLastLogs(e,t,o));const r=C(n,e);if(r===void 0){n.markUnstable("no stream in stream manager");return}if(B(r))return this.downloadDriver.getLastLogs(r,t,n);try{return this.logsStreamDriver.getLastLogs(r,t,n)}catch(o){if(o.name=="RpcError"&&o.code=="NOT_FOUND"){n.markUnstable(`NOT_FOUND in logs stream driver while getting last logs: ${o}`);return}throw o}}getProgressLog(e,t,n){if(n===void 0)return f.Computable.make(o=>this.getProgressLog(e,t,o));const r=C(n,e);if(r===void 0){n.markUnstable("no stream in stream manager");return}if(B(r))return this.downloadDriver.getProgressLog(r,t,n);try{return this.logsStreamDriver.getProgressLog(r,t,n)}catch(o){if(o.name=="RpcError"&&o.code=="NOT_FOUND"){n.markUnstable(`NOT_FOUND in logs stream driver while getting a progress log: ${o}`);return}throw o}}getProgressLogWithInfo(e,t,n){if(n===void 0)return f.Computable.make(o=>this.getProgressLogWithInfo(e,t,o));const r=C(n,e);if(r===void 0){n.markUnstable("no stream in stream manager");return}if(B(r))return{progressLine:this.downloadDriver.getProgressLog(r,t,n),live:!1};try{return{progressLine:this.logsStreamDriver.getProgressLog(r,t,n),live:!0}}catch(o){if(o.name=="RpcError"&&o.code=="NOT_FOUND"){n.markUnstable(`NOT_FOUND in logs stream driver while getting a progress log with info: ${o}`);return}throw o}}getLogHandle(e,t){if(t===void 0)return f.Computable.make(r=>this.getLogHandle(e,r));const n=C(t,e);if(n===void 0){t.markUnstable("no stream in stream manager");return}return B(n)?this.downloadDriver.getLogHandle(n,t):this.logsStreamDriver.getLogHandle(n,t)}async lastLines(e,t,n,r){return W(e)?await this.logsStreamDriver.lastLines(e,t,n,r):await this.downloadDriver.lastLines(e,t,n,r)}async readText(e,t,n,r){return W(e)?await this.logsStreamDriver.readText(e,t,n,r):await this.downloadDriver.readText(e,t,n,r)}}function B(s){return!s.type.name.startsWith("StreamWorkdir")}function C(s,e){var t;return(t=s.accessor(e).node().traverse("stream"))==null?void 0:t.resourceInfo}class Pr{constructor(e,t,n,r={cacheSoftSizeBytes:50*1024*1024,withGunzip:!0,nConcurrentDownloads:50}){h(this,"downloadHelper");h(this,"urlToDownload",new Map);h(this,"downloadQueue");h(this,"cache");this.logger=e,this.saveDir=n,this.opts=r,this.downloadQueue=new p.TaskProcessor(this.logger,this.opts.nConcurrentDownloads),this.cache=new ue(this.opts.cacheSoftSizeBytes),this.downloadHelper=new Se(t)}getPath(e,t){if(t===void 0)return f.Computable.make(o=>this.getPath(e,o));const n=P.randomUUID();t.addOnDestroy(()=>this.releasePath(e,n));const r=this.getPathNoCtx(e,t.watcher,n);return(r==null?void 0:r.path)===void 0&&t.markUnstable(`a path to the downloaded and untared archive might be undefined. The current result: ${r}`),r}getPathNoCtx(e,t,n){const r=e.toString(),o=this.urlToDownload.get(r);if(o!=null)return o.attach(t,n),o.getPath();const l=this.setNewTask(t,e,n);return this.downloadQueue.push({fn:async()=>this.downloadUrl(l,n),recoverableErrorPredicate:a=>!0}),l.getPath()}async downloadUrl(e,t){var n;await e.download(this.downloadHelper,this.opts.withGunzip),((n=e.getPath())==null?void 0:n.path)!=null&&this.cache.addCache(e,t)}async releasePath(e,t){const n=e.toString(),r=this.urlToDownload.get(n);if(r!=null)if(this.cache.existsFile(r.path)){const o=this.cache.removeFile(r.path,t);await Promise.all(o.map(async l=>{await oe(l.path),this.cache.removeCache(l),this.removeTask(l,`the task ${g.stringifyWithResourceId(l.info())} was removedfrom cache along with ${g.stringifyWithResourceId(o.map(a=>a.info()))}`)}))}else r.counter.dec(t)&&this.removeTask(r,`the task ${g.stringifyWithResourceId(r.info())} was removed from cache`)}async releaseAll(){this.downloadQueue.stop(),await Promise.all(Array.from(this.urlToDownload.entries()).map(async([e,t])=>{await oe(t.path),this.cache.removeCache(t),this.removeTask(t,`the task ${g.stringifyWithResourceId(t.info())} was released when the driver was closed`)}))}setNewTask(e,t,n){const r=new Ur(this.logger,this.getFilePath(t),t);return r.attach(e,n),this.urlToDownload.set(t.toString(),r),r}removeTask(e,t){e.abort(t),e.change.markChanged(),this.urlToDownload.delete(e.url.toString())}getFilePath(e){const t=P.createHash("sha256").update(e.toString()).digest("hex");return T.join(this.saveDir,t)}}class Ur{constructor(e,t,n){h(this,"counter",new p.CallersCounter);h(this,"change",new f.ChangeSource);h(this,"signalCtl",new AbortController);h(this,"error");h(this,"done",!1);h(this,"size",0);this.logger=e,this.path=t,this.url=n}info(){return{url:this.url.toString(),path:this.path,done:this.done,size:this.size,error:this.error}}attach(e,t){this.counter.inc(t),this.done||this.change.attachWatcher(e)}async download(e,t){try{const n=await this.downloadAndUntar(e,t,this.signalCtl.signal);this.setDone(n),this.change.markChanged()}catch(n){if(n instanceof Te||n instanceof M){this.setError(n),this.change.markChanged(),await oe(this.path);return}throw n}}async downloadAndUntar(e,t,n){if(await p.ensureDirExists(T.dirname(this.path)),await p.fileExists(this.path))return await tt(this.path);const r=await e.download(this.url.toString(),{},n);let o=r.content;if(t){const l=L.Transform.toWeb(Ue.createGunzip());o=o.pipeThrough(l,{signal:n})}return await p.createPathAtomically(this.logger,this.path,async l=>{await w.mkdir(l);const a=L.Writable.toWeb(ee.extract(l));await o.pipeTo(a,{signal:n})}),r.size}getPath(){if(this.done)return{path:p.notEmpty(this.path)};if(this.error)return{error:this.error}}setDone(e){this.done=!0,this.size=e}setError(e){this.error=String(e)}abort(e){this.signalCtl.abort(new Te(e))}}class Te extends Error{}async function tt(s){const e=await w.readdir(s,{withFileTypes:!0});return(await Promise.all(e.map(async n=>{const r=T.join(s,n.name);return n.isDirectory()?await tt(r):(await w.stat(r)).size}))).reduce((n,r)=>n+r,0)}async function oe(s){await w.rm(s,{recursive:!0,force:!0})}function Y(s,e){return`index://index/${encodeURIComponent(JSON.stringify({storageId:s,path:e}))}`}function Ir(s,e,t,n){const r={localPath:s,pathSignature:e.sign(s),sizeBytes:String(t),modificationTime:String(n)};return`upload://upload/${encodeURIComponent(JSON.stringify(r))}`}function Rr(s){const e=new URL(s);return v.parse(JSON.parse(decodeURIComponent(e.pathname.substring(1))))}function Dr(s){const e=new URL(s);return pe.parse(JSON.parse(decodeURIComponent(e.pathname.substring(1))))}function be(s){if(Br(s))return $r(s);if(Sr(s))return Nr(s);p.assertNever(s)}const nt=/^local:\/\/(?<name>.*)\/(?<path>.*)$/;function Sr(s){return nt.test(s)}function vr(s,e){return`local://${s}/${encodeURIComponent(e)}`}function Nr(s){const e=s.match(nt);if(e==null)throw new Error(`Local list handle wasn't parsed: ${s}`);const{name:t,path:n}=e.groups;return{rootPath:decodeURIComponent(n),name:t,isRemote:!1}}const rt=/^remote:\/\/(?<name>.*)\/(?<resourceId>.*)$/;function Br(s){return rt.test(s)}function Cr(s,e){return`remote://${s}/${BigInt(e)}`}function $r(s){const e=s.match(rt);if(e==null)throw new Error(`Remote list handle wasn't parsed: ${s}`);const{name:t,resourceId:n}=e.groups;return{id:g.bigintToResourceId(BigInt(n)),type:Fr(t),name:t,isRemote:!0}}function Fr(s){return{name:`LS/${s}`,version:"1"}}async function ot(){const s=Le.homedir();if(b.sep=="/")return[{name:"local",root:"/",initialPath:s}];{const t=b.parse(s).root.replaceAll(":\\","");try{return(await mt.promisify(wt.exec)("wmic logicaldisk get name")).stdout.split(`\r
2
- `).filter(o=>o.includes(":")).map(o=>o.trim().replaceAll(":","")).map(o=>{const l=o==t;return{name:`local_disk_${o}`,root:`${o}:\\`,initialPath:l?s:`${o}:\\`}})}catch{return[{name:`local_disk_${t}`,root:`${t}:\\`,initialPath:s}]}}}class fe{constructor(e,t,n,r,o,l,a){this.logger=e,this.lsClient=t,this.storageIdToResourceId=n,this.signer=r,this.virtualStoragesMap=o,this.localProjectionsMap=l,this.openFileDialogCallback=a}async getLocalFileContent(e,t){const n=await this.tryResolveLocalFileHandle(e);if(t)throw new Error("Range request not yet supported.");return await w.readFile(n)}async getLocalFileSize(e){const t=await this.tryResolveLocalFileHandle(e);return(await w.stat(t)).size}async showOpenMultipleFilesDialog(e){const t=await this.openFileDialogCallback(!0,e);return t===void 0?{}:{files:await Promise.all(t.map(n=>this.getLocalFileHandle(n)))}}async showOpenSingleFileDialog(e){const t=await this.openFileDialogCallback(!1,e);return t===void 0?{}:{file:await this.getLocalFileHandle(t[0])}}async tryResolveLocalFileHandle(e){if(ft.isImportFileHandleIndex(e)){const t=Dr(e),n=this.localProjectionsMap.get(t.storageId);if(!n)throw new Error(`Storage ${t.storageId} is not mounted locally.`);return T.join(n.localPath,t.path)}else{const t=Rr(e);this.signer.verify(t.localPath,t.pathSignature,"Failed to validate local file handle signature.");const n=t.localPath,r=await w.stat(n,{bigint:!0});if(String(r.mtimeMs/1000n)!==t.modificationTime)throw new Error("File has changed since the handle was created.");return n}}async getLocalFileHandle(e){I(e);for(const n of this.localProjectionsMap.values())if(e.startsWith(n.localPath)){const r=n.localPath===""?e:T.relative(n.localPath,e);return Y(n.storageId,r)}const t=await w.stat(e,{bigint:!0});return Ir(e,this.signer,t.size,t.mtimeMs/1000n)}async getStorageList(){const e=[...this.virtualStoragesMap.values()].map(r=>({name:r.name,handle:vr(r.name,r.root),initialFullPath:r.initialPath})),n=Object.entries(this.storageIdToResourceId).map(([r,o])=>({name:r,handle:Cr(r,o),initialFullPath:"",isInitialPathHome:!1})).filter(r=>r.name!=="root");return[...e,...n]}async listFiles(e,t){const n=be(e);if(n.isRemote)return{entries:(await this.lsClient.list(n,t)).items.map(a=>({type:a.isDir?"dir":"file",name:a.name,fullPath:a.fullName,handle:Y(n.name,a.fullName)}))};T.sep==="/"&&t===""&&(t="/"),n.rootPath===""&&I(t);const r=T.isAbsolute(t)?t:T.join(n.rootPath,t),o=[];for await(const l of await w.opendir(r)){if(!l.isFile()&&!l.isDirectory())continue;const a=T.join(r,l.name);o.push({type:l.isFile()?"file":"dir",name:l.name,fullPath:a,handle:await this.getLocalFileHandle(a)})}return{entries:o}}async listRemoteFilesWithAdditionalInfo(e,t){const n=be(e);if(!n.isRemote)throw new Error(`Storage ${n.name} is not remote`);return{entries:(await this.lsClient.list(n,t)).items.map(o=>({type:o.isDir?"dir":"file",name:o.name,fullPath:o.fullName,handle:Y(n.name,o.fullName),size:Number(o.size)}))}}async fileToImportHandle(e){throw new Error("Not implemented. This method must be implemented and intercepted in desktop preload script.")}static async init(e,t,n,r,o,l){const a=We(t,e);l||(l=await ot());for(const u of l)I(u.root);for(const u of r)u.localPath!==""&&I(u.localPath);const d=new Map(l.map(u=>[u.name,u])),c=new Map(r.map(u=>[u.storageId,u]));if(new Set([...d.keys(),...c.keys()]).size!==d.size+c.size)throw new Error("Intersection between local projection storage ids and virtual storages names detected.");return new fe(e,a,await Wr(t),n,d,c,o)}}async function Wr(s){return s.withReadTx("GetAvailableStorageIds",async e=>{const t=await e.getResourceByName("LSProvider"),n=await e.getResourceData(t,!0);return _r(n)})}function _r(s){return Object.fromEntries(s.fields.filter(e=>e.type=="Dynamic"&&g.isNotNullResourceId(e.value)).map(e=>[e.name.substring(8),e.value]))}exports.ClientDownload=ve;exports.ClientLogs=Fe;exports.ClientLs=$e;exports.ClientProgress=De;exports.ClientUpload=Re;exports.DefaultVirtualLocalStorages=ot;exports.DownloadBlobToURLDriver=lr;exports.DownloadDriver=Kn;exports.DownloadUrlDriver=Pr;exports.DownloadableBlobSnapshot=qe;exports.ImportFileHandleData=qn;exports.ImportFileHandleIndexData=pe;exports.ImportFileHandleUploadData=v;exports.IndexResourceSnapshot=ze;exports.LogsDriver=Lr;exports.LogsStreamDriver=kr;exports.LsDriver=fe;exports.MTimeError=ae;exports.NetworkError=ce;exports.NoFileForUploading=de;exports.OnDemandBlobResourceSnapshot=Ee;exports.UnexpectedEOF=le;exports.UnknownStorageError=O;exports.Updater=Ve;exports.UploadDriver=yr;exports.UploadResourceSnapshot=He;exports.UploadTask=Xe;exports.WrongLocalFileUrl=E;exports.WrongResourceTypeError=H;exports.createDownloadClient=Hn;exports.createLogsClient=zn;exports.createLsFilesClient=We;exports.createUploadBlobClient=An;exports.createUploadProgressClient=xn;exports.getFullPath=Be;exports.getSize=Oe;exports.isMyUpload=Ye;exports.isResourceWasDeletedError=re;exports.makeBlobImportSnapshot=et;exports.makeDownloadableBlobSnapshot=Je;exports.newLocalStorageIdsToRoot=Ce;exports.nonRecoverableError=ge;exports.parseLocalUrl=Ne;exports.uploadBlob=Ke;exports.validateAbsolute=I;
1
+ "use strict";var lt=Object.defineProperty;var ct=(s,e,t)=>e in s?lt(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var h=(s,e,t)=>ct(s,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("@milaboratories/pl-client"),dt=require("node:fs/promises"),Le=require("undici"),y=require("@protobuf-ts/runtime-rpc"),i=require("@protobuf-ts/runtime"),p=require("@milaboratories/ts-helpers"),W=require("node:fs"),k=require("node:path"),P=require("node:stream"),ie=require("node:stream/consumers"),f=require("@milaboratories/computable"),m=require("@milaboratories/pl-tree"),ht=require("denque"),U=require("node:crypto"),Pe=require("node:os"),ut=require("node:readline/promises"),L=require("zod"),pt=require("node:zlib"),gt=require("tar-fs"),ft=require("decompress"),Ue=require("node:timers/promises"),mt=require("node:assert"),wt=require("@milaboratories/pl-model-common"),yt=require("node:util"),Tt=require("node:child_process");function I(s){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const t in s)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(s,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>s[t]})}}return e.default=s,Object.freeze(e)}const w=I(dt),ae=I(W),b=I(k),we=I(Pe),bt=I(ut),Ie=I(pt),ne=I(gt);class kt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new kt;class Lt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Init",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Lt;class Pt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Init.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ut=new Pt;class It extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Init.Response",[{no:1,name:"parts_count",kind:"scalar",T:4,L:0},{no:2,name:"uploaded_parts",kind:"scalar",repeat:1,T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.partsCount=0n,t.uploadedParts=[],e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.partsCount=e.uint64().toBigInt();break;case 2:if(d===i.WireType.LengthDelimited)for(let A=e.int32()+e.pos;e.pos<A;)o.uploadedParts.push(e.uint64().toBigInt());else o.uploadedParts.push(e.uint64().toBigInt());break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){if(e.partsCount!==0n&&t.tag(1,i.WireType.Varint).uint64(e.partsCount),e.uploadedParts.length){t.tag(2,i.WireType.LengthDelimited).fork();for(let o=0;o<e.uploadedParts.length;o++)t.uint64(e.uploadedParts[o]);t.join()}const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Rt=new It;class Dt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.UpdateProgress",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Dt;class St extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.UpdateProgress.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"bytes_processed",kind:"scalar",T:3,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.bytesProcessed=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.bytesProcessed=e.int64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.bytesProcessed!==0n&&t.tag(2,i.WireType.Varint).int64(e.bytesProcessed);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const vt=new St;class Nt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.UpdateProgress.Response",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ct=new Nt;class $t extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new $t;class Bt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"part_number",kind:"scalar",T:4,L:0},{no:3,name:"uploaded_part_size",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.partNumber=0n,t.uploadedPartSize=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.partNumber=e.uint64().toBigInt();break;case 3:o.uploadedPartSize=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.partNumber!==0n&&t.tag(2,i.WireType.Varint).uint64(e.partNumber),e.uploadedPartSize!==0n&&t.tag(3,i.WireType.Varint).uint64(e.uploadedPartSize);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ft=new Bt;class Wt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL.HTTPHeader",[{no:1,name:"Name",kind:"scalar",jsonName:"Name",T:9},{no:2,name:"Value",kind:"scalar",jsonName:"Value",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.name="",t.value="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.name=e.string();break;case 2:o.value=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.name!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.name),e.value!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.value);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const j=new Wt;class _t extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.GetPartURL.Response",[{no:1,name:"upload_url",kind:"scalar",T:9},{no:2,name:"method",kind:"scalar",T:9},{no:3,name:"headers",kind:"message",repeat:1,T:()=>j},{no:4,name:"chunk_start",kind:"scalar",T:4,L:0},{no:5,name:"chunk_end",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.uploadUrl="",t.method="",t.headers=[],t.chunkStart=0n,t.chunkEnd=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.uploadUrl=e.string();break;case 2:o.method=e.string();break;case 3:o.headers.push(j.internalBinaryRead(e,e.uint32(),n));break;case 4:o.chunkStart=e.uint64().toBigInt();break;case 5:o.chunkEnd=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.uploadUrl!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.uploadUrl),e.method!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.method);for(let o=0;o<e.headers.length;o++)j.internalBinaryWrite(e.headers[o],t.tag(3,i.WireType.LengthDelimited).fork(),n).join();e.chunkStart!==0n&&t.tag(4,i.WireType.Varint).uint64(e.chunkStart),e.chunkEnd!==0n&&t.tag(5,i.WireType.Varint).uint64(e.chunkEnd);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Mt=new _t;class Et extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Finalize",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Et;class Ot extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Finalize.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Ht=new Ot;class zt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.uploadapi.Finalize.Response",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const xt=new zt,G=new y.ServiceType("MiLaboratories.Controller.Shared.Upload",[{name:"Init",options:{},I:Ut,O:Rt},{name:"GetPartURL",options:{},I:Ft,O:Mt},{name:"UpdateProgress",options:{},I:vt,O:Ct},{name:"Finalize",options:{},I:Ht,O:xt}]);class At{constructor(e){h(this,"typeName",G.typeName);h(this,"methods",G.methods);h(this,"options",G.options);this._transport=e}init(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}getPartURL(e,t){const n=this.methods[1],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}updateProgress(e,t){const n=this.methods[2],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}finalize(e,t){const n=this.methods[3],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}function Re(s,e,t){const n=Object.fromEntries(s.map(({name:r,value:o})=>[r,o]));return e!==void 0&&t!==void 0&&(n.Range=`bytes=${e}-${t}`),n}class le extends Error{}class ce extends Error{}class de extends Error{}class he extends Error{}class De{constructor(e,t,n,r){h(this,"grpcClient");this.grpcTransport=e,this.httpClient=t,this.logger=r,this.grpcClient=new At(this.grpcTransport)}close(){}async initUpload({id:e,type:t},n){const r=await this.grpcInit(e,t,n);return{overall:r.partsCount,toUpload:this.partsToUpload(r.partsCount,r.uploadedParts)}}async partUpload({id:e,type:t},n,r,o,l){const a=await this.grpcGetPartUrl({id:e,type:t},o,0n,l),d=await jt(n,a.chunkStart,a.chunkEnd);await Vt(n,r);try{const{body:c,statusCode:u,headers:A}=await Le.request(a.uploadUrl,{dispatcher:this.httpClient,body:d,headersTimeout:6e4,bodyTimeout:6e4,headers:Re(a.headers),method:a.method.toUpperCase()}),at=await c.text();qt(u,at,A,a)}catch(c){throw c instanceof de?c:new Error(`partUpload: error ${JSON.stringify(c)} happened while trying to do part upload to the url ${a.uploadUrl}, headers: ${JSON.stringify(a.headers)}`)}await this.grpcUpdateProgress({id:e,type:t},BigInt(a.chunkEnd-a.chunkStart),l)}async finalize(e,t){return await this.grpcFinalize(e,t)}partsToUpload(e,t){const n=[],r=new Set(t);for(let o=1n;o<=e;o++)r.has(o)||n.push(o);return n}async grpcInit(e,t,n){return await this.grpcClient.init({resourceId:e},g.addRTypeToMetadata(t,n)).response}async grpcGetPartUrl({id:e,type:t},n,r,o){return await this.grpcClient.getPartURL({resourceId:e,partNumber:n,uploadedPartSize:r},g.addRTypeToMetadata(t,o)).response}async grpcUpdateProgress({id:e,type:t},n,r){await this.grpcClient.updateProgress({resourceId:e,bytesProcessed:n},g.addRTypeToMetadata(t,r)).response}async grpcFinalize({id:e,type:t},n){return await this.grpcClient.finalize({resourceId:e},g.addRTypeToMetadata(t,n)).response}}async function jt(s,e,t){let n;try{n=await w.open(s);const r=Number(t-e),o=Number(e),l=Buffer.alloc(r),a=await Gt(n,l,r,o);return l.subarray(0,a)}catch(r){throw r&&typeof r=="object"&&"code"in r&&r.code=="ENOENT"?new he(`there is no file ${s} for uploading`):r}finally{await(n==null?void 0:n.close())}}async function Gt(s,e,t,n){let r=0;for(;r<t;){const{bytesRead:o}=await s.read(e,r,t-r,n+r);if(o===0)throw new ce("file ended earlier than expected.");r+=o}return r}async function Vt(s,e){const t=BigInt(Math.floor((await w.stat(s)).mtimeMs/1e3));if(t>e)throw new le(`file was modified, expected mtime: ${e}, got: ${t}.`)}function qt(s,e,t,n){if(s!=200)throw new de(`response is not ok, status code: ${s}, body: ${e}, headers: ${JSON.stringify(t)}, url: ${n.uploadUrl}`)}class Jt extends i.MessageType{constructor(){super("google.protobuf.Duration",[{no:1,name:"seconds",kind:"scalar",T:3,L:0},{no:2,name:"nanos",kind:"scalar",T:5}])}internalJsonWrite(e,t){const n=i.PbLong.from(e.seconds).toNumber();if(n>315576e6||n<-315576e6)throw new Error("Duration value out of range.");let r=e.seconds.toString();if(n===0&&e.nanos<0&&(r="-"+r),e.nanos!==0){let o=Math.abs(e.nanos).toString();o="0".repeat(9-o.length)+o,o.substring(3)==="000000"?o=o.substring(0,3):o.substring(6)==="000"&&(o=o.substring(0,6)),r+="."+o}return r+"s"}internalJsonRead(e,t,n){if(typeof e!="string")throw new Error("Unable to parse Duration from JSON "+i.typeofJsonValue(e)+". Expected string.");const r=e.match(/^(-?)([0-9]+)(?:\.([0-9]+))?s/);if(r===null)throw new Error("Unable to parse Duration from JSON string. Invalid format.");n||(n=this.create());const[,o,l,a]=r,d=i.PbLong.from(o+l);if(d.toNumber()>315576e6||d.toNumber()<-315576e6)throw new Error("Unable to parse Duration from JSON string. Value out of range.");if(n.seconds=d.toBigInt(),typeof a=="string"){const c=o+a+"0".repeat(9-a.length);n.nanos=parseInt(c)}return n}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.seconds=0n,t.nanos=0,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.seconds=e.int64().toBigInt();break;case 2:o.nanos=e.int32();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.seconds!==0n&&t.tag(1,i.WireType.Varint).int64(e.seconds),e.nanos!==0&&t.tag(2,i.WireType.Varint).int32(e.nanos);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const F=new Jt;class Zt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Zt;class Qt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.Report",[{no:1,name:"progress",kind:"scalar",T:2},{no:2,name:"bytes_processed",kind:"scalar",T:4,L:0},{no:3,name:"bytes_total",kind:"scalar",T:4,L:0},{no:4,name:"done",kind:"scalar",T:8},{no:5,name:"name",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.progress=0,t.bytesProcessed=0n,t.bytesTotal=0n,t.done=!1,t.name="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.progress=e.float();break;case 2:o.bytesProcessed=e.uint64().toBigInt();break;case 3:o.bytesTotal=e.uint64().toBigInt();break;case 4:o.done=e.bool();break;case 5:o.name=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.progress!==0&&t.tag(1,i.WireType.Bit32).float(e.progress),e.bytesProcessed!==0n&&t.tag(2,i.WireType.Varint).uint64(e.bytesProcessed),e.bytesTotal!==0n&&t.tag(3,i.WireType.Varint).uint64(e.bytesTotal),e.done!==!1&&t.tag(4,i.WireType.Varint).bool(e.done),e.name!==""&&t.tag(5,i.WireType.LengthDelimited).string(e.name);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const D=new Qt;class Xt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.GetStatus",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Xt;class Kt extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.GetStatus.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Yt=new Kt;class en extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.GetStatus.Response",[{no:1,name:"report",kind:"message",T:()=>D}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.report=D.internalBinaryRead(e,e.uint32(),n,o.report);break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.report&&D.internalBinaryWrite(e.report,t.tag(1,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const tn=new en;class nn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.RealtimeStatus",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new nn;class rn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.RealtimeStatus.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"update_interval",kind:"message",T:()=>F}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.updateInterval=F.internalBinaryRead(e,e.uint32(),n,o.updateInterval);break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.updateInterval&&F.internalBinaryWrite(e.updateInterval,t.tag(2,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const on=new rn;class sn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.ProgressAPI.RealtimeStatus.Response",[{no:1,name:"report",kind:"message",T:()=>D}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.report=D.internalBinaryRead(e,e.uint32(),n,o.report);break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.report&&D.internalBinaryWrite(e.report,t.tag(1,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const an=new sn,V=new y.ServiceType("MiLaboratories.Controller.Shared.Progress",[{name:"GetStatus",options:{"google.api.http":{get:"/resources/{resource_id}/get-progress"}},I:Yt,O:tn},{name:"RealtimeStatus",serverStreaming:!0,options:{},I:on,O:an}]);class ln{constructor(e){h(this,"typeName",V.typeName);h(this,"methods",V.methods);h(this,"options",V.options);this._transport=e}getStatus(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}realtimeStatus(e,t){const n=this.methods[1],r=this._transport.mergeOptions(t);return y.stackIntercept("serverStreaming",this._transport,n,r,e)}}class Se{constructor(e,t,n,r){h(this,"grpcClient");this.grpcTransport=e,this.client=n,this.logger=r,this.grpcClient=new ln(this.grpcTransport)}close(){}async getStatus({id:e,type:t},n){const r=await this.grpcClient.getStatus({resourceId:e},g.addRTypeToMetadata(t,n)),o=p.notEmpty(r.response.report);return{done:o.done,progress:o.progress,bytesProcessed:String(o.bytesProcessed),bytesTotal:String(o.bytesTotal)}}async*realtimeStatus({id:e,type:t},n=100,r){r=g.addRTypeToMetadata(t,r);const o=Math.floor(n/1e3),l=(n-o*1e3)*1e6,a=F.create({seconds:BigInt(o),nanos:l});try{const{responses:d}=this.grpcClient.realtimeStatus({resourceId:e,updateInterval:a},r);yield*d}catch(d){throw this.logger.warn("Failed to get realtime status"+String(d)),d}}}class O extends Error{}class ve{constructor(e){this.httpClient=e}async download(e,t,n){const{statusCode:r,body:o,headers:l}=await Le.request(e,{dispatcher:this.httpClient,headers:t,signal:n}),a=P.Readable.toWeb(o);return await cn(r,a,e),{content:a,size:Number(l["content-length"])}}}async function cn(s,e,t){if(s!=200&&s!=206){const n=(await ie.text(e)).substring(0,1e3);throw 400<=s&&s<500?new O(`Http error: statusCode: ${s} url: ${t.toString()}, beginning of body: ${n}`):new Error(`Http error: statusCode: ${s} url: ${t.toString()}`)}}function R(s){if(!k.isAbsolute(s))throw new Error(`Path ${s} is not absolute.`);return s}class dn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new dn;class hn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new hn;class un extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const pn=new un;class gn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL.HTTPHeader",[{no:1,name:"Name",kind:"scalar",jsonName:"Name",T:9},{no:2,name:"Value",kind:"scalar",jsonName:"Value",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.name="",t.value="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.name=e.string();break;case 2:o.value=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.name!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.name),e.value!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.value);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const q=new gn;class fn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.DownloadAPI.GetDownloadURL.Response",[{no:1,name:"download_url",kind:"scalar",T:9},{no:2,name:"headers",kind:"message",repeat:1,T:()=>q}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.downloadUrl="",t.headers=[],e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.downloadUrl=e.string();break;case 2:o.headers.push(q.internalBinaryRead(e,e.uint32(),n));break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.downloadUrl!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.downloadUrl);for(let o=0;o<e.headers.length;o++)q.internalBinaryWrite(e.headers[o],t.tag(2,i.WireType.LengthDelimited).fork(),n).join();const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const mn=new fn,J=new y.ServiceType("MiLaboratories.Controller.Shared.Download",[{name:"GetDownloadURL",options:{"google.api.http":{get:"/resources/{resource_id}/get-download-url"}},I:pn,O:mn}]);class wn{constructor(e){h(this,"typeName",J.typeName);h(this,"methods",J.methods);h(this,"options",J.options);this._transport=e}getDownloadURL(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}class Ne{constructor(e,t,n,r){h(this,"grpcClient");h(this,"remoteFileDownloader");h(this,"localStorageIdsToRoot");this.grpcTransport=e,this.httpClient=t,this.logger=n,this.grpcClient=new wn(this.grpcTransport),this.remoteFileDownloader=new ve(t),this.localStorageIdsToRoot=Be(r)}close(){}async downloadBlob(e,t,n,r,o){const{downloadUrl:l,headers:a}=await this.grpcGetDownloadUrl(e,t,n),d=Re(a,r,o);return this.logger.info(`download blob from url ${l}, headers: ${JSON.stringify(d)}`),Tn(l)?await this.readLocalFile(l,r,o):await this.remoteFileDownloader.download(l,d,n)}async readLocalFile(e,t,n){const{storageId:r,relativePath:o}=Ce(e),l=$e(r,this.localStorageIdsToRoot,o);return{content:P.Readable.toWeb(ae.createReadStream(l,{start:t,end:n})),size:(await w.stat(l)).size}}async grpcGetDownloadUrl({id:e,type:t},n,r){const o=n??{};return o.abort=r,await this.grpcClient.getDownloadURL({resourceId:e},g.addRTypeToMetadata(t,o)).response}}function Ce(s){const e=new URL(s);if(e.pathname=="")throw new H(`url for local filepath ${s} does not match url scheme`);return{storageId:e.host,relativePath:decodeURIComponent(e.pathname.slice(1))}}function $e(s,e,t){const n=e.get(s);if(n===void 0)throw new z(`Unknown storage location: ${s}`);return n===""?t:b.join(n,t)}const yn="storage://";function Tn(s){return s.startsWith(yn)}class H extends Error{}class z extends Error{}function Be(s){const e=new Map;for(const t of s)t.localPath!==""&&R(t.localPath),e.set(t.storageId,t.localPath);return e}class bn extends i.MessageType{constructor(){super("google.protobuf.Timestamp",[{no:1,name:"seconds",kind:"scalar",T:3,L:0},{no:2,name:"nanos",kind:"scalar",T:5}])}now(){const e=this.create(),t=Date.now();return e.seconds=i.PbLong.from(Math.floor(t/1e3)).toBigInt(),e.nanos=t%1e3*1e6,e}toDate(e){return new Date(i.PbLong.from(e.seconds).toNumber()*1e3+Math.ceil(e.nanos/1e6))}fromDate(e){const t=this.create(),n=e.getTime();return t.seconds=i.PbLong.from(Math.floor(n/1e3)).toBigInt(),t.nanos=n%1e3*1e6,t}internalJsonWrite(e,t){const n=i.PbLong.from(e.seconds).toNumber()*1e3;if(n<Date.parse("0001-01-01T00:00:00Z")||n>Date.parse("9999-12-31T23:59:59Z"))throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");if(e.nanos<0)throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative.");let r="Z";if(e.nanos>0){const o=(e.nanos+1e9).toString().substring(1);o.substring(3)==="000000"?r="."+o.substring(0,3)+"Z":o.substring(6)==="000"?r="."+o.substring(0,6)+"Z":r="."+o+"Z"}return new Date(n).toISOString().replace(".000Z",r)}internalJsonRead(e,t,n){if(typeof e!="string")throw new Error("Unable to parse Timestamp from JSON "+i.typeofJsonValue(e)+".");const r=e.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);if(!r)throw new Error("Unable to parse Timestamp from JSON. Invalid format.");const o=Date.parse(r[1]+"-"+r[2]+"-"+r[3]+"T"+r[4]+":"+r[5]+":"+r[6]+(r[8]?r[8]:"Z"));if(Number.isNaN(o))throw new Error("Unable to parse Timestamp from JSON. Invalid value.");if(o<Date.parse("0001-01-01T00:00:00Z")||o>Date.parse("9999-12-31T23:59:59Z"))throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");return n||(n=this.create()),n.seconds=i.PbLong.from(o/1e3).toBigInt(),n.nanos=0,r[7]&&(n.nanos=parseInt("1"+r[7]+"0".repeat(9-r[7].length))-1e9),n}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.seconds=0n,t.nanos=0,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.seconds=e.int64().toBigInt();break;case 2:o.nanos=e.int32();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.seconds!==0n&&t.tag(1,i.WireType.Varint).int64(e.seconds),e.nanos!==0&&t.tag(2,i.WireType.Varint).int32(e.nanos);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Z=new bn;class kn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new kn;class Ln extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.ListItem",[{no:1,name:"name",kind:"scalar",T:9},{no:2,name:"size",kind:"scalar",T:4,L:0},{no:3,name:"is_dir",kind:"scalar",T:8},{no:10,name:"full_name",kind:"scalar",T:9},{no:11,name:"directory",kind:"scalar",T:9},{no:12,name:"last_modified",kind:"message",T:()=>Z},{no:13,name:"version",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.name="",t.size=0n,t.isDir=!1,t.fullName="",t.directory="",t.version="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.name=e.string();break;case 2:o.size=e.uint64().toBigInt();break;case 3:o.isDir=e.bool();break;case 10:o.fullName=e.string();break;case 11:o.directory=e.string();break;case 12:o.lastModified=Z.internalBinaryRead(e,e.uint32(),n,o.lastModified);break;case 13:o.version=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.name!==""&&t.tag(1,i.WireType.LengthDelimited).string(e.name),e.size!==0n&&t.tag(2,i.WireType.Varint).uint64(e.size),e.isDir!==!1&&t.tag(3,i.WireType.Varint).bool(e.isDir),e.fullName!==""&&t.tag(10,i.WireType.LengthDelimited).string(e.fullName),e.directory!==""&&t.tag(11,i.WireType.LengthDelimited).string(e.directory),e.lastModified&&Z.internalBinaryWrite(e.lastModified,t.tag(12,i.WireType.LengthDelimited).fork(),n).join(),e.version!==""&&t.tag(13,i.WireType.LengthDelimited).string(e.version);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Q=new Ln;class Pn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new Pn;class Un extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List.Request",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"location",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.location="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.location=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.location!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.location);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const In=new Un;class Rn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List.Response",[{no:1,name:"items",kind:"message",repeat:1,T:()=>Q},{no:2,name:"delimiter",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.items=[],t.delimiter="",e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.items.push(Q.internalBinaryRead(e,e.uint32(),n));break;case 2:o.delimiter=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){for(let o=0;o<e.items.length;o++)Q.internalBinaryWrite(e.items[o],t.tag(1,i.WireType.LengthDelimited).fork(),n).join();e.delimiter!==""&&t.tag(2,i.WireType.LengthDelimited).string(e.delimiter);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Dn=new Rn,X=new y.ServiceType("MiLaboratories.Controller.Shared.LS",[{name:"List",options:{},I:In,O:Dn}]);class Sn{constructor(e){h(this,"typeName",X.typeName);h(this,"methods",X.methods);h(this,"options",X.options);this._transport=e}list(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}class Fe{constructor(e,t){h(this,"grpcClient");this.logger=t,this.grpcClient=new Sn(e)}close(){}async list(e,t,n){return await this.grpcClient.list({resourceId:e.id,location:t},g.addRTypeToMetadata(e.type,n)).response}}class vn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){return r??this.create()}internalBinaryWrite(e,t,n){const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}new vn;class Nn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.StreamBinary",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:11,name:"chunk_size",kind:"scalar",opt:!0,T:13},{no:20,name:"read_limit",kind:"scalar",opt:!0,T:3,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 11:o.chunkSize=e.uint32();break;case 20:o.readLimit=e.int64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.chunkSize!==void 0&&t.tag(11,i.WireType.Varint).uint32(e.chunkSize),e.readLimit!==void 0&&t.tag(20,i.WireType.Varint).int64(e.readLimit);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Cn=new Nn;class $n extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.ReadBinary",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:11,name:"chunk_size",kind:"scalar",opt:!0,T:13}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 11:o.chunkSize=e.uint32();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.chunkSize!==void 0&&t.tag(11,i.WireType.Varint).uint32(e.chunkSize);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Bn=new $n;class Fn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.StreamText",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:20,name:"read_limit",kind:"scalar",opt:!0,T:3,L:0},{no:21,name:"search",kind:"scalar",opt:!0,T:9},{no:22,name:"search_re",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 20:o.readLimit=e.int64().toBigInt();break;case 21:o.search=e.string();break;case 22:o.searchRe=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.readLimit!==void 0&&t.tag(20,i.WireType.Varint).int64(e.readLimit),e.search!==void 0&&t.tag(21,i.WireType.LengthDelimited).string(e.search),e.searchRe!==void 0&&t.tag(22,i.WireType.LengthDelimited).string(e.searchRe);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Wn=new Fn;class _n extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.ReadText",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",T:3,L:0},{no:20,name:"read_limit",kind:"scalar",opt:!0,T:3,L:0},{no:21,name:"search",kind:"scalar",opt:!0,T:9},{no:22,name:"search_re",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,t.offset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 20:o.readLimit=e.int64().toBigInt();break;case 21:o.search=e.string();break;case 22:o.searchRe=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==0n&&t.tag(2,i.WireType.Varint).int64(e.offset),e.readLimit!==void 0&&t.tag(20,i.WireType.Varint).int64(e.readLimit),e.search!==void 0&&t.tag(21,i.WireType.LengthDelimited).string(e.search),e.searchRe!==void 0&&t.tag(22,i.WireType.LengthDelimited).string(e.searchRe);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const Mn=new _n;class En extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.LastLines",[{no:1,name:"resource_id",kind:"scalar",T:4,L:0},{no:2,name:"offset",kind:"scalar",opt:!0,T:3,L:0},{no:3,name:"line_count",kind:"scalar",opt:!0,T:5},{no:21,name:"search",kind:"scalar",opt:!0,T:9},{no:22,name:"search_re",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.resourceId=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.resourceId=e.uint64().toBigInt();break;case 2:o.offset=e.int64().toBigInt();break;case 3:o.lineCount=e.int32();break;case 21:o.search=e.string();break;case 22:o.searchRe=e.string();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.resourceId!==0n&&t.tag(1,i.WireType.Varint).uint64(e.resourceId),e.offset!==void 0&&t.tag(2,i.WireType.Varint).int64(e.offset),e.lineCount!==void 0&&t.tag(3,i.WireType.Varint).int32(e.lineCount),e.search!==void 0&&t.tag(21,i.WireType.LengthDelimited).string(e.search),e.searchRe!==void 0&&t.tag(22,i.WireType.LengthDelimited).string(e.searchRe);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const On=new En;class Hn extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.StreamingAPI.Response",[{no:1,name:"data",kind:"scalar",T:12},{no:2,name:"size",kind:"scalar",T:4,L:0},{no:3,name:"new_offset",kind:"scalar",T:4,L:0}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.data=new Uint8Array(0),t.size=0n,t.newOffset=0n,e!==void 0&&i.reflectionMergePartial(this,t,e),t}internalBinaryRead(e,t,n,r){const o=r??this.create(),l=e.pos+t;for(;e.pos<l;){const[a,d]=e.tag();switch(a){case 1:o.data=e.bytes();break;case 2:o.size=e.uint64().toBigInt();break;case 3:o.newOffset=e.uint64().toBigInt();break;default:const c=n.readUnknownField;if(c==="throw")throw new globalThis.Error(`Unknown field ${a} (wire type ${d}) for ${this.typeName}`);const u=e.skip(d);c!==!1&&(c===!0?i.UnknownFieldHandler.onRead:c)(this.typeName,o,a,d,u)}}return o}internalBinaryWrite(e,t,n){e.data.length&&t.tag(1,i.WireType.LengthDelimited).bytes(e.data),e.size!==0n&&t.tag(2,i.WireType.Varint).uint64(e.size),e.newOffset!==0n&&t.tag(3,i.WireType.Varint).uint64(e.newOffset);const r=n.writeUnknownFields;return r!==!1&&(r==!0?i.UnknownFieldHandler.onWrite:r)(this.typeName,e,t),t}}const S=new Hn,K=new y.ServiceType("MiLaboratories.Controller.Shared.Streaming",[{name:"StreamBinary",serverStreaming:!0,options:{},I:Cn,O:S},{name:"ReadBinary",options:{},I:Bn,O:S},{name:"StreamText",serverStreaming:!0,options:{},I:Wn,O:S},{name:"ReadText",options:{},I:Mn,O:S},{name:"LastLines",options:{},I:On,O:S}]);class zn{constructor(e){h(this,"typeName",K.typeName);h(this,"methods",K.methods);h(this,"options",K.options);this._transport=e}streamBinary(e,t){const n=this.methods[0],r=this._transport.mergeOptions(t);return y.stackIntercept("serverStreaming",this._transport,n,r,e)}readBinary(e,t){const n=this.methods[1],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}streamText(e,t){const n=this.methods[2],r=this._transport.mergeOptions(t);return y.stackIntercept("serverStreaming",this._transport,n,r,e)}readText(e,t){const n=this.methods[3],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}lastLines(e,t){const n=this.methods[4],r=this._transport.mergeOptions(t);return y.stackIntercept("unary",this._transport,n,r,e)}}class We{constructor(e,t,n){h(this,"grpcClient");this.grpcTransport=e,this.httpClient=t,this.logger=n,this.grpcClient=new zn(this.grpcTransport)}close(){}async lastLines({id:e,type:t},n,r=0n,o,l){return(await this.grpcClient.lastLines({resourceId:e,lineCount:n,offset:r,search:o},g.addRTypeToMetadata(t,l))).response}async readText({id:e,type:t},n,r=0n,o,l){return(await this.grpcClient.readText({resourceId:p.notEmpty(e),readLimit:BigInt(n),offset:r,search:o},g.addRTypeToMetadata(t,l))).response}}function xn(s,e,t){return e.getDriver({name:"DownloadBlob",init:(n,r,o)=>new Ne(r,o,s,t)})}function An(s,e){return s.getDriver({name:"StreamLogs",init:(t,n,r)=>new We(n,r,e)})}function jn(s,e){return s.getDriver({name:"UploadProgress",init:(t,n,r)=>new Se(n,r,s,e)})}function Gn(s,e){return s.getDriver({name:"UploadBlob",init:(t,n,r)=>new De(n,r,s,e)})}function _e(s,e){return s.getDriver({name:"LsFiles",init:(t,n,r)=>new Fe(n,e)})}class Vn{constructor(e,t,n,r,o){h(this,"counter",new p.CallersCounter);h(this,"change",new f.ChangeSource);h(this,"signalCtl",new AbortController);h(this,"error");h(this,"done",!1);h(this,"size",0);this.logger=e,this.clientDownload=t,this.rInfo=n,this.path=r,this.handle=o}info(){return{rInfo:this.rInfo,path:this.path,done:this.done,size:this.size,error:this.error}}attach(e,t){this.counter.inc(t),this.done||this.change.attachWatcher(e)}async download(){try{const e=await this.ensureDownloaded();this.setDone(e),this.change.markChanged()}catch(e){throw ue(e)&&(this.setError(e),this.change.markChanged(),await w.rm(this.path)),e}}async ensureDownloaded(){if(await p.ensureDirExists(b.dirname(this.path)),await p.fileExists(this.path))return this.logger.info(`a blob was already downloaded: ${this.path}`),(await w.stat(this.path)).size;const{content:e,size:t}=await this.clientDownload.downloadBlob(this.rInfo);return await p.createPathAtomically(this.logger,this.path,async n=>{const r=P.Writable.toWeb(W.createWriteStream(n,{flags:"wx"}));await e.pipeTo(r)}),t}abort(e){this.signalCtl.abort(new Me(e))}getBlob(){return this.done?this.error?{done:!0,result:{ok:!1,error:this.error}}:{done:!0,result:{ok:!0,value:{handle:this.handle,size:this.size}}}:{done:!1}}setDone(e){this.done=!0,this.size=e}setError(e){this.done=!0,this.error=e}}function ue(s){return s instanceof Me||s instanceof O||s instanceof z||s instanceof H||(s==null?void 0:s.code)=="ENOENT"||s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED")}class Me extends Error{}class pe{constructor(e){h(this,"cache",new Map);h(this,"totalSizeBytes",0);this.softSizeBytes=e}existsFile(e){return this.cache.get(e)!=null}getFile(e,t){const n=this.cache.get(e);return n!=null&&n.counter.inc(t),n}removeFile(e,t){return p.mapGet(this.cache,e).counter.dec(t),this.toDelete()}toDelete(){if(this.totalSizeBytes<=this.softSizeBytes)return[];const e=[];let t=0;return p.mapEntries(this.cache).filter(([n,r])=>r.counter.isZero()).forEach(([n,r])=>{if(this.totalSizeBytes-t<=this.softSizeBytes)return;const o=p.mapGet(this.cache,n);t+=o.size,e.push(o)}),e}addCache(e,t){const n=this.cache.get(e.path)==null;if(this.cache.set(e.path,e),e.counter.inc(t),e.size<0)throw new Error(`empty sizeBytes: ${e}`);n&&(this.totalSizeBytes+=e.size)}removeCache(e){this.cache.delete(e.path),this.totalSizeBytes-=e.size}}const Ee=/^blob\+local:\/\/download\/(?<path>.*)#(?<signature>.*)$/;function qn(s,e){return`blob+local://download/${s}#${e.sign(s)}`}function Jn(s){return!!s.match(Ee)}function Y(s,e){const t=s.match(Ee);if(t===null)throw new Error(`Local handle is malformed: ${s}, matches: ${t}`);const{path:n,signature:r}=t.groups;return e.verify(n,r,`Signature verification failed for: ${s}`),{path:n,signature:r}}const Oe=m.rsSchema({kv:{"ctl/file/blobInfo":L.z.object({sizeBytes:L.z.coerce.number()})}});function He(s){return s.kv["ctl/file/blobInfo"].sizeBytes}const N=L.z.object({localPath:L.z.string(),pathSignature:L.z.string(),sizeBytes:L.z.string(),modificationTime:L.z.string()}),ge=L.z.object({storageId:L.z.string(),path:L.z.string()}),Zn=L.z.union([N,ge]),ze=m.rsSchema({data:N,fields:{blob:!1}}),xe=m.rsSchema({fields:{incarnation:!1}}),Ae=/^blob\+remote:\/\/download\/(?<content>(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*))#(?<signature>.*)$/;function Qn(s,e){const t=`${s.type.name}/${s.type.version}/${BigInt(s.id)}`;return`blob+remote://download/${t}#${e.sign(t)}`}function Xn(s){return!!s.match(Ae)}function Kn(s,e){const t=s.match(Ae);if(t===null)throw new Error(`Remote handle is malformed: ${s}, matches: ${t}`);const{content:n,resourceType:r,resourceVersion:o,resourceId:l,signature:a}=t.groups;return e.verify(n,a,`Signature verification failed for ${s}`),{id:g.bigintToResourceId(BigInt(l)),type:{name:r,version:o}}}function je(s,e){return s?`log+live://log/${e.type.name}/${e.type.version}/${BigInt(e.id)}`:`log+ready://log/${e.type.name}/${e.type.version}/${BigInt(e.id)}`}const Ge=/^log\+live:\/\/log\/(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*)$/;function _(s){return Ge.test(s)}const Ve=/^log\+ready:\/\/log\/(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*)$/;function Yn(s){return Ve.test(s)}function M(s){let e;if(_(s))e=s.match(Ge);else if(Yn(s))e=s.match(Ve);else throw new Error(`Log handle is malformed: ${s}`);if(e==null)throw new Error(`Log handle wasn't parsed: ${s}`);const{resourceType:t,resourceVersion:n,resourceId:r}=e.groups;return{id:g.bigintToResourceId(BigInt(r)),type:{name:t,version:n}}}class x extends Error{}class qe{constructor(e){h(this,"updating");this.onUpdate=e}schedule(){this.updating==null&&(this.updating=(async()=>{try{await this.onUpdate()}catch(e){console.log(`error while updating in Updater: ${e}`)}finally{this.updating=void 0}})())}}class er{constructor(e,t,n,r,o,l){h(this,"idToDownload",new Map);h(this,"cache");h(this,"downloadQueue");h(this,"idToOnDemand",new Map);h(this,"idToLastLines",new Map);h(this,"idToProgressLog",new Map);h(this,"saveDir");this.logger=e,this.clientDownload=t,this.clientLogs=n,this.signer=o,this.cache=new pe(l.cacheSoftSizeBytes),this.downloadQueue=new p.TaskProcessor(this.logger,l.nConcurrentDownloads),this.saveDir=b.resolve(r)}getDownloadedBlob(e,t,n,r){if(t===void 0)return f.Computable.make(c=>this.getDownloadedBlob(e,c,n,r));const o=m.treeEntryToResourceInfo(e,t),l=T(o.id,n,r),a=U.randomUUID();t.addOnDestroy(()=>this.releaseBlob(l,a));const d=this.getDownloadedBlobNoCtx(t.watcher,o,a,n,r);return d==null&&t.markUnstable("download blob is still undefined"),d}getDownloadedBlobNoCtx(e,t,n,r,o){v("getDownloadedBlob",t.type);let l=this.idToDownload.get(T(t.id,r,o));if(l===void 0){const d=this.setNewDownloadTask(t);this.downloadQueue.push({fn:()=>this.downloadBlob(d,n),recoverableErrorPredicate:c=>!ue(c)}),l=d}l.attach(e,n);const a=l.getBlob();if(a.done){if(a.result.ok)return a.result.value;throw a.result.error}}setNewDownloadTask(e,t,n){const r=b.resolve(this.saveDir,T(e.id,t,n)),o=new Vn(this.logger,this.clientDownload,e,r,qn(r,this.signer));return this.idToDownload.set(T(e.id,t,n),o),o}async downloadBlob(e,t){await e.download();const n=e.getBlob();n.done&&n.result.ok&&this.cache.addCache(e,t)}getOnDemandBlob(e,t){if(t===void 0)return f.Computable.make(l=>this.getOnDemandBlob(e,l));const n=m.isPlTreeEntry(e)?m.makeResourceSnapshot(e,Oe,t):e,r=U.randomUUID();return t.addOnDestroy(()=>this.releaseOnDemandBlob(n.id,r)),this.getOnDemandBlobNoCtx(n,r)}getOnDemandBlobNoCtx(e,t){v("getOnDemandBlob",e.type);let n=this.idToOnDemand.get(T(e.id));return n===void 0&&(n=new tr(He(e),Qn(e,this.signer)),this.idToOnDemand.set(T(e.id),n)),n.attach(t),n.getHandle()}getLocalPath(e){const{path:t}=Y(e,this.signer);return t}async getContent(e){if(Jn(e))return await rr(this.getLocalPath(e));if(Xn(e)){const t=Kn(e,this.signer),{content:n}=await this.clientDownload.downloadBlob(t);return await ie.buffer(n)}throw new Error("Malformed remote handle")}getComputableContent(e){return f.Computable.make(t=>this.getDownloadedBlob(e,t),{postprocessValue:t=>t?this.getContent(t.handle):void 0}).withStableType()}getLastLogs(e,t,n){if(n==null)return f.Computable.make(a=>this.getLastLogs(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=U.randomUUID();n.addOnDestroy(()=>this.releaseBlob(T(r.id),o));const l=this.getLastLogsNoCtx(n.watcher,r,t,o);return l==null&&n.markUnstable("either a file was not downloaded or logs was not read"),l}getLastLogsNoCtx(e,t,n,r){v("getLastLogs",t.type);const o=this.getDownloadedBlobNoCtx(e,t,r);if(o==null)return;const{path:l}=Y(o.handle,this.signer);let a=this.idToLastLines.get(T(t.id));if(a==null){const c=new ye(l,n);this.idToLastLines.set(T(t.id),c),a=c}const d=a.getOrSchedule(e);if(d.error)throw d.error;return d.log}getProgressLog(e,t,n){if(n==null)return f.Computable.make(a=>this.getProgressLog(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=U.randomUUID();n.addOnDestroy(()=>this.releaseBlob(T(r.id),o));const l=this.getProgressLogNoCtx(n.watcher,r,t,o);return l===void 0&&n.markUnstable("either a file was not downloaded or a progress log was not read"),l}getProgressLogNoCtx(e,t,n,r){v("getProgressLog",t.type);const o=this.getDownloadedBlobNoCtx(e,t,r);if(o==null)return;const{path:l}=Y(o.handle,this.signer);let a=this.idToProgressLog.get(T(t.id));if(a==null){const c=new ye(l,1,n);this.idToProgressLog.set(T(t.id),c),a=c}const d=a.getOrSchedule(e);if(d.error)throw d.error;return d.log}getLogHandle(e,t){if(t==null)return f.Computable.make(r=>this.getLogHandle(e,r));const n=m.treeEntryToResourceInfo(e,t);return this.getLogHandleNoCtx(n)}getLogHandleNoCtx(e){return v("getLogHandle",e.type),je(!1,e)}async lastLines(e,t,n,r){const o=await this.clientLogs.lastLines(M(e),t,BigInt(n??0),r);return{live:!1,shouldUpdateHandle:!1,data:o.data,size:Number(o.size),newOffset:Number(o.newOffset)}}async readText(e,t,n,r){const o=await this.clientLogs.readText(M(e),t,BigInt(n??0),r);return{live:!1,shouldUpdateHandle:!1,data:o.data,size:Number(o.size),newOffset:Number(o.newOffset)}}async releaseBlob(e,t){const n=this.idToDownload.get(e);if(n!=null)if(this.cache.existsFile(n.path)){const r=this.cache.removeFile(n.path,t);await Promise.all(r.map(async o=>{await w.rm(o.path),this.cache.removeCache(o),this.removeTask(o,`the task ${g.stringifyWithResourceId(o.info())} was removedfrom cache along with ${g.stringifyWithResourceId(r.map(l=>l.info()))}`)}))}else n.counter.dec(t)&&this.removeTask(n,`the task ${g.stringifyWithResourceId(n.info())} was removed from cache`)}removeTask(e,t){e.abort(t),e.change.markChanged(),this.idToDownload.delete(T(e.rInfo.id)),this.idToLastLines.delete(T(e.rInfo.id)),this.idToProgressLog.delete(T(e.rInfo.id))}async releaseOnDemandBlob(e,t){var r;(((r=this.idToOnDemand.get(T(e)))==null?void 0:r.release(t))??!1)&&this.idToOnDemand.delete(T(e))}async releaseAll(){this.downloadQueue.stop(),this.idToDownload.forEach((e,t)=>{this.idToDownload.delete(t),e.change.markChanged()})}}class tr{constructor(e,t){h(this,"counter",new p.CallersCounter);this.size=e,this.handle=t}getHandle(){return{handle:this.handle,size:this.size}}attach(e){this.counter.inc(e)}release(e){return this.counter.dec(e)}}class ye{constructor(e,t,n){h(this,"updater");h(this,"log");h(this,"change",new f.ChangeSource);h(this,"error");this.path=e,this.lines=t,this.patternToSearch=n,this.updater=new qe(async()=>this.update())}getOrSchedule(e){return this.change.attachWatcher(e),this.updater.schedule(),{log:this.log,error:this.error}}async update(){try{const e=await nr(this.path,this.lines,this.patternToSearch);this.log!=e&&this.change.markChanged(),this.log=e}catch(e){if(e.name=="RpcError"&&e.code=="NOT_FOUND"){this.log="",this.error=e,this.change.markChanged();return}throw e}}}function nr(s,e,t){const n=ae.createReadStream(s),r=new P.Writable;return new Promise((o,l)=>{const a=bt.createInterface(n,r),d=new ht;a.on("line",function(c){t!=null&&!c.includes(t)||(d.push(c),d.length>e&&d.shift())}),a.on("error",l),a.on("close",function(){o(d.toArray().join(we.EOL)+we.EOL)})})}async function rr(s){return await ie.buffer(P.Readable.toWeb(ae.createReadStream(s)))}function v(s,e){if(!e.name.startsWith("Blob/")){let t=`${s}: wrong resource type: ${e.name}, expected: a resource of type that starts with 'Blob/'.`;throw e.name=="Blob"&&(t+=" If it's called from workflow, should a file be exported with 'file.exportFile' function?"),new x(t)}}function T(s,e,t){return e!==void 0&&t!==void 0?`${BigInt(s)}_${e}-${t}`:`${BigInt(s)}`}const Je=m.rsSchema({});function Ze(s,e){const t=m.isPlTreeEntry(s)?e.accessor(s).node():m.isPlTreeEntryAccessor(s)?s.node():s;return m.makeResourceSnapshot(t,Je)}function or(s,e,t){const n=k.relative(e,t);return`plblob+folder://${s.sign(n)}.${n}.blob`}function sr(s){return new URL(s).protocol=="plblob+folder:"}function ir(s,e,t){const n=new URL(e),[r,o,l]=n.host.split(".");s.verify(o,r,`signature verification failed for url: ${e}, subfolder: ${o}`);let a=ar(k.join(t,`${o}`),n.pathname.slice(1));return(n.pathname==""||n.pathname=="/")&&(a=k.join(a,"index.html")),k.resolve(a)}function ar(s,e){const t=k.resolve(s,e),n=k.resolve(s);if(!t.startsWith(n))throw new Error("Path validation failed.");return t}class lr{constructor(e,t,n,r,o,l,a){h(this,"counter",new p.CallersCounter);h(this,"change",new f.ChangeSource);h(this,"signalCtl",new AbortController);h(this,"error");h(this,"done",!1);h(this,"size",0);h(this,"url");h(this,"state");this.logger=e,this.signer=t,this.saveDir=n,this.path=r,this.rInfo=o,this.format=l,this.clientDownload=a}info(){return{rInfo:this.rInfo,format:this.format,path:this.path,done:this.done,size:this.size,error:this.error,taskHistory:this.state}}attach(e,t){this.counter.inc(t),this.done||this.change.attachWatcher(e)}async download(){try{const e=await this.downloadAndDecompress(this.signalCtl.signal);this.setDone(e),this.change.markChanged(),this.logger.info(`blob to URL task is done: ${g.stringifyWithResourceId(this.info())}`)}catch(e){if(this.logger.warn(`a error was produced: ${e} for blob to URL task: ${g.stringifyWithResourceId(this.info())}`),cr(e)){this.setError(e),this.change.markChanged(),await re(this.path);return}throw e}}async downloadAndDecompress(e){if(this.state={},this.state.parentDir=k.dirname(this.path),await p.ensureDirExists(this.state.parentDir),this.state.fileExisted=await p.fileExists(this.path),this.state.fileExisted)return await Qe(this.path);const{content:t,size:n}=await this.clientDownload.downloadBlob(this.rInfo,{},e);return this.state.downloaded=!0,await p.createPathAtomically(this.logger,this.path,async r=>{switch(this.state.tempPath=r,this.state.archiveFormat=this.format,this.format){case"tar":await w.mkdir(r);const o=P.Writable.toWeb(ne.extract(r));await t.pipeTo(o,{signal:e});return;case"tgz":await w.mkdir(r);const l=P.Transform.toWeb(Ie.createGunzip()),a=P.Writable.toWeb(ne.extract(r));await t.pipeThrough(l,{signal:e}).pipeTo(a,{signal:e});return;case"zip":this.state.zipPath=this.path+".zip";const d=P.Writable.toWeb(W.createWriteStream(this.state.zipPath));await t.pipeTo(d,{signal:e}),this.state.zipPathCreated=!0,await ft(this.state.zipPath,r,{filter:c=>!c.path.endsWith("/")}),this.state.zipDecompressed=!0,await W.promises.rm(this.state.zipPath),this.state.zipPathDeleted=!0;return;default:i.assertNever(this.format)}}),this.state.pathCreated=!0,n}getURL(){if(this.done)return{url:p.notEmpty(this.url)};if(this.error)return{error:this.error}}setDone(e){this.done=!0,this.size=e,this.url=or(this.signer,this.saveDir,this.path)}setError(e){this.error=String(e)}abort(e){this.signalCtl.abort(new Xe(e))}}async function Qe(s){const e=await w.readdir(s,{withFileTypes:!0});return(await Promise.all(e.map(async n=>{const r=k.join(s,n.name);return n.isDirectory()?await Qe(r):(await w.stat(r)).size}))).reduce((n,r)=>n+r,0)}async function re(s){await w.rm(s,{recursive:!0,force:!0})}let Xe=class extends Error{};function cr(s){return s instanceof Xe||s instanceof O||s instanceof z||s instanceof H||(s==null?void 0:s.code)=="ENOENT"||s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED")||String(s).includes("incorrect header check")}function C(s,e){return`id:${String(BigInt(s))}-${e}`}class dr{constructor(e,t,n,r,o={cacheSoftSizeBytes:50*1024*1024,nConcurrentDownloads:50}){h(this,"idToDownload",new Map);h(this,"downloadQueue");h(this,"cache");this.logger=e,this.signer=t,this.clientDownload=n,this.saveDir=r,this.opts=o,this.downloadQueue=new p.TaskProcessor(this.logger,this.opts.nConcurrentDownloads,{type:"exponentialWithMaxDelayBackoff",initialDelay:1e4,maxDelay:3e4,backoffMultiplier:1.5,jitter:.5}),this.cache=new pe(this.opts.cacheSoftSizeBytes)}info(){return{saveDir:this.saveDir,opts:this.opts,idToDownloadSize:this.idToDownload.size,idToDownloadKeys:this.idToDownload.keys(),idToDownload:Array.from(this.idToDownload.entries()).map(([e,t])=>[e,t.info()])}}getPathForCustomProtocol(e){if(sr(e))return ir(this.signer,e,this.saveDir);throw new Error(`getPathForCustomProtocol: ${e} is invalid`)}extractArchiveAndGetURL(e,t,n){if(n===void 0)return f.Computable.make(a=>this.extractArchiveAndGetURL(e,t,a));const r=m.isPlTreeEntry(e)?Ze(e,n):e,o=U.randomUUID();n.addOnDestroy(()=>this.releasePath(r.id,t,o));const l=this.extractArchiveAndGetURLNoCtx(r,t,n.watcher,o);if((l==null?void 0:l.url)===void 0&&n.markUnstable(`a path to the downloaded archive might be undefined. The current result: ${l}`),(l==null?void 0:l.error)!==void 0)throw l==null?void 0:l.error;return l==null?void 0:l.url}extractArchiveAndGetURLNoCtx(e,t,n,r){const o=this.idToDownload.get(C(e.id,t));if(o!=null)return o.attach(n,r),o.getURL();const l=this.setNewTask(n,e,t,r);return this.downloadQueue.push({fn:async()=>this.downloadUrl(l,r),recoverableErrorPredicate:a=>!ue(a)}),l.getURL()}async downloadUrl(e,t){var n;await e.download(),((n=e.getURL())==null?void 0:n.url)!=null&&this.cache.addCache(e,t)}async releasePath(e,t,n){const r=this.idToDownload.get(C(e,t));if(r!=null)if(this.cache.existsFile(r.path)){const o=this.cache.removeFile(r.path,n);await Promise.all(o.map(async l=>{await re(l.path),this.cache.removeCache(l),this.removeTask(l,`the task ${g.stringifyWithResourceId(l.info())} was removedfrom cache along with ${g.stringifyWithResourceId(o.map(a=>a.info()))}`)}))}else r.counter.dec(n)&&this.removeTask(r,`the task ${g.stringifyWithResourceId(r.info())} was removed from cache`)}async releaseAll(){this.downloadQueue.stop(),await Promise.all(Array.from(this.idToDownload.entries()).map(async([e,t])=>{await re(t.path),this.cache.removeCache(t),this.removeTask(t,`the task ${g.stringifyWithResourceId(t.info())} was released when the driver was closed`)}))}setNewTask(e,t,n,r){const o=new lr(this.logger,this.signer,this.saveDir,this.getFilePath(t.id,n),t,n,this.clientDownload);return o.attach(e,r),this.idToDownload.set(C(t.id,n),o),o}removeTask(e,t){e.abort(t),e.change.markChanged(),this.idToDownload.delete(C(e.rInfo.id,e.format))}getFilePath(e,t){return b.join(this.saveDir,`${String(BigInt(e))}_${t}`)}}class Ke{constructor(e,t,n,r,o,l){h(this,"change",new f.ChangeSource);h(this,"counter",new p.CallersCounter);h(this,"nMaxUploads");h(this,"nPartsWithThisUploadSpeed",0);h(this,"nPartsToIncreaseUpload",10);h(this,"uploadData");h(this,"progress");h(this,"failed");h(this,"alreadyExisted",!1);this.logger=e,this.clientBlob=t,this.clientProgress=n,this.maxNConcurrentPartsUpload=r,this.res=l,this.nMaxUploads=this.maxNConcurrentPartsUpload;const{uploadData:a,progress:d}=hr(l,o);this.uploadData=a,this.progress=d}getProgress(e,t){if(this.incCounter(e,t),this.failed)throw this.logger.error(`Uploading terminally failed: ${this.progress.lastError}`),new Error(this.progress.lastError);return ur(this.progress)}shouldScheduleUpload(){return et(this.progress)}async uploadBlobTask(){try{await Ye(this.logger,this.clientBlob,this.res,this.uploadData,this.isComputableDone.bind(this),{nPartsWithThisUploadSpeed:this.nPartsWithThisUploadSpeed,nPartsToIncreaseUpload:this.nPartsToIncreaseUpload,currentSpeed:this.nMaxUploads,maxSpeed:this.maxNConcurrentPartsUpload}),this.change.markChanged()}catch(e){if(this.setRetriableError(e),oe(e)){this.logger.warn(`resource was deleted while uploading a blob: ${e}`),this.change.markChanged(),this.setDone(!0);return}if(this.logger.error(`error while uploading a blob: ${e}`),this.change.markChanged(),fe(e)){this.setTerminalError(e);return}throw mr(e)&&(this.nMaxUploads=yr(this.logger,this.nMaxUploads,1)),e}}async updateStatus(){var e;try{const t=await this.clientProgress.getStatus(this.res,{timeout:1e4}),n=this.progress.status,r=fr(this.alreadyExisted,gr(t));this.progress.status=r,this.setDone(t.done),(t.done||this.progress.status.progress!=(n==null?void 0:n.progress))&&this.change.markChanged()}catch(t){if(this.setRetriableError(t),t.name=="RpcError"&&t.code=="DEADLINE_EXCEEDED"||(e=t==null?void 0:t.message)!=null&&e.includes("DEADLINE_EXCEEDED")){this.logger.warn("deadline exceeded while getting a status of BlobImport");return}if(oe(t)){this.logger.warn(`resource was not found while updating a status of BlobImport: ${t}, ${g.stringifyWithResourceId(this.res)}`),this.change.markChanged(),this.setDone(!0);return}this.logger.error(`retryable error while updating a status of BlobImport: ${t}`)}}setRetriableError(e){this.progress.lastError=String(e)}setTerminalError(e){this.progress.lastError=String(e),this.progress.done=!1,this.failed=!0}setDoneIfOutputSet(e){pr(e)&&(this.setDone(!0),this.alreadyExisted=!0)}setDone(e){this.progress.done=e,e&&(this.progress.lastError=void 0)}incCounter(e,t){this.change.attachWatcher(e),this.counter.inc(t)}decCounter(e){return this.counter.dec(e)}isComputableDone(){return this.counter.isZero()}}async function Ye(s,e,t,n,r,o){mt(E(t),"the upload operation can be done only for BlobUploads");const l=1e4;if(r())return;const a=await e.initUpload(t,{timeout:l});s.info(`started to upload blob ${t.id}, parts overall: ${a.overall}, parts remained: ${a.toUpload.length}, number of concurrent uploads: ${o.currentSpeed}`);const d=c=>async u=>{r()||(await e.partUpload(t,n.localPath,BigInt(n.modificationTime),c,{timeout:l}),s.info(`uploaded chunk ${c}/${a.overall} of resource: ${t.id}`),o.nPartsWithThisUploadSpeed++,o.nPartsWithThisUploadSpeed>=o.nPartsToIncreaseUpload&&(o.nPartsWithThisUploadSpeed=0,o.currentSpeed=wr(s,o.currentSpeed,o.maxSpeed),u.setConcurrency(o.currentSpeed)))};await p.asyncPool(o.currentSpeed,a.toUpload.map(d)),!r()&&(await e.finalize(t,{timeout:l}),s.info(`uploading of resource ${t.id} finished.`))}function hr(s,e){let t,n;return E(s)&&(n=N.parse(s.data),t=tt(e,n.localPath,n.pathSignature)),{uploadData:n,progress:{done:!1,status:void 0,isUpload:E(s),isUploadSignMatch:t,lastError:void 0}}}function et(s){return s.isUpload&&(s.isUploadSignMatch??!1)}function ur(s){return s.done,s.isUpload,s.isUploadSignMatch,s.lastError,s.status&&(s.status.progress,s.status.bytesProcessed,s.status.bytesTotal),s}function pr(s){return"blob"in s.fields?s.fields.blob!==void 0:s.fields.incarnation!==void 0}function E(s){return s.type.name.startsWith("BlobUpload")}function tt(s,e,t){try{return s.verify(e,t),!0}catch{return!1}}function gr(s){return{progress:s.progress??0,bytesProcessed:Number(s.bytesProcessed),bytesTotal:Number(s.bytesTotal)}}function fr(s,e){return s&&e.bytesTotal!=0&&e.bytesProcessed==0?{progress:1,bytesProcessed:Number(e.bytesTotal),bytesTotal:Number(e.bytesTotal)}:e}function oe(s){return s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED"||s.code=="ALREADY_EXISTS")}function fe(s){return s instanceof le||s instanceof ce||s instanceof he}function mr(s){return s==null?void 0:s.message.includes("UND_ERR_HEADERS_TIMEOUT")}function wr(s,e,t){const n=Math.min(e+2,t);return n!=e&&s.info(`uploadTask.increaseConcurrency: increased from ${e} to ${n}`),n}function yr(s,e,t){const n=Math.max(Math.round(e/2),t);return n!=e&&s.info(`uploadTask.decreaseConcurrency: decreased from ${e} to ${n}`),n}function nt(s,e){const t=m.isPlTreeEntry(s)?e.accessor(s).node():m.isPlTreeEntryAccessor(s)?s.node():s;return t.resourceType.name.startsWith("BlobUpload")?m.makeResourceSnapshot(t,ze):m.makeResourceSnapshot(t,xe)}class Tr{constructor(e,t,n,r,o={nConcurrentPartUploads:10,nConcurrentGetProgresses:10,pollingInterval:1e3,stopPollingDelay:1e3}){h(this,"idToProgress",new Map);h(this,"uploadQueue");h(this,"hooks");h(this,"scheduledOnNextState",[]);h(this,"keepRunning",!1);h(this,"currentLoop");this.logger=e,this.signer=t,this.clientBlob=n,this.clientProgress=r,this.opts=o,this.uploadQueue=new p.TaskProcessor(this.logger,1,{type:"exponentialWithMaxDelayBackoff",initialDelay:20,maxDelay:15e3,backoffMultiplier:1.5,jitter:.5}),this.hooks=new f.PollingComputableHooks(()=>this.startUpdating(),()=>this.stopUpdating(),{stopDebounce:o.stopPollingDelay},(l,a)=>this.scheduleOnNextState(l,a))}getProgressId(e,t){if(t==null)return f.Computable.make(l=>this.getProgressId(e,l));const n=m.isPlTreeEntry(e)?nt(e,t):e,r=U.randomUUID();return t.attacheHooks(this.hooks),t.addOnDestroy(()=>this.release(n.id,r)),this.getProgressIdNoCtx(t.watcher,n,r)}getProgressIdNoCtx(e,t,n){kr("getProgressId",t.type);const r=this.idToProgress.get(t.id);if(r!=null)return r.setDoneIfOutputSet(t),r.getProgress(e,n);const o=new Ke(this.logger,this.clientBlob,this.clientProgress,this.opts.nConcurrentPartUploads,this.signer,t);return this.idToProgress.set(t.id,o),o.shouldScheduleUpload()&&this.uploadQueue.push({fn:()=>o.uploadBlobTask(),recoverableErrorPredicate:l=>!fe(l)}),o.setDoneIfOutputSet(t),o.getProgress(e,n)}async release(e,t){const n=this.idToProgress.get(e);if(n===void 0)return;n.decCounter(t)&&this.idToProgress.delete(e)}async releaseAll(){this.uploadQueue.stop()}scheduleOnNextState(e,t){this.scheduledOnNextState.push({resolve:e,reject:t})}startUpdating(){this.keepRunning=!0,this.currentLoop===void 0&&(this.currentLoop=this.mainLoop())}stopUpdating(){this.keepRunning=!1}async mainLoop(){for(;this.keepRunning;){const e=this.scheduledOnNextState;this.scheduledOnNextState=[];try{await p.asyncPool(this.opts.nConcurrentGetProgresses,this.getAllNotDoneProgresses().map(t=>async()=>await t.updateStatus())),e.forEach(t=>t.resolve())}catch(t){console.error(t),e.forEach(n=>n.reject(t))}if(!this.keepRunning)break;await Ue.scheduler.wait(this.opts.pollingInterval)}this.currentLoop=void 0}getAllNotDoneProgresses(){return Array.from(this.idToProgress.entries()).filter(([e,t])=>!br(t.progress)).map(([e,t])=>t)}}function br(s){var e;return s.done&&(((e=s.status)==null?void 0:e.progress)??0)>=1}function kr(s,e){if(!e.name.startsWith("BlobUpload")&&!e.name.startsWith("BlobIndex"))throw new x(`${s}: wrong resource type: ${e.name}, expected: a resource of either type 'BlobUpload' or 'BlobIndex'.`)}class Lr{constructor(e,t,n={nConcurrentGetLogs:10,pollingInterval:1e3,stopPollingDelay:1e3}){h(this,"idToLastLines",new Map);h(this,"idToProgressLog",new Map);h(this,"hooks");h(this,"scheduledOnNextState",[]);h(this,"keepRunning",!1);h(this,"currentLoop");this.logger=e,this.clientLogs=t,this.opts=n,this.hooks=new f.PollingComputableHooks(()=>this.startUpdating(),()=>this.stopUpdating(),{stopDebounce:n.stopPollingDelay},(r,o)=>this.scheduleOnNextState(r,o))}getLastLogs(e,t,n){if(n==null)return f.Computable.make(a=>this.getLastLogs(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=U.randomUUID();n.attacheHooks(this.hooks),n.addOnDestroy(()=>this.releaseLastLogs(r.id,o));const l=this.getLastLogsNoCtx(n.watcher,r,t,o);return n.markUnstable("The logs are from stream, so we consider them unstable. Final values will be got from blobs."),l}getLastLogsNoCtx(e,t,n,r){ee("getLastLogs",t.type);let o=this.idToLastLines.get(t.id);if(o==null){const a=new Te(this.logger,this.clientLogs,t,n);this.idToLastLines.set(t.id,a),o=a}o.attach(e,r);const l=o.getLog();if(l.error!=null)throw l.error;return l.log}getProgressLog(e,t,n){if(n==null)return f.Computable.make(a=>this.getProgressLog(e,t,a));const r=m.treeEntryToResourceInfo(e,n),o=U.randomUUID();n.attacheHooks(this.hooks),n.addOnDestroy(()=>this.releaseProgressLog(r.id,o));const l=this.getProgressLogNoCtx(n.watcher,r,t,o);return n.markUnstable("The progress log is from the stream, so we consider it unstable. Final value will be got from blobs."),l}getProgressLogNoCtx(e,t,n,r){ee("getProgressLog",t.type);let o=this.idToProgressLog.get(t.id);if(o==null){const a=new Te(this.logger,this.clientLogs,t,1,n);this.idToProgressLog.set(t.id,a),o=a}o.attach(e,r);const l=o.getLog();if(l.error)throw l.error;return l.log}getLogHandle(e,t){if(t==null)return f.Computable.make(o=>this.getLogHandle(e,o));const n=m.treeEntryToResourceInfo(e,t),r=this.getLogHandleNoCtx(n);return t.markUnstable(`live_log:${g.resourceIdToString(n.id)}`),r}getLogHandleNoCtx(e){return ee("getLogHandle",e.type),je(!0,e)}async lastLines(e,t,n,r){return await this.tryWithNotFound(e,()=>this.clientLogs.lastLines(M(e),t,BigInt(n??0),r))}async readText(e,t,n,r){return await this.tryWithNotFound(e,()=>this.clientLogs.readText(M(e),t,BigInt(n??0),r))}async tryWithNotFound(e,t){if(!_(e))throw new Error(`Not live log handle was passed to live log driver, handle: ${e}`);try{const n=await t();return{live:!0,shouldUpdateHandle:!1,data:n.data,size:Number(n.size),newOffset:Number(n.newOffset)}}catch(n){if(n.name=="RpcError"&&n.code=="NOT_FOUND")return{shouldUpdateHandle:!0};throw n}}async releaseLastLogs(e,t){var r;((r=this.idToLastLines.get(e))==null?void 0:r.release(t))&&this.idToLastLines.delete(e)}async releaseProgressLog(e,t){var r;((r=this.idToProgressLog.get(e))==null?void 0:r.release(t))&&this.idToProgressLog.delete(e)}async releaseAll(){}scheduleOnNextState(e,t){this.scheduledOnNextState.push({resolve:e,reject:t})}startUpdating(){this.keepRunning=!0,this.currentLoop===void 0&&(this.currentLoop=this.mainLoop())}stopUpdating(){this.keepRunning=!1}async mainLoop(){for(;this.keepRunning;){const e=this.scheduledOnNextState;this.scheduledOnNextState=[];try{const t=this.getAllLogs();await p.asyncPool(this.opts.nConcurrentGetLogs,t.map(n=>async()=>await n.update())),e.forEach(n=>n.resolve())}catch(t){console.error(t),e.forEach(n=>n.reject(t))}if(!this.keepRunning)break;await Ue.scheduler.wait(this.opts.pollingInterval)}this.currentLoop=void 0}getAllLogs(){return Array.from(this.idToLastLines.entries()).concat(Array.from(this.idToProgressLog.entries())).map(([e,t])=>t)}}class Te{constructor(e,t,n,r,o){h(this,"logs");h(this,"error");h(this,"change",new f.ChangeSource);h(this,"counter",new p.CallersCounter);this.logger=e,this.clientLogs=t,this.rInfo=n,this.lines=r,this.patternToSearch=o}getLog(){return{log:this.logs,error:this.error}}attach(e,t){this.change.attachWatcher(e),this.counter.inc(t)}release(e){return this.counter.dec(e)}async update(){try{const t=(await this.clientLogs.lastLines(this.rInfo,this.lines,0n,this.patternToSearch)).data.toString();this.logs!=t&&this.change.markChanged(),this.logs=t,this.error=void 0;return}catch(e){if(e.name=="RpcError"&&e.code=="NOT_FOUND"){this.logs="",this.error=e,this.change.markChanged();return}throw this.logger.error(`Stream log lines for ${g.stringifyWithResourceId(this.rInfo.id)} failed, reason: ${e}`),e}}}function ee(s,e){if(!e.name.startsWith("StreamWorkdir"))throw new x(`${s}: wrong resource type: ${e.name}, expected: a resource of type 'StreamWorkdir'.`)}class Pr{constructor(e,t,n){this.logger=e,this.logsStreamDriver=t,this.downloadDriver=n}getLastLogs(e,t,n){if(n===void 0)return f.Computable.make(o=>this.getLastLogs(e,t,o));const r=B(n,e);if(r===void 0){n.markUnstable("no stream in stream manager");return}if($(r))return this.downloadDriver.getLastLogs(r,t,n);try{return this.logsStreamDriver.getLastLogs(r,t,n)}catch(o){if(o.name=="RpcError"&&o.code=="NOT_FOUND"){n.markUnstable(`NOT_FOUND in logs stream driver while getting last logs: ${o}`);return}throw o}}getProgressLog(e,t,n){if(n===void 0)return f.Computable.make(o=>this.getProgressLog(e,t,o));const r=B(n,e);if(r===void 0){n.markUnstable("no stream in stream manager");return}if($(r))return this.downloadDriver.getProgressLog(r,t,n);try{return this.logsStreamDriver.getProgressLog(r,t,n)}catch(o){if(o.name=="RpcError"&&o.code=="NOT_FOUND"){n.markUnstable(`NOT_FOUND in logs stream driver while getting a progress log: ${o}`);return}throw o}}getProgressLogWithInfo(e,t,n){if(n===void 0)return f.Computable.make(o=>this.getProgressLogWithInfo(e,t,o));const r=B(n,e);if(r===void 0){n.markUnstable("no stream in stream manager");return}if($(r))return{progressLine:this.downloadDriver.getProgressLog(r,t,n),live:!1};try{return{progressLine:this.logsStreamDriver.getProgressLog(r,t,n),live:!0}}catch(o){if(o.name=="RpcError"&&o.code=="NOT_FOUND"){n.markUnstable(`NOT_FOUND in logs stream driver while getting a progress log with info: ${o}`);return}throw o}}getLogHandle(e,t){if(t===void 0)return f.Computable.make(r=>this.getLogHandle(e,r));const n=B(t,e);if(n===void 0){t.markUnstable("no stream in stream manager");return}return $(n)?this.downloadDriver.getLogHandle(n,t):this.logsStreamDriver.getLogHandle(n,t)}async lastLines(e,t,n,r){return _(e)?await this.logsStreamDriver.lastLines(e,t,n,r):await this.downloadDriver.lastLines(e,t,n,r)}async readText(e,t,n,r){return _(e)?await this.logsStreamDriver.readText(e,t,n,r):await this.downloadDriver.readText(e,t,n,r)}}function $(s){return!s.type.name.startsWith("StreamWorkdir")}function B(s,e){var t;return(t=s.accessor(e).node().traverse("stream"))==null?void 0:t.resourceInfo}class Ur{constructor(e,t,n,r={cacheSoftSizeBytes:50*1024*1024,withGunzip:!0,nConcurrentDownloads:50}){h(this,"downloadHelper");h(this,"urlToDownload",new Map);h(this,"downloadQueue");h(this,"cache");this.logger=e,this.saveDir=n,this.opts=r,this.downloadQueue=new p.TaskProcessor(this.logger,this.opts.nConcurrentDownloads),this.cache=new pe(this.opts.cacheSoftSizeBytes),this.downloadHelper=new ve(t)}getPath(e,t){if(t===void 0)return f.Computable.make(o=>this.getPath(e,o));const n=U.randomUUID();t.addOnDestroy(()=>this.releasePath(e,n));const r=this.getPathNoCtx(e,t.watcher,n);return(r==null?void 0:r.path)===void 0&&t.markUnstable(`a path to the downloaded and untared archive might be undefined. The current result: ${r}`),r}getPathNoCtx(e,t,n){const r=e.toString(),o=this.urlToDownload.get(r);if(o!=null)return o.attach(t,n),o.getPath();const l=this.setNewTask(t,e,n);return this.downloadQueue.push({fn:async()=>this.downloadUrl(l,n),recoverableErrorPredicate:a=>!0}),l.getPath()}async downloadUrl(e,t){var n;await e.download(this.downloadHelper,this.opts.withGunzip),((n=e.getPath())==null?void 0:n.path)!=null&&this.cache.addCache(e,t)}async releasePath(e,t){const n=e.toString(),r=this.urlToDownload.get(n);if(r!=null)if(this.cache.existsFile(r.path)){const o=this.cache.removeFile(r.path,t);await Promise.all(o.map(async l=>{await se(l.path),this.cache.removeCache(l),this.removeTask(l,`the task ${g.stringifyWithResourceId(l.info())} was removedfrom cache along with ${g.stringifyWithResourceId(o.map(a=>a.info()))}`)}))}else r.counter.dec(t)&&this.removeTask(r,`the task ${g.stringifyWithResourceId(r.info())} was removed from cache`)}async releaseAll(){this.downloadQueue.stop(),await Promise.all(Array.from(this.urlToDownload.entries()).map(async([e,t])=>{await se(t.path),this.cache.removeCache(t),this.removeTask(t,`the task ${g.stringifyWithResourceId(t.info())} was released when the driver was closed`)}))}setNewTask(e,t,n){const r=new Ir(this.logger,this.getFilePath(t),t);return r.attach(e,n),this.urlToDownload.set(t.toString(),r),r}removeTask(e,t){e.abort(t),e.change.markChanged(),this.urlToDownload.delete(e.url.toString())}getFilePath(e){const t=U.createHash("sha256").update(e.toString()).digest("hex");return b.join(this.saveDir,t)}}class Ir{constructor(e,t,n){h(this,"counter",new p.CallersCounter);h(this,"change",new f.ChangeSource);h(this,"signalCtl",new AbortController);h(this,"error");h(this,"done",!1);h(this,"size",0);this.logger=e,this.path=t,this.url=n}info(){return{url:this.url.toString(),path:this.path,done:this.done,size:this.size,error:this.error}}attach(e,t){this.counter.inc(t),this.done||this.change.attachWatcher(e)}async download(e,t){try{const n=await this.downloadAndUntar(e,t,this.signalCtl.signal);this.setDone(n),this.change.markChanged()}catch(n){if(n instanceof be||n instanceof O){this.setError(n),this.change.markChanged(),await se(this.path);return}throw n}}async downloadAndUntar(e,t,n){if(await p.ensureDirExists(b.dirname(this.path)),await p.fileExists(this.path))return await rt(this.path);const r=await e.download(this.url.toString(),{},n);let o=r.content;if(t){const l=P.Transform.toWeb(Ie.createGunzip());o=o.pipeThrough(l,{signal:n})}return await p.createPathAtomically(this.logger,this.path,async l=>{await w.mkdir(l);const a=P.Writable.toWeb(ne.extract(l));await o.pipeTo(a,{signal:n})}),r.size}getPath(){if(this.done)return{path:p.notEmpty(this.path)};if(this.error)return{error:this.error}}setDone(e){this.done=!0,this.size=e}setError(e){this.error=String(e)}abort(e){this.signalCtl.abort(new be(e))}}class be extends Error{}async function rt(s){const e=await w.readdir(s,{withFileTypes:!0});return(await Promise.all(e.map(async n=>{const r=b.join(s,n.name);return n.isDirectory()?await rt(r):(await w.stat(r)).size}))).reduce((n,r)=>n+r,0)}async function se(s){await w.rm(s,{recursive:!0,force:!0})}function te(s,e){return`index://index/${encodeURIComponent(JSON.stringify({storageId:s,path:e}))}`}function Rr(s,e,t,n){const r={localPath:s,pathSignature:e.sign(s),sizeBytes:String(t),modificationTime:String(n)};return`upload://upload/${encodeURIComponent(JSON.stringify(r))}`}function Dr(s){const e=new URL(s);return N.parse(JSON.parse(decodeURIComponent(e.pathname.substring(1))))}function Sr(s){const e=new URL(s);return ge.parse(JSON.parse(decodeURIComponent(e.pathname.substring(1))))}function ke(s){if($r(s))return Fr(s);if(vr(s))return Cr(s);p.assertNever(s)}const ot=/^local:\/\/(?<name>.*)\/(?<path>.*)$/;function vr(s){return ot.test(s)}function Nr(s,e){return`local://${s}/${encodeURIComponent(e)}`}function Cr(s){const e=s.match(ot);if(e==null)throw new Error(`Local list handle wasn't parsed: ${s}`);const{name:t,path:n}=e.groups;return{rootPath:decodeURIComponent(n),name:t,isRemote:!1}}const st=/^remote:\/\/(?<name>.*)\/(?<resourceId>.*)$/;function $r(s){return st.test(s)}function Br(s,e){return`remote://${s}/${BigInt(e)}`}function Fr(s){const e=s.match(st);if(e==null)throw new Error(`Remote list handle wasn't parsed: ${s}`);const{name:t,resourceId:n}=e.groups;return{id:g.bigintToResourceId(BigInt(n)),type:Wr(t),name:t,isRemote:!0}}function Wr(s){return{name:`LS/${s}`,version:"1"}}async function it(){const s=Pe.homedir();if(k.sep=="/")return[{name:"local",root:"/",initialPath:s}];{const t=k.parse(s).root.replaceAll(":\\","");try{return(await yt.promisify(Tt.exec)("wmic logicaldisk get name")).stdout.split(`\r
2
+ `).filter(o=>o.includes(":")).map(o=>o.trim().replaceAll(":","")).map(o=>{const l=o==t;return{name:`local_disk_${o}`,root:`${o}:\\`,initialPath:l?s:`${o}:\\`}})}catch{return[{name:`local_disk_${t}`,root:`${t}:\\`,initialPath:s}]}}}class me{constructor(e,t,n,r,o,l,a){this.logger=e,this.lsClient=t,this.storageIdToResourceId=n,this.signer=r,this.virtualStoragesMap=o,this.localProjectionsMap=l,this.openFileDialogCallback=a}async getLocalFileContent(e,t){const n=await this.tryResolveLocalFileHandle(e);if(t)throw new Error("Range request not yet supported.");return await w.readFile(n)}async getLocalFileSize(e){const t=await this.tryResolveLocalFileHandle(e);return(await w.stat(t)).size}async showOpenMultipleFilesDialog(e){const t=await this.openFileDialogCallback(!0,e);return t===void 0?{}:{files:await Promise.all(t.map(n=>this.getLocalFileHandle(n)))}}async showOpenSingleFileDialog(e){const t=await this.openFileDialogCallback(!1,e);return t===void 0?{}:{file:await this.getLocalFileHandle(t[0])}}async tryResolveLocalFileHandle(e){if(wt.isImportFileHandleIndex(e)){const t=Sr(e),n=this.localProjectionsMap.get(t.storageId);if(!n)throw new Error(`Storage ${t.storageId} is not mounted locally.`);return b.join(n.localPath,t.path)}else{const t=Dr(e);this.signer.verify(t.localPath,t.pathSignature,"Failed to validate local file handle signature.");const n=t.localPath,r=await w.stat(n,{bigint:!0});if(String(r.mtimeMs/1000n)!==t.modificationTime)throw new Error("File has changed since the handle was created.");return n}}async getLocalFileHandle(e){R(e);for(const n of this.localProjectionsMap.values())if(e.startsWith(n.localPath)){const r=n.localPath===""?e:b.relative(n.localPath,e);return te(n.storageId,r)}const t=await w.stat(e,{bigint:!0});return Rr(e,this.signer,t.size,t.mtimeMs/1000n)}async getStorageList(){const e=[...this.virtualStoragesMap.values()].map(r=>({name:r.name,handle:Nr(r.name,r.root),initialFullPath:r.initialPath})),n=Object.entries(this.storageIdToResourceId).map(([r,o])=>({name:r,handle:Br(r,o),initialFullPath:"",isInitialPathHome:!1})).filter(r=>r.name!=="root");return[...e,...n]}async listFiles(e,t){const n=ke(e);if(n.isRemote)return{entries:(await this.lsClient.list(n,t)).items.map(a=>({type:a.isDir?"dir":"file",name:a.name,fullPath:a.fullName,handle:te(n.name,a.fullName)}))};b.sep==="/"&&t===""&&(t="/"),n.rootPath===""&&R(t);const r=b.isAbsolute(t)?t:b.join(n.rootPath,t),o=[];for await(const l of await w.opendir(r)){if(!l.isFile()&&!l.isDirectory())continue;const a=b.join(r,l.name);o.push({type:l.isFile()?"file":"dir",name:l.name,fullPath:a,handle:await this.getLocalFileHandle(a)})}return{entries:o}}async listRemoteFilesWithAdditionalInfo(e,t){const n=ke(e);if(!n.isRemote)throw new Error(`Storage ${n.name} is not remote`);return{entries:(await this.lsClient.list(n,t)).items.map(o=>({type:o.isDir?"dir":"file",name:o.name,fullPath:o.fullName,handle:te(n.name,o.fullName),size:Number(o.size)}))}}async fileToImportHandle(e){throw new Error("Not implemented. This method must be implemented and intercepted in desktop preload script.")}static async init(e,t,n,r,o,l){const a=_e(t,e);l||(l=await it());for(const u of l)R(u.root);for(const u of r)u.localPath!==""&&R(u.localPath);const d=new Map(l.map(u=>[u.name,u])),c=new Map(r.map(u=>[u.storageId,u]));if(new Set([...d.keys(),...c.keys()]).size!==d.size+c.size)throw new Error("Intersection between local projection storage ids and virtual storages names detected.");return new me(e,a,await _r(t),n,d,c,o)}}async function _r(s){return s.withReadTx("GetAvailableStorageIds",async e=>{const t=await e.getResourceByName("LSProvider"),n=await e.getResourceData(t,!0);return Mr(n)})}function Mr(s){return Object.fromEntries(s.fields.filter(e=>e.type=="Dynamic"&&g.isNotNullResourceId(e.value)).map(e=>[e.name.substring(8),e.value]))}exports.ClientDownload=Ne;exports.ClientLogs=We;exports.ClientLs=Fe;exports.ClientProgress=Se;exports.ClientUpload=De;exports.DefaultVirtualLocalStorages=it;exports.DownloadBlobToURLDriver=dr;exports.DownloadDriver=er;exports.DownloadUrlDriver=Ur;exports.DownloadableBlobSnapshot=Je;exports.ImportFileHandleData=Zn;exports.ImportFileHandleIndexData=ge;exports.ImportFileHandleUploadData=N;exports.IndexResourceSnapshot=xe;exports.LogsDriver=Pr;exports.LogsStreamDriver=Lr;exports.LsDriver=me;exports.MTimeError=le;exports.NetworkError=de;exports.NoFileForUploading=he;exports.OnDemandBlobResourceSnapshot=Oe;exports.UnexpectedEOF=ce;exports.UnknownStorageError=z;exports.Updater=qe;exports.UploadDriver=Tr;exports.UploadResourceSnapshot=ze;exports.UploadTask=Ke;exports.WrongLocalFileUrl=H;exports.WrongResourceTypeError=x;exports.createDownloadClient=xn;exports.createLogsClient=An;exports.createLsFilesClient=_e;exports.createUploadBlobClient=Gn;exports.createUploadProgressClient=jn;exports.getFullPath=$e;exports.getSize=He;exports.isMyUpload=et;exports.isResourceWasDeletedError=oe;exports.isSignMatch=tt;exports.isUpload=E;exports.makeBlobImportSnapshot=nt;exports.makeDownloadableBlobSnapshot=Ze;exports.newLocalStorageIdsToRoot=Be;exports.nonRecoverableError=fe;exports.parseLocalUrl=Ce;exports.uploadBlob=Ye;exports.validateAbsolute=R;
3
3
  //# sourceMappingURL=index.js.map