all files / firebase/modules/database/ index.js

68.42% Statements 13/19
45.45% Branches 5/11
57.14% Functions 4/7
68.42% Lines 13/19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102                                                                                                                                                459×                                  
/**
 * @flow
 * Database representation wrapper
 */
import { NativeModules } from 'react-native';
 
import Reference from './Reference';
import TransactionHandler from './transaction';
import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native';
 
import type App from '../core/app';
 
const NATIVE_EVENTS = [
  'database_transaction_event',
  // 'database_server_offset', // TODO
];
 
export const MODULE_NAME = 'RNFirebaseDatabase';
export const NAMESPACE = 'database';
 
/**
 * @class Database
 */
export default class Database extends ModuleBase {
  _offsetRef: Reference;
  _serverTimeOffset: number;
  _transactionHandler: TransactionHandler;
 
  constructor(app: App, options: Object = {}) {
    super(app, {
      events: NATIVE_EVENTS,
      moduleName: MODULE_NAME,
      multiApp: true,
      namespace: NAMESPACE,
    });
    this._transactionHandler = new TransactionHandler(this);
 
    Iif (options.persistence) {
      getNativeModule(this).setPersistence(options.persistence);
    }
 
    // server time listener
    // setTimeout used to avoid setPersistence race conditions
    // todo move this and persistence to native side, create a db configure() method natively perhaps?
    // todo and then native can call setPersistence and then emit offset events
    setTimeout(() => {
      this._serverTimeOffset = 0;
      this._offsetRef = this.ref('.info/serverTimeOffset');
      this._offsetRef.on('value', snapshot => {
        this._serverTimeOffset = snapshot.val() || this._serverTimeOffset;
      });
    }, 1);
  }
 
  /**
   *
   * @return {number}
   */
  getServerTime(): number {
    return new Date(Date.now() + this._serverTimeOffset);
  }
 
  /**
   *
   */
  goOnline(): void {
    getNativeModule(this).goOnline();
  }
 
  /**
   *
   */
  goOffline(): void {
    getNativeModule(this).goOffline();
  }
 
  /**
   * Returns a new firebase reference instance
   * @param path
   * @returns {Reference}
   */
  ref(path: string): Reference {
    return new Reference(this, path);
  }
}
 
export const statics = {
  ServerValue: NativeModules.RNFirebaseDatabase
    ? {
        TIMESTAMP: NativeModules.RNFirebaseDatabase.serverValueTimestamp || {
          '.sv': 'timestamp',
        },
      }
    : {},
  enableLogging(enabled: boolean) {
    if (NativeModules[MODULE_NAME]) {
      NativeModules[MODULE_NAME].enableLogging(enabled);
    }
  },
};