@3leaps/sysprims 0.1.12 → 0.1.14
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 +1 -0
- package/dist/ffi.d.ts +4 -0
- package/dist/ffi.d.ts.map +1 -1
- package/dist/ffi.js.map +1 -1
- package/dist/index.d.ts +54 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +118 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -1
- package/native/src/lib.rs +249 -3
- package/package.json +8 -8
package/README.md
CHANGED
package/dist/ffi.d.ts
CHANGED
|
@@ -16,10 +16,14 @@ export type SysprimsCallVoidResult = {
|
|
|
16
16
|
export type SysprimsLib = {
|
|
17
17
|
sysprimsAbiVersion: () => number;
|
|
18
18
|
sysprimsProcGet: (pid: number) => SysprimsCallJsonResult;
|
|
19
|
+
sysprimsProcGetEx: (pid: number, optionsJson: string) => SysprimsCallJsonResult;
|
|
19
20
|
sysprimsProcList: (filterJson: string) => SysprimsCallJsonResult;
|
|
21
|
+
sysprimsProcListEx: (filterJson: string, optionsJson: string) => SysprimsCallJsonResult;
|
|
20
22
|
sysprimsProcListeningPorts: (filterJson: string) => SysprimsCallJsonResult;
|
|
21
23
|
sysprimsProcWaitPid: (pid: number, timeoutMs: number) => SysprimsCallJsonResult;
|
|
22
24
|
sysprimsProcListFds: (pid: number, filterJson: string) => SysprimsCallJsonResult;
|
|
25
|
+
sysprimsProcDescendants: (rootPid: number, maxLevels: number, configJson: string) => SysprimsCallJsonResult;
|
|
26
|
+
sysprimsProcKillDescendants: (rootPid: number, maxLevels: number, signal: number, configJson: string) => SysprimsCallJsonResult;
|
|
23
27
|
sysprimsSelfGetpgid: () => SysprimsCallU32Result;
|
|
24
28
|
sysprimsSelfGetsid: () => SysprimsCallU32Result;
|
|
25
29
|
sysprimsSignalSend: (pid: number, signal: number) => SysprimsCallVoidResult;
|
package/dist/ffi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffi.d.ts","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,IAAI,WAAW,CAQ1C;AAcD,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvF,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvF,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,WAAW,GAAG;IACxB,kBAAkB,EAAE,MAAM,MAAM,CAAC;IAGjC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACzD,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACjE,0BAA0B,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC3E,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAChF,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAGjF,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;IACjD,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;IAGhD,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC5E,uBAAuB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAClF,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC3D,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAG3D,qBAAqB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAGnF,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;CACtE,CAAC;AAUF,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,sBAAsB,GAAG,OAAO,CAMxE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,qBAAqB,GAAG,MAAM,CAMlE;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,sBAAsB,GAAG,IAAI,CAK/D"}
|
|
1
|
+
{"version":3,"file":"ffi.d.ts","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,IAAI,WAAW,CAQ1C;AAcD,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvF,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvF,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,WAAW,GAAG;IACxB,kBAAkB,EAAE,MAAM,MAAM,CAAC;IAGjC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACzD,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAChF,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACjE,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,sBAAsB,CAAC;IACxF,0BAA0B,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC3E,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAChF,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAGjF,uBAAuB,EAAE,CACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,KACf,sBAAsB,CAAC;IAC5B,2BAA2B,EAAE,CAC3B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,KACf,sBAAsB,CAAC;IAG5B,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;IACjD,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;IAGhD,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC5E,uBAAuB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAClF,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAC3D,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAG3D,qBAAqB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;IAGnF,oBAAoB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,sBAAsB,CAAC;CACtE,CAAC;AAUF,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,sBAAsB,GAAG,OAAO,CAMxE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,qBAAqB,GAAG,MAAM,CAMlE;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,sBAAsB,GAAG,IAAI,CAK/D"}
|
package/dist/ffi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ffi.js","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":";;;;;AAQA,oCAQC;
|
|
1
|
+
{"version":3,"file":"ffi.js","sourceRoot":"","sources":["../src/ffi.ts"],"names":[],"mappings":";;;;;AAQA,oCAQC;AAoED,wCAMC;AAED,gCAMC;AAED,4BAKC;AAzGD,sDAAyB;AACzB,0DAA6B;AAC7B,qCAA4D;AAE5D,qCAA6C;AAE7C,IAAI,MAAM,GAAuB,IAAI,CAAC;AAEtC,SAAgB,YAAY;IAC1B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE/C,MAAM,GAAG,GAAgB,IAAA,0BAAiB,EAAC,WAAW,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,CAAC;IACb,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrD,IAAI,iBAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,OAAO,CAAC;QAC7C,MAAM,MAAM,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM;QAC9B,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;AAC5E,CAAC;AAgDD,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAgB;IACxD,MAAM,cAAc,GAAG,UAAU,IAAI,GAAG,CAAC;IACzC,MAAM,IAAI,sBAAa,CACrB,IAAyB,EACzB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,cAAc,EAAE,CAC5E,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,EAAgC;IAC7D,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,CAAC,IAAI,KAAK,0BAAiB,CAAC,EAAE,EAAE,CAAC;QACpC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,UAAU,CAAC,EAA+B;IACxD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,CAAC,IAAI,KAAK,0BAAiB,CAAC,EAAE,EAAE,CAAC;QACpC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,OAAQ,CAAC,CAAC,KAAgB,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,QAAQ,CAAC,EAAgC;IACvD,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,IAAI,CAAC,CAAC,IAAI,KAAK,0BAAiB,CAAC,EAAE,EAAE,CAAC;QACpC,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SysprimsError, SysprimsErrorCode } from "./errors";
|
|
2
|
-
import type { BatchKillResult, FdFilter, FdSnapshot, PortBindingsSnapshot, PortFilter, ProcessFilter, ProcessInfo, ProcessSnapshot, SpawnInGroupConfig, SpawnInGroupResult, TerminateTreeConfig, TerminateTreeResult, WaitPidResult } from "./types";
|
|
2
|
+
import type { BatchKillResult, DescendantsOptions, DescendantsResult, FdFilter, FdSnapshot, KillDescendantsOptions, KillDescendantsResult, PortBindingsSnapshot, PortFilter, ProcessFilter, ProcessInfo, ProcessOptions, ProcessSnapshot, SpawnInGroupConfig, SpawnInGroupResult, TerminateTreeConfig, TerminateTreeResult, WaitPidResult } from "./types";
|
|
3
3
|
export { SysprimsError, SysprimsErrorCode };
|
|
4
|
-
export type { BatchKillFailure, BatchKillResult, FdFilter, FdSnapshot, PortBinding, PortBindingsSnapshot, PortFilter, ProcessFilter, ProcessInfo, ProcessSnapshot, ProcessState, Protocol, SpawnInGroupConfig, SpawnInGroupResult, TerminateTreeConfig, TerminateTreeResult, WaitPidResult, } from "./types";
|
|
4
|
+
export type { BatchKillFailure, BatchKillResult, CpuMode, DescendantsLevel, DescendantsOptions, DescendantsResult, FdFilter, FdSnapshot, KillDescendantsFailure, KillDescendantsOptions, KillDescendantsResult, PortBinding, PortBindingsSnapshot, PortFilter, ProcessFilter, ProcessInfo, ProcessOptions, ProcessSnapshot, ProcessState, Protocol, SpawnInGroupConfig, SpawnInGroupResult, TerminateTreeConfig, TerminateTreeResult, WaitPidResult, } from "./types";
|
|
5
5
|
/**
|
|
6
6
|
* Get information about a specific process by PID.
|
|
7
7
|
*
|
|
@@ -10,7 +10,7 @@ export type { BatchKillFailure, BatchKillResult, FdFilter, FdSnapshot, PortBindi
|
|
|
10
10
|
* @throws {SysprimsError} NotFound if process does not exist
|
|
11
11
|
* @throws {SysprimsError} PermissionDenied if access is denied
|
|
12
12
|
*/
|
|
13
|
-
export declare function procGet(pid: number): ProcessInfo;
|
|
13
|
+
export declare function procGet(pid: number, options?: ProcessOptions): ProcessInfo;
|
|
14
14
|
/**
|
|
15
15
|
* List running processes with optional filtering.
|
|
16
16
|
*
|
|
@@ -38,7 +38,7 @@ export declare function procGet(pid: number): ProcessInfo;
|
|
|
38
38
|
* // Filter by multiple criteria
|
|
39
39
|
* const heavy = processList({ cpu_above: 50, memory_above_kb: 100000 });
|
|
40
40
|
*/
|
|
41
|
-
export declare function processList(filter?: ProcessFilter): ProcessSnapshot;
|
|
41
|
+
export declare function processList(filter?: ProcessFilter, options?: ProcessOptions): ProcessSnapshot;
|
|
42
42
|
/**
|
|
43
43
|
* List listening network ports with optional filtering.
|
|
44
44
|
*
|
|
@@ -66,6 +66,56 @@ export declare function processList(filter?: ProcessFilter): ProcessSnapshot;
|
|
|
66
66
|
* const http = listeningPorts({ local_port: 8080 });
|
|
67
67
|
*/
|
|
68
68
|
export declare function listeningPorts(filter?: PortFilter): PortBindingsSnapshot;
|
|
69
|
+
/**
|
|
70
|
+
* Get descendants of a process.
|
|
71
|
+
*
|
|
72
|
+
* Performs a BFS traversal of the process tree starting at `pid` and returns
|
|
73
|
+
* processes grouped by depth level.
|
|
74
|
+
*
|
|
75
|
+
* @param pid - Root process ID to traverse from
|
|
76
|
+
* @param options - Optional traversal configuration
|
|
77
|
+
* @returns Descendants grouped by level with metadata
|
|
78
|
+
* @throws {SysprimsError} NotFound if root process does not exist
|
|
79
|
+
* @throws {SysprimsError} InvalidArgument if pid is 0 or filter is invalid
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* // Get all descendants
|
|
83
|
+
* const result = descendants(1234);
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* // Get direct children only
|
|
87
|
+
* const result = descendants(1234, { maxLevels: 1 });
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* // Filter descendants by name
|
|
91
|
+
* const result = descendants(1234, { filter: { name_contains: "worker" } });
|
|
92
|
+
*/
|
|
93
|
+
export declare function descendants(pid: number, options?: DescendantsOptions): DescendantsResult;
|
|
94
|
+
/**
|
|
95
|
+
* Kill descendants of a process.
|
|
96
|
+
*
|
|
97
|
+
* Traverses the process tree from `pid`, collects descendant PIDs, and sends
|
|
98
|
+
* the specified signal. Safety rules are enforced: root PID, self, PID 1, and
|
|
99
|
+
* parent are automatically excluded from the kill list.
|
|
100
|
+
*
|
|
101
|
+
* @param pid - Root process ID (will NOT be killed)
|
|
102
|
+
* @param signal - Signal number to send (default: 15 = SIGTERM)
|
|
103
|
+
* @param options - Optional configuration
|
|
104
|
+
* @returns Result with succeeded/failed PIDs and safety skip count
|
|
105
|
+
* @throws {SysprimsError} NotFound if root process does not exist
|
|
106
|
+
* @throws {SysprimsError} InvalidArgument if pid is 0 or filter is invalid
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* // Kill all descendants with SIGTERM
|
|
110
|
+
* const result = killDescendants(1234);
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* // Force kill descendants matching a filter
|
|
114
|
+
* const result = killDescendants(1234, 9, {
|
|
115
|
+
* filter: { cpu_above: 90 },
|
|
116
|
+
* });
|
|
117
|
+
*/
|
|
118
|
+
export declare function killDescendants(pid: number, signal?: number, options?: KillDescendantsOptions): KillDescendantsResult;
|
|
69
119
|
/**
|
|
70
120
|
* Wait for a PID to exit up to the provided timeout (milliseconds).
|
|
71
121
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE5D,OAAO,KAAK,EAEV,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,8 @@ exports.SysprimsErrorCode = exports.SysprimsError = void 0;
|
|
|
4
4
|
exports.procGet = procGet;
|
|
5
5
|
exports.processList = processList;
|
|
6
6
|
exports.listeningPorts = listeningPorts;
|
|
7
|
+
exports.descendants = descendants;
|
|
8
|
+
exports.killDescendants = killDescendants;
|
|
7
9
|
exports.waitPID = waitPID;
|
|
8
10
|
exports.listFds = listFds;
|
|
9
11
|
exports.selfPGID = selfPGID;
|
|
@@ -24,6 +26,48 @@ const ffi_1 = require("./ffi");
|
|
|
24
26
|
// -----------------------------------------------------------------------------
|
|
25
27
|
// Process Inspection
|
|
26
28
|
// -----------------------------------------------------------------------------
|
|
29
|
+
function serializeProcessOptions(options) {
|
|
30
|
+
if (!options) {
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
const wire = {};
|
|
34
|
+
if (options.includeEnv === true) {
|
|
35
|
+
wire.include_env = true;
|
|
36
|
+
}
|
|
37
|
+
if (options.includeThreads === true) {
|
|
38
|
+
wire.include_threads = true;
|
|
39
|
+
}
|
|
40
|
+
if (!wire.include_env && !wire.include_threads) {
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
return JSON.stringify(wire);
|
|
44
|
+
}
|
|
45
|
+
function serializeDescendantsConfig(options) {
|
|
46
|
+
if (!options) {
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
const wire = {};
|
|
50
|
+
if (options.filter) {
|
|
51
|
+
Object.assign(wire, options.filter);
|
|
52
|
+
}
|
|
53
|
+
if (options.cpuMode !== undefined) {
|
|
54
|
+
if (options.cpuMode !== "lifetime" && options.cpuMode !== "monitor") {
|
|
55
|
+
throw new errors_1.SysprimsError(errors_1.SysprimsErrorCode.InvalidArgument, `invalid cpuMode: ${String(options.cpuMode)}`);
|
|
56
|
+
}
|
|
57
|
+
wire.cpu_mode = options.cpuMode;
|
|
58
|
+
}
|
|
59
|
+
if (options.sampleDurationMs !== undefined) {
|
|
60
|
+
const sample = options.sampleDurationMs;
|
|
61
|
+
if (!Number.isFinite(sample) || sample < 0) {
|
|
62
|
+
throw new errors_1.SysprimsError(errors_1.SysprimsErrorCode.InvalidArgument, "sampleDurationMs must be a finite number >= 0");
|
|
63
|
+
}
|
|
64
|
+
wire.sample_duration_ms = Math.trunc(sample);
|
|
65
|
+
}
|
|
66
|
+
if (Object.keys(wire).length === 0) {
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
return JSON.stringify(wire);
|
|
70
|
+
}
|
|
27
71
|
/**
|
|
28
72
|
* Get information about a specific process by PID.
|
|
29
73
|
*
|
|
@@ -32,9 +76,10 @@ const ffi_1 = require("./ffi");
|
|
|
32
76
|
* @throws {SysprimsError} NotFound if process does not exist
|
|
33
77
|
* @throws {SysprimsError} PermissionDenied if access is denied
|
|
34
78
|
*/
|
|
35
|
-
function procGet(pid) {
|
|
79
|
+
function procGet(pid, options) {
|
|
36
80
|
const lib = (0, ffi_1.loadSysprims)();
|
|
37
|
-
const
|
|
81
|
+
const optionsJson = serializeProcessOptions(options);
|
|
82
|
+
const result = (0, ffi_1.callJsonReturn)(() => lib.sysprimsProcGetEx(pid >>> 0, optionsJson));
|
|
38
83
|
return result;
|
|
39
84
|
}
|
|
40
85
|
/**
|
|
@@ -64,10 +109,11 @@ function procGet(pid) {
|
|
|
64
109
|
* // Filter by multiple criteria
|
|
65
110
|
* const heavy = processList({ cpu_above: 50, memory_above_kb: 100000 });
|
|
66
111
|
*/
|
|
67
|
-
function processList(filter) {
|
|
112
|
+
function processList(filter, options) {
|
|
68
113
|
const lib = (0, ffi_1.loadSysprims)();
|
|
69
114
|
const filterJson = filter ? JSON.stringify(filter) : "";
|
|
70
|
-
const
|
|
115
|
+
const optionsJson = serializeProcessOptions(options);
|
|
116
|
+
const result = (0, ffi_1.callJsonReturn)(() => lib.sysprimsProcListEx(filterJson, optionsJson));
|
|
71
117
|
return result;
|
|
72
118
|
}
|
|
73
119
|
/**
|
|
@@ -103,6 +149,74 @@ function listeningPorts(filter) {
|
|
|
103
149
|
return result;
|
|
104
150
|
}
|
|
105
151
|
// -----------------------------------------------------------------------------
|
|
152
|
+
// Descendants
|
|
153
|
+
// -----------------------------------------------------------------------------
|
|
154
|
+
const MAX_LEVELS_ALL = 0xffffffff; // u32::MAX
|
|
155
|
+
/**
|
|
156
|
+
* Get descendants of a process.
|
|
157
|
+
*
|
|
158
|
+
* Performs a BFS traversal of the process tree starting at `pid` and returns
|
|
159
|
+
* processes grouped by depth level.
|
|
160
|
+
*
|
|
161
|
+
* @param pid - Root process ID to traverse from
|
|
162
|
+
* @param options - Optional traversal configuration
|
|
163
|
+
* @returns Descendants grouped by level with metadata
|
|
164
|
+
* @throws {SysprimsError} NotFound if root process does not exist
|
|
165
|
+
* @throws {SysprimsError} InvalidArgument if pid is 0 or filter is invalid
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* // Get all descendants
|
|
169
|
+
* const result = descendants(1234);
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* // Get direct children only
|
|
173
|
+
* const result = descendants(1234, { maxLevels: 1 });
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* // Filter descendants by name
|
|
177
|
+
* const result = descendants(1234, { filter: { name_contains: "worker" } });
|
|
178
|
+
*/
|
|
179
|
+
function descendants(pid, options) {
|
|
180
|
+
const lib = (0, ffi_1.loadSysprims)();
|
|
181
|
+
const maxLevels = options?.maxLevels != null && Number.isFinite(options.maxLevels)
|
|
182
|
+
? options.maxLevels >>> 0
|
|
183
|
+
: MAX_LEVELS_ALL;
|
|
184
|
+
const configJson = serializeDescendantsConfig(options);
|
|
185
|
+
return (0, ffi_1.callJsonReturn)(() => lib.sysprimsProcDescendants(pid >>> 0, maxLevels, configJson));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Kill descendants of a process.
|
|
189
|
+
*
|
|
190
|
+
* Traverses the process tree from `pid`, collects descendant PIDs, and sends
|
|
191
|
+
* the specified signal. Safety rules are enforced: root PID, self, PID 1, and
|
|
192
|
+
* parent are automatically excluded from the kill list.
|
|
193
|
+
*
|
|
194
|
+
* @param pid - Root process ID (will NOT be killed)
|
|
195
|
+
* @param signal - Signal number to send (default: 15 = SIGTERM)
|
|
196
|
+
* @param options - Optional configuration
|
|
197
|
+
* @returns Result with succeeded/failed PIDs and safety skip count
|
|
198
|
+
* @throws {SysprimsError} NotFound if root process does not exist
|
|
199
|
+
* @throws {SysprimsError} InvalidArgument if pid is 0 or filter is invalid
|
|
200
|
+
*
|
|
201
|
+
* @example
|
|
202
|
+
* // Kill all descendants with SIGTERM
|
|
203
|
+
* const result = killDescendants(1234);
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* // Force kill descendants matching a filter
|
|
207
|
+
* const result = killDescendants(1234, 9, {
|
|
208
|
+
* filter: { cpu_above: 90 },
|
|
209
|
+
* });
|
|
210
|
+
*/
|
|
211
|
+
function killDescendants(pid, signal = 15, options) {
|
|
212
|
+
const lib = (0, ffi_1.loadSysprims)();
|
|
213
|
+
const maxLevels = options?.maxLevels != null && Number.isFinite(options.maxLevels)
|
|
214
|
+
? options.maxLevels >>> 0
|
|
215
|
+
: MAX_LEVELS_ALL;
|
|
216
|
+
const configJson = serializeDescendantsConfig(options);
|
|
217
|
+
return (0, ffi_1.callJsonReturn)(() => lib.sysprimsProcKillDescendants(pid >>> 0, maxLevels, signal | 0, configJson));
|
|
218
|
+
}
|
|
219
|
+
// -----------------------------------------------------------------------------
|
|
106
220
|
// Wait
|
|
107
221
|
// -----------------------------------------------------------------------------
|
|
108
222
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAiIA,0BAKC;AA6BD,kCAMC;AA4BD,wCAKC;AAgCD,kCAUC;AA0BD,0CAcC;AAaD,0BAIC;AAWD,0BAKC;AAYD,4BAGC;AAQD,0BAGC;AA2BD,gCAGC;AAcD,0CAGC;AAYD,8BAGC;AAYD,8BAGC;AAoCD,4BAeC;AAQD,sCAcC;AAQD,sCAcC;AAcD,sCAiBC;AAMD,oCASC;AAjjBD,qCAA4D;AAyBnD,8FAzBA,sBAAa,OAyBA;AAAE,kGAzBA,0BAAiB,OAyBA;AAxBzC,+BAA2E;AAqD3E,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF,SAAS,uBAAuB,CAAC,OAAwB;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAyD,EAAE,CAAC;IACtE,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,0BAA0B,CAAC,OAInC;IACC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAA4B,EAAE,CAAC;IAEzC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACpE,MAAM,IAAI,sBAAa,CACrB,0BAAiB,CAAC,eAAe,EACjC,oBAAoB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAC9C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,sBAAa,CACrB,0BAAiB,CAAC,eAAe,EACjC,+CAA+C,CAChD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,OAAwB;IAC3D,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;IACnF,OAAO,MAAqB,CAAC;AAC/B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,SAAgB,WAAW,CAAC,MAAsB,EAAE,OAAwB;IAC1E,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IACrF,OAAO,MAAyB,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,cAAc,CAAC,MAAmB;IAChD,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC,CAAC;IAChF,OAAO,MAA8B,CAAC;AACxC,CAAC;AAED,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,WAAW;AAE9C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,WAAW,CAAC,GAAW,EAAE,OAA4B;IACnE,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,SAAS,GACb,OAAO,EAAE,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QAC9D,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC;QACzB,CAAC,CAAC,cAAc,CAAC;IACrB,MAAM,UAAU,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,IAAA,oBAAc,EAAC,GAAG,EAAE,CACzB,GAAG,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CACzC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAgB,eAAe,CAC7B,GAAW,EACX,MAAM,GAAG,EAAE,EACX,OAAgC;IAEhC,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,SAAS,GACb,OAAO,EAAE,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;QAC9D,CAAC,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC;QACzB,CAAC,CAAC,cAAc,CAAC;IACrB,MAAM,UAAU,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,IAAA,oBAAc,EAAC,GAAG,EAAE,CACzB,GAAG,CAAC,2BAA2B,CAAC,GAAG,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,UAAU,CAAC,CACrD,CAAC;AAC7B,CAAC;AAED,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;;;;GAMG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,SAAiB;IACpD,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IACnF,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;GAIG;AACH,SAAgB,OAAO,CAAC,GAAW,EAAE,MAAiB;IACpD,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IACpF,OAAO,MAAoB,CAAC;AAC9B,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;GAKG;AACH,SAAgB,QAAQ;IACtB,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,OAAO,IAAA,gBAAU,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO;IACrB,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,OAAO,IAAA,gBAAU,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,UAAU,CAAC,GAAW,EAAE,MAAc;IACpD,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,IAAA,cAAQ,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,eAAe,CAAC,IAAY,EAAE,MAAc;IAC1D,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,IAAA,cAAQ,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,IAAA,cAAQ,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,IAAA,cAAQ,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,YAAY,GAAG,UAAU,CAAC;AAEhC,SAAS,eAAe,CAAC,IAAc;IACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,sBAAa,CAAC,0BAAiB,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;IACvF,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,sBAAa,CAAC,0BAAiB,CAAC,eAAe,EAAE,wBAAwB,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,MAAM,IAAI,sBAAa,CAAC,0BAAiB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,GAAG,GAAG,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,sBAAa,CACrB,0BAAiB,CAAC,eAAe,EACjC,OAAO,GAAG,+BAA+B,YAAY,EAAE,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,sBAAa,CAAC,0BAAiB,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,IAAc,EAAE,MAAc;IACrD,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,MAAM,GAAoB,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAA6B,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,IAAc;IAC1C,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAoB,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,CAAC;YACf,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAA6B,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,IAAc;IAC1C,eAAe,CAAC,IAAI,CAAC,CAAC;IAEtB,MAAM,MAAM,GAAoB,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,CAAC;YACf,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAA6B,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;;;;;GAOG;AACH,SAAgB,aAAa,CAAC,GAAW,EAAE,MAA4B;IACrE,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,CAAwB,CAAC;IAC/F,CAAC;IAED,MAAM,GAAG,GAAwB;QAC/B,SAAS,EACP,MAAM,CAAC,SAAS;YAChB,sFAAsF;QACxF,GAAG,MAAM;KACV,CAAC;IAEF,OAAO,IAAA,oBAAc,EAAC,GAAG,EAAE,CACzB,GAAG,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CACnC,CAAC;AAC3B,CAAC;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,SAAgB,YAAY,CAAC,MAA0B;IACrD,MAAM,GAAG,GAAG,IAAA,kBAAY,GAAE,CAAC;IAC3B,MAAM,GAAG,GAAuB;QAC9B,SAAS,EACP,MAAM,CAAC,SAAS;YAChB,sFAAsF;QACxF,GAAG,MAAM;KACV,CAAC;IACF,OAAO,IAAA,oBAAc,EAAC,GAAG,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAuB,CAAC;AACnG,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type JsonObject = Record<string, unknown>;
|
|
2
2
|
export type ProcessState = "running" | "sleeping" | "stopped" | "zombie" | "unknown";
|
|
3
|
+
export type CpuMode = "lifetime" | "monitor";
|
|
3
4
|
/**
|
|
4
5
|
* Information about a single process.
|
|
5
6
|
* Matches schema: process-info.schema.json#/definitions/process_info
|
|
@@ -16,6 +17,8 @@ export interface ProcessInfo {
|
|
|
16
17
|
exe_path?: string | null;
|
|
17
18
|
state: ProcessState;
|
|
18
19
|
cmdline: string[];
|
|
20
|
+
env?: Record<string, string> | null;
|
|
21
|
+
thread_count?: number | null;
|
|
19
22
|
}
|
|
20
23
|
/**
|
|
21
24
|
* Filter criteria for process listing.
|
|
@@ -26,9 +29,20 @@ export interface ProcessFilter {
|
|
|
26
29
|
name_equals?: string;
|
|
27
30
|
user_equals?: string;
|
|
28
31
|
pid_in?: number[];
|
|
32
|
+
ppid?: number;
|
|
29
33
|
state_in?: ProcessState[];
|
|
30
34
|
cpu_above?: number;
|
|
31
35
|
memory_above_kb?: number;
|
|
36
|
+
running_for_at_least_secs?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Optional process detail collection controls.
|
|
40
|
+
*
|
|
41
|
+
* Uses camelCase at the TypeScript API boundary; converted to snake_case for FFI.
|
|
42
|
+
*/
|
|
43
|
+
export interface ProcessOptions {
|
|
44
|
+
includeEnv?: boolean;
|
|
45
|
+
includeThreads?: boolean;
|
|
32
46
|
}
|
|
33
47
|
/**
|
|
34
48
|
* Snapshot of running processes.
|
|
@@ -146,4 +160,69 @@ export interface BatchKillResult {
|
|
|
146
160
|
succeeded: number[];
|
|
147
161
|
failed: BatchKillFailure[];
|
|
148
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* A single level in a descendants traversal result.
|
|
165
|
+
*/
|
|
166
|
+
export interface DescendantsLevel {
|
|
167
|
+
level: number;
|
|
168
|
+
processes: ProcessInfo[];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Result of a descendants traversal.
|
|
172
|
+
* Matches schema: descendants-result.schema.json
|
|
173
|
+
*/
|
|
174
|
+
export interface DescendantsResult {
|
|
175
|
+
schema_id: string;
|
|
176
|
+
root_pid: number;
|
|
177
|
+
max_levels: number;
|
|
178
|
+
levels: DescendantsLevel[];
|
|
179
|
+
total_found: number;
|
|
180
|
+
matched_by_filter: number;
|
|
181
|
+
timestamp: string;
|
|
182
|
+
platform: string;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Options for descendants traversal.
|
|
186
|
+
*/
|
|
187
|
+
export interface DescendantsOptions {
|
|
188
|
+
/** Maximum depth (1 = children only). Omit or use Infinity for all levels. */
|
|
189
|
+
maxLevels?: number;
|
|
190
|
+
/** Optional filter applied to descendant processes. */
|
|
191
|
+
filter?: ProcessFilter;
|
|
192
|
+
/** CPU measurement mode used for cpu_above evaluation. */
|
|
193
|
+
cpuMode?: CpuMode;
|
|
194
|
+
/** Sampling interval in milliseconds (used with monitor mode). */
|
|
195
|
+
sampleDurationMs?: number;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Options for kill-descendants operation.
|
|
199
|
+
*/
|
|
200
|
+
export interface KillDescendantsOptions {
|
|
201
|
+
/** Maximum depth. Omit or use Infinity for all levels. */
|
|
202
|
+
maxLevels?: number;
|
|
203
|
+
/** Optional filter applied to descendant processes. */
|
|
204
|
+
filter?: ProcessFilter;
|
|
205
|
+
/** CPU measurement mode used for cpu_above evaluation. */
|
|
206
|
+
cpuMode?: CpuMode;
|
|
207
|
+
/** Sampling interval in milliseconds (used with monitor mode). */
|
|
208
|
+
sampleDurationMs?: number;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* A single failure in a kill-descendants operation.
|
|
212
|
+
*/
|
|
213
|
+
export interface KillDescendantsFailure {
|
|
214
|
+
pid: number;
|
|
215
|
+
error: string;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Result of a kill-descendants operation.
|
|
219
|
+
*/
|
|
220
|
+
export interface KillDescendantsResult {
|
|
221
|
+
schema_id: string;
|
|
222
|
+
signal_sent: number;
|
|
223
|
+
root_pid: number;
|
|
224
|
+
succeeded: number[];
|
|
225
|
+
failed: KillDescendantsFailure[];
|
|
226
|
+
skipped_safety: number;
|
|
227
|
+
}
|
|
149
228
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAIjD,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/native/src/lib.rs
CHANGED
|
@@ -3,7 +3,10 @@ use std::time::Duration;
|
|
|
3
3
|
use napi_derive::napi;
|
|
4
4
|
use sysprims_core::schema::{SPAWN_IN_GROUP_CONFIG_V1, TERMINATE_TREE_CONFIG_V1};
|
|
5
5
|
use sysprims_core::SysprimsError;
|
|
6
|
-
use sysprims_proc::{
|
|
6
|
+
use sysprims_proc::{
|
|
7
|
+
descendants_with_config_and_options, CpuMode, DescendantsConfig, FdFilter, PortFilter,
|
|
8
|
+
ProcessFilter, ProcessOptions,
|
|
9
|
+
};
|
|
7
10
|
use sysprims_timeout::{spawn_in_group, terminate_tree, SpawnInGroupConfig, TerminateTreeConfig};
|
|
8
11
|
|
|
9
12
|
#[repr(i32)]
|
|
@@ -113,9 +116,104 @@ pub fn sysprims_abi_version() -> u32 {
|
|
|
113
116
|
// Process Inspection
|
|
114
117
|
// -----------------------------------------------------------------------------
|
|
115
118
|
|
|
119
|
+
#[derive(Debug, Default, serde::Deserialize)]
|
|
120
|
+
#[serde(default, deny_unknown_fields)]
|
|
121
|
+
struct ProcessOptionsWire {
|
|
122
|
+
include_env: bool,
|
|
123
|
+
include_threads: bool,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fn parse_process_options(options_json: &str) -> Result<ProcessOptions, SysprimsError> {
|
|
127
|
+
if options_json.is_empty() || options_json == "{}" {
|
|
128
|
+
return Ok(ProcessOptions::default());
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let wire: ProcessOptionsWire = serde_json::from_str(options_json)
|
|
132
|
+
.map_err(|e| SysprimsError::invalid_argument(format!("invalid options JSON: {}", e)))?;
|
|
133
|
+
|
|
134
|
+
Ok(ProcessOptions {
|
|
135
|
+
include_env: wire.include_env,
|
|
136
|
+
include_threads: wire.include_threads,
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
#[derive(Debug, Clone, Copy, Default, serde::Deserialize)]
|
|
141
|
+
#[serde(rename_all = "lowercase")]
|
|
142
|
+
enum CpuModeWire {
|
|
143
|
+
#[default]
|
|
144
|
+
Lifetime,
|
|
145
|
+
Monitor,
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
#[derive(Debug, Default, serde::Deserialize)]
|
|
149
|
+
#[serde(default, deny_unknown_fields)]
|
|
150
|
+
struct DescendantsConfigWire {
|
|
151
|
+
#[serde(flatten)]
|
|
152
|
+
filter: ProcessFilter,
|
|
153
|
+
cpu_mode: CpuModeWire,
|
|
154
|
+
sample_duration_ms: Option<u64>,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#[derive(Debug, Default)]
|
|
158
|
+
struct ParsedDescendantsConfig {
|
|
159
|
+
filter: Option<ProcessFilter>,
|
|
160
|
+
cpu_mode: CpuMode,
|
|
161
|
+
sample_duration: Option<Duration>,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
fn process_filter_has_criteria(filter: &ProcessFilter) -> bool {
|
|
165
|
+
filter.name_contains.is_some()
|
|
166
|
+
|| filter.name_equals.is_some()
|
|
167
|
+
|| filter.user_equals.is_some()
|
|
168
|
+
|| filter.pid_in.is_some()
|
|
169
|
+
|| filter.ppid.is_some()
|
|
170
|
+
|| filter.state_in.is_some()
|
|
171
|
+
|| filter.cpu_above.is_some()
|
|
172
|
+
|| filter.memory_above_kb.is_some()
|
|
173
|
+
|| filter.running_for_at_least_secs.is_some()
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
fn wire_cpu_mode_to_proc(mode: CpuModeWire) -> CpuMode {
|
|
177
|
+
match mode {
|
|
178
|
+
CpuModeWire::Lifetime => CpuMode::Lifetime,
|
|
179
|
+
CpuModeWire::Monitor => CpuMode::Monitor,
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
fn parse_descendants_config(config_json: &str) -> Result<ParsedDescendantsConfig, SysprimsError> {
|
|
184
|
+
if config_json.is_empty() || config_json == "{}" {
|
|
185
|
+
return Ok(ParsedDescendantsConfig::default());
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
let wire: DescendantsConfigWire = serde_json::from_str(config_json)
|
|
189
|
+
.map_err(|e| SysprimsError::invalid_argument(format!("invalid config JSON: {}", e)))?;
|
|
190
|
+
|
|
191
|
+
let filter = if process_filter_has_criteria(&wire.filter) {
|
|
192
|
+
Some(wire.filter)
|
|
193
|
+
} else {
|
|
194
|
+
None
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
Ok(ParsedDescendantsConfig {
|
|
198
|
+
filter,
|
|
199
|
+
cpu_mode: wire_cpu_mode_to_proc(wire.cpu_mode),
|
|
200
|
+
sample_duration: wire.sample_duration_ms.map(Duration::from_millis),
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
|
|
116
204
|
#[napi]
|
|
117
205
|
pub fn sysprims_proc_get(pid: u32) -> SysprimsCallJsonResult {
|
|
118
|
-
|
|
206
|
+
sysprims_proc_get_ex(pid, String::new())
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
#[napi]
|
|
210
|
+
pub fn sysprims_proc_get_ex(pid: u32, options_json: String) -> SysprimsCallJsonResult {
|
|
211
|
+
let options = match parse_process_options(&options_json) {
|
|
212
|
+
Ok(o) => o,
|
|
213
|
+
Err(e) => return err_json(e),
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
match sysprims_proc::get_process_with_options(pid, options) {
|
|
119
217
|
Ok(info) => match serde_json::to_string(&info) {
|
|
120
218
|
Ok(json) => ok_json(json),
|
|
121
219
|
Err(e) => err_json(SysprimsError::internal(format!(
|
|
@@ -129,6 +227,11 @@ pub fn sysprims_proc_get(pid: u32) -> SysprimsCallJsonResult {
|
|
|
129
227
|
|
|
130
228
|
#[napi]
|
|
131
229
|
pub fn sysprims_proc_list(filter_json: String) -> SysprimsCallJsonResult {
|
|
230
|
+
sysprims_proc_list_ex(filter_json, String::new())
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
#[napi]
|
|
234
|
+
pub fn sysprims_proc_list_ex(filter_json: String, options_json: String) -> SysprimsCallJsonResult {
|
|
132
235
|
let filter = if filter_json.is_empty() || filter_json == "{}" {
|
|
133
236
|
ProcessFilter::default()
|
|
134
237
|
} else {
|
|
@@ -147,7 +250,12 @@ pub fn sysprims_proc_list(filter_json: String) -> SysprimsCallJsonResult {
|
|
|
147
250
|
return err_json(e);
|
|
148
251
|
}
|
|
149
252
|
|
|
150
|
-
match
|
|
253
|
+
let options = match parse_process_options(&options_json) {
|
|
254
|
+
Ok(o) => o,
|
|
255
|
+
Err(e) => return err_json(e),
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
match sysprims_proc::snapshot_filtered_with_options(&filter, options) {
|
|
151
259
|
Ok(snapshot) => match serde_json::to_string(&snapshot) {
|
|
152
260
|
Ok(json) => ok_json(json),
|
|
153
261
|
Err(e) => err_json(SysprimsError::internal(format!(
|
|
@@ -237,6 +345,144 @@ pub fn sysprims_proc_wait_pid(pid: u32, timeout_ms: u32) -> SysprimsCallJsonResu
|
|
|
237
345
|
}
|
|
238
346
|
}
|
|
239
347
|
|
|
348
|
+
// -----------------------------------------------------------------------------
|
|
349
|
+
// Descendants
|
|
350
|
+
// -----------------------------------------------------------------------------
|
|
351
|
+
|
|
352
|
+
#[napi]
|
|
353
|
+
pub fn sysprims_proc_descendants(
|
|
354
|
+
root_pid: u32,
|
|
355
|
+
max_levels: u32,
|
|
356
|
+
config_json: String,
|
|
357
|
+
) -> SysprimsCallJsonResult {
|
|
358
|
+
let parsed = match parse_descendants_config(&config_json) {
|
|
359
|
+
Ok(c) => c,
|
|
360
|
+
Err(e) => return err_json(e),
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
let config = DescendantsConfig {
|
|
364
|
+
root_pid,
|
|
365
|
+
max_levels: Some(max_levels),
|
|
366
|
+
filter: parsed.filter,
|
|
367
|
+
cpu_mode: parsed.cpu_mode,
|
|
368
|
+
sample_duration: parsed.sample_duration,
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
match descendants_with_config_and_options(config, ProcessOptions::default()) {
|
|
372
|
+
Ok(result) => match serde_json::to_string(&result) {
|
|
373
|
+
Ok(json) => ok_json(json),
|
|
374
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
375
|
+
"failed to serialize descendants result: {}",
|
|
376
|
+
e
|
|
377
|
+
))),
|
|
378
|
+
},
|
|
379
|
+
Err(e) => err_json(e),
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
#[napi]
|
|
384
|
+
pub fn sysprims_proc_kill_descendants(
|
|
385
|
+
root_pid: u32,
|
|
386
|
+
max_levels: u32,
|
|
387
|
+
signal: i32,
|
|
388
|
+
config_json: String,
|
|
389
|
+
) -> SysprimsCallJsonResult {
|
|
390
|
+
let parsed = match parse_descendants_config(&config_json) {
|
|
391
|
+
Ok(c) => c,
|
|
392
|
+
Err(e) => return err_json(e),
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
let config = DescendantsConfig {
|
|
396
|
+
root_pid,
|
|
397
|
+
max_levels: Some(max_levels),
|
|
398
|
+
filter: parsed.filter,
|
|
399
|
+
cpu_mode: parsed.cpu_mode,
|
|
400
|
+
sample_duration: parsed.sample_duration,
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
// Traverse descendants before sending any signal.
|
|
404
|
+
let desc_result = match descendants_with_config_and_options(config, ProcessOptions::default()) {
|
|
405
|
+
Ok(r) => r,
|
|
406
|
+
Err(e) => return err_json(e),
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// Collect all descendant PIDs
|
|
410
|
+
let mut target_pids: Vec<u32> = desc_result
|
|
411
|
+
.levels
|
|
412
|
+
.iter()
|
|
413
|
+
.flat_map(|l| l.processes.iter().map(|p| p.pid))
|
|
414
|
+
.collect();
|
|
415
|
+
target_pids.sort_unstable();
|
|
416
|
+
target_pids.dedup();
|
|
417
|
+
|
|
418
|
+
// Safety: exclude root PID (descendants-only)
|
|
419
|
+
target_pids.retain(|&pid| pid != root_pid);
|
|
420
|
+
|
|
421
|
+
// Safety: exclude self, PID 1, parent
|
|
422
|
+
let self_pid = std::process::id();
|
|
423
|
+
let parent_pid = sysprims_proc::get_process(self_pid).ok().map(|p| p.ppid);
|
|
424
|
+
|
|
425
|
+
let before = target_pids.len();
|
|
426
|
+
target_pids.retain(|&pid| pid != self_pid && pid != 1);
|
|
427
|
+
if let Some(ppid) = parent_pid {
|
|
428
|
+
target_pids.retain(|&pid| pid != ppid);
|
|
429
|
+
}
|
|
430
|
+
let skipped_safety = before.saturating_sub(target_pids.len());
|
|
431
|
+
|
|
432
|
+
// Build result
|
|
433
|
+
let (succeeded, failed) = if target_pids.is_empty() {
|
|
434
|
+
(Vec::new(), Vec::<KillDescendantsFailureWire>::new())
|
|
435
|
+
} else {
|
|
436
|
+
match sysprims_signal::kill_many(&target_pids, signal) {
|
|
437
|
+
Ok(batch) => {
|
|
438
|
+
let failed_entries: Vec<KillDescendantsFailureWire> = batch
|
|
439
|
+
.failed
|
|
440
|
+
.iter()
|
|
441
|
+
.map(|f| KillDescendantsFailureWire {
|
|
442
|
+
pid: f.pid,
|
|
443
|
+
error: f.error.to_string(),
|
|
444
|
+
})
|
|
445
|
+
.collect();
|
|
446
|
+
(batch.succeeded, failed_entries)
|
|
447
|
+
}
|
|
448
|
+
Err(e) => return err_json(e),
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
let result = KillDescendantsResultWire {
|
|
453
|
+
schema_id: sysprims_core::schema::BATCH_KILL_RESULT_V1.to_string(),
|
|
454
|
+
signal_sent: signal,
|
|
455
|
+
root_pid,
|
|
456
|
+
succeeded,
|
|
457
|
+
failed,
|
|
458
|
+
skipped_safety,
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
match serde_json::to_string(&result) {
|
|
462
|
+
Ok(json) => ok_json(json),
|
|
463
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
464
|
+
"failed to serialize kill-descendants result: {}",
|
|
465
|
+
e
|
|
466
|
+
))),
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
#[derive(serde::Serialize)]
|
|
471
|
+
struct KillDescendantsFailureWire {
|
|
472
|
+
pid: u32,
|
|
473
|
+
error: String,
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
#[derive(serde::Serialize)]
|
|
477
|
+
struct KillDescendantsResultWire {
|
|
478
|
+
schema_id: String,
|
|
479
|
+
signal_sent: i32,
|
|
480
|
+
root_pid: u32,
|
|
481
|
+
succeeded: Vec<u32>,
|
|
482
|
+
failed: Vec<KillDescendantsFailureWire>,
|
|
483
|
+
skipped_safety: usize,
|
|
484
|
+
}
|
|
485
|
+
|
|
240
486
|
// -----------------------------------------------------------------------------
|
|
241
487
|
// Self Introspection
|
|
242
488
|
// -----------------------------------------------------------------------------
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@3leaps/sysprims",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "GPL-free cross-platform process utilities (TypeScript bindings via Node-API native addon)",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -45,13 +45,13 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {},
|
|
47
47
|
"optionalDependencies": {
|
|
48
|
-
"@3leaps/sysprims-linux-x64-gnu": "0.1.
|
|
49
|
-
"@3leaps/sysprims-linux-x64-musl": "0.1.
|
|
50
|
-
"@3leaps/sysprims-linux-arm64-gnu": "0.1.
|
|
51
|
-
"@3leaps/sysprims-linux-arm64-musl": "0.1.
|
|
52
|
-
"@3leaps/sysprims-darwin-arm64": "0.1.
|
|
53
|
-
"@3leaps/sysprims-win32-x64-msvc": "0.1.
|
|
54
|
-
"@3leaps/sysprims-win32-arm64-msvc": "0.1.
|
|
48
|
+
"@3leaps/sysprims-linux-x64-gnu": "0.1.14",
|
|
49
|
+
"@3leaps/sysprims-linux-x64-musl": "0.1.14",
|
|
50
|
+
"@3leaps/sysprims-linux-arm64-gnu": "0.1.14",
|
|
51
|
+
"@3leaps/sysprims-linux-arm64-musl": "0.1.14",
|
|
52
|
+
"@3leaps/sysprims-darwin-arm64": "0.1.14",
|
|
53
|
+
"@3leaps/sysprims-win32-x64-msvc": "0.1.14",
|
|
54
|
+
"@3leaps/sysprims-win32-arm64-msvc": "0.1.14"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@napi-rs/cli": "^2.18.4",
|