@iexec/web3mail 1.6.0-nightly-b2a0e93 → 1.7.0

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.
Files changed (34) hide show
  1. package/dist/utils/subgraphQuery.js +1 -2
  2. package/dist/utils/subgraphQuery.js.map +1 -1
  3. package/dist/utils/validators.d.ts +35 -0
  4. package/dist/utils/validators.js +45 -1
  5. package/dist/utils/validators.js.map +1 -1
  6. package/dist/web3mail/IExecWeb3mail.d.ts +4 -2
  7. package/dist/web3mail/IExecWeb3mail.js +24 -1
  8. package/dist/web3mail/IExecWeb3mail.js.map +1 -1
  9. package/dist/web3mail/fetchMyContacts.js +2 -1
  10. package/dist/web3mail/fetchMyContacts.js.map +1 -1
  11. package/dist/web3mail/fetchUserContacts.js +1 -1
  12. package/dist/web3mail/fetchUserContacts.js.map +1 -1
  13. package/dist/web3mail/internalTypes.d.ts +4 -4
  14. package/dist/web3mail/prepareEmailCampaign.d.ts +4 -0
  15. package/dist/web3mail/prepareEmailCampaign.js +106 -0
  16. package/dist/web3mail/prepareEmailCampaign.js.map +1 -0
  17. package/dist/web3mail/sendEmail.d.ts +2 -2
  18. package/dist/web3mail/sendEmail.js +191 -135
  19. package/dist/web3mail/sendEmail.js.map +1 -1
  20. package/dist/web3mail/sendEmailCampaign.d.ts +4 -0
  21. package/dist/web3mail/sendEmailCampaign.js +43 -0
  22. package/dist/web3mail/sendEmailCampaign.js.map +1 -0
  23. package/dist/web3mail/types.d.ts +83 -24
  24. package/package.json +3 -4
  25. package/src/utils/subgraphQuery.ts +1 -2
  26. package/src/utils/validators.ts +68 -1
  27. package/src/web3mail/IExecWeb3mail.ts +38 -5
  28. package/src/web3mail/fetchMyContacts.ts +2 -1
  29. package/src/web3mail/fetchUserContacts.ts +7 -5
  30. package/src/web3mail/internalTypes.ts +5 -3
  31. package/src/web3mail/prepareEmailCampaign.ts +170 -0
  32. package/src/web3mail/sendEmail.ts +246 -150
  33. package/src/web3mail/sendEmailCampaign.ts +69 -0
  34. package/src/web3mail/types.ts +88 -26
@@ -1,53 +1,164 @@
1
1
  import { Buffer } from 'buffer';
2
- import { DEFAULT_CONTENT_TYPE, MAX_DESIRED_APP_ORDER_PRICE, MAX_DESIRED_DATA_ORDER_PRICE, MAX_DESIRED_WORKERPOOL_ORDER_PRICE, } from '../config/config.js';
2
+ import { CALLBACK_WEB3MAIL, DEFAULT_CONTENT_TYPE, MAX_DESIRED_APP_ORDER_PRICE, MAX_DESIRED_DATA_ORDER_PRICE, MAX_DESIRED_WORKERPOOL_ORDER_PRICE, } from '../config/config.js';
3
3
  import { handleIfProtocolError, WorkflowError } from '../utils/errors.js';
4
+ import { generateSecureUniqueId } from '../utils/generateUniqueId.js';
4
5
  import * as ipfs from '../utils/ipfs-service.js';
5
6
  import { checkProtectedDataValidity } from '../utils/subgraphQuery.js';
6
- import { addressOrEnsSchema, booleanSchema, contentTypeSchema, emailContentSchema, emailSubjectSchema, labelSchema, positiveNumberSchema, senderNameSchema, throwIfMissing, } from '../utils/validators.js';
7
- export const sendEmail = async ({ graphQLClient = throwIfMissing(), iexec = throwIfMissing(), dataProtector = throwIfMissing(), workerpoolAddressOrEns = throwIfMissing(), dappAddressOrENS, ipfsNode, ipfsGateway, emailSubject, emailContent, contentType = DEFAULT_CONTENT_TYPE, label, dataMaxPrice = MAX_DESIRED_DATA_ORDER_PRICE, appMaxPrice = MAX_DESIRED_APP_ORDER_PRICE, workerpoolMaxPrice = MAX_DESIRED_WORKERPOOL_ORDER_PRICE, senderName, protectedData, grantedAccess, maxProtectedDataPerTask, useVoucher = false, }) => {
7
+ import { addressOrEnsSchema, addressSchema, booleanSchema, contentTypeSchema, emailContentSchema, emailSubjectSchema, labelSchema, positiveNumberSchema, senderNameSchema, throwIfMissing, } from '../utils/validators.js';
8
+ import { checkUserVoucher, filterWorkerpoolOrders, } from './sendEmail.models.js';
9
+ export const sendEmail = async ({ graphQLClient = throwIfMissing(), iexec = throwIfMissing(), workerpoolAddressOrEns, dappAddressOrENS, dappWhitelistAddress, ipfsNode, ipfsGateway, emailSubject, emailContent, contentType = DEFAULT_CONTENT_TYPE, label, dataMaxPrice = MAX_DESIRED_DATA_ORDER_PRICE, appMaxPrice = MAX_DESIRED_APP_ORDER_PRICE, workerpoolMaxPrice = MAX_DESIRED_WORKERPOOL_ORDER_PRICE, senderName, protectedData, useVoucher = false, }) => {
10
+ const vDatasetAddress = addressOrEnsSchema()
11
+ .required()
12
+ .label('protectedData')
13
+ .validateSync(protectedData);
14
+ const vEmailSubject = emailSubjectSchema()
15
+ .required()
16
+ .label('emailSubject')
17
+ .validateSync(emailSubject);
18
+ const vEmailContent = emailContentSchema()
19
+ .required()
20
+ .label('emailContent')
21
+ .validateSync(emailContent);
22
+ const vContentType = contentTypeSchema()
23
+ .required()
24
+ .label('contentType')
25
+ .validateSync(contentType);
26
+ const vSenderName = senderNameSchema()
27
+ .label('senderName')
28
+ .validateSync(senderName);
29
+ const vLabel = labelSchema().label('label').validateSync(label);
30
+ const vWorkerpoolAddressOrEns = addressOrEnsSchema()
31
+ .required()
32
+ .label('WorkerpoolAddressOrEns')
33
+ .validateSync(workerpoolAddressOrEns);
34
+ const vDappAddressOrENS = addressOrEnsSchema()
35
+ .required()
36
+ .label('dappAddressOrENS')
37
+ .validateSync(dappAddressOrENS);
38
+ const vDappWhitelistAddress = addressSchema()
39
+ .required()
40
+ .label('dappWhitelistAddress')
41
+ .validateSync(dappWhitelistAddress);
42
+ const vDataMaxPrice = positiveNumberSchema()
43
+ .label('dataMaxPrice')
44
+ .validateSync(dataMaxPrice);
45
+ const vAppMaxPrice = positiveNumberSchema()
46
+ .label('appMaxPrice')
47
+ .validateSync(appMaxPrice);
48
+ const vWorkerpoolMaxPrice = positiveNumberSchema()
49
+ .label('workerpoolMaxPrice')
50
+ .validateSync(workerpoolMaxPrice);
51
+ const vUseVoucher = booleanSchema()
52
+ .label('useVoucher')
53
+ .validateSync(useVoucher);
54
+ // Check protected data schema through subgraph
55
+ const isValidProtectedData = await checkProtectedDataValidity(graphQLClient, vDatasetAddress);
56
+ if (!isValidProtectedData) {
57
+ throw new Error('This protected data does not contain "email:string" in its schema.');
58
+ }
59
+ const requesterAddress = await iexec.wallet.getAddress();
60
+ let userVoucher;
61
+ if (vUseVoucher) {
62
+ try {
63
+ userVoucher = await iexec.voucher.showUserVoucher(requesterAddress);
64
+ checkUserVoucher({ userVoucher });
65
+ }
66
+ catch (err) {
67
+ if (err?.message?.startsWith('No Voucher found for address')) {
68
+ throw new Error('Oops, it seems your wallet is not associated with any voucher. Check on https://builder.iex.ec/');
69
+ }
70
+ throw err;
71
+ }
72
+ }
8
73
  try {
9
- const vUseVoucher = booleanSchema()
10
- .label('useVoucher')
11
- .validateSync(useVoucher);
12
- const vWorkerpoolAddressOrEns = addressOrEnsSchema()
13
- .required()
14
- .label('WorkerpoolAddressOrEns')
15
- .validateSync(workerpoolAddressOrEns);
16
- const vSenderName = senderNameSchema()
17
- .label('senderName')
18
- .validateSync(senderName);
19
- const vEmailSubject = emailSubjectSchema()
20
- .required()
21
- .label('emailSubject')
22
- .validateSync(emailSubject);
23
- const vEmailContent = emailContentSchema()
24
- .required()
25
- .label('emailContent')
26
- .validateSync(emailContent);
27
- const vContentType = contentTypeSchema()
28
- .required()
29
- .label('contentType')
30
- .validateSync(contentType);
31
- const vLabel = labelSchema().label('label').validateSync(label);
32
- const vDappAddressOrENS = addressOrEnsSchema()
33
- .required()
34
- .label('dappAddressOrENS')
35
- .validateSync(dappAddressOrENS);
36
- // TODO: remove this once we have a way to pass appWhitelist to processProtectedData function
37
- // const vDappWhitelistAddress = addressSchema()
38
- // .required()
39
- // .label('dappWhitelistAddress')
40
- // .validateSync(dappWhitelistAddress);
41
- const vDataMaxPrice = positiveNumberSchema()
42
- .label('dataMaxPrice')
43
- .validateSync(dataMaxPrice);
44
- const vAppMaxPrice = positiveNumberSchema()
45
- .label('appMaxPrice')
46
- .validateSync(appMaxPrice);
47
- const vWorkerpoolMaxPrice = positiveNumberSchema()
48
- .label('workerpoolMaxPrice')
49
- .validateSync(workerpoolMaxPrice);
50
- // Encrypt email content
74
+ const [datasetorderForApp, datasetorderForWhitelist, apporder, workerpoolorder,] = await Promise.all([
75
+ // Fetch dataset order for web3mail app
76
+ iexec.orderbook
77
+ .fetchDatasetOrderbook({
78
+ dataset: vDatasetAddress,
79
+ app: dappAddressOrENS,
80
+ requester: requesterAddress,
81
+ })
82
+ .then((datasetOrderbook) => {
83
+ const desiredPriceDataOrderbook = datasetOrderbook.orders.filter((order) => order.order.datasetprice <= vDataMaxPrice);
84
+ return desiredPriceDataOrderbook[0]?.order; // may be undefined
85
+ }),
86
+ // Fetch dataset order for web3mail whitelist
87
+ iexec.orderbook
88
+ .fetchDatasetOrderbook({
89
+ dataset: vDatasetAddress,
90
+ app: vDappWhitelistAddress,
91
+ requester: requesterAddress,
92
+ })
93
+ .then((datasetOrderbook) => {
94
+ const desiredPriceDataOrderbook = datasetOrderbook.orders.filter((order) => order.order.datasetprice <= vDataMaxPrice);
95
+ return desiredPriceDataOrderbook[0]?.order; // may be undefined
96
+ }),
97
+ // Fetch app order
98
+ iexec.orderbook
99
+ .fetchAppOrderbook({
100
+ app: dappAddressOrENS,
101
+ minTag: ['tee', 'scone'],
102
+ maxTag: ['tee', 'scone'],
103
+ workerpool: workerpoolAddressOrEns,
104
+ })
105
+ .then((appOrderbook) => {
106
+ const desiredPriceAppOrderbook = appOrderbook.orders.filter((order) => order.order.appprice <= vAppMaxPrice);
107
+ const desiredPriceAppOrder = desiredPriceAppOrderbook[0]?.order;
108
+ if (!desiredPriceAppOrder) {
109
+ throw new Error('No App order found for the desired price');
110
+ }
111
+ return desiredPriceAppOrder;
112
+ }),
113
+ // Fetch workerpool order for App or AppWhitelist
114
+ Promise.all([
115
+ // for app
116
+ iexec.orderbook.fetchWorkerpoolOrderbook({
117
+ workerpool: workerpoolAddressOrEns,
118
+ app: vDappAddressOrENS,
119
+ dataset: vDatasetAddress,
120
+ requester: requesterAddress, // public orders + user specific orders
121
+ isRequesterStrict: useVoucher, // If voucher, we only want user specific orders
122
+ minTag: ['tee', 'scone'],
123
+ maxTag: ['tee', 'scone'],
124
+ category: 0,
125
+ }),
126
+ // for app whitelist
127
+ iexec.orderbook.fetchWorkerpoolOrderbook({
128
+ workerpool: workerpoolAddressOrEns,
129
+ app: vDappWhitelistAddress,
130
+ dataset: vDatasetAddress,
131
+ requester: requesterAddress, // public orders + user specific orders
132
+ isRequesterStrict: useVoucher, // If voucher, we only want user specific orders
133
+ minTag: ['tee', 'scone'],
134
+ maxTag: ['tee', 'scone'],
135
+ category: 0,
136
+ }),
137
+ ]).then(([workerpoolOrderbookForApp, workerpoolOrderbookForAppWhitelist]) => {
138
+ const desiredPriceWorkerpoolOrder = filterWorkerpoolOrders({
139
+ workerpoolOrders: [
140
+ ...workerpoolOrderbookForApp.orders,
141
+ ...workerpoolOrderbookForAppWhitelist.orders,
142
+ ],
143
+ workerpoolMaxPrice: vWorkerpoolMaxPrice,
144
+ useVoucher: vUseVoucher,
145
+ userVoucher,
146
+ });
147
+ if (!desiredPriceWorkerpoolOrder) {
148
+ throw new Error('No Workerpool order found for the desired price');
149
+ }
150
+ return desiredPriceWorkerpoolOrder;
151
+ }),
152
+ ]);
153
+ if (!workerpoolorder) {
154
+ throw new Error('No Workerpool order found for the desired price');
155
+ }
156
+ const datasetorder = datasetorderForApp || datasetorderForWhitelist;
157
+ if (!datasetorder) {
158
+ throw new Error('No Dataset order found for the desired price');
159
+ }
160
+ // Push requester secrets
161
+ const requesterSecretId = generateSecureUniqueId(16);
51
162
  const emailContentEncryptionKey = iexec.dataset.generateEncryptionKey();
52
163
  const encryptedFile = await iexec.dataset
53
164
  .encrypt(Buffer.from(vEmailContent, 'utf8'), emailContentEncryptionKey)
@@ -57,11 +168,10 @@ export const sendEmail = async ({ graphQLClient = throwIfMissing(), iexec = thro
57
168
  errorCause: e,
58
169
  });
59
170
  });
60
- // Push email message to IPFS
61
171
  const cid = await ipfs
62
172
  .add(encryptedFile, {
63
- ipfsNode,
64
- ipfsGateway,
173
+ ipfsNode: ipfsNode,
174
+ ipfsGateway: ipfsGateway,
65
175
  })
66
176
  .catch((e) => {
67
177
  throw new WorkflowError({
@@ -70,101 +180,47 @@ export const sendEmail = async ({ graphQLClient = throwIfMissing(), iexec = thro
70
180
  });
71
181
  });
72
182
  const multiaddr = `/ipfs/${cid}`;
73
- // Prepare secrets for the requester
74
- // Use a positive integer as secret ID (required by iexec)
75
- // Using "1" as a fixed ID for the requester secret
76
- const requesterSecretId = 1;
77
- const secrets = {
78
- [requesterSecretId]: JSON.stringify({
79
- senderName: vSenderName,
80
- emailSubject: vEmailSubject,
81
- emailContentMultiAddr: multiaddr,
82
- contentType: vContentType,
83
- emailContentEncryptionKey,
84
- }),
85
- };
86
- // Bulk processing
87
- if (grantedAccess) {
88
- const vMaxProtectedDataPerTask = positiveNumberSchema()
89
- .label('maxProtectedDataPerTask')
90
- .validateSync(maxProtectedDataPerTask);
91
- const bulkRequest = await dataProtector.prepareBulkRequest({
92
- app: vDappAddressOrENS,
93
- appMaxPrice: vAppMaxPrice,
94
- workerpoolMaxPrice: vWorkerpoolMaxPrice,
95
- workerpool: vWorkerpoolAddressOrEns,
96
- args: vLabel,
97
- inputFiles: [],
98
- secrets,
99
- bulkAccesses: grantedAccess,
100
- maxProtectedDataPerTask: vMaxProtectedDataPerTask,
101
- });
102
- const processBulkRequestResponse = await dataProtector.processBulkRequest({
103
- bulkRequest: bulkRequest.bulkRequest,
104
- useVoucher: vUseVoucher,
105
- workerpool: vWorkerpoolAddressOrEns,
106
- });
107
- return {
108
- tasks: processBulkRequestResponse.tasks.map((task) => ({
109
- taskId: task.taskId,
110
- dealId: task.dealId,
111
- bulkIndex: task.bulkIndex,
112
- })),
113
- };
114
- }
115
- // Single processing mode - protectedData is required
116
- const vDatasetAddress = addressOrEnsSchema()
117
- .required()
118
- .label('protectedData')
119
- .validateSync(protectedData);
120
- // Check protected data validity through subgraph
121
- const isValidProtectedData = await checkProtectedDataValidity(graphQLClient, vDatasetAddress);
122
- if (!isValidProtectedData) {
123
- throw new Error('This protected data does not contain "email:string" in its schema.');
124
- }
125
- // Use processProtectedData from dataprotector
126
- const result = await dataProtector.processProtectedData({
127
- defaultWorkerpool: vWorkerpoolAddressOrEns,
128
- protectedData: vDatasetAddress,
183
+ await iexec.secrets.pushRequesterSecret(requesterSecretId, JSON.stringify({
184
+ emailSubject: vEmailSubject,
185
+ emailContentMultiAddr: multiaddr,
186
+ contentType: vContentType,
187
+ senderName: vSenderName,
188
+ emailContentEncryptionKey,
189
+ useCallback: true,
190
+ }));
191
+ const requestorderToSign = await iexec.order.createRequestorder({
129
192
  app: vDappAddressOrENS,
130
- // userWhitelist: vDappWhitelistAddress, // Removed due to bug in dataprotector v2.0.0-beta.20
131
- dataMaxPrice: vDataMaxPrice,
132
- appMaxPrice: vAppMaxPrice,
133
- workerpoolMaxPrice: vWorkerpoolMaxPrice,
193
+ category: workerpoolorder.category,
194
+ dataset: vDatasetAddress,
195
+ datasetmaxprice: datasetorder.datasetprice,
196
+ appmaxprice: apporder.appprice,
197
+ workerpoolmaxprice: workerpoolorder.workerpoolprice,
198
+ tag: ['tee', 'scone'],
134
199
  workerpool: vWorkerpoolAddressOrEns,
135
- args: vLabel,
136
- inputFiles: [],
137
- secrets,
138
- useVoucher: vUseVoucher,
139
- waitForResult: false,
200
+ callback: CALLBACK_WEB3MAIL,
201
+ params: {
202
+ iexec_secrets: {
203
+ 1: requesterSecretId,
204
+ },
205
+ iexec_args: vLabel,
206
+ },
140
207
  });
208
+ const requestorder = await iexec.order.signRequestorder(requestorderToSign);
209
+ // Match orders and compute task ID
210
+ const { dealid: dealId } = await iexec.order.matchOrders({
211
+ apporder: apporder,
212
+ datasetorder: datasetorder,
213
+ workerpoolorder: workerpoolorder,
214
+ requestorder: requestorder,
215
+ }, { useVoucher: vUseVoucher });
216
+ const taskId = await iexec.deal.computeTaskId(dealId, 0);
141
217
  return {
142
- taskId: result.taskId,
218
+ taskId,
219
+ dealId,
143
220
  };
144
221
  }
145
222
  catch (error) {
146
- // Protocol error detected, re-throwing as-is
147
- if (error?.isProtocolError === true) {
148
- throw error;
149
- }
150
- // Handle protocol errors - this will throw if it's an ApiCallError
151
- // handleIfProtocolError transforms ApiCallError into a WorkflowError with isProtocolError=true
152
223
  handleIfProtocolError(error);
153
- // If we reach here, it's not a protocol error
154
- // Check if it's a WorkflowError from processProtectedData by checking the message
155
- const isProcessProtectedDataError = error instanceof Error &&
156
- error.message === 'Failed to process protected data';
157
- if (isProcessProtectedDataError) {
158
- const cause = error?.cause;
159
- // Return unwrapped cause (the actual Error object)
160
- // error.cause should be an Error, but ensure it is
161
- const unwrappedCause = cause instanceof Error ? cause : error;
162
- throw new WorkflowError({
163
- message: 'Failed to sendEmail',
164
- errorCause: unwrappedCause,
165
- });
166
- }
167
- // For all other errors
168
224
  throw new WorkflowError({
169
225
  message: 'Failed to sendEmail',
170
226
  errorCause: error,
@@ -1 +1 @@
1
- {"version":3,"file":"sendEmail.js","sourceRoot":"","sources":["../../src/web3mail/sendEmail.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sendEmail.js","sourceRoot":"","sources":["../../src/web3mail/sendEmail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SendEmailCampaignParams, SendEmailCampaignResponse } from './types.js';
2
+ import { DataProtectorConsumer } from './internalTypes.js';
3
+ export type SendEmailCampaign = typeof sendEmailCampaign;
4
+ export declare const sendEmailCampaign: ({ dataProtector, workerpoolAddressOrEns, campaignRequest, }: DataProtectorConsumer & SendEmailCampaignParams) => Promise<SendEmailCampaignResponse>;
@@ -0,0 +1,43 @@
1
+ import { NULL_ADDRESS } from 'iexec/utils';
2
+ import { ValidationError } from 'yup';
3
+ import { handleIfProtocolError, WorkflowError } from '../utils/errors.js';
4
+ import { addressOrEnsSchema, campaignRequestSchema, throwIfMissing, } from '../utils/validators.js';
5
+ export const sendEmailCampaign = async ({ dataProtector = throwIfMissing(), workerpoolAddressOrEns = throwIfMissing(), campaignRequest, }) => {
6
+ const vCampaignRequest = campaignRequestSchema()
7
+ .required()
8
+ .label('campaignRequest')
9
+ .validateSync(campaignRequest);
10
+ const vWorkerpoolAddressOrEns = addressOrEnsSchema()
11
+ .required()
12
+ .label('workerpoolAddressOrEns')
13
+ .validateSync(workerpoolAddressOrEns);
14
+ if (vCampaignRequest.workerpool !== NULL_ADDRESS &&
15
+ vCampaignRequest.workerpool.toLowerCase() !==
16
+ vWorkerpoolAddressOrEns.toLowerCase()) {
17
+ throw new ValidationError("workerpoolAddressOrEns doesn't match campaignRequest workerpool");
18
+ }
19
+ try {
20
+ // Process the prepared bulk request
21
+ const processBulkRequestResponse = await dataProtector.processBulkRequest({
22
+ bulkRequest: vCampaignRequest,
23
+ workerpool: vWorkerpoolAddressOrEns,
24
+ waitForResult: false,
25
+ });
26
+ return processBulkRequestResponse;
27
+ }
28
+ catch (error) {
29
+ // Protocol error detected, re-throwing as-is
30
+ if (error?.isProtocolError === true) {
31
+ throw error;
32
+ }
33
+ // Handle protocol errors - this will throw if it's an ApiCallError
34
+ // handleIfProtocolError transforms ApiCallError into a WorkflowError with isProtocolError=true
35
+ handleIfProtocolError(error);
36
+ // For all other errors
37
+ throw new WorkflowError({
38
+ message: 'Failed to sendEmailCampaign',
39
+ errorCause: error,
40
+ });
41
+ }
42
+ };
43
+ //# sourceMappingURL=sendEmailCampaign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendEmailCampaign.js","sourceRoot":"","sources":["../../src/web3mail/sendEmailCampaign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAUhC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,EACtC,aAAa,GAAG,cAAc,EAAE,EAChC,sBAAsB,GAAG,cAAc,EAAE,EACzC,eAAe,GAEQ,EAAsC,EAAE;IAC/D,MAAM,gBAAgB,GAAG,qBAAqB,EAAE;SAC7C,QAAQ,EAAE;SACV,KAAK,CAAC,iBAAiB,CAAC;SACxB,YAAY,CAAC,eAAe,CAAoB,CAAC;IAEpD,MAAM,uBAAuB,GAAG,kBAAkB,EAAE;SACjD,QAAQ,EAAE;SACV,KAAK,CAAC,wBAAwB,CAAC;SAC/B,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAExC,IACE,gBAAgB,CAAC,UAAU,KAAK,YAAY;QAC5C,gBAAgB,CAAC,UAAU,CAAC,WAAW,EAAE;YACvC,uBAAuB,CAAC,WAAW,EAAE,EACvC,CAAC;QACD,MAAM,IAAI,eAAe,CACvB,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,0BAA0B,GAAG,MAAM,aAAa,CAAC,kBAAkB,CAAC;YACxE,WAAW,EAAE,gBAAgB;YAC7B,UAAU,EAAE,uBAAuB;YACnC,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6CAA6C;QAC7C,IAAK,KAAa,EAAE,eAAe,KAAK,IAAI,EAAE,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;QAED,mEAAmE;QACnE,+FAA+F;QAC/F,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAE7B,uBAAuB;QACvB,MAAM,IAAI,aAAa,CAAC;YACtB,OAAO,EAAE,6BAA6B;YACtC,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC"}
@@ -1,10 +1,26 @@
1
1
  import { EnhancedWallet } from 'iexec';
2
2
  import { IExecConfigOptions } from 'iexec/IExecConfig';
3
+ import type { BulkRequest } from '@iexec/dataprotector';
3
4
  export type Web3SignerProvider = EnhancedWallet;
4
5
  export type ENS = string;
5
6
  export type AddressOrENS = Address | ENS;
6
7
  export type Address = string;
7
8
  export type TimeStamp = string;
9
+ /**
10
+ * request to send email in bulk
11
+ *
12
+ * use `prepareEmailCampaign()` to create a `CampaignRequest`
13
+ *
14
+ * then use `sendEmailCampaign()` to send the campaign
15
+ */
16
+ export type CampaignRequest = BulkRequest;
17
+ /**
18
+ * authorization signed by the data owner granting access to this contact
19
+ *
20
+ * `GrantedAccess` are obtained by fetching contacts (e.g. `fetchMyContacts()` or `fetchUserContacts()`)
21
+ *
22
+ * `GrantedAccess` can be consumed for email campaigns (e.g. `prepareEmailCampaign()` then `sendEmailCampaign()`)
23
+ */
8
24
  export type GrantedAccess = {
9
25
  dataset: string;
10
26
  datasetprice: string;
@@ -30,14 +46,7 @@ export type Contact = {
30
46
  export type SendEmailParams = {
31
47
  emailSubject: string;
32
48
  emailContent: string;
33
- protectedData?: Address;
34
- /**
35
- * Granted access to process.
36
- * use prepareBulkRequest of dataprotector to create a bulk request.
37
- * if not provided, the single message will be processed.
38
- */
39
- grantedAccess?: GrantedAccess[];
40
- maxProtectedDataPerTask?: number;
49
+ protectedData: Address;
41
50
  contentType?: string;
42
51
  senderName?: string;
43
52
  label?: string;
@@ -52,6 +61,9 @@ export type FetchMyContactsParams = {
52
61
  * Get contacts for this specific user only
53
62
  */
54
63
  isUserStrict?: boolean;
64
+ /**
65
+ * If true, returns only contacts with bulk processing access grants
66
+ */
55
67
  bulkOnly?: boolean;
56
68
  };
57
69
  export type FetchUserContactsParams = {
@@ -60,23 +72,16 @@ export type FetchUserContactsParams = {
60
72
  */
61
73
  userAddress: Address;
62
74
  } & FetchMyContactsParams;
63
- type SendEmailSingleResponse = {
75
+ export type SendEmailResponse = {
76
+ /**
77
+ * ID of the task
78
+ */
64
79
  taskId: string;
80
+ /**
81
+ * ID of the deal containing the task
82
+ */
83
+ dealId: string;
65
84
  };
66
- type SendEmailBulkResponse = {
67
- tasks: {
68
- bulkIndex: number;
69
- taskId: string;
70
- dealId: string;
71
- }[];
72
- };
73
- export type SendEmailResponse<Params = {
74
- protectedData: Address;
75
- }> = Params extends {
76
- grantedAccess: GrantedAccess[];
77
- } ? SendEmailBulkResponse : never & Params extends {
78
- protectedData: Address;
79
- } ? SendEmailSingleResponse : never;
80
85
  /**
81
86
  * Configuration options for Web3Mail.
82
87
  */
@@ -118,4 +123,58 @@ export type Web3MailConfigOptions = {
118
123
  */
119
124
  allowExperimentalNetworks?: boolean;
120
125
  };
121
- export {};
126
+ export type PrepareEmailCampaignParams = {
127
+ /**
128
+ * List of `GrantedAccess` to contacts to send emails to in bulk.
129
+ *
130
+ * use `fetchMyContacts({ bulkOnly: true })` to get granted accesses.
131
+ */
132
+ grantedAccesses: GrantedAccess[];
133
+ maxProtectedDataPerTask?: number;
134
+ senderName?: string;
135
+ emailSubject: string;
136
+ emailContent: string;
137
+ contentType?: string;
138
+ label?: string;
139
+ workerpoolAddressOrEns?: AddressOrENS;
140
+ dataMaxPrice?: number;
141
+ appMaxPrice?: number;
142
+ workerpoolMaxPrice?: number;
143
+ };
144
+ export type PrepareEmailCampaignResponse = {
145
+ /**
146
+ * The prepared campaign request
147
+ *
148
+ * Use this in `sendEmailCampaign()` to start or continue sending the campaign
149
+ */
150
+ campaignRequest: CampaignRequest;
151
+ };
152
+ export type SendEmailCampaignParams = {
153
+ /**
154
+ * The prepared campaign request from `prepareEmailCampaign()`
155
+ */
156
+ campaignRequest: CampaignRequest;
157
+ /**
158
+ * Workerpool address or ENS to use for processing
159
+ */
160
+ workerpoolAddressOrEns?: AddressOrENS;
161
+ };
162
+ export type SendEmailCampaignResponse = {
163
+ /**
164
+ * List of tasks created for the campaign
165
+ */
166
+ tasks: Array<{
167
+ /**
168
+ * ID of the task
169
+ */
170
+ taskId: string;
171
+ /**
172
+ * ID of the deal containing the task
173
+ */
174
+ dealId: string;
175
+ /**
176
+ * Index of the task in the bulk request
177
+ */
178
+ bulkIndex: number;
179
+ }>;
180
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iexec/web3mail",
3
- "version": "1.6.0-nightly-b2a0e93",
3
+ "version": "1.7.0",
4
4
  "description": "This product enables users to confidentially store data–such as mail address, documents, personal information ...",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",
@@ -20,8 +20,7 @@
20
20
  "scripts": {
21
21
  "build": "rm -rf dist && tsc --project tsconfig.build.json",
22
22
  "check-types": "tsc --noEmit",
23
- "test:prepare": "node tests/scripts/prepare-bellecour-fork-for-tests.js",
24
- "test": "NODE_OPTIONS=--experimental-vm-modules jest --testMatch \"**/tests/**/*.test.ts\" --forceExit -b",
23
+ "test:prepare": "node tests/scripts/prepare-bellecour-fork-for-tests.js && node tests/scripts/prepare-iexec.js",
25
24
  "test:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --testMatch \"**/tests/**/*.test.ts\" --forceExit --coverage",
26
25
  "test:unit": "NODE_OPTIONS=--experimental-vm-modules jest --testMatch \"**/tests/unit/**/*.test.ts\" -b",
27
26
  "test:unit:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --testMatch \"**/tests/unit/**/*.unit.ts\" --coverage",
@@ -31,7 +30,7 @@
31
30
  "format": "prettier --write \"(src|tests)/**/*.ts\"",
32
31
  "check-format": "prettier --check \"(src|tests)/**/*.ts\"",
33
32
  "stop-test-stack": "cd tests && docker compose down --volumes --remove-orphans",
34
- "start-test-stack": "cd tests && npm run stop-test-stack && node scripts/prepare-test-env.js && docker compose build && docker compose up -d && node scripts/prepare-bellecour-fork-for-tests.js"
33
+ "start-test-stack": "cd tests && npm run stop-test-stack && node scripts/prepare-test-env.js && docker compose build && docker compose up -d && npm run test:prepare"
35
34
  },
36
35
  "repository": {
37
36
  "type": "git",
@@ -86,9 +86,8 @@ export const getValidContact = async (
86
86
  grantedAccess: contact.grantedAccess,
87
87
  };
88
88
  }
89
- return null;
90
89
  })
91
- .filter((contact) => contact !== null && contact !== undefined);
90
+ .filter((contact) => !!contact);
92
91
  } catch (error) {
93
92
  throw new WorkflowError({
94
93
  message: 'Failed to fetch subgraph',