diff options
| author | yo mama <pepper@scannerjammer.com> | 2015-04-04 01:13:50 -0700 |
|---|---|---|
| committer | yo mama <pepper@scannerjammer.com> | 2015-04-04 01:13:50 -0700 |
| commit | 1a3c90165cb6bac4a2e57d9897d6829de0ccc6fc (patch) | |
| tree | 604f4b5b02b1e24c7c5aad5c4560b0cf53cf9289 /public/js/chat.js | |
Diffstat (limited to 'public/js/chat.js')
| -rw-r--r-- | public/js/chat.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/public/js/chat.js b/public/js/chat.js new file mode 100644 index 0000000..27b0c8e --- /dev/null +++ b/public/js/chat.js @@ -0,0 +1,93 @@ +/* -*- mode:javascript; coding:utf-8; -*- */ + +'use strict'; + +(function (window) { + function on_ended(context) { + if (this.link && this.link.buffer) { + console.log('playing next sound'); + queue.link = this.link; + this.link.onended = _.partial(on_ended, context); + this.link.play(context); + } + else { + console.log('playing again'); + this.play(context); + } + }; + + function Queue() { + this.last = this; + } + + Queue.prototype.append = function (x) { + if (!this.seen || x.gt(this.seen)) { + this.last.link = x; + this.last = x; + this.seen = { + seq: x.seq, + timestamp: x.timestamp + }; + return x; + } + else { + return null; + } + }; + + var queue = new Queue(); + + window.AudioContext = window.AudioContext || window.webkitAudioContext; + + window.onload = function () { + var context = new AudioContext(); + var field = document.getElementById("field"); + var history = document.getElementById("history"); + var send = document.getElementById('send'); + + var messages = []; + var socket = io.connect('/'); + + socket.on('message', function (data) { + if (data.message) { + messages.push(data.message); + + var html = ''; + + for (var i = 0; i < messages.length; i++) { + html += messages[i] + '<br />'; + } + history.innerHTML = html; + + if (data.queue) { + _.each(data.queue, function (s) { + try { + var sample = new Sample(s); + + if (queue.append(sample)) { + if (queue.link === sample) { + sample.onended = _.partial(on_ended, context); + sample.onload = function () { + this.play(context); + }; + } + sample.load(context); + } + } + catch (e) { + console.error((e.message || 'error') + ' in "' + s + '"'); + } + }); + } + } + else { + console.error('error: ', data); + } + }); + + send.onclick = function () { + var text = field.value; + socket.emit('send', { message: text }); + }; + }; +})(window); |
