mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-02 00:07:56 +01:00
81 lines
1.6 KiB
TypeScript
81 lines
1.6 KiB
TypeScript
// Copyright 2021 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { MAX_SAFE_DATE } from './timestamp.std.js';
|
|
import { toNumber } from './toNumber.std.js';
|
|
|
|
export function getSafeLongFromTimestamp(
|
|
timestamp = 0,
|
|
maxValue: bigint | number = MAX_SAFE_DATE
|
|
): bigint {
|
|
if (timestamp >= MAX_SAFE_DATE) {
|
|
if (typeof maxValue === 'number') {
|
|
return BigInt(maxValue);
|
|
}
|
|
return maxValue;
|
|
}
|
|
|
|
return BigInt(timestamp);
|
|
}
|
|
|
|
export function getTimestampFromLong(
|
|
value?: bigint | null,
|
|
maxValue = MAX_SAFE_DATE
|
|
): number {
|
|
if (!value || value < 0n) {
|
|
return 0;
|
|
}
|
|
|
|
const num = toNumber(value);
|
|
|
|
if (num > MAX_SAFE_DATE) {
|
|
return maxValue;
|
|
}
|
|
|
|
return num;
|
|
}
|
|
|
|
export class InvalidTimestampError extends Error {
|
|
constructor(message: string) {
|
|
super(`InvalidTimestampError: ${message}`);
|
|
}
|
|
}
|
|
|
|
export function getCheckedTimestampFromLong(value?: bigint | null): number {
|
|
if (value == null) {
|
|
throw new InvalidTimestampError('No number');
|
|
}
|
|
|
|
const num = toNumber(value);
|
|
|
|
if (num < 0) {
|
|
throw new InvalidTimestampError('Underflow');
|
|
}
|
|
|
|
if (num > MAX_SAFE_DATE) {
|
|
throw new InvalidTimestampError('Overflow');
|
|
}
|
|
|
|
return num;
|
|
}
|
|
|
|
export function getTimestampOrUndefinedFromLong(
|
|
value?: bigint | null
|
|
): number | undefined {
|
|
if (!value || value === 0n) {
|
|
return undefined;
|
|
}
|
|
|
|
return getTimestampFromLong(value);
|
|
}
|
|
|
|
export function getCheckedTimestampOrUndefinedFromLong(
|
|
value?: bigint | null
|
|
): number | undefined {
|
|
if (!value || value === 0n) {
|
|
return undefined;
|
|
}
|
|
|
|
return getCheckedTimestampFromLong(value);
|
|
}
|