@@ -33,7 +33,7 @@ import {
33
33
isTime ,
34
34
Time
35
35
} from '../temporal-types' ;
36
- import { int } from '../integer' ;
36
+ import { int , isInt } from '../integer' ;
37
37
import {
38
38
dateToEpochDay ,
39
39
epochDayToDate ,
@@ -126,19 +126,19 @@ export class Unpacker extends v1.Unpacker {
126
126
} else if ( signature == DURATION ) {
127
127
return unpackDuration ( this , structSize , buffer ) ;
128
128
} else if ( signature == LOCAL_TIME ) {
129
- return unpackLocalTime ( this , structSize , buffer ) ;
129
+ return unpackLocalTime ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
130
130
} else if ( signature == TIME ) {
131
- return unpackTime ( this , structSize , buffer ) ;
131
+ return unpackTime ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
132
132
} else if ( signature == DATE ) {
133
- return unpackDate ( this , structSize , buffer ) ;
133
+ return unpackDate ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
134
134
} else if ( signature == LOCAL_DATE_TIME ) {
135
- return unpackLocalDateTime ( this , structSize , buffer ) ;
135
+ return unpackLocalDateTime ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
136
136
} else if ( signature == DATE_TIME_WITH_ZONE_OFFSET ) {
137
- return unpackDateTimeWithZoneOffset ( this , structSize , buffer ) ;
137
+ return unpackDateTimeWithZoneOffset ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
138
138
} else if ( signature == DATE_TIME_WITH_ZONE_ID ) {
139
- return unpackDateTimeWithZoneId ( this , structSize , buffer ) ;
139
+ return unpackDateTimeWithZoneId ( this , structSize , buffer , this . _disableLosslessIntegers ) ;
140
140
} else {
141
- return super . _unpackUnknownStruct ( signature , structSize , buffer ) ;
141
+ return super . _unpackUnknownStruct ( signature , structSize , buffer , this . _disableLosslessIntegers ) ;
142
142
}
143
143
}
144
144
}
@@ -284,13 +284,15 @@ function packLocalTime(value, packer, onError) {
284
284
* @param {Unpacker } unpacker the unpacker to use.
285
285
* @param {number } structSize the retrieved struct size.
286
286
* @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.
287
288
* @return {LocalTime } the unpacked local time value.
288
289
*/
289
- function unpackLocalTime ( unpacker , structSize , buffer ) {
290
+ function unpackLocalTime ( unpacker , structSize , buffer , disableLosslessIntegers ) {
290
291
unpacker . _verifyStructSize ( 'LocalTime' , LOCAL_TIME_STRUCT_SIZE , structSize ) ;
291
292
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 ) ;
294
296
}
295
297
296
298
/**
@@ -315,16 +317,18 @@ function packTime(value, packer, onError) {
315
317
* @param {Unpacker } unpacker the unpacker to use.
316
318
* @param {number } structSize the retrieved struct size.
317
319
* @param {BaseBuffer } buffer the buffer to unpack from.
320
+ * @param {boolean } disableLosslessIntegers if integer properties in the result time should be native JS numbers.
318
321
* @return {Time } the unpacked time value.
319
322
*/
320
- function unpackTime ( unpacker , structSize , buffer ) {
323
+ function unpackTime ( unpacker , structSize , buffer , disableLosslessIntegers ) {
321
324
unpacker . _verifyStructSize ( 'Time' , TIME_STRUCT_SIZE , structSize ) ;
322
325
323
- const nanoOfDay = unpacker . unpack ( buffer ) ;
324
- const offsetSeconds = unpacker . unpack ( buffer ) ;
326
+ const nanoOfDay = unpacker . unpackInteger ( buffer ) ;
327
+ const offsetSeconds = unpacker . unpackInteger ( buffer ) ;
325
328
326
329
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 ) ;
328
332
}
329
333
330
334
/**
@@ -347,13 +351,15 @@ function packDate(value, packer, onError) {
347
351
* @param {Unpacker } unpacker the unpacker to use.
348
352
* @param {number } structSize the retrieved struct size.
349
353
* @param {BaseBuffer } buffer the buffer to unpack from.
354
+ * @param {boolean } disableLosslessIntegers if integer properties in the result date should be native JS numbers.
350
355
* @return {Date } the unpacked neo4j date value.
351
356
*/
352
- function unpackDate ( unpacker , structSize , buffer ) {
357
+ function unpackDate ( unpacker , structSize , buffer , disableLosslessIntegers ) {
353
358
unpacker . _verifyStructSize ( 'Date' , DATE_STRUCT_SIZE , structSize ) ;
354
359
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 ) ;
357
363
}
358
364
359
365
/**
@@ -378,15 +384,16 @@ function packLocalDateTime(value, packer, onError) {
378
384
* @param {Unpacker } unpacker the unpacker to use.
379
385
* @param {number } structSize the retrieved struct size.
380
386
* @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.
381
388
* @return {LocalDateTime } the unpacked local date time value.
382
389
*/
383
- function unpackLocalDateTime ( unpacker , structSize , buffer ) {
390
+ function unpackLocalDateTime ( unpacker , structSize , buffer , disableLosslessIntegers ) {
384
391
unpacker . _verifyStructSize ( 'LocalDateTime' , LOCAL_DATE_TIME_STRUCT_SIZE , structSize ) ;
385
392
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 ) ;
390
397
}
391
398
392
399
/**
@@ -413,18 +420,20 @@ function packDateTimeWithZoneOffset(value, packer, onError) {
413
420
* @param {Unpacker } unpacker the unpacker to use.
414
421
* @param {number } structSize the retrieved struct size.
415
422
* @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.
416
424
* @return {DateTimeWithZoneOffset } the unpacked date time with zone offset value.
417
425
*/
418
- function unpackDateTimeWithZoneOffset ( unpacker , structSize , buffer ) {
426
+ function unpackDateTimeWithZoneOffset ( unpacker , structSize , buffer , disableLosslessIntegers ) {
419
427
unpacker . _verifyStructSize ( 'DateTimeWithZoneOffset' , DATE_TIME_WITH_ZONE_OFFSET_STRUCT_SIZE , structSize ) ;
420
428
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 ) ;
424
432
425
433
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 ) ;
428
437
}
429
438
430
439
/**
@@ -451,16 +460,34 @@ function packDateTimeWithZoneId(value, packer, onError) {
451
460
* @param {Unpacker } unpacker the unpacker to use.
452
461
* @param {number } structSize the retrieved struct size.
453
462
* @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.
454
464
* @return {DateTimeWithZoneId } the unpacked date time with zone id value.
455
465
*/
456
- function unpackDateTimeWithZoneId ( unpacker , structSize , buffer ) {
466
+ function unpackDateTimeWithZoneId ( unpacker , structSize , buffer , disableLosslessIntegers ) {
457
467
unpacker . _verifyStructSize ( 'DateTimeWithZoneId' , DATE_TIME_WITH_ZONE_ID_STRUCT_SIZE , structSize ) ;
458
468
459
- const epochSecond = unpacker . unpack ( buffer ) ;
460
- const nano = unpacker . unpack ( buffer ) ;
469
+ const epochSecond = unpacker . unpackInteger ( buffer ) ;
470
+ const nano = unpacker . unpackInteger ( buffer ) ;
461
471
const zoneId = unpacker . unpack ( buffer ) ;
462
472
463
473
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 ;
466
493
}
0 commit comments