@@ -40,6 +40,19 @@ class DataStoreHubEventStreamHandler : EventChannel.StreamHandler {
40
40
private val LOG = Amplify .Logging .forNamespace(" amplify:flutter:datastore" )
41
41
private var forwardHubResponse : (event: Map <String , Any >) -> Unit
42
42
43
+ // DataStore hub event history. Used to track events which may be lost on hot restart, such as sync and ready events.
44
+ private var eventHistory: MutableList <HubEvent <* >> = mutableListOf ();
45
+
46
+ // Event types which should be replayed on hot restart.
47
+ private val replayEvents: Set <String > = setOf (
48
+ DataStoreChannelEventName .NETWORK_STATUS .toString(),
49
+ DataStoreChannelEventName .SUBSCRIPTIONS_ESTABLISHED .toString(),
50
+ DataStoreChannelEventName .SYNC_QUERIES_STARTED .toString(),
51
+ DataStoreChannelEventName .MODEL_SYNCED .toString(),
52
+ DataStoreChannelEventName .SYNC_QUERIES_READY .toString(),
53
+ DataStoreChannelEventName .READY .toString()
54
+ )
55
+
43
56
constructor (){
44
57
forwardHubResponse = {event: Map <String , Any > -> handler.post {
45
58
eventSink?.success(event)
@@ -56,125 +69,134 @@ class DataStoreHubEventStreamHandler : EventChannel.StreamHandler {
56
69
}
57
70
58
71
fun getHubListener (): SubscriptionToken {
59
- return Amplify .Hub .subscribe(HubChannel .DATASTORE
60
- ) { hubEvent: HubEvent <* > ->
61
- try {
62
- when (hubEvent.name) {
63
- DataStoreChannelEventName .NETWORK_STATUS .toString() -> {
64
- try {
65
- var networkEvent = hubEvent.data as NetworkStatusEvent
66
- var res = FlutterNetworkStatusEvent (hubEvent.name, networkEvent.active)
67
- sendEvent(res.toValueMap())
68
- } catch (e: Exception ) {
69
- LOG .error(" Failed to parse and send networkStatus event: " , e)
70
- }
72
+ for (event in eventHistory) {
73
+ if (replayEvents.contains(event.name)) {
74
+ sendPayload(event);
75
+ }
76
+ }
77
+ return Amplify .Hub .subscribe(HubChannel .DATASTORE ) { hubEvent: HubEvent <* > ->
78
+ eventHistory.add(hubEvent)
79
+ sendPayload(hubEvent)
80
+ }
81
+ }
82
+
83
+ private fun sendPayload (hubEvent : HubEvent <* >) {
84
+ try {
85
+ when (hubEvent.name) {
86
+ DataStoreChannelEventName .NETWORK_STATUS .toString() -> {
87
+ try {
88
+ var networkEvent = hubEvent.data as NetworkStatusEvent
89
+ var res = FlutterNetworkStatusEvent (hubEvent.name, networkEvent.active)
90
+ sendEvent(res.toValueMap())
91
+ } catch (e: Exception ) {
92
+ LOG .error(" Failed to parse and send networkStatus event: " , e)
71
93
}
72
- DataStoreChannelEventName . SUBSCRIPTIONS_ESTABLISHED .toString() -> {
73
- try {
74
- var res = FlutterSubscriptionsEstablishedEvent (hubEvent.name)
75
- sendEvent(res.toValueMap() )
76
- } catch (e : Exception ) {
77
- LOG .error( " Failed to parse and send subscriptionsEstablished event: " , e)
78
- }
94
+ }
95
+ DataStoreChannelEventName . SUBSCRIPTIONS_ESTABLISHED .toString() -> {
96
+ try {
97
+ var res = FlutterSubscriptionsEstablishedEvent (hubEvent.name )
98
+ sendEvent(res.toValueMap())
99
+ } catch (e : Exception ) {
100
+ LOG .error( " Failed to parse and send subscriptionsEstablished event: " , e)
79
101
}
80
- DataStoreChannelEventName .SYNC_QUERIES_STARTED .toString() -> {
81
- try {
82
- var syncQueriesStartedEvent = hubEvent.data as SyncQueriesStartedEvent
83
- var res = FlutterSyncQueriesStartedEvent (hubEvent.name, syncQueriesStartedEvent.models)
84
- sendEvent(res.toValueMap())
85
- } catch (e: Exception ) {
86
- LOG .error(" Failed to parse and send syncQueriesStarted event: " , e)
87
- }
102
+ }
103
+ DataStoreChannelEventName .SYNC_QUERIES_STARTED .toString() -> {
104
+ try {
105
+ var syncQueriesStartedEvent = hubEvent.data as SyncQueriesStartedEvent
106
+ var res = FlutterSyncQueriesStartedEvent (hubEvent.name, syncQueriesStartedEvent.models)
107
+ sendEvent(res.toValueMap())
108
+ } catch (e: Exception ) {
109
+ LOG .error(" Failed to parse and send syncQueriesStarted event: " , e)
110
+ }
111
+ }
112
+ DataStoreChannelEventName .MODEL_SYNCED .toString() -> {
113
+ try {
114
+ var modelSyncedEvent = hubEvent.data as ModelSyncedEvent
115
+ var res = FlutterModelSyncedEvent (
116
+ hubEvent.name,
117
+ modelSyncedEvent.model,
118
+ modelSyncedEvent.isFullSync,
119
+ modelSyncedEvent.isDeltaSync,
120
+ modelSyncedEvent.added,
121
+ modelSyncedEvent.updated,
122
+ modelSyncedEvent.deleted
123
+ )
124
+ sendEvent(res.toValueMap())
125
+ } catch (e: Exception ) {
126
+ LOG .error(" Failed to parse and send modelSynced event: " , e)
88
127
}
89
- DataStoreChannelEventName .MODEL_SYNCED .toString() -> {
90
- try {
91
- var modelSyncedEvent = hubEvent.data as ModelSyncedEvent
92
- var res = FlutterModelSyncedEvent (
93
- hubEvent.name,
94
- modelSyncedEvent.model,
95
- modelSyncedEvent.isFullSync,
96
- modelSyncedEvent.isDeltaSync,
97
- modelSyncedEvent.added,
98
- modelSyncedEvent.updated,
99
- modelSyncedEvent.deleted
100
- )
101
- sendEvent(res.toValueMap())
102
- } catch (e: Exception ) {
103
- LOG .error(" Failed to parse and send modelSynced event: " , e)
104
- }
105
128
129
+ }
130
+ DataStoreChannelEventName .SYNC_QUERIES_READY .toString() -> {
131
+ try {
132
+ var res = FlutterSyncQueriesReadyEvent (hubEvent.name)
133
+ sendEvent(res.toValueMap())
134
+ } catch (e: Exception ) {
135
+ LOG .error(" Failed to parse and send syncQueriesReady event: " , e)
106
136
}
107
- DataStoreChannelEventName . SYNC_QUERIES_READY .toString() -> {
108
- try {
109
- var res = FlutterSyncQueriesReadyEvent (hubEvent.name)
110
- sendEvent(res.toValueMap() )
111
- } catch (e : Exception ) {
112
- LOG .error( " Failed to parse and send syncQueriesReady event: " , e)
113
- }
137
+ }
138
+ DataStoreChannelEventName . READY .toString() -> {
139
+ try {
140
+ var res = FlutterReadyEvent (hubEvent.name )
141
+ sendEvent(res.toValueMap())
142
+ } catch (e : Exception ) {
143
+ LOG .error( " Failed to parse and send ready event: " , e)
114
144
}
115
- DataStoreChannelEventName .READY .toString() -> {
116
- try {
117
- var res = FlutterReadyEvent (hubEvent.name)
145
+ }
146
+ DataStoreChannelEventName .OUTBOX_MUTATION_ENQUEUED .toString() -> {
147
+ try {
148
+ var outboxMutationEnqueued = hubEvent.data as OutboxMutationEvent <* >
149
+ if (outboxMutationEnqueued.element.model is SerializedModel ) {
150
+ var modelName = (outboxMutationEnqueued.element.model as SerializedModel ).modelName as String
151
+ var res = FlutterOutboxMutationEnqueuedEvent (
152
+ hubEvent.name,
153
+ modelName,
154
+ outboxMutationEnqueued.element
155
+ )
118
156
sendEvent(res.toValueMap())
119
- } catch (e : Exception ) {
120
- LOG .error(" Failed to parse and send ready event: " , e )
157
+ } else {
158
+ LOG .error(" Element is not an instance of SerializedModel. " )
121
159
}
160
+ } catch (e: Exception ) {
161
+ LOG .error(" Failed to parse and send outboxMutationEnqueued event: " , e)
122
162
}
123
- DataStoreChannelEventName .OUTBOX_MUTATION_ENQUEUED .toString() -> {
124
- try {
125
- var outboxMutationEnqueued = hubEvent.data as OutboxMutationEvent <* >
126
- if (outboxMutationEnqueued.element.model is SerializedModel ) {
127
- var modelName = (outboxMutationEnqueued.element.model as SerializedModel ).modelName as String
128
- var res = FlutterOutboxMutationEnqueuedEvent (
129
- hubEvent.name,
130
- modelName,
131
- outboxMutationEnqueued.element
132
- )
133
- sendEvent(res.toValueMap())
134
- } else {
135
- LOG .error(" Element is not an instance of SerializedModel." )
136
- }
137
- } catch (e: Exception ) {
138
- LOG .error(" Failed to parse and send outboxMutationEnqueued event: " , e)
139
- }
140
163
141
- }
142
- DataStoreChannelEventName .OUTBOX_MUTATION_PROCESSED .toString() -> {
143
- try {
144
- var outboxMutationProcessed = hubEvent.data as OutboxMutationEvent <* >
145
- if (outboxMutationProcessed.element.model is SerializedModel ) {
146
- var modelName = outboxMutationProcessed.modelName
147
- var res = FlutterOutboxMutationProcessedEvent (
148
- hubEvent.name,
149
- modelName,
150
- outboxMutationProcessed.element
151
- )
152
- sendEvent(res.toValueMap())
153
- } else {
154
- LOG .error(" Element is not an instance of SerializedModel." )
155
- }
156
- } catch (e: Exception ) {
157
- LOG .error(" Failed to parse and send outboxMutationProcessed event: " , e)
158
- }
159
- }
160
- DataStoreChannelEventName .OUTBOX_STATUS .toString() -> {
161
- try {
162
- var outboxEvent = hubEvent.data as OutboxStatusEvent
163
- var res = FlutterOutboxStatusEvent (hubEvent.name, outboxEvent.isEmpty)
164
+ }
165
+ DataStoreChannelEventName .OUTBOX_MUTATION_PROCESSED .toString() -> {
166
+ try {
167
+ var outboxMutationProcessed = hubEvent.data as OutboxMutationEvent <* >
168
+ if (outboxMutationProcessed.element.model is SerializedModel ) {
169
+ var modelName = outboxMutationProcessed.modelName
170
+ var res = FlutterOutboxMutationProcessedEvent (
171
+ hubEvent.name,
172
+ modelName,
173
+ outboxMutationProcessed.element
174
+ )
164
175
sendEvent(res.toValueMap())
165
- } catch (e : Exception ) {
166
- LOG .error(" Failed to parse and send outboxStatus event: " , e )
176
+ } else {
177
+ LOG .error(" Element is not an instance of SerializedModel. " )
167
178
}
179
+ } catch (e: Exception ) {
180
+ LOG .error(" Failed to parse and send outboxMutationProcessed event: " , e)
168
181
}
169
- else -> {
170
- LOG .info(" Unhandled DataStoreHubEvent: " + hubEvent.name + " \n " + hubEvent.data.toString())
182
+ }
183
+ DataStoreChannelEventName .OUTBOX_STATUS .toString() -> {
184
+ try {
185
+ var outboxEvent = hubEvent.data as OutboxStatusEvent
186
+ var res = FlutterOutboxStatusEvent (hubEvent.name, outboxEvent.isEmpty)
187
+ sendEvent(res.toValueMap())
188
+ } catch (e: Exception ) {
189
+ LOG .error(" Failed to parse and send outboxStatus event: " , e)
171
190
}
172
191
}
173
- } catch (e: Exception ) {
174
- LOG .error(" Error parsing DataStore Hub event." )
192
+ else -> {
193
+ LOG .info(" Unhandled DataStoreHubEvent: " + hubEvent.name + " \n " + hubEvent.data.toString())
194
+ }
175
195
}
196
+ } catch (e: Exception ) {
197
+ LOG .error(" Error parsing DataStore Hub event." )
176
198
}
177
- }
199
+ }
178
200
179
201
fun sendEvent (flutterEvent : Map <String , Any >) {
180
202
forwardHubResponse(flutterEvent)
0 commit comments