iwa-inspector/src/messages/index.ts
2023-12-14 22:13:56 -05:00

96 lines
2.5 KiB
TypeScript

type MessageTypes = "N" | "K" | "P";
export type { MessageTypes };
type LUT = {[id: number|string]: string};
import N from "./numbers";
import K from "./keynote";
import P from "./pages";
const Messages: {[key in MessageTypes]: LUT} = { N, K, P };
export default Messages;
type ProtoMap = {[key: string]: string};
const post_process = (buf: string, key: string, out: ProtoMap) => {
let payload = "", nested = false;
buf.split("\n").forEach(row => {
if(row.startsWith(" message") || row.startsWith(" enum")) {
nested = true
payload = row + "\n";
} else if(row.startsWith(" }")) {
payload += row + "\n";
nested = false;
payload = payload.replace(/^ /mg, "");
let new_key = "";
payload = payload.replace(/^(message|enum) ([\S]*)/, (_, $1, $2) => {
new_key = key + "." + $2;
return $1 + " " + key + "." + $2
});
out[new_key] = payload;
post_process(payload, new_key, out);
payload = "";
} else if(nested) payload += row + "\n";
});
};
const parse_protos = (text: string): ProtoMap => {
const out: ProtoMap = {};
let buf = "", key = "";
text.split("\n").forEach(line => {
if(line.startsWith("message") || line.startsWith("enum")) {
key = line.split(" ")[1];
buf = line + "\n";
}
else if(line.startsWith(" ")) buf += line + "\n";
else if(line == "}") {
buf += line;
out[key] = buf;
post_process(buf, key, out);
}
else if(!line){/*empty*/}
else if(line.startsWith("extend")) {
key = line.split(" ")[1];
buf = out[key] + "\n" + line + "\n";
}
else throw line;
});
return out;
};
export { parse_protos };
export type { ProtoMap };
interface $_TSP_Reference {
identifier: bigint;
}
interface $_TSP_FieldPath {
path?: number[];
}
interface $_TSP_FieldInfo {
path: $_TSP_FieldPath;
type?: number;
unknown_field_rule?: number;
object_references?: bigint[];
data_references?: bigint[];
known_field_rule?: number;
known_field_version?: number[];
known_field_feature_identifier?: string;
$object_references?: $_TSP_Reference[];
}
interface $_TSP_MessageInfo {
type: number;
version: number[];
length: number;
field_infos?: $_TSP_FieldInfo[];
object_references?: bigint[];
data_references?: bigint[];
base_message_index?: number;
diff_merge_version?: number[];
diff_field_path?: $_TSP_FieldPath;
fields_to_remove?: $_TSP_FieldPath[];
diff_read_version?: number[];
$object_references?: $_TSP_Reference[];
}
export type { $_TSP_MessageInfo, $_TSP_Reference }