deaddrop.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. (function() {
  2. var server_max_size = 0, ws;
  3. function san(s)
  4. {
  5. if (!s)
  6. return "";
  7. return s.replace(/&/g, "&").
  8. replace(/\</g, "&lt;").
  9. replace(/\>/g, "&gt;").
  10. replace(/\"/g, "&quot;").
  11. replace(/%/g, "&#37;");
  12. }
  13. function lws_urlencode(s)
  14. {
  15. return encodeURI(s).replace(/@/g, "%40");
  16. }
  17. function trim(num)
  18. {
  19. var s = num.toString();
  20. if (!s.indexOf("."))
  21. return s;
  22. while (s.length && s[s.length - 1] === "0")
  23. s = s.substring(0, s.length - 1);
  24. if (s[s.length - 1] === ".")
  25. s = s.substring(0, s.length - 1);
  26. return s;
  27. }
  28. function humanize(n)
  29. {
  30. if (n < 1024)
  31. return n + "B";
  32. if (n < 1024 * 1024)
  33. return trim((n / 1024).toFixed(2)) + "KiB";
  34. if (n < 1024 * 1024 * 1024)
  35. return trim((n / (1024 * 1024)).toFixed(2)) + "MiB";
  36. return trim((n / (1024 * 1024 * 1024)).toFixed(2)) + "GiB";
  37. }
  38. function da_enter(e)
  39. {
  40. var da = document.getElementById("da");
  41. e.preventDefault();
  42. da.classList.add("trot");
  43. }
  44. function da_leave(e)
  45. {
  46. var da = document.getElementById("da");
  47. e.preventDefault();
  48. da.classList.remove("trot");
  49. }
  50. function da_over(e)
  51. {
  52. var da = document.getElementById("da");
  53. e.preventDefault();
  54. da.classList.add("trot");
  55. }
  56. function clear_errors() {
  57. var n, t = document.getElementById("ongoing");
  58. for (n = 0; n < t.rows.length; n++)
  59. if (t.rows[n].cells[0].classList.contains("err"))
  60. t.deleteRow(n);
  61. }
  62. function do_upload(file) {
  63. var formData = new FormData();
  64. var t = document.getElementById("ongoing");
  65. formData.append("file", file);
  66. var row = t.insertRow(0), c1 = row.insertCell(0),
  67. c2 = row.insertCell(1), c3 = row.insertCell(2);
  68. c1.classList.add("ogn");
  69. c1.classList.add("r");
  70. if (file.size > server_max_size) {
  71. c1.innerHTML = "Too Large";
  72. c1.classList.add("err");
  73. } else
  74. c1.innerHTML = "<img class=\"working\">";
  75. c2.classList.add("ogn");
  76. c2.classList.add("r");
  77. c2.innerHTML = humanize(file.size);
  78. c3.classList.add("ogn");
  79. c3.innerHTML = file.name;
  80. if (file.size > server_max_size)
  81. return;
  82. fetch("upload/" + lws_urlencode(file.name), {
  83. method: "POST",
  84. body: formData
  85. })
  86. .then((e) => { /* this just means we got a response code */
  87. var us = e.url.split("/"), ul = us[us.length - 1], n;
  88. for (n = 0; n < t.rows.length; n++)
  89. if (ul === lws_urlencode(
  90. t.rows[n].cells[2].textContent)) {
  91. if (e.ok === true) {
  92. t.deleteRow(n);
  93. } else {
  94. t.rows[n].cells[0].textContent =
  95. "Failed " + san(e.status.toString());
  96. t.rows[n].cells[0].
  97. classList.add("err");
  98. }
  99. break;
  100. }
  101. })
  102. .catch((e) => {
  103. var us = e.url.split("/"), ul = us[us.length - 1], n;
  104. for (n = 0; n < t.rows.length; n++)
  105. if (ul === lws_urlencode(
  106. t.rows[n].cells[2].textContent)) {
  107. t.rows[n].cells[0] = "FAIL";
  108. break;
  109. }
  110. });
  111. }
  112. function da_drop(e) {
  113. var da = document.getElementById("da");
  114. e.preventDefault();
  115. da.classList.remove("trot");
  116. clear_errors();
  117. ([...e.dataTransfer.files]).forEach(do_upload);
  118. }
  119. function upl_button(e) {
  120. var fi = document.getElementById("file");
  121. clear_errors();
  122. e.preventDefault();
  123. ([...fi.files]).forEach(do_upload);
  124. }
  125. function body_drop(e) {
  126. e.preventDefault();
  127. }
  128. function inp() {
  129. var fi = document.getElementById("file"),
  130. upl = document.getElementById("upl");
  131. console.log("inp");
  132. upl.disabled = !fi.files.length;
  133. }
  134. function delfile(e)
  135. {
  136. e.stopPropagation();
  137. e.preventDefault();
  138. ws.send("{\"del\":\"" + decodeURI(e.target.getAttribute("file")) +
  139. "\"}");
  140. }
  141. function get_appropriate_ws_url(extra_url)
  142. {
  143. var pcol;
  144. var u = document.URL;
  145. /*
  146. * We open the websocket encrypted if this page came on an
  147. * https:// url itself, otherwise unencrypted
  148. */
  149. if (u.substring(0, 5) === "https") {
  150. pcol = "wss://";
  151. u = u.substr(8);
  152. } else {
  153. pcol = "ws://";
  154. if (u.substring(0, 4) === "http")
  155. u = u.substr(7);
  156. }
  157. u = u.split("/");
  158. /* + "/xxx" bit is for IE10 workaround */
  159. return pcol + u[0] + "/" + extra_url;
  160. }
  161. function new_ws(urlpath, protocol)
  162. {
  163. return new WebSocket(urlpath, protocol);
  164. }
  165. document.addEventListener("DOMContentLoaded", function() {
  166. var da = document.getElementById("da"),
  167. fi = document.getElementById("file"),
  168. upl = document.getElementById("upl");
  169. da.addEventListener("dragenter", da_enter, false);
  170. da.addEventListener("dragleave", da_leave, false);
  171. da.addEventListener("dragover", da_over, false);
  172. da.addEventListener("drop", da_drop, false);
  173. upl.addEventListener("click", upl_button, false);
  174. fi.addEventListener("change", inp, false);
  175. window.addEventListener("dragover", body_drop, false);
  176. window.addEventListener("drop", body_drop, false);
  177. ws = new_ws(get_appropriate_ws_url(""), "lws-deaddrop");
  178. try {
  179. ws.onopen = function() {
  180. var dd = document.getElementById("ddrop"),
  181. da = document.getElementById("da");
  182. dd.classList.remove("noconn");
  183. da.classList.remove("disa");
  184. };
  185. ws.onmessage = function got_packet(msg) {
  186. var j = JSON.parse(msg.data), s = "", n,
  187. t = document.getElementById("dd-list");
  188. server_max_size = j.max_size;
  189. document.getElementById("size").innerHTML =
  190. "Server maximum file size " +
  191. humanize(j.max_size);
  192. s += "<table class=\"nb\">";
  193. for (n = 0; n < j.files.length; n++) {
  194. var date = new Date(j.files[n].mtime * 1000);
  195. s += "<tr><td class=\"dow r\">" +
  196. humanize(j.files[n].size) +
  197. "</td><td class=\"dow\">" +
  198. date.toDateString() + " " +
  199. date.toLocaleTimeString() +
  200. "</td><td>";
  201. if (j.files[n].yours === 1)
  202. s += "<img id=\"d" + n +
  203. "\" class=\"delbtn\" file=\"" +
  204. lws_urlencode(san(j.files[n].name)) + "\">";
  205. else
  206. s += " ";
  207. s += "</td><td class=\"ogn\"><a href=\"get/" +
  208. lws_urlencode(san(j.files[n].name)) +
  209. "\" download>" +
  210. san(j.files[n].name) + "</a></td></tr>";
  211. }
  212. s += "</table>";
  213. t.innerHTML = s;
  214. for (n = 0; n < j.files.length; n++) {
  215. var d = document.getElementById("d" + n);
  216. if (d)
  217. d.addEventListener("click",
  218. delfile, false);
  219. }
  220. };
  221. ws.onclose = function() {
  222. var dd = document.getElementById("ddrop"),
  223. da = document.getElementById("da");
  224. dd.classList.add("noconn");
  225. da.classList.add("disa");
  226. };
  227. } catch(exception) {
  228. alert("<p>Error " + exception);
  229. }
  230. });
  231. }());