import { Result, URI } from "@adviser/cement"; import { NotFoundError } from "@fireproof/core-types-base"; import { FPEnvelope, FPEnvelopeMeta } from "./fp-envelope.js"; import { type Loadable } from "./types.js"; import { FPDecoder, type FPEncoder } from "./fp-envelope-serialize.js"; export interface SerdeGatewayOpts { readonly gateway: SerdeGateway; } export type SerdeGetResult = Result, NotFoundError | Error>; export type VoidResult = Result; export type UnsubscribeResult = Result<() => void>; export interface SerdeGatewayCtx { readonly loader: Loadable; readonly encoder?: Partial; readonly decoder?: Partial; } export interface SerdeGateway { buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise>; start(ctx: SerdeGatewayCtx, baseUrl: URI): Promise>; close(ctx: SerdeGatewayCtx, baseUrl: URI): Promise; put(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope): Promise; get(ctx: SerdeGatewayCtx, url: URI): Promise>; delete(ctx: SerdeGatewayCtx, url: URI): Promise; subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise): Promise; getPlain(ctx: SerdeGatewayCtx, url: URI, key: string): Promise>; destroy(ctx: SerdeGatewayCtx, baseUrl: URI): Promise; } export interface SerdeGatewayReturn { readonly op: O; readonly value?: T; readonly stop?: boolean; } export interface SerdeGatewayBuildUrlOp { readonly url: URI; readonly key: string; } export type SerdeGatewayBuildUrlReturn = SerdeGatewayReturn>; export interface SerdeGatewayStartOp { readonly url: URI; } export type SerdeGatewayStartReturn = SerdeGatewayReturn>; export interface SerdeGatewayCloseOp { readonly url: URI; } export type SerdeGatewayCloseReturn = SerdeGatewayReturn; export interface SerdeGatewayDestroyOp { readonly url: URI; } export type SerdeGatewayDestroyReturn = SerdeGatewayReturn; export interface SerdeGatewayPutOp { readonly url: URI; readonly body: FPEnvelope; } export type SerdeGatewayPutReturn = SerdeGatewayReturn, VoidResult>; export interface SerdeGatewayGetOp { readonly url: URI; } export type SerdeGatewayGetReturn = SerdeGatewayReturn>; export interface SerdeGatewayDeleteOp { readonly url: URI; } export type SerdeGatewayDeleteReturn = SerdeGatewayReturn; export interface SerdeGatewaySubscribeOp { readonly url: URI; readonly callback: (meta: FPEnvelopeMeta) => Promise; } export type SerdeGatewaySubscribeReturn = SerdeGatewayReturn; export interface SerdeGatewayInterceptor { buildUrl(ctx: SerdeGatewayCtx, baseUrl: URI, key: string): Promise>; start(ctx: SerdeGatewayCtx, baseUrl: URI): Promise>; close(ctx: SerdeGatewayCtx, baseUrl: URI): Promise>; delete(ctx: SerdeGatewayCtx, baseUrl: URI): Promise>; destroy(ctx: SerdeGatewayCtx, baseUrl: URI): Promise>; put(ctx: SerdeGatewayCtx, url: URI, body: FPEnvelope): Promise>>; get(ctx: SerdeGatewayCtx, url: URI): Promise>>; subscribe(ctx: SerdeGatewayCtx, url: URI, callback: (meta: FPEnvelopeMeta) => Promise): Promise>; }