@metamask/connect-multichain 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/dist/browser/es/connect-multichain.d.mts +4 -3
  3. package/dist/browser/es/connect-multichain.mjs +52 -25
  4. package/dist/browser/es/connect-multichain.mjs.map +1 -1
  5. package/dist/browser/es/metafile-esm.json +1 -1
  6. package/dist/browser/iife/connect-multichain.d.ts +4 -3
  7. package/dist/browser/iife/connect-multichain.js +68 -33
  8. package/dist/browser/iife/connect-multichain.js.map +1 -1
  9. package/dist/browser/iife/metafile-iife.json +1 -1
  10. package/dist/browser/umd/connect-multichain.d.ts +4 -3
  11. package/dist/browser/umd/connect-multichain.js +52 -25
  12. package/dist/browser/umd/connect-multichain.js.map +1 -1
  13. package/dist/browser/umd/metafile-cjs.json +1 -1
  14. package/dist/node/cjs/connect-multichain.d.ts +4 -3
  15. package/dist/node/cjs/connect-multichain.js +52 -25
  16. package/dist/node/cjs/connect-multichain.js.map +1 -1
  17. package/dist/node/cjs/metafile-cjs.json +1 -1
  18. package/dist/node/es/connect-multichain.d.mts +4 -3
  19. package/dist/node/es/connect-multichain.mjs +52 -25
  20. package/dist/node/es/connect-multichain.mjs.map +1 -1
  21. package/dist/node/es/metafile-esm.json +1 -1
  22. package/dist/react-native/es/connect-multichain.d.mts +4 -3
  23. package/dist/react-native/es/connect-multichain.mjs +52 -25
  24. package/dist/react-native/es/connect-multichain.mjs.map +1 -1
  25. package/dist/react-native/es/metafile-esm.json +1 -1
  26. package/dist/src/domain/multichain/types.d.ts +2 -1
  27. package/dist/src/domain/multichain/types.d.ts.map +1 -1
  28. package/dist/src/multichain/index.d.ts.map +1 -1
  29. package/dist/src/multichain/index.js +11 -6
  30. package/dist/src/multichain/index.js.map +1 -1
  31. package/dist/src/multichain/rpc/requestRouter.d.ts.map +1 -1
  32. package/dist/src/multichain/rpc/requestRouter.js +9 -4
  33. package/dist/src/multichain/rpc/requestRouter.js.map +1 -1
  34. package/dist/src/multichain/transports/default/index.d.ts +2 -0
  35. package/dist/src/multichain/transports/default/index.d.ts.map +1 -1
  36. package/dist/src/multichain/transports/default/index.js +13 -0
  37. package/dist/src/multichain/transports/default/index.js.map +1 -1
  38. package/dist/src/multichain/transports/mwp/index.d.ts +2 -1
  39. package/dist/src/multichain/transports/mwp/index.d.ts.map +1 -1
  40. package/dist/src/multichain/transports/mwp/index.js +22 -12
  41. package/dist/src/multichain/transports/mwp/index.js.map +1 -1
  42. package/dist/src/ui/index.d.ts +2 -2
  43. package/dist/src/ui/index.d.ts.map +1 -1
  44. package/dist/src/ui/index.js +5 -5
  45. package/dist/src/ui/index.js.map +1 -1
  46. package/dist/types/connect-multichain.d.ts +4 -3
  47. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.3.2]
11
+
12
+ ### Added
13
+
14
+ - Add connection id to simple deeplinks ([#63](https://github.com/MetaMask/metamask-connect-monorepo/pull/63))
15
+
16
+ ## [0.3.1]
17
+
18
+ ### Changed
19
+
20
+ - Bump `@metamask/multichain-api-client` to prevent `RPC request with id already seen.` error on extension when using firefox ([#60](https://github.com/MetaMask/connect-monorepo/pull/60))
21
+
22
+ ### Fixed
23
+
24
+ - Fixed incorrect caching of error responses for some requests/events ([#59](https://github.com/MetaMask/connect-monorepo/pull/59))
25
+
10
26
  ## [0.3.0]
11
27
 
12
28
  ### Changed
@@ -56,7 +72,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
56
72
 
57
73
  - Initial release
58
74
 
59
- [Unreleased]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.3.0...HEAD
75
+ [Unreleased]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.3.2...HEAD
76
+ [0.3.2]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.3.1...@metamask/connect-multichain@0.3.2
77
+ [0.3.1]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.3.0...@metamask/connect-multichain@0.3.1
60
78
  [0.3.0]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.2.1...@metamask/connect-multichain@0.3.0
61
79
  [0.2.1]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.2.0...@metamask/connect-multichain@0.2.1
62
80
  [0.2.0]: https://github.com/MetaMask/metamask-connect-monorepo/compare/@metamask/connect-multichain@0.1.0...@metamask/connect-multichain@0.2.0
@@ -2,7 +2,7 @@ import debug from 'debug';
2
2
  import { SessionData, Transport, TransportRequest, TransportResponse, MultichainApiClient } from '@metamask/multichain-api-client';
3
3
  export { SessionData } from '@metamask/multichain-api-client';
4
4
  import { CaipAccountId, Json } from '@metamask/utils';
5
- import { SessionRequest } from '@metamask/mobile-wallet-protocol-core';
5
+ import { SessionRequest, Session } from '@metamask/mobile-wallet-protocol-core';
6
6
  import { Components } from '@metamask/multichain-ui';
7
7
 
8
8
  type Enumerate<N extends number, Acc extends number[] = []> = Acc['length'] extends N ? Acc[number] : Enumerate<N, [...Acc, Acc['length']]>;
@@ -326,8 +326,8 @@ declare class ModalFactory<T extends FactoryModals = FactoryModals> {
326
326
  get isWeb(): boolean;
327
327
  private getContainer;
328
328
  private getMountedContainer;
329
- createDeeplink(connectionRequest?: ConnectionRequest): string;
330
- createUniversalLink(connectionRequest?: ConnectionRequest): string;
329
+ createConnectionDeeplink(connectionRequest?: ConnectionRequest): string;
330
+ createConnectionUniversalLink(connectionRequest?: ConnectionRequest): string;
331
331
  private onCloseModal;
332
332
  private onStartDesktopOnboarding;
333
333
  renderInstallModal(showInstallModal: boolean, createConnectionRequest: () => Promise<ConnectionRequest>, successCallback: (error?: Error) => Promise<void>): Promise<void>;
@@ -444,6 +444,7 @@ type ExtendedTransport = Omit<Transport, 'connect'> & {
444
444
  sendEip1193Message: <TRequest extends TransportRequest, TResponse extends TransportResponse>(request: TRequest, options?: {
445
445
  timeout?: number;
446
446
  }) => Promise<TResponse>;
447
+ getActiveSession: () => Promise<Session | undefined>;
447
448
  };
448
449
 
449
450
  declare const infuraRpcUrls: RpcUrlsMap;
@@ -1337,13 +1337,18 @@ var RequestRouter = class {
1337
1337
  const secure = isSecure();
1338
1338
  const shouldOpenDeeplink = secure && !showInstallModal;
1339
1339
  if (shouldOpenDeeplink) {
1340
- setTimeout(() => {
1340
+ setTimeout(() => __async(this, null, function* () {
1341
+ const session = yield this.transport.getActiveSession();
1342
+ if (!session) {
1343
+ throw new Error("No active session found");
1344
+ }
1345
+ const url = `${METAMASK_DEEPLINK_BASE}/mwp?id=${encodeURIComponent(session.id)}`;
1341
1346
  if (mobile == null ? void 0 : mobile.preferredOpenLink) {
1342
- mobile.preferredOpenLink(METAMASK_DEEPLINK_BASE, "_self");
1347
+ mobile.preferredOpenLink(url, "_self");
1343
1348
  } else {
1344
- openDeeplink(this.config, METAMASK_DEEPLINK_BASE, METAMASK_CONNECT_BASE_URL);
1349
+ openDeeplink(this.config, url, METAMASK_CONNECT_BASE_URL);
1345
1350
  }
1346
- }, 10);
1351
+ }), 10);
1347
1352
  }
1348
1353
  const response = yield request;
1349
1354
  if (response.error) {
@@ -1565,6 +1570,10 @@ var DefaultTransport = class {
1565
1570
  window.removeEventListener("message", __privateGet(this, _handleResponseListener));
1566
1571
  __privateSet(this, _handleResponseListener, void 0);
1567
1572
  }
1573
+ if (__privateGet(this, _handleNotificationListener)) {
1574
+ window.removeEventListener("message", __privateGet(this, _handleNotificationListener));
1575
+ __privateSet(this, _handleNotificationListener, void 0);
1576
+ }
1568
1577
  for (const [, request] of __privateGet(this, _pendingRequests)) {
1569
1578
  clearTimeout(request.timeout);
1570
1579
  request.reject(new Error("Transport disconnected"));
@@ -1588,6 +1597,9 @@ var DefaultTransport = class {
1588
1597
  __privateGet(this, _notificationCallbacks).delete(callback);
1589
1598
  };
1590
1599
  }
1600
+ getActiveSession() {
1601
+ throw new Error("getActiveSession is purposely not implemented for the DefaultTransport");
1602
+ }
1591
1603
  };
1592
1604
  _notificationCallbacks = new WeakMap();
1593
1605
  _transport = new WeakMap();
@@ -1872,16 +1884,10 @@ var MWPTransport = class {
1872
1884
  }
1873
1885
  connect(options) {
1874
1886
  return __async(this, null, function* () {
1875
- const { dappClient, kvstore } = this;
1876
- const sessionStore = new SessionStore(kvstore);
1877
- let session;
1878
- try {
1879
- const [activeSession] = yield sessionStore.list();
1880
- if (activeSession) {
1881
- logger("active session found", activeSession);
1882
- session = activeSession;
1883
- }
1884
- } catch (e) {
1887
+ const { dappClient } = this;
1888
+ const session = yield this.getActiveSession();
1889
+ if (session) {
1890
+ logger("active session found", session);
1885
1891
  }
1886
1892
  let timeout;
1887
1893
  const connectionPromise = new Promise((resolve, reject) => {
@@ -2052,6 +2058,9 @@ var MWPTransport = class {
2052
2058
  }
2053
2059
  storeWalletSession(request, response) {
2054
2060
  return __async(this, null, function* () {
2061
+ if (response.error) {
2062
+ return;
2063
+ }
2055
2064
  if (CACHED_METHOD_LIST.includes(request.method)) {
2056
2065
  yield this.kvstore.set(SESSION_STORE_KEY, JSON.stringify(response));
2057
2066
  } else if (request.method === "eth_accounts") {
@@ -2110,6 +2119,19 @@ var MWPTransport = class {
2110
2119
  this.notificationCallbacks.delete(callback);
2111
2120
  };
2112
2121
  }
2122
+ getActiveSession() {
2123
+ return __async(this, null, function* () {
2124
+ const { kvstore } = this;
2125
+ const sessionStore = new SessionStore(kvstore);
2126
+ try {
2127
+ const [activeSession] = yield sessionStore.list();
2128
+ return activeSession;
2129
+ } catch (error) {
2130
+ logger("error getting active session", error);
2131
+ return void 0;
2132
+ }
2133
+ });
2134
+ }
2113
2135
  };
2114
2136
 
2115
2137
  // src/multichain/transports/mwp/KeyManager.ts
@@ -2493,8 +2515,8 @@ var MultichainSDK = class _MultichainSDK extends MultichainCore {
2493
2515
  sdk: { version: getVersion(), platform: getPlatformType() }
2494
2516
  }
2495
2517
  };
2496
- const deeplink = this.options.ui.factory.createDeeplink(connectionRequest);
2497
- const universalLink = this.options.ui.factory.createUniversalLink(connectionRequest);
2518
+ const deeplink = this.options.ui.factory.createConnectionDeeplink(connectionRequest);
2519
+ const universalLink = this.options.ui.factory.createConnectionUniversalLink(connectionRequest);
2498
2520
  if ((_a = this.options.mobile) == null ? void 0 : _a.preferredOpenLink) {
2499
2521
  this.options.mobile.preferredOpenLink(deeplink, "_self");
2500
2522
  } else {
@@ -2677,17 +2699,22 @@ var MultichainSDK = class _MultichainSDK extends MultichainCore {
2677
2699
  const secure = isSecure();
2678
2700
  const shouldOpenDeeplink = secure && !showInstallModal;
2679
2701
  if (shouldOpenDeeplink) {
2680
- setTimeout(() => {
2702
+ setTimeout(() => __async(this, null, function* () {
2703
+ const session = yield this.transport.getActiveSession();
2704
+ if (!session) {
2705
+ throw new Error("No active session found");
2706
+ }
2707
+ const url = `${METAMASK_DEEPLINK_BASE}/mwp?id=${encodeURIComponent(session.id)}`;
2681
2708
  if (mobile == null ? void 0 : mobile.preferredOpenLink) {
2682
- mobile.preferredOpenLink(METAMASK_DEEPLINK_BASE, "_self");
2709
+ mobile.preferredOpenLink(url, "_self");
2683
2710
  } else {
2684
2711
  openDeeplink(
2685
2712
  this.options,
2686
- METAMASK_DEEPLINK_BASE,
2713
+ url,
2687
2714
  METAMASK_CONNECT_BASE_URL
2688
2715
  );
2689
2716
  }
2690
- }, 10);
2717
+ }), 10);
2691
2718
  }
2692
2719
  }
2693
2720
  };
@@ -2979,16 +3006,16 @@ var ModalFactory = class {
2979
3006
  }
2980
3007
  return container;
2981
3008
  }
2982
- createDeeplink(connectionRequest) {
3009
+ createConnectionDeeplink(connectionRequest) {
2983
3010
  if (!connectionRequest) {
2984
- throw new Error("createDeeplink can only be called with a connection request");
3011
+ throw new Error("createConnectionDeeplink can only be called with a connection request");
2985
3012
  }
2986
3013
  const json = JSON.stringify(connectionRequest);
2987
3014
  const compressed = compressString(json);
2988
3015
  const urlEncoded = encodeURIComponent(compressed);
2989
3016
  return `${METAMASK_DEEPLINK_BASE}/mwp?p=${urlEncoded}&c=1`;
2990
3017
  }
2991
- createUniversalLink(connectionRequest) {
3018
+ createConnectionUniversalLink(connectionRequest) {
2992
3019
  if (!connectionRequest) {
2993
3020
  return `${METAMASK_CONNECT_BASE_URL}`;
2994
3021
  }
@@ -3015,7 +3042,7 @@ var ModalFactory = class {
3015
3042
  this.successCallback = successCallback;
3016
3043
  const parentElement = this.getMountedContainer();
3017
3044
  const connectionRequest = yield createConnectionRequest();
3018
- const qrCodeLink = this.createDeeplink(connectionRequest);
3045
+ const qrCodeLink = this.createConnectionDeeplink(connectionRequest);
3019
3046
  const modal = new this.options.InstallModal({
3020
3047
  expiresIn: (connectionRequest.sessionRequest.expiresAt - Date.now()) / 1e3,
3021
3048
  connectionRequest,
@@ -3024,7 +3051,7 @@ var ModalFactory = class {
3024
3051
  link: qrCodeLink,
3025
3052
  sdkVersion: getVersion(),
3026
3053
  generateQRCode: (request) => __async(this, null, function* () {
3027
- return this.createDeeplink(request);
3054
+ return this.createConnectionDeeplink(request);
3028
3055
  }),
3029
3056
  onClose: this.onCloseModal.bind(this),
3030
3057
  startDesktopOnboarding: this.onStartDesktopOnboarding.bind(this),