main.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. var Uploader = {
  2. roomId: null,
  3. createRoom: function(callback) {
  4. var self = this;
  5. $.post('/room', {}, function(response) {
  6. callback($.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+'/'+encodeURIComponent(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(function(roomId){
  49. CryptoUtils.initialize()
  50. .then(function(){
  51. window.location = window.location.href+"#"+roomId+","+CryptoUtils.urlSafeKey;
  52. window.location.reload();
  53. })
  54. });
  55. },
  56. uploadFile: function() {
  57. var fileReader = new FileReader();
  58. var data;
  59. var file = document.getElementById("file-selector").files[0];
  60. var self = this;
  61. fileReader.onload = function(e) {
  62. this.data = fileReader.result;
  63. CryptoUtils.encrypt(this.data)
  64. .then(function(encrypted){
  65. Uploader.uploadFile(file.name, encrypted);
  66. self.showRoomContent();
  67. }).catch(function(err){
  68. console.error(err);
  69. });
  70. };
  71. fileReader.readAsArrayBuffer(file);
  72. },
  73. downloadFile: function(fileName) {
  74. Uploader.getFile(fileName, function(e){
  75. if(this.status == 200) {
  76. CryptoUtils.decrypt(this.response).
  77. then(function(decrypted){
  78. var a = document.createElement("a");
  79. document.body.appendChild(a);
  80. a.style = "display: none";
  81. blob = new Blob([decrypted], {type: "application/octet-binary"}),
  82. url = window.URL.createObjectURL(blob);
  83. a.href = url;
  84. a.download = fileName;
  85. a.click();
  86. window.URL.revokeObjectURL(url);
  87. }).catch(function(err){
  88. console.error(err);
  89. })
  90. }
  91. })
  92. },
  93. showRoomContent: function() {
  94. $("#file-list > ul").empty();
  95. Uploader.getRoom(function(data){
  96. for(let f of data.entries()) {
  97. $("<li><a>"+f[1]+"</a></li>")
  98. .appendTo("#file-list > ul")
  99. .on('click', function(e){CryptoUploader.downloadFile(e.target.text)});
  100. }
  101. })
  102. }
  103. }
  104. $(function(){
  105. if(window.location.hash) {
  106. var params = window.location.hash.substr(1).split(',');
  107. var roomId = params.shift();
  108. var key = params.shift();
  109. var file = params.shift();
  110. $("#create-room").hide();
  111. $("#room").show();
  112. Uploader.roomId = roomId;
  113. CryptoUtils.initialize(key).then(function(){
  114. $("#woot").on('click', function(){
  115. CryptoUploader.uploadFile();
  116. });
  117. CryptoUploader.showRoomContent();
  118. if(file !== undefined) {
  119. CryptoUploader.downloadFile(file);
  120. }
  121. }).catch(function(err){
  122. console.error(err);
  123. });
  124. }
  125. else {
  126. $("#room").hide();
  127. $("#create-room > input").show().on('click', function(e){
  128. CryptoUploader.createRoom();
  129. });
  130. }
  131. })