Browse Source

feat: sync meta data

Gerald 9 years ago
parent
commit
5c6a8a9031
4 changed files with 48 additions and 13 deletions
  1. 2 1
      src/background/db.js
  2. 7 3
      src/background/main.js
  3. 2 2
      src/background/sync/dropbox.js
  4. 37 7
      src/background/sync/index.js

+ 2 - 1
src/background/db.js

@@ -352,7 +352,7 @@ VMDB.prototype.setValue = function (uri, values) {
   });
 };
 
-VMDB.prototype.updateScriptInfo = function (id, data) {
+VMDB.prototype.updateScriptInfo = function (id, data, custom) {
   var o = this.db.transaction('scripts', 'readwrite').objectStore('scripts');
   return new Promise(function (resolve, reject) {
     o.get(id).onsuccess = function (e) {
@@ -360,6 +360,7 @@ VMDB.prototype.updateScriptInfo = function (id, data) {
       if (!script) return reject();
       for (var k in data)
         if (k in script) script[k] = data[k];
+      _.assign(script.custom, custom);
       o.put(script).onsuccess = function (e) {
         resolve(scriptUtils.getScriptInfo(script));
       };

+ 7 - 3
src/background/main.js

@@ -5,9 +5,9 @@ var commands = {
     return Promise.resolve(scriptUtils.newScript());
   },
   RemoveScript: function (id, src) {
-    sync.sync();
     return vmdb.removeScript(id)
     .then(function () {
+      sync.sync();
       _.messenger.post({
         cmd: 'del',
         data: id,
@@ -26,7 +26,7 @@ var commands = {
       injectMode: _.options.get('injectMode'),
       version: VM_VER,
     };
-    if(src.url == src.tab.url)
+    if (src.url == src.tab.url)
       chrome.tabs.sendMessage(src.tab.id, {cmd: 'GetBadge'});
     return data.isApplied
     ? vmdb.getScriptsByURL(url).then(function (res) {
@@ -34,7 +34,11 @@ var commands = {
     }) : Promise.resolve(data);
   },
   UpdateScriptInfo: function (data, src) {
-    return vmdb.updateScriptInfo(data.id, data).then(function (script) {
+    return vmdb.updateScriptInfo(data.id, data, {
+      modified: Date.now(),
+    })
+    .then(function (script) {
+      sync.sync();
       _.messenger.post({
         cmd: 'update',
         data: script,

+ 2 - 2
src/background/sync/dropbox.js

@@ -70,7 +70,7 @@ setTimeout(function () {
   function normalize(item) {
     return {
       size: item.size,
-      uri: decodeURIComponent(item.name.slice(0, -8)),
+      uri: sync.utils.getURI(item.name),
       modified: new Date(item.server_modified).getTime(),
       //is_deleted: item.is_deleted,
     };
@@ -170,7 +170,7 @@ setTimeout(function () {
     })
     .then(function (data) {
       return data.entries.filter(function (item) {
-        return item['.tag'] === 'file' && /\.user\.js$/.test(item.name);
+        return item['.tag'] === 'file' && sync.utils.isScriptFile(item.name);
       }).map(normalize);
     });
   };

+ 37 - 7
src/background/sync/index.js

@@ -153,7 +153,13 @@ var sync = function () {
     services.forEach(initService);
   }
   function getFilename(uri) {
-    return encodeURIComponent(uri) + '.user.js';
+    return 'vm-' + encodeURIComponent(uri);
+  }
+  function getURI(name) {
+    return decodeURIComponent(name.slice(3));
+  }
+  function isScriptFile(name) {
+    return /^vm-/.test(name);
   }
   function syncOne(service) {
     if (!service.inst) return;
@@ -216,18 +222,37 @@ var sync = function () {
       var promises = [].concat(
         getRemote.map(function (item) {
           console.log('Download script:', item.uri);
-          return service.inst.get(getFilename(item.uri)).then(function (code) {
-            return vmdb.parseScript({
-              code: code,
-              modified: item.modified,
-            }).then(function (res) {
+          return service.inst.get(getFilename(item.uri)).then(function (raw) {
+            var data = {};
+            try {
+              var obj = JSON.parse(raw);
+              if (obj.version === 1) {
+                data.code = obj.code;
+                data.more = obj.more;
+              }
+            } catch (e) {
+              data.code = raw;
+            }
+            data.modified = item.modified;
+            return vmdb.parseScript(data)
+            .then(function (res) {
               _.messenger.post(res);
             });
           });
         }),
         putRemote.map(function (item) {
           console.log('Upload script:', item.uri);
-          return service.inst.put(getFilename(item.uri), item.code).then(function (data) {
+          var data = JSON.stringify({
+            version: 1,
+            code: item.code,
+            more: {
+              custom: item.custom,
+              enabled: item.enabled,
+              update: item.update,
+            },
+          });
+          return service.inst.put(getFilename(item.uri), data)
+          .then(function (data) {
             if (item.custom.modified !== data.modified) {
               item.custom.modified = data.modified;
               return vmdb.saveScript(item);
@@ -277,5 +302,10 @@ var sync = function () {
     sync: sync,
     service: service,
     status: getStatuses,
+    utils: {
+      getFilename: getFilename,
+      isScriptFile: isScriptFile,
+      getURI: getURI,
+    },
   };
 }();