ntpclient 1.5.0 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +1 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.test.d.ts +1 -0
- package/dist/cjs/index.test.js +61 -0
- package/dist/cjs/index.test.js.map +1 -0
- package/dist/mjs/index.js +1 -2
- package/dist/mjs/index.js.map +1 -1
- package/dist/mjs/index.test.d.ts +1 -0
- package/dist/mjs/index.test.js +52 -0
- package/dist/mjs/index.test.js.map +1 -0
- package/package.json +4 -6
- package/src/index.test.ts +70 -0
- package/src/index.ts +1 -2
package/dist/cjs/index.js
CHANGED
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
/* eslint-disable no-magic-numbers */
|
|
11
|
+
import { assert, expect, describe, test, beforeEach, vi, afterEach } from 'vitest';
|
|
12
|
+
import { NTPClient } from './index.js';
|
|
13
|
+
const SECOND_IN_MILLIS = 1000;
|
|
14
|
+
const replyTimeout = 10 * SECOND_IN_MILLIS;
|
|
15
|
+
describe('NTP', () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
vi.mock('dgram', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
const actual = (yield vi.importActual('dgram'));
|
|
19
|
+
const socket = actual.createSocket('udp4');
|
|
20
|
+
return Object.assign(Object.assign({}, actual), { send: () => {
|
|
21
|
+
socket.emit('message', Buffer.from([
|
|
22
|
+
0x1c, 0x02, 0x03, 0xe8, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x05, 0x12, 0xc0, 0x35, 0x67, 0x6c, 0xe9,
|
|
23
|
+
0x03, 0x76, 0xff, 0xff, 0x97, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x03,
|
|
24
|
+
0x78, 0x0f, 0xe9, 0xd6, 0x4e, 0x10, 0xe9, 0x03, 0x78, 0x0f, 0xea, 0x03, 0x93, 0xf5,
|
|
25
|
+
]));
|
|
26
|
+
} });
|
|
27
|
+
}));
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
vi.resetAllMocks();
|
|
31
|
+
});
|
|
32
|
+
test('returns the current time', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
const ntpClient = new NTPClient({
|
|
34
|
+
replyTimeout,
|
|
35
|
+
});
|
|
36
|
+
const data = yield ntpClient.getNetworkTime();
|
|
37
|
+
expect(data).toEqual(expect.any(Date));
|
|
38
|
+
}), replyTimeout);
|
|
39
|
+
test('works with another NTP server', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
|
+
const ntpClient = new NTPClient({
|
|
41
|
+
replyTimeout,
|
|
42
|
+
server: '0.pool.ntp.org',
|
|
43
|
+
});
|
|
44
|
+
const data = yield ntpClient.getNetworkTime();
|
|
45
|
+
expect(data).toEqual(expect.any(Date));
|
|
46
|
+
}), replyTimeout);
|
|
47
|
+
test("doesn't work with an invalid NTP server", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
|
+
try {
|
|
49
|
+
const ntpClient = new NTPClient({
|
|
50
|
+
replyTimeout: SECOND_IN_MILLIS,
|
|
51
|
+
server: 'google.com',
|
|
52
|
+
});
|
|
53
|
+
yield ntpClient.getNetworkTime();
|
|
54
|
+
assert.fail();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
expect(error.message).toContain('Timeout');
|
|
58
|
+
}
|
|
59
|
+
}));
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/mjs/index.js
CHANGED
package/dist/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { assert, expect, describe, test, beforeEach, vi, afterEach } from 'vitest';
|
|
3
|
+
import { NTPClient } from './index.js';
|
|
4
|
+
const SECOND_IN_MILLIS = 1000;
|
|
5
|
+
const replyTimeout = 10 * SECOND_IN_MILLIS;
|
|
6
|
+
describe('NTP', () => {
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
vi.mock('dgram', async () => {
|
|
9
|
+
const actual = (await vi.importActual('dgram'));
|
|
10
|
+
const socket = actual.createSocket('udp4');
|
|
11
|
+
return Object.assign(Object.assign({}, actual), { send: () => {
|
|
12
|
+
socket.emit('message', Buffer.from([
|
|
13
|
+
0x1c, 0x02, 0x03, 0xe8, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x05, 0x12, 0xc0, 0x35, 0x67, 0x6c, 0xe9,
|
|
14
|
+
0x03, 0x76, 0xff, 0xff, 0x97, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x03,
|
|
15
|
+
0x78, 0x0f, 0xe9, 0xd6, 0x4e, 0x10, 0xe9, 0x03, 0x78, 0x0f, 0xea, 0x03, 0x93, 0xf5,
|
|
16
|
+
]));
|
|
17
|
+
} });
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
vi.resetAllMocks();
|
|
22
|
+
});
|
|
23
|
+
test('returns the current time', async () => {
|
|
24
|
+
const ntpClient = new NTPClient({
|
|
25
|
+
replyTimeout,
|
|
26
|
+
});
|
|
27
|
+
const data = await ntpClient.getNetworkTime();
|
|
28
|
+
expect(data).toEqual(expect.any(Date));
|
|
29
|
+
}, replyTimeout);
|
|
30
|
+
test('works with another NTP server', async () => {
|
|
31
|
+
const ntpClient = new NTPClient({
|
|
32
|
+
replyTimeout,
|
|
33
|
+
server: '0.pool.ntp.org',
|
|
34
|
+
});
|
|
35
|
+
const data = await ntpClient.getNetworkTime();
|
|
36
|
+
expect(data).toEqual(expect.any(Date));
|
|
37
|
+
}, replyTimeout);
|
|
38
|
+
test("doesn't work with an invalid NTP server", async () => {
|
|
39
|
+
try {
|
|
40
|
+
const ntpClient = new NTPClient({
|
|
41
|
+
replyTimeout: SECOND_IN_MILLIS,
|
|
42
|
+
server: 'google.com',
|
|
43
|
+
});
|
|
44
|
+
await ntpClient.getNetworkTime();
|
|
45
|
+
assert.fail();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
expect(error.message).toContain('Timeout');
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Florian Imdahl <git@ffflorian.de>",
|
|
3
|
-
"bin":
|
|
4
|
-
"ntpclient": "dist/cjs/cli.js"
|
|
5
|
-
},
|
|
3
|
+
"bin": "dist/cjs/cli.js",
|
|
6
4
|
"dependencies": {
|
|
7
5
|
"commander": "11.1.0"
|
|
8
6
|
},
|
|
@@ -37,9 +35,9 @@
|
|
|
37
35
|
"dist": "yarn clean && yarn build",
|
|
38
36
|
"generate:packagejson": "../../bin/generate-hybrid-package-json.sh",
|
|
39
37
|
"start": "ts-node-esm src/cli.ts",
|
|
40
|
-
"test": "
|
|
38
|
+
"test": "vitest run"
|
|
41
39
|
},
|
|
42
40
|
"type": "module",
|
|
43
|
-
"version": "1.5.
|
|
44
|
-
"gitHead": "
|
|
41
|
+
"version": "1.5.2",
|
|
42
|
+
"gitHead": "f5134e8663185ed1ff19e0291a7a2da86c0aa39e"
|
|
45
43
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import {assert, expect, describe, test, beforeEach, vi, afterEach} from 'vitest';
|
|
3
|
+
import {NTPClient} from './index.js';
|
|
4
|
+
import type dgram from 'dgram';
|
|
5
|
+
|
|
6
|
+
const SECOND_IN_MILLIS = 1000;
|
|
7
|
+
const replyTimeout = 10 * SECOND_IN_MILLIS;
|
|
8
|
+
|
|
9
|
+
describe('NTP', () => {
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
vi.mock('dgram', async () => {
|
|
12
|
+
const actual = (await vi.importActual('dgram')) as typeof dgram;
|
|
13
|
+
const socket = actual.createSocket('udp4');
|
|
14
|
+
return {
|
|
15
|
+
...actual,
|
|
16
|
+
send: () => {
|
|
17
|
+
socket.emit(
|
|
18
|
+
'message',
|
|
19
|
+
Buffer.from([
|
|
20
|
+
0x1c, 0x02, 0x03, 0xe8, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x05, 0x12, 0xc0, 0x35, 0x67, 0x6c, 0xe9,
|
|
21
|
+
0x03, 0x76, 0xff, 0xff, 0x97, 0x0f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x03,
|
|
22
|
+
0x78, 0x0f, 0xe9, 0xd6, 0x4e, 0x10, 0xe9, 0x03, 0x78, 0x0f, 0xea, 0x03, 0x93, 0xf5,
|
|
23
|
+
])
|
|
24
|
+
);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
vi.resetAllMocks();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test(
|
|
34
|
+
'returns the current time',
|
|
35
|
+
async () => {
|
|
36
|
+
const ntpClient = new NTPClient({
|
|
37
|
+
replyTimeout,
|
|
38
|
+
});
|
|
39
|
+
const data = await ntpClient.getNetworkTime();
|
|
40
|
+
expect(data).toEqual(expect.any(Date));
|
|
41
|
+
},
|
|
42
|
+
replyTimeout
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
test(
|
|
46
|
+
'works with another NTP server',
|
|
47
|
+
async () => {
|
|
48
|
+
const ntpClient = new NTPClient({
|
|
49
|
+
replyTimeout,
|
|
50
|
+
server: '0.pool.ntp.org',
|
|
51
|
+
});
|
|
52
|
+
const data = await ntpClient.getNetworkTime();
|
|
53
|
+
expect(data).toEqual(expect.any(Date));
|
|
54
|
+
},
|
|
55
|
+
replyTimeout
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
test("doesn't work with an invalid NTP server", async () => {
|
|
59
|
+
try {
|
|
60
|
+
const ntpClient = new NTPClient({
|
|
61
|
+
replyTimeout: SECOND_IN_MILLIS,
|
|
62
|
+
server: 'google.com',
|
|
63
|
+
});
|
|
64
|
+
await ntpClient.getNetworkTime();
|
|
65
|
+
assert.fail();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
expect((error as Error).message).toContain('Timeout');
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
package/src/index.ts
CHANGED