UNPKG

2.75 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3// @ts-ignore
4const deferToConnect = require("defer-to-connect");
5exports.default = (request) => {
6 const timings = {
7 start: Date.now(),
8 socket: undefined,
9 lookup: undefined,
10 connect: undefined,
11 upload: undefined,
12 response: undefined,
13 end: undefined,
14 error: undefined,
15 phases: {
16 wait: undefined,
17 dns: undefined,
18 tcp: undefined,
19 request: undefined,
20 firstByte: undefined,
21 download: undefined,
22 total: undefined
23 }
24 };
25 const handleError = (origin) => {
26 const emit = origin.emit.bind(origin);
27 origin.emit = (event, ...args) => {
28 // Catches the `error` event
29 if (event === 'error') {
30 timings.error = Date.now();
31 timings.phases.total = timings.error - timings.start;
32 origin.emit = emit;
33 }
34 // Saves the original behavior
35 return emit(event, ...args);
36 };
37 };
38 handleError(request);
39 request.prependOnceListener('socket', (socket) => {
40 timings.socket = Date.now();
41 timings.phases.wait = timings.socket - timings.start;
42 const lookupListener = () => {
43 timings.lookup = Date.now();
44 timings.phases.dns = timings.lookup - timings.socket;
45 };
46 socket.prependOnceListener('lookup', lookupListener);
47 deferToConnect(socket, () => {
48 timings.connect = Date.now();
49 if (timings.lookup === undefined) {
50 socket.removeListener('lookup', lookupListener);
51 timings.lookup = timings.connect;
52 timings.phases.dns = timings.lookup - timings.socket;
53 }
54 timings.phases.tcp = timings.connect - timings.lookup;
55 // This callback is called before flushing any data,
56 // so we don't need to set `timings.phases.request` here.
57 });
58 });
59 request.prependOnceListener('finish', () => {
60 timings.upload = Date.now();
61 timings.phases.request = timings.upload - timings.connect;
62 });
63 request.prependOnceListener('response', (response) => {
64 timings.response = Date.now();
65 timings.phases.firstByte = timings.response - timings.upload;
66 handleError(response);
67 response.prependOnceListener('end', () => {
68 timings.end = Date.now();
69 timings.phases.download = timings.end - timings.response;
70 timings.phases.total = timings.end - timings.start;
71 });
72 });
73 return timings;
74};
75//# sourceMappingURL=index.js.map
\No newline at end of file