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.
- Satori: Added
IApiLiveEvent.Id
for accessing live event identifiers. - Satori: Added support for new Satori Messages API:
IClient.GetMessageListAsync
,IClient.UpdateMessageAsync
andIClient.DeleteMessageAsync
.
- Nakama: New
IClient
event calledReceivedSessionUpdated
when session expires and is refreshed. - Nakama: New
Session.Update
method to allow for in-place updates to the session object.
- Nakama:
IsConnected
andIsConnecting
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
toWebSocketStdlibAdapter
. This was done to utilize the native .NET Websocket library for improved stability and maintenance.
- Nakama: Trying to connect a socket that is already connecting now results in a no-op instead of an error.
- 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.
- 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.
- Satori: Added
recompute
option toUpdatePropertiesAsync
which allows audiences to be recalculated on property update.
- Satori: Decreased size of JSON payloads.
- Satori:
DeleteIdentityAsync
no longer accepts an explicit ID.
- Nakama: Added
Authoritative
flag to tournaments returned from the server. - Nakama: Added
RefundTime
andUserId
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.
- Nakama: Used
session.Username
wherever outdated state might be returned.
- Nakama: Fixed issue where outgoing payloads could include unnecessary JSON.
- Nakama: Added a
UpdatePresences
utility toIMatch
andIParty
. Use this method to maintain the presences in your matches and parties when anIMatchPresenceEvent
orIPartyPresenceEvent
is dispatched. - Satori: Added optional default and custom properties that can be attached to authentication requests.
- Satori:
GetFlagDefault
andGetFlagsDefault
now use theapiKey
passed to the client constructor rather than accepting it as a unique parameter.
- 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 onIClient
. - Nakama: Adds support for POST RPC requests when using HTTP key with a payload
- 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.
- Nakama: Fixed an issue where our websocket would throw an exception on
CloseAsync()
in certain situations.
- Ability to
persist
Apple, Huawei, and Google purchase receipts in the Nakama database. This is set totrue
by default in order to allow the server to detect replay attacks. - Added a
SeenBefore
property toIApiValidatedPurchase
. - 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
inAddMatchmakerAsync
andAddMatchmakerPartyAsync
.
ValidatedPurchaseEnvironment
has been renamed toApiStoreEnvironment
.ValidatedPurchaseStore
has been renamed toApiStoreProvider
.- Removed obsolete client methods that accept a
CancellationTokenSource
. These have been replaced in favor of methods that accept aCancellationToken
that were added in v3.3.
- 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.
- 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).
- Fix background read loop to update 'IsConnecting' and 'IsConnected' when close is detected.
- 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.
- 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.
- Expose base exception if retry handler fails.
- Added additional group listing filters.
- Added ability to overwrite leaderboard/tournament ranking operators from the client.
- Fixed url-safe encoding of query params that were passed to the client as arrays of strings.
- Removed
autoRefreshSession
from overloadedClient
constructors. This can still be customized with the baseClient
constructor. This is a workaround for an internal compiler error in Unity's WebGL toolchain.
- 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.
- The language tag for the user can be configured with the socket on connect.
- An
IPartyMatchmakerTicket
is now received by the party leader when they add their party to the matchmaker viaAddMatchmakerPartyAsync
. - Renamed
PromotePartyMember
toPromotePartyMemberAsync
.
- Fixed issue where refreshing a session with metadata threw an exception due to the key already existing.
- Fixed issue where
IUserPresence
objects were not being deserialized properly by the client as part of theIParty
object.
- AddMatchmakerPartyAsync now returns an IPartyMatchmakerTicket.
- Renamed PromotePartyMember to PromotePartyMemberAsync.
- The
Socket.ReceivedParty
event can now be subscribed to in order to listen for acceptance events from the leader of a closed party.
- 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.
- 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.
- Parse HTTP responses defensively in case of bad load balancer configurations.
- 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.
- HTTP Client now properly reads off timeout value.
- Upgrade code generator to new Swagger format.
- Properly pass server key to Apple auth calls.
- Added Apple single sign-on support.
- Added Steam single sign-on support.
- Fixed serialization of HTTP API error messages.
- Silenced a noisy but benign exception related to web socket connections.
- 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.
- 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.
- New ListStorageObjectsAsync method and marked ListStorageObjects as obsolete.
- ListUsersStorageObjectsAsync now uses default arguments for optional inputs.
- Prevent InvalidOperationException caused when socket connect task is already completed.
- Use workaround for IPv6 bug in TcpClient with Mono runtime used with Unity engine.
- Add missing metadata to match join message.
- Add discrete channel identifier in all channel related messages.
- 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.
- Increase the default socket timeout to 30 seconds.
- Use the connect timeout value in native socket connect attempts.
- Link the token source across socket connect and close tasks.
- Don't synchronize the socket receive with the current thread context.
- Remove workaround for Mono runtime usage with newer TLS negotation.
- Resolve deadlock in socket dispose with synchronization context.
- New comparison methods on some domain types.
- When an auth token is decoded into a session but is null or empty now return null.
- 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.
- Add tournaments API.
- Add leaderboards around owner API.
- Provide more overload methods to the socket object for simpler usage.
- Update TinyJson packaged dependency to latest version.
- Replace WebSocketListener with a new socket library.
- Flatten use of Tasks in method responses.
- 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.
- Detect socket message encodings.
- All authenticate methods can now pass in username and create options.
- Support gzip compress/decompress on ApiClient methods.
- 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.
- Reuse the HTTP client across all methods.
- Initial public release.
This version starts at 2.0 to match the initial server version it supports.