+struct CustomOnionMsgQueue {
+ std::mutex mtx;
+ std::vector<LDK::OnionMessageContents> msgs;
+};
+
+uint64_t custom_onion_msg_type_id(const void *this_arg) {
+ return 8888;
+}
+LDKCVec_u8Z custom_onion_msg_bytes(const void *this_arg) {
+ uint8_t *bytes = (uint8_t *) malloc(1024);
+ memset(bytes, 43, 1024);
+ return LDKCVec_u8Z {
+ .data = bytes, .datalen = 1024
+ };
+}
+LDKStr custom_onion_msg_str(const void *this_arg) {
+ return LDKStr {
+ .chars = (const uint8_t*)"Custom Onion Message",
+ .len = 20, .chars_is_owned = false
+ };
+}
+
+LDKCOption_C2Tuple_OnionMessageContentsResponseInstructionZZ handle_custom_onion_message(const void* this_arg, struct LDKOnionMessageContents msg, LDKCOption_CVec_u8ZZ context, LDKResponder responder) {
+ LDK::Responder resp(std::move(responder));
+ LDK::COption_CVec_u8ZZ ctx(std::move(context));
+ CustomOnionMsgQueue* arg = (CustomOnionMsgQueue*) this_arg;
+ std::unique_lock<std::mutex> lck(arg->mtx);
+ arg->msgs.push_back(std::move(msg));
+ return COption_C2Tuple_OnionMessageContentsResponseInstructionZZ_none();
+}
+
+LDKOnionMessageContents build_custom_onion_message() {
+ return LDKOnionMessageContents {
+ .this_arg = NULL,
+ .tlv_type = custom_onion_msg_type_id,
+ .write = custom_onion_msg_bytes,
+ .debug_str = custom_onion_msg_str,
+ .cloned = NULL,
+ .free = NULL,
+ };
+}
+
+LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_onion_message(const void* this_arg, uint64_t type, LDKu8slice buf) {
+ assert(type == 8888);
+ assert(buf.datalen == 1024);
+ uint8_t cmp[1024];
+ memset(cmp, 43, 1024);
+ assert(!memcmp(cmp, buf.data, 1024));
+ return CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(COption_OnionMessageContentsZ_some(build_custom_onion_message()));
+}
+
+LDKCVec_C2Tuple_OnionMessageContentsMessageSendInstructionsZZ release_no_messages(const void* this_arg) {
+ return LDKCVec_C2Tuple_OnionMessageContentsMessageSendInstructionsZZ {
+ .data = NULL, .datalen = 0
+ };
+}
+