Files
aprs.ts/src/payload.query.ts

70 lines
1.8 KiB
TypeScript

import { FieldType, type Segment } from "@hamradio/packet";
import { DataType, type Payload, type QueryPayload } from "./frame.types";
export const decodeQueryPayload = (
raw: string,
withStructure: boolean = false
): {
payload: Payload | null;
segment?: Segment[];
} => {
try {
if (raw.length < 2) return { payload: null };
// Skip data type identifier '?'
const segments: Segment[] = withStructure ? [] : [];
// Remaining payload
const rest = raw.substring(1).trim();
if (!rest) return { payload: null };
// Query type is the first token (up to first space)
const firstSpace = rest.indexOf(" ");
let queryType = "";
let target: string | undefined = undefined;
if (firstSpace === -1) {
queryType = rest;
} else {
queryType = rest.substring(0, firstSpace);
target = rest.substring(firstSpace + 1).trim();
if (target === "") target = undefined;
}
if (!queryType) return { payload: null };
if (withStructure) {
// Emit query type section
segments.push({
name: "query type",
data: new TextEncoder().encode(queryType).buffer,
isString: true,
fields: [{ type: FieldType.STRING, name: "type", length: queryType.length }]
});
if (target) {
segments.push({
name: "query target",
data: new TextEncoder().encode(target).buffer,
isString: true,
fields: [{ type: FieldType.STRING, name: "target", length: target.length }]
});
}
}
const payload: QueryPayload = {
type: DataType.Query,
queryType,
...(target ? { target } : {})
};
if (withStructure) return { payload, segment: segments };
return { payload };
} catch {
return { payload: null };
}
};
export default decodeQueryPayload;