Skip to content

Releases: codeyousef/Aether

Aether 0.5.1.0

16 Jan 06:52

Choose a tag to compare

Added

  • gRPC SSE Streaming: Server-Sent Events (SSE) transport for server-streaming gRPC methods over HTTP/1.1
    • GrpcHttpHandler.handleServerStreamingSSE(): Returns a Flow<String> of SSE-formatted events
    • SSE transport detection via Accept: text/event-stream header or ?transport=sse query parameter
    • Proper SSE headers: Content-Type: text/event-stream, Cache-Control: no-cache, Connection: keep-alive
    • Error handling with SSE event: error type for graceful failure reporting
    • Each stream item serialized as JSON in SSE data: field with proper \n\n terminators

Aether 0.5.0.3

15 Jan 15:10

Choose a tag to compare

Fixed

  • GrpcHttpHandler: Fixed JSON deserialization bug where raw JSON strings were passed to handlers instead of typed
    objects
    • Added KSerializer storage to GrpcMethod interface and all method types (UnaryMethod,
      ServerStreamingMethod, etc.)
    • Updated handleUnary() to use kotlinx.serialization for proper request/response serialization
    • Fixes ClassCastException: class java.lang.String cannot be cast to class [ProtoType] errors

Aether 0.5.0.2

14 Jan 19:20

Choose a tag to compare

Added

  • GrpcHttpHandler: HTTP handler for processing gRPC-Web and Connect protocol requests
    • handle(): Process gRPC requests with path, body, content type, and metadata
    • handleBinary(): Process binary gRPC-Web requests with LPM framing
    • invokeUnary(): 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 support
    • Pipeline.installGrpc(config): Install with pre-built config
    • Pipeline.installGrpc(vararg services): Install with service list
    • grpcMiddleware { }: 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 response
    • GrpcResponse.error(): Create error response
    • GrpcResponse.fromException(): Create from GrpcException

Aether 0.5.0.1

14 Jan 17:55

Choose a tag to compare

Fixed

  • Publishing: Added aether-grpc module to Maven Central publish list

Aether 0.5.0.0

14 Jan 17:39

Choose a tag to compare

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 methods
    • KotlinToProtoMapper: Automatic type mapping (Int→int32, List→repeated, etc.)
    • ProtoGenerator: Generates valid .proto files from Kotlin code
    • ProtoProcessor: KSP processor for automatic proto generation
  • gRPC DSL Configuration

    • grpc { } DSL block for server configuration
    • GrpcConfig: Port, mode, reflection, interceptors, message size, keepalive
    • GrpcConfigBuilder: Fluent builder with inline service definitions
    • GrpcInterceptor: Middleware for gRPC calls
  • gRPC Service Definition

    • GrpcServiceDefinition: Service descriptor with method registry
    • grpcService("name", "package") { }: DSL for defining services
    • unary<Req, Resp>("Method") { }: Unary RPC handler
    • serverStreaming<Req, Resp>("Method") { }: Server streaming handler
    • clientStreaming<Req, Resp>("Method") { }: Client streaming handler
    • bidiStreaming<Req, Resp>("Method") { }: Bidirectional streaming handler
  • Streaming Support with Kotlin Flow

    • ServerStreamingHandler<TReq, TResp>: Server-to-client streaming
    • ClientStreamingHandler<TReq, TResp>: Client-to-server streaming
    • BiDirectionalStreamingHandler<TReq, TResp>: Full duplex streaming
    • LpmCodec: Length-Prefixed Message framing for gRPC wire format
    • SseCodec: Server-Sent Events for HTTP/1.1 streaming
  • gRPC Infrastructure

    • GrpcAdapter: Routes gRPC-Web/Connect requests through HTTP stack
    • GrpcMethodType: UNARY, SERVER_STREAMING, CLIENT_STREAMING, BIDI_STREAMING
    • GrpcMethodDescriptor: Method metadata (name, types, streaming flags)
    • GrpcServiceDescriptor: Service metadata with method registry
  • Unified Authentication (aether-core)

    • UserContext: CoroutineContext element for auth propagation
    • currentUser(): Get authenticated Principal from coroutine context
    • requireUser(): Get Principal or throw if not authenticated
    • isAuthenticated(): Check if user is authenticated
    • hasRole(role): Check if user has a specific role
    • AuthStrategy: Protocol-agnostic authentication interface
    • BearerTokenStrategy: JWT/Bearer token authentication
    • ApiKeyStrategy: API key authentication
    • BasicAuthStrategy: HTTP Basic authentication
    • CompositeAuthStrategy: Try multiple strategies in order

Changed

  • AuthMiddleware: Now propagates UserContext via withContext() for coroutine-based auth
  • aether-ksp: Added dependency on aether-grpc for 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

10 Jan 16:01

Choose a tag to compare

Fixed

  • WebSocket: Fixed NullPointerException in VertxWebSocket when a WebSocket closes without a status code
    • Added null-safe handling for closeStatusCode() with default to 1000 (normal closure)

Aether 0.4.2.1

06 Jan 14:07

Choose a tag to compare

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

06 Jan 09:51

Choose a tag to compare

Added

  • Authentication: Added comprehensive RBAC support with User, Groups, and Permissions
  • Testing: Added End-to-End (E2E) tests for authentication flow and RBAC verification
  • JWT for Wasm: Full JwtService implementation for WasmJS and WasmWasi targets
    • Pure Kotlin SHA-256 and HMAC-SHA256 implementation (Sha256, HmacSha256)
    • Base64URL encoding/decoding for JWT serialization (Base64Url)
    • PureJwt object for cross-platform token generation and verification
    • HS256 algorithm support matching JVM implementation
    • Cross-platform tests for cryptographic primitives

Fixed

  • Authentication: Fixed unchecked cast warnings in AbstractUser
  • Networking: Updated RouterServer to use modern Vert.x setKeyCertOptions for SSL configuration, replacing deprecated methods
  • Core: Fixed various deprecation warnings in StreamingProxyClient and VertxWebSocket

Aether 0.4.1.0

05 Jan 17:23

Choose a tag to compare

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 VertxServer usage in user code
  • CLI: Added runserver command (alias run) 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 startproject and Gradle plugin templates to use aetherStart
  • Testing: Added comprehensive E2E tests for aetherStart and WebSocket functionality

Aether 0.4.0.1

04 Jan 19:41

Choose a tag to compare

Fixed

  • Publishing: Added missing modules to Maven Central publish list
    • aether-signals: Now published to Maven Central
    • aether-tasks: Now published to Maven Central
    • aether-channels: Now published to Maven Central
  • Multiplatform Compatibility: Fixed synchronized and Math usage in common code
    • Replaced synchronized with Mutex.withLock in Signal dispatch
    • Replaced Math.random() with kotlin.random.Random.nextDouble()
    • Replaced Math.pow() with kotlin.math.pow()
  • Build: Disabled wasmJs browser tests (use Node.js instead) to fix CI without Chrome