jsbus 0.0.1 → 0.0.2
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.
- data/lib/jsbus/engine.rb +6 -0
- data/lib/jsbus/railtie.rb +4 -0
- data/lib/jsbus/version.rb +3 -0
- data/lib/jsbus.rb +3 -0
- data/vendor/assets/javascripts/jsbus.js +127 -0
- metadata +7 -2
data/lib/jsbus/engine.rb
ADDED
data/lib/jsbus.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
(function(window) {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
var eventCounter = 0;
|
5
|
+
|
6
|
+
function isFunction(obj) {
|
7
|
+
return !!(obj && obj.constructor && obj.call && obj.apply);
|
8
|
+
}
|
9
|
+
|
10
|
+
var EventBus = function() {
|
11
|
+
var self = this;
|
12
|
+
|
13
|
+
// If true, logging to console is enabled.
|
14
|
+
self.debug = false;
|
15
|
+
|
16
|
+
self.subscribers = [];
|
17
|
+
|
18
|
+
/*
|
19
|
+
Publish an event to the event bus.
|
20
|
+
|
21
|
+
eventType: string or string array
|
22
|
+
data: data associated with the event
|
23
|
+
callback: fired at the completion of the event
|
24
|
+
*/
|
25
|
+
self.publish = function(eventType, data, callback) {
|
26
|
+
var eventTypes;
|
27
|
+
if (isFunction(data)) {
|
28
|
+
log("Given callback but no data. Assigning data to callback.");
|
29
|
+
callback = data;
|
30
|
+
data = {};
|
31
|
+
}
|
32
|
+
|
33
|
+
eventTypes = [].concat(eventType);
|
34
|
+
createAndPublishEvent(eventTypes, data, callback);
|
35
|
+
};
|
36
|
+
|
37
|
+
// Reset the event bus by removing all subscribers. This is useful
|
38
|
+
// (and necessary) in testing scenarios.
|
39
|
+
self.reset = function() {
|
40
|
+
eventCounter = 0;
|
41
|
+
self.subscribers = [];
|
42
|
+
};
|
43
|
+
|
44
|
+
// Subscribe to one or more events.
|
45
|
+
self.subscribe = function(eventType, callback) {
|
46
|
+
var eventTypes;
|
47
|
+
eventTypes = [].concat(eventType);
|
48
|
+
subscribeToEventTypes(eventTypes, callback);
|
49
|
+
};
|
50
|
+
|
51
|
+
function createAndPublishEvent(eventTypes, data, callback) {
|
52
|
+
var i, eventType, event;
|
53
|
+
for (i = eventTypes.length - 1; i >= 0; i--) {
|
54
|
+
eventType = eventTypes[i];
|
55
|
+
event = new Event(eventType, data);
|
56
|
+
log("Publishing event: " + event.toString());
|
57
|
+
pushEventToSubscribers(event, eventType, callback);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
function log(message) {
|
62
|
+
if (self.debug && window.console && window.console.log) {
|
63
|
+
window.console.log(message);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
function pushEventToSubscribers(event, eventType, callback) {
|
68
|
+
var i, subscriber;
|
69
|
+
for (i = self.subscribers.length - 1; i >= 0; i--) {
|
70
|
+
subscriber = self.subscribers[i];
|
71
|
+
if (subscriber.eventType === eventType) {
|
72
|
+
event.push(subscriber, callback);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
function subscribeToEventTypes(eventTypes, callback) {
|
78
|
+
var i, eventType, subscriber;
|
79
|
+
for (i = eventTypes.length - 1; i >= 0; i--) {
|
80
|
+
eventType = eventTypes[i];
|
81
|
+
subscriber = new Subscriber(eventType, callback);
|
82
|
+
self.subscribers.push(subscriber);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
};
|
86
|
+
|
87
|
+
/*
|
88
|
+
Subscriber object. A holder for an event type and a callback.
|
89
|
+
*/
|
90
|
+
var Subscriber = function(eventType, callback) {
|
91
|
+
var self = this;
|
92
|
+
self.eventType = eventType;
|
93
|
+
self.callback = callback;
|
94
|
+
};
|
95
|
+
|
96
|
+
/*
|
97
|
+
Event object.
|
98
|
+
*/
|
99
|
+
var Event = function(eventType, data) {
|
100
|
+
var self = this;
|
101
|
+
self.eventCounter = nextEventCounter();
|
102
|
+
self.eventType = eventType;
|
103
|
+
self.data = data || {};
|
104
|
+
|
105
|
+
self.push = function(subscriber, callback) {
|
106
|
+
subscriber.callback(self);
|
107
|
+
if (callback && isFunction(callback)) {
|
108
|
+
callback();
|
109
|
+
}
|
110
|
+
};
|
111
|
+
|
112
|
+
self.toString = function() {
|
113
|
+
return "Event " + self.eventCounter + ", Type: " + self.eventType;
|
114
|
+
};
|
115
|
+
|
116
|
+
function nextEventCounter() {
|
117
|
+
eventCounter += 1;
|
118
|
+
return eventCounter;
|
119
|
+
}
|
120
|
+
};
|
121
|
+
|
122
|
+
// Do not define an eventBus is one has already been created.
|
123
|
+
if (window && window.eventBus) {
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
window.eventBus = new EventBus();
|
127
|
+
})(window);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -33,7 +33,12 @@ email:
|
|
33
33
|
executables: []
|
34
34
|
extensions: []
|
35
35
|
extra_rdoc_files: []
|
36
|
-
files:
|
36
|
+
files:
|
37
|
+
- lib/jsbus/engine.rb
|
38
|
+
- lib/jsbus/railtie.rb
|
39
|
+
- lib/jsbus/version.rb
|
40
|
+
- lib/jsbus.rb
|
41
|
+
- vendor/assets/javascripts/jsbus.js
|
37
42
|
homepage:
|
38
43
|
licenses: []
|
39
44
|
post_install_message:
|