PageRenderTime 32ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/js/lib/Socket.IO-node/lib/socket.io/transports/flashsocket.js

http://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs
JavaScript | 116 lines | 74 code | 21 blank | 21 comment | 19 complexity | 66c6eed24e85990f937736d5657e9184 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, MPL-2.0-no-copyleft-exception, BSD-3-Clause
  1. /*!
  2. * Socket.IO - transports - Flashsocket
  3. * Copyright (c) 2010-2011 Guillermo Rauch <guillermo@learnboost.com>
  4. * MIT Licensed
  5. */
  6. var net = require('net')
  7. , WebSocket = require('./websocket')
  8. , listeners = []
  9. , netserver;
  10. /**
  11. * Expose `Flashsocket`.
  12. */
  13. module.exports = Flashsocket;
  14. /**
  15. * Initialize a `Flashsocket`.
  16. *
  17. * @api private
  18. */
  19. function Flashsocket() {
  20. WebSocket.apply(this, arguments);
  21. };
  22. /**
  23. * Inherit from `WebSocket.prototype`.
  24. */
  25. Flashsocket.prototype.__proto__ = WebSocket.prototype;
  26. /**
  27. * Requires upgrade.
  28. */
  29. Flashsocket.httpUpgrade = true;
  30. Flashsocket.init = function(listener){
  31. listeners.push(listener);
  32. listener.server.on('close', function(){
  33. listeners.splice(listeners.indexOf(listener), 1);
  34. if (listeners.length === 0 && netserver){
  35. try {
  36. netserver.close();
  37. } catch(e){
  38. listener.log('flashsocket netserver close error - ' + e.stack)
  39. }
  40. }
  41. });
  42. if (listener.flashPolicyServer && netserver === undefined){
  43. netserver = net.createServer(function(socket){
  44. socket.addListener('error', function(err){
  45. if (socket && socket.end){
  46. socket.end();
  47. socket.destroy();
  48. }
  49. });
  50. if (socket && socket.readyState == 'open') {
  51. socket.end(policy(listeners));
  52. }
  53. });
  54. try {
  55. netserver.listen(843);
  56. } catch(e){
  57. if (e.errno == 13)
  58. listener.log(
  59. 'Your node instance does not have root privileges. '
  60. + 'This means that the flash XML policy file will be '
  61. + 'served inline instead of on port 843. This will slow '
  62. + 'down initial connections slightly.');
  63. netserver = null;
  64. }
  65. }
  66. // Could not listen on port 843 so policy requests will be inline
  67. listener.server.on('connection', function(stream){
  68. var flashCheck = function (data) {
  69. // Only check the initial data
  70. stream.removeListener("data", flashCheck);
  71. if (data[0] === 60 && data.length == 23) {
  72. if (data == '<policy-file-request/>\0') {
  73. listener.log("Answering flash policy request inline");
  74. if (stream && stream.readyState == 'open'){
  75. var xml = policy([listener]);
  76. stream.end(xml);
  77. }
  78. }
  79. }
  80. };
  81. stream.on('data', flashCheck);
  82. });
  83. };
  84. function policy(listeners) {
  85. var xml = '<?xml version="1.0"?>\n<!DOCTYPE cross-domain-policy SYSTEM'
  86. + ' "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">\n<cross-domain-policy>\n';
  87. listeners.forEach(function(l){
  88. [].concat(l.origins).forEach(function(origin){
  89. var parts = origin.split(':');
  90. xml += '<allow-access-from domain="' + parts[0] + '" to-ports="'+ parts[1] +'"/>\n';
  91. });
  92. });
  93. xml += '</cross-domain-policy>\n';
  94. return xml;
  95. };