@aalis/runtime 0.15.1 → 0.16.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 +11 -2
- package/dist/config-store.d.ts +49 -12
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +415 -56
- package/dist/config-store.js.map +1 -1
- package/dist/config-sync.d.ts +19 -8
- package/dist/config-sync.d.ts.map +1 -1
- package/dist/config-sync.js +76 -33
- package/dist/config-sync.js.map +1 -1
- package/dist/console-sink.d.ts +1 -1
- package/dist/file-logger.d.ts +4 -4
- package/dist/file-logger.d.ts.map +1 -1
- package/dist/file-logger.js +6 -5
- package/dist/file-logger.js.map +1 -1
- package/dist/home.d.ts +64 -0
- package/dist/home.d.ts.map +1 -0
- package/dist/home.js +229 -0
- package/dist/home.js.map +1 -0
- package/dist/host-logs.d.ts +9 -0
- package/dist/host-logs.d.ts.map +1 -0
- package/dist/host-logs.js +104 -0
- package/dist/host-logs.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/instance-lock.d.ts +56 -0
- package/dist/instance-lock.d.ts.map +1 -0
- package/dist/instance-lock.js +281 -0
- package/dist/instance-lock.js.map +1 -0
- package/dist/node-modules-loader.d.ts +2 -2
- package/dist/node-modules-loader.d.ts.map +1 -1
- package/dist/node-modules-loader.js +8 -4
- package/dist/node-modules-loader.js.map +1 -1
- package/dist/plugin-discovery.d.ts +9 -4
- package/dist/plugin-discovery.d.ts.map +1 -1
- package/dist/plugin-discovery.js +28 -16
- package/dist/plugin-discovery.js.map +1 -1
- package/dist/providers.d.ts +38 -13
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +91 -218
- package/dist/providers.js.map +1 -1
- package/dist/secrets.d.ts +44 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +104 -0
- package/dist/secrets.js.map +1 -0
- package/dist/start.d.ts +19 -12
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +166 -43
- package/dist/start.js.map +1 -1
- package/dist/yaml-file.d.ts +35 -0
- package/dist/yaml-file.d.ts.map +1 -0
- package/dist/yaml-file.js +213 -0
- package/dist/yaml-file.js.map +1 -0
- package/package.json +13 -7
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
3
|
+
import { linkSync, lstatSync, mkdirSync, readdirSync, readFileSync, readlinkSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
// ============================================================
|
|
6
|
+
// 实例锁:同一家目录只许一个实例
|
|
7
|
+
// ============================================================
|
|
8
|
+
//
|
|
9
|
+
// 没有锁时,手动在终端再起一份会与服务并存,每条消息回两遍。锁是 `run/instance.<n>.lock`,代号 n 最大的那份是现行锁:
|
|
10
|
+
// - 取锁时先把完整内容写进临时文件,再 link 成下一个代号。link 在目标已存在时原子失败,同一代号只有一个进程拿得到;
|
|
11
|
+
// 内容在建出时就是完整的,读不到半截。所以家目录所在的文件系统要支持硬链接。
|
|
12
|
+
// - 不删、不改名活着的锁。link 成功后再看一遍更低的代号:还有活着的持有者(读到的「残留」其实已经被人接手,
|
|
13
|
+
// 或者代号在 run/ 清空后从 1 重新编号),就让出刚建的这一代、报占用。代号最低的活持有者胜出。
|
|
14
|
+
// 确认没有之后,删掉更低代号的旧文件。
|
|
15
|
+
// - 释放时只删内容仍是自己那份的锁文件:同名的锁可能已经是别的实例的。
|
|
16
|
+
// - 锁内容建出后不再改写。前台 respawn 的交接靠取锁时生成的令牌:锁里只记它的哈希,令牌经环境变量交给新进程,
|
|
17
|
+
// 新进程看到锁里的哈希与令牌对得上,就照常 link 出下一个代号接手。不核对父进程 pid:开发模式经 tsx 包装进程
|
|
18
|
+
// 起新实例,新实例的父进程是 tsx,不是旧实例;令牌只在交给新进程的环境变量里,拿得到它就是被交接的那个。
|
|
19
|
+
//
|
|
20
|
+
// 判活只用与墙上时钟无关的标识(时钟被 NTP 步进、夏令时回拨都不影响):
|
|
21
|
+
// - 本次开机的标识不同(重启过)判残留;
|
|
22
|
+
// - pid 命名空间不同(另一个容器,或同一个容器被强杀后重启)判不了,按占用处理;
|
|
23
|
+
// - pid 不在判残留;pid 在时比对进程启动标识,不同判残留(pid 被复用);
|
|
24
|
+
// - 查不了启动标识(Windows、没有 ps 的精简镜像)时只看 pid。
|
|
25
|
+
const LOCK_PATTERN = /^instance\.(\d+)\.lock$/;
|
|
26
|
+
const TEMP_PATTERN = /^\.instance\.\d+\.[0-9a-f]+\.tmp$/;
|
|
27
|
+
/** 临时文件正常只活几毫秒;超过这个时长的是取锁中途退出留下的 */
|
|
28
|
+
const TEMP_STALE_MS = 60_000;
|
|
29
|
+
function run(cmd, args) {
|
|
30
|
+
try {
|
|
31
|
+
const out = execFileSync(cmd, args, {
|
|
32
|
+
encoding: 'utf-8',
|
|
33
|
+
env: { ...process.env, LC_ALL: 'C', TZ: 'UTC0' },
|
|
34
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
35
|
+
timeout: 2000,
|
|
36
|
+
}).trim();
|
|
37
|
+
return out || undefined;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const nodeProcessProbe = {
|
|
44
|
+
pid: process.pid,
|
|
45
|
+
now: () => Date.now(),
|
|
46
|
+
bootId() {
|
|
47
|
+
if (process.platform === 'linux') {
|
|
48
|
+
try {
|
|
49
|
+
return readFileSync('/proc/sys/kernel/random/boot_id', 'utf-8').trim() || undefined;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return process.platform === 'darwin' ? run('sysctl', ['-n', 'kern.bootsessionuuid']) : undefined;
|
|
56
|
+
},
|
|
57
|
+
pidNs() {
|
|
58
|
+
if (process.platform !== 'linux')
|
|
59
|
+
return undefined;
|
|
60
|
+
try {
|
|
61
|
+
return readlinkSync('/proc/self/ns/pid');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
exists(pid) {
|
|
68
|
+
try {
|
|
69
|
+
process.kill(pid, 0);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// EPERM:进程在,只是不归本用户
|
|
74
|
+
return err.code === 'EPERM';
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
startId(pid) {
|
|
78
|
+
if (process.platform === 'win32')
|
|
79
|
+
return undefined;
|
|
80
|
+
if (process.platform === 'linux') {
|
|
81
|
+
try {
|
|
82
|
+
// comm 可能含空格与括号:从最后一个 ')' 之后切,下一项是第 3 字段 state,starttime 是第 22 字段
|
|
83
|
+
const stat = readFileSync(`/proc/${pid}/stat`, 'utf-8');
|
|
84
|
+
return stat.slice(stat.lastIndexOf(')') + 2).split(' ')[19];
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return run('ps', ['-o', 'lstart=', '-p', String(pid)]);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
const sha256 = (s) => createHash('sha256').update(s).digest('hex');
|
|
94
|
+
/**
|
|
95
|
+
* 读锁:文件已不在为 'gone';内容坏了为 'corrupt'(按残留处理),目录项还在却读不到(悬空的符号链接)同样算坏;
|
|
96
|
+
* 别的读错误不猜,抛给宿主
|
|
97
|
+
*/
|
|
98
|
+
function readHolder(file) {
|
|
99
|
+
let text;
|
|
100
|
+
try {
|
|
101
|
+
text = readFileSync(file, 'utf-8');
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err.code === 'ENOENT') {
|
|
105
|
+
return lstatSync(file, { throwIfNoEntry: false }) ? 'corrupt' : 'gone';
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`读不了锁文件 ${file}:${err.message}`);
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const v = JSON.parse(text);
|
|
111
|
+
if (typeof v.pid === 'number' && typeof v.handoffHash === 'string')
|
|
112
|
+
return v;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* 下面按坏内容处理 */
|
|
116
|
+
}
|
|
117
|
+
return 'corrupt';
|
|
118
|
+
}
|
|
119
|
+
/** run/ 里的锁按代号从小到大排。读锁用目录里的原文件名,不按代号重拼:`instance.05.lock` 拼不回原名 */
|
|
120
|
+
function generations(runDir) {
|
|
121
|
+
const out = [];
|
|
122
|
+
for (const name of readdirSync(runDir)) {
|
|
123
|
+
const m = LOCK_PATTERN.exec(name);
|
|
124
|
+
if (m)
|
|
125
|
+
out.push({ n: Number(m[1]), name });
|
|
126
|
+
}
|
|
127
|
+
return out.sort((a, b) => a.n - b.n);
|
|
128
|
+
}
|
|
129
|
+
/** 持有者是否还在(见文件头的判活规则);判不了的按在处理 */
|
|
130
|
+
function isHolderAlive(holder, probe) {
|
|
131
|
+
const boot = probe.bootId();
|
|
132
|
+
if (holder.bootId !== undefined && boot !== undefined && holder.bootId !== boot)
|
|
133
|
+
return false;
|
|
134
|
+
const ns = probe.pidNs();
|
|
135
|
+
if (holder.pidNs !== undefined && ns !== undefined && holder.pidNs !== ns)
|
|
136
|
+
return true;
|
|
137
|
+
// 锁里记的是本进程的 pid,而本进程还没取过锁:那是 pid 被复用前的上一个进程
|
|
138
|
+
if (holder.pid === probe.pid)
|
|
139
|
+
return false;
|
|
140
|
+
if (!probe.exists(holder.pid))
|
|
141
|
+
return false;
|
|
142
|
+
if (holder.startId === undefined)
|
|
143
|
+
return true;
|
|
144
|
+
const started = probe.startId(holder.pid);
|
|
145
|
+
return started === undefined || started === holder.startId;
|
|
146
|
+
}
|
|
147
|
+
function optional(key, value) {
|
|
148
|
+
return value === undefined ? {} : { [key]: value };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 取实例锁。`handoffToken` 是旧实例 respawn 时交过来的令牌:与锁里的哈希对得上的那份按已交接处理;
|
|
152
|
+
* 否则按持有者死活决定取锁还是报占用。
|
|
153
|
+
*/
|
|
154
|
+
export function acquireInstanceLock(runDir, opts = {}) {
|
|
155
|
+
const probe = opts.probe ?? nodeProcessProbe;
|
|
156
|
+
mkdirSync(runDir, { recursive: true });
|
|
157
|
+
const token = randomBytes(32).toString('hex');
|
|
158
|
+
const mine = {
|
|
159
|
+
pid: probe.pid,
|
|
160
|
+
...optional('startId', probe.startId(probe.pid)),
|
|
161
|
+
...optional('bootId', probe.bootId()),
|
|
162
|
+
...optional('pidNs', probe.pidNs()),
|
|
163
|
+
handoffHash: sha256(token),
|
|
164
|
+
};
|
|
165
|
+
const handedOver = (h) => opts.handoffToken !== undefined && h.handoffHash === sha256(opts.handoffToken);
|
|
166
|
+
/** 活着、又不是把锁交给本进程的那一个 */
|
|
167
|
+
const blocks = (h) => typeof h === 'object' && !handedOver(h) && isHolderAlive(h, probe);
|
|
168
|
+
const temp = join(runDir, `.instance.${probe.pid}.${randomBytes(4).toString('hex')}.tmp`);
|
|
169
|
+
try {
|
|
170
|
+
try {
|
|
171
|
+
writeFileSync(temp, JSON.stringify(mine), { mode: 0o600 });
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
throw new Error(`写不进 ${runDir}:${err.message}`);
|
|
175
|
+
}
|
|
176
|
+
for (;;) {
|
|
177
|
+
const top = generations(runDir).at(-1);
|
|
178
|
+
const next = (top?.n ?? 0) + 1;
|
|
179
|
+
if (top !== undefined) {
|
|
180
|
+
const file = join(runDir, top.name);
|
|
181
|
+
const holder = readHolder(file);
|
|
182
|
+
// 刚被释放:重读一遍
|
|
183
|
+
if (holder === 'gone')
|
|
184
|
+
continue;
|
|
185
|
+
if (blocks(holder))
|
|
186
|
+
return { ok: false, holder, file };
|
|
187
|
+
// 代号到了 2^53 及以上,加一不再变大:link 会一直撞上已有的文件
|
|
188
|
+
if (next <= top.n)
|
|
189
|
+
throw new Error(`锁文件 ${file} 的代号太大,排不出下一代;确认没有实例在运行后删掉它再启动`);
|
|
190
|
+
}
|
|
191
|
+
const file = join(runDir, `instance.${next}.lock`);
|
|
192
|
+
try {
|
|
193
|
+
linkSync(temp, file);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
if (err.code === 'EEXIST')
|
|
197
|
+
continue;
|
|
198
|
+
throw new Error(`建不出锁文件 ${file}(家目录所在的文件系统要支持硬链接):${err.message}`);
|
|
199
|
+
}
|
|
200
|
+
// 更低的代号里还有活着的持有者:让出刚建的这一代(读锁出错时同样先让出再抛)
|
|
201
|
+
const blocker = lowerBlocker(runDir, next, blocks, file);
|
|
202
|
+
if (blocker)
|
|
203
|
+
return { ok: false, ...blocker };
|
|
204
|
+
cleanup(runDir, next, probe);
|
|
205
|
+
return {
|
|
206
|
+
ok: true,
|
|
207
|
+
lock: {
|
|
208
|
+
file,
|
|
209
|
+
handoffToken: token,
|
|
210
|
+
release() {
|
|
211
|
+
try {
|
|
212
|
+
const current = readHolder(file);
|
|
213
|
+
if (typeof current === 'object' && current.handoffHash === mine.handoffHash)
|
|
214
|
+
unlinkSync(file);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
/* 退出路径上不抛:读不了或已被清掉都不再处理 */
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
try {
|
|
226
|
+
unlinkSync(temp);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
/* 删不掉的临时文件过一阵由取到锁的进程清掉 */
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function lowerBlocker(runDir, next, blocks, own) {
|
|
234
|
+
try {
|
|
235
|
+
for (const { n, name } of generations(runDir)) {
|
|
236
|
+
if (n >= next)
|
|
237
|
+
break;
|
|
238
|
+
const file = join(runDir, name);
|
|
239
|
+
const holder = readHolder(file);
|
|
240
|
+
if (!blocks(holder))
|
|
241
|
+
continue;
|
|
242
|
+
unlinkSync(own);
|
|
243
|
+
return { holder, file };
|
|
244
|
+
}
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
try {
|
|
249
|
+
unlinkSync(own);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
/* 已经不在 */
|
|
253
|
+
}
|
|
254
|
+
throw err;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/** 删掉更低代号的锁(此时都已确认不是活着的持有者),以及取锁中途退出留下的旧临时文件 */
|
|
258
|
+
function cleanup(runDir, current, probe) {
|
|
259
|
+
for (const name of readdirSync(runDir)) {
|
|
260
|
+
const lock = LOCK_PATTERN.exec(name);
|
|
261
|
+
const path = join(runDir, name);
|
|
262
|
+
let stale = lock !== null && Number(lock[1]) < current;
|
|
263
|
+
if (!stale && TEMP_PATTERN.test(name)) {
|
|
264
|
+
try {
|
|
265
|
+
stale = probe.now() - statSync(path).mtimeMs > TEMP_STALE_MS;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
stale = false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (!stale)
|
|
272
|
+
continue;
|
|
273
|
+
try {
|
|
274
|
+
unlinkSync(path);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
/* 并发清理时可能已被删掉 */
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=instance-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-lock.js","sourceRoot":"","sources":["../src/instance-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ export declare function warnLikelyPluginMissingKeyword(logger: Logger, name: str
|
|
|
28
28
|
/**
|
|
29
29
|
* 创建一个从项目 node_modules 解析插件的 PluginLoader。
|
|
30
30
|
*
|
|
31
|
-
* @param projectDir
|
|
31
|
+
* @param projectDir 安装集目录(含 package.json 与 node_modules)的绝对路径
|
|
32
32
|
* @param opts.hostCoreDir 宿主那份 @aalis/core 的包目录,默认 {@link HOST_CORE_DIR};插件解析到的 core 与它不同即拒绝加载
|
|
33
33
|
*
|
|
34
34
|
* - `discover()`:读 projectDir/package.json 的 dependencies + optionalDependencies,
|
|
@@ -36,7 +36,7 @@ export declare function warnLikelyPluginMissingKeyword(logger: Logger, name: str
|
|
|
36
36
|
* - `load()`:先经 {@link assertSameCore} 核对 core 是宿主那份,再用 `pathToFileURL(entry).href` 动态 import。
|
|
37
37
|
* - `reload()`:用入口文件 mtime 作 import URL query 强制 ESM 缓存失效。
|
|
38
38
|
*/
|
|
39
|
-
export declare function createNodeModulesPluginLoader(projectDir
|
|
39
|
+
export declare function createNodeModulesPluginLoader(projectDir: string, opts?: {
|
|
40
40
|
hostCoreDir?: string;
|
|
41
41
|
}): PluginLoader;
|
|
42
42
|
//# sourceMappingURL=node-modules-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-modules-loader.d.ts","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node-modules-loader.d.ts","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAyB5E;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAGvE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAY1G;AAuDD;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,GAAG,SAMjC,CAAC;AA0BL;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,gBAAgB,EACtB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAWlC;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMhH;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CA4CnH"}
|
|
@@ -4,6 +4,7 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
4
4
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
5
5
|
import { pluginDefinitionOf } from '@aalis/api-plugin-source';
|
|
6
6
|
import { DefaultLogger } from '@aalis/core';
|
|
7
|
+
import { assertAbsolute } from './home.js';
|
|
7
8
|
// ============================================================
|
|
8
9
|
// NodeModulesPluginLoader —— 从 node_modules 解析并加载插件
|
|
9
10
|
// ============================================================
|
|
@@ -167,7 +168,7 @@ export function warnLikelyPluginMissingKeyword(logger, name, meta) {
|
|
|
167
168
|
/**
|
|
168
169
|
* 创建一个从项目 node_modules 解析插件的 PluginLoader。
|
|
169
170
|
*
|
|
170
|
-
* @param projectDir
|
|
171
|
+
* @param projectDir 安装集目录(含 package.json 与 node_modules)的绝对路径
|
|
171
172
|
* @param opts.hostCoreDir 宿主那份 @aalis/core 的包目录,默认 {@link HOST_CORE_DIR};插件解析到的 core 与它不同即拒绝加载
|
|
172
173
|
*
|
|
173
174
|
* - `discover()`:读 projectDir/package.json 的 dependencies + optionalDependencies,
|
|
@@ -175,15 +176,18 @@ export function warnLikelyPluginMissingKeyword(logger, name, meta) {
|
|
|
175
176
|
* - `load()`:先经 {@link assertSameCore} 核对 core 是宿主那份,再用 `pathToFileURL(entry).href` 动态 import。
|
|
176
177
|
* - `reload()`:用入口文件 mtime 作 import URL query 强制 ESM 缓存失效。
|
|
177
178
|
*/
|
|
178
|
-
export function createNodeModulesPluginLoader(projectDir
|
|
179
|
-
|
|
179
|
+
export function createNodeModulesPluginLoader(projectDir, opts = {}) {
|
|
180
|
+
assertAbsolute('安装集目录', projectDir);
|
|
181
|
+
const root = projectDir;
|
|
180
182
|
const hostCoreDir = opts.hostCoreDir === undefined ? HOST_CORE_DIR : realpathSync(opts.hostCoreDir);
|
|
181
183
|
const logger = new DefaultLogger('aalis:loader');
|
|
182
184
|
return {
|
|
183
185
|
async discover() {
|
|
184
186
|
const rootPkg = readJson(resolve(root, 'package.json'));
|
|
185
|
-
if (!rootPkg)
|
|
187
|
+
if (!rootPkg) {
|
|
188
|
+
logger.warn(`安装集 ${root} 里没有可读的 package.json,没有可加载的插件`);
|
|
186
189
|
return [];
|
|
190
|
+
}
|
|
187
191
|
const deps = {
|
|
188
192
|
...(rootPkg.dependencies ?? {}),
|
|
189
193
|
...(rootPkg.optionalDependencies ?? {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-modules-loader.js","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"node-modules-loader.js","sourceRoot":"","sources":["../src/node-modules-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,+DAA+D;AAC/D,oDAAoD;AACpD,+DAA+D;AAC/D,EAAE;AACF,kDAAkD;AAClD,wEAAwE;AACxE,4EAA4E;AAC5E,wCAAwC;AACxC,EAAE;AACF,iBAAiB;AACjB,qDAAqD;AACrD,uFAAuF;AACvF,8FAA8F;AAC9F,sGAAsG;AAEtG,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAA4B,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA6B;IAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,QAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,OAAO,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAW,EAAE,OAAe,EAAE,MAAc;IAC/E,MAAM,GAAG,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CACT,OAAO,OAAO,kEAAkE,CACjF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,QAAQ,OAAO,iBAAiB,GAAG,CAAC,IAAI,kCAAkC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAa,EAAE,IAAY;IACjD,KAAK,IAAI,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,GAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM;IACN,QAAQ;IACR,SAAS;IACT,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5D,CAAC,CAAC;AAEH,0DAA0D;AAC1D,SAAS,YAAY,CAAC,MAAe;IACnC,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9G,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC;AAEvG;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAW,EAAE,IAA6B;IAC9D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,8DAA8D;QAC9D,MAAM,QAAQ,GACZ,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9G,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAE,OAAmC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC5F,OAAO,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,OAAO,CAAC,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAuB,CAAC,GAAG,EAAE;IACrD,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,WAA+B,EAAE,SAAkB,EAAE,UAAkB;IAC7F,IAAI,CAAC,WAAW,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO;IAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO;IAC9C,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC;IAChG,MAAM,IAAI,KAAK,CACb,OAAO,UAAU,wBAAwB,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI;QACpE,SAAS,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,qBAAqB;QACjE,6GAA6G;QAC7G,qDAAqD,CACxD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAsB,EACtB,WAA+B,EAC/B,MAAc,EACd,KAAc;IAEd,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAc,EAAE,IAAY,EAAE,IAA6B;IACxG,MAAM,KAAK,GAAG,EAAE,GAAI,IAAI,CAAC,gBAA2B,EAAE,GAAI,IAAI,CAAC,YAAuB,EAAE,CAAC;IACzF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,QAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,IAAI,aAAa,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,4DAA4D,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,6BAA6B,CAAC,UAAkB,EAAE,OAAiC,EAAE;IACnG,cAAc,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,cAAc,CAAC,CAAC;IAEjD,OAAO;QACL,KAAK,CAAC,QAAQ;YACZ,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,+BAA+B,CAAC,CAAC;gBACxD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,GAAG;gBACX,GAAG,CAAE,OAAO,CAAC,YAAuC,IAAI,EAAE,CAAC;gBAC3D,GAAG,CAAE,OAAO,CAAC,oBAA+C,IAAI,EAAE,CAAC;aACpE,CAAC;YAEF,MAAM,UAAU,GAAuB,EAAE,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,UAAU;gBACV,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,8BAA8B,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBAClD,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CACT,OAAO,GAAG,2EAA2E,CACtF,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAG,IAAI,CAAC,IAAe,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC;QACtE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC;KACxE,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { HostConfig } from '@aalis/api-host-config';
|
|
2
1
|
import type { PluginSourceService } from '@aalis/api-plugin-source';
|
|
3
2
|
import { type App, type PluginDefinition } from '@aalis/core';
|
|
3
|
+
import type { ConfigStore } from './config-store.js';
|
|
4
4
|
/**
|
|
5
5
|
* 已发现但尚未导入的插件条目。`source` 是 loader 自己理解的字符串
|
|
6
6
|
* (fs loader 用绝对路径,URL loader 用 URL,内存 loader 用 module 别名)。
|
|
@@ -35,8 +35,13 @@ export interface PluginDiscovery extends PluginSourceService {
|
|
|
35
35
|
registerConfiguredInstances(): Promise<void>;
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
38
|
+
* 模块在注册表里的定义:主实例在册取主实例的,否则取同模块任一在册实例的(主实例已卸载、后缀实例还在时)。
|
|
39
|
+
* 由配置段定义、还没登记的后缀实例按它登记或新建:热重载登记、配置同步与 host-config 新建实例同一判据
|
|
40
40
|
*/
|
|
41
|
-
export declare function
|
|
41
|
+
export declare function moduleDefinitionOf(app: App, moduleName: string): PluginDefinition | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* @param doc 配置文档:登记时按实例 id 取配置(解析密钥引用后交给 core)与禁用标记,并从中枚举 `name:suffix` 实例。
|
|
44
|
+
* 默认值回填与密钥拆出由加载器一侧的政策(withPluginConfigSync)先写进文档。
|
|
45
|
+
*/
|
|
46
|
+
export declare function createPluginDiscovery(app: App, loader: PluginLoader, doc: Pick<ConfigStore, 'get' | 'isPluginDisabled' | 'resolvePluginConfig'>): PluginDiscovery;
|
|
42
47
|
//# sourceMappingURL=plugin-discovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-discovery.d.ts","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin-discovery.d.ts","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAA4C,MAAM,aAAa,CAAC;AACxG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAarD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,gCAAgC;IAChC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB;;;OAGG;IACH,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAS7F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,kBAAkB,GAAG,qBAAqB,CAAC,GACzE,eAAe,CA2FjB"}
|
package/dist/plugin-discovery.js
CHANGED
|
@@ -1,16 +1,34 @@
|
|
|
1
1
|
import { parseInstanceId } from '@aalis/core';
|
|
2
|
+
import { describeDangling } from './secrets.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
4
|
+
* 模块在注册表里的定义:主实例在册取主实例的,否则取同模块任一在册实例的(主实例已卸载、后缀实例还在时)。
|
|
5
|
+
* 由配置段定义、还没登记的后缀实例按它登记或新建:热重载登记、配置同步与 host-config 新建实例同一判据
|
|
6
|
+
*/
|
|
7
|
+
export function moduleDefinitionOf(app, moduleName) {
|
|
8
|
+
const main = app.plugins.getPlugin(moduleName)?.definition;
|
|
9
|
+
if (main)
|
|
10
|
+
return main;
|
|
11
|
+
for (const status of app.plugins.getStatus()) {
|
|
12
|
+
if (status.name !== moduleName)
|
|
13
|
+
continue;
|
|
14
|
+
const definition = app.plugins.getPlugin(status.instanceId)?.definition;
|
|
15
|
+
if (definition)
|
|
16
|
+
return definition;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @param doc 配置文档:登记时按实例 id 取配置(解析密钥引用后交给 core)与禁用标记,并从中枚举 `name:suffix` 实例。
|
|
22
|
+
* 默认值回填与密钥拆出由加载器一侧的政策(withPluginConfigSync)先写进文档。
|
|
5
23
|
*/
|
|
6
24
|
export function createPluginDiscovery(app, loader, doc) {
|
|
7
25
|
const log = app.logger;
|
|
8
|
-
const registration = (definition, instanceId = definition.name) =>
|
|
9
|
-
definition
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
disabled: doc.isPluginDisabled(instanceId)
|
|
13
|
-
}
|
|
26
|
+
const registration = (definition, instanceId = definition.name) => {
|
|
27
|
+
const { config, dangling } = doc.resolvePluginConfig(instanceId, definition.configSchema);
|
|
28
|
+
if (dangling.length > 0)
|
|
29
|
+
log.error(describeDangling(instanceId, dangling));
|
|
30
|
+
return { definition, instanceId, config, disabled: doc.isPluginDisabled(instanceId) };
|
|
31
|
+
};
|
|
14
32
|
/** 导入一批描述符并备好各自的登记项;单个失败(含 id 撞上危险键、文档拒取)只记该条,不拖累其余 */
|
|
15
33
|
async function importAll(descriptors, fresh) {
|
|
16
34
|
const loaded = [];
|
|
@@ -93,14 +111,8 @@ export function createPluginDiscovery(app, loader, doc) {
|
|
|
93
111
|
return names;
|
|
94
112
|
},
|
|
95
113
|
async registerConfiguredInstances() {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const definition = app.plugins.getPlugin(instanceId)?.definition;
|
|
99
|
-
// 主实例的定义优先;主实例已卸载时用同模块任一在册实例的,与冷启动时这一段照常登记一致
|
|
100
|
-
if (definition && (instanceId === name || !known.has(name)))
|
|
101
|
-
known.set(name, definition);
|
|
102
|
-
}
|
|
103
|
-
await app.pluginAll(configuredInstances(name => known.get(name)));
|
|
114
|
+
// 主实例已卸载时用同模块任一在册实例的定义,与冷启动时这一段照常登记一致
|
|
115
|
+
await app.pluginAll(configuredInstances(name => moduleDefinitionOf(app, name)));
|
|
104
116
|
},
|
|
105
117
|
};
|
|
106
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-discovery.js","sourceRoot":"","sources":["../src/plugin-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/providers.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AalisConfig } from '@aalis/api-host-config';
|
|
2
2
|
import type { RestartStrategy } from '@aalis/core';
|
|
3
|
-
import type { ConfigProvider } from './config-store.js';
|
|
3
|
+
import type { ConfigProvider, SecretProvider } from './config-store.js';
|
|
4
4
|
import type { PluginLoader } from './plugin-discovery.js';
|
|
5
5
|
interface FsYamlConfigProviderResult {
|
|
6
6
|
/** 当前快照(交给 `createConfigStore(config, provider)` 作初始文档) */
|
|
@@ -9,24 +9,34 @@ interface FsYamlConfigProviderResult {
|
|
|
9
9
|
provider: ConfigProvider;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* 创建一个基于 YAML 文件的 ConfigProvider
|
|
12
|
+
* 创建一个基于 YAML 文件的 ConfigProvider。`absPath` 是配置文件的绝对路径(startAalis 传家目录里的 aalis.config.yaml)。
|
|
13
13
|
*
|
|
14
|
-
* - 同步读取 +
|
|
15
|
-
* - `save()`
|
|
16
|
-
* - `watch()`
|
|
17
|
-
* 并通过与 `rawYaml` 的内容比对去重,避免自激;拒写之后的下一次变更不去重;武装后立即对账一次
|
|
14
|
+
* - 同步读取 + 解析(值原样加载,不做任何替换);文件不存在时告警并以内存默认配置启动
|
|
15
|
+
* - `save()` 原子写回;写前比对盘上内容,有尚未生效的外部修改时拒写(抛 `ConfigSaveRefusedError`,只带路径)
|
|
16
|
+
* - `watch()` 监听配置文件所在目录(按文件名过滤)+ 300ms 去抖,按内容比对去重,避免自激;武装后立即对账一次
|
|
18
17
|
*
|
|
19
|
-
*
|
|
18
|
+
* 读写与监听的细节见 {@link openYamlFile},与密钥文件共用。
|
|
20
19
|
*/
|
|
21
|
-
export declare function createFsYamlConfigProvider(
|
|
20
|
+
export declare function createFsYamlConfigProvider(absPath: string): FsYamlConfigProviderResult;
|
|
21
|
+
interface FsSecretsProviderResult {
|
|
22
|
+
/** 当前的键值(交给 `createConfigStore` 的 `secrets.values`) */
|
|
23
|
+
values: Record<string, unknown>;
|
|
24
|
+
provider: SecretProvider;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 创建基于家目录 `secrets.yaml` 的密钥存储:顶层是「键 → 值」的映射。读写、拒写与监听同配置文件,
|
|
28
|
+
* 另有三处不同:文件不存在时按空映射处理、不告警(第一次保存时建出);运行中改成空文件或只剩注释时按空映射处理;
|
|
29
|
+
* 原子写的临时文件一律以 0600 创建,不沿用原文件的权限位。
|
|
30
|
+
*/
|
|
31
|
+
export declare function createFsSecretsProvider(absPath: string): FsSecretsProviderResult;
|
|
22
32
|
/**
|
|
23
|
-
* 创建一个基于 packages 目录扫描的 PluginLoader
|
|
33
|
+
* 创建一个基于 packages 目录扫描的 PluginLoader。`rootDir` 是 packages 目录的绝对路径(源码形态的入口传 `<仓库>/packages`)。
|
|
24
34
|
*
|
|
25
35
|
* - `discover()`:读 dir 下每个子目录的 package.json,按 aalis-plugin 关键词收录可加载插件
|
|
26
36
|
* - `load()`:先经 assertSameCore 核对 core 是宿主那份,再用 `pathToFileURL(entry).href` 动态 import
|
|
27
37
|
* - `reload()`:用入口文件 mtime 作为 import URL 的 query 强制 ESM 缓存失效
|
|
28
38
|
*/
|
|
29
|
-
export declare function createFsPluginLoader(
|
|
39
|
+
export declare function createFsPluginLoader(rootDir: string): PluginLoader;
|
|
30
40
|
/** 子进程 `app.start()` 成功后经 IPC 回传的握手消息。 */
|
|
31
41
|
export declare const READY_MESSAGE = "aalis:ready";
|
|
32
42
|
/**
|
|
@@ -64,6 +74,12 @@ export interface RestartRollback {
|
|
|
64
74
|
/** 判定不透明的 rollback 透传值是否是可用的凭据(core 不解释形状,由本层校验)。 */
|
|
65
75
|
export declare function isRestartRollback(v: unknown): v is RestartRollback;
|
|
66
76
|
export interface RespawnOptions {
|
|
77
|
+
/** 安装集目录:开发模式(.ts 入口)在这里找本地 tsx */
|
|
78
|
+
appDir: string;
|
|
79
|
+
/** 新进程的 cwd:启动时的 cwd,命令行里相对的 --home 才能解析到同一处 */
|
|
80
|
+
cwd: string;
|
|
81
|
+
/** 额外交给新进程的环境变量(实例锁的交接令牌) */
|
|
82
|
+
env?: Record<string, string>;
|
|
67
83
|
/**
|
|
68
84
|
* 等待子进程 IPC ready 的超时(毫秒,默认 30000)。
|
|
69
85
|
*
|
|
@@ -73,10 +89,19 @@ export interface RespawnOptions {
|
|
|
73
89
|
readyTimeoutMs?: number;
|
|
74
90
|
}
|
|
75
91
|
/** 组装重生用的 exec + argv。分离出来是为了单测覆盖 execArgv 保留。 */
|
|
76
|
-
export declare function buildRespawnCommand(argv?: readonly string[], execArgv?: readonly string[]
|
|
92
|
+
export declare function buildRespawnCommand(appDir: string, argv?: readonly string[], execArgv?: readonly string[]): {
|
|
77
93
|
exec: string;
|
|
78
94
|
args: string[];
|
|
79
95
|
};
|
|
96
|
+
/** 服务形态下重启以这个退出码结束:服务管理器(launchd 的 KeepAlive={SuccessfulExit=false}、systemd 的 Restart=on-failure)据此重新拉起 */
|
|
97
|
+
export declare const SERVICE_RESTART_EXIT_CODE = 75;
|
|
98
|
+
/**
|
|
99
|
+
* 服务形态的重启策略:停掉 App 后以 {@link SERVICE_RESTART_EXIT_CODE} 退出,由服务管理器拉起新进程,
|
|
100
|
+
* 新进程取锁时本进程的锁已随退出释放。不自己 spawn:detached 的新进程会脱离服务管理器的监管
|
|
101
|
+
* (launchd 不再看着它,systemd 随 cgroup 把它一起杀掉)。
|
|
102
|
+
* 服务形态下没有「新版起不来就回滚」:带回滚凭据的重启(市场更新)照常退出,并记一条说明。
|
|
103
|
+
*/
|
|
104
|
+
export declare function createServiceRestartStrategy(): RestartStrategy;
|
|
80
105
|
/**
|
|
81
106
|
* Node 进程重启策略:spawn 一个 detached 子进程接管,确认其起得来后再退出当前进程。
|
|
82
107
|
*
|
|
@@ -99,6 +124,6 @@ export declare function buildRespawnCommand(argv?: readonly string[], execArgv?:
|
|
|
99
124
|
*
|
|
100
125
|
* 对 .ts 入口(开发模式)会优先使用本地 `tsx` 二进制。
|
|
101
126
|
*/
|
|
102
|
-
export declare function createProcessRespawnStrategy(opts
|
|
127
|
+
export declare function createProcessRespawnStrategy(opts: RespawnOptions): RestartStrategy;
|
|
103
128
|
export {};
|
|
104
129
|
//# sourceMappingURL=providers.d.ts.map
|
package/dist/providers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAInD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQxE,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAoD5E,UAAU,0BAA0B;IAClC,2DAA2D;IAC3D,MAAM,EAAE,WAAW,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,0BAA0B,CAgBtF;AAED,UAAU,uBAAuB;IAC/B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB,CAWhF;AAMD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CA4ClE;AAMD,0CAA0C;AAC1C,eAAO,MAAM,aAAa,gBAAgB,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC3E;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAGlE;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,SAAS,MAAM,EAAiB,EACtC,QAAQ,GAAE,SAAS,MAAM,EAAqB,GAC7C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAYlC;AAED,2GAA2G;AAC3G,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,eAAe,CAoB9D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAkHlF"}
|