import * as Ref from "effect/Ref"; import { Rpc } from "effect/unstable/rpc"; import { type ClientForOptions } from "../client/clientFor.js"; import * as Context from "../Context.js"; import * as Effect from "../Effect.js"; import * as S from "../Schema.js"; /** * Shorthand for a handler-derived invalidation key. * Accepts an RPC handler object so `add(GetMe)` is equivalent to * `add(makeQueryKey(GetMe))`. */ export type InvalidationKeyInput = InvalidationKey | { readonly id: string; readonly options?: ClientForOptions; }; /** * A single segment within an `InvalidationKey` array. * Accepts any JSON-compatible value: string, number, boolean, null, * arrays and objects recursively — matching TanStack Query's `queryKey` element type. */ export declare const InvalidationKeySegment: S.Codec; export type InvalidationKeySegment = S.Schema.Type; /** Schema for a single invalidation key – an array of segments compatible with TanStack Query `queryKey`. */ export declare const InvalidationKey: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }; export type InvalidationKey = S.Schema.Type; /** Schema for the full set of invalidation keys – an array of `InvalidationKey`. */ export declare const InvalidationKeys: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; export type InvalidationKeys = S.Schema.Type; /** Metadata included in every command response for server-driven cache invalidation. */ export declare const CommandMetaData: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; export type CommandMetaData = S.Schema.Type; /** * Wraps a command's success schema so that the wire format carries both the `payload` * (the handler's actual return value) and `metadata` (server-driven cache invalidation keys). * Transparent to users: the server handler returns the plain payload and the client receives * the plain payload — wrapping/unwrapping is handled internally by the routing layer. */ export declare const CommandResponseWithMetaData: (success: S) => S.Struct<{ readonly payload: S; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>; /** * Wraps a command's failure schema so that the wire format carries both the `error` * (the handler's actual failure value) and `metadata` (server-driven cache invalidation keys * accumulated thus far before the failure occurred). * Transparent to users: the server handler fails with the plain error and the client receives * the plain error — wrapping/unwrapping is handled internally by the routing layer. */ export declare const CommandFailureWithMetaData: (error: E) => S.Struct<{ readonly _tag: S.Literal<"CommandFailureWithMetaData">; readonly error: E; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>; /** * Stream chunk schema for stream responses with metadata. * Each item is either a data value, an intermediate "metadata" signal carrying cache * invalidation keys accumulated since the previous drain, or a final "done" signal. * Transparent to users: stream handlers return plain values and clients receive plain values — * wrapping/unwrapping is handled internally by the routing layer. * * The "done" chunk is always the last item in the stream and carries any remaining invalidation * keys. An optional "metadata" chunk may appear after any "value" chunk and carries keys * accumulated since the last drain (V3: mid-stream invalidation). */ export declare const StreamResponseChunk: (success: S) => S.Union; readonly value: S; }>, S.Struct<{ readonly _tag: S.Literal<"metadata">; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>, S.Struct<{ readonly _tag: S.Literal<"done">; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>]>; export type StreamResponseChunk = { readonly _tag: "value"; readonly value: A; } | { readonly _tag: "metadata"; readonly metadata: CommandMetaData; } | { readonly _tag: "done"; readonly metadata: CommandMetaData; }; /** * Stream chunk schema for stream failures with metadata. * Used to signal a stream failure while still carrying cache invalidation keys * accumulated thus far. */ export declare const StreamFailureChunk: (error: E) => S.Struct<{ readonly _tag: S.Literal<"error">; readonly error: E; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>; export type StreamFailureChunk = { readonly _tag: "error"; readonly error: E; readonly metadata: CommandMetaData; }; /** * Context annotation for declaring static cache invalidation keys on a low-level `Rpc` definition. * These keys are always included in the command response metadata, regardless of the handler logic. * * Prefer using `makeQueryKey` over raw string arrays to stay in sync with the actual query * definitions without manual string maintenance: * * ```ts * import { makeQueryKey } from "effect-app/client" * import { Invalidation } from "effect-app/rpc" * import * as UserRsc from "../User/index.js" // separate module to avoid circular deps * * class UpdateProfile extends Rpc.make("UpdateProfile", { ... }) * .annotate(Invalidation.Invalidates, [makeQueryKey(UserRsc.GetMe), makeQueryKey(UserRsc.GetProfile)]) {} * ``` * * **Circular dependency note:** if mutations and queries live in the same file you may hit a * circular reference at evaluation time. The idiomatic fix is to move mutations into their own * module (e.g. `User/mutations.ts`) that directly imports the relevant query classes rather than * re-exporting them through a barrel. * * For the higher-level `Command`/`Query` builders from `makeRpcClient`, use the * `invalidatesQueries` callback argument instead (it receives the same query keys at runtime). */ export declare const Invalidates: Context.Reference; export type Invalidates = typeof Invalidates; /** The shape of the per-request service that accumulates invalidation keys. */ export interface InvalidationSetService { readonly add: (input: InvalidationKeyInput | ReadonlyArray) => Effect.Effect; readonly get: Effect.Effect>; /** * V3: Reads all currently accumulated keys and resets the bucket to empty. * Used by the stream routing layer to emit intermediate "metadata" chunks * without re-sending keys that have already been forwarded to the client. */ readonly drain: Effect.Effect>; } /** * Request-scoped service for accumulating invalidation keys dynamically inside a handler. * Provided by `InvalidationMiddlewareLive` for every RPC call; has a no-op default so it is * safe to use even when the HTTP middleware is absent (tests, workers, etc.). * * Use `InvalidationSet.add(key)` as a shorthand to skip `.use(_ => _.add(key))`. The * underlying service is still available via `.use` / `.useSync` for advanced cases. * * `add` accepts an RPC handler directly (e.g. `UserRsc.GetMe`) — its query key is derived via * `makeQueryKey` so keys stay in sync with the actual query definitions. Raw `InvalidationKey` * arrays and arrays of either form are also accepted. * * ```ts * import * as Effect from "effect/Effect" * import { Invalidation } from "effect-app/rpc" * import * as CartRsc from "../Cart/queries.js" * import * as UserRsc from "../User/queries.js" * * const handler = Effect.fnUntraced(function*(req: UpdateCartRequest) { * const cart = yield* CartRepo.save(req.cart) * * // single handler * yield* Invalidation.InvalidationSet.add(UserRsc.GetMe) * * // batch * if (cart.isCheckedOut) { * yield* Invalidation.InvalidationSet.add([CartRsc.GetCartStats, UserRsc.GetMe]) * } * * return cart * }) * ``` * * You can combine static (`Invalidates` annotation) and dynamic (`InvalidationSet.use`) keys: * the annotation pre-populates the set before the handler runs; dynamic additions accumulate * throughout the handler. All keys are included in the command response metadata. */ declare const InvalidationSetRef: Context.Reference; export declare const InvalidationSet: Context.Reference & { /** * Shortcut for `InvalidationSet.use(_ => _.add(input))`. Accepts a single * `InvalidationKeyInput` or an array of them. */ add: (input: InvalidationKeyInput | ReadonlyArray) => Effect.Effect; }; export type InvalidationSet = typeof InvalidationSetRef; /** Creates a fresh `InvalidationSet` implementation backed by a `Ref`. */ export declare const makeInvalidationSet: (ref: Ref.Ref>) => InvalidationSetService; /** * `Rpc.Custom` definition for command RPCs that wrap the success/error schemas * with `CommandResponseWithMetaData` / `CommandFailureWithMetaData`. The wrap * lets server forward accumulated invalidation keys on both success and * handler-thrown failure paths. Middleware-thrown errors bypass the wrap * (the handler never ran, so no metadata) and flow raw at the Cause level — * the client decodes them via the `rpc.middlewares[*].error` failure-union * channel of `Rpc.exitSchema`. */ export interface CommandRpc extends Rpc.Custom { readonly out: Rpc.Custom.Out>, ReturnType>>; } /** * Custom Rpc constructor for command RPCs. * Wraps the success schema with `CommandResponseWithMetaData` and the error * schema with `CommandFailureWithMetaData`. */ export declare const makeCommandRpc: > & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>, S.Struct<{ readonly _tag: S.Literal<"CommandFailureWithMetaData">; readonly error: S.Top & Error; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>>>(tag: Tag, options?: { readonly payload?: Payload; readonly success?: Success; readonly error?: Error; readonly defect?: Rpc.DefectSchema; readonly stream?: Stream; readonly primaryKey?: [Payload] extends [import("effect/Schema").Struct.Fields] ? (payload: Payload extends import("effect/Schema").Struct.Fields ? (import("effect/Schema").Struct.Type_, import("effect/Schema").Struct.TypeMutableKeys> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never) extends infer T ? { [K in keyof T]: T[K]; } : never : Payload["Type"]) => string : never; } | undefined) => Rpc.Rpc : Payload, Stream extends true ? import("effect/unstable/rpc/RpcSchema").Stream : Out["success"], Stream extends true ? S.Never : Out["error"], never, never>; /** * `Rpc.Custom` definition for stream RPCs that wrap the success/error schemas * with `StreamResponseChunk` / `StreamFailureChunk`. */ export interface StreamRpc extends Rpc.Custom { readonly out: Rpc.Custom.Out>, ReturnType>>; } /** * Custom Rpc constructor for stream RPCs. * Wraps the success schema with `StreamResponseChunk` and * the error schema with `StreamFailureChunk`. */ export declare const makeStreamRpc: ; readonly value: S.Top & Success; }>, S.Struct<{ readonly _tag: S.Literal<"metadata">; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>, S.Struct<{ readonly _tag: S.Literal<"done">; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>]>, S.Struct<{ readonly _tag: S.Literal<"error">; readonly error: S.Top & Error; readonly metadata: S.Struct<{ readonly invalidateQueries: S.$Array> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }> & { withConstructorDefault: S.withConstructorDefault> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>>; withDecodingDefaultType: S.withDecodingDefaultType> & { withConstructorDefault: S.withConstructorDefault>>; withDecodingDefaultType: S.withDecodingDefaultType>, never>; }>, never>; }; }>; }>>>(tag: Tag, options?: { readonly payload?: Payload; readonly success?: Success; readonly error?: Error; readonly defect?: Rpc.DefectSchema; readonly stream?: Stream; readonly primaryKey?: [Payload] extends [import("effect/Schema").Struct.Fields] ? (payload: Payload extends import("effect/Schema").Struct.Fields ? (import("effect/Schema").Struct.Type_, import("effect/Schema").Struct.TypeMutableKeys> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never) extends infer T ? { [K in keyof T]: T[K]; } : never : Payload["Type"]) => string : never; } | undefined) => Rpc.Rpc : Payload, Stream extends true ? import("effect/unstable/rpc/RpcSchema").Stream : Out["success"], Stream extends true ? S.Never : Out["error"], never, never>; export {}; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52YWxpZGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnBjL0ludmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQTtBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDekMsT0FBTyxFQUFFLEtBQUssZ0JBQWdCLEVBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFDNUUsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDdEMsT0FBTyxLQUFLLENBQUMsTUFBTSxjQUFjLENBQUE7QUFFakM7Ozs7R0FJRztBQUNILE1BQU0sTUFBTSxvQkFBb0IsR0FBRyxlQUFlLEdBQUc7SUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztJQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQTtDQUFFLENBQUE7QUFtQmpIOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sc0JBQXNCLHVDQUFTLENBQUE7QUFDNUMsTUFBTSxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sc0JBQXNCLENBQUMsQ0FBQTtBQUVqRiw2R0FBNkc7QUFDN0csZUFBTyxNQUFNLGVBQWU7OztDQUFrQyxDQUFBO0FBQzlELE1BQU0sTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxlQUFlLENBQUMsQ0FBQTtBQUVuRSxvRkFBb0Y7QUFDcEYsZUFBTyxNQUFNLGdCQUFnQjs7Ozs7Ozs7Ozs7O0NBQTJCLENBQUE7QUFDeEQsTUFBTSxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUVyRSx3RkFBd0Y7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