@openge/forge-process-control-node 0.4.0 → 0.5.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.
- package/README.md +8 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/windows-native-identity.d.ts +4 -0
- package/dist/windows-native-identity.d.ts.map +1 -0
- package/dist/windows-native-identity.js +141 -0
- package/dist/windows-native-identity.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,14 @@ 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
|
+
On Windows x64, explicitly choose `createWindowsNativeProcessIdentityReader()` to
|
|
14
|
+
read a known PID through the installed Koffi prebuild and Win32 process handles.
|
|
15
|
+
It preserves the millisecond start-token format, checks process liveness before
|
|
16
|
+
and after reading creation time, and closes each query handle. It never enumerates
|
|
17
|
+
processes or falls back to a command reader. Cancellation and access, loading, ABI,
|
|
18
|
+
or cleanup failures remain errors; an unreadable identity is not absence. The
|
|
19
|
+
existing command readers remain available without changing their behavior.
|
|
20
|
+
|
|
13
21
|
Explicit `createWindowsOwnedProcessScopeProvider()` and
|
|
14
22
|
`createLinuxOwnedProcessScopeProvider()` implement owned command scopes on
|
|
15
23
|
Windows x64 (Job Objects) and Linux/glibc x64 (subreaper, wait/reap and pidfds).
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
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
3
|
export { createWindowsOwnedProcessScopeProvider, createLinuxOwnedProcessScopeProvider } from './owned-process-scope.js';
|
|
4
|
+
export { createWindowsNativeProcessIdentityReader } from './windows-native-identity.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
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,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"}
|
|
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;AACxH,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export {} from './contracts.js';
|
|
2
2
|
export { createPosixProcessControl, createPosixProcessIdentityReader, createWindowsProcessControl, createWindowsProcessIdentityReader, } from './provider.js';
|
|
3
3
|
export { createWindowsOwnedProcessScopeProvider, createLinuxOwnedProcessScopeProvider } from './owned-process-scope.js';
|
|
4
|
+
export { createWindowsNativeProcessIdentityReader } from './windows-native-identity.js';
|
|
4
5
|
//# 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;AACvB,OAAO,EAAE,sCAAsC,EAAE,oCAAoC,EAAE,MAAM,0BAA0B,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;AACxH,OAAO,EAAE,wCAAwC,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ProcessIdentityReader } from '@openge/forge-process-control';
|
|
2
|
+
/** 显式Windows x64原生reader;不改变旧reader,不枚举进程或回退到命令实现。 */
|
|
3
|
+
export declare function createWindowsNativeProcessIdentityReader(): ProcessIdentityReader;
|
|
4
|
+
//# sourceMappingURL=windows-native-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-native-identity.d.ts","sourceRoot":"","sources":["../src/windows-native-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,qBAAqB,EAAmE,MAAM,+BAA+B,CAAC;AAuG3L,sDAAsD;AACtD,wBAAgB,wCAAwC,IAAI,qBAAqB,CAQhF"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { ProcessControlError, processControlErrorCodes } from '@openge/forge-process-control';
|
|
2
|
+
import { loadOwnedNative } from './owned-scope/native-loader.js';
|
|
3
|
+
const backend = 'windows-native';
|
|
4
|
+
let apiPromise;
|
|
5
|
+
const failure = (stage, details = {}, cause) => new ProcessControlError(processControlErrorCodes.commandFailed, { backend, stage, ...details }, cause);
|
|
6
|
+
const structured = (error) => error instanceof ProcessControlError ? error : failure('NATIVE_CALL', {}, error);
|
|
7
|
+
const active = (signal) => { if (signal?.aborted)
|
|
8
|
+
throw new ProcessControlError(processControlErrorCodes.operationAborted); };
|
|
9
|
+
async function bindApi() {
|
|
10
|
+
const k = await loadOwnedNative('win32'), lib = k.load('kernel32.dll');
|
|
11
|
+
const time = k.struct({ low: 'uint32_t', high: 'uint32_t' });
|
|
12
|
+
if (k.sizeof(time) !== 8)
|
|
13
|
+
throw failure('FILETIME_ABI');
|
|
14
|
+
const open = lib.func('void * __stdcall OpenProcess(uint32_t access, int32_t inherit, uint32_t pid)');
|
|
15
|
+
const pid = lib.func('uint32_t __stdcall GetProcessId(void *handle)');
|
|
16
|
+
const wait = lib.func('uint32_t __stdcall WaitForSingleObject(void *handle, uint32_t milliseconds)');
|
|
17
|
+
const times = lib.func('__stdcall', 'GetProcessTimes', 'int32_t', ['void *', k.out(k.pointer(time)), k.out(k.pointer(time)), k.out(k.pointer(time)), k.out(k.pointer(time))]);
|
|
18
|
+
const close = lib.func('int32_t __stdcall CloseHandle(void *handle)');
|
|
19
|
+
const lastError = lib.func('uint32_t __stdcall GetLastError()');
|
|
20
|
+
const error = (stage, details = {}) => failure(stage, { nativeCode: Number(lastError()), ...details });
|
|
21
|
+
return {
|
|
22
|
+
open: value => {
|
|
23
|
+
// 只读身份和零时等待,无终止/内存/继承权限;参数范围在进入FFI前验证。
|
|
24
|
+
const handle = open(0x00101000, 0, value);
|
|
25
|
+
if (handle)
|
|
26
|
+
return handle;
|
|
27
|
+
const nativeCode = Number(lastError());
|
|
28
|
+
if (nativeCode === 87)
|
|
29
|
+
return null;
|
|
30
|
+
throw failure('OPEN_PROCESS', { nativeCode });
|
|
31
|
+
},
|
|
32
|
+
processId: handle => { const value = Number(pid(handle)); if (!value)
|
|
33
|
+
throw error('PROCESS_ID'); return value; },
|
|
34
|
+
signaled: handle => {
|
|
35
|
+
const value = Number(wait(handle, 0));
|
|
36
|
+
if (value === 0)
|
|
37
|
+
return true;
|
|
38
|
+
if (value === 258)
|
|
39
|
+
return false;
|
|
40
|
+
throw error('PROCESS_WAIT', { waitResult: value });
|
|
41
|
+
},
|
|
42
|
+
creation: handle => {
|
|
43
|
+
const created = { low: 0, high: 0 }, exited = { low: 0, high: 0 }, kernel = { low: 0, high: 0 }, user = { low: 0, high: 0 };
|
|
44
|
+
if (!times(handle, created, exited, kernel, user))
|
|
45
|
+
throw error('GET_PROCESS_TIMES');
|
|
46
|
+
if (![created.low, created.high].every(value => Number.isInteger(value) && value >= 0 && value <= 0xffffffff))
|
|
47
|
+
throw failure('FILE_TIME');
|
|
48
|
+
return created;
|
|
49
|
+
},
|
|
50
|
+
close: handle => { if (!close(handle))
|
|
51
|
+
throw error('CLOSE_HANDLE'); },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function nativeApi() {
|
|
55
|
+
// 只缓存不可变ABI绑定;每次读取仍单独打开句柄并查询,不缓存PID或身份结果。
|
|
56
|
+
apiPromise ??= bindApi().catch((error) => {
|
|
57
|
+
apiPromise = undefined;
|
|
58
|
+
throw new ProcessControlError(processControlErrorCodes.unsupportedBackend, { backend, stage: 'NATIVE_LOAD' }, error);
|
|
59
|
+
});
|
|
60
|
+
return apiPromise;
|
|
61
|
+
}
|
|
62
|
+
function initialize(signal) {
|
|
63
|
+
const loading = nativeApi();
|
|
64
|
+
if (!signal)
|
|
65
|
+
return loading;
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
const abort = () => { signal.removeEventListener('abort', abort); reject(new ProcessControlError(processControlErrorCodes.operationAborted)); };
|
|
68
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
69
|
+
if (signal.aborted)
|
|
70
|
+
abort();
|
|
71
|
+
// 一个调用取消不取消共享加载;迟到的成功/失败均有接收方且不再发起查询。
|
|
72
|
+
void loading.then(value => { signal.removeEventListener('abort', abort); if (signal.aborted)
|
|
73
|
+
abort();
|
|
74
|
+
else
|
|
75
|
+
resolve(value); }, (error) => { signal.removeEventListener('abort', abort); if (signal.aborted)
|
|
76
|
+
abort();
|
|
77
|
+
else
|
|
78
|
+
reject(error); });
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function query(api, request) {
|
|
82
|
+
const handle = api.open(request.pid);
|
|
83
|
+
if (!handle) {
|
|
84
|
+
active(request.signal);
|
|
85
|
+
return { status: 'ABSENT' };
|
|
86
|
+
}
|
|
87
|
+
let result, primary;
|
|
88
|
+
try {
|
|
89
|
+
active(request.signal);
|
|
90
|
+
const observedPid = api.processId(handle);
|
|
91
|
+
if (observedPid !== request.pid)
|
|
92
|
+
throw failure('IDENTITY_BINDING', { pid: request.pid, observedPid });
|
|
93
|
+
active(request.signal);
|
|
94
|
+
if (api.signaled(handle))
|
|
95
|
+
result = { status: 'ABSENT' };
|
|
96
|
+
else {
|
|
97
|
+
active(request.signal);
|
|
98
|
+
const created = api.creation(handle);
|
|
99
|
+
active(request.signal);
|
|
100
|
+
if (api.signaled(handle))
|
|
101
|
+
result = { status: 'ABSENT' };
|
|
102
|
+
else {
|
|
103
|
+
const milliseconds = ((BigInt(created.high) << 32n) + BigInt(created.low) - 116444736000000000n) / 10000n;
|
|
104
|
+
result = { status: 'FOUND', identity: { pid: request.pid, startToken: `/Date(${milliseconds})/` } };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
primary = structured(error);
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
api.close(handle);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
const cleanup = structured(error);
|
|
116
|
+
primary = primary ? new ProcessControlError(primary.code, { ...primary.details, cleanup: cleanup.details }, primary) : cleanup;
|
|
117
|
+
}
|
|
118
|
+
if (primary)
|
|
119
|
+
throw primary;
|
|
120
|
+
active(request.signal);
|
|
121
|
+
if (!result)
|
|
122
|
+
throw failure('IDENTITY_RESULT');
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
/** 显式Windows x64原生reader;不改变旧reader,不枚举进程或回退到命令实现。 */
|
|
126
|
+
export function createWindowsNativeProcessIdentityReader() {
|
|
127
|
+
return { readIdentity: async ({ pid, signal }) => {
|
|
128
|
+
if (!Number.isSafeInteger(pid) || pid <= 0 || pid > 0xffffffff)
|
|
129
|
+
throw new ProcessControlError(processControlErrorCodes.invalidInput, { pid });
|
|
130
|
+
active(signal);
|
|
131
|
+
const api = await initialize(signal);
|
|
132
|
+
active(signal);
|
|
133
|
+
try {
|
|
134
|
+
return query(api, { pid, ...(signal ? { signal } : {}) });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw structured(error);
|
|
138
|
+
}
|
|
139
|
+
} };
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=windows-native-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-native-identity.js","sourceRoot":"","sources":["../src/windows-native-identity.ts"],"names":[],"mappings":"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"}
|