From ffdc61fb42d80a71357e019d5086957b67b40024 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Mon, 18 Aug 2025 22:39:05 +0000 Subject: [PATCH] refactor(DockerHost): Enhance request handling with fluent API and improved response parsing --- .../document_symbols_cache_v23-06-25.pkl | Bin 118720 -> 172309 bytes package.json | 8 +- pnpm-lock.yaml | 172 ++++------------- ts/classes.host.ts | 173 +++++++++++++----- 4 files changed, 172 insertions(+), 181 deletions(-) diff --git a/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl b/.serena/cache/typescript/document_symbols_cache_v23-06-25.pkl index 82c702d44bfaae213f97af4ef3d7ab1fc90deb20..c2f387e4273ae6202d19b07741fd69e1589cceaa 100644 GIT binary patch literal 172309 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 literal 118720 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 8.0.0'} - aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} - ansi-256-colors@1.1.0: resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} engines: {node: '>=0.10.0'} @@ -1609,10 +1592,6 @@ packages: resolution: {integrity: sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=} engines: {node: '>=4'} - clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -2063,10 +2042,6 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} @@ -2270,10 +2245,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - inflight@1.0.6: resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} @@ -2314,10 +2285,6 @@ packages: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} - is-ip@4.0.0: - resolution: {integrity: sha512-4B4XA2HEIm/PY+OSpeMBXr8pGWBYbXuHgjMAqrwbLO3CPTCAd9ArEJzBUKGZtk9viY6+aSfadGnWyjY3ydYZkw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-ip@5.0.1: resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} engines: {node: '>=14.16'} @@ -3023,10 +2990,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - public-ip@6.0.2: - resolution: {integrity: sha512-+6bkjnf0yQ4+tZV0zJv1017DiIF7y6R4yg17Mrhhkc25L7dtQtXWHgSCrz9BbLL4OeTFbPK4EALXqJUrwCIWXw==} - engines: {node: '>=14.16'} - public-ip@7.0.1: resolution: {integrity: sha512-DdNcqcIbI0wEeCBcqX+bmZpUCvrDMJHXE553zgyG1MZ8S1a/iCCxmK9iTjjql+SpHSv4cZkmRv5/zGYW93AlCw==} engines: {node: '>=18'} @@ -3369,12 +3332,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - systeminformation@5.22.8: - resolution: {integrity: sha512-F1iWQ+PSfOzvLMGh2UXASaWLDq5o+1h1db13Kddl6ojcQ47rsJhpMtRrmBXfTA5QJgutC4KV67YRmXLuroIxrA==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - systeminformation@5.27.7: resolution: {integrity: sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg==} engines: {node: '>=8.0.0'} @@ -3460,10 +3417,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.25.0: - resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==} - engines: {node: '>=16'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -3713,7 +3666,7 @@ snapshots: '@push.rocks/smartopen': 2.0.0 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrequest': 4.3.0 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartsitemap': 2.0.3 '@push.rocks/smartstream': 3.2.5 @@ -4410,7 +4363,7 @@ snapshots: '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartlog-destination-local': 9.0.2 - '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartspawn': 3.0.3 '@rspack/core': 1.4.11 @@ -4432,7 +4385,7 @@ snapshots: '@push.rocks/smartlog': 3.1.8 '@push.rocks/smartnpm': 2.0.6 '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrequest': 4.3.0 '@push.rocks/smartshell': 3.3.0 transitivePeerDependencies: - aws-crt @@ -4463,7 +4416,7 @@ snapshots: '@push.rocks/smartmongo': 2.0.12(socks@2.8.7) '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrequest': 4.3.0 '@push.rocks/smarts3': 2.2.6 '@push.rocks/smartshell': 3.3.0 '@push.rocks/smarttime': 4.1.1 @@ -4643,12 +4596,12 @@ snapshots: '@push.rocks/smartexit': 1.0.23 '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartjson': 5.0.20 - '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 '@push.rocks/smartstring': 4.0.15 '@push.rocks/smartunique': 3.0.9 '@push.rocks/taskbuffer': 3.1.7 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.4 transitivePeerDependencies: - aws-crt @@ -4695,7 +4648,7 @@ snapshots: '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrequest': 4.3.0 '@push.rocks/smartrx': 3.0.10 '@push.rocks/smartstream': 3.2.5 '@push.rocks/smartunique': 3.0.9 @@ -4846,7 +4799,7 @@ snapshots: '@push.rocks/smartmime': 2.0.4 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrequest': 4.3.0 '@push.rocks/smartstream': 3.2.5 '@types/fs-extra': 11.0.4 '@types/js-yaml': 4.0.9 @@ -4857,7 +4810,7 @@ snapshots: '@push.rocks/smartguard@3.1.0': dependencies: '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 2.0.22 + '@push.rocks/smartrequest': 2.1.0 '@push.rocks/smarthash@3.2.3': dependencies: @@ -4887,7 +4840,7 @@ snapshots: '@push.rocks/smartlog-interfaces@3.0.2': dependencies: '@api.global/typedrequest-interfaces': 2.0.2 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.4 '@push.rocks/smartlog@3.1.8': dependencies: @@ -4933,7 +4886,7 @@ snapshots: dependencies: '@push.rocks/mongodump': 1.1.0(socks@2.8.7) '@push.rocks/smartdata': 5.16.4(socks@2.8.7) - '@push.rocks/smartpath': 5.0.18 + '@push.rocks/smartpath': 5.1.0 '@push.rocks/smartpromise': 4.2.3 mongodb-memory-server: 10.2.0(socks@2.8.7) transitivePeerDependencies: @@ -4946,16 +4899,6 @@ snapshots: - socks - supports-color - '@push.rocks/smartnetwork@3.0.2': - dependencies: - '@pushrocks/smartping': 1.0.8 - '@pushrocks/smartpromise': 3.1.10 - '@pushrocks/smartstring': 4.0.7 - '@types/default-gateway': 3.0.1 - isopen: 1.3.0 - public-ip: 6.0.2 - systeminformation: 5.22.8 - '@push.rocks/smartnetwork@4.1.2': dependencies: '@push.rocks/smartping': 1.0.8 @@ -4974,7 +4917,7 @@ snapshots: '@push.rocks/smartfile': 11.2.7 '@push.rocks/smartpath': 6.0.0 '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smartrequest': 4.2.2 + '@push.rocks/smartrequest': 4.3.0 '@push.rocks/smarttime': 4.1.1 '@push.rocks/smartversion': 3.0.5 package-json: 8.1.1 @@ -5003,7 +4946,7 @@ snapshots: dependencies: open: 8.4.2 - '@push.rocks/smartpath@5.0.18': {} + '@push.rocks/smartpath@5.1.0': {} '@push.rocks/smartpath@6.0.0': {} @@ -5049,14 +4992,14 @@ snapshots: - typescript - utf-8-validate - '@push.rocks/smartrequest@2.0.22': + '@push.rocks/smartrequest@2.1.0': dependencies: '@push.rocks/smartpromise': 4.2.3 - '@push.rocks/smarturl': 3.0.7 + '@push.rocks/smarturl': 3.1.0 agentkeepalive: 4.5.0 - form-data: 4.0.0 + form-data: 4.0.4 - '@push.rocks/smartrequest@4.2.2': + '@push.rocks/smartrequest@4.3.0': dependencies: '@push.rocks/smartenv': 5.0.13 '@push.rocks/smartpath': 6.0.0 @@ -5104,7 +5047,7 @@ snapshots: '@push.rocks/smartxml': 1.1.1 '@push.rocks/smartyaml': 2.0.5 '@push.rocks/webrequest': 3.0.37 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.4 '@push.rocks/smartsocket@2.1.0': dependencies: @@ -5184,8 +5127,6 @@ snapshots: nanoid: 4.0.2 uuid: 9.0.1 - '@push.rocks/smarturl@3.0.7': {} - '@push.rocks/smarturl@3.1.0': {} '@push.rocks/smartversion@3.0.5': @@ -5225,7 +5166,7 @@ snapshots: dependencies: '@pushrocks/smartdelay': 3.0.1 '@pushrocks/smartpromise': 4.0.2 - '@tsclass/tsclass': 4.1.2 + '@tsclass/tsclass': 4.4.4 '@push.rocks/webstore@2.0.20': dependencies: @@ -5291,11 +5232,6 @@ snapshots: dependencies: matcher: 5.0.0 - '@pushrocks/smartping@1.0.8': - dependencies: - '@types/ping': 0.4.4 - ping: 0.4.4 - '@pushrocks/smartpromise@3.1.10': {} '@pushrocks/smartpromise@4.0.2': {} @@ -5791,9 +5727,9 @@ snapshots: dependencies: type-fest: 2.19.0 - '@tsclass/tsclass@4.1.2': + '@tsclass/tsclass@4.4.4': dependencies: - type-fest: 4.25.0 + type-fest: 4.41.0 '@tsclass/tsclass@9.2.0': dependencies: @@ -5828,8 +5764,6 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/default-gateway@3.0.1': {} - '@types/default-gateway@7.2.2': {} '@types/express-serve-static-core@5.0.7': @@ -5982,11 +5916,6 @@ snapshots: dependencies: humanize-ms: 1.2.1 - aggregate-error@4.0.1: - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - ansi-256-colors@1.1.0: {} ansi-regex@5.0.1: {} @@ -6183,10 +6112,6 @@ snapshots: clean-stack@1.3.0: {} - clean-stack@4.2.0: - dependencies: - escape-string-regexp: 5.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -6658,12 +6583,6 @@ snapshots: form-data-encoder@2.1.4: {} - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - form-data@4.0.4: dependencies: asynckit: 0.4.0 @@ -6931,8 +6850,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - indent-string@5.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -6963,10 +6880,6 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 - is-ip@4.0.0: - dependencies: - ip-regex: 5.0.0 - is-ip@5.0.1: dependencies: ip-regex: 5.0.0 @@ -7830,13 +7743,6 @@ snapshots: proxy-from-env@1.1.0: {} - public-ip@6.0.2: - dependencies: - aggregate-error: 4.0.1 - dns-socket: 4.2.2 - got: 12.6.1 - is-ip: 4.0.0 - public-ip@7.0.1: dependencies: dns-socket: 4.2.2 @@ -8310,8 +8216,6 @@ snapshots: symbol-tree@3.2.4: {} - systeminformation@5.22.8: {} - systeminformation@5.27.7: {} tar-fs@3.1.0: @@ -8402,8 +8306,6 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.25.0: {} - type-fest@4.41.0: {} type-is@1.6.18: diff --git a/ts/classes.host.ts b/ts/classes.host.ts index d8c6358..b137c86 100644 --- a/ts/classes.host.ts +++ b/ts/classes.host.ts @@ -226,54 +226,143 @@ export class DockerHost { */ public async request(methodArg: string, routeArg: string, dataArg = {}) { const requestUrl = `${this.socketPath}${routeArg}`; - const response = await plugins.smartrequest.request(requestUrl, { - method: methodArg, - headers: { - 'Content-Type': 'application/json', - 'X-Registry-Auth': this.registryToken, - Host: 'docker.sock', - }, - requestBody: dataArg, - keepAlive: false, - }); - if (response.statusCode !== 200) { - console.log(response.body); + + // Build the request using the fluent API + const smartRequest = plugins.smartrequest.SmartRequest.create() + .url(requestUrl) + .header('Content-Type', 'application/json') + .header('X-Registry-Auth', this.registryToken) + .header('Host', 'docker.sock') + .options({ keepAlive: false }); + + // Add body for methods that support it + if (dataArg && Object.keys(dataArg).length > 0) { + smartRequest.json(dataArg); } - return response; + + // Execute the request based on method + let response; + switch (methodArg.toUpperCase()) { + case 'GET': + response = await smartRequest.get(); + break; + case 'POST': + response = await smartRequest.post(); + break; + case 'PUT': + response = await smartRequest.put(); + break; + case 'DELETE': + response = await smartRequest.delete(); + break; + default: + throw new Error(`Unsupported HTTP method: ${methodArg}`); + } + + // Parse the response body based on content type + let body; + const contentType = response.headers['content-type'] || ''; + if (contentType.includes('application/json')) { + body = await response.json(); + } else { + body = await response.text(); + // Try to parse as JSON if it looks like JSON + if (body && (body.startsWith('{') || body.startsWith('['))) { + try { + body = JSON.parse(body); + } catch { + // Keep as text if parsing fails + } + } + } + + // Create a response object compatible with existing code + const legacyResponse = { + statusCode: response.status, + body: body, + headers: response.headers + }; + + if (response.status !== 200) { + console.log(body); + } + + return legacyResponse; } public async requestStreaming(methodArg: string, routeArg: string, readStream?: plugins.smartstream.stream.Readable) { const requestUrl = `${this.socketPath}${routeArg}`; - const response = await plugins.smartrequest.request( - requestUrl, - { - method: methodArg, - headers: { - 'Content-Type': 'application/json', - 'X-Registry-Auth': this.registryToken, - Host: 'docker.sock', - }, - requestBody: null, - keepAlive: false, - }, - true, - (readStream ? reqArg => { - let counter = 0; - const smartduplex = new plugins.smartstream.SmartDuplex({ - writeFunction: async (chunkArg) => { - if (counter % 1000 === 0) { - console.log(`posting chunk ${counter}`); - } - counter++; - return chunkArg; + + // Build the request using the fluent API + const smartRequest = plugins.smartrequest.SmartRequest.create() + .url(requestUrl) + .header('Content-Type', 'application/json') + .header('X-Registry-Auth', this.registryToken) + .header('Host', 'docker.sock') + .options({ keepAlive: false }); + + // If we have a readStream, use the new stream method with logging + if (readStream) { + let counter = 0; + const smartduplex = new plugins.smartstream.SmartDuplex({ + writeFunction: async (chunkArg) => { + if (counter % 1000 === 0) { + console.log(`posting chunk ${counter}`); } - }); - readStream.pipe(smartduplex).pipe(reqArg); - } : null), - ); - console.log(response.statusCode); - console.log(response.body); - return response; + counter++; + return chunkArg; + } + }); + + // Pipe through the logging duplex stream + const loggedStream = readStream.pipe(smartduplex); + + // Use the new stream method to stream the data + smartRequest.stream(loggedStream, 'application/octet-stream'); + } + + // Execute the request based on method + let response; + switch (methodArg.toUpperCase()) { + case 'GET': + response = await smartRequest.get(); + break; + case 'POST': + response = await smartRequest.post(); + break; + case 'PUT': + response = await smartRequest.put(); + break; + case 'DELETE': + response = await smartRequest.delete(); + break; + default: + throw new Error(`Unsupported HTTP method: ${methodArg}`); + } + + console.log(response.status); + + // For streaming responses, get the Node.js stream + const nodeStream = response.streamNode(); + + if (!nodeStream) { + // If no stream is available, consume the body as text + const body = await response.text(); + console.log(body); + + // Return a compatible response object + return { + statusCode: response.status, + body: body, + headers: response.headers + }; + } + + // For streaming responses, return the stream with added properties + (nodeStream as any).statusCode = response.status; + (nodeStream as any).body = ''; // For compatibility + + return nodeStream; } /**