1
- import { deserialize , firebase , FirebaseApp , FirebaseError , serialize } from '@nativescript/firebase-core' ;
1
+ import { deserialize , firebase , FirebaseApp , FirebaseError } from '@nativescript/firebase-core' ;
2
2
import { IDatabase , IReference , IDataSnapshot , EventType , IQuery , IOnDisconnect , IThenableReference } from './common' ;
3
3
4
4
let defaultDatabase : Database ;
@@ -16,11 +16,66 @@ Object.defineProperty(fb, 'database', {
16
16
writable : false ,
17
17
} ) ;
18
18
19
- function serializeItems ( data , wrapPrimitives = true ) {
19
+ function numberHasDecimals ( item : number ) {
20
+ return ! ( item % 1 === 0 ) ;
21
+ }
22
+
23
+ function numberIs64Bit ( item : number ) {
24
+ return item < - Math . pow ( 2 , 31 ) + 1 || item > Math . pow ( 2 , 31 ) - 1 ;
25
+ }
26
+
27
+ export function serialize ( data : any ) : any {
28
+ switch ( typeof data ) {
29
+ case 'string' :
30
+ case 'boolean' : {
31
+ return data ;
32
+ }
33
+ case 'number' : {
34
+ const hasDecimals = numberHasDecimals ( data ) ;
35
+ if ( numberIs64Bit ( data ) ) {
36
+ if ( hasDecimals ) {
37
+ return NSNumber . alloc ( ) . initWithDouble ( data ) ;
38
+ } else {
39
+ return NSNumber . alloc ( ) . initWithLongLong ( data ) ;
40
+ }
41
+ } else {
42
+ if ( hasDecimals ) {
43
+ return NSNumber . alloc ( ) . initWithFloat ( data ) ;
44
+ } else {
45
+ return data ;
46
+ }
47
+ }
48
+ }
49
+
50
+ case 'object' : {
51
+ if ( data instanceof Date ) {
52
+ return NSDate . dateWithTimeIntervalSince1970 ( data . getTime ( ) / 1000 ) ;
53
+ }
54
+ if ( ! data ) {
55
+ return NSNull . new ( ) ;
56
+ }
57
+
58
+ if ( Array . isArray ( data ) ) {
59
+ return NSArray . arrayWithArray ( ( < any > data ) . map ( serialize ) ) ;
60
+ }
61
+
62
+ const node = { } as any ;
63
+ Object . keys ( data ) . forEach ( ( key ) => {
64
+ const value = data [ key ] ;
65
+ node [ key ] = serialize ( value ) ;
66
+ } ) ;
67
+ return NSDictionary . dictionaryWithDictionary ( node ) ;
68
+ }
69
+
70
+ default :
71
+ return NSNull . new ( ) ;
72
+ }
73
+ }
74
+ function serializeItems ( data ) {
20
75
if ( data instanceof ServerValue ) {
21
76
return data . native ;
22
77
}
23
- return serialize ( data , wrapPrimitives ) ;
78
+ return serialize ( data ) ;
24
79
}
25
80
26
81
export class OnDisconnect implements IOnDisconnect {
@@ -79,7 +134,7 @@ export class OnDisconnect implements IOnDisconnect {
79
134
80
135
set ( value : any , onComplete ?: ( error : FirebaseError ) => void ) : Promise < void > {
81
136
return new Promise ( ( resolve , reject ) => {
82
- this . native . onDisconnectSetValueWithCompletionBlock ( value , ( error , ref ) => {
137
+ this . native . onDisconnectSetValueWithCompletionBlock ( serializeItems ( value ) , ( error , ref ) => {
83
138
if ( error ) {
84
139
const err = FirebaseError . fromNative ( error ) ;
85
140
onComplete ?.( err ) ;
@@ -94,7 +149,7 @@ export class OnDisconnect implements IOnDisconnect {
94
149
95
150
setWithPriority ( value : any , priority : string | number , onComplete ?: ( error : FirebaseError ) => void ) : Promise < void > {
96
151
return new Promise ( ( resolve , reject ) => {
97
- this . native . onDisconnectSetValueAndPriorityWithCompletionBlock ( value , priority , ( error , ref ) => {
152
+ this . native . onDisconnectSetValueAndPriorityWithCompletionBlock ( serializeItems ( value ) , priority , ( error , ref ) => {
98
153
if ( error ) {
99
154
const err = FirebaseError . fromNative ( error ) ;
100
155
onComplete ?.( err ) ;
0 commit comments