@@ -15,13 +15,13 @@ enum InvalidSerializedDataError: Error {
15
15
public class ChannelManagerConstructor {
16
16
17
17
public let channelManager : ChannelManager
18
-
18
+
19
19
/**
20
20
* The latest block has the channel manager saw. If this is non-null it is a 32-byte block hash.
21
21
* You should sync the blockchain starting with the block that builds on this block.
22
22
*/
23
23
public let channel_manager_latest_block_hash : [ UInt8 ] ?
24
-
24
+
25
25
/**
26
26
* A list of ChannelMonitors and the last block they each saw. You should sync the blockchain on each individually
27
27
* starting with the block that builds on the hash given.
@@ -46,8 +46,10 @@ public class ChannelManagerConstructor {
46
46
var b : LDKChannelMonitor = value. result!. pointee. b
47
47
b. is_owned = false
48
48
let currentChannelMonitor = ChannelMonitor ( pointer: b)
49
- monitors. append ( b)
50
- self . channel_monitors. append ( ( currentChannelMonitor, Bindings . LDKThirtyTwoBytes_to_array ( nativeType: a) ) )
49
+ var clonedChannelMonitor = currentChannelMonitor. clone ( orig: currentChannelMonitor)
50
+ clonedChannelMonitor. cOpaqueStruct? . is_owned = false
51
+ monitors. append ( clonedChannelMonitor. cOpaqueStruct!)
52
+ self . channel_monitors. append ( ( clonedChannelMonitor, Bindings . LDKThirtyTwoBytes_to_array ( nativeType: a) ) )
51
53
}
52
54
53
55
let res = UtilMethods . constructor_BlockHashChannelManagerZ_read ( ser: channel_manager_serialized, arg_keys_manager: keys_interface, arg_fee_estimator: fee_estimator, arg_chain_monitor: chain_monitor. as_Watch ( ) , arg_tx_broadcaster: tx_broadcaster, arg_logger: logger, arg_default_config: UserConfig ( ) , arg_channel_monitors: monitors)
@@ -80,10 +82,10 @@ public class ChannelManagerConstructor {
80
82
let chainParameters = ChainParameters ( network_arg: network, best_block_arg: block)
81
83
self . channelManager = ChannelManager ( fee_est: fee_estimator, chain_monitor: chain_monitor. as_Watch ( ) , tx_broadcaster: tx_broadcaster, logger: logger, keys_manager: keys_interface, config: config, params: chainParameters)
82
84
}
83
-
85
+
84
86
var persisterWorkItem : DispatchWorkItem ?
85
87
var shutdown = false
86
-
88
+
87
89
/**
88
90
* Utility which adds all of the deserialized ChannelMonitors to the chain watch so that further updates from the
89
91
* ChannelManager are processed as normal.
@@ -95,65 +97,68 @@ public class ChannelManagerConstructor {
95
97
if self . persisterWorkItem != nil {
96
98
return
97
99
}
98
-
100
+
99
101
for (currentChannelMonitor, _) in self . channel_monitors {
100
102
let chainMonitorWatch = self . chain_monitor. as_Watch ( )
101
- let fundingTxo = currentChannelMonitor. get_funding_txo ( )
103
+ let monitorClone = currentChannelMonitor. clone ( orig: currentChannelMonitor)
104
+ let fundingTxo = monitorClone. get_funding_txo ( )
102
105
let outPoint = OutPoint ( pointer: fundingTxo. cOpaqueStruct!. a)
103
-
104
- chainMonitorWatch. cOpaqueStruct!. watch_channel ( chainMonitorWatch. cOpaqueStruct!. this_arg, outPoint. cOpaqueStruct!, currentChannelMonitor. cOpaqueStruct!)
105
- // chainMonitorWatch.watch_channel(funding_txo: outPoint, monitor: currentChannelMonitor)
106
+
107
+ let monitorWatchResult = chainMonitorWatch. watch_channel ( funding_txo: outPoint, monitor: monitorClone)
108
+ if !monitorWatchResult. isOk ( ) {
109
+ print ( " Some error occurred with a chainMonitorWatch.watch_channel call " )
110
+ }
106
111
}
107
-
112
+
108
113
self . persisterWorkItem = DispatchWorkItem {
109
114
var lastTimerTick = NSDate ( ) . timeIntervalSince1970
110
115
while !self . shutdown {
111
116
var needsPersist = self . channelManager. await_persistable_update_timeout ( max_wait: 1 )
112
-
113
- let nativeManagerEventsProvider = self . channelManager. as_EventsProvider ( ) . cOpaqueStruct!
114
- let rawManagerEvents = Bindings . LDKCVec_EventZ_to_array ( nativeType : nativeManagerEventsProvider . get_and_clear_pending_events ( nativeManagerEventsProvider . this_arg ) )
115
-
117
+
118
+ let managerEventsProvider = self . channelManager. as_EventsProvider ( )
119
+ let rawManagerEvents = managerEventsProvider . get_and_clear_pending_events ( )
120
+
116
121
let managerEvents = rawManagerEvents. map { ( e: LDKEvent ) -> Event in
117
122
Event ( pointer: e)
118
123
}
119
124
if managerEvents. count != 0 {
120
125
persister. handle_events ( events: managerEvents)
121
126
needsPersist = true
122
127
}
123
-
124
- let nativeMonitorEventsProvider = self . chain_monitor. as_EventsProvider ( ) . cOpaqueStruct!
125
- let rawMonitorEvents = Bindings . LDKCVec_EventZ_to_array ( nativeType : nativeMonitorEventsProvider . get_and_clear_pending_events ( nativeMonitorEventsProvider . this_arg ) )
126
-
128
+
129
+ let monitorEventsProvider = self . chain_monitor. as_EventsProvider ( )
130
+ let rawMonitorEvents = monitorEventsProvider . get_and_clear_pending_events ( )
131
+
127
132
let monitorEvents = rawMonitorEvents. map { ( e: LDKEvent ) -> Event in
128
133
Event ( pointer: e)
129
134
}
130
135
if monitorEvents. count != 0 {
131
136
persister. handle_events ( events: monitorEvents)
132
137
needsPersist = true
133
138
}
134
-
139
+
135
140
if needsPersist {
136
141
persister. persist_manager ( channel_manager_bytes: self . channelManager. write ( obj: self . channelManager) )
137
142
}
138
-
143
+
139
144
if self . shutdown {
140
145
return
141
146
}
142
-
147
+
143
148
let currentTimerTick = NSDate ( ) . timeIntervalSince1970
144
149
if lastTimerTick < ( currentTimerTick- 60 ) { // more than 60 seconds have passed since the last timer tick
145
150
self . channelManager. timer_tick_occurred ( )
146
151
lastTimerTick = currentTimerTick
147
152
}
148
-
153
+
149
154
Thread . sleep ( forTimeInterval: 1 ) // this should hopefully not suspend the main application
150
155
}
151
156
}
152
-
157
+
153
158
let backgroundQueue = DispatchQueue ( label: " org.ldk.ChannelManagerConstructor.persisterThread " , qos: . background)
154
159
backgroundQueue. async ( execute: self . persisterWorkItem!)
155
160
}
156
-
161
+
157
162
public func interrupt( ) {
158
163
self . shutdown = true
159
164
if let workItem = self . persisterWorkItem {
0 commit comments