Skip to content

Commit 8b6d10c

Browse files
authored
refactor(bg): pass constructible classes in deps for testability (#1096)
1 parent 5b88804 commit 8b6d10c

4 files changed

Lines changed: 21 additions & 8 deletions

File tree

src/background/container.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import {
1919
EventsService,
2020
Heartbeat,
2121
Deduplicator,
22+
PaymentSession,
23+
PaymentManager,
2224
} from './services';
2325
import { createLogger, type Logger, type RootLogger } from '@/shared/logger';
2426
import { LOG_LEVEL } from '@/shared/defines';
@@ -59,6 +61,8 @@ export interface Cradle {
5961
tabState: TabState;
6062
windowState: WindowState;
6163
heartbeat: Heartbeat;
64+
PaymentSession: typeof PaymentSession;
65+
PaymentManager: typeof PaymentManager;
6266
}
6367

6468
export const configureContainer = () => {
@@ -134,6 +138,8 @@ export const configureContainer = () => {
134138
logger: logger.getLogger('window-state'),
135139
})),
136140
heartbeat: asClass(Heartbeat).singleton(),
141+
PaymentSession: asValue(PaymentSession),
142+
PaymentManager: asValue(PaymentManager),
137143
});
138144

139145
return container;

src/background/services/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ export { SendToPort } from './sendToPort';
1111
export { EventsService } from './events';
1212
export { Deduplicator } from './deduplicator';
1313
export { Heartbeat } from './heartbeat';
14+
export { PaymentManager } from './paymentManager';
15+
export { PaymentSession } from './paymentSession';

src/background/services/monetization.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type {
66
StartMonetizationPayload,
77
StopMonetizationPayload,
88
} from '@/shared/messages';
9-
import { PaymentManager } from './paymentManager';
109
import { getSender, getTabId } from '@/background/utils';
1110
import { OUTGOING_PAYMENT_POLLING_MAX_DURATION } from '@/background/config';
1211
import {
@@ -29,6 +28,8 @@ export class MonetizationService {
2928
private tabState: Cradle['tabState'];
3029
private windowState: Cradle['windowState'];
3130
private message: Cradle['message'];
31+
private PaymentSession: Cradle['PaymentSession'];
32+
private PaymentManager: Cradle['PaymentManager'];
3233

3334
constructor({
3435
logger,
@@ -41,6 +42,8 @@ export class MonetizationService {
4142
tabState,
4243
windowState,
4344
message,
45+
PaymentSession,
46+
PaymentManager,
4447
}: Cradle) {
4548
Object.assign(this, {
4649
logger,
@@ -53,6 +56,8 @@ export class MonetizationService {
5356
tabState,
5457
windowState,
5558
message,
59+
PaymentSession,
60+
PaymentManager,
5661
});
5762

5863
this.registerEventListeners();
@@ -93,7 +98,7 @@ export class MonetizationService {
9398
let paymentManager = this.tabState.paymentManagers.get(tabId);
9499
if (!paymentManager) {
95100
const url = removeQueryParams(this.tabState.url.get(tabId) || fullUrl!);
96-
paymentManager = new PaymentManager(
101+
paymentManager = new this.PaymentManager(
97102
tabId,
98103
url,
99104
connectedWallet,
@@ -109,6 +114,7 @@ export class MonetizationService {
109114
),
110115
rootLogger: this.rootLogger,
111116
message: this.message,
117+
PaymentSession: this.PaymentSession,
112118
},
113119
);
114120
this.tabState.paymentManagers.set(tabId, paymentManager);

src/background/services/paymentManager.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type {
44
WalletAddress,
55
} from '@interledger/open-payments';
66
import type { Cradle as Cradle_ } from '@/background/container';
7-
import { PaymentSession } from './paymentSession';
7+
import type { PaymentSession } from './paymentSession';
88
import {
99
MIN_PAYMENT_WAIT,
1010
OUTGOING_PAYMENT_POLLING_MAX_ATTEMPTS,
@@ -17,7 +17,6 @@ import {
1717
sleep,
1818
Timeout,
1919
} from '@/shared/helpers';
20-
import { isOutOfBalanceError } from './openPayments';
2120

2221
type Cradle = Pick<
2322
Cradle_,
@@ -29,6 +28,7 @@ type Cradle = Pick<
2928
| 'events'
3029
| 'tabState'
3130
| 'message'
31+
| 'PaymentSession'
3232
>;
3333

3434
/** Payable amount to increase by {@linkcode Interval.units} every {@linkcode Interval.duration}ms. */
@@ -159,7 +159,6 @@ export class PaymentManager {
159159
this.tabId,
160160
this.sender,
161161
this.rootLogger,
162-
PaymentSession,
163162
this.deps,
164163
);
165164
this.streams.set(frameId, stream);
@@ -202,6 +201,7 @@ export class PaymentManager {
202201
payableSessions: PaymentSession[],
203202
signal?: AbortSignal,
204203
) {
204+
const { isOutOfBalanceError } = await import('./openPayments');
205205
const outgoingPayments = new Map<string, OutgoingPayment | null>(
206206
payableSessions.map((session, i) => [
207207
session.id,
@@ -497,8 +497,7 @@ export class PaymentStream {
497497
private readonly tabId: TabId,
498498
private sender: WalletAddress,
499499
private rootLogger: Cradle['rootLogger'],
500-
private PaymentSessionConstructor: typeof PaymentSession,
501-
private deps: ConstructorParameters<typeof PaymentSession>[6],
500+
private deps: Cradle,
502501
) {
503502
this.iter = this.sessionsIter(this);
504503
}
@@ -510,7 +509,7 @@ export class PaymentStream {
510509
session.enable(); // if was disabled earlier
511510
return session;
512511
}
513-
session = new this.PaymentSessionConstructor(
512+
session = new this.deps.PaymentSession(
514513
receiver,
515514
sessionId,
516515
this.tabId,

0 commit comments

Comments
 (0)