1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const defer_to_connect_1 = __importDefault(require("defer-to-connect"));
|
7 | const timer = (request) => {
|
8 | const timings = {
|
9 | start: Date.now(),
|
10 | socket: undefined,
|
11 | lookup: undefined,
|
12 | connect: undefined,
|
13 | secureConnect: undefined,
|
14 | upload: undefined,
|
15 | response: undefined,
|
16 | end: undefined,
|
17 | error: undefined,
|
18 | phases: {
|
19 | wait: undefined,
|
20 | dns: undefined,
|
21 | tcp: undefined,
|
22 | tls: undefined,
|
23 | request: undefined,
|
24 | firstByte: undefined,
|
25 | download: undefined,
|
26 | total: undefined
|
27 | }
|
28 | };
|
29 | request.timings = timings;
|
30 | const handleError = (origin) => {
|
31 | const emit = origin.emit.bind(origin);
|
32 | origin.emit = (event, ...args) => {
|
33 |
|
34 | if (event === 'error') {
|
35 | timings.error = Date.now();
|
36 | timings.phases.total = timings.error - timings.start;
|
37 | origin.emit = emit;
|
38 | }
|
39 |
|
40 | return emit(event, ...args);
|
41 | };
|
42 | };
|
43 | handleError(request);
|
44 | request.prependOnceListener('socket', (socket) => {
|
45 | timings.socket = Date.now();
|
46 | timings.phases.wait = timings.socket - timings.start;
|
47 | const lookupListener = () => {
|
48 | timings.lookup = Date.now();
|
49 | timings.phases.dns = timings.lookup - timings.socket;
|
50 | };
|
51 | socket.prependOnceListener('lookup', lookupListener);
|
52 | defer_to_connect_1.default(socket, {
|
53 | connect: () => {
|
54 | timings.connect = Date.now();
|
55 | if (timings.lookup === undefined) {
|
56 | socket.removeListener('lookup', lookupListener);
|
57 | timings.lookup = timings.connect;
|
58 | timings.phases.dns = timings.lookup - timings.socket;
|
59 | }
|
60 | timings.phases.tcp = timings.connect - timings.lookup;
|
61 |
|
62 |
|
63 | },
|
64 | secureConnect: () => {
|
65 | timings.secureConnect = Date.now();
|
66 | timings.phases.tls = timings.secureConnect - timings.connect;
|
67 | }
|
68 | });
|
69 | });
|
70 | request.prependOnceListener('finish', () => {
|
71 | timings.upload = Date.now();
|
72 | timings.phases.request = timings.upload - (timings.secureConnect || timings.connect);
|
73 | });
|
74 | request.prependOnceListener('response', (response) => {
|
75 | timings.response = Date.now();
|
76 | timings.phases.firstByte = timings.response - timings.upload;
|
77 | response.timings = timings;
|
78 | handleError(response);
|
79 | response.prependOnceListener('end', () => {
|
80 | timings.end = Date.now();
|
81 | timings.phases.download = timings.end - timings.response;
|
82 | timings.phases.total = timings.end - timings.start;
|
83 | });
|
84 | });
|
85 | return timings;
|
86 | };
|
87 | exports.default = timer;
|
88 |
|
89 | module.exports = timer;
|
90 | module.exports.default = timer;
|
91 |
|
\ | No newline at end of file |