From 1ed86c4069e185bd57afc6f9b80851b44497dc6e Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 19 Mar 2026 08:18:49 +1100 Subject: [PATCH 1/2] fix: add rangeproof provider --- include/pro/pro.hpp | 56 -------------- libsession-util | 2 +- src/constants.cpp | 173 ++++++++------------------------------------ src/pro/pro.cpp | 2 + types/pro/pro.d.ts | 78 +------------------- types/shared.d.ts | 4 +- 6 files changed, 36 insertions(+), 279 deletions(-) diff --git a/include/pro/pro.hpp b/include/pro/pro.hpp index f4edddd..5ea7f40 100644 --- a/include/pro/pro.hpp +++ b/include/pro/pro.hpp @@ -24,62 +24,6 @@ std::string_view proBackendEnumToString(SESSION_PRO_BACKEND_USER_PRO_STATUS v); std::string_view proBackendEnumToString(SESSION_PRO_BACKEND_GET_PRO_DETAILS_ERROR_REPORT v); std::string_view proBackendEnumToString(session::ProFeaturesForMsgStatus v); -template -Napi::Value toJsOrNullIfErrors( - const Napi::Env& env, const T& value, const std::vector& errors) { - return errors.empty() ? toJs(env, value) : env.Null(); -} - -template <> -struct toJs_impl { - auto operator()(const Napi::Env& env, pro_backend::ProRevocationItem i) const { - - auto obj = Napi::Object::New(env); - obj["genIndexHashB64"] = toJs(env, to_base64(i.gen_index_hash)); - obj["expiryUnixTsMs"] = toJs(env, i.expiry_unix_ts); - - return obj; - } -}; - -template <> -struct toJs_impl { - auto operator()(const Napi::Env& env, pro_backend::ProPaymentItem p) const { - - auto obj = Napi::Object::New(env); - obj["status"] = toJs(env, proBackendEnumToString(p.status)); - obj["plan"] = toJs(env, proBackendEnumToString(p.plan)); - obj["paymentProvider"] = toJs(env, proBackendEnumToString(p.payment_provider)); - - obj["autoRenewing"] = toJs(env, p.auto_renewing); - obj["unredeemedTsMs"] = toJs(env, p.unredeemed_unix_ts); - obj["redeemedTsMs"] = toJs(env, p.redeemed_unix_ts); - obj["expiryTsMs"] = toJs(env, p.expiry_unix_ts); - obj["gracePeriodDurationMs"] = toJs(env, p.grace_period_duration_ms); - obj["platformRefundExpiryTsMs"] = toJs(env, p.platform_refund_expiry_unix_ts); - obj["revokedTsMs"] = toJs(env, p.revoked_unix_ts); - - obj["googlePaymentToken"] = toJs(env, p.google_payment_token); - obj["appleOriginalTxId"] = toJs(env, p.apple_original_tx_id); - obj["appleTxId"] = toJs(env, p.apple_tx_id); - obj["appleWebLineOrderId"] = toJs(env, p.apple_web_line_order_id); - - return obj; - } -}; - -template <> -struct toJs_impl { - auto operator()(const Napi::Env& env, pro_backend::ResponseHeader r) const { - - auto obj = Napi::Object::New(env); - obj["status"] = toJs(env, r.status); - obj["errors"] = toJs(env, r.errors); - - return obj; - } -}; - class ProWrapper : public Napi::ObjectWrap { public: diff --git a/libsession-util b/libsession-util index 2c43336..e9bef18 160000 --- a/libsession-util +++ b/libsession-util @@ -1 +1 @@ -Subproject commit 2c43336d3b47d38b20f9be1cd0ec6e84121faa96 +Subproject commit e9bef183e734d7fbc147722090a9c14c148c3e0d diff --git a/src/constants.cpp b/src/constants.cpp index 9c8016c..158c9b3 100644 --- a/src/constants.cpp +++ b/src/constants.cpp @@ -24,156 +24,43 @@ Napi::Object ConstantsWrapper::Init(Napi::Env env, Napi::Object exports) { pro_urls["pro_access_not_found"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_pro_access_not_found); pro_urls["support_url"] = toJs(env, SESSION_PROTOCOL_STRINGS.url_pro_support); - auto pro_provider_nil = Napi::Object::New(env); - pro_provider_nil["device"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .device); - pro_provider_nil["store"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .store); - pro_provider_nil["platform"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .platform); - pro_provider_nil["platform_account"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .platform_account); - pro_provider_nil["refund_support_url"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .refund_support_url); - pro_provider_nil["refund_status_url"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .refund_status_url); - pro_provider_nil["refund_platform_url"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .refund_platform_url); - pro_provider_nil["update_subscription_url"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .update_subscription_url); - pro_provider_nil["cancel_subscription_url"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .cancel_subscription_url); - pro_provider_nil["store_other"] = toJs( - env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] - .store); + auto make_provider = [&](int provider, int other_provider) { + const auto& meta = SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[provider]; + auto obj = Napi::Object::New(env); + obj["device"] = toJs(env, meta.device); + obj["store"] = toJs(env, meta.store); + obj["platform"] = toJs(env, meta.platform); + obj["platform_account"] = toJs(env, meta.platform_account); + obj["refund_support_url"] = toJs(env, meta.refund_support_url); + obj["refund_status_url"] = toJs(env, meta.refund_status_url); + obj["refund_platform_url"] = toJs(env, meta.refund_platform_url); + obj["update_subscription_url"] = toJs(env, meta.update_subscription_url); + obj["cancel_subscription_url"] = toJs(env, meta.cancel_subscription_url); + obj["store_other"] = + toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[other_provider].store); + return obj; + }; - auto pro_provider_google = Napi::Object::New(env); - pro_provider_google["device"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .device); - pro_provider_google["store"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .store); - pro_provider_google["platform"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .platform); - pro_provider_google["platform_account"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .platform_account); - pro_provider_google["refund_support_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .refund_support_url); - pro_provider_google["refund_status_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .refund_status_url); - pro_provider_google["refund_platform_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .refund_platform_url); - pro_provider_google["update_subscription_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .update_subscription_url); - pro_provider_google["cancel_subscription_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .cancel_subscription_url); - pro_provider_google["store_other"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .store); + auto pro_provider_nil = make_provider( + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL); + auto pro_provider_google = make_provider( + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE); + auto pro_provider_ios = make_provider( + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE); - auto pro_provider_ios = Napi::Object::New(env); - pro_provider_ios["device"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .device); - pro_provider_ios["store"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .store); - pro_provider_ios["platform"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .platform); - pro_provider_ios["platform_account"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .platform_account); - pro_provider_ios["refund_support_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .refund_support_url); - pro_provider_ios["refund_status_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .refund_status_url); - pro_provider_ios["refund_platform_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .refund_platform_url); - pro_provider_ios["update_subscription_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .update_subscription_url); - pro_provider_ios["cancel_subscription_url"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] - .cancel_subscription_url); - pro_provider_ios["store_other"] = - toJs(env, - SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA - [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] - .store); + auto pro_provider_rangeproof = make_provider( + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_RANGEPROOF, + // make nil as second provider here so that we default to whatever the session client is + // using + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL); auto pro_providers = Napi::Object::New(env); pro_providers["Nil"] = toJs(env, pro_provider_nil); pro_providers["Google"] = toJs(env, pro_provider_google); pro_providers["iOS"] = toJs(env, pro_provider_ios); + pro_providers["Rangeproof"] = toJs(env, pro_provider_rangeproof); // construct javascript constants object Napi::Function cls = DefineClass( diff --git a/src/pro/pro.cpp b/src/pro/pro.cpp index 463c593..01e1e0b 100644 --- a/src/pro/pro.cpp +++ b/src/pro/pro.cpp @@ -7,6 +7,7 @@ std::string_view ProBackendEnumToString(SESSION_PRO_BACKEND_PAYMENT_PROVIDER v) case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL: return "NIL"; case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE: return "GOOGLE_PLAY_STORE"; case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE: return "IOS_APP_STORE"; + case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_RANGEPROOF: return "RANGEPROOF"; case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_COUNT: throw std::invalid_argument("SESSION_PRO_BACKEND_PAYMENT_PROVIDER_COUNT"); } @@ -77,6 +78,7 @@ std::string_view proBackendEnumPaymentProviderToString(SESSION_PRO_BACKEND_PAYME case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL: return "Nil"; case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE: return "GooglePlayStore"; case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE: return "iOSAppStore"; + case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_RANGEPROOF: return "Rangeproof"; case SESSION_PRO_BACKEND_PAYMENT_PROVIDER_COUNT: throw std::invalid_argument("SESSION_PRO_BACKEND_PAYMENT_PROVIDER_COUNT"); } diff --git a/types/pro/pro.d.ts b/types/pro/pro.d.ts index add1983..5ba49ee 100644 --- a/types/pro/pro.d.ts +++ b/types/pro/pro.d.ts @@ -58,7 +58,7 @@ declare module 'libsession_util_nodejs' { proProof: Omit; }; - export type ProOriginatingPlatform = 'Nil' | 'Google' | 'iOS'; + export type ProOriginatingPlatform = 'Nil' | 'Google' | 'iOS' | 'Rangeproof'; export type ProBackendProviderConstantType = { device: string; @@ -92,82 +92,6 @@ declare module 'libsession_util_nodejs' { type WithMasterPrivKeyHex = { masterPrivKeyHex: string }; - type ProPaymentItem = { - /** - * Describes the current status of the consumption of the payment for Session Pro entitlement - * The status should be used to determine which timestamps should be used. - - * For example, a payment can be in a redeemed state whilst also have a refunded timestamp set - * if the payment was refunded and then the refund was reversed. We preserve all timestamps for - * book-keeping purposes. - */ - status: 'NIL' | 'UNREDEEMED' | 'REDEEMED' | 'EXPIRED' | 'REFUNDED'; - /** - * Session Pro product/plan item that was purchased - */ - plan: 'NIL' | 'ONE_MONTH' | 'THREE_MONTHS' | 'TWELVE_MONTHS'; - /** - * Store front that this particular payment came from - */ - paymentProvider: ProOriginatingPlatform; - /** - * Flag indicating whether or not this payment will automatically bill itself at the end of the - billing cycle. - */ - autoRenewing: boolean; - /** - * Unix timestamp of when the payment was witnessed by the Pro Backend. Always set - */ - unredeemedTsMs: number; - /** - * Unix timestamp of when the payment was redeemed. 0 if not activated - */ - redeemedTsMs: number; - /** - * Unix timestamp of when the payment was expiry. 0 if not activated - */ - expiryTsMs: number; - /** - * Duration of the grace period, e.g. when the payment provider will start to attempt to renew - * the Session Pro subscription. During the period between - * [expiry_unix_ts, expiry_unix_ts + grace_period_duration_ms] the user continues to have - * entitlement to Session Pro. This value is only applicable if `auto_renewing` is `true`. - */ - gracePeriodDurationMs: number; - /** - * Unix deadline timestamp of when the user is able to refund the subscription via the payment - provider. - * Thereafter the user must initiate a refund manually via Session support. - */ - platformRefundExpiryTsMs: number; - /** - * Unix timestamp of when the payment was revoked or refunded. 0 if not applicable. - */ - revokedTsMs: number; - /** - * When payment provider is set to Google Play Store, this is the platform-specific purchase - token. - * This information should be considered as confidential and stored appropriately. - */ - googlePaymentToken: string | null; - /** - * When payment provider is set to iOS App Store, this is the platform-specific original - transaction ID. - * This information should be considered as confidential and stored appropriately. - */ - appleOriginalTxId: string | null; - /** - * When payment provider is set to iOS App Store, this is the platform-specific transaction ID - * This information should be considered as confidential and stored appropriately. - */ - appleTxId: string | null; - /** - * When payment provider is set to iOS App Store, this is the platform-specific web line order - * ID. - * This information should be considered as confidential and stored appropriately. - */ - appleWebLineOrderId: string | null; - }; type ProWrapper = { proFeaturesForMessage: (args: { utf16: string }) => WithProMessageBitset & { diff --git a/types/shared.d.ts b/types/shared.d.ts index b8b758d..9578af3 100644 --- a/types/shared.d.ts +++ b/types/shared.d.ts @@ -101,7 +101,7 @@ declare module 'libsession_util_nodejs' { type MakeGroupActionCall = [ B, - ...Parameters + ...Parameters, ]; // all of the groupActionCalls need the pubkey of the group we are targeting type AsyncGroupWrapper any> = ( @@ -178,7 +178,7 @@ declare module 'libsession_util_nodejs' { LIBSESSION_NODEJS_COMMIT: string; /** Object containing pro urls **/ LIBSESSION_PRO_URLS: ProBackendUrlsType; - /** Object containing mapped provder constants */ + /** Object containing mapped provider constants */ LIBSESSION_PRO_PROVIDERS: ProBackendProviderConstantsType; }; From 5aa75fed77cb456582340d31a9b03f735e4801da Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 20 Mar 2026 10:24:57 +1100 Subject: [PATCH 2/2] chore: bump libsession-util & pkg version --- libsession-util | 2 +- package.json | 2 +- src/constants.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libsession-util b/libsession-util index e9bef18..99f1b52 160000 --- a/libsession-util +++ b/libsession-util @@ -1 +1 @@ -Subproject commit e9bef183e734d7fbc147722090a9c14c148c3e0d +Subproject commit 99f1b5201c68a48f700ecb58c284d1a584f0699a diff --git a/package.json b/package.json index d41cdc3..4683cc1 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "name": "libsession_util_nodejs", "packageManager": "pnpm@10.28.1", "description": "Wrappers for the Session Util Library", - "version": "0.6.16", + "version": "0.6.17", "license": "GPL-3.0", "author": { "name": "Oxen Project", diff --git a/src/constants.cpp b/src/constants.cpp index 158c9b3..6e403ae 100644 --- a/src/constants.cpp +++ b/src/constants.cpp @@ -52,8 +52,8 @@ Napi::Object ConstantsWrapper::Init(Napi::Env env, Napi::Object exports) { auto pro_provider_rangeproof = make_provider( SESSION_PRO_BACKEND_PAYMENT_PROVIDER_RANGEPROOF, - // make nil as second provider here so that we default to whatever the session client is - // using + // Use NIL as the second provider for Rangeproof so that it does not define an alternate + // store label (i.e., no explicit "other" store for Rangeproof in these constants). SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL); auto pro_providers = Napi::Object::New(env);