All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.amplitude.eventbridge.EventBridge.kt Maven / Gradle / Ivy

The newest version!
package com.amplitude.eventbridge

import java.util.concurrent.ArrayBlockingQueue

data class Event(
    val eventType: String,
    val eventProperties: Map? = null,
    val userProperties: Map? = null,
    val groups: Map? = null,
    var groupProperties: Map? = null
)

enum class EventChannel {
    EVENT, IDENTIFY
}

interface EventReceiver {
    fun receive(channel: EventChannel, event: Event)
}

/**
 * Bridges to transfer data between modules, like analytics and experiment
 */
interface EventBridge {
    fun sendEvent(channel: EventChannel, event: Event)
    fun setEventReceiver(channel: EventChannel, receiver: EventReceiver)
}

internal class EventBridgeImpl : EventBridge {
    private val lock = Any()
    private val channels = mutableMapOf()

    override fun sendEvent(channel: EventChannel, event: Event) {
        synchronized(lock) {
            channels.getOrPut(channel) {
                EventBridgeChannel(channel)
            }
        }.sendEvent(event)
    }

    override fun setEventReceiver(channel: EventChannel, receiver: EventReceiver) {
        synchronized(lock) {
            channels.getOrPut(channel) {
                EventBridgeChannel(channel)
            }
        }.setEventReceiver(receiver)
    }
}

internal class EventBridgeChannel(private val channel: EventChannel) {
    companion object {
        const val QUEUE_CAPACITY = 512
    }

    private val lock = Any()
    private var receiver: EventReceiver? = null
    private val queue = ArrayBlockingQueue(QUEUE_CAPACITY)

    fun sendEvent(event: Event) {
        synchronized(lock) {
            if (this.receiver == null) {
                queue.offer(event)
            }
            this.receiver
        }?.receive(channel, event)
    }

    fun setEventReceiver(receiver: EventReceiver?) {
        synchronized(lock) {
            if (this.receiver != null) {
                // Only allow one receiver per channel now
                return
            }
            this.receiver = receiver
            mutableListOf().apply {
                queue.drainTo(this)
            }
        }.forEach { event ->
            receiver?.receive(channel, event)
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy