diff --git a/lib/apn.js b/lib/apn.js index e3f6e8b..d5660f2 100644 --- a/lib/apn.js +++ b/lib/apn.js @@ -1,5 +1,4 @@ -var net = require('net'); -var crypto = require('crypto'); +var tls = require('tls'); var fs = require('fs'); var Buffer = require('buffer').Buffer; @@ -17,13 +16,13 @@ var Errors = { } var Connection = function (optionArgs) { - this.socket = new net.Stream(); - this.credentials = crypto.createCredentials(); this.currentId = 0; this.cachedNotes = []; var self = this; var hasKey = hasCert = false; + var socketOptions = {}; + var offlineCache = []; var options = { cert: 'cert.pem' /* Certificate file */ , key: 'key.pem' /* Key file */ @@ -47,20 +46,20 @@ var Connection = function (optionArgs) { } var startSocket = function () { - self.socket.connect(options['port'], options['gateway']); + self.socket = tls.connect(options['port'], options['gateway'], socketOptions); + self.socket.pair.on('secure', function () { if(!self.socket.authorized) { throw self.socket.authorizationError } while(offlineCache.length) { self.socket.write(offlineCache.shift()); } }); + self.socket.on('data', function(data) { handleTransmissionError(data); }); + self.socket.once('end', function () { }); + self.socket.once('close', function () { self.socket.removeAllListeners(); self.socket = undefined; }); } - self.socket.on('connect', function() { self.socket.setSecure(self.credentials); }); - self.socket.on('data', function(data) { handleTransmissionError(data); }); - self.socket.on('end', function () { self.socket.end(); }); - var connect = invoke_after(function() { startSocket(); }); fs.readFile(options['cert'], connect(function(err, data) { if(err) { throw err; } - self.credentials.context.setCert(data.toString()); + socketOptions['cert'] = data.toString(); hasCert = true; })); @@ -68,7 +67,7 @@ var Connection = function (optionArgs) { if(err) { throw err; } - self.credentials.context.setKey(data.toString()); + socketOptions['key'] = data.toString(); hasKey = true; })); @@ -114,16 +113,11 @@ var Connection = function (optionArgs) { pos += data.write(message, pos); // If error occurs then slice array and resend all stored notes. - - if(self.socket.readyState != 'open') { - if(self.socket.readyState == 'closed' && readyToConnect()) { + if(self.socket === undefined || self.socket.readyState != 'open') { + if((self.socket === undefined || self.socket.readyState == 'closed') && readyToConnect()) { startSocket(); } - self.socket.on('connect', - function() { - self.socket.write(data); - self.socket.removeListener('connect', arguments.callee); - }); + offlineCache.push(data); } else { self.socket.write(data); @@ -240,11 +234,9 @@ Device.prototype.hexToken = function () { } var Feedback = function (optionArgs) { - this.socket = new net.Stream(); - this.credentials = crypto.createCredentials(); - var self = this; var hasKey = hasCert = false; + var socketOptions = {} var responsePacketLength = 38; var readBuffer = new Buffer(responsePacketLength); @@ -274,21 +266,21 @@ var Feedback = function (optionArgs) { return (hasKey && hasCert); } - this.startSocket = function () { - self.socket.connect(options['port'], options['address']); + self.startSocket = function () { + self.socket = tls.connect(options['port'], options['address'], socketOptions); + self.socket.pair.on('secure', function () { if(!self.socket.authorized) { throw self.socket.authorizationError } }); + self.socket.on('data', function(data) { processData(data); }); + self.socket.once('end', function () { }); + self.socket.once('close', function () { self.socket.removeAllListeners(); self.socket = undefined; }); } - self.socket.on('connect', function() { self.socket.setSecure(self.credentials); }); - self.socket.on('data', function(data) { processData(data); }); - self.socket.on('end', function () { self.socket.end(); }); - var connect = invoke_after(function() { self.startSocket(); }); fs.readFile(options['cert'], connect(function(err, data) { if(err) { throw err; } - self.credentials.context.setCert(data.toString()); + socketOptions['cert'] = data.toString(); hasCert = true; })); @@ -296,7 +288,7 @@ var Feedback = function (optionArgs) { if(err) { throw err; } - self.credentials.context.setKey(data.toString()); + socketOptions['key'] = data.toString(); hasKey = true; })); @@ -345,7 +337,7 @@ var Feedback = function (optionArgs) { } Feedback.prototype.request = function () { - if(this.socket.readyState == 'closed' && this.readyToConnect()) { + if((this.socket === undefined || this.socket.readyState == 'closed') && this.readyToConnect()) { this.startSocket(); } }