| New file |
| | |
| | | TEST_CLIENT_PORT=3000 |
| | | DEFAULT_TARGET_URL=http://womp.jsbogang.com/v1/weight/report |
| | | DEFAULT_CLIENT_ID=10001 |
| | | DEFAULT_SECRET=9001ac9676b8 |
| New file |
| | |
| | | TEST_CLIENT_PORT=3000 |
| | | DEFAULT_TARGET_URL=http://womp.jsbogang.com/v1/weight/report |
| | | DEFAULT_CLIENT_ID=10001 |
| | | DEFAULT_SECRET=9001ac9676b8 |
| New file |
| | |
| | | *.js text eol=lf |
| | | *.json text eol=lf |
| | | *.ts text eol=lf |
| | | *.vue text eol=lf |
| New file |
| | |
| | | .DS_Store |
| | | node_modules/ |
| | | /dist/ |
| | | |
| | | # Log files |
| | | npm-debug.log* |
| | | yarn-debug.log* |
| | | yarn-error.log* |
| | | |
| | | # Editor directories and files |
| | | .project |
| | | .idea |
| | | *.suo |
| | | *.ntvs* |
| | | *.njsproj |
| | | *.sln |
| | | *.sw* |
| | | |
| | | vite.config.ts.timestamp* |
| New file |
| | |
| | | { |
| | | "name": "datacenter-test-client", |
| | | "version": "1.0.0", |
| | | "lockfileVersion": 3, |
| | | "requires": true, |
| | | "packages": { |
| | | "": { |
| | | "name": "datacenter-test-client", |
| | | "version": "1.0.0", |
| | | "dependencies": { |
| | | "axios": "^1.7.9", |
| | | "dotenv": "^16.4.7", |
| | | "express": "^4.21.2" |
| | | } |
| | | }, |
| | | "node_modules/accepts": { |
| | | "version": "1.3.8", |
| | | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", |
| | | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "mime-types": "~2.1.34", |
| | | "negotiator": "0.6.3" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/agent-base": { |
| | | "version": "6.0.2", |
| | | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", |
| | | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "debug": "4" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 6.0.0" |
| | | } |
| | | }, |
| | | "node_modules/agent-base/node_modules/debug": { |
| | | "version": "4.4.3", |
| | | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", |
| | | "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "ms": "^2.1.3" |
| | | }, |
| | | "engines": { |
| | | "node": ">=6.0" |
| | | }, |
| | | "peerDependenciesMeta": { |
| | | "supports-color": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/agent-base/node_modules/ms": { |
| | | "version": "2.1.3", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", |
| | | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/array-flatten": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", |
| | | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/asynckit": { |
| | | "version": "0.4.0", |
| | | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", |
| | | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/axios": { |
| | | "version": "1.18.1", |
| | | "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", |
| | | "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "follow-redirects": "^1.16.0", |
| | | "form-data": "^4.0.5", |
| | | "https-proxy-agent": "^5.0.1", |
| | | "proxy-from-env": "^2.1.0" |
| | | } |
| | | }, |
| | | "node_modules/body-parser": { |
| | | "version": "1.20.6", |
| | | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", |
| | | "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "bytes": "~3.1.2", |
| | | "content-type": "~1.0.5", |
| | | "debug": "2.6.9", |
| | | "depd": "2.0.0", |
| | | "destroy": "~1.2.0", |
| | | "http-errors": "~2.0.1", |
| | | "iconv-lite": "~0.4.24", |
| | | "on-finished": "~2.4.1", |
| | | "qs": "~6.15.1", |
| | | "raw-body": "~2.5.3", |
| | | "type-is": "~1.6.18", |
| | | "unpipe": "~1.0.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8", |
| | | "npm": "1.2.8000 || >= 1.4.16" |
| | | } |
| | | }, |
| | | "node_modules/bytes": { |
| | | "version": "3.1.2", |
| | | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", |
| | | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/call-bind-apply-helpers": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", |
| | | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "es-errors": "^1.3.0", |
| | | "function-bind": "^1.1.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/call-bound": { |
| | | "version": "1.0.4", |
| | | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", |
| | | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "call-bind-apply-helpers": "^1.0.2", |
| | | "get-intrinsic": "^1.3.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/combined-stream": { |
| | | "version": "1.0.8", |
| | | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", |
| | | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "delayed-stream": "~1.0.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/content-disposition": { |
| | | "version": "0.5.4", |
| | | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", |
| | | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "safe-buffer": "5.2.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/content-type": { |
| | | "version": "1.0.5", |
| | | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", |
| | | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/cookie": { |
| | | "version": "0.7.2", |
| | | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", |
| | | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/cookie-signature": { |
| | | "version": "1.0.7", |
| | | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", |
| | | "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/debug": { |
| | | "version": "2.6.9", |
| | | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", |
| | | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "ms": "2.0.0" |
| | | } |
| | | }, |
| | | "node_modules/delayed-stream": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", |
| | | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">=0.4.0" |
| | | } |
| | | }, |
| | | "node_modules/depd": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", |
| | | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/destroy": { |
| | | "version": "1.2.0", |
| | | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", |
| | | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8", |
| | | "npm": "1.2.8000 || >= 1.4.16" |
| | | } |
| | | }, |
| | | "node_modules/dotenv": { |
| | | "version": "16.6.1", |
| | | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", |
| | | "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", |
| | | "license": "BSD-2-Clause", |
| | | "engines": { |
| | | "node": ">=12" |
| | | }, |
| | | "funding": { |
| | | "url": "https://dotenvx.com" |
| | | } |
| | | }, |
| | | "node_modules/dunder-proto": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", |
| | | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "call-bind-apply-helpers": "^1.0.1", |
| | | "es-errors": "^1.3.0", |
| | | "gopd": "^1.2.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/ee-first": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", |
| | | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/encodeurl": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", |
| | | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/es-define-property": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", |
| | | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/es-errors": { |
| | | "version": "1.3.0", |
| | | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", |
| | | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/es-object-atoms": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", |
| | | "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "es-errors": "^1.3.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/es-set-tostringtag": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", |
| | | "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "es-errors": "^1.3.0", |
| | | "get-intrinsic": "^1.2.6", |
| | | "has-tostringtag": "^1.0.2", |
| | | "hasown": "^2.0.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/escape-html": { |
| | | "version": "1.0.3", |
| | | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", |
| | | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/etag": { |
| | | "version": "1.8.1", |
| | | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", |
| | | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/express": { |
| | | "version": "4.22.2", |
| | | "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", |
| | | "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "accepts": "~1.3.8", |
| | | "array-flatten": "1.1.1", |
| | | "body-parser": "~1.20.5", |
| | | "content-disposition": "~0.5.4", |
| | | "content-type": "~1.0.4", |
| | | "cookie": "~0.7.1", |
| | | "cookie-signature": "~1.0.6", |
| | | "debug": "2.6.9", |
| | | "depd": "2.0.0", |
| | | "encodeurl": "~2.0.0", |
| | | "escape-html": "~1.0.3", |
| | | "etag": "~1.8.1", |
| | | "finalhandler": "~1.3.1", |
| | | "fresh": "~0.5.2", |
| | | "http-errors": "~2.0.0", |
| | | "merge-descriptors": "1.0.3", |
| | | "methods": "~1.1.2", |
| | | "on-finished": "~2.4.1", |
| | | "parseurl": "~1.3.3", |
| | | "path-to-regexp": "~0.1.12", |
| | | "proxy-addr": "~2.0.7", |
| | | "qs": "~6.15.1", |
| | | "range-parser": "~1.2.1", |
| | | "safe-buffer": "5.2.1", |
| | | "send": "~0.19.0", |
| | | "serve-static": "~1.16.2", |
| | | "setprototypeof": "1.2.0", |
| | | "statuses": "~2.0.1", |
| | | "type-is": "~1.6.18", |
| | | "utils-merge": "1.0.1", |
| | | "vary": "~1.1.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.10.0" |
| | | }, |
| | | "funding": { |
| | | "type": "opencollective", |
| | | "url": "https://opencollective.com/express" |
| | | } |
| | | }, |
| | | "node_modules/finalhandler": { |
| | | "version": "1.3.2", |
| | | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", |
| | | "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "debug": "2.6.9", |
| | | "encodeurl": "~2.0.0", |
| | | "escape-html": "~1.0.3", |
| | | "on-finished": "~2.4.1", |
| | | "parseurl": "~1.3.3", |
| | | "statuses": "~2.0.2", |
| | | "unpipe": "~1.0.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/follow-redirects": { |
| | | "version": "1.16.0", |
| | | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", |
| | | "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", |
| | | "funding": [ |
| | | { |
| | | "type": "individual", |
| | | "url": "https://github.com/sponsors/RubenVerborgh" |
| | | } |
| | | ], |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">=4.0" |
| | | }, |
| | | "peerDependenciesMeta": { |
| | | "debug": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/form-data": { |
| | | "version": "4.0.6", |
| | | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", |
| | | "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "asynckit": "^0.4.0", |
| | | "combined-stream": "^1.0.8", |
| | | "es-set-tostringtag": "^2.1.0", |
| | | "hasown": "^2.0.4", |
| | | "mime-types": "^2.1.35" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 6" |
| | | } |
| | | }, |
| | | "node_modules/forwarded": { |
| | | "version": "0.2.0", |
| | | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", |
| | | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/fresh": { |
| | | "version": "0.5.2", |
| | | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", |
| | | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/function-bind": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", |
| | | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", |
| | | "license": "MIT", |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/get-intrinsic": { |
| | | "version": "1.3.0", |
| | | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", |
| | | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "call-bind-apply-helpers": "^1.0.2", |
| | | "es-define-property": "^1.0.1", |
| | | "es-errors": "^1.3.0", |
| | | "es-object-atoms": "^1.1.1", |
| | | "function-bind": "^1.1.2", |
| | | "get-proto": "^1.0.1", |
| | | "gopd": "^1.2.0", |
| | | "has-symbols": "^1.1.0", |
| | | "hasown": "^2.0.2", |
| | | "math-intrinsics": "^1.1.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/get-proto": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", |
| | | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "dunder-proto": "^1.0.1", |
| | | "es-object-atoms": "^1.0.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/gopd": { |
| | | "version": "1.2.0", |
| | | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", |
| | | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/has-symbols": { |
| | | "version": "1.1.0", |
| | | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", |
| | | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/has-tostringtag": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", |
| | | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "has-symbols": "^1.0.3" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/hasown": { |
| | | "version": "2.0.4", |
| | | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", |
| | | "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "function-bind": "^1.1.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/http-errors": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", |
| | | "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "depd": "~2.0.0", |
| | | "inherits": "~2.0.4", |
| | | "setprototypeof": "~1.2.0", |
| | | "statuses": "~2.0.2", |
| | | "toidentifier": "~1.0.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | }, |
| | | "funding": { |
| | | "type": "opencollective", |
| | | "url": "https://opencollective.com/express" |
| | | } |
| | | }, |
| | | "node_modules/https-proxy-agent": { |
| | | "version": "5.0.1", |
| | | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", |
| | | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "agent-base": "6", |
| | | "debug": "4" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 6" |
| | | } |
| | | }, |
| | | "node_modules/https-proxy-agent/node_modules/debug": { |
| | | "version": "4.4.3", |
| | | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", |
| | | "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "ms": "^2.1.3" |
| | | }, |
| | | "engines": { |
| | | "node": ">=6.0" |
| | | }, |
| | | "peerDependenciesMeta": { |
| | | "supports-color": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/https-proxy-agent/node_modules/ms": { |
| | | "version": "2.1.3", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", |
| | | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/iconv-lite": { |
| | | "version": "0.4.24", |
| | | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", |
| | | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "safer-buffer": ">= 2.1.2 < 3" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.10.0" |
| | | } |
| | | }, |
| | | "node_modules/inherits": { |
| | | "version": "2.0.4", |
| | | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", |
| | | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", |
| | | "license": "ISC" |
| | | }, |
| | | "node_modules/ipaddr.js": { |
| | | "version": "1.9.1", |
| | | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", |
| | | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.10" |
| | | } |
| | | }, |
| | | "node_modules/math-intrinsics": { |
| | | "version": "1.1.0", |
| | | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", |
| | | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | } |
| | | }, |
| | | "node_modules/media-typer": { |
| | | "version": "0.3.0", |
| | | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |
| | | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/merge-descriptors": { |
| | | "version": "1.0.3", |
| | | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", |
| | | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", |
| | | "license": "MIT", |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/sindresorhus" |
| | | } |
| | | }, |
| | | "node_modules/methods": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", |
| | | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/mime": { |
| | | "version": "1.6.0", |
| | | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", |
| | | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", |
| | | "license": "MIT", |
| | | "bin": { |
| | | "mime": "cli.js" |
| | | }, |
| | | "engines": { |
| | | "node": ">=4" |
| | | } |
| | | }, |
| | | "node_modules/mime-db": { |
| | | "version": "1.52.0", |
| | | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", |
| | | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/mime-types": { |
| | | "version": "2.1.35", |
| | | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", |
| | | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "mime-db": "1.52.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/ms": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |
| | | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/negotiator": { |
| | | "version": "0.6.3", |
| | | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", |
| | | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/object-inspect": { |
| | | "version": "1.13.4", |
| | | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", |
| | | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/on-finished": { |
| | | "version": "2.4.1", |
| | | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", |
| | | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "ee-first": "1.1.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/parseurl": { |
| | | "version": "1.3.3", |
| | | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", |
| | | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/path-to-regexp": { |
| | | "version": "0.1.13", |
| | | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", |
| | | "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/proxy-addr": { |
| | | "version": "2.0.7", |
| | | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", |
| | | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "forwarded": "0.2.0", |
| | | "ipaddr.js": "1.9.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.10" |
| | | } |
| | | }, |
| | | "node_modules/proxy-from-env": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", |
| | | "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">=10" |
| | | } |
| | | }, |
| | | "node_modules/qs": { |
| | | "version": "6.15.3", |
| | | "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", |
| | | "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", |
| | | "license": "BSD-3-Clause", |
| | | "dependencies": { |
| | | "es-define-property": "^1.0.1", |
| | | "side-channel": "^1.1.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">=0.6" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/range-parser": { |
| | | "version": "1.2.1", |
| | | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", |
| | | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/raw-body": { |
| | | "version": "2.5.3", |
| | | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", |
| | | "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "bytes": "~3.1.2", |
| | | "http-errors": "~2.0.1", |
| | | "iconv-lite": "~0.4.24", |
| | | "unpipe": "~1.0.0" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/safe-buffer": { |
| | | "version": "5.2.1", |
| | | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", |
| | | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", |
| | | "funding": [ |
| | | { |
| | | "type": "github", |
| | | "url": "https://github.com/sponsors/feross" |
| | | }, |
| | | { |
| | | "type": "patreon", |
| | | "url": "https://www.patreon.com/feross" |
| | | }, |
| | | { |
| | | "type": "consulting", |
| | | "url": "https://feross.org/support" |
| | | } |
| | | ], |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/safer-buffer": { |
| | | "version": "2.1.2", |
| | | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
| | | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/send": { |
| | | "version": "0.19.2", |
| | | "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", |
| | | "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "debug": "2.6.9", |
| | | "depd": "2.0.0", |
| | | "destroy": "1.2.0", |
| | | "encodeurl": "~2.0.0", |
| | | "escape-html": "~1.0.3", |
| | | "etag": "~1.8.1", |
| | | "fresh": "~0.5.2", |
| | | "http-errors": "~2.0.1", |
| | | "mime": "1.6.0", |
| | | "ms": "2.1.3", |
| | | "on-finished": "~2.4.1", |
| | | "range-parser": "~1.2.1", |
| | | "statuses": "~2.0.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8.0" |
| | | } |
| | | }, |
| | | "node_modules/send/node_modules/ms": { |
| | | "version": "2.1.3", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", |
| | | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", |
| | | "license": "MIT" |
| | | }, |
| | | "node_modules/serve-static": { |
| | | "version": "1.16.3", |
| | | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", |
| | | "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "encodeurl": "~2.0.0", |
| | | "escape-html": "~1.0.3", |
| | | "parseurl": "~1.3.3", |
| | | "send": "~0.19.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.8.0" |
| | | } |
| | | }, |
| | | "node_modules/setprototypeof": { |
| | | "version": "1.2.0", |
| | | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", |
| | | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", |
| | | "license": "ISC" |
| | | }, |
| | | "node_modules/side-channel": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", |
| | | "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "es-errors": "^1.3.0", |
| | | "object-inspect": "^1.13.4", |
| | | "side-channel-list": "^1.0.1", |
| | | "side-channel-map": "^1.0.1", |
| | | "side-channel-weakmap": "^1.0.2" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/side-channel-list": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", |
| | | "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "es-errors": "^1.3.0", |
| | | "object-inspect": "^1.13.4" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/side-channel-map": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", |
| | | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "call-bound": "^1.0.2", |
| | | "es-errors": "^1.3.0", |
| | | "get-intrinsic": "^1.2.5", |
| | | "object-inspect": "^1.13.3" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/side-channel-weakmap": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", |
| | | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "call-bound": "^1.0.2", |
| | | "es-errors": "^1.3.0", |
| | | "get-intrinsic": "^1.2.5", |
| | | "object-inspect": "^1.13.3", |
| | | "side-channel-map": "^1.0.1" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.4" |
| | | }, |
| | | "funding": { |
| | | "url": "https://github.com/sponsors/ljharb" |
| | | } |
| | | }, |
| | | "node_modules/statuses": { |
| | | "version": "2.0.2", |
| | | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", |
| | | "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/toidentifier": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", |
| | | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">=0.6" |
| | | } |
| | | }, |
| | | "node_modules/type-is": { |
| | | "version": "1.6.18", |
| | | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", |
| | | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", |
| | | "license": "MIT", |
| | | "dependencies": { |
| | | "media-typer": "0.3.0", |
| | | "mime-types": "~2.1.24" |
| | | }, |
| | | "engines": { |
| | | "node": ">= 0.6" |
| | | } |
| | | }, |
| | | "node_modules/unpipe": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", |
| | | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | }, |
| | | "node_modules/utils-merge": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", |
| | | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.4.0" |
| | | } |
| | | }, |
| | | "node_modules/vary": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |
| | | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", |
| | | "license": "MIT", |
| | | "engines": { |
| | | "node": ">= 0.8" |
| | | } |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | { |
| | | "name": "datacenter-test-client", |
| | | "version": "1.0.0", |
| | | "description": "垃圾称重数据上报测试客户端", |
| | | "main": "server.js", |
| | | "scripts": { |
| | | "start": "node server.js" |
| | | }, |
| | | "dependencies": { |
| | | "axios": "^1.7.9", |
| | | "dotenv": "^16.4.7", |
| | | "express": "^4.21.2" |
| | | } |
| | | } |
| New file |
| | |
| | | function pad(n) { |
| | | return String(n).padStart(2, '0'); |
| | | } |
| | | |
| | | function formatNow() { |
| | | const d = new Date(); |
| | | return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; |
| | | } |
| | | |
| | | function buildDefaultGpsPayload() { |
| | | return { |
| | | msgType: 'com.hikvision.open.transparent', |
| | | msgSeq: String(Date.now()), |
| | | createDate: Date.now(), |
| | | sn: 'F12345678', |
| | | data: { |
| | | gpsTime: formatNow(), |
| | | longitude: 120.153245, |
| | | latitude: 30.267421, |
| | | speed: 60.5, |
| | | direction: 180, |
| | | elevation: 15.2, |
| | | status: 'A', |
| | | }, |
| | | }; |
| | | } |
| | | |
| | | function initTabs() { |
| | | const tabs = document.querySelectorAll('.tab'); |
| | | const panels = document.querySelectorAll('.tab-panel'); |
| | | |
| | | tabs.forEach((tab) => { |
| | | tab.addEventListener('click', () => { |
| | | const name = tab.dataset.tab; |
| | | |
| | | tabs.forEach((t) => { |
| | | const active = t === tab; |
| | | t.classList.toggle('active', active); |
| | | t.setAttribute('aria-selected', active ? 'true' : 'false'); |
| | | }); |
| | | |
| | | panels.forEach((panel) => { |
| | | const active = panel.id === `panel-${name}`; |
| | | panel.classList.toggle('active', active); |
| | | panel.hidden = !active; |
| | | }); |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | async function loadDefaults() { |
| | | const res = await fetch('/api/defaults'); |
| | | const data = await res.json(); |
| | | document.getElementById('targetUrl').value = data.targetUrl; |
| | | document.getElementById('clientId').value = data.clientId; |
| | | document.getElementById('secret').value = data.secret; |
| | | document.getElementById('uploadTime').value = formatNow(); |
| | | |
| | | if (data.gpsTargetUrl) { |
| | | document.getElementById('gpsTargetUrl').value = data.gpsTargetUrl; |
| | | } |
| | | } |
| | | |
| | | function initWeightTab() { |
| | | document.getElementById('nowBtn').addEventListener('click', () => { |
| | | document.getElementById('uploadTime').value = formatNow(); |
| | | }); |
| | | |
| | | document.getElementById('reportForm').addEventListener('submit', async (e) => { |
| | | e.preventDefault(); |
| | | const submitBtn = document.getElementById('submitBtn'); |
| | | const result = document.getElementById('result'); |
| | | submitBtn.disabled = true; |
| | | result.textContent = '上报中...'; |
| | | |
| | | const payload = { |
| | | targetUrl: document.getElementById('targetUrl').value.trim(), |
| | | clientId: document.getElementById('clientId').value.trim(), |
| | | secret: document.getElementById('secret').value.trim(), |
| | | deviceNo: document.getElementById('deviceNo').value.trim(), |
| | | uploadTime: document.getElementById('uploadTime').value.trim(), |
| | | garbageType: document.getElementById('garbageType').value, |
| | | garbageWeight: document.getElementById('garbageWeight').value.trim(), |
| | | others: document.getElementById('others').value.trim(), |
| | | }; |
| | | |
| | | try { |
| | | const res = await fetch('/api/send', { |
| | | method: 'POST', |
| | | headers: { 'Content-Type': 'application/json' }, |
| | | body: JSON.stringify(payload), |
| | | }); |
| | | const data = await res.json(); |
| | | result.textContent = JSON.stringify(data, null, 2); |
| | | } catch (err) { |
| | | result.textContent = JSON.stringify({ ok: false, msg: err.message }, null, 2); |
| | | } finally { |
| | | submitBtn.disabled = false; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | function initGpsTab() { |
| | | const gpsPayload = document.getElementById('gpsPayload'); |
| | | gpsPayload.value = JSON.stringify(buildDefaultGpsPayload(), null, 2); |
| | | |
| | | document.getElementById('gpsSendBtn').addEventListener('click', async () => { |
| | | const sendBtn = document.getElementById('gpsSendBtn'); |
| | | const result = document.getElementById('gpsResult'); |
| | | const targetUrl = document.getElementById('gpsTargetUrl').value.trim(); |
| | | const raw = gpsPayload.value.trim(); |
| | | |
| | | if (!targetUrl) { |
| | | result.textContent = JSON.stringify({ ok: false, msg: '请填写目标地址' }, null, 2); |
| | | return; |
| | | } |
| | | |
| | | let body; |
| | | try { |
| | | body = JSON.parse(raw); |
| | | } catch (err) { |
| | | result.textContent = JSON.stringify({ ok: false, msg: `JSON 格式错误: ${err.message}` }, null, 2); |
| | | return; |
| | | } |
| | | |
| | | sendBtn.disabled = true; |
| | | result.textContent = '发送中...'; |
| | | |
| | | try { |
| | | const res = await fetch('/api/send-gps', { |
| | | method: 'POST', |
| | | headers: { 'Content-Type': 'application/json' }, |
| | | body: JSON.stringify({ targetUrl, payload: body }), |
| | | }); |
| | | const data = await res.json(); |
| | | |
| | | result.textContent = JSON.stringify(data, null, 2); |
| | | } catch (err) { |
| | | result.textContent = JSON.stringify({ ok: false, msg: err.message }, null, 2); |
| | | } finally { |
| | | sendBtn.disabled = false; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | initTabs(); |
| | | initWeightTab(); |
| | | initGpsTab(); |
| | | |
| | | loadDefaults().catch((err) => { |
| | | document.getElementById('result').textContent = `加载默认配置失败: ${err.message}`; |
| | | }); |
| New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="zh-CN"> |
| | | <head> |
| | | <meta charset="UTF-8" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| | | <title>数据上报测试客户端</title> |
| | | <link rel="stylesheet" href="/style.css" /> |
| | | </head> |
| | | <body> |
| | | <div class="container"> |
| | | <header> |
| | | <h1>数据上报测试客户端</h1> |
| | | <p>选择对应 Tab 进行各类数据上报联调测试</p> |
| | | </header> |
| | | |
| | | <nav class="tabs" role="tablist"> |
| | | <button type="button" class="tab active" data-tab="weight" role="tab" aria-selected="true">垃圾称重数据上报测试</button> |
| | | <button type="button" class="tab" data-tab="gps" role="tab" aria-selected="false">车载监控GPS位置上报测试</button> |
| | | <button type="button" class="tab" data-tab="driver" role="tab" aria-selected="false">车载监控司机异常消息测试</button> |
| | | <button type="button" class="tab" data-tab="health" role="tab" aria-selected="false">人员位置健康数据上报测试</button> |
| | | </nav> |
| | | |
| | | <!-- Tab 1: 垃圾称重 --> |
| | | <section id="panel-weight" class="tab-panel active" role="tabpanel"> |
| | | <form id="reportForm" class="card"> |
| | | <div class="grid"> |
| | | <label> |
| | | 目标地址 |
| | | <input id="targetUrl" name="targetUrl" type="text" required /> |
| | | </label> |
| | | <label> |
| | | clientId |
| | | <input id="clientId" name="clientId" type="text" required /> |
| | | </label> |
| | | <label> |
| | | secret |
| | | <input id="secret" name="secret" type="text" required /> |
| | | </label> |
| | | <label> |
| | | 设备号 deviceNo |
| | | <input id="deviceNo" name="deviceNo" type="text" value="A01" required /> |
| | | </label> |
| | | <label> |
| | | 上传时间 uploadTime |
| | | <input id="uploadTime" name="uploadTime" type="text" required /> |
| | | <small>格式:yyyy-MM-dd HH:mm:ss</small> |
| | | </label> |
| | | <label> |
| | | 垃圾种类 garbageType |
| | | <select id="garbageType" name="garbageType" required> |
| | | <option value="100">100 - 干垃圾</option> |
| | | <option value="200">200 - 湿垃圾</option> |
| | | <option value="300">300 - 可回收</option> |
| | | <option value="301" selected>301 - 可回收-纸壳</option> |
| | | <option value="302">302 - 可回收-饮料瓶</option> |
| | | <option value="303">303 - 可回收-易拉罐</option> |
| | | <option value="304">304 - 可回收-旧衣帽</option> |
| | | <option value="305">305 - 可回收-玻璃</option> |
| | | <option value="306">306 - 可回收-电子产品</option> |
| | | <option value="307">307 - 可回收-金属-铁</option> |
| | | <option value="308">308 - 可回收-金属-铝</option> |
| | | <option value="309">309 - 可回收-金属-铜</option> |
| | | <option value="310">310 - 可回收-金属-不锈钢</option> |
| | | <option value="311">311 - 可回收-其他</option> |
| | | <option value="400">400 - 有害垃圾</option> |
| | | </select> |
| | | </label> |
| | | <label> |
| | | 垃圾重量 garbageWeight (kg) |
| | | <input id="garbageWeight" name="garbageWeight" type="number" step="0.001" min="0.001" value="50.23" required /> |
| | | </label> |
| | | </div> |
| | | |
| | | <label class="full"> |
| | | 附加信息 others(可选,JSON 字符串) |
| | | <textarea id="others" name="others" rows="4" placeholder='{"remark":"测试"}'></textarea> |
| | | </label> |
| | | |
| | | <div class="actions"> |
| | | <button type="button" id="nowBtn" class="secondary">填充当前时间</button> |
| | | <button type="submit" id="submitBtn">上报</button> |
| | | </div> |
| | | </form> |
| | | |
| | | <section class="card"> |
| | | <h2>调试结果</h2> |
| | | <pre id="result">等待上报...</pre> |
| | | </section> |
| | | </section> |
| | | |
| | | <!-- Tab 2: GPS --> |
| | | <section id="panel-gps" class="tab-panel" role="tabpanel" hidden> |
| | | <div class="card"> |
| | | <label> |
| | | 目标地址 |
| | | <input id="gpsTargetUrl" type="text" value="http://127.0.0.1:8001/open/push/cameragps" /> |
| | | </label> |
| | | <label class="full"> |
| | | 上报 JSON(可直接编辑) |
| | | <textarea id="gpsPayload" rows="20" spellcheck="false"></textarea> |
| | | </label> |
| | | <div class="actions"> |
| | | <button type="button" id="gpsSendBtn">发送</button> |
| | | </div> |
| | | </div> |
| | | <section class="card"> |
| | | <h2>返回结果</h2> |
| | | <pre id="gpsResult">等待发送...</pre> |
| | | </section> |
| | | </section> |
| | | |
| | | <!-- Tab 3: 司机异常 - 留白 --> |
| | | <section id="panel-driver" class="tab-panel" role="tabpanel" hidden> |
| | | <div class="card placeholder"> |
| | | <h2>车载监控司机异常消息测试</h2> |
| | | <p>功能待明确需求后补充</p> |
| | | </div> |
| | | </section> |
| | | |
| | | <!-- Tab 4: 人员健康 - 留白 --> |
| | | <section id="panel-health" class="tab-panel" role="tabpanel" hidden> |
| | | <div class="card placeholder"> |
| | | <h2>人员位置健康数据上报测试</h2> |
| | | <p>功能待明确需求后补充</p> |
| | | </div> |
| | | </section> |
| | | </div> |
| | | <script src="/app.js"></script> |
| | | </body> |
| | | </html> |
| New file |
| | |
| | | :root { |
| | | --bg: #f4f7fb; |
| | | --card: #ffffff; |
| | | --text: #1f2937; |
| | | --muted: #6b7280; |
| | | --primary: #2563eb; |
| | | --border: #e5e7eb; |
| | | } |
| | | |
| | | * { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | body { |
| | | margin: 0; |
| | | font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; |
| | | background: linear-gradient(180deg, #eef4ff 0%, var(--bg) 40%); |
| | | color: var(--text); |
| | | } |
| | | |
| | | .container { |
| | | max-width: 960px; |
| | | margin: 0 auto; |
| | | padding: 32px 20px 48px; |
| | | } |
| | | |
| | | header h1 { |
| | | margin: 0 0 8px; |
| | | font-size: 28px; |
| | | } |
| | | |
| | | header p { |
| | | margin: 0 0 24px; |
| | | color: var(--muted); |
| | | } |
| | | |
| | | .card { |
| | | background: var(--card); |
| | | border: 1px solid var(--border); |
| | | border-radius: 16px; |
| | | padding: 24px; |
| | | box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06); |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .grid { |
| | | display: grid; |
| | | grid-template-columns: repeat(2, minmax(0, 1fr)); |
| | | gap: 16px; |
| | | } |
| | | |
| | | label { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 8px; |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | label.full { |
| | | margin-top: 16px; |
| | | } |
| | | |
| | | small { |
| | | font-weight: 400; |
| | | color: var(--muted); |
| | | } |
| | | |
| | | input, |
| | | select, |
| | | textarea { |
| | | width: 100%; |
| | | border: 1px solid var(--border); |
| | | border-radius: 10px; |
| | | padding: 10px 12px; |
| | | font-size: 14px; |
| | | font-weight: 400; |
| | | font-family: inherit; |
| | | background: #fff; |
| | | } |
| | | |
| | | textarea { |
| | | resize: vertical; |
| | | } |
| | | |
| | | .actions { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | gap: 12px; |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | button { |
| | | border: none; |
| | | border-radius: 10px; |
| | | padding: 10px 18px; |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | cursor: pointer; |
| | | background: var(--primary); |
| | | color: #fff; |
| | | } |
| | | |
| | | button.secondary { |
| | | background: #e5e7eb; |
| | | color: #111827; |
| | | } |
| | | |
| | | button:disabled { |
| | | opacity: 0.6; |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .tabs { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 8px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .tab { |
| | | background: #fff; |
| | | color: var(--text); |
| | | border: 1px solid var(--border); |
| | | border-radius: 999px; |
| | | padding: 10px 16px; |
| | | font-size: 13px; |
| | | } |
| | | |
| | | .tab.active { |
| | | background: var(--primary); |
| | | border-color: var(--primary); |
| | | color: #fff; |
| | | } |
| | | |
| | | .tab-panel { |
| | | display: none; |
| | | } |
| | | |
| | | .tab-panel.active { |
| | | display: block; |
| | | } |
| | | |
| | | .placeholder { |
| | | text-align: center; |
| | | padding: 64px 24px; |
| | | } |
| | | |
| | | .placeholder h2 { |
| | | margin: 0 0 12px; |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .placeholder p { |
| | | margin: 0; |
| | | color: var(--muted); |
| | | } |
| | | |
| | | #gpsPayload { |
| | | font-family: Consolas, "Courier New", monospace; |
| | | min-height: 360px; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | pre { |
| | | margin: 0; |
| | | background: #0f172a; |
| | | color: #e2e8f0; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | overflow: auto; |
| | | min-height: 180px; |
| | | font-size: 13px; |
| | | line-height: 1.5; |
| | | } |
| | | |
| | | @media (max-width: 768px) { |
| | | .grid { |
| | | grid-template-columns: 1fr; |
| | | } |
| | | } |
| New file |
| | |
| | | require('dotenv').config(); |
| | | const path = require('path'); |
| | | const express = require('express'); |
| | | const axios = require('axios'); |
| | | const { sign } = require('./sign'); |
| | | |
| | | const app = express(); |
| | | const port = Number(process.env.TEST_CLIENT_PORT || 3000); |
| | | |
| | | app.use(express.json({ limit: '1mb' })); |
| | | app.use(express.static(path.join(__dirname, 'public'))); |
| | | |
| | | app.get('/api/defaults', (req, res) => { |
| | | res.json({ |
| | | targetUrl: process.env.DEFAULT_TARGET_URL || 'http://womp.jsbogang.com/v1/weight/report', |
| | | clientId: process.env.DEFAULT_CLIENT_ID || '10001', |
| | | secret: process.env.DEFAULT_SECRET || '9001ac9676b8', |
| | | gpsTargetUrl: process.env.DEFAULT_GPS_TARGET_URL || '', |
| | | }); |
| | | }); |
| | | |
| | | app.post('/api/send', async (req, res) => { |
| | | try { |
| | | const { |
| | | targetUrl, |
| | | clientId, |
| | | secret, |
| | | deviceNo, |
| | | uploadTime, |
| | | garbageType, |
| | | garbageWeight, |
| | | others, |
| | | } = req.body || {}; |
| | | |
| | | if (!targetUrl || !clientId || !secret || !deviceNo || !uploadTime || !garbageType || !garbageWeight) { |
| | | return res.status(400).json({ |
| | | ok: false, |
| | | msg: '缺少必填字段:targetUrl/clientId/secret/deviceNo/uploadTime/garbageType/garbageWeight', |
| | | }); |
| | | } |
| | | |
| | | if (others) { |
| | | try { |
| | | JSON.parse(others); |
| | | } catch (err) { |
| | | return res.status(400).json({ ok: false, msg: 'others 必须是合法 JSON 字符串' }); |
| | | } |
| | | } |
| | | |
| | | const signed = sign(clientId, deviceNo, uploadTime, garbageType, garbageWeight, secret); |
| | | const requestBody = { |
| | | deviceNo: String(deviceNo), |
| | | uploadTime: String(uploadTime), |
| | | garbageType: String(garbageType), |
| | | garbageWeight: String(garbageWeight), |
| | | }; |
| | | if (others) { |
| | | requestBody.others = String(others); |
| | | } |
| | | |
| | | let responsePayload = null; |
| | | let httpStatus = null; |
| | | let networkError = null; |
| | | |
| | | try { |
| | | const response = await axios.post(targetUrl, requestBody, { |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | clientId: String(clientId), |
| | | sign: signed.sign, |
| | | }, |
| | | timeout: 15000, |
| | | validateStatus: () => true, |
| | | }); |
| | | httpStatus = response.status; |
| | | responsePayload = response.data; |
| | | } catch (err) { |
| | | networkError = err.message; |
| | | } |
| | | |
| | | return res.json({ |
| | | ok: !networkError, |
| | | signString: signed.signString, |
| | | sign: signed.sign, |
| | | requestHeaders: { |
| | | clientId: String(clientId), |
| | | sign: signed.sign, |
| | | }, |
| | | requestBody, |
| | | httpStatus, |
| | | response: responsePayload, |
| | | networkError, |
| | | }); |
| | | } catch (err) { |
| | | return res.status(500).json({ ok: false, msg: err.message }); |
| | | } |
| | | }); |
| | | |
| | | app.post('/api/send-gps', async (req, res) => { |
| | | try { |
| | | const { targetUrl, payload } = req.body || {}; |
| | | |
| | | if (!targetUrl) { |
| | | return res.status(400).json({ ok: false, msg: '缺少目标地址 targetUrl' }); |
| | | } |
| | | if (!payload || typeof payload !== 'object') { |
| | | return res.status(400).json({ ok: false, msg: '缺少合法 JSON payload' }); |
| | | } |
| | | |
| | | let responsePayload = null; |
| | | let httpStatus = null; |
| | | let networkError = null; |
| | | |
| | | try { |
| | | const response = await axios.post(targetUrl, payload, { |
| | | headers: { 'Content-Type': 'application/json' }, |
| | | timeout: 15000, |
| | | validateStatus: () => true, |
| | | }); |
| | | console.log(response.data) |
| | | httpStatus = response.status; |
| | | responsePayload = response.data; |
| | | } catch (err) { |
| | | networkError = err.message; |
| | | } |
| | | |
| | | return res.json({ |
| | | ok: !networkError, |
| | | requestBody: payload, |
| | | httpStatus, |
| | | response: responsePayload, |
| | | networkError, |
| | | }); |
| | | } catch (err) { |
| | | return res.status(500).json({ ok: false, msg: err.message }); |
| | | } |
| | | }); |
| | | |
| | | app.listen(port, '0.0.0.0', () => { |
| | | console.log(`测试客户端已启动: http://localhost:${port}`); |
| | | }); |
| New file |
| | |
| | | const crypto = require('crypto'); |
| | | |
| | | function buildSignString(clientId, deviceNo, uploadTime, garbageType, garbageWeight, secret) { |
| | | return [clientId, deviceNo, uploadTime, garbageType, garbageWeight, secret].join(','); |
| | | } |
| | | |
| | | function sign(clientId, deviceNo, uploadTime, garbageType, garbageWeight, secret) { |
| | | const text = buildSignString(clientId, deviceNo, uploadTime, garbageType, garbageWeight, secret); |
| | | return { |
| | | signString: text, |
| | | sign: crypto.createHash('sha256').update(text, 'utf8').digest('hex'), |
| | | }; |
| | | } |
| | | |
| | | module.exports = { |
| | | buildSignString, |
| | | sign, |
| | | }; |