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