diff --git a/backend/package.json b/backend/package.json index 8fef700..4e69479 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.88", + "version": "2.14.89", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/core/proxy-utils/processors/index.js b/backend/src/core/proxy-utils/processors/index.js index fa2a8d4..7b89dc7 100644 --- a/backend/src/core/proxy-utils/processors/index.js +++ b/backend/src/core/proxy-utils/processors/index.js @@ -311,6 +311,23 @@ function ScriptOperator(script, targetPlatform, $arguments, source) { })(); return output; }, + nodeFunc: async (proxies) => { + let output = proxies; + await (async function () { + const operator = createDynamicFunction( + 'operator', + `async function operator(proxies = []) { + return proxies.map(($server = {}) => { + ${script} + return $server + }) + }`, + $arguments, + ); + output = operator(proxies, targetPlatform, { source, ...env }); + })(); + return output; + }, }; } @@ -620,9 +637,33 @@ async function ApplyOperator(operator, objs) { const output_ = await operator.func(output); if (output_) output = output_; } catch (err) { - // print log and skip this operator - $.error(`Cannot apply operator ${operator.name}! Reason: ${err}`); - throw new Error(`脚本操作失败 ${err.message ?? err}`); + $.error( + `Cannot apply operator ${operator.name}(function operator)! Reason: ${err}`, + ); + let funcErr = ''; + let funcErrMsg = `${err.message ?? err}`; + if (funcErrMsg.includes('$server is not defined')) { + funcErr = ''; + } else { + funcErr = `执行 function operator 失败 ${funcErrMsg}; `; + } + try { + const output_ = await operator.nodeFunc(output); + if (output_) output = output_; + } catch (err) { + $.error( + `Cannot apply operator ${operator.name}(node script)! Reason: ${err}`, + ); + let nodeErr = ''; + let nodeErrMsg = `${err.message ?? err}`; + if (funcErr && nodeErrMsg === funcErrMsg) { + nodeErr = ''; + funcErr = `执行失败 ${funcErrMsg}`; + } else { + nodeErr = `执行节点快捷脚本 失败 ${nodeErr}`; + } + throw new Error(`脚本操作 ${funcErr}${nodeErr}`); + } } return output; }