-
Notifications
You must be signed in to change notification settings - Fork 645
Add Rust client SDK bindings for calling procedures #3532
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
base: master
Are you sure you want to change the base?
Conversation
This commit adds support to the Rust client SDK for calling procedures. Similar to reducers, each `DbContext` implementor has a `pub procedures: RemoteProcedures` field, with methods provided by extension traits for each procedure. Unlike reducers, the provided methods are invoke and invoke-then. Invoke-then takes a `FnOnce` callback to run when the SDK is notified of the procedure's termination status, while invoke ignores that notification. No mechanism is provided for observing procedures invoked by other clients. Procedure callbacks are implemented by storing a map from `request_id` to `ProcedureCallback`, with the callback closure internally knowing how to deserialize the return value. It's mildly unfortunate to deserialize within the callback instead of on the preprocess background task, but it saves significant complexity. This commit also adds a new sdk-test module, `sdk-test-procedures`, and a new Rust test client, `procedure-client`. Together, these are used in two tests of invoking and observing procedures. I've left TODOs for other tests that we should write as we implement additional procedure features.
|
Closes #3513 |
…SpacetimeDB into phoebe/procedure/rust-sdk
We're generating empty files for C# and TypeScript bindings for now, which still appear in the snaps
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, just some minor things.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approving my code owned files.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me, just adding into Unreal + C# now
Description of Changes
This commit adds support to the Rust client SDK for calling procedures.
Similar to reducers, each
DbContextimplementor has apub procedures: RemoteProceduresfield, with methods provided by extension traits for each procedure.Unlike reducers, the provided methods are invoke and invoke-then. Invoke-then takes a
FnOncecallback to runwhen the SDK is notified of the procedure's termination status, while invoke ignores that notification.
No mechanism is provided for observing procedures invoked by other clients.
Procedure callbacks are implemented by storing a map from
request_idtoProcedureCallback, with the callback closure internally knowing how to deserialize the return value. It's mildly unfortunate to deserialize within the callback instead of on the preprocess background task, but it saves significant complexity.This commit also adds a new sdk-test module,
sdk-test-procedures, and a new Rust test client,procedure-client.Together, these are used in two tests of invoking and observing procedures. I've left TODOs for other tests that we should write as we implement additional procedure features.
I also had to fix a few minor bugs in the Rust codegen which were not strictly related to procedures: we previously assumed that the sets of reducers and of tables were non-empty, which led to wonky invalid codegen on modules which did not define any reducers or which did not define any tables.
API and ABI breaking changes
Breaks the internal interface between the Rust client SDK and codegen, so users will have to re-run
spacetime generate.Expected complexity level and risk
2-ish? Pretty simple change to the Rust SDK overall.
Testing