diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b7505b..a39a8ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,7 @@ set(ENABLE_ONIONREQ OFF) # as it is not part of the archive. We actually don't care about it on session-desktop set(SUBMODULE_CHECK OFF) -file(GLOB SOURCE_FILES src/*.cpp src/groups/*.cpp src/multi_encrypt/*.cpp) +file(GLOB SOURCE_FILES src/*.cpp src/groups/*.cpp ) add_subdirectory(libsession-util) @@ -47,7 +47,7 @@ if(MSVC) endif() add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC}) -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC} "include/" "node_modules/node-addon-api" "../../node_modules/node-addon-api" "node_modules/node-api-headers/include" "../../node_modules/node-api-headers/include") +target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC} "include/" "${CMAKE_CURRENT_SOURCE_DIR}/node_modules/node-addon-api" "${CMAKE_CURRENT_SOURCE_DIR}/node_modules" "${CMAKE_CURRENT_SOURCE_DIR}/node_modules/node-api-headers/include") set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB} ${LIBSESSION_STATIC_BUNDLE_LIBS}) diff --git a/include/groups/meta_group.hpp b/include/groups/meta_group.hpp index 18c53bf..97809f1 100644 --- a/include/groups/meta_group.hpp +++ b/include/groups/meta_group.hpp @@ -1,6 +1,7 @@ #pragma once #include + #include #include "session/config/groups/info.hpp" @@ -35,7 +36,10 @@ class MetaGroup { shared_ptr keys, std::vector edGroupPubKey, std::optional> edGroupSecKey) : - info{info}, members{members}, keys{keys}, edGroupPubKey{oxenc::to_hex(edGroupPubKey.begin(), edGroupPubKey.end())} { + info{info}, + members{members}, + keys{keys}, + edGroupPubKey{oxenc::to_hex(edGroupPubKey.begin(), edGroupPubKey.end())} { if (edGroupSecKey.has_value()) { this->edGroupSecKey = oxenc::to_hex(edGroupSecKey->begin(), edGroupSecKey->end()); diff --git a/include/meta/meta_base_wrapper.hpp b/include/meta/meta_base_wrapper.hpp index eca139c..d890be2 100644 --- a/include/meta/meta_base_wrapper.hpp +++ b/include/meta/meta_base_wrapper.hpp @@ -3,7 +3,6 @@ #include #include -#include #include #include "../base_config.hpp" @@ -13,7 +12,7 @@ namespace session::nodeapi { class MetaBaseWrapper { public: - explicit MetaBaseWrapper(){}; + explicit MetaBaseWrapper() {}; virtual ~MetaBaseWrapper() = default; diff --git a/include/multi_encrypt/multi_encrypt.hpp b/include/multi_encrypt/multi_encrypt.hpp index 9ad1571..fde334b 100644 --- a/include/multi_encrypt/multi_encrypt.hpp +++ b/include/multi_encrypt/multi_encrypt.hpp @@ -20,8 +20,6 @@ namespace session::nodeapi { namespace log = oxen::log; -auto cat = log::Cat("multi_encrypt"); - inline std::vector extractPlaintext( const Napi::Object& obj, const std::string identifier) { @@ -718,9 +716,8 @@ class MultiEncryptWrapper : public Napi::ObjectWrap { auto contentOrEnvelope = extractContentOrEnvelope( obj, "decryptForCommunity.obj.contentOrEnvelope"); - decrypted.push_back( - session::decode_for_community( - contentOrEnvelope, nowMs, proBackendPubkeyHex)); + decrypted.push_back(session::decode_for_community( + contentOrEnvelope, nowMs, proBackendPubkeyHex)); decryptedServerIds.push_back(serverId); } catch (const std::exception& e) { @@ -819,9 +816,8 @@ class MultiEncryptWrapper : public Napi::ObjectWrap { auto envelopePayload = extractEnvelopePayload(obj, "decryptFor1o1.obj.envelopePayload"); - decrypted.push_back( - session::decode_envelope( - keys, envelopePayload, nowMs, proBackendPubkeyHex)); + decrypted.push_back(session::decode_envelope( + keys, envelopePayload, nowMs, proBackendPubkeyHex)); decryptedMessageHashes.push_back(messageHash); } catch (const std::exception& e) { log::warning( @@ -919,9 +915,8 @@ class MultiEncryptWrapper : public Napi::ObjectWrap { auto envelopePayload = extractEnvelopePayload(obj, "decryptForGroup.obj.envelopePayload"); - decrypted.push_back( - session::decode_envelope( - keys, envelopePayload, nowMs, proBackendPubkeyHex)); + decrypted.push_back(session::decode_envelope( + keys, envelopePayload, nowMs, proBackendPubkeyHex)); decryptedMessageHashes.push_back(messageHash); } catch (const std::exception& e) { log::warning( diff --git a/include/pro/pro.hpp b/include/pro/pro.hpp index 4336bce..335810e 100644 --- a/include/pro/pro.hpp +++ b/include/pro/pro.hpp @@ -4,21 +4,18 @@ #include #include -#include -#include #include +#include "../meta/meta_base_wrapper.hpp" #include "../utilities.hpp" -#include "oxen/log.hpp" -#include "pro/types.hpp" -#include "session/attachments.hpp" -#include "session/config/user_profile.hpp" -#include "session/random.hpp" +#include "meta/meta_base_wrapper.hpp" #include "session/session_protocol.hpp" namespace session::nodeapi { +namespace log = oxen::log; class ProWrapper : public Napi::ObjectWrap { + public: ProWrapper(const Napi::CallbackInfo& info) : Napi::ObjectWrap{info} { throw std::invalid_argument("ProWrapper is static and doesn't need to be constructed"); @@ -49,6 +46,7 @@ class ProWrapper : public Napi::ObjectWrap { assertInfoLength(info, 1); assertIsObject(info[0]); + auto env = info.Env(); auto first = info[0].As(); @@ -67,20 +65,31 @@ class ProWrapper : public Napi::ObjectWrap { proFeatures.push_back(item); } - SESSION_PROTOCOL_PRO_EXTRA_FEATURES flags; + SESSION_PROTOCOL_PRO_EXTRA_FEATURES flags = 0; for (std::string& feature : proFeatures) { - if (feature == "10K_CHARACTER_LIMIT") { - flags |= SESSION_PROTOCOL_PRO_FEATURES_10K_CHARACTER_LIMIT; - } else if (feature == "PRO_BADGE") { - flags |= SESSION_PROTOCOL_PRO_FEATURES_PRO_BADGE; + // Note: 10K_CHARACTER_LIMIT cannot be requested by the caller + if (feature == "PRO_BADGE") { + flags |= SESSION_PROTOCOL_PRO_EXTRA_FEATURES_PRO_BADGE; } else if (feature == "ANIMATED_AVATAR") { - flags |= SESSION_PROTOCOL_PRO_FEATURES_ANIMATED_AVATAR; + flags |= SESSION_PROTOCOL_PRO_EXTRA_FEATURES_ANIMATED_AVATAR; } } assertIsString(first.Get("utf16"), "proFeaturesForMessage.utf16"); std::u16string utf16 = first.Get("utf16").As().Utf16Value(); - return session::pro_features_for_utf16((utf16.data()), utf16.length(), flags); + auto pro_features_msg = + session::pro_features_for_utf16((utf16.data()), utf16.length(), flags); + + auto obj = Napi::Object::New(env); + + obj["success"] = toJs(env, pro_features_msg.success); + obj["error"] = + pro_features_msg.error.size() ? toJs(env, pro_features_msg.error) : env.Null(); + obj["codepointCount"] = toJs(env, pro_features_msg.codepoint_count); + obj["proFeatures"] = proFeaturesToJs(env, pro_features_msg.features); + + return obj; }); }; }; + }; // namespace session::nodeapi diff --git a/include/pro/types.hpp b/include/pro/types.hpp index 6b09df7..a8ce087 100644 --- a/include/pro/types.hpp +++ b/include/pro/types.hpp @@ -4,16 +4,9 @@ #include #include -#include -#include -#include - -#include "../utilities.hpp" -#include "oxen/log.hpp" -#include "session/attachments.hpp" -#include "session/config/user_profile.hpp" -#include "session/multi_encrypt.hpp" -#include "session/random.hpp" +#include "session/config/pro.hpp" +#include "session/session_protocol.hpp" +#include "utilities.hpp" namespace session::nodeapi { @@ -72,32 +65,6 @@ struct toJs_impl { } }; -template <> -struct toJs_impl { - Napi::Object operator()(const Napi::Env& env, const SESSION_PROTOCOL_PRO_FEATURES bitset) { - Napi::Array arr = Napi::Array::New(env); - uint32_t index = 0; - - if (bitset == SESSION_PROTOCOL_PRO_FEATURES_NIL) { - return arr; - } - - if (bitset & (SESSION_PROTOCOL_PRO_FEATURES_10K_CHARACTER_LIMIT)) { - arr[index] = Napi::String::New(env, "10K_CHARACTER_LIMIT"); - index++; - } - if (bitset & SESSION_PROTOCOL_PRO_FEATURES_PRO_BADGE) { - arr[index++] = Napi::String::New(env, "PRO_BADGE"); - index++; - } - if (bitset & SESSION_PROTOCOL_PRO_FEATURES_ANIMATED_AVATAR) { - arr[index++] = Napi::String::New(env, "ANIMATED_AVATAR"); - index++; - } - return arr; - } -}; - template <> struct toJs_impl { Napi::Object operator()(const Napi::Env& env, const session::DecodedPro decoded_pro) { @@ -110,22 +77,7 @@ struct toJs_impl { : decoded_pro.status == ProStatus::Valid ? "Valid" : "Expired"); obj["proProof"] = toJs(env, decoded_pro.proof); - obj["proFeatures"] = toJs(env, decoded_pro.features); - - return obj; - } -}; - -template <> -struct toJs_impl { - Napi::Object operator()( - const Napi::Env& env, const session::ProFeaturesForMsg pro_features_msg) { - auto obj = Napi::Object::New(env); - - obj["success"] = toJs(env, pro_features_msg.success); - obj["error"] = toJs(env, pro_features_msg.error); - obj["codepointCount"] = toJs(env, pro_features_msg.codepoint_count); - obj["proFeatures"] = toJs(env, pro_features_msg.features); + obj["proFeatures"] = proFeaturesToJs(env, decoded_pro.features); return obj; } diff --git a/include/profile_pic.hpp b/include/profile_pic.hpp index e1b2c67..9110036 100644 --- a/include/profile_pic.hpp +++ b/include/profile_pic.hpp @@ -5,7 +5,6 @@ namespace session::nodeapi { - // Constructs a profile_pic from a Napi::Value which must be either Null or an Object; if an // Object then it *must* contain "url" (string or null) and "key" (uint8array of size 32 or // null) keys; if either is empty or Null then you get back an empty (i.e. clearing) diff --git a/include/utilities.hpp b/include/utilities.hpp index 9192c8e..9fe3e77 100644 --- a/include/utilities.hpp +++ b/include/utilities.hpp @@ -10,9 +10,11 @@ #include #include +#include "oxen/log.hpp" #include "oxenc/hex.h" #include "session/config/namespaces.hpp" #include "session/config/profile_pic.hpp" +#include "session/session_protocol.hpp" #include "session/types.h" #include "session/types.hpp" #include "utilities.hpp" @@ -21,6 +23,8 @@ namespace session::nodeapi { using namespace std::literals; +inline auto cat = oxen::log::Cat("nodeapi"); + static void checkOrThrow(bool condition, const char* msg) { if (!condition) throw std::invalid_argument{msg}; @@ -119,6 +123,11 @@ struct toJs_impl { } }; +template <> +struct toJs_impl { + auto operator()(const Napi::Env& env, size_t b) const { return Napi::Number::New(env, (b)); } +}; + template struct toJs_impl>> { auto operator()(const Napi::Env& env, T n) const { return Napi::Number::New(env, n); } @@ -294,7 +303,7 @@ auto wrapResult(const Napi::Env& env, Call&& call) { if constexpr (std::is_base_of_v) return res; else - return toJs(env, std::move(res)); + return toJs(env, std::move(res)); } } catch (const std::exception& e) { throw Napi::Error::New(env, e.what()); @@ -362,6 +371,8 @@ Napi::Object decrypt_result_to_JS( confirm_pushed_entry_t confirm_pushed_entry_from_JS(const Napi::Env& env, const Napi::Object& obj); +Napi::Object proFeaturesToJs(const Napi::Env& env, const SESSION_PROTOCOL_PRO_FEATURES bitset); + std::span from_hex_to_span(std::string_view x); template @@ -371,11 +382,10 @@ template std::array from_hex_to_array(std::string x) { std::string as_hex = oxenc::from_hex(x); if (as_hex.size() != N) { - throw std::invalid_argument( - std::format( - "from_hex_to_array: Decoded hex size mismatch: expected {}, got {}", - N, - as_hex.size())); + throw std::invalid_argument(std::format( + "from_hex_to_array: Decoded hex size mismatch: expected {}, got {}", + N, + as_hex.size())); } std::array result; @@ -386,21 +396,21 @@ std::array from_hex_to_array(std::string x) { std::vector from_hex_to_vector(std::string_view x); std::span from_base64_to_span(std::string_view x); -std::vector from_base64_to_vector(std::string_view x) ; - +std::vector from_base64_to_vector(std::string_view x); // Concept to match containers with a size() method template concept HasSize = requires(T t) { - {t.size()}->std::convertible_to; + { + t.size() + } -> std::convertible_to; }; template void assert_length(const T& x, size_t n, std::string_view base_identifier) { if (x.size() != n) { - throw std::invalid_argument( - std::format( - "assert_length: expected {}, got {} for {}", n, x.size(), base_identifier)); + throw std::invalid_argument(std::format( + "assert_length: expected {}, got {} for {}", n, x.size(), base_identifier)); } } diff --git a/package.json b/package.json index 7a948f5..2ccbf6b 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "update_version": "sh update_version.sh", "clean": "rimraf .cache build", "lint:cpp": "cppcheck --std=c++20 -j8 --quiet src libsession-util/src", + "lint": "find src include -name '*.cpp' -o -name '*.hpp' | xargs clang-format-19 -i", "install": "cmake-js build --runtime=electron --runtime-version=34.2.0 --CDSUBMODULE_CHECK=OFF --CDLOCAL_MIRROR=https://oxen.rocks/deps --CDENABLE_ONIONREQ=OFF --CDWITH_TESTS=OFF", "prepare_release": "sh prepare_release.sh", "dedup": "npx --yes yarn-deduplicate yarn.lock" diff --git a/src/constants.cpp b/src/constants.cpp index 26924c0..49e3a10 100644 --- a/src/constants.cpp +++ b/src/constants.cpp @@ -24,37 +24,136 @@ Napi::Object ConstantsWrapper::Init(Napi::Env env, Napi::Object exports) { pro_urls["support_url"] = toJs(env, SESSION_PRO_URLS.support_url); 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_url"] = toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL].refund_url); - pro_provider_nil["refund_after_platform_deadline_url"] = toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL].refund_after_platform_deadline_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); + 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_url"] = toJs( + env, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] + .refund_url); + pro_provider_nil["refund_after_platform_deadline_url"] = toJs( + env, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_NIL] + .refund_after_platform_deadline_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 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_url"] = toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE].refund_url); - pro_provider_google["refund_after_platform_deadline_url"] = toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE].refund_after_platform_deadline_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); + 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_url"] = + toJs(env, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA + [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] + .refund_url); + pro_provider_google["refund_after_platform_deadline_url"] = + toJs(env, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA + [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_GOOGLE_PLAY_STORE] + .refund_after_platform_deadline_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_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_url"] = toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE].refund_url); - pro_provider_ios["refund_after_platform_deadline_url"] = toJs(env, SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA[SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE].refund_after_platform_deadline_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); + 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_url"] = + toJs(env, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA + [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] + .refund_url); + pro_provider_ios["refund_after_platform_deadline_url"] = + toJs(env, + SESSION_PRO_BACKEND_PAYMENT_PROVIDER_METADATA + [SESSION_PRO_BACKEND_PAYMENT_PROVIDER_IOS_APP_STORE] + .refund_after_platform_deadline_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_providers = Napi::Object::New(env); pro_providers["Nil"] = toJs(env, pro_provider_nil); @@ -85,14 +184,8 @@ Napi::Object ConstantsWrapper::Init(Napi::Env env, Napi::Object exports) { "COMMUNITY_FULL_URL_MAX_LENGTH", Napi::Number::New(env, session::config::community::FULL_URL_MAX_LENGTH), napi_enumerable), - ObjectWrap::StaticValue( - "LIBSESSION_PRO_URLS", - pro_urls, - napi_enumerable), - ObjectWrap::StaticValue( - "LIBSESSION_PRO_PROVIDERS", - pro_providers, - napi_enumerable), + ObjectWrap::StaticValue("LIBSESSION_PRO_URLS", pro_urls, napi_enumerable), + ObjectWrap::StaticValue("LIBSESSION_PRO_PROVIDERS", pro_providers, napi_enumerable), ObjectWrap::StaticValue( "LIBSESSION_UTIL_VERSION", Napi::String::New(env, LIBSESSION_UTIL_VERSION_FULL), diff --git a/src/groups/meta_group_wrapper.cpp b/src/groups/meta_group_wrapper.cpp index 5008c85..18f2523 100644 --- a/src/groups/meta_group_wrapper.cpp +++ b/src/groups/meta_group_wrapper.cpp @@ -139,7 +139,8 @@ void MetaGroupWrapper::Init(Napi::Env env, Napi::Object exports) { InstanceMethod("keysNeedsRekey", &MetaGroupWrapper::keysNeedsRekey), InstanceMethod("keyRekey", &MetaGroupWrapper::keyRekey), InstanceMethod("keyGetAll", &MetaGroupWrapper::keyGetAll), - InstanceMethod("keyGetEncryptionKeyHex", &MetaGroupWrapper::keyGetEncryptionKeyHex), + InstanceMethod( + "keyGetEncryptionKeyHex", &MetaGroupWrapper::keyGetEncryptionKeyHex), InstanceMethod("activeHashes", &MetaGroupWrapper::activeHashes), InstanceMethod("loadKeyMessage", &MetaGroupWrapper::loadKeyMessage), InstanceMethod("keyGetCurrentGen", &MetaGroupWrapper::keyGetCurrentGen), diff --git a/src/user_config.cpp b/src/user_config.cpp index f1301f9..6f0ed29 100644 --- a/src/user_config.cpp +++ b/src/user_config.cpp @@ -266,7 +266,6 @@ void UserConfigWrapper::setProConfig(const Napi::CallbackInfo& info) { pro_config_from_object(pro_config_js.As()); config.set_pro_config(pro_config); - }); } diff --git a/src/utilities.cpp b/src/utilities.cpp index b539ce3..d81cb20 100644 --- a/src/utilities.cpp +++ b/src/utilities.cpp @@ -345,6 +345,30 @@ confirm_pushed_entry_t confirm_pushed_entry_from_JS(const Napi::Env& env, const return confirmed_pushed_entry; } +Napi::Object proFeaturesToJs(const Napi::Env& env, const SESSION_PROTOCOL_PRO_FEATURES bitset) { + Napi::Array arr = Napi::Array::New(env); + uint32_t index = 0; + + if (bitset == SESSION_PROTOCOL_PRO_FEATURES_NIL) { + return arr; + } + + if (bitset & (SESSION_PROTOCOL_PRO_FEATURES_10K_CHARACTER_LIMIT)) { + arr[index] = Napi::String::New(env, "10K_CHARACTER_LIMIT"); + index++; + } + if (bitset & SESSION_PROTOCOL_PRO_FEATURES_PRO_BADGE) { + arr[index++] = Napi::String::New(env, "PRO_BADGE"); + index++; + } + if (bitset & SESSION_PROTOCOL_PRO_FEATURES_ANIMATED_AVATAR) { + arr[index++] = Napi::String::New(env, "ANIMATED_AVATAR"); + index++; + } + + return arr; +} + std::span from_hex_to_span(std::string_view x) { return session::to_span(oxenc::from_hex(x)); } diff --git a/types/pro/pro.d.ts b/types/pro/pro.d.ts index f560303..b9d7a6d 100644 --- a/types/pro/pro.d.ts +++ b/types/pro/pro.d.ts @@ -73,7 +73,7 @@ declare module 'libsession_util_nodejs' { * If provided (here) as an input, it will be ignored. */ proFeatures: ProFeatures; - }) => WithProFeatures & { success: boolean; error: string | null; codePointCount: number }; + }) => WithProFeatures & { success: boolean; error: string | null; codepointCount: number }; }; export type ProActionsCalls = MakeWrapperActionCalls;