Mercurial > eldonilo > blog
comparison blog.js @ 0:f62b5c395a48
Initial commit.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sat, 04 Jun 2011 05:02:47 +0200 |
parents | |
children | 82905edac9d8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f62b5c395a48 |
---|---|
1 //'use strict'; | |
2 | |
3 const BOSH_SERVICE = 'http://linkmauve.fr/http-bind/'; | |
4 var conn = null; | |
5 var jid = 'blog@linkmauve.fr'; // FIXME: Strophe should accept anonymous connections. | |
6 var password = 'blog'; | |
7 var service = 'psgxs.linkmauve.fr'; | |
8 var node = 'blog'; | |
9 var re = true; | |
10 | |
11 var params = (function() { | |
12 var vars = {}; | |
13 var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split(';'); | |
14 | |
15 for(var i = 0; i < hashes.length; i++) { | |
16 var s = hashes[i].indexOf('='); | |
17 var key = hashes[i].substring(0, s); | |
18 var value = hashes[i].substring(s+1); | |
19 vars[key] = value; | |
20 } | |
21 | |
22 return vars; | |
23 })(); | |
24 | |
25 if (params.jid) | |
26 service = params.jid; | |
27 | |
28 if (params.node) | |
29 node = params.node; | |
30 | |
31 var logs = document.getElementById('log'); | |
32 if (params.debug) | |
33 logs.parentNode.hidden = false; | |
34 | |
35 var received = {}; | |
36 var messages = document.getElementById('messages'); | |
37 | |
38 function log(msg, error) { | |
39 var p = document.createElementNS(ns.xhtml, 'p'); | |
40 p.appendChild(document.createTextNode(msg)); | |
41 | |
42 if (!error) | |
43 p.setAttributeNS(null, 'class', 'error'); | |
44 | |
45 logs.appendChild(p); | |
46 } | |
47 | |
48 function rawInput(data) { | |
49 log('RECV: ' + data, 1); | |
50 } | |
51 | |
52 function rawOutput(data) { | |
53 log('SENT: ' + data, 1); | |
54 } | |
55 | |
56 var html = function(name, id) { | |
57 return received[name][id].html; | |
58 } | |
59 | |
60 var date = function(name, id) { | |
61 return received[name][id].date; | |
62 } | |
63 | |
64 var updateMessage = function(name, id) { | |
65 var divs = messages.getElementsByTagNameNS(ns.xhtml, 'div'); | |
66 var container = null; | |
67 | |
68 for (var i in divs) { | |
69 var div = divs[i] | |
70 if (typeof div != 'object') | |
71 continue; | |
72 | |
73 if (div.getAttributeNS(ns.idq, 'jid') === name) { | |
74 container = div; | |
75 break; | |
76 } | |
77 } | |
78 | |
79 if (!container) { | |
80 var container = document.createElementNS(ns.xhtml, 'div'); | |
81 container.setAttributeNS(ns.idq, 'jid', name); | |
82 messages.appendChild(container); | |
83 } | |
84 | |
85 var articles = container.getElementsByTagNameNS(ns.xhtml, 'article'); | |
86 for (var i in articles) { | |
87 var article = articles[i]; | |
88 if (typeof article != 'object') | |
89 continue; | |
90 | |
91 if (article.getAttributeNS(ns.idq, 'id') === id) { | |
92 container.replaceChild(html(name, id), article); | |
93 return; | |
94 } | |
95 } | |
96 | |
97 var article = html(name, id); | |
98 | |
99 if (!container.firstChild) | |
100 container.appendChild(article); | |
101 else { | |
102 var d = date(name, id); | |
103 var toInsert; | |
104 for (var i in articles) { | |
105 var a = articles[i]; | |
106 if (typeof a != 'object') | |
107 continue; | |
108 | |
109 var ad = new Date(); | |
110 ad.set8601(a.getAttributeNS(ns.idq, 'date')); | |
111 | |
112 if (ad < d) { | |
113 toInsert = a; | |
114 break; | |
115 } | |
116 } | |
117 | |
118 if (toInsert) | |
119 container.insertBefore(article, toInsert); | |
120 else | |
121 container.appendChild(article); | |
122 } | |
123 } | |
124 | |
125 var convert = function(id, xml) { | |
126 var ns = xml['@xmlns']; | |
127 if (ns in parsers) | |
128 return new parsers[ns](id, xml); | |
129 return new parsers[''](id, xml); | |
130 }; | |
131 | |
132 var parsePubSubEvent = function(stanza) { | |
133 var e = {}; | |
134 | |
135 e.service = stanza.getAttribute('from'); | |
136 | |
137 var pubsub = stanza.getChild('event', ns.pse); | |
138 if (!pubsub) { | |
139 pubsub = stanza.getChild('pubsub', ns.ps); | |
140 if (!pubsub) | |
141 return; | |
142 } | |
143 e.ns = pubsub.getAttribute('xmlns'); | |
144 | |
145 var items = pubsub.getChild('items', e.ns); | |
146 if (!items) | |
147 return; | |
148 | |
149 e.node = items.getAttribute('node'); | |
150 items = items.getChildren('item', e.ns); | |
151 if (!items) | |
152 return; | |
153 | |
154 e.name = e.service + '/' + e.node; | |
155 | |
156 e.items = {}; | |
157 for (var i in items) { | |
158 var item = items[i]; | |
159 if (!item.getAttribute) | |
160 continue; | |
161 | |
162 var pl = item.getChild(); | |
163 if (!pl) | |
164 continue; | |
165 | |
166 var id = item.getAttribute('id'); | |
167 | |
168 e.items[id] = pl; | |
169 } | |
170 | |
171 return e; | |
172 } | |
173 | |
174 var onMessages = function(stanza) { | |
175 conn.addHandler(onMessages, null, 'message', null, null, null); | |
176 | |
177 log('message'); | |
178 stanza = xml2json(stanza); | |
179 var e = parsePubSubEvent(stanza); | |
180 | |
181 if (!received[e.name]) | |
182 received[e.name] = {}; | |
183 | |
184 for (var id in e.items) { | |
185 received[e.name][id] = convert(id, e.items[id]); | |
186 updateMessage(e.name, id); | |
187 } | |
188 } | |
189 | |
190 var onInfo = function(stanza) { | |
191 log('info'); | |
192 /*var query = stanza.getElementsByTagNameNS(ns.info, 'query')[0]; | |
193 var x = query.getElementsByTagNameNS(ns.data, 'x')[0]; | |
194 var form = forms.parse(x);*/ | |
195 } | |
196 | |
197 var onSubscribed = function(stanza) { | |
198 log('subscribed'); | |
199 var type = stanza.getAttribute('type'); | |
200 if (type !== 'result') { | |
201 messages.innerHTML = 'Error, impossible to retrieve messages.'; | |
202 conn.disconnect(); | |
203 } | |
204 } | |
205 | |
206 function onConnect(status) { | |
207 if (status == Strophe.Status.CONNECTING) { | |
208 log('Strophe is connecting.'); | |
209 } else if (status == Strophe.Status.CONNFAIL) { | |
210 log('Strophe failed to connect.'); | |
211 } else if (status == Strophe.Status.AUTHENTICATING) { | |
212 log('Strophe is authenticating.'); | |
213 } else if (status == Strophe.Status.DISCONNECTING) { | |
214 log('Strophe is disconnecting.'); | |
215 } else if (status == Strophe.Status.DISCONNECTED) { | |
216 log('Strophe is disconnected.'); | |
217 if (re) | |
218 conn.connect(jid, password, onConnect); | |
219 } else if (status == Strophe.Status.CONNECTED) { | |
220 log('Strophe is connected.'); | |
221 conn.addHandler(onMessages, null, 'message', null, null, null); | |
222 conn.send($pres().tree()); | |
223 conn.pubsub.subscribe(jid, service, node, undefined, onMessages, onSubscribed); | |
224 if (params.no === 'server') { | |
225 conn.pubsub.items(jid, service, node, onMessages); | |
226 conn.pubsub.info(jid, service, node, onInfo); | |
227 } | |
228 } else | |
229 log('Strophe is '+status+'.'); | |
230 } | |
231 | |
232 window.addEventListener('load', function () { | |
233 conn = new Strophe.Connection(BOSH_SERVICE); | |
234 conn.rawInput = rawInput; | |
235 conn.rawOutput = rawOutput; | |
236 conn.connect(jid, password, onConnect); | |
237 }, false); | |
238 | |
239 window.addEventListener('unload', function (e) { | |
240 re = false; | |
241 conn.disconnect(); | |
242 e.preventDefault(); | |
243 }, false); |