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

org.jetbrains.kotlinx.jupyter.messaging.JupyterConnectionInternal.kt Maven / Gradle / Ivy

package org.jetbrains.kotlinx.jupyter.messaging

import org.jetbrains.kotlinx.jupyter.JupyterExecutor
import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterConnection
import org.jetbrains.kotlinx.jupyter.api.libraries.RawMessage
import org.jetbrains.kotlinx.jupyter.protocol.JupyterSocket
import org.jetbrains.kotlinx.jupyter.protocol.JupyterSocketManagerBase
import org.jetbrains.kotlinx.jupyter.startup.KernelConfig
import java.io.Closeable
import java.io.InputStream

interface MessageFactory {
    val messageId: List
    val sessionId: String
    val username: String
    val contextMessage: RawMessage?

    fun updateSessionInfo(message: RawMessage)
    fun updateContextMessage(contextMessage: RawMessage?)
}

interface JupyterSocketManager : JupyterSocketManagerBase, Closeable {
    val heartbeat: JupyterSocket
    val shell: JupyterSocket
    val control: JupyterSocket
    val stdin: JupyterSocket
    val iopub: JupyterSocket
}

interface JupyterConnectionInternal : JupyterConnection {
    val config: KernelConfig
    val socketManager: JupyterSocketManager
    val messageFactory: MessageFactory

    val executor: JupyterExecutor
    val stdinIn: InputStream
}

fun MessageFactory.makeDefaultHeader(msgType: MessageType): MessageHeader {
    return makeHeader(msgType, sessionId = sessionId, username = username)
}

fun MessageFactory.makeSimpleMessage(msgType: MessageType, content: MessageContent): Message {
    return Message(
        id = messageId,
        data = MessageData(
            header = makeDefaultHeader(msgType),
            content = content,
        ),
    )
}

fun MessageFactory.makeReplyMessage(msgType: MessageType, content: MessageContent): Message {
    return makeReplyMessage(contextMessage!!, msgType, content = content)
}

fun JupyterSocket.sendMessage(msg: Message) {
    sendRawMessage(msg.toRawMessage())
}

fun JupyterConnectionInternal.sendOut(msg: RawMessage, stream: JupyterOutType, text: String) {
    socketManager.iopub.sendMessage(makeReplyMessage(msg, header = makeHeader(MessageType.STREAM, msg), content = StreamResponse(stream.optionName(), text)))
}

fun JupyterConnectionInternal.sendSimpleMessageToIoPub(msgType: MessageType, content: MessageContent) {
    socketManager.iopub.sendMessage(messageFactory.makeSimpleMessage(msgType, content))
}

fun JupyterConnectionInternal.sendStatus(status: KernelStatus, incomingMessage: RawMessage?) {
    val message = if (incomingMessage != null) makeReplyMessage(
        incomingMessage,
        MessageType.STATUS,
        content = StatusReply(status),
    )
    else messageFactory.makeSimpleMessage(MessageType.STATUS, content = StatusReply(status))
    socketManager.iopub.sendMessage(message)
}

fun JupyterConnectionInternal.doWrappedInBusyIdle(incomingMessage: RawMessage?, action: () -> Unit) {
    sendStatus(KernelStatus.BUSY, incomingMessage)
    try {
        action()
    } finally {
        sendStatus(KernelStatus.IDLE, incomingMessage)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy