signal-desktop/ts/util/timestampLongUtils.ts

79 lines
1.6 KiB
TypeScript
Raw Normal View History

2021-04-09 09:19:38 -07:00
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
2021-07-13 11:54:53 -07:00
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;
2021-04-09 09:19:38 -07:00
}
2021-07-13 11:54:53 -07:00
return Long.fromNumber(timestamp);
2021-04-09 09:19:38 -07:00
}
2022-03-23 13:49:27 -07:00
export function getTimestampFromLong(value?: Long | null): number {
if (!value || value.isNegative()) {
2021-04-09 09:19:38 -07:00
return 0;
}
2022-03-23 13:49:27 -07:00
const num = value.toNumber();
2021-04-09 09:19:38 -07:00
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');
2021-04-09 09:19:38 -07:00
}
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);
}