Может ли что-нибудь объяснить мне, что не так, и если это возможно, написать полный код для использования 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();