API reference / @evolu/common / Resources / createResources

Function: createResources()

function createResources<
  TResource,
  TResourceKey,
  TResourceConfig,
  TConsumer,
  TConsumerId,
>(
  config,
): Resources<TResource, TResourceKey, TResourceConfig, TConsumer, TConsumerId>;

Defined in: packages/common/src/Resources.ts:168

Creates Resources.

This tracks which consumers are using which resources and maintains reference counts to know when it's safe to dispose resources. Resources are created on-demand and disposed with a configurable delay to avoid churn.

Example Usage

// WebSocket connections
interface WebSocketConfig {
  readonly url: WebSocketUrl;
}

type WebSocketUrl = string & Brand<"WebSocketUrl">;
type UserId = string & Brand<"UserId">;

const webSockets = createResources<
  WebSocket,
  WebSocketUrl,
  WebSocketConfig,
  User,
  UserId
>({
  createResource: (config) => new WebSocket(config.url),
  getResourceKey: (config) => config.url,
  getConsumerId: (user) => user.id,
  disposalDelay: 1000,
});

// Add users to WebSocket connections
webSockets.addConsumer(user1, [
  { url: "ws://server1.com" as WebSocketUrl },
  { url: "ws://server2.com" as WebSocketUrl },
]);
webSockets.addConsumer(user2, [{ url: "ws://server1.com" as WebSocketUrl }]);

// Remove users - server1 stays alive (user2 still using it)
webSockets.removeConsumer(user1, [
  { url: "ws://server1.com" as WebSocketUrl },
  { url: "ws://server2.com" as WebSocketUrl },
]);

// server2 gets disposed after delay, server1 stays alive

Type Parameters

Type Parameter
TResource extends Disposable
TResourceKey extends string
TResourceConfig
TConsumer
TConsumerId extends string

Parameters

ParameterType
configResourcesConfig<TResource, TResourceKey, TResourceConfig, TConsumer, TConsumerId>

Returns

Resources<TResource, TResourceKey, TResourceConfig, TConsumer, TConsumerId>

Was this page helpful?