70 lines
1.8 KiB
TypeScript
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;
|