From 96685b359782b7e7baa3433e5a7aec66143c9b9c Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 11 Feb 2021 23:54:20 +0100 Subject: [PATCH] Add fromRfc3339WithNanoseconds --- packages/tendermint-rpc/src/dates.spec.ts | 12 +++++++++++- packages/tendermint-rpc/src/dates.ts | 21 ++++++++++++++++----- packages/tendermint-rpc/src/index.ts | 2 +- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/packages/tendermint-rpc/src/dates.spec.ts b/packages/tendermint-rpc/src/dates.spec.ts index 9b80b851..fa857109 100644 --- a/packages/tendermint-rpc/src/dates.spec.ts +++ b/packages/tendermint-rpc/src/dates.spec.ts @@ -1,8 +1,18 @@ import { ReadonlyDate } from "readonly-date"; -import { DateTime } from "./dates"; +import { DateTime, fromRfc3339WithNanoseconds } from "./dates"; describe("dates", () => { + it("fromRfc3339WithNanoseconds", () => { + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.778Z").nanoseconds).toEqual(0); + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.7789Z").nanoseconds).toEqual(900000); + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.77809Z").nanoseconds).toEqual(90000); + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.778009Z").nanoseconds).toEqual(9000); + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.7780009Z").nanoseconds).toEqual(900); + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.77800009Z").nanoseconds).toEqual(90); + expect(fromRfc3339WithNanoseconds("2020-12-15T10:57:26.778000009Z").nanoseconds).toEqual(9); + }); + describe("DateTime", () => { it("decodes a string", () => { expect(DateTime.decode("2020-12-15T10:57:26.778Z").nanoseconds).toEqual(0); diff --git a/packages/tendermint-rpc/src/dates.ts b/packages/tendermint-rpc/src/dates.ts index fe32dc51..e99e7968 100644 --- a/packages/tendermint-rpc/src/dates.ts +++ b/packages/tendermint-rpc/src/dates.ts @@ -6,13 +6,24 @@ export interface ReadonlyDateWithNanoseconds extends ReadonlyDate { readonly nanoseconds?: number; } +export interface DateWithNanoseconds extends Date { + /** Nanoseconds after the time stored in a vanilla Date (millisecond granularity) */ + nanoseconds?: number; +} + +export function fromRfc3339WithNanoseconds(dateTimeString: string): DateWithNanoseconds { + // fromRfc3339 should give the caller a regular Date directly + const out: DateWithNanoseconds = new Date(fromRfc3339(dateTimeString).getTime()); + const nanosecondsMatch = dateTimeString.match(/\.(\d+)Z$/); + const nanoseconds = nanosecondsMatch ? nanosecondsMatch[1].slice(3) : ""; + out.nanoseconds = parseInt(nanoseconds.padEnd(6, "0"), 10); + return out; +} + export class DateTime { + /** @deprecated Use fromRfc3339WithNanoseconds instead */ public static decode(dateTimeString: string): ReadonlyDateWithNanoseconds { - const readonlyDate = fromRfc3339(dateTimeString); - const nanosecondsMatch = dateTimeString.match(/\.(\d+)Z$/); - const nanoseconds = nanosecondsMatch ? nanosecondsMatch[1].slice(3) : ""; - (readonlyDate as any).nanoseconds = parseInt(nanoseconds.padEnd(6, "0"), 10); - return readonlyDate as ReadonlyDateWithNanoseconds; + return fromRfc3339WithNanoseconds(dateTimeString); } public static encode(dateTime: ReadonlyDateWithNanoseconds): string { diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index a099ee1f..17f2f367 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -1,7 +1,7 @@ export { Adaptor } from "./adaptor"; export { adaptor33, adaptor34 } from "./adaptors"; export { Client } from "./client"; -export { DateTime, ReadonlyDateWithNanoseconds } from "./dates"; +export { DateTime, ReadonlyDateWithNanoseconds, fromRfc3339WithNanoseconds } from "./dates"; export { AbciInfoRequest, AbciQueryParams,