96 lines
2.5 KiB
TypeScript
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 } |