API reference › @evolu/common › Callbacks › Callbacks

Defined in: packages/common/src/Callbacks.ts:75

Request-response correlation for callbacks across boundaries.

Stores callbacks with unique IDs and executes them once with an optional argument. Executed callbacks are automatically removed. A callback whose response will never come is removed with unregister.

This is useful for correlating asynchronous request-response operations across boundaries where callback functions cannot be passed directly (e.g., web workers, message queues).

The execute method intentionally does not use try-catch or Result because it's the callback's responsibility to handle its own errors.

Correlating callback responses

import { assertEqual, createCallbacks, testCreateDeps } from "@evolu/common";

const deps = testCreateDeps();

// No-argument callback
using callbacks = createCallbacks(deps);
let noArgumentCalls = 0;
const noArgumentId = callbacks.register(() => {
  noArgumentCalls++;
});
callbacks.execute(noArgumentId);
callbacks.execute(noArgumentId);
assertEqual(noArgumentCalls, 1);

// A callback whose response will never come
const failedId = callbacks.register(() => {
  noArgumentCalls++;
});
callbacks.unregister(failedId);
callbacks.execute(failedId);
assertEqual(noArgumentCalls, 1);

// Typed callback
using stringCallbacks = createCallbacks<string>(deps);
let received = "";
const stringCallbackId = stringCallbacks.register((value) => {
  received = value;
});
stringCallbacks.execute(stringCallbackId, "hello");
assertEqual(received, "hello");

// Promise.withResolvers
using promiseCallbacks = createCallbacks<string>(deps);
const { promise, resolve } = Promise.withResolvers<string>();
const promiseCallbackId = promiseCallbacks.register(resolve);
promiseCallbacks.execute(promiseCallbackId, "resolved value");
assertEqual(await promise, "resolved value");

Extends

Methods

[dispose]()

[dispose](): void;

Defined in: node_modules/@typescript/old/lib/lib.esnext.disposable.d.ts:34

Inherited from

Disposable.[dispose]

Properties

execute

readonly execute: T extends undefined ? (id: string & Brand<"Id">) => undefined : (id: string & Brand<"Id">, arg: T) => undefined;

Defined in: packages/common/src/Callbacks.ts:80

Executes and removes a callback associated with the given ID.


register

readonly register: (callback: Callback<T>) => string & Brand<"Id">;

Defined in: packages/common/src/Callbacks.ts:77

Registers a callback function and returns a unique ID.


unregister

readonly unregister: (id: string & Brand<"Id">) => void;

Defined in: packages/common/src/Callbacks.ts:85

Removes a callback associated with the given ID without executing it.