@@ -5,6 +5,7 @@ import cbl.js.kotiln.CollectionManager
55import cbl.js.kotiln.FileSystemHelper
66import cbl.js.kotiln.LoggingManager
77import cbl.js.kotiln.ReplicatorManager
8+ import cbl.js.kotiln.ReplicatorHelper
89import com.couchbase.lite.*
910import com.facebook.react.bridge.Promise
1011import com.facebook.react.bridge.ReactApplicationContext
@@ -39,7 +40,7 @@ class CblReactnativeModule(reactContext: ReactApplicationContext) :
3940 return NAME
4041 }
4142
42- /*
43+
4344 private fun sendEvent (
4445 reactContext : ReactContext ,
4546 eventName : String ,
@@ -48,7 +49,7 @@ class CblReactnativeModule(reactContext: ReactApplicationContext) :
4849 .getJSModule(DeviceEventManagerModule .RCTDeviceEventEmitter ::class .java)
4950 .emit(eventName, params)
5051 }
51- */
52+
5253
5354 // Collection Functions
5455 @ReactMethod
@@ -926,36 +927,74 @@ class CblReactnativeModule(reactContext: ReactApplicationContext) :
926927 }
927928
928929 // Replicator Functions
929- @ReactMethod
930- fun replicator_AddChangeListener (
931- changeListenerToken : String ,
932- replicatorId : String ,
933- promise : Promise ){
934- GlobalScope .launch(Dispatchers .IO ) {
935- try {
936- if (! DataValidation .validateReplicatorId(replicatorId, promise)){
937- return @launch
938- }
939- val replicator = ReplicatorManager .getReplicator(replicatorId)
940- val listener = replicator?.addChangeListener { change ->
941- val map = DataAdapter .replicatorStatusToMap(change.status)
942- context.runOnUiQueueThread {
943- // sendEvent(context, "replicatorStatusChange", map)
944- }
945- }
946- listener?.let {
947- replicatorChangeListeners[changeListenerToken] = it
948- }
930+ @ReactMethod
931+ fun replicator_AddChangeListener (
932+ changeListenerToken : String ,
933+ replicatorId : String ,
934+ promise : Promise ){
935+ GlobalScope .launch(Dispatchers .IO ) {
936+ try {
937+ if (! DataValidation .validateReplicatorId(replicatorId, promise)){
938+ return @launch
939+ }
940+ val replicator = ReplicatorManager .getReplicator(replicatorId)
941+ val listener = replicator?.addChangeListener { change ->
942+ val statusMap = ReplicatorHelper .generateReplicatorStatusMap(change.status)
943+ val resultMap = Arguments .createMap()
944+ resultMap.putString(" token" , changeListenerToken)
945+ resultMap.putMap(" status" , statusMap)
949946 context.runOnUiQueueThread {
950- promise.resolve( null )
947+ sendEvent(context, " replicatorStatusChange " , resultMap )
951948 }
952- } catch (e: Throwable ) {
949+ }
950+ listener?.let {
951+ replicatorChangeListeners[changeListenerToken] = it
952+ }
953+ context.runOnUiQueueThread {
954+ promise.resolve(null )
955+ }
956+ } catch (e: Throwable ) {
957+ context.runOnUiQueueThread {
958+ promise.reject(" REPLICATOR_ERROR" , e.message)
959+ }
960+ }
961+ }
962+ }
963+
964+ @ReactMethod
965+ fun replicator_AddDocumentChangeListener (
966+ changeListenerToken : String ,
967+ replicatorId : String ,
968+ promise : Promise ){
969+ GlobalScope .launch(Dispatchers .IO ) {
970+ try {
971+ if (! DataValidation .validateReplicatorId(replicatorId, promise)){
972+ return @launch
973+ }
974+ val replicator = ReplicatorManager .getReplicator(replicatorId)
975+ val listener = replicator?.addDocumentReplicationListener { change ->
976+ val documentMap = ReplicatorHelper .generateDocumentReplicationMap(change.documents, change.isPush)
977+ val resultMap = Arguments .createMap()
978+ resultMap.putString(" token" , changeListenerToken)
979+ resultMap.putMap(" documents" , documentMap)
953980 context.runOnUiQueueThread {
954- promise.reject( " REPLICATOR_ERROR " , e.message )
981+ sendEvent(context, " replicatorDocumentChange " , resultMap )
955982 }
956983 }
984+ listener?.let {
985+ replicatorDocumentListeners[changeListenerToken] = it
986+ }
987+ context.runOnUiQueueThread {
988+ promise.resolve(null )
989+ }
990+ } catch (e: Throwable ) {
991+ context.runOnUiQueueThread {
992+ promise.reject(" REPLICATOR_ERROR" , e.message)
993+ }
957994 }
958995 }
996+ }
997+
959998 @ReactMethod
960999 fun replicator_Cleanup (
9611000 replicatorId : String ,
@@ -977,26 +1016,27 @@ class CblReactnativeModule(reactContext: ReactApplicationContext) :
9771016 }
9781017 }
9791018
980- @ReactMethod
981- fun replicator_Create (
982- config : ReadableMap ,
983- promise : Promise ) {
984- GlobalScope .launch(Dispatchers .IO ) {
985- try {
986- val replicatorConfig = DataAdapter .readableMapToReplicatorConfig(config)
987- val replicatorId = ReplicatorManager .createReplicator(replicatorConfig )
988- val map = Arguments .createMap( )
989- map.putString( " replicatorId " , replicatorId )
990- context.runOnUiQueueThread {
991- promise.resolve(map)
992- }
993- } catch (e : Throwable ) {
994- context.runOnUiQueueThread {
995- promise.reject( " REPLICATOR_ERROR " , e.message)
996- }
1019+ @ReactMethod
1020+ fun replicator_Create (
1021+ config : ReadableMap ,
1022+ promise : Promise ) {
1023+ GlobalScope .launch(Dispatchers .IO ) {
1024+ try {
1025+ // Use the ReplicatorHelper to create a configuration from the ReadableMap
1026+ val replicatorConfig = ReplicatorHelper .replicatorConfigFromJson(config )
1027+ val replicatorId = ReplicatorManager .createReplicator(replicatorConfig )
1028+ val map = Arguments .createMap( )
1029+ map.putString( " replicatorId " , replicatorId)
1030+ context.runOnUiQueueThread {
1031+ promise.resolve(map)
1032+ }
1033+ } catch (e : Throwable ) {
1034+ context.runOnUiQueueThread {
1035+ promise.reject( " REPLICATOR_ERROR " , e.message)
9971036 }
9981037 }
9991038 }
1039+ }
10001040
10011041 @ReactMethod
10021042 fun replicator_GetPendingDocumentIds (
@@ -1077,31 +1117,50 @@ class CblReactnativeModule(reactContext: ReactApplicationContext) :
10771117 }
10781118 }
10791119
1080- @ReactMethod
1081- fun replicator_RemoveChangeListener (
1082- changeListenerToken : String ,
1083- replicatorId : String ,
1084- promise : Promise ) {
1085- GlobalScope .launch(Dispatchers .IO ) {
1086- try {
1087- if (! DataValidation .validateReplicatorId(replicatorId, promise)){
1088- return @launch
1089- }
1090- val changeListener = replicatorChangeListeners[changeListenerToken]
1091- changeListener?.let {
1092- changeListener.remove()
1093- replicatorChangeListeners.remove(changeListenerToken)
1094- }
1120+ @ReactMethod
1121+ fun replicator_RemoveChangeListener (
1122+ changeListenerToken : String ,
1123+ replicatorId : String ,
1124+ promise : Promise ) {
1125+ GlobalScope .launch(Dispatchers .IO ) {
1126+ try {
1127+ if (! DataValidation .validateReplicatorId(replicatorId, promise)){
1128+ return @launch
1129+ }
1130+
1131+ // Check for replicator change listeners
1132+ if (replicatorChangeListeners.containsKey(changeListenerToken)) {
1133+ val listener = replicatorChangeListeners[changeListenerToken]
1134+ listener?.remove()
1135+ replicatorChangeListeners.remove(changeListenerToken)
10951136 context.runOnUiQueueThread {
10961137 promise.resolve(null )
10971138 }
1098- } catch (e: Throwable ) {
1139+ return @launch
1140+ }
1141+
1142+ // Check for document change listeners
1143+ if (replicatorDocumentListeners.containsKey(changeListenerToken)) {
1144+ val listener = replicatorDocumentListeners[changeListenerToken]
1145+ listener?.remove()
1146+ replicatorDocumentListeners.remove(changeListenerToken)
10991147 context.runOnUiQueueThread {
1100- promise.reject( " REPLICATOR_ERROR " , e.message )
1148+ promise.resolve( null )
11011149 }
1150+ return @launch
1151+ }
1152+
1153+ // If no listener found
1154+ context.runOnUiQueueThread {
1155+ promise.reject(" REPLICATOR_ERROR" , " No such listener found with token $changeListenerToken " )
1156+ }
1157+ } catch (e: Throwable ) {
1158+ context.runOnUiQueueThread {
1159+ promise.reject(" REPLICATOR_ERROR" , e.message)
11021160 }
11031161 }
11041162 }
1163+ }
11051164
11061165 @ReactMethod
11071166 fun replicator_ResetCheckpoint (
0 commit comments