bridgefy-react-native 1.1.8 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +137 -76
  3. package/android/build.gradle +37 -56
  4. package/android/gradle.properties +4 -4
  5. package/android/src/main/AndroidManifest.xml +1 -11
  6. package/android/src/main/java/me/bridgefy/plugin/react_native/BridgefyReactNativeModule.kt +590 -333
  7. package/android/src/main/java/me/bridgefy/plugin/react_native/BridgefyReactNativePackage.kt +25 -8
  8. package/android/src/main/java/me/bridgefy/plugin/react_native/service/BridgefyService.kt +625 -0
  9. package/android/src/main/java/me/bridgefy/plugin/react_native/util/BridgefyOperationModeManager.kt +193 -0
  10. package/android/src/main/java/me/bridgefy/plugin/react_native/util/BridgefyServiceManager.kt +123 -0
  11. package/android/src/main/java/me/bridgefy/plugin/react_native/util/Utils.kt +172 -0
  12. package/bridgefy-react-native.podspec +5 -25
  13. package/ios/BridgefyReactNativeModule.m +88 -0
  14. package/ios/BridgefyReactNativeModule.swift +524 -0
  15. package/lib/module/NativeBridgefy.js +117 -0
  16. package/lib/module/NativeBridgefy.js.map +1 -0
  17. package/lib/module/index.js +172 -207
  18. package/lib/module/index.js.map +1 -1
  19. package/lib/module/package.json +1 -0
  20. package/lib/typescript/package.json +1 -0
  21. package/lib/typescript/src/NativeBridgefy.d.ts +250 -0
  22. package/lib/typescript/src/NativeBridgefy.d.ts.map +1 -0
  23. package/lib/typescript/src/index.d.ts +146 -0
  24. package/lib/typescript/src/index.d.ts.map +1 -0
  25. package/package.json +77 -74
  26. package/src/NativeBridgefy.ts +321 -0
  27. package/src/index.tsx +283 -225
  28. package/ios/BridgefyReactNative.m +0 -56
  29. package/ios/BridgefyReactNative.swift +0 -368
  30. package/ios/BridgefyReactNative.xcodeproj/project.pbxproj +0 -293
  31. package/ios/BridgefyReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  32. package/ios/BridgefyReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  33. package/ios/BridgefyReactNative.xcodeproj/project.xcworkspace/xcuserdata/bridgefy.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  34. package/ios/BridgefyReactNative.xcodeproj/xcuserdata/bridgefy.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  35. package/ios/Frameworks/BridgefySDK.xcframework/Info.plist +0 -48
  36. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/BridgefySDK +0 -0
  37. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Headers/BridgefySDK-Swift.h +0 -317
  38. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Headers/BridgefySDK.h +0 -15
  39. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Info.plist +0 -0
  40. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios.abi.json +0 -5523
  41. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios.private.swiftinterface +0 -116
  42. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios.swiftdoc +0 -0
  43. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios.swiftinterface +0 -116
  44. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/Modules/module.modulemap +0 -11
  45. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/BridgefySDK.framework/_CodeSignature/CodeResources +0 -190
  46. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/dSYMs/BridgefySDK.framework.dSYM/Contents/Info.plist +0 -20
  47. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/dSYMs/BridgefySDK.framework.dSYM/Contents/Resources/DWARF/BridgefySDK +0 -0
  48. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64/dSYMs/BridgefySDK.framework.dSYM/Contents/Resources/Relocations/aarch64/BridgefySDK.yml +0 -12529
  49. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/BridgefySDK +0 -0
  50. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Headers/BridgefySDK-Swift.h +0 -630
  51. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Headers/BridgefySDK.h +0 -15
  52. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Info.plist +0 -0
  53. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios-simulator.abi.json +0 -5523
  54. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface +0 -116
  55. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
  56. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/arm64-apple-ios-simulator.swiftinterface +0 -116
  57. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/x86_64-apple-ios-simulator.abi.json +0 -5523
  58. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface +0 -116
  59. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
  60. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/BridgefySDK.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +0 -116
  61. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/Modules/module.modulemap +0 -11
  62. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/BridgefySDK.framework/_CodeSignature/CodeResources +0 -245
  63. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/BridgefySDK.framework.dSYM/Contents/Info.plist +0 -20
  64. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/BridgefySDK.framework.dSYM/Contents/Resources/DWARF/BridgefySDK +0 -0
  65. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/BridgefySDK.framework.dSYM/Contents/Resources/Relocations/aarch64/BridgefySDK.yml +0 -12276
  66. package/ios/Frameworks/BridgefySDK.xcframework/ios-arm64_x86_64-simulator/dSYMs/BridgefySDK.framework.dSYM/Contents/Resources/Relocations/x86_64/BridgefySDK.yml +0 -11932
  67. package/lib/commonjs/index.js +0 -278
  68. package/lib/commonjs/index.js.map +0 -1
  69. package/lib/commonjs/infraestructure/index.js +0 -28
  70. package/lib/commonjs/infraestructure/index.js.map +0 -1
  71. package/lib/commonjs/infraestructure/interfaces/ibridgefy.js +0 -6
  72. package/lib/commonjs/infraestructure/interfaces/ibridgefy.js.map +0 -1
  73. package/lib/commonjs/infraestructure/interfaces/index.js +0 -17
  74. package/lib/commonjs/infraestructure/interfaces/index.js.map +0 -1
  75. package/lib/commonjs/infraestructure/services/bridgefy_service.js +0 -6
  76. package/lib/commonjs/infraestructure/services/bridgefy_service.js.map +0 -1
  77. package/lib/commonjs/infraestructure/services/index.js +0 -17
  78. package/lib/commonjs/infraestructure/services/index.js.map +0 -1
  79. package/lib/module/infraestructure/index.js +0 -3
  80. package/lib/module/infraestructure/index.js.map +0 -1
  81. package/lib/module/infraestructure/interfaces/ibridgefy.js +0 -2
  82. package/lib/module/infraestructure/interfaces/ibridgefy.js.map +0 -1
  83. package/lib/module/infraestructure/interfaces/index.js +0 -2
  84. package/lib/module/infraestructure/interfaces/index.js.map +0 -1
  85. package/lib/module/infraestructure/services/bridgefy_service.js +0 -2
  86. package/lib/module/infraestructure/services/bridgefy_service.js.map +0 -1
  87. package/lib/module/infraestructure/services/index.js +0 -2
  88. package/lib/module/infraestructure/services/index.js.map +0 -1
  89. package/lib/typescript/index.d.ts +0 -219
  90. package/lib/typescript/index.d.ts.map +0 -1
  91. package/lib/typescript/infraestructure/index.d.ts +0 -3
  92. package/lib/typescript/infraestructure/index.d.ts.map +0 -1
  93. package/lib/typescript/infraestructure/interfaces/ibridgefy.d.ts +0 -10
  94. package/lib/typescript/infraestructure/interfaces/ibridgefy.d.ts.map +0 -1
  95. package/lib/typescript/infraestructure/interfaces/index.d.ts +0 -2
  96. package/lib/typescript/infraestructure/interfaces/index.d.ts.map +0 -1
  97. package/lib/typescript/infraestructure/services/bridgefy_service.d.ts +0 -17
  98. package/lib/typescript/infraestructure/services/bridgefy_service.d.ts.map +0 -1
  99. package/lib/typescript/infraestructure/services/index.d.ts +0 -2
  100. package/lib/typescript/infraestructure/services/index.d.ts.map +0 -1
  101. package/src/infraestructure/index.tsx +0 -2
  102. package/src/infraestructure/interfaces/ibridgefy.tsx +0 -10
  103. package/src/infraestructure/interfaces/index.tsx +0 -1
  104. package/src/infraestructure/services/bridgefy_service.tsx +0 -20
  105. package/src/infraestructure/services/index.tsx +0 -1
@@ -1,408 +1,665 @@
1
+ /**
2
+ *
3
+ * Kotlin implementation for Bridgefy TurboModule on Android
4
+ * Implements NativeBridgefy spec methods
5
+ */
6
+
1
7
  package me.bridgefy.plugin.react_native
2
8
 
3
- import android.util.Log
9
+ import android.content.BroadcastReceiver
10
+ import android.content.Context
11
+ import android.content.Intent
12
+ import android.content.IntentFilter
13
+ import android.os.Build
14
+ import android.os.Bundle
15
+ import androidx.core.content.ContextCompat
4
16
  import com.facebook.react.bridge.Arguments
17
+ import com.facebook.react.bridge.LifecycleEventListener
5
18
  import com.facebook.react.bridge.Promise
6
19
  import com.facebook.react.bridge.ReactApplicationContext
7
- import com.facebook.react.bridge.ReactContext
8
- import com.facebook.react.bridge.ReactContextBaseJavaModule
9
- import com.facebook.react.bridge.ReactMethod
10
20
  import com.facebook.react.bridge.ReadableMap
11
21
  import com.facebook.react.bridge.WritableMap
22
+ import com.facebook.react.module.annotations.ReactModule
12
23
  import com.facebook.react.modules.core.DeviceEventManagerModule
13
- import java.util.UUID
14
- import me.bridgefy.Bridgefy
15
- import me.bridgefy.logger.enums.LogType
16
24
  import me.bridgefy.commons.TransmissionMode
17
- import me.bridgefy.commons.exception.BridgefyException
18
- import me.bridgefy.commons.listener.BridgefyDelegate
19
- import me.bridgefy.commons.propagation.PropagationProfile
25
+ import me.bridgefy.plugin.react_native.service.BridgefyService
26
+ import me.bridgefy.plugin.react_native.util.BridgefyOperationModeManager
27
+ import me.bridgefy.plugin.react_native.util.BridgefyServiceManager
28
+ import me.bridgefy.plugin.react_native.util.OperationMode
29
+ import me.bridgefy.plugin.react_native.util.Utils.bundleFromTransmissionMode
30
+ import me.bridgefy.plugin.react_native.util.Utils.mapFromTransmissionMode
31
+ import me.bridgefy.plugin.react_native.util.Utils.transmissionModeFromBundle
32
+ import java.util.UUID
20
33
 
21
- class BridgefyReactNativeModule(reactContext: ReactApplicationContext) :
22
- ReactContextBaseJavaModule(reactContext) {
34
+ @ReactModule(name = NativeBridgefySpec.NAME)
35
+ class BridgefyReactNativeModule(
36
+ reactContext: ReactApplicationContext,
37
+ ) : NativeBridgefySpec(reactContext),
38
+ LifecycleEventListener {
39
+ private val context: ReactApplicationContext = reactContext
40
+ private val eventReceiver: BridgefyEventReceiver = BridgefyEventReceiver()
41
+ private var isReceiverRegistered = false
23
42
 
24
- private var bridgefy: Bridgefy
43
+ private val serviceManager: BridgefyServiceManager by lazy { BridgefyServiceManager.getInstance(reactContext) }
44
+ private val modeManager: BridgefyOperationModeManager by lazy { BridgefyOperationModeManager.getInstance(reactContext) }
25
45
 
26
46
  init {
27
- bridgefy = Bridgefy(reactContext)
47
+ reactContext.addLifecycleEventListener(this)
48
+ registerBroadcastReceiver()
49
+
50
+ // Set up mode change listener
51
+ modeManager.setModeChangeListener { mode ->
52
+ sendEvent(
53
+ "bridgefyModeChanged",
54
+ Arguments.createMap().apply {
55
+ putString("mode", mode.name.lowercase())
56
+ },
57
+ )
58
+ }
28
59
  }
29
60
 
30
- override fun getName(): String {
31
- return NAME
61
+ override fun getName(): String = NAME
62
+
63
+ companion object {
64
+ const val NAME = NativeBridgefySpec.NAME
32
65
  }
33
66
 
34
- @ReactMethod
35
- fun initialize(
36
- apiKey: String,
37
- verboseLogging: Boolean = false,
38
- promise: Promise
39
- ) {
40
- try {
41
- bridgefy.init(
42
- UUID.fromString(apiKey),
43
- object : BridgefyDelegate {
44
- override fun onConnected(peerID: UUID) {
45
- val params = Arguments.createMap().apply {
46
- putString("userId", peerID.toString())
47
- }
48
- sendEvent(reactApplicationContext, "bridgefyDidConnect", params)
49
- }
50
-
51
- override fun onConnectedPeers(connectedPeers: List<UUID>) {
52
- connectedPeers.forEach {
53
- onConnected(it)
54
- }
55
- }
56
-
57
- override fun onEstablishSecureConnection(userId: UUID) {
58
- val params = Arguments.createMap().apply {
59
- putString("userId", userId.toString())
60
- }
61
- sendEvent(
62
- reactApplicationContext,
63
- "bridgefyDidEstablishSecureConnection",
64
- params
65
- )
66
- }
67
-
68
- override fun onDisconnected(peerID: UUID) {
69
- val params = Arguments.createMap().apply {
70
- putString("userId", peerID.toString())
71
- }
72
- sendEvent(reactApplicationContext, "bridgefyDidDisconnect", params)
73
- }
74
-
75
- override fun onFailToSend(messageID: UUID, error: BridgefyException) {
76
- val params = Arguments.createMap().apply {
77
- putString("messageId", messageID.toString())
78
- putMap("error", mapFromBridgefyException(error))
79
- }
80
- sendEvent(reactApplicationContext, "bridgefyDidFailSendingMessage", params)
81
- }
82
-
83
- override fun onFailToStart(error: BridgefyException) {
84
- val params = Arguments.createMap().apply {
85
- putMap("error", mapFromBridgefyException(error))
86
- }
87
- sendEvent(reactApplicationContext, "bridgefyDidFailToStart", params)
88
- }
89
-
90
- override fun onFailToStop(error: BridgefyException) {
91
- val params = Arguments.createMap().apply {
92
- putMap("error", mapFromBridgefyException(error))
93
- }
94
- sendEvent(reactApplicationContext, "bridgefyDidFailToStop", params)
95
- }
96
-
97
- override fun onProgressOfSend(messageID: UUID, position: Int, of: Int) {
98
- val params = Arguments.createMap().apply {
99
- putString("messageId", messageID.toString())
67
+ // MARK: - Lifecycle
68
+
69
+ override fun onHostResume() {
70
+ if (!isReceiverRegistered) {
71
+ registerBroadcastReceiver()
72
+ }
73
+
74
+ // Refresh service state
75
+ serviceManager.refreshFromService()
76
+
77
+ // If HYBRID mode, switch to foreground
78
+ if (modeManager.getOperationMode() == OperationMode.HYBRID) {
79
+ modeManager.switchToForegroundMode()
80
+ }
81
+ }
82
+
83
+ override fun onHostPause() {
84
+ // If HYBRID mode, switch to background
85
+ if (modeManager.getOperationMode() == OperationMode.HYBRID) {
86
+ modeManager.switchToBackgroundMode()
87
+ }
88
+ }
89
+
90
+ override fun onHostDestroy() {
91
+ unregisterBroadcastReceiver()
92
+ }
93
+
94
+ // MARK: - BroadcastReceiver Setup
95
+
96
+ private inner class BridgefyEventReceiver : BroadcastReceiver() {
97
+ override fun onReceive(
98
+ context: Context?,
99
+ intent: Intent?,
100
+ ) {
101
+ intent ?: return
102
+ when (intent.action) {
103
+ BridgefyService.EVENT_BRIDGEFY_DID_START -> {
104
+ val userId = intent.getStringExtra(BridgefyService.EXTRA_USER_ID) ?: return
105
+
106
+ serviceManager.setCurrentUserId(userId)
107
+
108
+ sendEvent(
109
+ "bridgefyDidStart",
110
+ Arguments.createMap().apply {
111
+ putString("userId", userId)
112
+ },
113
+ )
114
+ }
115
+
116
+ BridgefyService.EVENT_BRIDGEFY_DID_STOP -> {
117
+ sendEvent("bridgefyDidStop", null)
118
+ }
119
+
120
+ BridgefyService.EVENT_BRIDGEFY_DID_CONNECT -> {
121
+ val userId = intent.getStringExtra(BridgefyService.EXTRA_USER_ID) ?: return
122
+ sendEvent(
123
+ "bridgefyDidConnect",
124
+ Arguments.createMap().apply {
125
+ putString("userId", userId)
126
+ },
127
+ )
128
+ }
129
+
130
+ BridgefyService.EVENT_BRIDGEFY_DID_DISCONNECT -> {
131
+ val userId = intent.getStringExtra(BridgefyService.EXTRA_USER_ID) ?: return
132
+ sendEvent(
133
+ "bridgefyDidDisconnect",
134
+ Arguments.createMap().apply {
135
+ putString("userId", userId)
136
+ },
137
+ )
138
+ }
139
+
140
+ BridgefyService.EVENT_BRIDGEFY_RECEIVE_DATA -> {
141
+ val data = intent.getByteArrayExtra(BridgefyService.EXTRA_MESSAGE_DATA) ?: return
142
+ val messageId = intent.getStringExtra(BridgefyService.EXTRA_MESSAGE_ID) ?: return
143
+ val transmissionMode =
144
+ intent.getBundleExtra(BridgefyService.EXTRA_TRANSMISSION_MODE) ?: Bundle()
145
+
146
+ sendEvent(
147
+ "bridgefyDidReceiveData",
148
+ Arguments.createMap().apply {
149
+ putString("data", String(data))
150
+ putString("messageId", messageId)
151
+ putMap(
152
+ "transmissionMode",
153
+ mapFromTransmissionMode(transmissionModeFromBundle(transmissionMode)),
154
+ )
155
+ },
156
+ )
157
+ }
158
+
159
+ BridgefyService.EVENT_BRIDGEFY_SEND_MESSAGE -> {
160
+ val messageId = intent.getStringExtra(BridgefyService.EXTRA_MESSAGE_ID) ?: return
161
+ sendEvent(
162
+ "bridgefyDidSendMessage",
163
+ Arguments.createMap().apply {
164
+ putString("messageId", messageId)
165
+ },
166
+ )
167
+ }
168
+
169
+ BridgefyService.EVENT_BRIDGEFY_FAIL_SENDING -> {
170
+ val messageId = intent.getStringExtra(BridgefyService.EXTRA_MESSAGE_ID) ?: return
171
+ val errorCode = intent.getStringExtra(BridgefyService.EXTRA_ERROR_CODE) ?: "UNKNOWN_ERROR"
172
+ val errorMessage =
173
+ intent.getStringExtra(BridgefyService.EXTRA_ERROR_MESSAGE) ?: "Unknown error"
174
+
175
+ sendEvent(
176
+ "bridgefyDidFailSendingMessage",
177
+ Arguments.createMap().apply {
178
+ putString("messageId", messageId)
179
+ putString("code", errorCode)
180
+ putString("message", errorMessage)
181
+ },
182
+ )
183
+ }
184
+
185
+ BridgefyService.EVENT_BRIDGEFY_FAIL_TO_START -> {
186
+ val errorCode = intent.getStringExtra(BridgefyService.EXTRA_ERROR_CODE) ?: "UNKNOWN_ERROR"
187
+ val errorMessage =
188
+ intent.getStringExtra(BridgefyService.EXTRA_ERROR_MESSAGE) ?: "Unknown error"
189
+
190
+ sendEvent(
191
+ "bridgefyDidFailToStart",
192
+ Arguments.createMap().apply {
193
+ putString("code", errorCode)
194
+ putString("message", errorMessage)
195
+ },
196
+ )
197
+ }
198
+
199
+ BridgefyService.EVENT_BRIDGEFY_ESTABLISH_SECURE -> {
200
+ val userId = intent.getStringExtra(BridgefyService.EXTRA_USER_ID) ?: return
201
+ sendEvent(
202
+ "bridgefyDidEstablishSecureConnection",
203
+ Arguments.createMap().apply {
204
+ putString("userId", userId)
205
+ },
206
+ )
207
+ }
208
+
209
+ BridgefyService.EVENT_BRIDGEFY_FAIL_SECURE -> {
210
+ val userId = intent.getStringExtra(BridgefyService.EXTRA_USER_ID) ?: return
211
+ val errorCode = intent.getStringExtra(BridgefyService.EXTRA_ERROR_CODE) ?: "UNKNOWN_ERROR"
212
+ val errorMessage =
213
+ intent.getStringExtra(BridgefyService.EXTRA_ERROR_MESSAGE) ?: "Unknown error"
214
+
215
+ sendEvent(
216
+ "bridgefyDidFailToEstablishSecureConnection",
217
+ Arguments.createMap().apply {
218
+ putString("userId", userId)
219
+ putString("code", errorCode)
220
+ putString("message", errorMessage)
221
+ },
222
+ )
223
+ }
224
+
225
+ BridgefyService.EVENT_BRIDGEFY_DID_DESTROY_SESSION -> {
226
+ sendEvent("bridgefyDidDestroySession", null)
227
+ }
228
+
229
+ BridgefyService.EVENT_BRIDGEFY_FAIL_TO_DESTROY_SESSION -> {
230
+ val errorCode = intent.getStringExtra(BridgefyService.EXTRA_ERROR_CODE) ?: "UNKNOWN_ERROR"
231
+ val errorMessage =
232
+ intent.getStringExtra(BridgefyService.EXTRA_ERROR_MESSAGE) ?: "Unknown error"
233
+
234
+ sendEvent(
235
+ "bridgefyDidFailToDestroySession",
236
+ Arguments.createMap().apply {
237
+ putString("code", errorCode)
238
+ putString("message", errorMessage)
239
+ },
240
+ )
241
+ }
242
+
243
+ BridgefyService.EVENT_BRIDGEFY_PROGRESS_OF_SEND -> {
244
+ val messageId = intent.getStringExtra(BridgefyService.EXTRA_MESSAGE_ID) ?: return
245
+ val position = intent.getIntExtra(BridgefyService.EXTRA_POSITION, 0)
246
+ val of = intent.getIntExtra(BridgefyService.EXTRA_OF, 0)
247
+ sendEvent(
248
+ "bridgefyDidProgressOfSend",
249
+ Arguments.createMap().apply {
250
+ putString("messageId", messageId)
100
251
  putInt("position", position)
101
252
  putInt("of", of)
102
- }
103
- sendEvent(reactApplicationContext, "bridgefyDidSendDataProgress", params)
104
- }
105
-
106
- override fun onReceiveData(
107
- data: ByteArray,
108
- messageID: UUID,
109
- transmissionMode: TransmissionMode
110
- ) {
111
- val params = Arguments.createMap().apply {
112
- putString("data", String(data))
113
- putString("messageId", messageID.toString())
114
- putMap("transmissionMode", mapFromTransmissionMode(transmissionMode))
115
- }
116
- sendEvent(reactApplicationContext, "bridgefyDidReceiveData", params)
117
- }
118
-
119
- override fun onSend(messageID: UUID) {
120
- val params = Arguments.createMap().apply {
121
- putString("messageId", messageID.toString())
122
- }
123
- sendEvent(reactApplicationContext, "bridgefyDidSendMessage", params)
124
- }
125
-
126
- override fun onStarted(userID: UUID) {
127
- val params = Arguments.createMap().apply {
128
- putString("userId", userID.toString())
129
- }
130
- sendEvent(reactApplicationContext, "bridgefyDidStart", params)
131
- }
132
-
133
- override fun onFailToEstablishSecureConnection(userId: UUID, error: BridgefyException) {
134
- val params = Arguments.createMap().apply {
135
- putString("userId", userId.toString())
136
- putMap("error", mapFromBridgefyException(error))
137
- }
138
- sendEvent(reactApplicationContext, "bridgefyDidFailToEstablishSecureConnection", params)
139
- }
140
-
141
- override fun onDestroySession() {
142
- sendEvent(reactApplicationContext, "bridgefyDidDestroySession", null)
143
- }
144
-
145
- override fun onFailToDestroySession(error: BridgefyException) {
146
- val params = Arguments.createMap().apply {
147
- putMap("error", mapFromBridgefyException(error))
148
- }
149
- sendEvent(reactApplicationContext, "bridgefyDidFailToDestroySession", params)
150
- }
151
-
152
- override fun onStopped() {
153
- sendEvent(reactApplicationContext, "bridgefyDidStop", null)
154
- }
155
- },
156
- if (verboseLogging) LogType.ConsoleLogger(Log.DEBUG) else LogType.None,
157
- )
253
+ },
254
+ )
255
+ }
256
+
257
+ BridgefyService.EVENT_BRIDGEFY_FAIL_TO_STOP -> {
258
+ val errorCode = intent.getStringExtra(BridgefyService.EXTRA_ERROR_CODE) ?: "UNKNOWN_ERROR"
259
+ val errorMessage =
260
+ intent.getStringExtra(BridgefyService.EXTRA_ERROR_MESSAGE) ?: "Unknown error"
261
+ sendEvent(
262
+ "bridgefyDidFailToStop",
263
+ Arguments.createMap().apply {
264
+ putString("code", errorCode)
265
+ putString("message", errorMessage)
266
+ },
267
+ )
268
+ }
269
+
270
+ BridgefyService.EVENT_BRIDGEFY_DID_UPDATE_CONNECTED_PEERS -> {
271
+ val peers: List<String> =
272
+ intent.getStringArrayExtra(BridgefyService.EXTRA_CONNECTED_PEERS)?.toList() ?: return
273
+ sendEvent(
274
+ "bridgefyDidUpdateConnectedPeers",
275
+ Arguments.createMap().apply {
276
+ putArray("peers", Arguments.createArray().apply { peers })
277
+ },
278
+ )
279
+ }
280
+ }
281
+ }
282
+ }
283
+
284
+ private fun registerBroadcastReceiver() {
285
+ if (isReceiverRegistered) return
286
+
287
+ val filter =
288
+ IntentFilter().apply {
289
+ addAction(BridgefyService.EVENT_BRIDGEFY_DID_START)
290
+ addAction(BridgefyService.EVENT_BRIDGEFY_DID_STOP)
291
+ addAction(BridgefyService.EVENT_BRIDGEFY_DID_CONNECT)
292
+ addAction(BridgefyService.EVENT_BRIDGEFY_DID_DISCONNECT)
293
+ addAction(BridgefyService.EVENT_BRIDGEFY_DID_UPDATE_CONNECTED_PEERS)
294
+ addAction(BridgefyService.EVENT_BRIDGEFY_RECEIVE_DATA)
295
+ addAction(BridgefyService.EVENT_BRIDGEFY_SEND_MESSAGE)
296
+ addAction(BridgefyService.EVENT_BRIDGEFY_FAIL_SENDING)
297
+ addAction(BridgefyService.EVENT_BRIDGEFY_FAIL_TO_START)
298
+ addAction(BridgefyService.EVENT_BRIDGEFY_ESTABLISH_SECURE)
299
+ addAction(BridgefyService.EVENT_BRIDGEFY_FAIL_SECURE)
300
+
301
+ addAction(BridgefyService.EVENT_BRIDGEFY_DID_DESTROY_SESSION)
302
+ addAction(BridgefyService.EVENT_BRIDGEFY_FAIL_TO_DESTROY_SESSION)
303
+ addAction(BridgefyService.EVENT_BRIDGEFY_PROGRESS_OF_SEND)
304
+ addAction(BridgefyService.EVENT_BRIDGEFY_FAIL_TO_STOP)
305
+ }
306
+
307
+ ContextCompat.registerReceiver(
308
+ context,
309
+ eventReceiver,
310
+ filter,
311
+ ContextCompat.RECEIVER_EXPORTED,
312
+ )
313
+ isReceiverRegistered = true
314
+ }
315
+
316
+ private fun unregisterBroadcastReceiver() {
317
+ if (isReceiverRegistered) {
318
+ try {
319
+ context.unregisterReceiver(eventReceiver)
320
+ isReceiverRegistered = false
321
+ } catch (e: Exception) {
322
+ println("Error unregistering receiver ${e.localizedMessage}")
323
+ }
324
+ }
325
+ }
326
+
327
+ private fun sendEvent(
328
+ eventName: String,
329
+ params: WritableMap?,
330
+ ) {
331
+ context
332
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
333
+ .emit(eventName, params)
334
+ }
335
+
336
+ // MARK: - Service Control Methods
337
+
338
+ // FIX 2: Use startForegroundService() on Android 8+
339
+ private fun startService() {
340
+ val serviceIntent =
341
+ Intent(context, BridgefyService::class.java).apply {
342
+ action = BridgefyService.ACTION_START_SERVICE
343
+ }
344
+
345
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
346
+ context.startForegroundService(serviceIntent)
347
+ } else {
348
+ context.startService(serviceIntent)
349
+ }
350
+ }
351
+
352
+ private fun stopService() {
353
+ val serviceIntent =
354
+ Intent(context, BridgefyService::class.java).apply {
355
+ action = BridgefyService.ACTION_STOP_SERVICE
356
+ }
357
+ context.startService(serviceIntent)
358
+ }
359
+
360
+ // MARK: - NativeBridgefySpec Implementation
361
+ override fun initialize(
362
+ config: ReadableMap,
363
+ promise: Promise,
364
+ ) {
365
+ try {
366
+ val apiKey =
367
+ config.getString("apiKey")
368
+ ?: throw Exception("API key is required")
369
+
370
+ val verboseLogging = config.getBoolean("verboseLogging")
371
+ val operationModeStr = config.getString("operationMode") ?: "hybrid"
372
+
373
+ // Set operation mode
374
+ val mode =
375
+ when (operationModeStr.lowercase()) {
376
+ "foreground" -> OperationMode.FOREGROUND
377
+ "background" -> OperationMode.BACKGROUND
378
+ else -> OperationMode.HYBRID
379
+ }
380
+ modeManager.setOperationMode(mode)
381
+
382
+ // Start service if needed
383
+ // if (modeManager.shouldRunInService()) {
384
+ startService()
385
+ // }
386
+
387
+ val initIntent =
388
+ Intent(context, BridgefyService::class.java).apply {
389
+ action = BridgefyService.ACTION_INITIALIZE
390
+ putExtra(BridgefyService.EXTRA_API_KEY, apiKey)
391
+ putExtra(BridgefyService.EXTRA_VERBOSE_LOGGING, verboseLogging)
392
+ }
393
+ context.startService(initIntent)
394
+
158
395
  promise.resolve(null)
159
- } catch (error: BridgefyException) {
160
- val map = mapFromBridgefyException(error)
161
- promise.reject(map.getString("code"), map.getString("message"), error)
162
396
  } catch (e: Exception) {
163
- promise.reject("sessionError", "${e.message ?: e.localizedMessage}", e)
397
+ println("initialize() failed: ${e.localizedMessage}")
398
+ promise.reject("INITIALIZATION_FAILED", e.message, e)
164
399
  }
165
400
  }
166
401
 
167
- @ReactMethod
168
- fun start(
169
- customUserID: String?,
170
- propagationProfile: String,
171
- promise: Promise
402
+ override fun start(
403
+ userId: String?,
404
+ propagationProfile: String?,
405
+ promise: Promise,
172
406
  ) {
173
407
  try {
174
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
175
- val profile = propagationProfileFromString(propagationProfile)
176
- bridgefy.start(
177
- customUserID?.let { UUID.fromString(it) },
178
- profile ?: PropagationProfile.Standard
179
- )
408
+ val startIntent =
409
+ Intent(context, BridgefyService::class.java).apply {
410
+ action = BridgefyService.ACTION_START_SDK
411
+ putExtra(BridgefyService.EXTRA_USER_ID, userId)
412
+ putExtra(BridgefyService.EXTRA_PROPAGATION_PROFILE, propagationProfile ?: "realTime")
413
+ }
414
+ context.startService(startIntent)
415
+
180
416
  promise.resolve(null)
181
417
  } catch (e: Exception) {
182
- promise.reject("sessionError", "${e.message ?: e.localizedMessage}", e)
418
+ println("start() failed: ${e.localizedMessage}")
419
+ promise.reject("START_FAILED", e.message, e)
183
420
  }
184
421
  }
185
422
 
186
- @ReactMethod
187
- fun send(data: String, transmissionMode: ReadableMap, promise: Promise) {
423
+ override fun stop(promise: Promise) {
188
424
  try {
189
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
190
- assert(bridgefy.isStarted) { "Bridgefy SDK isn't started" }
191
- val mode = transmissionModeFromMap(transmissionMode)!!
192
- val uuid = bridgefy.send(data.toByteArray(), mode)
193
- promise.resolve(
194
- Arguments.createMap().apply {
195
- putString("messageId", uuid.toString())
425
+ val stopIntent =
426
+ Intent(context, BridgefyService::class.java).apply {
427
+ action = BridgefyService.ACTION_STOP_SDK
196
428
  }
197
- )
198
- } catch (error: BridgefyException) {
199
- val map = mapFromBridgefyException(error)
200
- promise.reject(map.getString("code"), map.getString("message"), error)
429
+ context.startService(stopIntent)
430
+
431
+ promise.resolve(null)
201
432
  } catch (e: Exception) {
202
- promise.reject("sessionError", "${e.message ?: e.localizedMessage}", e)
433
+ println("stop() failed: ${e.localizedMessage}")
434
+ promise.reject("STOP_FAILED", e.message, e)
203
435
  }
204
436
  }
205
437
 
206
- @ReactMethod
207
- fun stop(promise: Promise) {
208
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
209
- assert(bridgefy.isStarted) { "Bridgefy SDK isn't started" }
210
- bridgefy.stop()
211
- promise.resolve(null)
438
+ override fun destroySession(promise: Promise) {
439
+ try {
440
+ stopService()
441
+ serviceManager.getBridgefy()?.destroySession()
442
+ serviceManager.refreshBridgefy()
443
+ serviceManager.clearState()
444
+ promise.resolve(null)
445
+ } catch (e: Exception) {
446
+ println("destroySession() failed: ${e.localizedMessage}")
447
+ promise.reject("DESTROY_FAILED", e.message, e)
448
+ }
212
449
  }
213
450
 
214
- @ReactMethod
215
- fun connectedPeers(promise: Promise) {
216
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
217
- assert(bridgefy.isStarted) { "Bridgefy SDK isn't started" }
218
- val peers = bridgefy.connectedPeers().getOrNull()
219
- val nodes = Arguments.createArray().apply {
220
- peers?.forEach { pushString(it.toString()) }
451
+ // MARK: - Operation Mode Methods
452
+
453
+ override fun setOperationMode(
454
+ config: ReadableMap?,
455
+ promise: Promise,
456
+ ) {
457
+ try {
458
+ val mode = config?.getString("mode") ?: ""
459
+
460
+ val opMode =
461
+ when (mode.lowercase()) {
462
+ "foreground" -> OperationMode.FOREGROUND
463
+ "background" -> OperationMode.BACKGROUND
464
+ else -> OperationMode.HYBRID
465
+ }
466
+
467
+ val success = modeManager.setOperationMode(opMode)
468
+
469
+ if (success) {
470
+ promise.resolve(Arguments.createMap().apply { putString("mode", mode.lowercase()) })
471
+ } else {
472
+ promise.reject("MODE_CHANGE_FAILED", "Could not change operation mode")
473
+ }
474
+ } catch (e: Exception) {
475
+ println("setOperationMode() failed: ${e.localizedMessage}")
476
+ promise.reject("ERROR", e.message, e)
221
477
  }
222
- promise.resolve(Arguments.createMap().apply { putArray("connectedPeers", nodes) })
223
478
  }
224
479
 
225
- @ReactMethod
226
- fun destroySession(promise: Promise) {
227
- bridgefy.destroySession()
228
- promise.resolve(null)
480
+ override fun getOperationMode(promise: Promise) {
481
+ try {
482
+ val mode = modeManager.getOperationMode().name.lowercase()
483
+ promise.resolve(Arguments.createMap().apply { putString("mode", mode) })
484
+ } catch (e: Exception) {
485
+ println("getOperationMode() failed: ${e.localizedMessage}")
486
+ promise.reject("ERROR", e.message, e)
487
+ }
229
488
  }
230
489
 
231
- @ReactMethod
232
- fun updateLicense(promise: Promise) {
233
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
234
- bridgefy.updateLicense()
235
- promise.resolve(null)
236
- }
490
+ override fun switchToBackground(promise: Promise) {
491
+ try {
492
+ if (modeManager.getOperationMode() != OperationMode.HYBRID) {
493
+ promise.reject("NOT_HYBRID_MODE", "Only available in HYBRID mode")
494
+ return
495
+ }
237
496
 
238
- @ReactMethod
239
- fun currentUserId(promise: Promise) {
240
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
241
- assert(bridgefy.isStarted) { "Bridgefy SDK isn't started" }
242
- val userId = bridgefy.currentUserId().getOrThrow()
243
- promise.resolve(
244
- Arguments.createMap().apply {
245
- putString("userId", userId.toString())
497
+ val success = modeManager.switchToBackgroundMode()
498
+ if (success) {
499
+ promise.resolve(null)
500
+ } else {
501
+ promise.reject("SWITCH_FAILED", "Could not switch to background")
246
502
  }
247
- )
503
+ } catch (e: Exception) {
504
+ println("switchToBackground() failed: ${e.localizedMessage}")
505
+ promise.reject("ERROR", e.message, e)
506
+ }
248
507
  }
249
508
 
250
- @ReactMethod
251
- fun establishSecureConnection(userId: String, promise: Promise) {
252
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
253
- assert(bridgefy.isStarted) { "Bridgefy SDK isn't started" }
254
- val uuid = UUID.fromString(userId)
255
- bridgefy.establishSecureConnection(uuid)
256
- promise.resolve(null)
257
- }
509
+ override fun switchToForeground(promise: Promise) {
510
+ try {
511
+ if (modeManager.getOperationMode() != OperationMode.HYBRID) {
512
+ promise.reject("NOT_HYBRID_MODE", "Only available in HYBRID mode")
513
+ return
514
+ }
258
515
 
259
- @ReactMethod
260
- fun licenseExpirationDate(promise: Promise) {
261
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
262
- val date = bridgefy.licenseExpirationDate().getOrThrow()
263
- promise.resolve(
264
- Arguments.createMap().apply {
265
- putString("licenseExpirationDate", date?.time.toString())
516
+ val success = modeManager.switchToForegroundMode()
517
+ if (success) {
518
+ promise.resolve(null)
519
+ } else {
520
+ promise.reject("SWITCH_FAILED", "Could not switch to foreground")
266
521
  }
267
- )
522
+ } catch (e: Exception) {
523
+ println("switchToForeground() failed: ${e.localizedMessage}")
524
+ promise.reject("ERROR", e.message, e)
525
+ }
268
526
  }
269
527
 
270
- @ReactMethod
271
- fun isInitialized(promise: Promise) {
528
+ override fun getOperationStatus(promise: Promise) {
272
529
  try {
273
- val isInitialized = bridgefy.isInitialized
274
- promise.resolve(isInitialized)
530
+ val mode = modeManager.getOperationMode().name.lowercase()
531
+ val isInit = serviceManager.getBridgefy()?.isInitialized ?: false
532
+ val isStart = serviceManager.getBridgefy()?.isStarted ?: false
533
+
534
+ promise.resolve(
535
+ Arguments.createMap().apply {
536
+ putString("operationMode", mode)
537
+ putBoolean("isInitialized", isInit)
538
+ putBoolean("isStarted", isStart)
539
+ putBoolean("shouldRunInService", (modeManager.shouldRunInService()))
540
+ putString("debugInfo", modeManager.getDebugInfo())
541
+ },
542
+ )
275
543
  } catch (e: Exception) {
276
- e.printStackTrace()
277
- promise.resolve(false)
544
+ println("getOperationStatus() failed: ${e.localizedMessage}")
545
+ promise.reject("ERROR", e.message, e)
278
546
  }
279
547
  }
280
548
 
281
- @ReactMethod
282
- fun isStarted(promise: Promise) {
283
- assert(bridgefy.isInitialized) { "Bridgefy SDK isn't initialized" }
284
- val isStarted = bridgefy.isStarted
285
- promise.resolve(isStarted)
286
- }
549
+ override fun send(
550
+ data: String,
551
+ transmissionMode: ReadableMap,
552
+ promise: Promise,
553
+ ) {
554
+ try {
555
+ val type =
556
+ transmissionMode.getString("type")
557
+ ?: throw Exception("Transmission mode type is required")
558
+
559
+ val recipientId = transmissionMode.getString("uuid")
560
+
561
+ val mode =
562
+ when (type) {
563
+ "broadcast" -> TransmissionMode.Broadcast(UUID.randomUUID())
564
+ "p2p" -> TransmissionMode.P2P(UUID.fromString(recipientId))
565
+ "mesh" -> TransmissionMode.Mesh(UUID.fromString(recipientId))
566
+ else -> error("INVALID_MESSAGE" to "Invalid mode")
567
+ }
287
568
 
288
- companion object {
289
- const val NAME = "BridgefyReactNative"
569
+ val sendIntent =
570
+ Intent(context, BridgefyService::class.java).apply {
571
+ action = BridgefyService.ACTION_SEND_MESSAGE
572
+ putExtra(BridgefyService.EXTRA_MESSAGE_DATA, data.toByteArray())
573
+ putExtra(BridgefyService.EXTRA_TRANSMISSION_MODE, bundleFromTransmissionMode(mode))
574
+ putExtra(BridgefyService.EXTRA_RECIPIENT_ID, recipientId)
575
+ }
576
+ context.startService(sendIntent)
577
+
578
+ // Message ID will be returned via broadcast event
579
+ promise.resolve("pending")
580
+ } catch (e: Exception) {
581
+ promise.reject("SEND_FAILED", e.message, e)
582
+ }
290
583
  }
291
584
 
292
- private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap?) {
293
- reactContext
294
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
295
- .emit(eventName, params)
585
+ override fun establishSecureConnection(
586
+ userId: String,
587
+ promise: Promise,
588
+ ) {
589
+ try {
590
+ val secureIntent =
591
+ Intent(context, BridgefyService::class.java).apply {
592
+ action = BridgefyService.ACTION_ESTABLISH_SECURE
593
+ putExtra(BridgefyService.EXTRA_USER_ID, userId)
594
+ }
595
+ context.startService(secureIntent)
596
+ promise.resolve(null)
597
+ } catch (e: Exception) {
598
+ promise.reject("CONNECTION_FAILED", e.message, e)
599
+ }
296
600
  }
297
601
 
298
- private fun mapFromBridgefyException(exception: BridgefyException): ReadableMap {
299
- var code: String
300
- var details: Int? = null
301
- var message: String? = null
302
- when (exception) {
303
- is BridgefyException.AlreadyStartedException -> {
304
- code = "alreadyStarted"
305
- }
306
- is BridgefyException.DeviceCapabilitiesException -> {
307
- code = "deviceCapabilities"
308
- message = exception.error
309
- }
310
- is BridgefyException.ExpiredLicenseException -> {
311
- code = "expiredLicense"
312
- message = exception.error
313
- }
314
- is BridgefyException.GenericException -> {
315
- code = "genericException"
316
- message = exception.message
317
- details = exception.code
318
- }
319
- is BridgefyException.InconsistentDeviceTimeException -> {
320
- code = "inconsistentDeviceTimeException"
321
- message = exception.error
322
- }
323
- is BridgefyException.InternetConnectionRequiredException -> {
324
- code = "internetConnectionRequiredException"
325
- message = exception.error
326
- }
327
- is BridgefyException.InvalidAPIKeyFormatException -> {
328
- code = "invalidAPIKey"
329
- message = exception.error
330
- }
331
- is BridgefyException.MissingApplicationIdException -> {
332
- code = "missingApplicationId"
333
- message = exception.error
334
- }
335
- is BridgefyException.PermissionException -> {
336
- code = "permissionException"
337
- message = exception.error
338
- }
339
- is BridgefyException.RegistrationException -> {
340
- code = "registrationException"
341
- message = exception.error
342
- }
343
- is BridgefyException.SessionErrorException -> {
344
- code = "sessionError"
345
- message = exception.error
346
- }
347
- is BridgefyException.SimulatorIsNotSupportedException -> {
348
- code = "simulatorIsNotSupported"
349
- message = exception.error.toString()
350
- }
351
- is BridgefyException.SizeLimitExceededException -> {
352
- code = "sizeLimitExceeded"
353
- message = exception.error
354
- }
355
- is BridgefyException.UnknownException -> {
356
- code = "unknownException"
357
- message = exception.error.toString()
358
- } else -> {
359
- code = "unknownException"
360
- message = exception.toString()
602
+ override fun currentUserId(promise: Promise) {
603
+ try {
604
+ val userId = serviceManager.getCurrentUserId()
605
+ if (userId != null) {
606
+ promise.resolve(userId)
607
+ } else {
608
+ promise.reject("NOT_AVAILABLE", "User ID not initialized")
361
609
  }
362
- }
363
- return Arguments.createMap().apply {
364
- putString("code", code)
365
- putString("message", message)
366
- if (details != null) putInt("details", details) else putNull("details")
610
+ } catch (e: Exception) {
611
+ promise.reject("ERROR", e.message, e)
367
612
  }
368
613
  }
369
614
 
370
- private fun propagationProfileFromString(str: String): PropagationProfile? {
371
- return when (str) {
372
- "highDensityNetwork" -> PropagationProfile.HighDensityEnvironment
373
- "sparseNetwork" -> PropagationProfile.SparseEnvironment
374
- "longReach" -> PropagationProfile.LongReach
375
- "shortReach" -> PropagationProfile.ShortReach
376
- "standard" -> PropagationProfile.Standard
377
- else -> null
615
+ override fun connectedPeers(promise: Promise) {
616
+ try {
617
+ val peers =
618
+ serviceManager
619
+ .getBridgefy()
620
+ ?.connectedPeers()
621
+ ?.getOrNull()
622
+ ?.map { it.toString() }
623
+ ?.distinct()
624
+ val array = Arguments.createArray()
625
+ peers?.forEach { array.pushString(it) }
626
+ promise.resolve(array)
627
+ } catch (e: Exception) {
628
+ promise.reject("ERROR", e.message, e)
378
629
  }
379
630
  }
380
631
 
381
- private fun mapFromTransmissionMode(mode: TransmissionMode): ReadableMap {
382
- return when (mode) {
383
- is TransmissionMode.Broadcast -> Arguments.createMap().apply {
384
- putString("mode", "broadcast")
385
- putString("uuid", mode.sender.toString())
386
- }
387
- is TransmissionMode.Mesh -> Arguments.createMap().apply {
388
- putString("mode", "mesh")
389
- putString("uuid", mode.receiver.toString())
390
- }
391
- is TransmissionMode.P2P -> Arguments.createMap().apply {
392
- putString("mode", "p2p")
393
- putString("uuid", mode.receiver.toString())
394
- }
395
- else -> Arguments.createMap()
632
+ override fun licenseExpirationDate(promise: Promise) {
633
+ promise.reject("NOT_IMPLEMENTED", "Use service binding")
634
+ }
635
+
636
+ override fun updateLicense(promise: Promise) {
637
+ promise.reject("NOT_IMPLEMENTED", "Not supported")
638
+ }
639
+
640
+ override fun isInitialized(promise: Promise) {
641
+ try {
642
+ val initialized = serviceManager.getBridgefy()?.isInitialized ?: false
643
+ promise.resolve(initialized)
644
+ } catch (e: Exception) {
645
+ promise.resolve(false)
396
646
  }
397
647
  }
398
648
 
399
- private fun transmissionModeFromMap(map: ReadableMap): TransmissionMode? {
400
- val uuid = UUID.fromString(map.getString("uuid"))
401
- return when (map.getString("type")) {
402
- "p2p" -> TransmissionMode.P2P(uuid)
403
- "mesh" -> TransmissionMode.Mesh(uuid)
404
- "broadcast" -> TransmissionMode.Broadcast(uuid)
405
- else -> null
649
+ override fun isStarted(promise: Promise) {
650
+ try {
651
+ val started = serviceManager.getBridgefy()?.isStarted ?: false
652
+ promise.resolve(started)
653
+ } catch (e: Exception) {
654
+ promise.resolve(false)
406
655
  }
407
656
  }
657
+
658
+ override fun addListener(eventName: String?) {
659
+ // Required for event emitter
660
+ }
661
+
662
+ override fun removeListeners(count: Double) {
663
+ // Required for event emitter
664
+ }
408
665
  }