feat: 文件支持脚本操作

This commit is contained in:
xream 2024-01-12 06:16:39 +08:00
parent 9ae70eca09
commit c059296224
No known key found for this signature in database
GPG Key ID: 1D2C5225471789F9
5 changed files with 52 additions and 10 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "sub-store", "name": "sub-store",
"version": "2.14.145", "version": "2.14.146",
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.",
"main": "src/main.js", "main": "src/main.js",
"scripts": { "scripts": {

View File

@ -316,11 +316,20 @@ function ScriptOperator(script, targetPlatform, $arguments, source) {
await (async function () { await (async function () {
const operator = createDynamicFunction( const operator = createDynamicFunction(
'operator', 'operator',
`async function operator(proxies = []) { `async function operator(input = []) {
return proxies.map(($server = {}) => { let proxies
${script} if (Array.isArray(input)) {
return $server proxies = input
}) return proxies.map(($server = {}) => {
${script}
return $server
})
} else {
let $content = input
${script}
return $content
}
}`, }`,
$arguments, $arguments,
); );
@ -689,7 +698,10 @@ async function ApplyOperator(operator, objs) {
); );
let funcErr = ''; let funcErr = '';
let funcErrMsg = `${err.message ?? err}`; let funcErrMsg = `${err.message ?? err}`;
if (funcErrMsg.includes('$server is not defined')) { if (
funcErrMsg.includes('$server is not defined') ||
funcErrMsg.includes('$content is not defined')
) {
funcErr = ''; funcErr = '';
} else { } else {
funcErr = `执行 function operator 失败 ${funcErrMsg}; `; funcErr = `执行 function operator 失败 ${funcErrMsg}; `;

View File

@ -3,6 +3,7 @@ import { FILES_KEY } from '@/constants';
import { failed, success } from '@/restful/response'; import { failed, success } from '@/restful/response';
import $ from '@/core/app'; import $ from '@/core/app';
import { RequestInvalidError, ResourceNotFoundError } from '@/restful/errors'; import { RequestInvalidError, ResourceNotFoundError } from '@/restful/errors';
import { ProxyUtils } from '@/core/proxy-utils';
export default function register($app) { export default function register($app) {
if (!$.read(FILES_KEY)) $.write([], FILES_KEY); if (!$.read(FILES_KEY)) $.write([], FILES_KEY);
@ -40,13 +41,17 @@ function createFile(req, res) {
success(res, file, 201); success(res, file, 201);
} }
function getFile(req, res) { async function getFile(req, res) {
let { name } = req.params; let { name } = req.params;
name = decodeURIComponent(name); name = decodeURIComponent(name);
const allFiles = $.read(FILES_KEY); const allFiles = $.read(FILES_KEY);
const file = findByName(allFiles, name); const file = findByName(allFiles, name);
if (file) { if (file) {
res.set('Content-Type', 'text/plain; charset=utf-8').send(file.content); let content = file.content ?? '';
content = await ProxyUtils.process(content, file.process || []);
res.set('Content-Type', 'text/plain; charset=utf-8').send(
content ?? '',
);
} else { } else {
failed( failed(
res, res,

View File

@ -9,6 +9,28 @@ import $ from '@/core/app';
export default function register($app) { export default function register($app) {
$app.post('/api/preview/sub', compareSub); $app.post('/api/preview/sub', compareSub);
$app.post('/api/preview/collection', compareCollection); $app.post('/api/preview/collection', compareCollection);
$app.post('/api/preview/file', previewFile);
}
async function previewFile(req, res) {
try {
let { content = '', process = [] } = req.body;
const processed = await ProxyUtils.process(content, process || []);
// produce
success(res, { original: content, processed });
} catch (err) {
$.error(err.message ?? err);
failed(
res,
new InternalServerError(
`INTERNAL_SERVER_ERROR`,
`Failed to preview file`,
`Reason: ${err.message ?? err}`,
),
);
}
} }
async function compareSub(req, res) { async function compareSub(req, res) {

View File

@ -331,7 +331,10 @@ async function produceArtifact({
} else if (type === 'file') { } else if (type === 'file') {
const allFiles = $.read(FILES_KEY); const allFiles = $.read(FILES_KEY);
const file = findByName(allFiles, name); const file = findByName(allFiles, name);
return file?.content ?? ''; if (!file) throw new Error(`找不到文件 ${name}`);
let content = file.content ?? '';
content = await ProxyUtils.process(content, file.process || []);
return content ?? '';
} }
} }