1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 |
|
4 | const deferToConnect = require("defer-to-connect");
|
5 | exports.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 |
|
29 | if (event === 'error') {
|
30 | timings.error = Date.now();
|
31 | timings.phases.total = timings.error - timings.start;
|
32 | origin.emit = emit;
|
33 | }
|
34 |
|
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 |
|
56 |
|
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 |
|
\ | No newline at end of file |