Summary
processDateCode in lib/utils/arinc_702_helper.ts builds a locally-swapped date string and then drops it on the floor — the value computed into date is never read. The code reads as if it were copy-pasted from the sibling Arinc702Helper.processTimeStamp in the same file, which performs the same swap but uses it as a NaN fallback. The fallback got lost in processDateCode, so dates that the first convertDateTimeToEpoch call cannot parse silently become NaN in decodeResult.raw.message_timestamp instead of being retried with the swapped MMDDYY form.
Affected code
lib/utils/arinc_702_helper.ts:522-535
function processDateCode(decodeResult: DecodeResult, data: string[]) {
if (data.length === 1) {
// noop?
} else if (data.length === 2) {
// convert DDMMYY to MMDDYY - TODO figure out a better way to determine
const date =
data[0].substring(2, 4) +
data[0].substring(0, 2) +
data[0].substring(4, 6); // <-- computed but never used
const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS
// ^^^^^^^ uses unsorted data[0], not `date`
decodeResult.raw.message_timestamp = time;
}
}
Compare to the working processTimeStamp (same file, ~lines 222-242):
let time = DateTimeUtils.convertDateTimeToEpoch(
data[0],
data[1].substring(0, 6),
);
if (Number.isNaN(time)) {
// convert DDMMYY to MMDDYY - TODO figure out a better way to determine
const date =
data[1].substring(2, 4) +
data[1].substring(0, 2) +
data[1].substring(4, 6);
time = DateTimeUtils.convertDateTimeToEpoch(data[0], date); // <-- actually used
}
decodeResult.raw.message_timestamp = time;
The date local in processDateCode is exactly the same swap, with no if (isNaN(time)) retry — strongly suggesting the second convertDateTimeToEpoch call was dropped during a refactor.
Suggested fix
Either (a) restore the NaN fallback so processDateCode behaves like processTimeStamp:
function processDateCode(decodeResult: DecodeResult, data: string[]) {
if (data.length !== 2) return;
let time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]);
if (Number.isNaN(time)) {
const swapped =
data[0].substring(2, 4) +
data[0].substring(0, 2) +
data[0].substring(4, 6);
time = DateTimeUtils.convertDateTimeToEpoch(data[1], swapped);
}
decodeResult.raw.message_timestamp = time;
}
…or (b) delete the unused date local entirely if the fallback is genuinely not wanted here, so the file stops carrying a misleading half-implementation. A test pair (one DDMMYY date that succeeds on the first try; one ambiguous date that needs the swap) would lock the chosen behavior in.
Related observations (same file, lower priority)
While reading I noticed two other smaller items that could be folded into the same cleanup PR or filed separately:
FlightPlanUtils.parseHeader else branch can produce "undefined...". decodeResult.remaining.text += header; is unsafe when remaining.text is still undefined (the defaultResult() shape). In practice decodeH1Message zeroes it first so the bug isn't observable through that path, but other call sites of processFlightPlan are not protected.
FlightPlanUtils.processFlightPlan reads data[i + 1] without bounds-checking. For an even-length data array, the final iteration sees value === undefined; cases like 'FP' (value.trim()) would then throw. Malformed input only, but worth a guard.
Happy to split those out if helpful.
Summary
processDateCodeinlib/utils/arinc_702_helper.tsbuilds a locally-swapped date string and then drops it on the floor — the value computed intodateis never read. The code reads as if it were copy-pasted from the siblingArinc702Helper.processTimeStampin the same file, which performs the same swap but uses it as a NaN fallback. The fallback got lost inprocessDateCode, so dates that the firstconvertDateTimeToEpochcall cannot parse silently becomeNaNindecodeResult.raw.message_timestampinstead of being retried with the swapped MMDDYY form.Affected code
lib/utils/arinc_702_helper.ts:522-535Compare to the working
processTimeStamp(same file, ~lines 222-242):The
datelocal inprocessDateCodeis exactly the same swap, with noif (isNaN(time))retry — strongly suggesting the secondconvertDateTimeToEpochcall was dropped during a refactor.Suggested fix
Either (a) restore the NaN fallback so
processDateCodebehaves likeprocessTimeStamp:…or (b) delete the unused
datelocal entirely if the fallback is genuinely not wanted here, so the file stops carrying a misleading half-implementation. A test pair (one DDMMYY date that succeeds on the first try; one ambiguous date that needs the swap) would lock the chosen behavior in.Related observations (same file, lower priority)
While reading I noticed two other smaller items that could be folded into the same cleanup PR or filed separately:
FlightPlanUtils.parseHeaderelsebranch can produce"undefined...".decodeResult.remaining.text += header;is unsafe whenremaining.textis stillundefined(thedefaultResult()shape). In practicedecodeH1Messagezeroes it first so the bug isn't observable through that path, but other call sites ofprocessFlightPlanare not protected.FlightPlanUtils.processFlightPlanreadsdata[i + 1]without bounds-checking. For an even-lengthdataarray, the final iteration seesvalue === undefined; cases like'FP'(value.trim()) would then throw. Malformed input only, but worth a guard.Happy to split those out if helpful.