neoctl-web 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +244 -238
- package/bin/neow.mjs +139 -123
- package/core-runtime.mjs +55 -55
- package/cpa-quota.mjs +209 -209
- package/dist/assets/{index-H7num-0s.js → index-B6NPbDJ9.js} +1 -1
- package/dist/assets/{index-BSFq6wfd.css → index-DG8NYKAP.css} +1 -1
- package/dist/favicon.svg +3 -3
- package/dist/index.html +2 -2
- package/memory-monitor.mjs +150 -150
- package/package.json +63 -62
- package/platform-paths.mjs +40 -0
- package/plugin-settings.mjs +67 -67
- package/plugins/downloads/downloads.mjs +147 -147
- package/plugins/downloads/index.mjs +19 -19
- package/plugins/downloads/neo-plugin.json +9 -9
- package/plugins/xhs-artifact/artifacts.mjs +388 -388
- package/plugins/xhs-artifact/editor-page.mjs +73 -73
- package/plugins/xhs-artifact/index.mjs +48 -48
- package/plugins/xhs-artifact/neo-plugin.json +9 -9
- package/plugins.mjs +111 -111
- package/runtime-router-cleanup.mjs +152 -152
- package/runtime-workspaces.mjs +515 -515
- package/server.mjs +447 -445
- package/tool-settings.mjs +80 -80
package/tool-settings.mjs
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
import fsp from 'node:fs/promises';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
|
|
4
|
-
export async function createWebToolSettings(storageFile) {
|
|
5
|
-
let state = await readState(storageFile);
|
|
6
|
-
let writeQueue = Promise.resolve();
|
|
7
|
-
|
|
8
|
-
function snapshot() {
|
|
9
|
-
return structuredClone(state);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async function update(next) {
|
|
13
|
-
state = next;
|
|
14
|
-
writeQueue = writeQueue.catch(() => undefined).then(() => writeState(storageFile, state));
|
|
15
|
-
await writeQueue;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
snapshot,
|
|
20
|
-
globalOverrides() {
|
|
21
|
-
return { ...state.global };
|
|
22
|
-
},
|
|
23
|
-
sessionOverrides(sessionId) {
|
|
24
|
-
const value = state.sessions[String(sessionId || '')];
|
|
25
|
-
return value && typeof value === 'object' ? { ...value } : {};
|
|
26
|
-
},
|
|
27
|
-
async setGlobalOverrides(overrides) {
|
|
28
|
-
await update({ ...state, global: normalizeOverrides(overrides) });
|
|
29
|
-
},
|
|
30
|
-
async setSessionOverrides(sessionId, overrides) {
|
|
31
|
-
const id = String(sessionId || '').trim();
|
|
32
|
-
if (!id) throw new Error('session id is required');
|
|
33
|
-
const sessions = { ...state.sessions };
|
|
34
|
-
const normalized = normalizeOverrides(overrides);
|
|
35
|
-
if (Object.keys(normalized).length) sessions[id] = normalized;
|
|
36
|
-
else delete sessions[id];
|
|
37
|
-
await update({ ...state, sessions });
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function normalizeOverrides(value) {
|
|
43
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
|
|
44
|
-
return Object.fromEntries(
|
|
45
|
-
Object.entries(value)
|
|
46
|
-
.filter(([name, enabled]) => String(name).trim() && typeof enabled === 'boolean')
|
|
47
|
-
.map(([name, enabled]) => [String(name).trim(), enabled])
|
|
48
|
-
.sort(([left], [right]) => left.localeCompare(right)),
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async function readState(storageFile) {
|
|
53
|
-
if (!storageFile) return emptyState();
|
|
54
|
-
try {
|
|
55
|
-
const parsed = JSON.parse(await fsp.readFile(storageFile, 'utf8'));
|
|
56
|
-
const sessions = parsed?.sessions && typeof parsed.sessions === 'object' && !Array.isArray(parsed.sessions)
|
|
57
|
-
? Object.fromEntries(Object.entries(parsed.sessions).map(([id, value]) => [id, normalizeOverrides(value)]))
|
|
58
|
-
: {};
|
|
59
|
-
return {
|
|
60
|
-
version: 1,
|
|
61
|
-
global: normalizeOverrides(parsed?.global),
|
|
62
|
-
sessions,
|
|
63
|
-
};
|
|
64
|
-
} catch (error) {
|
|
65
|
-
if (error?.code !== 'ENOENT') console.warn(`failed to read web tool settings: ${error.message || error}`);
|
|
66
|
-
return emptyState();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function emptyState() {
|
|
71
|
-
return { version: 1, global: {}, sessions: {} };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async function writeState(storageFile, state) {
|
|
75
|
-
if (!storageFile) return;
|
|
76
|
-
await fsp.mkdir(path.dirname(storageFile), { recursive: true });
|
|
77
|
-
const temporary = `${storageFile}.${process.pid}.tmp`;
|
|
78
|
-
await fsp.writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
|
79
|
-
await fsp.rename(temporary, storageFile);
|
|
80
|
-
}
|
|
1
|
+
import fsp from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
export async function createWebToolSettings(storageFile) {
|
|
5
|
+
let state = await readState(storageFile);
|
|
6
|
+
let writeQueue = Promise.resolve();
|
|
7
|
+
|
|
8
|
+
function snapshot() {
|
|
9
|
+
return structuredClone(state);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async function update(next) {
|
|
13
|
+
state = next;
|
|
14
|
+
writeQueue = writeQueue.catch(() => undefined).then(() => writeState(storageFile, state));
|
|
15
|
+
await writeQueue;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
snapshot,
|
|
20
|
+
globalOverrides() {
|
|
21
|
+
return { ...state.global };
|
|
22
|
+
},
|
|
23
|
+
sessionOverrides(sessionId) {
|
|
24
|
+
const value = state.sessions[String(sessionId || '')];
|
|
25
|
+
return value && typeof value === 'object' ? { ...value } : {};
|
|
26
|
+
},
|
|
27
|
+
async setGlobalOverrides(overrides) {
|
|
28
|
+
await update({ ...state, global: normalizeOverrides(overrides) });
|
|
29
|
+
},
|
|
30
|
+
async setSessionOverrides(sessionId, overrides) {
|
|
31
|
+
const id = String(sessionId || '').trim();
|
|
32
|
+
if (!id) throw new Error('session id is required');
|
|
33
|
+
const sessions = { ...state.sessions };
|
|
34
|
+
const normalized = normalizeOverrides(overrides);
|
|
35
|
+
if (Object.keys(normalized).length) sessions[id] = normalized;
|
|
36
|
+
else delete sessions[id];
|
|
37
|
+
await update({ ...state, sessions });
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function normalizeOverrides(value) {
|
|
43
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) return {};
|
|
44
|
+
return Object.fromEntries(
|
|
45
|
+
Object.entries(value)
|
|
46
|
+
.filter(([name, enabled]) => String(name).trim() && typeof enabled === 'boolean')
|
|
47
|
+
.map(([name, enabled]) => [String(name).trim(), enabled])
|
|
48
|
+
.sort(([left], [right]) => left.localeCompare(right)),
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function readState(storageFile) {
|
|
53
|
+
if (!storageFile) return emptyState();
|
|
54
|
+
try {
|
|
55
|
+
const parsed = JSON.parse(await fsp.readFile(storageFile, 'utf8'));
|
|
56
|
+
const sessions = parsed?.sessions && typeof parsed.sessions === 'object' && !Array.isArray(parsed.sessions)
|
|
57
|
+
? Object.fromEntries(Object.entries(parsed.sessions).map(([id, value]) => [id, normalizeOverrides(value)]))
|
|
58
|
+
: {};
|
|
59
|
+
return {
|
|
60
|
+
version: 1,
|
|
61
|
+
global: normalizeOverrides(parsed?.global),
|
|
62
|
+
sessions,
|
|
63
|
+
};
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (error?.code !== 'ENOENT') console.warn(`failed to read web tool settings: ${error.message || error}`);
|
|
66
|
+
return emptyState();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function emptyState() {
|
|
71
|
+
return { version: 1, global: {}, sessions: {} };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function writeState(storageFile, state) {
|
|
75
|
+
if (!storageFile) return;
|
|
76
|
+
await fsp.mkdir(path.dirname(storageFile), { recursive: true });
|
|
77
|
+
const temporary = `${storageFile}.${process.pid}.tmp`;
|
|
78
|
+
await fsp.writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
|
79
|
+
await fsp.rename(temporary, storageFile);
|
|
80
|
+
}
|