Skip to content

Commit 0d6624d

Browse files
committed
feat!: overhaul continuous payments logic
1 parent 7c2071d commit 0d6624d

11 files changed

Lines changed: 432 additions & 298 deletions

File tree

src/background/config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ export const DEFAULT_RATE_OF_PAY = '60';
55
export const MIN_RATE_OF_PAY = '1';
66
export const MAX_RATE_OF_PAY = '100';
77

8+
/** Minimum wait time between two consecutive continuous payments */
9+
export const MIN_PAYMENT_WAIT = 2000;
10+
811
export const EXCHANGE_RATES_URL =
912
'https://telemetry-exchange-rates.s3.amazonaws.com/exchange-rates-usd.json';
1013

src/background/services/monetization.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ export class MonetizationService {
121121
);
122122

123123
this.events.emit('monetization.state_update', tabId);
124-
await paymentManager.adjustAmount();
125124

126125
if (
127126
enabled &&
@@ -145,30 +144,35 @@ export class MonetizationService {
145144
payload: StopMonetizationPayload,
146145
sender: Runtime.MessageSender,
147146
) {
148-
let needsAdjustAmount = false;
149147
const { tabId, frameId } = getSender(sender);
150148
const paymentManager = this.tabState.paymentManagers.get(tabId);
151149
if (!paymentManager) {
152150
this.logger.warn(`No payment manager found for tab ${tabId}.`);
153151
return;
154152
}
155153

154+
let removedCount = 0;
155+
let pausedCount = 0;
156156
for (const { requestId, intent } of payload) {
157157
if (intent === 'remove') {
158158
paymentManager.removeSession(requestId, frameId);
159-
needsAdjustAmount = true;
159+
removedCount++;
160160
} else if (intent === 'disable') {
161161
paymentManager.disableSession(requestId, frameId);
162-
needsAdjustAmount = true;
163162
} else {
164-
paymentManager.stopSession(requestId, frameId);
163+
paymentManager.deactivateSession(requestId, frameId);
164+
pausedCount++;
165165
}
166166
}
167167

168-
if (needsAdjustAmount) {
169-
this.events.emit('monetization.state_update', tabId);
170-
await paymentManager.adjustAmount();
168+
if (pausedCount > 0 && paymentManager.payableSessions.length === 0) {
169+
paymentManager?.pause('all-paused');
171170
}
171+
if (removedCount > 0 && paymentManager.size === 0) {
172+
this.tabState.paymentManagers.destroy(tabId);
173+
}
174+
175+
this.events.emit('monetization.state_update', tabId);
172176
}
173177

174178
async resumePaymentSession(
@@ -179,7 +183,7 @@ export class MonetizationService {
179183
const paymentManager = this.tabState.paymentManagers.get(tabId);
180184

181185
if (!paymentManager) {
182-
this.logger.debug(`No payment manager found for tab ${tabId}.`);
186+
this.logger.warn(`No payment manager found for tab ${tabId}.`);
183187
// If there are no sessions and we got a resume call, treat it as a fresh
184188
// start call. The sessions could be cleared as:
185189
// - the background script/worker had terminated, so all sessions (stored
@@ -401,8 +405,8 @@ export class MonetizationService {
401405
}
402406

403407
private stopAllSessions() {
404-
for (const session of this.tabState.getAllSessions()) {
405-
session.stop();
408+
for (const paymentManager of this.tabState.paymentManagers.values()) {
409+
paymentManager.stop();
406410
}
407411
this.logger.debug('All payment sessions stopped.');
408412
}

0 commit comments

Comments
 (0)