-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathssh.test.ts
More file actions
65 lines (54 loc) · 1.63 KB
/
ssh.test.ts
File metadata and controls
65 lines (54 loc) · 1.63 KB
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
62
63
64
65
import { createConnection } from "node:net";
import { Server, utils } from "ssh2";
import { DockerClient } from "../lib";
const SSH_PORT = 34567;
test("ssh", async () => {
const onPiped = jest.fn();
const server = await startServer(onPiped);
const client = await DockerClient({
baseURL: new URL("unix:/var/run/docker.sock"),
ssh: {
user: "hello",
host: "127.0.0.1",
port: SSH_PORT,
key: Buffer.from(utils.generateKeyPairSync("ed25519").private, "utf8"),
},
});
const systemInfo = await client.System.Info();
expect(systemInfo.ID).toHaveLength(36);
expect(onPiped).toHaveBeenCalled();
await client.close();
await stopServer(server);
});
async function stopServer(server: Server) {
return new Promise<void>((resolve, reject) => {
server.close((err) => {
if (err) return reject(err);
return resolve();
});
});
}
async function startServer(onPiped: jest.Mock) {
return new Promise<Server>((resolve) => {
const server = new Server({ hostKeys: [utils.generateKeyPairSync("ed25519").private] }, (client) => {
client
.on("authentication", (context) => {
context.accept();
})
.on("ready", () => {
client.on("openssh.streamlocal", (accept, _, info) => {
const socket = createConnection(info.socketPath);
socket.on("ready", () => {
const stream = accept();
stream.pipe(socket);
socket.pipe(stream);
onPiped();
});
});
});
});
server.listen(SSH_PORT, "127.0.0.1", () => {
return resolve(server);
});
});
}