feat: sync mixly root files and common folder
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
importScripts('./libastyle.js');
|
||||
importScripts('../../../../web-modules/workerpool.min.js');
|
||||
|
||||
|
||||
const ASTYLE_CONFIG = `
|
||||
# Braces / 基本风格
|
||||
style=google # google 样式
|
||||
|
||||
# 缩进
|
||||
indent=spaces=2 # 使用 2 空格
|
||||
indent-switches # switch 里的 case 缩进
|
||||
indent-cases # case 对齐
|
||||
indent-after-parens # 括号之后新起一行也缩进
|
||||
indent-preproc-block # 缩进宏块
|
||||
indent-preproc-cond # 缩进条件宏
|
||||
|
||||
# Padding / 空格
|
||||
pad-comma # 参数逗号后加空格
|
||||
pad-oper # 运算符周围加空格
|
||||
pad-header # 关键字后添加空格 (if ( … ))
|
||||
|
||||
# 对齐
|
||||
align-pointer=name # 把指针符号 * 放在类型名边
|
||||
align-reference=name # 引用符号 & 同上
|
||||
|
||||
# Formatting / 格式化行为
|
||||
attach-return-type # 合并返回类型和函数名
|
||||
attach-return-type-decl # 对声明也合并
|
||||
add-braces # 强制加大括号
|
||||
keep-one-line-blocks # 保留一行 {} 块
|
||||
keep-one-line-statements # if/else 等保留一行语句
|
||||
close-templates # 模板 <> 处理
|
||||
break-after-logical # long expression 后换行
|
||||
break-blocks # 块首尾换行
|
||||
|
||||
# 其他
|
||||
delete-empty-lines # 删除空行
|
||||
max-continuation-indent=4 # 设置表达式延续缩进最大值
|
||||
`;
|
||||
|
||||
async function init() {
|
||||
await self.cppFormatter.init();
|
||||
}
|
||||
|
||||
async function format(code) {
|
||||
const result = await self.cppFormatter.format(code, ASTYLE_CONFIG);
|
||||
return result;
|
||||
}
|
||||
|
||||
workerpool.worker({
|
||||
init,
|
||||
format
|
||||
});
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,17 @@
|
||||
importScripts('./ruff_fmt.js');
|
||||
importScripts('../../../../web-modules/workerpool.min.js');
|
||||
|
||||
|
||||
async function init() {
|
||||
await self.pythonFormatter.init();
|
||||
}
|
||||
|
||||
async function format(code) {
|
||||
const result = await self.pythonFormatter.format(code);
|
||||
return result;
|
||||
}
|
||||
|
||||
workerpool.worker({
|
||||
init,
|
||||
format
|
||||
});
|
||||
@@ -0,0 +1,572 @@
|
||||
let wasm;
|
||||
|
||||
function addHeapObject(obj) {
|
||||
if (heap_next === heap.length) heap.push(heap.length + 1);
|
||||
const idx = heap_next;
|
||||
heap_next = heap[idx];
|
||||
|
||||
heap[idx] = obj;
|
||||
return idx;
|
||||
}
|
||||
|
||||
function debugString(val) {
|
||||
// primitive types
|
||||
const type = typeof val;
|
||||
if (type == 'number' || type == 'boolean' || val == null) {
|
||||
return `${val}`;
|
||||
}
|
||||
if (type == 'string') {
|
||||
return `"${val}"`;
|
||||
}
|
||||
if (type == 'symbol') {
|
||||
const description = val.description;
|
||||
if (description == null) {
|
||||
return 'Symbol';
|
||||
} else {
|
||||
return `Symbol(${description})`;
|
||||
}
|
||||
}
|
||||
if (type == 'function') {
|
||||
const name = val.name;
|
||||
if (typeof name == 'string' && name.length > 0) {
|
||||
return `Function(${name})`;
|
||||
} else {
|
||||
return 'Function';
|
||||
}
|
||||
}
|
||||
// objects
|
||||
if (Array.isArray(val)) {
|
||||
const length = val.length;
|
||||
let debug = '[';
|
||||
if (length > 0) {
|
||||
debug += debugString(val[0]);
|
||||
}
|
||||
for(let i = 1; i < length; i++) {
|
||||
debug += ', ' + debugString(val[i]);
|
||||
}
|
||||
debug += ']';
|
||||
return debug;
|
||||
}
|
||||
// Test for built-in
|
||||
const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val));
|
||||
let className;
|
||||
if (builtInMatches && builtInMatches.length > 1) {
|
||||
className = builtInMatches[1];
|
||||
} else {
|
||||
// Failed to match the standard '[object ClassName]'
|
||||
return toString.call(val);
|
||||
}
|
||||
if (className == 'Object') {
|
||||
// we're a user defined class or Object
|
||||
// JSON.stringify avoids problems with cycles, and is generally much
|
||||
// easier than looping through ownProperties of `val`.
|
||||
try {
|
||||
return 'Object(' + JSON.stringify(val) + ')';
|
||||
} catch (_) {
|
||||
return 'Object';
|
||||
}
|
||||
}
|
||||
// errors
|
||||
if (val instanceof Error) {
|
||||
return `${val.name}: ${val.message}\n${val.stack}`;
|
||||
}
|
||||
// TODO we could test for more things here, like `Set`s and `Map`s.
|
||||
return className;
|
||||
}
|
||||
|
||||
function dropObject(idx) {
|
||||
if (idx < 132) return;
|
||||
heap[idx] = heap_next;
|
||||
heap_next = idx;
|
||||
}
|
||||
|
||||
function getArrayU8FromWasm0(ptr, len) {
|
||||
ptr = ptr >>> 0;
|
||||
return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
|
||||
}
|
||||
|
||||
let cachedDataViewMemory0 = null;
|
||||
function getDataViewMemory0() {
|
||||
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {
|
||||
cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
|
||||
}
|
||||
return cachedDataViewMemory0;
|
||||
}
|
||||
|
||||
function getStringFromWasm0(ptr, len) {
|
||||
ptr = ptr >>> 0;
|
||||
return decodeText(ptr, len);
|
||||
}
|
||||
|
||||
let cachedUint8ArrayMemory0 = null;
|
||||
function getUint8ArrayMemory0() {
|
||||
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
|
||||
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
|
||||
}
|
||||
return cachedUint8ArrayMemory0;
|
||||
}
|
||||
|
||||
function getObject(idx) { return heap[idx]; }
|
||||
|
||||
function handleError(f, args) {
|
||||
try {
|
||||
return f.apply(this, args);
|
||||
} catch (e) {
|
||||
wasm.__wbindgen_export3(addHeapObject(e));
|
||||
}
|
||||
}
|
||||
|
||||
let heap = new Array(128).fill(undefined);
|
||||
heap.push(undefined, null, true, false);
|
||||
|
||||
let heap_next = heap.length;
|
||||
|
||||
function isLikeNone(x) {
|
||||
return x === undefined || x === null;
|
||||
}
|
||||
|
||||
function passStringToWasm0(arg, malloc, realloc) {
|
||||
if (realloc === undefined) {
|
||||
const buf = cachedTextEncoder.encode(arg);
|
||||
const ptr = malloc(buf.length, 1) >>> 0;
|
||||
getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
|
||||
WASM_VECTOR_LEN = buf.length;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
let len = arg.length;
|
||||
let ptr = malloc(len, 1) >>> 0;
|
||||
|
||||
const mem = getUint8ArrayMemory0();
|
||||
|
||||
let offset = 0;
|
||||
|
||||
for (; offset < len; offset++) {
|
||||
const code = arg.charCodeAt(offset);
|
||||
if (code > 0x7F) break;
|
||||
mem[ptr + offset] = code;
|
||||
}
|
||||
if (offset !== len) {
|
||||
if (offset !== 0) {
|
||||
arg = arg.slice(offset);
|
||||
}
|
||||
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
|
||||
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
|
||||
const ret = cachedTextEncoder.encodeInto(arg, view);
|
||||
|
||||
offset += ret.written;
|
||||
ptr = realloc(ptr, len, offset, 1) >>> 0;
|
||||
}
|
||||
|
||||
WASM_VECTOR_LEN = offset;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
function takeObject(idx) {
|
||||
const ret = getObject(idx);
|
||||
dropObject(idx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
||||
cachedTextDecoder.decode();
|
||||
const MAX_SAFARI_DECODE_BYTES = 2146435072;
|
||||
let numBytesDecoded = 0;
|
||||
function decodeText(ptr, len) {
|
||||
numBytesDecoded += len;
|
||||
if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
|
||||
cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
||||
cachedTextDecoder.decode();
|
||||
numBytesDecoded = len;
|
||||
}
|
||||
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
|
||||
}
|
||||
|
||||
const cachedTextEncoder = new TextEncoder();
|
||||
|
||||
if (!('encodeInto' in cachedTextEncoder)) {
|
||||
cachedTextEncoder.encodeInto = function (arg, view) {
|
||||
const buf = cachedTextEncoder.encode(arg);
|
||||
view.set(buf);
|
||||
return {
|
||||
read: arg.length,
|
||||
written: buf.length
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let WASM_VECTOR_LEN = 0;
|
||||
|
||||
/**
|
||||
* Format the entire Python source code string.
|
||||
* @param {string} input
|
||||
* @param {string | null} [path]
|
||||
* @param {Config | null} [config]
|
||||
* @returns {string}
|
||||
*/
|
||||
function format_code(input, path, config) {
|
||||
let deferred4_0;
|
||||
let deferred4_1;
|
||||
try {
|
||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
||||
const ptr0 = passStringToWasm0(input, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
const len0 = WASM_VECTOR_LEN;
|
||||
var ptr1 = isLikeNone(path) ? 0 : passStringToWasm0(path, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
var len1 = WASM_VECTOR_LEN;
|
||||
wasm.format(retptr, ptr0, len0, ptr1, len1, isLikeNone(config) ? 0 : addHeapObject(config));
|
||||
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
||||
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
||||
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
||||
var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true);
|
||||
var ptr3 = r0;
|
||||
var len3 = r1;
|
||||
if (r3) {
|
||||
ptr3 = 0; len3 = 0;
|
||||
throw takeObject(r2);
|
||||
}
|
||||
deferred4_0 = ptr3;
|
||||
deferred4_1 = len3;
|
||||
return getStringFromWasm0(ptr3, len3);
|
||||
} finally {
|
||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
||||
wasm.__wbindgen_export4(deferred4_0, deferred4_1, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a specific range of the Python source code string.
|
||||
* @param {string} input
|
||||
* @param {TextRange} range
|
||||
* @param {string | null} [path]
|
||||
* @param {Config | null} [config]
|
||||
* @returns {PrintedRange}
|
||||
*/
|
||||
function format_range(input, range, path, config) {
|
||||
try {
|
||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
||||
const ptr0 = passStringToWasm0(input, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
const len0 = WASM_VECTOR_LEN;
|
||||
var ptr1 = isLikeNone(path) ? 0 : passStringToWasm0(path, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
var len1 = WASM_VECTOR_LEN;
|
||||
wasm.format_range(retptr, ptr0, len0, addHeapObject(range), ptr1, len1, isLikeNone(config) ? 0 : addHeapObject(config));
|
||||
var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
|
||||
var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
|
||||
var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
|
||||
if (r2) {
|
||||
throw takeObject(r1);
|
||||
}
|
||||
return takeObject(r0);
|
||||
} finally {
|
||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
||||
}
|
||||
}
|
||||
|
||||
const EXPECTED_RESPONSE_TYPES = new Set(['basic', 'cors', 'default']);
|
||||
|
||||
async function __wbg_load(module, imports) {
|
||||
if (typeof Response === 'function' && module instanceof Response) {
|
||||
if (typeof WebAssembly.instantiateStreaming === 'function') {
|
||||
try {
|
||||
return await WebAssembly.instantiateStreaming(module, imports);
|
||||
} catch (e) {
|
||||
const validResponse = module.ok && EXPECTED_RESPONSE_TYPES.has(module.type);
|
||||
|
||||
if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
|
||||
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
|
||||
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const bytes = await module.arrayBuffer();
|
||||
return await WebAssembly.instantiate(bytes, imports);
|
||||
} else {
|
||||
const instance = await WebAssembly.instantiate(module, imports);
|
||||
|
||||
if (instance instanceof WebAssembly.Instance) {
|
||||
return { instance, module };
|
||||
} else {
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function __wbg_get_imports() {
|
||||
const imports = {};
|
||||
imports.wbg = {};
|
||||
imports.wbg.__wbg_Error_52673b7de5a0ca89 = function(arg0, arg1) {
|
||||
const ret = Error(getStringFromWasm0(arg0, arg1));
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_Number_2d1dcfcf4ec51736 = function(arg0) {
|
||||
const ret = Number(getObject(arg0));
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_String_8f0eb39a4a4c2f66 = function(arg0, arg1) {
|
||||
const ret = String(getObject(arg1));
|
||||
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
const len1 = WASM_VECTOR_LEN;
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_bigint_get_as_i64_6e32f5e6aff02e1d = function(arg0, arg1) {
|
||||
const v = getObject(arg1);
|
||||
const ret = typeof(v) === 'bigint' ? v : undefined;
|
||||
getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_boolean_get_dea25b33882b895b = function(arg0) {
|
||||
const v = getObject(arg0);
|
||||
const ret = typeof(v) === 'boolean' ? v : undefined;
|
||||
return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_debug_string_adfb662ae34724b6 = function(arg0, arg1) {
|
||||
const ret = debugString(getObject(arg1));
|
||||
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
const len1 = WASM_VECTOR_LEN;
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_in_0d3e1e8f0c669317 = function(arg0, arg1) {
|
||||
const ret = getObject(arg0) in getObject(arg1);
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_is_bigint_0e1a2e3f55cfae27 = function(arg0) {
|
||||
const ret = typeof(getObject(arg0)) === 'bigint';
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_is_function_8d400b8b1af978cd = function(arg0) {
|
||||
const ret = typeof(getObject(arg0)) === 'function';
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_is_object_ce774f3490692386 = function(arg0) {
|
||||
const val = getObject(arg0);
|
||||
const ret = typeof(val) === 'object' && val !== null;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_is_undefined_f6b95eab589e0269 = function(arg0) {
|
||||
const ret = getObject(arg0) === undefined;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_jsval_eq_b6101cc9cef1fe36 = function(arg0, arg1) {
|
||||
const ret = getObject(arg0) === getObject(arg1);
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_jsval_loose_eq_766057600fdd1b0d = function(arg0, arg1) {
|
||||
const ret = getObject(arg0) == getObject(arg1);
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_number_get_9619185a74197f95 = function(arg0, arg1) {
|
||||
const obj = getObject(arg1);
|
||||
const ret = typeof(obj) === 'number' ? obj : undefined;
|
||||
getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_string_get_a2a31e16edf96e42 = function(arg0, arg1) {
|
||||
const obj = getObject(arg1);
|
||||
const ret = typeof(obj) === 'string' ? obj : undefined;
|
||||
var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2);
|
||||
var len1 = WASM_VECTOR_LEN;
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
|
||||
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
|
||||
};
|
||||
imports.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e = function(arg0, arg1) {
|
||||
throw new Error(getStringFromWasm0(arg0, arg1));
|
||||
};
|
||||
imports.wbg.__wbg_call_abb4ff46ce38be40 = function() { return handleError(function (arg0, arg1) {
|
||||
const ret = getObject(arg0).call(getObject(arg1));
|
||||
return addHeapObject(ret);
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_done_62ea16af4ce34b24 = function(arg0) {
|
||||
const ret = getObject(arg0).done;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_entries_83c79938054e065f = function(arg0) {
|
||||
const ret = Object.entries(getObject(arg0));
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_get_6b7bd52aca3f9671 = function(arg0, arg1) {
|
||||
const ret = getObject(arg0)[arg1 >>> 0];
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_get_af9dab7e9603ea93 = function() { return handleError(function (arg0, arg1) {
|
||||
const ret = Reflect.get(getObject(arg0), getObject(arg1));
|
||||
return addHeapObject(ret);
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_get_with_ref_key_1dc361bd10053bfe = function(arg0, arg1) {
|
||||
const ret = getObject(arg0)[getObject(arg1)];
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_instanceof_ArrayBuffer_f3320d2419cd0355 = function(arg0) {
|
||||
let result;
|
||||
try {
|
||||
result = getObject(arg0) instanceof ArrayBuffer;
|
||||
} catch (_) {
|
||||
result = false;
|
||||
}
|
||||
const ret = result;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_instanceof_Map_084be8da74364158 = function(arg0) {
|
||||
let result;
|
||||
try {
|
||||
result = getObject(arg0) instanceof Map;
|
||||
} catch (_) {
|
||||
result = false;
|
||||
}
|
||||
const ret = result;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_instanceof_Uint8Array_da54ccc9d3e09434 = function(arg0) {
|
||||
let result;
|
||||
try {
|
||||
result = getObject(arg0) instanceof Uint8Array;
|
||||
} catch (_) {
|
||||
result = false;
|
||||
}
|
||||
const ret = result;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_isArray_51fd9e6422c0a395 = function(arg0) {
|
||||
const ret = Array.isArray(getObject(arg0));
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_isSafeInteger_ae7d3f054d55fa16 = function(arg0) {
|
||||
const ret = Number.isSafeInteger(getObject(arg0));
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_iterator_27b7c8b35ab3e86b = function() {
|
||||
const ret = Symbol.iterator;
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_length_22ac23eaec9d8053 = function(arg0) {
|
||||
const ret = getObject(arg0).length;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_length_d45040a40c570362 = function(arg0) {
|
||||
const ret = getObject(arg0).length;
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_new_1ba21ce319a06297 = function() {
|
||||
const ret = new Object();
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_new_6421f6084cc5bc5a = function(arg0) {
|
||||
const ret = new Uint8Array(getObject(arg0));
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_next_138a17bbf04e926c = function(arg0) {
|
||||
const ret = getObject(arg0).next;
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_next_3cfe5c0fe2a4cc53 = function() { return handleError(function (arg0) {
|
||||
const ret = getObject(arg0).next();
|
||||
return addHeapObject(ret);
|
||||
}, arguments) };
|
||||
imports.wbg.__wbg_prototypesetcall_dfe9b766cdc1f1fd = function(arg0, arg1, arg2) {
|
||||
Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2));
|
||||
};
|
||||
imports.wbg.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) {
|
||||
getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
|
||||
};
|
||||
imports.wbg.__wbg_value_57b7b035e117f7ee = function(arg0) {
|
||||
const ret = getObject(arg0).value;
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_cast_2241b6af4c4b2941 = function(arg0, arg1) {
|
||||
// Cast intrinsic for `Ref(String) -> Externref`.
|
||||
const ret = getStringFromWasm0(arg0, arg1);
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {
|
||||
// Cast intrinsic for `U64 -> Externref`.
|
||||
const ret = BigInt.asUintN(64, arg0);
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_cast_9ae0607507abb057 = function(arg0) {
|
||||
// Cast intrinsic for `I64 -> Externref`.
|
||||
const ret = arg0;
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_cast_d6cd19b81560fd6e = function(arg0) {
|
||||
// Cast intrinsic for `F64 -> Externref`.
|
||||
const ret = arg0;
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
|
||||
const ret = getObject(arg0);
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
|
||||
takeObject(arg0);
|
||||
};
|
||||
|
||||
return imports;
|
||||
}
|
||||
|
||||
function __wbg_finalize_init(instance, module) {
|
||||
wasm = instance.exports;
|
||||
__wbg_init.__wbindgen_wasm_module = module;
|
||||
cachedDataViewMemory0 = null;
|
||||
cachedUint8ArrayMemory0 = null;
|
||||
|
||||
|
||||
|
||||
return wasm;
|
||||
}
|
||||
|
||||
function initSync(module) {
|
||||
if (wasm !== undefined) return wasm;
|
||||
|
||||
|
||||
if (typeof module !== 'undefined') {
|
||||
if (Object.getPrototypeOf(module) === Object.prototype) {
|
||||
({module} = module)
|
||||
} else {
|
||||
console.warn('using deprecated parameters for `initSync()`; pass a single object instead')
|
||||
}
|
||||
}
|
||||
|
||||
const imports = __wbg_get_imports();
|
||||
if (!(module instanceof WebAssembly.Module)) {
|
||||
module = new WebAssembly.Module(module);
|
||||
}
|
||||
const instance = new WebAssembly.Instance(module, imports);
|
||||
return __wbg_finalize_init(instance, module);
|
||||
}
|
||||
|
||||
async function __wbg_init(module_or_path) {
|
||||
if (wasm !== undefined) return wasm;
|
||||
|
||||
|
||||
if (typeof module_or_path !== 'undefined') {
|
||||
if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
|
||||
({module_or_path} = module_or_path)
|
||||
} else {
|
||||
console.warn('using deprecated parameters for the initialization function; pass a single object instead')
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof module_or_path === 'undefined') {
|
||||
module_or_path = new URL('ruff_fmt_bg.wasm', self.location.origin + self.location.pathname);
|
||||
}
|
||||
const imports = __wbg_get_imports();
|
||||
|
||||
if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
|
||||
module_or_path = fetch(module_or_path);
|
||||
}
|
||||
|
||||
const { instance, module } = await __wbg_load(await module_or_path, imports);
|
||||
|
||||
return __wbg_finalize_init(instance, module);
|
||||
}
|
||||
|
||||
// export { initSync };
|
||||
// export default __wbg_init;
|
||||
|
||||
self.pythonFormatter = {};
|
||||
self.pythonFormatter.format = format_code;
|
||||
self.pythonFormatter.formatRange = format_range;
|
||||
self.pythonFormatter.init = __wbg_init;
|
||||
Binary file not shown.
@@ -0,0 +1,188 @@
|
||||
class SerialWorker {
|
||||
#receiveBuffer_ = [];
|
||||
#bufferLength_ = 0;
|
||||
#encoder_ = new TextEncoder();
|
||||
#decoder_ = new TextDecoder('utf-8');
|
||||
#baud_ = 115200;
|
||||
#dtr_ = false;
|
||||
#rts_ = false;
|
||||
#isOpened_ = false;
|
||||
#port_ = '';
|
||||
constructor(port) {
|
||||
this.#port_ = port;
|
||||
this.resetBuffer();
|
||||
}
|
||||
|
||||
decodeBuffer(buffer) {
|
||||
let output = '';
|
||||
for (let i in buffer) {
|
||||
output += this.decodeByte();
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/* UTF-8编码方式
|
||||
* ------------------------------------------------------------
|
||||
* |1字节 0xxxxxxx |
|
||||
* |2字节 110xxxxx 10xxxxxx |
|
||||
* |3字节 1110xxxx 10xxxxxx 10xxxxxx |
|
||||
* |4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
|
||||
* |5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
|
||||
* |6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx|
|
||||
* ------------------------------------------------------------
|
||||
**/
|
||||
decodeByte(byte) {
|
||||
let output = '';
|
||||
if ((byte & 0x80) === 0x00) {
|
||||
// 1字节
|
||||
this.#receiveBuffer_ = [];
|
||||
this.#bufferLength_ = 0;
|
||||
output += String.fromCharCode(byte);
|
||||
} else if ((byte & 0xc0) === 0x80) {
|
||||
/*
|
||||
* 2字节以上的中间字节,10xxxxxx
|
||||
* 如果没有起始头,则丢弃这个字节
|
||||
* 如果不是2字节及以上的起始头,则丢弃这个字节
|
||||
**/
|
||||
if (!this.#receiveBuffer_.length || this.#bufferLength_ < 2) {
|
||||
return output;
|
||||
}
|
||||
this.#receiveBuffer_.push(byte);
|
||||
if (this.#bufferLength_ === this.#receiveBuffer_.length) {
|
||||
output += this.#decoder_.decode(new Uint8Array(this.#receiveBuffer_));
|
||||
this.#receiveBuffer_ = [];
|
||||
}
|
||||
} else {
|
||||
// 2字节以上的起始头
|
||||
if (this.#receiveBuffer_) {
|
||||
this.#receiveBuffer_ = [];
|
||||
}
|
||||
this.#bufferLength_ = this.#getBufferLength_(byte);
|
||||
this.#receiveBuffer_.push(byte);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
#getBufferLength_(data) {
|
||||
let len = 2;
|
||||
if ((data & 0xFC) === 0xFC) {
|
||||
len = 6;
|
||||
} else if ((data & 0xF8) === 0xF8) {
|
||||
len = 5;
|
||||
} else if ((data & 0xF0) === 0xF0) {
|
||||
len = 4;
|
||||
} else if ((data & 0xE0) === 0xE0) {
|
||||
len = 3;
|
||||
} else if ((data & 0xC0) === 0xC0) {
|
||||
len = 2;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
resetBuffer() {
|
||||
this.#receiveBuffer_ = [];
|
||||
this.#bufferLength_ = 0;
|
||||
}
|
||||
|
||||
open() {}
|
||||
|
||||
close() {}
|
||||
|
||||
toggle() {
|
||||
if (this.isOpened()) {
|
||||
this.close();
|
||||
} else {
|
||||
this.open();
|
||||
}
|
||||
}
|
||||
|
||||
setBaudRate(baud) {
|
||||
this.#baud_ = baud;
|
||||
}
|
||||
|
||||
setDTR(dtr) {
|
||||
this.#dtr_ = dtr;
|
||||
}
|
||||
|
||||
setRTS(rts) {
|
||||
this.#rts_ = rts;
|
||||
}
|
||||
|
||||
setDTRAndRTS(dtr, rts) {
|
||||
this.#dtr_ = dtr;
|
||||
this.#rts_ = rts;
|
||||
}
|
||||
|
||||
getPortName() {
|
||||
return this.#port_;
|
||||
}
|
||||
|
||||
getBaudRate() {
|
||||
return this.#baud_;
|
||||
}
|
||||
|
||||
getDTR() {
|
||||
return this.#dtr_;
|
||||
}
|
||||
|
||||
getRTS() {
|
||||
return this.#rts_;
|
||||
}
|
||||
|
||||
sendString(str) {}
|
||||
|
||||
sendBuffer(buffer) {}
|
||||
|
||||
onBuffer(buffer) {
|
||||
const data = this.decodeBuffer(buffer);
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
self.postMessage({
|
||||
port: this.getPortName(),
|
||||
event: 'onBuffer',
|
||||
message: data
|
||||
});
|
||||
}
|
||||
|
||||
onOpen() {
|
||||
this.#isOpened_ = true;
|
||||
self.postMessage({
|
||||
port: this.getPortName(),
|
||||
event: 'onOpen'
|
||||
});
|
||||
}
|
||||
|
||||
onClose(code) {
|
||||
this.#isOpened_ = false;
|
||||
self.postMessage({
|
||||
port: this.getPortName(),
|
||||
event: 'onClose',
|
||||
message: code
|
||||
});
|
||||
}
|
||||
|
||||
onError(error) {
|
||||
self.postMessage({
|
||||
port: this.getPortName(),
|
||||
event: 'onError',
|
||||
message: error
|
||||
});
|
||||
}
|
||||
|
||||
isOpened() {
|
||||
return this.#isOpened_;
|
||||
}
|
||||
|
||||
config(info) {
|
||||
if (typeof info !== Object) {
|
||||
return;
|
||||
}
|
||||
this.#baud_ = info.baud;
|
||||
this.setBaudRate(this.#baud_);
|
||||
this.#dtr_ = info.dtr;
|
||||
this.setDTR(this.#dtr_);
|
||||
this.#rts_ = info.rts;
|
||||
this.setDTR(this.#rts_);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
importScripts('./tree-sitter.js');
|
||||
importScripts('../../../../web-modules/workerpool.min.js');
|
||||
|
||||
|
||||
const terms = [
|
||||
'type',
|
||||
'scope',
|
||||
'function',
|
||||
'variable',
|
||||
'number',
|
||||
'string',
|
||||
'comment',
|
||||
'constant',
|
||||
'directive',
|
||||
'control',
|
||||
'operator',
|
||||
'modifier',
|
||||
'punctuation'
|
||||
];
|
||||
|
||||
let parser;
|
||||
let tree = null;
|
||||
let language = null;
|
||||
|
||||
|
||||
class Language {
|
||||
constructor(grammarJson) {
|
||||
this.simpleTerms = {};
|
||||
this.complexTerms = [];
|
||||
this.complexScopes = {};
|
||||
for (const t in grammarJson.simpleTerms)
|
||||
this.simpleTerms[t] = grammarJson.simpleTerms[t];
|
||||
for (const t in grammarJson.complexTerms)
|
||||
this.complexTerms[t] = grammarJson.complexTerms[t];
|
||||
for (const t in grammarJson.complexScopes)
|
||||
this.complexScopes[t] = grammarJson.complexScopes[t];
|
||||
this.complexDepth = 0;
|
||||
this.complexOrder = false;
|
||||
for (const s in this.complexScopes) {
|
||||
const depth = s.split('>').length;
|
||||
if (depth > this.complexDepth)
|
||||
this.complexDepth = depth;
|
||||
if (s.indexOf('[') >= 0)
|
||||
this.complexOrder = true;
|
||||
}
|
||||
this.complexDepth--;
|
||||
}
|
||||
}
|
||||
|
||||
async function init(languageWasmPath, grammarJson) {
|
||||
await TreeSitter.init();
|
||||
|
||||
parser = new TreeSitter();
|
||||
const lang = await TreeSitter.Language.load(languageWasmPath);
|
||||
console.log(lang.version)
|
||||
parser.setLanguage(lang);
|
||||
language = new Language(grammarJson);
|
||||
|
||||
tree = null;
|
||||
}
|
||||
|
||||
function buildDecorations(tree) {
|
||||
const result = [];
|
||||
const stack = [];
|
||||
let node = tree.rootNode.firstChild;
|
||||
while (stack.length > 0 || node) {
|
||||
if (node) {
|
||||
stack.push(node);
|
||||
node = node.firstChild;
|
||||
}
|
||||
else {
|
||||
node = stack.pop();
|
||||
let type = node.type;
|
||||
if (!node.isNamed())
|
||||
type = '"' + type + '"';
|
||||
let term = null;
|
||||
if (!language.complexTerms.includes(type)) {
|
||||
term = language.simpleTerms[type];
|
||||
}
|
||||
else {
|
||||
let desc = type;
|
||||
let scopes = [desc];
|
||||
let parent = node.parent;
|
||||
for (let i = 0; i < language.complexDepth && parent; i++) {
|
||||
let parentType = parent.type;
|
||||
if (!parent.isNamed())
|
||||
parentType = '"' + parentType + '"';
|
||||
desc = parentType + ' > ' + desc;
|
||||
scopes.push(desc);
|
||||
parent = parent.parent;
|
||||
}
|
||||
if (language.complexOrder) {
|
||||
let index = 0;
|
||||
let sibling = node.previousSibling;
|
||||
while (sibling) {
|
||||
if (sibling.type === node.type)
|
||||
index++;
|
||||
sibling = sibling.previousSibling;
|
||||
}
|
||||
let rindex = -1;
|
||||
sibling = node.nextSibling;
|
||||
while (sibling) {
|
||||
if (sibling.type === node.type)
|
||||
rindex--;
|
||||
sibling = sibling.nextSibling;
|
||||
}
|
||||
const orderScopes = [];
|
||||
for (let i = 0; i < scopes.length; i++)
|
||||
orderScopes.push(scopes[i], scopes[i] + '[' + index + ']', scopes[i] + '[' + rindex + ']');
|
||||
scopes = orderScopes;
|
||||
}
|
||||
for (const d of scopes)
|
||||
if (d in language.complexScopes)
|
||||
term = language.complexScopes[d];
|
||||
}
|
||||
if (terms.includes(term)) {
|
||||
if (!result[term]) {
|
||||
result[term] = [];
|
||||
}
|
||||
result[term].push({
|
||||
startLineNumber: node.startPosition.row + 1,
|
||||
startColumn: node.startPosition.column + 1,
|
||||
endLineNumber: node.endPosition.row + 1,
|
||||
endColumn: node.endPosition.column + 1
|
||||
});
|
||||
}
|
||||
node = node.nextSibling;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function update(text) {
|
||||
const tree = parser.parse(text);
|
||||
return buildDecorations(tree);
|
||||
}
|
||||
|
||||
workerpool.worker({
|
||||
init,
|
||||
update
|
||||
});
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,66 @@
|
||||
const chokidar = require('chokidar');
|
||||
|
||||
let watchedPath = {};
|
||||
|
||||
const watch = function(inPath) {
|
||||
if (watchedPath[watchedPath]) {
|
||||
return;
|
||||
}
|
||||
watchedPath[inPath] = chokidar.watch(inPath, {
|
||||
persistent: true,
|
||||
depth: 0,
|
||||
ignoreInitial: true
|
||||
});
|
||||
|
||||
watchedPath[inPath].on('add', (actionPath, stats) => {
|
||||
self.postMessage({
|
||||
watcher: inPath,
|
||||
event: 'add',
|
||||
path: actionPath,
|
||||
stats
|
||||
});
|
||||
});
|
||||
|
||||
watchedPath[inPath].on('addDir', (actionPath, stats) => {
|
||||
self.postMessage({
|
||||
watcher: inPath,
|
||||
event: 'addDir',
|
||||
path: actionPath,
|
||||
stats
|
||||
});
|
||||
});
|
||||
|
||||
watchedPath[inPath].on('unlink', (actionPath, stats) => {
|
||||
self.postMessage({
|
||||
watcher: inPath,
|
||||
event: 'unlink',
|
||||
path: actionPath,
|
||||
stats
|
||||
});
|
||||
});
|
||||
|
||||
watchedPath[inPath].on('unlinkDir', (actionPath, stats) => {
|
||||
self.postMessage({
|
||||
watcher: inPath,
|
||||
event: 'unlinkDir',
|
||||
path: actionPath,
|
||||
stats
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const unwatch = function(inPath) {
|
||||
if (!watchedPath[inPath]) {
|
||||
return;
|
||||
}
|
||||
watchedPath[inPath].close();
|
||||
delete watchedPath[inPath];
|
||||
}
|
||||
|
||||
self.addEventListener('message', function(event) {
|
||||
if (event.data.func === 'watch') {
|
||||
watch(...event.data.args);
|
||||
} else if (event.data.func === 'unwatch') {
|
||||
unwatch(...event.data.args);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,91 @@
|
||||
importScripts('../common/serial-worker.js');
|
||||
const child_process = require('node:child_process');
|
||||
const serialport = require('serialport');
|
||||
|
||||
const {
|
||||
SerialPort,
|
||||
ReadlineParser,
|
||||
ByteLengthParser
|
||||
} = serialport;
|
||||
|
||||
const portsOperator = {};
|
||||
|
||||
class NodeSerialWorker extends SerialWorker {
|
||||
#serialport_ = null;
|
||||
#parserBytes_ = null;
|
||||
constructor(port) {
|
||||
super(port);
|
||||
}
|
||||
|
||||
#addEventsListener_() {
|
||||
this.#parserBytes_.on('data', (buffer) => {
|
||||
this.onBuffer(buffer);
|
||||
});
|
||||
|
||||
this.#serialport_.on('error', (error) => {
|
||||
this.onError(error);
|
||||
this.onClose(1);
|
||||
});
|
||||
|
||||
this.#serialport_.on('open', () => {
|
||||
this.onOpen();
|
||||
});
|
||||
|
||||
this.#serialport_.on('close', () => {
|
||||
this.onClose(1);
|
||||
});
|
||||
}
|
||||
|
||||
open() {
|
||||
super.open();
|
||||
this.#serialport_ = new SerialPort({
|
||||
path: this.getPortName(),
|
||||
baudRate: this.getBaudRate() - 0, // 波特率
|
||||
dataBits: 8, // 数据位
|
||||
parity: 'none', // 奇偶校验
|
||||
stopBits: 1, // 停止位
|
||||
flowControl: false,
|
||||
autoOpen: false // 不自动打开
|
||||
}, false);
|
||||
this.#parserBytes_ = this.#serialport_.pipe(new ByteLengthParser({ length: 1 }));
|
||||
this.#serialport_.open((error) => {
|
||||
if (error) {
|
||||
this.onError(error);
|
||||
// this.onClose(1);
|
||||
}
|
||||
});
|
||||
this.#addEventsListener_();
|
||||
}
|
||||
|
||||
close() {
|
||||
super.close();
|
||||
if (this.isOpened()) {
|
||||
try {
|
||||
this.#serialport_.close();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onBuffer(buffer) {
|
||||
super.onBuffer(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
const create = (port) => {
|
||||
if (!portsOperator[port]) {
|
||||
portsOperator[port] = new NodeSerialWorker(port);
|
||||
}
|
||||
portsOperator[port].open();
|
||||
}
|
||||
|
||||
self.addEventListener('message', function(event) {
|
||||
console.log(event.data);
|
||||
const { port, type } = event.data;
|
||||
if (type === 'open') {
|
||||
create(port);
|
||||
} else if (type === 'close') {
|
||||
portsOperator[port] && portsOperator[port].close();
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,132 @@
|
||||
importScripts('../../../web-modules/workerpool.min.js');
|
||||
importScripts('../../../web-modules/browserfs.min.js');
|
||||
|
||||
let fs = BrowserFS.fs;
|
||||
|
||||
const createPromise = function(func, ...args) {
|
||||
return new Promise((resolve, reject) => {
|
||||
func(...args, function() {
|
||||
resolve([...arguments]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const addFileSystemHandler = function(filesystem) {
|
||||
return new Promise((resolve, reject) => {
|
||||
BrowserFS.configure({
|
||||
fs: "FileSystemAccess",
|
||||
options: { handle: filesystem }
|
||||
}, function (error) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
fs = BrowserFS.fs;
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
const rename = function(oldPath, newPath) {
|
||||
return createPromise(fs.rename, oldPath, newPath);
|
||||
}
|
||||
|
||||
const stat = function(p) {
|
||||
return createPromise(fs.stat, p);
|
||||
}
|
||||
|
||||
const open = function(p, flag, mode) {
|
||||
return createPromise(fs.open, p, flag, mode);
|
||||
}
|
||||
|
||||
const unlink = function(p) {
|
||||
return createPromise(fs.unlink, p);
|
||||
}
|
||||
|
||||
const rmdir = function(p) {
|
||||
return createPromise(fs.rmdir, p);
|
||||
}
|
||||
|
||||
const mkdir = function(p, mode) {
|
||||
return createPromise(fs.mkdir, p, mode);
|
||||
}
|
||||
|
||||
const readdir = function(p) {
|
||||
return createPromise(fs.readdir, p);
|
||||
}
|
||||
|
||||
const exists = function(p) {
|
||||
return createPromise(fs.exists, p);
|
||||
}
|
||||
|
||||
const realpath = function(p) {
|
||||
return createPromise(fs.realpath, p);
|
||||
}
|
||||
|
||||
const truncate = function(p, len) {
|
||||
return createPromise(fs.truncate, p, len);
|
||||
}
|
||||
|
||||
const readFile = function(fname, encoding, flag) {
|
||||
return createPromise(fs.readFile, fname, encoding);
|
||||
}
|
||||
|
||||
const writeFile = function(fname, data, encoding) {
|
||||
return createPromise(fs.writeFile, fname, data, encoding);
|
||||
}
|
||||
|
||||
const appendFile = function(fname, data, encoding) {
|
||||
return createPromise(fs.appendFile, fname, data, encoding);
|
||||
}
|
||||
|
||||
const chmod = function(p, mode) {
|
||||
return createPromise(fs.chmod, p, mode);
|
||||
}
|
||||
|
||||
const chown = function(p, new_uid, new_gid) {
|
||||
return createPromise(fs.chown, p, new_uid, new_gid);
|
||||
}
|
||||
|
||||
const utimes = function(p, atime, mtime) {
|
||||
return createPromise(fs.utimes, p, atime, mtime);
|
||||
}
|
||||
|
||||
const link = function(srcpath, dstpath) {
|
||||
return createPromise(fs.link, srcpath, dstpath);
|
||||
}
|
||||
|
||||
const symlink = function(srcpath, dstpath, type) {
|
||||
return createPromise(fs.symlink, srcpath, dstpath, type);
|
||||
}
|
||||
|
||||
const readlink = function(p) {
|
||||
return createPromise(fs.readlink, p);
|
||||
}
|
||||
|
||||
const syncClose = function(method, fd) {
|
||||
return fs.syncClose(method, fd);
|
||||
}
|
||||
|
||||
workerpool.worker({
|
||||
addFileSystemHandler,
|
||||
rename,
|
||||
stat,
|
||||
open,
|
||||
unlink,
|
||||
rmdir,
|
||||
mkdir,
|
||||
readdir,
|
||||
exists,
|
||||
realpath,
|
||||
truncate,
|
||||
readFile,
|
||||
writeFile,
|
||||
appendFile,
|
||||
chmod,
|
||||
chown,
|
||||
utimes,
|
||||
link,
|
||||
symlink,
|
||||
readlink,
|
||||
syncClose
|
||||
});
|
||||
123
mixly/common/modules/mixly-modules/workers/web/serial-worker.js
Normal file
123
mixly/common/modules/mixly-modules/workers/web/serial-worker.js
Normal file
@@ -0,0 +1,123 @@
|
||||
// importScripts('../../web-modules/workerpool.min.js');
|
||||
const workerpool = require('../../web-modules/workerpool.min.js');
|
||||
|
||||
const encoder = new TextEncoder();
|
||||
const decoder = new TextDecoder('utf-8');
|
||||
|
||||
class SerialWorker {
|
||||
constructor(serial) {
|
||||
this.serial = serial;
|
||||
this.receiveBuffer = [];
|
||||
this.receiveStr = '';
|
||||
this.bufferLength = 0;
|
||||
const test = setInterval(() => {
|
||||
const message = generateRandomString(5);
|
||||
this.onData(encoder.encode(message));
|
||||
}, 1000);
|
||||
setTimeout(() => {
|
||||
clearInterval(test);
|
||||
}, 120 * 1000);
|
||||
}
|
||||
|
||||
onOpen() {
|
||||
|
||||
}
|
||||
|
||||
onData(data) {
|
||||
/* UTF-8编码方式
|
||||
* ------------------------------------------------------------
|
||||
* |1字节 0xxxxxxx |
|
||||
* |2字节 110xxxxx 10xxxxxx |
|
||||
* |3字节 1110xxxx 10xxxxxx 10xxxxxx |
|
||||
* |4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
|
||||
* |5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
|
||||
* |6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx|
|
||||
* ------------------------------------------------------------
|
||||
*/
|
||||
for (let i in data) {
|
||||
if ((data[i] & 0x80) === 0x00) {
|
||||
// 1字节
|
||||
this.receiveBuffer = [];
|
||||
this.bufferLength = 0;
|
||||
this.receiveStr += String.fromCharCode(data[i]);
|
||||
} else if ((data[i] & 0xc0) === 0x80) {
|
||||
// 2字节以上的中间字节,10xxxxxx
|
||||
// 如果没有起始头,则丢弃这个字节
|
||||
if (!this.receiveBuffer.length) {
|
||||
return;
|
||||
}
|
||||
// 如果不是2字节及以上的起始头,则丢弃这个字节
|
||||
if (this.bufferLength < 2) {
|
||||
return;
|
||||
}
|
||||
this.receiveBuffer.push(data[i]);
|
||||
if (this.bufferLength === this.receiveBuffer.length) {
|
||||
this.receiveStr += decoder.decode(new Uint8Array(this.receiveBuffer));
|
||||
this.receiveBuffer = [];
|
||||
}
|
||||
} else {
|
||||
// 2字节以上的起始头
|
||||
if (this.receiveBuffer) {
|
||||
this.receiveBuffer = [];
|
||||
}
|
||||
this.bufferLength = this.#getBufferLength(data[i]);
|
||||
this.receiveBuffer.push(data[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onError() {
|
||||
|
||||
}
|
||||
|
||||
onClose() {
|
||||
|
||||
}
|
||||
|
||||
#getBufferLength(data) {
|
||||
let len = 2;
|
||||
if ((data & 0xFC) === 0xFC) {
|
||||
len = 6;
|
||||
} else if ((data & 0xF8) === 0xF8) {
|
||||
len = 5;
|
||||
} else if ((data & 0xF0) === 0xF0) {
|
||||
len = 4;
|
||||
} else if ((data & 0xE0) === 0xE0) {
|
||||
len = 3;
|
||||
} else if ((data & 0xC0) === 0xC0) {
|
||||
len = 2;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
const createSerialWork = function(serial) {
|
||||
return new Promise((resolve, reject) => {
|
||||
console.log(serial)
|
||||
const serialWork = new SerialWorker(serial);
|
||||
const test = setInterval(() => {
|
||||
const data = serialWork.receiveStr;
|
||||
serialWork.receiveStr = '';
|
||||
workerpool.workerEmit({
|
||||
status: 'data',
|
||||
data: data
|
||||
});
|
||||
}, 5000);
|
||||
setTimeout(() => {
|
||||
workerpool.workerEmit({
|
||||
status: 'close'
|
||||
});
|
||||
resolve();
|
||||
}, 120 * 1000);
|
||||
});
|
||||
}
|
||||
|
||||
function generateRandomString() {
|
||||
return '1234';
|
||||
}
|
||||
|
||||
|
||||
workerpool.worker({
|
||||
createSerialWork,
|
||||
generateRandomString
|
||||
});
|
||||
Reference in New Issue
Block a user