2 Object.defineProperty(exports, "__esModule", { value: true });
3 const call_1 = require("./call");
4 const channel_1 = require("./channel");
5 const constants_1 = require("./constants");
6 const metadata_1 = require("./metadata");
7 // This symbol must be exported (for now).
8 // See: https://github.com/Microsoft/TypeScript/issues/20080
9 exports.kChannel = Symbol();
11 * A generic gRPC client. Primarily useful as a base class for all generated
15 constructor(address, credentials, options = {}) {
16 if (options.channelOverride) {
17 this[exports.kChannel] = options.channelOverride;
19 else if (options.channelFactoryOverride) {
20 this[exports.kChannel] =
21 options.channelFactoryOverride(address, credentials, options);
24 this[exports.kChannel] = new channel_1.Http2Channel(address, credentials, options);
28 this[exports.kChannel].close();
31 return this[exports.kChannel];
33 waitForReady(deadline, callback) {
34 const checkState = (err) => {
36 callback(new Error('Failed to connect before the deadline'));
41 newState = this[exports.kChannel].getConnectivityState(true);
44 callback(new Error('The channel has been closed'));
47 if (newState === channel_1.ConnectivityState.READY) {
52 this[exports.kChannel].watchConnectivityState(newState, deadline, checkState);
55 callback(new Error('The channel has been closed'));
59 setImmediate(checkState);
61 handleUnaryResponse(call, deserialize, callback) {
62 let responseMessage = null;
63 call.on('data', (data) => {
64 if (responseMessage != null) {
65 call.cancelWithStatus(constants_1.Status.INTERNAL, 'Too many responses received');
68 responseMessage = deserialize(data);
71 call.cancelWithStatus(constants_1.Status.INTERNAL, 'Failed to parse server response');
74 call.on('end', () => {
75 if (responseMessage == null) {
76 call.cancelWithStatus(constants_1.Status.INTERNAL, 'Not enough responses received');
79 call.on('status', (status) => {
80 /* We assume that call emits status after it emits end, and that it
81 * accounts for any cancelWithStatus calls up until it emits status.
82 * Therefore, considering the above event handlers, status.code should be
83 * OK if and only if we have a non-null responseMessage */
84 if (status.code === constants_1.Status.OK) {
85 callback(null, responseMessage);
88 const error = Object.assign(new Error(status.details), status);
93 checkOptionalUnaryResponseArguments(arg1, arg2, arg3) {
94 if (arg1 instanceof Function) {
95 return { metadata: new metadata_1.Metadata(), options: {}, callback: arg1 };
97 else if (arg2 instanceof Function) {
98 if (arg1 instanceof metadata_1.Metadata) {
99 return { metadata: arg1, options: {}, callback: arg2 };
102 return { metadata: new metadata_1.Metadata(), options: arg1, callback: arg2 };
106 if (!((arg1 instanceof metadata_1.Metadata) && (arg2 instanceof Object) &&
107 (arg3 instanceof Function))) {
108 throw new Error('Incorrect arguments passed');
110 return { metadata: arg1, options: arg2, callback: arg3 };
113 makeUnaryRequest(method, serialize, deserialize, argument, metadata, options, callback) {
114 ({ metadata, options, callback } =
115 this.checkOptionalUnaryResponseArguments(metadata, options, callback));
116 const call = this[exports.kChannel].createCall(method, options.deadline, options.host, options.parent, options.propagate_flags);
117 if (options.credentials) {
118 call.setCredentials(options.credentials);
120 const message = serialize(argument);
121 const writeObj = { message };
122 call.sendMetadata(metadata);
123 call.write(writeObj);
125 this.handleUnaryResponse(call, deserialize, callback);
126 return new call_1.ClientUnaryCallImpl(call);
128 makeClientStreamRequest(method, serialize, deserialize, metadata, options, callback) {
129 ({ metadata, options, callback } =
130 this.checkOptionalUnaryResponseArguments(metadata, options, callback));
131 const call = this[exports.kChannel].createCall(method, options.deadline, options.host, options.parent, options.propagate_flags);
132 if (options.credentials) {
133 call.setCredentials(options.credentials);
135 call.sendMetadata(metadata);
136 this.handleUnaryResponse(call, deserialize, callback);
137 return new call_1.ClientWritableStreamImpl(call, serialize);
139 checkMetadataAndOptions(arg1, arg2) {
142 if (arg1 instanceof metadata_1.Metadata) {
158 metadata = new metadata_1.Metadata();
160 return { metadata, options };
162 makeServerStreamRequest(method, serialize, deserialize, argument, metadata, options) {
163 ({ metadata, options } = this.checkMetadataAndOptions(metadata, options));
164 const call = this[exports.kChannel].createCall(method, options.deadline, options.host, options.parent, options.propagate_flags);
165 if (options.credentials) {
166 call.setCredentials(options.credentials);
168 const message = serialize(argument);
169 const writeObj = { message };
170 call.sendMetadata(metadata);
171 call.write(writeObj);
173 return new call_1.ClientReadableStreamImpl(call, deserialize);
175 makeBidiStreamRequest(method, serialize, deserialize, metadata, options) {
176 ({ metadata, options } = this.checkMetadataAndOptions(metadata, options));
177 const call = this[exports.kChannel].createCall(method, options.deadline, options.host, options.parent, options.propagate_flags);
178 if (options.credentials) {
179 call.setCredentials(options.credentials);
181 call.sendMetadata(metadata);
182 return new call_1.ClientDuplexStreamImpl(call, serialize, deserialize);
185 exports.Client = Client;
186 //# sourceMappingURL=client.js.map