@lhremote/cli 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/handlers/check-status.d.ts +5 -0
- package/dist/handlers/check-status.d.ts.map +1 -0
- package/dist/handlers/check-status.js +44 -0
- package/dist/handlers/check-status.js.map +1 -0
- package/dist/handlers/check-status.test.d.ts +2 -0
- package/dist/handlers/check-status.test.d.ts.map +1 -0
- package/dist/handlers/check-status.test.js +110 -0
- package/dist/handlers/check-status.test.js.map +1 -0
- package/dist/handlers/index.d.ts +8 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +8 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/launch-app.d.ts +4 -0
- package/dist/handlers/launch-app.d.ts.map +1 -0
- package/dist/handlers/launch-app.js +15 -0
- package/dist/handlers/launch-app.js.map +1 -0
- package/dist/handlers/launch-app.test.d.ts +2 -0
- package/dist/handlers/launch-app.test.d.ts.map +1 -0
- package/dist/handlers/launch-app.test.js +62 -0
- package/dist/handlers/launch-app.test.js.map +1 -0
- package/dist/handlers/list-accounts.d.ts +5 -0
- package/dist/handlers/list-accounts.d.ts.map +1 -0
- package/dist/handlers/list-accounts.js +37 -0
- package/dist/handlers/list-accounts.js.map +1 -0
- package/dist/handlers/list-accounts.test.d.ts +2 -0
- package/dist/handlers/list-accounts.test.d.ts.map +1 -0
- package/dist/handlers/list-accounts.test.js +96 -0
- package/dist/handlers/list-accounts.test.js.map +1 -0
- package/dist/handlers/quit-app.d.ts +4 -0
- package/dist/handlers/quit-app.d.ts.map +1 -0
- package/dist/handlers/quit-app.js +15 -0
- package/dist/handlers/quit-app.js.map +1 -0
- package/dist/handlers/quit-app.test.d.ts +2 -0
- package/dist/handlers/quit-app.test.d.ts.map +1 -0
- package/dist/handlers/quit-app.test.js +68 -0
- package/dist/handlers/quit-app.test.js.map +1 -0
- package/dist/handlers/start-instance.d.ts +4 -0
- package/dist/handlers/start-instance.d.ts.map +1 -0
- package/dist/handlers/start-instance.js +36 -0
- package/dist/handlers/start-instance.js.map +1 -0
- package/dist/handlers/start-instance.test.d.ts +2 -0
- package/dist/handlers/start-instance.test.d.ts.map +1 -0
- package/dist/handlers/start-instance.test.js +122 -0
- package/dist/handlers/start-instance.test.js.map +1 -0
- package/dist/handlers/stop-instance.d.ts +4 -0
- package/dist/handlers/stop-instance.d.ts.map +1 -0
- package/dist/handlers/stop-instance.js +28 -0
- package/dist/handlers/stop-instance.js.map +1 -0
- package/dist/handlers/stop-instance.test.d.ts +2 -0
- package/dist/handlers/stop-instance.test.d.ts.map +1 -0
- package/dist/handlers/stop-instance.test.js +82 -0
- package/dist/handlers/stop-instance.test.js.map +1 -0
- package/dist/handlers/visit-and-extract.d.ts +5 -0
- package/dist/handlers/visit-and-extract.d.ts.map +1 -0
- package/dist/handlers/visit-and-extract.js +105 -0
- package/dist/handlers/visit-and-extract.js.map +1 -0
- package/dist/handlers/visit-and-extract.test.d.ts +2 -0
- package/dist/handlers/visit-and-extract.test.d.ts.map +1 -0
- package/dist/handlers/visit-and-extract.test.js +279 -0
- package/dist/handlers/visit-and-extract.test.js.map +1 -0
- package/dist/program.d.ts +6 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +65 -0
- package/dist/program.js.map +1 -0
- package/dist/program.test.d.ts +2 -0
- package/dist/program.test.d.ts.map +1 -0
- package/dist/program.test.js +92 -0
- package/dist/program.test.js.map +1 -0
- package/package.json +22 -12
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { LauncherService, startInstanceWithRecovery, } from "@lhremote/core";
|
|
2
|
+
export async function handleStartInstance(accountIdArg, options) {
|
|
3
|
+
const accountId = Number(accountIdArg);
|
|
4
|
+
const cdpPort = options.cdpPort ?? 9222;
|
|
5
|
+
const launcher = new LauncherService(cdpPort);
|
|
6
|
+
try {
|
|
7
|
+
await launcher.connect();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
11
|
+
process.stderr.write(`${message}\n`);
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const outcome = await startInstanceWithRecovery(launcher, accountId, cdpPort);
|
|
17
|
+
if (outcome.status === "timeout") {
|
|
18
|
+
process.stderr.write("Instance started but failed to initialize within timeout.\n");
|
|
19
|
+
process.exitCode = 1;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const verb = outcome.status === "already_running"
|
|
23
|
+
? "already running"
|
|
24
|
+
: "started";
|
|
25
|
+
process.stdout.write(`Instance ${verb} for account ${String(accountId)} on CDP port ${String(outcome.port)}\n`);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
29
|
+
process.stderr.write(`${message}\n`);
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
launcher.disconnect();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=start-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-instance.js","sourceRoot":"","sources":["../../src/handlers/start-instance.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAAoB,EACpB,OAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAC7C,QAAQ,EACR,SAAS,EACT,OAAO,CACR,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6DAA6D,CAC9D,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,KAAK,iBAAiB;YAClC,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,SAAS,CAAC;QAEhB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,IAAI,gBAAgB,MAAM,CAAC,SAAS,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAC1F,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-instance.test.d.ts","sourceRoot":"","sources":["../../src/handlers/start-instance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
3
|
+
const actual = await importOriginal();
|
|
4
|
+
return {
|
|
5
|
+
...actual,
|
|
6
|
+
LauncherService: vi.fn(),
|
|
7
|
+
startInstanceWithRecovery: vi.fn(),
|
|
8
|
+
};
|
|
9
|
+
});
|
|
10
|
+
import { LauncherService, LinkedHelperNotRunningError, startInstanceWithRecovery, } from "@lhremote/core";
|
|
11
|
+
import { handleStartInstance } from "./start-instance.js";
|
|
12
|
+
describe("handleStartInstance", () => {
|
|
13
|
+
const originalExitCode = process.exitCode;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
process.exitCode = undefined;
|
|
16
|
+
vi.clearAllMocks();
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
process.exitCode = originalExitCode;
|
|
20
|
+
vi.restoreAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it("prints success with port on successful start", async () => {
|
|
23
|
+
const stdoutSpy = vi
|
|
24
|
+
.spyOn(process.stdout, "write")
|
|
25
|
+
.mockReturnValue(true);
|
|
26
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
27
|
+
return {
|
|
28
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
29
|
+
disconnect: vi.fn(),
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
vi.mocked(startInstanceWithRecovery).mockResolvedValue({
|
|
33
|
+
status: "started",
|
|
34
|
+
port: 55123,
|
|
35
|
+
});
|
|
36
|
+
await handleStartInstance("42", {});
|
|
37
|
+
expect(stdoutSpy).toHaveBeenCalledWith("Instance started for account 42 on CDP port 55123\n");
|
|
38
|
+
expect(process.exitCode).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
it("sets exitCode 1 on connection error", async () => {
|
|
41
|
+
const stderrSpy = vi
|
|
42
|
+
.spyOn(process.stderr, "write")
|
|
43
|
+
.mockReturnValue(true);
|
|
44
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
45
|
+
return {
|
|
46
|
+
connect: vi
|
|
47
|
+
.fn()
|
|
48
|
+
.mockRejectedValue(new LinkedHelperNotRunningError(9222)),
|
|
49
|
+
disconnect: vi.fn(),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
await handleStartInstance("42", {});
|
|
53
|
+
expect(process.exitCode).toBe(1);
|
|
54
|
+
expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("not running"));
|
|
55
|
+
});
|
|
56
|
+
it("handles idempotent 'already running' when port available", async () => {
|
|
57
|
+
const stdoutSpy = vi
|
|
58
|
+
.spyOn(process.stdout, "write")
|
|
59
|
+
.mockReturnValue(true);
|
|
60
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
61
|
+
return {
|
|
62
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
63
|
+
disconnect: vi.fn(),
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
vi.mocked(startInstanceWithRecovery).mockResolvedValue({
|
|
67
|
+
status: "already_running",
|
|
68
|
+
port: 55123,
|
|
69
|
+
});
|
|
70
|
+
await handleStartInstance("42", {});
|
|
71
|
+
expect(stdoutSpy).toHaveBeenCalledWith("Instance already running for account 42 on CDP port 55123\n");
|
|
72
|
+
expect(process.exitCode).toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
it("sets exitCode 1 on unexpected error", async () => {
|
|
75
|
+
const stderrSpy = vi
|
|
76
|
+
.spyOn(process.stderr, "write")
|
|
77
|
+
.mockReturnValue(true);
|
|
78
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
79
|
+
return {
|
|
80
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
81
|
+
disconnect: vi.fn(),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
vi.mocked(startInstanceWithRecovery).mockRejectedValue(new Error("unexpected failure"));
|
|
85
|
+
await handleStartInstance("42", {});
|
|
86
|
+
expect(process.exitCode).toBe(1);
|
|
87
|
+
expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("unexpected failure"));
|
|
88
|
+
});
|
|
89
|
+
it("passes cdpPort option to LauncherService", async () => {
|
|
90
|
+
vi.spyOn(process.stdout, "write").mockReturnValue(true);
|
|
91
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
92
|
+
return {
|
|
93
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
94
|
+
disconnect: vi.fn(),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
vi.mocked(startInstanceWithRecovery).mockResolvedValue({
|
|
98
|
+
status: "started",
|
|
99
|
+
port: 55123,
|
|
100
|
+
});
|
|
101
|
+
await handleStartInstance("42", { cdpPort: 4567 });
|
|
102
|
+
expect(LauncherService).toHaveBeenCalledWith(4567);
|
|
103
|
+
});
|
|
104
|
+
it("sets exitCode 1 when instance fails to initialize within timeout", async () => {
|
|
105
|
+
const stderrSpy = vi
|
|
106
|
+
.spyOn(process.stderr, "write")
|
|
107
|
+
.mockReturnValue(true);
|
|
108
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
109
|
+
return {
|
|
110
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
111
|
+
disconnect: vi.fn(),
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
vi.mocked(startInstanceWithRecovery).mockResolvedValue({
|
|
115
|
+
status: "timeout",
|
|
116
|
+
});
|
|
117
|
+
await handleStartInstance("42", {});
|
|
118
|
+
expect(process.exitCode).toBe(1);
|
|
119
|
+
expect(stderrSpy).toHaveBeenCalledWith("Instance started but failed to initialize within timeout.\n");
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=start-instance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-instance.test.js","sourceRoot":"","sources":["../../src/handlers/start-instance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.d.ts","sourceRoot":"","sources":["../../src/handlers/stop-instance.ts"],"names":[],"mappings":"AAEA,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LauncherService } from "@lhremote/core";
|
|
2
|
+
export async function handleStopInstance(accountIdArg, options) {
|
|
3
|
+
const accountId = Number(accountIdArg);
|
|
4
|
+
const cdpPort = options.cdpPort ?? 9222;
|
|
5
|
+
const launcher = new LauncherService(cdpPort);
|
|
6
|
+
try {
|
|
7
|
+
await launcher.connect();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
11
|
+
process.stderr.write(`${message}\n`);
|
|
12
|
+
process.exitCode = 1;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
await launcher.stopInstance(accountId);
|
|
17
|
+
process.stdout.write(`Instance stopped for account ${String(accountId)}\n`);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
21
|
+
process.stderr.write(`${message}\n`);
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
launcher.disconnect();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=stop-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.js","sourceRoot":"","sources":["../../src/handlers/stop-instance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAoB,EACpB,OAA6B;IAE7B,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gCAAgC,MAAM,CAAC,SAAS,CAAC,IAAI,CACtD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.test.d.ts","sourceRoot":"","sources":["../../src/handlers/stop-instance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
vi.mock("@lhremote/core", async (importOriginal) => {
|
|
3
|
+
const actual = await importOriginal();
|
|
4
|
+
return {
|
|
5
|
+
...actual,
|
|
6
|
+
LauncherService: vi.fn(),
|
|
7
|
+
};
|
|
8
|
+
});
|
|
9
|
+
import { LauncherService, LinkedHelperNotRunningError, } from "@lhremote/core";
|
|
10
|
+
import { handleStopInstance } from "./stop-instance.js";
|
|
11
|
+
describe("handleStopInstance", () => {
|
|
12
|
+
const originalExitCode = process.exitCode;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
process.exitCode = undefined;
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
process.exitCode = originalExitCode;
|
|
19
|
+
vi.restoreAllMocks();
|
|
20
|
+
});
|
|
21
|
+
it("prints success on successful stop", async () => {
|
|
22
|
+
const stdoutSpy = vi
|
|
23
|
+
.spyOn(process.stdout, "write")
|
|
24
|
+
.mockReturnValue(true);
|
|
25
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
26
|
+
return {
|
|
27
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
28
|
+
disconnect: vi.fn(),
|
|
29
|
+
stopInstance: vi.fn().mockResolvedValue(undefined),
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
await handleStopInstance("42", {});
|
|
33
|
+
expect(stdoutSpy).toHaveBeenCalledWith("Instance stopped for account 42\n");
|
|
34
|
+
expect(process.exitCode).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
it("sets exitCode 1 on connection error", async () => {
|
|
37
|
+
const stderrSpy = vi
|
|
38
|
+
.spyOn(process.stderr, "write")
|
|
39
|
+
.mockReturnValue(true);
|
|
40
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
41
|
+
return {
|
|
42
|
+
connect: vi
|
|
43
|
+
.fn()
|
|
44
|
+
.mockRejectedValue(new LinkedHelperNotRunningError(9222)),
|
|
45
|
+
disconnect: vi.fn(),
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
await handleStopInstance("42", {});
|
|
49
|
+
expect(process.exitCode).toBe(1);
|
|
50
|
+
expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining("not running"));
|
|
51
|
+
});
|
|
52
|
+
it("sets exitCode 1 on unexpected error", async () => {
|
|
53
|
+
const stderrSpy = vi
|
|
54
|
+
.spyOn(process.stderr, "write")
|
|
55
|
+
.mockReturnValue(true);
|
|
56
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
57
|
+
return {
|
|
58
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
59
|
+
disconnect: vi.fn(),
|
|
60
|
+
stopInstance: vi
|
|
61
|
+
.fn()
|
|
62
|
+
.mockRejectedValue(new Error("unexpected failure")),
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
await handleStopInstance("42", {});
|
|
66
|
+
expect(process.exitCode).toBe(1);
|
|
67
|
+
expect(stderrSpy).toHaveBeenCalledWith("unexpected failure\n");
|
|
68
|
+
});
|
|
69
|
+
it("passes cdpPort option to LauncherService", async () => {
|
|
70
|
+
vi.spyOn(process.stdout, "write").mockReturnValue(true);
|
|
71
|
+
vi.mocked(LauncherService).mockImplementation(function () {
|
|
72
|
+
return {
|
|
73
|
+
connect: vi.fn().mockResolvedValue(undefined),
|
|
74
|
+
disconnect: vi.fn(),
|
|
75
|
+
stopInstance: vi.fn().mockResolvedValue(undefined),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
await handleStopInstance("42", { cdpPort: 4567 });
|
|
79
|
+
expect(LauncherService).toHaveBeenCalledWith(4567);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=stop-instance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-instance.test.js","sourceRoot":"","sources":["../../src/handlers/stop-instance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-and-extract.d.ts","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.ts"],"names":[],"mappings":"AAUA,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CAiHf"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { DatabaseClient, discoverDatabase, discoverInstancePort, InstanceService, LauncherService, ProfileService, } from "@lhremote/core";
|
|
2
|
+
export async function handleVisitAndExtract(profileUrl, options) {
|
|
3
|
+
if (!isLinkedInProfileUrl(profileUrl)) {
|
|
4
|
+
process.stderr.write("Invalid LinkedIn profile URL. Expected: https://www.linkedin.com/in/username\n");
|
|
5
|
+
process.exitCode = 1;
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const cdpPort = options.cdpPort ?? 9222;
|
|
9
|
+
// Connect to launcher to find the running account
|
|
10
|
+
const launcher = new LauncherService(cdpPort);
|
|
11
|
+
let accountId;
|
|
12
|
+
try {
|
|
13
|
+
await launcher.connect();
|
|
14
|
+
const accounts = await launcher.listAccounts();
|
|
15
|
+
if (accounts.length === 0) {
|
|
16
|
+
process.stderr.write("No accounts found.\n");
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (accounts.length > 1) {
|
|
21
|
+
process.stderr.write("Multiple accounts found. Cannot determine which instance to use.\n");
|
|
22
|
+
process.exitCode = 1;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
accountId = accounts[0].id;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
29
|
+
process.stderr.write(`${message}\n`);
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
launcher.disconnect();
|
|
35
|
+
}
|
|
36
|
+
// Discover instance CDP port
|
|
37
|
+
const instancePort = await discoverInstancePort(cdpPort);
|
|
38
|
+
if (instancePort === null) {
|
|
39
|
+
process.stderr.write("No LinkedHelper instance is running. Use start-instance first.\n");
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Connect to instance and extract profile
|
|
44
|
+
const instance = new InstanceService(instancePort);
|
|
45
|
+
let db = null;
|
|
46
|
+
try {
|
|
47
|
+
await instance.connect();
|
|
48
|
+
const dbPath = discoverDatabase(accountId);
|
|
49
|
+
db = new DatabaseClient(dbPath);
|
|
50
|
+
const profileService = new ProfileService(instance, db);
|
|
51
|
+
const profile = await profileService.visitAndExtract(profileUrl);
|
|
52
|
+
if (options.json) {
|
|
53
|
+
process.stdout.write(JSON.stringify(profile, null, 2) + "\n");
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const name = [
|
|
57
|
+
profile.miniProfile.firstName,
|
|
58
|
+
profile.miniProfile.lastName,
|
|
59
|
+
]
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
.join(" ");
|
|
62
|
+
process.stdout.write(`${name}\n`);
|
|
63
|
+
if (profile.miniProfile.headline) {
|
|
64
|
+
process.stdout.write(`${profile.miniProfile.headline}\n`);
|
|
65
|
+
}
|
|
66
|
+
if (profile.currentPosition) {
|
|
67
|
+
const parts = [
|
|
68
|
+
profile.currentPosition.title,
|
|
69
|
+
profile.currentPosition.company,
|
|
70
|
+
].filter(Boolean);
|
|
71
|
+
if (parts.length > 0) {
|
|
72
|
+
process.stdout.write(`${parts.join(" at ")}\n`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (profile.emails.length > 0) {
|
|
76
|
+
process.stdout.write(`Emails: ${profile.emails.join(", ")}\n`);
|
|
77
|
+
}
|
|
78
|
+
if (profile.skills.length > 0) {
|
|
79
|
+
process.stdout.write(`Skills: ${profile.skills.map((s) => s.name).join(", ")}\n`);
|
|
80
|
+
}
|
|
81
|
+
process.stdout.write(`Positions: ${String(profile.positions.length)}, Education: ${String(profile.education.length)}\n`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
+
process.stderr.write(`${message}\n`);
|
|
87
|
+
process.exitCode = 1;
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
instance.disconnect();
|
|
91
|
+
db?.close();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function isLinkedInProfileUrl(url) {
|
|
95
|
+
try {
|
|
96
|
+
const parsed = new URL(url);
|
|
97
|
+
return ((parsed.hostname === "www.linkedin.com" ||
|
|
98
|
+
parsed.hostname === "linkedin.com") &&
|
|
99
|
+
parsed.pathname.startsWith("/in/"));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=visit-and-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-and-extract.js","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visit-and-extract.test.d.ts","sourceRoot":"","sources":["../../src/handlers/visit-and-extract.test.ts"],"names":[],"mappings":""}
|