Skip to content

Commit 78f0790

Browse files
feat: add bulk processing support (#525)
Co-authored-by: Pierre Jeanjacquot <[email protected]>
1 parent 4df5c2d commit 78f0790

19 files changed

+2010
-181
lines changed

packages/sdk/package-lock.json

Lines changed: 296 additions & 148 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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@
6161
"debug": "^4.3.4",
6262
"ethers": "^6.13.2",
6363
"graphql-request": "^6.0.0",
64-
"iexec": "^8.20.0",
64+
"iexec": "^8.22.0",
6565
"jszip": "^3.7.1",
66-
"kubo-rpc-client": "^4.1.1",
66+
"kubo-rpc-client": "^5.4.1",
6767
"magic-bytes.js": "^1.0.15",
6868
"typechain": "^8.3.2",
6969
"yup": "^1.0.2"

packages/sdk/src/lib/IExecDataProtectorModule.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ abstract class IExecDataProtectorModule {
118118
{ ethProvider: this.ethProvider },
119119
{
120120
ipfsGatewayURL: ipfsGateway,
121+
ipfsNodeURL: ipfsNode,
121122
...this.options?.iexecOptions,
122123
allowExperimentalNetworks: this.options.allowExperimentalNetworks,
123124
}

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
GrantedAccessResponse,
99
ProcessProtectedDataParams,
1010
ProcessProtectedDataResponse,
11+
ProcessBulkRequestParams,
12+
ProcessBulkRequestResponse,
1113
ProtectDataParams,
1214
ProtectedData,
1315
GetResultFromCompletedTaskParams,
@@ -19,11 +21,15 @@ import {
1921
TransferResponse,
2022
WaitForTaskCompletionResponse,
2123
WaitForTaskCompletionParams,
24+
PrepareBulkRequestParams,
25+
PrepareBulkRequestResponse,
2226
} from '../types/index.js';
2327
import { getGrantedAccess } from './getGrantedAccess.js';
2428
import { getProtectedData } from './getProtectedData.js';
2529
import { getResultFromCompletedTask } from './getResultFromCompletedTask.js';
2630
import { grantAccess } from './grantAccess.js';
31+
import { prepareBulkRequest } from './prepareBulkRequest.js';
32+
import { processBulkRequest } from './processBulkRequest.js';
2733
import { processProtectedData } from './processProtectedData.js';
2834
import { protectData } from './protectData.js';
2935
import { revokeAllAccess } from './revokeAllAccess.js';
@@ -83,6 +89,29 @@ class IExecDataProtectorCore extends IExecDataProtectorModule {
8389
});
8490
}
8591

92+
async prepareBulkRequest(
93+
args: PrepareBulkRequestParams
94+
): Promise<PrepareBulkRequestResponse> {
95+
await this.init();
96+
await isValidProvider(this.iexec);
97+
return prepareBulkRequest({
98+
...args,
99+
iexec: this.iexec,
100+
});
101+
}
102+
103+
async processBulkRequest<Params extends ProcessBulkRequestParams>(
104+
args: Params
105+
): Promise<ProcessBulkRequestResponse<Params>> {
106+
await this.init();
107+
await isValidProvider(this.iexec);
108+
return processBulkRequest({
109+
...args,
110+
iexec: this.iexec,
111+
defaultWorkerpool: this.defaultWorkerpool,
112+
});
113+
}
114+
86115
// ----- READ METHODS -----
87116
async getProtectedData(
88117
args?: GetProtectedDataParams

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const getGrantedAccess = async ({
2121
isUserStrict = false,
2222
page,
2323
pageSize,
24+
bulkOnly = false,
2425
}: IExecConsumer & GetGrantedAccessParams): Promise<GrantedAccessResponse> => {
2526
const vProtectedData = addressOrEnsSchema()
2627
.label('protectedData')
@@ -38,6 +39,7 @@ export const getGrantedAccess = async ({
3839
const vPageSize = numberBetweenSchema(10, 1000)
3940
.label('pageSize')
4041
.validateSync(pageSize);
42+
const vBulkOnly = booleanSchema().label('bulkOnly').validateSync(bulkOnly);
4143

4244
try {
4345
const { count, orders } = await iexec.orderbook.fetchDatasetOrderbook({
@@ -48,6 +50,7 @@ export const getGrantedAccess = async ({
4850
isAppStrict: true,
4951
page: vPage,
5052
pageSize: vPageSize,
53+
bulkOnly: vBulkOnly,
5154
});
5255
const grantedAccess = orders?.map((order) =>
5356
formatGrantedAccess(order.order, order.remaining)

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

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ZeroAddress } from 'ethers';
2-
import { NULL_ADDRESS } from 'iexec/utils';
2+
import { DATASET_INFINITE_VOLUME, NULL_ADDRESS } from 'iexec/utils';
33
import {
44
ValidationError,
55
WorkflowError,
@@ -9,6 +9,7 @@ import {
99
import { formatGrantedAccess } from '../../utils/formatGrantedAccess.js';
1010
import {
1111
addressOrEnsSchema,
12+
booleanSchema,
1213
isEnsTest,
1314
positiveIntegerStringSchema,
1415
positiveStrictIntegerStringSchema,
@@ -47,8 +48,9 @@ export const grantAccess = async ({
4748
protectedData,
4849
authorizedApp,
4950
authorizedUser,
50-
pricePerAccess,
51+
pricePerAccess = 0,
5152
numberOfAccess,
53+
allowBulk = false,
5254
onStatusUpdate = () => {},
5355
}: IExecConsumer & GrantAccessParams): Promise<GrantedAccess> => {
5456
const vProtectedData = addressOrEnsSchema()
@@ -62,17 +64,37 @@ export const grantAccess = async ({
6264
const vAuthorizedUser = addressOrEnsSchema()
6365
.label('authorizedUser')
6466
.validateSync(authorizedUser);
65-
const vPricePerAccess = positiveIntegerStringSchema()
67+
let vPricePerAccess = positiveIntegerStringSchema()
6668
.label('pricePerAccess')
6769
.validateSync(pricePerAccess);
68-
const vNumberOfAccess = positiveStrictIntegerStringSchema()
70+
let vNumberOfAccess = positiveStrictIntegerStringSchema()
6971
.label('numberOfAccess')
7072
.validateSync(numberOfAccess);
73+
const vAllowBulk = booleanSchema().label('allowBulk').validateSync(allowBulk);
7174
const vOnStatusUpdate =
7275
validateOnStatusUpdateCallback<OnStatusUpdateFn<GrantAccessStatuses>>(
7376
onStatusUpdate
7477
);
7578

79+
// Validate consistency between allowBulk, pricePerAccess and numberOfAccess
80+
if (vAllowBulk) {
81+
if (vPricePerAccess && vPricePerAccess !== '0') {
82+
throw new ValidationError(
83+
'allowBulk requires pricePerAccess to be 0 or undefined'
84+
);
85+
}
86+
vPricePerAccess = '0';
87+
if (
88+
vNumberOfAccess &&
89+
vNumberOfAccess !== DATASET_INFINITE_VOLUME.toString()
90+
) {
91+
throw new ValidationError(
92+
`allowBulk requires numberOfAccess to be ${DATASET_INFINITE_VOLUME.toString()} or undefined`
93+
);
94+
}
95+
vNumberOfAccess = DATASET_INFINITE_VOLUME.toString();
96+
}
97+
7698
if (vAuthorizedApp && isEnsTest(vAuthorizedApp)) {
7799
const resolved = await iexec.ens.resolveName(vAuthorizedApp);
78100
if (!resolved) {
@@ -127,6 +149,7 @@ export const grantAccess = async ({
127149
title: 'CREATE_DATASET_ORDER',
128150
isDone: false,
129151
});
152+
130153
const datasetorder = await iexec.order
131154
.createDatasetorder({
132155
dataset: vProtectedData,
@@ -145,6 +168,7 @@ export const grantAccess = async ({
145168
errorCause: e,
146169
});
147170
});
171+
148172
vOnStatusUpdate({
149173
title: 'CREATE_DATASET_ORDER',
150174
isDone: true,
@@ -154,13 +178,15 @@ export const grantAccess = async ({
154178
title: 'PUBLISH_DATASET_ORDER',
155179
isDone: false,
156180
});
181+
157182
await iexec.order.publishDatasetorder(datasetorder).catch((e) => {
158183
handleIfProtocolError(e);
159184
throw new WorkflowError({
160185
message: 'Failed to publish data access',
161186
errorCause: e,
162187
});
163188
});
189+
164190
vOnStatusUpdate({
165191
title: 'PUBLISH_DATASET_ORDER',
166192
isDone: true,

0 commit comments

Comments
 (0)