12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- var util = require('util');
- var EventEmitter = require('events').EventEmitter;
- var net = require('net');
- var HybridSocket = require('./hybridsocket');
- var Switcher = require('./hybrid/switcher');
- var Handshake = require('./commands/handshake');
- var Heartbeat = require('./commands/heartbeat');
- var Kick = require('./commands/kick');
- var coder = require('./common/coder');
- var Tlssocket = require('./hybrid/tlssocket');
- var Message = require('pomelo-protocol').Message;
- var Constants = require('../util/constants');
- var logger = require('pomelo-logger').getLogger('pomelo', __filename);
- var curId = 1;
- /**
- * Connector that manager low level connection and protocol bewteen server and client.
- * Develper can provide their own connector to switch the low level prototol, such as tcp or probuf.
- */
- var Connector = function(port, host, opts) {
- if (!(this instanceof Connector)) {
- return new Connector(port, host, opts);
- }
- EventEmitter.call(this);
- this.opts = opts || {};
- this.port = port;
- this.host = host;
- this.useDict = opts.useDict;
- this.useProtobuf = opts.useProtobuf;
- this.handshake = new Handshake(opts);
- this.heartbeat = new Heartbeat(opts);
- this.distinctHost = opts.distinctHost;
- this.ssl = opts.ssl;
- this.switcher = null;
- };
- util.inherits(Connector, EventEmitter);
- module.exports = Connector;
- /**
- * Start connector to listen the specified port
- */
- Connector.prototype.start = function(cb) {
- var app = require('../pomelo').app;
- var self = this;
- var gensocket = function(socket) {
- var hybridsocket = new HybridSocket(curId++, socket);
- hybridsocket.on('handshake', self.handshake.handle.bind(self.handshake, hybridsocket));
- hybridsocket.on('heartbeat', self.heartbeat.handle.bind(self.heartbeat, hybridsocket));
- hybridsocket.on('disconnect', self.heartbeat.clear.bind(self.heartbeat, hybridsocket.id));
- hybridsocket.on('closing', Kick.handle.bind(null, hybridsocket));
- self.emit('connection', hybridsocket);
- };
- this.connector = app.components.__connector__.connector;
- this.dictionary = app.components.__dictionary__;
- this.protobuf = app.components.__protobuf__;
- this.decodeIO_protobuf = app.components.__decodeIO__protobuf__;
- if(!this.ssl) {
- this.tcpServer = net.createServer();
- this.switcher = new Switcher(this.tcpServer, self.opts);
- this.switcher.on('connection', function(socket) {
- gensocket(socket);
- });
- if(!!this.distinctHost) {
- this.tcpServer.listen(this.port, this.host);
- } else {
- this.tcpServer.listen(this.port);
- }
- } else {
- this.tlssocket = new Tlssocket(this.port, this.opts);
- this.tlssocket.on('connection', function(socket) {
- gensocket(socket);
- });
- }
- process.nextTick(cb);
- };
- Connector.prototype.stop = function(force, cb) {
- this.switcher.close();
- this.tcpServer.close();
- process.nextTick(cb);
- };
- Connector.decode = Connector.prototype.decode = coder.decode;
- Connector.encode = Connector.prototype.encode = coder.encode;
|