jpusher
Version:
JPush API caller for node.js.
134 lines (119 loc) • 4.65 kB
JavaScript
/**
* Created by XadillaX on 14-1-7.
*/
var param = require("./callParam");
var verificationCode = require("./verificationGenerator");
var spider = require("nodegrassex");
var qs = require("querystring");
var baseURI = [
"http://api.jpush.cn:8800/v2/push",
"https://api.jpush.cn:443/v2/push"
];
/**
* JPusher
* @param appKey
* @param apiMasterSecret
* @param {safe}
* @constructor
*/
var JPusher = function(appKey, apiMasterSecret, safe) {
this.appKey = appKey;
this.apiMasterSecret = apiMasterSecret;
if(safe) {
this.safe = 1;
} else {
this.safe = 0;
}
};
/**
* push msg to end
* @param pushParam
* @param content
* @param callback
* @returns {*}
*/
JPusher.prototype.push = function(pushParam, content, callback) {
var queryStringArray = {};
queryStringArray.sendno = pushParam.sendno;
queryStringArray.app_key = this.appKey;
queryStringArray.receiver_type = pushParam.receiverType;
queryStringArray.receiver_value = pushParam.receivers.join(",");
queryStringArray.verification_code = verificationCode(
pushParam.sendno,
this.apiMasterSecret,
queryStringArray.receiver_type,
queryStringArray.receiver_value
);
queryStringArray.msg_type = pushParam.msgType;
queryStringArray.send_description = pushParam.sendDescription;
queryStringArray.platform = pushParam.platform.join(",");
if(pushParam.apnsProduction !== param.APNsType.AT_DEFAULT) queryStringArray.apns_production = pushParam.apnsProduction;
queryStringArray.time_to_live = pushParam.timeToLive;
queryStringArray.override_msg_id = pushParam.overrideMsgId;
// validate receiver type
if(queryStringArray.receiver_type === param.ReceiverType.RT_TAG &&
(!pushParam.receivers || pushParam.receivers.length > 10)) {
return callback(new Error("You can only set up to 10 tags."));
} else if(queryStringArray.receiver_type === param.ReceiverType.RT_ALIAS &&
(!pushParam.receivers || pushParam.receivers.length > 1000)) {
return callback(new Error("You can only set up to 1000 alias."));
} else if(queryStringArray.receiver_type === param.ReceiverType.RT_ALL) {
delete queryStringArray.receiver_value;
}
// override message id
if(null === queryStringArray.override_msg_id) {
delete queryStringArray.override_msg_id;
}
// content
if(queryStringArray.msg_type === param.MessageType.MT_NOTIFICATION) {
queryStringArray.msg_content = {
"n_builder_id" : pushParam.nBuilderId,
"n_title" : pushParam.nTitle,
"n_content" : content,
"n_extras" : pushParam.extra //{ "ios": pushParam.iOSExtra }
};
if(pushParam.iOSExtra !== null && pushParam.iOSExtra !== undefined) {
queryStringArray.msg_content.n_extras.ios = pushParam.iOSExtra;
}
if(!queryStringArray.msg_content.n_title) {
delete queryStringArray.msg_content.n_title;
}
} else if(queryStringArray.msg_type === param.MessageType.MT_CUSTOMIZE) {
queryStringArray.msg_content = {
"message" : content,
"content_type" : pushParam.androidContentType,
"title" : pushParam.nTitle
};
if(!queryStringArray.msg_content.title) {
delete queryStringArray.msg_content.title;
}
}
//console.log(queryStringArray.msg_content.n_content.length);
queryStringArray.msg_content = JSON.stringify(queryStringArray.msg_content);
queryStringArray.verification_code = queryStringArray.verification_code.toUpperCase();
var queryString = qs.stringify(queryStringArray);
//console.log(queryStringArray);
// post to API
spider.post(baseURI[this.safe], function(html, status) {
if(status !== 200) {
return callback(new Error("Server has returned an error status."));
}
var json = {};
try {
json = JSON.parse(html);
} catch(e) {
return callback(e);
}
if(0 == json.errcode) {
callback(null, json.msg_id);
} else {
callback(new Error("Error " + json.errcode + ": " + json.errmsg));
}
}, {
"content-length": queryString.length,
"content-type": "application/x-www-form-urlencoded"
}, queryStringArray, "utf8").on("error", function(err) {
callback(err);
});
};
module.exports = JPusher;