summaryrefslogtreecommitdiff
path: root/lib/workers
diff options
context:
space:
mode:
authorWu Cheng-Han2017-03-13 18:56:32 +0800
committerWu Cheng-Han2017-03-13 18:56:32 +0800
commitedb1b4aa0a72ac8b0215211c9dbc54156c3ff91f (patch)
treefb5f8ddbfe9001e266b3b2487c3b2e62fbd2bbb5 /lib/workers
parentc818cde78285490ec2931b68a72898f9754a6d81 (diff)
parent8246ac38506f8d62e2dd9699dcc4d62f14b65784 (diff)
Merge branch 'master' of https://github.com/jackycute/HackMD
Diffstat (limited to 'lib/workers')
-rw-r--r--lib/workers/dmpWorker.js249
1 files changed, 123 insertions, 126 deletions
diff --git a/lib/workers/dmpWorker.js b/lib/workers/dmpWorker.js
index 8e69636e..6a1da981 100644
--- a/lib/workers/dmpWorker.js
+++ b/lib/workers/dmpWorker.js
@@ -1,140 +1,137 @@
// external modules
-var DiffMatchPatch = require('diff-match-patch');
-var dmp = new DiffMatchPatch();
+var DiffMatchPatch = require('diff-match-patch')
+var dmp = new DiffMatchPatch()
// core
-var config = require("../config.js");
-var logger = require("../logger.js");
+var config = require('../config.js')
+var logger = require('../logger.js')
-process.on('message', function(data) {
- if (!data || !data.msg || !data.cacheKey) {
- return logger.error('dmp worker error: not enough data');
- }
- switch (data.msg) {
- case 'create patch':
- if (!data.hasOwnProperty('lastDoc') || !data.hasOwnProperty('currDoc')) {
- return logger.error('dmp worker error: not enough data on create patch');
- }
- try {
- var patch = createPatch(data.lastDoc, data.currDoc);
- process.send({
- msg: 'check',
- result: patch,
- cacheKey: data.cacheKey
- });
- } catch (err) {
- logger.error('dmp worker error', err);
- process.send({
- msg: 'error',
- error: err,
- cacheKey: data.cacheKey
- });
- }
- break;
- case 'get revision':
- if (!data.hasOwnProperty('revisions') || !data.hasOwnProperty('count')) {
- return logger.error('dmp worker error: not enough data on get revision');
- }
- try {
- var result = getRevision(data.revisions, data.count);
- process.send({
- msg: 'check',
- result: result,
- cacheKey: data.cacheKey
- });
- } catch (err) {
- logger.error('dmp worker error', err);
- process.send({
- msg: 'error',
- error: err,
- cacheKey: data.cacheKey
- });
- }
- break;
- }
-});
+process.on('message', function (data) {
+ if (!data || !data.msg || !data.cacheKey) {
+ return logger.error('dmp worker error: not enough data')
+ }
+ switch (data.msg) {
+ case 'create patch':
+ if (!data.hasOwnProperty('lastDoc') || !data.hasOwnProperty('currDoc')) {
+ return logger.error('dmp worker error: not enough data on create patch')
+ }
+ try {
+ var patch = createPatch(data.lastDoc, data.currDoc)
+ process.send({
+ msg: 'check',
+ result: patch,
+ cacheKey: data.cacheKey
+ })
+ } catch (err) {
+ logger.error('dmp worker error', err)
+ process.send({
+ msg: 'error',
+ error: err,
+ cacheKey: data.cacheKey
+ })
+ }
+ break
+ case 'get revision':
+ if (!data.hasOwnProperty('revisions') || !data.hasOwnProperty('count')) {
+ return logger.error('dmp worker error: not enough data on get revision')
+ }
+ try {
+ var result = getRevision(data.revisions, data.count)
+ process.send({
+ msg: 'check',
+ result: result,
+ cacheKey: data.cacheKey
+ })
+ } catch (err) {
+ logger.error('dmp worker error', err)
+ process.send({
+ msg: 'error',
+ error: err,
+ cacheKey: data.cacheKey
+ })
+ }
+ break
+ }
+})
-function createPatch(lastDoc, currDoc) {
- var ms_start = (new Date()).getTime();
- var diff = dmp.diff_main(lastDoc, currDoc);
- var patch = dmp.patch_make(lastDoc, diff);
- patch = dmp.patch_toText(patch);
- var ms_end = (new Date()).getTime();
- if (config.debug) {
- logger.info(patch);
- logger.info((ms_end - ms_start) + 'ms');
- }
- return patch;
+function createPatch (lastDoc, currDoc) {
+ var msStart = (new Date()).getTime()
+ var diff = dmp.diff_main(lastDoc, currDoc)
+ var patch = dmp.patch_make(lastDoc, diff)
+ patch = dmp.patch_toText(patch)
+ var msEnd = (new Date()).getTime()
+ if (config.debug) {
+ logger.info(patch)
+ logger.info((msEnd - msStart) + 'ms')
+ }
+ return patch
}
-function getRevision(revisions, count) {
- var ms_start = (new Date()).getTime();
- var startContent = null;
- var lastPatch = [];
- var applyPatches = [];
- var authorship = [];
- if (count <= Math.round(revisions.length / 2)) {
- // start from top to target
- for (var i = 0; i < count; i++) {
- var revision = revisions[i];
- if (i == 0) {
- startContent = revision.content || revision.lastContent;
- }
- if (i != count - 1) {
- var patch = dmp.patch_fromText(revision.patch);
- applyPatches = applyPatches.concat(patch);
- }
- lastPatch = revision.patch;
- authorship = revision.authorship;
- }
- // swap DIFF_INSERT and DIFF_DELETE to achieve unpatching
- for (var i = 0, l = applyPatches.length; i < l; i++) {
- for (var j = 0, m = applyPatches[i].diffs.length; j < m; j++) {
- var diff = applyPatches[i].diffs[j];
- if (diff[0] == DiffMatchPatch.DIFF_INSERT)
- diff[0] = DiffMatchPatch.DIFF_DELETE;
- else if (diff[0] == DiffMatchPatch.DIFF_DELETE)
- diff[0] = DiffMatchPatch.DIFF_INSERT;
- }
- }
- } else {
- // start from bottom to target
- var l = revisions.length - 1;
- for (var i = l; i >= count - 1; i--) {
- var revision = revisions[i];
- if (i == l) {
- startContent = revision.lastContent;
- authorship = revision.authorship;
- }
- if (revision.patch) {
- var patch = dmp.patch_fromText(revision.patch);
- applyPatches = applyPatches.concat(patch);
- }
- lastPatch = revision.patch;
- authorship = revision.authorship;
- }
+function getRevision (revisions, count) {
+ var msStart = (new Date()).getTime()
+ var startContent = null
+ var lastPatch = []
+ var applyPatches = []
+ var authorship = []
+ if (count <= Math.round(revisions.length / 2)) {
+ // start from top to target
+ for (let i = 0; i < count; i++) {
+ let revision = revisions[i]
+ if (i === 0) {
+ startContent = revision.content || revision.lastContent
+ }
+ if (i !== count - 1) {
+ let patch = dmp.patch_fromText(revision.patch)
+ applyPatches = applyPatches.concat(patch)
+ }
+ lastPatch = revision.patch
+ authorship = revision.authorship
}
- try {
- var finalContent = dmp.patch_apply(applyPatches, startContent)[0];
- } catch (err) {
- throw new Error(err);
+ // swap DIFF_INSERT and DIFF_DELETE to achieve unpatching
+ for (let i = 0, l = applyPatches.length; i < l; i++) {
+ for (let j = 0, m = applyPatches[i].diffs.length; j < m; j++) {
+ var diff = applyPatches[i].diffs[j]
+ if (diff[0] === DiffMatchPatch.DIFF_INSERT) { diff[0] = DiffMatchPatch.DIFF_DELETE } else if (diff[0] === DiffMatchPatch.DIFF_DELETE) { diff[0] = DiffMatchPatch.DIFF_INSERT }
+ }
}
- var data = {
- content: finalContent,
- patch: dmp.patch_fromText(lastPatch),
- authorship: authorship
- };
- var ms_end = (new Date()).getTime();
- if (config.debug) {
- logger.info((ms_end - ms_start) + 'ms');
+ } else {
+ // start from bottom to target
+ var l = revisions.length - 1
+ for (var i = l; i >= count - 1; i--) {
+ let revision = revisions[i]
+ if (i === l) {
+ startContent = revision.lastContent
+ authorship = revision.authorship
+ }
+ if (revision.patch) {
+ let patch = dmp.patch_fromText(revision.patch)
+ applyPatches = applyPatches.concat(patch)
+ }
+ lastPatch = revision.patch
+ authorship = revision.authorship
}
- return data;
+ }
+ try {
+ var finalContent = dmp.patch_apply(applyPatches, startContent)[0]
+ } catch (err) {
+ throw new Error(err)
+ }
+ var data = {
+ content: finalContent,
+ patch: dmp.patch_fromText(lastPatch),
+ authorship: authorship
+ }
+ var msEnd = (new Date()).getTime()
+ if (config.debug) {
+ logger.info((msEnd - msStart) + 'ms')
+ }
+ return data
}
// log uncaught exception
process.on('uncaughtException', function (err) {
- logger.error('An uncaught exception has occured.');
- logger.error(err);
- logger.error('Process will exit now.');
- process.exit(1);
-}); \ No newline at end of file
+ logger.error('An uncaught exception has occured.')
+ logger.error(err)
+ logger.error('Process will exit now.')
+ process.exit(1)
+})