add mapper. add v2 handler. add tag description short and full versions. delete topic[1-5]. #5

Merged
APervov merged 5 commits from edge5modbus into main 2026-06-19 06:15:29 +00:00
2 changed files with 7 additions and 10 deletions
Showing only changes of commit f8a9866339 - Show all commits

View File

@@ -7,6 +7,7 @@ RUN npm ci
COPY tsconfig.json ./ COPY tsconfig.json ./
COPY public ./public COPY public ./public
# Runtime mappers read JSON files from src/mappings, so they must be copied into the image.
COPY src ./src COPY src ./src
CMD ["npm", "run", "dev"] CMD ["npm", "run", "dev"]

View File

@@ -7,11 +7,9 @@ export type MappedMetric = {
value: number value: number
} }
type MappingTagEntry = string | { tag: string } | { key: string }
type MappingConfig = { type MappingConfig = {
edge: string edge: string
tags: MappingTagEntry[] tags: string[]
} }
export type MetricMapper = { export type MetricMapper = {
@@ -21,8 +19,9 @@ export type MetricMapper = {
} }
type MetricMapperOptions = { type MetricMapperOptions = {
// filePath is set as a URL from import.meta.url for bundled mappings, // filePath contract:
// or as a path string resolved by Node from the process working directory. // - built-in mappings are passed as URL via new URL('../mappings/*.json', import.meta.url);
// - env overrides are expected as absolute paths inside the runtime container.
filePath: string | URL filePath: string | URL
} }
@@ -32,18 +31,15 @@ function readMappingConfig(filePath: string | URL): MappingConfig {
export function createMetricMapper(options: MetricMapperOptions): MetricMapper { export function createMetricMapper(options: MetricMapperOptions): MetricMapper {
const config = readMappingConfig(options.filePath) const config = readMappingConfig(options.filePath)
const tags = config.tags.map((entry) =>
typeof entry === 'string' ? entry : 'tag' in entry ? entry.tag : entry.key,
)
return { return {
edge: config.edge, edge: config.edge,
tagCount: tags.length, tagCount: config.tags.length,
mapValues: (values, timestamp) => mapValues: (values, timestamp) =>
values.map((value, index) => ({ values.map((value, index) => ({
edge: config.edge, edge: config.edge,
timestamp, timestamp,
NBizyaev marked this conversation as resolved
Review

Обработка ошибок хандлера должна быть не в самом хандлере, а выше - на уровне роутинга входящих пакетов из топиков на хандлеры (app\src\router.ts), а все проблемы/ошибки/несоответствия ожиданиям/ваыпадения из позитивного сценария -- должны бросать исключение
в том числе некорректные данные,
в том числе отсутствие каких-либо файлов,
в том числе вообще все ошибки, которые не будут покрыты отдельным специальным if.
В этом смысле чем меньше отдельных специальных if - тем лучше, потому что проблемы всё равно обработаются и выловятся уровнем выше, но кода при этом будет меньше.

Обработка ошибок хандлера должна быть не в самом хандлере, а выше - на уровне роутинга входящих пакетов из топиков на хандлеры (app\src\router.ts), а все проблемы/ошибки/несоответствия ожиданиям/ваыпадения из позитивного сценария -- должны бросать исключение в том числе некорректные данные, в том числе отсутствие каких-либо файлов, в том числе вообще все ошибки, которые не будут покрыты отдельным специальным if. В этом смысле чем меньше отдельных специальных if - тем лучше, потому что проблемы всё равно обработаются и выловятся уровнем выше, но кода при этом будет меньше.
tag: tags[index], tag: config.tags[index],
value, value,
})), })),
} }