sinatra-rocketio-linda 0.0.7 → 0.0.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 078d94db2541cb4f0725832183ea614aaedd0b04
4
- data.tar.gz: 818d263f79220681155b57bb1406f94165b1c9bd
3
+ metadata.gz: 4a21d349cf79dd595121baad063de1ef33c8b957
4
+ data.tar.gz: d46fa4cb8f29feae458c0d9df8fae976b89cb5b2
5
5
  SHA512:
6
- metadata.gz: 42405ce2bd52ebd099b8c3282a9e63263a758275d99aea15b45188e2f9087f3da3955d4526c230626b16edf80dd882982c587bb372702340bafe0034f865b983
7
- data.tar.gz: e6e7c83e110f747536ae8687961bc5d890f18b5c79405b2b070a864d90492e7aebfa6295293ecaee487b38fb123ca09d07e2e19755cc9c8de82fe25792892280
6
+ metadata.gz: 7395d4341d8a46eb373e0757ed0397e07f08b53245bcf2e178a8fbb26c0f83a262d0c8daeb4e2350d1154ae28df3d3bf9ad449bf9481b729763cfb542f38bf27
7
+ data.tar.gz: 70ffc23c4d8b74555547a99fdbb91e7e85e4828cd56a72928a47942364fe13a61fe09dbe85d5de7207435349dab47fb2d28d3c4cf418f442404edd1a869527ca
@@ -0,0 +1,4 @@
1
+ // Linda.js v<%= Sinatra::RocketIO::Linda::VERSION %> (rocketio v<%= Sinatra::RocketIO::VERSION %>)
2
+ // https://github.com/shokai/sinatra-rocketio-linda
3
+ // (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
4
+ // The MIT License
@@ -1,3 +1,7 @@
1
+ === 0.0.8 2013-05-27
2
+
3
+ * generate JS lib for browser
4
+
1
5
  === 0.0.7 2013-05-24
2
6
 
3
7
  * add function Sinatra::RocketIO::Linda::Client#wait
data/README.md CHANGED
@@ -147,6 +147,43 @@ linda.wait
147
147
  ```
148
148
 
149
149
 
150
+ JavaScript Lib for browser
151
+ --------------------------
152
+
153
+ ### Download
154
+
155
+ - [linda.js](https://raw.github.com/shokai/sinatra-rocketio-linda/master/linda.js)
156
+ - [linda.min.js](https://raw.github.com/shokai/sinatra-rocketio-linda/master/linda.min.js)
157
+
158
+
159
+ ### Usage
160
+
161
+ ```html
162
+ <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
163
+ <script src="/linda.min.js"></script>
164
+ ```
165
+ ```javascript
166
+ var io = new RocketIO().connect("http://example.com");
167
+ var linda = new Linda(io);
168
+
169
+ var ts = new linda.TupleSpace("calc");
170
+
171
+ io.on("connect", function(){
172
+ alert(io.type + " connect!! " + io.session);
173
+ ts.write([1, 2, 3]);
174
+ });
175
+ ```
176
+
177
+ ### Generate JS Lib
178
+
179
+ % npm install -g uglify-js
180
+ % gem install bundler
181
+ % bundle install
182
+ % rake jslib
183
+
184
+ => linda.js and linda.min.js
185
+
186
+
150
187
  Test
151
188
  ----
152
189
 
data/Rakefile CHANGED
@@ -5,6 +5,35 @@ Rake::TestTask.new do |t|
5
5
  t.pattern = "test/test_*.rb"
6
6
  end
7
7
 
8
+ desc "generate JavaScript lib for browser"
9
+ task :jslib do
10
+ dest = "linda.js"
11
+ dest_min = "linda.min.js"
12
+
13
+ require "rubygems"
14
+ require "sinatra/websocketio"
15
+ require "sinatra/cometio"
16
+ require "sinatra/rocketio"
17
+ require "sinatra/rocketio/linda"
18
+ require "erb"
19
+
20
+ websocketio_url = nil
21
+ cometio_url = nil
22
+ header = ERB.new(File.open(File.expand_path "HEADER.erb", File.dirname(__FILE__)).read).result(binding)
23
+ js = ERB.new(Sinatra::RocketIO::Linda.javascript).result(binding)
24
+
25
+ File.open(dest, "w+") do |f|
26
+ f.puts header
27
+ f.write js
28
+ end
29
+ puts " => #{dest}"
30
+ File.open(dest_min, "w+") do |f|
31
+ f.puts header
32
+ end
33
+ system "uglifyjs #{dest} >> #{dest_min}"
34
+ puts " => #{dest_min}"
35
+ end
36
+
8
37
  desc "Start test server"
9
38
  task :test_server do
10
39
  require File.expand_path 'test/app', File.dirname(__FILE__)
@@ -3,7 +3,7 @@ module Sinatra
3
3
  module Linda
4
4
 
5
5
  def self.javascript(*js_file_names)
6
- js_file_names = ['rocketio.js', 'linda.js']
6
+ js_file_names = ['linda.js', 'rocketio.js']
7
7
  js = ''
8
8
  js_file_names.each do |i|
9
9
  js += case i
@@ -1,7 +1,7 @@
1
1
  module Sinatra
2
2
  module RocketIO
3
3
  module Linda
4
- VERSION = "0.0.7"
4
+ VERSION = "0.0.8"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,355 @@
1
+ // Linda.js v0.0.8 (rocketio v0.2.6)
2
+ // https://github.com/shokai/sinatra-rocketio-linda
3
+ // (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
4
+ // The MIT License
5
+ var Linda = function(io, opts){
6
+ var self = this;
7
+ this.io = null;
8
+ if(io === null || typeof io === "undefined"){
9
+ this.io = new RocketIO().connect();
10
+ }
11
+ else{
12
+ this.io = io;
13
+ }
14
+ this.opts = opts || {};
15
+ this.TupleSpace = function(name){
16
+ if(name === null || typeof name !== "string") name = "__default__";
17
+ this.name = name;
18
+ this.linda = self;
19
+ var space = this;
20
+ this.write = function(tuple, opts){
21
+ if(tuple === null || typeof tuple !== "object") return;
22
+ if(opts === null || typeof opts === "undefined") opts = {};
23
+ self.io.push("__linda_write", [space.name, tuple, opts]);
24
+ };
25
+ this.read = function(tuple, callback){
26
+ if(tuple === null || typeof tuple !== "object") return;
27
+ if(typeof callback !== "function") return;
28
+ var callback_id = new Date()-0+"";
29
+ self.io.once("__linda_read_callback_"+callback_id, callback);
30
+ self.io.push("__linda_read", [space.name, tuple, callback_id]);
31
+ };
32
+ this.take = function(tuple, callback){
33
+ if(tuple === null || typeof tuple !== "object") return;
34
+ if(typeof callback !== "function") return;
35
+ var callback_id = new Date()-0+"";
36
+ self.io.once("__linda_take_callback_"+callback_id, callback);
37
+ self.io.push("__linda_take", [space.name, tuple, callback_id]);
38
+ };
39
+ this.watch = function(tuple, callback){
40
+ if(tuple === null || typeof tuple !== "object") return;
41
+ if(typeof callback !== "function") return;
42
+ var callback_id = new Date()-0+"";
43
+ self.io.on("__linda_watch_callback_"+callback_id, callback);
44
+ self.io.push("__linda_watch", [space.name, tuple, callback_id]);
45
+ };
46
+ };
47
+ };
48
+
49
+ var RocketIO = function(opts){
50
+ new EventEmitter().apply(this);
51
+ if(typeof opts === "undefined" || opts === null) opts = {};
52
+ this.type = opts.type || null; // "comet" or "websocket"
53
+ this.session = opts.session || null;
54
+ this.channel = null;
55
+ if(typeof opts.channel !== "undefined" && opts.channel !== null){
56
+ this.channel = ""+opts.channel;
57
+ }
58
+ var setting = {};
59
+ this.io = null;
60
+ var self = this;
61
+ var ws_close_timer = null;
62
+ self.on("__connect", function(session_id){
63
+ self.session = session_id;
64
+ self.io.push("__channel_id", self.channel);
65
+ self.emit("connect");
66
+ });
67
+
68
+ this.connect = function(url){
69
+ if(typeof url === "string"){
70
+ $.getJSON(url+"/rocketio/settings", function(res){
71
+ setting = res;
72
+ connect_io();
73
+ });
74
+ return self;
75
+ }
76
+ else{
77
+ return connect_io();
78
+ }
79
+ };
80
+
81
+ var connect_io = function(){
82
+ self.io = function(){
83
+ if(self.type === "comet") return;
84
+ if(typeof WebSocketIO !== "function") return;
85
+ var io = new WebSocketIO();
86
+ if(typeof setting.websocket === "string") io.url = setting.websocket;
87
+ io.session = self.session;
88
+ return io.connect();
89
+ }() || function(){
90
+ if(typeof CometIO !== "function") return;
91
+ var io = new CometIO();
92
+ if(typeof setting.comet === "string") io.url = setting.comet;
93
+ io.session = self.session;
94
+ return io.connect();
95
+ }();
96
+ if(typeof self.io === "undefined"){
97
+ setTimeout(function(){
98
+ self.emit("error", "WebSocketIO and CometIO are not available");
99
+ }, 100);
100
+ return self;
101
+ };
102
+ if(self.io.url.match(/^ws:\/\/.+/)) self.type = "websocket";
103
+ else if(self.io.url.match(/cometio/)) self.type = "comet";
104
+ else self.type = "unknown";
105
+ self.io.on("*", function(event_name, args){
106
+ if(event_name === "connect") event_name = "__connect";
107
+ self.emit(event_name, args);
108
+ });
109
+ ws_close_timer = setTimeout(function(){
110
+ self.close();
111
+ self.type = "comet";
112
+ connect_io();
113
+ }, 3000);
114
+ self.once("connect", function(){
115
+ if(ws_close_timer) clearTimeout(ws_close_timer);
116
+ ws_close_timer = null;
117
+ });
118
+ return self;
119
+ };
120
+
121
+ this.close = function(){
122
+ self.io.close();
123
+ };
124
+
125
+ this.push = function(type, data){
126
+ self.io.push(type, data);
127
+ };
128
+ };
129
+
130
+ var CometIO = function(url, opts){
131
+ new EventEmitter().apply(this);
132
+ if(typeof opts === "undefined" || opts === null) opts = {};
133
+ this.url = url || "";
134
+ this.session = opts.session || null;
135
+ var running = false;
136
+ var self = this;
137
+ var post_queue = [];
138
+
139
+ var flush = function(){
140
+ if(!running || post_queue.length < 1) return;
141
+ var post_data = {
142
+ json: JSON.stringify({
143
+ session: self.session,
144
+ events: post_queue
145
+ })
146
+ };
147
+ $.ajax(
148
+ {
149
+ url : self.url,
150
+ data : post_data,
151
+ success : function(data){
152
+ },
153
+ error : function(req, stat, e){
154
+ self.emit("error", "CometIO push error");
155
+ },
156
+ complete : function(e){
157
+ },
158
+ type : "POST",
159
+ dataType : "json",
160
+ timeout : 10000
161
+ }
162
+ );
163
+ post_queue = [];
164
+ };
165
+ setInterval(flush, 1000);
166
+
167
+ this.push = function(type, data){
168
+ if(!running || !self.session){
169
+ self.emit("error", "CometIO not connected");
170
+ return;
171
+ }
172
+ post_queue.push({type: type, data: data})
173
+ };
174
+
175
+ this.connect = function(){
176
+ if(running) return self;
177
+ self.on("__session_id", function(session){
178
+ self.session = session;
179
+ self.emit("connect", self.session);
180
+ });
181
+ running = true;
182
+ get();
183
+ return self;
184
+ };
185
+
186
+ this.close = function(){
187
+ running = false;
188
+ self.removeListener("__session_id");
189
+ };
190
+
191
+ var get = function(){
192
+ if(!running) return;
193
+ $.ajax(
194
+ {
195
+ url : self.url,
196
+ data : {session : self.session},
197
+ success : function(data_arr){
198
+ if(data_arr !== null && typeof data_arr == "object" && !!data_arr.length){
199
+ for(var i = 0; i < data_arr.length; i++){
200
+ var data = data_arr[i];
201
+ if(data) self.emit(data.type, data.data);
202
+ }
203
+ }
204
+ get();
205
+ },
206
+ error : function(req, stat, e){
207
+ self.emit("error", "CometIO get error");
208
+ setTimeout(get, 10000);
209
+ },
210
+ complete : function(e){
211
+ },
212
+ type : "GET",
213
+ dataType : "json",
214
+ timeout : 130000
215
+ }
216
+ );
217
+ };
218
+ };
219
+
220
+ var WebSocketIO = function(url, opts){
221
+ new EventEmitter().apply(this);
222
+ if(typeof opts === "undefined" || opts === null) opts = {};
223
+ this.url = url || "";
224
+ this.session = opts.session || null;
225
+ this.websocket = null;
226
+ this.connecting = false;
227
+ var reconnect_timer_id = null;
228
+ var running = false;
229
+ var self = this;
230
+
231
+ self.on("__session_id", function(session_id){
232
+ self.session = session_id;
233
+ self.emit("connect", self.session);
234
+ });
235
+
236
+ this.connect = function(){
237
+ if(typeof WebSocket === "undefined"){
238
+ self.emit("error", "websocket not exists in this browser");
239
+ return null;
240
+ }
241
+ self.running = true;
242
+ var url = self.session ? self.url+"/session="+self.session : self.url;
243
+ self.websocket = new WebSocket(url);
244
+ self.websocket.onmessage = function(e){
245
+ try{
246
+ var data_ = JSON.parse(e.data);
247
+ self.emit(data_.type, data_.data);
248
+ }
249
+ catch(e){
250
+ self.emit("error", "WebSocketIO data parse error");
251
+ }
252
+ };
253
+ self.websocket.onclose = function(){
254
+ if(self.connecting){
255
+ self.connecting = false;
256
+ self.emit("disconnect");
257
+ }
258
+ if(self.running){
259
+ reconnect_timer_id = setTimeout(self.connect, 10000);
260
+ }
261
+ };
262
+ self.websocket.onopen = function(){
263
+ self.connecting = true;
264
+ };
265
+ return self;
266
+ };
267
+
268
+ this.close = function(){
269
+ clearTimeout(reconnect_timer_id);
270
+ self.running = false;
271
+ self.websocket.close();
272
+ };
273
+
274
+ this.push = function(type, data){
275
+ if(!self.connecting){
276
+ self.emit("error", "websocket not connected");
277
+ return;
278
+ }
279
+ self.websocket.send(JSON.stringify({type: type, data: data, session: self.session}));
280
+ };
281
+ };
282
+
283
+ // event_emitter.js v0.0.8
284
+ // https://github.com/shokai/event_emitter.js
285
+ // (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
286
+ // The MIT License
287
+ var EventEmitter = function(){
288
+ var self = this;
289
+ this.apply = function(target, prefix){
290
+ if(!prefix) prefix = "";
291
+ for(var func in self){
292
+ if(self.hasOwnProperty(func) && func !== "apply"){
293
+ target[prefix+func] = this[func];
294
+ }
295
+ }
296
+ };
297
+ this.__events = new Array();
298
+ this.on = function(type, listener, opts){
299
+ if(typeof listener !== "function") return;
300
+ var event_id = self.__events.length > 0 ? 1 + self.__events[self.__events.length-1].id : 0
301
+ var params = {
302
+ id: event_id,
303
+ type: type,
304
+ listener: listener
305
+ };
306
+ for(i in opts){
307
+ if(!params[i]) params[i] = opts[i];
308
+ };
309
+ self.__events.push(params);
310
+ return event_id;
311
+ };
312
+
313
+ this.once = function(type, listener){
314
+ self.on(type, listener, {once: true});
315
+ };
316
+
317
+ this.emit = function(type, data){
318
+ for(var i = 0; i < self.__events.length; i++){
319
+ var e = self.__events[i];
320
+ switch(e.type){
321
+ case type:
322
+ e.listener(data);
323
+ if(e.once) e.type = null;
324
+ break
325
+ case "*":
326
+ e.listener(type, data);
327
+ if(e.once) e.type = null;
328
+ break
329
+ }
330
+ }
331
+ self.removeListener();
332
+ };
333
+
334
+ this.removeListener = function(id_or_type){
335
+ for(var i = self.__events.length-1; i >= 0; i--){
336
+ var e = self.__events[i];
337
+ switch(typeof id_or_type){
338
+ case "number":
339
+ if(e.id === id_or_type) self.__events.splice(i,1);
340
+ break
341
+ case "string":
342
+ case "object":
343
+ if(e.type === id_or_type) self.__events.splice(i,1);
344
+ break
345
+ }
346
+ }
347
+ };
348
+
349
+ };
350
+
351
+ if(typeof module !== "undefined" && typeof module.exports !== "undefined"){
352
+ module.exports = EventEmitter;
353
+ }
354
+
355
+
@@ -0,0 +1,5 @@
1
+ // Linda.js v0.0.8 (rocketio v0.2.6)
2
+ // https://github.com/shokai/sinatra-rocketio-linda
3
+ // (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
4
+ // The MIT License
5
+ var Linda=function(io,opts){var self=this;this.io=null;if(io===null||typeof io==="undefined"){this.io=(new RocketIO).connect()}else{this.io=io}this.opts=opts||{};this.TupleSpace=function(name){if(name===null||typeof name!=="string")name="__default__";this.name=name;this.linda=self;var space=this;this.write=function(tuple,opts){if(tuple===null||typeof tuple!=="object")return;if(opts===null||typeof opts==="undefined")opts={};self.io.push("__linda_write",[space.name,tuple,opts])};this.read=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=new Date-0+"";self.io.once("__linda_read_callback_"+callback_id,callback);self.io.push("__linda_read",[space.name,tuple,callback_id])};this.take=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=new Date-0+"";self.io.once("__linda_take_callback_"+callback_id,callback);self.io.push("__linda_take",[space.name,tuple,callback_id])};this.watch=function(tuple,callback){if(tuple===null||typeof tuple!=="object")return;if(typeof callback!=="function")return;var callback_id=new Date-0+"";self.io.on("__linda_watch_callback_"+callback_id,callback);self.io.push("__linda_watch",[space.name,tuple,callback_id])}}};var RocketIO=function(opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.type=opts.type||null;this.session=opts.session||null;this.channel=null;if(typeof opts.channel!=="undefined"&&opts.channel!==null){this.channel=""+opts.channel}var setting={};this.io=null;var self=this;var ws_close_timer=null;self.on("__connect",function(session_id){self.session=session_id;self.io.push("__channel_id",self.channel);self.emit("connect")});this.connect=function(url){if(typeof url==="string"){$.getJSON(url+"/rocketio/settings",function(res){setting=res;connect_io()});return self}else{return connect_io()}};var connect_io=function(){self.io=function(){if(self.type==="comet")return;if(typeof WebSocketIO!=="function")return;var io=new WebSocketIO;if(typeof setting.websocket==="string")io.url=setting.websocket;io.session=self.session;return io.connect()}()||function(){if(typeof CometIO!=="function")return;var io=new CometIO;if(typeof setting.comet==="string")io.url=setting.comet;io.session=self.session;return io.connect()}();if(typeof self.io==="undefined"){setTimeout(function(){self.emit("error","WebSocketIO and CometIO are not available")},100);return self}if(self.io.url.match(/^ws:\/\/.+/))self.type="websocket";else if(self.io.url.match(/cometio/))self.type="comet";else self.type="unknown";self.io.on("*",function(event_name,args){if(event_name==="connect")event_name="__connect";self.emit(event_name,args)});ws_close_timer=setTimeout(function(){self.close();self.type="comet";connect_io()},3e3);self.once("connect",function(){if(ws_close_timer)clearTimeout(ws_close_timer);ws_close_timer=null});return self};this.close=function(){self.io.close()};this.push=function(type,data){self.io.push(type,data)}};var CometIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;var running=false;var self=this;var post_queue=[];var flush=function(){if(!running||post_queue.length<1)return;var post_data={json:JSON.stringify({session:self.session,events:post_queue})};$.ajax({url:self.url,data:post_data,success:function(data){},error:function(req,stat,e){self.emit("error","CometIO push error")},complete:function(e){},type:"POST",dataType:"json",timeout:1e4});post_queue=[]};setInterval(flush,1e3);this.push=function(type,data){if(!running||!self.session){self.emit("error","CometIO not connected");return}post_queue.push({type:type,data:data})};this.connect=function(){if(running)return self;self.on("__session_id",function(session){self.session=session;self.emit("connect",self.session)});running=true;get();return self};this.close=function(){running=false;self.removeListener("__session_id")};var get=function(){if(!running)return;$.ajax({url:self.url,data:{session:self.session},success:function(data_arr){if(data_arr!==null&&typeof data_arr=="object"&&!!data_arr.length){for(var i=0;i<data_arr.length;i++){var data=data_arr[i];if(data)self.emit(data.type,data.data)}}get()},error:function(req,stat,e){self.emit("error","CometIO get error");setTimeout(get,1e4)},complete:function(e){},type:"GET",dataType:"json",timeout:13e4})}};var WebSocketIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;this.websocket=null;this.connecting=false;var reconnect_timer_id=null;var running=false;var self=this;self.on("__session_id",function(session_id){self.session=session_id;self.emit("connect",self.session)});this.connect=function(){if(typeof WebSocket==="undefined"){self.emit("error","websocket not exists in this browser");return null}self.running=true;var url=self.session?self.url+"/session="+self.session:self.url;self.websocket=new WebSocket(url);self.websocket.onmessage=function(e){try{var data_=JSON.parse(e.data);self.emit(data_.type,data_.data)}catch(e){self.emit("error","WebSocketIO data parse error")}};self.websocket.onclose=function(){if(self.connecting){self.connecting=false;self.emit("disconnect")}if(self.running){reconnect_timer_id=setTimeout(self.connect,1e4)}};self.websocket.onopen=function(){self.connecting=true};return self};this.close=function(){clearTimeout(reconnect_timer_id);self.running=false;self.websocket.close()};this.push=function(type,data){if(!self.connecting){self.emit("error","websocket not connected");return}self.websocket.send(JSON.stringify({type:type,data:data,session:self.session}))}};var EventEmitter=function(){var self=this;this.apply=function(target,prefix){if(!prefix)prefix="";for(var func in self){if(self.hasOwnProperty(func)&&func!=="apply"){target[prefix+func]=this[func]}}};this.__events=new Array;this.on=function(type,listener,opts){if(typeof listener!=="function")return;var event_id=self.__events.length>0?1+self.__events[self.__events.length-1].id:0;var params={id:event_id,type:type,listener:listener};for(i in opts){if(!params[i])params[i]=opts[i]}self.__events.push(params);return event_id};this.once=function(type,listener){self.on(type,listener,{once:true})};this.emit=function(type,data){for(var i=0;i<self.__events.length;i++){var e=self.__events[i];switch(e.type){case type:e.listener(data);if(e.once)e.type=null;break;case"*":e.listener(type,data);if(e.once)e.type=null;break}}self.removeListener()};this.removeListener=function(id_or_type){for(var i=self.__events.length-1;i>=0;i--){var e=self.__events[i];switch(typeof id_or_type){case"number":if(e.id===id_or_type)self.__events.splice(i,1);break;case"string":case"object":if(e.type===id_or_type)self.__events.splice(i,1);break}}}};if(typeof module!=="undefined"&&typeof module.exports!=="undefined"){module.exports=EventEmitter}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-rocketio-linda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sho Hashimoto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-24 00:00:00.000000000 Z
11
+ date: 2013-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -159,6 +159,7 @@ extra_rdoc_files: []
159
159
  files:
160
160
  - .gitignore
161
161
  - Gemfile
162
+ - HEADER.erb
162
163
  - History.txt
163
164
  - LICENSE.txt
164
165
  - README.md
@@ -174,6 +175,8 @@ files:
174
175
  - lib/sinatra/rocketio/linda.rb
175
176
  - lib/sinatra/rocketio/linda/client.rb
176
177
  - lib/sinatra/rocketio/linda/version.rb
178
+ - linda.js
179
+ - linda.min.js
177
180
  - sample/bin/cui_calc_watcher.rb
178
181
  - sample/bin/cui_calc_worker.rb
179
182
  - sample/config.ru