@aalis/runtime 0.15.1 → 0.17.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 +47 -12
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +446 -60
- package/dist/config-store.js.map +1 -1
- package/dist/config-sync.d.ts +22 -8
- package/dist/config-sync.d.ts.map +1 -1
- package/dist/config-sync.js +86 -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 +236 -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 +282 -0
- package/dist/instance-lock.js.map +1 -0
- package/dist/locales/en.d.ts +16 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +16 -0
- package/dist/locales/en.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 +107 -232
- package/dist/providers.js.map +1 -1
- package/dist/secrets.d.ts +47 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +108 -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 +174 -48
- package/dist/start.js.map +1 -1
- package/dist/subcommand.d.ts.map +1 -1
- package/dist/subcommand.js +2 -2
- package/dist/subcommand.js.map +1 -1
- package/dist/texts.d.ts +31 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +21 -0
- package/dist/texts.js.map +1 -0
- package/dist/yaml-file.d.ts +36 -0
- package/dist/yaml-file.d.ts.map +1 -0
- package/dist/yaml-file.js +220 -0
- package/dist/yaml-file.js.map +1 -0
- package/package.json +14 -7
package/dist/config-store.js
CHANGED
|
@@ -1,31 +1,72 @@
|
|
|
1
1
|
// ============================================================
|
|
2
|
-
// config-store —— 宿主配置文档(内存态 + 危险键闸 +
|
|
2
|
+
// config-store —— 宿主配置文档(内存态 + 危险键闸 + 落盘委托)、密钥存储与 host-config 服务
|
|
3
3
|
//
|
|
4
4
|
// 运行态(实例配置、禁用态、服务偏好)在 core;本模块持「下次启动用什么」的文档:
|
|
5
|
-
// -
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// - 启动:宿主从文档取每个实例的配置(解析密钥引用后)与禁用标记交给 app.pluginAll,偏好(全局与本插件)经根绑定
|
|
6
|
+
// services.prefer 应用,热重载时按改动前后的文档对账;
|
|
7
|
+
// - 运行:改插件配置经 host-config 的 applyPluginConfig 一步完成;启停、偏好等管理动作只改运行态,
|
|
8
|
+
// 要跨重启保留的调用方经 host-config 自己写文档并 save()。
|
|
9
|
+
// 文档是文档形态:schema 里 `secret: true` 的字段只放引用 `{ $secret: '<键>' }`,值在密钥存储里(见 secrets.ts)。
|
|
10
|
+
// 本模块不碰文件:持久化与外部变更监听由注入的 provider 完成。
|
|
8
11
|
// ============================================================
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
13
|
+
import { doctor } from '@aalis/api-doctor';
|
|
14
|
+
import { hostConfig, isConfigSaveRefused, } from '@aalis/api-host-config';
|
|
15
|
+
import { events, parseInstanceId, provide, services, } from '@aalis/core';
|
|
16
|
+
import { CORE_CONFIG_SCHEMA, cloneConfigObject, defaultsFrom, isSessionField, isUnsafeConfigKey, } from '@aalis/schema-config';
|
|
17
|
+
import { TextError } from '@aalis/schema-i18n';
|
|
18
|
+
import { configToReload } from './config-sync.js';
|
|
19
|
+
import { moduleDefinitionOf } from './plugin-discovery.js';
|
|
20
|
+
import { describeDangling, plainSecretPaths, referencedKeys, resolveSecrets, secretPlaces, splitSecrets, } from './secrets.js';
|
|
21
|
+
import { t } from './texts.js';
|
|
12
22
|
/**
|
|
13
23
|
* 插件 id 不得当 `plugins` / 禁用名单的对象键——那三条会落到原型链。
|
|
14
24
|
* 按 id 取放的入口共用这一抛错,文案给 WebUI 映射 400。
|
|
15
25
|
*/
|
|
16
26
|
function assertSafePluginId(id) {
|
|
17
27
|
if (isUnsafeConfigKey(id))
|
|
18
|
-
throw new
|
|
28
|
+
throw new TextError(t('unsafePluginId', { id }));
|
|
19
29
|
}
|
|
20
|
-
|
|
30
|
+
/**
|
|
31
|
+
* @param secrets 宿主的密钥存储;不给时没有密钥存储(嵌入式宿主、只在内存里的配置),密钥照旧以明文留在文档里
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* 写进文档的值(set 与 setPluginConfig 共用):整份深复制,调用方之后改入参写不穿文档,函数这类复制不了的值在这里就抛给
|
|
35
|
+
* 写入方;再按配置拷贝规则滤掉落到原型链的键,外来对象(WebUI 请求体、工具参数)里 JSON 解出的 __proto__ 等不进文档
|
|
36
|
+
*/
|
|
37
|
+
function intoDocument(value) {
|
|
38
|
+
return cloneConfigObject({ value: structuredClone(value) }).value;
|
|
39
|
+
}
|
|
40
|
+
export function createConfigStore(initial, provider, secrets) {
|
|
41
|
+
// 配置会落盘、密钥却不能:引用写进文件,值只在内存里,重启后全部落空
|
|
42
|
+
if (secrets && !secrets.provider?.save && provider?.save) {
|
|
43
|
+
throw new Error('The config document is persisted but the secret store cannot save, so references would be lost after a restart: give the secret store a provider that can save, or give no secret store');
|
|
44
|
+
}
|
|
21
45
|
let config = normalize(initial);
|
|
22
|
-
|
|
46
|
+
// 配置文件上的那一份(最后读入或写出的):密钥文件拒写之后按文件对账时,文档退回这一份
|
|
47
|
+
let fileDoc = snapshot(config);
|
|
48
|
+
let values = secretMap(secrets?.values ?? {});
|
|
49
|
+
// 已提交、还没写进密钥文件的值:密钥文件在这期间被外部改动重新读入时并进新内容,文档里的引用可能正指着它们
|
|
50
|
+
const pending = new Map();
|
|
51
|
+
// 密钥文件拒写过:下一次密钥文件变更按文件对账,不再并进 pending(见 watch)。refusedGen 是拒写的代数:
|
|
52
|
+
// 写成的那次保存只在它写盘期间没有新的拒写时清标志,并发的另一次保存被拒时标志留着
|
|
53
|
+
let secretsRefused = false;
|
|
54
|
+
let refusedGen = 0;
|
|
55
|
+
// 宿主经自己的写入换掉、删掉或新建的键:文档落盘之后,不再被任何配置引用的就从密钥存储里删掉。
|
|
56
|
+
// 手改配置文件不经这里,不触发删除;手加进 secrets.yaml 还没被引用的键也不在其中
|
|
57
|
+
const orphanCandidates = new Set();
|
|
58
|
+
const unwatchFns = [];
|
|
23
59
|
let onChangeCallback = null;
|
|
60
|
+
const markReplaced = (instanceId) => {
|
|
61
|
+
if (Object.hasOwn(config.plugins, instanceId))
|
|
62
|
+
referencedKeys(config.plugins[instanceId], orphanCandidates);
|
|
63
|
+
};
|
|
24
64
|
const store = {
|
|
65
|
+
hasSecretStore: secrets !== undefined,
|
|
25
66
|
get: key => config[key],
|
|
26
67
|
getAll: () => config,
|
|
27
68
|
set: (key, value) => {
|
|
28
|
-
config[key] = value;
|
|
69
|
+
config[key] = intoDocument(value);
|
|
29
70
|
},
|
|
30
71
|
getPluginConfig(instanceId) {
|
|
31
72
|
assertSafePluginId(instanceId);
|
|
@@ -33,11 +74,12 @@ export function createConfigStore(initial, provider) {
|
|
|
33
74
|
},
|
|
34
75
|
setPluginConfig(instanceId, next) {
|
|
35
76
|
assertSafePluginId(instanceId);
|
|
36
|
-
|
|
37
|
-
config.plugins[instanceId] =
|
|
77
|
+
markReplaced(instanceId);
|
|
78
|
+
config.plugins[instanceId] = intoDocument(next);
|
|
38
79
|
},
|
|
39
80
|
removePluginConfig(instanceId) {
|
|
40
81
|
assertSafePluginId(instanceId);
|
|
82
|
+
markReplaced(instanceId);
|
|
41
83
|
delete config.plugins[instanceId];
|
|
42
84
|
},
|
|
43
85
|
isPluginDisabled(instanceId) {
|
|
@@ -53,87 +95,427 @@ export function createConfigStore(initial, provider) {
|
|
|
53
95
|
else if (!enabled && idx < 0)
|
|
54
96
|
config.disabledPlugins.push(instanceId);
|
|
55
97
|
},
|
|
56
|
-
getServicePreferences:
|
|
57
|
-
setServicePreference(name, contextId) {
|
|
98
|
+
getServicePreferences: scope => preferencesIn(config, scope) ?? {},
|
|
99
|
+
setServicePreference(name, contextId, scope) {
|
|
58
100
|
if (isUnsafeConfigKey(name))
|
|
59
101
|
return;
|
|
60
|
-
config
|
|
61
|
-
|
|
102
|
+
let prefs = preferencesIn(config, scope);
|
|
103
|
+
if (!prefs) {
|
|
104
|
+
prefs = {};
|
|
105
|
+
if (scope?.for === undefined)
|
|
106
|
+
config.servicePreferences = prefs;
|
|
107
|
+
else
|
|
108
|
+
config.pluginServicePreferences = { ...config.pluginServicePreferences, [scope.for]: prefs };
|
|
109
|
+
}
|
|
110
|
+
prefs[name] = contextId;
|
|
62
111
|
},
|
|
63
|
-
removeServicePreference(name) {
|
|
64
|
-
|
|
112
|
+
removeServicePreference(name, scope) {
|
|
113
|
+
const prefs = preferencesIn(config, scope);
|
|
114
|
+
if (!prefs || isUnsafeConfigKey(name))
|
|
65
115
|
return;
|
|
66
|
-
delete
|
|
116
|
+
delete prefs[name];
|
|
117
|
+
// 本插件偏好删空了就整段去掉,文件里不留空段
|
|
118
|
+
if (scope?.for !== undefined && Object.keys(prefs).length === 0)
|
|
119
|
+
delete config.pluginServicePreferences?.[scope.for];
|
|
120
|
+
},
|
|
121
|
+
resolvePluginConfig(instanceId, schema, doc, staged) {
|
|
122
|
+
const source = doc ?? store.getPluginConfig(instanceId);
|
|
123
|
+
const resolved = resolveSecrets(schema, source, key => {
|
|
124
|
+
if (staged?.has(key))
|
|
125
|
+
return { value: staged.get(key) };
|
|
126
|
+
return values.has(key) ? { value: values.get(key) } : undefined;
|
|
127
|
+
});
|
|
128
|
+
return { ...resolved, config: withoutSessionFields(schema, resolved.config) };
|
|
67
129
|
},
|
|
68
|
-
|
|
130
|
+
splitPluginSecrets(instanceId, schema, submitted, base) {
|
|
131
|
+
if (!secrets)
|
|
132
|
+
return { doc: submitted, writes: new Map(), placed: [] };
|
|
133
|
+
const inUse = referencedKeys(config.plugins);
|
|
134
|
+
referencedKeys(submitted, inUse);
|
|
135
|
+
return splitSecrets(schema, instanceId, submitted, base ?? store.getPluginConfig(instanceId), key => {
|
|
136
|
+
return inUse.has(key) || values.has(key);
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
commitSecrets(writes) {
|
|
140
|
+
if (writes.size === 0)
|
|
141
|
+
return () => { };
|
|
142
|
+
const before = new Map();
|
|
143
|
+
for (const [key, value] of writes) {
|
|
144
|
+
before.set(key, {
|
|
145
|
+
stored: values.has(key) ? { value: values.get(key) } : undefined,
|
|
146
|
+
pending: pending.has(key) ? { value: pending.get(key) } : undefined,
|
|
147
|
+
});
|
|
148
|
+
values.set(key, value);
|
|
149
|
+
pending.set(key, value);
|
|
150
|
+
// 新写入的键同样是候选:落盘时还有人引用就留着,没人引用了(文件对账回退、被后来的写入顶掉)就删
|
|
151
|
+
orphanCandidates.add(key);
|
|
152
|
+
}
|
|
153
|
+
return () => {
|
|
154
|
+
for (const [key, prev] of before) {
|
|
155
|
+
if (prev.stored)
|
|
156
|
+
values.set(key, prev.stored.value);
|
|
157
|
+
else
|
|
158
|
+
values.delete(key);
|
|
159
|
+
if (prev.pending)
|
|
160
|
+
pending.set(key, prev.pending.value);
|
|
161
|
+
else
|
|
162
|
+
pending.delete(key);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
// async:同步 provider 的抛错也以拒绝传出,调用方统一经 Promise 接住。
|
|
167
|
+
// 先写密钥再写文档:文档里的引用落盘时,它指向的键已经在盘上
|
|
69
168
|
persist: async () => {
|
|
169
|
+
const secretProvider = secrets?.provider;
|
|
170
|
+
if (pending.size > 0 && secretProvider?.save) {
|
|
171
|
+
// 写盘途中可能有新的提交:写成后只清掉这次写出去、之后没再改过的
|
|
172
|
+
const flushing = new Map(pending);
|
|
173
|
+
const gen = refusedGen;
|
|
174
|
+
try {
|
|
175
|
+
await secretProvider.save(Object.fromEntries(values));
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
if (isConfigSaveRefused(err)) {
|
|
179
|
+
refusedGen++;
|
|
180
|
+
secretsRefused = true;
|
|
181
|
+
}
|
|
182
|
+
throw err;
|
|
183
|
+
}
|
|
184
|
+
// 写成了:盘上已是内存里的内容,不必再按文件对账(文件被原样改回后保存就会走到这里)
|
|
185
|
+
if (refusedGen === gen)
|
|
186
|
+
secretsRefused = false;
|
|
187
|
+
for (const [key, value] of flushing)
|
|
188
|
+
if (pending.get(key) === value)
|
|
189
|
+
pending.delete(key);
|
|
190
|
+
}
|
|
70
191
|
if (!provider?.save)
|
|
71
192
|
return false;
|
|
193
|
+
// 写出的这一份在交给 provider 时定格:落盘途中文档可能又被改过
|
|
194
|
+
const written = snapshot(config);
|
|
72
195
|
await provider.save(config);
|
|
196
|
+
fileDoc = written;
|
|
197
|
+
// 孤儿键在文档写成之后删:没写成时盘上的旧文档可能还引用着它们。主配置已经写成,这一步写密钥失败
|
|
198
|
+
// 不让保存报错,删掉的键放回去,下次保存再删
|
|
199
|
+
if (orphanCandidates.size > 0 && secretProvider?.save) {
|
|
200
|
+
const onDisk = referencedKeys(written.plugins);
|
|
201
|
+
const live = referencedKeys(config.plugins);
|
|
202
|
+
const removed = new Map();
|
|
203
|
+
for (const key of orphanCandidates) {
|
|
204
|
+
// 刚写出的文档与内存文档对它的引用不一致(落盘途中才去掉或才引用的):留作候选,下次落盘后再判
|
|
205
|
+
if (onDisk.has(key) !== live.has(key))
|
|
206
|
+
continue;
|
|
207
|
+
orphanCandidates.delete(key);
|
|
208
|
+
if (live.has(key) || !values.has(key))
|
|
209
|
+
continue;
|
|
210
|
+
removed.set(key, values.get(key));
|
|
211
|
+
values.delete(key);
|
|
212
|
+
}
|
|
213
|
+
if (removed.size > 0) {
|
|
214
|
+
try {
|
|
215
|
+
await secretProvider.save(Object.fromEntries(values));
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
for (const [key, value] of removed) {
|
|
219
|
+
values.set(key, value);
|
|
220
|
+
orphanCandidates.add(key);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
73
225
|
return true;
|
|
74
226
|
},
|
|
75
227
|
watch(onChange) {
|
|
76
228
|
if (onChangeCallback)
|
|
77
|
-
throw new Error('
|
|
229
|
+
throw new Error('Only one config change subscriber is supported; unwatch before subscribing again');
|
|
78
230
|
onChangeCallback = onChange;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
231
|
+
const configWatch = provider?.watch?.(next => {
|
|
232
|
+
const previous = config;
|
|
233
|
+
config = normalize(next);
|
|
234
|
+
fileDoc = snapshot(config);
|
|
235
|
+
onChangeCallback?.(previous);
|
|
236
|
+
});
|
|
237
|
+
if (configWatch)
|
|
238
|
+
unwatchFns.push(configWatch);
|
|
239
|
+
const secretsWatch = secrets?.provider?.watch?.(next => {
|
|
240
|
+
const previous = config;
|
|
241
|
+
values = secretMap(next);
|
|
242
|
+
if (secretsRefused) {
|
|
243
|
+
// 拒写之后的这次变更按文件对账,同主配置拒写:没写成的密钥作废,与它们一起改的文档退回配置文件上那一份。
|
|
244
|
+
// 配置不落盘的宿主没有那一份,文档不动
|
|
245
|
+
secretsRefused = false;
|
|
246
|
+
pending.clear();
|
|
247
|
+
if (provider?.save)
|
|
248
|
+
config = snapshot(fileDoc);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
for (const [key, value] of pending)
|
|
252
|
+
values.set(key, value);
|
|
253
|
+
}
|
|
254
|
+
onChangeCallback?.(previous);
|
|
255
|
+
});
|
|
256
|
+
if (secretsWatch)
|
|
257
|
+
unwatchFns.push(secretsWatch);
|
|
84
258
|
return () => store.unwatch();
|
|
85
259
|
},
|
|
86
260
|
unwatch() {
|
|
87
|
-
|
|
88
|
-
|
|
261
|
+
for (const fn of unwatchFns.splice(0))
|
|
262
|
+
fn();
|
|
89
263
|
onChangeCallback = null;
|
|
90
264
|
},
|
|
91
265
|
};
|
|
92
266
|
return store;
|
|
93
267
|
}
|
|
94
268
|
/**
|
|
95
|
-
*
|
|
96
|
-
|
|
269
|
+
* 实例的定义:已登记的取它自己的;没登记的后缀实例取同模块在册实例的(见 moduleDefinitionOf),模块需声明 reusable
|
|
270
|
+
*/
|
|
271
|
+
function definitionOf(app, instanceId) {
|
|
272
|
+
const own = app.plugins.getPlugin(instanceId)?.definition;
|
|
273
|
+
if (own)
|
|
274
|
+
return own;
|
|
275
|
+
const { moduleName, suffix } = parseInstanceId(instanceId);
|
|
276
|
+
if (!suffix)
|
|
277
|
+
return undefined;
|
|
278
|
+
const found = moduleDefinitionOf(app, moduleName);
|
|
279
|
+
return found?.reusable ? found : undefined;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 文档里引用了 `keys` 中任一键的已登记实例,按解析后的新值重载(解析结果与运行态相同的不动)。
|
|
283
|
+
* 改了被共用的密钥之后,共用它的实例跟着换上新值。
|
|
284
|
+
*/
|
|
285
|
+
async function reloadSecretSharers(app, store, keys, except) {
|
|
286
|
+
if (keys.size === 0)
|
|
287
|
+
return;
|
|
288
|
+
for (const status of app.plugins.getStatus()) {
|
|
289
|
+
if (status.instanceId === except)
|
|
290
|
+
continue;
|
|
291
|
+
const refs = referencedKeys(store.getPluginConfig(status.instanceId));
|
|
292
|
+
if (![...keys].some(key => refs.has(key)))
|
|
293
|
+
continue;
|
|
294
|
+
const next = configToReload(app, store, status.instanceId, '共用的密钥已更改');
|
|
295
|
+
if (next)
|
|
296
|
+
await app.plugins.updateConfig(status.instanceId, next);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* 把文档接到 App:以 host-config 服务独占登记在根激活上,应用文档里的服务偏好。
|
|
301
|
+
* 须在注册任何插件之前调用,偏好才先于全部提供者生效。
|
|
97
302
|
* `opts` 传交给配置同步(withPluginConfigSync / installConfigHotReload)的同一份:host-config 的
|
|
98
303
|
* `trimUnknownFields` 据此声明宿主的裁剪政策(缺省与配置同步一样按裁剪)。
|
|
99
304
|
*/
|
|
100
305
|
export function installHostConfig(app, store, opts) {
|
|
101
306
|
const host = app.bind({ events, provide, services });
|
|
102
|
-
|
|
103
|
-
host.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
307
|
+
// 文档在内存里确实变了才通知:read 取写入所及的那一段,写前写后各取一次比较(写入相同的值不发)
|
|
308
|
+
const notify = (change) => void host.events.use.emit('host-config:changed', change);
|
|
309
|
+
const notifyIfChanged = (change, read, write) => {
|
|
310
|
+
const before = read();
|
|
311
|
+
write();
|
|
312
|
+
if (!isDeepStrictEqual(before, read()))
|
|
313
|
+
notify(change);
|
|
314
|
+
};
|
|
315
|
+
const sectionOf = (instanceId) => Object.hasOwn(store.getAll().plugins, instanceId) ? store.getPluginConfig(instanceId) : undefined;
|
|
316
|
+
// 失败在这里记一笔并标记已处理:不 await 的调用方不会因一次落盘失败变成未处理拒绝、被宿主当致命错误退出
|
|
317
|
+
const save = () => {
|
|
318
|
+
const done = (async () => {
|
|
319
|
+
// 宿主不持久化时没有写盘,不记「已保存」
|
|
320
|
+
if (await store.persist())
|
|
321
|
+
app.logger.info('配置已保存');
|
|
322
|
+
})();
|
|
323
|
+
done.catch(err => {
|
|
324
|
+
try {
|
|
325
|
+
// 拒写是保护盘上外部修改的预期结果,调用方已收到拒绝:一行告警即可,不带栈
|
|
326
|
+
if (isConfigSaveRefused(err))
|
|
327
|
+
app.logger.warn(`配置未保存:${err.message}`);
|
|
328
|
+
else
|
|
329
|
+
app.logger.error('配置保存失败:', err);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
/* 上报器自身失败不再外抛 */
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
return done;
|
|
336
|
+
};
|
|
337
|
+
const applyPluginConfig = async (instanceId, submitted) => {
|
|
338
|
+
assertSafePluginId(instanceId);
|
|
339
|
+
const entry = app.plugins.getPlugin(instanceId);
|
|
340
|
+
const definition = entry?.definition ?? definitionOf(app, instanceId);
|
|
341
|
+
if (!definition)
|
|
342
|
+
throw new TextError(t('noDefinition', { instance: instanceId }));
|
|
343
|
+
const schema = definition.configSchema;
|
|
344
|
+
const { doc, writes, placed } = store.splitPluginSecrets(instanceId, schema, submitted);
|
|
345
|
+
const { config: resolved, dangling } = store.resolvePluginConfig(instanceId, schema, doc, writes);
|
|
346
|
+
if (dangling.length > 0) {
|
|
347
|
+
// 本次提交新引入的悬空引用(键既不在密钥存储里、也不是这次写入的)拒收,运行态与文档都不动;
|
|
348
|
+
// 提交前就悬空、原样带回的照常放行(插件仍会激活失败,并记 error)
|
|
349
|
+
const known = new Set(store.resolvePluginConfig(instanceId, schema).dangling.map(d => d.key));
|
|
350
|
+
const introduced = dangling.filter(d => !known.has(d.key));
|
|
351
|
+
if (introduced.length > 0) {
|
|
352
|
+
throw new TextError(t('danglingRejected', { instance: instanceId, items: secretPlaces(introduced) }));
|
|
353
|
+
}
|
|
354
|
+
app.logger.error(describeDangling(instanceId, dangling).source);
|
|
355
|
+
}
|
|
356
|
+
let reloaded = true;
|
|
357
|
+
if (entry) {
|
|
358
|
+
// 解析出的配置与运行态相同(只改了带标记的字段时也是):不重建(updateConfig 即 bounce,会连带重启依赖它所提供服务的
|
|
359
|
+
// 下游),只写文档与落盘,pending、activating 的实例同样不打断。error 态的实例靠原样保存重试激活,照旧走 updateConfig;
|
|
360
|
+
// 正在卸载的(disposed)也交给 updateConfig,由它拒收
|
|
361
|
+
if (entry.state !== 'error' && entry.state !== 'disposed' && isDeepStrictEqual(resolved, entry.config))
|
|
362
|
+
reloaded = false;
|
|
363
|
+
else if (!(await app.plugins.updateConfig(instanceId, resolved)))
|
|
364
|
+
return { status: 'refused' };
|
|
365
|
+
store.commitSecrets(writes);
|
|
366
|
+
notifyIfChanged({ instanceId }, () => sectionOf(instanceId), () => store.setPluginConfig(instanceId, doc));
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
// 后缀实例由配置段定义:先写文档再登记,免得登记途中的热重载按还没有这一段的文件把它卸掉
|
|
370
|
+
const previous = sectionOf(instanceId);
|
|
371
|
+
const undo = store.commitSecrets(writes);
|
|
372
|
+
store.setPluginConfig(instanceId, doc);
|
|
373
|
+
const registered = await app.plugins.register(definition, resolved, instanceId, {
|
|
374
|
+
disabled: store.isPluginDisabled(instanceId),
|
|
124
375
|
});
|
|
125
|
-
|
|
376
|
+
if (!registered) {
|
|
377
|
+
undo();
|
|
378
|
+
if (previous)
|
|
379
|
+
store.setPluginConfig(instanceId, previous);
|
|
380
|
+
else
|
|
381
|
+
store.removePluginConfig(instanceId);
|
|
382
|
+
return { status: 'refused' };
|
|
383
|
+
}
|
|
384
|
+
if (!isDeepStrictEqual(previous, sectionOf(instanceId)))
|
|
385
|
+
notify({ instanceId });
|
|
386
|
+
}
|
|
387
|
+
// 写进的若是被别处共用的已有键,共用它的实例跟着换上新值(新建的键没有别人引用)
|
|
388
|
+
await reloadSecretSharers(app, store, new Set(writes.keys()), instanceId);
|
|
389
|
+
try {
|
|
390
|
+
await save();
|
|
391
|
+
}
|
|
392
|
+
catch (saveError) {
|
|
393
|
+
return { status: 'applied', reloaded, saveError };
|
|
394
|
+
}
|
|
395
|
+
// 写成之后才记:落盘失败时值只在内存里
|
|
396
|
+
for (const { path, key } of placed)
|
|
397
|
+
app.logger.info(`已把 ${instanceId} 的 ${path} 写进 secrets.yaml(键 ${key})`);
|
|
398
|
+
return { status: 'applied', reloaded };
|
|
399
|
+
};
|
|
400
|
+
// 读法交出复制品(与写方法存入参的复制品对称):插件就地改读到的值改不到文档,改了再写回照常算改动、照常通知
|
|
401
|
+
host.provide.use(hostConfig, {
|
|
402
|
+
get: key => structuredClone(store.get(key)),
|
|
403
|
+
getAll: () => structuredClone(store.getAll()),
|
|
404
|
+
// plugins 整块替换会绕过下面 setPluginConfig 的形态检查与孤儿键记账
|
|
405
|
+
set: (key, value) => {
|
|
406
|
+
if (key === 'plugins')
|
|
407
|
+
throw new Error('plugins 不能整块替换:改插件配置用 applyPluginConfig 或 setPluginConfig');
|
|
408
|
+
notifyIfChanged({ document: true }, () => store.get(key), () => store.set(key, value));
|
|
126
409
|
},
|
|
410
|
+
getPluginConfig: (instanceId) => structuredClone(store.getPluginConfig(instanceId)),
|
|
411
|
+
// 只收文档形态:查得到 schema 时,密钥字段上的明文(例如把 caps.config 原样写回)拒绝,不让原值进文档
|
|
412
|
+
setPluginConfig: (instanceId, next) => {
|
|
413
|
+
assertSafePluginId(instanceId);
|
|
414
|
+
const schema = store.hasSecretStore ? definitionOf(app, instanceId)?.configSchema : undefined;
|
|
415
|
+
const plain = plainSecretPaths(schema, next);
|
|
416
|
+
if (plain.length > 0)
|
|
417
|
+
throw new TextError(t('plainSecret', { instance: instanceId, paths: plain }));
|
|
418
|
+
notifyIfChanged({ instanceId }, () => sectionOf(instanceId), () => store.setPluginConfig(instanceId, next));
|
|
419
|
+
},
|
|
420
|
+
applyPluginConfig,
|
|
421
|
+
removePluginConfig: instanceId => notifyIfChanged({ instanceId }, () => sectionOf(instanceId), () => store.removePluginConfig(instanceId)),
|
|
422
|
+
isPluginDisabled: store.isPluginDisabled,
|
|
423
|
+
// 启停不通知:另有 plugins:changed
|
|
424
|
+
setPluginEnabled: store.setPluginEnabled,
|
|
425
|
+
getServicePreferences: scope => structuredClone(store.getServicePreferences(scope)),
|
|
426
|
+
setServicePreference: (name, contextId, scope) => notifyIfChanged({ document: true }, () => store.getServicePreferences(scope)[name], () => store.setServicePreference(name, contextId, scope)),
|
|
427
|
+
removeServicePreference: (name, scope) => notifyIfChanged({ document: true }, () => store.getServicePreferences(scope)[name], () => store.removeServicePreference(name, scope)),
|
|
428
|
+
trimUnknownFields: opts?.trimUnknownFields ?? true,
|
|
429
|
+
save,
|
|
127
430
|
}, { exclusive: true });
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
431
|
+
// 悬空的密钥引用除了日志,也在诊断里报出来:不走 parseConfig 的第三方插件拿到引用对象不会激活失败,
|
|
432
|
+
// 只看日志的话这种情况没人发现。诊断插件没上线时登记排队,上线后生效
|
|
433
|
+
app.bind({ doctor }).doctor.use.registerCheck({
|
|
434
|
+
id: 'config.secrets',
|
|
435
|
+
category: 'config',
|
|
436
|
+
run: () => {
|
|
437
|
+
const results = [];
|
|
438
|
+
for (const status of app.plugins.getStatus()) {
|
|
439
|
+
const entry = app.plugins.getPlugin(status.instanceId);
|
|
440
|
+
if (!entry)
|
|
441
|
+
continue;
|
|
442
|
+
const { dangling } = store.resolvePluginConfig(status.instanceId, entry.definition.configSchema);
|
|
443
|
+
if (dangling.length === 0)
|
|
444
|
+
continue;
|
|
445
|
+
results.push({
|
|
446
|
+
id: `config.secrets.${status.instanceId}`,
|
|
447
|
+
category: 'config',
|
|
448
|
+
level: 'error',
|
|
449
|
+
message: describeDangling(status.instanceId, dangling),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
return results.length > 0
|
|
453
|
+
? results
|
|
454
|
+
: { id: 'config.secrets', category: 'config', level: 'ok', message: t('secretsResolved') };
|
|
455
|
+
},
|
|
134
456
|
});
|
|
457
|
+
applyServicePreferences(host.services.use, store.getAll());
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* 文档里的服务偏好(全局与本插件)对到运行态:`previous` 是改动前的文档(热重载时给),这一份没有、它有的撤回,
|
|
461
|
+
* 没变的不动;不给时(启动)全部应用
|
|
462
|
+
*/
|
|
463
|
+
export function applyServicePreferences(live, next, previous) {
|
|
464
|
+
const scopes = (doc) => doc ? [undefined, ...Object.keys(doc.pluginServicePreferences ?? {}).map(id => ({ for: id }))] : [];
|
|
465
|
+
const prefsOf = (doc, scope) => (doc && preferencesIn(doc, scope)) ?? {};
|
|
466
|
+
for (const scope of scopes(previous)) {
|
|
467
|
+
const kept = prefsOf(next, scope);
|
|
468
|
+
for (const name of Object.keys(prefsOf(previous, scope)))
|
|
469
|
+
if (!Object.hasOwn(kept, name))
|
|
470
|
+
live.unprefer(name, scope);
|
|
471
|
+
}
|
|
472
|
+
for (const scope of scopes(next)) {
|
|
473
|
+
const before = prefsOf(previous, scope);
|
|
474
|
+
for (const [name, contextId] of Object.entries(prefsOf(next, scope))) {
|
|
475
|
+
if (!Object.hasOwn(before, name) || before[name] !== contextId)
|
|
476
|
+
live.prefer(name, contextId, scope);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
135
479
|
}
|
|
136
480
|
// ----- helpers -----
|
|
481
|
+
/** 去掉顶层带标记的字段(运行态不含它们) */
|
|
482
|
+
function withoutSessionFields(schema, config) {
|
|
483
|
+
const out = { ...config };
|
|
484
|
+
for (const [key, entry] of Object.entries(schema ?? {}))
|
|
485
|
+
if (isSessionField(entry))
|
|
486
|
+
delete out[key];
|
|
487
|
+
return out;
|
|
488
|
+
}
|
|
489
|
+
/** 文档的拷贝:之后对文档的就地修改(禁用名单、服务偏好、插件配置里的子对象)不会改到它 */
|
|
490
|
+
function snapshot(doc) {
|
|
491
|
+
return cloneConfigObject(doc);
|
|
492
|
+
}
|
|
493
|
+
/** 一个范围里的偏好:不给 `for` 是全局偏好,给了是那个插件实例的本插件偏好;还没有时为 undefined */
|
|
494
|
+
function preferencesIn(doc, scope) {
|
|
495
|
+
if (scope?.for === undefined)
|
|
496
|
+
return doc.servicePreferences;
|
|
497
|
+
assertSafePluginId(scope.for);
|
|
498
|
+
const byPlugin = doc.pluginServicePreferences;
|
|
499
|
+
return byPlugin && Object.hasOwn(byPlugin, scope.for) ? byPlugin[scope.for] : undefined;
|
|
500
|
+
}
|
|
501
|
+
/** 密钥文件的键值:危险键不收 */
|
|
502
|
+
function secretMap(input) {
|
|
503
|
+
return new Map(Object.entries(input).filter(([key]) => !isUnsafeConfigKey(key)));
|
|
504
|
+
}
|
|
505
|
+
/** 本插件偏好:插件实例 id → 服务偏好,危险键不收,空段不留 */
|
|
506
|
+
function copyPluginPreferences(input) {
|
|
507
|
+
const out = {};
|
|
508
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
509
|
+
return out;
|
|
510
|
+
for (const id of Object.keys(input)) {
|
|
511
|
+
if (isUnsafeConfigKey(id))
|
|
512
|
+
continue;
|
|
513
|
+
const prefs = copyOwnSafeStringDict(input[id]);
|
|
514
|
+
if (Object.keys(prefs).length > 0)
|
|
515
|
+
out[id] = prefs;
|
|
516
|
+
}
|
|
517
|
+
return out;
|
|
518
|
+
}
|
|
137
519
|
function copyOwnSafeStringDict(input) {
|
|
138
520
|
const out = {};
|
|
139
521
|
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
@@ -166,6 +548,10 @@ function normalize(input) {
|
|
|
166
548
|
merged.servicePreferences = copyOwnSafeStringDict(value);
|
|
167
549
|
continue;
|
|
168
550
|
}
|
|
551
|
+
if (key === 'pluginServicePreferences') {
|
|
552
|
+
merged.pluginServicePreferences = copyPluginPreferences(value);
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
169
555
|
merged[key] = value;
|
|
170
556
|
}
|
|
171
557
|
return merged;
|
package/dist/config-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"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"}
|