Skip to content

Latest commit

 

History

History
126 lines (83 loc) · 4.47 KB

File metadata and controls

126 lines (83 loc) · 4.47 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project follows Semantic Versioning once stable releases start.

[0.5.0] - 2026-07-28

Added

  • Added OscServer.serve() as the recommended standalone server startup API.
  • Added OscServer.join() for waiting until a server has fully stopped without initiating shutdown.
  • Added OscServer.stop(gracePeriod) and OscServer.stopAsync(gracePeriod) for graceful server shutdown windows.

Changed

  • Documented OscServer shutdown semantics, including first-call-wins stopAsync behavior and the effect of non-cancellable route handlers.

[0.4.0] - 2026-06-28

Added

  • Added oscMessageOf(address, vararg args) for building OscMessage values from regular Kotlin values.
  • Added buildOscBundle(timetag) { ... } as the bundle DSL entry point.
  • Added OscBundleBuilder.packet(packet) for adding prebuilt messages or nested bundles to a bundle DSL block.

Changed

  • OscBundleBuilder.message now has a single message(address, vararg args: Any?) form and uses the same boxing rules as oscMessageOf.
  • List and Array values passed to oscMessageOf or bundle message are treated as one OSC array argument. Spread a collection explicitly when passing it as multiple message arguments.
  • OscServerBackend is now one-shot, and its receivedPackets flow closes when OscServerBackend.stop() completes.

Fixed

  • Fixed an intermittent TcpOscServerBackend.stop() failure caused by snapshotting active TCP clients while client read loops were removing themselves concurrently.

Removed

  • Removed the OscMessage companion invoke helpers for user-value construction.
  • Removed the old oscBundle bundle DSL entry point.
  • Removed the OscBundleBuilder.message overloads that accepted List<OscArg>, List<Any?>, or vararg OscArg.

Migration

// Before
val message = OscMessage("/path", 1, "x")
val bundle = oscBundle {
    message("/a", listOf(1, 2))
}

// After
val message = oscMessageOf("/path", 1, "x")
val bundle = buildOscBundle {
    message("/a", listOf(1, 2)) // one OscArray argument
}

// To pass a collection as multiple message arguments:
val args = listOf(1, 2)
val expanded = oscMessageOf("/a", *args.toTypedArray())

[0.3.0] - 2026-05-08

Added

  • Added TCP client/server transport support through OscTransportProtocol.Tcp.
  • Added TCP packet framing strategies: OscTcpFramingStrategy.LENGTH_PREFIXED and OscTcpFramingStrategy.SLIP.
  • Added client/server DSL transport selection:
    • protocol { udp() }
    • protocol { tcp() }
    • protocol { tcp { framingStrategy = OscTcpFramingStrategy.SLIP } }
  • Added TCP backend tests and public API round-trip coverage for default length-prefixed framing and SLIP framing.

Changed

  • OscClient no longer accepts an external coroutine scope. Client shutdown is managed internally through closeAsync(), closeAndJoin(), and close().
  • OscServer can now be configured with UDP or TCP transport while keeping UDP as the default.

Removed

  • Removed scope from OscClient and OscClientOptionsBuilder.

Migration

// Before
val client = OscClient(address, scope)

// After
val client = OscClient(address)

[0.2.0] - 2026-04-21

Added

  • Runnable examples under examples/, including codec, bundle DSL, UDP client/server, routing, and scheduling use cases.

Changed

  • Reworked OscBundle.toString() to produce more readable output for nested bundles.
  • Added nested alternation support to OSC address pattern compilation and matching.

Fixed

  • Fixed bundle timetag decoding for modern/future OSC timetag values by preserving the raw 64-bit unsigned value during bundle decode.

[0.1.0] - 2026-04-11

Added

  • Initial Kotlin/JVM OSC library release.
  • OSC data model: OscPacket, OscMessage, OscBundle, and OSC argument types.
  • Codec APIs: encodeToByteArray and decodeFromByteArray.
  • Routing and pattern matching: OscRouter and OSC address matcher/compiler.
  • UDP runtime: OscServer, OscClient, and Kotlin DSL builders.
  • Lifecycle APIs with async idempotent shutdown (stopAsync / closeAsync).
  • Project documentation under docs/ and public API compatibility checks (apiCheck / apiDump).

Changed

  • OscTimetag.toInstant() now rejects OscTimetag.IMMEDIATELY sentinel values.

Fixed

  • Prevented incorrect timestamp conversion when OscTimetag.IMMEDIATELY was converted as an absolute timestamp.