batman-rails-flo 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/lib/batman-rails-flo.rb +5 -0
- data/lib/batman_rails_flo/railtie.rb +9 -0
- data/lib/batman_rails_flo/tasks.rake +14 -0
- data/lib/batman_rails_flo/version.rb +3 -0
- data/vendor/assets/javascripts/batman_rails_flo/flo_server.js +67 -0
- data/vendor/assets/javascripts/batman_rails_flo/live_reload.js.coffee +129 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/CNAME +1 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/CONTRIBUTING.md +9 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/LICENSE +22 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/README +50 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/bin/cake +7 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/bin/coffee +7 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/browser.js +134 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/cake.js +112 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/coffee-script.js +335 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/command.js +569 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/grammar.js +631 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/helpers.js +252 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/index.js +11 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/lexer.js +926 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/nodes.js +3158 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/optparse.js +139 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/parser.js +724 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/register.js +66 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/repl.js +163 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/rewriter.js +475 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/scope.js +146 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/sourcemap.js +161 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/LICENSE +21 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/examples/pow.js +6 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/index.js +82 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/package.json +34 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/readme.markdown +63 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/chmod.js +38 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/clobber.js +37 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/mkdirp.js +28 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/perm.js +32 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/perm_sync.js +39 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/race.js +41 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/rel.js +32 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/return.js +25 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/return_sync.js +24 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/root.js +18 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/sync.js +32 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/umask.js +28 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/umask_sync.js +32 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/package.json +50 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/register.js +1 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/LICENSE +30 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/PATENTS +23 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/README.md +124 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/bin/flo +26 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/configure.html +57 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/configure.js +205 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/style.css +334 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/connection.js +235 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/devtools.html +12 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/index.js +323 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/logger.js +42 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/logo.png +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/manifest.json +13 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/session.js +305 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/index.js +10 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/lib/flo.js +226 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/lib/server.js +94 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/README.md +66 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/index.js +437 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/LICENSE +23 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/README.md +218 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/minimatch.js +1055 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +14 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +252 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/package.json +33 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/basic.js +369 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/package.json +42 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/package.json +40 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/basic.js +399 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/brace-expand.js +33 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/caching.js +14 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/defaults.js +274 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/lib/walker.js +111 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/license +13 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/lib/makeerror.js +87 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/lib/tmpl.js +17 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/package.json +31 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/readme.md +10 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/package.json +34 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/readme.md +77 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/package.json +36 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/readme.md +52 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/LICENSE +55 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/main.js +128 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/package.json +34 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/readme.mkd +72 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/d/d/t +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/d/t +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_monitor.js +31 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_monitorRootDirectory.js +28 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_watchTree.js +20 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/package.json +45 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/test/test.js +243 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/CHANGELOG.md +81 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/LICENSE +177 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/Makefile +11 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/README.md +245 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/binding.gyp +14 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Makefile +355 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/linker.lock +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/obj.target/validation/src/validation.o +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/obj.target/xor/src/xor.o +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/validation.node +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/xor.node +0 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/binding.Makefile +6 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/config.gypi +115 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/gyp-mac-tool +512 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/validation.target.mk +154 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/xor.target.mk +154 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/index.js +1 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/install.js +31 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Constants.js +23 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Deprecation.js +38 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Validation.fallback.js +12 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Validation.js +18 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketClient.js +359 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketConnection.js +717 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketFrame.js +282 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRequest.js +478 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRouter.js +154 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRouterRequest.js +59 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketServer.js +216 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/utils.js +7 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/websocket.js +11 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/xor.fallback.js +13 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/xor.js +18 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/package.json +43 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/src/validation.cc +144 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/src/xor.cpp +86 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/FastBufferList.js +192 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/node-ctype/LICENSE +18 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/node-ctype/ctio-faster.js +1126 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/package.json +25 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/browser_websocket.js +63 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/connection_test.js +57 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/logger_mock.js +15 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/session_test.js +194 -0
- data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/server/flo_test.js +211 -0
- data/vendor/assets/javascripts/batman_rails_flo/package.json +15 -0
- data/vendor/assets/javascripts/batman_rails_flo/reload_event_handler.js.coffee +56 -0
- metadata +232 -0
@@ -0,0 +1,154 @@
|
|
1
|
+
/************************************************************************
|
2
|
+
* Copyright 2010-2011 Worlize Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
***********************************************************************/
|
16
|
+
|
17
|
+
var extend = require('./utils').extend;
|
18
|
+
var util = require('util');
|
19
|
+
var EventEmitter = require('events').EventEmitter;
|
20
|
+
var WebSocketRouterRequest = require('./WebSocketRouterRequest');
|
21
|
+
|
22
|
+
function WebSocketRouter(config) {
|
23
|
+
this.config = {
|
24
|
+
// The WebSocketServer instance to attach to.
|
25
|
+
server: null
|
26
|
+
};
|
27
|
+
if (config) {
|
28
|
+
extend(this.config, config);
|
29
|
+
}
|
30
|
+
if (this.config.server) {
|
31
|
+
this.attachServer(this.config.server);
|
32
|
+
}
|
33
|
+
this.handlers = [];
|
34
|
+
|
35
|
+
this._requestHandler = this.handleRequest.bind(this);
|
36
|
+
}
|
37
|
+
|
38
|
+
util.inherits(WebSocketRouter, EventEmitter);
|
39
|
+
|
40
|
+
WebSocketRouter.prototype.attachServer = function(server) {
|
41
|
+
if (server) {
|
42
|
+
this.server = server;
|
43
|
+
this.server.on('request', this._requestHandler);
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
throw new Error("You must specify a WebSocketServer instance to attach to.");
|
47
|
+
}
|
48
|
+
};
|
49
|
+
|
50
|
+
WebSocketRouter.prototype.detachServer = function() {
|
51
|
+
if (this.server) {
|
52
|
+
this.server.removeListener('request', this._requestHandler);
|
53
|
+
this.server = null;
|
54
|
+
}
|
55
|
+
else {
|
56
|
+
throw new Error("Cannot detach from server: not attached.")
|
57
|
+
}
|
58
|
+
};
|
59
|
+
|
60
|
+
WebSocketRouter.prototype.mount = function(path, protocol, callback) {
|
61
|
+
if (!path) {
|
62
|
+
throw new Error("You must specify a path for this handler.");
|
63
|
+
}
|
64
|
+
if (!protocol) {
|
65
|
+
protocol = "____no_protocol____";
|
66
|
+
}
|
67
|
+
if (!callback) {
|
68
|
+
throw new Error("You must specify a callback for this handler.");
|
69
|
+
}
|
70
|
+
|
71
|
+
path = this.pathToRegExp(path);
|
72
|
+
if (!(path instanceof RegExp)) {
|
73
|
+
throw new Error("Path must be specified as either a string or a RegExp.");
|
74
|
+
}
|
75
|
+
var pathString = path.toString();
|
76
|
+
|
77
|
+
// normalize protocol to lower-case
|
78
|
+
protocol = protocol.toLocaleLowerCase();
|
79
|
+
|
80
|
+
if (this.findHandlerIndex(pathString, protocol) !== -1) {
|
81
|
+
throw new Error("You may only mount one handler per path/protocol combination.");
|
82
|
+
}
|
83
|
+
|
84
|
+
this.handlers.push({
|
85
|
+
'path': path,
|
86
|
+
'pathString': pathString,
|
87
|
+
'protocol': protocol,
|
88
|
+
'callback': callback
|
89
|
+
});
|
90
|
+
};
|
91
|
+
WebSocketRouter.prototype.unmount = function(path, protocol) {
|
92
|
+
var index = this.findHandlerIndex(this.pathToRegExp(path).toString(), protocol);
|
93
|
+
if (index !== -1) {
|
94
|
+
this.handlers.splice(index, 1);
|
95
|
+
}
|
96
|
+
else {
|
97
|
+
throw new Error("Unable to find a route matching the specified path and protocol.");
|
98
|
+
}
|
99
|
+
};
|
100
|
+
|
101
|
+
WebSocketRouter.prototype.findHandlerIndex = function(pathString, protocol) {
|
102
|
+
protocol = protocol.toLocaleLowerCase();
|
103
|
+
for (var i=0, len=this.handlers.length; i < len; i++) {
|
104
|
+
var handler = this.handlers[i];
|
105
|
+
if (handler.pathString === pathString && handler.protocol === protocol) {
|
106
|
+
return i;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
return -1;
|
110
|
+
};
|
111
|
+
|
112
|
+
WebSocketRouter.prototype.pathToRegExp = function(path) {
|
113
|
+
if (typeof(path) === 'string') {
|
114
|
+
if (path === '*') {
|
115
|
+
path = /^.*$/;
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
path = path.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
119
|
+
path = new RegExp('^' + path + '$');
|
120
|
+
}
|
121
|
+
}
|
122
|
+
return path;
|
123
|
+
};
|
124
|
+
|
125
|
+
WebSocketRouter.prototype.handleRequest = function(request) {
|
126
|
+
var requestedProtocols = request.requestedProtocols;
|
127
|
+
if (requestedProtocols.length === 0) {
|
128
|
+
requestedProtocols = ['____no_protocol____'];
|
129
|
+
}
|
130
|
+
|
131
|
+
// Find a handler with the first requested protocol first
|
132
|
+
for (var i=0; i < requestedProtocols.length; i++) {
|
133
|
+
var requestedProtocol = requestedProtocols[i].toLocaleLowerCase();
|
134
|
+
|
135
|
+
// find the first handler that can process this request
|
136
|
+
for (var j=0, len=this.handlers.length; j < len; j++) {
|
137
|
+
var handler = this.handlers[j];
|
138
|
+
if (handler.path.test(request.resourceURL.pathname)) {
|
139
|
+
if (requestedProtocol === handler.protocol ||
|
140
|
+
handler.protocol === '*')
|
141
|
+
{
|
142
|
+
var routerRequest = new WebSocketRouterRequest(request, requestedProtocol);
|
143
|
+
handler.callback(routerRequest);
|
144
|
+
return;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
// If we get here we were unable to find a suitable handler.
|
151
|
+
request.reject(404, "No handler is available for the given request.");
|
152
|
+
};
|
153
|
+
|
154
|
+
module.exports = WebSocketRouter;
|
@@ -0,0 +1,59 @@
|
|
1
|
+
/************************************************************************
|
2
|
+
* Copyright 2010-2011 Worlize Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
***********************************************************************/
|
16
|
+
|
17
|
+
var deprecation = require('./Deprecation');
|
18
|
+
var util = require('util');
|
19
|
+
var EventEmitter = require('events').EventEmitter;
|
20
|
+
|
21
|
+
function WebSocketRouterRequest(webSocketRequest, resolvedProtocol) {
|
22
|
+
this.webSocketRequest = webSocketRequest;
|
23
|
+
if (resolvedProtocol === '____no_protocol____') {
|
24
|
+
this.protocol = null;
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
this.protocol = resolvedProtocol;
|
28
|
+
}
|
29
|
+
this.origin = webSocketRequest.origin;
|
30
|
+
this.resource = webSocketRequest.resource;
|
31
|
+
this.resourceURL = webSocketRequest.resourceURL;
|
32
|
+
this.httpRequest = webSocketRequest.httpRequest;
|
33
|
+
this.remoteAddress = webSocketRequest.remoteAddress;
|
34
|
+
this.webSocketVersion = webSocketRequest.webSocketVersion;
|
35
|
+
// Deprecated websocketVersion (proper casing...)
|
36
|
+
Object.defineProperty(this, "websocketVersion", {
|
37
|
+
get: function() {
|
38
|
+
deprecation.warn('websocketVersion');
|
39
|
+
return this.webSocketVersion;
|
40
|
+
}
|
41
|
+
});
|
42
|
+
this.requestedExtensions = webSocketRequest.requestedExtensions;
|
43
|
+
this.cookies = webSocketRequest.cookies;
|
44
|
+
}
|
45
|
+
|
46
|
+
util.inherits(WebSocketRouterRequest, EventEmitter);
|
47
|
+
|
48
|
+
WebSocketRouterRequest.prototype.accept = function(origin, cookies) {
|
49
|
+
var connection = this.webSocketRequest.accept(this.protocol, origin, cookies);
|
50
|
+
this.emit('requestAccepted', connection);
|
51
|
+
return connection;
|
52
|
+
};
|
53
|
+
|
54
|
+
WebSocketRouterRequest.prototype.reject = function(status, reason, extraHeaders) {
|
55
|
+
this.webSocketRequest.reject(status, reason, extraHeaders);
|
56
|
+
this.emit('requestRejected', this);
|
57
|
+
};
|
58
|
+
|
59
|
+
module.exports = WebSocketRouterRequest;
|
@@ -0,0 +1,216 @@
|
|
1
|
+
/************************************************************************
|
2
|
+
* Copyright 2010-2011 Worlize Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
***********************************************************************/
|
16
|
+
|
17
|
+
var extend = require('./utils').extend;
|
18
|
+
var util = require('util');
|
19
|
+
var EventEmitter = require('events').EventEmitter;
|
20
|
+
var WebSocketRequest = require('./WebSocketRequest');
|
21
|
+
var Constants = require('./Constants');
|
22
|
+
|
23
|
+
var WebSocketServer = function WebSocketServer(config) {
|
24
|
+
this._handlers = {
|
25
|
+
upgrade: this.handleUpgrade.bind(this),
|
26
|
+
requestAccepted: this.handleRequestAccepted.bind(this)
|
27
|
+
};
|
28
|
+
this.connections = [];
|
29
|
+
if (config) {
|
30
|
+
this.mount(config);
|
31
|
+
}
|
32
|
+
};
|
33
|
+
|
34
|
+
util.inherits(WebSocketServer, EventEmitter);
|
35
|
+
|
36
|
+
WebSocketServer.prototype.mount = function(config) {
|
37
|
+
this.config = {
|
38
|
+
// The http server instance to attach to. Required.
|
39
|
+
httpServer: null,
|
40
|
+
|
41
|
+
// 64KiB max frame size.
|
42
|
+
maxReceivedFrameSize: 0x10000,
|
43
|
+
|
44
|
+
// 1MiB max message size, only applicable if
|
45
|
+
// assembleFragments is true
|
46
|
+
maxReceivedMessageSize: 0x100000,
|
47
|
+
|
48
|
+
// Outgoing messages larger than fragmentationThreshold will be
|
49
|
+
// split into multiple fragments.
|
50
|
+
fragmentOutgoingMessages: true,
|
51
|
+
|
52
|
+
// Outgoing frames are fragmented if they exceed this threshold.
|
53
|
+
// Default is 16KiB
|
54
|
+
fragmentationThreshold: 0x4000,
|
55
|
+
|
56
|
+
// If true, the server will automatically send a ping to all
|
57
|
+
// clients every 'keepaliveInterval' milliseconds. The timer is
|
58
|
+
// reset on any received data from the client.
|
59
|
+
keepalive: true,
|
60
|
+
|
61
|
+
// The interval to send keepalive pings to connected clients if the
|
62
|
+
// connection is idle. Any received data will reset the counter.
|
63
|
+
keepaliveInterval: 20000,
|
64
|
+
|
65
|
+
// If true, the server will consider any connection that has not
|
66
|
+
// received any data within the amount of time specified by
|
67
|
+
// 'keepaliveGracePeriod' after a keepalive ping has been sent to
|
68
|
+
// be dead, and will drop the connection.
|
69
|
+
// Ignored if keepalive is false.
|
70
|
+
dropConnectionOnKeepaliveTimeout: true,
|
71
|
+
|
72
|
+
// The amount of time to wait after sending a keepalive ping before
|
73
|
+
// closing the connection if the connected peer does not respond.
|
74
|
+
// Ignored if keepalive is false.
|
75
|
+
keepaliveGracePeriod: 10000,
|
76
|
+
|
77
|
+
// Whether to use native TCP keep-alive instead of WebSockets ping
|
78
|
+
// and pong packets. Native TCP keep-alive sends smaller packets
|
79
|
+
// on the wire and so uses bandwidth more efficiently. This may
|
80
|
+
// be more important when talking to mobile devices.
|
81
|
+
// If this value is set to true, then these values will be ignored:
|
82
|
+
// keepaliveGracePeriod
|
83
|
+
// dropConnectionOnKeepaliveTimeout
|
84
|
+
useNativeKeepalive: false,
|
85
|
+
|
86
|
+
// If true, fragmented messages will be automatically assembled
|
87
|
+
// and the full message will be emitted via a 'message' event.
|
88
|
+
// If false, each frame will be emitted via a 'frame' event and
|
89
|
+
// the application will be responsible for aggregating multiple
|
90
|
+
// fragmented frames. Single-frame messages will emit a 'message'
|
91
|
+
// event in addition to the 'frame' event.
|
92
|
+
// Most users will want to leave this set to 'true'
|
93
|
+
assembleFragments: true,
|
94
|
+
|
95
|
+
// If this is true, websocket connections will be accepted
|
96
|
+
// regardless of the path and protocol specified by the client.
|
97
|
+
// The protocol accepted will be the first that was requested
|
98
|
+
// by the client. Clients from any origin will be accepted.
|
99
|
+
// This should only be used in the simplest of cases. You should
|
100
|
+
// probably leave this set to 'false' and inspect the request
|
101
|
+
// object to make sure it's acceptable before accepting it.
|
102
|
+
autoAcceptConnections: false,
|
103
|
+
|
104
|
+
// The Nagle Algorithm makes more efficient use of network resources
|
105
|
+
// by introducing a small delay before sending small packets so that
|
106
|
+
// multiple messages can be batched together before going onto the
|
107
|
+
// wire. This however comes at the cost of latency, so the default
|
108
|
+
// is to disable it. If you don't need low latency and are streaming
|
109
|
+
// lots of small messages, you can change this to 'false'
|
110
|
+
disableNagleAlgorithm: true,
|
111
|
+
|
112
|
+
// The number of milliseconds to wait after sending a close frame
|
113
|
+
// for an acknowledgement to come back before giving up and just
|
114
|
+
// closing the socket.
|
115
|
+
closeTimeout: 5000
|
116
|
+
};
|
117
|
+
extend(this.config, config);
|
118
|
+
|
119
|
+
// this.httpServer = httpServer;
|
120
|
+
// if (typeof(pathRegExp) === 'string') {
|
121
|
+
// pathRegExp = new RegExp('^' + pathRegExp + '$');
|
122
|
+
// }
|
123
|
+
// this.pathRegExp = pathRegExp;
|
124
|
+
// this.protocol = protocol;
|
125
|
+
if (this.config.httpServer) {
|
126
|
+
this.config.httpServer.on('upgrade', this._handlers.upgrade);
|
127
|
+
}
|
128
|
+
else {
|
129
|
+
throw new Error("You must specify an httpServer on which to mount the WebSocket server.")
|
130
|
+
}
|
131
|
+
};
|
132
|
+
|
133
|
+
WebSocketServer.prototype.unmount = function() {
|
134
|
+
this.config.httpServer.removeListener('upgrade', this._handlers.upgrade);
|
135
|
+
};
|
136
|
+
|
137
|
+
WebSocketServer.prototype.closeAllConnections = function() {
|
138
|
+
this.connections.forEach(function(connection) {
|
139
|
+
connection.close();
|
140
|
+
});
|
141
|
+
};
|
142
|
+
|
143
|
+
WebSocketServer.prototype.broadcast = function(data) {
|
144
|
+
if (Buffer.isBuffer(data)) {
|
145
|
+
this.broadcastBytes(data);
|
146
|
+
}
|
147
|
+
else if (typeof(data.toString) === 'function') {
|
148
|
+
this.broadcastUTF(data);
|
149
|
+
}
|
150
|
+
};
|
151
|
+
|
152
|
+
WebSocketServer.prototype.broadcastUTF = function(utfData) {
|
153
|
+
this.connections.forEach(function(connection) {
|
154
|
+
connection.sendUTF(utfData);
|
155
|
+
});
|
156
|
+
};
|
157
|
+
|
158
|
+
WebSocketServer.prototype.broadcastBytes = function(binaryData) {
|
159
|
+
this.connections.forEach(function(connection) {
|
160
|
+
connection.sendBytes(binaryData);
|
161
|
+
});
|
162
|
+
};
|
163
|
+
|
164
|
+
WebSocketServer.prototype.shutDown = function() {
|
165
|
+
this.unmount();
|
166
|
+
this.closeAllConnections();
|
167
|
+
};
|
168
|
+
|
169
|
+
WebSocketServer.prototype.handleUpgrade = function(request, socket, head) {
|
170
|
+
var wsRequest = new WebSocketRequest(socket, request, this.config);
|
171
|
+
try {
|
172
|
+
wsRequest.readHandshake();
|
173
|
+
}
|
174
|
+
catch(e) {
|
175
|
+
wsRequest.reject(
|
176
|
+
e.httpCode ? e.httpCode : 400,
|
177
|
+
e.message,
|
178
|
+
e.headers
|
179
|
+
);
|
180
|
+
if (Constants.DEBUG) {
|
181
|
+
console.error((new Date()) + " WebSocket: Invalid handshake: " + e.message);
|
182
|
+
}
|
183
|
+
return;
|
184
|
+
}
|
185
|
+
|
186
|
+
wsRequest.once('requestAccepted', this._handlers.requestAccepted);
|
187
|
+
|
188
|
+
if (!this.config.autoAcceptConnections && this.listeners('request').length > 0) {
|
189
|
+
this.emit('request', wsRequest);
|
190
|
+
}
|
191
|
+
else if (this.config.autoAcceptConnections) {
|
192
|
+
wsRequest.accept(wsRequest.requestedProtocols[0], wsRequest.origin);
|
193
|
+
}
|
194
|
+
else {
|
195
|
+
wsRequest.reject(404, "No handler is configured to accept the connection.");
|
196
|
+
}
|
197
|
+
};
|
198
|
+
|
199
|
+
WebSocketServer.prototype.handleRequestAccepted = function(connection) {
|
200
|
+
var self = this;
|
201
|
+
connection.once('close', function(closeReason, description) {
|
202
|
+
self.handleConnectionClose(connection, closeReason, description);
|
203
|
+
});
|
204
|
+
this.connections.push(connection);
|
205
|
+
this.emit('connect', connection);
|
206
|
+
};
|
207
|
+
|
208
|
+
WebSocketServer.prototype.handleConnectionClose = function(connection, closeReason, description) {
|
209
|
+
var index = this.connections.indexOf(connection);
|
210
|
+
if (index !== -1) {
|
211
|
+
this.connections.splice(index, 1);
|
212
|
+
}
|
213
|
+
this.emit('close', connection, closeReason, description);
|
214
|
+
};
|
215
|
+
|
216
|
+
module.exports = WebSocketServer;
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module.exports = {
|
2
|
+
"server" : require('./WebSocketServer'),
|
3
|
+
"client" : require('./WebSocketClient'),
|
4
|
+
"router" : require('./WebSocketRouter'),
|
5
|
+
"frame" : require('./WebSocketFrame'),
|
6
|
+
"request" : require('./WebSocketRequest'),
|
7
|
+
"connection" : require('./WebSocketConnection'),
|
8
|
+
"constants" : require('./Constants'),
|
9
|
+
"deprecation": require('./Deprecation'),
|
10
|
+
"version" : "1.0.8"
|
11
|
+
};
|