transistor 0.1.5 → 0.1.6
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 +4 -4
- data/Gemfile.lock +32 -1
- data/README.md +107 -20
- data/build/min/transistor-backbone.js +1 -1
- data/build/min/transistor-control.js +1 -1
- data/build/min/transistor-radio.js +1 -1
- data/build/min/transistor.js +1 -1
- data/build/src/transistor-backbone.js +7 -7
- data/build/src/transistor-control.js +4 -6
- data/build/src/transistor-radio.js +45 -127
- data/build/src/transistor.js +49 -49
- data/jake.yml +0 -1
- data/js/transistor/backbone-collection.js +7 -7
- data/js/transistor/control.js +4 -6
- data/js/transistor/radio.js +50 -48
- data/lib/assets/javascripts/transistor-backbone.js +7 -7
- data/lib/assets/javascripts/transistor-control.js +4 -6
- data/lib/assets/javascripts/transistor-radio.js +45 -127
- data/lib/assets/javascripts/transistor.js +49 -49
- data/spec/javascripts/TransistorBackboneCollectionSpec.js +1 -1
- data/spec/javascripts/TransistorControlSpec.js +1 -1
- data/spec/javascripts/TransistorRadioSpec.js +112 -0
- data/spec/servers.rb +41 -0
- data/transistor.gemspec +3 -1
- metadata +34 -2
@@ -84,7 +84,7 @@ var JSONP = function(){
|
|
84
84
|
};
|
85
85
|
};
|
86
86
|
|
87
|
-
/*global
|
87
|
+
/*global Faye */
|
88
88
|
if (window.Transistor === undefined) {
|
89
89
|
window.Transistor = {};
|
90
90
|
}
|
@@ -93,60 +93,62 @@ if (window.Transistor === undefined) {
|
|
93
93
|
|
94
94
|
var Radio = (function () {
|
95
95
|
|
96
|
-
return function (
|
97
|
-
var
|
96
|
+
return function (aerial_url, station_uid, token, cache) {
|
97
|
+
var radio = this,
|
98
|
+
faye,
|
99
|
+
H,
|
100
|
+
Extension;
|
98
101
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
listeners = [];
|
103
|
-
|
104
|
-
turnOn = function () {
|
105
|
-
var initial_value;
|
102
|
+
H = (function () {
|
103
|
+
var callbacks = {},
|
104
|
+
buildChannel;
|
106
105
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
}
|
106
|
+
buildChannel = function (channel_path) {
|
107
|
+
return ['', station_uid, token, channel_path].join('/');
|
108
|
+
};
|
111
109
|
|
112
|
-
|
110
|
+
return {
|
111
|
+
registerCallback: function (channel_path, callback) {
|
112
|
+
var channel = buildChannel(channel_path),
|
113
|
+
listener = function (message) {
|
114
|
+
callback(message.event, message.args);
|
115
|
+
};
|
113
116
|
|
114
|
-
|
115
|
-
initial_value = init.channels[listeners[i].channel_path];
|
117
|
+
callbacks[channel_path] = listener;
|
116
118
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
119
|
+
faye.subscribe(channel, listener);
|
120
|
+
},
|
121
|
+
triggerCallback: function (channel_path, message) {
|
122
|
+
callbacks[channel_path](message);
|
123
|
+
}
|
124
|
+
};
|
125
|
+
}());
|
123
126
|
|
124
|
-
|
127
|
+
Extension = (function () {
|
128
|
+
var process = function (message, callback) {
|
129
|
+
if (message.ext && message.ext.init) {
|
130
|
+
var channel_path = message.subscription.split('/').splice(3).join('/');
|
131
|
+
H.triggerCallback(channel_path, {
|
132
|
+
event: 'init',
|
133
|
+
args: message.ext.init.collection
|
134
|
+
});
|
125
135
|
}
|
126
|
-
|
127
|
-
|
136
|
+
callback(message);
|
137
|
+
};
|
128
138
|
|
129
|
-
|
130
|
-
|
131
|
-
|
139
|
+
return function () {
|
140
|
+
this.incoming = process;
|
141
|
+
};
|
142
|
+
}());
|
132
143
|
|
133
|
-
|
134
|
-
|
135
|
-
channel_path: channel_path,
|
136
|
-
callback: function (event) {
|
137
|
-
callback(event.event, event.args);
|
138
|
-
}
|
139
|
-
});
|
140
|
-
};
|
144
|
+
faye = new Faye.Client(aerial_url);
|
145
|
+
faye.addExtension(new Extension());
|
141
146
|
|
142
|
-
|
143
|
-
|
147
|
+
radio.tune = function (channel_path, callback) {
|
148
|
+
H.registerCallback(channel_path, callback);
|
144
149
|
};
|
145
150
|
|
146
|
-
return
|
147
|
-
tune: tune,
|
148
|
-
turnOn: turnOn
|
149
|
-
};
|
151
|
+
return radio;
|
150
152
|
};
|
151
153
|
}());
|
152
154
|
|
@@ -333,12 +335,10 @@ if (window.Transistor === undefined) {
|
|
333
335
|
}
|
334
336
|
};
|
335
337
|
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
remove: remove
|
341
|
-
};
|
338
|
+
this.set = set;
|
339
|
+
this.insert = insert;
|
340
|
+
this.update = update;
|
341
|
+
this.remove = remove;
|
342
342
|
};
|
343
343
|
}());
|
344
344
|
|
@@ -48,7 +48,7 @@ describe("Transistor.Control", function () {
|
|
48
48
|
return me;
|
49
49
|
}());
|
50
50
|
|
51
|
-
control = Transistor.Control("broadcaster_url", "station_uid", "token");
|
51
|
+
control = new Transistor.Control("broadcaster_url", "station_uid", "token");
|
52
52
|
});
|
53
53
|
|
54
54
|
describe("set", function () {
|
@@ -0,0 +1,112 @@
|
|
1
|
+
describe("Transistor.Radio", function () {
|
2
|
+
var faye = {},
|
3
|
+
servers = {
|
4
|
+
'without_collection': 'http://localhost:12001/faye',
|
5
|
+
'with_collection': 'http://localhost:12002/faye'
|
6
|
+
};
|
7
|
+
|
8
|
+
beforeEach(function () {
|
9
|
+
_.each(servers, function (url, key) {
|
10
|
+
faye[key] = new Faye.Client(url);
|
11
|
+
})
|
12
|
+
});
|
13
|
+
|
14
|
+
afterEach(function () {
|
15
|
+
});
|
16
|
+
|
17
|
+
describe('subscription to empty collection', function () {
|
18
|
+
var radio, calls;
|
19
|
+
|
20
|
+
it('triggers an init event', function () {
|
21
|
+
radio = new Transistor.Radio(servers['without_collection'], 'station_uid', 'token');
|
22
|
+
|
23
|
+
calls = [];
|
24
|
+
|
25
|
+
runs(function () {
|
26
|
+
radio.tune('test/channel', function (event, args) {
|
27
|
+
calls.push({
|
28
|
+
event: event,
|
29
|
+
args: args
|
30
|
+
});
|
31
|
+
});
|
32
|
+
});
|
33
|
+
|
34
|
+
waits(100);
|
35
|
+
|
36
|
+
runs(function () {
|
37
|
+
assertEqual(calls.length, 1);
|
38
|
+
assertEqual(calls[0].event, 'init');
|
39
|
+
assertEqual(calls[0].args, []);
|
40
|
+
});
|
41
|
+
});
|
42
|
+
});
|
43
|
+
|
44
|
+
describe('subscription to filled collection', function () {
|
45
|
+
var radio, calls;
|
46
|
+
|
47
|
+
it('triggers an init event', function () {
|
48
|
+
radio = new Transistor.Radio(servers['with_collection'], 'station_uid', 'token');
|
49
|
+
|
50
|
+
calls = [];
|
51
|
+
|
52
|
+
runs(function () {
|
53
|
+
radio.tune('test/channel', function (event, args) {
|
54
|
+
calls.push({
|
55
|
+
event: event,
|
56
|
+
args: args
|
57
|
+
});
|
58
|
+
});
|
59
|
+
});
|
60
|
+
|
61
|
+
waits(100);
|
62
|
+
|
63
|
+
runs(function () {
|
64
|
+
assertEqual(calls.length, 1);
|
65
|
+
assertEqual(calls[0].event, 'init');
|
66
|
+
assertEqual(calls[0].args, [{abcd: 1}, {efgh: 23}]);
|
67
|
+
});
|
68
|
+
});
|
69
|
+
});
|
70
|
+
|
71
|
+
describe('channel events', function () {
|
72
|
+
var radio, calls;
|
73
|
+
|
74
|
+
it('triggers the callback', function () {
|
75
|
+
radio = new Transistor.Radio(servers['with_collection'], 'station_uid', 'token');
|
76
|
+
|
77
|
+
calls = [];
|
78
|
+
|
79
|
+
runs(function () {
|
80
|
+
radio.tune('test/channel', function (event, args) {
|
81
|
+
calls.push({
|
82
|
+
event: event,
|
83
|
+
args: args
|
84
|
+
});
|
85
|
+
});
|
86
|
+
});
|
87
|
+
|
88
|
+
waits(100);
|
89
|
+
|
90
|
+
runs(function () {
|
91
|
+
channel_path = '/station_uid/token/test/channel'
|
92
|
+
message = {
|
93
|
+
event: 'insert',
|
94
|
+
args: {
|
95
|
+
entry: {}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
faye['with_collection'].publish(channel_path, message)
|
100
|
+
});
|
101
|
+
|
102
|
+
waits(100);
|
103
|
+
|
104
|
+
runs(function () {
|
105
|
+
assertEqual(calls.length, 2);
|
106
|
+
assertEqual(calls[1].event, 'insert');
|
107
|
+
assertEqual(calls[1].args, {entry: {}});
|
108
|
+
});
|
109
|
+
});
|
110
|
+
});
|
111
|
+
|
112
|
+
});
|
data/spec/servers.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'faye'
|
2
|
+
|
3
|
+
class Extension
|
4
|
+
attr_reader :collection
|
5
|
+
|
6
|
+
def initialize(collection = [])
|
7
|
+
@collection = collection
|
8
|
+
end
|
9
|
+
|
10
|
+
def outgoing(message, callback)
|
11
|
+
if(message['channel'] == '/meta/subscribe')
|
12
|
+
(message['ext'] ||= {}).tap do |ext|
|
13
|
+
ext[:init] ||= {}
|
14
|
+
ext[:init][:collection] = collection
|
15
|
+
end
|
16
|
+
end
|
17
|
+
callback.call(message)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
servers = []
|
22
|
+
|
23
|
+
servers << Thread.new do
|
24
|
+
Faye::RackAdapter.new({
|
25
|
+
:mount => '/faye',
|
26
|
+
:extensions => [
|
27
|
+
Extension.new
|
28
|
+
]
|
29
|
+
}).listen(12001)
|
30
|
+
end
|
31
|
+
|
32
|
+
servers << Thread.new do
|
33
|
+
Faye::RackAdapter.new({
|
34
|
+
:mount => '/faye',
|
35
|
+
:extensions => [
|
36
|
+
Extension.new([{abcd: 1}, {efgh: 23}])
|
37
|
+
]
|
38
|
+
}).listen(12002)
|
39
|
+
end
|
40
|
+
|
41
|
+
servers.each(&:join)
|
data/transistor.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "transistor"
|
5
|
-
spec.version = "0.1.
|
5
|
+
spec.version = "0.1.6"
|
6
6
|
|
7
7
|
spec.authors = ["Jakob Holderbaum"]
|
8
8
|
spec.email = ["jakob@featurefabrik.de"]
|
@@ -20,4 +20,6 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_development_dependency "jslint-v8"
|
21
21
|
spec.add_development_dependency "jake"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "faye"
|
24
|
+
spec.add_development_dependency "thin"
|
23
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transistor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakob Holderbaum
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: faye
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: thin
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
description:
|
84
112
|
email:
|
85
113
|
- jakob@featurefabrik.de
|
@@ -120,10 +148,12 @@ files:
|
|
120
148
|
- spec/javascripts/TransistorBackboneCollectionSpec.js
|
121
149
|
- spec/javascripts/TransistorBinderSpec.js
|
122
150
|
- spec/javascripts/TransistorControlSpec.js
|
151
|
+
- spec/javascripts/TransistorRadioSpec.js
|
123
152
|
- spec/javascripts/helpers/AssertHelpers.js
|
124
153
|
- spec/javascripts/support/backbone.js
|
125
154
|
- spec/javascripts/support/jasmine.yml
|
126
155
|
- spec/javascripts/support/underscore.js
|
156
|
+
- spec/servers.rb
|
127
157
|
- transistor.gemspec
|
128
158
|
homepage: http://www.featurefabrik.de
|
129
159
|
licenses:
|
@@ -153,7 +183,9 @@ test_files:
|
|
153
183
|
- spec/javascripts/TransistorBackboneCollectionSpec.js
|
154
184
|
- spec/javascripts/TransistorBinderSpec.js
|
155
185
|
- spec/javascripts/TransistorControlSpec.js
|
186
|
+
- spec/javascripts/TransistorRadioSpec.js
|
156
187
|
- spec/javascripts/helpers/AssertHelpers.js
|
157
188
|
- spec/javascripts/support/backbone.js
|
158
189
|
- spec/javascripts/support/jasmine.yml
|
159
190
|
- spec/javascripts/support/underscore.js
|
191
|
+
- spec/servers.rb
|