11import { multiaddr as Multiaddr } from '@multiformats/multiaddr' ;
2- import { DEFAULT_DATA_NAME } from '../../config/config.js' ;
3- import { add } from '../../services/ipfs.js' ;
2+ import {
3+ DEFAULT_ARWEAVE_GATEWAY ,
4+ DEFAULT_DATA_NAME ,
5+ } from '../../config/config.js' ;
6+ import * as arweave from '../../services/arweave.js' ;
7+ import * as ipfs from '../../services/ipfs.js' ;
48import {
59 createZipFromObject ,
610 ensureDataObjectIsValid ,
@@ -28,6 +32,7 @@ import {
2832 ProtectedDataWithSecretProps ,
2933} from '../types/index.js' ;
3034import {
35+ ArweaveUploadConsumer ,
3136 DataProtectorContractConsumer ,
3237 IExecConsumer ,
3338 IExecDebugConsumer ,
@@ -43,17 +48,24 @@ export const protectData = async ({
4348 iexecDebug = throwIfMissing ( ) ,
4449 dataprotectorContractAddress,
4550 name = DEFAULT_DATA_NAME ,
51+ uploadMode = 'ipfs' ,
4652 ipfsNode,
4753 ipfsGateway,
54+ arweaveUploadApi,
4855 allowDebug = false ,
4956 data,
5057 onStatusUpdate = ( ) => { } ,
5158} : IExecConsumer &
5259 IExecDebugConsumer &
5360 DataProtectorContractConsumer &
5461 IpfsNodeAndGateway &
62+ ArweaveUploadConsumer &
5563 ProtectDataParams ) : Promise < ProtectedDataWithSecretProps > => {
5664 const vName = stringSchema ( ) . label ( 'name' ) . validateSync ( name ) ;
65+ const vUploadMode = stringSchema ( )
66+ . oneOf ( [ 'ipfs' , 'arweave' ] )
67+ . label ( 'uploadMode' )
68+ . validateSync ( uploadMode ) ;
5769 const vIpfsNodeUrl = urlSchema ( ) . label ( 'ipfsNode' ) . validateSync ( ipfsNode ) ;
5870 const vIpfsGateway = urlSchema ( )
5971 . label ( 'ipfsGateway' )
@@ -149,28 +161,55 @@ export const protectData = async ({
149161 title : 'UPLOAD_ENCRYPTED_FILE' ,
150162 isDone : false ,
151163 } ) ;
152- const cid = await add ( encryptedFile , {
153- ipfsNode : vIpfsNodeUrl ,
154- ipfsGateway : vIpfsGateway ,
155- } ) . catch ( ( e : Error ) => {
156- throw new WorkflowError ( {
157- message : 'Failed to upload encrypted data' ,
158- errorCause : e ,
164+
165+ let multiaddr : string ;
166+ let multiaddrBytes : Uint8Array ;
167+
168+ if ( vUploadMode === 'arweave' ) {
169+ const arweaveId = await arweave
170+ . add ( encryptedFile , { arweaveUploadApi } )
171+ . catch ( ( e : Error ) => {
172+ throw new WorkflowError ( {
173+ message : 'Failed to upload encrypted data' ,
174+ errorCause : e ,
175+ } ) ;
176+ } ) ;
177+ multiaddr = `${ DEFAULT_ARWEAVE_GATEWAY } /${ arweaveId } ` ;
178+ multiaddrBytes = new TextEncoder ( ) . encode ( multiaddr ) ;
179+ vOnStatusUpdate ( {
180+ title : 'UPLOAD_ENCRYPTED_FILE' ,
181+ isDone : true ,
182+ payload : {
183+ arweaveId,
184+ } ,
159185 } ) ;
160- } ) ;
161- const multiaddr = `/p2p/${ cid } ` ;
162- vOnStatusUpdate ( {
163- title : 'UPLOAD_ENCRYPTED_FILE' ,
164- isDone : true ,
165- payload : {
166- cid,
167- } ,
168- } ) ;
186+ } else {
187+ // ipfs fallback
188+ const cid = await ipfs
189+ . add ( encryptedFile , {
190+ ipfsNode : vIpfsNodeUrl ,
191+ ipfsGateway : vIpfsGateway ,
192+ } )
193+ . catch ( ( e : Error ) => {
194+ throw new WorkflowError ( {
195+ message : 'Failed to upload encrypted data' ,
196+ errorCause : e ,
197+ } ) ;
198+ } ) ;
199+ multiaddr = `/p2p/${ cid } ` ;
200+ multiaddrBytes = Multiaddr ( multiaddr ) . bytes ;
201+ vOnStatusUpdate ( {
202+ title : 'UPLOAD_ENCRYPTED_FILE' ,
203+ isDone : true ,
204+ payload : {
205+ cid,
206+ } ,
207+ } ) ;
208+ }
169209
170210 const { provider, signer, txOptions } =
171211 await iexec . config . resolveContractsClient ( ) ;
172212
173- const multiaddrBytes = Multiaddr ( multiaddr ) . bytes ;
174213 const ownerAddress = await signer . getAddress ( ) ;
175214
176215 vOnStatusUpdate ( {
0 commit comments