A unf. social network done poorly.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.1KB

  1. #!/usr/bin/env node
  2. var express = require('express'),
  3. app = express(),
  4. http = require('http').Server(app),
  5. io = require('socket.io')(http),
  6. sys = require('sys'),
  7. packages = require('./libs/packages'),
  8. o_ = require('./libs/utils');
  9. o_.merge(global, require('./settings'));
  10. try { o_.merge(global, require('./settings.local')); } catch(e) {}
  11. //app.set('env', 'development');
  12. app.use(require('method-override')());
  13. app.use(require('cookie-parser')());
  14. app.use(require('body-parser').json());
  15. var mw = require('./middleware/im')({
  16. maxAge: 60 * 1000,
  17. reapInterval: 60 * 1000,
  18. authentication: require('./libs/authentication/' + AUTH_LIBRARY)
  19. });
  20. app.use(mw.session);
  21. var hub = mw.hub;
  22. app.set('root', __dirname);
  23. if ('development' == app.get('env')) {
  24. app.set('views', __dirname + '/dev/views');
  25. app.set('view engine', 'jade');
  26. app.use(require("morgan")());
  27. require('./dev/app')('/dev', app);
  28. app.use(express.static(
  29. require('path').join(__dirname, '../client')));
  30. app.use(require('express-error-handler')({dumpExceptions: true, showStack: true}));
  31. }
  32. io.on('connection', function(socket){
  33. socket.on('server', function(event) {
  34. if (event.type == 'hello') {
  35. event.socketio = socket;
  36. hub.get(event, function(err, sess) {
  37. sess.touch();
  38. store.set(event.sessionID, sess);
  39. });
  40. } else {
  41. hub.find(event.from, function(from) {
  42. from.socketio = socket;
  43. from.dispatch(hub, event);
  44. });
  45. }
  46. });
  47. });
  48. http.listen(APP_PORT, APP_HOST, function(){
  49. console.log('Ajax IM server started...');
  50. });
  51. // Listener endpoint; handled in middleware
  52. app.get('/app/listen', function(){});
  53. app.use('/app/message', function(req, res) {
  54. res.find(req.param('to'), function(to) {
  55. if(to) {
  56. res.message(to, req.event);
  57. } else {
  58. req.event._status = {sent: false, e: 'not online'};
  59. res.jsonp(req.event);
  60. }
  61. });
  62. });
  63. app.use('/app/message/typing', function(req, res) {
  64. if(~packages.TYPING_STATES.indexOf('typing' + req.param('state'))) {
  65. res.find(req.param('to'), function(user) {
  66. if(user) {
  67. req.event.status = 'typing' + req.param('state');
  68. res.message(user, req.event);
  69. } else {
  70. // Typing updates do not receive confirmations,
  71. // as they are not important enough.
  72. req.event._status = {sent: false, e: 'invalid user'};
  73. res.jsonp(req.event);
  74. }
  75. });
  76. } else {
  77. req.event._status = {sent: false, e: 'invalid state'};
  78. res.jsonp(req.event);
  79. }
  80. });
  81. app.use('/app/status', function(req, res) {
  82. if(~packages.STATUSES.indexOf(req.param('status'))) {
  83. res.status(req.event);
  84. } else {
  85. req.event._status = {sent: false, e: 'invalid status'};
  86. res.jsonp(req.event);
  87. }
  88. });
  89. app.use('/app/noop', function(req, res) {
  90. req.event._status = {sent: true};
  91. res.jsonp(req.event);
  92. });
  93. app.use('/app/signoff', function(req, res) {
  94. res.signOff(req.event);
  95. });