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/
InteractorAn easy-to-use, concurrent, and reactive state management systemRouterPlatform independent routing with backstack management, deep link, and transition supportKmpFsPlatform independent library for sandboxed and non-sandboxed file system interactionsKmpCapabilitiesPlatform independent permissions and service enablement for common capabilities (Bluetooth, Location)OutcomeA 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
Promisehelpers - Added some
JsInterophelpers
KmpCapabilitiesfor testing for permissions and enablement of some common platform services (Bluetooth, Location)KmpFsSupports internal (sandboxed) and external (non-sandboxed) filesystem interactionsIKmpIoSourceandIKmpIoSinkinterfaces and implementations for cross-platform asynchronous file interactions.KmpScreenWakeLockAllows preventing a user's screen from sleepingKmpDispatchersfor a commonIOdispatcherDeferred<t>.awaitOutcome()Queuefor creating a queue of sequentially executing coroutinesBytesExtAllows converting common data types to and from byte arraysLocalDateTime.kmpFormat()For a cross-platform date-time formatterKmpUrlA multiplatform URL parserAny?.printed()andprintAllhelpers- Updated
Platformto addWebBrowser Routerhas been reworked and added a new transactional API for more flexibility and to clean up a lot of rarely used API surface- Added
IWebRoutefor 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.
KMPchanged toKmp) - Reworked/renamed
KMPStoragetoKmpKvStore Coordinatorhas been reworked to fit the new Transaction API implemented in Router.KmpDeepLinkwas deemed unnecessary and was removedKMPFileHandlerwas renamed/repurposed intoKmpFsKMPFileRefwas renamed/repurposed intoKmpFsRefLazyComputedwas changed to use the invoke operator instead ofvalue()functionOutcome.unwrapOrReturn()was changed to pass a parameter instead ofthisfor the error- Reworked the
RouterAPI KMPStoragewas renamed/reworked intoKmpKvStoreFileUtilwas 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.unwrapOrElsetoOutcome.unwrapOrReturn
createInteractor()