@springfield/ham-radio-registry 1.0.16 → 1.2.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/catalog/content-hash.d.ts +9 -0
- package/dist/catalog/content-hash.d.ts.map +1 -0
- package/dist/catalog/content-hash.js +18 -0
- package/dist/catalog/content-hash.js.map +1 -0
- package/dist/catalog/extract-catalog-metadata.d.ts +6 -0
- package/dist/catalog/extract-catalog-metadata.d.ts.map +1 -0
- package/dist/catalog/extract-catalog-metadata.js +29 -0
- package/dist/catalog/extract-catalog-metadata.js.map +1 -0
- package/dist/catalog/hydrate-radio-config.d.ts +7 -0
- package/dist/catalog/hydrate-radio-config.d.ts.map +1 -0
- package/dist/catalog/hydrate-radio-config.js +50 -0
- package/dist/catalog/hydrate-radio-config.js.map +1 -0
- package/dist/catalog/index.d.ts +5 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +5 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/validate-configuration.d.ts +7 -0
- package/dist/catalog/validate-configuration.d.ts.map +1 -0
- package/dist/catalog/validate-configuration.js +31 -0
- package/dist/catalog/validate-configuration.js.map +1 -0
- package/dist/index.d.ts +2 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -7
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +17 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +16 -0
- package/dist/node.js.map +1 -0
- package/dist/registry/config-registry.d.ts.map +1 -1
- package/dist/registry/config-registry.js +20 -28
- package/dist/registry/config-registry.js.map +1 -1
- package/dist/types/radio-config.d.ts +21 -5
- package/dist/types/radio-config.d.ts.map +1 -1
- package/package.json +13 -1
- package/src/catalog/content-hash.ts +20 -0
- package/src/catalog/extract-catalog-metadata.ts +36 -0
- package/src/catalog/hydrate-radio-config.ts +72 -0
- package/src/catalog/index.ts +4 -0
- package/src/catalog/validate-configuration.ts +40 -0
- package/src/index.ts +10 -16
- package/src/node.ts +25 -0
- package/src/registry/config-registry.ts +25 -36
- package/src/types/radio-config.ts +23 -5
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable FNV-1a 32-bit hash of a string (browser- and Node-safe, sync).
|
|
3
|
+
*/
|
|
4
|
+
export declare function computeContentHash(value: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Hash a resolved radio config for catalog change detection.
|
|
7
|
+
*/
|
|
8
|
+
export declare function hashRadioConfig(config: unknown): string;
|
|
9
|
+
//# sourceMappingURL=content-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-hash.d.ts","sourceRoot":"","sources":["../../src/catalog/content-hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable FNV-1a 32-bit hash of a string (browser- and Node-safe, sync).
|
|
3
|
+
*/
|
|
4
|
+
export function computeContentHash(value) {
|
|
5
|
+
let hash = 0x811c9dc5;
|
|
6
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
7
|
+
hash ^= value.charCodeAt(index);
|
|
8
|
+
hash = Math.imul(hash, 0x01000193);
|
|
9
|
+
}
|
|
10
|
+
return (hash >>> 0).toString(16).padStart(8, '0');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Hash a resolved radio config for catalog change detection.
|
|
14
|
+
*/
|
|
15
|
+
export function hashRadioConfig(config) {
|
|
16
|
+
return computeContentHash(JSON.stringify(config));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=content-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-hash.js","sourceRoot":"","sources":["../../src/catalog/content-hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,IAAI,GAAG,UAAU,CAAC;IAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RadioCatalogEntry, RadioCatalogSource, RegistryRadio } from '../types/radio-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract lightweight catalog metadata from a hydrated radio config.
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractCatalogMetadata(radio: RegistryRadio, source?: RadioCatalogSource, contentHash?: string): RadioCatalogEntry;
|
|
6
|
+
//# sourceMappingURL=extract-catalog-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-catalog-metadata.d.ts","sourceRoot":"","sources":["../../src/catalog/extract-catalog-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAqB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAUxH;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,GAAE,kBAA2B,EACnC,WAAW,CAAC,EAAE,MAAM,GACnB,iBAAiB,CAkBnB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { hashRadioConfig } from './content-hash.js';
|
|
2
|
+
const DEFAULT_CAPABILITIES = {
|
|
3
|
+
memoryRead: false,
|
|
4
|
+
memoryWrite: false,
|
|
5
|
+
channelProgramming: false,
|
|
6
|
+
settingsProgramming: false,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Extract lightweight catalog metadata from a hydrated radio config.
|
|
10
|
+
*/
|
|
11
|
+
export function extractCatalogMetadata(radio, source = 'user', contentHash) {
|
|
12
|
+
const capabilities = {
|
|
13
|
+
memoryRead: radio.capabilities?.memoryRead ?? DEFAULT_CAPABILITIES.memoryRead,
|
|
14
|
+
memoryWrite: radio.capabilities?.memoryWrite ?? DEFAULT_CAPABILITIES.memoryWrite,
|
|
15
|
+
channelProgramming: radio.capabilities?.channelProgramming ?? DEFAULT_CAPABILITIES.channelProgramming,
|
|
16
|
+
settingsProgramming: radio.capabilities?.settingsProgramming ?? DEFAULT_CAPABILITIES.settingsProgramming,
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
modelId: radio.id.model,
|
|
20
|
+
name: radio.id.name,
|
|
21
|
+
manufacturer: radio.id.manufacturer,
|
|
22
|
+
version: radio.version,
|
|
23
|
+
description: radio.description,
|
|
24
|
+
capabilities,
|
|
25
|
+
source,
|
|
26
|
+
contentHash: contentHash ?? hashRadioConfig(radio),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=extract-catalog-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-catalog-metadata.js","sourceRoot":"","sources":["../../src/catalog/extract-catalog-metadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,oBAAoB,GAAsB;IAC9C,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,KAAK;IAClB,kBAAkB,EAAE,KAAK;IACzB,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,MAAM,GAAuB,MAAM,EACnC,WAAoB;IAEpB,MAAM,YAAY,GAAsB;QACtC,UAAU,EAAE,KAAK,CAAC,YAAY,EAAE,UAAU,IAAI,oBAAoB,CAAC,UAAU;QAC7E,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,WAAW,IAAI,oBAAoB,CAAC,WAAW;QAChF,kBAAkB,EAAE,KAAK,CAAC,YAAY,EAAE,kBAAkB,IAAI,oBAAoB,CAAC,kBAAkB;QACrG,mBAAmB,EAAE,KAAK,CAAC,YAAY,EAAE,mBAAmB,IAAI,oBAAoB,CAAC,mBAAmB;KACzG,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK;QACvB,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI;QACnB,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY;QACnC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY;QACZ,MAAM;QACN,WAAW,EAAE,WAAW,IAAI,eAAe,CAAC,KAAK,CAAC;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RegistryRadio } from '../types/radio-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parse radio config JSON (or object) and inline `$ref` documents from `documentsByRef`.
|
|
4
|
+
* Keys in `documentsByRef` must match `$ref` strings exactly as they appear in the config.
|
|
5
|
+
*/
|
|
6
|
+
export declare function hydrateRadioConfig(json: string | Record<string, unknown>, documentsByRef?: Record<string, unknown>): RegistryRadio;
|
|
7
|
+
//# sourceMappingURL=hydrate-radio-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate-radio-config.d.ts","sourceRoot":"","sources":["../../src/catalog/hydrate-radio-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAqDnF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,cAAc,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC3C,aAAa,CAWf"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function isRefObject(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null && '$ref' in value && typeof value.$ref === 'string';
|
|
3
|
+
}
|
|
4
|
+
function resolveRef(ref, documentsByRef) {
|
|
5
|
+
if (!(ref in documentsByRef)) {
|
|
6
|
+
throw new Error(`Missing document for $ref: ${ref}`);
|
|
7
|
+
}
|
|
8
|
+
return structuredClone(documentsByRef[ref]);
|
|
9
|
+
}
|
|
10
|
+
function resolveValue(value, documentsByRef) {
|
|
11
|
+
if (isRefObject(value)) {
|
|
12
|
+
return resolveRef(value.$ref, documentsByRef);
|
|
13
|
+
}
|
|
14
|
+
if (Array.isArray(value)) {
|
|
15
|
+
return value.map((item) => resolveValue(item, documentsByRef));
|
|
16
|
+
}
|
|
17
|
+
if (typeof value === 'object' && value !== null) {
|
|
18
|
+
const result = {};
|
|
19
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
20
|
+
result[key] = resolveValue(nested, documentsByRef);
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function normalizeMetadata(raw) {
|
|
27
|
+
const metadata = (typeof raw === 'object' && raw !== null ? raw : {});
|
|
28
|
+
return {
|
|
29
|
+
moduleId: typeof metadata.moduleId === 'string' ? metadata.moduleId : '',
|
|
30
|
+
moduleVersion: typeof metadata.moduleVersion === 'string' ? metadata.moduleVersion : '',
|
|
31
|
+
pluginPath: typeof metadata.pluginPath === 'string' ? metadata.pluginPath : '',
|
|
32
|
+
...(typeof metadata.lastUpdated === 'string' ? { lastUpdated: metadata.lastUpdated } : {}),
|
|
33
|
+
...(typeof metadata.author === 'string' ? { author: metadata.author } : {}),
|
|
34
|
+
...(typeof metadata.license === 'string' ? { license: metadata.license } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse radio config JSON (or object) and inline `$ref` documents from `documentsByRef`.
|
|
39
|
+
* Keys in `documentsByRef` must match `$ref` strings exactly as they appear in the config.
|
|
40
|
+
*/
|
|
41
|
+
export function hydrateRadioConfig(json, documentsByRef = {}) {
|
|
42
|
+
const parsed = typeof json === 'string' ? JSON.parse(json) : structuredClone(json);
|
|
43
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
44
|
+
throw new Error('Radio configuration must be a JSON object');
|
|
45
|
+
}
|
|
46
|
+
const resolved = resolveValue(parsed, documentsByRef);
|
|
47
|
+
resolved.metadata = normalizeMetadata(resolved.metadata);
|
|
48
|
+
return resolved;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=hydrate-radio-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrate-radio-config.js","sourceRoot":"","sources":["../../src/catalog/hydrate-radio-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { hydrateRadioConfig } from './hydrate-radio-config.js';
|
|
2
|
+
export { extractCatalogMetadata } from './extract-catalog-metadata.js';
|
|
3
|
+
export { validateConfiguration } from './validate-configuration.js';
|
|
4
|
+
export { computeContentHash, hashRadioConfig } from './content-hash.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { hydrateRadioConfig } from './hydrate-radio-config.js';
|
|
2
|
+
export { extractCatalogMetadata } from './extract-catalog-metadata.js';
|
|
3
|
+
export { validateConfiguration } from './validate-configuration.js';
|
|
4
|
+
export { computeContentHash, hashRadioConfig } from './content-hash.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ValidationResult } from '@springfield/ham-radio-api';
|
|
2
|
+
import type { RegistryRadio } from '../types/radio-config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Validate a radio configuration for catalog ingest and registry use.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateConfiguration(config: RegistryRadio): ValidationResult;
|
|
7
|
+
//# sourceMappingURL=validate-configuration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-configuration.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-configuration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CAiC7E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a radio configuration for catalog ingest and registry use.
|
|
3
|
+
*/
|
|
4
|
+
export function validateConfiguration(config) {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const warnings = [];
|
|
7
|
+
if (!config.id?.model) {
|
|
8
|
+
errors.push('Configuration must have a valid model ID');
|
|
9
|
+
}
|
|
10
|
+
if (!config.serialConfig) {
|
|
11
|
+
errors.push('Configuration must have serial configuration');
|
|
12
|
+
}
|
|
13
|
+
if (!config.memoryConfig) {
|
|
14
|
+
errors.push('Configuration must have memory configuration');
|
|
15
|
+
}
|
|
16
|
+
if (!config.readMemory || config.readMemory.length === 0) {
|
|
17
|
+
errors.push('Configuration must have read memory protocol');
|
|
18
|
+
}
|
|
19
|
+
if (!config.writeMemory || config.writeMemory.length === 0) {
|
|
20
|
+
errors.push('Configuration must have write memory protocol');
|
|
21
|
+
}
|
|
22
|
+
if (!config.settingsSchema) {
|
|
23
|
+
errors.push('Configuration must have settings schema');
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
errors,
|
|
27
|
+
isValid: errors.length === 0,
|
|
28
|
+
warnings,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=validate-configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-configuration.js","sourceRoot":"","sources":["../../src/catalog/validate-configuration.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC5B,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
export type { RadioConfigMetadata, RadioCapabilities, CodecConfig, RegistryRadio, } from './types/radio-config.js';
|
|
1
|
+
export type { RadioConfigMetadata, RadioCapabilities, CodecConfig, RegistryRadio, RadioCatalogEntry, RadioCatalogSource, } from './types/radio-config.js';
|
|
2
2
|
export type { ValidationResult } from '@springfield/ham-radio-api';
|
|
3
3
|
export type { PluginModule, PluginCapabilities, SpringfieldPluginConfig, NpmPluginInfo, PluginManifest, PluginManifestConfiguration, PluginSharedComponents, PluginSecurity, } from './types/plugin-module.js';
|
|
4
|
-
export
|
|
5
|
-
import { type RadioConfigRegistry } from './registry/config-registry.js';
|
|
6
|
-
export type { SharedComponentManager } from '@springfield/ham-radio-api';
|
|
7
|
-
export { DefaultSharedComponentManager } from './registry/shared-components.js';
|
|
8
|
-
export type { NpmClient } from './utils/npm-client.js';
|
|
9
|
-
export { DefaultNpmClient } from './utils/npm-client.js';
|
|
10
|
-
export declare function createRegistry(logger: any): RadioConfigRegistry;
|
|
4
|
+
export { hydrateRadioConfig, extractCatalogMetadata, validateConfiguration, computeContentHash, hashRadioConfig, } from './catalog/index.js';
|
|
11
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":"AACA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
3
|
-
export { DefaultNpmClient } from './utils/npm-client.js';
|
|
4
|
-
// Factory function for creating registry instances
|
|
5
|
-
export function createRegistry(logger) {
|
|
6
|
-
return new NpmBasedConfigRegistry(logger);
|
|
7
|
-
}
|
|
1
|
+
// Browser-safe catalog API (no node:fs)
|
|
2
|
+
export { hydrateRadioConfig, extractCatalogMetadata, validateConfiguration, computeContentHash, hashRadioConfig, } from './catalog/index.js';
|
|
8
3
|
//# 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":"AAwBA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwBA,wCAAwC;AACxC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js entry — npm/fs plugin discovery. Import from `@springfield/ham-radio-registry/node`.
|
|
3
|
+
*/
|
|
4
|
+
export type { RadioConfigRegistry } from './registry/config-registry.js';
|
|
5
|
+
export { NpmBasedConfigRegistry } from './registry/config-registry.js';
|
|
6
|
+
export type { SharedComponentManager } from '@springfield/ham-radio-api';
|
|
7
|
+
export { DefaultSharedComponentManager } from './registry/shared-components.js';
|
|
8
|
+
export type { NpmClient } from './utils/npm-client.js';
|
|
9
|
+
export { DefaultNpmClient } from './utils/npm-client.js';
|
|
10
|
+
import { type RadioConfigRegistry } from './registry/config-registry.js';
|
|
11
|
+
import type { ILogLayer } from 'loglayer';
|
|
12
|
+
/**
|
|
13
|
+
* Create an npm-based radio configuration registry (Node.js only).
|
|
14
|
+
*/
|
|
15
|
+
export declare function createRegistry(logger: ILogLayer): RadioConfigRegistry;
|
|
16
|
+
export * from './index.js';
|
|
17
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAErE;AAGD,cAAc,YAAY,CAAC"}
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js entry — npm/fs plugin discovery. Import from `@springfield/ham-radio-registry/node`.
|
|
3
|
+
*/
|
|
4
|
+
export { NpmBasedConfigRegistry } from './registry/config-registry.js';
|
|
5
|
+
export { DefaultSharedComponentManager } from './registry/shared-components.js';
|
|
6
|
+
export { DefaultNpmClient } from './utils/npm-client.js';
|
|
7
|
+
import { NpmBasedConfigRegistry } from './registry/config-registry.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create an npm-based radio configuration registry (Node.js only).
|
|
10
|
+
*/
|
|
11
|
+
export function createRegistry(logger) {
|
|
12
|
+
return new NpmBasedConfigRegistry(logger);
|
|
13
|
+
}
|
|
14
|
+
// Re-export browser-safe catalog API for convenience
|
|
15
|
+
export * from './index.js';
|
|
16
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAA4B,MAAM,+BAA+B,CAAC;AAGjG;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,qDAAqD;AACrD,cAAc,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-registry.d.ts","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"config-registry.d.ts","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DefaultNpmClient } from '../utils/npm-client.js';
|
|
2
|
+
import { createMemoryMapCodec } from '@springfield/ham-radio-utils';
|
|
2
3
|
import { readFile, readdir } from 'node:fs/promises';
|
|
3
4
|
import { DefaultSharedComponentManager } from './shared-components.js';
|
|
5
|
+
import { validateConfiguration as validateRadioConfiguration } from '../catalog/validate-configuration.js';
|
|
4
6
|
import { existsSync } from 'node:fs';
|
|
5
7
|
import { join } from 'node:path';
|
|
6
8
|
/**
|
|
@@ -53,33 +55,7 @@ export class NpmBasedConfigRegistry {
|
|
|
53
55
|
return configs.filter((config) => config.metadata.moduleId === moduleId);
|
|
54
56
|
}
|
|
55
57
|
validateConfiguration(config) {
|
|
56
|
-
|
|
57
|
-
const warnings = [];
|
|
58
|
-
// Basic validation
|
|
59
|
-
if (!config.id?.model) {
|
|
60
|
-
errors.push('Configuration must have a valid model ID');
|
|
61
|
-
}
|
|
62
|
-
if (!config.serialConfig) {
|
|
63
|
-
errors.push('Configuration must have serial configuration');
|
|
64
|
-
}
|
|
65
|
-
if (!config.memoryConfig) {
|
|
66
|
-
errors.push('Configuration must have memory configuration');
|
|
67
|
-
}
|
|
68
|
-
if (!config.readMemory || config.readMemory.length === 0) {
|
|
69
|
-
errors.push('Configuration must have read memory protocol');
|
|
70
|
-
}
|
|
71
|
-
if (!config.writeMemory || config.writeMemory.length === 0) {
|
|
72
|
-
errors.push('Configuration must have write memory protocol');
|
|
73
|
-
}
|
|
74
|
-
// Schema validation
|
|
75
|
-
if (!config.settingsSchema) {
|
|
76
|
-
errors.push('Configuration must have settings schema');
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
errors,
|
|
80
|
-
isValid: errors.length === 0,
|
|
81
|
-
warnings,
|
|
82
|
-
};
|
|
58
|
+
return validateRadioConfiguration(config);
|
|
83
59
|
}
|
|
84
60
|
async registerConfiguration(config) {
|
|
85
61
|
const validation = this.validateConfiguration(config);
|
|
@@ -111,7 +87,7 @@ export class NpmBasedConfigRegistry {
|
|
|
111
87
|
}
|
|
112
88
|
// Find configuration for this model
|
|
113
89
|
const config = await this.getConfiguration(modelId);
|
|
114
|
-
if (!config
|
|
90
|
+
if (!config) {
|
|
115
91
|
return undefined;
|
|
116
92
|
}
|
|
117
93
|
// Load codec based on configuration
|
|
@@ -266,8 +242,24 @@ export class NpmBasedConfigRegistry {
|
|
|
266
242
|
const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.channelSchema.$ref, plugin.configPath);
|
|
267
243
|
config.settingsSchema.channelSchema = await this.sharedComponentManager.loadSchema(schemaPath);
|
|
268
244
|
}
|
|
245
|
+
if (config.memoryMap && typeof config.memoryMap === 'object' && '$ref' in config.memoryMap) {
|
|
246
|
+
const memoryMapPath = this.sharedComponentManager.resolveReference(config.memoryMap.$ref, plugin.configPath);
|
|
247
|
+
config.memoryMap = (await this.sharedComponentManager.loadSchema(memoryMapPath));
|
|
248
|
+
}
|
|
269
249
|
}
|
|
270
250
|
async loadCodecFromConfig(config) {
|
|
251
|
+
const memoryMap = config.memoryMap;
|
|
252
|
+
const usesMemoryMap = !config.codec ||
|
|
253
|
+
config.codec.type === 'memoryMap' ||
|
|
254
|
+
(config.codec.type !== 'shared' && memoryMap !== undefined && !('$ref' in memoryMap));
|
|
255
|
+
if (usesMemoryMap && memoryMap && typeof memoryMap === 'object' && !('$ref' in memoryMap)) {
|
|
256
|
+
return createMemoryMapCodec({
|
|
257
|
+
radioModel: config.id.model,
|
|
258
|
+
memoryMap,
|
|
259
|
+
memoryConfig: config.memoryConfig,
|
|
260
|
+
logger: this.logger,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
271
263
|
if (!config.codec || config.codec.type !== 'shared' || !config.codec.reference) {
|
|
272
264
|
return undefined;
|
|
273
265
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-registry.js","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config-registry.js","sourceRoot":"","sources":["../../src/registry/config-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,20 +11,19 @@ export interface RadioConfigMetadata {
|
|
|
11
11
|
license?: string;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Radio capabilities
|
|
14
|
+
* Radio capabilities (matches radio-module JSON configs)
|
|
15
15
|
*/
|
|
16
16
|
export interface RadioCapabilities {
|
|
17
|
-
dslProtocols: boolean;
|
|
18
|
-
customCodecs: boolean;
|
|
19
17
|
memoryRead: boolean;
|
|
20
18
|
memoryWrite: boolean;
|
|
21
|
-
|
|
19
|
+
channelProgramming: boolean;
|
|
20
|
+
settingsProgramming: boolean;
|
|
22
21
|
}
|
|
23
22
|
/**
|
|
24
23
|
* Codec configuration
|
|
25
24
|
*/
|
|
26
25
|
export interface CodecConfig {
|
|
27
|
-
type: 'shared' | 'inline';
|
|
26
|
+
type: 'shared' | 'inline' | 'memoryMap';
|
|
28
27
|
reference?: string;
|
|
29
28
|
config?: Record<string, unknown>;
|
|
30
29
|
}
|
|
@@ -37,4 +36,21 @@ export interface RegistryRadio extends Radio {
|
|
|
37
36
|
codec?: CodecConfig;
|
|
38
37
|
metadata: RadioConfigMetadata;
|
|
39
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Source of a catalogued radio configuration
|
|
41
|
+
*/
|
|
42
|
+
export type RadioCatalogSource = 'bundled' | 'user';
|
|
43
|
+
/**
|
|
44
|
+
* Lightweight catalog metadata for listing radios (e.g. import dialog)
|
|
45
|
+
*/
|
|
46
|
+
export interface RadioCatalogEntry {
|
|
47
|
+
modelId: string;
|
|
48
|
+
name: string;
|
|
49
|
+
manufacturer: string;
|
|
50
|
+
version: string;
|
|
51
|
+
description: string;
|
|
52
|
+
capabilities: RadioCapabilities;
|
|
53
|
+
source: RadioCatalogSource;
|
|
54
|
+
contentHash: string;
|
|
55
|
+
}
|
|
40
56
|
//# sourceMappingURL=radio-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio-config.d.ts","sourceRoot":"","sources":["../../src/types/radio-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,
|
|
1
|
+
{"version":3,"file":"radio-config.d.ts","sourceRoot":"","sources":["../../src/types/radio-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,iBAAiB,CAAC;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,MAAM,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,iBAAiB,CAAC;IAChC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@springfield/ham-radio-registry",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"author": "Bryan Hunt",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"readme": "README.md",
|
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
"type": "module",
|
|
12
12
|
"main": "dist/index.js",
|
|
13
13
|
"types": "dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"import": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./node": {
|
|
20
|
+
"import": "./dist/node.js",
|
|
21
|
+
"types": "./dist/node.d.ts"
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
14
25
|
"repository": {
|
|
15
26
|
"type": "git",
|
|
16
27
|
"url": "git+https://github.com/springfield-ham-radio/ham-radio-registry.git"
|
|
@@ -32,6 +43,7 @@
|
|
|
32
43
|
},
|
|
33
44
|
"dependencies": {
|
|
34
45
|
"@springfield/ham-radio-api": "^17.3.0",
|
|
46
|
+
"@springfield/ham-radio-utils": "^4.6.0",
|
|
35
47
|
"loglayer": "^9.4.0"
|
|
36
48
|
},
|
|
37
49
|
"devDependencies": {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable FNV-1a 32-bit hash of a string (browser- and Node-safe, sync).
|
|
3
|
+
*/
|
|
4
|
+
export function computeContentHash(value: string): string {
|
|
5
|
+
let hash = 0x811c9dc5;
|
|
6
|
+
|
|
7
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
8
|
+
hash ^= value.charCodeAt(index);
|
|
9
|
+
hash = Math.imul(hash, 0x01000193);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return (hash >>> 0).toString(16).padStart(8, '0');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Hash a resolved radio config for catalog change detection.
|
|
17
|
+
*/
|
|
18
|
+
export function hashRadioConfig(config: unknown): string {
|
|
19
|
+
return computeContentHash(JSON.stringify(config));
|
|
20
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { RadioCatalogEntry, RadioCatalogSource, RadioCapabilities, RegistryRadio } from '../types/radio-config.js';
|
|
2
|
+
import { hashRadioConfig } from './content-hash.js';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_CAPABILITIES: RadioCapabilities = {
|
|
5
|
+
memoryRead: false,
|
|
6
|
+
memoryWrite: false,
|
|
7
|
+
channelProgramming: false,
|
|
8
|
+
settingsProgramming: false,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Extract lightweight catalog metadata from a hydrated radio config.
|
|
13
|
+
*/
|
|
14
|
+
export function extractCatalogMetadata(
|
|
15
|
+
radio: RegistryRadio,
|
|
16
|
+
source: RadioCatalogSource = 'user',
|
|
17
|
+
contentHash?: string,
|
|
18
|
+
): RadioCatalogEntry {
|
|
19
|
+
const capabilities: RadioCapabilities = {
|
|
20
|
+
memoryRead: radio.capabilities?.memoryRead ?? DEFAULT_CAPABILITIES.memoryRead,
|
|
21
|
+
memoryWrite: radio.capabilities?.memoryWrite ?? DEFAULT_CAPABILITIES.memoryWrite,
|
|
22
|
+
channelProgramming: radio.capabilities?.channelProgramming ?? DEFAULT_CAPABILITIES.channelProgramming,
|
|
23
|
+
settingsProgramming: radio.capabilities?.settingsProgramming ?? DEFAULT_CAPABILITIES.settingsProgramming,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
modelId: radio.id.model,
|
|
28
|
+
name: radio.id.name,
|
|
29
|
+
manufacturer: radio.id.manufacturer,
|
|
30
|
+
version: radio.version,
|
|
31
|
+
description: radio.description,
|
|
32
|
+
capabilities,
|
|
33
|
+
source,
|
|
34
|
+
contentHash: contentHash ?? hashRadioConfig(radio),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { RadioConfigMetadata, RegistryRadio } from '../types/radio-config.js';
|
|
2
|
+
|
|
3
|
+
interface RefObject {
|
|
4
|
+
$ref: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function isRefObject(value: unknown): value is RefObject {
|
|
8
|
+
return typeof value === 'object' && value !== null && '$ref' in value && typeof (value as RefObject).$ref === 'string';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function resolveRef(ref: string, documentsByRef: Record<string, unknown>): unknown {
|
|
12
|
+
if (!(ref in documentsByRef)) {
|
|
13
|
+
throw new Error(`Missing document for $ref: ${ref}`);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return structuredClone(documentsByRef[ref]);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function resolveValue(value: unknown, documentsByRef: Record<string, unknown>): unknown {
|
|
20
|
+
if (isRefObject(value)) {
|
|
21
|
+
return resolveRef(value.$ref, documentsByRef);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
return value.map((item) => resolveValue(item, documentsByRef));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (typeof value === 'object' && value !== null) {
|
|
29
|
+
const result: Record<string, unknown> = {};
|
|
30
|
+
|
|
31
|
+
for (const [key, nested] of Object.entries(value)) {
|
|
32
|
+
result[key] = resolveValue(nested, documentsByRef);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function normalizeMetadata(raw: unknown): RadioConfigMetadata {
|
|
42
|
+
const metadata = (typeof raw === 'object' && raw !== null ? raw : {}) as Partial<RadioConfigMetadata> & Record<string, unknown>;
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
moduleId: typeof metadata.moduleId === 'string' ? metadata.moduleId : '',
|
|
46
|
+
moduleVersion: typeof metadata.moduleVersion === 'string' ? metadata.moduleVersion : '',
|
|
47
|
+
pluginPath: typeof metadata.pluginPath === 'string' ? metadata.pluginPath : '',
|
|
48
|
+
...(typeof metadata.lastUpdated === 'string' ? { lastUpdated: metadata.lastUpdated } : {}),
|
|
49
|
+
...(typeof metadata.author === 'string' ? { author: metadata.author } : {}),
|
|
50
|
+
...(typeof metadata.license === 'string' ? { license: metadata.license } : {}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Parse radio config JSON (or object) and inline `$ref` documents from `documentsByRef`.
|
|
56
|
+
* Keys in `documentsByRef` must match `$ref` strings exactly as they appear in the config.
|
|
57
|
+
*/
|
|
58
|
+
export function hydrateRadioConfig(
|
|
59
|
+
json: string | Record<string, unknown>,
|
|
60
|
+
documentsByRef: Record<string, unknown> = {},
|
|
61
|
+
): RegistryRadio {
|
|
62
|
+
const parsed: unknown = typeof json === 'string' ? JSON.parse(json) : structuredClone(json);
|
|
63
|
+
|
|
64
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
65
|
+
throw new Error('Radio configuration must be a JSON object');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const resolved = resolveValue(parsed, documentsByRef) as Record<string, unknown>;
|
|
69
|
+
resolved.metadata = normalizeMetadata(resolved.metadata);
|
|
70
|
+
|
|
71
|
+
return resolved as unknown as RegistryRadio;
|
|
72
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { hydrateRadioConfig } from './hydrate-radio-config.js';
|
|
2
|
+
export { extractCatalogMetadata } from './extract-catalog-metadata.js';
|
|
3
|
+
export { validateConfiguration } from './validate-configuration.js';
|
|
4
|
+
export { computeContentHash, hashRadioConfig } from './content-hash.js';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ValidationResult } from '@springfield/ham-radio-api';
|
|
2
|
+
import type { RegistryRadio } from '../types/radio-config.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Validate a radio configuration for catalog ingest and registry use.
|
|
6
|
+
*/
|
|
7
|
+
export function validateConfiguration(config: RegistryRadio): ValidationResult {
|
|
8
|
+
const errors: string[] = [];
|
|
9
|
+
const warnings: string[] = [];
|
|
10
|
+
|
|
11
|
+
if (!config.id?.model) {
|
|
12
|
+
errors.push('Configuration must have a valid model ID');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!config.serialConfig) {
|
|
16
|
+
errors.push('Configuration must have serial configuration');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!config.memoryConfig) {
|
|
20
|
+
errors.push('Configuration must have memory configuration');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!config.readMemory || config.readMemory.length === 0) {
|
|
24
|
+
errors.push('Configuration must have read memory protocol');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!config.writeMemory || config.writeMemory.length === 0) {
|
|
28
|
+
errors.push('Configuration must have write memory protocol');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!config.settingsSchema) {
|
|
32
|
+
errors.push('Configuration must have settings schema');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
errors,
|
|
37
|
+
isValid: errors.length === 0,
|
|
38
|
+
warnings,
|
|
39
|
+
};
|
|
40
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type {
|
|
|
4
4
|
RadioCapabilities,
|
|
5
5
|
CodecConfig,
|
|
6
6
|
RegistryRadio,
|
|
7
|
+
RadioCatalogEntry,
|
|
8
|
+
RadioCatalogSource,
|
|
7
9
|
} from './types/radio-config.js';
|
|
8
10
|
|
|
9
11
|
// Re-export common types from ham-radio-api
|
|
@@ -20,19 +22,11 @@ export type {
|
|
|
20
22
|
PluginSecurity,
|
|
21
23
|
} from './types/plugin-module.js';
|
|
22
24
|
|
|
23
|
-
//
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// NPM client
|
|
32
|
-
export type { NpmClient } from './utils/npm-client.js';
|
|
33
|
-
export { DefaultNpmClient } from './utils/npm-client.js';
|
|
34
|
-
|
|
35
|
-
// Factory function for creating registry instances
|
|
36
|
-
export function createRegistry(logger: any): RadioConfigRegistry {
|
|
37
|
-
return new NpmBasedConfigRegistry(logger);
|
|
38
|
-
}
|
|
25
|
+
// Browser-safe catalog API (no node:fs)
|
|
26
|
+
export {
|
|
27
|
+
hydrateRadioConfig,
|
|
28
|
+
extractCatalogMetadata,
|
|
29
|
+
validateConfiguration,
|
|
30
|
+
computeContentHash,
|
|
31
|
+
hashRadioConfig,
|
|
32
|
+
} from './catalog/index.js';
|
package/src/node.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js entry — npm/fs plugin discovery. Import from `@springfield/ham-radio-registry/node`.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export type { RadioConfigRegistry } from './registry/config-registry.js';
|
|
6
|
+
export { NpmBasedConfigRegistry } from './registry/config-registry.js';
|
|
7
|
+
|
|
8
|
+
export type { SharedComponentManager } from '@springfield/ham-radio-api';
|
|
9
|
+
export { DefaultSharedComponentManager } from './registry/shared-components.js';
|
|
10
|
+
|
|
11
|
+
export type { NpmClient } from './utils/npm-client.js';
|
|
12
|
+
export { DefaultNpmClient } from './utils/npm-client.js';
|
|
13
|
+
|
|
14
|
+
import { NpmBasedConfigRegistry, type RadioConfigRegistry } from './registry/config-registry.js';
|
|
15
|
+
import type { ILogLayer } from 'loglayer';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create an npm-based radio configuration registry (Node.js only).
|
|
19
|
+
*/
|
|
20
|
+
export function createRegistry(logger: ILogLayer): RadioConfigRegistry {
|
|
21
|
+
return new NpmBasedConfigRegistry(logger);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Re-export browser-safe catalog API for convenience
|
|
25
|
+
export * from './index.js';
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { DefaultNpmClient, type NpmClient } from '../utils/npm-client.js';
|
|
2
|
-
import type { RadioCodec, RadioModelId, SharedComponentManager, ValidationResult } from '@springfield/ham-radio-api';
|
|
2
|
+
import type { RadioCodec, RadioMemoryMap, RadioModelId, SharedComponentManager, ValidationResult } from '@springfield/ham-radio-api';
|
|
3
|
+
import { createMemoryMapCodec } from '@springfield/ham-radio-utils';
|
|
3
4
|
import { readFile, readdir } from 'node:fs/promises';
|
|
4
5
|
import { DefaultSharedComponentManager } from './shared-components.js';
|
|
5
6
|
import type { ILogLayer } from 'loglayer';
|
|
6
7
|
import type { PluginModule } from '../types/plugin-module.js';
|
|
7
8
|
import type { RegistryRadio } from '../types/radio-config.js';
|
|
9
|
+
import { validateConfiguration as validateRadioConfiguration } from '../catalog/validate-configuration.js';
|
|
8
10
|
import { existsSync } from 'node:fs';
|
|
9
11
|
import { join } from 'node:path';
|
|
10
12
|
|
|
@@ -116,40 +118,7 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
|
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
validateConfiguration(config: RegistryRadio): ValidationResult {
|
|
119
|
-
|
|
120
|
-
const warnings: string[] = [];
|
|
121
|
-
|
|
122
|
-
// Basic validation
|
|
123
|
-
if (!config.id?.model) {
|
|
124
|
-
errors.push('Configuration must have a valid model ID');
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (!config.serialConfig) {
|
|
128
|
-
errors.push('Configuration must have serial configuration');
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (!config.memoryConfig) {
|
|
132
|
-
errors.push('Configuration must have memory configuration');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (!config.readMemory || config.readMemory.length === 0) {
|
|
136
|
-
errors.push('Configuration must have read memory protocol');
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (!config.writeMemory || config.writeMemory.length === 0) {
|
|
140
|
-
errors.push('Configuration must have write memory protocol');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Schema validation
|
|
144
|
-
if (!config.settingsSchema) {
|
|
145
|
-
errors.push('Configuration must have settings schema');
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return {
|
|
149
|
-
errors,
|
|
150
|
-
isValid: errors.length === 0,
|
|
151
|
-
warnings,
|
|
152
|
-
};
|
|
121
|
+
return validateRadioConfiguration(config);
|
|
153
122
|
}
|
|
154
123
|
|
|
155
124
|
async registerConfiguration(config: RegistryRadio): Promise<void> {
|
|
@@ -190,7 +159,7 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
|
|
|
190
159
|
|
|
191
160
|
// Find configuration for this model
|
|
192
161
|
const config = await this.getConfiguration(modelId);
|
|
193
|
-
if (!config
|
|
162
|
+
if (!config) {
|
|
194
163
|
return undefined;
|
|
195
164
|
}
|
|
196
165
|
|
|
@@ -373,9 +342,29 @@ export class NpmBasedConfigRegistry implements RadioConfigRegistry {
|
|
|
373
342
|
const schemaPath = this.sharedComponentManager.resolveReference(config.settingsSchema.channelSchema.$ref as string, plugin.configPath);
|
|
374
343
|
config.settingsSchema.channelSchema = await this.sharedComponentManager.loadSchema(schemaPath);
|
|
375
344
|
}
|
|
345
|
+
|
|
346
|
+
if (config.memoryMap && typeof config.memoryMap === 'object' && '$ref' in config.memoryMap) {
|
|
347
|
+
const memoryMapPath = this.sharedComponentManager.resolveReference(config.memoryMap.$ref as string, plugin.configPath);
|
|
348
|
+
config.memoryMap = (await this.sharedComponentManager.loadSchema(memoryMapPath)) as unknown as RadioMemoryMap;
|
|
349
|
+
}
|
|
376
350
|
}
|
|
377
351
|
|
|
378
352
|
private async loadCodecFromConfig(config: RegistryRadio): Promise<RadioCodec | undefined> {
|
|
353
|
+
const memoryMap = config.memoryMap;
|
|
354
|
+
const usesMemoryMap =
|
|
355
|
+
!config.codec ||
|
|
356
|
+
config.codec.type === 'memoryMap' ||
|
|
357
|
+
(config.codec.type !== 'shared' && memoryMap !== undefined && !('$ref' in (memoryMap as object)));
|
|
358
|
+
|
|
359
|
+
if (usesMemoryMap && memoryMap && typeof memoryMap === 'object' && !('$ref' in memoryMap)) {
|
|
360
|
+
return createMemoryMapCodec({
|
|
361
|
+
radioModel: config.id.model,
|
|
362
|
+
memoryMap,
|
|
363
|
+
memoryConfig: config.memoryConfig,
|
|
364
|
+
logger: this.logger,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
|
|
379
368
|
if (!config.codec || config.codec.type !== 'shared' || !config.codec.reference) {
|
|
380
369
|
return undefined;
|
|
381
370
|
}
|
|
@@ -13,21 +13,20 @@ export interface RadioConfigMetadata {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Radio capabilities
|
|
16
|
+
* Radio capabilities (matches radio-module JSON configs)
|
|
17
17
|
*/
|
|
18
18
|
export interface RadioCapabilities {
|
|
19
|
-
dslProtocols: boolean;
|
|
20
|
-
customCodecs: boolean;
|
|
21
19
|
memoryRead: boolean;
|
|
22
20
|
memoryWrite: boolean;
|
|
23
|
-
|
|
21
|
+
channelProgramming: boolean;
|
|
22
|
+
settingsProgramming: boolean;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Codec configuration
|
|
28
27
|
*/
|
|
29
28
|
export interface CodecConfig {
|
|
30
|
-
type: 'shared' | 'inline';
|
|
29
|
+
type: 'shared' | 'inline' | 'memoryMap';
|
|
31
30
|
reference?: string;
|
|
32
31
|
config?: Record<string, unknown>;
|
|
33
32
|
}
|
|
@@ -41,3 +40,22 @@ export interface RegistryRadio extends Radio {
|
|
|
41
40
|
codec?: CodecConfig;
|
|
42
41
|
metadata: RadioConfigMetadata;
|
|
43
42
|
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Source of a catalogued radio configuration
|
|
46
|
+
*/
|
|
47
|
+
export type RadioCatalogSource = 'bundled' | 'user';
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Lightweight catalog metadata for listing radios (e.g. import dialog)
|
|
51
|
+
*/
|
|
52
|
+
export interface RadioCatalogEntry {
|
|
53
|
+
modelId: string;
|
|
54
|
+
name: string;
|
|
55
|
+
manufacturer: string;
|
|
56
|
+
version: string;
|
|
57
|
+
description: string;
|
|
58
|
+
capabilities: RadioCapabilities;
|
|
59
|
+
source: RadioCatalogSource;
|
|
60
|
+
contentHash: string;
|
|
61
|
+
}
|