All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[3.17.0] - 2025-07-16
Added
- Nakama: New Realtime Parties search feature which allows open parties to be discovered by users.
Changed
- Nakama+Satori: TinyJson will now encode any "IDictionary<,>" type.
Fixed
- Nakama: "ListStorageObjectsAsync" can use a user ID as input to fetch public storage objects for that user. Thanks @chrisanicolaou.
- Nakama+Satori: Fix how issue at time is decoded from Session token.
[3.16.0] - 2025-02-13
Added
Changed
- Nakama+Satori: Embed version information based on Git describe into builds.
Fixed
- Nakama+Satori: Use formatted arguments with all logger lines in request adapters.
- Satori: Use session token as jitter seed for randomized backoff with retries.
- Nakama: "ISession.CreateTime" now accurately represents Unix time in seconds since the "ISession" object was created.
[3.15.0] - 2025-01-28
Added
- Satori: Add retry attempts to "Client" type.
Changed
- Nakama: Improve how cancellation is handled in HTTP requests.
- Satori: Improve how cancellation is handled in HTTP requests.
- Satori: Timeouts set in "Client" are now propagated to the underlying "ApiClient" type.
Fixed
- GitHub Pages documentation no longer uses Jekyll transform.
[3.14.0] - 2024-10-20
Added
- Satori: New "IClient" event called "ReceivedSessionUpdated" when session expires and is refreshed.
Changed
- Satori: The new session returned by "IdentifyAsync" is merged into the input "Session" type.
[3.13.0] - 2024-07-10
Added
- Satori: Added "ImageUrl" and "Title" to "IApiMessage".
[3.12.1] - 2024-05-30
Fixed
- Nakama: Fixed an issue where notifications from other users could appear as if they were sent by the recipient user.
- Nakama: Fixed a potential "NullReferenceException" that could occur when passing a "null" username to "IClient.UpdateAccountAsync".
[3.12.0] - 2024-04-08
Added
- Satori: Added "IApiLiveEvent.Id" for accessing live event identifiers.
- Satori: Added support for new Satori Messages API: "IClient.GetMessageListAsync", "IClient.UpdateMessageAsync" and "IClient.DeleteMessageAsync".
[3.11.0] - 2024-03-08
Added
- Nakama: New "IClient" event called "ReceivedSessionUpdated" when session expires and is refreshed.
- Nakama: New "Session.Update" method to allow for in-place updates to the session object.
Changed
- Nakama: "IsConnected" and "IsConnecting" will now read directly from the underlying .NET socket status. This will allow application code to more quickly and easily detect connectivity loss arising from a lack of internet access.
- Nakama: Default socket adapter changed from "WebSocketAdapter" to "WebSocketStdlibAdapter". This was done to utilize the native .NET Websocket library for improved stability and maintenance.
Fixed
- Nakama: Trying to connect a socket that is already connecting now results in a no-op instead of an error.
[3.10.0] - 2023-11-21
Changed
- Nakama: Mark socket as connected before event handler is called.
- Nakama: Limited scope of retry logic to very specific 500-level codes from the server.
Added
- Nakama: Rank count is now returned with tournament record listings.
- Nakama: Added ability to delete tournament records with "DeleteTournamentRecordAsync".
- Nakama: Hostnames passed to the client now preserve their hardcoded paths.
- Nakama: Create and update times are now returned with notifications.
- Nakama: Added Facebook Instant Games purchase validation.
[3.9.0]
Added
- Satori: Added "recompute" option to "UpdatePropertiesAsync" which allows audiences to be recalculated on property update.
Changed
- Satori: Decreased size of JSON payloads.
Fixed
- Satori: "DeleteIdentityAsync" no longer accepts an explicit ID.
[3.8.0]
Added
- Nakama: Added "Authoritative" flag to tournaments returned from the server.
- Nakama: Added "RefundTime" and "UserId" to purchases and subscriptions returned from the server.
- Nakama: Added raw subscription provider information.
- Nakama: Added "DeleteAccountAsync" for deleting user accounts.
- Satori: Added "DeleteIdentityAsync" for deleting user identities.
Changed
- Nakama: Used "session.Username" wherever outdated state might be returned.
Fixed
- Nakama: Fixed issue where outgoing payloads could include unnecessary JSON.
[3.7.0]
Added
- Nakama: Added a "UpdatePresences" utility to "IMatch" and "IParty". Use this method to maintain the presences in your matches and parties when an "IMatchPresenceEvent" or "IPartyPresenceEvent" is dispatched.
- Satori: Added optional default and custom properties that can be attached to authentication requests.
Changed
- Satori: "GetFlagDefault" and "GetFlagsDefault" now use the "apiKey" passed to the client constructor rather than accepting it as a unique parameter.
[3.6.0]
Added
- Satori: Adds the Satori .NET SDK. Satori is our liveops server for game studios. Please read more about it on the Heroic Labs website.
- Nakama: Adds support for calling RPCs with a HTTP key via POST when a payload is provided.
- Nakama: Expose the "Logger" object on "IClient".
- Nakama: Adds support for POST RPC requests when using HTTP key with a payload
Fixed
- Nakama: Prevent race condition when "Close" is called while receive loop has an incomplete read buffer.
- Nakama: Fixed an issue where 500 errors could cause parsing issues on the client.
- Nakama: Added ability to specify "path" parameter to client urls.
Changed
- Nakama: Fixed an issue where our websocket would throw an exception on "CloseAsync()" in certain situations.
[3.5.0] - 2022-09-06
Added
- Ability to "persist" Apple, Huawei, and Google purchase receipts in the Nakama database. This is set to "true" by default in order to allow the server to detect replay attacks.
- Added a "SeenBefore" property to "IApiValidatedPurchase".
- Added "ListSubscriptionsAsync" which returns a list of the user's subscriptions.
- Added "ValidateSubscriptionAppleAsync" which returns details about a user's Apple subscription.
- Added "ValidateSubscriptionGoogleAsync" which returns details about a user's Google subscription.
- Added "GetSubscriptionAsync" which returns a subscription for the provided product id.
- Added support for "countMultiple" in "AddMatchmakerAsync" and "AddMatchmakerPartyAsync".
Changed
- "ValidatedPurchaseEnvironment" has been renamed to "ApiStoreEnvironment".
- "ValidatedPurchaseStore" has been renamed to "ApiStoreProvider".
- Removed obsolete client methods that accept a "CancellationTokenSource". These have been replaced in favor of methods that accept a "CancellationToken" that were added in v3.3.
Fixed
- Fixed an issue with Socket Closed event taking a significant length of time or not firing at all when internet connection is lost.
- Fixed an issue with "SocketClosed" event taking a significant length of time or not firing at all when internet connection is lost.
- Fixed an issue that would occur when sending messages over the socket from multiple threads.
- Fixed automatic retry seeding to be random across devices.
- Fixed an issue when parsing unquoted numbers as strings in TinyJson.
[3.4.0] - 2022-04-28
Added
- Allow max message size limit with socket messages to be overridden in the adapter.
- Relayed multiplayer matches can now be created with a custom name (i.e. room name).
Fixed
- Fix background read loop to update 'IsConnecting' and 'IsConnected' when close is detected.
[3.3.0] - 2022-01-24
Added
- Add overload methods in Client which take a CancellationToken. Thanks @gamecentric.
- Add WebSocketStdlibAdapter allows the codebase to be used in WASM and Blazor projects. Thanks @mattkanwisher.
Changed
- Use DualMode in TcpClient to handle NAT64 overlay networks (some mobile carriers).
- Refactor the socket adapter design to use Tasks (previously avoided for Unity WebGL compat.).
- Socket messages which exceed the internal buffer size now generate an "InternalBufferOverflowException" type.
- A socket connect made on an already connected socket will no longer raise an exception.
- Propagate up the "WebSocketException" type thrown on socket messages sent over a disconnected socket.
- Update bundled "Ninja.WebSockets" library to commit 0b698a733f0e8711da7a5854154fe7d8a01fbd06.
Fixed
- Expose base exception if retry handler fails.
[3.2.0] - 2021-10-11
Added
- Added additional group listing filters.
- Added ability to overwrite leaderboard/tournament ranking operators from the client.
Fixed
- Fixed url-safe encoding of query params that were passed to the client as arrays of strings.
[3.1.1] - 2021-08-19
Changed
- Removed "autoRefreshSession" from overloaded "Client" constructors. This can still be customized with the base "Client" constructor. This is a workaround for an internal compiler error in Unity's WebGL toolchain.
[3.1.0] - 2021-08-11
Added
- Added ability for user to retry requests if they fail due to a transient network error.
- Added ability for user to cancel requests that are in-flight.
[3.0.0] - 2021-07-14
Added
- The language tag for the user can be configured with the socket on connect.
Changed
- An "IPartyMatchmakerTicket" is now received by the party leader when they add their party to the matchmaker via "AddMatchmakerPartyAsync".
- Renamed "PromotePartyMember" to "PromotePartyMemberAsync".
[2.9.3] - 2021-06-17
Fixed
- Fixed issue where refreshing a session with metadata threw an exception due to the key already existing.
[2.9.2] - 2021-05-21
Fixed
- Fixed issue where "IUserPresence" objects were not being deserialized properly by the client as part of the "IParty" object.
Changed
- AddMatchmakerPartyAsync now returns an IPartyMatchmakerTicket.
- Renamed PromotePartyMember to PromotePartyMemberAsync.
[2.9.1] - 2021-05-19
Added
- The "Socket.ReceivedParty" event can now be subscribed to in order to listen for acceptance events from the leader of a closed party.
[2.9.0] - 2021-05-15
Added
- A session can be refreshed on demand with "SessionRefreshAsync" method.
- Session and/or refresh tokens can now be disabled with a client logout.
- The client now supports session auto-refresh using refresh tokens. This is enabled by default.
- New socket RPC and MatchSend methods using ArraySegment to allow developers to manage memory re-use.
- Add IAP validation APIs for purchase receipts with Apple App Store, Google Play Store, and Huawei AppGallery.
- Add Realtime Parties feature.
Changed
- Use lock object with socket operations instead of ConcurrentDictionary as a workaround for a Unity engine WebGL regression.
- Avoid use of extension methods as a workaround for a Unity engine WebGL regression.
Fixed
- Parse HTTP responses defensively in case of bad load balancer configurations.
[2.8.0] - 2020-02-19
Changed
- Listing tournaments can now be done without providing start or end time filters.
- Can now import Steam friends after authenticating or linking to a Steam account.
[2.7.1] - 2020-02-1
Fixed
- HTTP Client now properly reads off timeout value.
[2.7.0] - 2020-10-19
Changed
- Upgrade code generator to new Swagger format.
Fixed
- Properly pass server key to Apple auth calls.
[2.6.0] - 2020-09-21
Added
- Added Apple single sign-on support.
- Added Steam single sign-on support.
Fixed
- Fixed serialization of HTTP API error messages.
Changed
- Silenced a noisy but benign exception related to web socket connections.
[2.5.0] - 2020-08-12
Added
- Add parsing support for the Nakama Console API to the code generator.
- Add support for emitting custom events to the Nakama server.
- Add ban and demote API to the client.
Changed
- Update TinyJson packaged dependency to the '01c586d' commit.
- Remove usage of "System.Diagnostic.Tracing" from the codebase. This improves compatibility with Unity engine.
- Use a Preserve annotation to mark fields which should not be code stripped at build time. This improves compatibility with Unity engine.
[2.4.0] - 2020-05-04 :star:
Added
- New ListStorageObjectsAsync method and marked ListStorageObjects as obsolete.
Changed
- ListUsersStorageObjectsAsync now uses default arguments for optional inputs.
Fixed
- Prevent InvalidOperationException caused when socket connect task is already completed.
[2.3.1] - 2019-09-21
Changed
- Use workaround for IPv6 bug in TcpClient with Mono runtime used with Unity engine.
Fixed
- Add missing metadata to match join message.
- Add discrete channel identifier in all channel related messages.
[2.3.0] - 2019-09-02
Added
- Follow users by username for status updates.
- Decode session variables from the auth token.
- Paginate friends, groups, and user's group listings.
- Filter friends, groups, and user's group listings.
- Send session variables with authenticate requests.
- Socket messages now use a send timeout of 15 seconds to write to the buffer.
Changed
- Increase the default socket timeout to 30 seconds.
Fixed
- Use the connect timeout value in native socket connect attempts.
- Link the token source across socket connect and close tasks.
[2.2.2] - 2019-07-02
Changed
- Don't synchronize the socket receive with the current thread context.
- Remove workaround for Mono runtime usage with newer TLS negotation.
Fixed
- Resolve deadlock in socket dispose with synchronization context.
[2.2.1] - 2019-06-19
Added
- New comparison methods on some domain types.
Changed
- When an auth token is decoded into a session but is null or empty now return null.
Fixed
- Awaited socket callback tasks are now canceled when the socket adapter is closed and cleared.
- Awaited socket callback tasks are now canceled when the socket adapter sends while disconnected.
- Restored missing helper object with storage writes.
[2.2.0] - 2019-06-06
Added
- Add tournaments API.
- Add leaderboards around owner API.
- Provide more overload methods to the socket object for simpler usage.
Changed
- Update TinyJson packaged dependency to latest version.
- Replace WebSocketListener with a new socket library.
- Flatten use of Tasks in method responses.
Fixed
- Logger is now initialized correctly with socket debugging.
- Stream data state is correctly deserialized from socket messages.
- Fix callback ID on chat and match leave messages.
[2.1.0] - 2018-08-17
Added
- Detect socket message encodings.
- All authenticate methods can now pass in username and create options.
- Support gzip compress/decompress on ApiClient methods.
Changed
- Update the code generator to handle POST/DELETE query params.
- Match listings can now pass through "null" to indicate no filters.
- ApiClient exceptions now contain HTTP status codes.
- Update lowlevel websocket driver due to performance issues on AOT targets like iOS with Unity.
- Disable request decompression by default due to Unity+Android issue.
Fixed
- Reuse the HTTP client across all methods.
[2.0.0] - 2018-06-18
Added
This version starts at 2.0 to match the initial server version it supports.