@idos-network/client 1.2.0 → 2.2.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.
package/dist/index.js CHANGED
@@ -1,465 +1,2 @@
1
- import { buildInsertableIDOSCredential, matchLevelOrHigher, recordFilter } from "@idos-network/credentials/utils";
2
- import { createClientKwilSigner, createWebKwilClient, signNearMessage } from "@idos-network/kwil-infra";
3
- import { addAttribute, addWallet, addWallets, dagMessage, dwgMessage, getAccessGrantsGrantedCount, getAccessGrantsOwned, getAttributes, getCredentialOwned, getCredentialShared, getCredentials, getGrants, getUser, getWallets, hasProfile, removeCredential, removeWallet, revokeAccessGrant, shareCredential } from "@idos-network/kwil-infra/actions";
4
- import { base64Decode, base64Encode, hexEncodeSha256Hash, utf8Decode, utf8Encode } from "@idos-network/utils/codecs";
5
- import { LocalStorageStore } from "@idos-network/utils/store";
6
- import invariant from "tiny-invariant";
7
- import { BaseProvider } from "@idos-network/enclave";
8
- //#region src/enclave/iframe-enclave.ts
9
- var IframeEnclave = class extends BaseProvider {
10
- container;
11
- iframe;
12
- hostUrl;
13
- bound = false;
14
- constructor(options) {
15
- super(options);
16
- if (!this.options.container) throw new Error("container is required");
17
- this.container = this.options.container;
18
- this.hostUrl = new URL(this.options.url ?? "https://enclave.idos.network");
19
- this.iframe = document.createElement("iframe");
20
- this.iframe.id = "idos-enclave-iframe";
21
- }
22
- /** @see parent method */
23
- async load() {
24
- await this.createAndLoadIframe();
25
- await this.requestToEnclave("load");
26
- await this.reconfigure();
27
- await this.bindMessageListener();
28
- }
29
- /** @override parent method to call iframe */
30
- async reset() {
31
- this.requestToEnclave("reset");
32
- }
33
- /** @override parent method to call iframe */
34
- async reconfigure(options = {}) {
35
- super.reconfigure(options);
36
- await this.requestToEnclave("reconfigure", this.options);
37
- }
38
- /** @override parent method to call iframe */
39
- async confirm(message) {
40
- this.showEnclave();
41
- try {
42
- return await this.requestToEnclave("confirm", message);
43
- } catch (error) {
44
- console.error(error);
45
- return false;
46
- } finally {
47
- this.hideEnclave();
48
- }
49
- }
50
- /** @override parent method to call iframe */
51
- async filterCredentials(credentials, privateFieldFilters) {
52
- return await this.requestToEnclave("filterCredentials", credentials, privateFieldFilters);
53
- }
54
- /** @override parent method to call iframe */
55
- async encrypt(message, receiverPublicKey) {
56
- return this.requestToEnclave("encrypt", message, receiverPublicKey);
57
- }
58
- /** @override parent method to call iframe */
59
- async decrypt(message, senderPublicKey) {
60
- return this.requestToEnclave("decrypt", message, senderPublicKey);
61
- }
62
- /** @override parent method to call iframe */
63
- async backupUserEncryptionProfile() {
64
- this.showEnclave();
65
- try {
66
- await this.requestToEnclave("backupUserEncryptionProfile");
67
- } catch (error) {
68
- console.error(error);
69
- } finally {
70
- this.hideEnclave();
71
- }
72
- }
73
- /** @override parent method to call iframe */
74
- async ensureUserEncryptionProfile() {
75
- this.showEnclave();
76
- try {
77
- return await this.requestToEnclave("ensureUserEncryptionProfile");
78
- } finally {
79
- this.hideEnclave();
80
- }
81
- }
82
- async addAddressMessageToSign(address, publicKey, addressToAddType) {
83
- return this.requestToEnclave("addAddressMessageToSign", address, publicKey, addressToAddType);
84
- }
85
- async removeAddressMessageToSign(address, publicKey, addressToRemoveType) {
86
- return this.requestToEnclave("removeAddressMessageToSign", address, publicKey, addressToRemoveType);
87
- }
88
- async addAddressToMpcSecret(userId, message, signature) {
89
- return this.requestToEnclave("addAddressToMpcSecret", userId, message, signature);
90
- }
91
- async removeAddressFromMpcSecret(userId, message, signature) {
92
- return this.requestToEnclave("removeAddressFromMpcSecret", userId, message, signature);
93
- }
94
- async createAndLoadIframe() {
95
- const container = document.querySelector(this.container);
96
- if (!container) throw new Error(`Can't find container with selector ${this.container}`);
97
- const permissionsPolicies = ["publickey-credentials-get", "storage-access"];
98
- const liftedSandboxRestrictions = [
99
- "forms",
100
- "modals",
101
- "popups",
102
- "popups-to-escape-sandbox",
103
- "same-origin",
104
- "scripts"
105
- ].map((toLift) => `allow-${toLift}`);
106
- const referrerPolicy = "origin";
107
- const styles = {
108
- "aspect-ratio": "4/1",
109
- "background-color": "transparent",
110
- border: "none",
111
- display: "block",
112
- overflow: "hidden",
113
- width: "100%"
114
- };
115
- this.iframe.allow = permissionsPolicies.join("; ");
116
- this.iframe.referrerPolicy = referrerPolicy;
117
- this.iframe.sandbox.add(...liftedSandboxRestrictions);
118
- this.iframe.src = this.hostUrl.toString();
119
- for (const [k, v] of Object.entries(styles)) this.iframe.style.setProperty(k, v);
120
- let el;
121
- while (el = document.getElementById(this.iframe.id)) {
122
- console.log("reinstalling idOS iframe...");
123
- container.removeChild(el);
124
- }
125
- container.appendChild(this.iframe);
126
- return new Promise((resolve) => this.iframe.addEventListener("load", () => {
127
- resolve();
128
- }, { once: true }));
129
- }
130
- showEnclave() {
131
- this.iframe.parentElement.classList.add("visible");
132
- }
133
- hideEnclave() {
134
- this.iframe.parentElement.classList.remove("visible");
135
- }
136
- async requestToEnclave(method, ...args) {
137
- return new Promise((resolve, reject) => {
138
- const { port1, port2 } = new MessageChannel();
139
- port1.onmessage = ({ data }) => {
140
- port1.close();
141
- data.error ? reject(data.error) : resolve(data.result);
142
- };
143
- this.iframe.contentWindow.postMessage({
144
- method,
145
- data: args
146
- }, this.hostUrl.origin, [port2]);
147
- });
148
- }
149
- bindMessageListener() {
150
- if (!this.bound) window.addEventListener("message", this.onMessage.bind(this));
151
- this.bound = true;
152
- }
153
- async onMessage(message) {
154
- if (!message || !message.data || typeof message.data !== "object") return;
155
- if (message.data.type !== "idOS:signTypedData" || message.origin !== this.hostUrl.origin) return;
156
- const payload = message.data.payload;
157
- const signature = await this.signTypedData(payload.domain, payload.types, payload.value);
158
- await this.requestToEnclave("signTypedDataResponse", signature);
159
- }
160
- };
161
- //#endregion
162
- //#region src/index.ts
163
- var idOSClientConfiguration = class {
164
- state;
165
- chainId;
166
- nodeUrl;
167
- enclaveOptions;
168
- store;
169
- enclaveProvider;
170
- constructor(params) {
171
- this.state = "configuration";
172
- this.chainId = params.chainId;
173
- this.nodeUrl = params.nodeUrl;
174
- this.enclaveOptions = params.enclaveOptions;
175
- this.store = params.store ?? new LocalStorageStore();
176
- if (params.enclaveProvider) this.enclaveProvider = new params.enclaveProvider({
177
- ...params.enclaveOptions,
178
- store: this.store
179
- });
180
- else this.enclaveProvider = new IframeEnclave(params.enclaveOptions);
181
- }
182
- async createClient() {
183
- return idOSClientIdle.fromConfig(this);
184
- }
185
- };
186
- var idOSClientIdle = class idOSClientIdle {
187
- state;
188
- store;
189
- kwilClient;
190
- enclaveProvider;
191
- constructor(store, kwilClient, enclaveProvider) {
192
- this.state = "idle";
193
- this.store = store;
194
- this.kwilClient = kwilClient;
195
- this.enclaveProvider = enclaveProvider;
196
- }
197
- static async fromConfig(params) {
198
- const kwilClient = await createWebKwilClient({
199
- nodeUrl: params.nodeUrl,
200
- chainId: params.chainId
201
- });
202
- await params.enclaveProvider.load();
203
- return new idOSClientIdle(params.store, kwilClient, params.enclaveProvider);
204
- }
205
- async addressHasProfile(address) {
206
- return hasProfile(this.kwilClient, { address }).then((res) => res.has_profile);
207
- }
208
- async withUserSigner(_signer) {
209
- let signer = _signer;
210
- const [kwilSigner, walletIdentifier, walletPublicKey, walletType] = await createClientKwilSigner(this.store, this.kwilClient, signer);
211
- this.kwilClient.setSigner(kwilSigner);
212
- if (walletType === "NEAR") {
213
- const originalSigner = signer;
214
- signer = { signMessage: async (message) => {
215
- return { signedMessage: await signNearMessage(originalSigner, message) };
216
- } };
217
- }
218
- return new idOSClientWithUserSigner(this, signer, kwilSigner, walletIdentifier, walletPublicKey, walletType);
219
- }
220
- async logOut() {
221
- return this;
222
- }
223
- };
224
- var idOSClientWithUserSigner = class {
225
- state;
226
- store;
227
- kwilClient;
228
- enclaveProvider;
229
- signer;
230
- kwilSigner;
231
- walletIdentifier;
232
- walletPublicKey;
233
- walletType;
234
- constructor(idOSClientIdle, signer, kwilSigner, walletIdentifier, walletPublicKey, walletType) {
235
- this.state = "with-user-signer";
236
- this.store = idOSClientIdle.store;
237
- this.kwilClient = idOSClientIdle.kwilClient;
238
- this.enclaveProvider = idOSClientIdle.enclaveProvider;
239
- this.signer = signer;
240
- this.kwilSigner = kwilSigner;
241
- this.walletIdentifier = walletIdentifier;
242
- this.walletPublicKey = walletPublicKey;
243
- this.walletType = walletType;
244
- this.enclaveProvider.setSigner(this.signer);
245
- }
246
- async logOut() {
247
- this.kwilClient.setSigner(void 0);
248
- return new idOSClientIdle(this.store, this.kwilClient, this.enclaveProvider);
249
- }
250
- async hasProfile() {
251
- return hasProfile(this.kwilClient, { address: this.walletIdentifier }).then((x) => x.has_profile);
252
- }
253
- async createUserEncryptionProfile(userId, forceEncryptionPasswordStore) {
254
- await this.enclaveProvider.reconfigure({
255
- mode: "new",
256
- userId,
257
- walletAddress: this.walletIdentifier,
258
- walletPublicKey: this.walletPublicKey,
259
- walletType: this.walletType,
260
- encryptionPasswordStore: forceEncryptionPasswordStore,
261
- expectedUserEncryptionPublicKey: void 0
262
- });
263
- return this.enclaveProvider.ensureUserEncryptionProfile();
264
- }
265
- async logIn() {
266
- if (!await this.hasProfile()) throw new Error("User does not have a profile");
267
- const kwilUser = await getUser(this.kwilClient);
268
- await this.enclaveProvider.reconfigure({
269
- mode: "existing",
270
- userId: kwilUser.id,
271
- expectedUserEncryptionPublicKey: kwilUser.recipient_encryption_public_key,
272
- walletAddress: this.walletIdentifier,
273
- walletType: this.walletType,
274
- encryptionPasswordStore: kwilUser.encryption_password_store,
275
- walletPublicKey: this.walletPublicKey
276
- });
277
- return new idOSClientLoggedIn(this, kwilUser);
278
- }
279
- };
280
- var idOSClientLoggedIn = class {
281
- state;
282
- store;
283
- kwilClient;
284
- enclaveProvider;
285
- signer;
286
- kwilSigner;
287
- walletIdentifier;
288
- walletPublicKey;
289
- walletType;
290
- user;
291
- constructor(idOSClientWithUserSigner, user) {
292
- this.state = "logged-in";
293
- this.store = idOSClientWithUserSigner.store;
294
- this.kwilClient = idOSClientWithUserSigner.kwilClient;
295
- this.enclaveProvider = idOSClientWithUserSigner.enclaveProvider;
296
- this.signer = idOSClientWithUserSigner.signer;
297
- this.kwilSigner = idOSClientWithUserSigner.kwilSigner;
298
- this.walletIdentifier = idOSClientWithUserSigner.walletIdentifier;
299
- this.walletPublicKey = idOSClientWithUserSigner.walletPublicKey;
300
- this.walletType = idOSClientWithUserSigner.walletType;
301
- this.user = user;
302
- }
303
- async logOut() {
304
- this.kwilClient.setSigner(void 0);
305
- return new idOSClientIdle(this.store, this.kwilClient, this.enclaveProvider);
306
- }
307
- async requestDWGMessage(params) {
308
- return dwgMessage(this.kwilClient, params).then((res) => res.message);
309
- }
310
- async removeCredential(id) {
311
- await removeCredential(this.kwilClient, { id });
312
- return { id };
313
- }
314
- async getCredentialById(id) {
315
- return getCredentialOwned(this.kwilClient, { id }).then((res) => res[0]);
316
- }
317
- async shareCredential(credential) {
318
- await shareCredential(this.kwilClient, credential);
319
- return credential;
320
- }
321
- async getAllCredentials() {
322
- return getCredentials(this.kwilClient);
323
- }
324
- async getAccessGrantsOwned() {
325
- return getAccessGrantsOwned(this.kwilClient);
326
- }
327
- async getAttributes() {
328
- return getAttributes(this.kwilClient);
329
- }
330
- async createAttribute(attribute) {
331
- await addAttribute(this.kwilClient, attribute);
332
- return attribute;
333
- }
334
- async getCredentialContentSha256Hash(id) {
335
- const credential = await this.getCredentialById(id);
336
- invariant(credential, `"idOSCredential" with id ${id} not found`);
337
- await this.enclaveProvider.ensureUserEncryptionProfile();
338
- return hexEncodeSha256Hash(await this.enclaveProvider.decrypt(base64Decode(credential.content), base64Decode(credential.encryptor_public_key)));
339
- }
340
- async getCredentialContent(id) {
341
- const credential = await this.getCredentialById(id);
342
- invariant(credential, `"idOSCredential" with id ${id} not found`);
343
- await this.enclaveProvider.ensureUserEncryptionProfile();
344
- return utf8Decode(await this.enclaveProvider.decrypt(base64Decode(credential.content), base64Decode(credential.encryptor_public_key)));
345
- }
346
- async requestDAGMessage(params) {
347
- return dagMessage(this.kwilClient, params).then((res) => res.message);
348
- }
349
- async getGrants(params) {
350
- return {
351
- grants: await getGrants(this.kwilClient, params),
352
- totalCount: await this.getGrantsCount()
353
- };
354
- }
355
- async addWallets(params) {
356
- await addWallets(this.kwilClient, params);
357
- return params;
358
- }
359
- async getGrantsCount() {
360
- return getAccessGrantsGrantedCount(this.kwilClient, { user_id: null }).then((res) => res.count);
361
- }
362
- async getCredentialShared(id) {
363
- return getCredentialShared(this.kwilClient, { id }).then((res) => res[0]);
364
- }
365
- async revokeAccessGrant(id) {
366
- await revokeAccessGrant(this.kwilClient, { id });
367
- return { id };
368
- }
369
- async addWallet(params) {
370
- await addWallet(this.kwilClient, params);
371
- if (this.user.encryption_password_store !== "mpc") {
372
- console.log("MPC is not enabled or the user is not using MPC");
373
- return params;
374
- }
375
- if (!params.wallet_type) throw new Error("Wallet type is required for MPC users");
376
- const messageToSign = await this.enclaveProvider.addAddressMessageToSign(params.address, params.public_key ?? void 0, params.wallet_type);
377
- const signature = await this.enclaveProvider.signTypedData(messageToSign.domain, messageToSign.types, messageToSign.value);
378
- const result = await this.enclaveProvider.addAddressToMpcSecret(this.user.id, messageToSign.value, signature);
379
- if (result !== "success") console.error(`Failed to add wallet to MPC: ${result}`);
380
- return params;
381
- }
382
- async getWallets() {
383
- return getWallets(this.kwilClient);
384
- }
385
- async removeWallet(id) {
386
- const wallet = (await this.getWallets()).find((wallet) => wallet.id === id);
387
- if (!wallet) throw new Error(`Wallet with id ${id} not found`);
388
- await removeWallet(this.kwilClient, { id });
389
- if (this.user.encryption_password_store !== "mpc") {
390
- console.log("MPC is not enabled or the user is not using MPC");
391
- return { id };
392
- }
393
- const messageToSign = await this.enclaveProvider.removeAddressMessageToSign(wallet.address, wallet.public_key ?? void 0, wallet.wallet_type);
394
- const signature = await this.enclaveProvider.signTypedData(messageToSign.domain, messageToSign.types, messageToSign.value);
395
- const result = await this.enclaveProvider.removeAddressFromMpcSecret(wallet.user_id, messageToSign.value, signature);
396
- if (result !== "success") console.error(`Failed to add wallet to MPC: ${result}`);
397
- return { id };
398
- }
399
- async removeWallets(ids) {
400
- for (const id of ids) await this.removeWallet(id);
401
- return ids;
402
- }
403
- async filterCredentials(requirements) {
404
- let result = (await this.getAllCredentials()).filter((cred) => !cred.original_id && !!cred.public_notes).filter((cred) => {
405
- return requirements.acceptedIssuers?.some((issuer) => issuer.authPublicKey === cred.issuer_auth_public_key);
406
- });
407
- const publicNotesFieldFilters = requirements.publicNotesFieldFilters;
408
- const credentialLevelOrHigherFilter = requirements.credentialLevelOrHigherFilter;
409
- const privateFieldFilters = requirements.privateFieldFilters;
410
- if (credentialLevelOrHigherFilter) result = result.filter((credential) => {
411
- let publicNotes;
412
- try {
413
- publicNotes = JSON.parse(credential.public_notes);
414
- } catch (_) {
415
- throw new Error(`Credential ${credential.id} has non-JSON public notes.`);
416
- }
417
- return matchLevelOrHigher(credentialLevelOrHigherFilter.userLevel, credentialLevelOrHigherFilter.requiredAddons, publicNotes.level);
418
- });
419
- if (publicNotesFieldFilters && (Object.keys(publicNotesFieldFilters.pick).length > 0 || Object.keys(publicNotesFieldFilters.omit).length > 0)) result = result.filter((credential) => {
420
- let publicNotes;
421
- try {
422
- publicNotes = JSON.parse(credential.public_notes);
423
- } catch (_) {
424
- throw new Error(`Credential ${credential.id} has non-JSON public notes.`);
425
- }
426
- return recordFilter(publicNotes, publicNotesFieldFilters.pick, publicNotesFieldFilters.omit);
427
- });
428
- if (privateFieldFilters && (Object.keys(privateFieldFilters.pick).length > 0 || Object.keys(privateFieldFilters.omit).length > 0)) {
429
- const fullCredentials = await Promise.all(result.map((credential) => this.getCredentialById(credential.id)));
430
- invariant(fullCredentials.every((cred) => cred !== void 0), "Some credentials could not be fetched in full form for private field filtering");
431
- const matches = await this.enclaveProvider.filterCredentials(fullCredentials, privateFieldFilters);
432
- result = result.filter((credential) => matches.some((matchedCredential) => matchedCredential.id === credential.id));
433
- }
434
- return result;
435
- }
436
- async requestAccessGrant(credentialId, { consumerEncryptionPublicKey, consumerAuthPublicKey, lockedUntil = 0 }) {
437
- const credential = await this.getCredentialById(credentialId);
438
- const contentHash = await this.getCredentialContentSha256Hash(credentialId);
439
- invariant(credential, `"idOSCredential" with id ${credentialId} not found`);
440
- const plaintextContent = utf8Decode(await this.enclaveProvider.decrypt(base64Decode(credential.content), base64Decode(credential.encryptor_public_key)));
441
- await this.enclaveProvider.ensureUserEncryptionProfile();
442
- const { content, encryptorPublicKey } = await this.enclaveProvider.encrypt(utf8Encode(plaintextContent), base64Decode(consumerEncryptionPublicKey));
443
- const insertableCredential = {
444
- ...credential,
445
- ...buildInsertableIDOSCredential(credential.user_id, "", base64Encode(content), base64Encode(encryptorPublicKey)),
446
- original_credential_id: credential.id,
447
- id: crypto.randomUUID(),
448
- grantee_wallet_identifier: consumerAuthPublicKey,
449
- locked_until: lockedUntil,
450
- content_hash: contentHash
451
- };
452
- await this.shareCredential(insertableCredential);
453
- return insertableCredential;
454
- }
455
- };
456
- function createIDOSClient(params) {
457
- return new idOSClientConfiguration({
458
- nodeUrl: params.nodeUrl,
459
- enclaveOptions: params.enclaveOptions
460
- });
461
- }
462
- //#endregion
463
- export { IframeEnclave, createIDOSClient, idOSClientConfiguration, idOSClientIdle, idOSClientLoggedIn, idOSClientWithUserSigner, signNearMessage };
464
-
1
+ import{buildEphemeralSignedCredentialContentReference as e,buildPreliminaryIDOSCredential as t,mapPreliminaryToIDOSCredential as n,matchLevelOrHigher as r,recordFilter as i}from"@idos-network/credentials/utils";import{createClientKwilSigner as a,createKgwAuthenticatedBlobGateway as o,createNodeKwilClient as s,createWebKwilClient as c,isMmTokenAuth as l,mmTokenCredentialContentUri as u,signNearMessage as d}from"@idos-network/kwil-infra";import{addAttribute as f,addWallet as p,addWalletMessage as m,addWallets as h,createPreliminaryCredential as g,dwgMessage as _,getAccessGrantsGrantedCount as v,getAccessGrantsOwned as y,getAttributes as b,getCredentialOwned as x,getCredentialShared as S,getCredentials as C,getGrants as w,getUser as T,getWallets as E,hasProfile as D,removeCredential as O,removeWallet as k,revokeAccessGrant as A,sharePreliminaryCredential as j,toDelegatedWriteGrantBaseParams as ee}from"@idos-network/kwil-infra/actions";import{NodeKwil as te}from"@idos-network/kwil-js";import{BlobGateway as M,createBlobContentReference as N,requireAccessTokenForUkycContent as P,resolveCredentialEncryptedContent as F}from"@idos-network/utils/blob-gateway";import{base64Decode as I,base64Encode as L,hexEncodeSha256Hash as R,utf8Decode as z}from"@idos-network/utils/codecs";import{LocalStorageStore as B,MemoryStore as V}from"@idos-network/utils/store";import H from"tiny-invariant";import{BaseProvider as U}from"@idos-network/enclave";var W=class extends U{container;iframe;hostUrl;bound=!1;constructor(e){if(super(e),!this.options.container)throw Error(`container is required`);this.container=this.options.container,this.hostUrl=new URL(this.options.url??`https://enclave.idos.network`),this.iframe=document.createElement(`iframe`),this.iframe.id=`idos-enclave-iframe`}async load(){await this.createAndLoadIframe(),await this.requestToEnclave(`load`),await this.reconfigure(),await this.bindMessageListener()}async reset(){throw Error(`Embedding pages cannot reset enclave storage`)}async reconfigure(e={}){super.reconfigure(e),await this.requestToEnclave(`reconfigure`,this.options)}async confirm(e){this.showEnclave();try{return await this.requestToEnclave(`confirm`,e)}catch(e){return console.error(e),!1}finally{this.hideEnclave()}}async filterCredentials(e,t){return await this.requestToEnclave(`filterCredentials`,e,t)}async encrypt(e,t){return this.requestToEnclave(`encrypt`,e,t)}async decrypt(e,t){return this.requestToEnclave(`decrypt`,e,t)}async backupUserEncryptionProfile(){this.showEnclave();try{await this.requestToEnclave(`backupUserEncryptionProfile`)}catch(e){console.error(e)}finally{this.hideEnclave()}}async ensureUserEncryptionProfile(){this.showEnclave();try{return await this.requestToEnclave(`ensureUserEncryptionProfile`)}finally{this.hideEnclave()}}async addAddressMessageToSign(e,t,n){return this.requestToEnclave(`addAddressMessageToSign`,e,t,n)}async removeAddressMessageToSign(e,t,n){return this.requestToEnclave(`removeAddressMessageToSign`,e,t,n)}async addAddressToMpcSecret(e,t,n){return this.requestToEnclave(`addAddressToMpcSecret`,e,t,n)}async removeAddressFromMpcSecret(e,t,n){return this.requestToEnclave(`removeAddressFromMpcSecret`,e,t,n)}async createAndLoadIframe(){let e=document.querySelector(this.container);if(!e)throw Error(`Can't find container with selector ${this.container}`);let t=[`publickey-credentials-get`,`storage-access`],n=[`forms`,`modals`,`popups`,`popups-to-escape-sandbox`,`same-origin`,`scripts`].map(e=>`allow-${e}`),r={"aspect-ratio":`4/1`,"background-color":`transparent`,border:`none`,display:`block`,overflow:`hidden`,width:`100%`};this.iframe.allow=t.join(`; `),this.iframe.referrerPolicy=`origin`,this.iframe.sandbox.add(...n),this.iframe.src=this.hostUrl.toString();for(let[e,t]of Object.entries(r))this.iframe.style.setProperty(e,t);let i;for(;i=document.getElementById(this.iframe.id);)console.log(`reinstalling idOS iframe...`),e.removeChild(i);return e.appendChild(this.iframe),new Promise(e=>this.iframe.addEventListener(`load`,()=>{e()},{once:!0}))}showEnclave(){this.iframe.parentElement.classList.add(`visible`)}hideEnclave(){this.iframe.parentElement.classList.remove(`visible`)}async requestToEnclave(e,...t){return new Promise((n,r)=>{let{port1:i,port2:a}=new MessageChannel;i.onmessage=({data:e})=>{i.close(),e.error?r(e.error):n(e.result)},this.iframe.contentWindow.postMessage({method:e,data:t},this.hostUrl.origin,[a])})}bindMessageListener(){this.bound||window.addEventListener(`message`,this.onMessage.bind(this)),this.bound=!0}async onMessage(e){if(!e||!e.data||typeof e.data!=`object`||e.data.type!==`idOS:signTypedData`||e.origin!==this.hostUrl.origin)return;let t=e.data.payload,n=await this.signTypedData(t.domain,t.types,t.value);await this.requestToEnclave(`signTypedDataResponse`,n)}};function G(){return typeof window<`u`}function K(e){return e.client instanceof te}function q(e){return G()?new M({url:e,fetchFn:(e,t)=>fetch(e,{...t,credentials:`include`})}):new M({url:e})}function J(e,t){return K(e.kwilClient)?o({url:e.blobGateway.url,kwilClient:e.kwilClient,signer:t}):l(t)?e.blobGateway.withAccessToken(t.accessToken):e.blobGateway}function Y(e,t,n){if(e===`MM`)return u(t,n)}var X=class{state;chainId;nodeUrl;blobGatewayUrl;enclaveOptions;store;enclaveProvider;constructor(e){this.state=`configuration`,this.chainId=e.chainId,this.nodeUrl=e.nodeUrl,this.blobGatewayUrl=e.blobGatewayUrl,this.enclaveOptions=e.enclaveOptions,this.store=e.store??(G()?new B:new V),this.enclaveProvider=e.enclaveProvider?new e.enclaveProvider({...e.enclaveOptions,store:this.store}):new W(e.enclaveOptions)}async createClient(){return Z.fromConfig(this)}},Z=class e{state;store;kwilClient;enclaveProvider;blobGateway;constructor(e,t,n,r){this.state=`idle`,this.store=e,this.kwilClient=t,this.enclaveProvider=n,this.blobGateway=r}static async fromConfig(t){let n=await(G()?c:s)({nodeUrl:t.nodeUrl,chainId:t.chainId});await t.enclaveProvider.load();let r=t.blobGatewayUrl??t.nodeUrl;return new e(t.store,n,t.enclaveProvider,q(r))}async addressHasProfile(e){return D(this.kwilClient,{address:e}).then(e=>e.has_profile)}async withUserSigner(e){let t=e,[n,r,i,o]=await a(this.store,this.kwilClient,t);if(this.kwilClient.setSigner(n),o===`NEAR`){let e=t;t={signMessage:async t=>({signedMessage:await d(e,t)})}}return new Q(this,t,n,r,i,o,J(this,n))}async logOut(){return this}},Q=class{state;store;kwilClient;enclaveProvider;signer;kwilSigner;walletIdentifier;walletPublicKey;walletType;blobGateway;constructor(e,t,n,r,i,a,o){this.state=`with-user-signer`,this.store=e.store,this.kwilClient=e.kwilClient,this.enclaveProvider=e.enclaveProvider,this.signer=t,this.kwilSigner=n,this.walletIdentifier=r,this.walletPublicKey=i,this.walletType=a,this.blobGateway=o,this.enclaveProvider.setSigner(this.signer)}async logOut(){return this.kwilClient.setSigner(void 0),await this.enclaveProvider.reset(),new Z(this.store,this.kwilClient,this.enclaveProvider,q(this.blobGateway.url))}async hasProfile(){return D(this.kwilClient,{address:this.walletIdentifier}).then(e=>e.has_profile)}async createUserEncryptionProfile(e,t){return await this.enclaveProvider.reconfigure({mode:`new`,userId:e,walletAddress:this.walletIdentifier,walletPublicKey:this.walletPublicKey,walletType:this.walletType,encryptionPasswordStore:t,expectedUserEncryptionPublicKey:void 0}),this.enclaveProvider.ensureUserEncryptionProfile()}async logIn(){if(!await this.hasProfile())throw Error(`User does not have a profile`);let e=await T(this.kwilClient);return await this.enclaveProvider.reconfigure({mode:`existing`,userId:e.id,expectedUserEncryptionPublicKey:e.recipient_encryption_public_key,walletAddress:this.walletIdentifier,walletType:this.walletType,encryptionPasswordStore:e.encryption_password_store,walletPublicKey:this.walletPublicKey}),new $(this,e)}},$=class{state;store;kwilClient;enclaveProvider;signer;kwilSigner;walletIdentifier;walletPublicKey;walletType;user;blobGateway;constructor(e,t){this.state=`logged-in`,this.store=e.store,this.kwilClient=e.kwilClient,this.enclaveProvider=e.enclaveProvider,this.signer=e.signer,this.kwilSigner=e.kwilSigner,this.walletIdentifier=e.walletIdentifier,this.walletPublicKey=e.walletPublicKey,this.walletType=e.walletType,this.user=t,this.blobGateway=e.blobGateway}async logOut(){return this.kwilClient.setSigner(void 0),await this.enclaveProvider.reset(),new Z(this.store,this.kwilClient,this.enclaveProvider,q(this.blobGateway.url))}async requestDWGMessage(e){return _(this.kwilClient,e).then(e=>e.message)}async createCredential(e,r,i){let a=crypto.randomUUID(),o={...await t({publicNotes:e,plaintextContent:r,recipientEncryptionPublicKey:I(this.user.recipient_encryption_public_key),issuerSigningSecretKey:i,contentUri:Y(this.walletType,this.kwilSigner,a)}),id:a};P(o.contentUri,this.blobGateway.hasAccessToken);let s=crypto.randomUUID(),c={request_id:s,credential_id:o.id,issuer_auth_public_key:o.issuerAuthPublicKey,encryptor_public_key:o.encryptorPublicKey,content_uri:o.contentUri,content_size:o.contentSize,content_hash:R(r),public_notes:o.publicNotes,public_notes_signature:o.publicNotesSignature,broader_signature:o.broaderSignature};return await g(this.kwilClient,c),await this.blobGateway.uploadCredentialBlobs({requestId:s,original:o.encryptedContent}),n(o)}async removeCredential(e){let t=await this.getCredentialById(e);H(t,`"idOSCredential" with id ${e} not found`);let n=t.content_uri??null;return P(n,this.blobGateway.hasAccessToken),await O(this.kwilClient,{id:e}),n&&await this.blobGateway.deleteCredentialBlob({credentialId:e}),{id:e}}async getCredentialById(e){return x(this.kwilClient,{id:e}).then(e=>e[0])}async shareCredential(e){return await j(this.kwilClient,e),e}async getAllCredentials(){return C(this.kwilClient)}async getAccessGrantsOwned(){return y(this.kwilClient)}async getAttributes(){return b(this.kwilClient)}async createAttribute(e){return await f(this.kwilClient,e),e}async getCredentialContentSha256Hash(e){let t=await this.getCredentialById(e);H(t,`"idOSCredential" with id ${e} not found`);let n=await this.#t(t);return R(n)}async getCredentialContent(e){let t=await this.getCredentialById(e);H(t,`"idOSCredential" with id ${e} not found`);let n=await this.#t(t);return z(n)}async getCredentialWithEncryptedContent(e){let t=await this.getCredentialById(e);return H(t,`"idOSCredential" with id ${e} not found`),this.#e(t)}async getCredentialSharedContent(e){let t=await this.getCredentialShared(e);H(t,`Shared credential with id ${e} not found`);let n=await this.#t(t);return z(n)}async getGrants(e){return{grants:await w(this.kwilClient,e),totalCount:await this.getGrantsCount()}}async addWallets(e){return await h(this.kwilClient,e),e}async getGrantsCount(){return v(this.kwilClient,{user_id:null}).then(e=>e.count)}async getCredentialShared(e){return S(this.kwilClient,{id:e}).then(e=>e[0])}async revokeAccessGrant(e){return await A(this.kwilClient,{id:e}),{id:e}}async addWalletMessage(e){return(await m(this.kwilClient,e)).message}async addWallet(e){if(await p(this.kwilClient,e),this.user.encryption_password_store!==`mpc`)return console.log(`MPC is not enabled or the user is not using MPC`),e;if(!e.wallet_type)throw Error(`Wallet type is required for MPC users`);let t=await this.enclaveProvider.addAddressMessageToSign(e.address,e.public_key??void 0,e.wallet_type),n=await this.enclaveProvider.signTypedData(t.domain,t.types,t.value),r=await this.enclaveProvider.addAddressToMpcSecret(this.user.id,t.value,n);return r!==`success`&&console.error(`Failed to add wallet to MPC: ${r}`),e}async getWallets(){return E(this.kwilClient)}async removeWallet(e){let t=(await this.getWallets()).find(t=>t.id===e);if(!t)throw Error(`Wallet with id ${e} not found`);if(await k(this.kwilClient,{id:e}),this.user.encryption_password_store!==`mpc`)return console.log(`MPC is not enabled or the user is not using MPC`),{id:e};let n=await this.enclaveProvider.removeAddressMessageToSign(t.address,t.public_key??void 0,t.wallet_type),r=await this.enclaveProvider.signTypedData(n.domain,n.types,n.value),i=await this.enclaveProvider.removeAddressFromMpcSecret(t.user_id,n.value,r);return i!==`success`&&console.error(`Failed to add wallet to MPC: ${i}`),{id:e}}async removeWallets(e){for(let t of e)await this.removeWallet(t);return e}async filterCredentials(e){let t=(await this.getAllCredentials()).filter(e=>!e.original_id&&!!e.public_notes).filter(t=>e.acceptedIssuers?.some(e=>e.authPublicKey===t.issuer_auth_public_key)),n=e.publicNotesFieldFilters,a=e.credentialLevelOrHigherFilter,o=e.privateFieldFilters;if(a&&(t=t.filter(e=>{let t;try{t=JSON.parse(e.public_notes)}catch{throw Error(`Credential ${e.id} has non-JSON public notes.`)}return r(a.userLevel,a.requiredAddons,t.level)})),n&&(Object.keys(n.pick).length>0||Object.keys(n.omit).length>0)&&(t=t.filter(e=>{let t;try{t=JSON.parse(e.public_notes)}catch{throw Error(`Credential ${e.id} has non-JSON public notes.`)}return i(t,n.pick,n.omit)})),o&&(Object.keys(o.pick).length>0||Object.keys(o.omit).length>0)){let e=await Promise.all(t.map(e=>this.getCredentialById(e.id)));H(e.every(e=>e!==void 0),`Some credentials could not be fetched in full form for private field filtering`);let n=await this.enclaveProvider.filterCredentials(await Promise.all(e.map(e=>this.#e(e))),o);t=t.filter(e=>n.some(t=>t.id===e.id))}return t}async requestAccessGrant(t,{consumerEncryptionPublicKey:n,consumerAuthPublicKey:r,lockedUntil:i=0}){let a=await this.getCredentialById(t);H(a,`"idOSCredential" with id ${t} not found`);let o=await this.#t(a),s=R(o);await this.enclaveProvider.ensureUserEncryptionProfile();let{content:c,encryptorPublicKey:l}=await this.enclaveProvider.encrypt(o,I(n)),u=crypto.randomUUID(),d=Y(this.walletType,this.kwilSigner,u);P(d,this.blobGateway.hasAccessToken);let f=d?{uri:d,size:c.byteLength}:await N(c),p=e(``,f.uri),m=/^[0-9a-fA-F]{64}$/.test(r)?r.toLowerCase():r,h={...p,request_id:crypto.randomUUID(),copy_id:u,original_id:a.id,content_uri:f.uri,content_size:f.size,encryptor_public_key:L(l),grantee_wallet_identifier:m,locked_until:i,content_hash:s};return await this.shareCredential(h),await this.blobGateway.uploadCredentialBlobs({requestId:h.request_id,copy:c}),h}async#e(e){return e.content?e:{...e,content:L(await this.#n(e)),content_uri:null,content_size:null}}async#t(e){return await this.enclaveProvider.ensureUserEncryptionProfile(),this.enclaveProvider.decrypt(await this.#n(e),I(e.encryptor_public_key))}async#n(e){return F(e,this.blobGateway)}};function ne(e){return new X({nodeUrl:e.nodeUrl,blobGatewayUrl:e.blobGatewayUrl,enclaveOptions:e.enclaveOptions})}export{W as IframeEnclave,ne as createIDOSClient,X as idOSClientConfiguration,Z as idOSClientIdle,$ as idOSClientLoggedIn,Q as idOSClientWithUserSigner,d as signNearMessage,ee as toDelegatedWriteGrantBaseParams};
465
2
  //# sourceMappingURL=index.js.map