@mocanetwork/airkit 1.0.0 → 1.1.0-beta.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.
@@ -104,6 +104,8 @@ const AirAuthMessageTypes = {
104
104
  LOGIN_REQUEST: "air_auth_login_request",
105
105
  LOGIN_RESPONSE: "air_auth_login_response",
106
106
  LOGIN_WALLET_RESPONSE: "air_auth_login_wallet_response",
107
+ USER_INFO_REQUEST: "air_auth_user_info_request",
108
+ USER_INFO_RESPONSE: "air_auth_user_info_response",
107
109
  PARTNER_USER_INFO_REQUEST: "air_auth_partner_user_info_request",
108
110
  PARTNER_USER_INFO_RESPONSE: "air_auth_partner_user_info_response",
109
111
  REFRESH_TOKEN_REQUEST: "air_auth_refresh_token_request",
@@ -116,8 +118,11 @@ const AirAuthMessageTypes = {
116
118
  SETUP_WALLET_RESPONSE: "air_auth_setup_wallet_response",
117
119
  SIGN_SIWE_MESSAGE_REQUEST: "air_auth_sign_siwe_message_request",
118
120
  SIGN_SIWE_MESSAGE_RESPONSE: "air_auth_sign_siwe_message_response",
121
+ CROSS_PARTNER_TOKEN_REQUEST: "air_auth_cross_partner_token_request",
122
+ CROSS_PARTNER_TOKEN_RESPONSE: "air_auth_cross_partner_token_response",
119
123
  LOGOUT_REQUEST: "air_auth_logout_request",
120
- LOGOUT_RESPONSE: "air_auth_logout_response"
124
+ LOGOUT_RESPONSE: "air_auth_logout_response",
125
+ RESET_WALLET_COMMUNICATION: "air_auth_reset_wallet_communication"
121
126
  };
122
127
 
123
128
  const AirMessageTypes = {
@@ -140,9 +145,156 @@ const AirMessageTypes = {
140
145
  IS_SMART_ACCOUNT_DEPLOYED_REQUEST: "air_is_smart_account_deployed_request",
141
146
  IS_SMART_ACCOUNT_DEPLOYED_RESPONSE: "air_is_smart_account_deployed_response",
142
147
  LOGOUT_REQUEST: "air_logout_request",
143
- LOGOUT_RESPONSE: "air_logout_response"
148
+ LOGOUT_RESPONSE: "air_logout_response",
149
+ SETUP_MFA_REQUEST: "air_setup_mfa_request"
144
150
  };
145
151
 
152
+ class BaseError extends Error {
153
+ constructor(name, message, options = {}) {
154
+ const {
155
+ cause,
156
+ context
157
+ } = options;
158
+ super(message || name);
159
+ this.name = name;
160
+ this.stack = cause?.stack;
161
+ this.cause = cause;
162
+ this.context = context;
163
+ }
164
+ toJSON() {
165
+ return {
166
+ name: this.name,
167
+ message: this.message,
168
+ context: this.context,
169
+ cause: this.cause
170
+ };
171
+ }
172
+ }
173
+
174
+ class AirServiceError extends BaseError {
175
+ static from(error) {
176
+ if (error instanceof AirServiceError) {
177
+ return error;
178
+ }
179
+ else if (error instanceof Object && "message" in error) {
180
+ if (error.message === "User cancelled login") {
181
+ return new AirServiceError("USER_CANCELLED", error.message);
182
+ }
183
+ return new AirServiceError("UNKNOWN_ERROR", error.message.toString());
184
+ }
185
+ return new AirServiceError("UNKNOWN_ERROR");
186
+ }
187
+ }
188
+ class ProviderRpcError extends Error {
189
+ constructor(message) {
190
+ super(message);
191
+ }
192
+ }
193
+ class UserRejectedRequestError extends ProviderRpcError {
194
+ constructor() {
195
+ super(...arguments);
196
+ this.code = 4001;
197
+ this.name = "UserRejectedRequestError";
198
+ }
199
+ }
200
+ class UnauthorizedProviderError extends ProviderRpcError {
201
+ constructor() {
202
+ super(...arguments);
203
+ this.code = 4100;
204
+ this.name = "UnauthorizedProviderError";
205
+ }
206
+ }
207
+ class UnsupportedProviderMethodError extends ProviderRpcError {
208
+ constructor() {
209
+ super(...arguments);
210
+ this.code = 4200;
211
+ this.name = "UnsupportedProviderMethodError";
212
+ }
213
+ }
214
+ class ProviderDisconnectedError extends ProviderRpcError {
215
+ constructor() {
216
+ super(...arguments);
217
+ this.code = 4900;
218
+ this.name = "ProviderDisconnectedError";
219
+ }
220
+ }
221
+ class ChainDisconnectedError extends ProviderRpcError {
222
+ constructor() {
223
+ super(...arguments);
224
+ this.code = 4901;
225
+ this.name = "ChainDisconnectedError";
226
+ }
227
+ }
228
+ class SwitchChainError extends ProviderRpcError {
229
+ constructor() {
230
+ super(...arguments);
231
+ this.code = 4902;
232
+ this.name = "SwitchChainError";
233
+ }
234
+ }
235
+ class InvalidRequestRpcError extends ProviderRpcError {
236
+ constructor() {
237
+ super(...arguments);
238
+ this.code = -32600;
239
+ this.name = "InvalidRequestRpcError";
240
+ }
241
+ }
242
+ class MethodNotFoundRpcError extends ProviderRpcError {
243
+ constructor() {
244
+ super(...arguments);
245
+ this.code = -32601;
246
+ this.name = "MethodNotFoundRpcError";
247
+ }
248
+ }
249
+ class InvalidParamsRpcError extends ProviderRpcError {
250
+ constructor() {
251
+ super(...arguments);
252
+ this.code = -32602;
253
+ this.name = "InvalidParamsRpcError";
254
+ }
255
+ }
256
+ class InternalRpcError extends ProviderRpcError {
257
+ constructor() {
258
+ super(...arguments);
259
+ this.code = -32603;
260
+ this.name = "InternalRpcError";
261
+ }
262
+ }
263
+ function ensureProviderRpcError(value) {
264
+ if (value instanceof ProviderRpcError) {
265
+ return value;
266
+ }
267
+ if (typeof value === "object" &&
268
+ value !== null &&
269
+ "errorCode" in value &&
270
+ "errorMessage" in value) {
271
+ if (typeof value.errorCode === "number" && typeof value.errorMessage === "string") {
272
+ switch (value.errorCode) {
273
+ case 4001:
274
+ return new UserRejectedRequestError(value.errorMessage);
275
+ case 4100:
276
+ return new UnauthorizedProviderError(value.errorMessage);
277
+ case 4200:
278
+ return new UnsupportedProviderMethodError(value.errorMessage);
279
+ case 4900:
280
+ return new ProviderDisconnectedError(value.errorMessage);
281
+ case 4901:
282
+ return new ChainDisconnectedError(value.errorMessage);
283
+ case 4902:
284
+ return new SwitchChainError(value.errorMessage);
285
+ }
286
+ }
287
+ }
288
+ let stringified = "[Unable to stringify the thrown value]";
289
+ try {
290
+ stringified = JSON.stringify(value);
291
+ }
292
+ catch {
293
+ // ignoring failed stringify
294
+ }
295
+ return new InternalRpcError(`Invalid value for ProviderRpcError: ${stringified}`);
296
+ }
297
+
146
298
  function isFunction(value) {
147
299
  return typeof value === 'function';
148
300
  }
@@ -870,50 +1022,11 @@ function filter(predicate, thisArg) {
870
1022
  });
871
1023
  }
872
1024
 
873
- class BaseError extends Error {
874
- constructor(name, message, options = {}) {
875
- const {
876
- cause,
877
- context
878
- } = options;
879
- super(message || name);
880
- this.name = name;
881
- this.stack = cause?.stack;
882
- this.cause = cause;
883
- this.context = context;
884
- }
885
- toJSON() {
886
- return {
887
- name: this.name,
888
- message: this.message,
889
- context: this.context,
890
- cause: this.cause
891
- };
892
- }
893
- }
894
-
895
- class AirServiceError extends BaseError {
896
- static from(error) {
897
- if (error instanceof AirServiceError) {
898
- return error;
899
- }
900
- else if (error instanceof Object && "message" in error) {
901
- if (error.message === "User cancelled login") {
902
- return new AirServiceError("USER_CANCELLED", error.message);
903
- }
904
- return new AirServiceError("UNKNOWN_ERROR", error.message.toString());
905
- }
906
- return new AirServiceError("UNKNOWN_ERROR");
907
- }
908
- }
909
- class RealmEmbedError extends AirServiceError {
910
- }
911
-
912
1025
  function getDefaultExportFromCjs (x) {
913
1026
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
914
1027
  }
915
1028
 
916
- var loglevel$2 = {exports: {}};
1029
+ var loglevel$1 = {exports: {}};
917
1030
 
918
1031
  /*
919
1032
  * loglevel - https://github.com/pimterry/loglevel
@@ -921,10 +1034,10 @@ var loglevel$2 = {exports: {}};
921
1034
  * Copyright (c) 2013 Tim Perry
922
1035
  * Licensed under the MIT license.
923
1036
  */
924
- var loglevel$1 = loglevel$2.exports;
1037
+ var loglevel = loglevel$1.exports;
925
1038
  var hasRequiredLoglevel;
926
1039
  function requireLoglevel() {
927
- if (hasRequiredLoglevel) return loglevel$2.exports;
1040
+ if (hasRequiredLoglevel) return loglevel$1.exports;
928
1041
  hasRequiredLoglevel = 1;
929
1042
  (function (module) {
930
1043
  (function (root, definition) {
@@ -934,7 +1047,7 @@ function requireLoglevel() {
934
1047
  } else {
935
1048
  root.log = definition();
936
1049
  }
937
- })(loglevel$1, function () {
1050
+ })(loglevel, function () {
938
1051
 
939
1052
  // Slightly dubious tricks to cut down minimized file size
940
1053
  var noop = function () {};
@@ -1233,19 +1346,20 @@ function requireLoglevel() {
1233
1346
  defaultLogger['default'] = defaultLogger;
1234
1347
  return defaultLogger;
1235
1348
  });
1236
- })(loglevel$2);
1237
- return loglevel$2.exports;
1349
+ })(loglevel$1);
1350
+ return loglevel$1.exports;
1238
1351
  }
1239
1352
 
1240
1353
  var loglevelExports = requireLoglevel();
1241
- var loglevel = /*@__PURE__*/getDefaultExportFromCjs(loglevelExports);
1354
+ var log$1 = /*@__PURE__*/getDefaultExportFromCjs(loglevelExports);
1242
1355
 
1243
- var log = loglevel.getLogger("airkit");
1356
+ var log = log$1.getLogger("airkit");
1244
1357
 
1245
1358
  var AirWalletProviderMessageTypes;
1246
1359
  (function (AirWalletProviderMessageTypes) {
1247
1360
  AirWalletProviderMessageTypes["REQUEST"] = "JRPC_REQUEST";
1248
1361
  AirWalletProviderMessageTypes["RESPONSE"] = "JRPC_RESPONSE";
1362
+ AirWalletProviderMessageTypes["EVENT"] = "JRPC_EVENT";
1249
1363
  })(AirWalletProviderMessageTypes || (AirWalletProviderMessageTypes = {}));
1250
1364
 
1251
1365
  const ACCOUNT_MESSAGES = [
@@ -1268,6 +1382,7 @@ const AUTH_MESSAGES = [
1268
1382
  AirAuthMessageTypes.SETUP_WALLET_REQUEST,
1269
1383
  AirAuthMessageTypes.LOGOUT_RESPONSE,
1270
1384
  AirAuthMessageTypes.PARTNER_USER_INFO_RESPONSE,
1385
+ AirAuthMessageTypes.CROSS_PARTNER_TOKEN_RESPONSE,
1271
1386
  AirAuthMessageTypes.IFRAME_VISIBILITY_REQUEST,
1272
1387
  ];
1273
1388
  class AirMessageService {
@@ -1291,6 +1406,9 @@ class AirMessageService {
1291
1406
  get providerMessage$() {
1292
1407
  return this._providerMessage$.asObservable();
1293
1408
  }
1409
+ get providerEvent$() {
1410
+ return this._providerEvent$.asObservable();
1411
+ }
1294
1412
  async openAuthObservables({ authIframeOrigin }) {
1295
1413
  this.closeAuthObservables();
1296
1414
  this.setupAuthObservables();
@@ -1331,13 +1449,16 @@ class AirMessageService {
1331
1449
  if (ev.data.type === AirWalletProviderMessageTypes.RESPONSE) {
1332
1450
  this._providerMessage$.next(ev.data);
1333
1451
  }
1452
+ if (ev.data.type === AirWalletProviderMessageTypes.EVENT) {
1453
+ this._providerEvent$.next(ev.data);
1454
+ }
1334
1455
  };
1335
1456
  window.addEventListener("message", handleWalletMessage);
1336
1457
  this.closeWalletMessageListeners = () => {
1337
1458
  window.removeEventListener("message", handleWalletMessage);
1338
1459
  };
1339
1460
  }
1340
- setupIframeCommunication(authIframe, walletIframe) {
1461
+ setupIframeCommunication(authIframe, walletIframe, skipWalletLogin) {
1341
1462
  const channel = new MessageChannel();
1342
1463
  const authOrigin = new URL(authIframe.src).origin;
1343
1464
  authIframe.contentWindow.postMessage({
@@ -1346,6 +1467,9 @@ class AirMessageService {
1346
1467
  const walletOrigin = new URL(walletIframe.src).origin;
1347
1468
  walletIframe.contentWindow.postMessage({
1348
1469
  type: AirMessageTypes.INIT_AUTH_COMMUNICATION,
1470
+ payload: {
1471
+ skipWalletLogin,
1472
+ },
1349
1473
  }, walletOrigin, [channel.port2]);
1350
1474
  }
1351
1475
  async sendGrantPermissionRequest(walletIframe, policies) {
@@ -1359,7 +1483,7 @@ class AirMessageService {
1359
1483
  }, origin);
1360
1484
  const result = await response;
1361
1485
  if (result.payload.success === false) {
1362
- throw new RealmEmbedError(result.payload.errorName, result.payload.errorMessage);
1486
+ throw new AirServiceError(result.payload.errorName, result.payload.errorMessage);
1363
1487
  }
1364
1488
  return result.payload.sessionData;
1365
1489
  }
@@ -1380,7 +1504,7 @@ class AirMessageService {
1380
1504
  }, origin);
1381
1505
  const result = await response;
1382
1506
  if (result.payload.success === false) {
1383
- throw new RealmEmbedError(result.payload.errorName, result.payload.errorMessage);
1507
+ throw new AirServiceError(result.payload.errorName, result.payload.errorMessage);
1384
1508
  }
1385
1509
  return result.payload.txHash;
1386
1510
  }
@@ -1395,7 +1519,7 @@ class AirMessageService {
1395
1519
  }, origin);
1396
1520
  const result = await response;
1397
1521
  if (result.payload.success === false) {
1398
- throw new RealmEmbedError(result.payload.errorName, result.payload.errorMessage);
1522
+ throw new AirServiceError(result.payload.errorName, result.payload.errorMessage);
1399
1523
  }
1400
1524
  return result.payload.txHash;
1401
1525
  }
@@ -1439,6 +1563,10 @@ class AirMessageService {
1439
1563
  walletIframe.contentWindow.postMessage({ type: AirMessageTypes.LOGOUT_REQUEST }, origin);
1440
1564
  return response;
1441
1565
  }
1566
+ sendResetAuthServiceWalletCommunication(authIframe) {
1567
+ const { origin: authOrigin } = new URL(authIframe.src);
1568
+ authIframe.contentWindow.postMessage({ type: AirAuthMessageTypes.RESET_WALLET_COMMUNICATION }, authOrigin);
1569
+ }
1442
1570
  async sendAuthInitializationRequest(authIframe, payload) {
1443
1571
  const response = firstValueFrom(this._authMessage$.pipe(filter((msg) => msg.type === AirAuthMessageTypes.INITIALIZATION_RESPONSE)));
1444
1572
  const { origin } = new URL(authIframe.src);
@@ -1451,6 +1579,17 @@ class AirMessageService {
1451
1579
  walletIframe.contentWindow.postMessage({ type: AirMessageTypes.INITIALIZATION_REQUEST, payload }, origin);
1452
1580
  return response;
1453
1581
  }
1582
+ async sendCrossPartnerTokenRequest(authIframe, targetPartnerUrl) {
1583
+ const response = firstValueFrom(this.authMessage$.pipe(filter((msg) => msg.type === AirAuthMessageTypes.CROSS_PARTNER_TOKEN_RESPONSE)));
1584
+ const { origin } = new URL(authIframe.src);
1585
+ authIframe.contentWindow.postMessage({
1586
+ type: AirAuthMessageTypes.CROSS_PARTNER_TOKEN_REQUEST,
1587
+ payload: {
1588
+ targetPartnerUrl,
1589
+ },
1590
+ }, origin);
1591
+ return response;
1592
+ }
1454
1593
  async sendGrantPermissionsRequest(walletIframe, payload) {
1455
1594
  const response = firstValueFrom(this.messages$.pipe(filter((msg) => msg.type === AirMessageTypes.GRANT_PERMISSIONS_RESPONSE)));
1456
1595
  const { origin } = new URL(walletIframe.src);
@@ -1491,6 +1630,8 @@ class AirMessageService {
1491
1630
  closeWalletObservables() {
1492
1631
  if (this._providerMessage$ && !this._providerMessage$.closed)
1493
1632
  this._providerMessage$.complete();
1633
+ if (this._providerEvent$ && !this._providerEvent$.closed)
1634
+ this._providerEvent$.complete();
1494
1635
  if (this.closeWalletMessageListeners)
1495
1636
  this.closeWalletMessageListeners();
1496
1637
  }
@@ -1502,38 +1643,11 @@ class AirMessageService {
1502
1643
  }
1503
1644
  setupWalletObservables() {
1504
1645
  this._providerMessage$ = new Subject();
1646
+ this._providerEvent$ = new Subject();
1505
1647
  }
1506
1648
  }
1507
1649
  var AirMessageService$1 = AirMessageService.instance;
1508
1650
 
1509
- class ProviderRpcError extends Error {
1510
- constructor(message, code, data) {
1511
- super(message);
1512
- this.code = code;
1513
- this.data = data;
1514
- }
1515
- }
1516
- new ProviderRpcError("Invalid JSON", -32700);
1517
- const ProviderRpcInvalidRequestError = new ProviderRpcError("Invalid request", -32600);
1518
- const ProviderRpcMethodNotFoundError = new ProviderRpcError("Method not found", -32601);
1519
- const ProviderRpcInvalidParamsError = new ProviderRpcError("Invalid params", -32602);
1520
- new ProviderRpcError("Internal error", -32603);
1521
- new ProviderRpcError("User rejected request", 4001);
1522
- new ProviderRpcError("Unauthorized", 4100);
1523
- new ProviderRpcError("Unsupported method", 4200);
1524
- new ProviderRpcError("Disconnected", 4900);
1525
- new ProviderRpcError("Chain Disconnected", 4901);
1526
- function ensureProviderRpcError(value) {
1527
- if (value instanceof ProviderRpcError) return value;
1528
- let stringified = "[Unable to stringify the thrown value]";
1529
- try {
1530
- stringified = JSON.stringify(value);
1531
- } catch {
1532
- // ignoring failed stringify
1533
- }
1534
- return new ProviderRpcError(`This value was not thrown as type ProviderRpcError: ${stringified}`, -32603);
1535
- }
1536
-
1537
1651
  const BUILD_ENV = {
1538
1652
  PRODUCTION: "production",
1539
1653
  STAGING: "staging",
@@ -1544,66 +1658,113 @@ const AIR_URLS = {
1544
1658
  [BUILD_ENV.DEVELOPMENT]: {
1545
1659
  authUrl: "http://localhost:8100",
1546
1660
  walletUrl: "http://localhost:8200",
1547
- legacyWalletUrl: "https://localhost:4050",
1548
1661
  logLevel: "debug",
1549
1662
  },
1550
1663
  [BUILD_ENV.STAGING]: {
1551
1664
  authUrl: "https://auth.staging.air3.com",
1552
1665
  walletUrl: "https://account.staging.air3.com",
1553
- legacyWalletUrl: "https://account.staging.realmnetwork.io",
1554
1666
  logLevel: "info",
1555
1667
  },
1556
1668
  [BUILD_ENV.PRODUCTION]: {
1557
1669
  authUrl: "https://auth.air3.com",
1558
1670
  walletUrl: "https://account.air3.com",
1559
- legacyWalletUrl: "https://account.realmnetwork.io",
1560
1671
  logLevel: "error",
1561
1672
  },
1562
1673
  };
1563
1674
  const isElement = (element) => element instanceof Element || element instanceof Document;
1564
1675
  const randomId = () => Math.random().toString(36).slice(2);
1565
1676
 
1566
- var _AirWalletProvider_walletIframe;
1677
+ var _AirWalletProvider_instances, _AirWalletProvider_isLoggedIn, _AirWalletProvider_ensureWallet, _AirWalletProvider_getWalletIframeController, _AirWalletProvider_eventListeners, _AirWalletProvider_emit;
1567
1678
  class AirWalletProvider {
1568
- constructor(walletIframe) {
1569
- _AirWalletProvider_walletIframe.set(this, undefined);
1570
- __classPrivateFieldSet(this, _AirWalletProvider_walletIframe, walletIframe, "f");
1679
+ constructor({ isLoggedIn, ensureWallet, getWalletIframeController, }) {
1680
+ _AirWalletProvider_instances.add(this);
1681
+ _AirWalletProvider_isLoggedIn.set(this, undefined);
1682
+ _AirWalletProvider_ensureWallet.set(this, undefined);
1683
+ _AirWalletProvider_getWalletIframeController.set(this, undefined);
1684
+ _AirWalletProvider_eventListeners.set(this, undefined);
1685
+ this.listenProviderEventMessage = () => {
1686
+ AirMessageService$1.providerEvent$.subscribe((message) => {
1687
+ __classPrivateFieldGet(this, _AirWalletProvider_instances, "m", _AirWalletProvider_emit).call(this, message.payload.event, ...[message.payload.data]);
1688
+ });
1689
+ };
1690
+ __classPrivateFieldSet(this, _AirWalletProvider_isLoggedIn, isLoggedIn, "f");
1691
+ __classPrivateFieldSet(this, _AirWalletProvider_ensureWallet, ensureWallet, "f");
1692
+ __classPrivateFieldSet(this, _AirWalletProvider_getWalletIframeController, getWalletIframeController, "f");
1693
+ __classPrivateFieldSet(this, _AirWalletProvider_eventListeners, {
1694
+ connect: [],
1695
+ disconnect: [],
1696
+ accountsChanged: [],
1697
+ chainChanged: [],
1698
+ message: [],
1699
+ }, "f");
1571
1700
  }
1572
1701
  async request(request) {
1573
1702
  // Check if the request is valid
1574
1703
  if (!request || typeof request !== "object" || Array.isArray(request)) {
1575
- throw ProviderRpcInvalidRequestError;
1704
+ throw new InvalidRequestRpcError("Invalid request");
1576
1705
  }
1577
1706
  const { method, params } = request;
1578
1707
  // Check if the method is valid
1579
1708
  if (typeof method !== "string" || method.length === 0) {
1580
- throw ProviderRpcMethodNotFoundError;
1709
+ throw new MethodNotFoundRpcError("Invalid method");
1581
1710
  }
1582
1711
  // Check if the params are valid
1583
1712
  if (params !== undefined &&
1584
1713
  !Array.isArray(params) &&
1585
1714
  (typeof params !== "object" || params === null)) {
1586
- throw ProviderRpcInvalidParamsError;
1715
+ throw new InvalidParamsRpcError("Invalid params");
1716
+ }
1717
+ // Check if the user is logged in
1718
+ if (!__classPrivateFieldGet(this, _AirWalletProvider_isLoggedIn, "f").call(this)) {
1719
+ throw new UnauthorizedProviderError("User is not logged in");
1720
+ }
1721
+ try {
1722
+ await __classPrivateFieldGet(this, _AirWalletProvider_ensureWallet, "f").call(this);
1723
+ }
1724
+ catch (error) {
1725
+ throw ensureProviderRpcError(error);
1587
1726
  }
1588
1727
  const requestId = randomId();
1589
- const response = await AirMessageService$1.sendWalletProviderRequest(__classPrivateFieldGet(this, _AirWalletProvider_walletIframe, "f"), {
1728
+ const response = await AirMessageService$1.sendWalletProviderRequest(__classPrivateFieldGet(this, _AirWalletProvider_getWalletIframeController, "f").call(this).iframeElement, {
1590
1729
  requestId,
1591
1730
  ...request,
1592
1731
  });
1593
1732
  if (!response.success) {
1594
- const error = ensureProviderRpcError(response.payload);
1595
- throw error;
1733
+ throw ensureProviderRpcError(response.payload);
1596
1734
  }
1597
1735
  return response.payload.response;
1598
1736
  }
1599
1737
  on(eventName, listener) {
1600
- console.log("on", eventName, listener);
1738
+ __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName] = __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName] || [];
1739
+ __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName].push(listener);
1601
1740
  }
1602
1741
  removeListener(eventName, listener) {
1603
- console.log("removeListener", eventName, listener);
1742
+ __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName] = __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName] || [];
1743
+ const index = __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName].indexOf(listener);
1744
+ if (index >= 0) {
1745
+ __classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName].splice(index, 1);
1746
+ }
1747
+ }
1748
+ removeAllListeners() {
1749
+ __classPrivateFieldSet(this, _AirWalletProvider_eventListeners, {
1750
+ connect: [],
1751
+ disconnect: [],
1752
+ accountsChanged: [],
1753
+ chainChanged: [],
1754
+ message: [],
1755
+ }, "f");
1604
1756
  }
1605
1757
  }
1606
- _AirWalletProvider_walletIframe = new WeakMap();
1758
+ _AirWalletProvider_isLoggedIn = new WeakMap(), _AirWalletProvider_ensureWallet = new WeakMap(), _AirWalletProvider_getWalletIframeController = new WeakMap(), _AirWalletProvider_eventListeners = new WeakMap(), _AirWalletProvider_instances = new WeakSet(), _AirWalletProvider_emit = function _AirWalletProvider_emit(eventName, ...args) {
1759
+ (__classPrivateFieldGet(this, _AirWalletProvider_eventListeners, "f")[eventName] || []).forEach((listener) => {
1760
+ try {
1761
+ return listener(...args);
1762
+ }
1763
+ catch (error) {
1764
+ log$1.error(error);
1765
+ }
1766
+ });
1767
+ };
1607
1768
 
1608
1769
  class IframeController {
1609
1770
  constructor(iframeUrl, iframeId, state) {
@@ -1668,9 +1829,8 @@ IframeController.defaultState = {
1668
1829
  isVisible: false,
1669
1830
  };
1670
1831
 
1671
- var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _AirService_isWalletInitialized, _AirService_airWalletProvider, _AirService_ensureWallet, _AirService_initializeWallet, _AirService_triggerEventListeners, _AirService_triggerAirAuthInitialized, _AirService_triggerAirAuthLoggedIn, _AirService_triggerAirAuthLoggedOut, _AirService_triggerWalletInitialized, _AirService_createLoginResult, _AirService_cleanUpAuth, _AirService_cleanUpWallet;
1832
+ var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _AirService_isWalletInitialized, _AirService_walletLoggedInResult, _AirService_airWalletProvider, _AirService_ensureWallet, _AirService_initializeWallet, _AirService_triggerEventListeners, _AirService_triggerAirAuthInitialized, _AirService_triggerAirAuthLoggedIn, _AirService_triggerAirAuthLoggedOut, _AirService_triggerWalletInitialized, _AirService_createLoginResult, _AirService_createWalletInitializedResult, _AirService_cleanUpAuth, _AirService_cleanUpWallet, _AirService_cleanUpAuthWalletCommunication;
1672
1833
  class AirService {
1673
- // #walletRehydrationState: AirRehydrationResult;
1674
1834
  constructor({ partnerId }) {
1675
1835
  _AirService_instances.add(this);
1676
1836
  _AirService_loginResult.set(this, undefined);
@@ -1684,8 +1844,14 @@ class AirService {
1684
1844
  _AirService_walletIframeController.set(this, undefined);
1685
1845
  _AirService_walletInitialization.set(this, undefined);
1686
1846
  _AirService_isWalletInitialized.set(this, false);
1847
+ _AirService_walletLoggedInResult.set(this, undefined);
1687
1848
  _AirService_airWalletProvider.set(this, undefined);
1688
1849
  __classPrivateFieldSet(this, _AirService_partnerId, partnerId, "f");
1850
+ __classPrivateFieldSet(this, _AirService_airWalletProvider, new AirWalletProvider({
1851
+ isLoggedIn: () => this.isLoggedIn,
1852
+ ensureWallet: __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).bind(this),
1853
+ getWalletIframeController: () => __classPrivateFieldGet(this, _AirService_walletIframeController, "f"),
1854
+ }), "f");
1689
1855
  // this.#modalZIndex = modalZIndex ?? 99999;
1690
1856
  }
1691
1857
  get buildEnv() {
@@ -1698,7 +1864,15 @@ class AirService {
1698
1864
  return !!__classPrivateFieldGet(this, _AirService_loginResult, "f");
1699
1865
  }
1700
1866
  get isWalletInitialized() {
1701
- return __classPrivateFieldGet(this, _AirService_isWalletInitialized, "f");
1867
+ return !!__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f");
1868
+ }
1869
+ get provider() {
1870
+ const provider = __classPrivateFieldGet(this, _AirService_airWalletProvider, "f");
1871
+ return {
1872
+ request: provider.request.bind(provider),
1873
+ on: provider.on.bind(provider),
1874
+ removeListener: provider.removeListener.bind(provider),
1875
+ };
1702
1876
  }
1703
1877
  async init({ buildEnv = BUILD_ENV.PRODUCTION, enableLogging = false, skipRehydration = false, }) {
1704
1878
  if (!__classPrivateFieldGet(this, _AirService_partnerId, "f"))
@@ -1726,7 +1900,7 @@ class AirService {
1726
1900
  }
1727
1901
  case AirAuthMessageTypes.SETUP_WALLET_REQUEST: {
1728
1902
  try {
1729
- await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).call(this);
1903
+ await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).call(this, { skipWalletLogin: true });
1730
1904
  __classPrivateFieldGet(this, _AirService_authIframeController, "f").postMessage({
1731
1905
  type: AirAuthMessageTypes.SETUP_WALLET_RESPONSE,
1732
1906
  payload: {
@@ -1761,6 +1935,7 @@ class AirService {
1761
1935
  const { payload } = await AirMessageService$1.sendAuthInitializationRequest(__classPrivateFieldGet(this, _AirService_authIframeController, "f").iframeElement, {
1762
1936
  partnerId: __classPrivateFieldGet(this, _AirService_partnerId, "f"),
1763
1937
  skipRehydration,
1938
+ partnerDAppUrl: window.location.href,
1764
1939
  });
1765
1940
  if (payload.success === true) {
1766
1941
  resolve(payload);
@@ -1788,11 +1963,6 @@ class AirService {
1788
1963
  }
1789
1964
  return null;
1790
1965
  }
1791
- async cleanUp() {
1792
- await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
1793
- await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpAuth).call(this);
1794
- this.clearEventListeners();
1795
- }
1796
1966
  async login(options) {
1797
1967
  if (!__classPrivateFieldGet(this, _AirService_isAuthInitialized, "f"))
1798
1968
  throw new Error("Service is not initialized");
@@ -1897,25 +2067,13 @@ class AirService {
1897
2067
  throw AirServiceError.from(error);
1898
2068
  }
1899
2069
  }
1900
- async logout() {
1901
- if (!__classPrivateFieldGet(this, _AirService_isAuthInitialized, "f"))
1902
- throw new Error("Service is not initialized");
1903
- if (!this.isLoggedIn)
1904
- throw new Error("No active session to logout");
1905
- // Clear up wallet
1906
- await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
1907
- await AirMessageService$1.logoutAuth(__classPrivateFieldGet(this, _AirService_authIframeController, "f").iframeElement);
1908
- __classPrivateFieldSet(this, _AirService_loginResult, undefined, "f");
1909
- __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerAirAuthLoggedOut).call(this);
1910
- }
1911
- async getProvider() {
1912
- if (!this.isLoggedIn)
1913
- return null;
1914
- await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).call(this);
1915
- return __classPrivateFieldGet(this, _AirService_airWalletProvider, "f");
2070
+ getProvider() {
2071
+ return this.provider;
1916
2072
  }
1917
2073
  async preloadWallet() {
1918
- return __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).call(this);
2074
+ if (__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"))
2075
+ return __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f");
2076
+ return await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).call(this);
1919
2077
  }
1920
2078
  async claimAirId(options) {
1921
2079
  await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_ensureWallet).call(this);
@@ -1940,9 +2098,39 @@ class AirService {
1940
2098
  id: info.payload.user.id,
1941
2099
  abstractAccountAddress: info.payload.user.abstractAccountAddress,
1942
2100
  email: info.payload.user.email,
2101
+ isMFASetup: info.payload.user.isMFASetup,
1943
2102
  },
1944
2103
  };
1945
2104
  }
2105
+ async goToPartner(partnerUrl) {
2106
+ if (!__classPrivateFieldGet(this, _AirService_isAuthInitialized, "f"))
2107
+ throw new Error("Service is not initialized");
2108
+ if (!this.isLoggedIn)
2109
+ throw new Error("No active session to generate token");
2110
+ const result = await AirMessageService$1.sendCrossPartnerTokenRequest(__classPrivateFieldGet(this, _AirService_authIframeController, "f").iframeElement, partnerUrl);
2111
+ if (result.payload.success === false) {
2112
+ throw new AirServiceError(result.payload.errorName, result.payload.errorMessage);
2113
+ }
2114
+ return {
2115
+ urlWithToken: result.payload.urlWithToken,
2116
+ };
2117
+ }
2118
+ async logout() {
2119
+ if (!__classPrivateFieldGet(this, _AirService_isAuthInitialized, "f"))
2120
+ throw new Error("Service is not initialized");
2121
+ if (!this.isLoggedIn)
2122
+ throw new Error("No active session to logout");
2123
+ // Clear up wallet
2124
+ await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
2125
+ await AirMessageService$1.logoutAuth(__classPrivateFieldGet(this, _AirService_authIframeController, "f").iframeElement);
2126
+ __classPrivateFieldSet(this, _AirService_loginResult, undefined, "f");
2127
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerAirAuthLoggedOut).call(this);
2128
+ }
2129
+ async cleanUp() {
2130
+ await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
2131
+ await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpAuth).call(this);
2132
+ this.clearEventListeners();
2133
+ }
1946
2134
  on(listener) {
1947
2135
  if (__classPrivateFieldGet(this, _AirService_airAuthListener, "f").indexOf(listener) < 0)
1948
2136
  __classPrivateFieldGet(this, _AirService_airAuthListener, "f").push(listener);
@@ -1963,24 +2151,39 @@ class AirService {
1963
2151
  return null;
1964
2152
  }
1965
2153
  }
1966
- _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _AirService_enableLogging = new WeakMap(), _AirService_partnerId = new WeakMap(), _AirService_authIframeController = new WeakMap(), _AirService_isAuthInitialized = new WeakMap(), _AirService_airAuthListener = new WeakMap(), _AirService_walletIframeController = new WeakMap(), _AirService_walletInitialization = new WeakMap(), _AirService_isWalletInitialized = new WeakMap(), _AirService_airWalletProvider = new WeakMap(), _AirService_instances = new WeakSet(), _AirService_ensureWallet = async function _AirService_ensureWallet() {
2154
+ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _AirService_enableLogging = new WeakMap(), _AirService_partnerId = new WeakMap(), _AirService_authIframeController = new WeakMap(), _AirService_isAuthInitialized = new WeakMap(), _AirService_airAuthListener = new WeakMap(), _AirService_walletIframeController = new WeakMap(), _AirService_walletInitialization = new WeakMap(), _AirService_isWalletInitialized = new WeakMap(), _AirService_walletLoggedInResult = new WeakMap(), _AirService_airWalletProvider = new WeakMap(), _AirService_instances = new WeakSet(), _AirService_ensureWallet =
2155
+ // Result of this.#walletInitialization:
2156
+ // - If skipWalletLogin is true, it returns the result of empty abstractAccountAddress
2157
+ // - If skipWalletLogin is false, it returns the result of abstractAccountAddress from wallet initialization
2158
+ // - If #ensureWallet is called again, it returns the result of abstractAccountAddress from the second
2159
+ // wallet initialization if this first wallet initialization doesn't have abstractAccountAddress
2160
+ async function _AirService_ensureWallet(option) {
1967
2161
  if (!this.isInitialized)
1968
2162
  throw new Error("Service not initialized");
1969
- if (!__classPrivateFieldGet(this, _AirService_walletInitialization, "f")) {
1970
- try {
1971
- __classPrivateFieldSet(this, _AirService_walletInitialization, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_initializeWallet).call(this), "f");
1972
- return await __classPrivateFieldGet(this, _AirService_walletInitialization, "f");
2163
+ if (!this.isLoggedIn && !option?.skipWalletLogin)
2164
+ throw new Error("User not logged in");
2165
+ if (!__classPrivateFieldGet(this, _AirService_walletInitialization, "f"))
2166
+ __classPrivateFieldSet(this, _AirService_walletInitialization, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_initializeWallet).call(this, option), "f");
2167
+ try {
2168
+ const result = await __classPrivateFieldGet(this, _AirService_walletInitialization, "f");
2169
+ // Note: Checking for abstractAccountAddress from the result and this.#walletLoggedInResult to avoid race condition
2170
+ if (option?.skipWalletLogin ||
2171
+ result?.abstractAccountAddress ||
2172
+ __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")?.abstractAccountAddress) {
2173
+ return result || __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f");
1973
2174
  }
1974
- catch (error) {
1975
- __classPrivateFieldSet(this, _AirService_walletInitialization, null, "f");
1976
- log.error("Error initializing wallet", error);
1977
- throw error;
2175
+ const walletInitResult = await AirMessageService$1.onWalletInitialized();
2176
+ if (walletInitResult.payload.success !== true) {
2177
+ throw new AirServiceError(walletInitResult.payload.errorName, walletInitResult.payload.errorMessage);
1978
2178
  }
2179
+ return __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, walletInitResult.payload);
1979
2180
  }
1980
- else {
1981
- return __classPrivateFieldGet(this, _AirService_walletInitialization, "f");
2181
+ catch (error) {
2182
+ __classPrivateFieldSet(this, _AirService_walletInitialization, null, "f");
2183
+ log.error("Error initializing wallet", error);
2184
+ throw error;
1982
2185
  }
1983
- }, _AirService_initializeWallet = async function _AirService_initializeWallet() {
2186
+ }, _AirService_initializeWallet = async function _AirService_initializeWallet(option) {
1984
2187
  if (__classPrivateFieldGet(this, _AirService_isWalletInitialized, "f"))
1985
2188
  throw new AirServiceError("ALREADY_INITIALISED", "Already initialized");
1986
2189
  const { walletUrl } = AIR_URLS[__classPrivateFieldGet(this, _AirService_buildEnv, "f")];
@@ -1998,6 +2201,23 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
1998
2201
  walletIframeController.updateIframeState();
1999
2202
  break;
2000
2203
  }
2204
+ case AirMessageTypes.WALLET_INITIALIZED: {
2205
+ if (msg.payload.success === true && msg.payload.addresses?.aa) {
2206
+ __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2207
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2208
+ }
2209
+ if (msg.payload.success === false) {
2210
+ if (!__classPrivateFieldGet(this, _AirService_isWalletInitialized, "f")) {
2211
+ // MFA fail case, also reset wallet port
2212
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpAuthWalletCommunication).call(this);
2213
+ }
2214
+ else {
2215
+ // Logout wallet and destroy the wallet iframe
2216
+ await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
2217
+ }
2218
+ }
2219
+ break;
2220
+ }
2001
2221
  }
2002
2222
  });
2003
2223
  await new Promise((resolve, reject) => {
@@ -2020,18 +2240,15 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2020
2240
  };
2021
2241
  window.addEventListener("message", handleAuthMessage);
2022
2242
  });
2243
+ __classPrivateFieldGet(this, _AirService_airWalletProvider, "f").listenProviderEventMessage();
2023
2244
  const walletInitPromise = AirMessageService$1.onWalletInitialized();
2024
- AirMessageService$1.setupIframeCommunication(__classPrivateFieldGet(this, _AirService_authIframeController, "f").iframeElement, __classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement);
2245
+ AirMessageService$1.setupIframeCommunication(__classPrivateFieldGet(this, _AirService_authIframeController, "f").iframeElement, __classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, option?.skipWalletLogin ?? false);
2025
2246
  const walletInitResult = await walletInitPromise;
2026
2247
  if (walletInitResult.payload.success !== true) {
2027
2248
  throw new AirServiceError(walletInitResult.payload.errorName, walletInitResult.payload.errorMessage);
2028
2249
  }
2029
- __classPrivateFieldSet(this, _AirService_airWalletProvider, new AirWalletProvider(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement), "f");
2030
- const result = {
2031
- abstractAccountAddress: walletInitResult.payload.addresses.aa,
2032
- };
2033
- __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, result);
2034
- return result;
2250
+ __classPrivateFieldSet(this, _AirService_isWalletInitialized, true, "f");
2251
+ return __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, walletInitResult.payload);
2035
2252
  }
2036
2253
  catch (error) {
2037
2254
  log.error("Error initializing wallet", error);
@@ -2062,6 +2279,12 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2062
2279
  id: payload.id,
2063
2280
  abstractAccountAddress: payload.abstractAccountAddress,
2064
2281
  token: payload.partnerAccessToken,
2282
+ isMFASetup: payload.isMFASetup,
2283
+ };
2284
+ }, _AirService_createWalletInitializedResult = function _AirService_createWalletInitializedResult(payload) {
2285
+ return {
2286
+ abstractAccountAddress: payload.addresses?.aa ?? null,
2287
+ isMFASetup: payload.isMFASetup,
2065
2288
  };
2066
2289
  }, _AirService_cleanUpAuth = async function _AirService_cleanUpAuth() {
2067
2290
  // Logout auth session
@@ -2087,12 +2310,29 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2087
2310
  }
2088
2311
  // Close the message service
2089
2312
  AirMessageService$1.closeAirObservables();
2090
- __classPrivateFieldSet(this, _AirService_walletInitialization, null, "f");
2313
+ __classPrivateFieldSet(this, _AirService_walletLoggedInResult, undefined, "f");
2314
+ __classPrivateFieldSet(this, _AirService_walletInitialization, undefined, "f");
2091
2315
  __classPrivateFieldSet(this, _AirService_isWalletInitialized, false, "f");
2316
+ }, _AirService_cleanUpAuthWalletCommunication = function _AirService_cleanUpAuthWalletCommunication() {
2317
+ if (!__classPrivateFieldGet(this, _AirService_isAuthInitialized, "f"))
2318
+ return;
2319
+ const authIframeElement = __classPrivateFieldGet(this, _AirService_authIframeController, "f")?.iframeElement;
2320
+ if (isElement(authIframeElement) && window.document.body.contains(authIframeElement)) {
2321
+ AirMessageService$1.sendResetAuthServiceWalletCommunication(authIframeElement);
2322
+ }
2092
2323
  };
2093
2324
 
2094
2325
  exports.AirService = AirService;
2095
2326
  exports.AirServiceError = AirServiceError;
2096
- exports.AirWalletProvider = AirWalletProvider;
2097
2327
  exports.BUILD_ENV = BUILD_ENV;
2098
- exports.RealmEmbedError = RealmEmbedError;
2328
+ exports.ChainDisconnectedError = ChainDisconnectedError;
2329
+ exports.InternalRpcError = InternalRpcError;
2330
+ exports.InvalidParamsRpcError = InvalidParamsRpcError;
2331
+ exports.InvalidRequestRpcError = InvalidRequestRpcError;
2332
+ exports.MethodNotFoundRpcError = MethodNotFoundRpcError;
2333
+ exports.ProviderDisconnectedError = ProviderDisconnectedError;
2334
+ exports.SwitchChainError = SwitchChainError;
2335
+ exports.UnauthorizedProviderError = UnauthorizedProviderError;
2336
+ exports.UnsupportedProviderMethodError = UnsupportedProviderMethodError;
2337
+ exports.UserRejectedRequestError = UserRejectedRequestError;
2338
+ exports.ensureProviderRpcError = ensureProviderRpcError;