@cloudflare/sandbox 0.0.8 → 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.
Files changed (56) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/Dockerfile +73 -9
  3. package/container_src/handler/exec.ts +337 -0
  4. package/container_src/handler/file.ts +844 -0
  5. package/container_src/handler/git.ts +182 -0
  6. package/container_src/handler/ports.ts +314 -0
  7. package/container_src/handler/process.ts +640 -0
  8. package/container_src/index.ts +102 -2647
  9. package/container_src/types.ts +103 -0
  10. package/dist/chunk-6THNBO4S.js +46 -0
  11. package/dist/chunk-6THNBO4S.js.map +1 -0
  12. package/dist/chunk-6UAWTJ5S.js +85 -0
  13. package/dist/chunk-6UAWTJ5S.js.map +1 -0
  14. package/dist/chunk-G4XT4SP7.js +638 -0
  15. package/dist/chunk-G4XT4SP7.js.map +1 -0
  16. package/dist/chunk-ISFOIYQC.js +585 -0
  17. package/dist/chunk-ISFOIYQC.js.map +1 -0
  18. package/dist/chunk-NNGBXDMY.js +89 -0
  19. package/dist/chunk-NNGBXDMY.js.map +1 -0
  20. package/dist/client-Da-mLX4p.d.ts +210 -0
  21. package/dist/client.d.ts +2 -1
  22. package/dist/client.js +3 -37
  23. package/dist/index.d.ts +5 -200
  24. package/dist/index.js +17 -106
  25. package/dist/index.js.map +1 -1
  26. package/dist/request-handler.d.ts +16 -0
  27. package/dist/request-handler.js +12 -0
  28. package/dist/request-handler.js.map +1 -0
  29. package/dist/sandbox.d.ts +3 -0
  30. package/dist/sandbox.js +12 -0
  31. package/dist/sandbox.js.map +1 -0
  32. package/dist/security.d.ts +30 -0
  33. package/dist/security.js +13 -0
  34. package/dist/security.js.map +1 -0
  35. package/dist/sse-parser.d.ts +28 -0
  36. package/dist/sse-parser.js +11 -0
  37. package/dist/sse-parser.js.map +1 -0
  38. package/dist/types.d.ts +284 -0
  39. package/dist/types.js +19 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +2 -7
  42. package/src/client.ts +320 -1242
  43. package/src/index.ts +20 -136
  44. package/src/request-handler.ts +144 -0
  45. package/src/sandbox.ts +645 -0
  46. package/src/security.ts +113 -0
  47. package/src/sse-parser.ts +147 -0
  48. package/src/types.ts +386 -0
  49. package/README.md +0 -65
  50. package/dist/chunk-7WZJ3TRE.js +0 -1364
  51. package/dist/chunk-7WZJ3TRE.js.map +0 -1
  52. package/tests/client.example.ts +0 -308
  53. package/tests/connection-test.ts +0 -81
  54. package/tests/simple-test.ts +0 -81
  55. package/tests/test1.ts +0 -281
  56. package/tests/test2.ts +0 -929
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import type { DurableObject } from \"cloudflare:workers\";\nimport type { Sandbox } from \"./index\";\n\ninterface ExecuteRequest {\n command: string;\n args?: string[];\n}\n\nexport interface ExecuteResponse {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n command: string;\n args: string[];\n timestamp: string;\n}\n\ninterface SessionResponse {\n sessionId: string;\n message: string;\n timestamp: string;\n}\n\ninterface SessionListResponse {\n sessions: Array<{\n sessionId: string;\n hasActiveProcess: boolean;\n createdAt: string;\n }>;\n count: number;\n timestamp: string;\n}\n\ninterface CommandsResponse {\n availableCommands: string[];\n timestamp: string;\n}\n\ninterface GitCheckoutRequest {\n repoUrl: string;\n branch?: string;\n targetDir?: string;\n sessionId?: string;\n}\n\nexport interface GitCheckoutResponse {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n repoUrl: string;\n branch: string;\n targetDir: string;\n timestamp: string;\n}\n\ninterface MkdirRequest {\n path: string;\n recursive?: boolean;\n sessionId?: string;\n}\n\nexport interface MkdirResponse {\n success: boolean;\n stdout: string;\n stderr: string;\n exitCode: number;\n path: string;\n recursive: boolean;\n timestamp: string;\n}\n\ninterface WriteFileRequest {\n path: string;\n content: string;\n encoding?: string;\n sessionId?: string;\n}\n\nexport interface WriteFileResponse {\n success: boolean;\n exitCode: number;\n path: string;\n timestamp: string;\n}\n\ninterface ReadFileRequest {\n path: string;\n encoding?: string;\n sessionId?: string;\n}\n\nexport interface ReadFileResponse {\n success: boolean;\n exitCode: number;\n path: string;\n content: string;\n timestamp: string;\n}\n\ninterface DeleteFileRequest {\n path: string;\n sessionId?: string;\n}\n\nexport interface DeleteFileResponse {\n success: boolean;\n exitCode: number;\n path: string;\n timestamp: string;\n}\n\ninterface RenameFileRequest {\n oldPath: string;\n newPath: string;\n sessionId?: string;\n}\n\nexport interface RenameFileResponse {\n success: boolean;\n exitCode: number;\n oldPath: string;\n newPath: string;\n timestamp: string;\n}\n\ninterface MoveFileRequest {\n sourcePath: string;\n destinationPath: string;\n sessionId?: string;\n}\n\nexport interface MoveFileResponse {\n success: boolean;\n exitCode: number;\n sourcePath: string;\n destinationPath: string;\n timestamp: string;\n}\n\ninterface PingResponse {\n message: string;\n timestamp: string;\n}\n\ninterface StreamEvent {\n type: \"command_start\" | \"output\" | \"command_complete\" | \"error\";\n command?: string;\n args?: string[];\n stream?: \"stdout\" | \"stderr\";\n data?: string;\n message?: string;\n path?: string;\n oldPath?: string;\n newPath?: string;\n sourcePath?: string;\n destinationPath?: string;\n content?: string;\n success?: boolean;\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n timestamp?: string;\n}\n\ninterface HttpClientOptions {\n stub?: Sandbox;\n baseUrl?: string;\n port?: number;\n onCommandStart?: (command: string, args: string[]) => void;\n onOutput?: (\n stream: \"stdout\" | \"stderr\",\n data: string,\n command: string\n ) => void;\n onCommandComplete?: (\n success: boolean,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n args: string[]\n ) => void;\n onError?: (error: string, command?: string, args?: string[]) => void;\n onStreamEvent?: (event: StreamEvent) => void;\n}\n\nexport class HttpClient {\n private baseUrl: string;\n private options: HttpClientOptions;\n private sessionId: string | null = null;\n\n constructor(options: HttpClientOptions = {}) {\n this.options = {\n ...options,\n };\n this.baseUrl = this.options.baseUrl!;\n }\n\n private async doFetch(\n path: string,\n options?: RequestInit\n ): Promise<Response> {\n const url = this.options.stub\n ? `http://localhost:${this.options.port}${path}`\n : `${this.baseUrl}${path}`;\n const method = options?.method || \"GET\";\n\n console.log(`[HTTP Client] Making ${method} request to ${url}`);\n\n try {\n let response: Response;\n\n if (this.options.stub) {\n response = await this.options.stub.containerFetch(\n url,\n options,\n this.options.port\n );\n } else {\n response = await fetch(url, options);\n }\n\n console.log(\n `[HTTP Client] Response: ${response.status} ${response.statusText}`\n );\n\n if (!response.ok) {\n console.error(\n `[HTTP Client] Request failed: ${method} ${url} - ${response.status} ${response.statusText}`\n );\n }\n\n return response;\n } catch (error) {\n console.error(`[HTTP Client] Request error: ${method} ${url}`, error);\n throw error;\n }\n }\n // Public methods to set event handlers\n setOnOutput(\n handler: (\n stream: \"stdout\" | \"stderr\",\n data: string,\n command: string\n ) => void\n ): void {\n this.options.onOutput = handler;\n }\n\n setOnCommandComplete(\n handler: (\n success: boolean,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n args: string[]\n ) => void\n ): void {\n this.options.onCommandComplete = handler;\n }\n\n setOnStreamEvent(handler: (event: StreamEvent) => void): void {\n this.options.onStreamEvent = handler;\n }\n\n // Public getter methods\n getOnOutput():\n | ((stream: \"stdout\" | \"stderr\", data: string, command: string) => void)\n | undefined {\n return this.options.onOutput;\n }\n\n getOnCommandComplete():\n | ((\n success: boolean,\n exitCode: number,\n stdout: string,\n stderr: string,\n command: string,\n args: string[]\n ) => void)\n | undefined {\n return this.options.onCommandComplete;\n }\n\n getOnStreamEvent(): ((event: StreamEvent) => void) | undefined {\n return this.options.onStreamEvent;\n }\n\n async createSession(): Promise<string> {\n try {\n const response = await this.doFetch(`/api/session/create`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: SessionResponse = await response.json();\n this.sessionId = data.sessionId;\n console.log(`[HTTP Client] Created session: ${this.sessionId}`);\n return this.sessionId;\n } catch (error) {\n console.error(\"[HTTP Client] Error creating session:\", error);\n throw error;\n }\n }\n\n async listSessions(): Promise<SessionListResponse> {\n try {\n const response = await this.doFetch(`/api/session/list`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: SessionListResponse = await response.json();\n console.log(`[HTTP Client] Listed ${data.count} sessions`);\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error listing sessions:\", error);\n throw error;\n }\n }\n\n async execute(\n command: string,\n args: string[] = [],\n sessionId?: string\n ): Promise<ExecuteResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/execute`, {\n body: JSON.stringify({\n args,\n command,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: ExecuteResponse = await response.json();\n console.log(\n `[HTTP Client] Command executed: ${command}, Success: ${data.success}`\n );\n\n // Call the callback if provided\n this.options.onCommandComplete?.(\n data.success,\n data.exitCode,\n data.stdout,\n data.stderr,\n data.command,\n data.args\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error executing command:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n command,\n args\n );\n throw error;\n }\n }\n\n async executeStream(\n command: string,\n args: string[] = [],\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/execute/stream`, {\n body: JSON.stringify({\n args,\n command,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(`[HTTP Client] Stream event: ${event.type}`);\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Command started: ${\n event.command\n } ${event.args?.join(\" \")}`\n );\n this.options.onCommandStart?.(\n event.command!,\n event.args || []\n );\n break;\n\n case \"output\":\n console.log(`[${event.stream}] ${event.data}`);\n this.options.onOutput?.(\n event.stream!,\n event.data!,\n event.command!\n );\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Command completed: ${event.command}, Success: ${event.success}, Exit code: ${event.exitCode}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n event.exitCode!,\n event.stdout!,\n event.stderr!,\n event.command!,\n event.args || []\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Command error: ${event.error}`\n );\n this.options.onError?.(\n event.error!,\n event.command,\n event.args\n );\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming execution:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n command,\n args\n );\n throw error;\n }\n }\n\n async gitCheckout(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n sessionId?: string\n ): Promise<GitCheckoutResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/git/checkout`, {\n body: JSON.stringify({\n branch,\n repoUrl,\n sessionId: targetSessionId,\n targetDir,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: GitCheckoutResponse = await response.json();\n console.log(\n `[HTTP Client] Git checkout completed: ${repoUrl}, Success: ${data.success}, Target: ${data.targetDir}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error in git checkout:\", error);\n throw error;\n }\n }\n\n async gitCheckoutStream(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/git/checkout/stream`, {\n body: JSON.stringify({\n branch,\n repoUrl,\n sessionId: targetSessionId,\n targetDir,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Git checkout stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Git checkout started: ${\n event.command\n } ${event.args?.join(\" \")}`\n );\n this.options.onCommandStart?.(\n event.command!,\n event.args || []\n );\n break;\n\n case \"output\":\n console.log(`[${event.stream}] ${event.data}`);\n this.options.onOutput?.(\n event.stream!,\n event.data!,\n event.command!\n );\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Git checkout completed: ${event.command}, Success: ${event.success}, Exit code: ${event.exitCode}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n event.exitCode!,\n event.stdout!,\n event.stderr!,\n event.command!,\n event.args || []\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Git checkout error: ${event.error}`\n );\n this.options.onError?.(\n event.error!,\n event.command,\n event.args\n );\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse git checkout stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming git checkout:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"git clone\",\n [branch, repoUrl, targetDir || \"\"]\n );\n throw error;\n }\n }\n\n async mkdir(\n path: string,\n recursive: boolean = false,\n sessionId?: string\n ): Promise<MkdirResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/mkdir`, {\n body: JSON.stringify({\n path,\n recursive,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: MkdirResponse = await response.json();\n console.log(\n `[HTTP Client] Directory created: ${path}, Success: ${data.success}, Recursive: ${data.recursive}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error creating directory:\", error);\n throw error;\n }\n }\n\n async mkdirStream(\n path: string,\n recursive: boolean = false,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/mkdir/stream`, {\n body: JSON.stringify({\n path,\n recursive,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(`[HTTP Client] Mkdir stream event: ${event.type}`);\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Mkdir started: ${\n event.command\n } ${event.args?.join(\" \")}`\n );\n this.options.onCommandStart?.(\n event.command!,\n event.args || []\n );\n break;\n\n case \"output\":\n console.log(`[${event.stream}] ${event.data}`);\n this.options.onOutput?.(\n event.stream!,\n event.data!,\n event.command!\n );\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Mkdir completed: ${event.command}, Success: ${event.success}, Exit code: ${event.exitCode}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n event.exitCode!,\n event.stdout!,\n event.stderr!,\n event.command!,\n event.args || []\n );\n break;\n\n case \"error\":\n console.error(`[HTTP Client] Mkdir error: ${event.error}`);\n this.options.onError?.(\n event.error!,\n event.command,\n event.args\n );\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse mkdir stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming mkdir:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"mkdir\",\n recursive ? [\"-p\", path] : [path]\n );\n throw error;\n }\n }\n\n async writeFile(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n sessionId?: string\n ): Promise<WriteFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/write`, {\n body: JSON.stringify({\n content,\n encoding,\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: WriteFileResponse = await response.json();\n console.log(\n `[HTTP Client] File written: ${path}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error writing file:\", error);\n throw error;\n }\n }\n\n async writeFileStream(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/write/stream`, {\n body: JSON.stringify({\n content,\n encoding,\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Write file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Write file started: ${event.path}`\n );\n this.options.onCommandStart?.(\"write\", [\n path,\n content,\n encoding,\n ]);\n break;\n\n case \"output\":\n console.log(`[output] ${event.message}`);\n this.options.onOutput?.(\"stdout\", event.message!, \"write\");\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Write file completed: ${event.path}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"write\",\n [path, content, encoding]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Write file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"write\", [\n path,\n content,\n encoding,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse write file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming write file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"write\",\n [path, content, encoding]\n );\n throw error;\n }\n }\n\n async readFile(\n path: string,\n encoding: string = \"utf-8\",\n sessionId?: string\n ): Promise<ReadFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/read`, {\n body: JSON.stringify({\n encoding,\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: ReadFileResponse = await response.json();\n console.log(\n `[HTTP Client] File read: ${path}, Success: ${data.success}, Content length: ${data.content.length}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error reading file:\", error);\n throw error;\n }\n }\n\n async readFileStream(\n path: string,\n encoding: string = \"utf-8\",\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/read/stream`, {\n body: JSON.stringify({\n encoding,\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Read file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Read file started: ${event.path}`\n );\n this.options.onCommandStart?.(\"read\", [path, encoding]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Read file completed: ${\n event.path\n }, Success: ${event.success}, Content length: ${\n event.content?.length || 0\n }`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n event.content || \"\",\n \"\",\n \"read\",\n [path, encoding]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Read file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"read\", [\n path,\n encoding,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse read file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming read file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"read\",\n [path, encoding]\n );\n throw error;\n }\n }\n\n async deleteFile(\n path: string,\n sessionId?: string\n ): Promise<DeleteFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/delete`, {\n body: JSON.stringify({\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: DeleteFileResponse = await response.json();\n console.log(\n `[HTTP Client] File deleted: ${path}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error deleting file:\", error);\n throw error;\n }\n }\n\n async deleteFileStream(path: string, sessionId?: string): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/delete/stream`, {\n body: JSON.stringify({\n path,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Delete file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Delete file started: ${event.path}`\n );\n this.options.onCommandStart?.(\"delete\", [path]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Delete file completed: ${event.path}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"delete\",\n [path]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Delete file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"delete\", [path]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse delete file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming delete file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"delete\",\n [path]\n );\n throw error;\n }\n }\n\n async renameFile(\n oldPath: string,\n newPath: string,\n sessionId?: string\n ): Promise<RenameFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/rename`, {\n body: JSON.stringify({\n newPath,\n oldPath,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: RenameFileResponse = await response.json();\n console.log(\n `[HTTP Client] File renamed: ${oldPath} -> ${newPath}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error renaming file:\", error);\n throw error;\n }\n }\n\n async renameFileStream(\n oldPath: string,\n newPath: string,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/rename/stream`, {\n body: JSON.stringify({\n newPath,\n oldPath,\n sessionId: targetSessionId,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Rename file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Rename file started: ${event.oldPath} -> ${event.newPath}`\n );\n this.options.onCommandStart?.(\"rename\", [oldPath, newPath]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Rename file completed: ${event.oldPath} -> ${event.newPath}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"rename\",\n [oldPath, newPath]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Rename file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"rename\", [\n oldPath,\n newPath,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse rename file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming rename file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"rename\",\n [oldPath, newPath]\n );\n throw error;\n }\n }\n\n async moveFile(\n sourcePath: string,\n destinationPath: string,\n sessionId?: string\n ): Promise<MoveFileResponse> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/move`, {\n body: JSON.stringify({\n destinationPath,\n sessionId: targetSessionId,\n sourcePath,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n const data: MoveFileResponse = await response.json();\n console.log(\n `[HTTP Client] File moved: ${sourcePath} -> ${destinationPath}, Success: ${data.success}`\n );\n\n return data;\n } catch (error) {\n console.error(\"[HTTP Client] Error moving file:\", error);\n throw error;\n }\n }\n\n async moveFileStream(\n sourcePath: string,\n destinationPath: string,\n sessionId?: string\n ): Promise<void> {\n try {\n const targetSessionId = sessionId || this.sessionId;\n\n const response = await this.doFetch(`/api/move/stream`, {\n body: JSON.stringify({\n destinationPath,\n sessionId: targetSessionId,\n sourcePath,\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(\n errorData.error || `HTTP error! status: ${response.status}`\n );\n }\n\n if (!response.body) {\n throw new Error(\"No response body for streaming request\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n const lines = chunk.split(\"\\n\");\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const eventData = line.slice(6); // Remove 'data: ' prefix\n const event: StreamEvent = JSON.parse(eventData);\n\n console.log(\n `[HTTP Client] Move file stream event: ${event.type}`\n );\n this.options.onStreamEvent?.(event);\n\n switch (event.type) {\n case \"command_start\":\n console.log(\n `[HTTP Client] Move file started: ${event.sourcePath} -> ${event.destinationPath}`\n );\n this.options.onCommandStart?.(\"move\", [\n sourcePath,\n destinationPath,\n ]);\n break;\n\n case \"command_complete\":\n console.log(\n `[HTTP Client] Move file completed: ${event.sourcePath} -> ${event.destinationPath}, Success: ${event.success}`\n );\n this.options.onCommandComplete?.(\n event.success!,\n 0,\n \"\",\n \"\",\n \"move\",\n [sourcePath, destinationPath]\n );\n break;\n\n case \"error\":\n console.error(\n `[HTTP Client] Move file error: ${event.error}`\n );\n this.options.onError?.(event.error!, \"move\", [\n sourcePath,\n destinationPath,\n ]);\n break;\n }\n } catch (parseError) {\n console.warn(\n \"[HTTP Client] Failed to parse move file stream event:\",\n parseError\n );\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n } catch (error) {\n console.error(\"[HTTP Client] Error in streaming move file:\", error);\n this.options.onError?.(\n error instanceof Error ? error.message : \"Unknown error\",\n \"move\",\n [sourcePath, destinationPath]\n );\n throw error;\n }\n }\n\n async ping(): Promise<string> {\n try {\n const response = await this.doFetch(`/api/ping`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: PingResponse = await response.json();\n console.log(`[HTTP Client] Ping response: ${data.message}`);\n return data.timestamp;\n } catch (error) {\n console.error(\"[HTTP Client] Error pinging server:\", error);\n throw error;\n }\n }\n\n async getCommands(): Promise<string[]> {\n try {\n const response = await fetch(`${this.baseUrl}/api/commands`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data: CommandsResponse = await response.json();\n console.log(\n `[HTTP Client] Available commands: ${data.availableCommands.length}`\n );\n return data.availableCommands;\n } catch (error) {\n console.error(\"[HTTP Client] Error getting commands:\", error);\n throw error;\n }\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n\n clearSession(): void {\n this.sessionId = null;\n }\n}\n\n// Example usage and utility functions\nexport function createClient(options?: HttpClientOptions): HttpClient {\n return new HttpClient(options);\n}\n\n// Convenience function for quick command execution\nexport async function quickExecute(\n command: string,\n args: string[] = [],\n options?: HttpClientOptions\n): Promise<ExecuteResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.execute(command, args);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming command execution\nexport async function quickExecuteStream(\n command: string,\n args: string[] = [],\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.executeStream(command, args);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick git checkout\nexport async function quickGitCheckout(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n options?: HttpClientOptions\n): Promise<GitCheckoutResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.gitCheckout(repoUrl, branch, targetDir);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick directory creation\nexport async function quickMkdir(\n path: string,\n recursive: boolean = false,\n options?: HttpClientOptions\n): Promise<MkdirResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.mkdir(path, recursive);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming git checkout\nexport async function quickGitCheckoutStream(\n repoUrl: string,\n branch: string = \"main\",\n targetDir?: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.gitCheckoutStream(repoUrl, branch, targetDir);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming directory creation\nexport async function quickMkdirStream(\n path: string,\n recursive: boolean = false,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.mkdirStream(path, recursive);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file writing\nexport async function quickWriteFile(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n options?: HttpClientOptions\n): Promise<WriteFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.writeFile(path, content, encoding);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file writing\nexport async function quickWriteFileStream(\n path: string,\n content: string,\n encoding: string = \"utf-8\",\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.writeFileStream(path, content, encoding);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file reading\nexport async function quickReadFile(\n path: string,\n encoding: string = \"utf-8\",\n options?: HttpClientOptions\n): Promise<ReadFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.readFile(path, encoding);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file reading\nexport async function quickReadFileStream(\n path: string,\n encoding: string = \"utf-8\",\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.readFileStream(path, encoding);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file deletion\nexport async function quickDeleteFile(\n path: string,\n options?: HttpClientOptions\n): Promise<DeleteFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.deleteFile(path);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file deletion\nexport async function quickDeleteFileStream(\n path: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.deleteFileStream(path);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file renaming\nexport async function quickRenameFile(\n oldPath: string,\n newPath: string,\n options?: HttpClientOptions\n): Promise<RenameFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.renameFile(oldPath, newPath);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file renaming\nexport async function quickRenameFileStream(\n oldPath: string,\n newPath: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.renameFileStream(oldPath, newPath);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick file moving\nexport async function quickMoveFile(\n sourcePath: string,\n destinationPath: string,\n options?: HttpClientOptions\n): Promise<MoveFileResponse> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n return await client.moveFile(sourcePath, destinationPath);\n } finally {\n client.clearSession();\n }\n}\n\n// Convenience function for quick streaming file moving\nexport async function quickMoveFileStream(\n sourcePath: string,\n destinationPath: string,\n options?: HttpClientOptions\n): Promise<void> {\n const client = createClient(options);\n await client.createSession();\n\n try {\n await client.moveFileStream(sourcePath, destinationPath);\n } finally {\n client.clearSession();\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,308 +0,0 @@
1
- import {
2
- createClient,
3
- quickExecute,
4
- quickExecuteStream,
5
- quickGitCheckout,
6
- quickGitCheckoutStream,
7
- quickMkdir,
8
- quickMkdirStream,
9
- } from "../../sandbox/src/client";
10
-
11
- // Example 1: Basic client usage
12
- async function basicExample() {
13
- console.log("=== Basic Client Example ===");
14
-
15
- const client = createClient({
16
- baseUrl: "http://localhost:3000",
17
- onCommandComplete: (success, exitCode, stdout, stderr, command, args) => {
18
- console.log(
19
- `Command completed: ${command}, success=${success}, exitCode=${exitCode}`
20
- );
21
- if (stderr) console.log(`Stderr: ${stderr}`);
22
- },
23
- onCommandStart: (command, args) => {
24
- console.log(`Starting command: ${command} ${args.join(" ")}`);
25
- },
26
- onError: (error, command, args) => {
27
- console.error(`Error in ${command}: ${error}`);
28
- },
29
- onOutput: (stream, data, command) => {
30
- console.log(`[${stream}] ${data}`);
31
- },
32
- });
33
-
34
- try {
35
- // Create a session
36
- const sessionId = await client.createSession();
37
- console.log(`Created session: ${sessionId}`);
38
-
39
- // Execute some commands
40
- const lsResult = await client.execute("ls", ["-la"]);
41
- console.log("LS result:", lsResult.stdout);
42
-
43
- const pwdResult = await client.ping();
44
- console.log("Ping result:", pwdResult);
45
-
46
- const commands = await client.getCommands();
47
- console.log("Available commands:", commands.slice(0, 5));
48
-
49
- // List sessions
50
- const sessions = await client.listSessions();
51
- console.log(`Active sessions: ${sessions.count}`);
52
- } catch (error) {
53
- console.error("Operation failed:", error);
54
- } finally {
55
- client.clearSession();
56
- }
57
- }
58
-
59
- // Example 2: Streaming command execution
60
- async function streamingExample() {
61
- console.log("\n=== Streaming Command Example ===");
62
-
63
- const client = createClient({
64
- baseUrl: "http://localhost:3000",
65
- onCommandComplete: (success, exitCode, stdout, stderr, command, args) => {
66
- console.log(
67
- `\n✅ Completed: ${command}, success=${success}, exitCode=${exitCode}`
68
- );
69
- },
70
- onCommandStart: (command, args) => {
71
- console.log(`🚀 Starting: ${command} ${args.join(" ")}`);
72
- },
73
- onOutput: (stream, data, command) => {
74
- process.stdout.write(data);
75
- },
76
- });
77
-
78
- try {
79
- await client.createSession();
80
-
81
- // Execute a long-running command with streaming
82
- console.log("Executing 'find . -name '*.ts' -type f' with streaming...");
83
- await client.executeStream("find", [".", "-name", "*.ts", "-type", "f"]);
84
-
85
- console.log("\nExecuting 'ls -la' with streaming...");
86
- await client.executeStream("ls", ["-la"]);
87
- } catch (error) {
88
- console.error("Streaming failed:", error);
89
- } finally {
90
- client.clearSession();
91
- }
92
- }
93
-
94
- // Example 3: Git operations
95
- async function gitExample() {
96
- console.log("\n=== Git Operations Example ===");
97
-
98
- const client = createClient({
99
- baseUrl: "http://localhost:3000",
100
- onCommandComplete: (success, exitCode, stdout, stderr, command, args) => {
101
- console.log(`✅ Git operation completed: ${command}, success=${success}`);
102
- },
103
- onCommandStart: (command, args) => {
104
- console.log(`🔧 Starting: ${command} ${args.join(" ")}`);
105
- },
106
- onOutput: (stream, data, command) => {
107
- console.log(`[${stream}] ${data.trim()}`);
108
- },
109
- });
110
-
111
- try {
112
- await client.createSession();
113
-
114
- // Create a directory for the repository
115
- console.log("Creating directory for repository...");
116
- const mkdirResult = await client.mkdir("test-repo", true);
117
- console.log(`Directory created: ${mkdirResult.success}`);
118
-
119
- // Checkout a small test repository
120
- console.log("Checking out a test repository...");
121
- const gitResult = await client.gitCheckout(
122
- "https://github.com/octocat/Hello-World.git",
123
- "main",
124
- "test-repo/hello-world"
125
- );
126
- console.log(
127
- `Repository cloned: ${gitResult.success}, target: ${gitResult.targetDir}`
128
- );
129
-
130
- // List the contents of the cloned repository
131
- console.log("Listing repository contents...");
132
- const lsResult = await client.execute("ls", [
133
- "-la",
134
- "test-repo/hello-world",
135
- ]);
136
- console.log("Repository contents:", lsResult.stdout);
137
- } catch (error) {
138
- console.error("Git operations failed:", error);
139
- } finally {
140
- client.clearSession();
141
- }
142
- }
143
-
144
- // Example 4: Streaming git operations
145
- async function streamingGitExample() {
146
- console.log("\n=== Streaming Git Operations Example ===");
147
-
148
- const client = createClient({
149
- baseUrl: "http://localhost:3000",
150
- onCommandComplete: (success, exitCode, stdout, stderr, command, args) => {
151
- console.log(
152
- `\n🎉 Git operation completed: ${command}, success=${success}`
153
- );
154
- },
155
- onCommandStart: (command, args) => {
156
- console.log(`🌐 Starting git operation: ${command} ${args.join(" ")}`);
157
- },
158
- onOutput: (stream, data, command) => {
159
- if (stream === "stderr") {
160
- process.stderr.write(data);
161
- } else {
162
- process.stdout.write(data);
163
- }
164
- },
165
- });
166
-
167
- try {
168
- await client.createSession();
169
-
170
- // Create directory with streaming
171
- console.log("Creating directory with streaming...");
172
- await client.mkdirStream("streaming-test", true);
173
-
174
- // Checkout repository with streaming (real-time progress)
175
- console.log("Checking out repository with streaming...");
176
- await client.gitCheckoutStream(
177
- "https://github.com/octocat/Hello-World.git",
178
- "main",
179
- "streaming-test/hello-world"
180
- );
181
- } catch (error) {
182
- console.error("Streaming git operations failed:", error);
183
- } finally {
184
- client.clearSession();
185
- }
186
- }
187
-
188
- // Example 5: Quick execute utilities
189
- async function quickExecuteExample() {
190
- console.log("\n=== Quick Execute Utilities Example ===");
191
-
192
- try {
193
- // Quick command execution
194
- console.log("Quick command execution...");
195
- const dateResult = await quickExecute("date");
196
- console.log("Date:", dateResult.stdout.trim());
197
-
198
- const whoamiResult = await quickExecute("whoami");
199
- console.log("User:", whoamiResult.stdout.trim());
200
-
201
- // Quick directory creation
202
- console.log("Quick directory creation...");
203
- const mkdirResult = await quickMkdir("quick-test", true);
204
- console.log(`Directory created: ${mkdirResult.success}`);
205
-
206
- // Quick git checkout
207
- console.log("Quick git checkout...");
208
- const gitResult = await quickGitCheckout(
209
- "https://github.com/octocat/Hello-World.git",
210
- "main",
211
- "quick-test/repo"
212
- );
213
- console.log(`Repository cloned: ${gitResult.success}`);
214
-
215
- // Quick streaming execution
216
- console.log("Quick streaming execution...");
217
- await quickExecuteStream("ls", ["-la", "quick-test"]);
218
- } catch (error) {
219
- console.error("Quick execute failed:", error);
220
- }
221
- }
222
-
223
- // Example 6: Error handling
224
- async function errorHandlingExample() {
225
- console.log("\n=== Error Handling Example ===");
226
-
227
- const client = createClient({
228
- baseUrl: "http://localhost:3000",
229
- onError: (error, command, args) => {
230
- console.error(`❌ Error in ${command}: ${error}`);
231
- },
232
- });
233
-
234
- try {
235
- await client.createSession();
236
-
237
- // Try to execute a non-existent command
238
- console.log("Trying to execute non-existent command...");
239
- try {
240
- await client.execute("nonexistentcommand");
241
- } catch (error) {
242
- console.log(
243
- "Expected error caught:",
244
- error instanceof Error ? error.message : error
245
- );
246
- }
247
-
248
- // Try to create a directory in a protected location
249
- console.log("Trying to create directory in protected location...");
250
- try {
251
- await client.mkdir("/etc/test", false);
252
- } catch (error) {
253
- console.log(
254
- "Expected error caught:",
255
- error instanceof Error ? error.message : error
256
- );
257
- }
258
-
259
- // Try to checkout an invalid repository
260
- console.log("Trying to checkout invalid repository...");
261
- try {
262
- await client.gitCheckout("invalid-url");
263
- } catch (error) {
264
- console.log(
265
- "Expected error caught:",
266
- error instanceof Error ? error.message : error
267
- );
268
- }
269
- } catch (error) {
270
- console.error("Error handling example failed:", error);
271
- } finally {
272
- client.clearSession();
273
- }
274
- }
275
-
276
- // Run examples
277
- async function runExamples() {
278
- console.log("🚀 HTTP Client Examples\n");
279
-
280
- try {
281
- await basicExample();
282
- await streamingExample();
283
- await gitExample();
284
- await streamingGitExample();
285
- await quickExecuteExample();
286
- await errorHandlingExample();
287
-
288
- console.log("\n✅ All examples completed!");
289
- } catch (error) {
290
- console.error("❌ Example failed:", error);
291
- }
292
- }
293
-
294
- // Export for use in other modules
295
- export {
296
- createClient,
297
- quickExecute,
298
- quickExecuteStream,
299
- quickGitCheckout,
300
- quickMkdir,
301
- quickGitCheckoutStream,
302
- quickMkdirStream,
303
- };
304
-
305
- // Run examples if this file is executed directly
306
- if (require.main === module) {
307
- runExamples();
308
- }
@@ -1,81 +0,0 @@
1
- import { HttpClient } from "../../sandbox/src/client";
2
-
3
- async function connectionTest() {
4
- console.log("🔌 Testing HTTP Connection Only");
5
-
6
- const client = new HttpClient({
7
- baseUrl: "http://localhost:3000",
8
- onCommandComplete: (
9
- success: boolean,
10
- exitCode: number,
11
- stdout: string,
12
- stderr: string,
13
- command: string,
14
- args: string[]
15
- ) => {
16
- console.log(
17
- `✅ Command completed: ${command}, Success: ${success}, Exit code: ${exitCode}`
18
- );
19
- },
20
- onCommandStart: (command: string, args: string[]) => {
21
- console.log("📝 Command started:", command, args);
22
- },
23
- onError: (error: string, command?: string, args?: string[]) => {
24
- console.error(`❌ Error: ${error}`);
25
- },
26
- onOutput: (stream: "stdout" | "stderr", data: string, command: string) => {
27
- console.log(`📤 [${stream}] ${data.trim()}`);
28
- },
29
- });
30
-
31
- try {
32
- // Test ping to verify server is reachable
33
- console.log("🏓 Testing ping...");
34
- const pingResult = await client.ping();
35
- console.log("✅ Ping successful:", pingResult);
36
-
37
- // Create a session
38
- console.log("🔗 Creating session...");
39
- const sessionId = await client.createSession();
40
- console.log("✅ Session created:", sessionId);
41
-
42
- // Test getting available commands
43
- console.log("📋 Getting available commands...");
44
- const commands = await client.getCommands();
45
- console.log("✅ Available commands:", commands.length);
46
-
47
- // Test listing sessions
48
- console.log("📝 Listing sessions...");
49
- const sessions = await client.listSessions();
50
- console.log("✅ Active sessions:", sessions.count);
51
-
52
- // Wait a moment
53
- await new Promise((resolve) => setTimeout(resolve, 1000));
54
-
55
- console.log("✅ Connection test successful");
56
- } catch (error) {
57
- console.error("❌ Connection test failed:", error);
58
- throw error;
59
- } finally {
60
- client.clearSession();
61
- console.log("🔌 Session cleared");
62
- }
63
- }
64
-
65
- // Add a timeout to prevent hanging
66
- const timeout = setTimeout(() => {
67
- console.error("❌ Connection test timed out after 15 seconds");
68
- process.exit(1);
69
- }, 15000);
70
-
71
- connectionTest()
72
- .then(() => {
73
- clearTimeout(timeout);
74
- console.log("✅ Connection test finished successfully");
75
- process.exit(0);
76
- })
77
- .catch((error) => {
78
- clearTimeout(timeout);
79
- console.error("❌ Connection test failed:", error);
80
- process.exit(1);
81
- });
@@ -1,81 +0,0 @@
1
- import {
2
- HttpClient,
3
- quickExecute,
4
- quickExecuteStream,
5
- } from "../../sandbox/src/client";
6
-
7
- async function testHttpClient() {
8
- console.log("🚀 Testing HTTP Client...\n");
9
-
10
- // Create a client instance
11
- const client = new HttpClient({
12
- baseUrl: "http://localhost:3000",
13
- onCommandComplete: (success, exitCode, stdout, stderr, command, args) => {
14
- console.log(
15
- `✅ Command completed: ${command}, Success: ${success}, Exit code: ${exitCode}`
16
- );
17
- },
18
- onCommandStart: (command, args) => {
19
- console.log(`📝 Command started: ${command} ${args.join(" ")}`);
20
- },
21
- onError: (error, command, args) => {
22
- console.error(`❌ Command error: ${error}`);
23
- },
24
- onOutput: (stream, data, command) => {
25
- console.log(`📤 [${stream}] ${data.trim()}`);
26
- },
27
- });
28
-
29
- try {
30
- // Test ping
31
- console.log("1. Testing ping...");
32
- const pingTime = await client.ping();
33
- console.log(` Ping response time: ${pingTime}\n`);
34
-
35
- // Test getting available commands
36
- console.log("2. Testing get commands...");
37
- const commands = await client.getCommands();
38
- console.log(` Available commands: ${commands.join(", ")}\n`);
39
-
40
- // Test session creation
41
- console.log("3. Testing session creation...");
42
- const sessionId = await client.createSession();
43
- console.log(` Created session: ${sessionId}\n`);
44
-
45
- // Test listing sessions
46
- console.log("4. Testing session listing...");
47
- const sessions = await client.listSessions();
48
- console.log(` Active sessions: ${sessions.count}\n`);
49
-
50
- // Test regular command execution
51
- console.log("5. Testing regular command execution...");
52
- const result = await client.execute("echo", ["Hello from HTTP client!"]);
53
- console.log(` Command result: ${result.stdout.trim()}\n`);
54
-
55
- // Test another command
56
- console.log("6. Testing another command...");
57
- const pwdResult = await client.execute("pwd");
58
- console.log(` Current directory: ${pwdResult.stdout.trim()}\n`);
59
-
60
- // Test streaming command execution
61
- console.log("7. Testing streaming command execution...");
62
- await client.executeStream("ls", ["-la"]);
63
- console.log(" Streaming command completed\n");
64
-
65
- // Test quick execute utility
66
- console.log("8. Testing quick execute utility...");
67
- const quickResult = await quickExecute("whoami");
68
- console.log(` Quick execute result: ${quickResult.stdout.trim()}\n`);
69
-
70
- console.log("🎉 All tests completed successfully!");
71
- } catch (error) {
72
- console.error("❌ Test failed:", error);
73
- }
74
- }
75
-
76
- // Run the test if this file is executed directly
77
- if (import.meta.main) {
78
- testHttpClient().catch(console.error);
79
- }
80
-
81
- export { testHttpClient };