node-apn
Version:
An interface to the Apple Push Notification service for Node.js
110 lines (92 loc) • 2.59 kB
JavaScript
;
const extend = require("./util/extend");
let EndpointAddress = {
production: "api.push.apple.com",
development: "api.development.push.apple.com"
};
module.exports = function(dependencies) {
const logger = dependencies.logger;
const prepareCertificate = dependencies.prepareCertificate;
const prepareToken = dependencies.prepareToken;
const prepareCA = dependencies.prepareCA;
function config(options) {
let config = {
token: null,
cert: "cert.pem",
key: "key.pem",
ca: null,
pfx: null,
passphrase: null,
production: (process.env.NODE_ENV === "production"),
address: null,
port: 443,
proxy: null,
rejectUnauthorized: true,
connectionRetryLimit: 10,
heartBeat: 60000,
};
validateOptions(options);
extend(config, options);
configureAddress(config);
if (config.token) {
delete config.cert;
delete config.key;
delete config.pfx;
extend(config, { token: prepareToken(config.token) });
} else {
if (config.pfx || config.pfxData) {
config.cert = options.cert;
config.key = options.key;
}
extend(config, prepareCertificate(config));
}
extend(config, prepareCA(config));
return config;
}
function validateOptions(options) {
for (var key in options) {
if (options[key] === null || options[key] === undefined) {
logger("Option [" + key + "] is " + options[key] + ". This may cause unexpected behaviour.");
}
}
if (options) {
if (options.passphrase && typeof options.passphrase !== "string") {
throw new Error("Passphrase must be a string");
}
if (options.token) {
validateToken(options.token);
}
}
}
return config;
};
function validateToken(token) {
if (!token.keyId) {
throw new Error("token.keyId is missing");
} else if(typeof token.keyId !== "string") {
throw new Error("token.keyId must be a string");
}
if (!token.teamId) {
throw new Error("token.teamId is missing");
} else if(typeof token.teamId !== "string") {
throw new Error("token.teamId must be a string");
}
}
function configureAddress(options) {
if (!options.address) {
if (options.production) {
options.address = EndpointAddress.production;
}
else {
options.address = EndpointAddress.development;
}
}
else {
if (options.address === EndpointAddress.production) {
options.production = true;
}
else {
options.production = false;
}
}
};