@airframes/acars-decoder 1.8.3 → 1.8.5

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.mjs CHANGED
@@ -140,7 +140,6 @@ var CoordinateUtils = class _CoordinateUtils {
140
140
  * @returns An object with latitude and longitude properties
141
141
  */
142
142
  static decodeStringCoordinates(stringCoords) {
143
- var results = {};
144
143
  const firstChar = stringCoords.substring(0, 1);
145
144
  let middleChar = stringCoords.substring(6, 7);
146
145
  let longitudeChars = stringCoords.substring(7, 13);
@@ -149,12 +148,12 @@ var CoordinateUtils = class _CoordinateUtils {
149
148
  longitudeChars = stringCoords.substring(8, 14);
150
149
  }
151
150
  if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
152
- results.latitude = Number(stringCoords.substring(1, 6)) / 1e3 * _CoordinateUtils.getDirection(firstChar);
153
- results.longitude = Number(longitudeChars) / 1e3 * _CoordinateUtils.getDirection(middleChar);
154
- } else {
155
- return;
151
+ return {
152
+ latitude: Number(stringCoords.substring(1, 6)) / 1e3 * _CoordinateUtils.getDirection(firstChar),
153
+ longitude: Number(longitudeChars) / 1e3 * _CoordinateUtils.getDirection(middleChar)
154
+ };
156
155
  }
157
- return results;
156
+ return void 0;
158
157
  }
159
158
  /**
160
159
  * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes
@@ -163,7 +162,6 @@ var CoordinateUtils = class _CoordinateUtils {
163
162
  * @returns An object with latitude and longitude properties
164
163
  */
165
164
  static decodeStringCoordinatesDecimalMinutes(stringCoords) {
166
- var results = {};
167
165
  const firstChar = stringCoords.substring(0, 1);
168
166
  let middleChar = stringCoords.substring(6, 7);
169
167
  let longitudeChars = stringCoords.substring(7, 13);
@@ -176,12 +174,12 @@ var CoordinateUtils = class _CoordinateUtils {
176
174
  const lonDeg = Math.trunc(Number(longitudeChars) / 1e3);
177
175
  const lonMin = Number(longitudeChars) % 1e3 / 10;
178
176
  if ((firstChar === "N" || firstChar === "S") && (middleChar === "W" || middleChar === "E")) {
179
- results.latitude = (latDeg + latMin / 60) * _CoordinateUtils.getDirection(firstChar);
180
- results.longitude = (lonDeg + lonMin / 60) * _CoordinateUtils.getDirection(middleChar);
181
- } else {
182
- return;
177
+ return {
178
+ latitude: (latDeg + latMin / 60) * _CoordinateUtils.getDirection(firstChar),
179
+ longitude: (lonDeg + lonMin / 60) * _CoordinateUtils.getDirection(middleChar)
180
+ };
183
181
  }
184
- return results;
182
+ return void 0;
185
183
  }
186
184
  static coordinateString(coords) {
187
185
  const latDir = coords.latitude > 0 ? "N" : "S";
@@ -732,6 +730,24 @@ var ResultFormatter = class {
732
730
  value: `v${decodeResult.raw.version.toFixed(1)}`
733
731
  });
734
732
  }
733
+ static label(decodeResult, value) {
734
+ decodeResult.raw.label = value;
735
+ decodeResult.formatted.items.push({
736
+ type: "label",
737
+ code: "LABEL",
738
+ label: "Message Label",
739
+ value: `${decodeResult.raw.label}`
740
+ });
741
+ }
742
+ static sublabel(decodeResult, value) {
743
+ decodeResult.raw.sublabel = value;
744
+ decodeResult.formatted.items.push({
745
+ type: "sublabel",
746
+ code: "SUBLABEL",
747
+ label: "Message Sublabel",
748
+ value: `${decodeResult.raw.sublabel}`
749
+ });
750
+ }
735
751
  static unknown(decodeResult, value, sep = ",") {
736
752
  if (!decodeResult.remaining.text)
737
753
  decodeResult.remaining.text = value;
@@ -4258,252 +4274,54 @@ var Label_HX = class extends DecoderPlugin {
4258
4274
  }
4259
4275
  };
4260
4276
 
4261
- // lib/plugins/Label_SQ.ts
4262
- var Label_SQ = class extends DecoderPlugin {
4263
- name = "label-sq";
4264
- qualifiers() {
4265
- return {
4266
- labels: ["SQ"]
4267
- };
4268
- }
4269
- decode(message, options = {}) {
4270
- const decodeResult = this.defaultResult();
4271
- decodeResult.decoder.name = this.name;
4272
- decodeResult.raw.preamble = message.text.substring(0, 4);
4273
- decodeResult.raw.version = message.text.substring(1, 2);
4274
- decodeResult.raw.network = message.text.substring(3, 4);
4275
- if (decodeResult.raw.version === "2") {
4276
- 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+)\/.*/;
4277
- const result = message.text.match(regex);
4278
- if (result?.groups && result.length >= 8) {
4279
- decodeResult.raw.groundStation = {
4280
- number: result.groups.station,
4281
- iataCode: result.groups.iata,
4282
- icaoCode: result.groups.icao,
4283
- coordinates: {
4284
- latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
4285
- longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
4286
- }
4287
- };
4288
- decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
4289
- }
4290
- }
4291
- decodeResult.formatted.description = "Ground Station Squitter";
4292
- var formattedNetwork = "Unknown";
4293
- if (decodeResult.raw.network == "A") {
4294
- formattedNetwork = "ARINC";
4295
- } else if (decodeResult.raw.network == "S") {
4296
- formattedNetwork = "SITA";
4297
- }
4298
- decodeResult.formatted.items = [
4299
- {
4300
- type: "network",
4301
- code: "NETT",
4302
- label: "Network",
4303
- value: formattedNetwork
4304
- },
4305
- {
4306
- type: "version",
4307
- code: "VER",
4308
- label: "Version",
4309
- value: decodeResult.raw.version
4310
- }
4311
- ];
4312
- if (decodeResult.raw.groundStation) {
4313
- if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
4314
- decodeResult.formatted.items.push({
4315
- type: "ground_station",
4316
- code: "GNDSTN",
4317
- label: "Ground Station",
4318
- value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
4319
- });
4320
- }
4321
- if (decodeResult.raw.groundStation.iataCode) {
4322
- decodeResult.formatted.items.push({
4323
- type: "iataCode",
4324
- code: "IATA",
4325
- label: "IATA",
4326
- value: decodeResult.raw.groundStation.iataCode
4327
- });
4328
- }
4329
- if (decodeResult.raw.groundStation.icaoCode) {
4330
- decodeResult.formatted.items.push({
4331
- type: "icaoCode",
4332
- code: "ICAO",
4333
- label: "ICAO",
4334
- value: decodeResult.raw.groundStation.icaoCode
4335
- });
4336
- }
4337
- if (decodeResult.raw.groundStation.coordinates.latitude) {
4338
- decodeResult.formatted.items.push({
4339
- type: "coordinates",
4340
- code: "COORD",
4341
- label: "Ground Station Location",
4342
- value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
4343
- });
4344
- }
4345
- if (decodeResult.raw.groundStation.airport) {
4346
- decodeResult.formatted.items.push({
4347
- type: "airport",
4348
- code: "APT",
4349
- label: "Airport",
4350
- value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
4351
- });
4352
- }
4353
- }
4354
- if (decodeResult.raw.vdlFrequency) {
4355
- decodeResult.formatted.items.push({
4356
- type: "vdlFrequency",
4357
- code: "VDLFRQ",
4358
- label: "VDL Frequency",
4359
- value: `${decodeResult.raw.vdlFrequency} MHz`
4360
- });
4361
- }
4362
- decodeResult.decoded = true;
4363
- decodeResult.decoder.decodeLevel = "full";
4364
- return decodeResult;
4365
- }
4366
- };
4367
-
4368
- // lib/plugins/Label_QR.ts
4369
- var Label_QR = class extends DecoderPlugin {
4370
- name = "label-qr";
4371
- qualifiers() {
4372
- return {
4373
- labels: ["QR"]
4374
- };
4375
- }
4376
- decode(message, options = {}) {
4377
- const decodeResult = this.defaultResult();
4378
- decodeResult.decoder.name = this.name;
4379
- decodeResult.formatted.description = "ON Report";
4380
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4381
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4382
- ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
4383
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4384
- decodeResult.decoded = true;
4385
- if (!decodeResult.remaining.text)
4386
- decodeResult.decoder.decodeLevel = "full";
4387
- else
4388
- decodeResult.decoder.decodeLevel = "partial";
4389
- return decodeResult;
4390
- }
4391
- };
4392
-
4393
- // lib/plugins/Label_QP.ts
4394
- var Label_QP = class extends DecoderPlugin {
4395
- name = "label-qp";
4396
- qualifiers() {
4397
- return {
4398
- labels: ["QP"]
4399
- };
4400
- }
4401
- decode(message, options = {}) {
4402
- const decodeResult = this.defaultResult();
4403
- decodeResult.decoder.name = this.name;
4404
- decodeResult.formatted.description = "OUT Report";
4405
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4406
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4407
- ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
4408
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4409
- decodeResult.decoded = true;
4410
- if (!decodeResult.remaining.text)
4411
- decodeResult.decoder.decodeLevel = "full";
4412
- else
4413
- decodeResult.decoder.decodeLevel = "partial";
4414
- return decodeResult;
4415
- }
4416
- };
4417
-
4418
- // lib/plugins/Label_QS.ts
4419
- var Label_QS = class extends DecoderPlugin {
4420
- name = "label-qs";
4421
- qualifiers() {
4422
- return {
4423
- labels: ["QS"]
4424
- };
4425
- }
4426
- decode(message, options = {}) {
4427
- const decodeResult = this.defaultResult();
4428
- decodeResult.decoder.name = this.name;
4429
- decodeResult.formatted.description = "IN Report";
4430
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4431
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4432
- ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
4433
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4434
- decodeResult.decoded = true;
4435
- if (!decodeResult.remaining.text)
4436
- decodeResult.decoder.decodeLevel = "full";
4437
- else
4438
- decodeResult.decoder.decodeLevel = "partial";
4439
- return decodeResult;
4440
- }
4441
- };
4442
-
4443
- // lib/plugins/Label_QQ.ts
4444
- var Label_QQ = class extends DecoderPlugin {
4445
- name = "label-qq";
4446
- qualifiers() {
4447
- return {
4448
- labels: ["QQ"]
4449
- };
4450
- }
4451
- decode(message, options = {}) {
4452
- const decodeResult = this.defaultResult();
4453
- decodeResult.decoder.name = this.name;
4454
- decodeResult.message = message;
4455
- decodeResult.formatted.description = "OFF Report";
4456
- ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
4457
- ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
4458
- if (message.text.substring(12, 19) === "\r\n001FE") {
4459
- decodeResult.raw.day = message.text.substring(19, 21);
4460
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
4461
- let latdir = message.text.substring(27, 28);
4462
- let latdeg = Number(message.text.substring(28, 30));
4463
- let latmin = Number(message.text.substring(30, 34));
4464
- let londir = message.text.substring(34, 35);
4465
- let londeg = Number(message.text.substring(35, 38));
4466
- let lonmin = Number(message.text.substring(38, 42));
4467
- let pos = {
4468
- latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
4469
- longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
4470
- };
4471
- ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
4472
- ResultFormatter.position(decodeResult, pos);
4473
- if (decodeResult.remaining.text !== "---") {
4474
- ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
4475
- } else {
4476
- ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
4477
- }
4478
- ResultFormatter.unknown(decodeResult, message.text.substring(48));
4479
- } else {
4480
- ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
4481
- ResultFormatter.unknown(decodeResult, message.text.substring(12));
4482
- }
4483
- decodeResult.decoded = true;
4484
- if (!decodeResult.remaining.text)
4485
- decodeResult.decoder.decodeLevel = "full";
4486
- else
4487
- decodeResult.decoder.decodeLevel = "partial";
4488
- return decodeResult;
4489
- }
4490
- };
4491
-
4492
4277
  // lib/utils/miam.ts
4493
4278
  import * as Base85 from "base85";
4494
4279
  import * as zlib2 from "minizlib";
4495
4280
  import { Buffer as Buffer3 } from "buffer";
4281
+ var MIAMVersion = /* @__PURE__ */ ((MIAMVersion2) => {
4282
+ MIAMVersion2[MIAMVersion2["V1"] = 1] = "V1";
4283
+ MIAMVersion2[MIAMVersion2["V2"] = 2] = "V2";
4284
+ return MIAMVersion2;
4285
+ })(MIAMVersion || {});
4286
+ var MIAMFid = /* @__PURE__ */ ((MIAMFid2) => {
4287
+ MIAMFid2["SingleTransfer"] = "T";
4288
+ MIAMFid2["FileTransferRequest"] = "F";
4289
+ MIAMFid2["FileTransferAccept"] = "K";
4290
+ MIAMFid2["FileSegment"] = "S";
4291
+ MIAMFid2["FileTransferAbort"] = "A";
4292
+ MIAMFid2["XOFFIndication"] = "Y";
4293
+ MIAMFid2["XONIndication"] = "X";
4294
+ return MIAMFid2;
4295
+ })(MIAMFid || {});
4296
+ var MIAMCorePdu = /* @__PURE__ */ ((MIAMCorePdu2) => {
4297
+ MIAMCorePdu2[MIAMCorePdu2["Data"] = 0] = "Data";
4298
+ MIAMCorePdu2[MIAMCorePdu2["Ack"] = 1] = "Ack";
4299
+ MIAMCorePdu2[MIAMCorePdu2["Aloha"] = 2] = "Aloha";
4300
+ MIAMCorePdu2[MIAMCorePdu2["AlohaReply"] = 3] = "AlohaReply";
4301
+ return MIAMCorePdu2;
4302
+ })(MIAMCorePdu || {});
4303
+ var MIAMCoreApp = /* @__PURE__ */ ((MIAMCoreApp2) => {
4304
+ MIAMCoreApp2[MIAMCoreApp2["ACARS2Char"] = 0] = "ACARS2Char";
4305
+ MIAMCoreApp2[MIAMCoreApp2["ACARS4Char"] = 1] = "ACARS4Char";
4306
+ MIAMCoreApp2[MIAMCoreApp2["ACARS6Char"] = 2] = "ACARS6Char";
4307
+ MIAMCoreApp2[MIAMCoreApp2["NonACARS6Char"] = 3] = "NonACARS6Char";
4308
+ return MIAMCoreApp2;
4309
+ })(MIAMCoreApp || {});
4496
4310
  var MIAMCoreV1CRCLength = 4;
4497
4311
  var MIAMCoreV2CRCLength = 2;
4312
+ var isMIAMVersion = (x) => Object.values(MIAMVersion).includes(x);
4313
+ var isMIAMFid = (x) => Object.values(MIAMFid).includes(x);
4314
+ var isMIAMCoreApp = (x) => Object.values(MIAMCoreApp).includes(x);
4315
+ var isMIAMCorePdu = (x) => Object.values(MIAMCorePdu).includes(x);
4498
4316
  var MIAMCoreUtils = class {
4499
4317
  static AppTypeToAppIdLenTable = {
4500
- 1: {
4318
+ [1 /* V1 */]: {
4501
4319
  [0 /* ACARS2Char */]: 2,
4502
4320
  [1 /* ACARS4Char */]: 4,
4503
4321
  [2 /* ACARS6Char */]: 6,
4504
4322
  [3 /* NonACARS6Char */]: 6
4505
4323
  },
4506
- 2: {
4324
+ [2 /* V2 */]: {
4507
4325
  [0 /* ACARS2Char */]: 2,
4508
4326
  [1 /* ACARS4Char */]: 4,
4509
4327
  [2 /* ACARS6Char */]: 6,
@@ -4569,21 +4387,34 @@ var MIAMCoreUtils = class {
4569
4387
  hdr = hdr.subarray(0, hdr.length - hpad);
4570
4388
  const version = hdr.readUInt8(0) & 15;
4571
4389
  const pduType = hdr.readUInt8(0) >> 4 & 15;
4572
- const versionPduHandler = this.VersionPduHandlerTable[version][pduType];
4573
- if (versionPduHandler === void 0) {
4390
+ if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {
4391
+ const versionPduHandler = this.VersionPduHandlerTable[version][pduType];
4392
+ return versionPduHandler(hdr, body);
4393
+ } else {
4574
4394
  return {
4575
4395
  decoded: false,
4576
4396
  error: "Invalid version and PDU type combination: v=" + version + ", pdu=" + pduType
4577
4397
  };
4578
4398
  }
4579
- return versionPduHandler(hdr, body);
4580
4399
  },
4581
- ["F" /* FileTransferRequest */]: void 0,
4582
- ["K" /* FileTransferAccept */]: void 0,
4583
- ["S" /* FileSegment */]: void 0,
4584
- ["A" /* FileTransferAbort */]: void 0,
4585
- ["Y" /* XOFFIndication */]: void 0,
4586
- ["X" /* XONIndication */]: void 0
4400
+ ["F" /* FileTransferRequest */]: () => {
4401
+ return { decoded: false, error: "File Transfer Request not implemented" };
4402
+ },
4403
+ ["K" /* FileTransferAccept */]: () => {
4404
+ return { decoded: false, error: "File Transfer Accept not implemented" };
4405
+ },
4406
+ ["S" /* FileSegment */]: () => {
4407
+ return { decoded: false, error: "File Segment not implemented" };
4408
+ },
4409
+ ["A" /* FileTransferAbort */]: () => {
4410
+ return { decoded: false, error: "File Transfer Abort not implemented" };
4411
+ },
4412
+ ["Y" /* XOFFIndication */]: () => {
4413
+ return { decoded: false, error: "XOFF Indication not implemented" };
4414
+ },
4415
+ ["X" /* XONIndication */]: () => {
4416
+ return { decoded: false, error: "XON Indication not implemented" };
4417
+ }
4587
4418
  };
4588
4419
  static arincCrc16(buf, seed) {
4589
4420
  const crctable = [
@@ -5117,14 +4948,15 @@ var MIAMCoreUtils = class {
5117
4948
  }
5118
4949
  static parse(txt) {
5119
4950
  const fidType = txt[0];
5120
- const handler = this.FidHandlerTable[fidType];
5121
- if (handler === void 0) {
4951
+ if (isMIAMFid(fidType)) {
4952
+ const handler = this.FidHandlerTable[fidType];
4953
+ return handler(txt.substring(1));
4954
+ } else {
5122
4955
  return {
5123
4956
  decoded: false,
5124
4957
  error: "Unsupported FID type: " + fidType
5125
4958
  };
5126
4959
  }
5127
- return handler(txt.substring(1));
5128
4960
  }
5129
4961
  static corePduDataHandler(version, minHdrSize, crcLen, hdr, body) {
5130
4962
  if (hdr.length < minHdrSize) {
@@ -5139,14 +4971,14 @@ var MIAMCoreUtils = class {
5139
4971
  let pduAppType = 0;
5140
4972
  let pduAppId = "";
5141
4973
  let pduCrc = 0;
5142
- let pduData = void 0;
4974
+ let pduData = null;
5143
4975
  let pduCrcIsOk = false;
5144
4976
  let pduIsComplete = true;
5145
4977
  let pduErrors = [];
5146
4978
  let tail = void 0;
5147
4979
  let msgNum = 0;
5148
4980
  let ackOptions = 0;
5149
- if (version === 1) {
4981
+ if (version === 1 /* V1 */) {
5150
4982
  pduSize = hdr.readUInt8(1) << 16 | hdr.readUInt8(2) << 8 | hdr.readUInt8(3);
5151
4983
  const msgSize = hdr.length + (body === void 0 ? 0 : body.length);
5152
4984
  if (pduSize > msgSize) {
@@ -5156,7 +4988,7 @@ var MIAMCoreUtils = class {
5156
4988
  hdr = hdr.subarray(4);
5157
4989
  tail = hdr.subarray(0, 7).toString("ascii");
5158
4990
  hdr = hdr.subarray(7);
5159
- } else if (version === 2) {
4991
+ } else if (version === 2 /* V2 */) {
5160
4992
  hdr = hdr.subarray(1);
5161
4993
  }
5162
4994
  msgNum = hdr.readUInt8(0) >> 1 & 127;
@@ -5166,9 +4998,11 @@ var MIAMCoreUtils = class {
5166
4998
  pduEncoding = hdr.readUInt8(1) >> 4 & 3;
5167
4999
  pduAppType = hdr.readUInt8(1) & 15;
5168
5000
  hdr = hdr.subarray(2);
5169
- let appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];
5170
- if (appIdLen === void 0) {
5171
- if (version === 2 && (pduAppType & 8) !== 0 && pduAppType !== 13) {
5001
+ let appIdLen;
5002
+ if (isMIAMCoreApp(pduAppType)) {
5003
+ appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];
5004
+ } else {
5005
+ if (version === 2 /* V2 */ && (pduAppType & 8) !== 0 && pduAppType !== 13) {
5172
5006
  appIdLen = (pduAppType & 7) + 1;
5173
5007
  } else {
5174
5008
  return {
@@ -5178,9 +5012,6 @@ var MIAMCoreUtils = class {
5178
5012
  }
5179
5013
  }
5180
5014
  const pduIsACARS = [
5181
- 0 /* ACARS2Char */,
5182
- 1 /* ACARS4Char */,
5183
- 2 /* ACARS6Char */,
5184
5015
  0 /* ACARS2Char */,
5185
5016
  1 /* ACARS4Char */,
5186
5017
  2 /* ACARS6Char */
@@ -5202,7 +5033,7 @@ var MIAMCoreUtils = class {
5202
5033
  if (body !== void 0 && body.length > 0) {
5203
5034
  if ([1 /* Deflate */, 1 /* Deflate */].indexOf(pduCompression) >= 0) {
5204
5035
  try {
5205
- const decompress = new zlib2.InflateRaw({ windowBits: 15 });
5036
+ const decompress = new zlib2.InflateRaw({});
5206
5037
  decompress.write(body);
5207
5038
  decompress.flush(zlib2.constants.Z_SYNC_FLUSH);
5208
5039
  pduData = decompress.read();
@@ -5214,18 +5045,18 @@ var MIAMCoreUtils = class {
5214
5045
  } else {
5215
5046
  pduErrors.push("Unsupported v" + version + " compression type: " + pduCompression);
5216
5047
  }
5217
- if (pduData !== void 0) {
5048
+ if (pduData !== null) {
5218
5049
  const crcAlgoHandlerByVersion = {
5219
- 1: (buf, seed) => {
5050
+ [1 /* V1 */]: (buf, seed) => {
5220
5051
  return ~this.arinc665Crc32(buf, seed);
5221
5052
  },
5222
- 2: this.arincCrc16
5053
+ [2 /* V2 */]: this.arincCrc16
5223
5054
  };
5224
5055
  const crcAlgoHandler = crcAlgoHandlerByVersion[version];
5225
5056
  if (crcAlgoHandler === void 0) {
5226
5057
  return {
5227
5058
  decoded: false,
5228
- errors: "No CRC handler for v" + version
5059
+ error: "No CRC handler for v" + version
5229
5060
  };
5230
5061
  }
5231
5062
  const crcCheck = crcAlgoHandler(pduData, 4294967295);
@@ -5273,25 +5104,317 @@ var MIAMCoreUtils = class {
5273
5104
  };
5274
5105
  }
5275
5106
  static VersionPduHandlerTable = {
5276
- 1: {
5107
+ [1 /* V1 */]: {
5277
5108
  [0 /* Data */]: (hdr, body) => {
5278
- return this.corePduDataHandler(1, 20, MIAMCoreV1CRCLength, hdr, body);
5109
+ return this.corePduDataHandler(1 /* V1 */, 20, MIAMCoreV1CRCLength, hdr, body);
5279
5110
  },
5280
- [1 /* Ack */]: void 0,
5281
- [2 /* Aloha */]: void 0,
5282
- [3 /* AlohaReply */]: void 0
5111
+ [1 /* Ack */]: () => {
5112
+ return { decoded: false, error: "v1 Ack PDU not implemented" };
5113
+ },
5114
+ [2 /* Aloha */]: () => {
5115
+ return { decoded: false, error: "v1 Aloha PDU not implemented" };
5116
+ },
5117
+ [3 /* AlohaReply */]: () => {
5118
+ return { decoded: false, error: "v1 AlohaReply PDU not implemented" };
5119
+ }
5283
5120
  },
5284
- 2: {
5121
+ [2 /* V2 */]: {
5285
5122
  [0 /* Data */]: (hdr, body) => {
5286
- return this.corePduDataHandler(2, 7, MIAMCoreV2CRCLength, hdr, body);
5123
+ return this.corePduDataHandler(2 /* V2 */, 7, MIAMCoreV2CRCLength, hdr, body);
5124
+ },
5125
+ [1 /* Ack */]: () => {
5126
+ return { decoded: false, error: "v2 Ack PDU not implemented" };
5127
+ },
5128
+ [2 /* Aloha */]: () => {
5129
+ return { decoded: false, error: "v2 Aloha PDU not implemented" };
5287
5130
  },
5288
- [1 /* Ack */]: void 0,
5289
- [2 /* Aloha */]: void 0,
5290
- [3 /* AlohaReply */]: void 0
5131
+ [3 /* AlohaReply */]: () => {
5132
+ return { decoded: false, error: "v2 Aloha reply PDU not implemented" };
5133
+ }
5291
5134
  }
5292
5135
  };
5293
5136
  };
5294
5137
 
5138
+ // lib/plugins/Label_MA.ts
5139
+ var Label_MA = class extends DecoderPlugin {
5140
+ name = "label-ma";
5141
+ qualifiers() {
5142
+ return {
5143
+ labels: ["MA"]
5144
+ };
5145
+ }
5146
+ decode(message, options = {}) {
5147
+ let decodeResult = this.defaultResult();
5148
+ decodeResult.decoder.name = this.name;
5149
+ decodeResult.message = message;
5150
+ const miamResult = MIAMCoreUtils.parse(message.text);
5151
+ if (miamResult.decoded && miamResult.message.data && miamResult.message.data.acars) {
5152
+ decodeResult.decoded = true;
5153
+ decodeResult.decoder.decodeLevel = "partial";
5154
+ ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);
5155
+ if (miamResult.message.data.acars.sublabel) {
5156
+ ResultFormatter.sublabel(decodeResult, miamResult.message.data.acars.sublabel);
5157
+ }
5158
+ if (miamResult.message.data.acars.tail) {
5159
+ ResultFormatter.tail(decodeResult, miamResult.message.data.acars.tail);
5160
+ }
5161
+ const messageText = miamResult.message.data.acars.text;
5162
+ if (miamResult.message.data.crcOk && miamResult.message.data.complete && messageText) {
5163
+ const decoded = this.decoder.decode({
5164
+ label: miamResult.message.data.acars.label,
5165
+ sublabel: miamResult.message.data.acars.sublabel,
5166
+ text: messageText
5167
+ }, options);
5168
+ if (decoded.decoded) {
5169
+ decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;
5170
+ decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };
5171
+ decodeResult.formatted.items.push(...decoded.formatted.items);
5172
+ } else {
5173
+ ResultFormatter.text(decodeResult, messageText);
5174
+ }
5175
+ message.text = messageText;
5176
+ } else if (messageText) {
5177
+ ResultFormatter.text(decodeResult, messageText);
5178
+ }
5179
+ message.label = miamResult.message.data.acars.label;
5180
+ message.sublabel = miamResult.message.data.acars.sublabel;
5181
+ return decodeResult;
5182
+ }
5183
+ return decodeResult;
5184
+ }
5185
+ };
5186
+
5187
+ // lib/plugins/Label_SQ.ts
5188
+ var Label_SQ = class extends DecoderPlugin {
5189
+ name = "label-sq";
5190
+ qualifiers() {
5191
+ return {
5192
+ labels: ["SQ"]
5193
+ };
5194
+ }
5195
+ decode(message, options = {}) {
5196
+ const decodeResult = this.defaultResult();
5197
+ decodeResult.decoder.name = this.name;
5198
+ decodeResult.raw.preamble = message.text.substring(0, 4);
5199
+ decodeResult.raw.version = message.text.substring(1, 2);
5200
+ decodeResult.raw.network = message.text.substring(3, 4);
5201
+ if (decodeResult.raw.version === "2") {
5202
+ 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+)\/.*/;
5203
+ const result = message.text.match(regex);
5204
+ if (result?.groups && result.length >= 8) {
5205
+ decodeResult.raw.groundStation = {
5206
+ number: result.groups.station,
5207
+ iataCode: result.groups.iata,
5208
+ icaoCode: result.groups.icao,
5209
+ coordinates: {
5210
+ latitude: Number(result.groups.lat) / 100 * (result.groups.latd === "S" ? -1 : 1),
5211
+ longitude: Number(result.groups.lng) / 100 * (result.groups.lngd === "W" ? -1 : 1)
5212
+ }
5213
+ };
5214
+ decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1e3;
5215
+ }
5216
+ }
5217
+ decodeResult.formatted.description = "Ground Station Squitter";
5218
+ var formattedNetwork = "Unknown";
5219
+ if (decodeResult.raw.network == "A") {
5220
+ formattedNetwork = "ARINC";
5221
+ } else if (decodeResult.raw.network == "S") {
5222
+ formattedNetwork = "SITA";
5223
+ }
5224
+ decodeResult.formatted.items = [
5225
+ {
5226
+ type: "network",
5227
+ code: "NETT",
5228
+ label: "Network",
5229
+ value: formattedNetwork
5230
+ },
5231
+ {
5232
+ type: "version",
5233
+ code: "VER",
5234
+ label: "Version",
5235
+ value: decodeResult.raw.version
5236
+ }
5237
+ ];
5238
+ if (decodeResult.raw.groundStation) {
5239
+ if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {
5240
+ decodeResult.formatted.items.push({
5241
+ type: "ground_station",
5242
+ code: "GNDSTN",
5243
+ label: "Ground Station",
5244
+ value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`
5245
+ });
5246
+ }
5247
+ if (decodeResult.raw.groundStation.iataCode) {
5248
+ decodeResult.formatted.items.push({
5249
+ type: "iataCode",
5250
+ code: "IATA",
5251
+ label: "IATA",
5252
+ value: decodeResult.raw.groundStation.iataCode
5253
+ });
5254
+ }
5255
+ if (decodeResult.raw.groundStation.icaoCode) {
5256
+ decodeResult.formatted.items.push({
5257
+ type: "icaoCode",
5258
+ code: "ICAO",
5259
+ label: "ICAO",
5260
+ value: decodeResult.raw.groundStation.icaoCode
5261
+ });
5262
+ }
5263
+ if (decodeResult.raw.groundStation.coordinates.latitude) {
5264
+ decodeResult.formatted.items.push({
5265
+ type: "coordinates",
5266
+ code: "COORD",
5267
+ label: "Ground Station Location",
5268
+ value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`
5269
+ });
5270
+ }
5271
+ if (decodeResult.raw.groundStation.airport) {
5272
+ decodeResult.formatted.items.push({
5273
+ type: "airport",
5274
+ code: "APT",
5275
+ label: "Airport",
5276
+ value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`
5277
+ });
5278
+ }
5279
+ }
5280
+ if (decodeResult.raw.vdlFrequency) {
5281
+ decodeResult.formatted.items.push({
5282
+ type: "vdlFrequency",
5283
+ code: "VDLFRQ",
5284
+ label: "VDL Frequency",
5285
+ value: `${decodeResult.raw.vdlFrequency} MHz`
5286
+ });
5287
+ }
5288
+ decodeResult.decoded = true;
5289
+ decodeResult.decoder.decodeLevel = "full";
5290
+ return decodeResult;
5291
+ }
5292
+ };
5293
+
5294
+ // lib/plugins/Label_QR.ts
5295
+ var Label_QR = class extends DecoderPlugin {
5296
+ name = "label-qr";
5297
+ qualifiers() {
5298
+ return {
5299
+ labels: ["QR"]
5300
+ };
5301
+ }
5302
+ decode(message, options = {}) {
5303
+ const decodeResult = this.defaultResult();
5304
+ decodeResult.decoder.name = this.name;
5305
+ decodeResult.formatted.description = "ON Report";
5306
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5307
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5308
+ ResultFormatter.on(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5309
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5310
+ decodeResult.decoded = true;
5311
+ if (!decodeResult.remaining.text)
5312
+ decodeResult.decoder.decodeLevel = "full";
5313
+ else
5314
+ decodeResult.decoder.decodeLevel = "partial";
5315
+ return decodeResult;
5316
+ }
5317
+ };
5318
+
5319
+ // lib/plugins/Label_QP.ts
5320
+ var Label_QP = class extends DecoderPlugin {
5321
+ name = "label-qp";
5322
+ qualifiers() {
5323
+ return {
5324
+ labels: ["QP"]
5325
+ };
5326
+ }
5327
+ decode(message, options = {}) {
5328
+ const decodeResult = this.defaultResult();
5329
+ decodeResult.decoder.name = this.name;
5330
+ decodeResult.formatted.description = "OUT Report";
5331
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5332
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5333
+ ResultFormatter.out(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5334
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5335
+ decodeResult.decoded = true;
5336
+ if (!decodeResult.remaining.text)
5337
+ decodeResult.decoder.decodeLevel = "full";
5338
+ else
5339
+ decodeResult.decoder.decodeLevel = "partial";
5340
+ return decodeResult;
5341
+ }
5342
+ };
5343
+
5344
+ // lib/plugins/Label_QS.ts
5345
+ var Label_QS = class extends DecoderPlugin {
5346
+ name = "label-qs";
5347
+ qualifiers() {
5348
+ return {
5349
+ labels: ["QS"]
5350
+ };
5351
+ }
5352
+ decode(message, options = {}) {
5353
+ const decodeResult = this.defaultResult();
5354
+ decodeResult.decoder.name = this.name;
5355
+ decodeResult.formatted.description = "IN Report";
5356
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5357
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5358
+ ResultFormatter.in(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)));
5359
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5360
+ decodeResult.decoded = true;
5361
+ if (!decodeResult.remaining.text)
5362
+ decodeResult.decoder.decodeLevel = "full";
5363
+ else
5364
+ decodeResult.decoder.decodeLevel = "partial";
5365
+ return decodeResult;
5366
+ }
5367
+ };
5368
+
5369
+ // lib/plugins/Label_QQ.ts
5370
+ var Label_QQ = class extends DecoderPlugin {
5371
+ name = "label-qq";
5372
+ qualifiers() {
5373
+ return {
5374
+ labels: ["QQ"]
5375
+ };
5376
+ }
5377
+ decode(message, options = {}) {
5378
+ const decodeResult = this.defaultResult();
5379
+ decodeResult.decoder.name = this.name;
5380
+ decodeResult.message = message;
5381
+ decodeResult.formatted.description = "OFF Report";
5382
+ ResultFormatter.departureAirport(decodeResult, message.text.substring(0, 4));
5383
+ ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));
5384
+ if (message.text.substring(12, 19) === "\r\n001FE") {
5385
+ decodeResult.raw.day = message.text.substring(19, 21);
5386
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)));
5387
+ let latdir = message.text.substring(27, 28);
5388
+ let latdeg = Number(message.text.substring(28, 30));
5389
+ let latmin = Number(message.text.substring(30, 34));
5390
+ let londir = message.text.substring(34, 35);
5391
+ let londeg = Number(message.text.substring(35, 38));
5392
+ let lonmin = Number(message.text.substring(38, 42));
5393
+ let pos = {
5394
+ latitude: (latdeg + latmin / 60) * (latdir === "N" ? 1 : -1),
5395
+ longitude: (londeg + lonmin / 60) * (londir === "E" ? 1 : -1)
5396
+ };
5397
+ ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));
5398
+ ResultFormatter.position(decodeResult, pos);
5399
+ if (decodeResult.remaining.text !== "---") {
5400
+ ResultFormatter.groundspeed(decodeResult, Number(message.text.substring(45, 48)));
5401
+ } else {
5402
+ ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));
5403
+ }
5404
+ ResultFormatter.unknown(decodeResult, message.text.substring(48));
5405
+ } else {
5406
+ ResultFormatter.off(decodeResult, DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + "00"));
5407
+ ResultFormatter.unknown(decodeResult, message.text.substring(12));
5408
+ }
5409
+ decodeResult.decoded = true;
5410
+ if (!decodeResult.remaining.text)
5411
+ decodeResult.decoder.decodeLevel = "full";
5412
+ else
5413
+ decodeResult.decoder.decodeLevel = "partial";
5414
+ return decodeResult;
5415
+ }
5416
+ };
5417
+
5295
5418
  // lib/MessageDecoder.ts
5296
5419
  var MessageDecoder = class {
5297
5420
  name;
@@ -5359,6 +5482,7 @@ var MessageDecoder = class {
5359
5482
  this.registerPlugin(new Label_83(this));
5360
5483
  this.registerPlugin(new Label_8E(this));
5361
5484
  this.registerPlugin(new Label_1M_Slash(this));
5485
+ this.registerPlugin(new Label_MA(this));
5362
5486
  this.registerPlugin(new Label_SQ(this));
5363
5487
  this.registerPlugin(new Label_QP(this));
5364
5488
  this.registerPlugin(new Label_QQ(this));
@@ -5371,18 +5495,6 @@ var MessageDecoder = class {
5371
5495
  return true;
5372
5496
  }
5373
5497
  decode(message, options = {}) {
5374
- if (message.label === "MA") {
5375
- const decodeResult = MIAMCoreUtils.parse(message.text);
5376
- if (decodeResult.decoded && decodeResult.message.data !== void 0 && decodeResult.message.data.crcOk && decodeResult.message.data.complete && decodeResult.message.data.acars !== void 0) {
5377
- message = {
5378
- ...message,
5379
- label: decodeResult.message.data.acars.label,
5380
- ...decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {},
5381
- ...decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {},
5382
- ...decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}
5383
- };
5384
- }
5385
- }
5386
5498
  const usablePlugins = this.plugins.filter((plugin) => {
5387
5499
  const qualifiers = plugin.qualifiers();
5388
5500
  if (qualifiers.labels.includes(message.label)) {
@@ -5432,11 +5544,6 @@ var MessageDecoder = class {
5432
5544
  }
5433
5545
  return result;
5434
5546
  }
5435
- lookupAirportByIata(iata) {
5436
- const airportsArray = [];
5437
- const airport = airportsArray.filter((e) => e.iata === iata);
5438
- return airport;
5439
- }
5440
5547
  };
5441
5548
  export {
5442
5549
  IcaoDecoder,