diff --git a/apps/browser-extension-wallet/src/lib/scripts/background/cip30.ts b/apps/browser-extension-wallet/src/lib/scripts/background/cip30.ts index 40a91d87f4..77c01b465b 100644 --- a/apps/browser-extension-wallet/src/lib/scripts/background/cip30.ts +++ b/apps/browser-extension-wallet/src/lib/scripts/background/cip30.ts @@ -2,7 +2,8 @@ import { cip30 as walletCip30 } from '@cardano-sdk/wallet'; import { ensureUiIsOpenAndLoaded } from './util'; import { userPromptService } from './services/dappService'; import { authenticator } from './authenticator'; -import { dAppConnectorActivity$, wallet$ } from './wallet'; +import { wallet$ } from './wallet'; +import { dAppConnectorActivity$ } from './session/poll-controller'; import { runtime, Tabs, tabs } from 'webextension-polyfill'; import { cip30, exposeApi, RemoteApiPropertyType } from '@cardano-sdk/web-extension'; import { DAPP_CHANNELS } from '../../../utils/constants'; diff --git a/apps/browser-extension-wallet/src/lib/scripts/background/services/utilityServices.ts b/apps/browser-extension-wallet/src/lib/scripts/background/services/utilityServices.ts index af0977c1cd..1cf1b1d83d 100644 --- a/apps/browser-extension-wallet/src/lib/scripts/background/services/utilityServices.ts +++ b/apps/browser-extension-wallet/src/lib/scripts/background/services/utilityServices.ts @@ -16,7 +16,18 @@ import { UnhandledError, WalletMode } from '../../types'; -import { Subject, of, BehaviorSubject, merge, map, fromEvent, Observable } from 'rxjs'; +import { + Subject, + of, + BehaviorSubject, + merge, + map, + fromEvent, + Observable, + filter, + withLatestFrom, + interval +} from 'rxjs'; import { walletRoutePaths } from '@routes/wallet-paths'; import { backgroundServiceProperties } from '../config'; import { ActiveWallet, exposeApi } from '@cardano-sdk/web-extension'; @@ -30,6 +41,7 @@ import { logger } from '@lace/common'; import { POPUP_WINDOW_NAMI_TITLE } from '@utils/constants'; import { catchAndBrandExtensionApiError } from '@utils/catch-and-brand-extension-api-error'; import { initCardanoTokenPrices } from './cardanoTokenPrices'; +import { pollController$ } from '../session/poll-controller'; export const requestMessage$ = new Subject(); export const backendFailures$ = new BehaviorSubject(0); @@ -320,8 +332,15 @@ export const exposeBackgroundService = (wallet$: Observable): void fetchAdaPrice(coinPrices); fetchBitcoinPrice(coinPrices); }; + // Fetch the prices initially, regardless of the session status updatePrices(); - setInterval(updatePrices, ADA_PRICE_CHECK_INTERVAL); + // Fetch the prices periodically, only if the session is active + interval(ADA_PRICE_CHECK_INTERVAL) + .pipe( + withLatestFrom(pollController$), + filter(([, isActive]) => isActive) + ) + .subscribe(updatePrices); exposeApi( { diff --git a/apps/browser-extension-wallet/src/lib/scripts/background/session/poll-controller.ts b/apps/browser-extension-wallet/src/lib/scripts/background/session/poll-controller.ts new file mode 100644 index 0000000000..51e57acbf5 --- /dev/null +++ b/apps/browser-extension-wallet/src/lib/scripts/background/session/poll-controller.ts @@ -0,0 +1,15 @@ +import { Subject, tap } from 'rxjs'; +import { TrackerSubject } from '@cardano-sdk/util-rxjs'; +import { logger } from '@lace/common'; +import { createUserSessionTracker } from './user-session-tracker'; +import { isLacePopupOpen$ } from './is-lace-popup-open'; +import { isLaceTabActive$ } from './is-lace-tab-active'; +import { SESSION_TIMEOUT } from '../config'; + +export const dAppConnectorActivity$ = new Subject(); + +export const pollController$ = new TrackerSubject( + createUserSessionTracker(isLacePopupOpen$, isLaceTabActive$, dAppConnectorActivity$, SESSION_TIMEOUT).pipe( + tap((isActive) => logger.debug('Session active:', isActive)) + ) +); diff --git a/apps/browser-extension-wallet/src/lib/scripts/background/wallet.ts b/apps/browser-extension-wallet/src/lib/scripts/background/wallet.ts index 2f762ae20e..bbbd10e239 100644 --- a/apps/browser-extension-wallet/src/lib/scripts/background/wallet.ts +++ b/apps/browser-extension-wallet/src/lib/scripts/background/wallet.ts @@ -1,19 +1,7 @@ /* eslint-disable unicorn/no-null, no-magic-numbers, promise/catch-or-return, promise/no-nesting */ import { runtime, storage as webStorage } from 'webextension-polyfill'; -import { - BehaviorSubject, - combineLatest, - defaultIfEmpty, - EMPTY, - firstValueFrom, - from, - map, - Observable, - of, - Subject, - tap -} from 'rxjs'; -import { getProviders, SESSION_TIMEOUT } from './config'; +import { BehaviorSubject, combineLatest, defaultIfEmpty, EMPTY, firstValueFrom, from, map, Observable, of } from 'rxjs'; +import { getProviders } from './config'; import { createPersonalWallet, createSharedWallet, DEFAULT_POLLING_CONFIG, storage } from '@cardano-sdk/wallet'; import { Cardano } from '@cardano-sdk/core'; import { @@ -47,8 +35,7 @@ import { ExtensionDocumentStore } from './storage/extension-document-store'; import { ExtensionBlobKeyValueStore } from './storage/extension-blob-key-value-store'; import { ExtensionBlobCollectionStore } from './storage/extension-blob-collection-store'; import { migrateCollectionStore, migrateWalletStores, shouldAttemptWalletStoresMigration } from './storage/migrations'; -import { createUserSessionTracker, isLacePopupOpen$, isLaceTabActive$ } from './session'; -import { TrackerSubject } from '@cardano-sdk/util-rxjs'; +import { pollController$ } from './session/poll-controller'; import { ExperimentName, FeatureFlags } from '../types/feature-flags'; import { TX_HISTORY_LIMIT_SIZE } from '@utils/constants'; import { Bitcoin } from '@lace/bitcoin'; @@ -65,13 +52,6 @@ if (!isBackgroundProcess()) { throw new TypeError('This module should only be imported in service worker'); } -export const dAppConnectorActivity$ = new Subject(); -const pollController$ = new TrackerSubject( - createUserSessionTracker(isLacePopupOpen$, isLaceTabActive$, dAppConnectorActivity$, SESSION_TIMEOUT).pipe( - tap((isActive) => logger.debug('Session active:', isActive)) - ) -); - const networkMagicToChainName = (networkMagic: Cardano.NetworkMagic): Wallet.ChainName => { switch (networkMagic) { case Wallet.Cardano.ChainIds.Mainnet.networkMagic: