@airframes/acars-decoder 1.8.3 → 1.8.4

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/index.js CHANGED
@@ -177,7 +177,6 @@ var CoordinateUtils = class _CoordinateUtils {
177
177
  * @returns An object with latitude and longitude properties
178
178
  */
179
179
  static decodeStringCoordinates(stringCoords) {
180
- var results = {};
181
180
  const firstChar = stringCoords.substring(0, 1);
182
181
  let middleChar = stringCoords.substring(6, 7);
183
182
  let longitudeChars = stringCoords.substring(7, 13);
@@ -186,12 +185,12 @@ var CoordinateUtils = class _CoordinateUtils {
186
185
  longitudeChars = stringCoords.substring(8, 14);
187
186
  }
188
187
  if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
189
- results.latitude = Number(stringCoords.substring(1, 6)) / 1e3 * _CoordinateUtils.getDirection(firstChar);
190
- results.longitude = Number(longitudeChars) / 1e3 * _CoordinateUtils.getDirection(middleChar);
191
- } else {
192
- return;
188
+ return {
189
+ latitude: Number(stringCoords.substring(1, 6)) / 1e3 * _CoordinateUtils.getDirection(firstChar),
190
+ longitude: Number(longitudeChars) / 1e3 * _CoordinateUtils.getDirection(middleChar)
191
+ };
193
192
  }
194
- return results;
193
+ return void 0;
195
194
  }
196
195
  /**
197
196
  * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
@@ -200,7 +199,6 @@ var CoordinateUtils = class _CoordinateUtils {
200
199
  * @returns An object with latitude and longitude properties
201
200
  */
202
201
  static decodeStringCoordinatesDecimalMinutes(stringCoords) {
203
- var results = {};
204
202
  const firstChar = stringCoords.substring(0, 1);
205
203
  let middleChar = stringCoords.substring(6, 7);
206
204
  let longitudeChars = stringCoords.substring(7, 13);
@@ -213,12 +211,12 @@ var CoordinateUtils = class _CoordinateUtils {
213
211
  const lonDeg = Math.trunc(Number(longitudeChars) / 1e3);
214
212
  const lonMin = Number(longitudeChars) % 1e3 / 10;
215
213
  if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
216
- results.latitude = (latDeg + latMin / 60) * _CoordinateUtils.getDirection(firstChar);
217
- results.longitude = (lonDeg + lonMin / 60) * _CoordinateUtils.getDirection(middleChar);
218
- } else {
219
- return;
214
+ return {
215
+ latitude: (latDeg + latMin / 60) * _CoordinateUtils.getDirection(firstChar),
216
+ longitude: (lonDeg + lonMin / 60) * _CoordinateUtils.getDirection(middleChar)
217
+ };
220
218
  }
221
- return results;
219
+ return void 0;
222
220
  }
223
221
  static coordinateString(coords) {
224
222
  const latDir = coords.latitude > 0 ? "N" : "S";
@@ -769,6 +767,24 @@ var ResultFormatter = class {
769
767
  value: `v${decodeResult.raw.version.toFixed(1)}`
770
768
  });
771
769
  }
770
+ static label(decodeResult, value) {
771
+ decodeResult.raw.label = value;
772
+ decodeResult.formatted.items.push({
773
+ type: "label",
774
+ code: "LABEL",
775
+ label: "Message Label",
776
+ value: `${decodeResult.raw.label}`
777
+ });
778
+ }
779
+ static sublabel(decodeResult, value) {
780
+ decodeResult.raw.sublabel = value;
781
+ decodeResult.formatted.items.push({
782
+ type: "sublabel",
783
+ code: "SUBLABEL",
784
+ label: "Message Sublabel",
785
+ value: `${decodeResult.raw.sublabel}`
786
+ });
787
+ }
772
788
  static unknown(decodeResult, value, sep = ",") {
773
789
  if (!decodeResult.remaining.text)
774
790
  decodeResult.remaining.text = value;
@@ -4295,252 +4311,54 @@ var Label_HX = class extends DecoderPlugin {
4295
4311
  }
4296
4312
  };
4297
4313
 
4298
- // lib/plugins/Label_SQ.ts
4299
- var Label_SQ = class extends DecoderPlugin {
4300
- name = "label-sq";
4301
- qualifiers() {
4302
- return {
4303
- labels: ["SQ"]
4304
- };
4305
- }
4306
- decode(message, options = {}) {
4307
- const decodeResult = this.defaultResult();
4308
- decodeResult.decoder.name = this.name;
4309
- decodeResult.raw.preamble = message.text.substring(0, 4);
4310
- decodeResult.raw.version = message.text.substring(1, 2);
4311
- decodeResult.raw.network = message.text.substring(3, 4);
4312
- if (decodeResult.raw.version === "2") {
4313
- const regex = /0(\d)X(?<org>\w)(?<iata>\w\w\w)(?<icao>\w\w\w\w)(?<station>\d)(?<lat>\d+)(?<latd>[NS])(?<lng>\d+)(?<lngd>[EW])V(?<vfreq>\d+)\/.*/;
4314
- const result = message.text.match(regex);
4315
- if (result?.groups && result.length >= 8) {
4316
- decodeResult.raw.groundStation = {
4317
- number: result.groups.station,
4318
- iataCode: result.groups.iata,
4319
- icaoCode: result.groups.icao,
4320
- coordinates: {
4321
- latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
4322
- longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
4323
- }
4324
- };
4325
- decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
4326
- }
4327
- }
4328
- decodeResult.formatted.description = "Ground Station Squitter";
4329
- var formattedNetwork = "Unknown";
4330
- if (decodeResult.raw.network == "A") {
4331
- formattedNetwork = "ARINC";
4332
- } else if (decodeResult.raw.network == "S") {
4333
- formattedNetwork = "SITA";
4334
- }
4335
- decodeResult.formatted.items = [
4336
- {
4337
- type: "network",
4338
- code: "NETT",
4339
- label: "Network",
4340
- value: formattedNetwork
4341
- },
4342
- {
4343
- type: "version",
4344
- code: "VER",
4345
- label: "Version",
4346
- value: decodeResult.raw.version
4347
- }
4348
- ];
4349
- if (decodeResult.raw.groundStation) {
4350
- if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
4351
- decodeResult.formatted.items.push({
4352
- type: "ground_station",
4353
- code: "GNDSTN",
4354
- label: "Ground Station",
4355
- value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
4356
- });
4357
- }
4358
- if (decodeResult.raw.groundStation.iataCode) {
4359
- decodeResult.formatted.items.push({
4360
- type: "iataCode",
4361
- code: "IATA",
4362
- label: "IATA",
4363
- value: decodeResult.raw.groundStation.iataCode
4364
- });
4365
- }
4366
- if (decodeResult.raw.groundStation.icaoCode) {
4367
- decodeResult.formatted.items.push({
4368
- type: "icaoCode",
4369
- code: "ICAO",
4370
- label: "ICAO",
4371
- value: decodeResult.raw.groundStation.icaoCode
4372
- });
4373
- }
4374
- if (decodeResult.raw.groundStation.coordinates.latitude) {
4375
- decodeResult.formatted.items.push({
4376
- type: "coordinates",
4377
- code: "COORD",
4378
- label: "Ground Station Location",
4379
- value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
4380
- });
4381
- }
4382
- if (decodeResult.raw.groundStation.airport) {
4383
- decodeResult.formatted.items.push({
4384
- type: "airport",
4385
- code: "APT",
4386
- label: "Airport",
4387
- value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
4388
- });
4389
- }
4390
- }
4391
- if (decodeResult.raw.vdlFrequency) {
4392
- decodeResult.formatted.items.push({
4393
- type: "vdlFrequency",
4394
- code: "VDLFRQ",
4395
- label: "VDL Frequency",
4396
- value: `${decodeResult.raw.vdlFrequency} MHz`
4397
- });
4398
- }
4399
- decodeResult.decoded = true;
4400
- decodeResult.decoder.decodeLevel = "full";
4401
- return decodeResult;
4402
- }
4403
- };
4404
-
4405
- // lib/plugins/Label_QR.ts
4406
- var Label_QR = class extends DecoderPlugin {
4407
- name = "label-qr";
4408
- qualifiers() {
4409
- return {
4410
- labels: ["QR"]
4411
- };
4412
- }
4413
- decode(message, options = {}) {
4414
- const decodeResult = this.defaultResult();
4415
- decodeResult.decoder.name = this.name;
4416
- decodeResult.formatted.description = "ON Report";
4417
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4418
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4419
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
4420
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4421
- decodeResult.decoded = true;
4422
- if (!decodeResult.remaining.text)
4423
- decodeResult.decoder.decodeLevel = "full";
4424
- else
4425
- decodeResult.decoder.decodeLevel = "partial";
4426
- return decodeResult;
4427
- }
4428
- };
4429
-
4430
- // lib/plugins/Label_QP.ts
4431
- var Label_QP = class extends DecoderPlugin {
4432
- name = "label-qp";
4433
- qualifiers() {
4434
- return {
4435
- labels: ["QP"]
4436
- };
4437
- }
4438
- decode(message, options = {}) {
4439
- const decodeResult = this.defaultResult();
4440
- decodeResult.decoder.name = this.name;
4441
- decodeResult.formatted.description = "OUT Report";
4442
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4443
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4444
- ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
4445
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4446
- decodeResult.decoded = true;
4447
- if (!decodeResult.remaining.text)
4448
- decodeResult.decoder.decodeLevel = "full";
4449
- else
4450
- decodeResult.decoder.decodeLevel = "partial";
4451
- return decodeResult;
4452
- }
4453
- };
4454
-
4455
- // lib/plugins/Label_QS.ts
4456
- var Label_QS = class extends DecoderPlugin {
4457
- name = "label-qs";
4458
- qualifiers() {
4459
- return {
4460
- labels: ["QS"]
4461
- };
4462
- }
4463
- decode(message, options = {}) {
4464
- const decodeResult = this.defaultResult();
4465
- decodeResult.decoder.name = this.name;
4466
- decodeResult.formatted.description = "IN Report";
4467
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4468
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4469
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
4470
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4471
- decodeResult.decoded = true;
4472
- if (!decodeResult.remaining.text)
4473
- decodeResult.decoder.decodeLevel = "full";
4474
- else
4475
- decodeResult.decoder.decodeLevel = "partial";
4476
- return decodeResult;
4477
- }
4478
- };
4479
-
4480
- // lib/plugins/Label_QQ.ts
4481
- var Label_QQ = class extends DecoderPlugin {
4482
- name = "label-qq";
4483
- qualifiers() {
4484
- return {
4485
- labels: ["QQ"]
4486
- };
4487
- }
4488
- decode(message, options = {}) {
4489
- const decodeResult = this.defaultResult();
4490
- decodeResult.decoder.name = this.name;
4491
- decodeResult.message = message;
4492
- decodeResult.formatted.description = "OFF Report";
4493
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4494
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4495
- if (message.text.substring(12, 19) === "\r\n001FE") {
4496
- decodeResult.raw.day = message.text.substring(19, 21);
4497
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
4498
- let latdir = message.text.substring(27, 28);
4499
- let latdeg = Number(message.text.substring(28, 30));
4500
- let latmin = Number(message.text.substring(30, 34));
4501
- let londir = message.text.substring(34, 35);
4502
- let londeg = Number(message.text.substring(35, 38));
4503
- let lonmin = Number(message.text.substring(38, 42));
4504
- let pos = {
4505
- latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
4506
- longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
4507
- };
4508
- ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
4509
- ResultFormatter.position(decodeResult, pos);
4510
- if (decodeResult.remaining.text !== "---") {
4511
- ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
4512
- } else {
4513
- ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
4514
- }
4515
- ResultFormatter.unknown(decodeResult, message.text.substring(48));
4516
- } else {
4517
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
4518
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4519
- }
4520
- decodeResult.decoded = true;
4521
- if (!decodeResult.remaining.text)
4522
- decodeResult.decoder.decodeLevel = "full";
4523
- else
4524
- decodeResult.decoder.decodeLevel = "partial";
4525
- return decodeResult;
4526
- }
4527
- };
4528
-
4529
4314
  // lib/utils/miam.ts
4530
4315
  var Base85 = __toESM(require("base85"));
4531
4316
  var zlib2 = __toESM(require("minizlib"));
4532
4317
  var import_node_buffer2 = require("buffer");
4318
+ var MIAMVersion = /* @__PURE__ */ ((MIAMVersion2) => {
4319
+ MIAMVersion2[MIAMVersion2["V1"] = 1] = "V1";
4320
+ MIAMVersion2[MIAMVersion2["V2"] = 2] = "V2";
4321
+ return MIAMVersion2;
4322
+ })(MIAMVersion || {});
4323
+ var MIAMFid = /* @__PURE__ */ ((MIAMFid2) => {
4324
+ MIAMFid2["SingleTransfer"] = "T";
4325
+ MIAMFid2["FileTransferRequest"] = "F";
4326
+ MIAMFid2["FileTransferAccept"] = "K";
4327
+ MIAMFid2["FileSegment"] = "S";
4328
+ MIAMFid2["FileTransferAbort"] = "A";
4329
+ MIAMFid2["XOFFIndication"] = "Y";
4330
+ MIAMFid2["XONIndication"] = "X";
4331
+ return MIAMFid2;
4332
+ })(MIAMFid || {});
4333
+ var MIAMCorePdu = /* @__PURE__ */ ((MIAMCorePdu2) => {
4334
+ MIAMCorePdu2[MIAMCorePdu2["Data"] = 0] = "Data";
4335
+ MIAMCorePdu2[MIAMCorePdu2["Ack"] = 1] = "Ack";
4336
+ MIAMCorePdu2[MIAMCorePdu2["Aloha"] = 2] = "Aloha";
4337
+ MIAMCorePdu2[MIAMCorePdu2["AlohaReply"] = 3] = "AlohaReply";
4338
+ return MIAMCorePdu2;
4339
+ })(MIAMCorePdu || {});
4340
+ var MIAMCoreApp = /* @__PURE__ */ ((MIAMCoreApp2) => {
4341
+ MIAMCoreApp2[MIAMCoreApp2["ACARS2Char"] = 0] = "ACARS2Char";
4342
+ MIAMCoreApp2[MIAMCoreApp2["ACARS4Char"] = 1] = "ACARS4Char";
4343
+ MIAMCoreApp2[MIAMCoreApp2["ACARS6Char"] = 2] = "ACARS6Char";
4344
+ MIAMCoreApp2[MIAMCoreApp2["NonACARS6Char"] = 3] = "NonACARS6Char";
4345
+ return MIAMCoreApp2;
4346
+ })(MIAMCoreApp || {});
4533
4347
  var MIAMCoreV1CRCLength = 4;
4534
4348
  var MIAMCoreV2CRCLength = 2;
4349
+ var isMIAMVersion = (x) => Object.values(MIAMVersion).includes(x);
4350
+ var isMIAMFid = (x) => Object.values(MIAMFid).includes(x);
4351
+ var isMIAMCoreApp = (x) => Object.values(MIAMCoreApp).includes(x);
4352
+ var isMIAMCorePdu = (x) => Object.values(MIAMCorePdu).includes(x);
4535
4353
  var MIAMCoreUtils = class {
4536
4354
  static AppTypeToAppIdLenTable = {
4537
- 1: {
4355
+ [1 /* V1 */]: {
4538
4356
  [0 /* ACARS2Char */]: 2,
4539
4357
  [1 /* ACARS4Char */]: 4,
4540
4358
  [2 /* ACARS6Char */]: 6,
4541
4359
  [3 /* NonACARS6Char */]: 6
4542
4360
  },
4543
- 2: {
4361
+ [2 /* V2 */]: {
4544
4362
  [0 /* ACARS2Char */]: 2,
4545
4363
  [1 /* ACARS4Char */]: 4,
4546
4364
  [2 /* ACARS6Char */]: 6,
@@ -4606,21 +4424,34 @@ var MIAMCoreUtils = class {
4606
4424
  hdr = hdr.subarray(0, hdr.length - hpad);
4607
4425
  const version = hdr.readUInt8(0) & 15;
4608
4426
  const pduType = hdr.readUInt8(0) >> 4 & 15;
4609
- const versionPduHandler = this.VersionPduHandlerTable[version][pduType];
4610
- if (versionPduHandler === void 0) {
4427
+ if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {
4428
+ const versionPduHandler = this.VersionPduHandlerTable[version][pduType];
4429
+ return versionPduHandler(hdr, body);
4430
+ } else {
4611
4431
  return {
4612
4432
  decoded: false,
4613
4433
  error: "Invalid version and PDU type combination: v=" + version + ", pdu=" + pduType
4614
4434
  };
4615
4435
  }
4616
- return versionPduHandler(hdr, body);
4617
4436
  },
4618
- ["F" /* FileTransferRequest */]: void 0,
4619
- ["K" /* FileTransferAccept */]: void 0,
4620
- ["S" /* FileSegment */]: void 0,
4621
- ["A" /* FileTransferAbort */]: void 0,
4622
- ["Y" /* XOFFIndication */]: void 0,
4623
- ["X" /* XONIndication */]: void 0
4437
+ ["F" /* FileTransferRequest */]: () => {
4438
+ return { decoded: false, error: "File Transfer Request not implemented" };
4439
+ },
4440
+ ["K" /* FileTransferAccept */]: () => {
4441
+ return { decoded: false, error: "File Transfer Accept not implemented" };
4442
+ },
4443
+ ["S" /* FileSegment */]: () => {
4444
+ return { decoded: false, error: "File Segment not implemented" };
4445
+ },
4446
+ ["A" /* FileTransferAbort */]: () => {
4447
+ return { decoded: false, error: "File Transfer Abort not implemented" };
4448
+ },
4449
+ ["Y" /* XOFFIndication */]: () => {
4450
+ return { decoded: false, error: "XOFF Indication not implemented" };
4451
+ },
4452
+ ["X" /* XONIndication */]: () => {
4453
+ return { decoded: false, error: "XON Indication not implemented" };
4454
+ }
4624
4455
  };
4625
4456
  static arincCrc16(buf, seed) {
4626
4457
  const crctable = [
@@ -5154,14 +4985,15 @@ var MIAMCoreUtils = class {
5154
4985
  }
5155
4986
  static parse(txt) {
5156
4987
  const fidType = txt[0];
5157
- const handler = this.FidHandlerTable[fidType];
5158
- if (handler === void 0) {
4988
+ if (isMIAMFid(fidType)) {
4989
+ const handler = this.FidHandlerTable[fidType];
4990
+ return handler(txt.substring(1));
4991
+ } else {
5159
4992
  return {
5160
4993
  decoded: false,
5161
4994
  error: "Unsupported FID type: " + fidType
5162
4995
  };
5163
4996
  }
5164
- return handler(txt.substring(1));
5165
4997
  }
5166
4998
  static corePduDataHandler(version, minHdrSize, crcLen, hdr, body) {
5167
4999
  if (hdr.length < minHdrSize) {
@@ -5176,14 +5008,14 @@ var MIAMCoreUtils = class {
5176
5008
  let pduAppType = 0;
5177
5009
  let pduAppId = "";
5178
5010
  let pduCrc = 0;
5179
- let pduData = void 0;
5011
+ let pduData = null;
5180
5012
  let pduCrcIsOk = false;
5181
5013
  let pduIsComplete = true;
5182
5014
  let pduErrors = [];
5183
5015
  let tail = void 0;
5184
5016
  let msgNum = 0;
5185
5017
  let ackOptions = 0;
5186
- if (version === 1) {
5018
+ if (version === 1 /* V1 */) {
5187
5019
  pduSize = hdr.readUInt8(1) << 16 | hdr.readUInt8(2) << 8 | hdr.readUInt8(3);
5188
5020
  const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
5189
5021
  if (pduSize > msgSize) {
@@ -5193,7 +5025,7 @@ var MIAMCoreUtils = class {
5193
5025
  hdr = hdr.subarray(4);
5194
5026
  tail = hdr.subarray(0, 7).toString("ascii");
5195
5027
  hdr = hdr.subarray(7);
5196
- } else if (version === 2) {
5028
+ } else if (version === 2 /* V2 */) {
5197
5029
  hdr = hdr.subarray(1);
5198
5030
  }
5199
5031
  msgNum = hdr.readUInt8(0) >> 1 & 127;
@@ -5203,9 +5035,11 @@ var MIAMCoreUtils = class {
5203
5035
  pduEncoding = hdr.readUInt8(1) >> 4 & 3;
5204
5036
  pduAppType = hdr.readUInt8(1) & 15;
5205
5037
  hdr = hdr.subarray(2);
5206
- let appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];
5207
- if (appIdLen === void 0) {
5208
- if (version === 2 && (pduAppType & 8) !== 0 && pduAppType !== 13) {
5038
+ let appIdLen;
5039
+ if (isMIAMCoreApp(pduAppType)) {
5040
+ appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];
5041
+ } else {
5042
+ if (version === 2 /* V2 */ && (pduAppType & 8) !== 0 && pduAppType !== 13) {
5209
5043
  appIdLen = (pduAppType & 7) + 1;
5210
5044
  } else {
5211
5045
  return {
@@ -5215,9 +5049,6 @@ var MIAMCoreUtils = class {
5215
5049
  }
5216
5050
  }
5217
5051
  const pduIsACARS = [
5218
- 0 /* ACARS2Char */,
5219
- 1 /* ACARS4Char */,
5220
- 2 /* ACARS6Char */,
5221
5052
  0 /* ACARS2Char */,
5222
5053
  1 /* ACARS4Char */,
5223
5054
  2 /* ACARS6Char */
@@ -5239,7 +5070,7 @@ var MIAMCoreUtils = class {
5239
5070
  if (body !== void 0 && body.length > 0) {
5240
5071
  if ([1 /* Deflate */, 1 /* Deflate */].indexOf(pduCompression) >= 0) {
5241
5072
  try {
5242
- const decompress = new zlib2.InflateRaw({ windowBits: 15 });
5073
+ const decompress = new zlib2.InflateRaw({});
5243
5074
  decompress.write(body);
5244
5075
  decompress.flush(zlib2.constants.Z_SYNC_FLUSH);
5245
5076
  pduData = decompress.read();
@@ -5251,18 +5082,18 @@ var MIAMCoreUtils = class {
5251
5082
  } else {
5252
5083
  pduErrors.push("Unsupported v" + version + " compression type: " + pduCompression);
5253
5084
  }
5254
- if (pduData !== void 0) {
5085
+ if (pduData !== null) {
5255
5086
  const crcAlgoHandlerByVersion = {
5256
- 1: (buf, seed) => {
5087
+ [1 /* V1 */]: (buf, seed) => {
5257
5088
  return ~this.arinc665Crc32(buf, seed);
5258
5089
  },
5259
- 2: this.arincCrc16
5090
+ [2 /* V2 */]: this.arincCrc16
5260
5091
  };
5261
5092
  const crcAlgoHandler = crcAlgoHandlerByVersion[version];
5262
5093
  if (crcAlgoHandler === void 0) {
5263
5094
  return {
5264
5095
  decoded: false,
5265
- errors: "No CRC handler for v" + version
5096
+ error: "No CRC handler for v" + version
5266
5097
  };
5267
5098
  }
5268
5099
  const crcCheck = crcAlgoHandler(pduData, 4294967295);
@@ -5310,25 +5141,315 @@ var MIAMCoreUtils = class {
5310
5141
  };
5311
5142
  }
5312
5143
  static VersionPduHandlerTable = {
5313
- 1: {
5144
+ [1 /* V1 */]: {
5314
5145
  [0 /* Data */]: (hdr, body) => {
5315
- return this.corePduDataHandler(1, 20, MIAMCoreV1CRCLength, hdr, body);
5146
+ return this.corePduDataHandler(1 /* V1 */, 20, MIAMCoreV1CRCLength, hdr, body);
5316
5147
  },
5317
- [1 /* Ack */]: void 0,
5318
- [2 /* Aloha */]: void 0,
5319
- [3 /* AlohaReply */]: void 0
5148
+ [1 /* Ack */]: () => {
5149
+ return { decoded: false, error: "v1 Ack PDU not implemented" };
5150
+ },
5151
+ [2 /* Aloha */]: () => {
5152
+ return { decoded: false, error: "v1 Aloha PDU not implemented" };
5153
+ },
5154
+ [3 /* AlohaReply */]: () => {
5155
+ return { decoded: false, error: "v1 AlohaReply PDU not implemented" };
5156
+ }
5320
5157
  },
5321
- 2: {
5158
+ [2 /* V2 */]: {
5322
5159
  [0 /* Data */]: (hdr, body) => {
5323
- return this.corePduDataHandler(2, 7, MIAMCoreV2CRCLength, hdr, body);
5160
+ return this.corePduDataHandler(2 /* V2 */, 7, MIAMCoreV2CRCLength, hdr, body);
5161
+ },
5162
+ [1 /* Ack */]: () => {
5163
+ return { decoded: false, error: "v2 Ack PDU not implemented" };
5164
+ },
5165
+ [2 /* Aloha */]: () => {
5166
+ return { decoded: false, error: "v2 Aloha PDU not implemented" };
5324
5167
  },
5325
- [1 /* Ack */]: void 0,
5326
- [2 /* Aloha */]: void 0,
5327
- [3 /* AlohaReply */]: void 0
5168
+ [3 /* AlohaReply */]: () => {
5169
+ return { decoded: false, error: "v2 Aloha reply PDU not implemented" };
5170
+ }
5328
5171
  }
5329
5172
  };
5330
5173
  };
5331
5174
 
5175
+ // lib/plugins/Label_MA.ts
5176
+ var Label_MA = class extends DecoderPlugin {
5177
+ name = "label-ma";
5178
+ qualifiers() {
5179
+ return {
5180
+ labels: ["MA"]
5181
+ };
5182
+ }
5183
+ decode(message, options = {}) {
5184
+ let decodeResult = this.defaultResult();
5185
+ decodeResult.decoder.name = this.name;
5186
+ decodeResult.message = message;
5187
+ const miamResult = MIAMCoreUtils.parse(message.text);
5188
+ if (miamResult.decoded && miamResult.message.data !== void 0 && miamResult.message.data.crcOk && miamResult.message.data.complete && miamResult.message.data.acars !== void 0) {
5189
+ decodeResult.decoded = true;
5190
+ decodeResult.decoder.decodeLevel = "partial";
5191
+ ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
5192
+ if (miamResult.message.data.acars.sublabel) {
5193
+ ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);
5194
+ }
5195
+ if (miamResult.message.data.acars.tail) {
5196
+ ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);
5197
+ }
5198
+ const messageText = miamResult.message.data.acars.text;
5199
+ if (messageText) {
5200
+ const decoded = this.decoder.decode({
5201
+ label: miamResult.message.data.acars.label,
5202
+ sublabel: miamResult.message.data.acars.sublabel,
5203
+ text: messageText
5204
+ }, options);
5205
+ if (decoded.decoded) {
5206
+ decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
5207
+ decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
5208
+ decodeResult.formatted.items.push(...decoded.formatted.items);
5209
+ } else {
5210
+ ResultFormatter.text(decodeResult, messageText);
5211
+ }
5212
+ message.text = messageText;
5213
+ }
5214
+ message.label = miamResult.message.data.acars.label;
5215
+ message.sublabel = miamResult.message.data.acars.sublabel;
5216
+ return decodeResult;
5217
+ }
5218
+ return decodeResult;
5219
+ }
5220
+ };
5221
+
5222
+ // lib/plugins/Label_SQ.ts
5223
+ var Label_SQ = class extends DecoderPlugin {
5224
+ name = "label-sq";
5225
+ qualifiers() {
5226
+ return {
5227
+ labels: ["SQ"]
5228
+ };
5229
+ }
5230
+ decode(message, options = {}) {
5231
+ const decodeResult = this.defaultResult();
5232
+ decodeResult.decoder.name = this.name;
5233
+ decodeResult.raw.preamble = message.text.substring(0, 4);
5234
+ decodeResult.raw.version = message.text.substring(1, 2);
5235
+ decodeResult.raw.network = message.text.substring(3, 4);
5236
+ if (decodeResult.raw.version === "2") {
5237
+ const regex = /0(\d)X(?<org>\w)(?<iata>\w\w\w)(?<icao>\w\w\w\w)(?<station>\d)(?<lat>\d+)(?<latd>[NS])(?<lng>\d+)(?<lngd>[EW])V(?<vfreq>\d+)\/.*/;
5238
+ const result = message.text.match(regex);
5239
+ if (result?.groups && result.length >= 8) {
5240
+ decodeResult.raw.groundStation = {
5241
+ number: result.groups.station,
5242
+ iataCode: result.groups.iata,
5243
+ icaoCode: result.groups.icao,
5244
+ coordinates: {
5245
+ latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
5246
+ longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
5247
+ }
5248
+ };
5249
+ decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
5250
+ }
5251
+ }
5252
+ decodeResult.formatted.description = "Ground Station Squitter";
5253
+ var formattedNetwork = "Unknown";
5254
+ if (decodeResult.raw.network == "A") {
5255
+ formattedNetwork = "ARINC";
5256
+ } else if (decodeResult.raw.network == "S") {
5257
+ formattedNetwork = "SITA";
5258
+ }
5259
+ decodeResult.formatted.items = [
5260
+ {
5261
+ type: "network",
5262
+ code: "NETT",
5263
+ label: "Network",
5264
+ value: formattedNetwork
5265
+ },
5266
+ {
5267
+ type: "version",
5268
+ code: "VER",
5269
+ label: "Version",
5270
+ value: decodeResult.raw.version
5271
+ }
5272
+ ];
5273
+ if (decodeResult.raw.groundStation) {
5274
+ if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
5275
+ decodeResult.formatted.items.push({
5276
+ type: "ground_station",
5277
+ code: "GNDSTN",
5278
+ label: "Ground Station",
5279
+ value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
5280
+ });
5281
+ }
5282
+ if (decodeResult.raw.groundStation.iataCode) {
5283
+ decodeResult.formatted.items.push({
5284
+ type: "iataCode",
5285
+ code: "IATA",
5286
+ label: "IATA",
5287
+ value: decodeResult.raw.groundStation.iataCode
5288
+ });
5289
+ }
5290
+ if (decodeResult.raw.groundStation.icaoCode) {
5291
+ decodeResult.formatted.items.push({
5292
+ type: "icaoCode",
5293
+ code: "ICAO",
5294
+ label: "ICAO",
5295
+ value: decodeResult.raw.groundStation.icaoCode
5296
+ });
5297
+ }
5298
+ if (decodeResult.raw.groundStation.coordinates.latitude) {
5299
+ decodeResult.formatted.items.push({
5300
+ type: "coordinates",
5301
+ code: "COORD",
5302
+ label: "Ground Station Location",
5303
+ value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
5304
+ });
5305
+ }
5306
+ if (decodeResult.raw.groundStation.airport) {
5307
+ decodeResult.formatted.items.push({
5308
+ type: "airport",
5309
+ code: "APT",
5310
+ label: "Airport",
5311
+ value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
5312
+ });
5313
+ }
5314
+ }
5315
+ if (decodeResult.raw.vdlFrequency) {
5316
+ decodeResult.formatted.items.push({
5317
+ type: "vdlFrequency",
5318
+ code: "VDLFRQ",
5319
+ label: "VDL Frequency",
5320
+ value: `${decodeResult.raw.vdlFrequency} MHz`
5321
+ });
5322
+ }
5323
+ decodeResult.decoded = true;
5324
+ decodeResult.decoder.decodeLevel = "full";
5325
+ return decodeResult;
5326
+ }
5327
+ };
5328
+
5329
+ // lib/plugins/Label_QR.ts
5330
+ var Label_QR = class extends DecoderPlugin {
5331
+ name = "label-qr";
5332
+ qualifiers() {
5333
+ return {
5334
+ labels: ["QR"]
5335
+ };
5336
+ }
5337
+ decode(message, options = {}) {
5338
+ const decodeResult = this.defaultResult();
5339
+ decodeResult.decoder.name = this.name;
5340
+ decodeResult.formatted.description = "ON Report";
5341
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5342
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5343
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5344
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5345
+ decodeResult.decoded = true;
5346
+ if (!decodeResult.remaining.text)
5347
+ decodeResult.decoder.decodeLevel = "full";
5348
+ else
5349
+ decodeResult.decoder.decodeLevel = "partial";
5350
+ return decodeResult;
5351
+ }
5352
+ };
5353
+
5354
+ // lib/plugins/Label_QP.ts
5355
+ var Label_QP = class extends DecoderPlugin {
5356
+ name = "label-qp";
5357
+ qualifiers() {
5358
+ return {
5359
+ labels: ["QP"]
5360
+ };
5361
+ }
5362
+ decode(message, options = {}) {
5363
+ const decodeResult = this.defaultResult();
5364
+ decodeResult.decoder.name = this.name;
5365
+ decodeResult.formatted.description = "OUT Report";
5366
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5367
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5368
+ ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5369
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5370
+ decodeResult.decoded = true;
5371
+ if (!decodeResult.remaining.text)
5372
+ decodeResult.decoder.decodeLevel = "full";
5373
+ else
5374
+ decodeResult.decoder.decodeLevel = "partial";
5375
+ return decodeResult;
5376
+ }
5377
+ };
5378
+
5379
+ // lib/plugins/Label_QS.ts
5380
+ var Label_QS = class extends DecoderPlugin {
5381
+ name = "label-qs";
5382
+ qualifiers() {
5383
+ return {
5384
+ labels: ["QS"]
5385
+ };
5386
+ }
5387
+ decode(message, options = {}) {
5388
+ const decodeResult = this.defaultResult();
5389
+ decodeResult.decoder.name = this.name;
5390
+ decodeResult.formatted.description = "IN Report";
5391
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5392
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5393
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5394
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5395
+ decodeResult.decoded = true;
5396
+ if (!decodeResult.remaining.text)
5397
+ decodeResult.decoder.decodeLevel = "full";
5398
+ else
5399
+ decodeResult.decoder.decodeLevel = "partial";
5400
+ return decodeResult;
5401
+ }
5402
+ };
5403
+
5404
+ // lib/plugins/Label_QQ.ts
5405
+ var Label_QQ = class extends DecoderPlugin {
5406
+ name = "label-qq";
5407
+ qualifiers() {
5408
+ return {
5409
+ labels: ["QQ"]
5410
+ };
5411
+ }
5412
+ decode(message, options = {}) {
5413
+ const decodeResult = this.defaultResult();
5414
+ decodeResult.decoder.name = this.name;
5415
+ decodeResult.message = message;
5416
+ decodeResult.formatted.description = "OFF Report";
5417
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5418
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5419
+ if (message.text.substring(12, 19) === "\r\n001FE") {
5420
+ decodeResult.raw.day = message.text.substring(19, 21);
5421
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
5422
+ let latdir = message.text.substring(27, 28);
5423
+ let latdeg = Number(message.text.substring(28, 30));
5424
+ let latmin = Number(message.text.substring(30, 34));
5425
+ let londir = message.text.substring(34, 35);
5426
+ let londeg = Number(message.text.substring(35, 38));
5427
+ let lonmin = Number(message.text.substring(38, 42));
5428
+ let pos = {
5429
+ latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
5430
+ longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
5431
+ };
5432
+ ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
5433
+ ResultFormatter.position(decodeResult, pos);
5434
+ if (decodeResult.remaining.text !== "---") {
5435
+ ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
5436
+ } else {
5437
+ ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
5438
+ }
5439
+ ResultFormatter.unknown(decodeResult, message.text.substring(48));
5440
+ } else {
5441
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
5442
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5443
+ }
5444
+ decodeResult.decoded = true;
5445
+ if (!decodeResult.remaining.text)
5446
+ decodeResult.decoder.decodeLevel = "full";
5447
+ else
5448
+ decodeResult.decoder.decodeLevel = "partial";
5449
+ return decodeResult;
5450
+ }
5451
+ };
5452
+
5332
5453
  // lib/MessageDecoder.ts
5333
5454
  var MessageDecoder = class {
5334
5455
  name;
@@ -5396,6 +5517,7 @@ var MessageDecoder = class {
5396
5517
  this.registerPlugin(new Label_83(this));
5397
5518
  this.registerPlugin(new Label_8E(this));
5398
5519
  this.registerPlugin(new Label_1M_Slash(this));
5520
+ this.registerPlugin(new Label_MA(this));
5399
5521
  this.registerPlugin(new Label_SQ(this));
5400
5522
  this.registerPlugin(new Label_QP(this));
5401
5523
  this.registerPlugin(new Label_QQ(this));
@@ -5408,18 +5530,6 @@ var MessageDecoder = class {
5408
5530
  return true;
5409
5531
  }
5410
5532
  decode(message, options = {}) {
5411
- if (message.label === "MA") {
5412
- const decodeResult = MIAMCoreUtils.parse(message.text);
5413
- if (decodeResult.decoded && decodeResult.message.data !== void 0 && decodeResult.message.data.crcOk && decodeResult.message.data.complete && decodeResult.message.data.acars !== void 0) {
5414
- message = {
5415
- ...message,
5416
- label: decodeResult.message.data.acars.label,
5417
- ...decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {},
5418
- ...decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {},
5419
- ...decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}
5420
- };
5421
- }
5422
- }
5423
5533
  const usablePlugins = this.plugins.filter((plugin) => {
5424
5534
  const qualifiers = plugin.qualifiers();
5425
5535
  if (qualifiers.labels.includes(message.label)) {
@@ -5469,11 +5579,6 @@ var MessageDecoder = class {
5469
5579
  }
5470
5580
  return result;
5471
5581
  }
5472
- lookupAirportByIata(iata) {
5473
- const airportsArray = [];
5474
- const airport = airportsArray.filter((e) => e.iata === iata);
5475
- return airport;
5476
- }
5477
5582
  };
5478
5583
  // Annotate the CommonJS export names for ESM import in node:
5479
5584
  0 && (module.exports = {