Source: lib/binding/DeviceFactory.js

'use strict';

const EntityFactory = require('./EntityFactory');
const message = require('../message');

/**
 * @class binding.DeviceFactory
 * @extends binding.EntityFactory<model.Device>
 *
 * @param {Object=} properties initial properties to set on the instance
 * @param {...*} arguments Additional constructor params passed through the type constructor
 * @return {model.Device} The new managed instance
 */
const DeviceFactory = EntityFactory.extend(/** @lends binding.DeviceFactory.prototype */ {
  /**
   * The current registered device, or <code>null</code> if the device is not registered
   * @type model.Device
   * @readonly
   */
  get me() {
    return this.db.deviceMe;
  },

  /**
   * Returns true if the devices is already registered, otherwise false.
   * @type boolean
   * @readonly
   */
  get isRegistered() {
    return this.db.isDeviceRegistered;
  },

  /**
   * Loads the Public VAPID Key which can be used to subscribe a Browser for Web Push notifications
   * @return {Promise<ArrayBuffer>} The public VAPID Web Push subscription key
   */
  loadWebPushKey() {
    const msg = new message.VAPIDPublicKey();
    msg.responseType('arraybuffer');
    return this.db.send(msg).then(response => response.entity);
  },

  /**
   * Register a new device with the given device token and OS.
   * @param {string} os The OS of the device (IOS/Android)
   * @param {string|Subscription} tokenOrSubscription The FCM device token, APNS device token or WebPush subscription
   * @param {binding.Entity~doneCallback} doneCallback Called when the operation succeed.
   * @param {binding.Entity~failCallback=} failCallback Called when the operation failed.
   * @return {Promise<model.Device>} The registered device
   *
   * @function
   * @name register
   * @memberOf binding.DeviceFactory.prototype
   */

  /**
   * Register a new device with the given device token and OS.
   * @param {string} os The OS of the device (IOS/Android)
   * @param {string|PushSubscription} tokenOrSubscription The FCM device token, APNS device token or WebPush
   * subscription
   * @param {model.Device=} device An optional device entity to set custom field values
   * @param {binding.Entity~doneCallback=} doneCallback Called when the operation succeed.
   * @param {binding.Entity~failCallback=} failCallback Called when the operation failed.
   * @return {Promise<model.Device>} The registered device
   */
  register(os, tokenOrSubscription, device, doneCallback, failCallback) {
    if (device instanceof Function) {
      return this.register(os, tokenOrSubscription, null, device, doneCallback);
    }

    const subscription = typeof tokenOrSubscription === 'string' ? { token: tokenOrSubscription } : tokenOrSubscription;

    return this.db.registerDevice(os, subscription, device).then(doneCallback, failCallback);
  },

  /**
   * Uses the info from the given {util.PushMessage} message to send an push notification.
   * @param {util.PushMessage} pushMessage to send an push notification.
   * @param {binding.Entity~doneCallback=} doneCallback Called when the operation succeed.
   * @param {binding.Entity~failCallback=} failCallback Called when the operation failed.
   * @return {Promise<*>}
   */
  push(pushMessage, doneCallback, failCallback) {
    return this.db.pushDevice(pushMessage).then(doneCallback, failCallback);
  },
});

/**
 * Push message will be used to send a push notification to a set of devices
 *
 * @param {Set<binding.Entity>|Array<binding.Entity>} [devices] The Set of device references which
 * will receive this push notification.
 * @param {string=} message The message of the push notification.
 * @param {string=} subject The subject of the push notification.
 * @param {string=} sound The file reference of the sound file as a string. The device uses this file as the
 * notification sound.
 * @param {number=} badge The badge count.
 * @param {Object=} data The data object which can contain additional information.
 * @return {util.PushMessage}
 *
 * @function
 * @name PushMessage
 * @memberOf binding.DeviceFactory.prototype
 */

DeviceFactory.PushMessage = require('../util/PushMessage');

module.exports = DeviceFactory;