In questo tutorial vedremo come ottenere il Time To First Byte (TTFB) di un sito web con Node.js.
Il TTFB si ottiene sottraendo dal timestamp in millesimi di secondo dell'inizio della ricezione dei dati il timestamp dell'handshake SSL.
L'evento data
dell'oggetto response
può essere usato con l'handler once()
che viene invocato nella ricezione dei dati solo la prima volta.
Per ottenere invece il timing dell'handshake SSL dobbiamo accedere all'evento secureConnect
dell'oggetto socket
.
Tale oggetto è disponibile nell'evento socket
dell'oggetto request
.
'use strict';
const https = require('https');
const validator = require('validator');
const getTimeMS = hrTime => {
return (hrTime[0] * 1000) + (hrTime[1] / 1000000);
};
const getTimeDiff = results => {
const { responseBodyStart, tlsHandshake } = results;
return getTimeMS(responseBodyStart) - getTimeMS(tlsHandshake);
};
const getTTFB = host => {
if(!validator.isFQDN(host)) {
return Promise.reject(new Error('Invalid host.'));
}
const options = {
hostname: host,
port: 443,
method: 'GET'
};
return new Promise((resolve, reject) => {
const eventResults = {
dnsLookup: 0,
tcpConnection: 0,
tlsHandshake: 0,
responseBodyStart: 0,
responseBodyEnd: 0
};
const req = https.request(options, res => {
let body = '';
res.once('data', () => {
eventResults.responseBodyStart = process.hrtime();
});
res.on('data', d => {
body += d;
});
res.on('end', () => {
eventResults.responseBodyEnd = process.hrtime();
resolve({
ttfb: getTimeDiff(eventResults),
info: eventResults
});
});
});
req.on('error', error => {
reject(error);
});
req.on('socket', socket => {
socket.on('lookup', () => {
eventResults.dnsLookup = process.hrtime();
});
socket.on('connect', () => {
eventResults.tcpConnection = process.hrtime();
});
socket.on('secureConnect', () => {
eventResults.tlsHandshake = process.hrtime();
});
});
req.end();
});
};
process.hrtime()
restituisce un array con due valori interi, ossia secondi e nanosecondi, quindi per ottenere un solo timestamp in millesimi di secondo, tali valori vanno convertiti e sommati.