From f7a2b0dcff0082454ce93bc8055900f6099019e4 Mon Sep 17 00:00:00 2001 From: Radu-Cristian Popa Date: Mon, 12 Aug 2024 07:54:56 +0300 Subject: [PATCH] Change Awilix container injection mode --- src/background/container.ts | 4 +- src/background/services/background.ts | 45 ++++++++++++++----- src/background/services/deduplicator.ts | 9 +++- src/background/services/heartbeat.ts | 9 +++- src/background/services/monetization.ts | 37 +++++++++++---- src/background/services/openPayments.ts | 17 ++++--- src/background/services/sendToPopup.ts | 7 ++- src/background/services/storage.ts | 15 ++++--- src/background/services/tabEvents.ts | 23 +++++++--- src/background/services/tabState.ts | 9 +++- src/content/container.ts | 4 +- src/content/services/contentScript.ts | 31 +++++++++---- src/content/services/frameManager.ts | 21 ++++++--- .../services/monetizationTagManager.ts | 27 ++++++----- webpack/prod.ts | 2 +- 15 files changed, 184 insertions(+), 76 deletions(-) diff --git a/src/background/container.ts b/src/background/container.ts index 8ce87e85..3fa7ddd3 100644 --- a/src/background/container.ts +++ b/src/background/container.ts @@ -16,7 +16,7 @@ import { createLogger, Logger } from '@/shared/logger' import { LOG_LEVEL } from '@/shared/defines' import { tFactory, type Translation } from '@/shared/helpers' -interface Cradle { +export interface Cradle { logger: Logger browser: Browser events: EventsService @@ -34,7 +34,7 @@ interface Cradle { export const configureContainer = () => { const container = createContainer({ - injectionMode: InjectionMode.CLASSIC + injectionMode: InjectionMode.PROXY }) const logger = createLogger(LOG_LEVEL) diff --git a/src/background/services/background.ts b/src/background/services/background.ts index 360915bf..c1664f88 100644 --- a/src/background/services/background.ts +++ b/src/background/services/background.ts @@ -23,22 +23,45 @@ import { import { OpenPaymentsClientError } from '@interledger/open-payments/dist/client/error' import { getCurrentActiveTab, OPEN_PAYMENTS_ERRORS } from '@/background/utils' import { PERMISSION_HOSTS } from '@/shared/defines' +import type { Cradle } from '@/background/container' type AlarmCallback = Parameters[0] const ALARM_RESET_OUT_OF_FUNDS = 'reset-out-of-funds' export class Background { - constructor( - private browser: Browser, - private openPaymentsService: OpenPaymentsService, - private monetizationService: MonetizationService, - private storage: StorageService, - private logger: Logger, - private tabEvents: TabEvents, - private sendToPopup: SendToPopup, - private events: EventsService, - private heartbeat: Heartbeat - ) {} + private browser: Browser + private openPaymentsService: OpenPaymentsService + private monetizationService: MonetizationService + private storage: StorageService + private logger: Logger + private tabEvents: TabEvents + private sendToPopup: SendToPopup + private events: EventsService + private heartbeat: Heartbeat + + constructor({ + browser, + openPaymentsService, + monetizationService, + storage, + logger, + tabEvents, + sendToPopup, + events, + heartbeat + }: Cradle) { + Object.assign(this, { + browser, + openPaymentsService, + monetizationService, + storage, + sendToPopup, + tabEvents, + logger, + events, + heartbeat + }) + } async start() { this.bindOnInstalled() diff --git a/src/background/services/deduplicator.ts b/src/background/services/deduplicator.ts index 6ac8e2db..95260916 100644 --- a/src/background/services/deduplicator.ts +++ b/src/background/services/deduplicator.ts @@ -1,4 +1,5 @@ -import { Logger } from '@/shared/logger' +import type { Logger } from '@/shared/logger' +import type { Cradle } from '../container' type AsyncFn = (...args: any[]) => Promise @@ -12,9 +13,13 @@ interface DedupeOptions { } export class Deduplicator { + private logger: Logger + private cache: Map = new Map() - constructor(private logger: Logger) {} + constructor({ logger }: Cradle) { + Object.assign(this, { logger }) + } dedupe>( fn: T, diff --git a/src/background/services/heartbeat.ts b/src/background/services/heartbeat.ts index aff206a2..1a8bd856 100644 --- a/src/background/services/heartbeat.ts +++ b/src/background/services/heartbeat.ts @@ -1,7 +1,14 @@ +import type { Cradle } from '@/background/container' import type { Browser } from 'webextension-polyfill' export class Heartbeat { - constructor(private browser: Browser) {} + private browser: Browser + + constructor({ browser }: Cradle) { + Object.assign(this, { + browser + }) + } start() { const alarms = this.browser.alarms diff --git a/src/background/services/monetization.ts b/src/background/services/monetization.ts index 73106bf2..28750e03 100644 --- a/src/background/services/monetization.ts +++ b/src/background/services/monetization.ts @@ -22,17 +22,36 @@ import { } from '@/shared/helpers' import { ALLOWED_PROTOCOLS } from '@/shared/defines' import type { AmountValue, PopupStore, Storage } from '@/shared/types' +import type { Cradle } from '../container' export class MonetizationService { - constructor( - private logger: Logger, - private t: Translation, - private openPaymentsService: OpenPaymentsService, - private storage: StorageService, - private browser: Browser, - private events: EventsService, - private tabState: TabState - ) { + private logger: Logger + private t: Translation + private openPaymentsService: OpenPaymentsService + private storage: StorageService + private browser: Browser + private events: EventsService + private tabState: TabState + + constructor({ + logger, + t, + browser, + storage, + events, + openPaymentsService, + tabState + }: Cradle) { + Object.assign(this, { + logger, + t, + openPaymentsService, + storage, + browser, + events, + tabState + }) + this.registerEventListeners() } diff --git a/src/background/services/openPayments.ts b/src/background/services/openPayments.ts index 479318b9..d536bfa8 100644 --- a/src/background/services/openPayments.ts +++ b/src/background/services/openPayments.ts @@ -36,6 +36,7 @@ import { import type { Deduplicator } from './deduplicator' import type { Logger } from '@/shared/logger' import { OPEN_PAYMENTS_REDIRECT_URL } from '@/shared/defines' +import type { Cradle } from '../container' interface KeyInformation { privateKey: string @@ -108,6 +109,12 @@ const enum InteractionIntent { } export class OpenPaymentsService { + private browser: Browser + private storage: StorageService + private deduplicator: Deduplicator + private logger: Logger + private t: Translation + client?: AuthenticatedClient public switchGrant: OpenPaymentsService['_switchGrant'] @@ -117,13 +124,9 @@ export class OpenPaymentsService { /** Whether a grant has enough balance to make payments */ private isGrantUsable = { recurring: false, oneTime: false } - constructor( - private browser: Browser, - private storage: StorageService, - private deduplicator: Deduplicator, - private logger: Logger, - private t: Translation - ) { + constructor({ browser, storage, deduplicator, logger, t }: Cradle) { + Object.assign(this, { browser, storage, deduplicator, logger, t }) + void this.initialize() this.switchGrant = this.deduplicator.dedupe(this._switchGrant.bind(this)) } diff --git a/src/background/services/sendToPopup.ts b/src/background/services/sendToPopup.ts index dd6b1ac7..079f4e0e 100644 --- a/src/background/services/sendToPopup.ts +++ b/src/background/services/sendToPopup.ts @@ -4,13 +4,18 @@ import { type BackgroundToPopupMessage, type BackgroundToPopupMessagesMap } from '@/shared/messages' +import type { Cradle } from '@/background/container' export class SendToPopup { + private browser: Browser + private isConnected = false private port: Runtime.Port private queue = new Map() - constructor(private browser: Browser) {} + constructor({ browser }: Cradle) { + Object.assign(this, { browser }) + } start() { this.browser.runtime.onConnect.addListener((port) => { diff --git a/src/background/services/storage.ts b/src/background/services/storage.ts index c328d92d..de38dbb7 100644 --- a/src/background/services/storage.ts +++ b/src/background/services/storage.ts @@ -6,10 +6,11 @@ import type { StorageKey, WalletAmount } from '@/shared/types' -import { type Browser } from 'webextension-polyfill' -import { EventsService } from './events' +import type { Browser } from 'webextension-polyfill' +import type { EventsService } from './events' import { bigIntMax, objectEquals, ThrottleBatch } from '@/shared/helpers' import { computeBalance } from '../utils' +import type { Cradle } from '../container' const defaultStorage = { /** @@ -35,15 +36,17 @@ const defaultStorage = { } satisfies Omit export class StorageService { + private browser: Browser + private events: EventsService + private setSpentAmountRecurring: ThrottleBatch<[amount: string]> private setSpentAmountOneTime: ThrottleBatch<[amount: string]> // used as an optimization/cache private currentState: Storage['state'] | null = null - constructor( - private browser: Browser, - private events: EventsService - ) { + constructor({ browser, events }: Cradle) { + Object.assign(this, { browser, events }) + this.setSpentAmountRecurring = new ThrottleBatch( (amount) => this.setSpentAmount('recurring', amount), (args) => [args.reduce((max, [v]) => bigIntMax(max, v), '0')], diff --git a/src/background/services/tabEvents.ts b/src/background/services/tabEvents.ts index 8f26fef8..ab4ba787 100644 --- a/src/background/services/tabEvents.ts +++ b/src/background/services/tabEvents.ts @@ -7,6 +7,7 @@ import { } from '@/shared/helpers' import type { SendToPopup, StorageService, TabState } from '.' import type { Storage, TabId } from '@/shared/types' +import type { Cradle } from '@/background/container' const runtime = browser.runtime const ICONS = { @@ -56,13 +57,21 @@ type CallbackTab> = Parameters[0] export class TabEvents { - constructor( - private storage: StorageService, - private tabState: TabState, - private sendToPopup: SendToPopup, - private t: Translation, - private browser: Browser - ) {} + private storage: StorageService + private tabState: TabState + private sendToPopup: SendToPopup + private t: Translation + private browser: Browser + + constructor({ storage, tabState, sendToPopup, t, browser }: Cradle) { + Object.assign(this, { + storage, + tabState, + sendToPopup, + t, + browser + }) + } onUpdatedTab: CallbackTab<'onUpdated'> = (tabId, changeInfo, tab) => { /** diff --git a/src/background/services/tabState.ts b/src/background/services/tabState.ts index a74c9078..07850842 100644 --- a/src/background/services/tabState.ts +++ b/src/background/services/tabState.ts @@ -2,6 +2,7 @@ import type { MonetizationEventDetails } from '@/shared/messages' import type { TabId } from '@/shared/types' import type { PaymentSession } from './paymentSession' import type { Logger } from '@/shared/logger' +import type { Cradle } from '@/background/container' type State = { monetizationEvent: MonetizationEventDetails @@ -18,10 +19,16 @@ interface SaveOverpayingDetails { type SessionId = string export class TabState { + private logger: Logger + private state = new Map>() private sessions = new Map>() - constructor(private logger: Logger) {} + constructor({ logger }: Cradle) { + Object.assign(this, { + logger + }) + } private getOverpayingStateKey(url: string, walletAddressId: string): string { return `${url}:${walletAddressId}` diff --git a/src/content/container.ts b/src/content/container.ts index 45ac379e..0362b86c 100644 --- a/src/content/container.ts +++ b/src/content/container.ts @@ -6,7 +6,7 @@ import { MonetizationTagManager } from './services/monetizationTagManager' import { LOG_LEVEL } from '@/shared/defines' import { FrameManager } from './services/frameManager' -interface Cradle { +export interface Cradle { logger: Logger browser: Browser document: Document @@ -18,7 +18,7 @@ interface Cradle { export const configureContainer = () => { const container = createContainer({ - injectionMode: InjectionMode.CLASSIC + injectionMode: InjectionMode.PROXY }) const logger = createLogger(LOG_LEVEL) diff --git a/src/content/services/contentScript.ts b/src/content/services/contentScript.ts index d405126a..924013ed 100644 --- a/src/content/services/contentScript.ts +++ b/src/content/services/contentScript.ts @@ -3,19 +3,34 @@ import { MonetizationTagManager } from './monetizationTagManager' import { type Browser } from 'webextension-polyfill' import { BackgroundToContentAction, ToContentMessage } from '@/shared/messages' import { failure } from '@/shared/helpers' -import { FrameManager } from './frameManager' +import type { FrameManager } from './frameManager' +import type { Cradle } from '@/content/container' export class ContentScript { + private browser: Browser + private window: Window + private logger: Logger + private monetizationTagManager: MonetizationTagManager + private frameManager: FrameManager + private isFirstLevelFrame: boolean private isTopFrame: boolean - constructor( - private browser: Browser, - private window: Window, - private logger: Logger, - private monetizationTagManager: MonetizationTagManager, - private frameManager: FrameManager - ) { + constructor({ + browser, + window, + logger, + monetizationTagManager, + frameManager + }: Cradle) { + Object.assign(this, { + browser, + window, + logger, + monetizationTagManager, + frameManager + }) + this.isTopFrame = window === window.top this.isFirstLevelFrame = window.parent === window.top diff --git a/src/content/services/frameManager.ts b/src/content/services/frameManager.ts index 35115943..9977a147 100644 --- a/src/content/services/frameManager.ts +++ b/src/content/services/frameManager.ts @@ -1,13 +1,18 @@ -import { Logger } from '@/shared/logger' +import type { Logger } from '@/shared/logger' import { stopMonetization } from '../lib/messages' import { ContentToContentAction } from '../messages' -import { +import type { ResumeMonetizationPayload, StartMonetizationPayload, StopMonetizationPayload } from '@/shared/messages' +import type { Cradle } from '@/content/container' export class FrameManager { + private window: Window + private document: Document + private logger: Logger + private documentObserver: MutationObserver private frameAllowAttrObserver: MutationObserver private frames = new Map< @@ -15,11 +20,13 @@ export class FrameManager { { frameId: string | null; requestIds: string[] } >() - constructor( - private window: Window, - private document: Document, - private logger: Logger - ) { + constructor({ window, document, logger }: Cradle) { + Object.assign(this, { + window, + document, + logger + }) + this.documentObserver = new MutationObserver((records) => this.onWholeDocumentObserved(records) ) diff --git a/src/content/services/monetizationTagManager.ts b/src/content/services/monetizationTagManager.ts index 2500420c..f80a7c1b 100644 --- a/src/content/services/monetizationTagManager.ts +++ b/src/content/services/monetizationTagManager.ts @@ -1,9 +1,8 @@ import { EventEmitter } from 'events' - import { mozClone } from '../utils' -import { Logger } from '@/shared/logger' -import { MonetizationTagDetails } from '../types' -import { WalletAddress } from '@interledger/open-payments/dist/types' +import type { Logger } from '@/shared/logger' +import type { MonetizationTagDetails } from '../types' +import type { WalletAddress } from '@interledger/open-payments/dist/types' import { checkWalletAddressUrlFormat } from '../utils' import { checkWalletAddressUrlCall, @@ -12,7 +11,7 @@ import { startMonetization, stopMonetization } from '../lib/messages' -import { +import type { EmitToggleWMPayload, MonetizationEventPayload, ResumeMonetizationPayload, @@ -20,6 +19,7 @@ import { StopMonetizationPayload } from '@/shared/messages' import { ContentToContentAction } from '../messages' +import type { Cradle } from '@/content/container' export type MonetizationTag = HTMLLinkElement @@ -29,20 +29,25 @@ interface FireOnMonetizationChangeIfHaveAttributeParams { } export class MonetizationTagManager extends EventEmitter { + private window: Window + private document: Document + private logger: Logger + private isTopFrame: boolean private isFirstLevelFrame: boolean private documentObserver: MutationObserver private monetizationTagAttrObserver: MutationObserver private id: string - private monetizationTags = new Map() - constructor( - private window: Window, - private document: Document, - private logger: Logger - ) { + constructor({ window, document, logger }: Cradle) { super() + Object.assign(this, { + window, + document, + logger + }) + this.documentObserver = new MutationObserver((records) => this.onWholeDocumentObserved(records) ) diff --git a/webpack/prod.ts b/webpack/prod.ts index 9895eaeb..e3e08bb3 100644 --- a/webpack/prod.ts +++ b/webpack/prod.ts @@ -22,7 +22,7 @@ export const getProdConfig = (target: Target): Configuration => { new TerserPlugin({ parallel: true, terserOptions: { - mangle: false, + mangle: true, format: { comments: false }