package com.jedaireactnativepackage.react_bridge import androidx.lifecycle.Lifecycle import com.facebook.react.bridge.* import com.facebook.react.modules.core.DeviceEventManagerModule import com.jedaireactnativepackage.utils.toReadableMap internal object EventEmitter : LifecycleEventListener, AbstractEmitter() { private var streamIsReady = false private var reactBridgeEmitter: DeviceEventManagerModule.RCTDeviceEventEmitter? = null private var lifeCycleMode: Lifecycle.Event? = null fun init(){ streamIsReady = false lifeCycleMode = null reactBridgeEmitter = null } fun setStreamReady(streamReady: Boolean) { initializeEmitterIfRequired() streamIsReady = streamReady flushPendingEventIfRequired() } private fun flushPendingEventIfRequired(){ if (pendingEventsQueue.isNotEmpty()) { if (streamIsReady && lifeCycleMode == Lifecycle.Event.ON_RESUME) { sLogger.info("setStreamReady: pendingEventsQueue has ${pendingEventsQueue.size} events, flush queue") flushPendingEventsQueue() } else { sLogger.info("stream is not ready or app is not resumed.., streamIsReady: $streamIsReady, lifecycleMode: $lifeCycleMode") } } } override fun emit(key: String, params: Map?) { if (streamIsReady && lifeCycleMode == Lifecycle.Event.ON_RESUME && reactBridgeEmitter != null) { kotlin.runCatching { sLogger.info { "About to emit $key -> $params" } val readableMap = params?.toReadableMap() sLogger.info("emitEvent: streamIsReady: $readableMap") reactBridgeEmitter?.emit(key, readableMap) // down to the javascript world.. }.onFailure{ error -> sLogger.error { "Something went wrong when trying to emit message through react bridge: ${error.message}" } } } else { sLogger.info("emitEvent: emitter not ready, enqueue event to pendingEventsQueue: $params, streamIsReady: $streamIsReady, lifecycleMode: $lifeCycleMode") enqueuePendingEvent((key to params)) } } private fun initializeEmitterIfRequired() { if(reactBridgeEmitter == null){ this.reactBridgeEmitter = reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) } } override fun onHostResume() { lifeCycleMode = Lifecycle.Event.ON_RESUME sLogger.info { "onHostResume: " } flushPendingEventIfRequired() } override fun onHostPause() { sLogger.info { "onHostPause: " } lifeCycleMode = Lifecycle.Event.ON_PAUSE } override fun onHostDestroy() { sLogger.info { "onHostDestroy: " } lifeCycleMode = Lifecycle.Event.ON_DESTROY streamIsReady = false } }