{
  "version": 3,
  "sources": ["../../src/api/storage.api.ts"],
  "sourcesContent": ["import {toNullable} from '@dfinity/utils';\nimport {isBrowser} from '@junobuild/utils';\nimport type {\n  _SERVICE as ConsoleActor,\n  InitAssetKey as ConsoleInitAssetKey,\n  InitUploadResult as ConsoleInitUploadResult\n} from '../../declarations/console/console.did';\nimport type {\n  _SERVICE as SatelliteActor,\n  InitAssetKey as SatelliteInitAssetKey,\n  InitUploadResult as SatelliteInitUploadResult\n} from '../../declarations/satellite/satellite.did';\nimport type {ENCODING_TYPE, Storage} from '../types/storage.types';\n\nexport type UploadAsset = Required<Omit<Storage, 'token' | 'encoding' | 'description'>> &\n  Pick<Storage, 'token' | 'encoding' | 'description'>;\n\nexport const uploadAsset = async ({\n  asset: {data, filename, collection, headers, token, fullPath, encoding, description},\n  actor,\n  init_asset_upload\n}: {\n  asset: UploadAsset;\n  actor: SatelliteActor | ConsoleActor;\n  init_asset_upload: (\n    initAssetKey: SatelliteInitAssetKey | ConsoleInitAssetKey\n  ) => Promise<SatelliteInitUploadResult | ConsoleInitUploadResult>;\n}): Promise<void> => {\n  const {batch_id: batchId} = await init_asset_upload({\n    collection,\n    full_path: fullPath,\n    name: filename,\n    token: toNullable<string>(token),\n    encoding_type: toNullable<ENCODING_TYPE>(encoding),\n    description: toNullable(description)\n  });\n\n  // https://forum.dfinity.org/t/optimal-upload-chunk-size/20444/23?u=peterparker\n  const chunkSize = 1900000;\n\n  const uploadChunks: UploadChunkParams[] = [];\n\n  // Prevent transforming chunk to arrayBuffer error: The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired.\n  const clone: Blob = isBrowser() ? new Blob([await data.arrayBuffer()]) : data;\n\n  // Split data into chunks\n  let orderId = 0n;\n  for (let start = 0; start < clone.size; start += chunkSize) {\n    const chunk: Blob = clone.slice(start, start + chunkSize);\n\n    uploadChunks.push({\n      batchId,\n      chunk,\n      actor,\n      orderId\n    });\n\n    orderId++;\n  }\n\n  // Upload chunks to the IC in batch - i.e. 12 chunks uploaded at a time.\n  let chunkIds: UploadChunkResult[] = [];\n  for await (const results of batchUploadChunks({uploadChunks})) {\n    chunkIds = [...chunkIds, ...results];\n  }\n\n  const contentType: [[string, string]] | undefined =\n    headers.find(([type, _]) => type.toLowerCase() === 'content-type') === undefined &&\n    data.type !== undefined &&\n    data.type !== ''\n      ? [['Content-Type', data.type]]\n      : undefined;\n\n  await actor.commit_asset_upload({\n    batch_id: batchId,\n    chunk_ids: chunkIds.map(({chunk_id}: UploadChunkResult) => chunk_id),\n    headers: [...headers, ...(contentType ?? [])]\n  });\n};\n\nasync function* batchUploadChunks({\n  uploadChunks,\n  limit = 12\n}: {\n  uploadChunks: UploadChunkParams[];\n  limit?: number;\n}): AsyncGenerator<UploadChunkResult[], void> {\n  for (let i = 0; i < uploadChunks.length; i = i + limit) {\n    const batch = uploadChunks.slice(i, i + limit);\n    const result = await Promise.all(batch.map((params) => uploadChunk(params)));\n    yield result;\n  }\n}\n\ninterface UploadChunkResult {\n  chunk_id: bigint;\n}\n\ninterface UploadChunkParams {\n  batchId: bigint;\n  chunk: Blob;\n  actor: SatelliteActor | ConsoleActor;\n  orderId: bigint;\n}\n\nconst uploadChunk = async ({\n  batchId,\n  chunk,\n  actor,\n  orderId\n}: UploadChunkParams): Promise<UploadChunkResult> =>\n  actor.upload_asset_chunk({\n    batch_id: batchId,\n    content: new Uint8Array(await chunk.arrayBuffer()),\n    order_id: toNullable(orderId)\n  });\n"],
  "mappings": ";;AAAA,OAAQ,cAAAA,MAAiB,iBACzB,OAAQ,aAAAC,MAAgB,mBAgBjB,IAAMC,EAAc,MAAO,CAChC,MAAO,CAAC,KAAAC,EAAM,SAAAC,EAAU,WAAAC,EAAY,QAAAC,EAAS,MAAAC,EAAO,SAAAC,EAAU,SAAAC,EAAU,YAAAC,CAAW,EACnF,MAAAC,EACA,kBAAAC,CACF,IAMqB,CACnB,GAAM,CAAC,SAAUC,CAAO,EAAI,MAAMD,EAAkB,CAClD,WAAAP,EACA,UAAWG,EACX,KAAMJ,EACN,MAAOJ,EAAmBO,CAAK,EAC/B,cAAeP,EAA0BS,CAAQ,EACjD,YAAaT,EAAWU,CAAW,CACrC,CAAC,EAGKI,EAAY,KAEZC,EAAoC,CAAC,EAGrCC,EAAcf,EAAU,EAAI,IAAI,KAAK,CAAC,MAAME,EAAK,YAAY,CAAC,CAAC,EAAIA,EAGrEc,EAAU,GACd,QAASC,EAAQ,EAAGA,EAAQF,EAAM,KAAME,GAASJ,EAAW,CAC1D,IAAMK,EAAcH,EAAM,MAAME,EAAOA,EAAQJ,CAAS,EAExDC,EAAa,KAAK,CAChB,QAAAF,EACA,MAAAM,EACA,MAAAR,EACA,QAAAM,CACF,CAAC,EAEDA,GACF,CAGA,IAAIG,EAAgC,CAAC,EACrC,cAAiBC,KAAWC,EAAkB,CAAC,aAAAP,CAAY,CAAC,EAC1DK,EAAW,CAAC,GAAGA,EAAU,GAAGC,CAAO,EAGrC,IAAME,EACJjB,EAAQ,KAAK,CAAC,CAACkB,EAAMC,CAAC,IAAMD,EAAK,YAAY,IAAM,cAAc,IAAM,QACvErB,EAAK,OAAS,QACdA,EAAK,OAAS,GACV,CAAC,CAAC,eAAgBA,EAAK,IAAI,CAAC,EAC5B,OAEN,MAAMQ,EAAM,oBAAoB,CAC9B,SAAUE,EACV,UAAWO,EAAS,IAAI,CAAC,CAAC,SAAAM,CAAQ,IAAyBA,CAAQ,EACnE,QAAS,CAAC,GAAGpB,EAAS,GAAIiB,GAAe,CAAC,CAAE,CAC9C,CAAC,CACH,EAEA,eAAgBD,EAAkB,CAChC,aAAAP,EACA,MAAAY,EAAQ,EACV,EAG8C,CAC5C,QAASC,EAAI,EAAGA,EAAIb,EAAa,OAAQa,EAAIA,EAAID,EAAO,CACtD,IAAME,EAAQd,EAAa,MAAMa,EAAGA,EAAID,CAAK,EAE7C,MADe,MAAM,QAAQ,IAAIE,EAAM,IAAKC,GAAWC,EAAYD,CAAM,CAAC,CAAC,CAE7E,CACF,CAaA,IAAMC,EAAc,MAAO,CACzB,QAAAlB,EACA,MAAAM,EACA,MAAAR,EACA,QAAAM,CACF,IACEN,EAAM,mBAAmB,CACvB,SAAUE,EACV,QAAS,IAAI,WAAW,MAAMM,EAAM,YAAY,CAAC,EACjD,SAAUnB,EAAWiB,CAAO,CAC9B,CAAC",
  "names": ["toNullable", "isBrowser", "uploadAsset", "data", "filename", "collection", "headers", "token", "fullPath", "encoding", "description", "actor", "init_asset_upload", "batchId", "chunkSize", "uploadChunks", "clone", "orderId", "start", "chunk", "chunkIds", "results", "batchUploadChunks", "contentType", "type", "_", "chunk_id", "limit", "i", "batch", "params", "uploadChunk"]
}
