19
19
20
20
import * as v1 from './packstream-v1' ;
21
21
import { isPoint , Point } from '../spatial-types' ;
22
+ import {
23
+ CypherDate ,
24
+ CypherDateTimeWithZoneId ,
25
+ CypherDateTimeWithZoneOffset ,
26
+ CypherDuration ,
27
+ CypherTime ,
28
+ isCypherDate ,
29
+ isCypherDateTimeWithZoneId ,
30
+ isCypherDateTimeWithZoneOffset ,
31
+ isCypherDuration ,
32
+ isCypherLocalDateTime ,
33
+ isCypherLocalTime ,
34
+ isCypherTime
35
+ } from '../temporal-types' ;
22
36
import { int } from '../integer' ;
37
+ import {
38
+ cypherDateToEpochDay ,
39
+ cypherLocalDateTimeToEpochSecond ,
40
+ cypherLocalTimeToNanoOfDay ,
41
+ epochDayToCypherDate ,
42
+ epochSecondAndNanoToCypherLocalDateTime ,
43
+ nanoOfDayToCypherLocalTime
44
+ } from '../internal/temporal-util' ;
23
45
24
46
const POINT_2D = 0x58 ;
25
47
const POINT_2D_STRUCT_SIZE = 3 ;
26
48
27
49
const POINT_3D = 0x59 ;
28
50
const POINT_3D_STRUCT_SIZE = 4 ;
29
51
52
+ const DURATION = 0x45 ;
53
+ const DURATION_STRUCT_SIZE = 4 ;
54
+
55
+ const LOCAL_TIME = 0x74 ;
56
+ const LOCAL_TIME_STRUCT_SIZE = 1 ;
57
+
58
+ const TIME = 0x54 ;
59
+ const TIME_STRUCT_SIZE = 2 ;
60
+
61
+ const DATE = 0x44 ;
62
+ const DATE_STRUCT_SIZE = 1 ;
63
+
64
+ const LOCAL_DATE_TIME = 0x64 ;
65
+ const LOCAL_DATE_TIME_STRUCT_SIZE = 2 ;
66
+
67
+ const DATE_TIME_WITH_ZONE_OFFSET = 0x46 ;
68
+ const DATE_TIME_WITH_ZONE_OFFSET_STRUCT_SIZE = 3 ;
69
+
70
+ const DATE_TIME_WITH_ZONE_ID = 0x66 ;
71
+ const DATE_TIME_WITH_ZONE_ID_STRUCT_SIZE = 3 ;
72
+
30
73
export class Packer extends v1 . Packer {
31
74
32
75
/**
@@ -44,6 +87,20 @@ export class Packer extends v1.Packer {
44
87
packable ( obj , onError ) {
45
88
if ( isPoint ( obj ) ) {
46
89
return ( ) => packPoint ( obj , this , onError ) ;
90
+ } else if ( isCypherDuration ( obj ) ) {
91
+ return ( ) => packDuration ( obj , this , onError ) ;
92
+ } else if ( isCypherLocalTime ( obj ) ) {
93
+ return ( ) => packLocalTime ( obj , this , onError ) ;
94
+ } else if ( isCypherTime ( obj ) ) {
95
+ return ( ) => packTime ( obj , this , onError ) ;
96
+ } else if ( isCypherDate ( obj ) ) {
97
+ return ( ) => packDate ( obj , this , onError ) ;
98
+ } else if ( isCypherLocalDateTime ( obj ) ) {
99
+ return ( ) => packLocalDateTime ( obj , this , onError ) ;
100
+ } else if ( isCypherDateTimeWithZoneOffset ( obj ) ) {
101
+ return ( ) => packDateTimeWithZoneOffset ( obj , this , onError ) ;
102
+ } else if ( isCypherDateTimeWithZoneId ( obj ) ) {
103
+ return ( ) => packDateTimeWithZoneId ( obj , this , onError ) ;
47
104
} else {
48
105
return super . packable ( obj , onError ) ;
49
106
}
@@ -66,6 +123,20 @@ export class Unpacker extends v1.Unpacker {
66
123
return unpackPoint2D ( this , structSize , buffer ) ;
67
124
} else if ( signature == POINT_3D ) {
68
125
return unpackPoint3D ( this , structSize , buffer ) ;
126
+ } else if ( signature == DURATION ) {
127
+ return unpackDuration ( this , structSize , buffer ) ;
128
+ } else if ( signature == LOCAL_TIME ) {
129
+ return unpackLocalTime ( this , structSize , buffer ) ;
130
+ } else if ( signature == TIME ) {
131
+ return unpackTime ( this , structSize , buffer ) ;
132
+ } else if ( signature == DATE ) {
133
+ return unpackDate ( this , structSize , buffer ) ;
134
+ } else if ( signature == LOCAL_DATE_TIME ) {
135
+ return unpackLocalDateTime ( this , structSize , buffer ) ;
136
+ } else if ( signature == DATE_TIME_WITH_ZONE_OFFSET ) {
137
+ return unpackDateTimeWithZoneOffset ( this , structSize , buffer ) ;
138
+ } else if ( signature == DATE_TIME_WITH_ZONE_ID ) {
139
+ return unpackDateTimeWithZoneId ( this , structSize , buffer ) ;
69
140
} else {
70
141
return super . _unpackUnknownStruct ( signature , structSize , buffer ) ;
71
142
}
@@ -121,3 +192,215 @@ function unpackPoint3D(unpacker, structSize, buffer) {
121
192
unpacker . unpack ( buffer ) // z
122
193
) ;
123
194
}
195
+
196
+ function packDuration ( value , packer , onError ) {
197
+ const months = int ( value . months ) ;
198
+ const days = int ( value . days ) ;
199
+ const seconds = int ( value . seconds ) ;
200
+ const nanoseconds = int ( value . nanoseconds ) ;
201
+
202
+ const packableStructFields = [
203
+ packer . packable ( months , onError ) ,
204
+ packer . packable ( days , onError ) ,
205
+ packer . packable ( seconds , onError ) ,
206
+ packer . packable ( nanoseconds , onError ) ,
207
+ ] ;
208
+ packer . packStruct ( DURATION , packableStructFields , onError ) ;
209
+ }
210
+
211
+ function unpackDuration ( unpacker , structSize , buffer ) {
212
+ unpacker . _verifyStructSize ( 'Duration' , DURATION_STRUCT_SIZE , structSize ) ;
213
+
214
+ const months = unpacker . unpack ( buffer ) ;
215
+ const days = unpacker . unpack ( buffer ) ;
216
+ const seconds = unpacker . unpack ( buffer ) ;
217
+ const nanoseconds = unpacker . unpack ( buffer ) ;
218
+
219
+ return new CypherDuration ( months , days , seconds , nanoseconds ) ;
220
+ }
221
+
222
+ function packLocalTime ( value , packer , onError ) {
223
+ const totalNanos = cypherLocalTimeToNanoOfDay ( value ) ;
224
+
225
+ const packableStructFields = [
226
+ packer . packable ( totalNanos , onError )
227
+ ] ;
228
+ packer . packStruct ( LOCAL_TIME , packableStructFields , onError ) ;
229
+ }
230
+
231
+ function unpackLocalTime ( unpacker , structSize , buffer ) {
232
+ unpacker . _verifyStructSize ( 'LocalTime' , LOCAL_TIME_STRUCT_SIZE , structSize ) ;
233
+
234
+ const nanoOfDay = unpacker . unpack ( buffer ) ;
235
+ return nanoOfDayToCypherLocalTime ( nanoOfDay ) ;
236
+ }
237
+
238
+ /**
239
+ * Pack given cypher time.
240
+ * @param {CypherTime } value the time value to pack.
241
+ * @param {Packer } packer the packer to use.
242
+ * @param {function } onError the error callback.
243
+ */
244
+ function packTime ( value , packer , onError ) {
245
+ const totalNanos = cypherLocalTimeToNanoOfDay ( value . localTime ) ;
246
+ const offsetSeconds = int ( value . offsetSeconds ) ;
247
+
248
+ const packableStructFields = [
249
+ packer . packable ( totalNanos , onError ) ,
250
+ packer . packable ( offsetSeconds , onError )
251
+ ] ;
252
+ packer . packStruct ( TIME , packableStructFields , onError ) ;
253
+ }
254
+
255
+ /**
256
+ * Unpack cypher time value using the given unpacker.
257
+ * @param {Unpacker } unpacker the unpacker to use.
258
+ * @param {number } structSize the retrieved struct size.
259
+ * @param {BaseBuffer } buffer the buffer to unpack from.
260
+ * @return {CypherTime } the unpacked cypher time value.
261
+ */
262
+ function unpackTime ( unpacker , structSize , buffer ) {
263
+ unpacker . _verifyStructSize ( 'Time' , TIME_STRUCT_SIZE , structSize ) ;
264
+
265
+ const nanoOfDay = unpacker . unpack ( buffer ) ;
266
+ const offsetSeconds = unpacker . unpack ( buffer ) ;
267
+
268
+ const localTime = nanoOfDayToCypherLocalTime ( nanoOfDay ) ;
269
+ return new CypherTime ( localTime , offsetSeconds ) ;
270
+ }
271
+
272
+ /**
273
+ * Pack given cypher date.
274
+ * @param {CypherDate } value the date value to pack.
275
+ * @param {Packer } packer the packer to use.
276
+ * @param {function } onError the error callback.
277
+ */
278
+ function packDate ( value , packer , onError ) {
279
+ const epochDay = cypherDateToEpochDay ( value ) ;
280
+
281
+ const packableStructFields = [
282
+ packer . packable ( epochDay , onError )
283
+ ] ;
284
+ packer . packStruct ( DATE , packableStructFields , onError ) ;
285
+ }
286
+
287
+ /**
288
+ * Unpack cypher date value using the given unpacker.
289
+ * @param {Unpacker } unpacker the unpacker to use.
290
+ * @param {number } structSize the retrieved struct size.
291
+ * @param {BaseBuffer } buffer the buffer to unpack from.
292
+ * @return {CypherDate } the unpacked cypher date value.
293
+ */
294
+ function unpackDate ( unpacker , structSize , buffer ) {
295
+ unpacker . _verifyStructSize ( 'Date' , DATE_STRUCT_SIZE , structSize ) ;
296
+
297
+ const epochDay = unpacker . unpack ( buffer ) ;
298
+ return epochDayToCypherDate ( epochDay ) ;
299
+ }
300
+
301
+ /**
302
+ * Pack given cypher local date time.
303
+ * @param {CypherLocalDateTime } value the local date time value to pack.
304
+ * @param {Packer } packer the packer to use.
305
+ * @param {function } onError the error callback.
306
+ */
307
+ function packLocalDateTime ( value , packer , onError ) {
308
+ const epochSecond = cypherLocalDateTimeToEpochSecond ( value ) ;
309
+ const nano = int ( value . localTime . nanosecond ) ;
310
+
311
+ const packableStructFields = [
312
+ packer . packable ( epochSecond , onError ) ,
313
+ packer . packable ( nano , onError )
314
+ ] ;
315
+ packer . packStruct ( LOCAL_DATE_TIME , packableStructFields , onError ) ;
316
+ }
317
+
318
+ /**
319
+ * Unpack cypher local date time value using the given unpacker.
320
+ * @param {Unpacker } unpacker the unpacker to use.
321
+ * @param {number } structSize the retrieved struct size.
322
+ * @param {BaseBuffer } buffer the buffer to unpack from.
323
+ * @return {CypherLocalDateTime } the unpacked cypher local date time value.
324
+ */
325
+ function unpackLocalDateTime ( unpacker , structSize , buffer ) {
326
+ unpacker . _verifyStructSize ( 'LocalDateTime' , LOCAL_DATE_TIME_STRUCT_SIZE , structSize ) ;
327
+
328
+ const epochSecond = unpacker . unpack ( buffer ) ;
329
+ const nano = unpacker . unpack ( buffer ) ;
330
+
331
+ return epochSecondAndNanoToCypherLocalDateTime ( epochSecond , nano ) ;
332
+ }
333
+
334
+ /**
335
+ * Pack given cypher date time with zone offset.
336
+ * @param {CypherDateTimeWithZoneOffset } value the date time value to pack.
337
+ * @param {Packer } packer the packer to use.
338
+ * @param {function } onError the error callback.
339
+ */
340
+ function packDateTimeWithZoneOffset ( value , packer , onError ) {
341
+ const epochSecond = cypherLocalDateTimeToEpochSecond ( value . localDateTime ) ;
342
+ const nano = int ( value . localDateTime . localTime . nanosecond ) ;
343
+ const offsetSeconds = int ( value . offsetSeconds ) ;
344
+
345
+ const packableStructFields = [
346
+ packer . packable ( epochSecond , onError ) ,
347
+ packer . packable ( nano , onError ) ,
348
+ packer . packable ( offsetSeconds , onError )
349
+ ] ;
350
+ packer . packStruct ( DATE_TIME_WITH_ZONE_OFFSET , packableStructFields , onError ) ;
351
+ }
352
+
353
+ /**
354
+ * Unpack cypher date time with zone offset value using the given unpacker.
355
+ * @param {Unpacker } unpacker the unpacker to use.
356
+ * @param {number } structSize the retrieved struct size.
357
+ * @param {BaseBuffer } buffer the buffer to unpack from.
358
+ * @return {CypherDateTimeWithZoneOffset } the unpacked cypher date time with zone offset value.
359
+ */
360
+ function unpackDateTimeWithZoneOffset ( unpacker , structSize , buffer ) {
361
+ unpacker . _verifyStructSize ( 'DateTimeWithZoneOffset' , DATE_TIME_WITH_ZONE_OFFSET_STRUCT_SIZE , structSize ) ;
362
+
363
+ const epochSecond = unpacker . unpack ( buffer ) ;
364
+ const nano = unpacker . unpack ( buffer ) ;
365
+ const offsetSeconds = unpacker . unpack ( buffer ) ;
366
+
367
+ const localDateTime = epochSecondAndNanoToCypherLocalDateTime ( epochSecond , nano ) ;
368
+ return new CypherDateTimeWithZoneOffset ( localDateTime , offsetSeconds ) ;
369
+ }
370
+
371
+ /**
372
+ * Pack given cypher date time with zone id.
373
+ * @param {CypherDateTimeWithZoneId } value the date time value to pack.
374
+ * @param {Packer } packer the packer to use.
375
+ * @param {function } onError the error callback.
376
+ */
377
+ function packDateTimeWithZoneId ( value , packer , onError ) {
378
+ const epochSecond = cypherLocalDateTimeToEpochSecond ( value . localDateTime ) ;
379
+ const nano = int ( value . localDateTime . localTime . nanosecond ) ;
380
+ const zoneId = value . zoneId ;
381
+
382
+ const packableStructFields = [
383
+ packer . packable ( epochSecond , onError ) ,
384
+ packer . packable ( nano , onError ) ,
385
+ packer . packable ( zoneId , onError )
386
+ ] ;
387
+ packer . packStruct ( DATE_TIME_WITH_ZONE_ID , packableStructFields , onError ) ;
388
+ }
389
+
390
+ /**
391
+ * Unpack cypher date time with zone id value using the given unpacker.
392
+ * @param {Unpacker } unpacker the unpacker to use.
393
+ * @param {number } structSize the retrieved struct size.
394
+ * @param {BaseBuffer } buffer the buffer to unpack from.
395
+ * @return {CypherDateTimeWithZoneId } the unpacked cypher date time with zone id value.
396
+ */
397
+ function unpackDateTimeWithZoneId ( unpacker , structSize , buffer ) {
398
+ unpacker . _verifyStructSize ( 'DateTimeWithZoneId' , DATE_TIME_WITH_ZONE_ID_STRUCT_SIZE , structSize ) ;
399
+
400
+ const epochSecond = unpacker . unpack ( buffer ) ;
401
+ const nano = unpacker . unpack ( buffer ) ;
402
+ const zoneId = unpacker . unpack ( buffer ) ;
403
+
404
+ const localDateTime = epochSecondAndNanoToCypherLocalDateTime ( epochSecond , nano ) ;
405
+ return new CypherDateTimeWithZoneId ( localDateTime , zoneId ) ;
406
+ }
0 commit comments