summaryrefslogtreecommitdiff
path: root/includes/external/addressbook/node_modules/@szmarczak/http-timer
diff options
context:
space:
mode:
Diffstat (limited to 'includes/external/addressbook/node_modules/@szmarczak/http-timer')
-rw-r--r--includes/external/addressbook/node_modules/@szmarczak/http-timer/LICENSE21
-rw-r--r--includes/external/addressbook/node_modules/@szmarczak/http-timer/README.md93
-rw-r--r--includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.d.ts32
-rw-r--r--includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.js106
-rw-r--r--includes/external/addressbook/node_modules/@szmarczak/http-timer/package.json89
5 files changed, 341 insertions, 0 deletions
diff --git a/includes/external/addressbook/node_modules/@szmarczak/http-timer/LICENSE b/includes/external/addressbook/node_modules/@szmarczak/http-timer/LICENSE
new file mode 100644
index 0000000..15ad2e8
--- /dev/null
+++ b/includes/external/addressbook/node_modules/@szmarczak/http-timer/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Szymon Marczak
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/includes/external/addressbook/node_modules/@szmarczak/http-timer/README.md b/includes/external/addressbook/node_modules/@szmarczak/http-timer/README.md
new file mode 100644
index 0000000..f637767
--- /dev/null
+++ b/includes/external/addressbook/node_modules/@szmarczak/http-timer/README.md
@@ -0,0 +1,93 @@
+# http-timer
+> Timings for HTTP requests
+
+[![Build Status](https://travis-ci.org/szmarczak/http-timer.svg?branch=master)](https://travis-ci.org/szmarczak/http-timer)
+[![Coverage Status](https://coveralls.io/repos/github/szmarczak/http-timer/badge.svg?branch=master)](https://coveralls.io/github/szmarczak/http-timer?branch=master)
+[![install size](https://packagephobia.now.sh/badge?p=@szmarczak/http-timer)](https://packagephobia.now.sh/result?p=@szmarczak/http-timer)
+
+Inspired by the [`request` package](https://github.com/request/request).
+
+## Installation
+
+NPM:
+
+> `npm install @szmarczak/http-timer`
+
+Yarn:
+
+> `yarn add @szmarczak/http-timer`
+
+## Usage
+**Note:**
+> - The measured events resemble Node.js events, not the kernel ones.
+> - Sending a chunk greater than [`highWaterMark`](https://nodejs.org/api/stream.html#stream_new_stream_writable_options) will result in invalid `upload` and `response` timings. You can avoid this by splitting the payload into smaller chunks.
+
+```js
+import https from 'https';
+import timer from '@szmarczak/http-timer';
+
+const request = https.get('https://httpbin.org/anything');
+timer(request);
+
+request.once('response', response => {
+ response.resume();
+ response.once('end', () => {
+ console.log(response.timings); // You can use `request.timings` as well
+ });
+});
+
+// {
+// start: 1572712180361,
+// socket: 1572712180362,
+// lookup: 1572712180415,
+// connect: 1572712180571,
+// upload: 1572712180884,
+// response: 1572712181037,
+// end: 1572712181039,
+// error: undefined,
+// abort: undefined,
+// phases: {
+// wait: 1,
+// dns: 53,
+// tcp: 156,
+// request: 313,
+// firstByte: 153,
+// download: 2,
+// total: 678
+// }
+// }
+```
+
+## API
+
+### timer(request)
+
+Returns: `Object`
+
+**Note**: The time is a `number` representing the milliseconds elapsed since the UNIX epoch.
+
+- `start` - Time when the request started.
+- `socket` - Time when a socket was assigned to the request.
+- `lookup` - Time when the DNS lookup finished.
+- `connect` - Time when the socket successfully connected.
+- `secureConnect` - Time when the socket securely connected.
+- `upload` - Time when the request finished uploading.
+- `response` - Time when the request fired `response` event.
+- `end` - Time when the response fired `end` event.
+- `error` - Time when the request fired `error` event.
+- `abort` - Time when the request fired `abort` event.
+- `phases`
+ - `wait` - `timings.socket - timings.start`
+ - `dns` - `timings.lookup - timings.socket`
+ - `tcp` - `timings.connect - timings.lookup`
+ - `tls` - `timings.secureConnect - timings.connect`
+ - `request` - `timings.upload - (timings.secureConnect || timings.connect)`
+ - `firstByte` - `timings.response - timings.upload`
+ - `download` - `timings.end - timings.response`
+ - `total` - `(timings.end || timings.error || timings.abort) - timings.start`
+
+If something has not been measured yet, it will be `undefined`.
+
+## License
+
+MIT
diff --git a/includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.d.ts b/includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.d.ts
new file mode 100644
index 0000000..cae5c24
--- /dev/null
+++ b/includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.d.ts
@@ -0,0 +1,32 @@
+/// <reference types="node" />
+import type { ClientRequest, IncomingMessage } from 'http';
+export interface Timings {
+ start: number;
+ socket?: number;
+ lookup?: number;
+ connect?: number;
+ secureConnect?: number;
+ upload?: number;
+ response?: number;
+ end?: number;
+ error?: number;
+ abort?: number;
+ phases: {
+ wait?: number;
+ dns?: number;
+ tcp?: number;
+ tls?: number;
+ request?: number;
+ firstByte?: number;
+ download?: number;
+ total?: number;
+ };
+}
+export interface ClientRequestWithTimings extends ClientRequest {
+ timings?: Timings;
+}
+export interface IncomingMessageWithTimings extends IncomingMessage {
+ timings?: Timings;
+}
+declare const timer: (request: ClientRequestWithTimings) => Timings;
+export default timer;
diff --git a/includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.js b/includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.js
new file mode 100644
index 0000000..407014f
--- /dev/null
+++ b/includes/external/addressbook/node_modules/@szmarczak/http-timer/dist/source/index.js
@@ -0,0 +1,106 @@
+import { errorMonitor } from 'events';
+import { types } from 'util';
+import deferToConnect from 'defer-to-connect';
+const timer = (request) => {
+ if (request.timings) {
+ return request.timings;
+ }
+ const timings = {
+ start: Date.now(),
+ socket: undefined,
+ lookup: undefined,
+ connect: undefined,
+ secureConnect: undefined,
+ upload: undefined,
+ response: undefined,
+ end: undefined,
+ error: undefined,
+ abort: undefined,
+ phases: {
+ wait: undefined,
+ dns: undefined,
+ tcp: undefined,
+ tls: undefined,
+ request: undefined,
+ firstByte: undefined,
+ download: undefined,
+ total: undefined,
+ },
+ };
+ request.timings = timings;
+ const handleError = (origin) => {
+ origin.once(errorMonitor, () => {
+ timings.error = Date.now();
+ timings.phases.total = timings.error - timings.start;
+ });
+ };
+ handleError(request);
+ const onAbort = () => {
+ timings.abort = Date.now();
+ timings.phases.total = timings.abort - timings.start;
+ };
+ request.prependOnceListener('abort', onAbort);
+ const onSocket = (socket) => {
+ timings.socket = Date.now();
+ timings.phases.wait = timings.socket - timings.start;
+ if (types.isProxy(socket)) {
+ return;
+ }
+ const lookupListener = () => {
+ timings.lookup = Date.now();
+ timings.phases.dns = timings.lookup - timings.socket;
+ };
+ socket.prependOnceListener('lookup', lookupListener);
+ deferToConnect(socket, {
+ connect: () => {
+ timings.connect = Date.now();
+ if (timings.lookup === undefined) {
+ socket.removeListener('lookup', lookupListener);
+ timings.lookup = timings.connect;
+ timings.phases.dns = timings.lookup - timings.socket;
+ }
+ timings.phases.tcp = timings.connect - timings.lookup;
+ },
+ secureConnect: () => {
+ timings.secureConnect = Date.now();
+ timings.phases.tls = timings.secureConnect - timings.connect;
+ },
+ });
+ };
+ if (request.socket) {
+ onSocket(request.socket);
+ }
+ else {
+ request.prependOnceListener('socket', onSocket);
+ }
+ const onUpload = () => {
+ timings.upload = Date.now();
+ timings.phases.request = timings.upload - (timings.secureConnect ?? timings.connect);
+ };
+ if (request.writableFinished) {
+ onUpload();
+ }
+ else {
+ request.prependOnceListener('finish', onUpload);
+ }
+ request.prependOnceListener('response', (response) => {
+ timings.response = Date.now();
+ timings.phases.firstByte = timings.response - timings.upload;
+ response.timings = timings;
+ handleError(response);
+ response.prependOnceListener('end', () => {
+ request.off('abort', onAbort);
+ response.off('aborted', onAbort);
+ if (timings.phases.total) {
+ // Aborted or errored
+ return;
+ }
+ timings.end = Date.now();
+ timings.phases.download = timings.end - timings.response;
+ timings.phases.total = timings.end - timings.start;
+ });
+ response.prependOnceListener('aborted', onAbort);
+ });
+ return timings;
+};
+export default timer;
diff --git a/includes/external/addressbook/node_modules/@szmarczak/http-timer/package.json b/includes/external/addressbook/node_modules/@szmarczak/http-timer/package.json
new file mode 100644
index 0000000..d9567b5
--- /dev/null
+++ b/includes/external/addressbook/node_modules/@szmarczak/http-timer/package.json
@@ -0,0 +1,89 @@
+{
+ "name": "@szmarczak/http-timer",
+ "version": "5.0.1",
+ "description": "Timings for HTTP requests",
+ "type": "module",
+ "exports": "./dist/source/index.js",
+ "engines": {
+ "node": ">=14.16"
+ },
+ "scripts": {
+ "test": "xo && ava",
+ "build": "del-cli dist && tsc",
+ "prepare": "npm run build",
+ "coveralls": "exit 0 && nyc report --reporter=text-lcov | coveralls"
+ },
+ "files": [
+ "dist/source"
+ ],
+ "keywords": [
+ "http",
+ "https",
+ "http2",
+ "timer",
+ "timings",
+ "performance",
+ "measure"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/szmarczak/http-timer.git"
+ },
+ "author": "Szymon Marczak",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/szmarczak/http-timer/issues"
+ },
+ "homepage": "https://github.com/szmarczak/http-timer#readme",
+ "dependencies": {
+ "defer-to-connect": "^2.0.1"
+ },
+ "devDependencies": {
+ "@ava/typescript": "^2.0.0",
+ "@sindresorhus/tsconfig": "^1.0.2",
+ "@types/node": "^16.7.0",
+ "ava": "^3.15.0",
+ "coveralls": "^3.1.1",
+ "del-cli": "^4.0.1",
+ "http2-wrapper": "^2.1.4",
+ "nyc": "^15.1.0",
+ "p-event": "^4.2.0",
+ "ts-node": "^10.2.1",
+ "typescript": "^4.3.5",
+ "xo": "^0.44.0"
+ },
+ "types": "dist/source",
+ "nyc": {
+ "extension": [
+ ".ts"
+ ],
+ "exclude": [
+ "**/tests/**"
+ ]
+ },
+ "xo": {
+ "rules": {
+ "@typescript-eslint/no-non-null-assertion": "off",
+ "@typescript-eslint/no-unsafe-assignment": "off",
+ "@typescript-eslint/no-unsafe-member-access": "off",
+ "@typescript-eslint/no-unsafe-call": "off",
+ "unicorn/prefer-node-protocol": "off"
+ }
+ },
+ "ava": {
+ "files": [
+ "tests/*"
+ ],
+ "timeout": "1m",
+ "nonSemVerExperiments": {
+ "nextGenConfig": true,
+ "configurableModuleFormat": true
+ },
+ "extensions": {
+ "ts": "module"
+ },
+ "nodeArguments": [
+ "--loader=ts-node/esm"
+ ]
+ }
+}