@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.
- package/dist/cjs/classes/WalletObserver.class.js +236 -172
- package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +35 -22
- package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/cjs/react-components/hooks/useWalletObserver.js +2 -1
- package/dist/cjs/react-components/hooks/useWalletObserver.js.map +1 -1
- package/dist/esm/classes/WalletObserver.class.js +49 -0
- package/dist/esm/classes/WalletObserver.class.js.map +1 -1
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +4 -0
- package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
- package/dist/esm/react-components/hooks/useWalletObserver.js +2 -1
- package/dist/esm/react-components/hooks/useWalletObserver.js.map +1 -1
- package/dist/types/classes/WalletObserver.class.d.ts +11 -0
- package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts +1 -0
- package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
- package/dist/types/react-components/hooks/useWalletObserver.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/classes/WalletObserver.class.ts +54 -0
- package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +5 -0
- package/src/react-components/hooks/useWalletObserver.ts +2 -0
package/package.json
CHANGED
|
@@ -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,
|