@sauban/cloudboost
Version:
Database Service that does Storage, Search, Real-time and a whole lot more.
413 lines (322 loc) • 10.9 kB
JavaScript
import CB from './CB'
/*CloudBoost Push Notifications*/
CB.CloudPush={};
CB.CloudPush.send = function(data,query,callback) {
var tableName="Device";
if (!CB.appId) {
throw "CB.appId is null.";
}
var def;
if (!callback) {
def = new CB.Promise();
}
if(!data){
throw "data object is null.";
}
if(data && (!data.message)){
throw "message is not set.";
}
//Query Set
if(query && Object.prototype.toString.call(query)=="[object Object]" && typeof query.success !== 'function'){
var pushQuery=query;
}
//Channels List
if(query && Object.prototype.toString.call(query)=="[object Array]" && typeof query.success !== 'function'){
var pushQuery = new CB.CloudQuery(tableName);
pushQuery.containedIn('channels', query);
}
//Single Channel
if(query && Object.prototype.toString.call(query)=="[object String]" && typeof query.success !== 'function'){
var pushQuery = new CB.CloudQuery(tableName);
pushQuery.containedIn('channels', [query]);
}
//when query param is callback
if(query && Object.prototype.toString.call(query)=="[object Object]" && typeof query.success === 'function'){
callback=query;
var pushQuery = new CB.CloudQuery(tableName);
}
//No query param
if(!query){
var pushQuery = new CB.CloudQuery(tableName);
}
var params=JSON.stringify({
query : pushQuery.query,
sort : pushQuery.sort,
limit : pushQuery.limit,
skip : pushQuery.skip,
key : CB.appKey,
data : data
});
var url = CB.apiUrl + "/push/" + CB.appId + '/send';
CB._request('POST',url,params).then(function(response){
var object=response;
if(CB._isJsonString(response)){
object = JSON.parse(response);
}
if (callback) {
callback.success(object);
} else {
def.resolve(object);
}
},function(err){
if(CB._isJsonString(err)){
err = JSON.parse(err);
}
if(callback){
callback.error(err);
}else {
def.reject(err);
}
});
if (!callback) {
return def.promise;
}
};
CB.CloudPush.enableWebNotifications = function(callback) {
var def;
if (!callback) {
def = new CB.Promise();
}
//Check document
if(typeof(document) !== 'undefined'){
CB.CloudPush._requestBrowserNotifications().then(function(response){
if('serviceWorker' in navigator) {
return navigator.serviceWorker.register('serviceWorker.js',{scope: './'});
}else {
var noServerDef = new CB.Promise();
noServerDef.reject('Service workers aren\'t supported in this browser.');
return noServerDef;
}
}).then(function(registration){
if (!(registration.showNotification)) {
var noServerDef = new CB.Promise();
noServerDef.reject('Notifications aren\'t supported on service workers.');
return noServerDef;
}else{
return CB.CloudPush._subscribe();
}
}).then(function(subscription){
//PublicKey for secure connection with server
var browserKey = subscription.getKey ? subscription.getKey('p256dh') : '';
browserKey=browserKey ? btoa(String.fromCharCode.apply(null, new Uint8Array(browserKey))) : '';
//AuthKey for secure connection with server
var authKey = subscription.getKey ? subscription.getKey('auth') : '';
authKey=authKey ? btoa(String.fromCharCode.apply(null, new Uint8Array(authKey))) : '';
CB.CloudPush._addDevice(CB._getThisBrowserName(), subscription.endpoint, browserKey, authKey, {
success : function(obj){
if (callback) {
callback.success();
} else {
def.resolve();
}
},error : function(error){
if(callback){
callback.error(error);
}else {
def.reject(error);
}
}
});
},function(error){
if(callback){
callback.error(error);
}else {
def.reject(error);
}
});
}else{
if(callback){
callback.error("Browser document not found");
}else {
def.reject("Browser document not found");
}
}
if (!callback) {
return def.promise;
}
};
CB.CloudPush.disableWebNotifications = function(callback) {
var def;
if (!callback) {
def = new CB.Promise();
}
//Check document
if(typeof(document) !== 'undefined'){
CB.CloudPush._getSubscription().then(function(subscription){
//No subscription
if(!subscription){
if (callback) {
callback.success();
} else {
def.resolve();
}
}
if(subscription){
var promises=[];
//We have a subcription, so call unsubscribe on it
promises.push(subscription.unsubscribe());
//Remove Device Objects
promises.push(CB.CloudPush._deleteDevice(CB._getThisBrowserName(), subscription.endpoint));
CB.Promise.all(promises).then(function(successful) {
if (callback) {
callback.success();
} else {
def.resolve();
}
},function(error) {
if (callback) {
callback.error(error);
} else {
def.reject(error);
}
});
}
},function(error){
if(callback){
callback.error(error);
}else {
def.reject(error);
}
});
}else{
if(callback){
callback.error("Browser document not found");
}else {
def.reject("Browser document not found");
}
}
if (!callback) {
return def.promise;
}
};
CB.CloudPush._subscribe = function (){
var def = new CB.Promise();
// Check if push messaging is supported
if (!('PushManager' in window)) {
return def.reject('Push messaging isn\'t supported.');
}
navigator.serviceWorker.ready.then(function(reg) {
reg.pushManager.getSubscription().then(function(subscription) {
if (!subscription) {
reg.pushManager.subscribe({userVisibleOnly: true}).then(function(subscription) {
def.resolve(subscription);
}).catch(function(err) {
def.reject(err);
});
}else{
def.resolve(subscription);
}
}).catch(function(err) {
def.reject(err);
});
},function(error){
def.reject(error);
});
return def.promise;
};
CB.CloudPush._getSubscription = function(){
var def = new CB.Promise();
navigator.serviceWorker.ready.then(function(reg) {
reg.pushManager.getSubscription().then(function(subscription) {
if (!subscription) {
def.resolve(null);
}else{
def.resolve(subscription);
}
}).catch(function(err) {
def.reject(err);
});
},function(error){
def.reject(error);
});
return def.promise;
};
CB.CloudPush._requestBrowserNotifications = function() {
var def = new CB.Promise();
if (!("Notification" in window)) {
def.reject("This browser does not support system notifications");
}else if (Notification.permission === "granted") {
def.resolve("Permission granted");
}else if (Notification.permission !== 'denied') {
Notification.requestPermission(function (permission) {
if(permission === "granted") {
def.resolve("Permission granted");
}
if(permission === "denied"){
def.reject("Permission denied");
}
});
}
return def.promise;
};
//save the device document to the db
CB.CloudPush._addDevice = function(deviceOS, endPoint, browserKey, authKey, callback) {
var def;
CB._validate();
//Set Fields
var thisObj = new CB.CloudObject('Device');
thisObj.set('deviceOS', deviceOS);
thisObj.set('deviceToken', endPoint);
thisObj.set('metadata', {browserKey:browserKey,authKey:authKey});
if (!callback) {
def = new CB.Promise();
}
var params=JSON.stringify({
document: CB.toJSON(thisObj),
key: CB.appKey
});
var url = CB.apiUrl + "/push/" + CB.appId;
CB._request('PUT',url,params).then(function(response){
thisObj = CB.fromJSON(JSON.parse(response),thisObj);
if (callback) {
callback.success(thisObj);
} else {
def.resolve(thisObj);
}
},function(err){
if(callback){
callback.error(err);
}else {
def.reject(err);
}
});
if (!callback) {
return def.promise;
}
};
CB.CloudPush._deleteDevice = function(deviceOS, endPoint, callback) { //delete an object matching the objectId
if (!CB.appId) {
throw "CB.appId is null.";
}
var def;
if (!callback) {
def = new CB.Promise();
}
var data={
deviceOS:deviceOS,
deviceToken:endPoint
};
var params=JSON.stringify({
key: CB.appKey,
document: data,
method:"DELETE"
});
var url = CB.apiUrl + "/push/" + CB.appId;
CB._request('PUT',url,params).then(function(response){
if (callback) {
callback.success(response);
} else {
def.resolve(response);
}
},function(err){
if(callback){
callback.error(err);
}else {
def.reject(err);
}
});
if (!callback) {
return def.promise;
}
};
export default CB.CloudPush