using org.ldk.impl; using org.ldk.enums; using org.ldk.util; using System; namespace org { namespace ldk { namespace structs { /** An implementation of CustomMessageHandler */ public interface CustomMessageHandlerInterface { /**Handles the given message sent from `sender_node_id`, possibly producing messages for * [`CustomMessageHandler::get_and_clear_pending_msg`] to return and thus for [`PeerManager`] * to send. */ Result_NoneLightningErrorZ handle_custom_message(Type msg, byte[] sender_node_id); /**Returns the list of pending messages that were generated by the handler, clearing the list * in the process. Each message is paired with the node id of the intended recipient. If no * connection to the node exists, then the message is simply not sent. */ TwoTuple_PublicKeyTypeZ[] get_and_clear_pending_msg(); /**Gets the node feature flags which this handler itself supports. All available handlers are * queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`] * which are broadcasted in our [`NodeAnnouncement`] message. * * [`NodeAnnouncement`]: crate::ln::msgs::NodeAnnouncement */ NodeFeatures provided_node_features(); /**Gets the init feature flags which should be sent to the given peer. All available handlers * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`] * which are sent in our [`Init`] message. * * [`Init`]: crate::ln::msgs::Init */ InitFeatures provided_init_features(byte[] their_node_id); } /** * A handler provided to [`PeerManager`] for reading and handling custom messages. * * [BOLT 1] specifies a custom message type range for use with experimental or application-specific * messages. `CustomMessageHandler` allows for user-defined handling of such types. See the * [`lightning_custom_message`] crate for tools useful in composing more than one custom handler. * * [BOLT 1]: https://github.com/lightning/bolts/blob/master/01-messaging.md * [`lightning_custom_message`]: https://docs.rs/lightning_custom_message/latest/lightning_custom_message */ public class CustomMessageHandler : CommonBase { internal bindings.LDKCustomMessageHandler bindings_instance; internal long instance_idx; internal CustomMessageHandler(object _dummy, long ptr) : base(ptr) { bindings_instance = null; } ~CustomMessageHandler() { if (ptr != 0) { bindings.CustomMessageHandler_free(ptr); } } private class LDKCustomMessageHandlerHolder { internal CustomMessageHandler held; } private class LDKCustomMessageHandlerImpl : bindings.LDKCustomMessageHandler { internal LDKCustomMessageHandlerImpl(CustomMessageHandlerInterface arg, LDKCustomMessageHandlerHolder impl_holder) { this.arg = arg; this.impl_holder = impl_holder; } private CustomMessageHandlerInterface arg; private LDKCustomMessageHandlerHolder impl_holder; public long handle_custom_message(long _msg, long _sender_node_id) { Type ret_hu_conv = new Type(null, _msg); if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); }; byte[] _sender_node_id_conv = InternalUtils.decodeUint8Array(_sender_node_id); Result_NoneLightningErrorZ ret = arg.handle_custom_message(ret_hu_conv, _sender_node_id_conv); GC.KeepAlive(arg); long result = ret == null ? 0 : ret.clone_ptr(); return result; } public long get_and_clear_pending_msg() { TwoTuple_PublicKeyTypeZ[] ret = arg.get_and_clear_pending_msg(); GC.KeepAlive(arg); long result = InternalUtils.encodeUint64Array(InternalUtils.mapArray(ret, ret_conv_25 => ret_conv_25 == null ? 0 : ret_conv_25.clone_ptr())); return result; } public long provided_node_features() { NodeFeatures ret = arg.provided_node_features(); GC.KeepAlive(arg); long result = ret == null ? 0 : ret.clone_ptr(); return result; } public long provided_init_features(long _their_node_id) { byte[] _their_node_id_conv = InternalUtils.decodeUint8Array(_their_node_id); InitFeatures ret = arg.provided_init_features(_their_node_id_conv); GC.KeepAlive(arg); long result = ret == null ? 0 : ret.clone_ptr(); return result; } } /** Creates a new instance of CustomMessageHandler from a given implementation */ public static CustomMessageHandler new_impl(CustomMessageHandlerInterface arg, CustomMessageReaderInterface customMessageReader_impl) { LDKCustomMessageHandlerHolder impl_holder = new LDKCustomMessageHandlerHolder(); LDKCustomMessageHandlerImpl impl = new LDKCustomMessageHandlerImpl(arg, impl_holder); CustomMessageReader customMessageReader = CustomMessageReader.new_impl(customMessageReader_impl); long[] ptr_idx = bindings.LDKCustomMessageHandler_new(impl, customMessageReader.instance_idx); impl_holder.held = new CustomMessageHandler(null, ptr_idx[0]); impl_holder.held.instance_idx = ptr_idx[1]; impl_holder.held.bindings_instance = impl; impl_holder.held.ptrs_to.AddLast(customMessageReader); return impl_holder.held; } /** * Handles the given message sent from `sender_node_id`, possibly producing messages for * [`CustomMessageHandler::get_and_clear_pending_msg`] to return and thus for [`PeerManager`] * to send. */ public Result_NoneLightningErrorZ handle_custom_message(org.ldk.structs.Type msg, byte[] sender_node_id) { long ret = bindings.CustomMessageHandler_handle_custom_message(this.ptr, msg.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(sender_node_id, 33))); GC.KeepAlive(this); GC.KeepAlive(msg); GC.KeepAlive(sender_node_id); if (ret >= 0 && ret <= 4096) { return null; } Result_NoneLightningErrorZ ret_hu_conv = Result_NoneLightningErrorZ.constr_from_ptr(ret); if (this != null) { this.ptrs_to.AddLast(msg); }; return ret_hu_conv; } /** * Returns the list of pending messages that were generated by the handler, clearing the list * in the process. Each message is paired with the node id of the intended recipient. If no * connection to the node exists, then the message is simply not sent. */ public TwoTuple_PublicKeyTypeZ[] get_and_clear_pending_msg() { long ret = bindings.CustomMessageHandler_get_and_clear_pending_msg(this.ptr); GC.KeepAlive(this); if (ret >= 0 && ret <= 4096) { return null; } int ret_conv_25_len = InternalUtils.getArrayLength(ret); TwoTuple_PublicKeyTypeZ[] ret_conv_25_arr = new TwoTuple_PublicKeyTypeZ[ret_conv_25_len]; for (int z = 0; z < ret_conv_25_len; z++) { long ret_conv_25 = InternalUtils.getU64ArrayElem(ret, z); TwoTuple_PublicKeyTypeZ ret_conv_25_hu_conv = new TwoTuple_PublicKeyTypeZ(null, ret_conv_25); if (ret_conv_25_hu_conv != null) { ret_conv_25_hu_conv.ptrs_to.AddLast(this); }; ret_conv_25_arr[z] = ret_conv_25_hu_conv; } bindings.free_buffer(ret); return ret_conv_25_arr; } /** * Gets the node feature flags which this handler itself supports. All available handlers are * queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`] * which are broadcasted in our [`NodeAnnouncement`] message. * * [`NodeAnnouncement`]: crate::ln::msgs::NodeAnnouncement */ public NodeFeatures provided_node_features() { long ret = bindings.CustomMessageHandler_provided_node_features(this.ptr); GC.KeepAlive(this); if (ret >= 0 && ret <= 4096) { return null; } org.ldk.structs.NodeFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.NodeFeatures(null, ret); } if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); }; return ret_hu_conv; } /** * Gets the init feature flags which should be sent to the given peer. All available handlers * are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`] * which are sent in our [`Init`] message. * * [`Init`]: crate::ln::msgs::Init */ public InitFeatures provided_init_features(byte[] their_node_id) { long ret = bindings.CustomMessageHandler_provided_init_features(this.ptr, InternalUtils.encodeUint8Array(InternalUtils.check_arr_len(their_node_id, 33))); GC.KeepAlive(this); GC.KeepAlive(their_node_id); if (ret >= 0 && ret <= 4096) { return null; } org.ldk.structs.InitFeatures ret_hu_conv = null; if (ret < 0 || ret > 4096) { ret_hu_conv = new org.ldk.structs.InitFeatures(null, ret); } if (ret_hu_conv != null) { ret_hu_conv.ptrs_to.AddLast(this); }; return ret_hu_conv; } } } } }