Ktor server core module for iOS ARM64 target providing essential server-side functionality for building asynchronous web applications and microservices in Kotlin Multiplatform
—
Application engine abstraction and embedded server functionality for hosting Ktor applications. Provides pluggable server engines with unified configuration and lifecycle management.
Core interface for all server engines that can host Ktor applications.
/**
* An engine which runs an application
*/
interface ApplicationEngine {
/** Application environment configuration */
val environment: ApplicationEnvironment
/** Get resolved connector configurations for this engine */
suspend fun resolvedConnectors(): List<EngineConnectorConfig>
/** Start the engine, optionally wait for completion */
fun start(wait: Boolean = false): ApplicationEngine
/** Start the engine in suspending fashion */
suspend fun startSuspend(wait: Boolean = false): ApplicationEngine
/** Stop the engine with configurable grace and timeout periods */
fun stop(gracePeriodMillis: Long = 500, timeoutMillis: Long = 500)
}Configuration classes for customizing engine behavior and performance characteristics.
/**
* Configuration for ApplicationEngine instances
*/
open class ApplicationEngine.Configuration {
/** Number of parallel processing threads */
val parallelism: Int
/** Size of connection group thread pool */
var connectionGroupSize: Int
/** Size of worker group thread pool */
var workerGroupSize: Int
/** Size of call processing thread pool */
var callGroupSize: Int
/** Grace period for shutdown in milliseconds */
var shutdownGracePeriod: Long
/** Timeout for shutdown in milliseconds */
var shutdownTimeout: Long
/** List of connector configurations */
var connectors: MutableList<EngineConnectorConfig>
}Abstract base class providing common engine functionality.
/**
* Base class for implementing ApplicationEngine
*/
abstract class BaseApplicationEngine : ApplicationEngine {
/** Application environment */
val environment: ApplicationEnvironment
/** Engine-specific processing pipeline */
val pipeline: EnginePipeline
/** Monitor for engine events */
val monitor: Events
/** Application instance hosted by this engine */
val application: Application
}High-level embedded server functionality for easy application hosting.
/**
* Represents an embedded server that hosts an application
*/
class EmbeddedServer<TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration> {
/** Event monitor for server lifecycle events */
val monitor: Events
/** Application environment */
val environment: ApplicationEnvironment
/** Hosted application instance */
val application: Application
/** Underlying engine instance */
val engine: TEngine
}Factory interface for creating ApplicationEngine instances with specific configurations.
/**
* Factory interface for creating ApplicationEngine instances
*/
interface ApplicationEngineFactory<TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration> {
/** Create configuration instance */
fun configuration(configure: TConfiguration.() -> Unit = {}): TConfiguration
/** Create engine instance */
fun create(
environment: ApplicationEnvironment,
monitor: Events,
developmentMode: Boolean,
configuration: TConfiguration,
applicationProvider: () -> Application
): TEngine
}Factory functions for creating embedded server instances with various configuration options.
/**
* Create embedded server with basic configuration
*/
fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration>
embeddedServer(
factory: ApplicationEngineFactory<TEngine, TConfiguration>,
port: Int = 80,
host: String = "0.0.0.0",
watchPaths: List<String> = emptyList(),
configure: TConfiguration.() -> Unit = {},
module: Application.() -> Unit
): EmbeddedServer<TEngine, TConfiguration>
/**
* Create embedded server with connector configuration
*/
fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration>
embeddedServer(
factory: ApplicationEngineFactory<TEngine, TConfiguration>,
connectors: List<EngineConnectorConfig>,
watchPaths: List<String> = emptyList(),
parentCoroutineContext: CoroutineContext = EmptyCoroutineContext,
configure: TConfiguration.() -> Unit = {},
module: Application.() -> Unit = {}
): EmbeddedServer<TEngine, TConfiguration>
/**
* Create embedded server with custom environment
*/
fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration>
embeddedServer(
factory: ApplicationEngineFactory<TEngine, TConfiguration>,
environment: ApplicationEnvironment,
configure: TConfiguration.() -> Unit = {},
module: Application.() -> Unit = {}
): EmbeddedServer<TEngine, TConfiguration>
/**
* Create embedded server with ServerConfig
*/
fun <TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration>
embeddedServer(
factory: ApplicationEngineFactory<TEngine, TConfiguration>,
rootConfig: ServerConfig,
configure: TConfiguration.() -> Unit = {}
): EmbeddedServer<TEngine, TConfiguration>import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun main() {
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
routing {
get("/") {
call.respondText("Hello, World!")
}
}
}.start(wait = true)
}import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main() {
embeddedServer(Netty, port = 8080) {
// Engine-specific configuration
connectionGroupSize = 2
workerGroupSize = 5
callGroupSize = 10
shutdownGracePeriod = 2000
shutdownTimeout = 5000
// Application configuration
}.apply {
// Configure application modules
application.module {
configureRouting()
configurePlugins()
}
}.start(wait = true)
}
fun Application.configureRouting() {
routing {
get("/health") {
call.respondText("OK")
}
}
}
fun Application.configurePlugins() {
install(CallLogging)
}import io.ktor.server.application.*
import io.ktor.server.engine.*
fun main() {
val httpConnector = EngineConnectorBuilder().apply {
port = 8080
host = "0.0.0.0"
}
val httpsConnector = EngineConnectorBuilder().apply {
port = 8443
host = "0.0.0.0"
// SSL configuration would go here
}
embeddedServer(
factory = Netty,
connectors = listOf(httpConnector, httpsConnector)
) {
routing {
get("/") {
call.respondText("Available on both HTTP and HTTPS")
}
}
}.start(wait = true)
}import io.ktor.server.application.*
import io.ktor.server.config.*
import io.ktor.server.engine.*
fun main() {
// Create custom configuration
val config = MapApplicationConfig().apply {
put("app.name", "MyKtorApp")
put("app.version", "1.0.0")
put("server.features.compression", "true")
put("database.url", "jdbc:postgresql://localhost/myapp")
}
// Create custom environment
val environment = createApplicationEnvironment {
this.config = config
this.log = LoggerFactory.getLogger("MyKtorApp")
}
embeddedServer(Netty, environment = environment) {
// Configure based on custom environment
val appName = environment.config.property("app.name").getString()
val version = environment.config.property("app.version").getString()
routing {
get("/info") {
call.respondText("$appName v$version")
}
}
}.start(wait = true)
}import io.ktor.server.application.*
import io.ktor.server.engine.*
fun main() {
embeddedServer(
factory = Netty,
port = 8080,
host = "0.0.0.0",
watchPaths = listOf("classes", "resources"), // Auto-reload on changes
configure = {
// Development-specific engine settings
connectionGroupSize = 1
workerGroupSize = 1
callGroupSize = 1
}
) {
configureForDevelopment()
}.start(wait = true)
}
fun Application.configureForDevelopment() {
// Development mode enables additional features
val isDevelopment = environment.developmentMode
if (isDevelopment) {
install(CallLogging) {
level = Level.DEBUG
}
install(CORS) {
allowMethod(HttpMethod.Options)
allowMethod(HttpMethod.Put)
allowMethod(HttpMethod.Delete)
allowMethod(HttpMethod.Patch)
allowHeader(HttpHeaders.Authorization)
allowCredentials = true
anyHost() // Don't do this in production!
}
}
routing {
get("/dev-info") {
if (isDevelopment) {
call.respond(mapOf(
"development" to true,
"autoReload" to true,
"javaVersion" to System.getProperty("java.version")
))
} else {
call.respond(HttpStatusCode.NotFound)
}
}
}
}import io.ktor.server.application.*
import io.ktor.server.engine.*
fun main() {
val serverConfig = serverConfig {
developmentMode = false
rootPath = "/api/v1"
// Configure application modules
module {
configureAuthentication()
configureRouting()
configurePlugins()
}
module {
configureDatabase()
}
// Watch paths for development
watchPaths = listOf("build/classes")
}
embeddedServer(Netty, rootConfig = serverConfig) {
// Additional engine configuration
shutdownGracePeriod = 3000
shutdownTimeout = 10000
}.start(wait = true)
}
fun Application.configureAuthentication() {
install(Authentication) {
jwt("auth-jwt") {
realm = "ktor app"
verifier(makeJwtVerifier())
validate { credential ->
if (credential.payload.getClaim("username").asString() != "") {
JWTPrincipal(credential.payload)
} else {
null
}
}
}
}
}import io.ktor.server.application.*
import io.ktor.server.engine.*
import kotlinx.coroutines.*
fun main() {
val server = embeddedServer(Netty, port = 8080) {
routing {
get("/") {
call.respondText("Hello, World!")
}
}
}
// Handle shutdown gracefully
Runtime.getRuntime().addShutdownHook(Thread {
println("Shutting down server...")
server.stop(
gracePeriodMillis = 5000,
timeoutMillis = 10000
)
println("Server stopped")
})
server.start(wait = true)
}import io.ktor.server.application.*
import io.ktor.server.engine.*
// Custom engine factory wrapper
class CustomEngineFactory<TEngine : ApplicationEngine, TConfiguration : ApplicationEngine.Configuration>(
private val delegate: ApplicationEngineFactory<TEngine, TConfiguration>
) : ApplicationEngineFactory<TEngine, TConfiguration> {
override fun configuration(configure: TConfiguration.() -> Unit): TConfiguration {
return delegate.configuration {
// Apply default configuration
shutdownGracePeriod = 5000
shutdownTimeout = 10000
configure()
}
}
override fun create(
environment: ApplicationEnvironment,
monitor: Events,
developmentMode: Boolean,
configuration: TConfiguration,
applicationProvider: () -> Application
): TEngine {
// Add custom monitoring
monitor.subscribe(ServerReady) { server ->
println("Custom server started: ${server.environment.config}")
}
return delegate.create(environment, monitor, developmentMode, configuration, applicationProvider)
}
}
fun main() {
val customNetty = CustomEngineFactory(Netty)
embeddedServer(customNetty, port = 8080) {
routing {
get("/") {
call.respondText("Custom engine!")
}
}
}.start(wait = true)
}Install with Tessl CLI
npx tessl i tessl/maven-io-ktor--ktor-server-core-iosarm64