FrameReassembler.kt

package io.github.tritbool.euc.ble.frames

import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.receiveAsFlow

/**
 * Reassembles incoming byte streams into complete frames using a [FrameParser].
 *
 * This class provides a thread-safe way to process incoming BLE data and emit
 * complete frames through a Flow interface.
 *
 * @param parser The frame parser to use for extracting complete frames from byte streams
 */
class FrameReassembler(
    private val parser: FrameParser
) {
    private val lock = Any()

    private val _frames = Channel<ByteArray>(capacity = Channel.UNLIMITED)
    val frames: Flow<ByteArray> get() = _frames.receiveAsFlow()
    fun observeFrames(): Flow<ByteArray> = frames

    fun reset() {
        synchronized(lock) { parser.reset() }
    }

    fun processIncomingBytes(data: ByteArray) {
        val ready: List<ByteArray>
        synchronized(lock) {
            ready = parser.appendAndExtract(data)
        }
        for (frame in ready) {
            _frames.trySend(frame)
        }
    }
}