Skip to content

Commit 29b663c

Browse files
test(sdk): add arweave upload stub server
1 parent c3d2355 commit 29b663c

File tree

8 files changed

+946
-35
lines changed

8 files changed

+946
-35
lines changed

packages/sdk/package-lock.json

Lines changed: 866 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/sdk/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"@swc/core": "^1.7.3",
7474
"@swc/jest": "^0.2.36",
7575
"@types/debug": "^4.1.7",
76+
"@types/express": "^5.0.2",
7677
"@types/jest": "^29.5.12",
7778
"@typescript-eslint/eslint-plugin": "^6.7.5",
7879
"@typescript-eslint/parser": "^6.7.5",
@@ -85,6 +86,7 @@
8586
"eslint-plugin-jest": "^27.4.2",
8687
"eslint-plugin-sonarjs": "^0.21.0",
8788
"eslint-plugin-unicorn": "^51.0.1",
89+
"express": "^5.1.0",
8890
"jest": "^29.7.0",
8991
"prettier": "^2.8.4",
9092
"rimraf": "^5.0.5",

packages/sdk/src/lib/IExecDataProtectorModule.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { AbstractProvider, AbstractSigner, Eip1193Provider } from 'ethers';
22
import { GraphQLClient } from 'graphql-request';
33
import { IExec } from 'iexec';
4-
import { CHAIN_CONFIG } from '../config/config.js';
4+
import { CHAIN_CONFIG, DEFAULT_ARWEAVE_UPLOAD_API } from '../config/config.js';
55
import { getChainIdFromProvider } from '../utils/getChainId.js';
66
import {
77
AddressOrENS,
@@ -38,6 +38,8 @@ abstract class IExecDataProtectorModule {
3838

3939
protected ipfsGateway!: string;
4040

41+
protected arweaveUploadApi: string = DEFAULT_ARWEAVE_UPLOAD_API;
42+
4143
protected defaultWorkerpool!: string;
4244

4345
protected iexec!: IExec;

packages/sdk/src/lib/dataProtectorCore/IExecDataProtectorCore.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class IExecDataProtectorCore extends IExecDataProtectorModule {
3939
dataprotectorContractAddress: this.dataprotectorContractAddress,
4040
ipfsNode: this.ipfsNode,
4141
ipfsGateway: this.ipfsGateway,
42+
arweaveUploadApi: this.arweaveUploadApi,
4243
iexec: this.iexec,
4344
iexecDebug: this.iexecDebug,
4445
});

packages/sdk/src/lib/dataProtectorCore/protectData.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
ProtectedDataWithSecretProps,
3333
} from '../types/index.js';
3434
import {
35+
ArweaveUploadConsumer,
3536
DataProtectorContractConsumer,
3637
IExecConsumer,
3738
IExecDebugConsumer,
@@ -50,13 +51,15 @@ export const protectData = async ({
5051
uploadMode = 'ipfs',
5152
ipfsNode,
5253
ipfsGateway,
54+
arweaveUploadApi,
5355
allowDebug = false,
5456
data,
5557
onStatusUpdate = () => {},
5658
}: IExecConsumer &
5759
IExecDebugConsumer &
5860
DataProtectorContractConsumer &
5961
IpfsNodeAndGateway &
62+
ArweaveUploadConsumer &
6063
ProtectDataParams): Promise<ProtectedDataWithSecretProps> => {
6164
const vName = stringSchema().label('name').validateSync(name);
6265
const vUploadMode = stringSchema()
@@ -163,12 +166,14 @@ export const protectData = async ({
163166
let multiaddrBytes: Uint8Array;
164167

165168
if (vUploadMode === 'arweave') {
166-
const arweaveId = await arweave.add(encryptedFile).catch((e: Error) => {
167-
throw new WorkflowError({
168-
message: 'Failed to upload encrypted data',
169-
errorCause: e,
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+
});
170176
});
171-
});
172177
multiaddr = `${DEFAULT_ARWEAVE_GATEWAY}/${arweaveId}`;
173178
multiaddrBytes = new TextEncoder().encode(multiaddr);
174179
vOnStatusUpdate({

packages/sdk/src/lib/types/internalTypes.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ export type DataProtectorContractConsumer = {
1717
dataprotectorContractAddress: AddressOrENS;
1818
};
1919

20+
export type ArweaveUploadConsumer = {
21+
arweaveUploadApi?: string;
22+
};
23+
2024
export type SubgraphConsumer = {
2125
graphQLClient: GraphQLClient;
2226
};

packages/sdk/tests/e2e/dataProtectorCore/protectData.test.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import {
1414
getTestRpcProvider,
1515
getTestWeb3SignerProvider,
1616
} from '../../test-utils.js';
17+
import {
18+
getArweaveUploadStubServer,
19+
ArweaveUploadStubServer,
20+
} from '../../utils/arweaveUploadApi.js';
1721

1822
describe('dataProtectorCore.protectData()', () => {
1923
let dataProtectorCore: IExecDataProtectorCore;
@@ -224,6 +228,13 @@ describe('dataProtectorCore.protectData()', () => {
224228

225229
// TODO use a local service for Arweave upload API
226230
describe('when `uploadMode: "arweave"`', () => {
231+
let arweaveUploadServerStub: ArweaveUploadStubServer;
232+
beforeAll(async () => {
233+
arweaveUploadServerStub = await getArweaveUploadStubServer();
234+
});
235+
afterAll(async () => {
236+
await arweaveUploadServerStub.stop();
237+
});
227238
it(
228239
'creates the protected data',
229240
async () => {
@@ -277,6 +288,12 @@ describe('dataProtectorCore.protectData()', () => {
277288
},
278289
};
279290

291+
// override protected property to use stub server
292+
dataProtectorCore[
293+
// eslint-disable-next-line @typescript-eslint/dot-notation
294+
'arweaveUploadApi'
295+
] = arweaveUploadServerStub.url;
296+
280297
const result = await dataProtectorCore.protectData({
281298
data,
282299
uploadMode: 'arweave',
@@ -292,7 +309,6 @@ describe('dataProtectorCore.protectData()', () => {
292309
expect(typeof result.encryptionKey).toBe('string');
293310
expect(typeof result.multiaddr).toBe('string');
294311
expect(result.multiaddr.startsWith(DEFAULT_ARWEAVE_GATEWAY)).toBe(true);
295-
console.log(result.multiaddr);
296312

297313
const ethProvider = getTestRpcProvider();
298314
const iexecOptions = getTestIExecOption();
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { AddressInfo } from 'net';
2+
import express from 'express';
3+
4+
// stub for https://github.com/iExecBlockchainComputing/iexec-arweave-api
5+
const app = express();
6+
app.use('/upload', (req, res) => {
7+
const fileId = 'd1BnXCOft0eM8usWdgd172zLaktRTmjmTp2RoX-Gb1M';
8+
res
9+
.status(200)
10+
.json({ arweaveId: fileId, url: `https://arweave.net/${fileId}` });
11+
});
12+
13+
export type ArweaveUploadStubServer = {
14+
url: string;
15+
stop: () => Promise<void>;
16+
};
17+
18+
export const getArweaveUploadStubServer: () => Promise<ArweaveUploadStubServer> =
19+
async () =>
20+
new Promise((resolve, reject) => {
21+
const server = app.listen((listenErr) => {
22+
if (listenErr) {
23+
reject(listenErr);
24+
} else {
25+
const addressInfo = server.address() as AddressInfo;
26+
const url = `http://127.0.0.1:${addressInfo.port}`;
27+
const stop = () =>
28+
new Promise<void>((res, rej) =>
29+
server.close((closeErr) => {
30+
if (closeErr) {
31+
rej(closeErr);
32+
} else {
33+
res();
34+
}
35+
})
36+
);
37+
resolve({
38+
url,
39+
stop,
40+
});
41+
}
42+
});
43+
});

0 commit comments

Comments
 (0)