nestjs-protobuf-es
Version:
Protobuf-ES integration for NestJS
44 lines (43 loc) • 1.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateGrpcServices = generateGrpcServices;
const protobuf_1 = require("@bufbuild/protobuf");
const transformers_1 = require("./transformers");
/**
* Generates grpc service definitions.
*/
function generateGrpcServices(input, options) {
const results = {};
for (const type of Array.isArray(input) ? input : [input]) {
for (const service of type.kind === 'service' ? [type] : type.services) {
const serviceDefinition = (results[service.typeName] ??= {});
for (const method of service.methods) {
serviceDefinition[method.name] = createMethodDefinition(method, options);
}
}
}
return results;
}
function createMethodDefinition(method, options) {
return {
path: `/${method.parent.typeName}/${method.name}`,
originalName: method.localName,
requestStream: method.methodKind === 'client_streaming' || method.methodKind === 'bidi_streaming',
responseStream: method.methodKind === 'server_streaming' || method.methodKind === 'bidi_streaming',
requestSerialize: createSerializer(method.input),
requestDeserialize: createDeserializer(method.input, options),
responseSerialize: createSerializer(method.output),
responseDeserialize: createDeserializer(method.output, options),
};
}
function createSerializer(schema) {
return (value) => {
const message = (0, transformers_1.initMessage)(schema, value);
return Buffer.from((0, protobuf_1.toBinary)(schema, message));
};
}
function createDeserializer(schema, options) {
return (bytes) => {
return (0, transformers_1.populateInPlace)(schema, (0, protobuf_1.fromBinary)(schema, bytes), options);
};
}