11import { decodeInt64 , encodeInt64 } from "./utils/int" ;
2+ import { ExtData } from "./ExtData" ;
23
34export const EXT_TIMESTAMP = - 1 ;
45
56function isDate ( object : unknown ) : object is Date {
6- return Object . prototype . toString . call ( object ) === "[object Date]" ;
7+ return object instanceof Date ;
78}
89
910export type TimeSpec = {
@@ -49,11 +50,11 @@ export function encodeDateToTimeSpec(date: Date): TimeSpec {
4950 const time = date . getTime ( ) ;
5051 const sec = time < 0 ? Math . ceil ( time / 1000 ) : Math . floor ( time / 1000 ) ;
5152 const nsec = ( time - sec * 1000 ) * 1e6 ;
52-
53+ const nsecInSec = Math . floor ( nsec / 1e9 ) ;
5354 // Normalizes nsec to ensure it is unsigned.
5455 return {
55- sec : sec + Math . floor ( nsec / 1e9 ) ,
56- nsec : nsec - Math . floor ( nsec / 1e9 ) * 1e9 ,
56+ sec : sec + nsecInSec ,
57+ nsec : nsec - nsecInSec * 1e9 ,
5758 } ;
5859}
5960
@@ -107,35 +108,13 @@ export type ExtensionEncoderType = (input: unknown) => Uint8Array | null;
107108
108109// immutable interfce to ExtensionCodec
109110export type ExtensionCodecType = {
110- tryToEncode ( object : unknown ) : ExtDataType | null ;
111+ tryToEncode ( object : unknown ) : ExtData | null ;
111112 decode ( data : Uint8Array , extType : number ) : unknown ;
112113} ;
113114
114- const $Extension = Symbol ( "MessagePack.extension" ) ;
115-
116- export type ExtDataType = {
117- [ $Extension ] : true ;
118- type : number ;
119- data : Uint8Array ;
120- } ;
121-
122115export class ExtensionCodec implements ExtensionCodecType {
123116 public static readonly defaultCodec : ExtensionCodecType = new ExtensionCodec ( ) ;
124117
125- public static readonly Extension = $Extension ;
126-
127- public static createExtData ( type : number , data : Uint8Array ) : ExtDataType {
128- return {
129- [ $Extension ] : true ,
130- type,
131- data,
132- } ;
133- }
134-
135- public static isExtData ( object : any ) : object is ExtDataType {
136- return object != null && ! ! object [ ExtensionCodec . Extension ] ;
137- }
138-
139118 // built-in extensions
140119 private readonly builtInEncoders : Array < ExtensionEncoderType > = [ ] ;
141120 private readonly builtInDecoders : Array < ExtensionDecoderType > = [ ] ;
@@ -173,15 +152,15 @@ export class ExtensionCodec implements ExtensionCodecType {
173152 }
174153 }
175154
176- public tryToEncode ( object : unknown ) : ExtDataType | null {
155+ public tryToEncode ( object : unknown ) : ExtData | null {
177156 // built-in extensions
178157 for ( let i = 0 ; i < this . builtInEncoders . length ; i ++ ) {
179158 const encoder = this . builtInEncoders [ i ] ;
180159 if ( encoder != null ) {
181160 const data = encoder ( object ) ;
182161 if ( data != null ) {
183162 const type = - 1 - i ;
184- return ExtensionCodec . createExtData ( type , data ) ;
163+ return new ExtData ( type , data ) ;
185164 }
186165 }
187166 }
@@ -193,12 +172,12 @@ export class ExtensionCodec implements ExtensionCodecType {
193172 const data = encoder ( object ) ;
194173 if ( data != null ) {
195174 const type = i ;
196- return ExtensionCodec . createExtData ( type , data ) ;
175+ return new ExtData ( type , data ) ;
197176 }
198177 }
199178 }
200179
201- if ( ExtensionCodec . isExtData ( object ) ) {
180+ if ( object instanceof ExtData ) {
202181 // to keep ExtData as is
203182 return object ;
204183 }
@@ -211,7 +190,7 @@ export class ExtensionCodec implements ExtensionCodecType {
211190 return decoder ( data , type ) ;
212191 } else {
213192 // decode() does not fail, returns ExtData instead.
214- return ExtensionCodec . createExtData ( type , data ) ;
193+ return new ExtData ( type , data ) ;
215194 }
216195 }
217196}
0 commit comments