Actions
Actions are how clients & other actors communicate with actors. Actions are defined as functions in the actor configuration and can be called from clients.
Performance
Actions are very lightweight. They can be called hundreds of times per second to send realtime data to the actor.
Writing Actions
Actions are defined in the actions
object when creating an actor:
Each action receives a context object (commonly named c
) as its first parameter, which provides access to state, connections, and other utilities. Additional parameters follow after that.
Private Helper Functions
You can define helper functions outside the actions object to keep your code organized. These functions cannot be called directly by clients:
Streaming Return Data
Actions have a single return value. To stream realtime data in response to an action, use events.
Calling Actions
Calling actions from the client is simple:
Calling actions from the client are async and require an await
, even if the action itself is not async.
Type Safety
The actor client includes type safety out of the box. When you use createClient<App>()
, TypeScript automatically infers action parameter and return types:
Error Handling
Actors provide robust error handling out of the box for actions.
User Errors
UserError
can be used to return rich error data to the client. You can provide:
- A human-readable message
- A machine-readable code that’s useful for matching errors in a try-catch (optional)
- A metadata object for providing richer error context (optional)
For example:
Internal Errors
All other errors will return an error with the code internal_error
to the client. This helps keep your application secure, as errors can sometimes expose sensitive information.
Schema Validation
Data schemas are not validated by default. For production applications, use a library like zod to validate input types.
For example, to validate action parameters:
Native runtime type validation is coming soon to ActorCore.
Authentication
By default, clients can call all actions on an actor without restriction. Make sure to implement authentication if needed. Documentation on authentication is available here.
Using ActionContext
Type Externally
When writing complex logic for actions, you may want to extract parts of your implementation into separate helper functions. When doing this, you’ll need a way to properly type the context parameter.
ActorCore provides the ActionContextOf
utility type for exactly this purpose:
See Helper Types for more details on using ActionContextOf
and other type utilities.