Skip to content

Commit

Permalink
Change Awilix container injection mode
Browse files Browse the repository at this point in the history
  • Loading branch information
raducristianpopa committed Aug 16, 2024
1 parent 708838e commit f7a2b0d
Show file tree
Hide file tree
Showing 15 changed files with 184 additions and 76 deletions.
4 changes: 2 additions & 2 deletions src/background/container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -34,7 +34,7 @@ interface Cradle {

export const configureContainer = () => {
const container = createContainer<Cradle>({
injectionMode: InjectionMode.CLASSIC
injectionMode: InjectionMode.PROXY
})

const logger = createLogger(LOG_LEVEL)
Expand Down
45 changes: 34 additions & 11 deletions src/background/services/background.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Browser['alarms']['onAlarm']['addListener']>[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()
Expand Down
9 changes: 7 additions & 2 deletions src/background/services/deduplicator.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Logger } from '@/shared/logger'
import type { Logger } from '@/shared/logger'
import type { Cradle } from '../container'

type AsyncFn<T> = (...args: any[]) => Promise<T>

Expand All @@ -12,9 +13,13 @@ interface DedupeOptions {
}

export class Deduplicator {
private logger: Logger

private cache: Map<string, CacheEntry> = new Map()

constructor(private logger: Logger) {}
constructor({ logger }: Cradle) {
Object.assign(this, { logger })
}

dedupe<T extends AsyncFn<any>>(
fn: T,
Expand Down
9 changes: 8 additions & 1 deletion src/background/services/heartbeat.ts
Original file line number Diff line number Diff line change
@@ -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
Expand Down
37 changes: 28 additions & 9 deletions src/background/services/monetization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}

Expand Down
17 changes: 10 additions & 7 deletions src/background/services/openPayments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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']
Expand All @@ -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))
}
Expand Down
7 changes: 6 additions & 1 deletion src/background/services/sendToPopup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<keyof BackgroundToPopupMessagesMap, any>()

constructor(private browser: Browser) {}
constructor({ browser }: Cradle) {
Object.assign(this, { browser })
}

start() {
this.browser.runtime.onConnect.addListener((port) => {
Expand Down
15 changes: 9 additions & 6 deletions src/background/services/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
/**
Expand All @@ -35,15 +36,17 @@ const defaultStorage = {
} satisfies Omit<Storage, 'publicKey' | 'privateKey' | 'keyId'>

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')],
Expand Down
23 changes: 16 additions & 7 deletions src/background/services/tabEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -56,13 +57,21 @@ type CallbackTab<T extends Extract<keyof Browser['tabs'], `on${string}`>> =
Parameters<Browser['tabs'][T]['addListener']>[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) => {
/**
Expand Down
9 changes: 8 additions & 1 deletion src/background/services/tabState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -18,10 +19,16 @@ interface SaveOverpayingDetails {
type SessionId = string

export class TabState {
private logger: Logger

private state = new Map<TabId, Map<string, State>>()
private sessions = new Map<TabId, Map<SessionId, PaymentSession>>()

constructor(private logger: Logger) {}
constructor({ logger }: Cradle) {
Object.assign(this, {
logger
})
}

private getOverpayingStateKey(url: string, walletAddressId: string): string {
return `${url}:${walletAddressId}`
Expand Down
4 changes: 2 additions & 2 deletions src/content/container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -18,7 +18,7 @@ interface Cradle {

export const configureContainer = () => {
const container = createContainer<Cradle>({
injectionMode: InjectionMode.CLASSIC
injectionMode: InjectionMode.PROXY
})

const logger = createLogger(LOG_LEVEL)
Expand Down
31 changes: 23 additions & 8 deletions src/content/services/contentScript.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading

0 comments on commit f7a2b0d

Please sign in to comment.