aboutsummaryrefslogtreecommitdiff
path: root/packages/bun-inspector-protocol/test/util/preview.test.ts
blob: 99214ef0ef405d81796919ca7cfefb6b3cbf59b4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { beforeAll, afterAll, test, expect } from "bun:test";
import type { PipedSubprocess } from "bun";
import { spawn } from "bun";
import type { JSC } from "../..";
import { WebSocketInspector, remoteObjectToString } from "../..";

let subprocess: PipedSubprocess | undefined;
let objects: JSC.Runtime.RemoteObject[] = [];

beforeAll(async () => {
  subprocess = spawn({
    cwd: import.meta.dir,
    cmd: [process.argv0, "--inspect-wait=0", "preview.js"],
    stdout: "pipe",
    stderr: "pipe",
    stdin: "pipe",
  });
  const decoder = new TextDecoder();
  let url: URL;
  for await (const chunk of subprocess!.stdout) {
    const text = decoder.decode(chunk);
    if (text.includes("ws://")) {
      url = new URL(/(ws:\/\/.*)/.exec(text)![0]);
      break;
    }
  }
  objects = await new Promise((resolve, reject) => {
    const inspector = new WebSocketInspector({
      url,
      listener: {
        ["Inspector.connected"]: () => {
          inspector.send("Inspector.enable");
          inspector.send("Runtime.enable");
          inspector.send("Console.enable");
          inspector.send("Debugger.enable");
          inspector.send("Debugger.resume");
          inspector.send("Inspector.initialized");
        },
        ["Inspector.disconnected"]: error => {
          reject(error);
        },
        ["Console.messageAdded"]: ({ message }) => {
          const { parameters } = message;
          resolve(parameters!);
          inspector.close();
        },
      },
    });
    inspector.start();
  });
});

afterAll(() => {
  subprocess?.kill();
});

test("remoteObjectToString", () => {
  for (const object of objects) {
    expect(remoteObjectToString(object)).toMatchSnapshot();
  }
});