summaryrefslogtreecommitdiff
path: root/node_modules/sntp
diff options
context:
space:
mode:
authorArman Shah <[email protected]>2018-02-19 23:50:04 -0800
committerArman Shah <[email protected]>2018-02-19 23:50:04 -0800
commitae34dcfd3823a609ba7182f2d6eda593be876f7d (patch)
treeb9d7f2884c4999349418cbdc4f9ab46d113e0afd /node_modules/sntp
parentInitial commit (diff)
downloadlauncher-ae34dcfd3823a609ba7182f2d6eda593be876f7d.tar.xz
launcher-ae34dcfd3823a609ba7182f2d6eda593be876f7d.zip
add base files
Diffstat (limited to 'node_modules/sntp')
-rwxr-xr-xnode_modules/sntp/.npmignore3
-rwxr-xr-xnode_modules/sntp/LICENSE28
-rwxr-xr-xnode_modules/sntp/README.md68
-rwxr-xr-xnode_modules/sntp/lib/index.js412
-rwxr-xr-xnode_modules/sntp/package.json64
5 files changed, 575 insertions, 0 deletions
diff --git a/node_modules/sntp/.npmignore b/node_modules/sntp/.npmignore
new file mode 100755
index 0000000..10c1307
--- /dev/null
+++ b/node_modules/sntp/.npmignore
@@ -0,0 +1,3 @@
+*
+!lib/**
+!.npmignore
diff --git a/node_modules/sntp/LICENSE b/node_modules/sntp/LICENSE
new file mode 100755
index 0000000..6dc3e82
--- /dev/null
+++ b/node_modules/sntp/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2012-2016, Eran Hammer and Project contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * The names of any contributors may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ * * *
+
+The complete list of contributors can be found at: https://github.com/hueniverse/sntp/graphs/contributors
diff --git a/node_modules/sntp/README.md b/node_modules/sntp/README.md
new file mode 100755
index 0000000..98a6e02
--- /dev/null
+++ b/node_modules/sntp/README.md
@@ -0,0 +1,68 @@
+# sntp
+
+An SNTP v4 client (RFC4330) for node. Simpy connects to the NTP or SNTP server requested and returns the server time
+along with the roundtrip duration and clock offset. To adjust the local time to the NTP time, add the returned `t` offset
+to the local time.
+
+[![Build Status](https://secure.travis-ci.org/hueniverse/sntp.png)](http://travis-ci.org/hueniverse/sntp)
+
+# Usage
+
+```javascript
+var Sntp = require('sntp');
+
+// All options are optional
+
+var options = {
+ host: 'nist1-sj.ustiming.org', // Defaults to pool.ntp.org
+ port: 123, // Defaults to 123 (NTP)
+ resolveReference: true, // Default to false (not resolving)
+ timeout: 1000 // Defaults to zero (no timeout)
+};
+
+// Request server time
+
+Sntp.time(options, function (err, time) {
+
+ if (err) {
+ console.log('Failed: ' + err.message);
+ process.exit(1);
+ }
+
+ console.log('Local clock is off by: ' + time.t + ' milliseconds');
+ process.exit(0);
+});
+```
+
+If an application needs to maintain continuous time synchronization, the module provides a stateful method for
+querying the current offset only when the last one is too old (defaults to daily).
+
+```javascript
+// Request offset once
+
+Sntp.offset(function (err, offset) {
+
+ console.log(offset); // New (served fresh)
+
+ // Request offset again
+
+ Sntp.offset(function (err, offset) {
+
+ console.log(offset); // Identical (served from cache)
+ });
+});
+```
+
+To set a background offset refresh, start the interval and use the provided now() method. If for any reason the
+client fails to obtain an up-to-date offset, the current system clock is used.
+
+```javascript
+var before = Sntp.now(); // System time without offset
+
+Sntp.start(function () {
+
+ var now = Sntp.now(); // With offset
+ Sntp.stop();
+});
+```
+
diff --git a/node_modules/sntp/lib/index.js b/node_modules/sntp/lib/index.js
new file mode 100755
index 0000000..83eb458
--- /dev/null
+++ b/node_modules/sntp/lib/index.js
@@ -0,0 +1,412 @@
+'use strict';
+
+// Load modules
+
+const Dgram = require('dgram');
+const Dns = require('dns');
+
+const Hoek = require('hoek');
+
+
+// Declare internals
+
+const internals = {};
+
+
+exports.time = function (options, callback) {
+
+ if (arguments.length !== 2) {
+ callback = arguments[0];
+ options = {};
+ }
+
+ const settings = Hoek.clone(options);
+ settings.host = settings.host || 'time.google.com';
+ settings.port = settings.port || 123;
+ settings.resolveReference = settings.resolveReference || false;
+
+ // Declare variables used by callback
+
+ let timeoutId = null;
+ let sent = 0;
+
+ // Ensure callback is only called once
+
+ const finish = Hoek.once((err, result) => {
+
+ clearTimeout(timeoutId);
+
+ socket.removeAllListeners();
+ socket.once('error', Hoek.ignore);
+
+ try {
+ socket.close();
+ }
+ catch (ignoreErr) { } // Ignore errors if the socket is already closed
+
+ return callback(err, result);
+ });
+
+ // Set timeout
+
+ if (settings.timeout) {
+ timeoutId = setTimeout(() => {
+
+ return finish(new Error('Timeout'));
+ }, settings.timeout);
+ }
+
+ // Create UDP socket
+
+ const socket = Dgram.createSocket('udp4');
+
+ socket.once('error', (err) => finish(err));
+
+ // Listen to incoming messages
+
+ socket.on('message', (buffer, rinfo) => {
+
+ const received = Date.now();
+
+ const message = new internals.NtpMessage(buffer);
+ if (!message.isValid) {
+ return finish(new Error('Invalid server response'), message);
+ }
+
+ if (message.originateTimestamp !== sent) {
+ return finish(new Error('Wrong originate timestamp'), message);
+ }
+
+ // Timestamp Name ID When Generated
+ // ------------------------------------------------------------
+ // Originate Timestamp T1 time request sent by client
+ // Receive Timestamp T2 time request received by server
+ // Transmit Timestamp T3 time reply sent by server
+ // Destination Timestamp T4 time reply received by client
+ //
+ // The roundtrip delay d and system clock offset t are defined as:
+ //
+ // d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2
+
+ const T1 = message.originateTimestamp;
+ const T2 = message.receiveTimestamp;
+ const T3 = message.transmitTimestamp;
+ const T4 = received;
+
+ message.d = (T4 - T1) - (T3 - T2);
+ message.t = ((T2 - T1) + (T3 - T4)) / 2;
+ message.receivedLocally = received;
+
+ if (!settings.resolveReference ||
+ message.stratum !== 'secondary') {
+
+ return finish(null, message);
+ }
+
+ // Resolve reference IP address
+
+ Dns.reverse(message.referenceId, (err, domains) => {
+
+ if (/* $lab:coverage:off$ */ !err /* $lab:coverage:on$ */) {
+ message.referenceHost = domains[0];
+ }
+
+ return finish(null, message);
+ });
+ });
+
+ // Construct NTP message
+
+ const message = new Buffer(48);
+ for (let i = 0; i < 48; ++i) { // Zero message
+ message[i] = 0;
+ }
+
+ message[0] = (0 << 6) + (4 << 3) + (3 << 0); // Set version number to 4 and Mode to 3 (client)
+ sent = Date.now();
+ internals.fromMsecs(sent, message, 40); // Set transmit timestamp (returns as originate)
+
+ // Send NTP request
+
+ socket.send(message, 0, message.length, settings.port, settings.host, (err, bytes) => {
+
+ if (err ||
+ bytes !== 48) {
+
+ return finish(err || new Error('Could not send entire message'));
+ }
+ });
+};
+
+
+internals.NtpMessage = function (buffer) {
+
+ this.isValid = false;
+
+ // Validate
+
+ if (buffer.length !== 48) {
+ return;
+ }
+
+ // Leap indicator
+
+ const li = (buffer[0] >> 6);
+ switch (li) {
+ case 0: this.leapIndicator = 'no-warning'; break;
+ case 1: this.leapIndicator = 'last-minute-61'; break;
+ case 2: this.leapIndicator = 'last-minute-59'; break;
+ case 3: this.leapIndicator = 'alarm'; break;
+ }
+
+ // Version
+
+ const vn = ((buffer[0] & 0x38) >> 3);
+ this.version = vn;
+
+ // Mode
+
+ const mode = (buffer[0] & 0x7);
+ switch (mode) {
+ case 1: this.mode = 'symmetric-active'; break;
+ case 2: this.mode = 'symmetric-passive'; break;
+ case 3: this.mode = 'client'; break;
+ case 4: this.mode = 'server'; break;
+ case 5: this.mode = 'broadcast'; break;
+ case 0:
+ case 6:
+ case 7: this.mode = 'reserved'; break;
+ }
+
+ // Stratum
+
+ const stratum = buffer[1];
+ if (stratum === 0) {
+ this.stratum = 'death';
+ }
+ else if (stratum === 1) {
+ this.stratum = 'primary';
+ }
+ else if (stratum <= 15) {
+ this.stratum = 'secondary';
+ }
+ else {
+ this.stratum = 'reserved';
+ }
+
+ // Poll interval (msec)
+
+ this.pollInterval = Math.round(Math.pow(2, buffer[2])) * 1000;
+
+ // Precision (msecs)
+
+ this.precision = Math.pow(2, buffer[3]) * 1000;
+
+ // Root delay (msecs)
+
+ const rootDelay = 256 * (256 * (256 * buffer[4] + buffer[5]) + buffer[6]) + buffer[7];
+ this.rootDelay = 1000 * (rootDelay / 0x10000);
+
+ // Root dispersion (msecs)
+
+ this.rootDispersion = ((buffer[8] << 8) + buffer[9] + ((buffer[10] << 8) + buffer[11]) / Math.pow(2, 16)) * 1000;
+
+ // Reference identifier
+
+ this.referenceId = '';
+ switch (this.stratum) {
+ case 'death':
+ case 'primary':
+ this.referenceId = String.fromCharCode(buffer[12]) + String.fromCharCode(buffer[13]) + String.fromCharCode(buffer[14]) + String.fromCharCode(buffer[15]);
+ break;
+ case 'secondary':
+ this.referenceId = '' + buffer[12] + '.' + buffer[13] + '.' + buffer[14] + '.' + buffer[15];
+ break;
+ }
+
+ // Reference timestamp
+
+ this.referenceTimestamp = internals.toMsecs(buffer, 16);
+
+ // Originate timestamp
+
+ this.originateTimestamp = internals.toMsecs(buffer, 24);
+
+ // Receive timestamp
+
+ this.receiveTimestamp = internals.toMsecs(buffer, 32);
+
+ // Transmit timestamp
+
+ this.transmitTimestamp = internals.toMsecs(buffer, 40);
+
+ // Validate
+
+ if (this.version === 4 &&
+ this.stratum !== 'reserved' &&
+ this.mode === 'server' &&
+ this.originateTimestamp &&
+ this.receiveTimestamp &&
+ this.transmitTimestamp) {
+
+ this.isValid = true;
+ }
+
+ return this;
+};
+
+
+internals.toMsecs = function (buffer, offset) {
+
+ let seconds = 0;
+ let fraction = 0;
+
+ for (let i = 0; i < 4; ++i) {
+ seconds = (seconds * 256) + buffer[offset + i];
+ }
+
+ for (let i = 4; i < 8; ++i) {
+ fraction = (fraction * 256) + buffer[offset + i];
+ }
+
+ return ((seconds - 2208988800 + (fraction / Math.pow(2, 32))) * 1000);
+};
+
+
+internals.fromMsecs = function (ts, buffer, offset) {
+
+ const seconds = Math.floor(ts / 1000) + 2208988800;
+ const fraction = Math.round((ts % 1000) / 1000 * Math.pow(2, 32));
+
+ buffer[offset + 0] = (seconds & 0xFF000000) >> 24;
+ buffer[offset + 1] = (seconds & 0x00FF0000) >> 16;
+ buffer[offset + 2] = (seconds & 0x0000FF00) >> 8;
+ buffer[offset + 3] = (seconds & 0x000000FF);
+
+ buffer[offset + 4] = (fraction & 0xFF000000) >> 24;
+ buffer[offset + 5] = (fraction & 0x00FF0000) >> 16;
+ buffer[offset + 6] = (fraction & 0x0000FF00) >> 8;
+ buffer[offset + 7] = (fraction & 0x000000FF);
+};
+
+
+// Offset singleton
+
+internals.last = {
+ offset: 0,
+ expires: 0,
+ host: '',
+ port: 0
+};
+
+
+exports.offset = function (options, callback) {
+
+ if (arguments.length !== 2) {
+ callback = arguments[0];
+ options = {};
+ }
+
+ const now = Date.now();
+ const clockSyncRefresh = options.clockSyncRefresh || 24 * 60 * 60 * 1000; // Daily
+
+ if (internals.last.offset &&
+ internals.last.host === options.host &&
+ internals.last.port === options.port &&
+ now < internals.last.expires) {
+
+ process.nextTick(() => callback(null, internals.last.offset));
+ return;
+ }
+
+ exports.time(options, (err, time) => {
+
+ if (err) {
+ return callback(err, 0);
+ }
+
+ internals.last = {
+ offset: Math.round(time.t),
+ expires: now + clockSyncRefresh,
+ host: options.host,
+ port: options.port
+ };
+
+ return callback(null, internals.last.offset);
+ });
+};
+
+
+// Now singleton
+
+internals.now = {
+ started: false,
+ intervalId: null
+};
+
+
+exports.start = function (options, callback) {
+
+ if (arguments.length !== 2) {
+ callback = arguments[0];
+ options = {};
+ }
+
+ if (internals.now.started) {
+ process.nextTick(() => callback());
+ return;
+ }
+
+ const report = (err) => {
+
+ if (err &&
+ options.onError) {
+
+ options.onError(err);
+ }
+ };
+
+ internals.now.started = true;
+ exports.offset(options, (err, offset) => {
+
+ report(err);
+
+ internals.now.intervalId = setInterval(() => {
+
+ exports.offset(options, report);
+ }, options.clockSyncRefresh || 24 * 60 * 60 * 1000); // Daily
+
+ return callback();
+ });
+};
+
+
+exports.stop = function () {
+
+ if (!internals.now.started) {
+ return;
+ }
+
+ clearInterval(internals.now.intervalId);
+ internals.now.started = false;
+ internals.now.intervalId = null;
+};
+
+
+exports.isLive = function () {
+
+ return internals.now.started;
+};
+
+
+exports.now = function () {
+
+ const now = Date.now();
+ if (!exports.isLive() ||
+ now >= internals.last.expires) {
+
+ return now;
+ }
+
+ return now + internals.last.offset;
+};
diff --git a/node_modules/sntp/package.json b/node_modules/sntp/package.json
new file mode 100755
index 0000000..900d04f
--- /dev/null
+++ b/node_modules/sntp/package.json
@@ -0,0 +1,64 @@
+{
+ "_from": "[email protected]",
+ "_id": "[email protected]",
+ "_inBundle": false,
+ "_integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "_location": "/sntp",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "[email protected]",
+ "name": "sntp",
+ "escapedName": "sntp",
+ "rawSpec": "2.x.x",
+ "saveSpec": null,
+ "fetchSpec": "2.x.x"
+ },
+ "_requiredBy": [
+ "/hawk"
+ ],
+ "_resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "_shasum": "2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8",
+ "_spec": "[email protected]",
+ "_where": "/Users/armanshah/Desktop/node-projects/shopping-list/node_modules/hawk",
+ "author": {
+ "name": "Eran Hammer",
+ "email": "[email protected]",
+ "url": "http://hueniverse.com"
+ },
+ "bugs": {
+ "url": "https://github.com/hueniverse/sntp/issues"
+ },
+ "bundleDependencies": false,
+ "dependencies": {
+ "hoek": "4.x.x"
+ },
+ "deprecated": false,
+ "description": "SNTP Client",
+ "devDependencies": {
+ "code": "4.x.x",
+ "lab": "14.x.x"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ },
+ "homepage": "https://github.com/hueniverse/sntp#readme",
+ "keywords": [
+ "sntp",
+ "ntp",
+ "time"
+ ],
+ "license": "BSD-3-Clause",
+ "main": "lib/index.js",
+ "name": "sntp",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/hueniverse/sntp.git"
+ },
+ "scripts": {
+ "test": "lab -a code -t 100 -L -m 20000",
+ "test-cov-html": "lab -a code -r html -o coverage.html -m 20000"
+ },
+ "version": "2.1.0"
+}