From 516185c5aa906b46021e1ca20137298699c62b0c Mon Sep 17 00:00:00 2001 From: Diana Fulga Date: Thu, 6 Jun 2024 10:25:58 +0300 Subject: [PATCH 1/5] Add intent to background --- src/background/services/monetization.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/background/services/monetization.ts b/src/background/services/monetization.ts index 5338bb02..c784f2a6 100644 --- a/src/background/services/monetization.ts +++ b/src/background/services/monetization.ts @@ -113,6 +113,10 @@ export class MonetizationService { const { requestId } = p this.sessions[tabId].get(requestId)?.stop() + + if (p.remove) { + this.sessions[tabId].delete(requestId) + } }) } From 02b5642cb992bbd1441491e6c6ffc23463d2808d Mon Sep 17 00:00:00 2001 From: Diana Fulga Date: Thu, 6 Jun 2024 11:11:29 +0300 Subject: [PATCH 2/5] Split amount --- src/background/services/monetization.ts | 19 +++++++++++++------ src/background/utils.ts | 3 +++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/background/services/monetization.ts b/src/background/services/monetization.ts index c784f2a6..5a7cc221 100644 --- a/src/background/services/monetization.ts +++ b/src/background/services/monetization.ts @@ -8,7 +8,7 @@ import { } from '@/shared/messages' import { PaymentSession } from './paymentSession' import { emitToggleWM } from '../lib/messages' -import { getCurrentActiveTab, getSender, getTabId } from '../utils' +import { computeRate, getCurrentActiveTab, getSender, getTabId } from '../utils' import { EventsService } from './events' export class MonetizationService { @@ -32,9 +32,8 @@ export class MonetizationService { sender: Runtime.MessageSender ) { const { - connected, enabled, - rateOfPay: rate, + rateOfPay, walletAddress: connectedWallet } = await this.storage.get([ 'enabled', @@ -43,9 +42,9 @@ export class MonetizationService { 'walletAddress' ]) - if (!rate || !connectedWallet) { + if (!rateOfPay || !connectedWallet) { this.logger.error( - `Did not find rate of pay or connect wallet information. Received rate=${rate}, wallet=${connectedWallet}. Payment session will not be initialized.` + `Did not find rate of pay or connect wallet information. Received rate=${rateOfPay}, wallet=${connectedWallet}. Payment session will not be initialized.` ) return } @@ -55,9 +54,17 @@ export class MonetizationService { this.sessions[tabId] = new Map() } + const sessionsCount = this.sessions[tabId].size + payload.length + const rate = computeRate(rateOfPay, sessionsCount) + + // Adjust rate of payment for existing sessions + this.sessions[tabId].forEach((session) => { + session.adjustSessionAmount(rate) + }) + + // Initialize new sessions payload.forEach((p) => { const { requestId, walletAddress: receiver } = p - // TODO: Split monetization amount (needs batching) const session = new PaymentSession( receiver, diff --git a/src/background/utils.ts b/src/background/utils.ts index 646bc032..32efb9b4 100644 --- a/src/background/utils.ts +++ b/src/background/utils.ts @@ -85,3 +85,6 @@ export const getSender = (sender: Runtime.MessageSender) => { const frameId = notNullOrUndef(sender.frameId, 'sender.frameId') return { tabId, frameId } } + +export const computeRate = (rate: string, sessionsCount: number) => + (+rate / sessionsCount).toString() From 117dc83b79bcd490236eaa45bb3d9bf4de492000 Mon Sep 17 00:00:00 2001 From: Diana Fulga Date: Mon, 10 Jun 2024 15:04:36 +0300 Subject: [PATCH 3/5] Udate rate of pay when stopping sessions --- src/background/services/monetization.ts | 27 +++++++++++++------ .../services/monetizationTagManager.ts | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/background/services/monetization.ts b/src/background/services/monetization.ts index 2b9c7233..a934fb33 100644 --- a/src/background/services/monetization.ts +++ b/src/background/services/monetization.ts @@ -34,6 +34,7 @@ export class MonetizationService { const { enabled, rateOfPay, + connected, walletAddress: connectedWallet } = await this.storage.get([ 'enabled', @@ -49,16 +50,17 @@ export class MonetizationService { return } const { tabId, frameId } = getSender(sender) + const sessions = this.sessions[tabId] - if (this.sessions[tabId] == null) { + if (sessions == null) { this.sessions[tabId] = new Map() } - const sessionsCount = this.sessions[tabId].size + payload.length + const sessionsCount = sessions.size + payload.length const rate = computeRate(rateOfPay, sessionsCount) // Adjust rate of payment for existing sessions - this.sessions[tabId].forEach((session) => { + sessions.forEach((session) => { session.adjustSessionAmount(rate) }) @@ -76,7 +78,7 @@ export class MonetizationService { this.openPaymentsService ) - this.sessions[tabId].set(requestId, session) + sessions.set(requestId, session) if (connected === true && enabled === true) { void session.start() @@ -103,7 +105,7 @@ export class MonetizationService { } } - stopPaymentSession( + async stopPaymentSession( payload: StopMonetizationPayload[], sender: Runtime.MessageSender ) { @@ -118,12 +120,21 @@ export class MonetizationService { payload.forEach((p) => { const { requestId } = p - this.sessions[tabId].get(requestId)?.stop() + sessions.get(requestId)?.stop() if (p.remove) { - this.sessions[tabId].delete(requestId) + sessions.delete(requestId) } }) + + const { rateOfPay } = await this.storage.get(['rateOfPay']) + if (!rateOfPay) return + + const rate = computeRate(rateOfPay, sessions.size) + // Adjust rate of payment for existing sessions + sessions.forEach((session) => { + session.adjustSessionAmount(rate) + }) } resumePaymentSession( @@ -141,7 +152,7 @@ export class MonetizationService { payload.forEach((p) => { const { requestId } = p - this.sessions[tabId].get(requestId)?.resume() + sessions.get(requestId)?.resume() }) } diff --git a/src/content/services/monetizationTagManager.ts b/src/content/services/monetizationTagManager.ts index d8fa06df..a032156b 100644 --- a/src/content/services/monetizationTagManager.ts +++ b/src/content/services/monetizationTagManager.ts @@ -216,8 +216,8 @@ export class MonetizationTagManager extends EventEmitter { } } - this.sendStartMonetization(startMonetizationTags) this.sendStopMonetization(stopMonetizationTags) + this.sendStartMonetization(startMonetizationTags) } private async checkAdded(node: Node) { From 0b9dffdc809a9b6bfa2474565818bb3a9d8409e6 Mon Sep 17 00:00:00 2001 From: Diana Fulga Date: Mon, 10 Jun 2024 20:43:40 +0300 Subject: [PATCH 4/5] Solve bug --- src/background/services/monetization.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/background/services/monetization.ts b/src/background/services/monetization.ts index a934fb33..0e9dd4c4 100644 --- a/src/background/services/monetization.ts +++ b/src/background/services/monetization.ts @@ -50,12 +50,12 @@ export class MonetizationService { return } const { tabId, frameId } = getSender(sender) - const sessions = this.sessions[tabId] - if (sessions == null) { + if (this.sessions[tabId] == null) { this.sessions[tabId] = new Map() } + const sessions = this.sessions[tabId] const sessionsCount = sessions.size + payload.length const rate = computeRate(rateOfPay, sessionsCount) From 806cc90a1e169e8ca036ab711b8ffac9a2ed64d9 Mon Sep 17 00:00:00 2001 From: Diana Fulga Date: Mon, 10 Jun 2024 22:23:21 +0300 Subject: [PATCH 5/5] Prevent race conditions on stop and start --- src/content/services/monetizationTagManager.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/content/services/monetizationTagManager.ts b/src/content/services/monetizationTagManager.ts index a032156b..0fa0838c 100644 --- a/src/content/services/monetizationTagManager.ts +++ b/src/content/services/monetizationTagManager.ts @@ -106,7 +106,7 @@ export class MonetizationTagManager extends EventEmitter { this.sendStopMonetization(stopMonetizationTags) } - private onWholeDocumentObserved(records: MutationRecord[]) { + private async onWholeDocumentObserved(records: MutationRecord[]) { const startMonetizationTagsPromises: Promise[] = [] const stopMonetizationTags: StopMonetizationPayload[] = [] @@ -121,7 +121,7 @@ export class MonetizationTagManager extends EventEmitter { } } - this.sendStopMonetization(stopMonetizationTags) + await this.sendStopMonetization(stopMonetizationTags) if (this.isTopFrame) { for (const record of records) { @@ -216,7 +216,7 @@ export class MonetizationTagManager extends EventEmitter { } } - this.sendStopMonetization(stopMonetizationTags) + await this.sendStopMonetization(stopMonetizationTags) this.sendStartMonetization(startMonetizationTags) } @@ -442,10 +442,10 @@ export class MonetizationTagManager extends EventEmitter { } } - private sendStopMonetization(tags: StopMonetizationPayload[]) { + private async sendStopMonetization(tags: StopMonetizationPayload[]) { if (!tags.length) return - stopMonetization(tags) + await stopMonetization(tags) // Check if tab still monetized let validTagsCount = 0