ktor-http-cio / io.ktor.http.cio.websocket / DefaultWebSocketSessionImpl

DefaultWebSocketSessionImpl

class DefaultWebSocketSessionImpl : DefaultWebSocketSession, WebSocketSession

Default web socket session implementation that handles ping-pongs, close sequence and frame fragmentation

Constructors

<init>

DefaultWebSocketSessionImpl(raw: WebSocketSession, pingInterval: Long = -1L, timeoutMillis: Long = 15000L, pool: ObjectPool<ByteBuffer> = KtorDefaultPool)

Default web socket session implementation that handles ping-pongs, close sequence and frame fragmentation

Properties

closeReason

val closeReason: Deferred<CloseReason?>

A close reason for this session. It could be null if a session is terminated with no close reason (for example due to connection failure).

incoming

val incoming: ReceiveChannel<Frame>

Incoming frames channel

outgoing

val outgoing: SendChannel<Frame>

Outgoing frames channel. It could have limited capacity so sending too much frames may lead to suspension at corresponding send invocations. It also may suspend if a peer doesn't read frames for some reason.

pingIntervalMillis

var pingIntervalMillis: Long

Ping interval or -1L to disable pinger. Please note that pongs will be handled despite of this setting.

timeoutMillis

var timeoutMillis: Long

A timeout to wait for pong reply to ping otherwise the session will be terminated immediately. It doesn't have any effect if pingIntervalMillis is -1 (pinger is disabled).

Functions

close

suspend fun close(cause: Throwable?): Unit

Close session with the specified cause or with no reason if null

goingAway

suspend fun goingAway(message: String = "Server is going down"): Unit

Close session with GOING_AWAY reason

Extension Functions

close

suspend fun WebSocketSession.close(reason: CloseReason): Unit

Send a close frame with the specified reason. May suspend if outgoing channel is full or may throw an exception if it is already closed. The specified reason could be ignored if there was already close frame sent (for example in reply to a peer close frame).

decodeChunked

fun CoroutineScope.decodeChunked(input: ByteReadChannel): DecoderJob

Start a chunked stream decoder coroutine

parseMultipart

fun CoroutineScope.parseMultipart(input: ByteReadChannel, headers: HttpHeadersMap): ReceiveChannel<MultipartEvent>
fun CoroutineScope.parseMultipart(input: ByteReadChannel, contentType: CharSequence, contentLength: Long?): ReceiveChannel<MultipartEvent>
fun CoroutineScope.parseMultipart(boundaryPrefixed: ByteBuffer, input: ByteReadChannel, totalLength: Long?): ReceiveChannel<MultipartEvent>

Starts a multipart parser coroutine producing multipart events

pinger

fun CoroutineScope.pinger(outgoing: SendChannel<Frame>, periodMillis: Long, timeoutMillis: Long, pool: ObjectPool<ByteBuffer> = KtorDefaultPool): SendChannel<Pong>

Launch pinger coroutine on CoroutineScope that is sending ping every specified periodMillis to outgoing channel, waiting for and verifying client's pong frames. It is also handling timeoutMillis and sending timeout close frame

ponger

fun CoroutineScope.ponger(outgoing: SendChannel<Pong>, pool: ObjectPool<ByteBuffer> = KtorDefaultPool): SendChannel<Ping>

Launch a ponger actor job on the CoroutineScope sending pongs to outgoing channel. It is acting for every client's ping frame and replying with corresponding pong

run

suspend fun DefaultWebSocketSession.run(handler: suspend DefaultWebSocketSession.() -> Unit): Unit

send

suspend fun WebSocketSession.send(content: String): Unit

Enqueues a text frame for sending with the specified content.

suspend fun WebSocketSession.send(content: ByteArray): Unit

Enqueues a final binary frame for sending with the specified content.

startConnectionPipeline

fun CoroutineScope.startConnectionPipeline(input: ByteReadChannel, output: ByteWriteChannel, timeout: WeakTimeoutQueue, handler: HttpRequestHandler): Job

Start connection HTTP pipeline invoking handler for every request. Note that handler could be invoked multiple times concurrently due to HTTP pipeline nature