IMPORTANT: Deprecation of extension-client
extension-client was a module that implemented "client" features into kSteam, providing easy access to features like library. However, for actively developing clients itself, this architecture is actually worse - you would need to rebuild kSteam in order for the client to receive changes.
Basically, this module was a "domain" layer. But most apps already have their own "domain" layer!
So, it is now recommended to build Steam API interactions directly in your application domain layer instead of using kSteam Client Extensions - just use the core.
Other changes:
- Outgoing packets are now properly enqueued, ensuring stability
- Support for pausing, resuming and restarting
SteamClient AccessDeniedduring logon now deletes the used account from persistenceSteamClientnow restarts afterAccessDenied/Expirederrors during logonSentrynow does not accept new messages due to Steam removing related protobufs from both WebUI and Steam Client... probably deprecated them (JWT tokens can work as a replacement)- updated protobufs
- Now kSteam implements all service methods! The
proto-commonmodule now has a semi-automatic patcher that adapts SteamDB's dumped protobufs into Wire-compatible - andSteamGrpcClientsnow has all available services. - Even faster library! PICS chunk processing is now faster, decreasing initial startup time even more.
Guard: fixed adding Steam Guard
- Supercharged library queries! For UI display reasons, you might not need to query ALL the data from applications.
-
- Now, kSteam adds a
fullargument to most of the methods inLibrarythat can skip extra information.
- Now, kSteam adds a
-
- kSteam Library Queries got new parameters:
alwaysFetchLicenses,alwaysFetchPlayTimeandfetchFullInformation. All of them are false by default.
- kSteam Library Queries got new parameters:
-
fetchFullInformationorfullset to false will skip querying the following metadata: content descriptors, tags, categories, localized assets, developers, publishers and franchises
- Improved PICS Database! With new fields included in SQLite tables, kSteam does no longer store any VDF at all, greatly improving update speeds and reducing database sizes.
SteamApplication: Content Descriptors are now parsed properlyLibrary: SQL query building is fixed for some collections and simple requestsLibrary: AddedKsLibraryQuerySortBy.NormalizedNamefor sorting based onsortasfield in AppInfo with fallback to regular names
- Rewritten network communication! Inspired by job system in other Steam Network clients, the CMJob system in kSteam allows for more streamlined experience and better stability when working with the Steam Network.
-
- kSteam also introduces Streaming CM Jobs, which allow for processing every received part of a multi-message job, instead of collecting to List first. This really helps with PICS, where this new method greatly reduces memory usage on updates.
- Major PICS rewrite! The whole database is now powered by Room (SQLite ORM by Google), which enables following things:
-
- Kotlin 2.1 support and beyond (Realm is currently "frozen")
-
- More platforms supported (kSteam still primarily supports only JVM + Android)
-
- Rewritten startup sequence, which should be more accurate in multi-user environments
-
- A lot of internal DB objects were rewritten from scratch to improve performance and decrease memory usage
- Jetpack Compose bindings removed. Refer to
Jetpack Composesection on README on how to improve stability when using kSteam models in@Composable. - Synchronized Protobuf files and dependencies.
UserNews: statuses supportAccount: IP fetching is now on separate thread to "fix" NetworkOnMainThreadException on Android
- kSteam Library Queries! This all-new system interops with Steam Library Collections (while adding new filters), allowing to fetch user's game library with play time and license support.
- Multi-license support! Now kSteam understands package licenses and can apply them to app queries - you can easily get information about multiple copies and who own them.
- [breaking change]:
ExtendedSteamClientnow implements the new abstractSteamClientinterface, while the oldSteamClientis now internal and namedSteamClientImpl. - [breaking change]:
extension-client/published-files: all-newPublishedFileclass that features more mapped variables and improved code style - [breaking change]:
core: gRPC clientauthenticationClientrenamed toauthentication core: move gRPC clients fromextension-client'sExtendedSteamGrpcClientstoSteamGrpcClientsextension-client/published-files: implementedgetFilesAppListandgetFilesextension-client/published-files: implementedEPublishedFileInfoMatchingFileTypeandEWorkshopFileTypeenumsproto-common: merge protobuf files fromcoreandextension-clientextension-client: implementedClientCommunicationfor remote operationscore: addClientCommService,FamilyGroupsService,GameNotesService,StoreService,MobileDeviceService,UserGameNotesServicetoSteamGrpcClientsproto-common: update to latest protobufsproto-common: don't embed .proto files in JAR
- [breaking change]
extension-client/guard:getActiveSessionsnow returns anActiveSessionsobject that separates current kSteam session and others - [breaking change]
extension-client: implemented separate databases, "ks_shared.realm" for PICS and "ks_.realm" for user-specific items (personas, for example) - [breaking change]
extension-client:Personais now rebuilt, featuring built-in relationship indicator and newStatusinterface - [breaking change]
core:trySignInSavedis now separated intotrySignInSaved(SteamId)andtrySignInSavedDefault() core,extension-client/guard: replacedwhile (true)in flows withwhile (currentCoroutineContext().isActive)extension-client/guard: fixed generation of revocation signaturecore: addAccount.getWebCookiesfor fetching required cookies to access secured Steam pages in a WebViewextension-client/guard: makeMobileConfirmationItem.iconnullable to fix parsing when a confirmation does not have it (phone number changes)дcore-persistence: addsecureGetSteamIdsand improvesecureContainsIdentitycore: implemented support for expired sessionscore: implemented auto-restoration of autologinextension-client: implemented new rich presence formatter that automatically updates the databaseextension-client: provideSteamRegexesto help QR scanning implementations
- [breaking change]
core: handler system was removed out in favour for static injection of subsystems - [breaking change]
extension-client: due to handler system being removed, extension is now installed as a Kotlin extension forSteamClient(seeextendToClientfunction) - [breaking change]
extension-client/guard-management:AwaitingSessionis nowIncomingSession - [breaking change]
extension-client/guard-management:IncomingSessionandActiveSessionare nowSerializable - [breaking change]
extension-client/guard-management: reworked API to be more consistent - [breaking change]
extension-client/guard: major refactor of creation/moving process, removing the state system core: implement shared gRPC client storagecore: streamlined coroutines scope creation/usagecore: remove embedded libdeflate for native platforms multi-message support because Okio has support for gzip streams for K/Ncore: improved performance by using an enum cache forEMsgandEResultextension-client: implement shared gRPC client storage for easy invoking of supported autogenerated RPC interfacesextension-client/guard: fixed generating signature for revoking sessionsextension-client/guard-management: added a method to revoke current session- update dependencies
core/accountnow tries to search Steam Guard code for all bound extensions- [breaking change]
extension-clienthandler extensions for PICS/Library/Guard are now moved back tobruhcollective.itaysonlab.ksteam.handlerspackage
Literally everything here is changed, more like a rewrite from scratch, leaving ~25% of original codebase
- [breaking change] massive persistence rework, saved storage from earlier kSteam versions IS NOT COMPATIBLE (including Steam Guard)
- re-enable support for macOS/iOS compilation
- [breaking change] massive rework of extension architecture, simplifying everything to "core"-"implementation" model
- [breaking change] introduce
core-persistencefor managing saved user data core/unifiedmessages: provide a custom Wire client implementation for simplifying API requests- [breaking change]
core/account: now uses secure persistence extension-client: introduce Realm Mobile Database for persisting personas, collections, game metadataextension-client/persona: optimize flows by using Realm queries- [breaking change]
extension-client/pics: key-value DB is not required anymore - [breaking change]
extension-client/pics: massive rework of querying, caching and storing to minimize extra requests extension-client/guard: now uses secure persistence
- [breaking change] Disable support for macOS/iOS compilation, effectively making kSteam a JVM/Android-only library
- [breaking change] RPC calls now use Wire's gRPC custom client implementation instead of manually passing request/response adapters. This also enables usage of Steam-defined services directly.
extension-pics: support for 64-bit app IDs, making the client not crashing if providing folders with non-Steam applications- update dependencies
- streamline the version updating procedure by introducing version catalogs
- synchronized protobufs with the latest provided by Steam
- Matches Cobalt
1.0-prototypebuild
extension-core/news: implementgetUpcomingEventsandgetUpcomingEventsextension-core/news: extract friend activity toUserNewshandlerextension-core/news: reworkActivityFeedEntryto be more UI-compliantextension-core/news: other fixes and improvementscore/webapi: reworked API wrappers to be more modern and Kotlin-friendly- rewrite logging transport, now message value computation is done lazily (and is more likely to be removed by R8/Proguard)
- streamline build process
- provide
androidartifacts as well, with Compose stability bindings and logcat output
- [breaking change] redone
CMClientStatefeaturing newAwaitingAuthorizationstate (connected as a guest) and renamedLoggingtoAuthorizing+IdletoOffline core: improvedCMClientStateexposingcore: introduceextractAccountIdFromSteamandtoSteamIdextensions forLongandIntcore: fixed rare Web API call crashcore/player: makegetAchievementsProgressandgetTopAchievementspublic (proto API only for now)extension-pics: optimized database lists, fixingCallbackSuspendableMap must be initialized first!crashextension-core/news: finalized parameters forgetUserNews, introducedUserNewsFilterScenarioextension-core/news- updated
kotlinfrom1.8.20to1.8.21 - updated
kotlinx-coroutinesfrom1.7.0-RCto1.7.1 - updated
kotlinx-serializationfrom1.5.0to1.5.1 - updated
wirefrom4.6.0to4.7.2 - updated
ktorfrom2.3.0to2.3.1
- [breaking change] updated
wirefrom 4.5.3 to 4.6.0 (library consumers must also updatewireto avoid issues) - [breaking change]
extension-pics: fixed JSON exception when Steam can give absolutely random order values for collections (Int->Double) core: redone sign in process to extract Steam ID from JWT token (fixes QR login - btw I think that there is an easier way to know SteamID in QR logins...)- synchronized protobufs
- updated
ktor,kotlinx-serializationandcoroutines
- [breaking change] Kotlin Multiplatform support for
jvm,ios(arm64/simulatorArm64/x64),tvos(arm64/simulatorArm64/x64) andmacos(arm64/x64) - [breaking change]
core:rootFolderis replaced fromFileof JVM toPathof okio - [breaking change]
core,extension-core,extension-guard,extension-pics: removed AndroidX @Immutable/@Stable annotations from models, this will lead to recomposition issues if used directly in Jetpack Compose (wrap them in UI state objects) - [breaking change]
extension-guard: migrated from custom protobuf to .mafile-style JSON files (migration tools are provided in a separate module namedextension-guard-proto-migration) - [breaking change]
core:ktorProxyConfigremoved in favor of specifying your own KtorHttpClientusingktor { }function inkSteam { }initializator core: refactored a lot of internal I/O-related codecore: addedSteamClientConfiguration.AuthPrivateIpLogic.Generateoption for signing in (enabled by default on Apple platforms)extension-guard: rewritten java.nio/javax.crypto (bytebuffer/hmac) usages with okioextension-pics: collections are now filtered based on actual owned appidsextension-pics: optimize metadata updating- replaced
implementationwithapiinside kSteam modules to preventClassNotFoundException