Releases: codeyousef/Aether
Releases · codeyousef/Aether
Aether 0.5.1.0
Added
- gRPC SSE Streaming: Server-Sent Events (SSE) transport for server-streaming gRPC methods over HTTP/1.1
GrpcHttpHandler.handleServerStreamingSSE(): Returns aFlow<String>of SSE-formatted events- SSE transport detection via
Accept: text/event-streamheader or?transport=ssequery parameter - Proper SSE headers:
Content-Type: text/event-stream,Cache-Control: no-cache,Connection: keep-alive - Error handling with SSE
event: errortype for graceful failure reporting - Each stream item serialized as JSON in SSE
data:field with proper\n\nterminators
Aether 0.5.0.3
Fixed
- GrpcHttpHandler: Fixed JSON deserialization bug where raw JSON strings were passed to handlers instead of typed
objects- Added
KSerializerstorage toGrpcMethodinterface and all method types (UnaryMethod,
ServerStreamingMethod, etc.) - Updated
handleUnary()to usekotlinx.serializationfor proper request/response serialization - Fixes
ClassCastException: class java.lang.String cannot be cast to class [ProtoType]errors
- Added
Aether 0.5.0.2
Added
- GrpcHttpHandler: HTTP handler for processing gRPC-Web and Connect protocol requests
handle(): Process gRPC requests with path, body, content type, and metadatahandleBinary(): Process binary gRPC-Web requests with LPM framinginvokeUnary(): Direct unary method invocation- Content type detection for gRPC-Web, Connect JSON, and Connect Proto
- GrpcMiddleware: Pipeline middleware for automatic gRPC routing
Pipeline.installGrpc { }: DSL for installing gRPC supportPipeline.installGrpc(config): Install with pre-built configPipeline.installGrpc(vararg services): Install with service listgrpcMiddleware { }: Create standalone middleware function- Automatic content-type and path-based request detection
- gRPC status to HTTP status code mapping
- GrpcResponse: Response wrapper with status, body, and content type
GrpcResponse.success(): Create success responseGrpcResponse.error(): Create error responseGrpcResponse.fromException(): Create from GrpcException
Aether 0.5.0.1
Fixed
- Publishing: Added
aether-grpcmodule to Maven Central publish list
Aether 0.5.0.0
Added
-
Aether gRPC (
aether-grpc): Multi-protocol gRPC support with code-first approach- gRPC-Web Support: Browser-compatible gRPC over HTTP/1.1
- Connect Protocol: JSON-based gRPC alternative for web clients
- Native HTTP/2 gRPC: Full gRPC support on JVM with Netty
GrpcMode: BEST_AVAILABLE (auto), ADAPTER_ONLY (all platforms), NATIVE_ONLY (JVM)
-
gRPC Status & Exceptions
GrpcStatus: All 17 standard gRPC status codes (OK, CANCELLED, UNKNOWN, etc.)GrpcException: Rich exception with factory methods (notFound(),invalidArgument(), etc.)GrpcMetadata: Case-insensitive key-value storage for headers/trailers
-
Code-First Proto Generation (KSP)
@AetherMessage: Mark data classes as proto messages@ProtoField(id, deprecated, json): Specify field numbers with options@AetherService: Mark interfaces as gRPC services@AetherRpc(name, deprecated): Define RPC methodsKotlinToProtoMapper: Automatic type mapping (Int→int32, List→repeated, etc.)ProtoGenerator: Generates valid.protofiles from Kotlin codeProtoProcessor: KSP processor for automatic proto generation
-
gRPC DSL Configuration
grpc { }DSL block for server configurationGrpcConfig: Port, mode, reflection, interceptors, message size, keepaliveGrpcConfigBuilder: Fluent builder with inline service definitionsGrpcInterceptor: Middleware for gRPC calls
-
gRPC Service Definition
GrpcServiceDefinition: Service descriptor with method registrygrpcService("name", "package") { }: DSL for defining servicesunary<Req, Resp>("Method") { }: Unary RPC handlerserverStreaming<Req, Resp>("Method") { }: Server streaming handlerclientStreaming<Req, Resp>("Method") { }: Client streaming handlerbidiStreaming<Req, Resp>("Method") { }: Bidirectional streaming handler
-
Streaming Support with Kotlin Flow
ServerStreamingHandler<TReq, TResp>: Server-to-client streamingClientStreamingHandler<TReq, TResp>: Client-to-server streamingBiDirectionalStreamingHandler<TReq, TResp>: Full duplex streamingLpmCodec: Length-Prefixed Message framing for gRPC wire formatSseCodec: Server-Sent Events for HTTP/1.1 streaming
-
gRPC Infrastructure
GrpcAdapter: Routes gRPC-Web/Connect requests through HTTP stackGrpcMethodType: UNARY, SERVER_STREAMING, CLIENT_STREAMING, BIDI_STREAMINGGrpcMethodDescriptor: Method metadata (name, types, streaming flags)GrpcServiceDescriptor: Service metadata with method registry
-
Unified Authentication (
aether-core)UserContext: CoroutineContext element for auth propagationcurrentUser(): Get authenticated Principal from coroutine contextrequireUser(): Get Principal or throw if not authenticatedisAuthenticated(): Check if user is authenticatedhasRole(role): Check if user has a specific roleAuthStrategy: Protocol-agnostic authentication interfaceBearerTokenStrategy: JWT/Bearer token authenticationApiKeyStrategy: API key authenticationBasicAuthStrategy: HTTP Basic authenticationCompositeAuthStrategy: Try multiple strategies in order
Changed
AuthMiddleware: Now propagatesUserContextviawithContext()for coroutine-based authaether-ksp: Added dependency onaether-grpcfor proto annotations
Notes
- gRPC-Web and Connect protocol work on all platforms (JVM, WasmJS, WasmWasi)
- Native HTTP/2 gRPC requires JVM with Netty (use
GrpcMode.NATIVE_ONLY) - Proto generation requires KSP plugin in your build configuration
Aether 0.4.2.2
Fixed
- WebSocket: Fixed NullPointerException in
VertxWebSocketwhen a WebSocket closes without a status code- Added null-safe handling for
closeStatusCode()with default to 1000 (normal closure)
- Added null-safe handling for
Aether 0.4.2.1
Fixed
- Publishing: Improved Maven Central publish task with better HTTP status tracking and bundle debugging
- Publishing: Added deployment status verification after upload to Central Portal
Aether 0.4.2.0
Added
- Authentication: Added comprehensive RBAC support with
User,Groups, andPermissions - Testing: Added End-to-End (E2E) tests for authentication flow and RBAC verification
- JWT for Wasm: Full
JwtServiceimplementation for WasmJS and WasmWasi targets- Pure Kotlin SHA-256 and HMAC-SHA256 implementation (
Sha256,HmacSha256) - Base64URL encoding/decoding for JWT serialization (
Base64Url) PureJwtobject for cross-platform token generation and verification- HS256 algorithm support matching JVM implementation
- Cross-platform tests for cryptographic primitives
- Pure Kotlin SHA-256 and HMAC-SHA256 implementation (
Fixed
- Authentication: Fixed unchecked cast warnings in
AbstractUser - Networking: Updated
RouterServerto use modern Vert.xsetKeyCertOptionsfor SSL configuration, replacing deprecated methods - Core: Fixed various deprecation warnings in
StreamingProxyClientandVertxWebSocket
Aether 0.4.1.0
Added
- Aether Start: New
aetherStart {}entry point for simplified server startup- Supports both pipeline-based and router-based configuration
- WebSocket Integration: Automatically registers and handles WebSocket routes defined in the Router
- Automatic ASCII banner display on startup
- Graceful shutdown handling with "⚡ Shutting down Aether..." messages
- Replaces direct
VertxServerusage in user code
- CLI: Added
runservercommand (aliasrun) to start the development server - CLI: Added ASCII banner to help output and startup messages
Changed
- Branding: Replaced Vert.x branding with Aether branding in customer-facing output
- Terminal output now shows "Aether Framework" instead of Vert.x messages
- Gradle tasks now described as "Run ... with Virtual Threads" instead of "Vert.x"
- Example app UI updated to highlight "Virtual Threads" instead of "Vert.x"
- Templates: Updated
startprojectand Gradle plugin templates to useaetherStart - Testing: Added comprehensive E2E tests for
aetherStartand WebSocket functionality
Aether 0.4.0.1
Fixed
- Publishing: Added missing modules to Maven Central publish list
aether-signals: Now published to Maven Centralaether-tasks: Now published to Maven Centralaether-channels: Now published to Maven Central
- Multiplatform Compatibility: Fixed
synchronizedandMathusage in common code- Replaced
synchronizedwithMutex.withLockin Signal dispatch - Replaced
Math.random()withkotlin.random.Random.nextDouble() - Replaced
Math.pow()withkotlin.math.pow()
- Replaced
- Build: Disabled wasmJs browser tests (use Node.js instead) to fix CI without Chrome