main.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. var Uploader = {
  2. roomId: null,
  3. createRoom: function() {
  4. var self = this;
  5. $.post('/room', {}, function(response) {
  6. self.roomId = $.parseJSON(response).id
  7. })
  8. },
  9. getRoom: function(callback) {
  10. $.getJSON('/room/'+this.roomId, callback)
  11. },
  12. getFile: function(fileName, callback) {
  13. var xhr = new XMLHttpRequest();
  14. xhr.open('GET', '/room/'+this.roomId+'/'+fileName, true);
  15. xhr.responseType = 'arraybuffer';
  16. xhr.onload = callback;
  17. xhr.send();
  18. },
  19. deleteRoom: function() {
  20. $.ajax({
  21. type: 'DELETE',
  22. url: '/room/'+this.roomId
  23. })
  24. },
  25. uploadFile: function(name, data){
  26. var formData = new FormData();
  27. formData.append("file", data, name);
  28. $.ajax({
  29. url: '/room/'+this.roomId,
  30. data: formData,
  31. cache: false,
  32. processData: false,
  33. contentType: false,
  34. xhr: function () {
  35. var xhr = new XMLHttpRequest()
  36. //xhr.upload.addEventListener('progress', progress, false)
  37. return xhr
  38. },
  39. type: 'POST'
  40. });
  41. },
  42. deleteFile: function() {
  43. console.log('NOPE');
  44. },
  45. }
  46. var CryptoUploader = {
  47. createRoom: function() {
  48. Uploader.createRoom();
  49. CryptoUtils.initialize()
  50. .then(function(){
  51. window.location = window.location.href+"#"+Uploader.roomId+","+CryptoUtils.urlSafeKey;
  52. window.location.reload();
  53. })
  54. },
  55. uploadFile: function() {
  56. var fileReader = new FileReader();
  57. var data;
  58. var file = document.getElementById("file-selector").files[0];
  59. var self = this;
  60. fileReader.onload = function(e) {
  61. this.data = fileReader.result;
  62. CryptoUtils.encrypt(this.data)
  63. .then(function(encrypted){
  64. Uploader.uploadFile(file.name, encrypted);
  65. self.showRoomContent();
  66. }).catch(function(err){
  67. console.error(err);
  68. });
  69. };
  70. fileReader.readAsArrayBuffer(file);
  71. },
  72. downloadFile: function(fileName) {
  73. Uploader.getFile(fileName, function(e){
  74. if(this.status == 200) {
  75. CryptoUtils.decrypt(this.response).
  76. then(function(decrypted){
  77. var a = document.createElement("a");
  78. document.body.appendChild(a);
  79. a.style = "display: none";
  80. blob = new Blob([decrypted], {type: "application/octet-binary"}),
  81. url = window.URL.createObjectURL(blob);
  82. a.href = url;
  83. a.download = fileName;
  84. a.click();
  85. window.URL.revokeObjectURL(url);
  86. }).catch(function(err){
  87. console.error(err);
  88. })
  89. }
  90. })
  91. },
  92. showRoomContent: function() {
  93. $("#file-list > ul").empty();
  94. Uploader.getRoom(function(data){
  95. for(let f of data.entries()) {
  96. $("<li><a>"+f[1]+"</a></li>")
  97. .appendTo("#file-list > ul")
  98. .on('click', function(e){CryptoUploader.downloadFile(e.target.text)});
  99. }
  100. })
  101. }
  102. }
  103. $(function(){
  104. if(window.location.hash) {
  105. var params = window.location.hash.substr(1).split(',');
  106. var roomId = params.shift();
  107. var key = params.shift();
  108. var file = params.shift();
  109. $("#create-room").hide();
  110. $("#room").show();
  111. Uploader.roomId = roomId;
  112. CryptoUtils.initialize(key).then(function(){
  113. $("#woot").on('click', function(){
  114. CryptoUploader.uploadFile();
  115. });
  116. CryptoUploader.showRoomContent();
  117. if(file !== undefined) {
  118. CryptoUploader.downloadFile(file);
  119. }
  120. }).catch(function(err){
  121. console.error(err);
  122. });
  123. }
  124. else {
  125. $("#room").hide();
  126. $("#create-room").show();
  127. $("#create-room > input").on('click', function(e){
  128. CryptoUploader.createRoom();
  129. });
  130. }
  131. })