EdgeAIG's picture
download
raw
5.65 kB
/**
* Derives RPC and HTTP API surfaces from clustered entities.
*
* The generated APIs let callers use ordinary RPC clients or HTTP routes while
* the cluster runtime still locates and delivers messages to the entity
* instance identified by `entityId`. Each generated operation keeps the
* original payload and success schema, adds cluster client errors, and creates
* a discard variant for fire-and-forget delivery.
*
* @since 4.0.0
*/
import * as Schema from "../../Schema.ts";
import * as HttpApiEndpoint from "../httpapi/HttpApiEndpoint.ts";
import * as HttpApiGroup from "../httpapi/HttpApiGroup.ts";
import * as Rpc from "../rpc/Rpc.ts";
import * as RpcGroup from "../rpc/RpcGroup.ts";
import { AlreadyProcessingMessage, MailboxFull, PersistenceError } from "./ClusterError.ts";
import type * as Entity from "./Entity.ts";
import type { EntityId } from "./EntityId.ts";
/**
* Derives an `RpcGroup` from an `Entity`.
*
* **Example** (Deriving RPC endpoints from an entity)
*
* ```ts
* import { Layer, Schema } from "effect"
* import { ClusterSchema, Entity, EntityProxy, EntityProxyServer } from "effect/unstable/cluster"
* import { Rpc, RpcServer } from "effect/unstable/rpc"
*
* export const Counter = Entity.make("Counter", [
* Rpc.make("Increment", {
* payload: { id: Schema.String, amount: Schema.Number },
* primaryKey: ({ id }) => id,
* success: Schema.Number
* })
* ]).annotateRpcs(ClusterSchema.Persisted, true)
*
* // Use EntityProxy.toRpcGroup to create a `RpcGroup` from the Counter entity
* export class MyRpcs extends EntityProxy.toRpcGroup(Counter) {}
*
* // Use EntityProxyServer.layerRpcHandlers to create a layer that implements
* // the rpc handlers
* const RpcServerLayer = RpcServer.layer(MyRpcs).pipe(
* Layer.provide(EntityProxyServer.layerRpcHandlers(Counter))
* )
* ```
*
* @category constructors
* @since 4.0.0
*/
export declare const toRpcGroup: <Type extends string, Rpcs extends Rpc.Any>(entity: Entity.Entity<Type, Rpcs>) => RpcGroup.RpcGroup<ConvertRpcs<Rpcs, Type>>;
/**
* Type-level conversion used by `toRpcGroup`.
*
* **Details**
*
* For each entity RPC, this creates a prefixed request RPC and a discard RPC
* whose payload includes `entityId`, and whose errors include cluster client
* errors.
*
* @category converting
* @since 4.0.0
*/
export type ConvertRpcs<Rpcs extends Rpc.Any, Prefix extends string> = Rpcs extends Rpc.Rpc<infer _Tag, infer _Payload, infer _Success, infer _Error, infer _Middleware, infer _Requires> ? Rpc.Rpc<`${Prefix}.${_Tag}`, Schema.Struct<{
entityId: typeof Schema.String;
payload: _Payload;
}>, _Success, Schema.Codec<_Error["Type"] | MailboxFull | AlreadyProcessingMessage | PersistenceError, _Error["Encoded"] | typeof MailboxFull["Encoded"] | typeof AlreadyProcessingMessage["Encoded"] | typeof PersistenceError["Encoded"], _Error["DecodingServices"], _Error["EncodingServices"]>> | Rpc.Rpc<`${Prefix}.${_Tag}Discard`, Schema.Struct<{
entityId: typeof Schema.String;
payload: _Payload;
}>, typeof Schema.Void, Schema.Union<[
typeof MailboxFull,
typeof AlreadyProcessingMessage,
typeof PersistenceError
]>> : never;
/**
* Derives an `HttpApiGroup` from an `Entity`.
*
* **Example** (Deriving HTTP API endpoints from an entity)
*
* ```ts
* import { Layer, Schema } from "effect"
* import { ClusterSchema, Entity, EntityProxy, EntityProxyServer } from "effect/unstable/cluster"
* import { HttpApi, HttpApiBuilder } from "effect/unstable/httpapi"
* import { Rpc } from "effect/unstable/rpc"
*
* export const Counter = Entity.make("Counter", [
* Rpc.make("Increment", {
* payload: { id: Schema.String, amount: Schema.Number },
* primaryKey: ({ id }) => id,
* success: Schema.Number
* })
* ]).annotateRpcs(ClusterSchema.Persisted, true)
*
* // Use EntityProxy.toHttpApiGroup to create a `HttpApiGroup` from the
* // Counter entity
* export class MyApi extends HttpApi.make("api")
* .add(
* EntityProxy.toHttpApiGroup("counter", Counter)
* .prefix("/counter")
* )
* {}
*
* // Use EntityProxyServer.layerHttpApi to create a layer that implements
* // the handlers for the HttpApiGroup
* const ApiLayer = HttpApiBuilder.layer(MyApi).pipe(
* Layer.provide(EntityProxyServer.layerHttpApi(MyApi, "counter", Counter))
* )
* ```
*
* @category constructors
* @since 4.0.0
*/
export declare const toHttpApiGroup: <const Name extends string, Type extends string, Rpcs extends Rpc.Any>(name: Name, entity: Entity.Entity<Type, Rpcs>) => HttpApiGroup.HttpApiGroup<Name, ConvertHttpApi<Rpcs>>;
/**
* Type-level conversion used by `toHttpApiGroup`.
*
* **Details**
*
* For each entity RPC, this creates a POST endpoint at `/<tag>/:entityId` and a
* discard endpoint at `/<tag>/:entityId/discard`, including cluster client
* errors.
*
* @category converting
* @since 4.0.0
*/
export type ConvertHttpApi<Rpcs extends Rpc.Any> = Rpcs extends Rpc.Rpc<infer _Tag, infer _Payload, infer _Success, infer _Error, infer _Middleware, infer _Requires> ? HttpApiEndpoint.HttpApiEndpoint<_Tag, "POST", `/${Lowercase<_Tag>}/:entityId`, Schema.Struct<{
entityId: typeof EntityId;
}>, never, _Payload, never, _Success, _Error | typeof MailboxFull | typeof AlreadyProcessingMessage | typeof PersistenceError> | HttpApiEndpoint.HttpApiEndpoint<`${_Tag}Discard`, "POST", `/${Lowercase<_Tag>}/:entityId/discard`, Schema.Struct<{
entityId: typeof EntityId;
}>, never, _Payload, never, Schema.Void, typeof MailboxFull | typeof AlreadyProcessingMessage | typeof PersistenceError> : never;
//# sourceMappingURL=EntityProxy.d.ts.map

Xet Storage Details

Size:
5.65 kB
·
Xet hash:
2655f3f44297997a5bea04d0548dc9fbc03a1ddea8fe343fbe1cd2165cff9057

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.