@openge/forge-process-control-node 0.2.0 → 0.3.0

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.
Files changed (42) hide show
  1. package/README.md +16 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/owned-process-scope.d.ts +4 -0
  7. package/dist/owned-process-scope.d.ts.map +1 -0
  8. package/dist/owned-process-scope.js +10 -0
  9. package/dist/owned-process-scope.js.map +1 -0
  10. package/dist/owned-scope/backend.d.ts +9 -0
  11. package/dist/owned-scope/backend.d.ts.map +1 -0
  12. package/dist/owned-scope/backend.js +2 -0
  13. package/dist/owned-scope/backend.js.map +1 -0
  14. package/dist/owned-scope/linux-native.d.ts +18 -0
  15. package/dist/owned-scope/linux-native.d.ts.map +1 -0
  16. package/dist/owned-scope/linux-native.js +45 -0
  17. package/dist/owned-scope/linux-native.js.map +1 -0
  18. package/dist/owned-scope/linux-subreaper.d.ts +16 -0
  19. package/dist/owned-scope/linux-subreaper.d.ts.map +1 -0
  20. package/dist/owned-scope/linux-subreaper.js +147 -0
  21. package/dist/owned-scope/linux-subreaper.js.map +1 -0
  22. package/dist/owned-scope/native-loader.d.ts +87 -0
  23. package/dist/owned-scope/native-loader.d.ts.map +1 -0
  24. package/dist/owned-scope/native-loader.js +17 -0
  25. package/dist/owned-scope/native-loader.js.map +1 -0
  26. package/dist/owned-scope/protocol.d.ts +20 -0
  27. package/dist/owned-scope/protocol.d.ts.map +1 -0
  28. package/dist/owned-scope/protocol.js +32 -0
  29. package/dist/owned-scope/protocol.js.map +1 -0
  30. package/dist/owned-scope/scope-host.d.ts +2 -0
  31. package/dist/owned-scope/scope-host.d.ts.map +1 -0
  32. package/dist/owned-scope/scope-host.js +91 -0
  33. package/dist/owned-scope/scope-host.js.map +1 -0
  34. package/dist/owned-scope/supervisor.d.ts +11 -0
  35. package/dist/owned-scope/supervisor.d.ts.map +1 -0
  36. package/dist/owned-scope/supervisor.js +265 -0
  37. package/dist/owned-scope/supervisor.js.map +1 -0
  38. package/dist/owned-scope/windows-job.d.ts +4 -0
  39. package/dist/owned-scope/windows-job.d.ts.map +1 -0
  40. package/dist/owned-scope/windows-job.js +142 -0
  41. package/dist/owned-scope/windows-job.js.map +1 -0
  42. package/package.json +3 -2
package/README.md CHANGED
@@ -10,6 +10,22 @@ without loading PowerShell cmdlet modules and preserves the existing CIM JSON-da
10
10
  start-token format. Posix retains `ps`. Permission failures are rejected without
11
11
  retries or fallback sources; full Windows process queries retain their existing backend.
12
12
 
13
+ Explicit `createWindowsOwnedProcessScopeProvider()` and
14
+ `createLinuxOwnedProcessScopeProvider()` implement owned command scopes on
15
+ Windows x64 (Job Objects) and Linux/glibc x64 (subreaper, wait/reap and pidfds).
16
+ Other hosts, missing native capabilities or unsupported Job assignment fail
17
+ before the job starts. Owned scopes currently require force termination.
18
+ Windows verifies completed member handles and complete Job membership before
19
+ synchronizing delayed exit accounting; a live descendant is rejected immediately.
20
+ Koffi is pinned to 3.3.3 and loaded lazily from installed prebuilds; runtime code
21
+ never downloads or compiles a fallback. With pnpm, set `allowBuilds.koffi: false`
22
+ when installing to prevent Koffi's optional install-time compilation fallback.
23
+
24
+ These scopes manage trusted foreground commands, not a security sandbox.
25
+ Commands must not delegate execution to WMI, system services or another external
26
+ process owner. Normal closure differs from successful forced cleanup: cleanup
27
+ can prove emptiness while completion remains unknown.
28
+
13
29
  Complete usage, backend selection, examples, termination semantics, and provider boundaries are maintained in the [中文使用文档](https://github.com/zopenge/foundation-forge/blob/main/docs/packages/process-execution/process-control-node.md).
14
30
 
15
31
  For repository-wide capability discovery, see the [Foundation Forge documentation](https://github.com/zopenge/foundation-forge/blob/main/docs/README.md).
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { type PosixProcessControlOptions, type ProcessCommandRequest, type ProcessCommandResult, type ProcessCommandRunner, type ProcessIdentityReaderOptions, type WindowsProcessControlOptions, } from './contracts.js';
2
2
  export { createPosixProcessControl, createPosixProcessIdentityReader, createWindowsProcessControl, createWindowsProcessIdentityReader, } from './provider.js';
3
+ export { createWindowsOwnedProcessScopeProvider, createLinuxOwnedProcessScopeProvider } from './owned-process-scope.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,sCAAsC,EAAE,oCAAoC,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export {} from './contracts.js';
2
2
  export { createPosixProcessControl, createPosixProcessIdentityReader, createWindowsProcessControl, createWindowsProcessIdentityReader, } from './provider.js';
3
+ export { createWindowsOwnedProcessScopeProvider, createLinuxOwnedProcessScopeProvider } from './owned-process-scope.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,sCAAsC,EAAE,oCAAoC,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { OwnedProcessScopeProvider } from '@openge/forge-process-control';
2
+ export declare function createWindowsOwnedProcessScopeProvider(): OwnedProcessScopeProvider;
3
+ export declare function createLinuxOwnedProcessScopeProvider(): OwnedProcessScopeProvider;
4
+ //# sourceMappingURL=owned-process-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-process-scope.d.ts","sourceRoot":"","sources":["../src/owned-process-scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAK/E,wBAAgB,sCAAsC,IAAI,yBAAyB,CAElF;AACD,wBAAgB,oCAAoC,IAAI,yBAAyB,CAEhF"}
@@ -0,0 +1,10 @@
1
+ import { startSupervisor } from './owned-scope/supervisor.js';
2
+ import { createWindowsJob } from './owned-scope/windows-job.js';
3
+ import { createLinuxSubreaper } from './owned-scope/linux-subreaper.js';
4
+ export function createWindowsOwnedProcessScopeProvider() {
5
+ return { start: (request, output) => startSupervisor(request, 'win32', createWindowsJob, output) };
6
+ }
7
+ export function createLinuxOwnedProcessScopeProvider() {
8
+ return { start: (request, output) => startSupervisor(request, 'linux', createLinuxSubreaper, output) };
9
+ }
10
+ //# sourceMappingURL=owned-process-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-process-scope.js","sourceRoot":"","sources":["../src/owned-process-scope.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,UAAU,sCAAsC;IACpD,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC;AACrG,CAAC;AACD,MAAM,UAAU,oCAAoC;IAClD,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,CAAC;AACzG,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ProcessIdentity } from '@openge/forge-process-control';
2
+ export interface ScopeBackend {
3
+ attach(pid: number): Promise<void>;
4
+ bind(identity: ProcessIdentity): Promise<void>;
5
+ empty(rootExited: boolean): Promise<boolean>;
6
+ force(): Promise<void>;
7
+ dispose(): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/owned-scope/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/owned-scope/backend.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ /** 只调用 glibc 已导出的接口,不猜测 syscall 编号,也不在维护者进程设置 subreaper。 */
2
+ export declare function loadLinuxScopeNative(): Promise<{
3
+ establish(): void;
4
+ reap(): {
5
+ pid: number;
6
+ errno: number;
7
+ };
8
+ open(pid: number): {
9
+ fd: number;
10
+ errno: number;
11
+ };
12
+ signal(fd: number, value: number): {
13
+ ok: boolean;
14
+ errno: number;
15
+ };
16
+ close(fd: number): void;
17
+ }>;
18
+ //# sourceMappingURL=linux-native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-native.d.ts","sourceRoot":"","sources":["../../src/owned-scope/linux-native.ts"],"names":[],"mappings":"AAGA,4DAA4D;AAC5D,wBAAsB,oBAAoB;;YAsB5B;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cAC5B,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;eACrC,MAAM,SAAS,MAAM,GAAG;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;cACvD,MAAM;GAKrB"}
@@ -0,0 +1,45 @@
1
+ import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
2
+ import { loadOwnedNative } from './native-loader.js';
3
+ /** 只调用 glibc 已导出的接口,不猜测 syscall 编号,也不在维护者进程设置 subreaper。 */
4
+ export async function loadLinuxScopeNative() {
5
+ try {
6
+ const k = await loadOwnedNative('linux'), lib = k.load('libc.so.6');
7
+ const set = lib.func('int prctl(int option, uintptr_t value, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5)');
8
+ const get = lib.func('prctl', 'int', ['int', k.out(k.pointer('int')), 'uintptr_t', 'uintptr_t', 'uintptr_t']);
9
+ const wait = lib.func('waitpid', 'int', ['int', k.out(k.pointer('int')), 'int']);
10
+ const open = lib.func('int pidfd_open(int pid, unsigned int flags)');
11
+ const signal = lib.func('int pidfd_send_signal(int fd, int signal, void *info, unsigned int flags)');
12
+ const close = lib.func('int close(int fd)');
13
+ const state = [0];
14
+ if (get(37, state, 0, 0, 0) !== 0)
15
+ throw Error('SUBREAPER_PROBE');
16
+ const own = Number(open(process.pid, 0));
17
+ if (own < 0)
18
+ throw Error('PIDFD_PROBE');
19
+ let signaled = false, closed = false;
20
+ try {
21
+ signaled = signal(own, 0, null, 0) === 0;
22
+ }
23
+ finally {
24
+ closed = close(own) === 0;
25
+ }
26
+ if (!signaled || !closed)
27
+ throw Error('PIDFD_SIGNAL_PROBE');
28
+ return {
29
+ establish() {
30
+ const value = [0];
31
+ if (set(36, 1, 0, 0, 0) !== 0 || get(37, value, 0, 0, 0) !== 0 || value[0] !== 1)
32
+ throw Error('SUBREAPER_SETUP');
33
+ },
34
+ reap() { const status = [0], pid = Number(wait(-1, status, 1)); return { pid, errno: pid < 0 ? k.errno() : 0 }; },
35
+ open(pid) { const fd = Number(open(pid, 0)); return { fd, errno: fd < 0 ? k.errno() : 0 }; },
36
+ signal(fd, value) { const ok = signal(fd, value, null, 0) === 0; return { ok, errno: ok ? 0 : k.errno() }; },
37
+ close(fd) { if (close(fd) !== 0)
38
+ throw Error('PIDFD_CLOSE'); },
39
+ };
40
+ }
41
+ catch {
42
+ throw new ProcessControlError(processControlErrorCodes.scopeUnsupported, { reason: 'LINUX_GLIBC_SCOPE' });
43
+ }
44
+ }
45
+ //# sourceMappingURL=linux-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-native.js","sourceRoot":"","sources":["../../src/owned-scope/linux-native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ReadProcessIdentityRequest } from '@openge/forge-process-control';
2
+ import type { ScopeBackend } from './backend.js';
3
+ import { loadLinuxScopeNative } from './linux-native.js';
4
+ import type { SupervisorPort } from './supervisor.js';
5
+ declare function startTicks(pid: number): Promise<string>;
6
+ export declare function createLinuxSubreaper(port: SupervisorPort, io?: {
7
+ load: typeof loadLinuxScopeNative;
8
+ ticks: typeof startTicks;
9
+ readIdentity: (request: ReadProcessIdentityRequest) => Promise<import("@openge/forge-process-control").ReadProcessIdentityResult>;
10
+ }): Promise<ScopeBackend>;
11
+ export declare function createLinuxReaper(directClosed: () => boolean, timeoutMs: number): Promise<{
12
+ empty: () => boolean;
13
+ stop(): Promise<boolean>;
14
+ }>;
15
+ export {};
16
+ //# sourceMappingURL=linux-subreaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-subreaper.d.ts","sourceRoot":"","sources":["../../src/owned-scope/linux-subreaper.ts"],"names":[],"mappings":"AACA,OAAO,EAAuE,KAAK,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAErJ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,iBAAe,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKtD;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE;;;4BADwB,0BAA0B;CACtC,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CtG;AAED,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,OAAO,EAAE,SAAS,EAAE,MAAM;;YAepE,OAAO,CAAC,OAAO,CAAC;GAyBjC"}
@@ -0,0 +1,147 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
3
+ import { createPosixProcessIdentityReader } from '../provider.js';
4
+ import { loadLinuxScopeNative } from './linux-native.js';
5
+ async function startTicks(pid) {
6
+ const text = await readFile(`/proc/${String(pid)}/stat`, 'utf8');
7
+ const value = text.slice(text.lastIndexOf(')') + 2).split(' ')[19];
8
+ if (text.length > 65_536 || value === undefined || !/^\d+$/u.test(value))
9
+ throw Error('ROOT_STAT');
10
+ return value;
11
+ }
12
+ const defaultIo = { load: loadLinuxScopeNative, ticks: startTicks, readIdentity: (request) => createPosixProcessIdentityReader().readIdentity(request) };
13
+ export async function createLinuxSubreaper(port, io = defaultIo) {
14
+ const native = await io.load();
15
+ let fd, actual, provenEmpty = false, rootExited = false;
16
+ return {
17
+ attach: async (pid) => {
18
+ if (fd !== undefined)
19
+ throw Error('ATTACH_STATE');
20
+ // spawn 返回后先同步固定实例;未验证的 fd 只可关闭,不能接收终止信号。
21
+ const handle = native.open(pid);
22
+ if (handle.fd < 0)
23
+ throw Error('ROOT_PIDFD');
24
+ try {
25
+ port.assertRootInstance(pid);
26
+ const before = await io.ticks(pid), observed = await io.readIdentity({ pid, signal: port.startupSignal });
27
+ if (observed.status !== 'FOUND' || before !== await io.ticks(pid) || !native.signal(handle.fd, 0).ok)
28
+ throw Error('ROOT_INSTANCE');
29
+ port.assertRootInstance(pid);
30
+ actual = observed.identity;
31
+ fd = handle.fd;
32
+ }
33
+ catch (error) {
34
+ native.close(handle.fd);
35
+ throw error;
36
+ }
37
+ },
38
+ bind: async (identity) => {
39
+ if (!actual || fd === undefined || identity.pid !== actual.pid || identity.startToken !== actual.startToken || !native.signal(fd, 0).ok) {
40
+ throw new ProcessControlError(processControlErrorCodes.scopeBinding, { reason: 'ROOT_IDENTITY' });
41
+ }
42
+ },
43
+ empty: async (exited) => {
44
+ if (exited) {
45
+ rootExited = true;
46
+ return provenEmpty;
47
+ }
48
+ const result = await port.rpc('inspect');
49
+ provenEmpty = result.empty === true;
50
+ return provenEmpty;
51
+ },
52
+ force: async () => {
53
+ if (rootExited)
54
+ return;
55
+ try {
56
+ const result = await port.rpc('stop');
57
+ provenEmpty = result.empty === true;
58
+ if (!provenEmpty)
59
+ throw Error('CHILDREN_UNKNOWN');
60
+ await port.rpc('finish');
61
+ }
62
+ catch (error) {
63
+ // IPC 失效时请求自有 helper 收尾;不能用宿主进程差集代替后代归属。
64
+ if (fd !== undefined)
65
+ native.signal(fd, 15);
66
+ throw error;
67
+ }
68
+ },
69
+ dispose: async () => {
70
+ if (fd !== undefined) {
71
+ try {
72
+ if (!rootExited)
73
+ native.signal(fd, 9);
74
+ }
75
+ finally {
76
+ native.close(fd);
77
+ fd = undefined;
78
+ }
79
+ }
80
+ },
81
+ };
82
+ }
83
+ export async function createLinuxReaper(directClosed, timeoutMs) {
84
+ const native = await loadLinuxScopeNative();
85
+ native.establish();
86
+ const empty = () => {
87
+ if (!directClosed())
88
+ return false;
89
+ for (let attempts = 0; attempts < 4096; attempts++) {
90
+ const result = native.reap();
91
+ if (result.pid > 0 || (result.pid < 0 && result.errno === 4))
92
+ continue;
93
+ if (result.pid === 0)
94
+ return false;
95
+ if (result.errno === 10)
96
+ return true;
97
+ throw Error('WAIT_UNKNOWN');
98
+ }
99
+ throw Error('REAP_LIMIT');
100
+ };
101
+ return {
102
+ empty,
103
+ async stop() {
104
+ const deadline = Date.now() + timeoutMs;
105
+ do {
106
+ if (empty())
107
+ return true;
108
+ const text = await readFile(`/proc/self/task/${String(process.pid)}/children`, 'utf8');
109
+ if (text.length > 65_536)
110
+ throw Error('CHILDREN_LIMIT');
111
+ const children = text.trim() ? text.trim().split(/\s+/u) : [];
112
+ if (children.length > 4096 || children.some(value => !/^[1-9]\d*$/u.test(value)))
113
+ throw Error('CHILDREN_INVALID');
114
+ for (const value of children) {
115
+ const pid = Number(value), opened = native.open(pid);
116
+ if (opened.fd < 0) {
117
+ if (opened.errno === 3)
118
+ continue;
119
+ throw Error('CHILD_PIDFD');
120
+ }
121
+ try {
122
+ let status;
123
+ try {
124
+ status = await readFile(`/proc/${value}/status`, 'utf8');
125
+ }
126
+ catch (error) {
127
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
128
+ continue;
129
+ throw error;
130
+ }
131
+ if (status.length > 65_536 || /^PPid:\s+(\d+)$/mu.exec(status)?.[1] !== String(process.pid))
132
+ continue;
133
+ const sent = native.signal(opened.fd, 9);
134
+ if (!sent.ok && sent.errno !== 3)
135
+ throw Error('CHILD_SIGNAL');
136
+ }
137
+ finally {
138
+ native.close(opened.fd);
139
+ }
140
+ }
141
+ await new Promise(accept => setTimeout(accept, 10));
142
+ } while (Date.now() < deadline);
143
+ return empty();
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=linux-subreaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux-subreaper.js","sourceRoot":"","sources":["../../src/owned-scope/linux-subreaper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /** 只有显式启用 scope 才加载原生依赖;缺失预编译制品不触发构建或降级。 */
2
+ export declare function loadOwnedNative(platform: 'win32' | 'linux', importer?: () => Promise<{
3
+ LibraryHandle: import("koffi").LibraryHandle;
4
+ TypeObject: import("koffi").TypeObject;
5
+ Union: import("koffi").Union;
6
+ address: typeof import("koffi").address;
7
+ alias: typeof import("koffi").alias;
8
+ alignof: typeof import("koffi").alignof;
9
+ alloc: typeof import("koffi").alloc;
10
+ array: typeof import("koffi").array;
11
+ as: typeof import("koffi").as;
12
+ call: typeof import("koffi").call;
13
+ config: typeof import("koffi").config;
14
+ decode: typeof import("koffi").decode;
15
+ disposable: typeof import("koffi").disposable;
16
+ encode: typeof import("koffi").encode;
17
+ enumeration: typeof import("koffi").enumeration;
18
+ errno: typeof import("koffi").errno;
19
+ extension: typeof import("koffi").extension;
20
+ free: typeof import("koffi").free;
21
+ inout: typeof import("koffi").inout;
22
+ introspect: typeof import("koffi").introspect;
23
+ load: typeof import("koffi").load;
24
+ node: typeof import("koffi").node;
25
+ offsetof: typeof import("koffi").offsetof;
26
+ opaque: typeof import("koffi").opaque;
27
+ os: typeof import("koffi").os;
28
+ out: typeof import("koffi").out;
29
+ pack: typeof import("koffi").pack;
30
+ pointer: typeof import("koffi").pointer;
31
+ proto: typeof import("koffi").proto;
32
+ register: typeof import("koffi").register;
33
+ reset: typeof import("koffi").reset;
34
+ resolve: typeof import("koffi").resolve;
35
+ sizeof: typeof import("koffi").sizeof;
36
+ stats: typeof import("koffi").stats;
37
+ struct: typeof import("koffi").struct;
38
+ type: typeof import("koffi").type;
39
+ types: typeof import("koffi").types;
40
+ union: typeof import("koffi").union;
41
+ unregister: typeof import("koffi").unregister;
42
+ version: typeof import("koffi").version;
43
+ view: typeof import("koffi").view;
44
+ }>): Promise<{
45
+ LibraryHandle: import("koffi").LibraryHandle;
46
+ TypeObject: import("koffi").TypeObject;
47
+ Union: import("koffi").Union;
48
+ address: typeof import("koffi").address;
49
+ alias: typeof import("koffi").alias;
50
+ alignof: typeof import("koffi").alignof;
51
+ alloc: typeof import("koffi").alloc;
52
+ array: typeof import("koffi").array;
53
+ as: typeof import("koffi").as;
54
+ call: typeof import("koffi").call;
55
+ config: typeof import("koffi").config;
56
+ decode: typeof import("koffi").decode;
57
+ disposable: typeof import("koffi").disposable;
58
+ encode: typeof import("koffi").encode;
59
+ enumeration: typeof import("koffi").enumeration;
60
+ errno: typeof import("koffi").errno;
61
+ extension: typeof import("koffi").extension;
62
+ free: typeof import("koffi").free;
63
+ inout: typeof import("koffi").inout;
64
+ introspect: typeof import("koffi").introspect;
65
+ load: typeof import("koffi").load;
66
+ node: typeof import("koffi").node;
67
+ offsetof: typeof import("koffi").offsetof;
68
+ opaque: typeof import("koffi").opaque;
69
+ os: typeof import("koffi").os;
70
+ out: typeof import("koffi").out;
71
+ pack: typeof import("koffi").pack;
72
+ pointer: typeof import("koffi").pointer;
73
+ proto: typeof import("koffi").proto;
74
+ register: typeof import("koffi").register;
75
+ reset: typeof import("koffi").reset;
76
+ resolve: typeof import("koffi").resolve;
77
+ sizeof: typeof import("koffi").sizeof;
78
+ stats: typeof import("koffi").stats;
79
+ struct: typeof import("koffi").struct;
80
+ type: typeof import("koffi").type;
81
+ types: typeof import("koffi").types;
82
+ union: typeof import("koffi").union;
83
+ unregister: typeof import("koffi").unregister;
84
+ version: typeof import("koffi").version;
85
+ view: typeof import("koffi").view;
86
+ }>;
87
+ //# sourceMappingURL=native-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-loader.d.ts","sourceRoot":"","sources":["../../src/owned-scope/native-loader.ts"],"names":[],"mappings":"AAGA,4CAA4C;AAC5C,wBAAsB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GASzF"}
@@ -0,0 +1,17 @@
1
+ import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
2
+ const importNative = async () => (await import('koffi')).default;
3
+ /** 只有显式启用 scope 才加载原生依赖;缺失预编译制品不触发构建或降级。 */
4
+ export async function loadOwnedNative(platform, importer = importNative) {
5
+ if (process.platform !== platform || process.arch !== 'x64')
6
+ throw new ProcessControlError(processControlErrorCodes.scopeUnsupported, { reason: 'HOST', platform, architecture: process.arch });
7
+ try {
8
+ const native = await importer();
9
+ if (native.version !== '3.3.3')
10
+ throw new Error('NATIVE_VERSION');
11
+ return native;
12
+ }
13
+ catch {
14
+ throw new ProcessControlError(processControlErrorCodes.scopeUnsupported, { reason: 'NATIVE_PREBUILD', platform });
15
+ }
16
+ }
17
+ //# sourceMappingURL=native-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-loader.js","sourceRoot":"","sources":["../../src/owned-scope/native-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9F,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACjE,4CAA4C;AAC5C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAA2B,EAAE,QAAQ,GAAG,YAAY;IACxF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChM,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpH,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type OwnedProcessLaunchRequest } from '@openge/forge-process-control';
2
+ export declare const controlLimit = 65536, launchLimit = 1048576;
3
+ export declare function object(value: unknown): Record<string, unknown>;
4
+ export declare function validateLaunch(value: unknown): asserts value is OwnedProcessLaunchRequest;
5
+ export interface ScopeKey {
6
+ readonly scopeId: string;
7
+ readonly binding: string;
8
+ readonly nonce: string;
9
+ }
10
+ export interface ScopeFrame extends ScopeKey {
11
+ readonly version: 1;
12
+ readonly sequence: number;
13
+ readonly type: string;
14
+ readonly id?: number;
15
+ readonly payload?: unknown;
16
+ }
17
+ export declare function frame(key: ScopeKey, sequence: number, type: string, payload?: unknown, id?: number): ScopeFrame;
18
+ export declare function readFrame(value: unknown, key: ScopeKey, sequence: number): ScopeFrame;
19
+ export declare function supervisorEnvironment(environment: Readonly<Record<string, string | undefined>>): NodeJS.ProcessEnv;
20
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/owned-scope/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE9H,eAAO,MAAM,YAAY,QAAS,EAAE,WAAW,UAAY,CAAC;AAC5D,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9D;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,yBAAyB,CAUzF;AACD,MAAM,WAAW,QAAQ;IAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACxG,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;AACxK,wBAAgB,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAE/G;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAMrF;AACD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAElH"}
@@ -0,0 +1,32 @@
1
+ import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
2
+ export const controlLimit = 65_536, launchLimit = 1_048_576;
3
+ export function object(value) {
4
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
5
+ }
6
+ export function validateLaunch(value) {
7
+ const request = object(value);
8
+ const text = (value) => typeof value === 'string' && !value.includes('\0');
9
+ const args = request.args ?? [], environment = object(request.environment);
10
+ if (typeof request.command !== 'string' || !text(request.command) || request.command.length === 0 || (request.cwd !== undefined && !text(request.cwd))
11
+ || !Array.isArray(args) || !args.every(text) || typeof request.binding !== 'string' || !/^[\x21-\x7e]{1,256}$/u.test(request.binding)
12
+ || ![request.startupTimeoutMs, request.terminationTimeoutMs].every(value => typeof value === 'number' && Number.isSafeInteger(value) && value > 0 && value <= 2_147_483_647)
13
+ || request.environment === null || typeof request.environment !== 'object' || Array.isArray(request.environment)
14
+ || Object.entries(environment).some(([key, value]) => !text(key) || key.includes('=') || (value !== undefined && !text(value)))
15
+ || Buffer.byteLength(JSON.stringify(request)) > launchLimit - 4096)
16
+ throw new ProcessControlError(processControlErrorCodes.scopeInvalidInput);
17
+ }
18
+ export function frame(key, sequence, type, payload, id) {
19
+ return { ...key, version: 1, sequence, type, ...(payload === undefined ? {} : { payload }), ...(id === undefined ? {} : { id }) };
20
+ }
21
+ export function readFrame(value, key, sequence) {
22
+ const item = object(value);
23
+ if (item.version !== 1 || item.scopeId !== key.scopeId || item.binding !== key.binding || item.nonce !== key.nonce || item.sequence !== sequence
24
+ || typeof item.type !== 'string' || (item.id !== undefined && (!Number.isSafeInteger(item.id) || Number(item.id) < 1))
25
+ || Buffer.byteLength(JSON.stringify(value)) > (item.type === 'start' ? launchLimit : controlLimit))
26
+ throw new ProcessControlError(processControlErrorCodes.scopeBinding, { reason: 'PROTOCOL' });
27
+ return frame(key, sequence, item.type, item.payload, typeof item.id === 'number' ? item.id : undefined);
28
+ }
29
+ export function supervisorEnvironment(environment) {
30
+ return Object.fromEntries(Object.entries(environment).filter(([key]) => !['NODE_OPTIONS', 'NODE_PATH', 'LD_PRELOAD', 'LD_AUDIT'].includes(key.toUpperCase()) && !key.toUpperCase().startsWith('DYLD_')));
31
+ }
32
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/owned-scope/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scope-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-host.d.ts","sourceRoot":"","sources":["../../src/owned-scope/scope-host.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { frame, readFrame, validateLaunch } from './protocol.js';
3
+ import { createLinuxReaper } from './linux-subreaper.js';
4
+ const [platform, scopeId, binding, nonce, timeout] = process.argv.slice(2);
5
+ if (platform !== process.platform || !['win32', 'linux'].includes(platform) || !scopeId || !binding || !nonce || !process.send || !Number.isSafeInteger(Number(timeout)) || Number(timeout) <= 0)
6
+ process.exit(125);
7
+ const key = { scopeId, binding, nonce };
8
+ let incoming = 0, outgoing = 0, bound = false, started = false, exited = false, stopping = false;
9
+ let child;
10
+ const reaper = platform === 'linux' ? await createLinuxReaper(() => !started || exited, Number(timeout)) : undefined;
11
+ let operations = Promise.resolve();
12
+ async function abandon() {
13
+ if (stopping)
14
+ return;
15
+ stopping = true;
16
+ try {
17
+ await reaper?.stop();
18
+ }
19
+ finally {
20
+ process.exit(125);
21
+ }
22
+ }
23
+ function send(type, payload, id) {
24
+ if (!process.connected) {
25
+ void abandon();
26
+ return;
27
+ }
28
+ process.send?.(frame(key, ++outgoing, type, payload, id), error => { if (error)
29
+ void abandon(); });
30
+ }
31
+ async function drainOutput() {
32
+ await Promise.all([process.stdout, process.stderr].map(stream => new Promise((accept, reject) => {
33
+ stream.write('', error => { if (error)
34
+ reject(error);
35
+ else
36
+ accept(); });
37
+ })));
38
+ }
39
+ async function receive(value) {
40
+ if (stopping)
41
+ return;
42
+ try {
43
+ const message = readFrame(value, key, ++incoming);
44
+ if (message.id === undefined)
45
+ throw new Error('MISSING_ID');
46
+ if (message.type === 'bind' && !bound && !started) {
47
+ bound = true;
48
+ send('response', { ok: true }, message.id);
49
+ }
50
+ else if (message.type === 'start' && bound && !started) {
51
+ const request = message.payload;
52
+ validateLaunch(request);
53
+ started = true;
54
+ // 独立隐藏的 Windows 作业不创建 libuv 的另一层隐式 Job;输出用 pipe 转发并在关闭前排空。
55
+ child = spawn(request.command, [...(request.args ?? [])], { ...(request.cwd === undefined ? {} : { cwd: request.cwd }), env: { ...request.environment }, shell: false, detached: platform === 'win32', windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] });
56
+ child.stdout?.pipe(process.stdout, { end: false });
57
+ child.stderr?.pipe(process.stderr, { end: false });
58
+ child.once('error', () => { if (!exited) {
59
+ exited = true;
60
+ send('direct-exit', { exitCode: 126, signal: null });
61
+ } });
62
+ child.once('close', (exitCode, signal) => {
63
+ if (!exited) {
64
+ exited = true;
65
+ void drainOutput().then(() => send('direct-exit', { exitCode, signal }), () => abandon());
66
+ }
67
+ });
68
+ send('response', { ok: true }, message.id);
69
+ }
70
+ else if (message.type === 'inspect' && reaper) {
71
+ send('response', { ok: true, empty: reaper.empty() }, message.id);
72
+ }
73
+ else if (message.type === 'stop' && reaper) {
74
+ send('response', { ok: true, empty: await reaper.stop() }, message.id);
75
+ }
76
+ else if (message.type === 'finish' && (exited || !started)) {
77
+ stopping = true;
78
+ process.send?.(frame(key, ++outgoing, 'response', { ok: true }, message.id), () => process.exit(0));
79
+ }
80
+ else
81
+ throw new Error('STATE');
82
+ }
83
+ catch {
84
+ await abandon();
85
+ }
86
+ }
87
+ process.on('message', value => { operations = operations.then(() => receive(value)).catch(() => abandon()); });
88
+ process.on('disconnect', () => { void abandon(); });
89
+ process.on('SIGTERM', () => { void abandon(); });
90
+ send('ready');
91
+ //# sourceMappingURL=scope-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-host.js","sourceRoot":"","sources":["../../src/owned-scope/scope-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { OwnedProcessLaunchRequest, OwnedProcessOutput, OwnedProcessScope } from '@openge/forge-process-control';
2
+ import type { ScopeBackend } from './backend.js';
3
+ export interface SupervisorPort {
4
+ readonly boot: Promise<void>;
5
+ readonly startupSignal: AbortSignal;
6
+ readonly terminationTimeoutMs: number;
7
+ assertRootInstance(pid: number): void;
8
+ rpc(type: string, payload?: unknown): Promise<Record<string, unknown>>;
9
+ }
10
+ export declare function startSupervisor(input: OwnedProcessLaunchRequest, platform: 'win32' | 'linux', createBackend: (port: SupervisorPort) => Promise<ScopeBackend>, output?: (event: OwnedProcessOutput) => void): OwnedProcessScope;
11
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/owned-scope/supervisor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA0B,yBAAyB,EAAE,kBAAkB,EAAE,iBAAiB,EAAwC,MAAM,+BAA+B,CAAC;AAGpL,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAOjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACxE;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,EAC3F,aAAa,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,iBAAiB,CAwIjI"}
@@ -0,0 +1,265 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
5
+ import { frame, object, readFrame, supervisorEnvironment, validateLaunch } from './protocol.js';
6
+ function deferred() {
7
+ let resolve, reject;
8
+ const promise = new Promise((accept, decline) => { resolve = accept; reject = decline; });
9
+ void promise.catch(() => { });
10
+ return { promise, resolve, reject };
11
+ }
12
+ export function startSupervisor(input, platform, createBackend, output) {
13
+ validateLaunch(input);
14
+ const request = Object.freeze({ ...input, args: Object.freeze([...(input.args ?? [])]), environment: Object.freeze({ ...input.environment }) });
15
+ const key = { scopeId: randomUUID(), binding: request.binding, nonce: randomUUID() };
16
+ const root = deferred(), completion = deferred(), boot = deferred(), closed = deferred();
17
+ const pending = new Map();
18
+ let child, backend, identity;
19
+ let outgoing = 0, incoming = 0, requestId = 0, bound = false, authorized = false, rootExited = false, done = false;
20
+ let helperExit;
21
+ let directExit, finishing;
22
+ let finalReason = 'normal';
23
+ const scopeError = (reason) => new ProcessControlError(processControlErrorCodes.scopeUnknown, { reason });
24
+ const active = (signal) => { if (signal?.aborted || finishing || done)
25
+ throw scopeError('INACTIVE'); };
26
+ const rpc = (type, payload) => {
27
+ if (!child?.connected)
28
+ return Promise.reject(scopeError('CHANNEL_CLOSED'));
29
+ const id = ++requestId;
30
+ return new Promise((resolve, reject) => {
31
+ const timer = setTimeout(() => { pending.delete(id); reject(scopeError('CONTROL_DEADLINE')); }, type === 'stop' || type === 'finish' || type === 'inspect' ? request.terminationTimeoutMs : request.startupTimeoutMs);
32
+ pending.set(id, { resolve, reject, timer });
33
+ child?.send(frame(key, ++outgoing, type, payload, id), error => {
34
+ if (error) {
35
+ const item = pending.get(id);
36
+ if (item) {
37
+ clearTimeout(item.timer);
38
+ pending.delete(id);
39
+ item.reject(scopeError('CONTROL_SEND'));
40
+ }
41
+ }
42
+ });
43
+ });
44
+ };
45
+ const startupController = new AbortController();
46
+ const port = { boot: boot.promise, startupSignal: startupController.signal, terminationTimeoutMs: request.terminationTimeoutMs, rpc,
47
+ assertRootInstance: pid => {
48
+ if (!child || child.pid !== pid || child.exitCode !== null || child.signalCode !== null || rootExited || !child.connected)
49
+ throw scopeError('ROOT_INSTANCE');
50
+ } };
51
+ const startup = setTimeout(() => { startupController.abort(); boot.reject(scopeError('BOOT_DEADLINE')); void finish('provider-failed'); }, request.startupTimeoutMs);
52
+ const waitClose = async () => {
53
+ if (!child || rootExited)
54
+ return;
55
+ let timer;
56
+ try {
57
+ await Promise.race([closed.promise, new Promise((_accept, reject) => { timer = setTimeout(() => reject(scopeError('CLOSE_DEADLINE')), request.terminationTimeoutMs); })]);
58
+ }
59
+ finally {
60
+ clearTimeout(timer);
61
+ }
62
+ };
63
+ const finish = (reason) => {
64
+ if (finishing)
65
+ return finishing;
66
+ finalReason = reason;
67
+ finishing = (async () => {
68
+ let empty;
69
+ clearTimeout(startup);
70
+ if (reason !== 'normal') {
71
+ startupController.abort();
72
+ boot.reject(scopeError('STOPPED'));
73
+ }
74
+ try {
75
+ await initialization;
76
+ if (reason === 'normal') {
77
+ if (!backend || !identity || !authorized || !directExit)
78
+ throw scopeError('MISSING_CLOSURE');
79
+ // 直接作业已 close;仍有成员就是前台契约违反,不能等待它自行结束后升级为正常。
80
+ if (!await backend.empty(false)) {
81
+ finalReason = 'descendants-remained';
82
+ await backend.force();
83
+ }
84
+ else
85
+ await rpc('finish');
86
+ }
87
+ else
88
+ await backend?.force();
89
+ if (!rootExited && finalReason !== 'normal' && child && (platform === 'win32' || !backend))
90
+ child.kill('SIGKILL');
91
+ await waitClose();
92
+ if (finalReason === 'normal' && (helperExit?.code !== 0 || helperExit.signal !== null))
93
+ finalReason = 'owner-lost';
94
+ if (backend)
95
+ empty = await backend.empty(true);
96
+ if (empty !== true)
97
+ finalReason = finalReason === 'normal' ? 'provider-failed' : finalReason;
98
+ }
99
+ catch {
100
+ if (finalReason === 'normal')
101
+ finalReason = 'provider-failed';
102
+ try {
103
+ await backend?.force();
104
+ }
105
+ catch { /* 仍保留未知,关闭 Job 句柄会执行其生命周期策略。 */ }
106
+ if (!rootExited && (platform === 'win32' || !backend))
107
+ child?.kill('SIGKILL');
108
+ try {
109
+ await waitClose();
110
+ if (backend)
111
+ empty = await backend.empty(true);
112
+ }
113
+ catch {
114
+ empty = undefined;
115
+ }
116
+ }
117
+ finally {
118
+ try {
119
+ await backend?.dispose();
120
+ }
121
+ catch {
122
+ finalReason = 'provider-failed';
123
+ empty = undefined;
124
+ }
125
+ done = true;
126
+ for (const item of pending.values()) {
127
+ clearTimeout(item.timer);
128
+ item.reject(scopeError('FINISHED'));
129
+ }
130
+ pending.clear();
131
+ boot.reject(scopeError('FINISHED'));
132
+ root.reject(scopeError('NOT_STARTED'));
133
+ child?.stdout?.removeAllListeners('data');
134
+ child?.stderr?.removeAllListeners('data');
135
+ child?.stdout?.destroy();
136
+ child?.stderr?.destroy();
137
+ if (child?.connected)
138
+ child.disconnect();
139
+ child?.unref();
140
+ const base = { scopeId: key.scopeId, binding: key.binding, observedAt: new Date().toISOString() };
141
+ const closure = finalReason === 'normal' && identity && empty === true
142
+ ? { ...base, status: 'closed', reason: 'normal', rootIdentity: identity, empty: true }
143
+ : { ...base, status: 'unknown', reason: finalReason === 'normal' ? 'provider-failed' : finalReason, ...(identity ? { rootIdentity: identity } : {}), ...(empty === undefined ? {} : { empty }) };
144
+ completion.resolve({ exitCode: directExit?.exitCode ?? null, signal: directExit?.signal ?? null, closure });
145
+ }
146
+ })();
147
+ return finishing;
148
+ };
149
+ const initialization = (async () => {
150
+ backend = await createBackend(port);
151
+ if (finishing)
152
+ throw scopeError('STOPPED');
153
+ child = spawn(process.execPath, [fileURLToPath(new URL('./scope-host.js', import.meta.url)), platform, key.scopeId, key.binding, key.nonce, String(request.terminationTimeoutMs)], {
154
+ ...(request.cwd === undefined ? {} : { cwd: request.cwd }),
155
+ env: supervisorEnvironment(request.environment), detached: true, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe', 'ipc'], serialization: 'json',
156
+ });
157
+ const forward = (stream, chunk) => { try {
158
+ output?.({ stream, chunk: Uint8Array.from(chunk) });
159
+ }
160
+ catch {
161
+ void finish('provider-failed');
162
+ } };
163
+ child.stdout?.on('data', (chunk) => forward('stdout', chunk));
164
+ child.stderr?.on('data', (chunk) => forward('stderr', chunk));
165
+ child.on('message', value => {
166
+ if (done)
167
+ return;
168
+ try {
169
+ const message = readFrame(value, key, ++incoming);
170
+ if (message.type === 'ready' && incoming === 1)
171
+ boot.resolve(undefined);
172
+ else if (message.type === 'response' && message.id !== undefined) {
173
+ const item = pending.get(message.id);
174
+ if (!item)
175
+ throw scopeError('UNEXPECTED_REPLY');
176
+ clearTimeout(item.timer);
177
+ pending.delete(message.id);
178
+ const result = object(message.payload);
179
+ if (result.ok !== true)
180
+ item.reject(scopeError('HELPER_REJECTED'));
181
+ else
182
+ item.resolve(result);
183
+ }
184
+ else if (message.type === 'direct-exit' && authorized && !directExit) {
185
+ const value = object(message.payload);
186
+ if ((value.exitCode !== null && !Number.isSafeInteger(value.exitCode)) || (value.signal !== null && typeof value.signal !== 'string'))
187
+ throw scopeError('EXIT_PROTOCOL');
188
+ directExit = { exitCode: typeof value.exitCode === 'number' ? value.exitCode : null, signal: typeof value.signal === 'string' ? value.signal : null };
189
+ void finish('normal');
190
+ }
191
+ else
192
+ throw scopeError('UNEXPECTED_MESSAGE');
193
+ }
194
+ catch {
195
+ boot.reject(scopeError('PROTOCOL'));
196
+ void finish('provider-failed');
197
+ }
198
+ });
199
+ child.once('error', () => { boot.reject(scopeError('HELPER_START')); root.reject(scopeError('HELPER_START')); void finish('provider-failed'); });
200
+ child.once('close', (code, signal) => { helperExit = { code, signal }; rootExited = true; closed.resolve(undefined); if (!finishing) {
201
+ boot.reject(scopeError('OWNER_LOST'));
202
+ void finish('owner-lost');
203
+ } });
204
+ await new Promise((resolve, reject) => { child?.once('spawn', resolve); child?.once('error', reject); });
205
+ if (child.pid === undefined)
206
+ throw scopeError('MISSING_ROOT_PID');
207
+ await backend.attach(child.pid);
208
+ await boot.promise;
209
+ if (finishing)
210
+ throw scopeError('STOPPED');
211
+ clearTimeout(startup);
212
+ root.resolve(child.pid);
213
+ })().catch(error => { boot.reject(error); root.reject(error); void finish('provider-failed'); });
214
+ return {
215
+ scopeId: key.scopeId, rootPid: root.promise, completion: completion.promise,
216
+ bind: async (value, signal) => {
217
+ active(signal);
218
+ await initialization;
219
+ active(signal);
220
+ if (bound) {
221
+ if (identity?.pid !== value.pid || identity.startToken !== value.startToken) {
222
+ void finish('provider-failed');
223
+ throw new ProcessControlError(processControlErrorCodes.scopeBinding);
224
+ }
225
+ return;
226
+ }
227
+ try {
228
+ await backend?.bind(value);
229
+ active(signal);
230
+ identity = { pid: value.pid, startToken: value.startToken };
231
+ await rpc('bind');
232
+ active(signal);
233
+ bound = true;
234
+ }
235
+ catch (error) {
236
+ void finish('provider-failed');
237
+ throw error;
238
+ }
239
+ },
240
+ authorize: async (signal) => {
241
+ if (authorized && !finishing && !done)
242
+ return;
243
+ active(signal);
244
+ if (!bound || !identity)
245
+ throw new ProcessControlError(processControlErrorCodes.scopeBinding, { reason: 'NOT_BOUND' });
246
+ authorized = true;
247
+ try {
248
+ await rpc('start', request);
249
+ }
250
+ catch (error) {
251
+ void finish('provider-failed');
252
+ throw error;
253
+ }
254
+ },
255
+ terminate: async (policy) => {
256
+ if (policy.mode !== 'force')
257
+ throw new ProcessControlError(processControlErrorCodes.scopeUnsupported, { reason: 'FORCE_REQUIRED' });
258
+ await finish('terminated');
259
+ return (await completion.promise).closure;
260
+ },
261
+ dispose: async () => { if (!done)
262
+ await finish('terminated'); },
263
+ };
264
+ }
265
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/owned-scope/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ScopeBackend } from './backend.js';
2
+ import type { SupervisorPort } from './supervisor.js';
3
+ export declare function createWindowsJob(port: SupervisorPort): Promise<ScopeBackend>;
4
+ //# sourceMappingURL=windows-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-job.d.ts","sourceRoot":"","sources":["../../src/owned-scope/windows-job.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAgGlF"}
@@ -0,0 +1,142 @@
1
+ import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
2
+ import { loadOwnedNative } from './native-loader.js';
3
+ export async function createWindowsJob(port) {
4
+ const k = await loadOwnedNative('win32'), lib = k.load('kernel32.dll');
5
+ const basic = k.struct({ processTimeLimit: 'int64_t', jobTimeLimit: 'int64_t', flags: 'uint32_t', minWorkingSet: 'size_t', maxWorkingSet: 'size_t', processLimit: 'uint32_t', affinity: 'uintptr_t', priority: 'uint32_t', scheduling: 'uint32_t' });
6
+ const io = k.struct({ readCount: 'uint64_t', writeCount: 'uint64_t', otherCount: 'uint64_t', readBytes: 'uint64_t', writeBytes: 'uint64_t', otherBytes: 'uint64_t' });
7
+ const limits = k.struct({ basic, io, processMemory: 'size_t', jobMemory: 'size_t', peakProcessMemory: 'size_t', peakJobMemory: 'size_t' });
8
+ const accounting = k.struct({ userTime: 'int64_t', kernelTime: 'int64_t', periodUser: 'int64_t', periodKernel: 'int64_t', faults: 'uint32_t', total: 'uint32_t', active: 'uint32_t', terminated: 'uint32_t' });
9
+ const fileTime = k.struct({ low: 'uint32_t', high: 'uint32_t' });
10
+ const processList = k.struct({ assigned: 'uint32_t', count: 'uint32_t', ids: k.array('uintptr_t', 4096) });
11
+ const create = lib.func('void * __stdcall CreateJobObjectW(void *attributes, str16 name)');
12
+ // Win32 BOOL 是 32 位 int,不是 C99 的一字节 bool。
13
+ const set = lib.func('__stdcall', 'SetInformationJobObject', 'int32_t', ['void *', 'int', k.pointer(limits), 'uint32_t']);
14
+ const readLimits = lib.func('__stdcall', 'QueryInformationJobObject', 'int32_t', ['void *', 'int', k.out(k.pointer(limits)), 'uint32_t', 'void *']);
15
+ const query = lib.func('__stdcall', 'QueryInformationJobObject', 'int32_t', ['void *', 'int', k.out(k.pointer(accounting)), 'uint32_t', 'void *']);
16
+ const members = lib.func('__stdcall', 'QueryInformationJobObject', 'int32_t', ['void *', 'int', k.out(k.pointer(processList)), 'uint32_t', 'void *']);
17
+ const assign = lib.func('int32_t __stdcall AssignProcessToJobObject(void *job, void *process)');
18
+ const open = lib.func('void * __stdcall OpenProcess(uint32_t access, int32_t inherit, uint32_t pid)');
19
+ const times = lib.func('__stdcall', 'GetProcessTimes', 'int32_t', ['void *', k.out(k.pointer(fileTime)), k.out(k.pointer(fileTime)), k.out(k.pointer(fileTime)), k.out(k.pointer(fileTime))]);
20
+ const inJob = lib.func('__stdcall', 'IsProcessInJob', 'int32_t', ['void *', 'void *', k.out(k.pointer('int'))]);
21
+ const wait = lib.func('uint32_t __stdcall WaitForSingleObject(void *handle, uint32_t timeout)');
22
+ const exitCode = lib.func('__stdcall', 'GetExitCodeProcess', 'int32_t', ['void *', k.out(k.pointer('uint32_t'))]);
23
+ const terminate = lib.func('int32_t __stdcall TerminateJobObject(void *job, uint32_t code)');
24
+ const close = lib.func('int32_t __stdcall CloseHandle(void *handle)');
25
+ const lastError = lib.func('uint32_t __stdcall GetLastError()');
26
+ const fail = (stage) => new ProcessControlError(processControlErrorCodes.scopeUnknown, { stage, nativeCode: Number(lastError()) });
27
+ let job = create(null, null), processHandle = null, actual;
28
+ if (!job)
29
+ throw fail('CREATE_JOB');
30
+ try {
31
+ const value = { basic: { processTimeLimit: 0, jobTimeLimit: 0, flags: 0x2000, minWorkingSet: 0, maxWorkingSet: 0, processLimit: 0, affinity: 0, priority: 0, scheduling: 0 },
32
+ io: { readCount: 0, writeCount: 0, otherCount: 0, readBytes: 0, writeBytes: 0, otherBytes: 0 }, processMemory: 0, jobMemory: 0, peakProcessMemory: 0, peakJobMemory: 0 };
33
+ if (k.sizeof(limits) !== 144 || k.sizeof(accounting) !== 48 || !set(job, 9, value, k.sizeof(limits)))
34
+ throw fail('SET_JOB_LIMITS');
35
+ if (!readLimits(job, 9, value, k.sizeof(limits), null) || (value.basic.flags & 0x2000) === 0 || (value.basic.flags & 0x1800) !== 0)
36
+ throw fail('JOB_LIMIT_READBACK');
37
+ }
38
+ catch (error) {
39
+ close(job);
40
+ job = null;
41
+ throw error;
42
+ }
43
+ return {
44
+ attach: async (pid) => {
45
+ if (!job || processHandle)
46
+ throw fail('ATTACH_STATE');
47
+ processHandle = open(0x0100 | 0x0001 | 0x1000, 0, pid);
48
+ if (!processHandle)
49
+ throw fail('OPEN_ROOT');
50
+ const created = { low: 0, high: 0 }, exited = { low: 0, high: 0 }, kernel = { low: 0, high: 0 }, user = { low: 0, high: 0 };
51
+ if (!times(processHandle, created, exited, kernel, user))
52
+ throw fail('ROOT_TIMES');
53
+ const milliseconds = ((BigInt(created.high) << 32n) + BigInt(created.low) - 116444736000000000n) / 10000n;
54
+ actual = { pid, startToken: `/Date(${String(milliseconds)})/` };
55
+ if (!assign(job, processHandle))
56
+ throw fail('ASSIGN_JOB');
57
+ },
58
+ bind: async (identity) => { if (!actual || actual.pid !== identity.pid || actual.startToken !== identity.startToken)
59
+ throw new ProcessControlError(processControlErrorCodes.scopeBinding, { reason: 'ROOT_IDENTITY' }); },
60
+ empty: async (rootExited) => {
61
+ if (!job || !actual)
62
+ throw fail('QUERY_STATE');
63
+ const value = { userTime: 0, kernelTime: 0, periodUser: 0, periodKernel: 0, faults: 0, total: 0, active: 0, terminated: 0 };
64
+ const expected = rootExited ? 0 : 1, deadline = Date.now() + Math.min(1000, port.terminationTimeoutMs);
65
+ const readMembers = () => {
66
+ const list = { assigned: 0, count: 0, ids: Array(4096).fill(0n) };
67
+ if (!members(job, 3, list, k.sizeof(processList), null) || list.count !== list.assigned || list.count > 4096)
68
+ throw fail('QUERY_JOB_MEMBERS');
69
+ return list;
70
+ };
71
+ const rootOnly = (list) => list.count === expected && (rootExited || Number(list.ids[0]) === actual?.pid);
72
+ for (;;) {
73
+ if (!query(job, 1, value, k.sizeof(accounting), null))
74
+ throw fail('QUERY_JOB');
75
+ if (value.active === expected)
76
+ return true;
77
+ const list = readMembers();
78
+ if (!rootExited && !list.ids.slice(0, list.count).some(pid => Number(pid) === actual?.pid))
79
+ throw fail('JOB_ROOT_MEMBERSHIP');
80
+ for (const pid of list.ids.slice(0, list.count)) {
81
+ if (!rootExited && Number(pid) === actual.pid)
82
+ continue;
83
+ const handle = open(0x1000 | 0x100000, 0, Number(pid));
84
+ if (!handle) {
85
+ // 已删除实例不能打开;只有再次取得完整的 root-only Job 表才可继续,不以 PID 缺失代替关闭证据。
86
+ if (Number(lastError()) !== 87 || !rootOnly(readMembers()))
87
+ throw fail('JOB_MEMBER_INSTANCE');
88
+ break;
89
+ }
90
+ let active = false;
91
+ try {
92
+ const belongs = [0];
93
+ if (!inJob(handle, job, belongs) || belongs[0] !== 1)
94
+ throw fail('JOB_MEMBER_OWNERSHIP');
95
+ const state = Number(wait(handle, 0));
96
+ if (state !== 0 && state !== 258)
97
+ throw fail('JOB_MEMBER_WAIT');
98
+ if (state === 258) {
99
+ // ExitProcess 的终止状态可先于进程对象触发;STILL_ACTIVE 之外的状态已证明退出。
100
+ const code = [0];
101
+ if (!exitCode(handle, code))
102
+ throw fail('JOB_MEMBER_EXIT_STATUS');
103
+ active = code[0] === 259;
104
+ }
105
+ }
106
+ catch (error) {
107
+ close(handle);
108
+ throw error;
109
+ }
110
+ if (!close(handle))
111
+ throw fail('CLOSE_MEMBER_HANDLE');
112
+ if (active)
113
+ return false;
114
+ }
115
+ // 完整成员表或稳定句柄已证明没有存活后代,才等待 accounting 同步;存活成员没有宽限。
116
+ if (Date.now() >= deadline)
117
+ throw fail('JOB_ACCOUNTING_DEADLINE');
118
+ await new Promise(accept => setTimeout(accept, 10));
119
+ }
120
+ },
121
+ force: async () => { if (job && !terminate(job, 125))
122
+ throw fail('TERMINATE_JOB'); },
123
+ dispose: async () => {
124
+ let failed = false;
125
+ if (processHandle) {
126
+ if (!close(processHandle))
127
+ failed = true;
128
+ else
129
+ processHandle = null;
130
+ }
131
+ if (job) {
132
+ if (!close(job))
133
+ failed = true;
134
+ else
135
+ job = null;
136
+ }
137
+ if (failed)
138
+ throw fail('CLOSE_HANDLES');
139
+ },
140
+ };
141
+ }
142
+ //# sourceMappingURL=windows-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-job.js","sourceRoot":"","sources":["../../src/owned-scope/windows-job.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openge/forge-process-control-node",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Explicit Windows and Posix Node.js Providers for process control",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -35,7 +35,8 @@
35
35
  "url": "https://github.com/zopenge/foundation-forge/issues"
36
36
  },
37
37
  "dependencies": {
38
- "@openge/forge-process-control": "^0.2.0"
38
+ "koffi": "3.3.3",
39
+ "@openge/forge-process-control": "^0.3.0"
39
40
  },
40
41
  "scripts": {
41
42
  "build": "tsc -p tsconfig.build.json",