const maxDockerUnixNanoseconds = 9_223_372_036_854_775_807n; const canonicalNanoseconds = /^(0|[1-9][0-9]*)$/u; const rfc3339Nano = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|[+-]\d{2}:\d{2})$/u; /** Docker's UnixNano value is signed 64-bit; never reconstruct it from a JS number. */ export const parseDockerUnixNanoseconds = (valueArg: unknown, contextArg: string): bigint => { if (typeof valueArg !== 'string' || !canonicalNanoseconds.test(valueArg)) { throw new Error(`${contextArg} must be a canonical nonnegative Unix-nanosecond integer.`); } const value = BigInt(valueArg); if (value > maxDockerUnixNanoseconds) { throw new Error(`${contextArg} exceeds Docker's signed 64-bit Unix-nanosecond range.`); } return value; }; /** Parse Docker's RFC3339Nano StartedAt without discarding fractional nanoseconds. */ export const parseDockerStartedAtNanoseconds = (valueArg: unknown): bigint => { if (typeof valueArg !== 'string') { throw new Error('Docker container StartedAt is missing or malformed.'); } const match = rfc3339Nano.exec(valueArg); if (!match) { throw new Error('Docker container StartedAt is missing or malformed.'); } const [, yearText, monthText, dayText, hourText, minuteText, secondText, fractionalText = '', zone] = match; const year = Number(yearText); const month = Number(monthText); const day = Number(dayText); const hour = Number(hourText); const minute = Number(minuteText); const second = Number(secondText); const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); const daysInMonth = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; const zoneHour = zone === 'Z' ? 0 : Number(zone.slice(1, 3)); const zoneMinute = zone === 'Z' ? 0 : Number(zone.slice(4, 6)); if ( month < 1 || month > 12 || day < 1 || day > daysInMonth[month - 1] || hour > 23 || minute > 59 || second > 59 || zoneHour > 23 || zoneMinute > 59 ) { throw new Error('Docker container StartedAt is missing or malformed.'); } const wholeSeconds = `${yearText}-${monthText}-${dayText}T${hourText}:${minuteText}:${secondText}${zone}`; const milliseconds = Date.parse(wholeSeconds); if (!Number.isSafeInteger(milliseconds)) { throw new Error('Docker container StartedAt is outside the supported timestamp range.'); } const nanoseconds = BigInt(milliseconds) * 1_000_000n + BigInt(fractionalText.padEnd(9, '0') || '0'); if (nanoseconds < 0n || nanoseconds > maxDockerUnixNanoseconds) { // Includes Docker's 0001-01-01T00:00:00Z sentinel for a never-started container. throw new Error('Docker container StartedAt does not identify a started runtime.'); } return nanoseconds; };