signal-desktop/ts/util/timestampLongUtils.ts
2025-01-08 18:22:56 -08:00

78 lines
1.6 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import Long from 'long';
import { MAX_SAFE_DATE } from './timestamp';
export function getSafeLongFromTimestamp(
timestamp = 0,
maxValue: Long | number = MAX_SAFE_DATE
): Long {
if (timestamp >= MAX_SAFE_DATE) {
if (typeof maxValue === 'number') {
return Long.fromNumber(maxValue);
}
return maxValue;
}
return Long.fromNumber(timestamp);
}
export function getTimestampFromLong(value?: Long | null): number {
if (!value || value.isNegative()) {
return 0;
}
const num = value.toNumber();
if (num > MAX_SAFE_DATE) {
return MAX_SAFE_DATE;
}
return num;
}
export class InvalidTimestampError extends Error {
constructor(message: string) {
super(`InvalidTimestampError: ${message}`);
}
}
export function getCheckedTimestampFromLong(value?: Long | null): number {
if (value == null) {
throw new InvalidTimestampError('No number');
}
const num = value.toNumber();
if (num < 0) {
throw new InvalidTimestampError('Underflow');
}
if (num > MAX_SAFE_DATE) {
throw new InvalidTimestampError('Overflow');
}
return num;
}
export function getTimestampOrUndefinedFromLong(
value?: Long | null
): number | undefined {
if (!value || value.isZero()) {
return undefined;
}
return getTimestampFromLong(value);
}
export function getCheckedTimestampOrUndefinedFromLong(
value?: Long | null
): number | undefined {
if (!value || value.isZero()) {
return undefined;
}
return getCheckedTimestampFromLong(value);
}