@sundaeswap/wallet-lite 0.0.102 → 0.0.104

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 (22) hide show
  1. package/dist/cjs/classes/WalletObserver.class.js +236 -172
  2. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  3. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +35 -22
  4. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  5. package/dist/cjs/react-components/hooks/useWalletObserver.js +2 -1
  6. package/dist/cjs/react-components/hooks/useWalletObserver.js.map +1 -1
  7. package/dist/esm/classes/WalletObserver.class.js +49 -0
  8. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  9. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +4 -0
  10. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  11. package/dist/esm/react-components/hooks/useWalletObserver.js +2 -1
  12. package/dist/esm/react-components/hooks/useWalletObserver.js.map +1 -1
  13. package/dist/types/classes/WalletObserver.class.d.ts +11 -0
  14. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  15. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +1 -0
  16. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  17. package/dist/types/react-components/hooks/useWalletObserver.d.ts.map +1 -1
  18. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  19. package/package.json +1 -1
  20. package/src/classes/WalletObserver.class.ts +54 -0
  21. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +5 -0
  22. package/src/react-components/hooks/useWalletObserver.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sundaeswap/wallet-lite",
3
- "version": "0.0.102",
3
+ "version": "0.0.104",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -58,6 +58,9 @@ export class WalletObserver<
58
58
  // Caching
59
59
  private _cachedMetadata: Map<string, AssetMetadata> = new Map();
60
60
 
61
+ // AbortController for cancelling in-flight metadata fetches when metadataResolver changes
62
+ private _metadataAbortController: AbortController | null = null;
63
+
61
64
  /**
62
65
  * Creates an instance of WalletObserver.
63
66
  *
@@ -296,16 +299,33 @@ export class WalletObserver<
296
299
 
297
300
  /**
298
301
  * Updates the wallet observer options. Merges the new options with the existing ones.
302
+ * If metadataResolver changes, cancels any in-flight metadata fetch, clears the cache,
303
+ * and triggers a new sync if there is an active connection.
299
304
  *
300
305
  * @param {Partial<TWalletObserverOptions<AssetMetadata>>} options - The new options to merge.
301
306
  */
302
307
  updateOptions = (
303
308
  options: Partial<TWalletObserverOptions<AssetMetadata>>,
304
309
  ): void => {
310
+ const metadataResolverChanged =
311
+ options.metadataResolver &&
312
+ options.metadataResolver !== this._options.metadataResolver;
313
+
305
314
  this._options = merge<
306
315
  IResolvedWalletObserverOptions<AssetMetadata>,
307
316
  typeof options
308
317
  >(this._options, options);
318
+
319
+ // If metadataResolver changed, abort in-flight fetch, clear cache, and re-sync
320
+ if (metadataResolverChanged) {
321
+ this._metadataAbortController?.abort();
322
+ this._cachedMetadata = new Map();
323
+
324
+ // Trigger a new sync if there's an active connection
325
+ if (this.hasActiveConnection() && !this._performingSync) {
326
+ this.sync();
327
+ }
328
+ }
309
329
  };
310
330
 
311
331
  /**
@@ -419,6 +439,24 @@ export class WalletObserver<
419
439
  getCachedAssetMetadata = (): Map<string, AssetMetadata> =>
420
440
  this._cachedMetadata;
421
441
 
442
+ /**
443
+ * Clears the cached metadata and triggers a fresh sync to re-fetch metadata.
444
+ * Useful when the client wants to manually refresh metadata without changing the resolver.
445
+ *
446
+ * @returns {Promise<void>}
447
+ */
448
+ resyncMetadata = async (): Promise<void> => {
449
+ // Abort any in-flight fetch
450
+ this._metadataAbortController?.abort();
451
+ // Clear the cache
452
+ this._cachedMetadata = new Map();
453
+
454
+ // Trigger a new sync if there's an active connection
455
+ if (this.hasActiveConnection()) {
456
+ await this.sync();
457
+ }
458
+ };
459
+
422
460
  /**
423
461
  * Helper function to restore the class instance to its initial state.
424
462
  *
@@ -754,6 +792,7 @@ export class WalletObserver<
754
792
 
755
793
  /**
756
794
  * Resolves metadata for the given asset IDs, using a cached version if available.
795
+ * Aborts any in-flight fetch when called, ensuring only the latest request completes.
757
796
  *
758
797
  * @private
759
798
  * @param {string[]} assetIds - The IDs of the assets to resolve metadata for.
@@ -780,6 +819,11 @@ export class WalletObserver<
780
819
  }
781
820
  }
782
821
 
822
+ // Abort any in-flight metadata fetch
823
+ this._metadataAbortController?.abort();
824
+ this._metadataAbortController = new AbortController();
825
+ const currentController = this._metadataAbortController;
826
+
783
827
  let attempts = 0;
784
828
  let newMetadata: Map<string, AssetMetadata> | undefined;
785
829
  while (attempts <= 3 && !newMetadata) {
@@ -794,6 +838,11 @@ export class WalletObserver<
794
838
  }
795
839
  }
796
840
 
841
+ // If this request was aborted while in-flight, return current cache (a new fetch is in progress)
842
+ if (currentController.signal.aborted) {
843
+ return this._cachedMetadata;
844
+ }
845
+
797
846
  if (!newMetadata) {
798
847
  newMetadata = await this.fallbackMetadataResolver({
799
848
  assetIds: assetIds.map(normalizeAssetIdWithDot),
@@ -802,6 +851,11 @@ export class WalletObserver<
802
851
  });
803
852
  }
804
853
 
854
+ // Double-check abort status after fallback resolver
855
+ if (currentController.signal.aborted) {
856
+ return this._cachedMetadata;
857
+ }
858
+
805
859
  this._cachedMetadata = newMetadata;
806
860
 
807
861
  const end = performance.now();
@@ -80,6 +80,10 @@ export const useWalletObserverState = <
80
80
  [observer, setSwitching, setIsReadOnlyMode],
81
81
  );
82
82
 
83
+ const resyncMetadata = useCallback(async () => {
84
+ await observer.resyncMetadata();
85
+ }, [observer]);
86
+
83
87
  const syncWallet = useCallback(
84
88
  async (importedData?: IWalletObserverSync<AssetMetadata> | undefined) => {
85
89
  if (observer.isSyncing() || !observer.hasActiveConnection()) {
@@ -222,6 +226,7 @@ export const useWalletObserverState = <
222
226
  isReadOnlyMode,
223
227
  network,
224
228
  changeAddress,
229
+ resyncMetadata,
225
230
  setActiveWallet,
226
231
  setAdaBalance,
227
232
  setBalance,
@@ -39,6 +39,7 @@ export const useWalletObserver = <
39
39
  changeAddress: state.changeAddress,
40
40
  network: state.network,
41
41
  observer: state.observer,
42
+ resyncMetadata: state.resyncMetadata,
42
43
  stakeAddress: state.stakeAddress,
43
44
  switching: state.switching,
44
45
  syncWallet: state.syncWallet,
@@ -63,6 +64,7 @@ export const useWalletObserver = <
63
64
  state.mainAddress,
64
65
  state.network,
65
66
  state.observer,
67
+ state.resyncMetadata,
66
68
  state.stakeAddress,
67
69
  state.switching,
68
70
  state.syncWallet,