-
Notifications
You must be signed in to change notification settings - Fork 4
/
call.ts
129 lines (121 loc) · 3.72 KB
/
call.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import * as grpc from '@grpc/grpc-js'
import { RemoveIdxSgn, TypedOnData } from '../misc/type-helpers'
import { CallType } from '../call-types'
import { Message } from 'google-protobuf'
import { Serialize } from '@grpc/grpc-js/build/src/make-client'
/**
* Extended gRPC call
*/
export type ProtoCatCall<
Extension = unknown,
Req = Message,
Res = Message,
Type extends CallType = CallType
> = {
/** Client metadata */
readonly metadata: grpc.Metadata
/** Client metadata */
readonly meta: Record<string, string>
/** Server initial metadata (sent automatically for unary / client stream) */
initialMetadata: grpc.Metadata
/** Manually send initial metadata for server stream / bidi */
flushInitialMetadata: () => void
/** Trailing metadata (sent automatically) */
trailingMetadata: grpc.Metadata
/** RPC path "/[package].[service]/[method]", e.g. /cats.v1.Cat/GetCat */
path: string
/** Protofile package name */
package: string
/** Protofile service name (interface name) */
service: string
/** Protofile rpc name */
method: string
/** Type of call */
type: Type
/** Request message: only unary and server-stream */
request?: Req
/** Response message: only unary and client-stream */
response?: Res
/** Response message: only unary and client-stream */
readonly responseSerialize: Serialize<Res>
bufferedResponse?: Buffer
} & Extension &
(Type extends CallType.Unary
? grpc.ServerUnaryCall<Req, Res> & {
response: Res
}
: unknown) &
(Type extends CallType.ClientStream
? TypedOnData<grpc.ServerReadableStream<Req, Res>, Req> & {
response: Res
}
: unknown) &
(Type extends CallType.ServerStream
? grpc.ServerWritableStream<Req, Res>
: unknown) &
(Type extends CallType.Bidi
? TypedOnData<grpc.ServerDuplexStream<Req, Res>, Req>
: unknown)
/**
* Call stack of the subsequent middlewares and handlers.
*/
export type NextFn = () => Promise<void>
/**
* Union of all context types for generic middleware interface
*/
export type ProtoCatAnyCall<Extension = unknown> =
| ProtoCatCall<Extension, Message, Message, CallType.Unary>
| ProtoCatCall<Extension, Message, Message, CallType.ServerStream>
| ProtoCatCall<Extension, Message, Message, CallType.ClientStream>
| ProtoCatCall<Extension, Message, Message, CallType.Bidi>
/**
* Application generic middleware
*/
export type Middleware<Extension = unknown> = (
call: ProtoCatAnyCall<Extension>,
next: NextFn
) => any
/**
* @internal
*/
type MethodDef2CallType<M extends grpc.MethodDefinition<any, any>> =
M['requestStream'] extends true
? M['responseStream'] extends true
? CallType.Bidi
: CallType.ClientStream
: M['responseStream'] extends true
? CallType.ServerStream
: CallType.Unary
/**
* Convert a single method definition to service handler type
* @internal
*/
type MethodDef2ServiceHandler<H, Extension = unknown> =
H extends grpc.MethodDefinition<infer Req, infer Res>
? (
call: ProtoCatCall<Extension, Req, Res, MethodDef2CallType<H>>,
next: NextFn
) => any
: never
/**
* Create service handler type for whole client definition.
*
* Useful for better code-splitting
* ```typescript
* const unaryHandler: ServiceImplementation<
* IGreetingService,
* MyContext
* >['unary'] = call => call.uid
* ```
*/
export type ServiceImplementation<T, Extension = unknown> = RemoveIdxSgn<
{
[M in keyof T]: MethodDef2ServiceHandler<T[M], Extension>
}
>
/** ServiceImplementation with array of middlewares */
export type ServiceImplementationExtended<T, Extension = unknown> = {
[M in keyof ServiceImplementation<T, Extension>]:
| ServiceImplementation<T, Extension>[M]
| Array<ServiceImplementation<T, Extension>[M]>
}