как правильно использовать HTTP / 2 и protobuf в node js - PullRequest
0 голосов
/ 04 мая 2020

Может ли что-нибудь объяснить мне, что не так, и если это возможно, написать полный код для использования protobuf с HTTP / 2 на стороне сервера, все данные успешно отправлены, но на стороне клиента я вижу потерю данных, а для большего количества данных более 1000 Я всегда получаю ошибку десериализации

//server.js
const http2 = require('http2');

const fs = require('fs');
const ReadableStream = require('./balances/ReadableStream')
const port = process.env.PORT || 8443;

const server = http2.createSecureServer({
    key: fs.readFileSync(__dirname + '/certs/localhost-privkey.pem', 'utf8'),
    cert: fs.readFileSync(__dirname + '/certs/localhost-cert.pem', 'utf8')
});

const ELEMENT_COUNT = process.env.ELEMENT_COUNT || 10;
const VECTOR_COUNT = process.env.VECTOR_COUNT || 1;

function parseValue(value, base){
    const parsed = parseInt(value, base);
    if(isNaN(parsed)){
        throw new Error('Not a number');
    }
    return parsed;
}

server.on('request', (req, res) => {
    // stream is a Duplex
    const count =  parseValue(ELEMENT_COUNT, 10);
    const vectorCount =  parseValue(VECTOR_COUNT, 10);
    const ReadableStream = new ReadableStream(count, vectorCount);
    ReadableStream.pipe(res).on('finish', () => {
        console.log('Sended');
    });
});

server.listen(port, (err) => {
    if(err){
        throw err;
    }
    console.log(`Listening on port ${port}`);
});


//client.js
const http2 = require('http2');
const fs = require('fs');
const { messages } = require('./protos');

const client = http2.connect('https://localhost:8443', {
    ca: fs.readFileSync(__dirname + '/certs/localhost-cert.pem', 'utf8')
});

client.on('error', (err) => console.error(err));

const req = client.request({ ':path': '/stream' });

req.on('response', (headers, flags) => {
    for (const name in headers) {
        console.log(`${name}: ${headers[name]}`);
    }
});

req.setEncoding('utf8');
req.on('data', (chunk) => {
    try{
        let data = messages.myMessage.deserializeBinary(Buffer.from(chunk));
        let msgId = data.getMessageId();
        let elapsedTime = data.getElapsedTime();
        const start = BigInt(elapsedTime);
        const end = process.hrtime.bigint();
        console.log(`message with ${msgId} arrived, Benchmark took ${end - start} nanoseconds ${(end - start)/BigInt(1000000)} ms`);
    } catch (e) {
        console.error(e.message);
    }
});
req.on('end', () => {
    client.close();
});
req.end();
...