Убрал лишние проверки. Убрал дефолтные значения env переменных. Скорректировал dockerfile
This commit is contained in:
@@ -7,20 +7,9 @@ export const TOPIC = 'data/edge5/modbus/v2'
|
||||
const mapper = createMetricMapper({
|
||||
filePath: process.env.EDGE5_MODBUS_V2_MAPPING_FILE as string,
|
||||
})
|
||||
const REGISTER_COUNT = mapper.tagCount
|
||||
|
||||
function parseValues(payload: Buffer): number[] {
|
||||
const value = JSON.parse(payload.toString('utf8')) as unknown
|
||||
|
||||
if (
|
||||
Array.isArray(value) &&
|
||||
value.length === REGISTER_COUNT &&
|
||||
value.every((item) => typeof item === 'number' && Number.isFinite(item))
|
||||
) {
|
||||
return value
|
||||
}
|
||||
|
||||
throw new Error(`Expected JSON number[${REGISTER_COUNT}]`)
|
||||
return JSON.parse(payload.toString('utf8')) as number[]
|
||||
}
|
||||
|
||||
async function postMetrics(metrics: MappedMetric[]): Promise<void> {
|
||||
|
||||
@@ -4,7 +4,6 @@ import type { TopicHandler } from '../types.js'
|
||||
export const TOPIC = 'data/edge5/modbus/v1'
|
||||
|
||||
const EDGE = 'edge5'
|
||||
const REGISTER_COUNT = 125
|
||||
|
||||
type Edge5ModbusMetric = {
|
||||
edge: string
|
||||
@@ -14,23 +13,7 @@ type Edge5ModbusMetric = {
|
||||
}
|
||||
|
||||
function parseValues(payload: Buffer): number[] {
|
||||
let value: unknown
|
||||
|
||||
try {
|
||||
value = JSON.parse(payload.toString('utf8')) as unknown
|
||||
} catch {
|
||||
throw new Error(`Expected JSON number[${REGISTER_COUNT}]`)
|
||||
}
|
||||
|
||||
if (
|
||||
Array.isArray(value) &&
|
||||
value.length === REGISTER_COUNT &&
|
||||
value.every((item) => typeof item === 'number' && Number.isFinite(item))
|
||||
) {
|
||||
return value
|
||||
}
|
||||
|
||||
throw new Error(`Expected JSON number[${REGISTER_COUNT}]`)
|
||||
return JSON.parse(payload.toString('utf8')) as number[]
|
||||
}
|
||||
|
||||
function toMetrics(values: number[], timestamp: number): Edge5ModbusMetric[] {
|
||||
@@ -47,12 +30,7 @@ async function postMetrics(metrics: Edge5ModbusMetric[]): Promise<void> {
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text()
|
||||
console.error('edge5.modbus.post_error', {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
body: text.slice(0, 500),
|
||||
})
|
||||
return
|
||||
throw new Error(text)
|
||||
}
|
||||
|
||||
console.log('edge5.modbus.posted', { count: metrics.length })
|
||||
@@ -61,15 +39,7 @@ async function postMetrics(metrics: Edge5ModbusMetric[]): Promise<void> {
|
||||
export const handleEdge5Modbus: TopicHandler = async (topic, payload) => {
|
||||
console.log('edge5.modbus.received', { topic, bytes: payload.length })
|
||||
|
||||
let values: number[]
|
||||
|
||||
try {
|
||||
values = parseValues(payload)
|
||||
} catch (err) {
|
||||
console.warn('edge5.modbus.invalid_payload', { topic, err })
|
||||
return
|
||||
}
|
||||
|
||||
const values = parseValues(payload)
|
||||
const metrics = toMetrics(values, Date.now())
|
||||
await postMetrics(metrics)
|
||||
}
|
||||
|
||||
@@ -7,14 +7,6 @@ export function parseJson<T = unknown>(payload: Buffer): T {
|
||||
return JSON.parse(text) as T
|
||||
}
|
||||
|
||||
export function parseJsonArray(payload: Buffer): unknown[] {
|
||||
const value = parseJson(payload)
|
||||
if (!Array.isArray(value)) {
|
||||
throw new Error('Expected JSON array')
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
export function decodeBase64(payload: Buffer): Buffer {
|
||||
return Buffer.from(payload.toString('utf8'), 'base64')
|
||||
}
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
const EXPECTED_CHUNK_LENGTH = 125
|
||||
|
||||
export function isNonEmptyString(value: unknown): value is string {
|
||||
return typeof value === 'string' && value.length > 0
|
||||
}
|
||||
|
||||
export function isFiniteNumber(value: unknown): value is number {
|
||||
return typeof value === 'number' && Number.isFinite(value)
|
||||
}
|
||||
|
||||
export function isArrayOfLength(
|
||||
value: unknown,
|
||||
length: number,
|
||||
): value is unknown[] {
|
||||
return Array.isArray(value) && value.length === length
|
||||
}
|
||||
|
||||
export function isArrayOfLength125(value: unknown): value is unknown[] {
|
||||
return isArrayOfLength(value, EXPECTED_CHUNK_LENGTH)
|
||||
}
|
||||
|
||||
export function isArrayOfChunks125(
|
||||
value: unknown,
|
||||
): value is unknown[][] {
|
||||
if (!Array.isArray(value)) {
|
||||
return false
|
||||
}
|
||||
return value.every((chunk) => isArrayOfLength125(chunk))
|
||||
}
|
||||
|
||||
export function assertValid<T>(
|
||||
value: unknown,
|
||||
guard: (v: unknown) => v is T,
|
||||
label: string,
|
||||
): asserts value is T {
|
||||
if (!guard(value)) {
|
||||
throw new Error(`Invalid payload: ${label}`)
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,6 @@ type MappingConfig = {
|
||||
|
||||
export type MetricMapper = {
|
||||
edge: string
|
||||
tagCount: number
|
||||
mapValues: (values: number[], timestamp: number) => MappedMetric[]
|
||||
}
|
||||
|
||||
@@ -34,7 +33,6 @@ export function createMetricMapper(options: MetricMapperOptions): MetricMapper {
|
||||
|
||||
return {
|
||||
edge: config.edge,
|
||||
tagCount: config.tags.length,
|
||||
mapValues: (values, timestamp) =>
|
||||
values.map((value, index) => ({
|
||||
edge: config.edge,
|
||||
|
||||
Reference in New Issue
Block a user