UNPKG

5.91 kBTypeScriptView Raw
1/// <reference types="node" />
2import * as http2 from 'http2';
3import { CallCredentials } from './call-credentials';
4import { Status } from './constants';
5import { Filter } from './filter';
6import { FilterStackFactory, FilterStack } from './filter-stack';
7import { Metadata } from './metadata';
8import { ChannelImplementation } from './channel';
9import { SubchannelCallStatsTracker, Subchannel } from './subchannel';
10import { ServerSurfaceCall } from './server-call';
11export declare type Deadline = Date | number;
12export interface CallStreamOptions {
13 deadline: Deadline;
14 flags: number;
15 host: string;
16 parentCall: ServerSurfaceCall | null;
17}
18export declare type PartialCallStreamOptions = Partial<CallStreamOptions>;
19export interface StatusObject {
20 code: Status;
21 details: string;
22 metadata: Metadata;
23}
24export declare type PartialStatusObject = Pick<StatusObject, 'code' | 'details'> & {
25 metadata: Metadata | null;
26};
27export declare const enum WriteFlags {
28 BufferHint = 1,
29 NoCompress = 2,
30 WriteThrough = 4
31}
32export interface WriteObject {
33 message: Buffer;
34 flags?: number;
35}
36export interface MetadataListener {
37 (metadata: Metadata, next: (metadata: Metadata) => void): void;
38}
39export interface MessageListener {
40 (message: any, next: (message: any) => void): void;
41}
42export interface StatusListener {
43 (status: StatusObject, next: (status: StatusObject) => void): void;
44}
45export interface FullListener {
46 onReceiveMetadata: MetadataListener;
47 onReceiveMessage: MessageListener;
48 onReceiveStatus: StatusListener;
49}
50export declare type Listener = Partial<FullListener>;
51/**
52 * An object with methods for handling the responses to a call.
53 */
54export interface InterceptingListener {
55 onReceiveMetadata(metadata: Metadata): void;
56 onReceiveMessage(message: any): void;
57 onReceiveStatus(status: StatusObject): void;
58}
59export declare function isInterceptingListener(listener: Listener | InterceptingListener): listener is InterceptingListener;
60export declare class InterceptingListenerImpl implements InterceptingListener {
61 private listener;
62 private nextListener;
63 private processingMetadata;
64 private hasPendingMessage;
65 private pendingMessage;
66 private processingMessage;
67 private pendingStatus;
68 constructor(listener: FullListener, nextListener: InterceptingListener);
69 private processPendingMessage;
70 private processPendingStatus;
71 onReceiveMetadata(metadata: Metadata): void;
72 onReceiveMessage(message: any): void;
73 onReceiveStatus(status: StatusObject): void;
74}
75export interface WriteCallback {
76 (error?: Error | null): void;
77}
78export interface MessageContext {
79 callback?: WriteCallback;
80 flags?: number;
81}
82export interface Call {
83 cancelWithStatus(status: Status, details: string): void;
84 getPeer(): string;
85 start(metadata: Metadata, listener: InterceptingListener): void;
86 sendMessageWithContext(context: MessageContext, message: Buffer): void;
87 startRead(): void;
88 halfClose(): void;
89 getDeadline(): Deadline;
90 getCredentials(): CallCredentials;
91 setCredentials(credentials: CallCredentials): void;
92 getMethod(): string;
93 getHost(): string;
94}
95export declare class Http2CallStream implements Call {
96 private readonly methodName;
97 private readonly channel;
98 private readonly options;
99 private readonly channelCallCredentials;
100 private readonly callNumber;
101 credentials: CallCredentials;
102 filterStack: FilterStack;
103 private http2Stream;
104 private pendingRead;
105 private isWriteFilterPending;
106 private pendingWrite;
107 private pendingWriteCallback;
108 private writesClosed;
109 private decoder;
110 private isReadFilterPending;
111 private canPush;
112 /**
113 * Indicates that an 'end' event has come from the http2 stream, so there
114 * will be no more data events.
115 */
116 private readsClosed;
117 private statusOutput;
118 private unpushedReadMessages;
119 private unfilteredReadMessages;
120 private mappedStatusCode;
121 private finalStatus;
122 private subchannel;
123 private disconnectListener;
124 private listener;
125 private internalError;
126 private configDeadline;
127 private statusWatchers;
128 private streamEndWatchers;
129 private callStatsTracker;
130 constructor(methodName: string, channel: ChannelImplementation, options: CallStreamOptions, filterStackFactory: FilterStackFactory, channelCallCredentials: CallCredentials, callNumber: number);
131 private outputStatus;
132 private trace;
133 /**
134 * On first call, emits a 'status' event with the given StatusObject.
135 * Subsequent calls are no-ops.
136 * @param status The status of the call.
137 */
138 private endCall;
139 private maybeOutputStatus;
140 private push;
141 private handleFilterError;
142 private handleFilteredRead;
143 private filterReceivedMessage;
144 private tryPush;
145 private handleTrailers;
146 private writeMessageToStream;
147 attachHttp2Stream(stream: http2.ClientHttp2Stream, subchannel: Subchannel, extraFilters: Filter[], callStatsTracker: SubchannelCallStatsTracker): void;
148 start(metadata: Metadata, listener: InterceptingListener): void;
149 private destroyHttp2Stream;
150 cancelWithStatus(status: Status, details: string): void;
151 getDeadline(): Deadline;
152 getCredentials(): CallCredentials;
153 setCredentials(credentials: CallCredentials): void;
154 getStatus(): StatusObject | null;
155 getPeer(): string;
156 getMethod(): string;
157 getHost(): string;
158 setConfigDeadline(configDeadline: Deadline): void;
159 addStatusWatcher(watcher: (status: StatusObject) => void): void;
160 addStreamEndWatcher(watcher: (success: boolean) => void): void;
161 addFilters(extraFilters: Filter[]): void;
162 getCallNumber(): number;
163 startRead(): void;
164 private maybeCloseWrites;
165 sendMessageWithContext(context: MessageContext, message: Buffer): void;
166 halfClose(): void;
167}