summaryrefslogtreecommitdiff
path: root/node_modules/ws/examples/fileapi/public
diff options
context:
space:
mode:
authoryo mama <pepper@scannerjammer.com>2015-03-20 17:33:43 -0700
committeryo mama <pepper@scannerjammer.com>2015-03-20 17:33:43 -0700
commit2afbcf4e7d000d99fdbc582d7113684ee00e80cc (patch)
tree6ba3313b78625735fb295e3d375e59054c31e558 /node_modules/ws/examples/fileapi/public
first
Diffstat (limited to 'node_modules/ws/examples/fileapi/public')
-rw-r--r--node_modules/ws/examples/fileapi/public/app.js39
-rw-r--r--node_modules/ws/examples/fileapi/public/index.html22
-rw-r--r--node_modules/ws/examples/fileapi/public/uploader.js55
3 files changed, 116 insertions, 0 deletions
diff --git a/node_modules/ws/examples/fileapi/public/app.js b/node_modules/ws/examples/fileapi/public/app.js
new file mode 100644
index 0000000..e812cc3
--- /dev/null
+++ b/node_modules/ws/examples/fileapi/public/app.js
@@ -0,0 +1,39 @@
+function onFilesSelected(e) {
+ var button = e.srcElement;
+ button.disabled = true;
+ var progress = document.querySelector('div#progress');
+ progress.innerHTML = '0%';
+ var files = e.target.files;
+ var totalFiles = files.length;
+ var filesSent = 0;
+ if (totalFiles) {
+ var uploader = new Uploader('ws://localhost:8080', function () {
+ Array.prototype.slice.call(files, 0).forEach(function(file) {
+ if (file.name == '.') {
+ --totalFiles;
+ return;
+ }
+ uploader.sendFile(file, function(error) {
+ if (error) {
+ console.log(error);
+ return;
+ }
+ ++filesSent;
+ progress.innerHTML = ~~(filesSent / totalFiles * 100) + '%';
+ console.log('Sent: ' + file.name);
+ });
+ });
+ });
+ }
+ uploader.ondone = function() {
+ uploader.close();
+ progress.innerHTML = '100% done, ' + totalFiles + ' files sent.';
+ }
+}
+
+window.onload = function() {
+ var importButtons = document.querySelectorAll('[type="file"]');
+ Array.prototype.slice.call(importButtons, 0).forEach(function(importButton) {
+ importButton.addEventListener('change', onFilesSelected, false);
+ });
+}
diff --git a/node_modules/ws/examples/fileapi/public/index.html b/node_modules/ws/examples/fileapi/public/index.html
new file mode 100644
index 0000000..0d463dd
--- /dev/null
+++ b/node_modules/ws/examples/fileapi/public/index.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <style>
+ body {
+ font-family: Tahoma, Geneva, sans-serif;
+ }
+ div {
+ display: inline;
+ }
+ </style>
+ <script src='uploader.js'></script>
+ <script src='app.js'></script>
+ </head>
+ <body>
+ <p>This example will upload an entire directory tree to the node.js server via a fast and persistent WebSocket connection.</p>
+ <p>Note that the example is Chrome only for now.</p>
+ <input type="file" webkitdirectory /><br/><br/>
+ Upload status:
+ <div id='progress'>Please select a directory to upload.</div>
+ </body>
+</html>
diff --git a/node_modules/ws/examples/fileapi/public/uploader.js b/node_modules/ws/examples/fileapi/public/uploader.js
new file mode 100644
index 0000000..0c34a7f
--- /dev/null
+++ b/node_modules/ws/examples/fileapi/public/uploader.js
@@ -0,0 +1,55 @@
+function Uploader(url, cb) {
+ this.ws = new WebSocket(url);
+ if (cb) this.ws.onopen = cb;
+ this.sendQueue = [];
+ this.sending = null;
+ this.sendCallback = null;
+ this.ondone = null;
+ var self = this;
+ this.ws.onmessage = function(event) {
+ var data = JSON.parse(event.data);
+ if (data.event == 'complete') {
+ if (data.path != self.sending.path) {
+ self.sendQueue = [];
+ self.sending = null;
+ self.sendCallback = null;
+ throw new Error('Got message for wrong file!');
+ }
+ self.sending = null;
+ var callback = self.sendCallback;
+ self.sendCallback = null;
+ if (callback) callback();
+ if (self.sendQueue.length === 0 && self.ondone) self.ondone(null);
+ if (self.sendQueue.length > 0) {
+ var args = self.sendQueue.pop();
+ setTimeout(function() { self.sendFile.apply(self, args); }, 0);
+ }
+ }
+ else if (data.event == 'error') {
+ self.sendQueue = [];
+ self.sending = null;
+ var callback = self.sendCallback;
+ self.sendCallback = null;
+ var error = new Error('Server reported send error for file ' + data.path);
+ if (callback) callback(error);
+ if (self.ondone) self.ondone(error);
+ }
+ }
+}
+
+Uploader.prototype.sendFile = function(file, cb) {
+ if (this.ws.readyState != WebSocket.OPEN) throw new Error('Not connected');
+ if (this.sending) {
+ this.sendQueue.push(arguments);
+ return;
+ }
+ var fileData = { name: file.name, path: file.webkitRelativePath };
+ this.sending = fileData;
+ this.sendCallback = cb;
+ this.ws.send(JSON.stringify(fileData));
+ this.ws.send(file);
+}
+
+Uploader.prototype.close = function() {
+ this.ws.close();
+}