import type { CrdtDocLike, EventRecord, Id, InferIOAuthorize, InferIOAuthorizeUser, IOLike, JsonObject, MaybePromise, UserInfo, } from "@pluv/types"; import type { PluvClient } from "./PluvClient"; export interface AuthorizationState { token: string | null; user: Id>> | null; } export type EventResolver< TIO extends IOLike, TInput extends JsonObject, TOutput extends EventRecord, TPresence extends Record, TDocLike extends CrdtDocLike, > = ( data: TInput, context: EventResolverContext, ) => MaybePromise; export interface EventResolverContext< TIO extends IOLike, TPresence extends Record, TDocLike extends CrdtDocLike, > { doc: TDocLike; others: readonly UserInfo[]; room: string; user: UserInfo; } export type InferMetadata> = TClient extends PluvClient ? IMetadata : never; export interface InternalSubscriptions { observeCrdt: (() => void) | null; } export type MergeEventRecords< TEventRecords extends EventRecord[], TRoot extends EventRecord = {}, > = TEventRecords extends [ infer IHead extends EventRecord, ...infer ITail extends EventRecord[], ] ? MergeEventRecords< ITail, Omit & { [P in keyof IHead]: TRoot extends Record ? TRoot[P] | IHead[P] : IHead[P]; } > : Id; export interface PluvClientLimits { /** * @description Maximum size of presence object in bytes */ presenceMaxSize?: number | null; } export interface PublicKeyParams { metadata: TMetadata; } export type PublicKey = | string | ((params: PublicKeyParams) => string); export type WithMetadata = keyof TMetadata extends never ? { metadata?: undefined } : { metadata: TMetadata };