vines 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/LICENSE +1 -1
  2. data/Rakefile +33 -53
  3. data/conf/certs/README +10 -3
  4. data/conf/certs/ca-bundle.crt +55 -410
  5. data/lib/vines/cluster/connection.rb +1 -1
  6. data/lib/vines/command/ldap.rb +1 -1
  7. data/lib/vines/command/schema.rb +1 -1
  8. data/lib/vines/config.rb +11 -5
  9. data/lib/vines/jid.rb +3 -3
  10. data/lib/vines/stanza/iq/disco_items.rb +1 -1
  11. data/lib/vines/storage/local.rb +1 -0
  12. data/lib/vines/store.rb +50 -9
  13. data/lib/vines/stream.rb +5 -9
  14. data/lib/vines/stream/client/session.rb +1 -1
  15. data/lib/vines/stream/http.rb +3 -1
  16. data/lib/vines/stream/http/ready.rb +5 -1
  17. data/lib/vines/stream/http/request.rb +22 -0
  18. data/lib/vines/version.rb +1 -1
  19. data/test/config/host_test.rb +9 -9
  20. data/test/config/pubsub_test.rb +2 -2
  21. data/test/config_test.rb +5 -3
  22. data/test/jid_test.rb +9 -0
  23. data/test/rake_test_loader.rb +1 -1
  24. data/test/router_test.rb +7 -7
  25. data/test/stanza/iq/disco_info_test.rb +2 -2
  26. data/test/stanza/iq/private_storage_test.rb +1 -1
  27. data/test/stanza/iq_test.rb +1 -1
  28. data/test/stanza/presence/subscribe_test.rb +1 -1
  29. data/test/stanza/pubsub/subscribe_test.rb +3 -3
  30. data/test/stanza/pubsub/unsubscribe_test.rb +3 -3
  31. data/test/storage_test.rb +15 -8
  32. data/test/store_test.rb +131 -0
  33. data/test/stream/client/ready_test.rb +6 -6
  34. data/test/stream/component/ready_test.rb +1 -1
  35. data/test/stream/http/ready_test.rb +46 -11
  36. data/test/stream/http/request_test.rb +83 -11
  37. data/test/stream/http/sessions_test.rb +2 -2
  38. data/web/chat/coffeescripts/chat.coffee +1 -1
  39. data/web/chat/index.html +9 -10
  40. data/web/chat/javascripts/app.js +1 -1
  41. data/web/lib/coffeescripts/button.coffee +1 -1
  42. data/web/lib/coffeescripts/contact.coffee +2 -2
  43. data/web/lib/coffeescripts/filter.coffee +1 -1
  44. data/web/lib/coffeescripts/layout.coffee +2 -2
  45. data/web/lib/coffeescripts/login.coffee +1 -1
  46. data/web/lib/coffeescripts/logout.coffee +2 -2
  47. data/web/lib/coffeescripts/navbar.coffee +1 -1
  48. data/web/lib/coffeescripts/notification.coffee +1 -1
  49. data/web/lib/coffeescripts/router.coffee +1 -1
  50. data/web/lib/coffeescripts/session.coffee +1 -1
  51. data/web/lib/coffeescripts/transfer.coffee +1 -1
  52. data/web/lib/javascripts/base.js +10 -9
  53. metadata +65 -43
  54. data/web/chat/javascripts/chat.js +0 -390
  55. data/web/chat/javascripts/init.js +0 -21
  56. data/web/lib/javascripts/button.js +0 -39
  57. data/web/lib/javascripts/contact.js +0 -94
  58. data/web/lib/javascripts/filter.js +0 -88
  59. data/web/lib/javascripts/layout.js +0 -48
  60. data/web/lib/javascripts/login.js +0 -88
  61. data/web/lib/javascripts/logout.js +0 -11
  62. data/web/lib/javascripts/navbar.js +0 -69
  63. data/web/lib/javascripts/notification.js +0 -26
  64. data/web/lib/javascripts/router.js +0 -105
  65. data/web/lib/javascripts/session.js +0 -291
  66. data/web/lib/javascripts/transfer.js +0 -124
@@ -1,94 +0,0 @@
1
- var Contact;
2
- Contact = (function() {
3
- function Contact(node) {
4
- node = $(node);
5
- this.jid = node.attr('jid');
6
- this.name = node.attr('name');
7
- this.ask = node.attr('ask');
8
- this.subscription = node.attr('subscription');
9
- this.groups = $('group', node).map(function() {
10
- return $(this).text();
11
- }).get();
12
- this.presence = [];
13
- }
14
- Contact.prototype.online = function() {
15
- return this.presence.length > 0;
16
- };
17
- Contact.prototype.offline = function() {
18
- return this.presence.length === 0;
19
- };
20
- Contact.prototype.available = function() {
21
- var p;
22
- return this.online() && ((function() {
23
- var _i, _len, _ref, _results;
24
- _ref = this.presence;
25
- _results = [];
26
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
27
- p = _ref[_i];
28
- if (!p.away) {
29
- _results.push(p);
30
- }
31
- }
32
- return _results;
33
- }).call(this)).length > 0;
34
- };
35
- Contact.prototype.away = function() {
36
- return !this.available();
37
- };
38
- Contact.prototype.status = function() {
39
- var available, away, p;
40
- available = ((function() {
41
- var _i, _len, _ref, _results;
42
- _ref = this.presence;
43
- _results = [];
44
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
45
- p = _ref[_i];
46
- if (p.status && !p.away) {
47
- _results.push(p.status);
48
- }
49
- }
50
- return _results;
51
- }).call(this))[0] || 'Available';
52
- away = ((function() {
53
- var _i, _len, _ref, _results;
54
- _ref = this.presence;
55
- _results = [];
56
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
57
- p = _ref[_i];
58
- if (p.status && p.away) {
59
- _results.push(p.status);
60
- }
61
- }
62
- return _results;
63
- }).call(this))[0] || 'Away';
64
- if (this.offline()) {
65
- return 'Offline';
66
- } else if (this.away()) {
67
- return away;
68
- } else {
69
- return available;
70
- }
71
- };
72
- Contact.prototype.update = function(presence) {
73
- var p;
74
- this.presence = (function() {
75
- var _i, _len, _ref, _results;
76
- _ref = this.presence;
77
- _results = [];
78
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
79
- p = _ref[_i];
80
- if (p.from !== presence.from) {
81
- _results.push(p);
82
- }
83
- }
84
- return _results;
85
- }).call(this);
86
- if (!presence.type) {
87
- this.presence.push(presence);
88
- }
89
- if (presence.type === 'unsubscribed') {
90
- return this.presence = [];
91
- }
92
- };
93
- return Contact;
94
- })();
@@ -1,88 +0,0 @@
1
- var Filter;
2
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
- Filter = (function() {
4
- function Filter(options) {
5
- this.list = options.list;
6
- this.icon = options.icon;
7
- this.form = options.form;
8
- this.attrs = options.attrs;
9
- this.open = options.open;
10
- this.close = options.close;
11
- this.draw();
12
- }
13
- Filter.prototype.draw = function() {
14
- var form, text;
15
- $(this.icon).addClass('filter-button');
16
- form = $('<form class="filter-form" style="display:none;"></form>').appendTo(this.form);
17
- text = $('<input class="filter-text" type="search" placeholder="Filter" results="5"/>').appendTo(form);
18
- if (this.icon) {
19
- new Button(this.icon, ICONS.search, {
20
- scale: 0.5,
21
- translation: '-16,-16'
22
- });
23
- }
24
- form.submit(function() {
25
- return false;
26
- });
27
- text.keyup(__bind(function() {
28
- return this.filter(text);
29
- }, this));
30
- text.change(__bind(function() {
31
- return this.filter(text);
32
- }, this));
33
- text.click(__bind(function() {
34
- return this.filter(text);
35
- }, this));
36
- return $(this.icon).click(__bind(function() {
37
- if (form.is(':hidden')) {
38
- this.filter(text);
39
- form.show();
40
- if (this.open) {
41
- return this.open();
42
- }
43
- } else {
44
- form.hide();
45
- form[0].reset();
46
- this.filter(text);
47
- if (this.close) {
48
- return this.close();
49
- }
50
- }
51
- }, this));
52
- };
53
- Filter.prototype.filter = function(input) {
54
- var test, text;
55
- text = input.val().toLowerCase();
56
- if (text === '') {
57
- $('li', this.list).show();
58
- return;
59
- }
60
- test = function(node, attr) {
61
- var val;
62
- val = (node.attr(attr) || '').toLowerCase();
63
- return val.indexOf(text) !== -1;
64
- };
65
- return $('> li', this.list).each(__bind(function(ix, node) {
66
- var attr, matches;
67
- node = $(node);
68
- matches = (function() {
69
- var _i, _len, _ref, _results;
70
- _ref = this.attrs;
71
- _results = [];
72
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
73
- attr = _ref[_i];
74
- if (test(node, attr)) {
75
- _results.push(true);
76
- }
77
- }
78
- return _results;
79
- }).call(this);
80
- if (matches.length > 0) {
81
- return node.show();
82
- } else {
83
- return node.hide();
84
- }
85
- }, this));
86
- };
87
- return Filter;
88
- })();
@@ -1,48 +0,0 @@
1
- var Layout;
2
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
- Layout = (function() {
4
- function Layout(fn) {
5
- this.fn = fn;
6
- this.resize();
7
- this.listen();
8
- setTimeout((__bind(function() {
9
- return this.resize();
10
- }, this)), 250);
11
- }
12
- Layout.prototype.resize = function() {
13
- this.fill('.x-fill', 'outerWidth', 'width');
14
- this.fill('.y-fill', 'outerHeight', 'height');
15
- return this.fn();
16
- };
17
- Layout.prototype.fill = function(selector, get, set) {
18
- return $(selector).each(__bind(function(ix, node) {
19
- var fixed, getter, parent;
20
- node = $(node);
21
- getter = node[get];
22
- parent = getter.call(node.parent(), true);
23
- fixed = this.fixed(node, selector, function(n) {
24
- return getter.call(n, true);
25
- });
26
- return node[set].call(node, parent - fixed);
27
- }, this));
28
- };
29
- Layout.prototype.fixed = function(node, selector, fn) {
30
- return node.siblings().not(selector).not('.float').filter(':visible').map(function() {
31
- return fn($(this));
32
- }).get().reduce((function(sum, num) {
33
- return sum + num;
34
- }), 0);
35
- };
36
- Layout.prototype.listen = function() {
37
- var id;
38
- id = null;
39
- return $(window).resize(__bind(function() {
40
- clearTimeout(id);
41
- id = setTimeout((__bind(function() {
42
- return this.resize();
43
- }, this)), 10);
44
- return this.resize();
45
- }, this));
46
- };
47
- return Layout;
48
- })();
@@ -1,88 +0,0 @@
1
- var LoginPage;
2
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
- LoginPage = (function() {
4
- function LoginPage(session, startPage) {
5
- this.session = session;
6
- this.startPage = startPage;
7
- }
8
- LoginPage.prototype.start = function() {
9
- var id, jid, password, _ref;
10
- $('#error').hide();
11
- _ref = (function() {
12
- var _i, _len, _ref, _results;
13
- _ref = ['#jid', '#password'];
14
- _results = [];
15
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
16
- id = _ref[_i];
17
- _results.push($(id).val().trim());
18
- }
19
- return _results;
20
- })(), jid = _ref[0], password = _ref[1];
21
- if (jid.length === 0 || password.length === 0 || jid.indexOf('@') === -1) {
22
- $('#error').show();
23
- return;
24
- }
25
- return this.session.connect(jid, password, __bind(function(success) {
26
- if (!success) {
27
- this.session.disconnect();
28
- $('#error').show();
29
- $('#password').val('').focus();
30
- return;
31
- }
32
- localStorage['jid'] = jid;
33
- $('#current-user-name').text(this.session.bareJid());
34
- $('#current-user-avatar').attr('src', this.session.avatar(this.session.jid()));
35
- $('#current-user-avatar').attr('alt', this.session.bareJid());
36
- return $('#container').fadeOut(200, __bind(function() {
37
- $('#navbar').show();
38
- return window.location.hash = this.startPage;
39
- }, this));
40
- }, this));
41
- };
42
- LoginPage.prototype.draw = function() {
43
- var jid;
44
- this.session.disconnect();
45
- jid = localStorage['jid'] || '';
46
- $('#navbar').hide();
47
- $('body').attr('id', 'login-page');
48
- $('#container').hide().empty();
49
- $("<form id=\"login-form\">\n <div id=\"icon\"></div>\n <h1>vines</h1>\n <fieldset id=\"login-form-controls\">\n <input id=\"jid\" name=\"jid\" type=\"email\" maxlength=\"1024\" value=\"" + jid + "\" placeholder=\"Your user name\"/>\n <input id=\"password\" name=\"password\" type=\"password\" maxlength=\"1024\" placeholder=\"Your password\"/>\n <input id=\"start\" type=\"submit\" value=\"Sign in\"/>\n </fieldset>\n <p id=\"error\" style=\"display:none;\">User name and password not found.</p>\n</form>").appendTo('#container');
50
- $('#container').fadeIn(1000);
51
- $('#login-form').submit(__bind(function() {
52
- this.start();
53
- return false;
54
- }, this));
55
- $('#jid').keydown(function() {
56
- return $('#error').fadeOut();
57
- });
58
- $('#password').keydown(function() {
59
- return $('#error').fadeOut();
60
- });
61
- this.resize();
62
- return this.icon();
63
- };
64
- LoginPage.prototype.icon = function() {
65
- var opts;
66
- opts = {
67
- fill: '90-#ccc-#fff',
68
- stroke: '#fff',
69
- 'stroke-width': 1.1,
70
- opacity: 0.95,
71
- scale: 3.0,
72
- translation: '10,8',
73
- animate: false
74
- };
75
- return new Button('#icon', ICONS.chat, opts);
76
- };
77
- LoginPage.prototype.resize = function() {
78
- var form, sizer, win;
79
- win = $(window);
80
- form = $('#login-form');
81
- sizer = function() {
82
- return form.css('top', win.height() / 2 - form.height() / 2);
83
- };
84
- win.resize(sizer);
85
- return sizer();
86
- };
87
- return LoginPage;
88
- })();
@@ -1,11 +0,0 @@
1
- var LogoutPage;
2
- LogoutPage = (function() {
3
- function LogoutPage(session) {
4
- this.session = session;
5
- }
6
- LogoutPage.prototype.draw = function() {
7
- window.location.hash = '';
8
- return window.location.reload();
9
- };
10
- return LogoutPage;
11
- })();
@@ -1,69 +0,0 @@
1
- var NavBar;
2
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
- NavBar = (function() {
4
- function NavBar(session) {
5
- this.session = session;
6
- this.session.onCard(__bind(function(card) {
7
- if (card.jid === this.session.bareJid()) {
8
- return $('#current-user-avatar').attr('src', this.session.avatar(card.jid));
9
- }
10
- }, this));
11
- }
12
- NavBar.prototype.draw = function() {
13
- $("<header id=\"navbar\" class=\"x-fill\">\n <h1 id=\"logo\">vines&gt;</h1>\n <div id=\"current-user\">\n <img id=\"current-user-avatar\" alt=\"" + (this.session.bareJid()) + "\" src=\"" + (this.session.avatar(this.session.jid())) + "\"/>\n <div id=\"current-user-info\">\n <h1 id=\"current-user-name\">" + (this.session.bareJid()) + "</h1>\n <form id=\"current-user-presence-form\">\n <span class=\"select\">\n <span class=\"text\">Available</span>\n <select id=\"current-user-presence\">\n <optgroup label=\"Available\">\n <option>Available</option>\n <option>Surfing the web</option>\n <option>Reading email</option>\n </optgroup>\n <optgroup label=\"Away\">\n <option value=\"xa\">Away</option>\n <option value=\"xa\">Out to lunch</option>\n <option value=\"xa\">On the phone</option>\n <option value=\"xa\">In a meeting</option>\n </optgroup>\n </select>\n </span>\n </form>\n </div>\n </div>\n <nav id=\"app-nav\" class=\"x-fill\">\n <ul id=\"nav-links\"></ul>\n </nav>\n</header>").appendTo('body');
14
- $('<div id="container" class="x-fill y-fill"></div>').appendTo('body');
15
- return $('#current-user-presence').change(__bind(function(event) {
16
- var selected;
17
- selected = $('option:selected', event.currentTarget);
18
- $('#current-user-presence-form .text').text(selected.text());
19
- return this.session.sendPresence(selected.val() === 'xa', selected.text());
20
- }, this));
21
- };
22
- NavBar.prototype.addButton = function(label, icon) {
23
- var id, node;
24
- id = "nav-link-" + (label.toLowerCase());
25
- node = $("<li>\n <a id=\"" + id + "\" href=\"#/" + (label.toLowerCase()) + "\">\n <span>" + label + "</span>\n </a>\n</li>").appendTo('#nav-links');
26
- this.button(id, icon);
27
- return node.click(__bind(function(event) {
28
- return this.select(event.currentTarget);
29
- }, this));
30
- };
31
- NavBar.prototype.select = function(button) {
32
- var dark, light;
33
- button = $(button);
34
- $('#nav-links li').removeClass('selected');
35
- $('#nav-links li a').removeClass('selected');
36
- button.addClass('selected');
37
- $('a', button).addClass('selected');
38
- dark = $('#nav-links svg path');
39
- dark.attr('opacity', '0.6');
40
- dark.css('opacity', '0.6');
41
- light = $('svg path', button);
42
- light.attr('opacity', '1.0');
43
- return light.css('opacity', '1.0');
44
- };
45
- NavBar.prototype.button = function(id, path) {
46
- var icon, node, paper;
47
- paper = Raphael(id);
48
- icon = paper.path(path).attr({
49
- fill: '#fff',
50
- stroke: '#000',
51
- 'stroke-width': 0.3,
52
- opacity: 0.6
53
- });
54
- node = $('#' + id);
55
- node.hover(function() {
56
- return icon.animate({
57
- opacity: 1.0
58
- }, 200);
59
- }, function() {
60
- if (!node.hasClass('selected')) {
61
- return icon.animate({
62
- opacity: 0.6
63
- }, 200);
64
- }
65
- });
66
- return node.get(0);
67
- };
68
- return NavBar;
69
- })();
@@ -1,26 +0,0 @@
1
- var Notification;
2
- Notification = (function() {
3
- function Notification(text) {
4
- this.text = text;
5
- this.draw();
6
- }
7
- Notification.prototype.draw = function() {
8
- var fn, left, node, top;
9
- node = $('<div class="notification float" style="display:none;"></div>').appendTo('body');
10
- node.text(this.text);
11
- top = node.outerHeight() / 2;
12
- left = node.outerWidth() / 2;
13
- node.css({
14
- marginTop: "-" + top + "px",
15
- marginLeft: "-" + left + "px"
16
- });
17
- node.fadeIn(200);
18
- fn = function() {
19
- return node.fadeOut(200, function() {
20
- return node.remove();
21
- });
22
- };
23
- return setTimeout(fn, 1500);
24
- };
25
- return Notification;
26
- })();
@@ -1,105 +0,0 @@
1
- var Router;
2
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
3
- Router = (function() {
4
- function Router(pages) {
5
- this.pages = pages;
6
- this.routes = this.build();
7
- $(window).bind('hashchange', __bind(function() {
8
- return this.draw();
9
- }, this));
10
- }
11
- Router.prototype.build = function() {
12
- var f, fragments, map, page, pattern, route, routes, _ref;
13
- routes = [];
14
- _ref = this.pages;
15
- for (pattern in _ref) {
16
- page = _ref[pattern];
17
- routes.push(route = {
18
- args: [],
19
- page: page,
20
- re: null
21
- });
22
- if (pattern === 'default') {
23
- route.re = pattern;
24
- continue;
25
- }
26
- fragments = (function() {
27
- var _i, _len, _ref2, _results;
28
- _ref2 = pattern.split('/');
29
- _results = [];
30
- for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
31
- f = _ref2[_i];
32
- if (f.length > 0) {
33
- _results.push(f);
34
- }
35
- }
36
- return _results;
37
- })();
38
- map = function(fragment) {
39
- if (fragment[0] === ':') {
40
- route.args.push(fragment.replace(':', ''));
41
- return '(/[^/]+)?';
42
- } else {
43
- return '/' + fragment;
44
- }
45
- };
46
- route.re = new RegExp('#' + ((function() {
47
- var _i, _len, _results;
48
- _results = [];
49
- for (_i = 0, _len = fragments.length; _i < _len; _i++) {
50
- f = fragments[_i];
51
- _results.push(map(f));
52
- }
53
- return _results;
54
- })()).join(''));
55
- }
56
- return routes;
57
- };
58
- Router.prototype.draw = function() {
59
- var args, ix, name, opts, route, _i, _len, _ref, _ref2, _ref3;
60
- _ref = this.match(), route = _ref[0], args = _ref[1];
61
- route || (route = this.defaultRoute());
62
- if (!route) {
63
- return;
64
- }
65
- _ref2 = [{}, 0], opts = _ref2[0], ix = _ref2[1];
66
- _ref3 = route.args;
67
- for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
68
- name = _ref3[_i];
69
- opts[name] = args[ix++];
70
- }
71
- return route.page.draw(opts);
72
- };
73
- Router.prototype.match = function() {
74
- var arg, args, match, route, _i, _len, _ref;
75
- _ref = this.routes;
76
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
77
- route = _ref[_i];
78
- if (match = window.location.hash.match(route.re)) {
79
- args = (function() {
80
- var _j, _len2, _ref2, _results;
81
- _ref2 = match.slice(1);
82
- _results = [];
83
- for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
84
- arg = _ref2[_j];
85
- _results.push(arg.replace('/', ''));
86
- }
87
- return _results;
88
- })();
89
- return [route, args];
90
- }
91
- }
92
- return [];
93
- };
94
- Router.prototype.defaultRoute = function() {
95
- var route, _i, _len, _ref;
96
- _ref = this.routes;
97
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
98
- route = _ref[_i];
99
- if (route.re === 'default') {
100
- return route;
101
- }
102
- }
103
- };
104
- return Router;
105
- })();