HttpChannelHandler.js 4.03 KB
// Generated by CoffeeScript 1.8.0
var Channel, HttpChannelHandler, channelManager, handleCreate, handleError, handleGet, handleOptions, handlePost, setCORSHeaders, setCacheHeaders, utils, _;

_ = require('underscore');

utils = require('./utils');

Channel = require('./Channel');

channelManager = require('./channelManager');

module.exports = utils.registerClass(HttpChannelHandler = (function() {
  function HttpChannelHandler(pathPrefix) {
    this.pathPrefix = pathPrefix;
    if (this.pathPrefix === '/ws/client') {
      this.isClient = true;
    } else if (this.pathPrefix === '/ws/target') {
      this.isClient = false;
    } else {
      utils.pitch("invalid pathPrefix: " + this.pathPrefix);
    }
    this.isTarget = !this.isClient;
  }

  HttpChannelHandler.prototype.handle = function(request, response, uri) {
    var channelName, parts;
    setCORSHeaders(request, response);
    setCacheHeaders(request, response);
    if (uri[0] !== '/') {
      return handleError(request, response, 404);
    }
    if (uri === '/') {
      if (request.method === 'OPTIONS') {
        return handleOptions(request, response);
      }
      if (request.method === 'POST') {
        return handleCreate(this.pathPrefix, this.isClient, request, response);
      }
      return handleError(request, response, 405);
    }
    parts = uri.split('/');
    if (parts.length > 2) {
      return handleError(request, response, 404);
    }
    channelName = parts[1];
    if (request.method === 'OPTIONS') {
      return handleOptions(request, response);
    }
    if (request.method === 'GET') {
      return handleGet(request, response, channelName);
    }
    if (request.method === 'POST') {
      return handlePost(request, response, channelName);
    }
    return handleError(request, response, 405);
  };

  return HttpChannelHandler;

})());

handleCreate = function(pathPrefix, isClient, request, response) {
  var channel, id, remoteAddress, _ref, _ref1;
  id = (_ref = request.body) != null ? _ref.id : void 0;
  remoteAddress = ((_ref1 = request.connection) != null ? _ref1.remoteAddress : void 0) || "";
  channel = new Channel(pathPrefix, id, remoteAddress, isClient);
  response.contentType('application/json');
  return response.send(JSON.stringify({
    channel: channel.name,
    id: channel.id
  }));
};

handleGet = function(request, response, channelName) {
  var channel, remoteAddress, _ref;
  remoteAddress = ((_ref = request.connection) != null ? _ref.remoteAddress : void 0) || "";
  channel = channelManager.getChannel(channelName, remoteAddress);
  if (!channel) {
    return handleError(request, response, 404);
  }
  return channel.getMessages((function(_this) {
    return function(messages) {
      if (channel.isClosed) {
        return handleError(request, response, 404);
      }
      if (!messages) {
        return handleError(request, response, 404);
      }
      response.contentType('application/json');
      return response.send(JSON.stringify(messages));
    };
  })(this));
};

handlePost = function(request, response, channelName) {
  var channel, remoteAddress, _ref;
  remoteAddress = ((_ref = request.connection) != null ? _ref.remoteAddress : void 0) || "";
  channel = channelManager.getChannel(channelName, remoteAddress);
  if (!channel) {
    return handleError(request, response, 404);
  }
  channel.handleMessages(request.body);
  return response.send('');
};

handleOptions = function(request, response) {
  return response.send('');
};

handleError = function(request, response, status) {
  return response.send(status);
};

setCORSHeaders = function(request, response) {
  var origin;
  origin = request.header('Origin');
  if (!origin) {
    return;
  }
  response.header('Access-Control-Allow-Origin', origin);
  response.header('Access-Control-Max-Age', '600');
  return response.header('Access-Control-Allow-Methods', 'GET, POST');
};

setCacheHeaders = function(request, response) {
  response.header('Pragma', 'no-cache');
  response.header('Expires', '0');
  response.header('Cache-Control', 'no-cache');
  return response.header('Cache-Control', 'no-store');
};