1- import { deserialize , firebase , FirebaseApp , FirebaseError , serialize } from '@nativescript/firebase-core' ;
1+ import { deserialize , firebase , FirebaseApp , FirebaseError } from '@nativescript/firebase-core' ;
22import { IDatabase , IReference , IDataSnapshot , EventType , IQuery , IOnDisconnect , IThenableReference } from './common' ;
33
44let defaultDatabase : Database ;
@@ -16,11 +16,66 @@ Object.defineProperty(fb, 'database', {
1616 writable : false ,
1717} ) ;
1818
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 ) {
2075 if ( data instanceof ServerValue ) {
2176 return data . native ;
2277 }
23- return serialize ( data , wrapPrimitives ) ;
78+ return serialize ( data ) ;
2479}
2580
2681export class OnDisconnect implements IOnDisconnect {
@@ -79,7 +134,7 @@ export class OnDisconnect implements IOnDisconnect {
79134
80135 set ( value : any , onComplete ?: ( error : FirebaseError ) => void ) : Promise < void > {
81136 return new Promise ( ( resolve , reject ) => {
82- this . native . onDisconnectSetValueWithCompletionBlock ( value , ( error , ref ) => {
137+ this . native . onDisconnectSetValueWithCompletionBlock ( serializeItems ( value ) , ( error , ref ) => {
83138 if ( error ) {
84139 const err = FirebaseError . fromNative ( error ) ;
85140 onComplete ?.( err ) ;
@@ -94,7 +149,7 @@ export class OnDisconnect implements IOnDisconnect {
94149
95150 setWithPriority ( value : any , priority : string | number , onComplete ?: ( error : FirebaseError ) => void ) : Promise < void > {
96151 return new Promise ( ( resolve , reject ) => {
97- this . native . onDisconnectSetValueAndPriorityWithCompletionBlock ( value , priority , ( error , ref ) => {
152+ this . native . onDisconnectSetValueAndPriorityWithCompletionBlock ( serializeItems ( value ) , priority , ( error , ref ) => {
98153 if ( error ) {
99154 const err = FirebaseError . fromNative ( error ) ;
100155 onComplete ?.( err ) ;
0 commit comments