better-grpc 0.0.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+
3
+ type Context<Meta extends z.ZodObject<any> | undefined> = {
4
+ metadata: Meta extends z.ZodObject<any> ? z.infer<Meta> : undefined;
5
+ };
6
+ type PrependContext<C extends Context<any>, Args extends any[]> = [C, ...Args];
7
+ type DefaultContext = Context<undefined>;
8
+ type HasMeta<C extends Context<any>> = C extends Context<infer M> ? (M extends undefined ? false : true) : false;
9
+ type ExtractMeta<C extends Context<any>> = C extends Context<infer M> ? M : undefined;
10
+ type ContextRequiredFn<fn extends (...args: any[]) => any, C extends Context<any>, RequireMeta extends boolean = HasMeta<C>> = RequireMeta extends true ? (...args: Parameters<fn>) => {
11
+ withMeta<M extends ExtractMeta<C>>(metadata: z.infer<M>): ContextRequiredFn<fn, C, false>;
12
+ } : ReturnType<fn>;
13
+
14
+ declare const ScopeTag: unique symbol;
15
+ type AnyFn<R> = (...args: any[]) => R;
16
+ type BidiType<fn extends AnyFn<any>, C extends Context<any>, type extends "server" | "client"> = fn & AsyncGenerator<Parameters<fn>, void, unknown> & BidiContextType<C, type>;
17
+ type BidiContextType<C extends Context<any>, type extends "server" | "client"> = type extends "client" ? {
18
+ context: Promise<C>;
19
+ } : {
20
+ context(context: C): Promise<void>;
21
+ };
22
+ type serverSignature<fn extends AnyFn<any>, C extends Context<any>> = (C extends DefaultContext ? <Meta extends z.ZodObject<any> | undefined>(context: {
23
+ metadata?: Meta;
24
+ }) => serverSignature<fn, Context<Meta>> : fn) & {
25
+ [ScopeTag]: "server";
26
+ };
27
+ type clientSignature<fn extends AnyFn<any>> = fn & {
28
+ [ScopeTag]: "client";
29
+ };
30
+ type bidiSignature<fn extends AnyFn<void>, C extends Context<any>> = (C extends DefaultContext ? <Meta extends z.ZodObject<any> | undefined, Ack extends boolean = false>(context: {
31
+ metadata?: Meta;
32
+ ack?: Ack;
33
+ }) => bidiSignature<fn, Context<Meta>> : fn) & {
34
+ [ScopeTag]: "bidi";
35
+ };
36
+ type RpcMethodDescriptor = {
37
+ serviceType: "server" | "client" | "bidi";
38
+ methodType: "unary" | "bidi";
39
+ config?: {
40
+ metadata: boolean;
41
+ ack: boolean;
42
+ };
43
+ };
44
+ declare function server<fn extends AnyFn<any>>(): serverSignature<(...args: Parameters<fn>) => Promise<ReturnType<fn>>, DefaultContext>;
45
+ declare function client<fn extends AnyFn<any>>(): clientSignature<(...args: Parameters<fn>) => Promise<ReturnType<fn>>>;
46
+ declare function bidi<fn extends AnyFn<void>>(..._: ReturnType<fn> extends void ? [] : ["Return type must be void"]): bidiSignature<(...args: Parameters<fn>) => Promise<void>, DefaultContext>;
47
+ type Unwrap<T, type extends "server" | "client", ContextChain extends boolean = false> = T extends serverSignature<infer F, infer C> ? C extends DefaultContext ? F : ContextChain extends true ? ContextRequiredFn<F, C> : (...args: PrependContext<C, Parameters<F>>) => ReturnType<F> : T extends clientSignature<infer F> ? F : T extends bidiSignature<infer F, infer C> ? BidiType<F, C, type> : never;
48
+ type ServerFn<T, IncludeBidi extends boolean = true, ContextChain extends boolean = false> = {
49
+ [K in keyof T as T[K] extends serverSignature<AnyFn<any>, any> | (IncludeBidi extends true ? bidiSignature<AnyFn<void>, any> : never) ? K : never]: Unwrap<T[K], "server", ContextChain>;
50
+ };
51
+ type ClientFn<T, IncludeBidi extends boolean = true> = {
52
+ [K in keyof T as T[K] extends clientSignature<AnyFn<any>> | (IncludeBidi extends true ? bidiSignature<AnyFn<void>, any> : never) ? K : never]: Unwrap<T[K], "client">;
53
+ };
54
+
55
+ declare const ServiceNameTag: unique symbol;
56
+ interface ServiceInstance<N extends string = string> {
57
+ readonly [ServiceNameTag]: N;
58
+ }
59
+ type AbstractServiceClass<N extends string = string> = abstract new (...args: never) => ServiceInstance<N>;
60
+ declare class ServiceImpl<T extends AbstractServiceClass, Type extends "server" | "client"> {
61
+ readonly implementation: any;
62
+ readonly type: Type;
63
+ readonly serviceClass: T;
64
+ readonly serviceClassInstance: InstanceType<T>;
65
+ constructor(implementation: any, type: Type, serviceClass: T);
66
+ methods(): Record<string, RpcMethodDescriptor>;
67
+ }
68
+ declare function Service<N extends string>(name: N): (abstract new () => {
69
+ readonly [ServiceNameTag]: N;
70
+ }) & {
71
+ serviceName: N;
72
+ Server<T extends AbstractServiceClass, Impl extends ServerFn<InstanceType<T>, false>>(this: T, implementation: Impl): ServiceImpl<T, "server">;
73
+ Client<T extends AbstractServiceClass, Impl extends ClientFn<InstanceType<T>, false>>(this: T, implementation: Impl): ServiceImpl<T, "client">;
74
+ };
75
+ type ServiceNameOf<T extends ServiceImpl<any, any>> = T extends ServiceImpl<infer ServiceClass, any> ? InstanceType<ServiceClass>[typeof ServiceNameTag] : never;
76
+ type ServiceCallable<T> = T extends ServiceImpl<infer S, infer Mode> ? Mode extends "server" ? ClientFn<InstanceType<S>> : ServerFn<InstanceType<S>, true, true> : never;
77
+
78
+ declare function createGrpcClient<T extends ServiceImpl<any, "client">[]>(address: string, ...serviceImpls: T): Promise<{
79
+ [I in T[number] as ServiceNameOf<I>]: ServiceCallable<I>;
80
+ }>;
81
+
82
+ declare function createGrpcServer<T extends ServiceImpl<any, "server">[]>(port: number, ...serviceImpls: T): Promise<{
83
+ [I in T[number] as ServiceNameOf<I>]: ServiceCallable<I>;
84
+ }>;
85
+
86
+ export { Service, bidi, client, createGrpcClient, createGrpcServer, server };
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+
3
+ type Context<Meta extends z.ZodObject<any> | undefined> = {
4
+ metadata: Meta extends z.ZodObject<any> ? z.infer<Meta> : undefined;
5
+ };
6
+ type PrependContext<C extends Context<any>, Args extends any[]> = [C, ...Args];
7
+ type DefaultContext = Context<undefined>;
8
+ type HasMeta<C extends Context<any>> = C extends Context<infer M> ? (M extends undefined ? false : true) : false;
9
+ type ExtractMeta<C extends Context<any>> = C extends Context<infer M> ? M : undefined;
10
+ type ContextRequiredFn<fn extends (...args: any[]) => any, C extends Context<any>, RequireMeta extends boolean = HasMeta<C>> = RequireMeta extends true ? (...args: Parameters<fn>) => {
11
+ withMeta<M extends ExtractMeta<C>>(metadata: z.infer<M>): ContextRequiredFn<fn, C, false>;
12
+ } : ReturnType<fn>;
13
+
14
+ declare const ScopeTag: unique symbol;
15
+ type AnyFn<R> = (...args: any[]) => R;
16
+ type BidiType<fn extends AnyFn<any>, C extends Context<any>, type extends "server" | "client"> = fn & AsyncGenerator<Parameters<fn>, void, unknown> & BidiContextType<C, type>;
17
+ type BidiContextType<C extends Context<any>, type extends "server" | "client"> = type extends "client" ? {
18
+ context: Promise<C>;
19
+ } : {
20
+ context(context: C): Promise<void>;
21
+ };
22
+ type serverSignature<fn extends AnyFn<any>, C extends Context<any>> = (C extends DefaultContext ? <Meta extends z.ZodObject<any> | undefined>(context: {
23
+ metadata?: Meta;
24
+ }) => serverSignature<fn, Context<Meta>> : fn) & {
25
+ [ScopeTag]: "server";
26
+ };
27
+ type clientSignature<fn extends AnyFn<any>> = fn & {
28
+ [ScopeTag]: "client";
29
+ };
30
+ type bidiSignature<fn extends AnyFn<void>, C extends Context<any>> = (C extends DefaultContext ? <Meta extends z.ZodObject<any> | undefined, Ack extends boolean = false>(context: {
31
+ metadata?: Meta;
32
+ ack?: Ack;
33
+ }) => bidiSignature<fn, Context<Meta>> : fn) & {
34
+ [ScopeTag]: "bidi";
35
+ };
36
+ type RpcMethodDescriptor = {
37
+ serviceType: "server" | "client" | "bidi";
38
+ methodType: "unary" | "bidi";
39
+ config?: {
40
+ metadata: boolean;
41
+ ack: boolean;
42
+ };
43
+ };
44
+ declare function server<fn extends AnyFn<any>>(): serverSignature<(...args: Parameters<fn>) => Promise<ReturnType<fn>>, DefaultContext>;
45
+ declare function client<fn extends AnyFn<any>>(): clientSignature<(...args: Parameters<fn>) => Promise<ReturnType<fn>>>;
46
+ declare function bidi<fn extends AnyFn<void>>(..._: ReturnType<fn> extends void ? [] : ["Return type must be void"]): bidiSignature<(...args: Parameters<fn>) => Promise<void>, DefaultContext>;
47
+ type Unwrap<T, type extends "server" | "client", ContextChain extends boolean = false> = T extends serverSignature<infer F, infer C> ? C extends DefaultContext ? F : ContextChain extends true ? ContextRequiredFn<F, C> : (...args: PrependContext<C, Parameters<F>>) => ReturnType<F> : T extends clientSignature<infer F> ? F : T extends bidiSignature<infer F, infer C> ? BidiType<F, C, type> : never;
48
+ type ServerFn<T, IncludeBidi extends boolean = true, ContextChain extends boolean = false> = {
49
+ [K in keyof T as T[K] extends serverSignature<AnyFn<any>, any> | (IncludeBidi extends true ? bidiSignature<AnyFn<void>, any> : never) ? K : never]: Unwrap<T[K], "server", ContextChain>;
50
+ };
51
+ type ClientFn<T, IncludeBidi extends boolean = true> = {
52
+ [K in keyof T as T[K] extends clientSignature<AnyFn<any>> | (IncludeBidi extends true ? bidiSignature<AnyFn<void>, any> : never) ? K : never]: Unwrap<T[K], "client">;
53
+ };
54
+
55
+ declare const ServiceNameTag: unique symbol;
56
+ interface ServiceInstance<N extends string = string> {
57
+ readonly [ServiceNameTag]: N;
58
+ }
59
+ type AbstractServiceClass<N extends string = string> = abstract new (...args: never) => ServiceInstance<N>;
60
+ declare class ServiceImpl<T extends AbstractServiceClass, Type extends "server" | "client"> {
61
+ readonly implementation: any;
62
+ readonly type: Type;
63
+ readonly serviceClass: T;
64
+ readonly serviceClassInstance: InstanceType<T>;
65
+ constructor(implementation: any, type: Type, serviceClass: T);
66
+ methods(): Record<string, RpcMethodDescriptor>;
67
+ }
68
+ declare function Service<N extends string>(name: N): (abstract new () => {
69
+ readonly [ServiceNameTag]: N;
70
+ }) & {
71
+ serviceName: N;
72
+ Server<T extends AbstractServiceClass, Impl extends ServerFn<InstanceType<T>, false>>(this: T, implementation: Impl): ServiceImpl<T, "server">;
73
+ Client<T extends AbstractServiceClass, Impl extends ClientFn<InstanceType<T>, false>>(this: T, implementation: Impl): ServiceImpl<T, "client">;
74
+ };
75
+ type ServiceNameOf<T extends ServiceImpl<any, any>> = T extends ServiceImpl<infer ServiceClass, any> ? InstanceType<ServiceClass>[typeof ServiceNameTag] : never;
76
+ type ServiceCallable<T> = T extends ServiceImpl<infer S, infer Mode> ? Mode extends "server" ? ClientFn<InstanceType<S>> : ServerFn<InstanceType<S>, true, true> : never;
77
+
78
+ declare function createGrpcClient<T extends ServiceImpl<any, "client">[]>(address: string, ...serviceImpls: T): Promise<{
79
+ [I in T[number] as ServiceNameOf<I>]: ServiceCallable<I>;
80
+ }>;
81
+
82
+ declare function createGrpcServer<T extends ServiceImpl<any, "server">[]>(port: number, ...serviceImpls: T): Promise<{
83
+ [I in T[number] as ServiceNameOf<I>]: ServiceCallable<I>;
84
+ }>;
85
+
86
+ export { Service, bidi, client, createGrpcClient, createGrpcServer, server };