Cleaned up the frame.ts by splitting payload parsing to subpackages
This commit is contained in:
69
src/payload.query.ts
Normal file
69
src/payload.query.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user