Suite of AT Protocol TypeScript libraries built on web standards
1import type { Infer, Validator } from "../validation.ts";
2
3export type LexBody<E extends string = any> = E extends `text/${string}`
4 ? string
5 : E extends "application/json" ? unknown
6 : Uint8Array;
7
8type InferPayloadBodyType<E extends string, B> = E extends `text/${string}`
9 ? string
10 : E extends "application/json" ? unknown
11 : B;
12
13export type InferPayload<P extends Payload, B = Uint8Array> = P extends
14 Payload<infer E, infer S>
15 ? E extends string ? S extends Validator ? { encoding: E; body: Infer<S> }
16 : { encoding: E; body: InferPayloadBodyType<E, B> }
17 : undefined
18 : undefined;
19
20export type InferPayloadEncoding<P extends Payload> = P extends
21 Payload<infer E, any> ? E : undefined;
22
23export type InferPayloadBody<P extends Payload, B = Uint8Array> = P extends
24 Payload<any, infer S> ? S extends Validator ? Infer<S>
25 : P extends Payload<infer E extends string> ? InferPayloadBodyType<E, B>
26 : undefined
27 : undefined;
28
29export type PayloadOutput<
30 E extends string | undefined = any,
31 S extends Validator | undefined = any,
32 B = Uint8Array,
33> = E extends string ? S extends Validator ? { encoding: E; body: Infer<S> }
34 : { encoding: E; body: InferPayloadBodyType<E, B> }
35 : void;
36
37export type PayloadBody<E extends string | undefined> = E extends undefined
38 ? undefined
39 : Validator | undefined;
40
41export class Payload<
42 const Encoding extends string | undefined = string | undefined,
43 const Body extends PayloadBody<Encoding> = PayloadBody<Encoding>,
44> {
45 constructor(
46 readonly encoding: Encoding,
47 readonly schema: Body,
48 ) {
49 if (encoding === undefined && schema !== undefined) {
50 throw new TypeError(
51 "schema cannot be defined when encoding is undefined",
52 );
53 }
54 }
55}