Refactor: pull out editor worker
This commit is contained in:
parent
fd01abe553
commit
af08f1ae23
77
edit/editor-worker-body.js
Normal file
77
edit/editor-worker-body.js
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/* global importScripts parseMozFormat parserlib CSSLint */
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const loadScript = createLoadScript();
|
||||||
|
const loadParserLib = createLoadParserLib();
|
||||||
|
|
||||||
|
createAPI({
|
||||||
|
csslint: (code, config) => {
|
||||||
|
loadParserLib();
|
||||||
|
loadScript(['/vendor-overwrites/csslint/csslint.js']);
|
||||||
|
return CSSLint.verify(code, config).messages
|
||||||
|
.map(m => Object.assign(m, {rule: {id: m.rule.id}}));
|
||||||
|
},
|
||||||
|
stylelint: () => {
|
||||||
|
|
||||||
|
},
|
||||||
|
parseMozFormat: data => {
|
||||||
|
loadParserLib();
|
||||||
|
loadScript(['/js/moz-parser.js']);
|
||||||
|
return parseMozFormat(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function createLoadParserLib() {
|
||||||
|
let loaded = false;
|
||||||
|
return () => {
|
||||||
|
if (loaded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
importScripts('/vendor-overwrites/csslint/parserlib.js');
|
||||||
|
parserlib.css.Tokens[parserlib.css.Tokens.COMMENT].hide = false;
|
||||||
|
loaded = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createLoadScript() {
|
||||||
|
const loaded = new Set();
|
||||||
|
return urls => {
|
||||||
|
urls = urls.filter(u => !loaded.has(u));
|
||||||
|
importScripts(...urls);
|
||||||
|
urls.forEach(u => loaded.add(u));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function createAPI(methods) {
|
||||||
|
self.onmessage = e => {
|
||||||
|
const message = e.data;
|
||||||
|
Promise.resolve()
|
||||||
|
.then(() => methods[message.action](...message.args))
|
||||||
|
.then(result =>
|
||||||
|
({
|
||||||
|
requestId: message.requestId,
|
||||||
|
error: false,
|
||||||
|
data: result
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.catch(err =>
|
||||||
|
({
|
||||||
|
requestId: message.requestId,
|
||||||
|
error: true,
|
||||||
|
data: cloneError(err)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.then(data => self.postMessage(data));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function cloneError(err) {
|
||||||
|
return Object.assign({
|
||||||
|
name: err.name,
|
||||||
|
stack: err.stack,
|
||||||
|
message: err.message,
|
||||||
|
lineNumber: err.lineNumber,
|
||||||
|
columnNumber: err.columnNumber,
|
||||||
|
fileName: err.fileName
|
||||||
|
}, err);
|
||||||
|
}
|
47
edit/editor-worker.js
Normal file
47
edit/editor-worker.js
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var editorWorker = (() => { // eslint-disable-line no-var
|
||||||
|
let worker;
|
||||||
|
return createAPI(['csslint', 'stylelint', 'parseMozFormat']);
|
||||||
|
|
||||||
|
function createAPI(keys) {
|
||||||
|
const output = {};
|
||||||
|
for (const key of keys) {
|
||||||
|
output[key] = (...args) => {
|
||||||
|
if (!worker) {
|
||||||
|
worker = createWorker();
|
||||||
|
}
|
||||||
|
return worker.invoke(key, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createWorker() {
|
||||||
|
let requestId = 0;
|
||||||
|
const pending = new Map();
|
||||||
|
const worker = new Worker('/edit/editor-worker-body.js');
|
||||||
|
worker.onmessage = e => {
|
||||||
|
const message = e.data;
|
||||||
|
if (message.error) {
|
||||||
|
pending.get(message.requestId).reject(message.data);
|
||||||
|
} else {
|
||||||
|
pending.get(message.requestId).resolve(message.data);
|
||||||
|
}
|
||||||
|
pending.delete(message.requestId);
|
||||||
|
};
|
||||||
|
return {invoke};
|
||||||
|
|
||||||
|
function invoke(action, args) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
pending.set(requestId, {resolve, reject});
|
||||||
|
worker.postMessage({
|
||||||
|
requestId,
|
||||||
|
action,
|
||||||
|
args
|
||||||
|
});
|
||||||
|
requestId++;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
Loading…
Reference in New Issue
Block a user