@zlooks.cn/registry-config 1.0.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +8 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +24 -0
- package/dist/registry.js.map +1 -0
- package/dist/subscriber.d.ts +23 -0
- package/dist/subscriber.d.ts.map +1 -0
- package/dist/subscriber.js +84 -0
- package/dist/subscriber.js.map +1 -0
- package/package.json +33 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RegistryBootstrap {
|
|
2
|
+
readonly host: string;
|
|
3
|
+
readonly port: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseAdvertiseHost(value: unknown): string | undefined;
|
|
6
|
+
export declare function parseRegistryBootstrap(environment: Readonly<Record<string, string | undefined>>): RegistryBootstrap;
|
|
7
|
+
export declare function registryConfigTopic(key: string): `registry:zlooks.cn/${string}`;
|
|
8
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAErE;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GACxD,iBAAiB,CAMnB;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,MAAM,EAAE,CAM/E"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const registryBootstrapSchema = z.object({
|
|
3
|
+
REGISTRY_HOST: z.string().trim().min(1),
|
|
4
|
+
REGISTRY_PORT: z.coerce.number().int().min(1).max(65_535),
|
|
5
|
+
});
|
|
6
|
+
const advertiseHostSchema = z.string().trim().min(1).optional();
|
|
7
|
+
export function parseAdvertiseHost(value) {
|
|
8
|
+
return advertiseHostSchema.parse(value);
|
|
9
|
+
}
|
|
10
|
+
export function parseRegistryBootstrap(environment) {
|
|
11
|
+
const parsed = registryBootstrapSchema.parse(environment);
|
|
12
|
+
return Object.freeze({
|
|
13
|
+
host: parsed.REGISTRY_HOST,
|
|
14
|
+
port: parsed.REGISTRY_PORT,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export function registryConfigTopic(key) {
|
|
18
|
+
const normalized = key.trim();
|
|
19
|
+
if (!normalized || normalized.includes('/')) {
|
|
20
|
+
throw new Error('Registry configuration key must be one non-empty path segment');
|
|
21
|
+
}
|
|
22
|
+
return `registry:zlooks.cn/${normalized}`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;CAC1D,CAAC,CAAC;AAOH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEhE,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,WAAyD;IAEzD,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC,aAAa;QAC1B,IAAI,EAAE,MAAM,CAAC,aAAa;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,sBAAsB,UAAU,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReadonlyRef, type TopicSubscriber } from '@hile/reactivity';
|
|
2
|
+
export interface RegistryConfigSource<T> {
|
|
3
|
+
readonly topic: string;
|
|
4
|
+
parse(value: unknown): T;
|
|
5
|
+
}
|
|
6
|
+
type RegistryConfigSources = Readonly<Record<string, RegistryConfigSource<unknown>>>;
|
|
7
|
+
type ParsedSources<Sources extends RegistryConfigSources> = {
|
|
8
|
+
readonly [Key in keyof Sources]: Sources[Key] extends RegistryConfigSource<infer Value> ? Value : never;
|
|
9
|
+
};
|
|
10
|
+
export interface RegistryConfigSubscriptionOptions<Sources extends RegistryConfigSources, Config> {
|
|
11
|
+
readonly sources: Sources;
|
|
12
|
+
readonly compose: (sources: ParsedSources<Sources>) => Config;
|
|
13
|
+
readonly initialTimeoutMs?: number;
|
|
14
|
+
readonly onError?: (error: unknown) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface RegistryConfigSubscription<Config> {
|
|
17
|
+
readonly current: ReadonlyRef<Config | undefined>;
|
|
18
|
+
snapshot(): Config;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare function subscribeRegistryConfig<Sources extends RegistryConfigSources, Config>(application: TopicSubscriber, options: RegistryConfigSubscriptionOptions<Sources, Config>): Promise<RegistryConfigSubscription<Config>>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=subscriber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../src/subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC;CAC1B;AAED,KAAK,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAIrF,KAAK,aAAa,CAAC,OAAO,SAAS,qBAAqB,IAAI;IAC1D,QAAQ,EAAE,GAAG,IAAI,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,oBAAoB,CAAC,MAAM,KAAK,CAAC,GACnF,KAAK,GACL,KAAK;CACV,CAAC;AAEF,MAAM,WAAW,iCAAiC,CAChD,OAAO,SAAS,qBAAqB,EACrC,MAAM;IAEN,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC;IAC9D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B,CAAC,MAAM;IAChD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,QAAQ,IAAI,MAAM,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,SAAS,qBAAqB,EACrC,MAAM,EAEN,WAAW,EAAE,eAAe,EAC5B,OAAO,EAAE,iCAAiC,CAAC,OAAO,EAAE,MAAM,CAAC,GAC1D,OAAO,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAsE7C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { reactiveConfig, shallowRef, watchSerialLatest, } from '@hile/reactivity';
|
|
2
|
+
export async function subscribeRegistryConfig(application, options) {
|
|
3
|
+
const keys = Object.keys(options.sources);
|
|
4
|
+
if (keys.length === 0)
|
|
5
|
+
throw new Error('At least one Registry configuration source is required');
|
|
6
|
+
const topics = Object.fromEntries(keys.map((key) => [key, options.sources[key].topic]));
|
|
7
|
+
const raw = await reactiveConfig(application, {
|
|
8
|
+
topics,
|
|
9
|
+
required: keys,
|
|
10
|
+
onError: (error) => report(options.onError, error),
|
|
11
|
+
});
|
|
12
|
+
const current = shallowRef();
|
|
13
|
+
let closePromise;
|
|
14
|
+
let watching = true;
|
|
15
|
+
let resolveReady;
|
|
16
|
+
let rejectReady;
|
|
17
|
+
const ready = new Promise((resolve, reject) => {
|
|
18
|
+
resolveReady = resolve;
|
|
19
|
+
rejectReady = reject;
|
|
20
|
+
});
|
|
21
|
+
const timer = setTimeout(() => {
|
|
22
|
+
rejectReady(new Error('Registry configuration was not ready before the initial timeout'));
|
|
23
|
+
}, options.initialTimeoutMs ?? 10_000);
|
|
24
|
+
const stopWatch = watchSerialLatest(raw.current, (sources) => {
|
|
25
|
+
if (sources === undefined)
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
const parsed = Object.fromEntries(keys.map((key) => [
|
|
29
|
+
key,
|
|
30
|
+
options.sources[key].parse(sources[key]),
|
|
31
|
+
]));
|
|
32
|
+
current.value = options.compose(parsed);
|
|
33
|
+
resolveReady();
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
report(options.onError, error);
|
|
37
|
+
if (current.value === undefined)
|
|
38
|
+
rejectReady(error);
|
|
39
|
+
}
|
|
40
|
+
}, { immediate: true });
|
|
41
|
+
const close = () => {
|
|
42
|
+
if (closePromise)
|
|
43
|
+
return closePromise;
|
|
44
|
+
if (watching) {
|
|
45
|
+
watching = false;
|
|
46
|
+
stopWatch();
|
|
47
|
+
}
|
|
48
|
+
const operation = raw.stop().catch((error) => {
|
|
49
|
+
closePromise = undefined;
|
|
50
|
+
throw error;
|
|
51
|
+
});
|
|
52
|
+
closePromise = operation;
|
|
53
|
+
return operation;
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
await ready;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
await close().catch(() => undefined);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
current,
|
|
67
|
+
snapshot() {
|
|
68
|
+
const snapshot = current.value;
|
|
69
|
+
if (snapshot === undefined)
|
|
70
|
+
throw new Error('Registry configuration is not ready');
|
|
71
|
+
return snapshot;
|
|
72
|
+
},
|
|
73
|
+
close,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function report(observer, error) {
|
|
77
|
+
try {
|
|
78
|
+
void Promise.resolve(observer?.(error)).catch(() => undefined);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Observability must not replace configuration validation or lifecycle errors.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=subscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../src/subscriber.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zlooks.cn/registry-config",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "pnpm run clean && tsc -p tsconfig.json && fix-esm-import-path --preserve-import-type ./dist",
|
|
17
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@hile/reactivity": "3.0.1",
|
|
23
|
+
"@vue/reactivity": "3.5.41",
|
|
24
|
+
"zod": "4.4.3"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "26.2.0",
|
|
28
|
+
"fix-esm-import-path": "1.10.3",
|
|
29
|
+
"typescript": "7.0.2",
|
|
30
|
+
"vitest": "4.1.11"
|
|
31
|
+
},
|
|
32
|
+
"gitHead": "a3e825c2a62561f73f49a54720e286f08da63429"
|
|
33
|
+
}
|