@@ -33,7 +33,7 @@ import {
3333 isTime ,
3434 Time
3535} from '../temporal-types' ;
36- import { int } from '../integer' ;
36+ import { int , isInt } from '../integer' ;
3737import {
3838 dateToEpochDay ,
3939 epochDayToDate ,
@@ -126,19 +126,19 @@ export class Unpacker extends v1.Unpacker {
126126 } else if ( signature == DURATION ) {
127127 return unpackDuration ( this , structSize , buffer ) ;
128128 } else if ( signature == LOCAL_TIME ) {
129- return unpackLocalTime ( this , structSize , buffer ) ;
129+ return unpackLocalTime ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
130130 } else if ( signature == TIME ) {
131- return unpackTime ( this , structSize , buffer ) ;
131+ return unpackTime ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
132132 } else if ( signature == DATE ) {
133- return unpackDate ( this , structSize , buffer ) ;
133+ return unpackDate ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
134134 } else if ( signature == LOCAL_DATE_TIME ) {
135- return unpackLocalDateTime ( this , structSize , buffer ) ;
135+ return unpackLocalDateTime ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
136136 } else if ( signature == DATE_TIME_WITH_ZONE_OFFSET ) {
137- return unpackDateTimeWithZoneOffset ( this , structSize , buffer ) ;
137+ return unpackDateTimeWithZoneOffset ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
138138 } else if ( signature == DATE_TIME_WITH_ZONE_ID ) {
139- return unpackDateTimeWithZoneId ( this , structSize , buffer ) ;
139+ return unpackDateTimeWithZoneId ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
140140 } else {
141- return super . _unpackUnknownStruct ( signature , structSize , buffer ) ;
141+ return super . _unpackUnknownStruct ( signature , structSize , buffer , this . _disableLosslessIntegers ) ;
142142 }
143143 }
144144}
@@ -284,13 +284,15 @@ function packLocalTime(value, packer, onError) {
284284 * @param {Unpacker } unpacker the unpacker to use.
285285 * @param {number } structSize the retrieved struct size.
286286 * @param {BaseBuffer } buffer the buffer to unpack from.
287+ * @param {boolean } disableLosslessIntegers if integer properties in the result local time should be native JS numbers.
287288 * @return {LocalTime } the unpacked local time value.
288289 */
289- function unpackLocalTime ( unpacker , structSize , buffer ) {
290+ function unpackLocalTime ( unpacker , structSize , buffer , disableLosslessIntegers ) {
290291 unpacker . _verifyStructSize ( 'LocalTime' , LOCAL_TIME_STRUCT_SIZE , structSize ) ;
291292
292- const nanoOfDay = unpacker . unpack ( buffer ) ;
293- return nanoOfDayToLocalTime ( nanoOfDay ) ;
293+ const nanoOfDay = unpacker . unpackInteger ( buffer ) ;
294+ const result = nanoOfDayToLocalTime ( nanoOfDay ) ;
295+ return convertIntegerPropsIfNeeded ( result , disableLosslessIntegers ) ;
294296}
295297
296298/**
@@ -315,16 +317,18 @@ function packTime(value, packer, onError) {
315317 * @param {Unpacker } unpacker the unpacker to use.
316318 * @param {number } structSize the retrieved struct size.
317319 * @param {BaseBuffer } buffer the buffer to unpack from.
320+ * @param {boolean } disableLosslessIntegers if integer properties in the result time should be native JS numbers.
318321 * @return {Time } the unpacked time value.
319322 */
320- function unpackTime ( unpacker , structSize , buffer ) {
323+ function unpackTime ( unpacker , structSize , buffer , disableLosslessIntegers ) {
321324 unpacker . _verifyStructSize ( 'Time' , TIME_STRUCT_SIZE , structSize ) ;
322325
323- const nanoOfDay = unpacker . unpack ( buffer ) ;
324- const offsetSeconds = unpacker . unpack ( buffer ) ;
326+ const nanoOfDay = unpacker . unpackInteger ( buffer ) ;
327+ const offsetSeconds = unpacker . unpackInteger ( buffer ) ;
325328
326329 const localTime = nanoOfDayToLocalTime ( nanoOfDay ) ;
327- return new Time ( localTime . hour , localTime . minute , localTime . second , localTime . nanosecond , offsetSeconds ) ;
330+ const result = new Time ( localTime . hour , localTime . minute , localTime . second , localTime . nanosecond , offsetSeconds ) ;
331+ return convertIntegerPropsIfNeeded ( result , disableLosslessIntegers ) ;
328332}
329333
330334/**
@@ -347,13 +351,15 @@ function packDate(value, packer, onError) {
347351 * @param {Unpacker } unpacker the unpacker to use.
348352 * @param {number } structSize the retrieved struct size.
349353 * @param {BaseBuffer } buffer the buffer to unpack from.
354+ * @param {boolean } disableLosslessIntegers if integer properties in the result date should be native JS numbers.
350355 * @return {Date } the unpacked neo4j date value.
351356 */
352- function unpackDate ( unpacker , structSize , buffer ) {
357+ function unpackDate ( unpacker , structSize , buffer , disableLosslessIntegers ) {
353358 unpacker . _verifyStructSize ( 'Date' , DATE_STRUCT_SIZE , structSize ) ;
354359
355- const epochDay = unpacker . unpack ( buffer ) ;
356- return epochDayToDate ( epochDay ) ;
360+ const epochDay = unpacker . unpackInteger ( buffer ) ;
361+ const result = epochDayToDate ( epochDay ) ;
362+ return convertIntegerPropsIfNeeded ( result , disableLosslessIntegers ) ;
357363}
358364
359365/**
@@ -378,15 +384,16 @@ function packLocalDateTime(value, packer, onError) {
378384 * @param {Unpacker } unpacker the unpacker to use.
379385 * @param {number } structSize the retrieved struct size.
380386 * @param {BaseBuffer } buffer the buffer to unpack from.
387+ * @param {boolean } disableLosslessIntegers if integer properties in the result local date-time should be native JS numbers.
381388 * @return {LocalDateTime } the unpacked local date time value.
382389 */
383- function unpackLocalDateTime ( unpacker , structSize , buffer ) {
390+ function unpackLocalDateTime ( unpacker , structSize , buffer , disableLosslessIntegers ) {
384391 unpacker . _verifyStructSize ( 'LocalDateTime' , LOCAL_DATE_TIME_STRUCT_SIZE , structSize ) ;
385392
386- const epochSecond = unpacker . unpack ( buffer ) ;
387- const nano = unpacker . unpack ( buffer ) ;
388-
389- return epochSecondAndNanoToLocalDateTime ( epochSecond , nano ) ;
393+ const epochSecond = unpacker . unpackInteger ( buffer ) ;
394+ const nano = unpacker . unpackInteger ( buffer ) ;
395+ const result = epochSecondAndNanoToLocalDateTime ( epochSecond , nano ) ;
396+ return convertIntegerPropsIfNeeded ( result , disableLosslessIntegers ) ;
390397}
391398
392399/**
@@ -413,18 +420,20 @@ function packDateTimeWithZoneOffset(value, packer, onError) {
413420 * @param {Unpacker } unpacker the unpacker to use.
414421 * @param {number } structSize the retrieved struct size.
415422 * @param {BaseBuffer } buffer the buffer to unpack from.
423+ * @param {boolean } disableLosslessIntegers if integer properties in the result date-time should be native JS numbers.
416424 * @return {DateTimeWithZoneOffset } the unpacked date time with zone offset value.
417425 */
418- function unpackDateTimeWithZoneOffset ( unpacker , structSize , buffer ) {
426+ function unpackDateTimeWithZoneOffset ( unpacker , structSize , buffer , disableLosslessIntegers ) {
419427 unpacker . _verifyStructSize ( 'DateTimeWithZoneOffset' , DATE_TIME_WITH_ZONE_OFFSET_STRUCT_SIZE , structSize ) ;
420428
421- const epochSecond = unpacker . unpack ( buffer ) ;
422- const nano = unpacker . unpack ( buffer ) ;
423- const offsetSeconds = unpacker . unpack ( buffer ) ;
429+ const epochSecond = unpacker . unpackInteger ( buffer ) ;
430+ const nano = unpacker . unpackInteger ( buffer ) ;
431+ const offsetSeconds = unpacker . unpackInteger ( buffer ) ;
424432
425433 const localDateTime = epochSecondAndNanoToLocalDateTime ( epochSecond , nano ) ;
426- return new DateTimeWithZoneOffset ( localDateTime . year , localDateTime . month , localDateTime . day , localDateTime . hour ,
427- localDateTime . minute , localDateTime . second , localDateTime . nanosecond , offsetSeconds ) ;
434+ const result = new DateTimeWithZoneOffset ( localDateTime . year , localDateTime . month , localDateTime . day ,
435+ localDateTime . hour , localDateTime . minute , localDateTime . second , localDateTime . nanosecond , offsetSeconds ) ;
436+ return convertIntegerPropsIfNeeded ( result , disableLosslessIntegers ) ;
428437}
429438
430439/**
@@ -451,16 +460,34 @@ function packDateTimeWithZoneId(value, packer, onError) {
451460 * @param {Unpacker } unpacker the unpacker to use.
452461 * @param {number } structSize the retrieved struct size.
453462 * @param {BaseBuffer } buffer the buffer to unpack from.
463+ * @param {boolean } disableLosslessIntegers if integer properties in the result date-time should be native JS numbers.
454464 * @return {DateTimeWithZoneId } the unpacked date time with zone id value.
455465 */
456- function unpackDateTimeWithZoneId ( unpacker , structSize , buffer ) {
466+ function unpackDateTimeWithZoneId ( unpacker , structSize , buffer , disableLosslessIntegers ) {
457467 unpacker . _verifyStructSize ( 'DateTimeWithZoneId' , DATE_TIME_WITH_ZONE_ID_STRUCT_SIZE , structSize ) ;
458468
459- const epochSecond = unpacker . unpack ( buffer ) ;
460- const nano = unpacker . unpack ( buffer ) ;
469+ const epochSecond = unpacker . unpackInteger ( buffer ) ;
470+ const nano = unpacker . unpackInteger ( buffer ) ;
461471 const zoneId = unpacker . unpack ( buffer ) ;
462472
463473 const localDateTime = epochSecondAndNanoToLocalDateTime ( epochSecond , nano ) ;
464- return new DateTimeWithZoneId ( localDateTime . year , localDateTime . month , localDateTime . day , localDateTime . hour ,
465- localDateTime . minute , localDateTime . second , localDateTime . nanosecond , zoneId ) ;
474+ const result = new DateTimeWithZoneId ( localDateTime . year , localDateTime . month , localDateTime . day ,
475+ localDateTime . hour , localDateTime . minute , localDateTime . second , localDateTime . nanosecond , zoneId ) ;
476+ return convertIntegerPropsIfNeeded ( result , disableLosslessIntegers ) ;
477+ }
478+
479+ function convertIntegerPropsIfNeeded ( obj , disableLosslessIntegers ) {
480+ if ( ! disableLosslessIntegers ) {
481+ return obj ;
482+ }
483+
484+ const clone = Object . create ( Object . getPrototypeOf ( obj ) ) ;
485+ for ( let prop in obj ) {
486+ if ( obj . hasOwnProperty ( prop ) ) {
487+ const value = obj [ prop ] ;
488+ clone [ prop ] = isInt ( value ) ? value . toNumberOrInfinity ( ) : value ;
489+ }
490+ }
491+ Object . freeze ( clone ) ;
492+ return clone ;
466493}
0 commit comments