``` private fun ProducerScope<ApiMessage>.de...
# kotlin-fuel
n
Copy code
private fun ProducerScope<ApiMessage>.deserializer() = object: ResponseDeserializable<Job> {
        override fun deserialize(inputStream: InputStream) : Job {
            return launch(<http://Dispatchers.IO|Dispatchers.IO>) {
                inputStream.use { input ->
                    <http://logger.info|logger.info>("connection opened")
                    val buffer = StringBuilder()
                    while (isActive) {
                        val buf = ByteArray(1024)
                        Thread.sleep(10)
                        while (input.available() <= 0) {
                            if (isClosedForSend) break
                            Thread.sleep(10)
                        }
                        val chars = input.read(buf)

                        StreamConnection.logger.trace(String.format("read %d chars", chars))
                        if (chars > 0) {
                            val added = String(Arrays.copyOfRange(buf, 0, chars))
                            logger.debug("json: $added")
                            buffer.append(added)
                            while (buffer.toString().contains("\n")) {
                                val index = buffer.indexOf("\n")
                                val line = buffer.substring(0, index)
                                buffer.delete(0, index + 1)
                                val msg = ApiMessage.decode(line)
                                send(msg)
                            }
                        } else if (chars < 0) {
                            break
                        }
                    }
                }
            }
        }
    }