@airframes/acars-decoder 1.4.4 → 1.4.6

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.
Files changed (66) hide show
  1. package/dist/DateTimeUtils.d.ts +8 -0
  2. package/dist/DateTimeUtils.js +27 -0
  3. package/dist/DecoderPlugin.d.ts +3 -1
  4. package/dist/DecoderPlugin.js +3 -1
  5. package/dist/IcaoDecoder.d.ts +3 -1
  6. package/dist/IcaoDecoder.js +3 -1
  7. package/dist/MessageDecoder.d.ts +3 -1
  8. package/dist/MessageDecoder.js +29 -2
  9. package/dist/bin/acars-decoder-test.js +9 -0
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.js +20 -0
  12. package/dist/plugins/Label_16_N_Space.d.ts +11 -0
  13. package/dist/plugins/Label_16_N_Space.js +80 -0
  14. package/dist/plugins/Label_16_N_Space.test.d.ts +1 -0
  15. package/dist/plugins/Label_16_N_Space.test.js +84 -0
  16. package/dist/plugins/Label_1M_Slash.js +2 -4
  17. package/dist/plugins/Label_1M_Slash.test.js +3 -3
  18. package/dist/plugins/Label_30_Slash_EA.d.ts +11 -0
  19. package/dist/plugins/Label_30_Slash_EA.js +54 -0
  20. package/dist/plugins/Label_30_Slash_EA.test.d.ts +1 -0
  21. package/dist/plugins/Label_30_Slash_EA.test.js +35 -0
  22. package/dist/plugins/Label_8E.js +2 -9
  23. package/dist/plugins/Label_8E.test.js +3 -3
  24. package/dist/plugins/official.d.ts +2 -0
  25. package/dist/plugins/official.js +2 -0
  26. package/package.json +12 -3
  27. package/src/DateTimeUtils.ts +26 -0
  28. package/src/DecoderPlugin.ts +83 -0
  29. package/src/DecoderPluginInterface.ts +9 -0
  30. package/src/IcaoDecoder.ts +137 -0
  31. package/src/MessageDecoder.ts +117 -0
  32. package/src/bin/acars-decoder-test.ts +67 -0
  33. package/src/bin/acars-decoder.ts +23 -0
  34. package/{index.d.ts → src/index.d.ts} +1 -0
  35. package/src/index.ts +4 -0
  36. package/src/plugins/Label_15.ts +45 -0
  37. package/src/plugins/Label_16_N_Space.test.ts +94 -0
  38. package/src/plugins/Label_16_N_Space.ts +91 -0
  39. package/src/plugins/Label_1M_Slash.test.ts +45 -0
  40. package/src/plugins/Label_1M_Slash.ts +69 -0
  41. package/src/plugins/Label_20_CFB.01.ts +81 -0
  42. package/src/plugins/Label_20_POS.ts +68 -0
  43. package/src/plugins/Label_30_Slash_EA.test.ts +37 -0
  44. package/src/plugins/Label_30_Slash_EA.ts +60 -0
  45. package/src/plugins/Label_44_ETA.ts +81 -0
  46. package/src/plugins/Label_44_IN.ts +81 -0
  47. package/src/plugins/Label_44_OFF.ts +88 -0
  48. package/src/plugins/Label_44_ON.ts +81 -0
  49. package/src/plugins/Label_44_POS.ts +96 -0
  50. package/src/plugins/Label_5Z.ts +125 -0
  51. package/src/plugins/Label_80.ts +215 -0
  52. package/src/plugins/Label_8E.test.ts +34 -0
  53. package/src/plugins/Label_8E.ts +55 -0
  54. package/src/plugins/Label_B6.ts +28 -0
  55. package/src/plugins/Label_ColonComma.ts +32 -0
  56. package/src/plugins/Label_H1.ts +18 -0
  57. package/src/plugins/Label_H1_M1BPOS.ts +60 -0
  58. package/src/plugins/Label_H1_M1BPRG.ts +40 -0
  59. package/src/plugins/Label_QP.ts +54 -0
  60. package/src/plugins/Label_QQ.ts +54 -0
  61. package/src/plugins/Label_QR.ts +54 -0
  62. package/src/plugins/Label_QS.ts +54 -0
  63. package/src/plugins/Label_SQ.ts +111 -0
  64. package/src/plugins/official.ts +22 -0
  65. package/tsconfig.json +2 -2
  66. package/index.ts +0 -4
@@ -0,0 +1,8 @@
1
+ export declare class DateTimeUtils {
2
+ static UTCToString(UTCString: string): string;
3
+ static UTCDateTimeToString(dateString: string, timeString: string): string;
4
+ }
5
+ declare const _default: {
6
+ DateTimeUtils: typeof DateTimeUtils;
7
+ };
8
+ export default _default;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DateTimeUtils = void 0;
4
+ class DateTimeUtils {
5
+ // Expects a four digit UTC time string (HHMM)
6
+ static UTCToString(UTCString) {
7
+ let utcDate = new Date();
8
+ utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
9
+ return utcDate.toTimeString();
10
+ }
11
+ // Expects a six digit date string and a four digit UTC time string
12
+ // (DDMMYY) (HHMM)
13
+ static UTCDateTimeToString(dateString, timeString) {
14
+ let utcDate = new Date();
15
+ utcDate.setUTCDate(+dateString.substr(0, 2));
16
+ utcDate.setUTCMonth(+dateString.substr(2, 2));
17
+ if (dateString.length === 6) {
18
+ utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));
19
+ }
20
+ utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
21
+ return utcDate.toUTCString();
22
+ }
23
+ }
24
+ exports.DateTimeUtils = DateTimeUtils;
25
+ exports.default = {
26
+ DateTimeUtils,
27
+ };
@@ -12,5 +12,7 @@ export declare abstract class DecoderPlugin implements DecoderPluginInterface {
12
12
  decodeStringCoordinates(stringCoords: String): any;
13
13
  coordinateString(coords: any): String;
14
14
  }
15
- declare const _default: {};
15
+ declare const _default: {
16
+ DecoderPlugin: typeof DecoderPlugin;
17
+ };
16
18
  export default _default;
@@ -66,4 +66,6 @@ class DecoderPlugin {
66
66
  }
67
67
  }
68
68
  exports.DecoderPlugin = DecoderPlugin;
69
- exports.default = {};
69
+ exports.default = {
70
+ DecoderPlugin,
71
+ };
@@ -4,5 +4,7 @@ export declare class IcaoDecoder {
4
4
  constructor(icao: string);
5
5
  isMilitary(): true | RegExpMatchArray | null;
6
6
  }
7
- declare const _default: {};
7
+ declare const _default: {
8
+ IcaoDecoder: typeof IcaoDecoder;
9
+ };
8
10
  export default _default;
@@ -106,4 +106,6 @@ class IcaoDecoder {
106
106
  }
107
107
  }
108
108
  exports.IcaoDecoder = IcaoDecoder;
109
- exports.default = {};
109
+ exports.default = {
110
+ IcaoDecoder
111
+ };
@@ -8,5 +8,7 @@ export declare class MessageDecoder {
8
8
  decode(message: any, options?: any): any;
9
9
  lookupAirportByIata(iata: string): any;
10
10
  }
11
- declare const _default: {};
11
+ declare const _default: {
12
+ MessageDecoder: typeof MessageDecoder;
13
+ };
12
14
  export default _default;
@@ -1,7 +1,30 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.MessageDecoder = void 0;
4
- const Plugins = require("./plugins/official");
27
+ const Plugins = __importStar(require("./plugins/official"));
5
28
  class MessageDecoder {
6
29
  name;
7
30
  plugins;
@@ -13,7 +36,9 @@ class MessageDecoder {
13
36
  this.registerPlugin(new Plugins.Label_ColonComma(this));
14
37
  this.registerPlugin(new Plugins.Label_5Z(this));
15
38
  this.registerPlugin(new Plugins.Label_15(this));
39
+ this.registerPlugin(new Plugins.Label_16_N_Space(this));
16
40
  this.registerPlugin(new Plugins.Label_20_POS(this));
41
+ this.registerPlugin(new Plugins.Label_30_Slash_EA(this));
17
42
  this.registerPlugin(new Plugins.Label_44_ETA(this));
18
43
  this.registerPlugin(new Plugins.Label_44_IN(this));
19
44
  this.registerPlugin(new Plugins.Label_44_OFF(this));
@@ -99,4 +124,6 @@ class MessageDecoder {
99
124
  }
100
125
  }
101
126
  exports.MessageDecoder = MessageDecoder;
102
- exports.default = {};
127
+ exports.default = {
128
+ MessageDecoder,
129
+ };
@@ -25,6 +25,15 @@ function decode(label, text) {
25
25
  const decoding = decoder.decode(message);
26
26
  debugMessage(message, decoding);
27
27
  }
28
+ // Label 16 with N space
29
+ decode('16', 'N 44.203,W 86.546,31965,6, 290');
30
+ decode('16', 'N 42.777,W 85.477,35004,6, 132');
31
+ decode('16', 'N 28.177/W 96.055');
32
+ decode('16', 'N 44.640/W119.729');
33
+ // Label 30 with slash EA
34
+ decode('30', '/EA1830/DSKSFO/SK24');
35
+ decode('30', '/EA1611/DSMMSD/SK24');
36
+ decode('30', '/EA1719/DSKSFO/SK23');
28
37
  // Label 5Z
29
38
  decode('5Z', '/R3 SNAORD 2205-14 SNA');
30
39
  // Label 80 + 3N01 POSRPT
@@ -0,0 +1,4 @@
1
+ export * from './DateTimeUtils';
2
+ export * from './DecoderPlugin';
3
+ export * from './IcaoDecoder';
4
+ export * from './MessageDecoder';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./DateTimeUtils"), exports);
18
+ __exportStar(require("./DecoderPlugin"), exports);
19
+ __exportStar(require("./IcaoDecoder"), exports);
20
+ __exportStar(require("./MessageDecoder"), exports);
@@ -0,0 +1,11 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+ export declare class Label_16_N_Space extends DecoderPlugin {
3
+ name: string;
4
+ qualifiers(): {
5
+ labels: string[];
6
+ preambles: string[];
7
+ };
8
+ decode(message: any, options?: any): any;
9
+ }
10
+ declare const _default: {};
11
+ export default _default;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Label_16_N_Space = void 0;
4
+ const DecoderPlugin_1 = require("../DecoderPlugin");
5
+ class Label_16_N_Space extends DecoderPlugin_1.DecoderPlugin {
6
+ name = 'label-16-n-space';
7
+ qualifiers() {
8
+ return {
9
+ labels: ["16"],
10
+ preambles: ['N '],
11
+ };
12
+ }
13
+ decode(message, options = {}) {
14
+ const decodeResult = this.defaultResult;
15
+ decodeResult.decoder.name = this.name;
16
+ decodeResult.formatted.description = 'Position Report';
17
+ decodeResult.message = message;
18
+ // Style: N 44.203,W 86.546,31965,6, 290
19
+ let variant1Regex = /^(?<lat>[NS])\s(?<lat_coord>.*),(?<long>[EW])\s(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\s(?<unkwn2>.*)$/;
20
+ // Style: N 28.177/W 96.055
21
+ let variant2Regex = /^(?<lat>[NS])\s(?<lat_coord>.*)\/(?<long>[EW])\s?(?<long_coord>.*)$/;
22
+ let results;
23
+ if (results = message.text.match(variant1Regex)) {
24
+ if (options.debug) {
25
+ console.log(`Label 16 N : results`);
26
+ console.log(results);
27
+ }
28
+ decodeResult.raw.latitude_direction = results.groups.lat;
29
+ decodeResult.raw.latitude = Number(results.groups.lat_coord);
30
+ decodeResult.raw.longitude_direction = results.groups.long;
31
+ decodeResult.raw.longitude = Number(results.groups.long_coord);
32
+ decodeResult.raw.flight_level = results.groups.alt == 'GRD' || results.groups.alt == '***' ? '0' : Number(results.groups.alt);
33
+ decodeResult.formatted.items.push({
34
+ type: 'aircraft_position',
35
+ code: 'POS',
36
+ label: 'Aircraft Position',
37
+ value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
38
+ });
39
+ decodeResult.formatted.items.push({
40
+ type: 'flight_level',
41
+ code: 'FL',
42
+ label: 'Flight Level',
43
+ value: decodeResult.raw.flight_level,
44
+ });
45
+ decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}`;
46
+ decodeResult.decoded = true;
47
+ decodeResult.decoder.decodeLevel = 'partial';
48
+ }
49
+ else if (results = message.text.match(variant2Regex)) {
50
+ if (options.debug) {
51
+ console.log(`Label 16 N : results`);
52
+ console.log(results);
53
+ }
54
+ decodeResult.raw.latitude_direction = results.groups.lat;
55
+ decodeResult.raw.latitude = Number(results.groups.lat_coord);
56
+ decodeResult.raw.longitude_direction = results.groups.long;
57
+ decodeResult.raw.longitude = Number(results.groups.long_coord);
58
+ decodeResult.formatted.items.push({
59
+ type: 'aircraft_position',
60
+ code: 'POS',
61
+ label: 'Aircraft Position',
62
+ value: `${decodeResult.raw.latitude} ${decodeResult.raw.latitude_direction}, ${decodeResult.raw.longitude} ${decodeResult.raw.longitude_direction}`,
63
+ });
64
+ decodeResult.decoded = true;
65
+ decodeResult.decoder.decodeLevel = 'full';
66
+ }
67
+ else {
68
+ // Unknown
69
+ if (options.debug) {
70
+ console.log(`Decoder: Unknown 16 message: ${message.text}`);
71
+ }
72
+ decodeResult.remaining.text = message.text;
73
+ decodeResult.decoded = false;
74
+ decodeResult.decoder.decodeLevel = 'none';
75
+ }
76
+ return decodeResult;
77
+ }
78
+ }
79
+ exports.Label_16_N_Space = Label_16_N_Space;
80
+ exports.default = {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const MessageDecoder_1 = require("../MessageDecoder");
4
+ const Label_16_N_Space_1 = require("./Label_16_N_Space");
5
+ test('decodes Label 16 variant 1', () => {
6
+ const decoder = new MessageDecoder_1.MessageDecoder();
7
+ const decoderPlugin = new Label_16_N_Space_1.Label_16_N_Space(decoder);
8
+ expect(decoderPlugin.decode).toBeDefined();
9
+ expect(decoderPlugin.name).toBe('label-16-n-space');
10
+ expect(decoderPlugin.qualifiers).toBeDefined();
11
+ expect(decoderPlugin.qualifiers()).toEqual({
12
+ labels: ['16'],
13
+ preambles: ['N '],
14
+ });
15
+ const text = 'N 44.203,W 86.546,31965,6, 290';
16
+ const decodeResult = decoderPlugin.decode({ text: text });
17
+ console.log(JSON.stringify(decodeResult, null, 2));
18
+ expect(decodeResult.decoded).toBe(true);
19
+ expect(decodeResult.decoder.decodeLevel).toBe('partial');
20
+ expect(decodeResult.decoder.name).toBe('label-16-n-space');
21
+ expect(decodeResult.formatted.description).toBe('Position Report');
22
+ expect(decodeResult.message.text).toBe(text);
23
+ expect(decodeResult.raw.latitude_direction).toBe('N');
24
+ expect(decodeResult.raw.latitude).toBe(44.203);
25
+ expect(decodeResult.raw.longitude_direction).toBe('W');
26
+ expect(decodeResult.raw.longitude).toBe(86.546);
27
+ expect(decodeResult.raw.flight_level).toBe(31965);
28
+ expect(decodeResult.formatted.items.length).toBe(2);
29
+ expect(decodeResult.formatted.items[0].type).toBe('aircraft_position');
30
+ expect(decodeResult.formatted.items[0].code).toBe('POS');
31
+ expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
32
+ expect(decodeResult.formatted.items[0].value).toBe('44.203 N, 86.546 W');
33
+ expect(decodeResult.formatted.items[1].type).toBe('flight_level');
34
+ expect(decodeResult.formatted.items[1].code).toBe('FL');
35
+ expect(decodeResult.formatted.items[1].label).toBe('Flight Level');
36
+ expect(decodeResult.formatted.items[1].value).toBe(31965);
37
+ });
38
+ test('decodes Label 16 variant 2', () => {
39
+ const decoder = new MessageDecoder_1.MessageDecoder();
40
+ const decoderPlugin = new Label_16_N_Space_1.Label_16_N_Space(decoder);
41
+ expect(decoderPlugin.decode).toBeDefined();
42
+ expect(decoderPlugin.name).toBe('label-16-n-space');
43
+ expect(decoderPlugin.qualifiers).toBeDefined();
44
+ expect(decoderPlugin.qualifiers()).toEqual({
45
+ labels: ['16'],
46
+ preambles: ['N '],
47
+ });
48
+ const text = 'N 28.177/W 96.055';
49
+ const decodeResult = decoderPlugin.decode({ text: text });
50
+ console.log(JSON.stringify(decodeResult, null, 2));
51
+ expect(decodeResult.decoded).toBe(true);
52
+ expect(decodeResult.decoder.decodeLevel).toBe('full');
53
+ expect(decodeResult.decoder.name).toBe('label-16-n-space');
54
+ expect(decodeResult.formatted.description).toBe('Position Report');
55
+ expect(decodeResult.message.text).toBe(text);
56
+ expect(decodeResult.raw.latitude_direction).toBe('N');
57
+ expect(decodeResult.raw.latitude).toBe(28.177);
58
+ expect(decodeResult.raw.longitude_direction).toBe('W');
59
+ expect(decodeResult.raw.longitude).toBe(96.055);
60
+ expect(decodeResult.formatted.items.length).toBe(1);
61
+ expect(decodeResult.formatted.items[0].type).toBe('aircraft_position');
62
+ expect(decodeResult.formatted.items[0].code).toBe('POS');
63
+ expect(decodeResult.formatted.items[0].label).toBe('Aircraft Position');
64
+ expect(decodeResult.formatted.items[0].value).toBe('28.177 N, 96.055 W');
65
+ });
66
+ test('decodes Label 16 variant <invalid>', () => {
67
+ const decoder = new MessageDecoder_1.MessageDecoder();
68
+ const decoderPlugin = new Label_16_N_Space_1.Label_16_N_Space(decoder);
69
+ expect(decoderPlugin.decode).toBeDefined();
70
+ expect(decoderPlugin.name).toBe('label-16-n-space');
71
+ expect(decoderPlugin.qualifiers).toBeDefined();
72
+ expect(decoderPlugin.qualifiers()).toEqual({
73
+ labels: ['16'],
74
+ preambles: ['N '],
75
+ });
76
+ const text = 'N Bogus message';
77
+ const decodeResult = decoderPlugin.decode({ text: text });
78
+ console.log(JSON.stringify(decodeResult, null, 2));
79
+ expect(decodeResult.decoded).toBe(false);
80
+ expect(decodeResult.decoder.decodeLevel).toBe('none');
81
+ expect(decodeResult.decoder.name).toBe('label-16-n-space');
82
+ expect(decodeResult.formatted.description).toBe('Position Report');
83
+ expect(decodeResult.message.text).toBe(text);
84
+ });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Label_1M_Slash = void 0;
4
+ const DateTimeUtils_1 = require("../DateTimeUtils");
4
5
  const DecoderPlugin_1 = require("../DecoderPlugin");
5
6
  class Label_1M_Slash extends DecoderPlugin_1.DecoderPlugin {
6
7
  name = 'label-1m-slash';
@@ -32,14 +33,11 @@ class Label_1M_Slash extends DecoderPlugin_1.DecoderPlugin {
32
33
  // results[7] 1940 - UTC eta
33
34
  decodeResult.raw.arrival_runway = results[8].replace(decodeResult.raw.arrival_icao, ""); // results[8] EGLL27L
34
35
  // results[9]: 10(space) (???)
35
- decodeResult.raw.arrival_eta = new Date();
36
- decodeResult.raw.arrival_eta.setUTCDate(results[2].substring(0, 2), results[2].substring(2, 2), results[2].substring(4, 2));
37
- decodeResult.raw.arrival_eta.setUTCHours(results[7].substr(0, 2), results[7].substr(2, 2), 0);
38
36
  decodeResult.formatted.items.push({
39
37
  type: 'eta',
40
38
  code: 'ETA',
41
39
  label: 'Estimated Time of Arrival',
42
- value: decodeResult.raw.arrival_eta.toGMTString(),
40
+ value: DateTimeUtils_1.DateTimeUtils.UTCDateTimeToString(results[2], results[7]),
43
41
  });
44
42
  decodeResult.formatted.items.push({
45
43
  type: 'destination',
@@ -21,8 +21,6 @@ test('decodes Label 8E sample 1', () => {
21
21
  expect(decodeResult.formatted.description).toBe('ETA Report');
22
22
  expect(decodeResult.message.text).toBe(text);
23
23
  expect(decodeResult.raw.alternate_icao).toBe('EGSS');
24
- expect(decodeResult.raw.arrival_eta.getUTCHours()).toBe(19);
25
- expect(decodeResult.raw.arrival_eta.getUTCMinutes()).toBe(40);
26
24
  expect(decodeResult.raw.arrival_icao).toBe('EGLL');
27
25
  expect(decodeResult.raw.arrival_runway).toBe('27L');
28
26
  expect(decodeResult.raw.departure_icao).toBe('LDSP');
@@ -31,7 +29,9 @@ test('decodes Label 8E sample 1', () => {
31
29
  expect(decodeResult.formatted.items[0].type).toBe('eta');
32
30
  expect(decodeResult.formatted.items[0].code).toBe('ETA');
33
31
  expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
34
- expect(decodeResult.formatted.items[0].value.includes('19:40')).toBe(true);
32
+ // Check for the minutes as typescript doesn't have a UTC time string method
33
+ // so the hour will depend on the test host timezone.
34
+ expect(decodeResult.formatted.items[0].value.includes('40')).toBe(true);
35
35
  expect(decodeResult.formatted.items[1].type).toBe('destination');
36
36
  expect(decodeResult.formatted.items[1].code).toBe('DST');
37
37
  expect(decodeResult.formatted.items[1].label).toBe('Destination');
@@ -0,0 +1,11 @@
1
+ import { DecoderPlugin } from '../DecoderPlugin';
2
+ export declare class Label_30_Slash_EA extends DecoderPlugin {
3
+ name: string;
4
+ qualifiers(): {
5
+ labels: string[];
6
+ preambles: string[];
7
+ };
8
+ decode(message: any, options?: any): any;
9
+ }
10
+ declare const _default: {};
11
+ export default _default;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Label_30_Slash_EA = void 0;
4
+ const DateTimeUtils_1 = require("../DateTimeUtils");
5
+ const DecoderPlugin_1 = require("../DecoderPlugin");
6
+ class Label_30_Slash_EA extends DecoderPlugin_1.DecoderPlugin {
7
+ name = 'label-30-slash-ea';
8
+ qualifiers() {
9
+ return {
10
+ labels: ["30"],
11
+ preambles: ['/EA'],
12
+ };
13
+ }
14
+ decode(message, options = {}) {
15
+ const decodeResult = this.defaultResult;
16
+ decodeResult.decoder.name = this.name;
17
+ decodeResult.formatted.description = 'ETA Report';
18
+ decodeResult.message = message;
19
+ // Style: /EA1830/DSKSFO/SK24
20
+ const results = message.text.split(/\n|\//).slice(1); // Split by / and new line
21
+ if (results) {
22
+ if (options.debug) {
23
+ console.log(`Label 30 EA: results`);
24
+ console.log(results);
25
+ }
26
+ }
27
+ decodeResult.formatted.items.push({
28
+ type: 'eta',
29
+ code: 'ETA',
30
+ label: 'Estimated Time of Arrival',
31
+ value: DateTimeUtils_1.DateTimeUtils.UTCToString(results[0].substr(2, 4)),
32
+ });
33
+ if (results[1].substr(0, 2) === "DS") {
34
+ decodeResult.raw.arrival_icao = results[1].substr(2, 4);
35
+ decodeResult.formatted.items.push({
36
+ type: 'destination',
37
+ code: 'DST',
38
+ label: 'Destination',
39
+ value: decodeResult.raw.arrival_icao,
40
+ });
41
+ // We don't know what the /SK section means. We have seen various numbers
42
+ // after the /SK.
43
+ decodeResult.remaining.text = "/".concat(results[2]);
44
+ }
45
+ else {
46
+ decodeResult.remaining.text = "/".concat(results[1], "/", results[2]);
47
+ }
48
+ decodeResult.decoded = true;
49
+ decodeResult.decoder.decodeLevel = 'partial';
50
+ return decodeResult;
51
+ }
52
+ }
53
+ exports.Label_30_Slash_EA = Label_30_Slash_EA;
54
+ exports.default = {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const MessageDecoder_1 = require("../MessageDecoder");
4
+ const Label_30_Slash_EA_1 = require("./Label_30_Slash_EA");
5
+ test('decodes Label 30 sample 1', () => {
6
+ const decoder = new MessageDecoder_1.MessageDecoder();
7
+ const decoderPlugin = new Label_30_Slash_EA_1.Label_30_Slash_EA(decoder);
8
+ expect(decoderPlugin.decode).toBeDefined();
9
+ expect(decoderPlugin.name).toBe('label-30-slash-ea');
10
+ expect(decoderPlugin.qualifiers).toBeDefined();
11
+ expect(decoderPlugin.qualifiers()).toEqual({
12
+ labels: ['30'],
13
+ preambles: ['/EA'],
14
+ });
15
+ const text = '/EA1719/DSKSFO/SK23';
16
+ const decodeResult = decoderPlugin.decode({ text: text });
17
+ console.log(JSON.stringify(decodeResult, null, 2));
18
+ expect(decodeResult.decoded).toBe(true);
19
+ expect(decodeResult.decoder.decodeLevel).toBe('partial');
20
+ expect(decodeResult.decoder.name).toBe('label-30-slash-ea');
21
+ expect(decodeResult.formatted.description).toBe('ETA Report');
22
+ expect(decodeResult.message.text).toBe(text);
23
+ expect(decodeResult.raw.arrival_icao).toBe('KSFO');
24
+ expect(decodeResult.formatted.items.length).toBe(2);
25
+ expect(decodeResult.formatted.items[0].type).toBe('eta');
26
+ expect(decodeResult.formatted.items[0].code).toBe('ETA');
27
+ expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
28
+ // This test is a bit rough as typescript doesn't have a UTC time string
29
+ // method so the hour will be depend on the test host timezone.
30
+ expect(decodeResult.formatted.items[0].value.includes('19')).toBe(true);
31
+ expect(decodeResult.formatted.items[1].type).toBe('destination');
32
+ expect(decodeResult.formatted.items[1].code).toBe('DST');
33
+ expect(decodeResult.formatted.items[1].label).toBe('Destination');
34
+ expect(decodeResult.formatted.items[1].value).toBe('KSFO');
35
+ });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Label_8E = void 0;
4
+ const DateTimeUtils_1 = require("../DateTimeUtils");
4
5
  const DecoderPlugin_1 = require("../DecoderPlugin");
5
6
  // ETA
6
7
  class Label_8E extends DecoderPlugin_1.DecoderPlugin {
@@ -24,19 +25,11 @@ class Label_8E extends DecoderPlugin_1.DecoderPlugin {
24
25
  console.log(`Label 8E ETA: groups`);
25
26
  console.log(results.groups);
26
27
  }
27
- decodeResult.raw.arrival_eta = new Date();
28
- decodeResult.raw.arrival_eta.setUTCHours(results.groups.arrival_eta.substr(0, 2), results.groups.arrival_eta.substr(2, 2));
29
- if (new Date().getUTCHours() > decodeResult.raw.arrival_eta.getUTCHours()) { // Check if ETA is in the past, which would imply it is for the next day
30
- if (options.debug) {
31
- console.log("Label 8E: Moving ETA to subsequent day");
32
- }
33
- decodeResult.raw.arrival_eta.setDate(decodeResult.raw.arrival_eta.getDate() + 1);
34
- }
35
28
  decodeResult.formatted.items.push({
36
29
  type: 'eta',
37
30
  code: 'ETA',
38
31
  label: 'Estimated Time of Arrival',
39
- value: decodeResult.raw.arrival_eta.toGMTString(),
32
+ value: DateTimeUtils_1.DateTimeUtils.UTCToString(results.groups.arrival_eta),
40
33
  });
41
34
  decodeResult.raw.arrival_icao = results.groups.arrival_icao;
42
35
  decodeResult.formatted.items.push({
@@ -17,14 +17,14 @@ test('decodes Label 8E sample 1', () => {
17
17
  expect(decodeResult.decoder.name).toBe('label-8e');
18
18
  expect(decodeResult.formatted.description).toBe('ETA Report');
19
19
  expect(decodeResult.message.text).toBe('EGSS,1618');
20
- expect(decodeResult.raw.arrival_eta.getUTCHours()).toBe(16);
21
- expect(decodeResult.raw.arrival_eta.getUTCMinutes()).toBe(18);
22
20
  expect(decodeResult.raw.arrival_icao).toBe('EGSS');
23
21
  expect(decodeResult.formatted.items.length).toBe(2);
24
22
  expect(decodeResult.formatted.items[0].type).toBe('eta');
25
23
  expect(decodeResult.formatted.items[0].code).toBe('ETA');
26
24
  expect(decodeResult.formatted.items[0].label).toBe('Estimated Time of Arrival');
27
- expect(decodeResult.formatted.items[0].value.includes('16:18')).toBe(true);
25
+ // Check for the minutes as typescript doesn't have a UTC time string method
26
+ // so the hour will depend on the test host timezone.
27
+ expect(decodeResult.formatted.items[0].value.includes('18')).toBe(true);
28
28
  expect(decodeResult.formatted.items[1].type).toBe('destination');
29
29
  expect(decodeResult.formatted.items[1].code).toBe('DST');
30
30
  expect(decodeResult.formatted.items[1].label).toBe('Destination');
@@ -1,6 +1,8 @@
1
1
  export * from './Label_5Z';
2
2
  export * from './Label_15';
3
+ export * from './Label_16_N_Space';
3
4
  export * from './Label_20_POS';
5
+ export * from './Label_30_Slash_EA';
4
6
  export * from './Label_44_ETA';
5
7
  export * from './Label_44_IN';
6
8
  export * from './Label_44_OFF';
@@ -16,7 +16,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./Label_5Z"), exports);
18
18
  __exportStar(require("./Label_15"), exports);
19
+ __exportStar(require("./Label_16_N_Space"), exports);
19
20
  __exportStar(require("./Label_20_POS"), exports);
21
+ __exportStar(require("./Label_30_Slash_EA"), exports);
20
22
  __exportStar(require("./Label_44_ETA"), exports);
21
23
  __exportStar(require("./Label_44_IN"), exports);
22
24
  __exportStar(require("./Label_44_OFF"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@airframes/acars-decoder",
3
- "version": "1.4.4",
3
+ "version": "1.4.6",
4
4
  "description": "ACARS Message Decoder for TypeScript/JavaScript",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -20,8 +20,17 @@
20
20
  "url": "https://github.com/airframesio/acars-decoder-typescript/issues"
21
21
  },
22
22
  "homepage": "https://github.com/airframesio/acars-decoder-typescript#readme",
23
- "author": "Kevin Elliott <kevin@welikeinc.com>",
24
- "license": "UNLICENSED",
23
+ "keywords": [
24
+ "acars",
25
+ "decoder",
26
+ "airframes",
27
+ "airframes.io",
28
+ "airframesio",
29
+ "ts",
30
+ "typescript"
31
+ ],
32
+ "author": "Kevin Elliott <kevin@airframes.io>",
33
+ "license": "MIT",
25
34
  "dependencies": {
26
35
  "@types/node": "^14.14.22"
27
36
  },
@@ -0,0 +1,26 @@
1
+ export class DateTimeUtils {
2
+
3
+ // Expects a four digit UTC time string (HHMM)
4
+ public static UTCToString(UTCString: string) {
5
+ let utcDate = new Date();
6
+ utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);
7
+ return utcDate.toTimeString();
8
+ }
9
+
10
+ // Expects a six digit date string and a four digit UTC time string
11
+ // (DDMMYY) (HHMM)
12
+ public static UTCDateTimeToString(dateString: string, timeString: string) {
13
+ let utcDate = new Date();
14
+ utcDate.setUTCDate(+dateString.substr(0, 2));
15
+ utcDate.setUTCMonth(+dateString.substr(2, 2));
16
+ if (dateString.length === 6) {
17
+ utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));
18
+ }
19
+ utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);
20
+ return utcDate.toUTCString();
21
+ }
22
+ }
23
+
24
+ export default {
25
+ DateTimeUtils,
26
+ };