@@ -7,26 +7,49 @@ const timestampSecondsSinceEpoch = /^\d{10}$/;
7
7
const timestampMsSinceEpoch = / ^ \d { 13 } $ / ;
8
8
const timestampNanoSinceEpoch = / ^ \d { 19 } $ / ;
9
9
10
+ // If the msSinceEpoch is within 2 years of the current time, then inRangeOfNow will be true
11
+ function inRangeOfNow ( msSinceEpoch : number ) : boolean {
12
+ const now = new Date ( ) . getTime ( ) ;
13
+ const acceptableRange = 2 * 365 * 24 * 60 * 60 * 1000 ;
14
+
15
+ const lowerBound = msSinceEpoch - acceptableRange ;
16
+ const upperBound = msSinceEpoch + acceptableRange ;
17
+
18
+ return now >= lowerBound && now <= upperBound ;
19
+ }
20
+
10
21
export function inferTimestamp ( value : string ) : JSONTimestampFormat | undefined {
11
22
if ( timestampSecondsSinceEpoch . test ( value ) ) {
12
- return {
13
- name : "timestamp" ,
14
- variant : "secondsSinceEpoch" ,
15
- } ;
23
+ const seconds = parseInt ( value ) ;
24
+
25
+ if ( inRangeOfNow ( seconds * 1000 ) ) {
26
+ return {
27
+ name : "timestamp" ,
28
+ variant : "secondsSinceEpoch" ,
29
+ } ;
30
+ }
16
31
}
17
32
18
33
if ( timestampMsSinceEpoch . test ( value ) ) {
19
- return {
20
- name : "timestamp" ,
21
- variant : "millisecondsSinceEpoch" ,
22
- } ;
34
+ const milliseconds = parseInt ( value ) ;
35
+
36
+ if ( inRangeOfNow ( milliseconds ) ) {
37
+ return {
38
+ name : "timestamp" ,
39
+ variant : "millisecondsSinceEpoch" ,
40
+ } ;
41
+ }
23
42
}
24
43
25
44
if ( timestampNanoSinceEpoch . test ( value ) ) {
26
- return {
27
- name : "timestamp" ,
28
- variant : "nanosecondsSinceEpoch" ,
29
- } ;
45
+ const nanoseconds = parseInt ( value ) ;
46
+
47
+ if ( inRangeOfNow ( nanoseconds / 1000000 ) ) {
48
+ return {
49
+ name : "timestamp" ,
50
+ variant : "nanosecondsSinceEpoch" ,
51
+ } ;
52
+ }
30
53
}
31
54
32
55
return undefined ;
0 commit comments