@wasmsoft/fantastic 1.0.3 → 1.0.5
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/dist/commands/config/set.d.ts.map +1 -1
- package/dist/commands/config/set.js +43 -0
- package/dist/commands/config/set.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +26 -0
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/migrate-cli.d.ts.map +1 -1
- package/dist/commands/migrate-cli.js +26 -3
- package/dist/commands/migrate-cli.js.map +1 -1
- package/dist/commands/restart.d.ts +3 -1
- package/dist/commands/restart.d.ts.map +1 -1
- package/dist/commands/restart.js +17 -3
- package/dist/commands/restart.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +27 -2
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +4 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/packaging/install.d.ts.map +1 -1
- package/dist/packaging/install.js +16 -2
- package/dist/packaging/install.js.map +1 -1
- package/dist/packaging/machine-path.d.ts +35 -2
- package/dist/packaging/machine-path.d.ts.map +1 -1
- package/dist/packaging/machine-path.js +41 -8
- package/dist/packaging/machine-path.js.map +1 -1
- package/dist/probes/port.probe.d.ts.map +1 -1
- package/dist/probes/port.probe.js +54 -4
- package/dist/probes/port.probe.js.map +1 -1
- package/dist/render/boot.render.d.ts.map +1 -1
- package/dist/render/boot.render.js +5 -0
- package/dist/render/boot.render.js.map +1 -1
- package/dist/supervisor/orchestrator.d.ts +2 -0
- package/dist/supervisor/orchestrator.d.ts.map +1 -1
- package/dist/supervisor/orchestrator.js +9 -3
- package/dist/supervisor/orchestrator.js.map +1 -1
- package/dist/supervisor/root-processes.d.ts +30 -0
- package/dist/supervisor/root-processes.d.ts.map +1 -0
- package/dist/supervisor/root-processes.js +79 -0
- package/dist/supervisor/root-processes.js.map +1 -0
- package/dist/supervisor/tree-kill.d.ts +2 -0
- package/dist/supervisor/tree-kill.d.ts.map +1 -1
- package/dist/supervisor/tree-kill.js +13 -3
- package/dist/supervisor/tree-kill.js.map +1 -1
- package/dist/updating/rollback.d.ts.map +1 -1
- package/dist/updating/rollback.js +2 -1
- package/dist/updating/rollback.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import { terminateTree } from "./tree-kill.js";
|
|
3
|
+
/**
|
|
4
|
+
* يُعدّد العمليات التي تُنفَّذ من صورة داخل root.
|
|
5
|
+
*
|
|
6
|
+
* **لا يُحقَن المسار في سكربت PowerShell.** السرد كامل والترشيح هنا: مسار ويندوز يحمل شرطات مائلة
|
|
7
|
+
* عكسية وقد يحمل فراغات ومحارف اقتباس، وتركيبه داخل نصّ سكربت يكسره أو يفتح باب حقن. والترشيح في
|
|
8
|
+
* TypeScript قابل للاختبار بلا عملية.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ **يحتاج صلاحية مرتفعة ليكون كاملًا**: ExecutablePath لعملية تخصّ حسابًا آخر يعود فارغًا لجلسة
|
|
11
|
+
* غير مرفوعة، فتُستبعَد العملية بصمت ويبدو المجلد خاليًا وهو ليس كذلك. وعمليات SYSTEM التي تُطلقها
|
|
12
|
+
* مهمّة الإقلاع هي بالضبط ما نبحث عنه. لذلك يبلّغ المستدعي بما وجد، ولا يَعِد بأنه وجد كلّ شيء.
|
|
13
|
+
*/
|
|
14
|
+
export async function findProcessesUnder(root) {
|
|
15
|
+
if (process.platform !== "win32")
|
|
16
|
+
return [];
|
|
17
|
+
const script = 'Get-CimInstance Win32_Process | Where-Object { $_.ExecutablePath } | ForEach-Object { "$($_.ProcessId)|$($_.ExecutablePath)" }';
|
|
18
|
+
try {
|
|
19
|
+
const { stdout } = await execa("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], { timeout: 20_000, reject: false, windowsHide: true });
|
|
20
|
+
return stdout
|
|
21
|
+
.split("\n")
|
|
22
|
+
.map((line) => line.trim())
|
|
23
|
+
.filter((line) => line.length > 0)
|
|
24
|
+
.flatMap((line) => {
|
|
25
|
+
const separator = line.indexOf("|");
|
|
26
|
+
if (separator < 0)
|
|
27
|
+
return [];
|
|
28
|
+
const pid = Number(line.slice(0, separator));
|
|
29
|
+
const executablePath = line.slice(separator + 1);
|
|
30
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
31
|
+
return [];
|
|
32
|
+
// العملية الحالية لا تُنهي نفسها. لا تقع اليوم — الـ CLI يعمل من تثبيت npm لا من هنا — لكن
|
|
33
|
+
// dev ومسارات مستقبلية قد تضعه داخل الشجرة، وثمن السهو هو انتحار الأمر في منتصف عمله.
|
|
34
|
+
if (pid === process.pid)
|
|
35
|
+
return [];
|
|
36
|
+
if (!isUnder(root, executablePath))
|
|
37
|
+
return [];
|
|
38
|
+
return [{ pid, executablePath }];
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// أفضل جهد: الفشل هنا يعني أننا لم نعرف، لا أن المجلد خالٍ. المستدعي يمضي في إيقافه المعتاد.
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** يوحّد المسار للمقارنة: ويندوز لا يفرّق بين حالة الأحرف ولا بين نوعَي الشرطة المائلة. */
|
|
47
|
+
function normalise(path) {
|
|
48
|
+
const unified = path.trim().replace(/\//g, "\\").toLowerCase();
|
|
49
|
+
return unified.endsWith("\\") ? unified : `${unified}\\`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* هل هذه الصورة داخل root؟ **القرار مُخرَجٌ نقيًّا لأنه ما يجب أن يُختبَر**، وسرد العمليات ليس قرارًا
|
|
53
|
+
* — نفس ما فُعِل مع account-gate.util.ts في خدمة البث.
|
|
54
|
+
*
|
|
55
|
+
* الفاصل يُضاف قبل المقارنة، وهذا ليس تجميلًا: بدونه يطابق مجلدُ تثبيتٍ مسارَ مجلدٍ يبدأ باسمه نفسه
|
|
56
|
+
* ثم يزيد (Fantastic وFantastic2)، فتُنهي إزالةُ أحدهما عملياتِ الآخر على الجهاز نفسه.
|
|
57
|
+
*/
|
|
58
|
+
export function isUnder(root, executablePath) {
|
|
59
|
+
if (!root.trim() || !executablePath.trim())
|
|
60
|
+
return false;
|
|
61
|
+
return normalise(executablePath).startsWith(normalise(root));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* يُنهي كل ما يعمل من داخل root ويعيد ما أُنهي فعلًا. لا يرمي: هذا تنظيفٌ يسبق عملًا آخر، وفشله
|
|
65
|
+
* لا يجوز أن يمنع ذلك العمل — الحذف بعده يقول بنفسه ما تعذّر.
|
|
66
|
+
*/
|
|
67
|
+
export async function terminateProcessesUnder(root) {
|
|
68
|
+
const found = await findProcessesUnder(root);
|
|
69
|
+
const ended = [];
|
|
70
|
+
for (const candidate of found) {
|
|
71
|
+
// terminateTree لا kill: الخدمة قد تكون أطلقت ffmpeg، وقتل الأب وحده على ويندوز يترك الابن
|
|
72
|
+
// حيًّا ممسكًا بجهاز الالتقاط أو باتصال المزوّد.
|
|
73
|
+
const { terminated } = await terminateTree(candidate.pid);
|
|
74
|
+
if (terminated)
|
|
75
|
+
ended.push(candidate);
|
|
76
|
+
}
|
|
77
|
+
return ended;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=root-processes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-processes.js","sourceRoot":"","sources":["../../src/supervisor/root-processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,8 @@ export interface TerminateResult {
|
|
|
3
3
|
terminated: boolean;
|
|
4
4
|
/** هل اضطررنا للإجبار؟ يُعرض للمستخدم لأنه يعني أن الإغلاق لم يكن مرتّبًا. */
|
|
5
5
|
forced: boolean;
|
|
6
|
+
/** رفض ويندوز الإنهاء لنقص صلاحية — الفرق بين «عصيّة» و«ليست لك». */
|
|
7
|
+
accessDenied?: boolean;
|
|
6
8
|
}
|
|
7
9
|
/** ينهي عملية وكل ذرّيتها. آمن للاستدعاء على PID غير موجود. */
|
|
8
10
|
export declare function terminateTree(pid: number, graceMs?: number): Promise<TerminateResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-kill.d.ts","sourceRoot":"","sources":["../../src/supervisor/tree-kill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-kill.d.ts","sourceRoot":"","sources":["../../src/supervisor/tree-kill.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,+DAA+D;AAC/D,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,SAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC7F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAS1F"}
|
|
@@ -19,12 +19,20 @@ const POLL_MS = 250;
|
|
|
19
19
|
async function isAlive(pid) {
|
|
20
20
|
return Boolean(await readProcessIdentity(pid));
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* يُرجع true إن رفض ويندوز الإنهاء لنقص صلاحية. يهمّ لأن خدمات الجهاز تُطلقها مهمّة الإقلاع بحساب
|
|
24
|
+
* SYSTEM، وطرفيّة غير مرفوعة لا تملك إنهاءها: taskkill يخرج بـ ١ ولا يُطبَع شيء، فتقول الشاشة
|
|
25
|
+
* «لم تتوقّف» بلا سبب ويظنّ الفنّي أن العملية عصيّة وهي ببساطة ليست له.
|
|
26
|
+
* القراءة برمز الخروج لا بنصّ الخطأ: ويندوز عربيّ لا يقول "Access is denied".
|
|
27
|
+
*/
|
|
22
28
|
async function taskkill(pid, force) {
|
|
23
29
|
const args = ["/PID", String(pid), "/T"];
|
|
24
30
|
if (force)
|
|
25
31
|
args.push("/F");
|
|
26
|
-
await execa("taskkill.exe", args, { reject: false, timeout: 10_000 });
|
|
32
|
+
const { exitCode } = await execa("taskkill.exe", args, { reject: false, timeout: 10_000 });
|
|
33
|
+
return exitCode === ACCESS_DENIED_EXIT;
|
|
27
34
|
}
|
|
35
|
+
const ACCESS_DENIED_EXIT = 1;
|
|
28
36
|
async function waitForExit(pid, timeoutMs) {
|
|
29
37
|
const deadline = Date.now() + timeoutMs;
|
|
30
38
|
while (Date.now() < deadline) {
|
|
@@ -42,8 +50,10 @@ export async function terminateTree(pid, graceMs = GRACE_MS) {
|
|
|
42
50
|
await taskkill(pid, false);
|
|
43
51
|
if (await waitForExit(pid, graceMs))
|
|
44
52
|
return { terminated: true, forced: false };
|
|
45
|
-
await taskkill(pid, true);
|
|
46
|
-
|
|
53
|
+
const denied = await taskkill(pid, true);
|
|
54
|
+
const terminated = await waitForExit(pid, graceMs);
|
|
55
|
+
// الرفض لا يُبلَّغ عنه إلا إن بقيت العملية: قد يُرفض الإنهاء ثم تخرج من تلقائها.
|
|
56
|
+
return { terminated, forced: true, accessDenied: denied && !terminated };
|
|
47
57
|
}
|
|
48
58
|
try {
|
|
49
59
|
process.kill(-pid, "SIGTERM");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-kill.js","sourceRoot":"","sources":["../../src/supervisor/tree-kill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,gGAAgG;AAChG,2FAA2F;AAC3F,qGAAqG;AACrG,6FAA6F;AAC7F,qGAAqG;AACrG,+FAA+F;AAC/F,gEAAgE;AAEhE;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB,KAAK,UAAU,OAAO,CAAC,GAAW;IAChC,OAAO,OAAO,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,KAAc;IACjD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tree-kill.js","sourceRoot":"","sources":["../../src/supervisor/tree-kill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/updating/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAgBvD,MAAM,MAAM,cAAc,GAAG;IAC3B,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/updating/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAgBvD,MAAM,MAAM,cAAc,GAAG;IAC3B,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CA8B5F"}
|
|
@@ -23,7 +23,8 @@ import { undoSwap } from "./apply.js";
|
|
|
23
23
|
*/
|
|
24
24
|
export async function rollback(profile, handle) {
|
|
25
25
|
try {
|
|
26
|
-
|
|
26
|
+
// نفس سبب update: التراجع يعيد شجرةً مكانها مشغول، فما لم يُفرَّغ لا يُستعاد شيء.
|
|
27
|
+
await stopServices(profile, { force: true });
|
|
27
28
|
}
|
|
28
29
|
catch {
|
|
29
30
|
// الإيقاف الفاشل لا يمنع المحاولة: قد لا تكون هناك عملية أصلًا.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/updating/rollback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAyBvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,MAAkB;IACjE,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/updating/rollback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAyBvD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,MAAkB;IACjE,IAAI,CAAC;QACH,oFAAoF;QACpF,MAAM,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,OAAO,EACL,4CAA4C,MAAM,CAAC,QAAQ,IAAI;gBAC/D,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;SACtD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC;IACJ,CAAC;AACH,CAAC"}
|