xmppify 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/app/assets/javascripts/xmpp/index.js +0 -0
  8. data/app/assets/javascripts/xmpp/scripts/checkplayer.js +12 -0
  9. data/app/assets/javascripts/xmpp/scripts/crossdomain.xml +7 -0
  10. data/app/assets/javascripts/xmpp/scripts/flXHR.js +2 -0
  11. data/app/assets/javascripts/xmpp/scripts/flXHR.swf +0 -0
  12. data/app/assets/javascripts/xmpp/scripts/flXHR.vbs +44 -0
  13. data/app/assets/javascripts/xmpp/scripts/flensed.js +12 -0
  14. data/app/assets/javascripts/xmpp/scripts/strophe.flxhr.js +31 -0
  15. data/app/assets/javascripts/xmpp/scripts/strophe.js +3538 -0
  16. data/app/assets/javascripts/xmpp/scripts/swfobject.js +5 -0
  17. data/app/assets/javascripts/xmpp/scripts/updateplayer.swf +0 -0
  18. data/app/assets/javascripts/xmpp/scripts/xmpp.js.coffee +386 -0
  19. data/app/assets/javascripts/xmpp/strophejs-plugins/LICENSE.txt +19 -0
  20. data/app/assets/javascripts/xmpp/strophejs-plugins/README.markdown +95 -0
  21. data/app/assets/javascripts/xmpp/strophejs-plugins/archive/README.markdown +14 -0
  22. data/app/assets/javascripts/xmpp/strophejs-plugins/archive/iso8601_support.js +32 -0
  23. data/app/assets/javascripts/xmpp/strophejs-plugins/archive/strophe.archive.js +88 -0
  24. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/README.markdown +53 -0
  25. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/sha1.js +202 -0
  26. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.CAPS.coffee +153 -0
  27. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.CAPS.js +88 -0
  28. data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.caps.jsonly.js +240 -0
  29. data/app/assets/javascripts/xmpp/strophejs-plugins/chatstates/strophe.chatstates.js +80 -0
  30. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/README.markdown +47 -0
  31. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/GetUrlComamndSpec.js +66 -0
  32. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/strophe.cmds.spec.coffee +145 -0
  33. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/support/jasmine.json +16 -0
  34. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/src/strophe.cmds.coffee +265 -0
  35. data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/src/strophe.cmds.js +403 -0
  36. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/README.markdown +82 -0
  37. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/spec/strophe.x.coffee +715 -0
  38. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/src/strophe.x.coffee +443 -0
  39. data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/src/strophe.x.js +854 -0
  40. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/.gitignore +1 -0
  41. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/README.markdown +0 -0
  42. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/convert.js +13 -0
  43. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/jasmine.json +11 -0
  44. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/lib/strophe.disco.js +137 -0
  45. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/public/javascript/strophe.disco.js +137 -0
  46. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/01_querying_information.xml +6 -0
  47. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/02_result_set_for_information_request.xml +22 -0
  48. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/03_target_entity_does_not_exist.xml +10 -0
  49. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/04_service_unavailable.xml +11 -0
  50. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/09_querying_specific_jid_and_node_combination.xml +7 -0
  51. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/10_jid_and_node_result.xml +12 -0
  52. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/11_requesting_all_items.xml +6 -0
  53. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/12_result_set_for_all_items.xml +23 -0
  54. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/13_empty_result_set.xml +7 -0
  55. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/17_service_returns_nodes.xml +16 -0
  56. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/18_requesting_further_nodes.xml +7 -0
  57. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/24_jid_and_node_error.xml +11 -0
  58. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/DiscoNodeSpec.js +50 -0
  59. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/SpecHelper.js +51 -0
  60. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/Stanzas.js +0 -0
  61. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/strophe.disco.spec.helper.js +54 -0
  62. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/strophe.disco.spec.js +0 -0
  63. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/support/jasmine.json +13 -0
  64. data/app/assets/javascripts/xmpp/strophejs-plugins/disco/strophe.disco.js +232 -0
  65. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/public/javascript/jquery.epic.js +61 -0
  66. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/SpecHelper.js +9 -0
  67. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/jquery.epic.js +39 -0
  68. data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/support/jasmine.json +22 -0
  69. data/app/assets/javascripts/xmpp/strophejs-plugins/iexdomain/iexdomain.js +36 -0
  70. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/README.markdown +117 -0
  71. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/buster.js +23 -0
  72. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/jid.coffee +64 -0
  73. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/jid.js +92 -0
  74. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/browserSetup.coffee +1 -0
  75. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/jid.spec.coffee +96 -0
  76. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/strophe.joap.spec.coffee +461 -0
  77. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/strophe.joap.coffee +304 -0
  78. data/app/assets/javascripts/xmpp/strophejs-plugins/joap/strophe.joap.js +522 -0
  79. data/app/assets/javascripts/xmpp/strophejs-plugins/mam/LICENSE.txt +19 -0
  80. data/app/assets/javascripts/xmpp/strophejs-plugins/mam/README.markdown +52 -0
  81. data/app/assets/javascripts/xmpp/strophejs-plugins/mam/strophe.mam.js +62 -0
  82. data/app/assets/javascripts/xmpp/strophejs-plugins/muc/LICENSE.txt +20 -0
  83. data/app/assets/javascripts/xmpp/strophejs-plugins/muc/strophe.muc.js +1003 -0
  84. data/app/assets/javascripts/xmpp/strophejs-plugins/ping/README.markdown +28 -0
  85. data/app/assets/javascripts/xmpp/strophejs-plugins/ping/strophe.ping.js +68 -0
  86. data/app/assets/javascripts/xmpp/strophejs-plugins/private/README.markdown +16 -0
  87. data/app/assets/javascripts/xmpp/strophejs-plugins/private/strophe.private.js +192 -0
  88. data/app/assets/javascripts/xmpp/strophejs-plugins/pubsub/strophe.pubsub.js +555 -0
  89. data/app/assets/javascripts/xmpp/strophejs-plugins/receipts/strophe.receipts.js +155 -0
  90. data/app/assets/javascripts/xmpp/strophejs-plugins/register/README.markdown +44 -0
  91. data/app/assets/javascripts/xmpp/strophejs-plugins/register/strophe.register.js +431 -0
  92. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/public/javascript/strophe.roster.js +40 -0
  93. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/spec/strophe.roster.spec.js +65 -0
  94. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/spec/support/jasmine.json +15 -0
  95. data/app/assets/javascripts/xmpp/strophejs-plugins/roster/strophe.roster.js +438 -0
  96. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/.gitignore +6 -0
  97. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/README.md +113 -0
  98. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/buster.js +11 -0
  99. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/lib/strophe.js +4198 -0
  100. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/spec/strophe.rpc.spec.helper.js +38 -0
  101. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/spec/strophe.rpc.spec.js +262 -0
  102. data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/strophe.rpc.js +464 -0
  103. data/app/assets/javascripts/xmpp/strophejs-plugins/rsm/strophe.rsm.js +52 -0
  104. data/app/assets/javascripts/xmpp/strophejs-plugins/serverdate/strophe.serverdate.js +58 -0
  105. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/examples/index.html +17 -0
  106. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/examples/strophevcard.js +0 -0
  107. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/strophe.vcard.coffee +44 -0
  108. data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/strophe.vcard.js +66 -0
  109. data/app/assets/stylesheets/xmpp/index.css +0 -0
  110. data/app/controllers/omniauth_callbacks_controller.rb +15 -0
  111. data/app/controllers/ruby_bosh.rb +221 -0
  112. data/app/models/identity.rb +3 -0
  113. data/app/models/user.rb +40 -0
  114. data/bin/rails +8 -0
  115. data/db/migrate/20140329065635_create_users.rb +10 -0
  116. data/db/migrate/20140329070238_create_identities.rb +11 -0
  117. data/lib/xmppify/version.rb +3 -0
  118. data/lib/xmppify.rb +6 -0
  119. data/xmppify.gemspec +23 -0
  120. metadata +197 -0
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Entity Capabilities (XEP-0115)
3
+ *
4
+ * Depends on disco plugin.
5
+ *
6
+ * See: http://xmpp.org/extensions/xep-0115.html
7
+ *
8
+ * Authors:
9
+ * - Michael Weibel <michael.weibel@gmail.com>
10
+ *
11
+ * Copyright:
12
+ * - Michael Weibel <michael.weibel@gmail.com>
13
+ */
14
+
15
+ Strophe.addConnectionPlugin('caps', {
16
+ /** Constant: HASH
17
+ * Hash used
18
+ *
19
+ * Currently only sha-1 is supported.
20
+ */
21
+ HASH: 'sha-1',
22
+ /** Variable: node
23
+ * Client which is being used.
24
+ *
25
+ * Can be overwritten as soon as Strophe has been initialized.
26
+ */
27
+ node: 'http://strophe.im/strophejs/',
28
+ /** PrivateVariable: _ver
29
+ * Own generated version string
30
+ */
31
+ _ver: '',
32
+ /** PrivateVariable: _connection
33
+ * Strophe connection
34
+ */
35
+ _connection: null,
36
+ /** PrivateVariable: _knownCapabilities
37
+ * A hashtable containing version-strings and their capabilities, serialized
38
+ * as string.
39
+ *
40
+ * TODO: Maybe those caps shouldn't be serialized.
41
+ */
42
+ _knownCapabilities: {},
43
+ /** PrivateVariable: _jidVerIndex
44
+ * A hashtable containing jids and their versions for better lookup of capabilities.
45
+ */
46
+ _jidVerIndex: {},
47
+
48
+ /** Function: init
49
+ * Initialize plugin:
50
+ * - Add caps namespace
51
+ * - Add caps feature to disco plugin
52
+ * - Add handler for caps stanzas
53
+ *
54
+ * Parameters:
55
+ * (Strophe.Connection) conn - Strophe connection
56
+ */
57
+ init: function(conn) {
58
+ this._connection = conn;
59
+
60
+ Strophe.addNamespace('CAPS', 'http://jabber.org/protocol/caps');
61
+
62
+ if (!this._connection.disco) {
63
+ throw "Caps plugin requires the disco plugin to be installed.";
64
+ }
65
+
66
+ this._connection.disco.addFeature(Strophe.NS.CAPS);
67
+ this._connection.addHandler(this._delegateCapabilities.bind(this), Strophe.NS.CAPS);
68
+ },
69
+
70
+ /** Function: generateCapsAttrs
71
+ * Returns the attributes for generating the "c"-stanza containing the own version
72
+ *
73
+ * Returns:
74
+ * (Object) - attributes
75
+ */
76
+ generateCapsAttrs: function() {
77
+ return {
78
+ 'xmlns': Strophe.NS.CAPS,
79
+ 'hash': this.HASH,
80
+ 'node': this.node,
81
+ 'ver': this.generateVer()
82
+ };
83
+ },
84
+
85
+ /** Function: generateVer
86
+ * Returns the base64 encoded version string (encoded itself with sha1)
87
+ *
88
+ * Returns:
89
+ * (String) - version
90
+ */
91
+ generateVer: function() {
92
+ if (this._ver !== "") {
93
+ return this._ver;
94
+ }
95
+
96
+ var ver = "",
97
+ identities = this._connection.disco._identities.sort(this._sortIdentities),
98
+ identitiesLen = identities.length,
99
+ features = this._connection.disco._features.sort(),
100
+ featuresLen = features.length;
101
+ for(var i = 0; i < identitiesLen; i++) {
102
+ var curIdent = identities[i];
103
+ ver += curIdent.category + "/" + curIdent.type + "/" + curIdent.lang + "/" + curIdent.name + "<";
104
+ }
105
+ for(var i = 0; i < featuresLen; i++) {
106
+ ver += features[i] + '<';
107
+ }
108
+
109
+ this._ver = b64_sha1(ver);
110
+ return this._ver;
111
+ },
112
+
113
+ /** Function: getCapabilitiesByJid
114
+ * Returns serialized capabilities of a jid (if available).
115
+ * Otherwise null.
116
+ *
117
+ * Parameters:
118
+ * (String) jid - Jabber id
119
+ *
120
+ * Returns:
121
+ * (String|null) - capabilities, serialized; or null when not available.
122
+ */
123
+ getCapabilitiesByJid: function(jid) {
124
+ if (this._jidVerIndex[jid]) {
125
+ return this._knownCapabilities[this._jidVerIndex[jid]];
126
+ }
127
+ return null;
128
+ },
129
+
130
+ /** PrivateFunction: _delegateCapabilities
131
+ * Checks if the version has already been saved.
132
+ * If yes: do nothing.
133
+ * If no: Request capabilities
134
+ *
135
+ * Parameters:
136
+ * (Strophe.Builder) stanza - Stanza
137
+ *
138
+ * Returns:
139
+ * (Boolean)
140
+ */
141
+ _delegateCapabilities: function(stanza) {
142
+ var from = stanza.getAttribute('from'),
143
+ c = stanza.querySelector('c'),
144
+ ver = c.getAttribute('ver'),
145
+ node = c.getAttribute('node');
146
+ if (!this._knownCapabilities[ver]) {
147
+ return this._requestCapabilities(from, node, ver);
148
+ } else {
149
+ this._jidVerIndex[from] = ver;
150
+ }
151
+ if (!this._jidVerIndex[from] || !this._jidVerIndex[from] !== ver) {
152
+ this._jidVerIndex[from] = ver;
153
+ }
154
+ return true;
155
+ },
156
+
157
+ /** PrivateFunction: _requestCapabilities
158
+ * Requests capabilities from the one which sent the caps-info stanza.
159
+ * This is done using disco info.
160
+ *
161
+ * Additionally, it registers a handler for handling the reply.
162
+ *
163
+ * Parameters:
164
+ * (String) to - Destination jid
165
+ * (String) node - Node attribute of the caps-stanza
166
+ * (String) ver - Version of the caps-stanza
167
+ *
168
+ * Returns:
169
+ * (Boolean) - true
170
+ */
171
+ _requestCapabilities: function(to, node, ver) {
172
+ if (to !== this._connection.jid) {
173
+ var id = this._connection.disco.info(to, node + '#' + ver);
174
+ this._connection.addHandler(this._handleDiscoInfoReply.bind(this), Strophe.NS.DISCO_INFO, 'iq', 'result', id, to);
175
+ }
176
+ return true;
177
+ },
178
+
179
+ /** PrivateFunction: _handleDiscoInfoReply
180
+ * Parses the disco info reply and adds the version & it's capabilities to the _knownCapabilities variable.
181
+ * Additionally, it adds the jid & the version to the _jidVerIndex variable for a better lookup.
182
+ *
183
+ * Parameters:
184
+ * (Strophe.Builder) stanza - Disco info stanza
185
+ *
186
+ * Returns:
187
+ * (Boolean) - false, to automatically remove the handler.
188
+ */
189
+ _handleDiscoInfoReply: function(stanza) {
190
+ var query = stanza.querySelector('query'),
191
+ node = query.getAttribute('node').split('#'),
192
+ ver = node[1],
193
+ from = stanza.getAttribute('from');
194
+ if (!this._knownCapabilities[ver]) {
195
+ var childNodes = query.childNodes,
196
+ childNodesLen = childNodes.length;
197
+ this._knownCapabilities[ver] = [];
198
+ for(var i = 0; i < childNodesLen; i++) {
199
+ var node = childNodes[i];
200
+ this._knownCapabilities[ver].push({name: node.nodeName, attributes: node.attributes});
201
+ }
202
+ this._jidVerIndex[from] = ver;
203
+ } else if (!this._jidVerIndex[from] || !this._jidVerIndex[from] !== ver) {
204
+ this._jidVerIndex[from] = ver;
205
+ }
206
+ return false;
207
+ },
208
+
209
+ /** PrivateFunction: _sortIdentities
210
+ * Sorts two identities according the sorting requirements in XEP-0115.
211
+ *
212
+ * Parameters:
213
+ * (Object) a - Identity a
214
+ * (Object) b - Identity b
215
+ *
216
+ * Returns:
217
+ * (Integer) - 1, 0 or -1; according to which one's greater.
218
+ */
219
+ _sortIdentities: function(a, b) {
220
+ if (a.category > b.category) {
221
+ return 1;
222
+ }
223
+ if (a.category < b.category) {
224
+ return -1;
225
+ }
226
+ if (a.type > b.type) {
227
+ return 1;
228
+ }
229
+ if (a.type < b.type) {
230
+ return -1;
231
+ }
232
+ if (a.lang > b.lang) {
233
+ return 1;
234
+ }
235
+ if (a.lang < b.lang) {
236
+ return -1;
237
+ }
238
+ return 0;
239
+ }
240
+ });
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Chat state notifications (XEP 0085) plugin
3
+ * @see http://xmpp.org/extensions/xep-0085.html
4
+ */
5
+ Strophe.addConnectionPlugin('chatstates',
6
+ {
7
+ init: function (connection)
8
+ {
9
+ this._connection = connection;
10
+
11
+ Strophe.addNamespace('CHATSTATES', 'http://jabber.org/protocol/chatstates');
12
+ },
13
+
14
+ statusChanged: function (status)
15
+ {
16
+ if (status === Strophe.Status.CONNECTED
17
+ || status === Strophe.Status.ATTACHED)
18
+ {
19
+ this._connection.addHandler(this._notificationReceived.bind(this),
20
+ Strophe.NS.CHATSTATES, "message");
21
+ }
22
+ },
23
+
24
+ addActive: function(message)
25
+ {
26
+ return message.c('active', {xmlns: Strophe.NS.CHATSTATES}).up();
27
+ },
28
+
29
+ _notificationReceived: function(message)
30
+ {
31
+ var composing = $(message).find('composing'),
32
+ paused = $(message).find('paused'),
33
+ active = $(message).find('active'),
34
+ jid = $(message).attr('from');
35
+
36
+ if (composing.length > 0)
37
+ {
38
+ $(document).trigger('composing.chatstates', jid);
39
+ }
40
+
41
+ if (paused.length > 0)
42
+ {
43
+ $(document).trigger('paused.chatstates', jid);
44
+ }
45
+
46
+ if (active.length > 0)
47
+ {
48
+ $(document).trigger('active.chatstates', jid);
49
+ }
50
+
51
+ return true;
52
+ },
53
+
54
+ sendActive: function(jid, type)
55
+ {
56
+ this._sendNotification(jid, type, 'active');
57
+ },
58
+
59
+ sendComposing: function(jid, type)
60
+ {
61
+ this._sendNotification(jid, type, 'composing');
62
+ },
63
+
64
+ sendPaused: function(jid, type)
65
+ {
66
+ this._sendNotification(jid, type, 'paused');
67
+ },
68
+
69
+ _sendNotification: function(jid, type, notification)
70
+ {
71
+ if (!type) type = 'chat';
72
+
73
+ this._connection.send($msg(
74
+ {
75
+ to: jid,
76
+ type: type
77
+ })
78
+ .c(notification, {xmlns: Strophe.NS.CHATSTATES}));
79
+ }
80
+ });
@@ -0,0 +1,47 @@
1
+ # strophe.cmds.js
2
+
3
+ strophe.cmds.js is a plugin to provide Ad-Hoc Commands
4
+ ( [XEP-0050](http://xmpp.org/extensions/xep-0050.html) ).
5
+
6
+ ## Usage
7
+
8
+ ### Client side
9
+
10
+ cmd = new Strophe.Commands.RemoteCommand(conn, jid, node);
11
+
12
+ cmd.execute({
13
+
14
+ success: function(res, cmd){
15
+
16
+ proccessFields( cmd.form.fields );
17
+ doSomething();
18
+ resp = new Strophe.x.Form();
19
+ cmd.complete({ responseForm: resp });
20
+
21
+ error: myErrorFunction
22
+
23
+ }});
24
+
25
+ You can also use the interactive GUI mode
26
+
27
+ cmd.execute({gui:true});
28
+
29
+ ### Server side
30
+
31
+ ## Dependencies
32
+
33
+ - strophe.disco.js
34
+ - strophe.x.js
35
+ - jQuery
36
+ - jQueryUI (for GUI mode)
37
+
38
+ ## ToDo
39
+
40
+ - Write specs for UI commands
41
+ - Write better documentation
42
+
43
+ ## Authors
44
+
45
+ - [amaierhofer](https://github.com/amaierhofer)
46
+ - [tjahma](https://github.com/tjahma)
47
+ - [flosse](https://github.com/flosse)
@@ -0,0 +1,66 @@
1
+ describe("GetUrlCommand", function() {
2
+ var mockGetUrl = function(onSuccess, onError) {
3
+ var mockData = ['http://www.google.com', 'chrome://newtab'];
4
+ onSuccess.call(this,mockData);
5
+ }, c;
6
+
7
+ beforeEach(function() {
8
+ c = mockConnection();
9
+ iq = { type: 'set', to: 'n@d/r2', from: 'n@d/r1', id: 'ab6fa'};
10
+ success = jasmine.createSpy('success');
11
+ });
12
+
13
+ it("called with no urls", function() {
14
+ c.cmds.add(Strophe.Commands.create('getUrls', mockGetUrl));
15
+ spyon(c,'send',function(res) { expect(res.find('url').length).toEqual(0); });
16
+ c.cmds.exec('n@d/r', 'getUrls');
17
+ });
18
+
19
+ it("called with no urls also calls callback", function() {
20
+ c.cmds.add(Strophe.Commands.create('getUrls', mockGetUrl));
21
+ spyon(c,'send',function(req) {
22
+ var res = $iq({type: 'result', id: req.attr('id')});
23
+ c._dataRecv(createRequest(res));
24
+ });
25
+ c.cmds.execute('n@d/r', 'getUrls', { success: success});
26
+ expect(success).toHaveBeenCalled();
27
+ });
28
+ it("#GetUrls calls callback and sends urls in response", function() {
29
+ var req = $iq(iq).c('command', { xmlns: Strophe.NS.COMMANDS, node: 'getUrls' });
30
+ c.cmds.add(Strophe.Commands.create('getUrls', mockGetUrl));
31
+ spyon(c,'send',function(res) {
32
+ expect(res.find('url').length).toEqual(2);
33
+ });
34
+ receive(c,req);
35
+ });
36
+
37
+ it("#SetUrls calls callback with urls received in request", function() {
38
+ var req = $iq(iq).c('command', { xmlns: Strophe.NS.COMMANDS, node: 'setUrls' });
39
+ req.c('url').t('http://www.google.com').up();
40
+ req.c('url').t('chrome://newtab');
41
+
42
+ var callback = jasmine.createSpy('callback').andCallFake(function(onSuccess,onError) {
43
+ expect($(this.req).find('url').length).toEqual(2);
44
+ onSuccess.call(this,{});
45
+ });
46
+ var cmd = Strophe.Commands.create('setUrls', callback);
47
+ c.cmds.add(cmd);
48
+ spyon(c,'send',function(res) {
49
+ expect(res.find('command').attr('status')).toEqual('completed');
50
+ });
51
+ receive(c,req);
52
+ expect(cmd.callback).toHaveBeenCalled();
53
+ });
54
+
55
+ it("populates request for known command", function() {
56
+ var cmd = Strophe.Commands.create('setUrls', function() {});
57
+ var urls = ['http://www.google.com', 'chrome://newtab'];
58
+ c.cmds.add(cmd);
59
+ spyon(c,'send',function(res) {
60
+ expect(res.find('url').length).toEqual(2);
61
+ expect(res.find('url:eq(0)').text()).toEqual('http://www.google.com');
62
+ });
63
+ c.cmds.execute('n@d/r', 'setUrls', {data:urls});
64
+ });
65
+
66
+ });
@@ -0,0 +1,145 @@
1
+ describe "Commands", ->
2
+
3
+ beforeEach ->
4
+ @c = mockConnection()
5
+ @iq =
6
+ to: "n@d/r2"
7
+ from: "n@d/r1"
8
+ type: "get"
9
+ id: "abc"
10
+
11
+ it "disco#info includes command feature", ->
12
+ req = $iq(@iq).c("query", xmlns: Strophe.NS.DISCO_INFO)
13
+ spyon @c, "send", (res) ->
14
+ feat = ( ($ f).attr("var") for f in res.find "feature" )
15
+ (expect Strophe.NS.COMMANDS in feat).toBeTruthy()
16
+ receive @c, req
17
+
18
+ it "disco#items includes added commands", ->
19
+ @c.cmds.add { node: "a" }
20
+ req = $iq(@iq).c "query",
21
+ xmlns: Strophe.NS.DISCO_ITEMS
22
+ node: Strophe.NS.COMMANDS
23
+
24
+ spyon @c, "send", (res) ->
25
+ items = $(res[0]).find "item[node='a']"
26
+ expect(items.first().attr("node")).toEqual "a"
27
+ expect(items.first().attr("jid")).toEqual "n@d/r2"
28
+
29
+ receive @c, req
30
+
31
+ it "responds to command execution", ->
32
+ @c.cmds.add
33
+ node: "a"
34
+ name: "aName"
35
+
36
+ iq = $iq(type: "set").c("command",{
37
+ action: "execute"
38
+ node: "a"
39
+ xmlns: Strophe.NS.COMMANDS })
40
+
41
+ spyon @c, "send", (res) ->
42
+ expect(res.find("command").attr("status")).toEqual "completed"
43
+ receive @c, iq
44
+
45
+ it "responds with notFound for unknown command", ->
46
+ iq = $iq(type: "set").c "command",
47
+ action: "execute"
48
+ node: "a"
49
+ xmlns: Strophe.NS.COMMANDS
50
+
51
+ spyon @c, "send", (res) -> expect(res.find("item-not-found").length).toEqual 1
52
+ receive @c, iq
53
+
54
+ it "can execute command", ->
55
+ console.warn "exec"
56
+ spyon @c, "send", (req) ->
57
+ expect(req.find("command").attr("node")).toEqual "aCmd"
58
+ expect(req.find("command").attr("action")).toEqual "execute"
59
+
60
+ @c.cmds.execute "n@d/r", "aCmd"
61
+ expect(@c.send).toHaveBeenCalled()
62
+
63
+ it "can execute command with data", ->
64
+ @c.cmds.add
65
+ name: "foo"
66
+ node: "foo"
67
+ item: "foo"
68
+
69
+ spyon @c, "send", (req) ->
70
+ expect(req.find("command").attr("node")).toEqual "foo"
71
+ expect(req.find("command").attr("action")).toEqual "execute"
72
+ expect(req.find("foo").size()).toEqual 2
73
+ expect(req.find("command foo").size()).toEqual 0
74
+
75
+ @c.cmds.execute "n@d/r", "foo", { data: [ "foo", "bar" ] }
76
+ expect(@c.send).toHaveBeenCalled()
77
+
78
+ describe "Command", ->
79
+
80
+ beforeEach ->
81
+ @c = mockConnection()
82
+ @c.cmds.add name: "foo", node: "foo"
83
+ @cmd = new Strophe.Commands.RemoteCommand @c, "n@d/r", "foo"
84
+
85
+ it "has the correct properties", ->
86
+ (expect @cmd.jid).toEqual "n@d/r"
87
+ (expect @cmd.node).toEqual "foo"
88
+
89
+ it "can be converted to an iq object", ->
90
+
91
+ iq = $iq(to: "n@d/r", type: "set").c "command",
92
+ xmlns: Strophe.NS.COMMANDS
93
+ node: "foo"
94
+ action: "execute"
95
+
96
+ (expect @cmd.toIQ().toString()).toEqual iq.toString()
97
+
98
+ it "can be executed", ->
99
+ spyon @c, "send", (req) ->
100
+ expect(req.find("command").attr("node")).toEqual "foo"
101
+ expect(req.find("command").attr("action")).toEqual "execute"
102
+
103
+ @cmd.execute()
104
+ expect(@c.send).toHaveBeenCalled()
105
+
106
+ it "can be canceled", ->
107
+ @cmd.execute()
108
+ spyon @c, "send", (req) ->
109
+ expect(req.find("command").attr("action")).toEqual "cancel"
110
+
111
+ @cmd.cancel()
112
+ expect(@c.send).toHaveBeenCalled()
113
+
114
+ it "can exectute the 'next' action", ->
115
+ @cmd.execute()
116
+ spyon @c, "send", (req) ->
117
+ expect(req.find("command").attr("action")).toEqual "next"
118
+
119
+ @cmd.next()
120
+ expect(@c.send).toHaveBeenCalled()
121
+
122
+ it "can exectute the 'prev' action", ->
123
+ @cmd.execute()
124
+ spyon @c, "send", (req) ->
125
+ expect(req.find("command").attr("action")).toEqual "prev"
126
+
127
+ @cmd.prev()
128
+ expect(@c.send).toHaveBeenCalled()
129
+
130
+ it "can exectute the 'complete' action", ->
131
+ @cmd.execute()
132
+ spyon @c, "send", (req) ->
133
+ expect(req.find("command").attr("action")).toEqual "complete"
134
+
135
+ @cmd.complete()
136
+ expect(@c.send).toHaveBeenCalled()
137
+
138
+ it "holds all allowed actions based on the current stage", ->
139
+
140
+ spyon @c, "send", (res) ->
141
+ console.log res
142
+ expect(res.find("command").attr("status")).toEqual "completed"
143
+ receive @c, @cmd.toIQ()
144
+
145
+ (expect @cmd.actions).toEqual []
@@ -0,0 +1,16 @@
1
+ {
2
+ "src_dir" : "/public/javascript/",
3
+ "spec_dir" : "/spec/",
4
+
5
+ "server":{
6
+ "port":8124
7
+ },
8
+ "externals":[
9
+ "http://localhost/jslibs/jquery.js",
10
+ "http://localhost/jslibs/underscore.js",
11
+ "http://localhost/jslibs/strophe.js",
12
+ "http://localhost/jslibs/strophe.roster.js",
13
+ "http://localhost/jslibs/strophe.disco.js",
14
+ "http://localhost/jslibs/SpecHelper.js"
15
+ ]
16
+ }