From 0176a1f62982934d6216d9a62214b00a59f6280a Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Fri, 4 Apr 2025 17:43:17 -0400 Subject: [PATCH] dev: update usages tab --- .../modules/selfhosted/DevCreditService.js | 86 +++++++++++++++++++ .../selfhosted/PermissiveCreditService.js | 41 --------- .../modules/selfhosted/SelfHostedModule.js | 4 +- src/gui/src/UI/Settings/UITabUsage.js | 34 -------- 4 files changed, 88 insertions(+), 77 deletions(-) create mode 100644 src/backend/src/modules/selfhosted/DevCreditService.js delete mode 100644 src/backend/src/modules/selfhosted/PermissiveCreditService.js diff --git a/src/backend/src/modules/selfhosted/DevCreditService.js b/src/backend/src/modules/selfhosted/DevCreditService.js new file mode 100644 index 000000000..8e2978946 --- /dev/null +++ b/src/backend/src/modules/selfhosted/DevCreditService.js @@ -0,0 +1,86 @@ +const BaseService = require("../../services/BaseService"); + +/** + * PermissiveCreditService listens to the event where DriverService asks + * for a credit context, and always provides one that allows use of + * cost-incurring services for no charge. This grants free use to + * everyone to services that incur a cost, as long as the user has + * permission to call the respective service. + */ +class PermissiveCreditService extends BaseService { + static MODULES = { + uuidv4: require('uuid').v4, + } + _init () { + // Maps usernames to simulated credit amounts + // (used when config.simulated_credit is set) + this.simulated_credit_ = {}; + + const svc_event = this.services.get('event'); + svc_event.on(`credit.check-available`, (_, event) => { + const username = event.actor.type.user.username; + event.available = this.get_user_credit_(username); + + // Useful for testing with Dall-E + // event.available = 4 * Math.pow(10,6); + + // Useful for testing with Polly + // event.available = 9000; + + // Useful for testing judge0 + // event.available = 50_000; + // event.avaialble = 49_999; + + // Useful for testing ConvertAPI + // event.available = 4_500_000; + // event.available = 4_499_999; + + // Useful for testing with textract + // event.available = 150_000; + // event.available = 149_999; + }); + + svc_event.on('credit.record-cost', (_, event) => { + const username = event.actor.type.user.username; + event.available = this.consume_user_credit_( + username, event.cost); + }); + + svc_event.on('usages.query', (_, event) => { + const username = event.actor.type.user.username; + if ( ! this.config.simulated_credit ) { + event.usages.push({ + name: `Unlimited Credit`, + used: 0, + available: 1, + }); + return; + } + event.usages.push({ + name: `Simulated Credit (${this.config.simulated_credit})`, + used: this.config.simulated_credit - + this.get_user_credit_(username), + available: this.config.simulated_credit, + }); + }); + } + get_user_credit_ (username) { + if ( ! this.config.simulated_credit ) { + return Number.MAX_SAFE_INTEGER; + } + + return this.simulated_credit_[username] ?? + (this.simulated_credit_[username] = this.config.simulated_credit); + + } + consume_user_credit_ (username, amount) { + if ( ! this.config.simulated_credit ) return; + + if ( ! this.simulated_credit_[username] ) { + this.simulated_credit_[username] = this.config.simulated_credit; + } + this.simulated_credit_[username] -= amount; + } +} + +module.exports = PermissiveCreditService; diff --git a/src/backend/src/modules/selfhosted/PermissiveCreditService.js b/src/backend/src/modules/selfhosted/PermissiveCreditService.js deleted file mode 100644 index 647a66182..000000000 --- a/src/backend/src/modules/selfhosted/PermissiveCreditService.js +++ /dev/null @@ -1,41 +0,0 @@ -const BaseService = require("../../services/BaseService"); - -/** - * PermissiveCreditService listens to the event where DriverService asks - * for a credit context, and always provides one that allows use of - * cost-incurring services for no charge. This grants free use to - * everyone to services that incur a cost, as long as the user has - * permission to call the respective service. - */ -class PermissiveCreditService extends BaseService { - static MODULES = { - uuidv4: require('uuid').v4, - } - _init () { - const svc_event = this.services.get('event'); - svc_event.on(`credit.check-available`, (_, event) => { - // Useful for testing with Dall-E - // event.available = 4 * Math.pow(10,6); - - // Useful for testing with Polly - // event.available = 9000; - - // Useful for testing judge0 - // event.available = 50_000; - // event.avaialble = 49_999; - - // Useful for testing ConvertAPI - // event.available = 4_500_000; - // event.available = 4_499_999; - - - // Useful for testing with textract - // event.available = 150_000; - // event.available = 149_999; - - event.available = Number.MAX_SAFE_INTEGER; - }); - } -} - -module.exports = PermissiveCreditService; diff --git a/src/backend/src/modules/selfhosted/SelfHostedModule.js b/src/backend/src/modules/selfhosted/SelfHostedModule.js index 02c867711..bcd8c6bda 100644 --- a/src/backend/src/modules/selfhosted/SelfHostedModule.js +++ b/src/backend/src/modules/selfhosted/SelfHostedModule.js @@ -35,8 +35,8 @@ class SelfHostedModule extends AdvancedBase { const DevWatcherService = require('./DevWatcherService'); const path_ = require('path'); - const PermissiveCreditService = require("./PermissiveCreditService"); - services.registerService('__permissive-credit', PermissiveCreditService); + const DevCreditService = require("./DevCreditService"); + services.registerService('dev-credit', DevCreditService); const { DBKVService } = require("../../services/DBKVService"); services.registerService('puter-kvstore', DBKVService); diff --git a/src/gui/src/UI/Settings/UITabUsage.js b/src/gui/src/UI/Settings/UITabUsage.js index 59e21f55d..31effde0d 100644 --- a/src/gui/src/UI/Settings/UITabUsage.js +++ b/src/gui/src/UI/Settings/UITabUsage.js @@ -89,40 +89,6 @@ export default { `; }); - // Loop through user services - res.user.forEach(service => { - const { monthly_limit, monthly_usage } = service; - let usageDisplay = ``; - - const first_identifier = false || - service.service['driver.implementation'] || - service.service['driver.interface'] || - ''; - - if (monthly_limit !== null) { - let usage_percentage = (monthly_usage / monthly_limit * 100).toFixed(0); - usage_percentage = usage_percentage > 100 ? 100 : usage_percentage; // Cap at 100% - usageDisplay = ` -
-

${html_encode(first_identifier)} (${html_encode(service.service['driver.method'])}):

- ${monthly_usage} used of ${monthly_limit} -
-
${usage_percentage}%
-
-
- `; - } - else { - usageDisplay = ` -
-

${html_encode(first_identifier)} (${html_encode(service.service['driver.method'])}):

- ${i18n('usage')}: ${monthly_usage} (${i18n('unlimited')}) -
- `; - } - h += usageDisplay; - }); - // Append driver usage bars to the container $('.settings-content[data-settings="usage"]').append(`
${h}
`); }