websocket-rails-js 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/.gitignore +19 -0
- data/Gemfile +11 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +13 -0
- data/Rakefile +36 -0
- data/app/assets/javascripts/websocket_rails/abstract_connection.js.coffee +45 -0
- data/app/assets/javascripts/websocket_rails/channel.js.coffee +66 -0
- data/app/assets/javascripts/websocket_rails/connection.js.coffee +62 -0
- data/app/assets/javascripts/websocket_rails/event.js.coffee +43 -0
- data/app/assets/javascripts/websocket_rails/http_connection.js.coffee +56 -0
- data/app/assets/javascripts/websocket_rails/main.js +6 -0
- data/app/assets/javascripts/websocket_rails/websocket_connection.js.coffee +29 -0
- data/app/assets/javascripts/websocket_rails/websocket_rails.js.coffee +148 -0
- data/lib/websocket-rails-js.rb +1 -0
- data/lib/websocket_rails/js/engine.rb +8 -0
- data/lib/websocket_rails/js/version.rb +5 -0
- data/spec/javascripts/helpers/.gitkeep +0 -0
- data/spec/javascripts/helpers/helpers.coffee +7 -0
- data/spec/javascripts/support/jasmine.yml +139 -0
- data/spec/javascripts/support/jasmine_helper.rb +15 -0
- data/spec/javascripts/support/jquery.min.js +4 -0
- data/spec/javascripts/support/sinon-1.7.1.js +4343 -0
- data/spec/javascripts/websocket_rails/channel_spec.js.coffee +99 -0
- data/spec/javascripts/websocket_rails/connection_spec.js.coffee +136 -0
- data/spec/javascripts/websocket_rails/event_spec.js.coffee +70 -0
- data/spec/javascripts/websocket_rails/helpers.js.coffee +7 -0
- data/spec/javascripts/websocket_rails/websocket_rails_spec.js.coffee +233 -0
- data/src/websocket_rails/abstract_connection.js +71 -0
- data/src/websocket_rails/channel.js +133 -0
- data/src/websocket_rails/connection.js +91 -0
- data/src/websocket_rails/event.js +66 -0
- data/src/websocket_rails/http_connection.js +97 -0
- data/src/websocket_rails/websocket_connection.js +59 -0
- data/src/websocket_rails/websocket_rails.js +218 -0
- data/websocket-rails-js.gemspec +25 -0
- data/websocket_rails.0.0.1.min.js +1 -0
- metadata +135 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
/*
|
3
|
+
WebSocket Interface for the WebSocketRails client.
|
4
|
+
*/
|
5
|
+
|
6
|
+
(function() {
|
7
|
+
var __hasProp = {}.hasOwnProperty,
|
8
|
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
9
|
+
|
10
|
+
WebSocketRails.WebSocketConnection = (function(_super) {
|
11
|
+
__extends(WebSocketConnection, _super);
|
12
|
+
|
13
|
+
WebSocketConnection.prototype.connection_type = 'websocket';
|
14
|
+
|
15
|
+
function WebSocketConnection(url, dispatcher) {
|
16
|
+
this.url = url;
|
17
|
+
this.dispatcher = dispatcher;
|
18
|
+
WebSocketConnection.__super__.constructor.apply(this, arguments);
|
19
|
+
if (this.url.match(/^wss?:\/\//)) {
|
20
|
+
console.log("WARNING: Using connection urls with protocol specified is depricated");
|
21
|
+
} else if (window.location.protocol === 'https:') {
|
22
|
+
this.url = "wss://" + this.url;
|
23
|
+
} else {
|
24
|
+
this.url = "ws://" + this.url;
|
25
|
+
}
|
26
|
+
this._conn = new WebSocket(this.url);
|
27
|
+
this._conn.onmessage = (function(_this) {
|
28
|
+
return function(event) {
|
29
|
+
var event_data;
|
30
|
+
event_data = JSON.parse(event.data);
|
31
|
+
return _this.on_message(event_data);
|
32
|
+
};
|
33
|
+
})(this);
|
34
|
+
this._conn.onclose = (function(_this) {
|
35
|
+
return function(event) {
|
36
|
+
return _this.on_close(event);
|
37
|
+
};
|
38
|
+
})(this);
|
39
|
+
this._conn.onerror = (function(_this) {
|
40
|
+
return function(event) {
|
41
|
+
return _this.on_error(event);
|
42
|
+
};
|
43
|
+
})(this);
|
44
|
+
}
|
45
|
+
|
46
|
+
WebSocketConnection.prototype.close = function() {
|
47
|
+
return this._conn.close();
|
48
|
+
};
|
49
|
+
|
50
|
+
WebSocketConnection.prototype.send_event = function(event) {
|
51
|
+
WebSocketConnection.__super__.send_event.apply(this, arguments);
|
52
|
+
return this._conn.send(event.serialize());
|
53
|
+
};
|
54
|
+
|
55
|
+
return WebSocketConnection;
|
56
|
+
|
57
|
+
})(WebSocketRails.AbstractConnection);
|
58
|
+
|
59
|
+
}).call(this);
|
@@ -0,0 +1,218 @@
|
|
1
|
+
|
2
|
+
/*
|
3
|
+
WebsocketRails JavaScript Client
|
4
|
+
|
5
|
+
Setting up the dispatcher:
|
6
|
+
var dispatcher = new WebSocketRails('localhost:3000/websocket');
|
7
|
+
dispatcher.on_open = function() {
|
8
|
+
// trigger a server event immediately after opening connection
|
9
|
+
dispatcher.trigger('new_user',{user_name: 'guest'});
|
10
|
+
})
|
11
|
+
|
12
|
+
Triggering a new event on the server
|
13
|
+
dispatcherer.trigger('event_name',object_to_be_serialized_to_json);
|
14
|
+
|
15
|
+
Listening for new events from the server
|
16
|
+
dispatcher.bind('event_name', function(data) {
|
17
|
+
console.log(data.user_name);
|
18
|
+
});
|
19
|
+
|
20
|
+
Stop listening for new events from the server
|
21
|
+
dispatcher.unbind('event')
|
22
|
+
*/
|
23
|
+
|
24
|
+
(function() {
|
25
|
+
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
26
|
+
|
27
|
+
this.WebSocketRails = (function() {
|
28
|
+
function WebSocketRails(url, use_websockets) {
|
29
|
+
this.url = url;
|
30
|
+
this.use_websockets = use_websockets != null ? use_websockets : true;
|
31
|
+
this.connection_stale = __bind(this.connection_stale, this);
|
32
|
+
this.supports_websockets = __bind(this.supports_websockets, this);
|
33
|
+
this.dispatch_channel = __bind(this.dispatch_channel, this);
|
34
|
+
this.unsubscribe = __bind(this.unsubscribe, this);
|
35
|
+
this.subscribe_private = __bind(this.subscribe_private, this);
|
36
|
+
this.subscribe = __bind(this.subscribe, this);
|
37
|
+
this.dispatch = __bind(this.dispatch, this);
|
38
|
+
this.trigger_event = __bind(this.trigger_event, this);
|
39
|
+
this.trigger = __bind(this.trigger, this);
|
40
|
+
this.bind = __bind(this.bind, this);
|
41
|
+
this.connection_established = __bind(this.connection_established, this);
|
42
|
+
this.new_message = __bind(this.new_message, this);
|
43
|
+
this.reconnect = __bind(this.reconnect, this);
|
44
|
+
this.callbacks = {};
|
45
|
+
this.channels = {};
|
46
|
+
this.queue = {};
|
47
|
+
this.connect();
|
48
|
+
}
|
49
|
+
|
50
|
+
WebSocketRails.prototype.connect = function() {
|
51
|
+
this.state = 'connecting';
|
52
|
+
if (!(this.supports_websockets() && this.use_websockets)) {
|
53
|
+
this._conn = new WebSocketRails.HttpConnection(this.url, this);
|
54
|
+
} else {
|
55
|
+
this._conn = new WebSocketRails.WebSocketConnection(this.url, this);
|
56
|
+
}
|
57
|
+
return this._conn.new_message = this.new_message;
|
58
|
+
};
|
59
|
+
|
60
|
+
WebSocketRails.prototype.disconnect = function() {
|
61
|
+
if (this._conn) {
|
62
|
+
this._conn.close();
|
63
|
+
delete this._conn._conn;
|
64
|
+
delete this._conn;
|
65
|
+
}
|
66
|
+
return this.state = 'disconnected';
|
67
|
+
};
|
68
|
+
|
69
|
+
WebSocketRails.prototype.reconnect = function() {
|
70
|
+
var event, id, old_connection_id, _ref, _ref1;
|
71
|
+
old_connection_id = (_ref = this._conn) != null ? _ref.connection_id : void 0;
|
72
|
+
this.disconnect();
|
73
|
+
this.connect();
|
74
|
+
_ref1 = this.queue;
|
75
|
+
for (id in _ref1) {
|
76
|
+
event = _ref1[id];
|
77
|
+
if (event.connection_id === old_connection_id && !event.is_result()) {
|
78
|
+
this.trigger_event(event);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
return this.reconnect_channels();
|
82
|
+
};
|
83
|
+
|
84
|
+
WebSocketRails.prototype.new_message = function(data) {
|
85
|
+
var event, _ref;
|
86
|
+
event = new WebSocketRails.Event(data);
|
87
|
+
if (event.is_result()) {
|
88
|
+
if ((_ref = this.queue[event.id]) != null) {
|
89
|
+
_ref.run_callbacks(event.success, event.data);
|
90
|
+
}
|
91
|
+
this.queue[event.id] = null;
|
92
|
+
} else if (event.is_channel()) {
|
93
|
+
this.dispatch_channel(event);
|
94
|
+
} else {
|
95
|
+
this.dispatch(event);
|
96
|
+
}
|
97
|
+
if (this.state === 'connecting' && event.name === 'client_connected') {
|
98
|
+
return this.connection_established(event);
|
99
|
+
}
|
100
|
+
};
|
101
|
+
|
102
|
+
WebSocketRails.prototype.connection_established = function(event) {
|
103
|
+
this.state = 'connected';
|
104
|
+
this._conn.setConnectionId(event.connection_id);
|
105
|
+
this._conn.flush_queue();
|
106
|
+
if (this.on_open != null) {
|
107
|
+
return this.on_open(event.data);
|
108
|
+
}
|
109
|
+
};
|
110
|
+
|
111
|
+
WebSocketRails.prototype.bind = function(event_name, callback) {
|
112
|
+
var _base;
|
113
|
+
if ((_base = this.callbacks)[event_name] == null) {
|
114
|
+
_base[event_name] = [];
|
115
|
+
}
|
116
|
+
return this.callbacks[event_name].push(callback);
|
117
|
+
};
|
118
|
+
|
119
|
+
WebSocketRails.prototype.trigger = function(event_name, data, success_callback, failure_callback) {
|
120
|
+
var event;
|
121
|
+
event = new WebSocketRails.Event([
|
122
|
+
event_name, data, {
|
123
|
+
connection_id: this.connection_id
|
124
|
+
}
|
125
|
+
], success_callback, failure_callback);
|
126
|
+
this.queue[event.id] = event;
|
127
|
+
return this._conn.trigger(event);
|
128
|
+
};
|
129
|
+
|
130
|
+
WebSocketRails.prototype.trigger_event = function(event) {
|
131
|
+
var _base, _name;
|
132
|
+
if ((_base = this.queue)[_name = event.id] == null) {
|
133
|
+
_base[_name] = event;
|
134
|
+
}
|
135
|
+
this._conn.trigger(event);
|
136
|
+
return event;
|
137
|
+
};
|
138
|
+
|
139
|
+
WebSocketRails.prototype.dispatch = function(event) {
|
140
|
+
var callback, _i, _len, _ref, _results;
|
141
|
+
if (this.callbacks[event.name] == null) {
|
142
|
+
return;
|
143
|
+
}
|
144
|
+
_ref = this.callbacks[event.name];
|
145
|
+
_results = [];
|
146
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
147
|
+
callback = _ref[_i];
|
148
|
+
_results.push(callback(event.data));
|
149
|
+
}
|
150
|
+
return _results;
|
151
|
+
};
|
152
|
+
|
153
|
+
WebSocketRails.prototype.subscribe = function(channel_name, success_callback, failure_callback) {
|
154
|
+
var channel;
|
155
|
+
if (this.channels[channel_name] == null) {
|
156
|
+
channel = new WebSocketRails.Channel(channel_name, this, false, success_callback, failure_callback);
|
157
|
+
this.channels[channel_name] = channel;
|
158
|
+
return channel;
|
159
|
+
} else {
|
160
|
+
return this.channels[channel_name];
|
161
|
+
}
|
162
|
+
};
|
163
|
+
|
164
|
+
WebSocketRails.prototype.subscribe_private = function(channel_name, success_callback, failure_callback) {
|
165
|
+
var channel;
|
166
|
+
if (this.channels[channel_name] == null) {
|
167
|
+
channel = new WebSocketRails.Channel(channel_name, this, true, success_callback, failure_callback);
|
168
|
+
this.channels[channel_name] = channel;
|
169
|
+
return channel;
|
170
|
+
} else {
|
171
|
+
return this.channels[channel_name];
|
172
|
+
}
|
173
|
+
};
|
174
|
+
|
175
|
+
WebSocketRails.prototype.unsubscribe = function(channel_name) {
|
176
|
+
if (this.channels[channel_name] == null) {
|
177
|
+
return;
|
178
|
+
}
|
179
|
+
this.channels[channel_name].destroy();
|
180
|
+
return delete this.channels[channel_name];
|
181
|
+
};
|
182
|
+
|
183
|
+
WebSocketRails.prototype.dispatch_channel = function(event) {
|
184
|
+
if (this.channels[event.channel] == null) {
|
185
|
+
return;
|
186
|
+
}
|
187
|
+
return this.channels[event.channel].dispatch(event.name, event.data);
|
188
|
+
};
|
189
|
+
|
190
|
+
WebSocketRails.prototype.supports_websockets = function() {
|
191
|
+
return typeof WebSocket === "function" || typeof WebSocket === "object";
|
192
|
+
};
|
193
|
+
|
194
|
+
WebSocketRails.prototype.connection_stale = function() {
|
195
|
+
return this.state !== 'connected';
|
196
|
+
};
|
197
|
+
|
198
|
+
WebSocketRails.prototype.reconnect_channels = function() {
|
199
|
+
var callbacks, channel, name, _ref, _results;
|
200
|
+
_ref = this.channels;
|
201
|
+
_results = [];
|
202
|
+
for (name in _ref) {
|
203
|
+
channel = _ref[name];
|
204
|
+
callbacks = channel._callbacks;
|
205
|
+
channel.destroy();
|
206
|
+
delete this.channels[name];
|
207
|
+
channel = channel.is_private ? this.subscribe_private(name) : this.subscribe(name);
|
208
|
+
channel._callbacks = callbacks;
|
209
|
+
_results.push(channel);
|
210
|
+
}
|
211
|
+
return _results;
|
212
|
+
};
|
213
|
+
|
214
|
+
return WebSocketRails;
|
215
|
+
|
216
|
+
})();
|
217
|
+
|
218
|
+
}).call(this);
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'websocket_rails/js/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "websocket-rails-js"
|
8
|
+
spec.version = WebsocketRails::Js::VERSION
|
9
|
+
spec.authors = ["Dan Knox", "Rory Low"]
|
10
|
+
spec.email = ["dknox@threedotloft.com"]
|
11
|
+
spec.summary = %q{JavaScript client for websocket-rails.}
|
12
|
+
spec.description = %q{JavaScript client for websocket-rails.}
|
13
|
+
spec.homepage = "http://websocket-rails.github.io"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "rails"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
(function(){var __bind=function(fn,me){return function(){return fn.apply(me,arguments)}};this.WebSocketRails=function(){function WebSocketRails(url,use_websockets){this.url=url,this.use_websockets=null!=use_websockets?use_websockets:!0,this.connection_stale=__bind(this.connection_stale,this),this.pong=__bind(this.pong,this),this.supports_websockets=__bind(this.supports_websockets,this),this.dispatch_channel=__bind(this.dispatch_channel,this),this.unsubscribe=__bind(this.unsubscribe,this),this.subscribe_private=__bind(this.subscribe_private,this),this.subscribe=__bind(this.subscribe,this),this.dispatch=__bind(this.dispatch,this),this.trigger_event=__bind(this.trigger_event,this),this.trigger=__bind(this.trigger,this),this.unbind=__bind(this.unbind,this),this.bind=__bind(this.bind,this),this.connection_established=__bind(this.connection_established,this),this.new_message=__bind(this.new_message,this),this.reconnect=__bind(this.reconnect,this),this.callbacks={},this.channels={},this.queue={},this.connect()}return WebSocketRails.prototype.connect=function(){return this.state="connecting",this._conn=this.supports_websockets()&&this.use_websockets?new WebSocketRails.WebSocketConnection(this.url,this):new WebSocketRails.HttpConnection(this.url,this),this._conn.new_message=this.new_message},WebSocketRails.prototype.disconnect=function(){return this._conn&&(this._conn.close(),delete this._conn._conn,delete this._conn),this.state="disconnected"},WebSocketRails.prototype.reconnect=function(){var event,id,old_connection_id,_ref,_ref1;old_connection_id=null!=(_ref=this._conn)?_ref.connection_id:void 0,this.disconnect(),this.connect(),_ref1=this.queue;for(id in _ref1)event=_ref1[id],event.connection_id!==old_connection_id||event.is_result()||this.trigger_event(event);return this.reconnect_channels()},WebSocketRails.prototype.new_message=function(data){var event,socket_message,_i,_len,_ref,_results;for(_results=[],_i=0,_len=data.length;_len>_i;_i++)socket_message=data[_i],event=new WebSocketRails.Event(socket_message),event.is_result()?(null!=(_ref=this.queue[event.id])&&_ref.run_callbacks(event.success,event.data),delete this.queue[event.id]):event.is_channel()?this.dispatch_channel(event):event.is_ping()?this.pong():this.dispatch(event),_results.push("connecting"===this.state&&"client_connected"===event.name?this.connection_established(event.data):void 0);return _results},WebSocketRails.prototype.connection_established=function(data){return this.state="connected",this._conn.setConnectionId(data.connection_id),this._conn.flush_queue(),null!=this.on_open?this.on_open(data):void 0},WebSocketRails.prototype.bind=function(event_name,callback){var _base;return null==(_base=this.callbacks)[event_name]&&(_base[event_name]=[]),this.callbacks[event_name].push(callback)},WebSocketRails.prototype.unbind=function(event_name){return delete this.callbacks[event_name]},WebSocketRails.prototype.trigger=function(event_name,data,success_callback,failure_callback){var event,_ref;return event=new WebSocketRails.Event([event_name,data,null!=(_ref=this._conn)?_ref.connection_id:void 0],success_callback,failure_callback),this.trigger_event(event)},WebSocketRails.prototype.trigger_event=function(event){var _base,_name;return null==(_base=this.queue)[_name=event.id]&&(_base[_name]=event),this._conn&&this._conn.trigger(event),event},WebSocketRails.prototype.dispatch=function(event){var callback,_i,_len,_ref,_results;if(null!=this.callbacks[event.name]){for(_ref=this.callbacks[event.name],_results=[],_i=0,_len=_ref.length;_len>_i;_i++)callback=_ref[_i],_results.push(callback(event.data));return _results}},WebSocketRails.prototype.subscribe=function(channel_name,success_callback,failure_callback){var channel;return null==this.channels[channel_name]?(channel=new WebSocketRails.Channel(channel_name,this,!1,success_callback,failure_callback),this.channels[channel_name]=channel,channel):this.channels[channel_name]},WebSocketRails.prototype.subscribe_private=function(channel_name,success_callback,failure_callback){var channel;return null==this.channels[channel_name]?(channel=new WebSocketRails.Channel(channel_name,this,!0,success_callback,failure_callback),this.channels[channel_name]=channel,channel):this.channels[channel_name]},WebSocketRails.prototype.unsubscribe=function(channel_name){return null!=this.channels[channel_name]?(this.channels[channel_name].destroy(),delete this.channels[channel_name]):void 0},WebSocketRails.prototype.dispatch_channel=function(event){return null!=this.channels[event.channel]?this.channels[event.channel].dispatch(event.name,event.data):void 0},WebSocketRails.prototype.supports_websockets=function(){return"function"==typeof WebSocket||"object"==typeof WebSocket},WebSocketRails.prototype.pong=function(){var pong,_ref;return pong=new WebSocketRails.Event(["websocket_rails.pong",{},null!=(_ref=this._conn)?_ref.connection_id:void 0]),this._conn.trigger(pong)},WebSocketRails.prototype.connection_stale=function(){return"connected"!==this.state},WebSocketRails.prototype.reconnect_channels=function(){var callbacks,channel,name,_ref,_results;_ref=this.channels,_results=[];for(name in _ref)channel=_ref[name],callbacks=channel._callbacks,channel.destroy(),delete this.channels[name],channel=channel.is_private?this.subscribe_private(name):this.subscribe(name),channel._callbacks=callbacks,_results.push(channel);return _results},WebSocketRails}()}).call(this),function(){WebSocketRails.Event=function(){function Event(data,success_callback,failure_callback){var attr;this.success_callback=success_callback,this.failure_callback=failure_callback,this.name=data[0],attr=data[1],null!=attr&&(this.id=null!=attr.id?attr.id:65536*(1+Math.random())|0,this.channel=null!=attr.channel?attr.channel:void 0,this.data=null!=attr.data?attr.data:attr,this.token=null!=attr.token?attr.token:void 0,this.connection_id=data[2],null!=attr.success&&(this.result=!0,this.success=attr.success))}return Event.prototype.is_channel=function(){return null!=this.channel},Event.prototype.is_result=function(){return"undefined"!=typeof this.result},Event.prototype.is_ping=function(){return"websocket_rails.ping"===this.name},Event.prototype.serialize=function(){return JSON.stringify([this.name,this.attributes()])},Event.prototype.attributes=function(){return{id:this.id,channel:this.channel,data:this.data,token:this.token}},Event.prototype.run_callbacks=function(success,result){return this.success=success,this.result=result,this.success===!0?"function"==typeof this.success_callback?this.success_callback(this.result):void 0:"function"==typeof this.failure_callback?this.failure_callback(this.result):void 0},Event}()}.call(this),function(){WebSocketRails.AbstractConnection=function(){function AbstractConnection(url,dispatcher){this.dispatcher=dispatcher,this.message_queue=[]}return AbstractConnection.prototype.close=function(){},AbstractConnection.prototype.trigger=function(event){return"connected"!==this.dispatcher.state?this.message_queue.push(event):this.send_event(event)},AbstractConnection.prototype.send_event=function(event){return null!=this.connection_id?event.connection_id=this.connection_id:void 0},AbstractConnection.prototype.on_close=function(event){var close_event;return this.dispatcher&&this.dispatcher._conn===this?(close_event=new WebSocketRails.Event(["connection_closed",event]),this.dispatcher.state="disconnected",this.dispatcher.dispatch(close_event)):void 0},AbstractConnection.prototype.on_error=function(event){var error_event;return this.dispatcher&&this.dispatcher._conn===this?(error_event=new WebSocketRails.Event(["connection_error",event]),this.dispatcher.state="disconnected",this.dispatcher.dispatch(error_event)):void 0},AbstractConnection.prototype.on_message=function(event_data){return this.dispatcher&&this.dispatcher._conn===this?this.dispatcher.new_message(event_data):void 0},AbstractConnection.prototype.setConnectionId=function(connection_id){this.connection_id=connection_id},AbstractConnection.prototype.flush_queue=function(){var event,_i,_len,_ref;for(_ref=this.message_queue,_i=0,_len=_ref.length;_len>_i;_i++)event=_ref[_i],this.trigger(event);return this.message_queue=[]},AbstractConnection}()}.call(this),function(){var __hasProp={}.hasOwnProperty,__extends=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)__hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child};WebSocketRails.WebSocketConnection=function(_super){function WebSocketConnection(url,dispatcher){this.url=url,this.dispatcher=dispatcher,WebSocketConnection.__super__.constructor.apply(this,arguments),this.url.match(/^wss?:\/\//)?console.log("WARNING: Using connection urls with protocol specified is depricated"):this.url="https:"===window.location.protocol?"wss://"+this.url:"ws://"+this.url,this._conn=new WebSocket(this.url),this._conn.onmessage=function(_this){return function(event){var event_data;return event_data=JSON.parse(event.data),_this.on_message(event_data)}}(this),this._conn.onclose=function(_this){return function(event){return _this.on_close(event)}}(this),this._conn.onerror=function(_this){return function(event){return _this.on_error(event)}}(this)}return __extends(WebSocketConnection,_super),WebSocketConnection.prototype.connection_type="websocket",WebSocketConnection.prototype.close=function(){return this._conn.close()},WebSocketConnection.prototype.send_event=function(event){return WebSocketConnection.__super__.send_event.apply(this,arguments),this._conn.send(event.serialize())},WebSocketConnection}(WebSocketRails.AbstractConnection)}.call(this),function(){var __bind=function(fn,me){return function(){return fn.apply(me,arguments)}};WebSocketRails.Channel=function(){function Channel(name,_dispatcher,is_private,on_success,on_failure){var event,event_name,_ref;this.name=name,this._dispatcher=_dispatcher,this.is_private=null!=is_private?is_private:!1,this.on_success=on_success,this.on_failure=on_failure,this._failure_launcher=__bind(this._failure_launcher,this),this._success_launcher=__bind(this._success_launcher,this),this._callbacks={},this._token=void 0,this._queue=[],event_name=this.is_private?"websocket_rails.subscribe_private":"websocket_rails.subscribe",this.connection_id=null!=(_ref=this._dispatcher._conn)?_ref.connection_id:void 0,event=new WebSocketRails.Event([event_name,{data:{channel:this.name}},this.connection_id],this._success_launcher,this._failure_launcher),this._dispatcher.trigger_event(event)}return Channel.prototype.destroy=function(){var event,event_name,_ref;return this.connection_id===(null!=(_ref=this._dispatcher._conn)?_ref.connection_id:void 0)&&(event_name="websocket_rails.unsubscribe",event=new WebSocketRails.Event([event_name,{data:{channel:this.name}},this.connection_id]),this._dispatcher.trigger_event(event)),this._callbacks={}},Channel.prototype.bind=function(event_name,callback){var _base;return null==(_base=this._callbacks)[event_name]&&(_base[event_name]=[]),this._callbacks[event_name].push(callback)},Channel.prototype.unbind=function(event_name){return delete this._callbacks[event_name]},Channel.prototype.trigger=function(event_name,message){var event;return event=new WebSocketRails.Event([event_name,{channel:this.name,data:message,token:this._token},this.connection_id]),this._token?this._dispatcher.trigger_event(event):this._queue.push(event)},Channel.prototype.dispatch=function(event_name,message){var callback,_i,_len,_ref,_ref1,_results;if("websocket_rails.channel_token"===event_name)return this.connection_id=null!=(_ref=this._dispatcher._conn)?_ref.connection_id:void 0,this._token=message.token,this.flush_queue();if(null!=this._callbacks[event_name]){for(_ref1=this._callbacks[event_name],_results=[],_i=0,_len=_ref1.length;_len>_i;_i++)callback=_ref1[_i],_results.push(callback(message));return _results}},Channel.prototype._success_launcher=function(data){return null!=this.on_success?this.on_success(data):void 0},Channel.prototype._failure_launcher=function(data){return null!=this.on_failure?this.on_failure(data):void 0},Channel.prototype.flush_queue=function(){var event,_i,_len,_ref;for(_ref=this._queue,_i=0,_len=_ref.length;_len>_i;_i++)event=_ref[_i],this._dispatcher.trigger_event(event);return this._queue=[]},Channel}()}.call(this);
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: websocket-rails-js
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dan Knox
|
8
|
+
- Rory Low
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-12-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: bundler
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.5'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.5'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rake
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
description: JavaScript client for websocket-rails.
|
57
|
+
email:
|
58
|
+
- dknox@threedotloft.com
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- Gemfile
|
65
|
+
- Guardfile
|
66
|
+
- LICENSE.txt
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- app/assets/javascripts/websocket_rails/abstract_connection.js.coffee
|
70
|
+
- app/assets/javascripts/websocket_rails/channel.js.coffee
|
71
|
+
- app/assets/javascripts/websocket_rails/connection.js.coffee
|
72
|
+
- app/assets/javascripts/websocket_rails/event.js.coffee
|
73
|
+
- app/assets/javascripts/websocket_rails/http_connection.js.coffee
|
74
|
+
- app/assets/javascripts/websocket_rails/main.js
|
75
|
+
- app/assets/javascripts/websocket_rails/websocket_connection.js.coffee
|
76
|
+
- app/assets/javascripts/websocket_rails/websocket_rails.js.coffee
|
77
|
+
- lib/websocket-rails-js.rb
|
78
|
+
- lib/websocket_rails/js/engine.rb
|
79
|
+
- lib/websocket_rails/js/version.rb
|
80
|
+
- spec/javascripts/helpers/.gitkeep
|
81
|
+
- spec/javascripts/helpers/helpers.coffee
|
82
|
+
- spec/javascripts/support/jasmine.yml
|
83
|
+
- spec/javascripts/support/jasmine_helper.rb
|
84
|
+
- spec/javascripts/support/jquery.min.js
|
85
|
+
- spec/javascripts/support/sinon-1.7.1.js
|
86
|
+
- spec/javascripts/websocket_rails/channel_spec.js.coffee
|
87
|
+
- spec/javascripts/websocket_rails/connection_spec.js.coffee
|
88
|
+
- spec/javascripts/websocket_rails/event_spec.js.coffee
|
89
|
+
- spec/javascripts/websocket_rails/helpers.js.coffee
|
90
|
+
- spec/javascripts/websocket_rails/websocket_rails_spec.js.coffee
|
91
|
+
- src/websocket_rails/abstract_connection.js
|
92
|
+
- src/websocket_rails/channel.js
|
93
|
+
- src/websocket_rails/connection.js
|
94
|
+
- src/websocket_rails/event.js
|
95
|
+
- src/websocket_rails/http_connection.js
|
96
|
+
- src/websocket_rails/websocket_connection.js
|
97
|
+
- src/websocket_rails/websocket_rails.js
|
98
|
+
- websocket-rails-js.gemspec
|
99
|
+
- websocket_rails.0.0.1.min.js
|
100
|
+
homepage: http://websocket-rails.github.io
|
101
|
+
licenses:
|
102
|
+
- MIT
|
103
|
+
metadata: {}
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.2.2
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: JavaScript client for websocket-rails.
|
124
|
+
test_files:
|
125
|
+
- spec/javascripts/helpers/.gitkeep
|
126
|
+
- spec/javascripts/helpers/helpers.coffee
|
127
|
+
- spec/javascripts/support/jasmine.yml
|
128
|
+
- spec/javascripts/support/jasmine_helper.rb
|
129
|
+
- spec/javascripts/support/jquery.min.js
|
130
|
+
- spec/javascripts/support/sinon-1.7.1.js
|
131
|
+
- spec/javascripts/websocket_rails/channel_spec.js.coffee
|
132
|
+
- spec/javascripts/websocket_rails/connection_spec.js.coffee
|
133
|
+
- spec/javascripts/websocket_rails/event_spec.js.coffee
|
134
|
+
- spec/javascripts/websocket_rails/helpers.js.coffee
|
135
|
+
- spec/javascripts/websocket_rails/websocket_rails_spec.js.coffee
|