Skip to content

Commit a5fa864

Browse files
committed
refactor: Move to Typescript
1 parent b7361bc commit a5fa864

13 files changed

+292
-1525
lines changed

.babelrc

Lines changed: 0 additions & 3 deletions
This file was deleted.

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
node_modules
22
dist
3-
*.tgz
3+
*.tgz

.npmignore

Lines changed: 0 additions & 5 deletions
This file was deleted.

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,22 @@ yarn add ntp-packet-parser
1515
## Usage
1616
### ES6 style
1717
```js
18-
import NtpPacketParser from "ntp-packet-parser";
18+
import { NtpPacketParser } from "ntp-packet-parser";
1919

2020
/** const udpPacket = new Buffer(...); **/
2121
const result = NtpPacketParser.parse(udpPacket);
2222
```
2323

2424
### Legacy style
2525
```js
26-
var NtpPacketParser = require("ntp-packet-parser");
26+
var NtpPacketParser = require("ntp-packet-parser").NtpPacketParser;
2727

2828
/** const udpPacket = new Buffer(...); **/
2929
var result = NtpPacketParser.parse(udpPacket);
3030
```
3131

3232
## Structure
33-
The response from `NtpPacketParser.parse` will always return the following object structure:
33+
The response from `NtpPacketParser.parse` will return the following object structure:
3434

3535
| Property | Type | Description |
3636
| :--- | :--- | :--- |
@@ -66,4 +66,4 @@ yarn test
6666
Please file a PR against `master`.
6767

6868
## License
69-
[GNU General Public License Version 3](LICENSE)
69+
[GNU General Public License Version 3](LICENSE)

package.json

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"name": "ntp-packet-parser",
3-
"version": "0.1.0",
3+
"version": "0.2.0-beta.0",
44
"description": "A parser for NTP UDP packets",
55
"main": "dist/index.js",
66
"scripts": {
77
"prepublishOnly": "yarn prettier:lint && yarn build",
8-
"test": "mocha --compilers js:babel-core/register --recursive test",
9-
"build": "babel --presets babel-preset-es2015 --out-dir dist src && prettier --write dist/**/*.js",
10-
"prettier": "prettier --write src/**/*.js test/**/*.js",
11-
"prettier:lint": "prettier --list-different src/**/*.js"
8+
"test": "ts-mocha --recursive test/**/*.spec.ts",
9+
"build": "tsc",
10+
"prettier": "prettier --write src/**/*.ts test/**/*.{js,ts}",
11+
"prettier:lint": "prettier --list-different src/**/*.ts test/**/*.{js,ts}"
1212
},
1313
"keywords": [
1414
"ntp",
@@ -23,10 +23,19 @@
2323
"url": "https://github.com/buffcode/ntp-packet-parser.git"
2424
},
2525
"devDependencies": {
26-
"babel-cli": "6",
27-
"babel-preset-es2015": "6",
26+
"@types/mocha": "^8.2.2",
27+
"@types/node": "^15.3.0",
2828
"mocha": "^3.5.0",
29-
"prettier": "^1.6.1"
29+
"prettier": "^1.6.1",
30+
"ts-mocha": "^8.0.0",
31+
"ts-node": "^9.1.1",
32+
"typescript": "^4.2.4"
3033
},
34+
"files": [
35+
"dist",
36+
"src",
37+
"package.json",
38+
"tsconfig.json"
39+
],
3140
"license": "GPL-3.0"
3241
}

src/NtpPacket.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export interface NtpPacket {
2+
leapIndicator: number;
3+
version: number;
4+
mode: number;
5+
stratum: number;
6+
poll: number;
7+
precision: number;
8+
rootDelay: Date;
9+
rootDispersion: Date;
10+
referenceId: string;
11+
referenceTimestamp: Date;
12+
originTimestamp: Date;
13+
receiveTimestamp: Date;
14+
transmitTimestamp: Date;
15+
}

src/index.js renamed to src/NtpPacketParser.ts

Lines changed: 39 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,60 @@
1-
"use strict";
1+
import { PacketStruct } from "./PacketStruct";
2+
import { NtpPacket } from "./NtpPacket";
23

3-
/**
4-
* @typedef {Object} NTPPacket
5-
* @property {int} leapIndicator
6-
* @property {int} version
7-
* @property {int} mode
8-
* @property {int} stratum
9-
* @property {int} poll
10-
* @property {int} precision
11-
* @property {Date} rootDelay
12-
* @property {Date} rootDispersion
13-
* @property {String} referenceId
14-
* @property {Date} referenceTimestamp
15-
* @property {Date} originTimestamp
16-
* @property {Date} receiveTimestamp
17-
* @property {Date} transmitTimestamp
18-
*/
19-
20-
export default class NtpPacketParser {
4+
export class NtpPacketParser {
215
/**
226
* Returns the structure of the UDP packet for parsing
23-
* @returns {Object}
247
*/
25-
static get packetStruct() {
8+
private static get packetStruct() {
269
return [
27-
{ name: "leapIndicator", bits: 2 },
28-
{ name: "version", bits: 3 },
29-
{ name: "mode", bits: 3 },
30-
{ name: "stratum", bits: 8 },
31-
{ name: "poll", bits: 8 },
32-
{ name: "precision", bits: 8 },
10+
{ name: "leapIndicator", bits: 2 } as PacketStruct<"leapIndicator">,
11+
{ name: "version", bits: 3 } as PacketStruct<"version">,
12+
{ name: "mode", bits: 3 } as PacketStruct<"mode">,
13+
{ name: "stratum", bits: 8 } as PacketStruct<"stratum">,
14+
{ name: "poll", bits: 8 } as PacketStruct<"poll">,
15+
{ name: "precision", bits: 8 } as PacketStruct<"precision">,
3316
{
3417
name: "rootDelay",
3518
bits: 32,
3619
converter: NtpPacketParser._fromNtpTimestamp
37-
},
20+
} as PacketStruct<"rootDelay">,
3821
{
3922
name: "rootDispersion",
4023
bits: 32,
4124
converter: NtpPacketParser._fromNtpTimestamp
42-
},
25+
} as PacketStruct<"rootDispersion">,
4326
{
4427
name: "referenceId",
4528
bits: 32,
46-
converter: (v, s) => this._ntpIdentifier(s.stratum, v)
47-
},
29+
converter: (value, packet) => this._ntpIdentifier(packet.stratum, value)
30+
} as PacketStruct<"referenceId">,
4831
{
4932
name: "referenceTimestamp",
5033
bits: 64,
5134
converter: NtpPacketParser._fromNtpTimestamp
52-
},
35+
} as PacketStruct<"referenceTimestamp">,
5336
{
5437
name: "originTimestamp",
5538
bits: 64,
5639
converter: NtpPacketParser._fromNtpTimestamp
57-
},
40+
} as PacketStruct<"originTimestamp">,
5841
{
5942
name: "receiveTimestamp",
6043
bits: 64,
6144
converter: NtpPacketParser._fromNtpTimestamp
62-
},
45+
} as PacketStruct<"receiveTimestamp">,
6346
{
6447
name: "transmitTimestamp",
6548
bits: 64,
6649
converter: NtpPacketParser._fromNtpTimestamp
67-
}
50+
} as PacketStruct<"transmitTimestamp">
6851
];
6952
}
7053

7154
/**
7255
* Returns the selected bits in binary notation
73-
* @param msg
74-
* @param {int} start
75-
* @param {int} length
76-
* @returns {string} Bits in binary notation
77-
* @private
7856
*/
79-
static _getBits(msg, start, length) {
57+
private static _getBits(msg: Buffer, start: number, length: number): string {
8058
let bits = "";
8159
const pad = "00000000";
8260

@@ -90,12 +68,9 @@ export default class NtpPacketParser {
9068

9169
/**
9270
* Converts a NTP identifier from binary notation to ASCII
93-
* @param {int} stratum
94-
* @param {String} value Bits in binary notation
95-
* @returns {string}
96-
* @private
71+
* @param {string} value Bits in binary notation
9772
*/
98-
static _ntpIdentifier(stratum, value) {
73+
private static _ntpIdentifier(stratum: number, value: string): string {
9974
if (stratum != 1) {
10075
return parseInt(value, 2).toString();
10176
}
@@ -115,11 +90,9 @@ export default class NtpPacketParser {
11590

11691
/**
11792
* Converts a NTP timestamp from binary notation to a Date object
118-
* @param {String} value Bits in binary notation
119-
* @returns {Date}
120-
* @private
93+
* @param {string} value Bits in binary notation
12194
*/
122-
static _fromNtpTimestamp(value) {
95+
public static _fromNtpTimestamp(value: string): Date {
12396
if (value.length % 2 !== 0) {
12497
throw new Error(
12598
"Invalid timestamp format, expected even number of characters"
@@ -135,25 +108,26 @@ export default class NtpPacketParser {
135108
}
136109

137110
/**
138-
* Parses an UDP packet buffer and returns a NTPPacket struct
139-
* @param {Buffer} udpPacket
140-
* @returns {NTPPacket}
111+
* Parses an UDP packet buffer and returns a NtpPacket struct
141112
*/
142-
static parse(udpPacket) {
143-
let data = [];
144-
NtpPacketParser.packetStruct.forEach(item => {
145-
data[item.name] = undefined;
146-
});
147-
113+
public static parse(udpPacket: Buffer): Partial<NtpPacket> {
114+
let data: Partial<NtpPacket> = {};
148115
let offset = 0;
149-
NtpPacketParser.packetStruct.forEach(item => {
150-
data[item.name] = NtpPacketParser._getBits(udpPacket, offset, item.bits);
151-
if (item.converter) {
152-
data[item.name] = item.converter(data[item.name], data);
116+
117+
NtpPacketParser.packetStruct.forEach(struct => {
118+
const baseRepresentation = NtpPacketParser._getBits(
119+
udpPacket,
120+
offset,
121+
struct.bits
122+
);
123+
if (struct.converter) {
124+
// @ts-ignore
125+
data[struct.name] = struct.converter(baseRepresentation, data);
153126
} else {
154-
data[item.name] = parseInt(data[item.name], 2);
127+
// @ts-ignore
128+
data[struct.name] = parseInt(baseRepresentation, 2);
155129
}
156-
offset += item.bits;
130+
offset += struct.bits;
157131
});
158132

159133
return data;

src/PacketStruct.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { NtpPacket } from "./NtpPacket";
2+
3+
export interface PacketStruct<T extends keyof NtpPacket> {
4+
name: T;
5+
bits: number;
6+
converter?: (v: string, s: Partial<NtpPacket>) => NtpPacket[T];
7+
}

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from "./NtpPacketParser";
2+
export * from "./NtpPacket";
3+
export * from "./PacketStruct";

test/parser.js renamed to test/parser.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*jshint mocha*/
2+
import { NtpPacketParser } from "../src";
3+
24
const assert = require("assert");
3-
import NtpPacketParser from "../src/index";
45

56
describe("NTP packet parser", function() {
67
describe("Structure", function() {

0 commit comments

Comments
 (0)