summaryrefslogtreecommitdiff
path: root/public/js/chat.js
diff options
context:
space:
mode:
authoryo mama <pepper@scannerjammer.com>2015-04-04 01:13:50 -0700
committeryo mama <pepper@scannerjammer.com>2015-04-04 01:13:50 -0700
commit1a3c90165cb6bac4a2e57d9897d6829de0ccc6fc (patch)
tree604f4b5b02b1e24c7c5aad5c4560b0cf53cf9289 /public/js/chat.js
Diffstat (limited to 'public/js/chat.js')
-rw-r--r--public/js/chat.js93
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);