@mocanetwork/airkit 1.2.0-beta.0 → 1.2.0-beta.1

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.
@@ -150,6 +150,9 @@ const AirMessageTypes = {
150
150
  LIST_ALL_SESSION_KEY_SCOPES_REQUEST: "air_list_all_session_key_scopes_request",
151
151
  LIST_ALL_SESSION_KEY_SCOPES_RESPONSE: "air_list_all_session_key_scopes_response",
152
152
  WALLET_IFRAME_VISIBILITY_REQUEST: "air_wallet_iframe_visibility_request",
153
+ OPEN_WINDOW_REQUEST: "air_open_window_request",
154
+ OPEN_WINDOW_RESPONSE: "air_open_window_response",
155
+ WINDOW_CLOSED: "air_window_closed",
153
156
  IS_SMART_ACCOUNT_DEPLOYED_REQUEST: "air_is_smart_account_deployed_request",
154
157
  IS_SMART_ACCOUNT_DEPLOYED_RESPONSE: "air_is_smart_account_deployed_response",
155
158
  LOGOUT_REQUEST: "air_logout_request",
@@ -177,6 +180,16 @@ class BaseError extends Error {
177
180
  };
178
181
  }
179
182
  }
183
+ function ensureError(value) {
184
+ if (value instanceof Error) return value;
185
+ let stringified = "[Unable to stringify the thrown value]";
186
+ try {
187
+ stringified = JSON.stringify(value);
188
+ } catch {
189
+ // ignoring failed stringify
190
+ }
191
+ return new Error(`This value was not thrown as type Error: ${stringified}`);
192
+ }
180
193
 
181
194
  class AirServiceError extends BaseError {
182
195
  static from(error) {
@@ -1384,6 +1397,7 @@ const ACCOUNT_MESSAGES = [
1384
1397
  AirMessageTypes.WALLET_INITIALIZED,
1385
1398
  AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST,
1386
1399
  AirMessageTypes.LOGOUT_RESPONSE,
1400
+ AirMessageTypes.OPEN_WINDOW_REQUEST,
1387
1401
  ];
1388
1402
  const AUTH_MESSAGES = [
1389
1403
  AirAuthMessageTypes.INITIALIZATION_RESPONSE,
@@ -1628,6 +1642,37 @@ class AirMessageService {
1628
1642
  walletIframe.contentWindow.postMessage({ type: AirMessageTypes.SETUP_MFA_REQUEST }, origin);
1629
1643
  return response;
1630
1644
  }
1645
+ sendOpenWindowSuccessResponse(walletIframe, windowId, port) {
1646
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1647
+ walletIframe.contentWindow.postMessage({
1648
+ type: AirMessageTypes.OPEN_WINDOW_RESPONSE,
1649
+ payload: {
1650
+ success: true,
1651
+ windowId,
1652
+ },
1653
+ }, walletOrigin, [port]);
1654
+ }
1655
+ sendOpenWindowErrorResponse(walletIframe, windowId, error) {
1656
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1657
+ walletIframe.contentWindow.postMessage({
1658
+ type: AirMessageTypes.OPEN_WINDOW_RESPONSE,
1659
+ payload: {
1660
+ success: false,
1661
+ windowId,
1662
+ errorName: "UNKNOWN_ERROR",
1663
+ errorMessage: error.message,
1664
+ },
1665
+ }, walletOrigin);
1666
+ }
1667
+ sendWindowClosed(walletIframe, windowId) {
1668
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1669
+ walletIframe.contentWindow.postMessage({
1670
+ type: AirMessageTypes.WINDOW_CLOSED,
1671
+ payload: {
1672
+ windowId,
1673
+ },
1674
+ }, walletOrigin);
1675
+ }
1631
1676
  async sendClaimIdRequest(walletIframe, payload) {
1632
1677
  const response = firstValueFrom(this.messages$.pipe(filter((msg) => msg.type === AirMessageTypes.CLAIM_ID_RESPONSE)));
1633
1678
  const { origin } = new URL(walletIframe.src);
@@ -1685,6 +1730,7 @@ var AirMessageService$1 = AirMessageService.instance;
1685
1730
 
1686
1731
  const BUILD_ENV = {
1687
1732
  PRODUCTION: "production",
1733
+ UAT: "uat",
1688
1734
  STAGING: "staging",
1689
1735
  DEVELOPMENT: "development",
1690
1736
  };
@@ -1695,6 +1741,11 @@ const AIR_URLS = {
1695
1741
  walletUrl: "http://localhost:8200",
1696
1742
  logLevel: "debug",
1697
1743
  },
1744
+ [BUILD_ENV.UAT]: {
1745
+ authUrl: "https://auth.uat.air3.com",
1746
+ walletUrl: "https://account.uat.air3.com",
1747
+ logLevel: "info",
1748
+ },
1698
1749
  [BUILD_ENV.STAGING]: {
1699
1750
  authUrl: "https://auth.staging.air3.com",
1700
1751
  walletUrl: "https://account.staging.air3.com",
@@ -1708,6 +1759,24 @@ const AIR_URLS = {
1708
1759
  };
1709
1760
  const isElement = (element) => element instanceof Element || element instanceof Document;
1710
1761
  const randomId = () => Math.random().toString(36).slice(2);
1762
+ const getWindowFeatures = (width, height) => {
1763
+ const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX;
1764
+ const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY;
1765
+ const w = window.innerWidth
1766
+ ? window.innerWidth
1767
+ : document.documentElement.clientWidth
1768
+ ? document.documentElement.clientWidth
1769
+ : window.screen.width;
1770
+ const h = window.innerHeight
1771
+ ? window.innerHeight
1772
+ : document.documentElement.clientHeight
1773
+ ? document.documentElement.clientHeight
1774
+ : window.screen.height;
1775
+ const systemZoom = 1; // No reliable estimate
1776
+ const left = Math.abs((w - width) / 2 / systemZoom + dualScreenLeft);
1777
+ const top = Math.abs((h - height) / 2 / systemZoom + dualScreenTop);
1778
+ return `titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=${height / systemZoom},width=${width / systemZoom},top=${top},left=${left}`;
1779
+ };
1711
1780
 
1712
1781
  var _AirWalletProvider_instances, _AirWalletProvider_isLoggedIn, _AirWalletProvider_ensureWallet, _AirWalletProvider_getWalletIframeController, _AirWalletProvider_eventListeners, _AirWalletProvider_emit;
1713
1782
  class AirWalletProvider {
@@ -1864,7 +1933,145 @@ IframeController.defaultState = {
1864
1933
  isVisible: false,
1865
1934
  };
1866
1935
 
1867
- var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _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;
1936
+ class WindowController {
1937
+ get messages$() {
1938
+ return this._messages$.asObservable();
1939
+ }
1940
+ constructor(windowUrl, windowId) {
1941
+ this._windowInstance = null;
1942
+ this._messageHandler = null;
1943
+ this._messages$ = new Subject();
1944
+ this.windowUrl = windowUrl;
1945
+ this.windowOrigin = new URL(windowUrl).origin;
1946
+ this.windowId = windowId;
1947
+ }
1948
+ get windowInstance() {
1949
+ return this._windowInstance;
1950
+ }
1951
+ openWindow() {
1952
+ if (this._windowInstance && !this._windowInstance.closed) {
1953
+ this._windowInstance.focus();
1954
+ return this._windowInstance;
1955
+ }
1956
+ const windowInstance = window.open(this.windowUrl, this.windowId, getWindowFeatures(400, 600));
1957
+ if (!windowInstance) {
1958
+ throw new Error("Failed to open window. Popup might be blocked by the browser.");
1959
+ }
1960
+ this._windowInstance = windowInstance;
1961
+ this._messageHandler = (ev) => {
1962
+ if (ev.source !== windowInstance ||
1963
+ ev.origin !== this.windowOrigin ||
1964
+ !ev.data ||
1965
+ !(ev.data instanceof Object)) {
1966
+ return;
1967
+ }
1968
+ this._messages$.next(ev);
1969
+ };
1970
+ window.addEventListener("message", this._messageHandler);
1971
+ const checkWindow = setInterval(() => {
1972
+ if (!this._windowInstance || this._windowInstance?.closed) {
1973
+ this.cleanup();
1974
+ clearInterval(checkWindow);
1975
+ }
1976
+ }, 500);
1977
+ return windowInstance;
1978
+ }
1979
+ postMessage(message, transfer) {
1980
+ if (!this._windowInstance)
1981
+ return;
1982
+ this._windowInstance.postMessage(message, this.windowOrigin, transfer);
1983
+ }
1984
+ onMessage(callback) {
1985
+ const listener = (ev) => {
1986
+ if (ev.source !== this._windowInstance)
1987
+ return;
1988
+ callback(ev);
1989
+ };
1990
+ window.addEventListener("message", listener);
1991
+ const close = () => window.removeEventListener("message", listener);
1992
+ this.onClose(close);
1993
+ return {
1994
+ close,
1995
+ };
1996
+ }
1997
+ cleanup() {
1998
+ if (this._windowInstance && !this._windowInstance.closed) {
1999
+ this._windowInstance.close();
2000
+ }
2001
+ if (this._messageHandler) {
2002
+ window.removeEventListener("message", this._messageHandler);
2003
+ this._messageHandler = null;
2004
+ }
2005
+ if (this._messages$ && !this._messages$.closed) {
2006
+ this._messages$.complete();
2007
+ }
2008
+ this._windowInstance = null;
2009
+ }
2010
+ onClose(callback) {
2011
+ return this._messages$.subscribe({
2012
+ complete: callback,
2013
+ });
2014
+ }
2015
+ }
2016
+
2017
+ class WindowService {
2018
+ constructor() {
2019
+ this.windowControllers = new Map();
2020
+ }
2021
+ static get instance() {
2022
+ return this._instance || (this._instance = new this());
2023
+ }
2024
+ async sendWindowInitializationRequest(windowId, payload, port) {
2025
+ const windowController = this.windowControllers.get(windowId);
2026
+ if (!windowController) {
2027
+ throw new Error("Window controller not found");
2028
+ }
2029
+ const windowInstance = windowController.windowInstance;
2030
+ if (!windowInstance) {
2031
+ throw new Error("Window instance not found");
2032
+ }
2033
+ const response = firstValueFrom(windowController.messages$.pipe(filter((event) => event.data.type === AirMessageTypes.INITIALIZATION_RESPONSE)));
2034
+ windowController.postMessage({ type: AirMessageTypes.INITIALIZATION_REQUEST, payload }, [port]);
2035
+ return (await response).data;
2036
+ }
2037
+ async openAndInitializeWalletServiceWindow({ url, windowId, partnerId, enableLogging, port, }) {
2038
+ if (this.windowControllers.has(windowId)) {
2039
+ throw new Error("Window controller already exists");
2040
+ }
2041
+ const windowController = new WindowController(url, windowId);
2042
+ this.windowControllers.set(windowId, windowController);
2043
+ windowController.openWindow();
2044
+ windowController.onClose(() => {
2045
+ this.removeWindowController(windowId);
2046
+ });
2047
+ await new Promise((resolve, reject) => {
2048
+ windowController.onMessage(async (ev) => {
2049
+ if (ev.data === AirMessageTypes.SERVICE_STARTED) {
2050
+ const { payload } = await this.sendWindowInitializationRequest(windowId, {
2051
+ partnerId,
2052
+ enableLogging,
2053
+ }, port);
2054
+ if (payload.success === false) {
2055
+ reject(new AirServiceError(payload.errorName, payload.errorMessage));
2056
+ }
2057
+ else {
2058
+ resolve();
2059
+ }
2060
+ }
2061
+ });
2062
+ });
2063
+ return windowController;
2064
+ }
2065
+ getWindowController(windowId) {
2066
+ return this.windowControllers.get(windowId);
2067
+ }
2068
+ removeWindowController(windowId) {
2069
+ this.windowControllers.delete(windowId);
2070
+ }
2071
+ }
2072
+ var WindowService$1 = WindowService.instance;
2073
+
2074
+ var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _AirService_walletLoggedInResult, _AirService_airWalletProvider, _AirService_ensureWallet, _AirService_initializeWallet, _AirService_subscribeToWalletEvents, _AirService_triggerEventListeners, _AirService_triggerAirAuthInitialized, _AirService_triggerAirAuthLoggedIn, _AirService_triggerAirAuthLoggedOut, _AirService_triggerWalletInitialized, _AirService_createLoginResult, _AirService_createWalletInitializedResult, _AirService_cleanUpAuth, _AirService_cleanUpWallet;
1868
2075
  class AirService {
1869
2076
  constructor({ partnerId }) {
1870
2077
  _AirService_instances.add(this);
@@ -2251,23 +2458,7 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2251
2458
  try {
2252
2459
  __classPrivateFieldSet(this, _AirService_walletIframeController, new IframeController(walletUrl, `air-wallet-${randomId()}`), "f");
2253
2460
  __classPrivateFieldGet(this, _AirService_walletIframeController, "f").createIframe();
2254
- AirMessageService$1.messages$.subscribe(async (msg) => {
2255
- switch (msg.type) {
2256
- case AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST: {
2257
- const walletIframeController = __classPrivateFieldGet(this, _AirService_walletIframeController, "f");
2258
- walletIframeController.setIframeVisibility(msg.payload.visible);
2259
- walletIframeController.updateIframeState();
2260
- break;
2261
- }
2262
- case AirMessageTypes.WALLET_LOGIN_RESPONSE: {
2263
- if (msg.payload.success === true && !__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")) {
2264
- __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2265
- __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2266
- }
2267
- break;
2268
- }
2269
- }
2270
- });
2461
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_subscribeToWalletEvents).call(this);
2271
2462
  await new Promise((resolve, reject) => {
2272
2463
  const handleAuthMessage = async (ev) => {
2273
2464
  if (ev.origin !== walletIframeOrigin)
@@ -2306,6 +2497,43 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2306
2497
  await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
2307
2498
  throw error;
2308
2499
  }
2500
+ }, _AirService_subscribeToWalletEvents = function _AirService_subscribeToWalletEvents() {
2501
+ AirMessageService$1.messages$.subscribe(async (msg) => {
2502
+ switch (msg.type) {
2503
+ case AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST: {
2504
+ const walletIframeController = __classPrivateFieldGet(this, _AirService_walletIframeController, "f");
2505
+ walletIframeController.setIframeVisibility(msg.payload.visible);
2506
+ walletIframeController.updateIframeState();
2507
+ break;
2508
+ }
2509
+ case AirMessageTypes.WALLET_LOGIN_RESPONSE: {
2510
+ if (msg.payload.success === true && !__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")) {
2511
+ __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2512
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2513
+ }
2514
+ break;
2515
+ }
2516
+ case AirMessageTypes.OPEN_WINDOW_REQUEST: {
2517
+ try {
2518
+ const channel = new MessageChannel();
2519
+ const windowController = await WindowService$1.openAndInitializeWalletServiceWindow({
2520
+ url: msg.payload.url,
2521
+ windowId: msg.payload.windowId,
2522
+ partnerId: __classPrivateFieldGet(this, _AirService_partnerId, "f"),
2523
+ enableLogging: __classPrivateFieldGet(this, _AirService_enableLogging, "f"),
2524
+ port: channel.port1,
2525
+ });
2526
+ windowController.onClose(() => AirMessageService$1.sendWindowClosed(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId));
2527
+ AirMessageService$1.sendOpenWindowSuccessResponse(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId, channel.port2);
2528
+ }
2529
+ catch (err) {
2530
+ const error = ensureError(err);
2531
+ AirMessageService$1.sendOpenWindowErrorResponse(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId, error);
2532
+ }
2533
+ break;
2534
+ }
2535
+ }
2536
+ });
2309
2537
  }, _AirService_triggerEventListeners = function _AirService_triggerEventListeners(data) {
2310
2538
  __classPrivateFieldGet(this, _AirService_airAuthListener, "f").forEach((listener) => {
2311
2539
  listener(data);
@@ -148,6 +148,9 @@ const AirMessageTypes = {
148
148
  LIST_ALL_SESSION_KEY_SCOPES_REQUEST: "air_list_all_session_key_scopes_request",
149
149
  LIST_ALL_SESSION_KEY_SCOPES_RESPONSE: "air_list_all_session_key_scopes_response",
150
150
  WALLET_IFRAME_VISIBILITY_REQUEST: "air_wallet_iframe_visibility_request",
151
+ OPEN_WINDOW_REQUEST: "air_open_window_request",
152
+ OPEN_WINDOW_RESPONSE: "air_open_window_response",
153
+ WINDOW_CLOSED: "air_window_closed",
151
154
  IS_SMART_ACCOUNT_DEPLOYED_REQUEST: "air_is_smart_account_deployed_request",
152
155
  IS_SMART_ACCOUNT_DEPLOYED_RESPONSE: "air_is_smart_account_deployed_response",
153
156
  LOGOUT_REQUEST: "air_logout_request",
@@ -175,6 +178,16 @@ class BaseError extends Error {
175
178
  };
176
179
  }
177
180
  }
181
+ function ensureError(value) {
182
+ if (value instanceof Error) return value;
183
+ let stringified = "[Unable to stringify the thrown value]";
184
+ try {
185
+ stringified = JSON.stringify(value);
186
+ } catch {
187
+ // ignoring failed stringify
188
+ }
189
+ return new Error(`This value was not thrown as type Error: ${stringified}`);
190
+ }
178
191
 
179
192
  class AirServiceError extends BaseError {
180
193
  static from(error) {
@@ -1382,6 +1395,7 @@ const ACCOUNT_MESSAGES = [
1382
1395
  AirMessageTypes.WALLET_INITIALIZED,
1383
1396
  AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST,
1384
1397
  AirMessageTypes.LOGOUT_RESPONSE,
1398
+ AirMessageTypes.OPEN_WINDOW_REQUEST,
1385
1399
  ];
1386
1400
  const AUTH_MESSAGES = [
1387
1401
  AirAuthMessageTypes.INITIALIZATION_RESPONSE,
@@ -1626,6 +1640,37 @@ class AirMessageService {
1626
1640
  walletIframe.contentWindow.postMessage({ type: AirMessageTypes.SETUP_MFA_REQUEST }, origin);
1627
1641
  return response;
1628
1642
  }
1643
+ sendOpenWindowSuccessResponse(walletIframe, windowId, port) {
1644
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1645
+ walletIframe.contentWindow.postMessage({
1646
+ type: AirMessageTypes.OPEN_WINDOW_RESPONSE,
1647
+ payload: {
1648
+ success: true,
1649
+ windowId,
1650
+ },
1651
+ }, walletOrigin, [port]);
1652
+ }
1653
+ sendOpenWindowErrorResponse(walletIframe, windowId, error) {
1654
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1655
+ walletIframe.contentWindow.postMessage({
1656
+ type: AirMessageTypes.OPEN_WINDOW_RESPONSE,
1657
+ payload: {
1658
+ success: false,
1659
+ windowId,
1660
+ errorName: "UNKNOWN_ERROR",
1661
+ errorMessage: error.message,
1662
+ },
1663
+ }, walletOrigin);
1664
+ }
1665
+ sendWindowClosed(walletIframe, windowId) {
1666
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1667
+ walletIframe.contentWindow.postMessage({
1668
+ type: AirMessageTypes.WINDOW_CLOSED,
1669
+ payload: {
1670
+ windowId,
1671
+ },
1672
+ }, walletOrigin);
1673
+ }
1629
1674
  async sendClaimIdRequest(walletIframe, payload) {
1630
1675
  const response = firstValueFrom(this.messages$.pipe(filter((msg) => msg.type === AirMessageTypes.CLAIM_ID_RESPONSE)));
1631
1676
  const { origin } = new URL(walletIframe.src);
@@ -1683,6 +1728,7 @@ var AirMessageService$1 = AirMessageService.instance;
1683
1728
 
1684
1729
  const BUILD_ENV = {
1685
1730
  PRODUCTION: "production",
1731
+ UAT: "uat",
1686
1732
  STAGING: "staging",
1687
1733
  DEVELOPMENT: "development",
1688
1734
  };
@@ -1693,6 +1739,11 @@ const AIR_URLS = {
1693
1739
  walletUrl: "http://localhost:8200",
1694
1740
  logLevel: "debug",
1695
1741
  },
1742
+ [BUILD_ENV.UAT]: {
1743
+ authUrl: "https://auth.uat.air3.com",
1744
+ walletUrl: "https://account.uat.air3.com",
1745
+ logLevel: "info",
1746
+ },
1696
1747
  [BUILD_ENV.STAGING]: {
1697
1748
  authUrl: "https://auth.staging.air3.com",
1698
1749
  walletUrl: "https://account.staging.air3.com",
@@ -1706,6 +1757,24 @@ const AIR_URLS = {
1706
1757
  };
1707
1758
  const isElement = (element) => element instanceof Element || element instanceof Document;
1708
1759
  const randomId = () => Math.random().toString(36).slice(2);
1760
+ const getWindowFeatures = (width, height) => {
1761
+ const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX;
1762
+ const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY;
1763
+ const w = window.innerWidth
1764
+ ? window.innerWidth
1765
+ : document.documentElement.clientWidth
1766
+ ? document.documentElement.clientWidth
1767
+ : window.screen.width;
1768
+ const h = window.innerHeight
1769
+ ? window.innerHeight
1770
+ : document.documentElement.clientHeight
1771
+ ? document.documentElement.clientHeight
1772
+ : window.screen.height;
1773
+ const systemZoom = 1; // No reliable estimate
1774
+ const left = Math.abs((w - width) / 2 / systemZoom + dualScreenLeft);
1775
+ const top = Math.abs((h - height) / 2 / systemZoom + dualScreenTop);
1776
+ return `titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=${height / systemZoom},width=${width / systemZoom},top=${top},left=${left}`;
1777
+ };
1709
1778
 
1710
1779
  var _AirWalletProvider_instances, _AirWalletProvider_isLoggedIn, _AirWalletProvider_ensureWallet, _AirWalletProvider_getWalletIframeController, _AirWalletProvider_eventListeners, _AirWalletProvider_emit;
1711
1780
  class AirWalletProvider {
@@ -1862,7 +1931,145 @@ IframeController.defaultState = {
1862
1931
  isVisible: false,
1863
1932
  };
1864
1933
 
1865
- var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _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;
1934
+ class WindowController {
1935
+ get messages$() {
1936
+ return this._messages$.asObservable();
1937
+ }
1938
+ constructor(windowUrl, windowId) {
1939
+ this._windowInstance = null;
1940
+ this._messageHandler = null;
1941
+ this._messages$ = new Subject();
1942
+ this.windowUrl = windowUrl;
1943
+ this.windowOrigin = new URL(windowUrl).origin;
1944
+ this.windowId = windowId;
1945
+ }
1946
+ get windowInstance() {
1947
+ return this._windowInstance;
1948
+ }
1949
+ openWindow() {
1950
+ if (this._windowInstance && !this._windowInstance.closed) {
1951
+ this._windowInstance.focus();
1952
+ return this._windowInstance;
1953
+ }
1954
+ const windowInstance = window.open(this.windowUrl, this.windowId, getWindowFeatures(400, 600));
1955
+ if (!windowInstance) {
1956
+ throw new Error("Failed to open window. Popup might be blocked by the browser.");
1957
+ }
1958
+ this._windowInstance = windowInstance;
1959
+ this._messageHandler = (ev) => {
1960
+ if (ev.source !== windowInstance ||
1961
+ ev.origin !== this.windowOrigin ||
1962
+ !ev.data ||
1963
+ !(ev.data instanceof Object)) {
1964
+ return;
1965
+ }
1966
+ this._messages$.next(ev);
1967
+ };
1968
+ window.addEventListener("message", this._messageHandler);
1969
+ const checkWindow = setInterval(() => {
1970
+ if (!this._windowInstance || this._windowInstance?.closed) {
1971
+ this.cleanup();
1972
+ clearInterval(checkWindow);
1973
+ }
1974
+ }, 500);
1975
+ return windowInstance;
1976
+ }
1977
+ postMessage(message, transfer) {
1978
+ if (!this._windowInstance)
1979
+ return;
1980
+ this._windowInstance.postMessage(message, this.windowOrigin, transfer);
1981
+ }
1982
+ onMessage(callback) {
1983
+ const listener = (ev) => {
1984
+ if (ev.source !== this._windowInstance)
1985
+ return;
1986
+ callback(ev);
1987
+ };
1988
+ window.addEventListener("message", listener);
1989
+ const close = () => window.removeEventListener("message", listener);
1990
+ this.onClose(close);
1991
+ return {
1992
+ close,
1993
+ };
1994
+ }
1995
+ cleanup() {
1996
+ if (this._windowInstance && !this._windowInstance.closed) {
1997
+ this._windowInstance.close();
1998
+ }
1999
+ if (this._messageHandler) {
2000
+ window.removeEventListener("message", this._messageHandler);
2001
+ this._messageHandler = null;
2002
+ }
2003
+ if (this._messages$ && !this._messages$.closed) {
2004
+ this._messages$.complete();
2005
+ }
2006
+ this._windowInstance = null;
2007
+ }
2008
+ onClose(callback) {
2009
+ return this._messages$.subscribe({
2010
+ complete: callback,
2011
+ });
2012
+ }
2013
+ }
2014
+
2015
+ class WindowService {
2016
+ constructor() {
2017
+ this.windowControllers = new Map();
2018
+ }
2019
+ static get instance() {
2020
+ return this._instance || (this._instance = new this());
2021
+ }
2022
+ async sendWindowInitializationRequest(windowId, payload, port) {
2023
+ const windowController = this.windowControllers.get(windowId);
2024
+ if (!windowController) {
2025
+ throw new Error("Window controller not found");
2026
+ }
2027
+ const windowInstance = windowController.windowInstance;
2028
+ if (!windowInstance) {
2029
+ throw new Error("Window instance not found");
2030
+ }
2031
+ const response = firstValueFrom(windowController.messages$.pipe(filter((event) => event.data.type === AirMessageTypes.INITIALIZATION_RESPONSE)));
2032
+ windowController.postMessage({ type: AirMessageTypes.INITIALIZATION_REQUEST, payload }, [port]);
2033
+ return (await response).data;
2034
+ }
2035
+ async openAndInitializeWalletServiceWindow({ url, windowId, partnerId, enableLogging, port, }) {
2036
+ if (this.windowControllers.has(windowId)) {
2037
+ throw new Error("Window controller already exists");
2038
+ }
2039
+ const windowController = new WindowController(url, windowId);
2040
+ this.windowControllers.set(windowId, windowController);
2041
+ windowController.openWindow();
2042
+ windowController.onClose(() => {
2043
+ this.removeWindowController(windowId);
2044
+ });
2045
+ await new Promise((resolve, reject) => {
2046
+ windowController.onMessage(async (ev) => {
2047
+ if (ev.data === AirMessageTypes.SERVICE_STARTED) {
2048
+ const { payload } = await this.sendWindowInitializationRequest(windowId, {
2049
+ partnerId,
2050
+ enableLogging,
2051
+ }, port);
2052
+ if (payload.success === false) {
2053
+ reject(new AirServiceError(payload.errorName, payload.errorMessage));
2054
+ }
2055
+ else {
2056
+ resolve();
2057
+ }
2058
+ }
2059
+ });
2060
+ });
2061
+ return windowController;
2062
+ }
2063
+ getWindowController(windowId) {
2064
+ return this.windowControllers.get(windowId);
2065
+ }
2066
+ removeWindowController(windowId) {
2067
+ this.windowControllers.delete(windowId);
2068
+ }
2069
+ }
2070
+ var WindowService$1 = WindowService.instance;
2071
+
2072
+ var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _AirService_walletLoggedInResult, _AirService_airWalletProvider, _AirService_ensureWallet, _AirService_initializeWallet, _AirService_subscribeToWalletEvents, _AirService_triggerEventListeners, _AirService_triggerAirAuthInitialized, _AirService_triggerAirAuthLoggedIn, _AirService_triggerAirAuthLoggedOut, _AirService_triggerWalletInitialized, _AirService_createLoginResult, _AirService_createWalletInitializedResult, _AirService_cleanUpAuth, _AirService_cleanUpWallet;
1866
2073
  class AirService {
1867
2074
  constructor({ partnerId }) {
1868
2075
  _AirService_instances.add(this);
@@ -2249,23 +2456,7 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2249
2456
  try {
2250
2457
  __classPrivateFieldSet(this, _AirService_walletIframeController, new IframeController(walletUrl, `air-wallet-${randomId()}`), "f");
2251
2458
  __classPrivateFieldGet(this, _AirService_walletIframeController, "f").createIframe();
2252
- AirMessageService$1.messages$.subscribe(async (msg) => {
2253
- switch (msg.type) {
2254
- case AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST: {
2255
- const walletIframeController = __classPrivateFieldGet(this, _AirService_walletIframeController, "f");
2256
- walletIframeController.setIframeVisibility(msg.payload.visible);
2257
- walletIframeController.updateIframeState();
2258
- break;
2259
- }
2260
- case AirMessageTypes.WALLET_LOGIN_RESPONSE: {
2261
- if (msg.payload.success === true && !__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")) {
2262
- __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2263
- __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2264
- }
2265
- break;
2266
- }
2267
- }
2268
- });
2459
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_subscribeToWalletEvents).call(this);
2269
2460
  await new Promise((resolve, reject) => {
2270
2461
  const handleAuthMessage = async (ev) => {
2271
2462
  if (ev.origin !== walletIframeOrigin)
@@ -2304,6 +2495,43 @@ _AirService_loginResult = new WeakMap(), _AirService_buildEnv = new WeakMap(), _
2304
2495
  await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
2305
2496
  throw error;
2306
2497
  }
2498
+ }, _AirService_subscribeToWalletEvents = function _AirService_subscribeToWalletEvents() {
2499
+ AirMessageService$1.messages$.subscribe(async (msg) => {
2500
+ switch (msg.type) {
2501
+ case AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST: {
2502
+ const walletIframeController = __classPrivateFieldGet(this, _AirService_walletIframeController, "f");
2503
+ walletIframeController.setIframeVisibility(msg.payload.visible);
2504
+ walletIframeController.updateIframeState();
2505
+ break;
2506
+ }
2507
+ case AirMessageTypes.WALLET_LOGIN_RESPONSE: {
2508
+ if (msg.payload.success === true && !__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")) {
2509
+ __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2510
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2511
+ }
2512
+ break;
2513
+ }
2514
+ case AirMessageTypes.OPEN_WINDOW_REQUEST: {
2515
+ try {
2516
+ const channel = new MessageChannel();
2517
+ const windowController = await WindowService$1.openAndInitializeWalletServiceWindow({
2518
+ url: msg.payload.url,
2519
+ windowId: msg.payload.windowId,
2520
+ partnerId: __classPrivateFieldGet(this, _AirService_partnerId, "f"),
2521
+ enableLogging: __classPrivateFieldGet(this, _AirService_enableLogging, "f"),
2522
+ port: channel.port1,
2523
+ });
2524
+ windowController.onClose(() => AirMessageService$1.sendWindowClosed(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId));
2525
+ AirMessageService$1.sendOpenWindowSuccessResponse(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId, channel.port2);
2526
+ }
2527
+ catch (err) {
2528
+ const error = ensureError(err);
2529
+ AirMessageService$1.sendOpenWindowErrorResponse(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId, error);
2530
+ }
2531
+ break;
2532
+ }
2533
+ }
2534
+ });
2307
2535
  }, _AirService_triggerEventListeners = function _AirService_triggerEventListeners(data) {
2308
2536
  __classPrivateFieldGet(this, _AirService_airAuthListener, "f").forEach((listener) => {
2309
2537
  listener(data);
@@ -154,6 +154,9 @@
154
154
  LIST_ALL_SESSION_KEY_SCOPES_REQUEST: "air_list_all_session_key_scopes_request",
155
155
  LIST_ALL_SESSION_KEY_SCOPES_RESPONSE: "air_list_all_session_key_scopes_response",
156
156
  WALLET_IFRAME_VISIBILITY_REQUEST: "air_wallet_iframe_visibility_request",
157
+ OPEN_WINDOW_REQUEST: "air_open_window_request",
158
+ OPEN_WINDOW_RESPONSE: "air_open_window_response",
159
+ WINDOW_CLOSED: "air_window_closed",
157
160
  IS_SMART_ACCOUNT_DEPLOYED_REQUEST: "air_is_smart_account_deployed_request",
158
161
  IS_SMART_ACCOUNT_DEPLOYED_RESPONSE: "air_is_smart_account_deployed_response",
159
162
  LOGOUT_REQUEST: "air_logout_request",
@@ -181,6 +184,16 @@
181
184
  };
182
185
  }
183
186
  }
187
+ function ensureError(value) {
188
+ if (value instanceof Error) return value;
189
+ let stringified = "[Unable to stringify the thrown value]";
190
+ try {
191
+ stringified = JSON.stringify(value);
192
+ } catch {
193
+ // ignoring failed stringify
194
+ }
195
+ return new Error(`This value was not thrown as type Error: ${stringified}`);
196
+ }
184
197
 
185
198
  class AirServiceError extends BaseError {
186
199
  static from(error) {
@@ -1388,6 +1401,7 @@
1388
1401
  AirMessageTypes.WALLET_INITIALIZED,
1389
1402
  AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST,
1390
1403
  AirMessageTypes.LOGOUT_RESPONSE,
1404
+ AirMessageTypes.OPEN_WINDOW_REQUEST,
1391
1405
  ];
1392
1406
  const AUTH_MESSAGES = [
1393
1407
  AirAuthMessageTypes.INITIALIZATION_RESPONSE,
@@ -1632,6 +1646,37 @@
1632
1646
  walletIframe.contentWindow.postMessage({ type: AirMessageTypes.SETUP_MFA_REQUEST }, origin);
1633
1647
  return response;
1634
1648
  }
1649
+ sendOpenWindowSuccessResponse(walletIframe, windowId, port) {
1650
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1651
+ walletIframe.contentWindow.postMessage({
1652
+ type: AirMessageTypes.OPEN_WINDOW_RESPONSE,
1653
+ payload: {
1654
+ success: true,
1655
+ windowId,
1656
+ },
1657
+ }, walletOrigin, [port]);
1658
+ }
1659
+ sendOpenWindowErrorResponse(walletIframe, windowId, error) {
1660
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1661
+ walletIframe.contentWindow.postMessage({
1662
+ type: AirMessageTypes.OPEN_WINDOW_RESPONSE,
1663
+ payload: {
1664
+ success: false,
1665
+ windowId,
1666
+ errorName: "UNKNOWN_ERROR",
1667
+ errorMessage: error.message,
1668
+ },
1669
+ }, walletOrigin);
1670
+ }
1671
+ sendWindowClosed(walletIframe, windowId) {
1672
+ const { origin: walletOrigin } = new URL(walletIframe.src);
1673
+ walletIframe.contentWindow.postMessage({
1674
+ type: AirMessageTypes.WINDOW_CLOSED,
1675
+ payload: {
1676
+ windowId,
1677
+ },
1678
+ }, walletOrigin);
1679
+ }
1635
1680
  async sendClaimIdRequest(walletIframe, payload) {
1636
1681
  const response = firstValueFrom(this.messages$.pipe(filter((msg) => msg.type === AirMessageTypes.CLAIM_ID_RESPONSE)));
1637
1682
  const { origin } = new URL(walletIframe.src);
@@ -1689,6 +1734,7 @@
1689
1734
 
1690
1735
  const BUILD_ENV = {
1691
1736
  PRODUCTION: "production",
1737
+ UAT: "uat",
1692
1738
  STAGING: "staging",
1693
1739
  DEVELOPMENT: "development",
1694
1740
  };
@@ -1699,6 +1745,11 @@
1699
1745
  walletUrl: "http://localhost:8200",
1700
1746
  logLevel: "debug",
1701
1747
  },
1748
+ [BUILD_ENV.UAT]: {
1749
+ authUrl: "https://auth.uat.air3.com",
1750
+ walletUrl: "https://account.uat.air3.com",
1751
+ logLevel: "info",
1752
+ },
1702
1753
  [BUILD_ENV.STAGING]: {
1703
1754
  authUrl: "https://auth.staging.air3.com",
1704
1755
  walletUrl: "https://account.staging.air3.com",
@@ -1712,6 +1763,24 @@
1712
1763
  };
1713
1764
  const isElement = (element) => element instanceof Element || element instanceof Document;
1714
1765
  const randomId = () => Math.random().toString(36).slice(2);
1766
+ const getWindowFeatures = (width, height) => {
1767
+ const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX;
1768
+ const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY;
1769
+ const w = window.innerWidth
1770
+ ? window.innerWidth
1771
+ : document.documentElement.clientWidth
1772
+ ? document.documentElement.clientWidth
1773
+ : window.screen.width;
1774
+ const h = window.innerHeight
1775
+ ? window.innerHeight
1776
+ : document.documentElement.clientHeight
1777
+ ? document.documentElement.clientHeight
1778
+ : window.screen.height;
1779
+ const systemZoom = 1; // No reliable estimate
1780
+ const left = Math.abs((w - width) / 2 / systemZoom + dualScreenLeft);
1781
+ const top = Math.abs((h - height) / 2 / systemZoom + dualScreenTop);
1782
+ return `titlebar=0,toolbar=0,status=0,location=0,menubar=0,height=${height / systemZoom},width=${width / systemZoom},top=${top},left=${left}`;
1783
+ };
1715
1784
 
1716
1785
  var _AirWalletProvider_instances, _AirWalletProvider_isLoggedIn, _AirWalletProvider_ensureWallet, _AirWalletProvider_getWalletIframeController, _AirWalletProvider_eventListeners, _AirWalletProvider_emit;
1717
1786
  class AirWalletProvider {
@@ -1868,7 +1937,145 @@
1868
1937
  isVisible: false,
1869
1938
  };
1870
1939
 
1871
- var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _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;
1940
+ class WindowController {
1941
+ get messages$() {
1942
+ return this._messages$.asObservable();
1943
+ }
1944
+ constructor(windowUrl, windowId) {
1945
+ this._windowInstance = null;
1946
+ this._messageHandler = null;
1947
+ this._messages$ = new Subject();
1948
+ this.windowUrl = windowUrl;
1949
+ this.windowOrigin = new URL(windowUrl).origin;
1950
+ this.windowId = windowId;
1951
+ }
1952
+ get windowInstance() {
1953
+ return this._windowInstance;
1954
+ }
1955
+ openWindow() {
1956
+ if (this._windowInstance && !this._windowInstance.closed) {
1957
+ this._windowInstance.focus();
1958
+ return this._windowInstance;
1959
+ }
1960
+ const windowInstance = window.open(this.windowUrl, this.windowId, getWindowFeatures(400, 600));
1961
+ if (!windowInstance) {
1962
+ throw new Error("Failed to open window. Popup might be blocked by the browser.");
1963
+ }
1964
+ this._windowInstance = windowInstance;
1965
+ this._messageHandler = (ev) => {
1966
+ if (ev.source !== windowInstance ||
1967
+ ev.origin !== this.windowOrigin ||
1968
+ !ev.data ||
1969
+ !(ev.data instanceof Object)) {
1970
+ return;
1971
+ }
1972
+ this._messages$.next(ev);
1973
+ };
1974
+ window.addEventListener("message", this._messageHandler);
1975
+ const checkWindow = setInterval(() => {
1976
+ if (!this._windowInstance || this._windowInstance?.closed) {
1977
+ this.cleanup();
1978
+ clearInterval(checkWindow);
1979
+ }
1980
+ }, 500);
1981
+ return windowInstance;
1982
+ }
1983
+ postMessage(message, transfer) {
1984
+ if (!this._windowInstance)
1985
+ return;
1986
+ this._windowInstance.postMessage(message, this.windowOrigin, transfer);
1987
+ }
1988
+ onMessage(callback) {
1989
+ const listener = (ev) => {
1990
+ if (ev.source !== this._windowInstance)
1991
+ return;
1992
+ callback(ev);
1993
+ };
1994
+ window.addEventListener("message", listener);
1995
+ const close = () => window.removeEventListener("message", listener);
1996
+ this.onClose(close);
1997
+ return {
1998
+ close,
1999
+ };
2000
+ }
2001
+ cleanup() {
2002
+ if (this._windowInstance && !this._windowInstance.closed) {
2003
+ this._windowInstance.close();
2004
+ }
2005
+ if (this._messageHandler) {
2006
+ window.removeEventListener("message", this._messageHandler);
2007
+ this._messageHandler = null;
2008
+ }
2009
+ if (this._messages$ && !this._messages$.closed) {
2010
+ this._messages$.complete();
2011
+ }
2012
+ this._windowInstance = null;
2013
+ }
2014
+ onClose(callback) {
2015
+ return this._messages$.subscribe({
2016
+ complete: callback,
2017
+ });
2018
+ }
2019
+ }
2020
+
2021
+ class WindowService {
2022
+ constructor() {
2023
+ this.windowControllers = new Map();
2024
+ }
2025
+ static get instance() {
2026
+ return this._instance || (this._instance = new this());
2027
+ }
2028
+ async sendWindowInitializationRequest(windowId, payload, port) {
2029
+ const windowController = this.windowControllers.get(windowId);
2030
+ if (!windowController) {
2031
+ throw new Error("Window controller not found");
2032
+ }
2033
+ const windowInstance = windowController.windowInstance;
2034
+ if (!windowInstance) {
2035
+ throw new Error("Window instance not found");
2036
+ }
2037
+ const response = firstValueFrom(windowController.messages$.pipe(filter((event) => event.data.type === AirMessageTypes.INITIALIZATION_RESPONSE)));
2038
+ windowController.postMessage({ type: AirMessageTypes.INITIALIZATION_REQUEST, payload }, [port]);
2039
+ return (await response).data;
2040
+ }
2041
+ async openAndInitializeWalletServiceWindow({ url, windowId, partnerId, enableLogging, port, }) {
2042
+ if (this.windowControllers.has(windowId)) {
2043
+ throw new Error("Window controller already exists");
2044
+ }
2045
+ const windowController = new WindowController(url, windowId);
2046
+ this.windowControllers.set(windowId, windowController);
2047
+ windowController.openWindow();
2048
+ windowController.onClose(() => {
2049
+ this.removeWindowController(windowId);
2050
+ });
2051
+ await new Promise((resolve, reject) => {
2052
+ windowController.onMessage(async (ev) => {
2053
+ if (ev.data === AirMessageTypes.SERVICE_STARTED) {
2054
+ const { payload } = await this.sendWindowInitializationRequest(windowId, {
2055
+ partnerId,
2056
+ enableLogging,
2057
+ }, port);
2058
+ if (payload.success === false) {
2059
+ reject(new AirServiceError(payload.errorName, payload.errorMessage));
2060
+ }
2061
+ else {
2062
+ resolve();
2063
+ }
2064
+ }
2065
+ });
2066
+ });
2067
+ return windowController;
2068
+ }
2069
+ getWindowController(windowId) {
2070
+ return this.windowControllers.get(windowId);
2071
+ }
2072
+ removeWindowController(windowId) {
2073
+ this.windowControllers.delete(windowId);
2074
+ }
2075
+ }
2076
+ var WindowService$1 = WindowService.instance;
2077
+
2078
+ var _AirService_instances, _AirService_loginResult, _AirService_buildEnv, _AirService_enableLogging, _AirService_partnerId, _AirService_authIframeController, _AirService_isAuthInitialized, _AirService_airAuthListener, _AirService_walletIframeController, _AirService_walletInitialization, _AirService_walletLoggedInResult, _AirService_airWalletProvider, _AirService_ensureWallet, _AirService_initializeWallet, _AirService_subscribeToWalletEvents, _AirService_triggerEventListeners, _AirService_triggerAirAuthInitialized, _AirService_triggerAirAuthLoggedIn, _AirService_triggerAirAuthLoggedOut, _AirService_triggerWalletInitialized, _AirService_createLoginResult, _AirService_createWalletInitializedResult, _AirService_cleanUpAuth, _AirService_cleanUpWallet;
1872
2079
  class AirService {
1873
2080
  constructor({ partnerId }) {
1874
2081
  _AirService_instances.add(this);
@@ -2255,23 +2462,7 @@
2255
2462
  try {
2256
2463
  __classPrivateFieldSet(this, _AirService_walletIframeController, new IframeController(walletUrl, `air-wallet-${randomId()}`), "f");
2257
2464
  __classPrivateFieldGet(this, _AirService_walletIframeController, "f").createIframe();
2258
- AirMessageService$1.messages$.subscribe(async (msg) => {
2259
- switch (msg.type) {
2260
- case AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST: {
2261
- const walletIframeController = __classPrivateFieldGet(this, _AirService_walletIframeController, "f");
2262
- walletIframeController.setIframeVisibility(msg.payload.visible);
2263
- walletIframeController.updateIframeState();
2264
- break;
2265
- }
2266
- case AirMessageTypes.WALLET_LOGIN_RESPONSE: {
2267
- if (msg.payload.success === true && !__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")) {
2268
- __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2269
- __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2270
- }
2271
- break;
2272
- }
2273
- }
2274
- });
2465
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_subscribeToWalletEvents).call(this);
2275
2466
  await new Promise((resolve, reject) => {
2276
2467
  const handleAuthMessage = async (ev) => {
2277
2468
  if (ev.origin !== walletIframeOrigin)
@@ -2310,6 +2501,43 @@
2310
2501
  await __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_cleanUpWallet).call(this);
2311
2502
  throw error;
2312
2503
  }
2504
+ }, _AirService_subscribeToWalletEvents = function _AirService_subscribeToWalletEvents() {
2505
+ AirMessageService$1.messages$.subscribe(async (msg) => {
2506
+ switch (msg.type) {
2507
+ case AirMessageTypes.WALLET_IFRAME_VISIBILITY_REQUEST: {
2508
+ const walletIframeController = __classPrivateFieldGet(this, _AirService_walletIframeController, "f");
2509
+ walletIframeController.setIframeVisibility(msg.payload.visible);
2510
+ walletIframeController.updateIframeState();
2511
+ break;
2512
+ }
2513
+ case AirMessageTypes.WALLET_LOGIN_RESPONSE: {
2514
+ if (msg.payload.success === true && !__classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f")) {
2515
+ __classPrivateFieldSet(this, _AirService_walletLoggedInResult, __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_createWalletInitializedResult).call(this, msg.payload), "f");
2516
+ __classPrivateFieldGet(this, _AirService_instances, "m", _AirService_triggerWalletInitialized).call(this, __classPrivateFieldGet(this, _AirService_walletLoggedInResult, "f"));
2517
+ }
2518
+ break;
2519
+ }
2520
+ case AirMessageTypes.OPEN_WINDOW_REQUEST: {
2521
+ try {
2522
+ const channel = new MessageChannel();
2523
+ const windowController = await WindowService$1.openAndInitializeWalletServiceWindow({
2524
+ url: msg.payload.url,
2525
+ windowId: msg.payload.windowId,
2526
+ partnerId: __classPrivateFieldGet(this, _AirService_partnerId, "f"),
2527
+ enableLogging: __classPrivateFieldGet(this, _AirService_enableLogging, "f"),
2528
+ port: channel.port1,
2529
+ });
2530
+ windowController.onClose(() => AirMessageService$1.sendWindowClosed(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId));
2531
+ AirMessageService$1.sendOpenWindowSuccessResponse(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId, channel.port2);
2532
+ }
2533
+ catch (err) {
2534
+ const error = ensureError(err);
2535
+ AirMessageService$1.sendOpenWindowErrorResponse(__classPrivateFieldGet(this, _AirService_walletIframeController, "f").iframeElement, msg.payload.windowId, error);
2536
+ }
2537
+ break;
2538
+ }
2539
+ }
2540
+ });
2313
2541
  }, _AirService_triggerEventListeners = function _AirService_triggerEventListeners(data) {
2314
2542
  __classPrivateFieldGet(this, _AirService_airAuthListener, "f").forEach((listener) => {
2315
2543
  listener(data);
@@ -1,4 +1,4 @@
1
- import { EIP1193EventMap, EIP1193Provider } from "@mocanetwork/common/src/provider/types";
1
+ import { EIP1193EventMap, EIP1193Provider } from "./common/provider/types";
2
2
  import { AirWalletInitializedResult } from "./interfaces";
3
3
  import { IframeController } from "./iframeController";
4
4
  declare class AirWalletProvider implements EIP1193Provider {
@@ -25,6 +25,9 @@ export declare const AirMessageTypes: {
25
25
  readonly LIST_ALL_SESSION_KEY_SCOPES_REQUEST: "air_list_all_session_key_scopes_request";
26
26
  readonly LIST_ALL_SESSION_KEY_SCOPES_RESPONSE: "air_list_all_session_key_scopes_response";
27
27
  readonly WALLET_IFRAME_VISIBILITY_REQUEST: "air_wallet_iframe_visibility_request";
28
+ readonly OPEN_WINDOW_REQUEST: "air_open_window_request";
29
+ readonly OPEN_WINDOW_RESPONSE: "air_open_window_response";
30
+ readonly WINDOW_CLOSED: "air_window_closed";
28
31
  readonly IS_SMART_ACCOUNT_DEPLOYED_REQUEST: "air_is_smart_account_deployed_request";
29
32
  readonly IS_SMART_ACCOUNT_DEPLOYED_RESPONSE: "air_is_smart_account_deployed_response";
30
33
  readonly LOGOUT_REQUEST: "air_logout_request";
@@ -41,7 +44,7 @@ type AirMessageBaseWithoutPayload<TType extends AirMessageType> = {
41
44
  type AirSuccessPayload = {
42
45
  success: true;
43
46
  };
44
- type AirErrorPayload = {
47
+ export type AirErrorPayload = {
45
48
  success: false;
46
49
  errorName: AirErrorName;
47
50
  errorMessage?: string;
@@ -127,5 +130,15 @@ export type AirWalletIframeVisibilityRequestMessage = AirMessageBase<"air_wallet
127
130
  }>;
128
131
  export type AirLogoutRequestMessage = AirMessageBaseWithoutPayload<"air_logout_request">;
129
132
  export type AirLogoutResponseMessage = AirMessageBase<"air_logout_response", AirSuccessPayload | AirErrorPayload>;
130
- export type AirMessage = AirInitializationRequestMessage | AirInitializationResponseMessage | AirWalletInitializedMessage | AirWalletLoginRequestMessage | AirWalletLoginResponseMessage | AirSetupMfaRequestMessage | AirSetupMfaResponseMessage | AirClaimIdRequestMessage | AirClaimIdResponseMessage | AirInitAuthCommunicationMessage | AirIsSmartAccountDeployedRequestMessage | AirIsSmartAccountDeployedResponseMessage | AirDeploySmartAccountRequestMessage | AirDeploySmartAccountResponseMessage | AirGrantPermissionsRequestMessage | AirGrantPermissionsResponseMessage | AirRevokePermissionsRequestMessage | AirRevokePermissionsResponseMessage | AirExecuteActionRequestMessage | AirExecuteActionResponseMessage | AirListAllSessionKeyScopesRequestMessage | AirListAllSessionKeyScopesResponseMessage | AirWalletIframeVisibilityRequestMessage | AirLogoutRequestMessage | AirLogoutResponseMessage;
133
+ export type AirOpenWindowRequestMessage = AirMessageBase<"air_open_window_request", {
134
+ url: string;
135
+ windowId: string;
136
+ }>;
137
+ export type AirOpenWindowResponseMessage = AirMessageBase<"air_open_window_response", (AirSuccessPayload | AirErrorPayload) & {
138
+ windowId: string;
139
+ }>;
140
+ export type AirWindowClosedMessage = AirMessageBase<"air_window_closed", {
141
+ windowId: string;
142
+ }>;
143
+ export type AirMessage = AirInitializationRequestMessage | AirInitializationResponseMessage | AirWalletInitializedMessage | AirWalletLoginRequestMessage | AirWalletLoginResponseMessage | AirSetupMfaRequestMessage | AirSetupMfaResponseMessage | AirClaimIdRequestMessage | AirClaimIdResponseMessage | AirInitAuthCommunicationMessage | AirIsSmartAccountDeployedRequestMessage | AirIsSmartAccountDeployedResponseMessage | AirDeploySmartAccountRequestMessage | AirDeploySmartAccountResponseMessage | AirGrantPermissionsRequestMessage | AirGrantPermissionsResponseMessage | AirRevokePermissionsRequestMessage | AirRevokePermissionsResponseMessage | AirExecuteActionRequestMessage | AirExecuteActionResponseMessage | AirListAllSessionKeyScopesRequestMessage | AirListAllSessionKeyScopesResponseMessage | AirWalletIframeVisibilityRequestMessage | AirLogoutRequestMessage | AirLogoutResponseMessage | AirOpenWindowRequestMessage | AirOpenWindowResponseMessage | AirWindowClosedMessage;
131
144
  export {};
@@ -6,8 +6,9 @@ export declare function promiseCreator<T>(): {
6
6
  reject: (reason?: string) => void;
7
7
  promise: Promise<T>;
8
8
  };
9
- export declare const isMain: boolean;
10
- export declare const getIFrameOrigin: () => string;
9
+ export declare const isRoot: boolean;
10
+ export declare const getParentOrReferrerOrigin: () => string | undefined;
11
+ export declare const getWindowId: () => string | undefined;
11
12
  export declare const isUnsafeOrigin: (origin: string) => boolean;
12
13
  export declare const isParentHttps: (origin: string) => boolean;
13
14
  export declare const formatPublicKey: (publicKey: string) => string;
@@ -3,6 +3,7 @@ import { AirIdDetails } from "./common/realm/user/types";
3
3
  import { EIP1193Provider as EIP1193ProviderInterface } from "./common/provider/types";
4
4
  export declare const BUILD_ENV: {
5
5
  readonly PRODUCTION: "production";
6
+ readonly UAT: "uat";
6
7
  readonly STAGING: "staging";
7
8
  readonly DEVELOPMENT: "development";
8
9
  };
@@ -50,6 +50,9 @@ declare class AirMessageService {
50
50
  onWalletInitialized(): Promise<import("./common/realm/messaging/types").AirWalletInitializedMessage>;
51
51
  sendWalletLoginRequest(walletIframe: HTMLIFrameElement): Promise<import("./common/realm/messaging/types").AirWalletLoginResponseMessage>;
52
52
  sendSetupMfaRequest(walletIframe: HTMLIFrameElement): Promise<import("./common/realm/messaging/types").AirSetupMfaResponseMessage>;
53
+ sendOpenWindowSuccessResponse(walletIframe: HTMLIFrameElement, windowId: string, port: MessagePort): void;
54
+ sendOpenWindowErrorResponse(walletIframe: HTMLIFrameElement, windowId: string, error: Error): void;
55
+ sendWindowClosed(walletIframe: HTMLIFrameElement, windowId: string): void;
53
56
  sendClaimIdRequest(walletIframe: HTMLIFrameElement, payload: AirClaimIdRequestMessage["payload"]): Promise<import("./common/realm/messaging/types").AirClaimIdResponseMessage>;
54
57
  sendWalletProviderRequest(walletIframe: HTMLIFrameElement, payload: AirWalletProviderMessageRequest["payload"]): Promise<AirWalletProviderMessageResponse>;
55
58
  closeAuthObservables(): void;
@@ -4,3 +4,4 @@ export declare const handleEvent: (handle: EventTarget, eventName: string, handl
4
4
  export declare const htmlToElement: <T extends Element>(html: string) => T;
5
5
  export declare const isElement: (element: unknown) => element is Document | Element;
6
6
  export declare const randomId: () => string;
7
+ export declare const getWindowFeatures: (width: number, height: number) => string;
@@ -0,0 +1,19 @@
1
+ import { Subscription } from "rxjs";
2
+ export declare class WindowController {
3
+ private _windowInstance;
4
+ private _messageHandler;
5
+ private windowUrl;
6
+ private windowOrigin;
7
+ private windowId;
8
+ private _messages$;
9
+ get messages$(): import("rxjs").Observable<MessageEvent<any>>;
10
+ constructor(windowUrl: string, windowId: string);
11
+ get windowInstance(): Window | null;
12
+ openWindow(): Window;
13
+ postMessage(message: unknown, transfer?: Transferable[]): void;
14
+ onMessage(callback: (event: MessageEvent) => void): {
15
+ close: () => void;
16
+ };
17
+ cleanup(): void;
18
+ onClose(callback: () => void): Subscription;
19
+ }
@@ -0,0 +1,18 @@
1
+ import { WindowController } from "./windowController";
2
+ declare class WindowService {
3
+ private static _instance;
4
+ static get instance(): WindowService;
5
+ private windowControllers;
6
+ private sendWindowInitializationRequest;
7
+ openAndInitializeWalletServiceWindow({ url, windowId, partnerId, enableLogging, port, }: {
8
+ url: string;
9
+ windowId: string;
10
+ partnerId: string;
11
+ enableLogging: boolean;
12
+ port: MessagePort;
13
+ }): Promise<WindowController>;
14
+ getWindowController(windowId: string): WindowController;
15
+ removeWindowController(windowId: string): void;
16
+ }
17
+ declare const _default: WindowService;
18
+ export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mocanetwork/airkit",
3
- "version": "1.2.0-beta.0",
3
+ "version": "1.2.0-beta.1",
4
4
  "description": "Air kit to interact with the Moca Network",
5
5
  "main": "dist/airkit.cjs.js",
6
6
  "module": "dist/airkit.esm.js",