in src/common/packager.ts [361:400]
public async forMessage(message: string, arg: Omit<MetroEventData, "data">): Promise<void> {
await this.awaitStart();
if (!this.packagerSocket || this.packagerSocket.CLOSED || this.packagerSocket.CLOSING) {
const wsUrl = `ws://${this.getHost()}/events`;
this.packagerSocket = new WebSocket(wsUrl, {
origin: `http://${this.getHost()}/debugger-ui`, // random url because of packager bug
});
}
return new Promise<void>((resolve, reject) => {
const resolveHandler = async (handlerArg: string) => {
const parsed: MetroEventData = JSON.parse(handlerArg);
const value = parsed.data?.[0];
if (
arg.level !== parsed.level ||
arg.type !== parsed.type ||
arg.mode !== parsed.mode ||
!value ||
typeof value !== "string"
) {
return;
}
if (value.includes(message)) {
assert(this.packagerSocket);
resolve();
this.packagerSocket.removeListener("message", resolveHandler);
this.packagerSocket.removeListener("error", reject);
this.packagerSocket.removeListener("close", reject);
}
};
assert(this.packagerSocket);
this.packagerSocket.addListener("error", reject);
this.packagerSocket.addListener("close", reject);
this.packagerSocket.addListener("message", resolveHandler);
});
}