Nakama .NET Client 3.17.0
The official Nakama and Satori .NET client.
Loading...
Searching...
No Matches
Changelog

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

  • Initial public release.

This version starts at 2.0 to match the initial server version it supports.