Skip to content

Monkopedia/ksrpc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

477 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kotlin Simple RPCs

GitHub license Kotlin Maven Central KDoc link

Define a service interface once in Kotlin common, then call it over HTTP, sockets, stdin/out, websockets, or in-process, without changing your service code. Built for Kotlin Multiplatform, curl-testable by default, and LSP-protocol-compatible out of the box.

Quick Start

@KsService
interface GreetingService : RpcService {
    @KsMethod("/greet")
    suspend fun greet(name: String): String
}

// Implement once
class GreetingServiceImpl : GreetingService {
    override suspend fun greet(name: String) = "Hello, $name!"
}

// Host over HTTP
val env = ksrpcEnvironment { }
embeddedServer(Netty, 8080) {
    routing { serveHttp("/api", GreetingServiceImpl(), env) }
}.start()

// Call from any platform
val service = HttpClient { }.asHttpChannelClient("http://localhost:8080/api", env)
    .defaultChannel().toStub<GreetingService>()
println(service.greet("world")) // "Hello, world!"

Build Setup

plugins {
    id("com.monkopedia.ksrpc.plugin") version "0.11.1"
}

dependencies {
    implementation("com.monkopedia.ksrpc:ksrpc-core:0.11.1")
    // Add transport modules as needed:
    // implementation("com.monkopedia.ksrpc:ksrpc-ktor-server:0.11.1")
    // implementation("com.monkopedia.ksrpc:ksrpc-ktor-client:0.11.1")
}

Supported Transports

Transport Platforms Module
HTTP JVM, Native, JS/WASM (client) ksrpc-ktor-client, ksrpc-ktor-server
WebSockets JVM, Native, JS/WASM (client) ksrpc-ktor-websocket-client, ksrpc-ktor-websocket-server
Sockets JVM, POSIX Native ksrpc-sockets
Stdin/out JVM, POSIX Native ksrpc-sockets
JSON-RPC 2.0 JVM, POSIX Native ksrpc-jsonrpc
Service Workers JS (experimental) ksrpc-service-worker

Features

  • Service declaration -- Define services with @KsService and @KsMethod; the compiler plugin generates stubs and companions automatically. Guide
  • Sub-services -- Pass services as method parameters or return values for contextual callbacks and hierarchical APIs. Guide
  • Bidirectional communication -- Connection supports hosting and calling services simultaneously over the same channel. Guide
  • Binary data -- Stream binary payloads via RpcBinaryData with adapters for ktor, kotlinx-io, and okio.
  • Typed errors -- Map exceptions to wire-format error codes with @KsError and KsrpcException. Guide
  • Context propagation -- Propagate per-call context (auth tokens, trace IDs) across transports with @KsContext. Guide
  • Introspection -- Opt in with @KsIntrospectable to expose endpoint metadata and schemas at runtime. Guide
  • Flow streaming -- Use Flow<T> in method signatures for streaming results over any transport, backed by KsFlowService. Guide
  • JSON-RPC 2.0 notifications -- Mark methods with @KsNotification for fire-and-forget semantics.

Why not gRPC?

ksrpc exists because gRPC and protobuf didn't quite fit. I wanted JSON on the wire so I could curl at services for testing, stdin/out support like LSP, and first-class Kotlin Multiplatform coverage. ksrpc fills that niche: simple service declarations, multiple transports, and broad platform support.

Documentation

Full API reference and guides are hosted at monkopedia.github.io/ksrpc.

License

Copyright 2026 Jason Monk

Licensed under the Apache License, Version 2.0

About

ksrpc is a simple library that allows for json-like RPCs with a simple service declaration in kotlin common.

Topics

Resources

License

Apache-2.0, Unknown licenses found

Licenses found

Apache-2.0
LICENSE
Unknown
license-header.txt

Stars

Watchers

Forks

Contributors

Languages