Skip to content

WIP: [DEVEX-250] Add built-in auto-serialization #323

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 27 commits into
base: trunk
Choose a base branch
from

Conversation

oskardudycz
Copy link
Contributor

🚧 WIP

Motivation

KurrentDB users should be able to quickly feel efficient in using basic operations like appending new messages, reading them or subscribing to notifications about them. The current API is not fulfilling it as it doesn't provide safe defaults for the most common scenarios like:

  • building the state from events,
  • appending new events as an outcome of the business logic,
  • subscribing to stream etc.

Currently, they need to consider immediately in which order to read the stream, what the deadline is, and what max count to provide. And most importantly, how to serialize data and which serializer to use, as there's none. All of those customisations are needed in the end but shouldn't be thrown immediately on users if they just want to use the default recommended way. In most development environments, you can find the default, mature choices for serialization.

Such code may not be complex; once you get it right, you don't need to change it too often. But if it's stacked with multiple other things you need to keep in mind, then it's easy to miss something. Most importantly, we shouldn't require our users to build their own wrappers around KurrentDB, but we should provide an accessible API to benefit users from using KurrentDB from the get-go.

Solution

The code adds automatic serialization of message payloads. It uses JSON as a default but allows users to implement the binary format themselves. Thanks to that, user can:

  • append plain messages ,
  • use a simplified Message wrapper that takes data, and optionally metadata and message-id, this hides the unwanted complexity of EventData,
  • read messages deserialised automatically. Thanks to that, the user doesn't need to think about which resolved event is correct (event, original event, they can just use Message or DeserializedData fields).
  • subscribe to messages deserialised automatically.

To introduce those capabilities, it was necessary to introduce new methods not to make breaking changes. Having that, I benefited from it and reshaped their APIs.

Now, they just take mandatory data as parameters (e.g. stream name when appending or reading from stream) and pack the rest of the optional parameters into the options parameter. It also wraps safe defaults.

A follow up to changes the .NET Client: this and that

Note: This PR reopens #308 that was accidentally closed while working on rebrand

w1am and others added 27 commits December 16, 2024 13:27
…ptionsClient` and `EventStoreDBProjectionManagementClient`
* refactor: move ExpectedRevision to StreamState.

---------

Co-authored-by: YoEight <[email protected]>
…o make clearer responsibility on raw and auto-serialized events
…ma Regsitry, naming strategy and related settingns
@oskardudycz oskardudycz changed the base branch from trunk to DEVEX-184-Kurrent-Rebranding May 5, 2025 07:37
@oskardudycz oskardudycz changed the base branch from DEVEX-184-Kurrent-Rebranding to trunk May 5, 2025 07:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants