@packet-net/pdn-aprs 0.0.1

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 (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +661 -0
  3. package/README.md +192 -0
  4. package/THIRD-PARTY-NOTICES.md +5 -0
  5. package/dist/builder.d.ts +232 -0
  6. package/dist/builder.d.ts.map +1 -0
  7. package/dist/builder.js +508 -0
  8. package/dist/builder.js.map +1 -0
  9. package/dist/bytes.d.ts +19 -0
  10. package/dist/bytes.d.ts.map +1 -0
  11. package/dist/bytes.js +120 -0
  12. package/dist/bytes.js.map +1 -0
  13. package/dist/codes.d.ts +13 -0
  14. package/dist/codes.d.ts.map +1 -0
  15. package/dist/codes.js +112 -0
  16. package/dist/codes.js.map +1 -0
  17. package/dist/decode/context.d.ts +33 -0
  18. package/dist/decode/context.d.ts.map +1 -0
  19. package/dist/decode/context.js +65 -0
  20. package/dist/decode/context.js.map +1 -0
  21. package/dist/decode/index.d.ts +10 -0
  22. package/dist/decode/index.d.ts.map +1 -0
  23. package/dist/decode/index.js +121 -0
  24. package/dist/decode/index.js.map +1 -0
  25. package/dist/decode/message.d.ts +5 -0
  26. package/dist/decode/message.d.ts.map +1 -0
  27. package/dist/decode/message.js +190 -0
  28. package/dist/decode/message.js.map +1 -0
  29. package/dist/decode/other.d.ts +25 -0
  30. package/dist/decode/other.d.ts.map +1 -0
  31. package/dist/decode/other.js +326 -0
  32. package/dist/decode/other.js.map +1 -0
  33. package/dist/decode/positioned.d.ts +132 -0
  34. package/dist/decode/positioned.d.ts.map +1 -0
  35. package/dist/decode/positioned.js +1063 -0
  36. package/dist/decode/positioned.js.map +1 -0
  37. package/dist/decode/reports.d.ts +13 -0
  38. package/dist/decode/reports.d.ts.map +1 -0
  39. package/dist/decode/reports.js +375 -0
  40. package/dist/decode/reports.js.map +1 -0
  41. package/dist/decoder.d.ts +23 -0
  42. package/dist/decoder.d.ts.map +1 -0
  43. package/dist/decoder.js +75 -0
  44. package/dist/decoder.js.map +1 -0
  45. package/dist/deviceid-data.d.ts +33 -0
  46. package/dist/deviceid-data.d.ts.map +1 -0
  47. package/dist/deviceid-data.js +2941 -0
  48. package/dist/deviceid-data.js.map +1 -0
  49. package/dist/deviceid.d.ts +12 -0
  50. package/dist/deviceid.d.ts.map +1 -0
  51. package/dist/deviceid.js +86 -0
  52. package/dist/deviceid.js.map +1 -0
  53. package/dist/diagnostics.d.ts +48 -0
  54. package/dist/diagnostics.d.ts.map +1 -0
  55. package/dist/diagnostics.js +65 -0
  56. package/dist/diagnostics.js.map +1 -0
  57. package/dist/encode/common.d.ts +19 -0
  58. package/dist/encode/common.d.ts.map +1 -0
  59. package/dist/encode/common.js +84 -0
  60. package/dist/encode/common.js.map +1 -0
  61. package/dist/encode/index.d.ts +35 -0
  62. package/dist/encode/index.d.ts.map +1 -0
  63. package/dist/encode/index.js +248 -0
  64. package/dist/encode/index.js.map +1 -0
  65. package/dist/encode/other.d.ts +21 -0
  66. package/dist/encode/other.d.ts.map +1 -0
  67. package/dist/encode/other.js +253 -0
  68. package/dist/encode/other.js.map +1 -0
  69. package/dist/encode/position.d.ts +31 -0
  70. package/dist/encode/position.d.ts.map +1 -0
  71. package/dist/encode/position.js +729 -0
  72. package/dist/encode/position.js.map +1 -0
  73. package/dist/header.d.ts +42 -0
  74. package/dist/header.d.ts.map +1 -0
  75. package/dist/header.js +206 -0
  76. package/dist/header.js.map +1 -0
  77. package/dist/index.d.ts +13 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +14 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/neutral.d.ts +22 -0
  82. package/dist/neutral.d.ts.map +1 -0
  83. package/dist/neutral.js +593 -0
  84. package/dist/neutral.js.map +1 -0
  85. package/dist/symbols-data.d.ts +832 -0
  86. package/dist/symbols-data.d.ts.map +1 -0
  87. package/dist/symbols-data.js +173 -0
  88. package/dist/symbols-data.js.map +1 -0
  89. package/dist/symbols.d.ts +35 -0
  90. package/dist/symbols.d.ts.map +1 -0
  91. package/dist/symbols.js +71 -0
  92. package/dist/symbols.js.map +1 -0
  93. package/dist/types.d.ts +458 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +4 -0
  96. package/dist/types.js.map +1 -0
  97. package/package.json +68 -0
  98. package/src/builder.ts +617 -0
  99. package/src/bytes.ts +118 -0
  100. package/src/codes.ts +218 -0
  101. package/src/decode/context.ts +63 -0
  102. package/src/decode/index.ts +135 -0
  103. package/src/decode/message.ts +194 -0
  104. package/src/decode/other.ts +307 -0
  105. package/src/decode/positioned.ts +1161 -0
  106. package/src/decode/reports.ts +378 -0
  107. package/src/decoder.ts +76 -0
  108. package/src/deviceid-data.ts +2954 -0
  109. package/src/deviceid.ts +83 -0
  110. package/src/diagnostics.ts +86 -0
  111. package/src/encode/common.ts +87 -0
  112. package/src/encode/index.ts +280 -0
  113. package/src/encode/other.ts +247 -0
  114. package/src/encode/position.ts +656 -0
  115. package/src/header.ts +221 -0
  116. package/src/index.ts +57 -0
  117. package/src/neutral.ts +595 -0
  118. package/src/symbols-data.ts +181 -0
  119. package/src/symbols.ts +85 -0
  120. package/src/types.ts +571 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Every diagnostic code the decoder can report. */
2
+ export type DiagnosticCode = 'invalid-header' | 'invalid-address' | 'empty-destination' | 'empty-path-entry' | 'multiple-used-markers' | 'not-aprs-frame' | 'nul-padded-address' | 'invalid-ax25-address-characters' | 'too-many-digipeaters' | 'trailing-line-break' | 'non-utf8-text' | 'truncated' | 'not-aprs' | 'reserved-data-type' | 'obsolete-format' | 'out-of-range-value' | 'invalid-timestamp' | 'invalid-position' | 'invalid-latitude' | 'invalid-longitude' | 'lowercase-hemisphere' | 'invalid-symbol-table' | 'invalid-symbol-code' | 'invalid-compressed-position' | 'dao-with-ambiguity' | 'data-extension-in-comment' | 'invalid-object-name' | 'object-name-not-padded' | 'object-without-timestamp' | 'invalid-item-name' | 'incomplete-weather' | 'weather-comment' | 'invalid-weather' | 'invalid-mic-e-destination' | 'invalid-mic-e-information' | 'kenwood-ff-padding' | 'mic-e-missing-device-type' | 'invalid-message' | 'unpadded-addressee' | 'message-id-on-ack' | 'invalid-telemetry-metadata' | 'invalid-query' | 'invalid-telemetry' | 'invalid-status' | 'invalid-locator' | 'invalid-nmea' | 'nmea-checksum-mismatch' | 'invalid-third-party' | 'invalid-general-query' | 'invalid-capabilities' | 'invalid-user-defined' | 'invalid-agrelo-df' | 'missing-space-after-locator' | 'compression-type-reserved-bits' | 'malformed-timestamp' | 'position-not-at-start' | 'non-standard-weather-field-width' | 'wind-fields-instead-of-extension' | 'wind-extension-after-compressed' | 'mic-e-altitude-not-first' | 'brace-in-message-text' | 'invalid-addressee-characters' | 'letter-group-bulletin' | 'free-text-capabilities';
3
+ /** The codes a lenient decoder may accept with a warning; a strict decoder rejects them. */
4
+ export type TolerableCode = 'empty-destination' | 'empty-path-entry' | 'multiple-used-markers' | 'nul-padded-address' | 'invalid-ax25-address-characters' | 'trailing-line-break' | 'non-utf8-text' | 'out-of-range-value' | 'invalid-timestamp' | 'lowercase-hemisphere' | 'dao-with-ambiguity' | 'data-extension-in-comment' | 'object-name-not-padded' | 'object-without-timestamp' | 'incomplete-weather' | 'weather-comment' | 'kenwood-ff-padding' | 'unpadded-addressee' | 'message-id-on-ack' | 'invalid-telemetry' | 'missing-space-after-locator' | 'compression-type-reserved-bits' | 'malformed-timestamp' | 'position-not-at-start' | 'non-standard-weather-field-width' | 'wind-fields-instead-of-extension' | 'wind-extension-after-compressed' | 'mic-e-altitude-not-first' | 'brace-in-message-text' | 'invalid-addressee-characters' | 'letter-group-bulletin' | 'free-text-capabilities';
5
+ /** What each code means, in plain ASCII. */
6
+ export declare const DIAGNOSTIC_MEANINGS: Readonly<Record<DiagnosticCode, string>>;
7
+ /** Every tolerable code. */
8
+ export declare const TOLERABLE_CODES: readonly TolerableCode[];
9
+ /** Whether a code is one a lenient decoder may tolerate. */
10
+ export declare function isTolerable(code: DiagnosticCode): code is TolerableCode;
11
+ /** Every diagnostic code. */
12
+ export declare const DIAGNOSTIC_CODES: readonly DiagnosticCode[];
13
+ //# sourceMappingURL=codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAGA,oDAAoD;AACpD,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,uBAAuB,GACvB,gBAAgB,GAChB,oBAAoB,GACpB,iCAAiC,GACjC,sBAAsB,GACtB,qBAAqB,GACrB,eAAe,GACf,WAAW,GACX,UAAU,GACV,oBAAoB,GACpB,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,qBAAqB,GACrB,6BAA6B,GAC7B,oBAAoB,GACpB,2BAA2B,GAC3B,qBAAqB,GACrB,wBAAwB,GACxB,0BAA0B,GAC1B,mBAAmB,GACnB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,GACjB,2BAA2B,GAC3B,2BAA2B,GAC3B,oBAAoB,GACpB,2BAA2B,GAC3B,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,4BAA4B,GAC5B,eAAe,GACf,mBAAmB,GACnB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,wBAAwB,GACxB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GACnB,6BAA6B,GAC7B,gCAAgC,GAChC,qBAAqB,GACrB,uBAAuB,GACvB,kCAAkC,GAClC,kCAAkC,GAClC,iCAAiC,GACjC,0BAA0B,GAC1B,uBAAuB,GACvB,8BAA8B,GAC9B,uBAAuB,GACvB,wBAAwB,CAAC;AAE7B,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,uBAAuB,GACvB,oBAAoB,GACpB,iCAAiC,GACjC,qBAAqB,GACrB,eAAe,GACf,oBAAoB,GACpB,mBAAmB,GACnB,sBAAsB,GACtB,oBAAoB,GACpB,2BAA2B,GAC3B,wBAAwB,GACxB,0BAA0B,GAC1B,oBAAoB,GACpB,iBAAiB,GACjB,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,GACnB,6BAA6B,GAC7B,gCAAgC,GAChC,qBAAqB,GACrB,uBAAuB,GACvB,kCAAkC,GAClC,kCAAkC,GAClC,iCAAiC,GACjC,0BAA0B,GAC1B,uBAAuB,GACvB,8BAA8B,GAC9B,uBAAuB,GACvB,wBAAwB,CAAC;AAE7B,4CAA4C;AAC5C,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAiExE,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAiCnD,CAAC;AAIF,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,IAAI,aAAa,CAEvE;AAED,6BAA6B;AAC7B,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAyD,CAAC"}
package/dist/codes.js ADDED
@@ -0,0 +1,112 @@
1
+ // The diagnostic codes, one for each code in the conformance vectors' codes.json.
2
+ // Generated from vectors/codes.json; keep in step with it.
3
+ /** What each code means, in plain ASCII. */
4
+ export const DIAGNOSTIC_MEANINGS = {
5
+ 'invalid-header': "The TNC2 header is not SOURCE>DEST[,PATH]:.",
6
+ 'invalid-address': "An address is empty, too long, or has characters that cannot appear in one.",
7
+ 'empty-destination': "The destination address is empty (UAP 5.2).",
8
+ 'empty-path-entry': "The digipeater path has an empty entry (UAP 5.6).",
9
+ 'multiple-used-markers': "More than one path entry is marked used with *; only the last used one should be (UAP 5.30).",
10
+ 'not-aprs-frame': "The AX.25 frame is not a UI frame with PID 0xF0, or is too short (APRS12c ch. 3).",
11
+ 'nul-padded-address': "An AX.25 address is padded with NUL rather than spaces (UAP 5.29).",
12
+ 'invalid-ax25-address-characters': "An AX.25 address has characters other than upper-case letters and digits.",
13
+ 'too-many-digipeaters': "The AX.25 frame has more than 8 digipeater addresses.",
14
+ 'trailing-line-break': "The information field ends with CR or LF (APRS12c ch. 5, UAP 5.13).",
15
+ 'non-utf8-text': "Text that is not valid UTF-8 (UAP 5.16).",
16
+ 'truncated': "The information field is shorter than its format requires.",
17
+ 'not-aprs': "The first byte is not a data type identifier (APRS12c ch. 20).",
18
+ 'reserved-data-type': "A reserved data type identifier with no defined format (APRS12c ch. 5).",
19
+ 'obsolete-format': "A format the spec marks obsolete or not recommended, e.g. raw NMEA or raw weather.",
20
+ 'out-of-range-value': "A value in a well-formed field is out of range and was dropped.",
21
+ 'invalid-timestamp': "A timestamp is malformed or out of range (APRS12c ch. 6, UAP 5.8).",
22
+ 'invalid-position': "The position is missing or starts with something that cannot begin one.",
23
+ 'invalid-latitude': "The latitude is malformed (APRS12c ch. 6, UAP 5.7).",
24
+ 'invalid-longitude': "The longitude is malformed (APRS12c ch. 6, UAP 5.7).",
25
+ 'lowercase-hemisphere': "A lower-case hemisphere letter (UAP 5.9).",
26
+ 'invalid-symbol-table': "The symbol table identifier is not /, \\, 0-9 or A-Z.",
27
+ 'invalid-symbol-code': "The symbol code is not printable ASCII.",
28
+ 'invalid-compressed-position': "A compressed position is malformed (APRS12c ch. 9).",
29
+ 'dao-with-ambiguity': "A !DAO! adds precision to an ambiguous position, which contradicts it.",
30
+ 'data-extension-in-comment': "A data extension (PHG, RNG, DFS) appears later in the comment (UAP 5.15).",
31
+ 'invalid-object-name': "The object name is empty or not printable ASCII.",
32
+ 'object-name-not-padded': "The object name is not padded to 9 characters.",
33
+ 'object-without-timestamp': "An object report has no timestamp (APRS12c ch. 11).",
34
+ 'invalid-item-name': "The item name is not 3-9 printable characters followed by ! or _.",
35
+ 'incomplete-weather': "A weather report lacks a mandatory field (APRS12c ch. 12).",
36
+ 'weather-comment': "Text after the weather data; weather reports have no comment (UAP 2.7.1, ch. 5.33).",
37
+ 'invalid-weather': "Positionless or raw weather data that could not be decoded.",
38
+ 'invalid-mic-e-destination': "The destination address is not a valid Mic-E encoding (APRS12c ch. 10).",
39
+ 'invalid-mic-e-information': "The Mic-E information field is malformed (APRS12c ch. 10).",
40
+ 'kenwood-ff-padding': "Kenwood TM-D710 0xFF padding was removed (UAP 5.10).",
41
+ 'mic-e-missing-device-type': "A Mic-E report without a device type prefix (UAP 5.4).",
42
+ 'invalid-message': "A message is malformed (APRS12c ch. 14).",
43
+ 'unpadded-addressee': "The addressee is not padded to 9 characters.",
44
+ 'message-id-on-ack': "An ack or rej carries a message ID of its own (UAP 5.32).",
45
+ 'invalid-telemetry-metadata': "A telemetry metadata message (PARM/UNIT/EQNS/BITS) is malformed (APRS12c ch. 13).",
46
+ 'invalid-query': "A directed query is malformed (APRS12c ch. 15, UAP 5.18).",
47
+ 'invalid-telemetry': "A telemetry report is malformed (APRS12c ch. 13).",
48
+ 'invalid-status': "A status report is malformed (APRS12c ch. 16).",
49
+ 'invalid-locator': "A Maidenhead locator is malformed.",
50
+ 'invalid-nmea': "An NMEA sentence is malformed.",
51
+ 'nmea-checksum-mismatch': "An NMEA sentence's checksum does not match, so the sentence is corrupt and is not decoded.",
52
+ 'invalid-third-party': "A third-party header is malformed (APRS12c ch. 17).",
53
+ 'invalid-general-query': "A general query is malformed (APRS12c ch. 15).",
54
+ 'invalid-capabilities': "A station capabilities report is malformed (APRS12c ch. 15).",
55
+ 'invalid-user-defined': "A user-defined packet is shorter than its 3-byte header (APRS12c ch. 19).",
56
+ 'invalid-agrelo-df': "An Agrelo DF report is malformed.",
57
+ 'missing-space-after-locator': "A grid-locator status report lacks the mandatory space before its text (UAP 5.17).",
58
+ 'compression-type-reserved-bits': "A compressed position's type byte sets its unused high bits (APRS12c ch. 9).",
59
+ 'malformed-timestamp': "A timestamped position report whose timestamp is missing or not timestamp-shaped (UAP 5.8).",
60
+ 'position-not-at-start': "A ! position found after other text (obsolete TNC beacon rule).",
61
+ 'non-standard-weather-field-width': "A weather field is one character shorter or longer than its fixed width (UAP 5.31).",
62
+ 'wind-fields-instead-of-extension': "Wind sent as c/s fields in a position weather report instead of the DDD/SSS extension, or after a compressed position whose cs bytes carry no wind.",
63
+ 'wind-extension-after-compressed': "An uncompressed wind extension after a compressed weather position (UAP 5.33).",
64
+ 'mic-e-altitude-not-first': "A Mic-E altitude after other status text instead of first (APRS12c ch. 10).",
65
+ 'brace-in-message-text': "Message text contains a { that does not start a valid message ID (APRS12c ch. 14).",
66
+ 'invalid-addressee-characters': "A message addressee contains a space or : (APRS12c ch. 14).",
67
+ 'letter-group-bulletin': "A bulletin addressee has a group name after a letter, e.g. BLNCNET; group bulletins use a digit (APRS12c ch. 14).",
68
+ 'free-text-capabilities': "A < station capabilities packet holds free text rather than TOKEN / TOKEN=VALUE items (APRS12c ch. 15).",
69
+ };
70
+ /** Every tolerable code. */
71
+ export const TOLERABLE_CODES = [
72
+ 'empty-destination',
73
+ 'empty-path-entry',
74
+ 'multiple-used-markers',
75
+ 'nul-padded-address',
76
+ 'invalid-ax25-address-characters',
77
+ 'trailing-line-break',
78
+ 'non-utf8-text',
79
+ 'out-of-range-value',
80
+ 'invalid-timestamp',
81
+ 'lowercase-hemisphere',
82
+ 'dao-with-ambiguity',
83
+ 'data-extension-in-comment',
84
+ 'object-name-not-padded',
85
+ 'object-without-timestamp',
86
+ 'incomplete-weather',
87
+ 'weather-comment',
88
+ 'kenwood-ff-padding',
89
+ 'unpadded-addressee',
90
+ 'message-id-on-ack',
91
+ 'invalid-telemetry',
92
+ 'missing-space-after-locator',
93
+ 'compression-type-reserved-bits',
94
+ 'malformed-timestamp',
95
+ 'position-not-at-start',
96
+ 'non-standard-weather-field-width',
97
+ 'wind-fields-instead-of-extension',
98
+ 'wind-extension-after-compressed',
99
+ 'mic-e-altitude-not-first',
100
+ 'brace-in-message-text',
101
+ 'invalid-addressee-characters',
102
+ 'letter-group-bulletin',
103
+ 'free-text-capabilities',
104
+ ];
105
+ const tolerableSet = new Set(TOLERABLE_CODES);
106
+ /** Whether a code is one a lenient decoder may tolerate. */
107
+ export function isTolerable(code) {
108
+ return tolerableSet.has(code);
109
+ }
110
+ /** Every diagnostic code. */
111
+ export const DIAGNOSTIC_CODES = Object.keys(DIAGNOSTIC_MEANINGS);
112
+ //# sourceMappingURL=codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../src/codes.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,2DAA2D;AAwG3D,4CAA4C;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAA6C;IAC3E,gBAAgB,EAAE,6CAA6C;IAC/D,iBAAiB,EAAE,6EAA6E;IAChG,mBAAmB,EAAE,6CAA6C;IAClE,kBAAkB,EAAE,mDAAmD;IACvE,uBAAuB,EAAE,8FAA8F;IACvH,gBAAgB,EAAE,mFAAmF;IACrG,oBAAoB,EAAE,oEAAoE;IAC1F,iCAAiC,EAAE,2EAA2E;IAC9G,sBAAsB,EAAE,uDAAuD;IAC/E,qBAAqB,EAAE,qEAAqE;IAC5F,eAAe,EAAE,0CAA0C;IAC3D,WAAW,EAAE,4DAA4D;IACzE,UAAU,EAAE,gEAAgE;IAC5E,oBAAoB,EAAE,yEAAyE;IAC/F,iBAAiB,EAAE,oFAAoF;IACvG,oBAAoB,EAAE,iEAAiE;IACvF,mBAAmB,EAAE,oEAAoE;IACzF,kBAAkB,EAAE,yEAAyE;IAC7F,kBAAkB,EAAE,qDAAqD;IACzE,mBAAmB,EAAE,sDAAsD;IAC3E,sBAAsB,EAAE,2CAA2C;IACnE,sBAAsB,EAAE,uDAAuD;IAC/E,qBAAqB,EAAE,yCAAyC;IAChE,6BAA6B,EAAE,qDAAqD;IACpF,oBAAoB,EAAE,wEAAwE;IAC9F,2BAA2B,EAAE,2EAA2E;IACxG,qBAAqB,EAAE,kDAAkD;IACzE,wBAAwB,EAAE,gDAAgD;IAC1E,0BAA0B,EAAE,qDAAqD;IACjF,mBAAmB,EAAE,mEAAmE;IACxF,oBAAoB,EAAE,4DAA4D;IAClF,iBAAiB,EAAE,qFAAqF;IACxG,iBAAiB,EAAE,6DAA6D;IAChF,2BAA2B,EAAE,yEAAyE;IACtG,2BAA2B,EAAE,4DAA4D;IACzF,oBAAoB,EAAE,sDAAsD;IAC5E,2BAA2B,EAAE,wDAAwD;IACrF,iBAAiB,EAAE,0CAA0C;IAC7D,oBAAoB,EAAE,8CAA8C;IACpE,mBAAmB,EAAE,2DAA2D;IAChF,4BAA4B,EAAE,mFAAmF;IACjH,eAAe,EAAE,2DAA2D;IAC5E,mBAAmB,EAAE,mDAAmD;IACxE,gBAAgB,EAAE,gDAAgD;IAClE,iBAAiB,EAAE,oCAAoC;IACvD,cAAc,EAAE,gCAAgC;IAChD,wBAAwB,EAAE,4FAA4F;IACtH,qBAAqB,EAAE,qDAAqD;IAC5E,uBAAuB,EAAE,gDAAgD;IACzE,sBAAsB,EAAE,8DAA8D;IACtF,sBAAsB,EAAE,2EAA2E;IACnG,mBAAmB,EAAE,mCAAmC;IACxD,6BAA6B,EAAE,oFAAoF;IACnH,gCAAgC,EAAE,8EAA8E;IAChH,qBAAqB,EAAE,6FAA6F;IACpH,uBAAuB,EAAE,iEAAiE;IAC1F,kCAAkC,EAAE,qFAAqF;IACzH,kCAAkC,EAAE,qJAAqJ;IACzL,iCAAiC,EAAE,gFAAgF;IACnH,0BAA0B,EAAE,6EAA6E;IACzG,uBAAuB,EAAE,oFAAoF;IAC7G,8BAA8B,EAAE,6DAA6D;IAC7F,uBAAuB,EAAE,mHAAmH;IAC5I,wBAAwB,EAAE,yGAAyG;CACpI,CAAC;AAEF,4BAA4B;AAC5B,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,mBAAmB;IACnB,kBAAkB;IAClB,uBAAuB;IACvB,oBAAoB;IACpB,iCAAiC;IACjC,qBAAqB;IACrB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,oBAAoB;IACpB,2BAA2B;IAC3B,wBAAwB;IACxB,0BAA0B;IAC1B,oBAAoB;IACpB,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,6BAA6B;IAC7B,gCAAgC;IAChC,qBAAqB;IACrB,uBAAuB;IACvB,kCAAkC;IAClC,kCAAkC;IAClC,iCAAiC;IACjC,0BAA0B;IAC1B,uBAAuB;IACvB,8BAA8B;IAC9B,uBAAuB;IACvB,wBAAwB;CACzB,CAAC;AAEF,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAS,eAAe,CAAC,CAAC;AAE3E,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,IAAoB;IAC9C,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,MAAM,gBAAgB,GAA8B,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAqB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { DiagnosticCode } from '../codes.js';
2
+ import { type Diagnostic, type ParseOptions } from '../diagnostics.js';
3
+ /** Thrown inside the decoders when the packet is rejected; caught at the top. */
4
+ export declare class Rejected {
5
+ readonly code: DiagnosticCode;
6
+ constructor(code: DiagnosticCode);
7
+ }
8
+ export declare class DecodeContext {
9
+ readonly options: ParseOptions;
10
+ /** The destination address (Mic-E carries half its position there). */
11
+ readonly destination: string;
12
+ readonly diagnostics: Diagnostic[];
13
+ private nonUtf8Reported;
14
+ constructor(options: ParseOptions,
15
+ /** The destination address (Mic-E carries half its position there). */
16
+ destination: string);
17
+ info(code: DiagnosticCode): void;
18
+ /** Rejects the packet: an error, then nothing more is decoded. */
19
+ fail(code: DiagnosticCode): never;
20
+ /** A tolerable defect: a warning when tolerated, else the packet is rejected. */
21
+ tolerate(code: DiagnosticCode): void;
22
+ /**
23
+ * A tolerable defect that a strict decoder reads differently rather than rejecting: returns
24
+ * whether it is tolerated, with a warning if so.
25
+ */
26
+ allows(code: DiagnosticCode): boolean;
27
+ /**
28
+ * Decodes a text field from its bytes (a binary string): UTF-8, or when it is not valid UTF-8,
29
+ * the whole field as Latin-1 with one `non-utf8-text` warning for the packet.
30
+ */
31
+ text(binary: string): string;
32
+ }
33
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/decode/context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAc,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEnF,iFAAiF;AACjF,qBAAa,QAAQ;IACP,QAAQ,CAAC,IAAI,EAAE,cAAc;IAAzC,YAAqB,IAAI,EAAE,cAAc,EAAI;CAC9C;AAED,qBAAa,aAAa;IAKtB,QAAQ,CAAC,OAAO,EAAE,YAAY;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM;IAN9B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAM;IACxC,OAAO,CAAC,eAAe,CAAS;IAEhC,YACW,OAAO,EAAE,YAAY;IAC9B,uEAAuE;IAC9D,WAAW,EAAE,MAAM,EAC1B;IAEJ,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAE/B;IAED,kEAAkE;IAClE,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,KAAK,CAGhC;IAED,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAGnC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAIpC;IAED;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAS3B;CACF"}
@@ -0,0 +1,65 @@
1
+ // State shared by the information field decoders: the options, the diagnostics so far, and how
2
+ // a defect is tolerated or rejected.
3
+ import { decodeUtf8Binary, isAscii } from '../bytes.js';
4
+ import { diagnostic } from '../diagnostics.js';
5
+ /** Thrown inside the decoders when the packet is rejected; caught at the top. */
6
+ export class Rejected {
7
+ code;
8
+ constructor(code) {
9
+ this.code = code;
10
+ }
11
+ }
12
+ export class DecodeContext {
13
+ options;
14
+ destination;
15
+ diagnostics = [];
16
+ nonUtf8Reported = false;
17
+ constructor(options,
18
+ /** The destination address (Mic-E carries half its position there). */
19
+ destination) {
20
+ this.options = options;
21
+ this.destination = destination;
22
+ }
23
+ info(code) {
24
+ this.diagnostics.push(diagnostic('info', code));
25
+ }
26
+ /** Rejects the packet: an error, then nothing more is decoded. */
27
+ fail(code) {
28
+ this.diagnostics.push(diagnostic('error', code));
29
+ throw new Rejected(code);
30
+ }
31
+ /** A tolerable defect: a warning when tolerated, else the packet is rejected. */
32
+ tolerate(code) {
33
+ if (this.options.tolerates(code))
34
+ this.diagnostics.push(diagnostic('warning', code));
35
+ else
36
+ this.fail(code);
37
+ }
38
+ /**
39
+ * A tolerable defect that a strict decoder reads differently rather than rejecting: returns
40
+ * whether it is tolerated, with a warning if so.
41
+ */
42
+ allows(code) {
43
+ if (!this.options.tolerates(code))
44
+ return false;
45
+ this.diagnostics.push(diagnostic('warning', code));
46
+ return true;
47
+ }
48
+ /**
49
+ * Decodes a text field from its bytes (a binary string): UTF-8, or when it is not valid UTF-8,
50
+ * the whole field as Latin-1 with one `non-utf8-text` warning for the packet.
51
+ */
52
+ text(binary) {
53
+ if (isAscii(binary))
54
+ return binary;
55
+ const decoded = decodeUtf8Binary(binary);
56
+ if (decoded !== undefined)
57
+ return decoded;
58
+ if (!this.nonUtf8Reported) {
59
+ this.nonUtf8Reported = true;
60
+ this.tolerate('non-utf8-text');
61
+ }
62
+ return binary;
63
+ }
64
+ }
65
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/decode/context.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,qCAAqC;AAErC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,UAAU,EAAsC,MAAM,mBAAmB,CAAC;AAEnF,iFAAiF;AACjF,MAAM,OAAO,QAAQ;IACE,IAAI;IAAzB,YAAqB,IAAoB;oBAApB,IAAI;IAAmB,CAAC;CAC9C;AAED,MAAM,OAAO,aAAa;IAKb,OAAO;IAEP,WAAW;IANb,WAAW,GAAiB,EAAE,CAAC;IAChC,eAAe,GAAG,KAAK,CAAC;IAEhC,YACW,OAAqB;IAC9B,uEAAuE;IAC9D,WAAmB;uBAFnB,OAAO;2BAEP,WAAW;IACnB,CAAC;IAEJ,IAAI,CAAC,IAAoB;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,kEAAkE;IAClE,IAAI,CAAC,IAAoB;QACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,iFAAiF;IACjF,QAAQ,CAAC,IAAoB;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;;YAChF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAoB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,MAAc;QACjB,IAAI,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { Diagnostic, ParseOptions } from '../diagnostics.js';
2
+ import type { AprsData } from '../types.js';
3
+ /** The result of decoding an information field. */
4
+ export interface DecodedInformation {
5
+ data: AprsData;
6
+ diagnostics: Diagnostic[];
7
+ }
8
+ /** Decodes an information field; `destination` matters for Mic-E. */
9
+ export declare function decodeInformation(info: Uint8Array, destination: string, options: ParseOptions): DecodedInformation;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decode/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,QAAQ,EAA0B,MAAM,aAAa,CAAC;AAkBpE,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,kBAAkB,CAalH"}
@@ -0,0 +1,121 @@
1
+ // The information field decoder: picks the format by the data type identifier.
2
+ import { binaryToBytes, bytesToBinary } from '../bytes.js';
3
+ import { findQConstruct, parseHeaderText } from '../header.js';
4
+ import { DecodeContext, Rejected } from './context.js';
5
+ import { decodeMessage } from './message.js';
6
+ import { decodeAgrelo, decodeCapabilities, decodeDollar, decodeMaidenhead, decodeQuery, decodeRawWeather, decodeStatus, decodeTelemetry, decodeTest, decodeUserDefined, } from './other.js';
7
+ import { positionDecodesAt } from './positioned.js';
8
+ import { decodeItem, decodeMicE, decodeObject, decodePositionlessWeather, decodePositionReport } from './reports.js';
9
+ /** Decodes an information field; `destination` matters for Mic-E. */
10
+ export function decodeInformation(info, destination, options) {
11
+ const ctx = new DecodeContext(options, destination);
12
+ let data;
13
+ try {
14
+ let end = info.length;
15
+ while (end > 0 && (info[end - 1] === 0x0d || info[end - 1] === 0x0a))
16
+ end--;
17
+ if (end < info.length)
18
+ ctx.tolerate('trailing-line-break');
19
+ data = dispatch(ctx, bytesToBinary(info, 0, end), options);
20
+ }
21
+ catch (e) {
22
+ if (!(e instanceof Rejected))
23
+ throw e;
24
+ data = { type: 'unrecognized', reason: 'malformed' };
25
+ }
26
+ return { data, diagnostics: ctx.diagnostics };
27
+ }
28
+ function dispatch(ctx, s, options) {
29
+ if (s.length === 0)
30
+ return { type: 'unrecognized', reason: 'empty' };
31
+ switch (s[0]) {
32
+ case '!':
33
+ if (s[1] === '!')
34
+ return decodeRawWeather(ctx, s.slice(2), 'ultimeter-logging');
35
+ return decodePositionReport(ctx, s);
36
+ case '=':
37
+ case '/':
38
+ case '@':
39
+ return decodePositionReport(ctx, s);
40
+ case '`':
41
+ case "'":
42
+ case '\x1c':
43
+ case '\x1d':
44
+ return decodeMicE(ctx, s);
45
+ case ';':
46
+ return decodeObject(ctx, s);
47
+ case ')':
48
+ return decodeItem(ctx, s);
49
+ case ':':
50
+ return decodeMessage(ctx, s);
51
+ case '>':
52
+ return decodeStatus(ctx, s);
53
+ case '<':
54
+ return decodeCapabilities(ctx, s);
55
+ case '?':
56
+ return decodeQuery(ctx, s);
57
+ case 'T':
58
+ return decodeTelemetry(ctx, s);
59
+ case '_':
60
+ return decodePositionlessWeather(ctx, s);
61
+ case '#':
62
+ return decodeRawWeather(ctx, s.slice(1), 'peet-bros-hash');
63
+ case '*':
64
+ return decodeRawWeather(ctx, s.slice(1), 'peet-bros-star');
65
+ case '$':
66
+ return decodeDollar(ctx, s);
67
+ case '%':
68
+ return decodeAgrelo(ctx, s);
69
+ case '{':
70
+ return decodeUserDefined(ctx, s);
71
+ case '}':
72
+ return decodeThirdParty(ctx, s, options);
73
+ case ',':
74
+ return decodeTest(ctx, s);
75
+ case '[':
76
+ return decodeMaidenhead(ctx, s);
77
+ case '&':
78
+ case '+':
79
+ case '.':
80
+ ctx.info('reserved-data-type');
81
+ return { type: 'unrecognized', reason: 'reserved-data-type' };
82
+ default: {
83
+ // The obsolete TNC beacon rule: a ! position anywhere in the first 40 characters.
84
+ const bang = s.indexOf('!');
85
+ if (bang > 0 && bang < 40 && positionDecodesAt(ctx, s, bang + 1) && ctx.allows('position-not-at-start')) {
86
+ return decodePositionReport(ctx, s.slice(bang));
87
+ }
88
+ ctx.info('not-aprs');
89
+ return { type: 'unrecognized', reason: 'not-aprs' };
90
+ }
91
+ }
92
+ }
93
+ function decodeThirdParty(ctx, s, options) {
94
+ const body = s.slice(1);
95
+ const colon = body.indexOf(':');
96
+ if (colon < 0)
97
+ ctx.fail('invalid-third-party');
98
+ const headerDiags = [];
99
+ let header;
100
+ try {
101
+ header = parseHeaderText(body.slice(0, colon), options, headerDiags);
102
+ }
103
+ catch {
104
+ return ctx.fail('invalid-third-party');
105
+ }
106
+ const info = binaryToBytes(body.slice(colon + 1));
107
+ const inner = decodeInformation(info, header.destination, options);
108
+ const packet = {
109
+ source: header.source,
110
+ destination: header.destination,
111
+ path: header.path,
112
+ information: info,
113
+ data: inner.data,
114
+ diagnostics: [...headerDiags, ...inner.diagnostics],
115
+ };
116
+ const q = findQConstruct(header.path);
117
+ if (q)
118
+ packet.qConstruct = q;
119
+ return { type: 'third-party', packet };
120
+ }
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decode/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AprsData } from '../types.js';
2
+ import type { DecodeContext } from './context.js';
3
+ /** `:`: a message, or one of the things sent in message form. */
4
+ export declare function decodeMessage(ctx: DecodeContext, s: string): AprsData;
5
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/decode/message.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAkClD,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,CAqErE"}
@@ -0,0 +1,190 @@
1
+ // Messages, acks and rejects, bulletins, telemetry metadata and directed queries (APRS12c ch.
2
+ // 13-15).
3
+ /** Known directed query types (APRS12c ch. 15), longest first. */
4
+ const DIRECTED_QUERY_TYPES = ['APRSD', 'APRSH', 'APRSM', 'APRSO', 'APRSP', 'APRSS', 'APRST', 'PING?'];
5
+ const MESSAGE_ID_RE = /^([A-Za-z0-9]{1,5})(?:\}([A-Za-z0-9]{0,5}))?$/;
6
+ const ACK_RE = /^(ack|rej)([A-Za-z0-9]{1,5})(?:\}([A-Za-z0-9]{0,5}))?(\{.*)?$/;
7
+ const COEFFICIENT_RE = /^[+-]?(?:[0-9]+\.?[0-9]*|\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;
8
+ /** Splits `text{id}ack` into its parts; reports a brace that does not start an ID. */
9
+ function splitMessageId(ctx, text) {
10
+ const brace = text.lastIndexOf('{');
11
+ if (brace < 0)
12
+ return { text };
13
+ const m = MESSAGE_ID_RE.exec(text.slice(brace + 1));
14
+ if (!m) {
15
+ ctx.tolerate('brace-in-message-text');
16
+ return { text };
17
+ }
18
+ const out = { text: text.slice(0, brace), messageId: m[1] };
19
+ if (m[2] !== undefined)
20
+ out.replyAck = m[2];
21
+ if (out.text.includes('{'))
22
+ ctx.tolerate('brace-in-message-text');
23
+ return out;
24
+ }
25
+ function parseList(body) {
26
+ return body.split(',');
27
+ }
28
+ /** `:`: a message, or one of the things sent in message form. */
29
+ export function decodeMessage(ctx, s) {
30
+ if (s[1] === ':')
31
+ ctx.fail('invalid-message');
32
+ let colon = -1;
33
+ if (s.length > 10 && s[10] === ':') {
34
+ colon = 10;
35
+ }
36
+ else {
37
+ for (let k = 2; k <= 9 && k < s.length; k++) {
38
+ if (s[k] === ':') {
39
+ colon = k;
40
+ break;
41
+ }
42
+ }
43
+ if (colon < 0)
44
+ ctx.fail('invalid-message');
45
+ ctx.tolerate('unpadded-addressee');
46
+ }
47
+ const addressee = s.slice(1, colon).replace(/ +$/, '');
48
+ if (addressee.length === 0 || !/^[\x20-\x7e]+$/.test(addressee))
49
+ ctx.fail('invalid-message');
50
+ if (/[ :]/.test(addressee))
51
+ ctx.tolerate('invalid-addressee-characters');
52
+ const body = s.slice(colon + 1);
53
+ // Acks and rejects.
54
+ const ack = ACK_RE.exec(body);
55
+ if (ack) {
56
+ if (ack[4] !== undefined)
57
+ ctx.tolerate('message-id-on-ack');
58
+ const replyAck = ack[3];
59
+ if (ack[1] === 'ack') {
60
+ return replyAck === undefined
61
+ ? { type: 'ack', addressee, ackedId: ack[2] }
62
+ : { type: 'ack', addressee, ackedId: ack[2], replyAck };
63
+ }
64
+ return replyAck === undefined
65
+ ? { type: 'reject', addressee, rejectedId: ack[2] }
66
+ : { type: 'reject', addressee, rejectedId: ack[2], replyAck };
67
+ }
68
+ // Bulletins and announcements.
69
+ if (/^BLN[0-9]/.test(addressee) || /^BLN[A-Z]$/.test(addressee) || /^BLN[A-Z]./.test(addressee)) {
70
+ if (/^BLN[A-Z]./.test(addressee))
71
+ ctx.tolerate('letter-group-bulletin');
72
+ const split = splitMessageId(ctx, body);
73
+ const text = ctx.text(split.text);
74
+ return withId({ type: 'bulletin', addressee, text }, split.messageId);
75
+ }
76
+ if (/^NWS[-_]/.test(addressee)) {
77
+ const split = splitMessageId(ctx, body);
78
+ const text = ctx.text(split.text);
79
+ return withId({ type: 'nws-bulletin', addressee, text }, split.messageId);
80
+ }
81
+ // Directed queries.
82
+ if (body.startsWith('?')) {
83
+ const query = directedQuery(ctx, addressee, body);
84
+ if (query)
85
+ return query;
86
+ }
87
+ const split = splitMessageId(ctx, body);
88
+ // Telemetry metadata: its structure is checked before the text's encoding.
89
+ const meta = telemetryMetadata(ctx, addressee, split.text, split.messageId);
90
+ if (meta)
91
+ return meta;
92
+ const text = ctx.text(split.text);
93
+ const message = {
94
+ type: 'message',
95
+ addressee,
96
+ text,
97
+ };
98
+ if (split.messageId !== undefined)
99
+ message.messageId = split.messageId;
100
+ if (split.replyAck !== undefined)
101
+ message.replyAck = split.replyAck;
102
+ return message;
103
+ }
104
+ function withId(data, messageId) {
105
+ return messageId === undefined ? data : { ...data, messageId };
106
+ }
107
+ function directedQuery(ctx, addressee, body) {
108
+ const q = body.slice(1);
109
+ if (q.includes('{')) {
110
+ ctx.info('invalid-query');
111
+ return undefined;
112
+ }
113
+ const known = DIRECTED_QUERY_TYPES.find((t) => q.startsWith(t));
114
+ const knownLower = DIRECTED_QUERY_TYPES.find((t) => q.toUpperCase().startsWith(t));
115
+ let queryType;
116
+ let rest = '';
117
+ if (known) {
118
+ queryType = known;
119
+ rest = q.slice(known.length);
120
+ }
121
+ else if (knownLower) {
122
+ ctx.info('invalid-query');
123
+ return undefined;
124
+ }
125
+ else {
126
+ const m = /^([A-Z]+)(?= |$)/.exec(q);
127
+ if (!m)
128
+ return undefined;
129
+ queryType = m[1];
130
+ rest = q.slice(queryType.length);
131
+ }
132
+ if (rest.includes('{')) {
133
+ ctx.info('invalid-query');
134
+ return undefined;
135
+ }
136
+ const target = rest.trim();
137
+ if (target.length === 0)
138
+ return { type: 'directed-query', addressee, queryType };
139
+ if (/^[A-Za-z0-9-]{1,9}$/.test(target))
140
+ return { type: 'directed-query', addressee, queryType, target };
141
+ ctx.info('invalid-query');
142
+ return undefined;
143
+ }
144
+ /** Telemetry metadata sent as a message; `binary` is the text's bytes, decoded once it is valid. */
145
+ function telemetryMetadata(ctx, addressee, binary, messageId) {
146
+ const kind = binary.slice(0, 5);
147
+ if (kind !== 'PARM.' && kind !== 'UNIT.' && kind !== 'EQNS.' && kind !== 'BITS.')
148
+ return undefined;
149
+ const rawBody = binary.slice(5);
150
+ const invalid = () => {
151
+ ctx.info('invalid-telemetry-metadata');
152
+ return undefined;
153
+ };
154
+ if (kind === 'PARM.' || kind === 'UNIT.') {
155
+ if (parseList(rawBody).length > 13)
156
+ return invalid();
157
+ const list = parseList(ctx.text(rawBody));
158
+ return kind === 'PARM.'
159
+ ? withId({ type: 'telemetry-names', addressee, names: list }, messageId)
160
+ : withId({ type: 'telemetry-units', addressee, units: list }, messageId);
161
+ }
162
+ if (kind === 'EQNS.') {
163
+ const list = parseList(rawBody);
164
+ // Trailing empty entries (commas and spaces) are the list stopping.
165
+ while (list.length > 0 && list[list.length - 1].trim() === '')
166
+ list.pop();
167
+ if (list.length === 0 || list.length > 15)
168
+ return invalid();
169
+ const texts = [];
170
+ for (const item of list) {
171
+ const t = item.trim();
172
+ if (!COEFFICIENT_RE.test(t))
173
+ return invalid();
174
+ texts.push(t);
175
+ }
176
+ return withId({ type: 'telemetry-coefficients', addressee, coefficients: texts.map(Number), coefficientsText: texts }, messageId);
177
+ }
178
+ const m = /^([01]{8})(?:,(.*))?$/s.exec(rawBody);
179
+ if (!m)
180
+ return invalid();
181
+ const bits = {
182
+ type: 'telemetry-bits',
183
+ addressee,
184
+ bits: m[1],
185
+ };
186
+ if (m[2] !== undefined && m[2].length > 0)
187
+ bits.project = ctx.text(m[2]);
188
+ return withId(bits, messageId);
189
+ }
190
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/decode/message.ts"],"names":[],"mappings":"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"}