@milaboratories/pl-drivers 1.5.52 → 1.5.54

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 (41) hide show
  1. package/dist/clients/download.d.ts +4 -2
  2. package/dist/clients/download.d.ts.map +1 -1
  3. package/dist/clients/helpers.d.ts +1 -1
  4. package/dist/clients/helpers.d.ts.map +1 -1
  5. package/dist/drivers/{download_blob.d.ts → download_blob/download_blob.d.ts} +7 -8
  6. package/dist/drivers/download_blob/download_blob.d.ts.map +1 -0
  7. package/dist/drivers/{download_blob_task.d.ts → download_blob/download_blob_task.d.ts} +1 -1
  8. package/dist/drivers/download_blob/download_blob_task.d.ts.map +1 -0
  9. package/dist/drivers/helpers/files_cache.d.ts.map +1 -1
  10. package/dist/drivers/logs.d.ts +1 -1
  11. package/dist/drivers/logs.d.ts.map +1 -1
  12. package/dist/drivers/ls.d.ts +10 -1
  13. package/dist/drivers/ls.d.ts.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +728 -708
  19. package/dist/index.mjs.map +1 -1
  20. package/package.json +8 -11
  21. package/src/clients/download.test.ts +1 -1
  22. package/src/clients/download.ts +14 -5
  23. package/src/clients/helpers.ts +11 -2
  24. package/src/clients/upload.test.ts +2 -1
  25. package/src/drivers/{download_blob.test.ts → download_blob/download_blob.test.ts} +3 -3
  26. package/src/drivers/{download_blob.ts → download_blob/download_blob.ts} +59 -42
  27. package/src/drivers/{download_blob_task.ts → download_blob/download_blob_task.ts} +3 -3
  28. package/src/drivers/download_blob_url/driver.ts +1 -1
  29. package/src/drivers/download_blob_url/url.test.ts +1 -1
  30. package/src/drivers/download_url.test.ts +1 -1
  31. package/src/drivers/helpers/files_cache.test.ts +1 -1
  32. package/src/drivers/helpers/files_cache.ts +10 -3
  33. package/src/drivers/logs.test.ts +2 -2
  34. package/src/drivers/logs.ts +1 -1
  35. package/src/drivers/ls.test.ts +1 -1
  36. package/src/drivers/ls.ts +33 -0
  37. package/src/drivers/upload.test.ts +1 -1
  38. package/src/helpers/download.ts +1 -1
  39. package/src/index.ts +1 -1
  40. package/dist/drivers/download_blob.d.ts.map +0 -1
  41. package/dist/drivers/download_blob_task.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var st=Object.defineProperty;var it=(s,e,t)=>e in s?st(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var h=(s,e,t)=>it(s,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("@milaboratories/pl-client"),at=require("node:fs/promises"),be=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"),oe=require("node:stream/consumers"),f=require("@milaboratories/computable"),m=require("@milaboratories/pl-tree"),lt=require("denque"),P=require("node:crypto"),ke=require("node:os"),ct=require("node:readline/promises"),k=require("zod"),dt=require("node:zlib"),ht=require("tar-fs"),ut=require("decompress"),Le=require("node:timers/promises"),pt=require("node:assert"),gt=require("@milaboratories/pl-model-common"),ft=require("node:util"),mt=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(at),se=U(F),T=U(b),fe=U(ke),wt=U(ct),Pe=U(dt),Y=U(ht);class yt 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 yt;class Tt 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 Tt;class bt 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 kt=new bt;class Lt 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 Pt=new Lt;class Ut 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 Ut;class It 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 Rt=new It;class Dt 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 St=new Dt;class vt 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 vt;class Nt 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 Bt=new Nt;class Ct 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 Ct;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:()=>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 Ft=new $t;class Wt 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 Wt;class _t 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 Mt=new _t;class Et 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 Ot=new Et,A=new y.ServiceType("MiLaboratories.Controller.Shared.Upload",[{name:"Init",options:{},I:kt,O:Pt},{name:"GetPartURL",options:{},I:Bt,O:Ft},{name:"UpdateProgress",options:{},I:Rt,O:St},{name:"Finalize",options:{},I:Mt,O:Ot}]);class Ht{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 Ue(s){return Object.fromEntries(s.map(({name:e,value:t})=>[e,t]))}class ie extends Error{}class ae extends Error{}class le extends Error{}class ce extends Error{}class Ie{constructor(e,t,n,r){h(this,"grpcClient");this.grpcTransport=e,this.httpClient=t,this.logger=r,this.grpcClient=new Ht(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 zt(n,a.chunkStart,a.chunkEnd);await At(n,r);try{const{body:c,statusCode:u,headers:z}=await be.request(a.uploadUrl,{dispatcher:this.httpClient,body:d,headersTimeout:6e4,bodyTimeout:6e4,headers:Ue(a.headers),method:a.method.toUpperCase()}),ot=await c.text();jt(u,ot,z,a)}catch(c){throw c instanceof le?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 zt(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 xt(n,l,r,o);return l.subarray(0,a)}catch(r){throw r&&typeof r=="object"&&"code"in r&&r.code=="ENOENT"?new ce(`there is no file ${s} for uploading`):r}finally{await(n==null?void 0:n.close())}}async function xt(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 ae("file ended earlier than expected.");r+=o}return r}async function At(s,e){const t=BigInt(Math.floor((await w.stat(s)).mtimeMs/1e3));if(t>e)throw new ie(`file was modified, expected mtime: ${e}, got: ${t}.`)}function jt(s,e,t,n){if(s!=200)throw new le(`response is not ok, status code: ${s}, body: ${e}, headers: ${JSON.stringify(t)}, url: ${n.uploadUrl}`)}class Gt 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 Gt;class Vt 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 Vt;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 R=new qt;class Jt 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 Jt;class Zt 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 Qt=new Zt;class Xt 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 Kt=new Xt;class Yt 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 Yt;class en 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 tn=new en;class nn 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 rn=new nn,j=new y.ServiceType("MiLaboratories.Controller.Shared.Progress",[{name:"GetStatus",options:{"google.api.http":{get:"/resources/{resource_id}/get-progress"}},I:Qt,O:Kt},{name:"RealtimeStatus",serverStreaming:!0,options:{},I:tn,O:rn}]);class on{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 Re{constructor(e,t,n,r){h(this,"grpcClient");this.grpcTransport=e,this.client=n,this.logger=r,this.grpcClient=new on(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 De{constructor(e){this.httpClient=e}async download(e,t,n){const{statusCode:r,body:o,headers:l}=await be.request(e,{dispatcher:this.httpClient,headers:t,signal:n}),a=L.Readable.toWeb(o);return await sn(r,a,e),{content:a,size:Number(l["content-length"])}}}async function sn(s,e,t){if(s!=200){const n=(await oe.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 an 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 an;class ln 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 ln;class cn 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 dn=new cn;class hn 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 hn;class un 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 pn=new un,V=new y.ServiceType("MiLaboratories.Controller.Shared.Download",[{name:"GetDownloadURL",options:{"google.api.http":{get:"/resources/{resource_id}/get-download-url"}},I:dn,O:pn}]);class gn{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 Se{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 gn(this.grpcTransport),this.remoteFileDownloader=new De(t),this.localStorageIdsToRoot=Be(r)}close(){}async downloadBlob(e,t,n){const{downloadUrl:r,headers:o}=await this.grpcGetDownloadUrl(e,t,n);return this.logger.info(`download blob from url ${r}`),mn(r)?await this.readLocalFile(r):await this.remoteFileDownloader.download(r,Ue(o),n)}async readLocalFile(e){const{storageId:t,relativePath:n}=ve(e),r=Ne(t,this.localStorageIdsToRoot,n);return{content:L.Readable.toWeb(se.createReadStream(r)),size:(await w.stat(r)).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 ve(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 Ne(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 fn="storage://";function mn(s){return s.startsWith(fn)}class E extends Error{}class O extends Error{}function Be(s){const e=new Map;for(const t of s)t.localPath!==""&&I(t.localPath),e.set(t.storageId,t.localPath);return e}class wn 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 wn;class yn 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 yn;class Tn 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 Tn;class bn 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 bn;class kn 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 Ln=new kn;class Pn 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 Un=new Pn,Z=new y.ServiceType("MiLaboratories.Controller.Shared.LS",[{name:"List",options:{},I:Ln,O:Un}]);class In{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 Ce{constructor(e,t){h(this,"grpcClient");this.logger=t,this.grpcClient=new In(e)}close(){}async list(e,t,n){return await this.grpcClient.list({resourceId:e.id,location:t},g.addRTypeToMetadata(e.type,n)).response}}class Rn 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 Rn;class Dn 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 Sn=new Dn;class vn 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 Nn=new vn;class Bn 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 Cn=new Bn;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 Fn=new $n;class Wn 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 _n=new Wn;class Mn 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 Mn,Q=new y.ServiceType("MiLaboratories.Controller.Shared.Streaming",[{name:"StreamBinary",serverStreaming:!0,options:{},I:Sn,O:D},{name:"ReadBinary",options:{},I:Nn,O:D},{name:"StreamText",serverStreaming:!0,options:{},I:Cn,O:D},{name:"ReadText",options:{},I:Fn,O:D},{name:"LastLines",options:{},I:_n,O:D}]);class En{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 $e{constructor(e,t,n){h(this,"grpcClient");this.grpcTransport=e,this.httpClient=t,this.logger=n,this.grpcClient=new En(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 On(s,e,t){return e.getDriver({name:"DownloadBlob",init:(n,r,o)=>new Se(r,o,s,t)})}function Hn(s,e){return s.getDriver({name:"StreamLogs",init:(t,n,r)=>new $e(n,r,e)})}function zn(s,e){return s.getDriver({name:"UploadProgress",init:(t,n,r)=>new Re(n,r,s,e)})}function xn(s,e){return s.getDriver({name:"UploadBlob",init:(t,n,r)=>new Ie(n,r,s,e)})}function Fe(s,e){return s.getDriver({name:"LsFiles",init:(t,n,r)=>new Ce(n,e)})}class An{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 de(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 We(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 de(s){return s instanceof We||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 We extends Error{}class he{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 _e=/^blob\+local:\/\/download\/(?<path>.*)#(?<signature>.*)$/;function jn(s,e){return`blob+local://download/${s}#${e.sign(s)}`}function Gn(s){return!!s.match(_e)}function X(s,e){const t=s.match(_e);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 Me=m.rsSchema({kv:{"ctl/file/blobInfo":k.z.object({sizeBytes:k.z.coerce.number()})}});function Ee(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()}),ue=k.z.object({storageId:k.z.string(),path:k.z.string()}),Vn=k.z.union([v,ue]),Oe=m.rsSchema({data:v,fields:{blob:!1}}),He=m.rsSchema({fields:{incarnation:!1}}),ze=/^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 Jn(s){return!!s.match(ze)}function Zn(s,e){const t=s.match(ze);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 xe(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 Ae=/^log\+live:\/\/log\/(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*)$/;function W(s){return Ae.test(s)}const je=/^log\+ready:\/\/log\/(?<resourceType>.*)\/(?<resourceVersion>.*)\/(?<resourceId>.*)$/;function Qn(s){return je.test(s)}function _(s){let e;if(W(s))e=s.match(Ae);else if(Qn(s))e=s.match(je);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 Ge{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 Xn{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 he(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=>!de(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 An(this.logger,this.clientDownload,e,t,jn(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,Me,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 Kn(Ee(e),qn(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(Gn(e))return await er(this.getLocalPath(e));if(Jn(e)){const t=Zn(e,this.signer),{content:n}=await this.clientDownload.downloadBlob(t);return await oe.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 me(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 me(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),xe(!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 Kn{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 me{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 Ge(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 Yn(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 Yn(s,e,t){const n=se.createReadStream(s),r=new L.Writable;return new Promise((o,l)=>{const a=wt.createInterface(n,r),d=new lt;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(fe.EOL)+fe.EOL)})})}async function er(s){return await oe.buffer(L.Readable.toWeb(se.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 Ve=m.rsSchema({});function qe(s,e){const t=m.isPlTreeEntry(s)?e.accessor(s).node():m.isPlTreeEntryAccessor(s)?s.node():s;return m.makeResourceSnapshot(t,Ve)}function tr(s,e,t){const n=b.relative(e,t);return`plblob+folder://${s.sign(n)}.${n}.blob`}function nr(s){return new URL(s).protocol=="plblob+folder:"}function rr(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=or(b.join(t,`${o}`),n.pathname.slice(1));return(n.pathname==""||n.pathname=="/")&&(a=b.join(a,"index.html")),b.resolve(a)}function or(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 sr{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())}`),ir(e)){this.setError(e),this.change.markChanged(),await ee(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 Je(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(Y.extract(r));await t.pipeTo(o,{signal:e});return;case"tgz":await w.mkdir(r);const l=L.Transform.toWeb(Pe.createGunzip()),a=L.Writable.toWeb(Y.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 ut(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=tr(this.signer,this.saveDir,this.path)}setError(e){this.error=String(e)}abort(e){this.signalCtl.abort(new Ze(e))}}async function Je(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 Je(r):(await w.stat(r)).size}))).reduce((n,r)=>n+r,0)}async function ee(s){await w.rm(s,{recursive:!0,force:!0})}let Ze=class extends Error{};function ir(s){return s instanceof Ze||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 ar{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 he(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(nr(e))return rr(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)?qe(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=>!de(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 ee(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 ee(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 sr(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 Qe{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}=lr(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 cr(this.progress)}shouldScheduleUpload(){return Ke(this.progress)}async uploadBlobTask(){try{await Xe(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),ne(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(),pe(e)){this.setTerminalError(e);return}throw gr(e)&&(this.nMaxUploads=mr(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=pr(this.alreadyExisted,ur(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(ne(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){dr(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 Xe(s,e,t,n,r,o){pt(te(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=fr(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 lr(s,e){let t,n;return te(s)&&(n=v.parse(s.data),t=hr(e,n.localPath,n.pathSignature)),{uploadData:n,progress:{done:!1,status:void 0,isUpload:te(s),isUploadSignMatch:t,lastError:void 0}}}function Ke(s){return s.isUpload&&(s.isUploadSignMatch??!1)}function cr(s){return s.done,s.isUpload,s.isUploadSignMatch,s.lastError,s.status&&(s.status.progress,s.status.bytesProcessed,s.status.bytesTotal),s}function dr(s){return"blob"in s.fields?s.fields.blob!==void 0:s.fields.incarnation!==void 0}function te(s){return s.type.name.startsWith("BlobUpload")}function hr(s,e,t){try{return s.verify(e,t),!0}catch{return!1}}function ur(s){return{progress:s.progress??0,bytesProcessed:Number(s.bytesProcessed),bytesTotal:Number(s.bytesTotal)}}function pr(s,e){return s&&e.bytesTotal!=0&&e.bytesProcessed==0?{progress:1,bytesProcessed:Number(e.bytesTotal),bytesTotal:Number(e.bytesTotal)}:e}function ne(s){return s.name=="RpcError"&&(s.code=="NOT_FOUND"||s.code=="ABORTED"||s.code=="ALREADY_EXISTS")}function pe(s){return s instanceof ie||s instanceof ae||s instanceof ce}function gr(s){return s==null?void 0:s.message.includes("UND_ERR_HEADERS_TIMEOUT")}function fr(s,e,t){const n=Math.min(e+2,t);return n!=e&&s.info(`uploadTask.increaseConcurrency: increased from ${e} to ${n}`),n}function mr(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 Ye(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,Oe):m.makeResourceSnapshot(t,He)}class wr{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)?Ye(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){Tr("getProgressId",t.type);const r=this.idToProgress.get(t.id);if(r!=null)return r.setDoneIfOutputSet(t),r.getProgress(e,n);const o=new Qe(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=>!pe(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 Le.scheduler.wait(this.opts.pollingInterval)}this.currentLoop=void 0}getAllNotDoneProgresses(){return Array.from(this.idToProgress.entries()).filter(([e,t])=>!yr(t.progress)).map(([e,t])=>t)}}function yr(s){var e;return s.done&&(((e=s.status)==null?void 0:e.progress)??0)>=1}function Tr(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 br{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 we(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 we(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),xe(!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 Le.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 we{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 kr{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 Lr{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 he(this.opts.cacheSoftSizeBytes),this.downloadHelper=new De(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 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(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 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){const r=new Pr(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 Pr{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 ye||n instanceof M){this.setError(n),this.change.markChanged(),await re(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 et(this.path);const r=await e.download(this.url.toString(),{},n);let o=r.content;if(t){const l=L.Transform.toWeb(Pe.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(Y.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 ye(e))}}class ye extends Error{}async function et(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 et(r):(await w.stat(r)).size}))).reduce((n,r)=>n+r,0)}async function re(s){await w.rm(s,{recursive:!0,force:!0})}function Te(s,e){return`index://index/${encodeURIComponent(JSON.stringify({storageId:s,path:e}))}`}function Ur(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 Ir(s){const e=new URL(s);return v.parse(JSON.parse(decodeURIComponent(e.pathname.substring(1))))}function Rr(s){const e=new URL(s);return ue.parse(JSON.parse(decodeURIComponent(e.pathname.substring(1))))}function Dr(s){if(Br(s))return $r(s);if(Sr(s))return Nr(s);p.assertNever(s)}const tt=/^local:\/\/(?<name>.*)\/(?<path>.*)$/;function Sr(s){return tt.test(s)}function vr(s,e){return`local://${s}/${encodeURIComponent(e)}`}function Nr(s){const e=s.match(tt);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 nt=/^remote:\/\/(?<name>.*)\/(?<resourceId>.*)$/;function Br(s){return nt.test(s)}function Cr(s,e){return`remote://${s}/${BigInt(e)}`}function $r(s){const e=s.match(nt);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 rt(){const s=ke.homedir();if(b.sep=="/")return[{name:"local",root:"/",initialPath:s}];{const t=b.parse(s).root.replaceAll(":\\","");try{return(await ft.promisify(mt.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 ge{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(gt.isImportFileHandleIndex(e)){const t=Rr(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=Ir(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 Te(n.storageId,r)}const t=await w.stat(e,{bigint:!0});return Ur(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=Dr(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)}))};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 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=Fe(t,e);l||(l=await rt());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 ge(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=Se;exports.ClientLogs=$e;exports.ClientLs=Ce;exports.ClientProgress=Re;exports.ClientUpload=Ie;exports.DefaultVirtualLocalStorages=rt;exports.DownloadBlobToURLDriver=ar;exports.DownloadDriver=Xn;exports.DownloadUrlDriver=Lr;exports.DownloadableBlobSnapshot=Ve;exports.ImportFileHandleData=Vn;exports.ImportFileHandleIndexData=ue;exports.ImportFileHandleUploadData=v;exports.IndexResourceSnapshot=He;exports.LogsDriver=kr;exports.LogsStreamDriver=br;exports.LsDriver=ge;exports.MTimeError=ie;exports.NetworkError=le;exports.NoFileForUploading=ce;exports.OnDemandBlobResourceSnapshot=Me;exports.UnexpectedEOF=ae;exports.UnknownStorageError=O;exports.Updater=Ge;exports.UploadDriver=wr;exports.UploadResourceSnapshot=Oe;exports.UploadTask=Qe;exports.WrongLocalFileUrl=E;exports.WrongResourceTypeError=H;exports.createDownloadClient=On;exports.createLogsClient=Hn;exports.createLsFilesClient=Fe;exports.createUploadBlobClient=xn;exports.createUploadProgressClient=zn;exports.getFullPath=Ne;exports.getSize=Ee;exports.isMyUpload=Ke;exports.isResourceWasDeletedError=ne;exports.makeBlobImportSnapshot=Ye;exports.makeDownloadableBlobSnapshot=qe;exports.newLocalStorageIdsToRoot=Be;exports.nonRecoverableError=pe;exports.parseLocalUrl=ve;exports.uploadBlob=Xe;exports.validateAbsolute=I;
1
+ "use strict";var at=Object.defineProperty;var lt=(s,e,t)=>e in s?at(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var h=(s,e,t)=>lt(s,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("@milaboratories/pl-client"),ct=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"),dt=require("denque"),U=require("node:crypto"),Pe=require("node:os"),ht=require("node:readline/promises"),L=require("zod"),ut=require("node:zlib"),pt=require("tar-fs"),gt=require("decompress"),Ue=require("node:timers/promises"),ft=require("node:assert"),mt=require("@milaboratories/pl-model-common"),wt=require("node:util"),yt=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(ct),ae=I(W),b=I(k),we=I(Pe),Tt=I(ht),Ie=I(ut),te=I(pt);class bt 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 bt;class kt 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 kt;class Lt 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 Pt=new Lt;class Ut 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 x=e.int32()+e.pos;e.pos<x;)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 It=new Ut;class Rt 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 Rt;class Dt 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 St=new Dt;class vt 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 Nt=new vt;class Ct 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 Ct;class $t 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 Bt=new $t;class Ft 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 A=new Ft;class Wt 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:()=>A},{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(A.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++)A.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 _t=new Wt;class Mt 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 Mt;class Et 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 Ot=new Et;class Ht 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 zt=new Ht,j=new y.ServiceType("MiLaboratories.Controller.Shared.Upload",[{name:"Init",options:{},I:Pt,O:It},{name:"GetPartURL",options:{},I:Bt,O:_t},{name:"UpdateProgress",options:{},I:St,O:Nt},{name:"Finalize",options:{},I:Ot,O:zt}]);class xt{constructor(e){h(this,"typeName",j.typeName);h(this,"methods",j.methods);h(this,"options",j.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 xt(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 At(n,a.chunkStart,a.chunkEnd);await Gt(n,r);try{const{body:c,statusCode:u,headers:x}=await Le.request(a.uploadUrl,{dispatcher:this.httpClient,body:d,headersTimeout:6e4,bodyTimeout:6e4,headers:Re(a.headers),method:a.method.toUpperCase()}),it=await c.text();Vt(u,it,x,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 At(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 jt(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 jt(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 Gt(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 Vt(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 qt 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 qt;class Jt 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 Jt;class Zt 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 Zt;class Qt 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 Qt;class Xt 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 Kt=new Xt;class Yt 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 en=new Yt;class tn 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 tn;class nn 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 rn=new nn;class on 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 sn=new on,G=new y.ServiceType("MiLaboratories.Controller.Shared.Progress",[{name:"GetStatus",options:{"google.api.http":{get:"/resources/{resource_id}/get-progress"}},I:Kt,O:en},{name:"RealtimeStatus",serverStreaming:!0,options:{},I:rn,O:sn}]);class an{constructor(e){h(this,"typeName",G.typeName);h(this,"methods",G.methods);h(this,"options",G.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 an(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 E 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 ln(r,a,e),{content:a,size:Number(l["content-length"])}}}async function ln(s,e,t){if(s!=200&&s!=206){const n=(await ie.text(e)).substring(0,1e3);throw 400<=s&&s<500?new E(`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 cn 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 cn;class dn 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 dn;class hn 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 un=new hn;class pn 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 V=new pn;class gn 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:()=>V}])}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(V.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++)V.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 fn=new gn,q=new y.ServiceType("MiLaboratories.Controller.Shared.Download",[{name:"GetDownloadURL",options:{"google.api.http":{get:"/resources/{resource_id}/get-download-url"}},I:un,O:fn}]);class mn{constructor(e){h(this,"typeName",q.typeName);h(this,"methods",q.methods);h(this,"options",q.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 mn(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)}`),yn(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 O(`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 H(`Unknown storage location: ${s}`);return n===""?t:b.join(n,t)}const wn="storage://";function yn(s){return s.startsWith(wn)}class O extends Error{}class H 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 Tn 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 J=new Tn;class bn 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 bn;class kn 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:()=>J},{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=J.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&&J.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 Z=new kn;class Ln 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 Ln;class Pn 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 Un=new Pn;class In extends i.MessageType{constructor(){super("MiLaboratories.Controller.Shared.LsAPI.List.Response",[{no:1,name:"items",kind:"message",repeat:1,T:()=>Z},{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(Z.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++)Z.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 Rn=new In,Q=new y.ServiceType("MiLaboratories.Controller.Shared.LS",[{name:"List",options:{},I:Un,O:Rn}]);class Dn{constructor(e){h(this,"typeName",Q.typeName);h(this,"methods",Q.methods);h(this,"options",Q.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 Dn(e)}close(){}async list(e,t,n){return await this.grpcClient.list({resourceId:e.id,location:t},g.addRTypeToMetadata(e.type,n)).response}}class Sn 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 Sn;class vn 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 Nn=new vn;class Cn 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 $n=new Cn;class Bn 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 Fn=new Bn;class Wn 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 _n=new Wn;class Mn 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 En=new Mn;class On 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 On,X=new y.ServiceType("MiLaboratories.Controller.Shared.Streaming",[{name:"StreamBinary",serverStreaming:!0,options:{},I:Nn,O:S},{name:"ReadBinary",options:{},I:$n,O:S},{name:"StreamText",serverStreaming:!0,options:{},I:Fn,O:S},{name:"ReadText",options:{},I:_n,O:S},{name:"LastLines",options:{},I:En,O:S}]);class Hn{constructor(e){h(this,"typeName",X.typeName);h(this,"methods",X.methods);h(this,"options",X.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 Hn(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 zn(s,e,t){return e.getDriver({name:"DownloadBlob",init:(n,r,o)=>new Ne(r,o,s,t)})}function xn(s,e){return s.getDriver({name:"StreamLogs",init:(t,n,r)=>new We(n,r,e)})}function An(s,e){return s.getDriver({name:"UploadProgress",init:(t,n,r)=>new Se(n,r,s,e)})}function jn(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 Gn{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 E||s instanceof H||s instanceof O||(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 Vn(s,e){return`blob+local://download/${s}#${e.sign(s)}`}function qn(s){return!!s.match(Ee)}function K(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()}),Jn=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 Zn(s,e){const t=`${s.type.name}/${s.type.version}/${BigInt(s.id)}`;return`blob+remote://download/${t}#${e.sign(t)}`}function Qn(s){return!!s.match(Ae)}function Xn(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 Kn(s){return Ve.test(s)}function M(s){let e;if(_(s))e=s.match(Ge);else if(Kn(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 z 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 Yn{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 Gn(this.logger,this.clientDownload,e,r,Vn(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 er(He(e),Zn(e,this.signer)),this.idToOnDemand.set(T(e.id),n)),n.attach(t),n.getHandle()}getLocalPath(e){const{path:t}=K(e,this.signer);return t}async getContent(e){if(qn(e))return await nr(this.getLocalPath(e));if(Qn(e)){const t=Xn(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}=K(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}=K(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 er{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 tr(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 tr(s,e,t){const n=ae.createReadStream(s),r=new P.Writable;return new Promise((o,l)=>{const a=Tt.createInterface(n,r),d=new dt;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 nr(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 z(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 rr(s,e,t){const n=k.relative(e,t);return`plblob+folder://${s.sign(n)}.${n}.blob`}function or(s){return new URL(s).protocol=="plblob+folder:"}function sr(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=ir(k.join(t,`${o}`),n.pathname.slice(1));return(n.pathname==""||n.pathname=="/")&&(a=k.join(a,"index.html")),k.resolve(a)}function ir(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 ar{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())}`),lr(e)){this.setError(e),this.change.markChanged(),await ne(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(te.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(te.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 gt(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=rr(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 ne(s){await w.rm(s,{recursive:!0,force:!0})}let Xe=class extends Error{};function lr(s){return s instanceof Xe||s instanceof E||s instanceof H||s instanceof O||(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 cr{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(or(e))return sr(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 ne(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 ne(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 ar(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}=dr(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 hr(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){ur(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){ft(re(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 dr(s,e){let t,n;return re(s)&&(n=N.parse(s.data),t=pr(e,n.localPath,n.pathSignature)),{uploadData:n,progress:{done:!1,status:void 0,isUpload:re(s),isUploadSignMatch:t,lastError:void 0}}}function et(s){return s.isUpload&&(s.isUploadSignMatch??!1)}function hr(s){return s.done,s.isUpload,s.isUploadSignMatch,s.lastError,s.status&&(s.status.progress,s.status.bytesProcessed,s.status.bytesTotal),s}function ur(s){return"blob"in s.fields?s.fields.blob!==void 0:s.fields.incarnation!==void 0}function re(s){return s.type.name.startsWith("BlobUpload")}function pr(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 tt(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)?tt(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 z(`${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){Y("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){Y("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 Y("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 Y(s,e){if(!e.name.startsWith("StreamWorkdir"))throw new z(`${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 E){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 nt(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(te.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 nt(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 nt(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 ee(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 rt=/^local:\/\/(?<name>.*)\/(?<path>.*)$/;function vr(s){return rt.test(s)}function Nr(s,e){return`local://${s}/${encodeURIComponent(e)}`}function Cr(s){const e=s.match(rt);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 ot=/^remote:\/\/(?<name>.*)\/(?<resourceId>.*)$/;function $r(s){return ot.test(s)}function Br(s,e){return`remote://${s}/${BigInt(e)}`}function Fr(s){const e=s.match(ot);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 st(){const s=Pe.homedir();if(k.sep=="/")return[{name:"local",root:"/",initialPath:s}];{const t=k.parse(s).root.replaceAll(":\\","");try{return(await wt.promisify(yt.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(mt.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 ee(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:ee(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:ee(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 st());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=st;exports.DownloadBlobToURLDriver=cr;exports.DownloadDriver=Yn;exports.DownloadUrlDriver=Ur;exports.DownloadableBlobSnapshot=Je;exports.ImportFileHandleData=Jn;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=H;exports.Updater=qe;exports.UploadDriver=Tr;exports.UploadResourceSnapshot=ze;exports.UploadTask=Ke;exports.WrongLocalFileUrl=O;exports.WrongResourceTypeError=z;exports.createDownloadClient=zn;exports.createLogsClient=xn;exports.createLsFilesClient=_e;exports.createUploadBlobClient=jn;exports.createUploadProgressClient=An;exports.getFullPath=$e;exports.getSize=He;exports.isMyUpload=et;exports.isResourceWasDeletedError=oe;exports.makeBlobImportSnapshot=tt;exports.makeDownloadableBlobSnapshot=Ze;exports.newLocalStorageIdsToRoot=Be;exports.nonRecoverableError=fe;exports.parseLocalUrl=Ce;exports.uploadBlob=Ye;exports.validateAbsolute=R;
3
3
  //# sourceMappingURL=index.js.map