From 058ce1b1661565af1491de75bff1f4a76fa9ad7c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 15 Feb 2021 17:27:14 +0100 Subject: [PATCH] Add fromSeconds --- packages/tendermint-rpc/src/dates.spec.ts | 57 +++++++++++++++++++++++ packages/tendermint-rpc/src/dates.ts | 11 +++++ packages/tendermint-rpc/src/index.ts | 1 + 3 files changed, 69 insertions(+) diff --git a/packages/tendermint-rpc/src/dates.spec.ts b/packages/tendermint-rpc/src/dates.spec.ts index a9883af4..bacb724c 100644 --- a/packages/tendermint-rpc/src/dates.spec.ts +++ b/packages/tendermint-rpc/src/dates.spec.ts @@ -4,6 +4,7 @@ import { DateTime, DateWithNanoseconds, fromRfc3339WithNanoseconds, + fromSeconds, toRfc3339WithNanoseconds, toSeconds, } from "./dates"; @@ -61,6 +62,62 @@ describe("dates", () => { }); }); + describe("fromSeconds", () => { + it("works", () => { + { + const date = fromSeconds(1608029846); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26Z")); + } + { + const date = fromSeconds(1608029846, 0); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26Z")); + } + { + const date = fromSeconds(1608029846, 1); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000000001Z")); + } + { + const date = fromSeconds(1608029846, 10); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000000010Z")); + } + { + const date = fromSeconds(1608029846, 100); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000000100Z")); + } + { + const date = fromSeconds(1608029846, 1000); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000001000Z")); + } + { + const date = fromSeconds(1608029846, 10000); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000010000Z")); + } + { + const date = fromSeconds(1608029846, 100000); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.000100000Z")); + } + { + const date = fromSeconds(1608029846, 1000000); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.001000000Z")); + } + { + const date = fromSeconds(1608029846, 10000000); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.010000000Z")); + } + { + const date = fromSeconds(1608029846, 100000000); + expect(date).toEqual(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.100000000Z")); + } + }); + + it("throws for nanos out of range", () => { + expect(() => fromSeconds(1608029846, 1000000000)).toThrow(); + expect(() => fromSeconds(1608029846, -1)).toThrow(); + expect(() => fromSeconds(1608029846, 1.2)).toThrow(); + expect(() => fromSeconds(1608029846, NaN)).toThrow(); + }); + }); + describe("toSeconds", () => { it("works", () => { { diff --git a/packages/tendermint-rpc/src/dates.ts b/packages/tendermint-rpc/src/dates.ts index c296e1b1..1b4fae84 100644 --- a/packages/tendermint-rpc/src/dates.ts +++ b/packages/tendermint-rpc/src/dates.ts @@ -1,4 +1,5 @@ import { fromRfc3339 } from "@cosmjs/encoding"; +import { Uint32 } from "@cosmjs/math"; import { ReadonlyDate } from "readonly-date"; export interface ReadonlyDateWithNanoseconds extends ReadonlyDate { @@ -25,6 +26,16 @@ export function toRfc3339WithNanoseconds(dateTime: ReadonlyDateWithNanoseconds): return `${millisecondIso.slice(0, -1)}${nanoseconds.padStart(6, "0")}Z`; } +export function fromSeconds(seconds: number, nanos = 0): DateWithNanoseconds { + const checkedNanos = new Uint32(nanos).toNumber(); + if (checkedNanos > 999_999_999) { + throw new Error("Nano seconds must not exceed 999999999"); + } + const out: DateWithNanoseconds = new Date(seconds * 1000 + Math.floor(checkedNanos / 1000000)); + out.nanoseconds = checkedNanos % 1000000; + return out; +} + /** * Caclulates the UNIX timestamp in seconds as well as the nanoseconds after the given second. * diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index 5864129f..1d762ea2 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -5,6 +5,7 @@ export { DateTime, ReadonlyDateWithNanoseconds, fromRfc3339WithNanoseconds, + fromSeconds, toRfc3339WithNanoseconds, toSeconds, } from "./dates";