Просмотр исходного кода

Adjust functions using Uploader.setData to handle promises

rugk 7 лет назад
Родитель
Сommit
746debf586
1 измененных файлов с 39 добавлено и 27 удалено
  1. 39 27
      js/privatebin.js

+ 39 - 27
js/privatebin.js

@@ -3764,14 +3764,15 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
          * encrypts and sets the data
          *
          * @name   Uploader.setData
+         * @async
          * @function
          * @param {string} index
          * @param {mixed} element
          */
-        me.setData = function(index, element)
+        me.setData = async function(index, element)
         {
             checkCryptParameters();
-            data[index] = CryptTool.cipher(symmetricKey, password, element);
+            data[index] = await CryptTool.cipher(symmetricKey, password, element);
         };
 
         /**
@@ -3922,34 +3923,40 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
         function encryptAttachments(callback) {
             var file = AttachmentViewer.getAttachmentData();
 
+            let encryptAttachmentPromise, encryptAttachmentNamePromise;
             if (typeof file !== 'undefined' && file !== null) {
                 var fileName = AttachmentViewer.getFile().name;
 
-                Uploader.setData('attachment', file);
-                Uploader.setData('attachmentname', fileName);
-
-                // run callback
-                return callback();
+                // run concurrently to encrypt everything
+                encryptAttachmentPromise = Uploader.setData('attachment', file);
+                encryptAttachmentNamePromise = Uploader.setData('attachmentname', fileName);
             } else if (AttachmentViewer.hasAttachment()) {
                 // fall back to cloned part
                 var attachment = AttachmentViewer.getAttachment();
 
-                Uploader.setData('attachment', attachment[0]);
-                Uploader.setData('attachmentname', attachment[1]);
-                return callback();
+                encryptAttachmentPromise = Uploader.setData('attachment', attachment[0]);
+                encryptAttachmentNamePromise = Uploader.setData('attachmentname', attachment[1]);
             } else {
                 // if there are no attachments, this is of course still successful
                 return callback();
             }
+
+            // TODO: change this callback to also use Promises instead,
+            // this here just waits
+            Promise.all([encryptAttachmentPromise, encryptAttachmentNamePromise]).then(() => {
+                // run callback
+                return callback();
+            });
         }
 
         /**
          * send a reply in a discussion
          *
+         * @async
          * @name   PasteEncrypter.sendComment
          * @function
          */
-        me.sendComment = function()
+        me.sendComment = async function()
         {
             Alert.hideMessages();
             Alert.setCustomHandler(DiscussionViewer.handleNotification);
@@ -4004,25 +4011,30 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
 
             // encrypt data
             try {
-                Uploader.setData('data', plainText);
+                // start promisesat the same time and wait thereafter
+                let settingData = [];
+                settingData.push(Uploader.setData('data', plainText));
+
+                if (nickname.length > 0) {
+                    settingData(Uploader.setData('nickname', nickname));
+                }
+
+                await Promise.all(settingData);
             } catch (e) {
                 Alert.showError(e);
             }
 
-            if (nickname.length > 0) {
-                Uploader.setData('nickname', nickname);
-            }
-
             Uploader.run();
         };
 
         /**
          * sends a new paste to server
          *
+         * @async
          * @name   PasteEncrypter.sendPaste
          * @function
          */
-        me.sendPaste = function()
+        me.sendPaste = async function()
         {
             // hide previous (error) messages
             Controller.hideStatusMessages();
@@ -4075,20 +4087,20 @@ jQuery.PrivateBin = (function($, sjcl, RawDeflate) {
             PasteViewer.setText(plainText);
             PasteViewer.setFormat(format);
 
-            // encrypt cipher data
-            try {
-                Uploader.setData('data', plainText);
-            } catch (e) {
-                Alert.showError(e);
-            }
-
             // encrypt attachments
-            encryptAttachments(
+            const encryptAttachmentsPromise = encryptAttachments(
                 function () {
-                    // send data
-                    Uploader.run();
+                    // TODO: remove, is not needed anymore as we use Promises
                 }
             );
+
+            // encrypt plain text
+            const encryptDataPromise = Uploader.setData('data', plainText);
+
+            await Promise.all([encryptAttachmentsPromise, encryptDataPromise]).catch(Alert.showError);
+
+            // send data
+            Uploader.run();
         };
 
         /**