From 0f56dbab53ba632786d84081a987723201ddcf78 Mon Sep 17 00:00:00 2001 From: ConnorN Date: Fri, 14 Nov 2025 15:30:33 -0500 Subject: [PATCH 1/2] feat: add docker pull endpoint --- src/server.ts | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/server.ts b/src/server.ts index 84dd8b5..ddf2943 100644 --- a/src/server.ts +++ b/src/server.ts @@ -192,6 +192,39 @@ app.post('/stop/:option', async (req: Request, res: Response) => { } }); +app.put('/pull/:image', async (req: Request, res: Response) => { + try { + const image = req.params.image; + if (!image) { + console.log('Image name required'); + return res.status(400).json({ error: 'Image name required' }); + } + + docker.pull(image, (err: any, stream: NodeJS.ReadableStream) => { + if (err) { + console.error('Error pulling image:', err); + return res.status(500).json({ error: 'Error pulling image' }); + } + docker.modem.followProgress(stream, onFinished, onProgress); + + function onFinished(err: any, output: any) { + if (err) { + console.error('Error during image pull:', err); + return res.status(500).json({ error: 'Error during image pull' }); + } + res.json({ status: 'Image pulled successfully' }); + } + + function onProgress(event: any) { + console.log('Pull progress:', event); + } + }); + } catch (err: any) { + console.log("Error pulling image:", err.message); + res.status(500).json({ error: err.message }); + } +}); + (async () => { const eventStream = await docker.getEvents(); eventStream.on('data', buffer => { From 9be31a27128751e0e62e3ad5a35cda0801f36ab6 Mon Sep 17 00:00:00 2001 From: ConnorN Date: Fri, 14 Nov 2025 15:43:08 -0500 Subject: [PATCH 2/2] fix: async issues and redundant code --- src/server.ts | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/server.ts b/src/server.ts index ddf2943..176097f 100644 --- a/src/server.ts +++ b/src/server.ts @@ -195,32 +195,25 @@ app.post('/stop/:option', async (req: Request, res: Response) => { app.put('/pull/:image', async (req: Request, res: Response) => { try { const image = req.params.image; - if (!image) { - console.log('Image name required'); - return res.status(400).json({ error: 'Image name required' }); - } - docker.pull(image, (err: any, stream: NodeJS.ReadableStream) => { - if (err) { - console.error('Error pulling image:', err); - return res.status(500).json({ error: 'Error pulling image' }); - } - docker.modem.followProgress(stream, onFinished, onProgress); + const result = await new Promise((resolve, reject) => { + docker.pull(image, (err: any, stream: NodeJS.ReadableStream) => { + if (err) return reject(err); + + docker.modem.followProgress( + stream, + (err: any, output: any) => { + if (err) return reject(err); + resolve(output); + } + ); + }); + }); - function onFinished(err: any, output: any) { - if (err) { - console.error('Error during image pull:', err); - return res.status(500).json({ error: 'Error during image pull' }); - } - res.json({ status: 'Image pulled successfully' }); - } + res.json({ status: 'Image pulled successfully', result }); - function onProgress(event: any) { - console.log('Pull progress:', event); - } - }); } catch (err: any) { - console.log("Error pulling image:", err.message); + console.error("Pull error:", err); res.status(500).json({ error: err.message }); } });