API index and search · Build metadata
Source snapshot
packages/remote/src/subscribe.ts
1import type { Mutation, MutationEnvelope, QueryId, RemoteQuery } from "@rindle/client";23import type { SubscribeClientMsg } from "./protocol.ts";45export type SubscribeMode = "flat" | "normalized";67export interface SubscribeRequest {8 queryId: QueryId;9 remote: RemoteQuery;10 mode: SubscribeMode;11}1213export type SubscribeTarget =14 | { name: string; args: unknown; leaseToken?: never; wsEndpoint?: never }15 // A lease may carry the follower's public ws endpoint (READ-ROUTER-DESIGN.md §2.3): the source16 // connects (or migrates) its transport there before subscribing. Client-side routing only — it is17 // NOT put on the wire `subscribe` frame.18 | { leaseToken: string; wsEndpoint?: string; name?: never; args?: never };1920export type SubscribeResolver = (request: SubscribeRequest) => SubscribeTarget | PromiseLike<SubscribeTarget>;2122export type RawMutationSender = (mutations: Mutation[]) => void | PromiseLike<void>;2324export type MutationEnvelopeSender = (envelope: MutationEnvelope) => void | PromiseLike<void>;2526export function defaultSubscribeTarget(request: SubscribeRequest): SubscribeTarget {27 return { name: request.remote.name, args: request.remote.args };28}2930export function subscribeMessage(request: SubscribeRequest, target: SubscribeTarget): SubscribeClientMsg {31 const mode = request.mode === "normalized" ? { mode: request.mode } : {};32 if (target.leaseToken !== undefined) {33 return { t: "subscribe", queryId: request.queryId, leaseToken: target.leaseToken, ...mode };34 }35 return { t: "subscribe", queryId: request.queryId, name: target.name, args: target.args, ...mode };36}3738export function isThenable<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {39 return value != null && typeof (value as { then?: unknown }).then === "function";40}41