@junobuild/storage 0.2.0 → 0.2.1-next-2025-06-24

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.
@@ -1,2 +1,2 @@
1
- import{toNullable as p}from"@dfinity/utils";import{isBrowser as m}from"@junobuild/utils";var A=async({asset:{data:t,headers:e,...o},actor:s})=>{let{init_asset_upload:a,upload_asset_chunk:n,commit_asset_upload:l}=s,{batch_id:c}=await a(r(o)),{chunkIds:i}=await h({data:t,uploadFn:n,batchId:c});await u({commitFn:l,batchId:c,data:t,headers:e,chunkIds:i})},_=async({asset:{data:t,headers:e,...o},proposalId:s,actor:a})=>{let{init_proposal_asset_upload:n,upload_proposal_asset_chunk:l,commit_proposal_asset_upload:c}=a,{batch_id:i}=await n(r(o),s),{chunkIds:d}=await h({data:t,uploadFn:l,batchId:i});await u({commitFn:c,batchId:i,data:t,headers:e,chunkIds:d})},r=({filename:t,collection:e,token:o,fullPath:s,encoding:a,description:n})=>({collection:e,full_path:s,name:t,token:p(o),encoding_type:p(a),description:p(n)}),u=async({commitFn:t,batchId:e,chunkIds:o,headers:s,data:a})=>{let n=s.find(([l,c])=>l.toLowerCase()==="content-type")===void 0&&a.type!==void 0&&a.type!==""?[["Content-Type",a.type]]:void 0;await t({batch_id:e,chunk_ids:o.map(({chunk_id:l})=>l),headers:[...s,...n??[]]})},h=async({data:t,uploadFn:e,batchId:o})=>{let a=[],n=m()?new Blob([await t.arrayBuffer()]):t,l=0n;for(let i=0;i<n.size;i+=19e5){let d=n.slice(i,i+19e5);a.push({batchId:o,chunk:d,uploadFn:e,orderId:l}),l++}let c=[];for await(let i of C({uploadChunks:a}))c=[...c,...i];return{chunkIds:c}};async function*C({uploadChunks:t,limit:e=12}){for(let o=0;o<t.length;o=o+e){let s=t.slice(o,o+e);yield await Promise.all(s.map(n=>k(n)))}}var k=async({batchId:t,chunk:e,uploadFn:o,orderId:s})=>o({batch_id:t,content:new Uint8Array(await e.arrayBuffer()),order_id:p(s)});export{A as uploadAsset,_ as uploadAssetWithProposal};
1
+ import{toNullable as p}from"@dfinity/utils";import{isBrowser as m}from"@junobuild/utils";var A=async({asset:{data:t,headers:e,...o},actor:s})=>{let{init_asset_upload:a,upload_asset_chunk:n,commit_asset_upload:l}=s,{batch_id:c}=await a(r(o)),{chunkIds:i}=await h({data:t,uploadFn:n,batchId:c});await u({commitFn:l,batchId:c,data:t,headers:e,chunkIds:i})},_=async({asset:{data:t,headers:e,...o},proposalId:s,actor:a})=>{let{init_proposal_asset_upload:n,upload_proposal_asset_chunk:l,commit_proposal_asset_upload:c}=a,{batch_id:i}=await n(r(o),s),{chunkIds:d}=await h({data:t,uploadFn:l,batchId:i});await u({commitFn:c,batchId:i,data:t,headers:e,chunkIds:d})},r=({filename:t,collection:e,token:o,fullPath:s,encoding:a,description:n})=>({collection:e,full_path:s,name:t,token:p(o),encoding_type:p(a),description:p(n)}),u=async({commitFn:t,batchId:e,chunkIds:o,headers:s,data:a})=>{let n=s.find(([l,c])=>l.toLowerCase()==="content-type")===void 0&&a.type!==void 0&&a.type!==""?[["Content-Type",a.type]]:void 0;await t({batch_id:e,chunk_ids:o.map(({chunk_id:l})=>l),headers:[...s,...n??[]]})},h=async({data:t,uploadFn:e,batchId:o})=>{let a=[],n=m()?new Blob([await t.arrayBuffer()]):t,l=0n;for(let i=0;i<n.size;i+=19e5){let d=n.slice(i,i+19e5);a.push({batchId:o,chunk:d,uploadFn:e,orderId:l}),l++}let c=[];for await(let i of k({uploadChunks:a}))c=[...c,...i];return{chunkIds:c}};async function*k({uploadChunks:t,limit:e=12}){for(let o=0;o<t.length;o=o+e){let s=t.slice(o,o+e);yield await Promise.all(s.map(n=>C(n)))}}var C=async({batchId:t,chunk:e,uploadFn:o,orderId:s})=>o({batch_id:t,content:new Uint8Array(await e.arrayBuffer()),order_id:p(s)});export{A as uploadAsset,_ as uploadAssetWithProposal};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/api/storage.api.ts"],
4
- "sourcesContent": ["import {toNullable} from '@dfinity/utils';\nimport {isBrowser} from '@junobuild/utils';\nimport type {\n _SERVICE as ConsoleActor,\n CommitBatch as ConsoleCommitBatch,\n InitAssetKey as ConsoleInitAssetKey,\n UploadChunk as ConsoleUploadChunk\n} from '../../declarations/console/console.did';\nimport type {\n _SERVICE as SatelliteActor,\n CommitBatch as SatelliteCommitBatch,\n InitAssetKey as SatelliteInitAssetKey,\n UploadChunk as SatelliteUploadChunk\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 type UploadAssetActor = SatelliteActor;\nexport type UploadAssetWithProposalActor = ConsoleActor | SatelliteActor;\n\ntype InitAssetKey = SatelliteInitAssetKey | ConsoleInitAssetKey;\ntype UploadChunk = SatelliteUploadChunk | ConsoleUploadChunk;\ntype CommitBatch = SatelliteCommitBatch | ConsoleCommitBatch;\n\nexport const uploadAsset = async ({\n asset: {data, headers, ...restAsset},\n actor\n}: {\n asset: UploadAsset;\n actor: UploadAssetActor;\n}): Promise<void> => {\n const {init_asset_upload, upload_asset_chunk, commit_asset_upload} = actor;\n\n const {batch_id: batchId} = await init_asset_upload(mapInitAssetUploadParams(restAsset));\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nexport const uploadAssetWithProposal = async ({\n asset: {data, headers, ...restAsset},\n proposalId,\n actor\n}: {\n asset: UploadAsset;\n proposalId: bigint;\n actor: UploadAssetWithProposalActor;\n}): Promise<void> => {\n const {init_proposal_asset_upload, upload_proposal_asset_chunk, commit_proposal_asset_upload} =\n actor;\n\n const {batch_id: batchId} = await init_proposal_asset_upload(\n mapInitAssetUploadParams(restAsset),\n proposalId\n );\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_proposal_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_proposal_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nconst mapInitAssetUploadParams = ({\n filename,\n collection,\n token,\n fullPath,\n encoding,\n description\n}: Omit<UploadAsset, 'headers' | 'data'>): InitAssetKey => ({\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\nconst commitAsset = async ({\n commitFn,\n batchId,\n chunkIds,\n headers,\n data\n}: {\n commitFn: (commitBatch: CommitBatch) => Promise<void>;\n batchId: bigint;\n chunkIds: UploadChunkResult[];\n} & Pick<UploadAsset, 'headers' | 'data'>) => {\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 commitFn({\n batch_id: batchId,\n chunk_ids: chunkIds.map(({chunk_id}: UploadChunkResult) => chunk_id),\n headers: [...headers, ...(contentType ?? [])]\n });\n};\n\nconst uploadChunks = async ({\n data,\n uploadFn,\n batchId\n}: {\n batchId: bigint;\n} & Pick<UploadAsset, 'data'> &\n Pick<UploadChunkParams, 'uploadFn'>): Promise<{chunkIds: UploadChunkResult[]}> => {\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 uploadFn,\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 return {chunkIds};\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 uploadFn: (uploadChunk: UploadChunk) => Promise<UploadChunkResult>;\n orderId: bigint;\n}\n\nconst uploadChunk = async ({\n batchId,\n chunk,\n uploadFn,\n orderId\n}: UploadChunkParams): Promise<UploadChunkResult> =>\n uploadFn({\n batch_id: batchId,\n content: new Uint8Array(await chunk.arrayBuffer()),\n order_id: toNullable(orderId)\n });\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {toNullable} from '@dfinity/utils';\nimport {isBrowser} from '@junobuild/utils';\nimport type {\n _SERVICE as ConsoleActor,\n CommitBatch as ConsoleCommitBatch,\n InitAssetKey as ConsoleInitAssetKey,\n UploadChunk as ConsoleUploadChunk\n} from '../../declarations/console/console.did';\nimport type {\n _SERVICE as SatelliteActor,\n CommitBatch as SatelliteCommitBatch,\n InitAssetKey as SatelliteInitAssetKey,\n UploadChunk as SatelliteUploadChunk\n} from '../../declarations/satellite/satellite.did';\nimport type {EncodingType, Storage} from '../types/storage.types';\n\nexport type UploadAsset = Required<Omit<Storage, 'token' | 'encoding' | 'description'>> &\n Pick<Storage, 'token' | 'encoding' | 'description'>;\n\nexport type UploadAssetActor = SatelliteActor;\nexport type UploadAssetWithProposalActor = ConsoleActor | SatelliteActor;\n\ntype InitAssetKey = SatelliteInitAssetKey | ConsoleInitAssetKey;\ntype UploadChunk = SatelliteUploadChunk | ConsoleUploadChunk;\ntype CommitBatch = SatelliteCommitBatch | ConsoleCommitBatch;\n\nexport const uploadAsset = async ({\n asset: {data, headers, ...restAsset},\n actor\n}: {\n asset: UploadAsset;\n actor: UploadAssetActor;\n}): Promise<void> => {\n const {init_asset_upload, upload_asset_chunk, commit_asset_upload} = actor;\n\n const {batch_id: batchId} = await init_asset_upload(mapInitAssetUploadParams(restAsset));\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nexport const uploadAssetWithProposal = async ({\n asset: {data, headers, ...restAsset},\n proposalId,\n actor\n}: {\n asset: UploadAsset;\n proposalId: bigint;\n actor: UploadAssetWithProposalActor;\n}): Promise<void> => {\n const {init_proposal_asset_upload, upload_proposal_asset_chunk, commit_proposal_asset_upload} =\n actor;\n\n const {batch_id: batchId} = await init_proposal_asset_upload(\n mapInitAssetUploadParams(restAsset),\n proposalId\n );\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_proposal_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_proposal_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nconst mapInitAssetUploadParams = ({\n filename,\n collection,\n token,\n fullPath,\n encoding,\n description\n}: Omit<UploadAsset, 'headers' | 'data'>): InitAssetKey => ({\n collection,\n full_path: fullPath,\n name: filename,\n token: toNullable<string>(token),\n encoding_type: toNullable<EncodingType>(encoding),\n description: toNullable(description)\n});\n\nconst commitAsset = async ({\n commitFn,\n batchId,\n chunkIds,\n headers,\n data\n}: {\n commitFn: (commitBatch: CommitBatch) => Promise<void>;\n batchId: bigint;\n chunkIds: UploadChunkResult[];\n} & Pick<UploadAsset, 'headers' | 'data'>) => {\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 commitFn({\n batch_id: batchId,\n chunk_ids: chunkIds.map(({chunk_id}: UploadChunkResult) => chunk_id),\n headers: [...headers, ...(contentType ?? [])]\n });\n};\n\nconst uploadChunks = async ({\n data,\n uploadFn,\n batchId\n}: {\n batchId: bigint;\n} & Pick<UploadAsset, 'data'> &\n Pick<UploadChunkParams, 'uploadFn'>): Promise<{chunkIds: UploadChunkResult[]}> => {\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 uploadFn,\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 return {chunkIds};\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 uploadFn: (uploadChunk: UploadChunk) => Promise<UploadChunkResult>;\n orderId: bigint;\n}\n\nconst uploadChunk = async ({\n batchId,\n chunk,\n uploadFn,\n orderId\n}: UploadChunkParams): Promise<UploadChunkResult> =>\n uploadFn({\n batch_id: batchId,\n content: new Uint8Array(await chunk.arrayBuffer()),\n order_id: toNullable(orderId)\n });\n"],
5
+ "mappings": "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",
6
6
  "names": ["toNullable", "isBrowser", "uploadAsset", "data", "headers", "restAsset", "actor", "init_asset_upload", "upload_asset_chunk", "commit_asset_upload", "batchId", "mapInitAssetUploadParams", "chunkIds", "uploadChunks", "commitAsset", "uploadAssetWithProposal", "proposalId", "init_proposal_asset_upload", "upload_proposal_asset_chunk", "commit_proposal_asset_upload", "filename", "collection", "token", "fullPath", "encoding", "description", "commitFn", "contentType", "type", "_", "chunk_id", "uploadFn", "clone", "orderId", "start", "chunk", "results", "batchUploadChunks", "limit", "i", "batch", "params", "uploadChunk"]
7
7
  }
@@ -1,4 +1,4 @@
1
1
  import { createRequire as topLevelCreateRequire } from 'module';
2
2
  const require = topLevelCreateRequire(import.meta.url);
3
- import{toNullable as p}from"@dfinity/utils";import{isBrowser as m}from"@junobuild/utils";var A=async({asset:{data:t,headers:e,...o},actor:s})=>{let{init_asset_upload:a,upload_asset_chunk:n,commit_asset_upload:l}=s,{batch_id:c}=await a(r(o)),{chunkIds:i}=await h({data:t,uploadFn:n,batchId:c});await u({commitFn:l,batchId:c,data:t,headers:e,chunkIds:i})},_=async({asset:{data:t,headers:e,...o},proposalId:s,actor:a})=>{let{init_proposal_asset_upload:n,upload_proposal_asset_chunk:l,commit_proposal_asset_upload:c}=a,{batch_id:i}=await n(r(o),s),{chunkIds:d}=await h({data:t,uploadFn:l,batchId:i});await u({commitFn:c,batchId:i,data:t,headers:e,chunkIds:d})},r=({filename:t,collection:e,token:o,fullPath:s,encoding:a,description:n})=>({collection:e,full_path:s,name:t,token:p(o),encoding_type:p(a),description:p(n)}),u=async({commitFn:t,batchId:e,chunkIds:o,headers:s,data:a})=>{let n=s.find(([l,c])=>l.toLowerCase()==="content-type")===void 0&&a.type!==void 0&&a.type!==""?[["Content-Type",a.type]]:void 0;await t({batch_id:e,chunk_ids:o.map(({chunk_id:l})=>l),headers:[...s,...n??[]]})},h=async({data:t,uploadFn:e,batchId:o})=>{let a=[],n=m()?new Blob([await t.arrayBuffer()]):t,l=0n;for(let i=0;i<n.size;i+=19e5){let d=n.slice(i,i+19e5);a.push({batchId:o,chunk:d,uploadFn:e,orderId:l}),l++}let c=[];for await(let i of C({uploadChunks:a}))c=[...c,...i];return{chunkIds:c}};async function*C({uploadChunks:t,limit:e=12}){for(let o=0;o<t.length;o=o+e){let s=t.slice(o,o+e);yield await Promise.all(s.map(n=>k(n)))}}var k=async({batchId:t,chunk:e,uploadFn:o,orderId:s})=>o({batch_id:t,content:new Uint8Array(await e.arrayBuffer()),order_id:p(s)});export{A as uploadAsset,_ as uploadAssetWithProposal};
3
+ import{toNullable as p}from"@dfinity/utils";import{isBrowser as m}from"@junobuild/utils";var A=async({asset:{data:t,headers:e,...o},actor:s})=>{let{init_asset_upload:a,upload_asset_chunk:n,commit_asset_upload:l}=s,{batch_id:c}=await a(r(o)),{chunkIds:i}=await h({data:t,uploadFn:n,batchId:c});await u({commitFn:l,batchId:c,data:t,headers:e,chunkIds:i})},_=async({asset:{data:t,headers:e,...o},proposalId:s,actor:a})=>{let{init_proposal_asset_upload:n,upload_proposal_asset_chunk:l,commit_proposal_asset_upload:c}=a,{batch_id:i}=await n(r(o),s),{chunkIds:d}=await h({data:t,uploadFn:l,batchId:i});await u({commitFn:c,batchId:i,data:t,headers:e,chunkIds:d})},r=({filename:t,collection:e,token:o,fullPath:s,encoding:a,description:n})=>({collection:e,full_path:s,name:t,token:p(o),encoding_type:p(a),description:p(n)}),u=async({commitFn:t,batchId:e,chunkIds:o,headers:s,data:a})=>{let n=s.find(([l,c])=>l.toLowerCase()==="content-type")===void 0&&a.type!==void 0&&a.type!==""?[["Content-Type",a.type]]:void 0;await t({batch_id:e,chunk_ids:o.map(({chunk_id:l})=>l),headers:[...s,...n??[]]})},h=async({data:t,uploadFn:e,batchId:o})=>{let a=[],n=m()?new Blob([await t.arrayBuffer()]):t,l=0n;for(let i=0;i<n.size;i+=19e5){let d=n.slice(i,i+19e5);a.push({batchId:o,chunk:d,uploadFn:e,orderId:l}),l++}let c=[];for await(let i of k({uploadChunks:a}))c=[...c,...i];return{chunkIds:c}};async function*k({uploadChunks:t,limit:e=12}){for(let o=0;o<t.length;o=o+e){let s=t.slice(o,o+e);yield await Promise.all(s.map(n=>C(n)))}}var C=async({batchId:t,chunk:e,uploadFn:o,orderId:s})=>o({batch_id:t,content:new Uint8Array(await e.arrayBuffer()),order_id:p(s)});export{A as uploadAsset,_ as uploadAssetWithProposal};
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/api/storage.api.ts"],
4
- "sourcesContent": ["import {toNullable} from '@dfinity/utils';\nimport {isBrowser} from '@junobuild/utils';\nimport type {\n _SERVICE as ConsoleActor,\n CommitBatch as ConsoleCommitBatch,\n InitAssetKey as ConsoleInitAssetKey,\n UploadChunk as ConsoleUploadChunk\n} from '../../declarations/console/console.did';\nimport type {\n _SERVICE as SatelliteActor,\n CommitBatch as SatelliteCommitBatch,\n InitAssetKey as SatelliteInitAssetKey,\n UploadChunk as SatelliteUploadChunk\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 type UploadAssetActor = SatelliteActor;\nexport type UploadAssetWithProposalActor = ConsoleActor | SatelliteActor;\n\ntype InitAssetKey = SatelliteInitAssetKey | ConsoleInitAssetKey;\ntype UploadChunk = SatelliteUploadChunk | ConsoleUploadChunk;\ntype CommitBatch = SatelliteCommitBatch | ConsoleCommitBatch;\n\nexport const uploadAsset = async ({\n asset: {data, headers, ...restAsset},\n actor\n}: {\n asset: UploadAsset;\n actor: UploadAssetActor;\n}): Promise<void> => {\n const {init_asset_upload, upload_asset_chunk, commit_asset_upload} = actor;\n\n const {batch_id: batchId} = await init_asset_upload(mapInitAssetUploadParams(restAsset));\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nexport const uploadAssetWithProposal = async ({\n asset: {data, headers, ...restAsset},\n proposalId,\n actor\n}: {\n asset: UploadAsset;\n proposalId: bigint;\n actor: UploadAssetWithProposalActor;\n}): Promise<void> => {\n const {init_proposal_asset_upload, upload_proposal_asset_chunk, commit_proposal_asset_upload} =\n actor;\n\n const {batch_id: batchId} = await init_proposal_asset_upload(\n mapInitAssetUploadParams(restAsset),\n proposalId\n );\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_proposal_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_proposal_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nconst mapInitAssetUploadParams = ({\n filename,\n collection,\n token,\n fullPath,\n encoding,\n description\n}: Omit<UploadAsset, 'headers' | 'data'>): InitAssetKey => ({\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\nconst commitAsset = async ({\n commitFn,\n batchId,\n chunkIds,\n headers,\n data\n}: {\n commitFn: (commitBatch: CommitBatch) => Promise<void>;\n batchId: bigint;\n chunkIds: UploadChunkResult[];\n} & Pick<UploadAsset, 'headers' | 'data'>) => {\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 commitFn({\n batch_id: batchId,\n chunk_ids: chunkIds.map(({chunk_id}: UploadChunkResult) => chunk_id),\n headers: [...headers, ...(contentType ?? [])]\n });\n};\n\nconst uploadChunks = async ({\n data,\n uploadFn,\n batchId\n}: {\n batchId: bigint;\n} & Pick<UploadAsset, 'data'> &\n Pick<UploadChunkParams, 'uploadFn'>): Promise<{chunkIds: UploadChunkResult[]}> => {\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 uploadFn,\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 return {chunkIds};\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 uploadFn: (uploadChunk: UploadChunk) => Promise<UploadChunkResult>;\n orderId: bigint;\n}\n\nconst uploadChunk = async ({\n batchId,\n chunk,\n uploadFn,\n orderId\n}: UploadChunkParams): Promise<UploadChunkResult> =>\n uploadFn({\n batch_id: batchId,\n content: new Uint8Array(await chunk.arrayBuffer()),\n order_id: toNullable(orderId)\n });\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {toNullable} from '@dfinity/utils';\nimport {isBrowser} from '@junobuild/utils';\nimport type {\n _SERVICE as ConsoleActor,\n CommitBatch as ConsoleCommitBatch,\n InitAssetKey as ConsoleInitAssetKey,\n UploadChunk as ConsoleUploadChunk\n} from '../../declarations/console/console.did';\nimport type {\n _SERVICE as SatelliteActor,\n CommitBatch as SatelliteCommitBatch,\n InitAssetKey as SatelliteInitAssetKey,\n UploadChunk as SatelliteUploadChunk\n} from '../../declarations/satellite/satellite.did';\nimport type {EncodingType, Storage} from '../types/storage.types';\n\nexport type UploadAsset = Required<Omit<Storage, 'token' | 'encoding' | 'description'>> &\n Pick<Storage, 'token' | 'encoding' | 'description'>;\n\nexport type UploadAssetActor = SatelliteActor;\nexport type UploadAssetWithProposalActor = ConsoleActor | SatelliteActor;\n\ntype InitAssetKey = SatelliteInitAssetKey | ConsoleInitAssetKey;\ntype UploadChunk = SatelliteUploadChunk | ConsoleUploadChunk;\ntype CommitBatch = SatelliteCommitBatch | ConsoleCommitBatch;\n\nexport const uploadAsset = async ({\n asset: {data, headers, ...restAsset},\n actor\n}: {\n asset: UploadAsset;\n actor: UploadAssetActor;\n}): Promise<void> => {\n const {init_asset_upload, upload_asset_chunk, commit_asset_upload} = actor;\n\n const {batch_id: batchId} = await init_asset_upload(mapInitAssetUploadParams(restAsset));\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nexport const uploadAssetWithProposal = async ({\n asset: {data, headers, ...restAsset},\n proposalId,\n actor\n}: {\n asset: UploadAsset;\n proposalId: bigint;\n actor: UploadAssetWithProposalActor;\n}): Promise<void> => {\n const {init_proposal_asset_upload, upload_proposal_asset_chunk, commit_proposal_asset_upload} =\n actor;\n\n const {batch_id: batchId} = await init_proposal_asset_upload(\n mapInitAssetUploadParams(restAsset),\n proposalId\n );\n\n const {chunkIds} = await uploadChunks({data, uploadFn: upload_proposal_asset_chunk, batchId});\n\n await commitAsset({\n commitFn: commit_proposal_asset_upload,\n batchId,\n data,\n headers,\n chunkIds\n });\n};\n\nconst mapInitAssetUploadParams = ({\n filename,\n collection,\n token,\n fullPath,\n encoding,\n description\n}: Omit<UploadAsset, 'headers' | 'data'>): InitAssetKey => ({\n collection,\n full_path: fullPath,\n name: filename,\n token: toNullable<string>(token),\n encoding_type: toNullable<EncodingType>(encoding),\n description: toNullable(description)\n});\n\nconst commitAsset = async ({\n commitFn,\n batchId,\n chunkIds,\n headers,\n data\n}: {\n commitFn: (commitBatch: CommitBatch) => Promise<void>;\n batchId: bigint;\n chunkIds: UploadChunkResult[];\n} & Pick<UploadAsset, 'headers' | 'data'>) => {\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 commitFn({\n batch_id: batchId,\n chunk_ids: chunkIds.map(({chunk_id}: UploadChunkResult) => chunk_id),\n headers: [...headers, ...(contentType ?? [])]\n });\n};\n\nconst uploadChunks = async ({\n data,\n uploadFn,\n batchId\n}: {\n batchId: bigint;\n} & Pick<UploadAsset, 'data'> &\n Pick<UploadChunkParams, 'uploadFn'>): Promise<{chunkIds: UploadChunkResult[]}> => {\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 uploadFn,\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 return {chunkIds};\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 uploadFn: (uploadChunk: UploadChunk) => Promise<UploadChunkResult>;\n orderId: bigint;\n}\n\nconst uploadChunk = async ({\n batchId,\n chunk,\n uploadFn,\n orderId\n}: UploadChunkParams): Promise<UploadChunkResult> =>\n uploadFn({\n batch_id: batchId,\n content: new Uint8Array(await chunk.arrayBuffer()),\n order_id: toNullable(orderId)\n });\n"],
5
+ "mappings": "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",
6
6
  "names": ["toNullable", "isBrowser", "uploadAsset", "data", "headers", "restAsset", "actor", "init_asset_upload", "upload_asset_chunk", "commit_asset_upload", "batchId", "mapInitAssetUploadParams", "chunkIds", "uploadChunks", "commitAsset", "uploadAssetWithProposal", "proposalId", "init_proposal_asset_upload", "upload_proposal_asset_chunk", "commit_proposal_asset_upload", "filename", "collection", "token", "fullPath", "encoding", "description", "commitFn", "contentType", "type", "_", "chunk_id", "uploadFn", "clone", "orderId", "start", "chunk", "results", "batchUploadChunks", "limit", "i", "batch", "params", "uploadChunk"]
7
7
  }
@@ -44,7 +44,7 @@ export interface AssetKey {
44
44
  * Type representing the possible encoding types.
45
45
  * @typedef {('identity' | 'gzip' | 'compress' | 'deflate' | 'br')} ENCODING_TYPE
46
46
  */
47
- export type ENCODING_TYPE = 'identity' | 'gzip' | 'compress' | 'deflate' | 'br';
47
+ export type EncodingType = 'identity' | 'gzip' | 'compress' | 'deflate' | 'br';
48
48
  /**
49
49
  * Represents an asset with its key details, encodings, and metadata.
50
50
  * @interface
@@ -68,9 +68,9 @@ export interface Asset extends AssetKey {
68
68
  headers: [string, string][];
69
69
  /**
70
70
  * The encodings of the asset.
71
- * @type {Record<ENCODING_TYPE, AssetEncoding>}
71
+ * @type {Record<EncodingType, AssetEncoding>}
72
72
  */
73
- encodings: Record<ENCODING_TYPE, AssetEncoding>;
73
+ encodings: Record<EncodingType, AssetEncoding>;
74
74
  /**
75
75
  * The owner of the asset.
76
76
  * @type {string}
@@ -124,9 +124,9 @@ export interface Storage {
124
124
  token?: string;
125
125
  /**
126
126
  * The encoding type of the asset.
127
- * @type {ENCODING_TYPE}
127
+ * @type {EncodingType}
128
128
  */
129
- encoding?: ENCODING_TYPE;
129
+ encoding?: EncodingType;
130
130
  /**
131
131
  * An optional description of the asset. A field which can be used to filter assets when listing those.
132
132
  * @type {string}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@junobuild/storage",
3
- "version": "0.2.0",
3
+ "version": "0.2.1-next-2025-06-24",
4
4
  "description": "A library for interfacing with Juno's Storage features.",
5
5
  "author": "David Dal Busco (https://daviddalbusco.com)",
6
6
  "license": "MIT",
@@ -47,11 +47,11 @@
47
47
  ],
48
48
  "homepage": "https://juno.build",
49
49
  "peerDependencies": {
50
- "@dfinity/agent": "^2.3.0",
51
- "@dfinity/candid": "^2.3.0",
52
- "@dfinity/identity": "^2.3.0",
53
- "@dfinity/principal": "^2.3.0",
54
- "@dfinity/utils": "^2",
50
+ "@dfinity/agent": "*",
51
+ "@dfinity/candid": "*",
52
+ "@dfinity/identity": "*",
53
+ "@dfinity/principal": "*",
54
+ "@dfinity/utils": "*",
55
55
  "@junobuild/utils": "*"
56
56
  }
57
- }
57
+ }