diff --git a/libs/sdk-bindings/src/breez_sdk.udl b/libs/sdk-bindings/src/breez_sdk.udl index d4b78a866..b76f66f84 100644 --- a/libs/sdk-bindings/src/breez_sdk.udl +++ b/libs/sdk-bindings/src/breez_sdk.udl @@ -800,6 +800,15 @@ dictionary RefundResponse { string refund_tx_id; }; +enum LevelFilter { + "Off", + "Error", + "Warn", + "Info", + "Debug", + "Trace", +}; + interface BlockingBreezServices { [Throws=SdkError] @@ -956,7 +965,7 @@ namespace breez_sdk { BlockingBreezServices connect(ConnectRequest req, EventListener listener); [Throws=SdkError] - void set_log_stream(LogStream log_stream); + void set_log_stream(LogStream log_stream, LevelFilter? filter_level); [Throws=SdkError] LNInvoice parse_invoice(string invoice); diff --git a/libs/sdk-bindings/src/uniffi_binding.rs b/libs/sdk-bindings/src/uniffi_binding.rs index 30e5b36c4..7a9880554 100644 --- a/libs/sdk-bindings/src/uniffi_binding.rs +++ b/libs/sdk-bindings/src/uniffi_binding.rs @@ -8,25 +8,25 @@ use breez_sdk_core::{ CheckMessageResponse, ClosedChannelPaymentDetails, Config, ConfigureNodeRequest, ConnectRequest, CurrencyInfo, EnvironmentType, EventListener, FeeratePreset, FiatCurrency, GreenlightCredentials, GreenlightNodeConfig, HealthCheckStatus, InputType, InvoicePaidDetails, - LNInvoice, ListPaymentsRequest, LnPaymentDetails, LnUrlAuthRequestData, LnUrlCallbackStatus, - LnUrlErrorData, LnUrlPayErrorData, LnUrlPayRequest, LnUrlPayRequestData, LnUrlPayResult, - LnUrlPaySuccessData, LnUrlWithdrawRequest, LnUrlWithdrawRequestData, LnUrlWithdrawResult, - LnUrlWithdrawSuccessData, LocaleOverrides, LocalizedName, LogEntry, LogStream, LspInformation, - MaxReverseSwapAmountResponse, MessageSuccessActionData, MetadataFilter, MetadataItem, Network, - NodeConfig, NodeCredentials, NodeState, OnchainPaymentLimitsResponse, OpenChannelFeeRequest, - OpenChannelFeeResponse, OpeningFeeParams, OpeningFeeParamsMenu, PayOnchainRequest, - PayOnchainResponse, Payment, PaymentDetails, PaymentFailedData, PaymentStatus, PaymentType, - PaymentTypeFilter, PrepareOnchainPaymentRequest, PrepareOnchainPaymentResponse, - PrepareRedeemOnchainFundsRequest, PrepareRedeemOnchainFundsResponse, PrepareRefundRequest, - PrepareRefundResponse, Rate, ReceiveOnchainRequest, ReceivePaymentRequest, - ReceivePaymentResponse, RecommendedFees, RedeemOnchainFundsRequest, RedeemOnchainFundsResponse, - RefundRequest, RefundResponse, ReportIssueRequest, ReportPaymentFailureDetails, - ReverseSwapFeesRequest, ReverseSwapInfo, ReverseSwapPairInfo, ReverseSwapStatus, RouteHint, - RouteHintHop, SendOnchainRequest, SendOnchainResponse, SendPaymentRequest, SendPaymentResponse, - SendSpontaneousPaymentRequest, ServiceHealthCheckResponse, SignMessageRequest, - SignMessageResponse, StaticBackupRequest, StaticBackupResponse, SuccessActionProcessed, - SwapAmountType, SwapInfo, SwapStatus, Symbol, TlvEntry, UnspentTransactionOutput, - UrlSuccessActionData, + LNInvoice, LevelFilter, ListPaymentsRequest, LnPaymentDetails, LnUrlAuthRequestData, + LnUrlCallbackStatus, LnUrlErrorData, LnUrlPayErrorData, LnUrlPayRequest, LnUrlPayRequestData, + LnUrlPayResult, LnUrlPaySuccessData, LnUrlWithdrawRequest, LnUrlWithdrawRequestData, + LnUrlWithdrawResult, LnUrlWithdrawSuccessData, LocaleOverrides, LocalizedName, LogEntry, + LogStream, LspInformation, MaxReverseSwapAmountResponse, MessageSuccessActionData, + MetadataFilter, MetadataItem, Network, NodeConfig, NodeCredentials, NodeState, + OnchainPaymentLimitsResponse, OpenChannelFeeRequest, OpenChannelFeeResponse, OpeningFeeParams, + OpeningFeeParamsMenu, PayOnchainRequest, PayOnchainResponse, Payment, PaymentDetails, + PaymentFailedData, PaymentStatus, PaymentType, PaymentTypeFilter, PrepareOnchainPaymentRequest, + PrepareOnchainPaymentResponse, PrepareRedeemOnchainFundsRequest, + PrepareRedeemOnchainFundsResponse, PrepareRefundRequest, PrepareRefundResponse, Rate, + ReceiveOnchainRequest, ReceivePaymentRequest, ReceivePaymentResponse, RecommendedFees, + RedeemOnchainFundsRequest, RedeemOnchainFundsResponse, RefundRequest, RefundResponse, + ReportIssueRequest, ReportPaymentFailureDetails, ReverseSwapFeesRequest, ReverseSwapInfo, + ReverseSwapPairInfo, ReverseSwapStatus, RouteHint, RouteHintHop, SendOnchainRequest, + SendOnchainResponse, SendPaymentRequest, SendPaymentResponse, SendSpontaneousPaymentRequest, + ServiceHealthCheckResponse, SignMessageRequest, SignMessageResponse, StaticBackupRequest, + StaticBackupResponse, SuccessActionProcessed, SwapAmountType, SwapInfo, SwapStatus, Symbol, + TlvEntry, UnspentTransactionOutput, UrlSuccessActionData, }; use once_cell::sync::Lazy; use std::sync::Arc; @@ -78,7 +78,10 @@ pub fn connect( } /// If used, this must be called before `connect` -pub fn set_log_stream(log_stream: Box, filter_level: Option) -> SdkResult<()> { +pub fn set_log_stream( + log_stream: Box, + filter_level: Option, +) -> SdkResult<()> { init_uniffi_logger(log_stream, filter_level); Ok(()) } diff --git a/libs/sdk-core/src/binding.rs b/libs/sdk-core/src/binding.rs index 7fc73cc8b..a47f4ef5c 100644 --- a/libs/sdk-core/src/binding.rs +++ b/libs/sdk-core/src/binding.rs @@ -15,7 +15,6 @@ use std::sync::Arc; use anyhow::{anyhow, Result}; use flutter_rust_bridge::StreamSink; -use log::LevelFilter; use once_cell::sync::{Lazy, OnceCell}; use tokio::sync::Mutex; @@ -34,7 +33,7 @@ use crate::lsp::LspInformation; use crate::models::{Config, LogEntry, NodeState, Payment, SwapInfo}; use crate::{ BackupStatus, BuyBitcoinRequest, BuyBitcoinResponse, CheckMessageRequest, CheckMessageResponse, - ConfigureNodeRequest, ConnectRequest, EnvironmentType, ListPaymentsRequest, + ConfigureNodeRequest, ConnectRequest, EnvironmentType, LevelFilter, ListPaymentsRequest, LnUrlCallbackStatus, LnUrlPayRequest, LnUrlWithdrawRequest, LnUrlWithdrawResult, MaxReverseSwapAmountResponse, NodeConfig, NodeCredentials, OnchainPaymentLimitsResponse, OpenChannelFeeRequest, OpenChannelFeeResponse, PayOnchainRequest, PayOnchainResponse, diff --git a/libs/sdk-core/src/bridge_generated.io.rs b/libs/sdk-core/src/bridge_generated.io.rs index 38fbe30c6..a36a08a0f 100644 --- a/libs/sdk-core/src/bridge_generated.io.rs +++ b/libs/sdk-core/src/bridge_generated.io.rs @@ -77,8 +77,8 @@ pub extern "C" fn wire_breez_events_stream(port_: i64) { } #[no_mangle] -pub extern "C" fn wire_breez_log_stream(port_: i64) { - wire_breez_log_stream_impl(port_) +pub extern "C" fn wire_breez_log_stream(port_: i64, filter_level: *mut i32) { + wire_breez_log_stream_impl(port_, filter_level) } #[no_mangle] @@ -356,6 +356,11 @@ pub extern "C" fn new_box_autoadd_i64_0(value: i64) -> *mut i64 { support::new_leak_box_ptr(value) } +#[no_mangle] +pub extern "C" fn new_box_autoadd_level_filter_0(value: i32) -> *mut i32 { + support::new_leak_box_ptr(value) +} + #[no_mangle] pub extern "C" fn new_box_autoadd_list_payments_request_0() -> *mut wire_ListPaymentsRequest { support::new_leak_box_ptr(wire_ListPaymentsRequest::new_with_null_ptr()) @@ -580,6 +585,12 @@ impl Wire2Api for *mut i64 { unsafe { *support::box_from_leak_ptr(self) } } } +impl Wire2Api for *mut i32 { + fn wire2api(self) -> LevelFilter { + let wrap = unsafe { support::box_from_leak_ptr(self) }; + Wire2Api::::wire2api(*wrap).into() + } +} impl Wire2Api for *mut wire_ListPaymentsRequest { fn wire2api(self) -> ListPaymentsRequest { let wrap = unsafe { support::box_from_leak_ptr(self) }; diff --git a/libs/sdk-core/src/bridge_generated.rs b/libs/sdk-core/src/bridge_generated.rs index cde5963ea..bad856c21 100644 --- a/libs/sdk-core/src/bridge_generated.rs +++ b/libs/sdk-core/src/bridge_generated.rs @@ -66,6 +66,7 @@ use crate::models::EnvironmentType; use crate::models::GreenlightCredentials; use crate::models::GreenlightNodeConfig; use crate::models::HealthCheckStatus; +use crate::models::LevelFilter; use crate::models::ListPaymentsRequest; use crate::models::LnPaymentDetails; use crate::models::LnUrlCallbackStatus; @@ -311,14 +312,22 @@ fn wire_breez_events_stream_impl(port_: MessagePort) { }, ) } -fn wire_breez_log_stream_impl(port_: MessagePort) { +fn wire_breez_log_stream_impl( + port_: MessagePort, + filter_level: impl Wire2Api> + UnwindSafe, +) { FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, (), _>( WrapInfo { debug_name: "breez_log_stream", port: Some(port_), mode: FfiCallMode::Stream, }, - move || move |task_callback| breez_log_stream(task_callback.stream_sink::<_, LogEntry>()), + move || { + let api_filter_level = filter_level.wire2api(); + move |task_callback| { + breez_log_stream(task_callback.stream_sink::<_, LogEntry>(), api_filter_level) + } + }, ) } fn wire_list_lsps_impl(port_: MessagePort) { @@ -949,6 +958,19 @@ impl Wire2Api for i64 { self } } +impl Wire2Api for i32 { + fn wire2api(self) -> LevelFilter { + match self { + 0 => LevelFilter::Off, + 1 => LevelFilter::Error, + 2 => LevelFilter::Warn, + 3 => LevelFilter::Info, + 4 => LevelFilter::Debug, + 5 => LevelFilter::Trace, + _ => unreachable!("Invalid variant for LevelFilter: {}", self), + } + } +} impl Wire2Api for i32 { fn wire2api(self) -> Network { diff --git a/libs/sdk-core/src/logger.rs b/libs/sdk-core/src/logger.rs index 734124747..b3f4775a3 100644 --- a/libs/sdk-core/src/logger.rs +++ b/libs/sdk-core/src/logger.rs @@ -1,3 +1,4 @@ +use crate::models::LevelFilter as BindingLevelFilter; use crate::{LogEntry, LogStream}; use anyhow::{anyhow, Result}; use chrono::Local; @@ -83,13 +84,9 @@ fn init_env_logger(target: Option, filter_level: Option) -> static INIT_DART_LOGGER: Once = Once::new(); -pub fn init_dart_logger(filter_level: Option) { +pub fn init_dart_logger(filter_level: Option) { INIT_DART_LOGGER.call_once(|| { - let filter_level = if filter_level.is_some() { - filter_level.unwrap() - } else { - LevelFilter::Trace - }; + let filter_level = get_filter_level(filter_level); assert!( filter_level <= STATIC_MAX_LEVEL, @@ -157,7 +154,10 @@ impl Log for DartLogger { static INIT_UNIFFI_LOGGER: Once = Once::new(); -pub fn init_uniffi_logger(log_stream: Box, filter_level: Option) { +pub fn init_uniffi_logger( + log_stream: Box, + filter_level: Option, +) { INIT_UNIFFI_LOGGER.call_once(|| { UniFFILogger::set_log_stream(log_stream, filter_level); }); @@ -169,13 +169,8 @@ pub struct UniFFILogger { } impl UniFFILogger { - fn set_log_stream(log_stream: Box, filter_level: Option) { - let filter_level = if filter_level.is_some() { - filter_level.unwrap() - } else { - LevelFilter::Trace - }; - + fn set_log_stream(log_stream: Box, filter_level: Option) { + let filter_level = get_filter_level(filter_level); assert!( filter_level <= STATIC_MAX_LEVEL, "Should respect STATIC_MAX_LEVEL={:?}, which is done in compile time. level{:?}", @@ -254,11 +249,7 @@ pub fn init_sdk_logger( app_logger: Option>, filter_level: Option, ) -> Result<()> { - let filter_level = if filter_level.is_some() { - filter_level.unwrap() - } else { - LevelFilter::Trace - }; + let filter_level = filter_level.unwrap_or(LevelFilter::Trace); assert!( filter_level <= STATIC_MAX_LEVEL, @@ -315,3 +306,16 @@ impl Log for GlobalSdkLogger { fn flush(&self) {} } + +/* Binding LevelFilter */ + +fn get_filter_level(filter_level: Option) -> LevelFilter { + match filter_level.unwrap_or(BindingLevelFilter::Trace) { + BindingLevelFilter::Off => LevelFilter::Off, + BindingLevelFilter::Error => LevelFilter::Error, + BindingLevelFilter::Warn => LevelFilter::Warn, + BindingLevelFilter::Info => LevelFilter::Info, + BindingLevelFilter::Debug => LevelFilter::Debug, + BindingLevelFilter::Trace => LevelFilter::Trace, + } +} diff --git a/libs/sdk-core/src/models.rs b/libs/sdk-core/src/models.rs index 7b7adc817..a01e6b5e0 100644 --- a/libs/sdk-core/src/models.rs +++ b/libs/sdk-core/src/models.rs @@ -1653,6 +1653,36 @@ impl PaymentPathEdge { } } +/// An enum representing the available verbosity level filters of the logger. +#[repr(usize)] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)] +pub enum LevelFilter { + // The "off" level. + /// + /// A level lower than all log levels. + Off, + /// The "error" level. + /// + /// Designates very serious errors. + Error, + /// The "warn" level. + /// + /// Designates hazardous situations. + Warn, + /// The "info" level. + /// + /// Designates useful information. + Info, + /// The "debug" level. + /// + /// Designates lower priority information. + Debug, + /// The "trace" level. + /// + /// Designates very low priority, often extremely verbose, information. + Trace, +} + #[cfg(test)] mod tests { use anyhow::Result; diff --git a/libs/sdk-flutter/ios/Classes/bridge_generated.h b/libs/sdk-flutter/ios/Classes/bridge_generated.h index 2458cffe3..615531bb1 100644 --- a/libs/sdk-flutter/ios/Classes/bridge_generated.h +++ b/libs/sdk-flutter/ios/Classes/bridge_generated.h @@ -315,7 +315,7 @@ void wire_service_health_check(int64_t port_, struct wire_uint_8_list *api_key); void wire_breez_events_stream(int64_t port_); -void wire_breez_log_stream(int64_t port_); +void wire_breez_log_stream(int64_t port_, int32_t *filter_level); void wire_list_lsps(int64_t port_); @@ -424,6 +424,8 @@ struct wire_GreenlightNodeConfig *new_box_autoadd_greenlight_node_config_0(void) int64_t *new_box_autoadd_i64_0(int64_t value); +int32_t *new_box_autoadd_level_filter_0(int32_t value); + struct wire_ListPaymentsRequest *new_box_autoadd_list_payments_request_0(void); struct wire_LnUrlAuthRequestData *new_box_autoadd_ln_url_auth_request_data_0(void); @@ -557,6 +559,7 @@ static int64_t dummy_method_to_enforce_bundling(void) { dummy_var ^= ((int64_t) (void*) new_box_autoadd_greenlight_credentials_0); dummy_var ^= ((int64_t) (void*) new_box_autoadd_greenlight_node_config_0); dummy_var ^= ((int64_t) (void*) new_box_autoadd_i64_0); + dummy_var ^= ((int64_t) (void*) new_box_autoadd_level_filter_0); dummy_var ^= ((int64_t) (void*) new_box_autoadd_list_payments_request_0); dummy_var ^= ((int64_t) (void*) new_box_autoadd_ln_url_auth_request_data_0); dummy_var ^= ((int64_t) (void*) new_box_autoadd_ln_url_pay_request_0); diff --git a/libs/sdk-flutter/lib/bridge_generated.dart b/libs/sdk-flutter/lib/bridge_generated.dart index 0f23d5340..ee85302e0 100644 --- a/libs/sdk-flutter/lib/bridge_generated.dart +++ b/libs/sdk-flutter/lib/bridge_generated.dart @@ -89,7 +89,7 @@ abstract class BreezSdkCore { FlutterRustBridgeTaskConstMeta get kBreezEventsStreamConstMeta; /// If used, this must be called before `connect`. It can only be called once. - Stream breezLogStream({dynamic hint}); + Stream breezLogStream({LevelFilter? filterLevel, dynamic hint}); FlutterRustBridgeTaskConstMeta get kBreezLogStreamConstMeta; @@ -696,6 +696,38 @@ class InvoicePaidDetails { }); } +/// An enum representing the available verbosity level filters of the logger. +enum LevelFilter { + /// + /// A level lower than all log levels. + Off, + + /// The "error" level. + /// + /// Designates very serious errors. + Error, + + /// The "warn" level. + /// + /// Designates hazardous situations. + Warn, + + /// The "info" level. + /// + /// Designates useful information. + Info, + + /// The "debug" level. + /// + /// Designates lower priority information. + Debug, + + /// The "trace" level. + /// + /// Designates very low priority, often extremely verbose, information. + Trace, +} + /// Represents a list payments request. class ListPaymentsRequest { final List? filters; @@ -2289,20 +2321,21 @@ class BreezSdkCoreImpl implements BreezSdkCore { argNames: [], ); - Stream breezLogStream({dynamic hint}) { + Stream breezLogStream({LevelFilter? filterLevel, dynamic hint}) { + var arg0 = _platform.api2wire_opt_box_autoadd_level_filter(filterLevel); return _platform.executeStream(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_breez_log_stream(port_), + callFfi: (port_) => _platform.inner.wire_breez_log_stream(port_, arg0), parseSuccessData: _wire2api_log_entry, parseErrorData: _wire2api_FrbAnyhowException, constMeta: kBreezLogStreamConstMeta, - argValues: [], + argValues: [filterLevel], hint: hint, )); } FlutterRustBridgeTaskConstMeta get kBreezLogStreamConstMeta => const FlutterRustBridgeTaskConstMeta( debugName: "breez_log_stream", - argNames: [], + argNames: ["filterLevel"], ); Future> listLsps({dynamic hint}) { @@ -4223,6 +4256,11 @@ int api2wire_i32(int raw) { return raw; } +@protected +int api2wire_level_filter(LevelFilter raw) { + return api2wire_i32(raw.index); +} + @protected int api2wire_network(Network raw) { return api2wire_i32(raw.index); @@ -4320,6 +4358,11 @@ class BreezSdkCorePlatform extends FlutterRustBridgeBase { return inner.new_box_autoadd_i64_0(api2wire_i64(raw)); } + @protected + ffi.Pointer api2wire_box_autoadd_level_filter(LevelFilter raw) { + return inner.new_box_autoadd_level_filter_0(api2wire_level_filter(raw)); + } + @protected ffi.Pointer api2wire_box_autoadd_list_payments_request(ListPaymentsRequest raw) { final ptr = inner.new_box_autoadd_list_payments_request_0(); @@ -4556,6 +4599,11 @@ class BreezSdkCorePlatform extends FlutterRustBridgeBase { return raw == null ? ffi.nullptr : api2wire_box_autoadd_i64(raw); } + @protected + ffi.Pointer api2wire_opt_box_autoadd_level_filter(LevelFilter? raw) { + return raw == null ? ffi.nullptr : api2wire_box_autoadd_level_filter(raw); + } + @protected ffi.Pointer api2wire_opt_box_autoadd_opening_fee_params(OpeningFeeParams? raw) { return raw == null ? ffi.nullptr : api2wire_box_autoadd_opening_fee_params(raw); @@ -5288,15 +5336,19 @@ class BreezSdkCoreWire implements FlutterRustBridgeWireBase { void wire_breez_log_stream( int port_, + ffi.Pointer filter_level, ) { return _wire_breez_log_stream( port_, + filter_level, ); } late final _wire_breez_log_streamPtr = - _lookup>('wire_breez_log_stream'); - late final _wire_breez_log_stream = _wire_breez_log_streamPtr.asFunction(); + _lookup)>>( + 'wire_breez_log_stream'); + late final _wire_breez_log_stream = + _wire_breez_log_streamPtr.asFunction)>(); void wire_list_lsps( int port_, @@ -6026,6 +6078,20 @@ class BreezSdkCoreWire implements FlutterRustBridgeWireBase { late final _new_box_autoadd_i64_0 = _new_box_autoadd_i64_0Ptr.asFunction Function(int)>(); + ffi.Pointer new_box_autoadd_level_filter_0( + int value, + ) { + return _new_box_autoadd_level_filter_0( + value, + ); + } + + late final _new_box_autoadd_level_filter_0Ptr = + _lookup Function(ffi.Int32)>>( + 'new_box_autoadd_level_filter_0'); + late final _new_box_autoadd_level_filter_0 = + _new_box_autoadd_level_filter_0Ptr.asFunction Function(int)>(); + ffi.Pointer new_box_autoadd_list_payments_request_0() { return _new_box_autoadd_list_payments_request_0(); } diff --git a/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt b/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt index 230b82eaf..6ae95c33f 100644 --- a/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt +++ b/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt @@ -4064,6 +4064,21 @@ fun asInputTypeList(arr: ReadableArray): List { return list } +fun asLevelFilter(type: String): LevelFilter { + return LevelFilter.valueOf(type.uppercase()) +} + +fun asLevelFilterList(arr: ReadableArray): List { + val list = ArrayList() + for (value in arr.toArrayList()) { + when (value) { + is String -> list.add(asLevelFilter(value)!!) + else -> throw SdkException.Generic(errUnexpectedType("${value::class.java.name}")) + } + } + return list +} + fun asLnUrlCallbackStatus(lnUrlCallbackStatus: ReadableMap): LnUrlCallbackStatus? { val type = lnUrlCallbackStatus.getString("type") diff --git a/libs/sdk-react-native/ios/BreezSDKMapper.swift b/libs/sdk-react-native/ios/BreezSDKMapper.swift index 067516d84..4a6c11c58 100644 --- a/libs/sdk-react-native/ios/BreezSDKMapper.swift +++ b/libs/sdk-react-native/ios/BreezSDKMapper.swift @@ -4692,6 +4692,69 @@ enum BreezSDKMapper { return list } + static func asLevelFilter(levelFilter: String) throws -> LevelFilter { + switch levelFilter { + case "off": + return LevelFilter.off + + case "error": + return LevelFilter.error + + case "warn": + return LevelFilter.warn + + case "info": + return LevelFilter.info + + case "debug": + return LevelFilter.debug + + case "trace": + return LevelFilter.trace + + default: throw SdkError.Generic(message: "Invalid variant \(levelFilter) for enum LevelFilter") + } + } + + static func valueOf(levelFilter: LevelFilter) -> String { + switch levelFilter { + case .off: + return "off" + + case .error: + return "error" + + case .warn: + return "warn" + + case .info: + return "info" + + case .debug: + return "debug" + + case .trace: + return "trace" + } + } + + static func arrayOf(levelFilterList: [LevelFilter]) -> [String] { + return levelFilterList.map { v -> String in valueOf(levelFilter: v) } + } + + static func asLevelFilterList(arr: [Any]) throws -> [LevelFilter] { + var list = [LevelFilter]() + for value in arr { + if let val = value as? String { + var levelFilter = try asLevelFilter(levelFilter: val) + list.append(levelFilter) + } else { + throw SdkError.Generic(message: errUnexpectedType(typeName: "LevelFilter")) + } + } + return list + } + static func asLnUrlCallbackStatus(lnUrlCallbackStatus: [String: Any?]) throws -> LnUrlCallbackStatus { let type = lnUrlCallbackStatus["type"] as! String if type == "ok" { diff --git a/libs/sdk-react-native/src/index.ts b/libs/sdk-react-native/src/index.ts index 13c3a52d6..0150094af 100644 --- a/libs/sdk-react-native/src/index.ts +++ b/libs/sdk-react-native/src/index.ts @@ -685,6 +685,15 @@ export type InputType = { data: LnUrlErrorData } +export enum LevelFilter { + OFF = "off", + ERROR = "error", + WARN = "warn", + INFO = "info", + DEBUG = "debug", + TRACE = "trace" +} + export enum LnUrlCallbackStatusVariant { OK = "ok", ERROR_STATUS = "errorStatus" @@ -842,11 +851,11 @@ export const connect = async (req: ConnectRequest, listener: EventListener): Pro return subscription } -export const setLogStream = async (logStream: LogStream): Promise => { +export const setLogStream = async (logStream: LogStream, filterLevel?: LevelFilter): Promise => { const subscription = BreezSDKEmitter.addListener("breezSdkLog", logStream) try { - await BreezSDK.setLogStream() + await BreezSDK.setLogStream(filterLevel) } catch {} return subscription