You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
445 lines
15 KiB
445 lines
15 KiB
//drpy运行环境相关
|
|
/*
|
|
const localKey = "drpy";
|
|
globalThis.local = {
|
|
set(rulekey, k, v) {
|
|
storage0.setItem(localKey + "@" + rulekey + "@" + k, v);
|
|
},
|
|
get(rulekey, k, v) {
|
|
return storage0.getItem(localKey + "@" + rulekey + "@" + k, "") || v;
|
|
},
|
|
delete(rulekey, k) {
|
|
storage0.clearItem(localKey + "@" + rulekey + "@" + k);
|
|
}
|
|
};
|
|
eval(getCryptoJS());
|
|
globalThis.CryptoJS = CryptoJS;
|
|
|
|
let $request = request;
|
|
let $post = post;
|
|
globalThis.req = function (url, cobj) {
|
|
try {
|
|
let res = {};
|
|
let obj = Object.assign({}, cobj);
|
|
if (obj.data) {
|
|
obj.body = obj.data;
|
|
delete obj.data;
|
|
}
|
|
|
|
if (obj.hasOwnProperty("redirect")) obj.redirect = !!obj.redirect;
|
|
if (obj.buffer === 2) {
|
|
obj.toHex = true;
|
|
}
|
|
obj.headers = Object.assign({
|
|
Cookie: "#noCookie#"
|
|
}, obj.headers);
|
|
if (url === "https://api.nn.ci/ocr/b64/text" && obj.headers) {
|
|
obj.headers["Content-Type"] = "text/plain";
|
|
}
|
|
|
|
if (url.startsWith("file://") && (url.includes("?type=") || url.includes("?params="))) {
|
|
url = url.slice(0, url.lastIndexOf("?"));
|
|
}
|
|
for (let key in obj.headers) {
|
|
if (typeof obj.headers[key] !== "string") {
|
|
obj.headers[key] = String(obj.headers[key]);
|
|
}
|
|
}
|
|
let r = "";
|
|
r = $request(url, obj);
|
|
if (obj.withHeaders) {
|
|
r = JSON.parse(r);
|
|
res.content = r.body;
|
|
res.headers = {};
|
|
for (let [k, v] of Object.entries(r.headers || {})) {
|
|
res.headers[k] = v[0];
|
|
}
|
|
} else {
|
|
res.content = r;
|
|
}
|
|
if (obj.buffer === 2) {
|
|
const CryptoUtil = $.require("hiker://assets/crypto-java.js");
|
|
res.content = CryptoUtil.Data.parseHex(res.content).toBase64(_base64.NO_WRAP);
|
|
}
|
|
return res;
|
|
} catch (e) {
|
|
log("Error" + e.toString());
|
|
}
|
|
}
|
|
pdfa = _pdfa;
|
|
pd = _pd;
|
|
pdfh = _pdfh;
|
|
String.prototype.replaceAll = function (search, replacement) {
|
|
return this.split(search).join(replacement);
|
|
};
|
|
let $toString = Function.prototype.toString;
|
|
Function.prototype.toString = function () {
|
|
return $toString.apply(this).trim();
|
|
};
|
|
|
|
const MAX_ENVS = 5;
|
|
let drpyEnvS = {};
|
|
let nextEnvId = 0;
|
|
|
|
function createOrGetEnvironment(id, ext) {
|
|
if (id === undefined) {
|
|
id = nextEnvId++;
|
|
}
|
|
if (drpyEnvS[id]) {
|
|
log(id + '>drpy取缓存');
|
|
return drpyEnvS[id];
|
|
} else {
|
|
log(id + '>drpy初始化');
|
|
}
|
|
log("删除前" + Object.keys(drpyEnvS).length)
|
|
if (Object.keys(drpyEnvS).length >= MAX_ENVS) {
|
|
const oldestId = Object.keys(drpyEnvS).sort((a, b) => a - b)[0];
|
|
|
|
delete drpyEnvS[oldestId];
|
|
log("删除后" + Object.keys(drpyEnvS).length)
|
|
}
|
|
|
|
drpyEnvS[id] = (function(ext) {
|
|
let path = module.modulePath.slice(0, module.modulePath.lastIndexOf("/")) + '/drpy/drpy2.js';
|
|
let drpy2 = $.require(path);
|
|
drpy2.init(ext);
|
|
return drpy2.DRPY();
|
|
}, ext)
|
|
|
|
return drpyEnvS[id];
|
|
}
|
|
*/
|
|
const MAX_ENVS = 5;
|
|
let drpyEnvS = {};
|
|
let nextEnvId = 0;
|
|
|
|
function createOrGetEnvironment(id, ext) {
|
|
if (id === undefined) {
|
|
id = nextEnvId++;
|
|
}
|
|
if (drpyEnvS[id]) {
|
|
log(id + '>drpy取缓存');
|
|
return drpyEnvS[id];
|
|
} else {
|
|
log(id + '>drpy初始化');
|
|
}
|
|
log("删除前" + Object.keys(drpyEnvS).length);
|
|
if (Object.keys(drpyEnvS).length >= MAX_ENVS) {
|
|
const oldestId = Object.keys(drpyEnvS).sort((a, b) => a - b)[0];
|
|
delete drpyEnvS[oldestId];
|
|
log("删除后" + Object.keys(drpyEnvS).length);
|
|
}
|
|
|
|
// 创建一个空的全局对象,将用于`runInNewContext`
|
|
let global = {};
|
|
|
|
// 使用`runInNewContext`来执行代码,创建隔离的环境
|
|
// 注意这里返回的是`drpy2`模块的引用
|
|
drpyEnvS[id] = runInNewContext(`
|
|
const localKey = "drpy";
|
|
globalThis.local = {
|
|
set(rulekey, k, v) {
|
|
storage0.setItem(localKey + "@" + rulekey + "@" + k, v);
|
|
},
|
|
get(rulekey, k, v) {
|
|
return storage0.getItem(localKey + "@" + rulekey + "@" + k, "") || v;
|
|
},
|
|
delete(rulekey, k) {
|
|
storage0.clearItem(localKey + "@" + rulekey + "@" + k);
|
|
}
|
|
};
|
|
eval(getCryptoJS());
|
|
globalThis.CryptoJS = CryptoJS;
|
|
|
|
let $request = request;
|
|
let $post = post;
|
|
globalThis.req = function (url, cobj) {
|
|
try {
|
|
let res = {};
|
|
let obj = Object.assign({}, cobj);
|
|
if (obj.data) {
|
|
obj.body = obj.data;
|
|
delete obj.data;
|
|
}
|
|
|
|
if (obj.hasOwnProperty("redirect")) obj.redirect = !!obj.redirect;
|
|
if (obj.buffer === 2) {
|
|
obj.toHex = true;
|
|
}
|
|
obj.headers = Object.assign({
|
|
Cookie: "#noCookie#"
|
|
}, obj.headers);
|
|
if (url === "https://api.nn.ci/ocr/b64/text" && obj.headers) {
|
|
obj.headers["Content-Type"] = "text/plain";
|
|
}
|
|
|
|
if (url.startsWith("file://") && (url.includes("?type=") || url.includes("?params="))) {
|
|
url = url.slice(0, url.lastIndexOf("?"));
|
|
}
|
|
for (let key in obj.headers) {
|
|
if (typeof obj.headers[key] !== "string") {
|
|
obj.headers[key] = String(obj.headers[key]);
|
|
}
|
|
}
|
|
let r = "";
|
|
r = $request(url, obj);
|
|
if (obj.withHeaders) {
|
|
r = JSON.parse(r);
|
|
res.content = r.body;
|
|
res.headers = {};
|
|
for (let [k, v] of Object.entries(r.headers || {})) {
|
|
res.headers[k] = v[0];
|
|
}
|
|
} else {
|
|
res.content = r;
|
|
}
|
|
if (obj.buffer === 2) {
|
|
const CryptoUtil = $.require("hiker://assets/crypto-java.js");
|
|
res.content = CryptoUtil.Data.parseHex(res.content).toBase64(_base64.NO_WRAP);
|
|
}
|
|
return res;
|
|
} catch (e) {
|
|
log("Error" + e.toString());
|
|
}
|
|
}
|
|
pdfa = _pdfa;
|
|
pd = _pd;
|
|
pdfh = _pdfh;
|
|
String.prototype.replaceAll = function (search, replacement) {
|
|
return this.split(search).join(replacement);
|
|
};
|
|
let $toString = Function.prototype.toString;
|
|
Function.prototype.toString = function () {
|
|
return $toString.apply(this).trim();
|
|
};
|
|
let path = ${module.modulePath.slice(0, module.modulePath.lastIndexOf("/") + 1)} + 'drpy/drpy2.js';
|
|
let drpy2 = $.require(path);
|
|
drpy2.init(${JSON.stringify(ext)});
|
|
drpy2;
|
|
`, global);
|
|
|
|
return drpyEnvS[id];
|
|
}
|
|
|
|
// 确保`runInNewContext`函数可用
|
|
function runInNewContext(code, global) {
|
|
let Context = org.mozilla.javascript.Context;
|
|
let cx = Context.enter();
|
|
cx.setLanguageVersion(Context.VERSION_ES6);
|
|
global = Object.assign(cx.initStandardObjects(), global);
|
|
try {
|
|
return org.mozilla.javascript.ScriptRuntime.evalSpecial(cx, global, global, [String(code)], "new code", 1);
|
|
} finally {
|
|
cx.exit();
|
|
}
|
|
}
|
|
$.exports = {
|
|
createOrGetEnvironment
|
|
}
|
|
|
|
/*
|
|
//drpyEnvS[id].init(ext);$.require.cache.delete($.require.resolve(path));
|
|
//ENVIRONMENTS沙箱环境
|
|
const MAX_ENVS = 5;
|
|
let drpyEnvS = globalMap0.getVar('drpyEnvS',{});
|
|
let nextEnvId = 0;
|
|
let envLock = false;
|
|
|
|
function createOrGetEnvironment(id, ext) {
|
|
while (envLock) {
|
|
// 等待锁释放
|
|
}
|
|
envLock = true;
|
|
|
|
try {
|
|
syncExecute({
|
|
func: ({
|
|
id, ext
|
|
}) => {
|
|
if (id === undefined) {
|
|
id = nextEnvId++;
|
|
}
|
|
if (drpyEnvS[id]) {
|
|
log(id + '>drpy取缓存');
|
|
return drpyEnvS[id];
|
|
} else {
|
|
log(id + '>drpy初始化');
|
|
}
|
|
log("删除前" + Object.keys(drpyEnvS).length)
|
|
if (Object.keys(drpyEnvS).length >= MAX_ENVS) {
|
|
const oldestId = Object.keys(drpyEnvS).sort((a, b) => a - b)[0];
|
|
|
|
delete drpyEnvS[oldestId];
|
|
log("删除后" + Object.keys(drpyEnvS).length)
|
|
}
|
|
drpyEnvS[id] = (function() {
|
|
//drpy运行环境相关
|
|
const localKey = "drpy";
|
|
globalThis.local = {
|
|
set(rulekey, k, v) {
|
|
storage0.putVar(localKey + "@" + rulekey + "@" + k, v);
|
|
},
|
|
get(rulekey, k, v) {
|
|
return storage0.getVar(localKey + "@" + rulekey + "@" + k, "") || v;
|
|
},
|
|
delete(rulekey, k) {
|
|
storage0.clearVar(localKey + "@" + rulekey + "@" + k);
|
|
}
|
|
};
|
|
eval(getCryptoJS());
|
|
globalThis.CryptoJS = CryptoJS;
|
|
|
|
let $request = request;
|
|
let $post = post;
|
|
globalThis.req = function (url, cobj) {
|
|
try {
|
|
let res = {};
|
|
let obj = Object.assign({}, cobj);
|
|
if (obj.data) {
|
|
obj.body = obj.data;
|
|
delete obj.data;
|
|
}
|
|
|
|
if (obj.hasOwnProperty("redirect")) obj.redirect = !!obj.redirect;
|
|
if (obj.buffer === 2) {
|
|
obj.toHex = true;
|
|
}
|
|
obj.headers = Object.assign({
|
|
Cookie: "#noCookie#"
|
|
}, obj.headers);
|
|
if (url === "https://api.nn.ci/ocr/b64/text" && obj.headers) {
|
|
obj.headers["Content-Type"] = "text/plain";
|
|
}
|
|
|
|
if (url.startsWith("file://") && (url.includes("?type=") || url.includes("?params="))) {
|
|
url = url.slice(0, url.lastIndexOf("?"));
|
|
}
|
|
for (let key in obj.headers) {
|
|
if (typeof obj.headers[key] !== "string") {
|
|
obj.headers[key] = String(obj.headers[key]);
|
|
}
|
|
}
|
|
let r = "";
|
|
r = $request(url, obj);
|
|
if (obj.withHeaders) {
|
|
r = JSON.parse(r);
|
|
res.content = r.body;
|
|
res.headers = {};
|
|
for (let [k, v] of Object.entries(r.headers || {})) {
|
|
res.headers[k] = v[0];
|
|
}
|
|
} else {
|
|
res.content = r;
|
|
}
|
|
if (obj.buffer === 2) {
|
|
const CryptoUtil = $.require("hiker://assets/crypto-java.js");
|
|
res.content = CryptoUtil.Data.parseHex(res.content).toBase64(_base64.NO_WRAP);
|
|
}
|
|
return res;
|
|
} catch (e) {
|
|
log("Error" + e.toString());
|
|
}
|
|
}
|
|
pdfa = _pdfa;
|
|
pd = _pd;
|
|
pdfh = _pdfh;
|
|
String.prototype.replaceAll = function (search, replacement) {
|
|
return this.split(search).join(replacement);
|
|
};
|
|
let $toString = Function.prototype.toString;
|
|
Function.prototype.toString = function () {
|
|
return $toString.apply(this).trim();
|
|
};
|
|
let drpy2 = $.require(module.modulePath.slice(0, module.modulePath.lastIndexOf("/")) + '/drpy/drpy2.js');
|
|
return drpy2.DRPY();
|
|
})();
|
|
drpyEnvS[id].init(ext);
|
|
|
|
globalMap0.putVar('drpyEnvS', drpyEnvS);
|
|
//return drpyEnvS[id];
|
|
},
|
|
param: {
|
|
id, ext
|
|
}
|
|
});
|
|
return drpyEnvS[id];
|
|
} finally {
|
|
envLock = false;
|
|
}
|
|
}
|
|
|
|
log(Object.keys(drpyEnvS).length);
|
|
$.exports = {
|
|
createOrGetEnvironment
|
|
}
|
|
*/
|
|
|
|
|
|
/*
|
|
const MAX_ENVS = 10;
|
|
let environments = {};
|
|
let nextId = 0;
|
|
|
|
function createOrGetEnvironment(id) {
|
|
if (id === undefined) {
|
|
id = nextId++;
|
|
}
|
|
|
|
if (environments[id]) {
|
|
return environments[id];
|
|
}
|
|
|
|
if (Object.keys(environments).length >= MAX_ENVS) {
|
|
const oldestId = Object.keys(environments).sort((a, b) => a - b)[0];
|
|
environments[oldestId].destroy();
|
|
delete environments[oldestId];
|
|
}
|
|
|
|
environments[id] = (function() {
|
|
let data = {};
|
|
return {
|
|
id,
|
|
execute: function(code) {
|
|
eval(code);
|
|
|
|
},
|
|
getVariable: function(name) {
|
|
return data[name];
|
|
},
|
|
setVariable: function(name, value) {
|
|
data[name] = value;
|
|
},
|
|
destroy: function() {
|
|
delete environments[id];
|
|
}
|
|
};
|
|
})();
|
|
|
|
return environments[id];
|
|
}
|
|
// 示例使用
|
|
const env1 = createOrGetEnvironment();
|
|
env1.execute('data.x = 10;'); // 确保在获取变量值前执行代码
|
|
console.log(env1.getVariable('x')); // 应输出: 10
|
|
|
|
const env2 = createOrGetEnvironment(123);
|
|
env2.execute('data.y = 20;');
|
|
console.log(env2.getVariable('y')); // 输出: 20
|
|
|
|
// 重复获取环境2,应当直接返回之前的环境
|
|
const env2Again = createOrGetEnvironment(123);
|
|
console.log(env2Again.getVariable('y')); // 输出: 20,验证环境重用
|
|
|
|
// 继续创建直到达到最大限制
|
|
for (let i = 0; i < MAX_ENVS - 2; i++) {
|
|
createOrGetEnvironment();
|
|
}
|
|
|
|
// 超过最大限制时,最旧的环境会被销毁
|
|
const env11 = createOrGetEnvironment();
|
|
env11.execute('data.z = 30;');
|
|
console.log(env11.getVariable('z')); // 输出: 30
|
|
|
|
// 现在只有最近的10个环境存在
|
|
console.log(Object.keys(environments).length); // 输出: 10
|
|
*/ |