nice-grpc
Version:
A Node.js gRPC library that is nice to you
64 lines • 3.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createClientStreamingMethodHandler = createClientStreamingMethodHandler;
const convertMetadata_1 = require("../utils/convertMetadata");
const isAsyncIterable_1 = require("../utils/isAsyncIterable");
const readableToAsyncIterable_1 = require("../utils/readableToAsyncIterable");
const createCallContext_1 = require("./createCallContext");
const createErrorStatusObject_1 = require("./createErrorStatusObject");
/** @internal */
function createClientStreamingMethodHandler(definition, implementation, middleware) {
const methodDescriptor = {
path: definition.path,
requestStream: definition.requestStream,
responseStream: definition.responseStream,
options: definition.options,
};
async function* clientStreamingMethodHandler(request, context) {
if (!(0, isAsyncIterable_1.isAsyncIterable)(request)) {
throw new Error('A middleware passed invalid request to next(): expected a single message for client streaming method');
}
return await implementation(request, context);
}
const handler = middleware == null
? clientStreamingMethodHandler
: (request, context) => middleware({
method: methodDescriptor,
requestStream: true,
request,
responseStream: false,
next: clientStreamingMethodHandler,
}, context);
return (call, callback) => {
const { context, maybeCancel } = (0, createCallContext_1.createCallContext)(call);
Promise.resolve()
.then(async () => {
const iterable = handler((0, readableToAsyncIterable_1.readableToAsyncIterable)(call, context.signal), context);
const iterator = iterable[Symbol.asyncIterator]();
try {
let result = await iterator.next();
while (true) {
if (!result.done) {
result = await iterator.throw(new Error('A middleware yielded a message, but expected to only return a message for client streaming method'));
continue;
}
if (result.value == null) {
result = await iterator.throw(new Error('A middleware returned void, but expected to return a message for client streaming method'));
continue;
}
return result.value;
}
}
finally {
maybeCancel.cancel = undefined;
context.sendHeader();
}
})
.then(res => {
callback(null, res, (0, convertMetadata_1.convertMetadataToGrpcJs)(context.trailer));
}, err => {
callback((0, createErrorStatusObject_1.createErrorStatusObject)(definition.path, err, (0, convertMetadata_1.convertMetadataToGrpcJs)(context.trailer)));
});
};
}
//# sourceMappingURL=handleClientStreamingCall.js.map