Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 0 additions & 56 deletions include/pro/pro.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <typename T>
Napi::Value toJsOrNullIfErrors(
const Napi::Env& env, const T& value, const std::vector<std::string>& errors) {
return errors.empty() ? toJs(env, value) : env.Null();
}

template <>
struct toJs_impl<pro_backend::ProRevocationItem> {
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<pro_backend::ProPaymentItem> {
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<pro_backend::ResponseHeader> {
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<ProWrapper> {

public:
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
173 changes: 30 additions & 143 deletions src/constants.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
// 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);
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(
Expand Down
2 changes: 2 additions & 0 deletions src/pro/pro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down Expand Up @@ -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");
}
Expand Down
78 changes: 1 addition & 77 deletions types/pro/pro.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ declare module 'libsession_util_nodejs' {
proProof: Omit<ProProof, 'rotatingPubkeyHex'>;
};

export type ProOriginatingPlatform = 'Nil' | 'Google' | 'iOS';
export type ProOriginatingPlatform = 'Nil' | 'Google' | 'iOS' | 'Rangeproof';

export type ProBackendProviderConstantType = {
device: string;
Expand Down Expand Up @@ -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 & {
Expand Down
4 changes: 2 additions & 2 deletions types/shared.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ declare module 'libsession_util_nodejs' {

type MakeGroupActionCall<A extends RecordOfFunctions, B extends keyof A> = [
B,
...Parameters<A[B]>
...Parameters<A[B]>,
]; // all of the groupActionCalls need the pubkey of the group we are targeting

type AsyncGroupWrapper<T extends (...args: any) => any> = (
Expand Down Expand Up @@ -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;
};

Expand Down
Loading