From 3777f417ddd80b8ca480a16a8945588c24b16db6 Mon Sep 17 00:00:00 2001 From: sevenbitbyte Date: Mon, 24 Aug 2026 19:31:07 +0000 Subject: [PATCH 1/6] basic billing client --- src/party/index-browser.js | 4 +- src/party/index-embedded.js | 3 +- src/party/index.js | 2 + src/party/peer/billing-client.js | 62 +++++++++++++++++++++++++++++++ src/venue/schema/venue_project.js | 2 +- 5 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 src/party/peer/billing-client.js diff --git a/src/party/index-browser.js b/src/party/index-browser.js index 38aac8e2..26c7a0db 100644 --- a/src/party/index-browser.js +++ b/src/party/index-browser.js @@ -10,6 +10,7 @@ const CloudDocument = require('./cloud/cloud-document') const EphemeralClient = require('./peer/ephemeral-client') const MatchMakerClient = require('./peer/match-maker-client') const PeerClient = require('./peer/peer-client') +const BillingClient = require('./peer/billing-client') const LokiDb = require('../bouncer/db/loki-db') @@ -17,5 +18,6 @@ module.exports = { IDocument, IParty, DocumentFactory, CloudDocument, CloudParty, LokiParty, ZangoParty, PeerParty, - LokiDb, EphemeralClient, MatchMakerClient, PeerClient + LokiDb, EphemeralClient, MatchMakerClient, PeerClient, + BillingClient } diff --git a/src/party/index-embedded.js b/src/party/index-embedded.js index 78faf740..341ab5fd 100644 --- a/src/party/index-embedded.js +++ b/src/party/index-embedded.js @@ -10,11 +10,12 @@ const CloudDocument = require('./cloud/cloud-document') const EphemeralClient = require('./peer/ephemeral-client') const MatchMakerClient = require('./peer/match-maker-client') const PeerClient = require('./peer/peer-client') +const BillingClient = require('./peer/billing-client') module.exports = { IDocument, IParty, DocumentFactory, CloudDocument, CloudParty, LokiParty, PeerParty, TingoParty, EphemeralClient, MatchMakerClient, - PeerClient + PeerClient, BillingClient } \ No newline at end of file diff --git a/src/party/index.js b/src/party/index.js index 88b5181f..47aaf147 100644 --- a/src/party/index.js +++ b/src/party/index.js @@ -12,3 +12,5 @@ exports.CloudDocument = require('./cloud/cloud-document') exports.EphemeralClient = require('./peer/ephemeral-client') exports.MatchMakerClient = require('./peer/match-maker-client') exports.PeerClient = require('./peer/peer-client') +exports.BillingClient = require('./peer/billing-client') + diff --git a/src/party/peer/billing-client.js b/src/party/peer/billing-client.js new file mode 100644 index 00000000..7decaa75 --- /dev/null +++ b/src/party/peer/billing-client.js @@ -0,0 +1,62 @@ +const EventEmitter = require('eventemitter3') + +const debug = require('debug')('dataparty.billing-client') + + +class BillingClient extends EventEmitter { + + + /** + * Constructor + * @param EphemeralClient client + */ + constructor(client){ + + super() + + this.client = client + } + + + async getProductInfo(service){ + const reqData = { + service + } + + debug('getProductInfo', reqData) + + const result = await this.client.restParty.comms.call('billing/product/info', reqData, { + expectClearTextReply: false, + sendClearTextRequest: false, + useSessions: true + }) + + debug('\tresult', result) + + return result.products + } + + async createPaymentSession(service, productIndex, priceIndex, payment_type){ + const reqData = { + service, + productIndex, + priceIndex, + payment_type + } + + debug('createPaymentSession', reqData) + + const result = await this.client.restParty.comms.call('billing/create/payment', reqData, { + expectClearTextReply: false, + sendClearTextRequest: false, + useSessions: true + }) + + debug('\tresult', result) + + return result.payment_session + } + +} + +module.exports = BillingClient diff --git a/src/venue/schema/venue_project.js b/src/venue/schema/venue_project.js index e41e3cbc..ded875e5 100644 --- a/src/venue/schema/venue_project.js +++ b/src/venue/schema/venue_project.js @@ -140,4 +140,4 @@ class VenueProject extends ISchema { } -module.exports = VenueProject \ No newline at end of file +module.exports = VenueProject From 0c0069645f57ba09fdb646311d5192b4c77bdc96 Mon Sep 17 00:00:00 2001 From: sevenbitbyte Date: Mon, 24 Aug 2026 20:30:35 +0000 Subject: [PATCH 2/6] default to stripe --- src/party/peer/billing-client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/party/peer/billing-client.js b/src/party/peer/billing-client.js index 7decaa75..02eb991b 100644 --- a/src/party/peer/billing-client.js +++ b/src/party/peer/billing-client.js @@ -36,7 +36,7 @@ class BillingClient extends EventEmitter { return result.products } - async createPaymentSession(service, productIndex, priceIndex, payment_type){ + async createPaymentSession(service, productIndex, priceIndex, payment_type='stripe'){ const reqData = { service, productIndex, From 939a8f3cc868b9e5f6bfe217a5ee72ee983ee7f2 Mon Sep 17 00:00:00 2001 From: sevenbitbyte Date: Mon, 24 Aug 2026 20:32:35 +0000 Subject: [PATCH 3/6] defaults all around --- src/party/peer/billing-client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/party/peer/billing-client.js b/src/party/peer/billing-client.js index 02eb991b..e1637a45 100644 --- a/src/party/peer/billing-client.js +++ b/src/party/peer/billing-client.js @@ -36,7 +36,7 @@ class BillingClient extends EventEmitter { return result.products } - async createPaymentSession(service, productIndex, priceIndex, payment_type='stripe'){ + async createPaymentSession(service, productIndex=0, priceIndex=0, payment_type='stripe'){ const reqData = { service, productIndex, From 44a0f1a8015be7a3654a6d2742a0688141d6cf3f Mon Sep 17 00:00:00 2001 From: sevenbitbyte Date: Mon, 24 Aug 2026 20:39:51 +0000 Subject: [PATCH 4/6] make ephermaral client for you --- src/party/peer/billing-client.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/party/peer/billing-client.js b/src/party/peer/billing-client.js index e1637a45..f634d406 100644 --- a/src/party/peer/billing-client.js +++ b/src/party/peer/billing-client.js @@ -1,20 +1,28 @@ const EventEmitter = require('eventemitter3') const debug = require('debug')('dataparty.billing-client') - +const EphemeralClient = require('./ephemeral-client') class BillingClient extends EventEmitter { - /** * Constructor * @param EphemeralClient client */ - constructor(client){ + constructor(identity, domain='buy.dataparty.xyz', clientOptions={}){ super() - this.client = client + this.client = new EphemeralClient({ + identity, + urlOrParty: 'https://'+domain, + wsUrlOrParty: 'wss://'+domain+'/ws', + ...clientOptions + }) + } + + async start(){ + await this.client.start() } From 84779306ff6b39fa656d27a1c494ab46f46471d4 Mon Sep 17 00:00:00 2001 From: sevenbitbyte Date: Mon, 24 Aug 2026 21:45:01 +0000 Subject: [PATCH 5/6] sane defaults --- src/venue/bin/commands/billable-service-create.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/venue/bin/commands/billable-service-create.js b/src/venue/bin/commands/billable-service-create.js index c8ee5c81..d4d04aa4 100644 --- a/src/venue/bin/commands/billable-service-create.js +++ b/src/venue/bin/commands/billable-service-create.js @@ -228,7 +228,7 @@ class VenueBillableServiceCreate extends CmdTree.Command { const itemPrice = { one_time_purchase: stripePrice.type == 'one_time', - period_unit: reach(stripePrice, 'recurring.interval'), + period_unit: reach(stripePrice, 'recurring.interval', ''), stripe_price_id: stripePrice.id } From cf7e92c7e19937e19dfc19ab8e57b7e5e49b6f1f Mon Sep 17 00:00:00 2001 From: sevenbitbyte Date: Mon, 24 Aug 2026 22:11:33 +0000 Subject: [PATCH 6/6] delete empty periods --- src/venue/bin/commands/billable-service-create.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/venue/bin/commands/billable-service-create.js b/src/venue/bin/commands/billable-service-create.js index d4d04aa4..d3e9f32d 100644 --- a/src/venue/bin/commands/billable-service-create.js +++ b/src/venue/bin/commands/billable-service-create.js @@ -226,12 +226,16 @@ class VenueBillableServiceCreate extends CmdTree.Command { console.log('\tadd stripe price', stripePrice.id) - const itemPrice = { + let itemPrice = { one_time_purchase: stripePrice.type == 'one_time', - period_unit: reach(stripePrice, 'recurring.interval', ''), + period_unit: reach(stripePrice, 'recurring.interval'), stripe_price_id: stripePrice.id } + if(!reach(stripePrice, 'recurring.interval')){ + delete itemPrice.period_unit + } + productToAdd.prices.push( itemPrice ) }