An opinionated architecture/library for Kotlin Multiplatform development with an implementation of the VISCE architecture
OSKit is primarily a tool for us here at Outside Source. That being said, feel free to use this library in your own code. We strive to adhere to semantic versioning.
Contributions are appreciated and welcome, but we are a small team and make no guarantees that your changes will be implemented.
https://outsidesource.github.io/OSKit-KMP/
Interactor
An easy-to-use, concurrent, and reactive state management systemRouter
Platform independent routing with backstack management, deep link, and transition supportKmpFs
Platform independent library for sandboxed and non-sandboxed file system interactionsKmpCapabilities
Platform independent permissions and service enablement for common capabilities (Bluetooth, Location)Outcome
A result type with helpers for better railway oriented programming- Some general helpers and extensions we have found helpful over time
Currently supported platforms include:
- Android
- JVM (MacOS/Windows/Linux)
- iOS
- WASM (browser primarily)
implementation("com.outsidesource:oskit-kmp:5.0.0")
https://github.com/outsidesource/OSKit-Example-App-KMP
- Kotlin 2.1.0 support
- Support for the WASM target
- All existing and new OsKit feature support all platforms unless explicitly said otherwise in documentation
- Added some
Promise
helpers - Added some
JsInterop
helpers
KmpCapabilities
for testing for permissions and enablement of some common platform services (Bluetooth, Location)KmpFs
Supports internal (sandboxed) and external (non-sandboxed) filesystem interactionsIKmpIoSource
andIKmpIoSink
interfaces and implementations for cross-platform asynchronous file interactions.KmpScreenWakeLock
Allows preventing a user's screen from sleepingKmpDispatchers
for a commonIO
dispatcherDeferred<t>.awaitOutcome()
Queue
for creating a queue of sequentially executing coroutinesBytesExt
Allows converting common data types to and from byte arraysLocalDateTime.kmpFormat()
For a cross-platform date-time formatterKmpUrl
A multiplatform URL parserAny?.printed()
andprintAll
helpers- Updated
Platform
to addWebBrowser
Router
has been reworked and added a new transactional API for more flexibility and to clean up a lot of rarely used API surface- Added
IWebRoute
for handling path changes in the browser - Added deep link support
- Added
- Adopted Upper Camel Case for all acronym prefixes on class and function names (i.e.
KMP
changed toKmp
) - Reworked/renamed
KMPStorage
toKmpKvStore
Coordinator
has been reworked to fit the new Transaction API implemented in Router.KmpDeepLink
was deemed unnecessary and was removedKMPFileHandler
was renamed/repurposed intoKmpFs
KMPFileRef
was renamed/repurposed intoKmpFsRef
LazyComputed
was changed to use the invoke operator instead ofvalue()
functionOutcome.unwrapOrReturn()
was changed to pass a parameter instead ofthis
for the error- Reworked the
Router
API KMPStorage
was renamed/reworked intoKmpKvStore
FileUtil
was renamed toFsUtil
- InMemoryKmpStorageNode
- withTimeoutOrOutcome
- Deferrable code helpers
- Deferrer/SuspendDeferrer
- withDefer/withSuspendDefer
- coroutineScopeWithDefer/coroutineScopeWithSuspendDefer
- flowWithDefer/flowWithSuspendDefer
- channelFlowWithDefer/channelFlowWithSuspendDefer
- Default parameters in Coordinator
- KmpFileRef being broken after reboot on iOS
- Large iOS KmpFileRef sink() writes
- Issue when resolving KmpFileRef on desktop
- Issue with resolving KmpFileRef directory on Linux
- Issue with file pickers on Linux with Plasma
- Outcome.runOnOk and Outcome.runOnError now return the outcome specified
- SemVer.fromString() only taking the first digit
- Made dependencies and computed optional in createInteractor()
- KmpStorage
- Double.toFixed()
- List extensions
- renamed
Outcome.unwrapOrElse
toOutcome.unwrapOrReturn
createInteractor()