@burdenoff/vibe-plugin-ssh 1.0.1 → 2.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.
@@ -1,67 +1,169 @@
1
- import crypto from "node:crypto";
1
+ /**
2
+ * Port-forwarding routes (Elysia + KV storage).
3
+ *
4
+ * Namespace: "ssh"
5
+ * Keys:
6
+ * "connections" → JSON array of SSHConnection objects (read-only here)
7
+ * "port-forwards" → JSON array of PortForward objects
8
+ */
9
+ import { Elysia } from "elysia";
2
10
  import { Client } from "ssh2";
3
- import { createServer } from "net";
4
- import { readFileSync } from "fs";
5
- // Store active connections and servers
11
+ import { createServer } from "node:net";
12
+ // ---------------------------------------------------------------------------
13
+ // In-memory map of currently active tunnels
14
+ // ---------------------------------------------------------------------------
6
15
  const activeConnections = new Map();
7
- export const portForwardRoutes = async (fastify) => {
8
- // Get all port forwards
9
- fastify.get("/", async (_request, _reply) => {
10
- const portForwards = fastify.db.getAllPortForwards();
16
+ // ---------------------------------------------------------------------------
17
+ // KV helpers connections (read-only from this module)
18
+ // ---------------------------------------------------------------------------
19
+ async function getConnectionById(storage, id) {
20
+ const raw = await storage.get("ssh", "connections");
21
+ if (!raw)
22
+ return undefined;
23
+ const all = JSON.parse(raw);
24
+ return all.find((c) => c.id === id);
25
+ }
26
+ async function getConnectionByName(storage, serverName) {
27
+ const raw = await storage.get("ssh", "connections");
28
+ if (!raw)
29
+ return undefined;
30
+ const all = JSON.parse(raw);
31
+ return all.find((c) => c.serverName === serverName);
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // KV helpers – port forwards
35
+ // ---------------------------------------------------------------------------
36
+ async function getAllPortForwards(storage) {
37
+ const raw = await storage.get("ssh", "port-forwards");
38
+ if (!raw)
39
+ return [];
40
+ return JSON.parse(raw);
41
+ }
42
+ async function getPortForwardById(storage, id) {
43
+ const all = await getAllPortForwards(storage);
44
+ return all.find((pf) => pf.id === id);
45
+ }
46
+ async function savePortForwards(storage, forwards) {
47
+ await storage.set("ssh", "port-forwards", JSON.stringify(forwards));
48
+ }
49
+ async function updatePortForward(storage, id, patch) {
50
+ const all = await getAllPortForwards(storage);
51
+ const idx = all.findIndex((pf) => pf.id === id);
52
+ if (idx !== -1) {
53
+ all[idx] = { ...all[idx], ...patch };
54
+ await savePortForwards(storage, all);
55
+ }
56
+ }
57
+ async function deletePortForwardById(storage, id) {
58
+ const all = await getAllPortForwards(storage);
59
+ const filtered = all.filter((pf) => pf.id !== id);
60
+ await savePortForwards(storage, filtered);
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // Build an ssh2 connect config from a stored connection
64
+ // ---------------------------------------------------------------------------
65
+ async function buildConnectConfig(conn) {
66
+ const cfg = {
67
+ host: conn.host,
68
+ port: conn.port,
69
+ username: conn.username,
70
+ };
71
+ if (conn.privateKeyPath) {
72
+ const file = Bun.file(conn.privateKeyPath);
73
+ cfg.privateKey = Buffer.from(await file.arrayBuffer());
74
+ }
75
+ else if (conn.password) {
76
+ cfg.password = conn.password;
77
+ }
78
+ return cfg;
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Cleanup helper — exported so onServerStop can call it too
82
+ // ---------------------------------------------------------------------------
83
+ export function cleanupAllTunnels() {
84
+ for (const [, { client, server }] of activeConnections) {
85
+ server.close();
86
+ client.end();
87
+ }
88
+ activeConnections.clear();
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // Route factory
92
+ // ---------------------------------------------------------------------------
93
+ export function createPortForwardRoutes(hostServices) {
94
+ const { storage, eventBus } = hostServices;
95
+ return (new Elysia({ prefix: "/api/port-forward" })
96
+ // -----------------------------------------------------------------------
97
+ // GET /api/port-forward — list all port forwards
98
+ // -----------------------------------------------------------------------
99
+ .get("/", async () => {
100
+ const portForwards = await getAllPortForwards(storage);
11
101
  return { portForwards };
12
- });
13
- // Create new port forward
14
- fastify.post("/", async (request, reply) => {
15
- const { localPort, remoteHost, remotePort, connectionId } = request.body;
102
+ })
103
+ // -----------------------------------------------------------------------
104
+ // POST /api/port-forward create a new port forward config
105
+ // -----------------------------------------------------------------------
106
+ .post("/", async ({ body, set }) => {
107
+ const { localPort, remoteHost, remotePort, connectionId } = body;
16
108
  try {
17
- const existing = fastify.db
18
- .getAllPortForwards()
19
- .find((pf) => pf.localPort === localPort && pf.status === "active");
109
+ const existing = (await getAllPortForwards(storage)).find((pf) => pf.localPort === localPort && pf.status === "active");
20
110
  if (existing) {
21
- return reply.code(409).send({ error: "Local port is already in use" });
111
+ set.status = 409;
112
+ return { error: "Local port is already in use" };
22
113
  }
23
- const connectionConfig = fastify.db.getSSHConnection(connectionId);
114
+ const connectionConfig = await getConnectionById(storage, connectionId);
24
115
  if (!connectionConfig) {
25
- return reply.code(404).send({ error: "SSH connection not found" });
116
+ set.status = 404;
117
+ return { error: "SSH connection not found" };
26
118
  }
27
- const portForward = fastify.db.createPortForward({
28
- id: crypto.randomUUID(),
119
+ const newPf = {
120
+ id: globalThis.crypto.randomUUID(),
29
121
  localPort,
30
122
  remoteHost,
31
123
  remotePort,
32
124
  serverName: connectionConfig.serverName,
33
125
  connectionId,
34
126
  status: "inactive",
35
- });
36
- return { portForward };
127
+ createdAt: new Date().toISOString(),
128
+ };
129
+ const all = await getAllPortForwards(storage);
130
+ all.push(newPf);
131
+ await savePortForwards(storage, all);
132
+ return { portForward: newPf };
37
133
  }
38
134
  catch (error) {
39
- return reply.code(500).send({
135
+ set.status = 500;
136
+ return {
40
137
  error: "Failed to create port forward",
41
138
  details: error instanceof Error ? error.message : "Unknown error",
42
- });
139
+ };
43
140
  }
44
- });
45
- // Start port forwarding
46
- fastify.post("/:id/start", async (request, reply) => {
47
- const { id } = request.params;
141
+ })
142
+ // -----------------------------------------------------------------------
143
+ // POST /api/port-forward/:id/start start the tunnel
144
+ // -----------------------------------------------------------------------
145
+ .post("/:id/start", async ({ params, set }) => {
146
+ const { id } = params;
48
147
  try {
49
- const portForward = fastify.db.getPortForward(id);
148
+ const portForward = await getPortForwardById(storage, id);
50
149
  if (!portForward) {
51
- return reply.code(404).send({ error: "Port forward not found" });
150
+ set.status = 404;
151
+ return { error: "Port forward not found" };
52
152
  }
53
153
  if (portForward.status === "active") {
54
- return reply
55
- .code(400)
56
- .send({ error: "Port forward is already active" });
154
+ set.status = 400;
155
+ return { error: "Port forward is already active" };
57
156
  }
157
+ // Resolve connection config (by id first, then by serverName)
58
158
  const connectionConfig = portForward.connectionId
59
- ? fastify.db.getSSHConnection(portForward.connectionId)
60
- : fastify.db.getSSHConnectionByName(portForward.serverName);
159
+ ? await getConnectionById(storage, portForward.connectionId)
160
+ : await getConnectionByName(storage, portForward.serverName);
61
161
  if (!connectionConfig) {
62
- return reply.code(404).send({ error: "SSH connection not found" });
162
+ set.status = 404;
163
+ return { error: "SSH connection not found" };
63
164
  }
64
165
  const sshClient = new Client();
166
+ const connectConfig = await buildConnectConfig(connectionConfig);
65
167
  const server = createServer((localSocket) => {
66
168
  sshClient.forwardOut("localhost", portForward.localPort, portForward.remoteHost, portForward.remotePort, (err, stream) => {
67
169
  if (err) {
@@ -82,14 +184,17 @@ export const portForwardRoutes = async (fastify) => {
82
184
  sshClient.on("ready", () => {
83
185
  server.listen(portForward.localPort, () => {
84
186
  activeConnections.set(id, { client: sshClient, server });
85
- fastify.db.updatePortForward(id, {
86
- status: "active",
87
- connectionId: id,
88
- });
89
- fastify.io.emit("portforward:started", {
90
- id,
91
- localPort: portForward.localPort,
92
- });
187
+ // Persist status change
188
+ void updatePortForward(storage, id, { status: "active" });
189
+ if (eventBus) {
190
+ eventBus.emit("portforward:started", {
191
+ id,
192
+ localPort: portForward.localPort,
193
+ });
194
+ }
195
+ else {
196
+ console.log(`[port-forward] Started tunnel ${id} on localhost:${portForward.localPort}`);
197
+ }
93
198
  resolve({
94
199
  success: true,
95
200
  message: `Port forwarding started on localhost:${portForward.localPort}`,
@@ -97,49 +202,45 @@ export const portForwardRoutes = async (fastify) => {
97
202
  });
98
203
  server.on("error", (err) => {
99
204
  sshClient.end();
100
- resolve(reply.code(500).send({
205
+ set.status = 500;
206
+ resolve({
101
207
  error: "Failed to start local server",
102
208
  details: err.message,
103
- }));
209
+ });
104
210
  });
105
211
  });
106
212
  sshClient.on("error", (err) => {
107
- resolve(reply.code(500).send({
213
+ set.status = 500;
214
+ resolve({
108
215
  error: "SSH connection failed",
109
216
  details: err.message,
110
- }));
217
+ });
111
218
  });
112
- const connectConfig = {
113
- host: connectionConfig.host,
114
- port: connectionConfig.port,
115
- username: connectionConfig.username,
116
- };
117
- if (connectionConfig.privateKeyPath) {
118
- connectConfig.privateKey = readFileSync(connectionConfig.privateKeyPath);
119
- }
120
- else if (connectionConfig.password) {
121
- connectConfig.password = connectionConfig.password;
122
- }
123
219
  sshClient.connect(connectConfig);
124
220
  });
125
221
  }
126
222
  catch (error) {
127
- return reply.code(500).send({
223
+ set.status = 500;
224
+ return {
128
225
  error: "Failed to start port forward",
129
226
  details: error instanceof Error ? error.message : "Unknown error",
130
- });
227
+ };
131
228
  }
132
- });
133
- // Stop port forwarding
134
- fastify.post("/:id/stop", async (request, reply) => {
135
- const { id } = request.params;
229
+ })
230
+ // -----------------------------------------------------------------------
231
+ // POST /api/port-forward/:id/stop stop an active tunnel
232
+ // -----------------------------------------------------------------------
233
+ .post("/:id/stop", async ({ params, set }) => {
234
+ const { id } = params;
136
235
  try {
137
- const portForward = fastify.db.getPortForward(id);
236
+ const portForward = await getPortForwardById(storage, id);
138
237
  if (!portForward) {
139
- return reply.code(404).send({ error: "Port forward not found" });
238
+ set.status = 404;
239
+ return { error: "Port forward not found" };
140
240
  }
141
241
  if (portForward.status !== "active") {
142
- return reply.code(400).send({ error: "Port forward is not active" });
242
+ set.status = 400;
243
+ return { error: "Port forward is not active" };
143
244
  }
144
245
  const active = activeConnections.get(id);
145
246
  if (active) {
@@ -147,31 +248,38 @@ export const portForwardRoutes = async (fastify) => {
147
248
  active.client.end();
148
249
  activeConnections.delete(id);
149
250
  }
150
- fastify.db.updatePortForward(id, {
151
- status: "inactive",
152
- connectionId: undefined,
153
- });
154
- fastify.io.emit("portforward:stopped", {
155
- id,
156
- localPort: portForward.localPort,
157
- });
251
+ await updatePortForward(storage, id, { status: "inactive" });
252
+ if (eventBus) {
253
+ eventBus.emit("portforward:stopped", {
254
+ id,
255
+ localPort: portForward.localPort,
256
+ });
257
+ }
258
+ else {
259
+ console.log(`[port-forward] Stopped tunnel ${id} (localhost:${portForward.localPort})`);
260
+ }
158
261
  return { success: true };
159
262
  }
160
263
  catch (error) {
161
- return reply.code(500).send({
264
+ set.status = 500;
265
+ return {
162
266
  error: "Failed to stop port forward",
163
267
  details: error instanceof Error ? error.message : "Unknown error",
164
- });
268
+ };
165
269
  }
166
- });
167
- // Delete port forward
168
- fastify.delete("/:id", async (request, reply) => {
169
- const { id } = request.params;
270
+ })
271
+ // -----------------------------------------------------------------------
272
+ // DELETE /api/port-forward/:id delete a port forward (stops if active)
273
+ // -----------------------------------------------------------------------
274
+ .delete("/:id", async ({ params, set }) => {
275
+ const { id } = params;
170
276
  try {
171
- const portForward = fastify.db.getPortForward(id);
277
+ const portForward = await getPortForwardById(storage, id);
172
278
  if (!portForward) {
173
- return reply.code(404).send({ error: "Port forward not found" });
279
+ set.status = 404;
280
+ return { error: "Port forward not found" };
174
281
  }
282
+ // Tear down tunnel if still active
175
283
  if (portForward.status === "active") {
176
284
  const active = activeConnections.get(id);
177
285
  if (active) {
@@ -180,23 +288,16 @@ export const portForwardRoutes = async (fastify) => {
180
288
  activeConnections.delete(id);
181
289
  }
182
290
  }
183
- fastify.db.deletePortForward(id);
291
+ await deletePortForwardById(storage, id);
184
292
  return { success: true };
185
293
  }
186
294
  catch (error) {
187
- return reply.code(500).send({
295
+ set.status = 500;
296
+ return {
188
297
  error: "Failed to delete port forward",
189
298
  details: error instanceof Error ? error.message : "Unknown error",
190
- });
191
- }
192
- });
193
- // Cleanup on server close
194
- fastify.addHook("onClose", async () => {
195
- for (const [, { client, server }] of activeConnections) {
196
- server.close();
197
- client.end();
299
+ };
198
300
  }
199
- activeConnections.clear();
200
- });
201
- };
301
+ }));
302
+ }
202
303
  //# sourceMappingURL=port-forward.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"port-forward.js","sourceRoot":"","sources":["../../src/routes/port-forward.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"port-forward.js","sourceRoot":"","sources":["../../src/routes/port-forward.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,167 @@
1
- import { FastifyPluginAsync } from "fastify";
2
- export declare const sshRoutes: FastifyPluginAsync;
1
+ /**
2
+ * SSH connection management routes (Elysia + KV storage).
3
+ *
4
+ * Namespace: "ssh"
5
+ * Keys:
6
+ * "connections" → JSON array of SSHConnection objects
7
+ */
8
+ import { Elysia } from "elysia";
9
+ import type { HostServices, SSHConnection } from "../types.js";
10
+ export declare function createSSHRoutes(hostServices: HostServices): Elysia<"/api/ssh", {
11
+ decorator: {};
12
+ store: {};
13
+ derive: {};
14
+ resolve: {};
15
+ }, {
16
+ typebox: {};
17
+ error: {};
18
+ }, {
19
+ schema: {};
20
+ standaloneSchema: {};
21
+ macro: {};
22
+ macroFn: {};
23
+ parser: {};
24
+ response: {};
25
+ }, {
26
+ api: {
27
+ ssh: {
28
+ connections: {
29
+ get: {
30
+ body: unknown;
31
+ params: {};
32
+ query: unknown;
33
+ headers: unknown;
34
+ response: {
35
+ 200: {
36
+ connections: (Omit<SSHConnection, "password" | "privateKeyPath"> & {
37
+ privateKeyPath?: string;
38
+ })[];
39
+ };
40
+ };
41
+ };
42
+ };
43
+ };
44
+ };
45
+ } & {
46
+ api: {
47
+ ssh: {
48
+ connections: {
49
+ post: {
50
+ body: unknown;
51
+ params: {};
52
+ query: unknown;
53
+ headers: unknown;
54
+ response: {
55
+ 200: {
56
+ connection: Omit<SSHConnection, "password" | "privateKeyPath"> & {
57
+ privateKeyPath?: string;
58
+ };
59
+ error?: undefined;
60
+ details?: undefined;
61
+ } | {
62
+ error: string;
63
+ details: string;
64
+ connection?: undefined;
65
+ };
66
+ };
67
+ };
68
+ };
69
+ };
70
+ };
71
+ } & {
72
+ api: {
73
+ ssh: {
74
+ execute: {
75
+ post: {
76
+ body: unknown;
77
+ params: {};
78
+ query: unknown;
79
+ headers: unknown;
80
+ response: {};
81
+ };
82
+ };
83
+ };
84
+ };
85
+ } & {
86
+ api: {
87
+ ssh: {
88
+ test: {
89
+ ":connectionId": {
90
+ post: {
91
+ body: unknown;
92
+ params: {
93
+ connectionId: string;
94
+ } & {};
95
+ query: unknown;
96
+ headers: unknown;
97
+ response: {
98
+ 422: {
99
+ type: "validation";
100
+ on: string;
101
+ summary?: string;
102
+ message?: string;
103
+ found?: unknown;
104
+ property?: string;
105
+ expected?: string;
106
+ };
107
+ };
108
+ };
109
+ };
110
+ };
111
+ };
112
+ };
113
+ } & {
114
+ api: {
115
+ ssh: {
116
+ connections: {
117
+ ":id": {
118
+ delete: {
119
+ body: unknown;
120
+ params: {
121
+ id: string;
122
+ } & {};
123
+ query: unknown;
124
+ headers: unknown;
125
+ response: {
126
+ 200: {
127
+ error: string;
128
+ success?: undefined;
129
+ details?: undefined;
130
+ } | {
131
+ success: boolean;
132
+ error?: undefined;
133
+ details?: undefined;
134
+ } | {
135
+ error: string;
136
+ details: string;
137
+ success?: undefined;
138
+ };
139
+ 422: {
140
+ type: "validation";
141
+ on: string;
142
+ summary?: string;
143
+ message?: string;
144
+ found?: unknown;
145
+ property?: string;
146
+ expected?: string;
147
+ };
148
+ };
149
+ };
150
+ };
151
+ };
152
+ };
153
+ };
154
+ }, {
155
+ derive: {};
156
+ resolve: {};
157
+ schema: {};
158
+ standaloneSchema: {};
159
+ response: {};
160
+ }, {
161
+ derive: {};
162
+ resolve: {};
163
+ schema: {};
164
+ standaloneSchema: {};
165
+ response: {};
166
+ }>;
3
167
  //# sourceMappingURL=ssh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/routes/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAoB7C,eAAO,MAAM,SAAS,EAAE,kBAsOvB,CAAC"}
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/routes/ssh.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAGd,MAAM,aAAa,CAAC;AA8ErB,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAzCvC,MAAM;;;;;;;;;;;;;;;;;;;;iDAAN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiRxB"}