Commit 16dfabaa authored by nanahira's avatar nanahira

buggy

parent 54f74bbf
...@@ -6,3 +6,6 @@ SSL_PATH: "" ...@@ -6,3 +6,6 @@ SSL_PATH: ""
SSL_CERT: "" SSL_CERT: ""
SSL_KEY: "" SSL_KEY: ""
TRUSTED_PROXIES: 127.0.0.0/8,::1/128 TRUSTED_PROXIES: 127.0.0.0/8,::1/128
NO_CONNECT_COUNT_LIMIT: ""
ALT_VERSIONS: ""
USE_PROXY: ""
...@@ -9,9 +9,12 @@ ...@@ -9,9 +9,12 @@
"version": "1.0.0", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ip6addr": "^0.2.5", "axios": "^1.13.5",
"http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.6",
"ipaddr.js": "^2.3.0",
"koishipro-core.js": "^1.3.0", "koishipro-core.js": "^1.3.0",
"nfkit": "^1.0.21", "nfkit": "^1.0.22",
"pino": "^10.3.1", "pino": "^10.3.1",
"pino-pretty": "^13.1.3", "pino-pretty": "^13.1.3",
"rxjs": "^7.8.2", "rxjs": "^7.8.2",
...@@ -24,7 +27,6 @@ ...@@ -24,7 +27,6 @@
"ygopro-yrp-encode": "^1.0.1" "ygopro-yrp-encode": "^1.0.1"
}, },
"devDependencies": { "devDependencies": {
"@types/ip6addr": "^0.2.6",
"@types/jest": "^30.0.0", "@types/jest": "^30.0.0",
"@types/node": "^25.2.3", "@types/node": "^25.2.3",
"@types/ws": "^8.18.1", "@types/ws": "^8.18.1",
...@@ -36,6 +38,7 @@ ...@@ -36,6 +38,7 @@
"jest": "^30.2.0", "jest": "^30.2.0",
"prettier": "^3.8.1", "prettier": "^3.8.1",
"ts-jest": "^29.4.6", "ts-jest": "^29.4.6",
"ts-node": "^10.9.2",
"typescript": "^5.9.3" "typescript": "^5.9.3"
} }
}, },
...@@ -556,6 +559,30 @@ ...@@ -556,6 +559,30 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@cspotcode/source-map-support": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@emnapi/core": { "node_modules/@emnapi/core": {
"version": "1.8.1", "version": "1.8.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
...@@ -1422,6 +1449,34 @@ ...@@ -1422,6 +1449,34 @@
"@sinonjs/commons": "^3.0.1" "@sinonjs/commons": "^3.0.1"
} }
}, },
"node_modules/@tsconfig/node10": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
"integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"dev": true,
"license": "MIT"
},
"node_modules/@tsconfig/node14": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"dev": true,
"license": "MIT"
},
"node_modules/@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"dev": true,
"license": "MIT"
},
"node_modules/@tybys/wasm-util": { "node_modules/@tybys/wasm-util": {
"version": "0.10.1", "version": "0.10.1",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
...@@ -1484,13 +1539,6 @@ ...@@ -1484,13 +1539,6 @@
"integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==", "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/ip6addr": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/@types/ip6addr/-/ip6addr-0.2.6.tgz",
"integrity": "sha512-6cEourAsqFTaS6Hd4jRY1oUBQil6z+Ih15U1i0J34ssZu0UV0bfCNg9eTqMDLcE26hLyPANTRFctg/C9I47ahA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/istanbul-lib-coverage": { "node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
...@@ -1534,6 +1582,7 @@ ...@@ -1534,6 +1582,7 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz",
"integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"undici-types": "~7.16.0" "undici-types": "~7.16.0"
} }
...@@ -2116,6 +2165,28 @@ ...@@ -2116,6 +2165,28 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
} }
}, },
"node_modules/acorn-walk": {
"version": "8.3.4",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
"dev": true,
"license": "MIT",
"dependencies": {
"acorn": "^8.11.0"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/agent-base": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
"integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"license": "MIT",
"engines": {
"node": ">= 14"
}
},
"node_modules/ajv": { "node_modules/ajv": {
"version": "6.12.6", "version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
...@@ -2202,6 +2273,13 @@ ...@@ -2202,6 +2273,13 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"dev": true,
"license": "MIT"
},
"node_modules/argparse": { "node_modules/argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
...@@ -2209,14 +2287,11 @@ ...@@ -2209,14 +2287,11 @@
"dev": true, "dev": true,
"license": "Python-2.0" "license": "Python-2.0"
}, },
"node_modules/assert-plus": { "node_modules/asynckit": {
"version": "1.0.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT", "license": "MIT"
"engines": {
"node": ">=0.8"
}
}, },
"node_modules/atomic-sleep": { "node_modules/atomic-sleep": {
"version": "1.0.0", "version": "1.0.0",
...@@ -2227,6 +2302,17 @@ ...@@ -2227,6 +2302,17 @@
"node": ">=8.0.0" "node": ">=8.0.0"
} }
}, },
"node_modules/axios": {
"version": "1.13.5",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
"integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.11",
"form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-jest": { "node_modules/babel-jest": {
"version": "30.2.0", "version": "30.2.0",
"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz",
...@@ -2475,6 +2561,19 @@ ...@@ -2475,6 +2561,19 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"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/callsites": { "node_modules/callsites": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
...@@ -2665,6 +2764,18 @@ ...@@ -2665,6 +2764,18 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"license": "MIT" "license": "MIT"
}, },
"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/concat-map": { "node_modules/concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
...@@ -2685,6 +2796,13 @@ ...@@ -2685,6 +2796,13 @@
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/create-require": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "7.0.6", "version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
...@@ -2713,7 +2831,6 @@ ...@@ -2713,7 +2831,6 @@
"version": "4.4.3", "version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ms": "^2.1.3" "ms": "^2.1.3"
...@@ -2759,6 +2876,15 @@ ...@@ -2759,6 +2876,15 @@
"node": ">=0.10.0" "node": ">=0.10.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/detect-newline": { "node_modules/detect-newline": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
...@@ -2769,6 +2895,16 @@ ...@@ -2769,6 +2895,16 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/diff": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
"integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.3.1"
}
},
"node_modules/doctrine": { "node_modules/doctrine": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
...@@ -2782,6 +2918,20 @@ ...@@ -2782,6 +2918,20 @@
"node": ">=6.0.0" "node": ">=6.0.0"
} }
}, },
"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/eastasianwidth": { "node_modules/eastasianwidth": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
...@@ -2835,6 +2985,51 @@ ...@@ -2835,6 +2985,51 @@
"is-arrayish": "^0.2.1" "is-arrayish": "^0.2.1"
} }
}, },
"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.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"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/escalade": { "node_modules/escalade": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
...@@ -3165,15 +3360,6 @@ ...@@ -3165,15 +3360,6 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
} }
}, },
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
"engines": [
"node >=0.6.0"
],
"license": "MIT"
},
"node_modules/fast-copy": { "node_modules/fast-copy": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.2.tgz", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.2.tgz",
...@@ -3299,6 +3485,26 @@ ...@@ -3299,6 +3485,26 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/foreground-child": { "node_modules/foreground-child": {
"version": "3.3.1", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
...@@ -3316,6 +3522,22 @@ ...@@ -3316,6 +3522,22 @@
"url": "https://github.com/sponsors/isaacs" "url": "https://github.com/sponsors/isaacs"
} }
}, },
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fs.realpath": { "node_modules/fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
...@@ -3338,6 +3560,15 @@ ...@@ -3338,6 +3560,15 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0" "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
} }
}, },
"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/gensync": { "node_modules/gensync": {
"version": "1.0.0-beta.2", "version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
...@@ -3358,6 +3589,30 @@ ...@@ -3358,6 +3589,30 @@
"node": "6.* || 8.* || >= 10.*" "node": "6.* || 8.* || >= 10.*"
} }
}, },
"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-package-type": { "node_modules/get-package-type": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
...@@ -3368,6 +3623,19 @@ ...@@ -3368,6 +3623,19 @@
"node": ">=8.0.0" "node": ">=8.0.0"
} }
}, },
"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/get-stream": { "node_modules/get-stream": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
...@@ -3432,6 +3700,18 @@ ...@@ -3432,6 +3700,18 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"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/graceful-fs": { "node_modules/graceful-fs": {
"version": "4.2.11", "version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
...@@ -3478,6 +3758,45 @@ ...@@ -3478,6 +3758,45 @@
"node": ">=8" "node": ">=8"
} }
}, },
"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.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/help-me": { "node_modules/help-me": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
...@@ -3491,6 +3810,32 @@ ...@@ -3491,6 +3810,32 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
"integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.0",
"debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/https-proxy-agent": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
"integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/human-signals": { "node_modules/human-signals": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
...@@ -3602,14 +3947,13 @@ ...@@ -3602,14 +3947,13 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC" "license": "ISC"
}, },
"node_modules/ip6addr": { "node_modules/ipaddr.js": {
"version": "0.2.5", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
"integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==", "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==",
"license": "MPL-2.0", "license": "MIT",
"dependencies": { "engines": {
"assert-plus": "^1.0.0", "node": ">= 10"
"jsprim": "^2.0.2"
} }
}, },
"node_modules/is-arrayish": { "node_modules/is-arrayish": {
...@@ -4445,12 +4789,6 @@ ...@@ -4445,12 +4789,6 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
"license": "(AFL-2.1 OR BSD-3-Clause)"
},
"node_modules/json-schema-traverse": { "node_modules/json-schema-traverse": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
...@@ -4478,21 +4816,6 @@ ...@@ -4478,21 +4816,6 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/jsprim": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
"integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
"engines": [
"node >=0.6.0"
],
"license": "MIT",
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.4.0",
"verror": "1.10.0"
}
},
"node_modules/jszip": { "node_modules/jszip": {
"version": "3.10.1", "version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
...@@ -4645,6 +4968,15 @@ ...@@ -4645,6 +4968,15 @@
"tmpl": "1.0.5" "tmpl": "1.0.5"
} }
}, },
"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/merge-stream": { "node_modules/merge-stream": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
...@@ -4666,6 +4998,27 @@ ...@@ -4666,6 +4998,27 @@
"node": ">=8.6" "node": ">=8.6"
} }
}, },
"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/mimic-fn": { "node_modules/mimic-fn": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
...@@ -4715,7 +5068,6 @@ ...@@ -4715,7 +5068,6 @@
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/napi-postinstall": { "node_modules/napi-postinstall": {
...@@ -4749,9 +5101,9 @@ ...@@ -4749,9 +5101,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/nfkit": { "node_modules/nfkit": {
"version": "1.0.21", "version": "1.0.22",
"resolved": "https://registry.npmjs.org/nfkit/-/nfkit-1.0.21.tgz", "resolved": "https://registry.npmjs.org/nfkit/-/nfkit-1.0.22.tgz",
"integrity": "sha512-YLs7zUoq9Lz3r91xM4UkHddKWhvaBvdTz+45E/k0xOqKrWiXj0iXMLwSwK9+q1rS39PoV+mD2+vJ8ox/M53HuQ==", "integrity": "sha512-w0voG3JpSM2WSxv4rkncwQkY2EdQmSADC7qorduy4JHvO2FWkJnoX+GYYJrihjYWQIRCe8t+vDJ1oa14+eG3NA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/node-int64": { "node_modules/node-int64": {
...@@ -5246,6 +5598,12 @@ ...@@ -5246,6 +5598,12 @@
], ],
"license": "MIT" "license": "MIT"
}, },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/pump": { "node_modules/pump": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
...@@ -6078,6 +6436,51 @@ ...@@ -6078,6 +6436,51 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/ts-node": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
"@tsconfig/node12": "^1.0.7",
"@tsconfig/node14": "^1.0.0",
"@tsconfig/node16": "^1.0.2",
"acorn": "^8.4.1",
"acorn-walk": "^8.1.1",
"arg": "^4.1.0",
"create-require": "^1.1.0",
"diff": "^4.0.1",
"make-error": "^1.1.1",
"v8-compile-cache-lib": "^3.0.1",
"yn": "3.1.1"
},
"bin": {
"ts-node": "dist/bin.js",
"ts-node-cwd": "dist/bin-cwd.js",
"ts-node-esm": "dist/bin-esm.js",
"ts-node-script": "dist/bin-script.js",
"ts-node-transpile-only": "dist/bin-transpile.js",
"ts-script": "dist/bin-script-deprecated.js"
},
"peerDependencies": {
"@swc/core": ">=1.2.50",
"@swc/wasm": ">=1.2.50",
"@types/node": "*",
"typescript": ">=2.7"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"@swc/wasm": {
"optional": true
}
}
},
"node_modules/tslib": { "node_modules/tslib": {
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
...@@ -6246,6 +6649,13 @@ ...@@ -6246,6 +6649,13 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"dev": true,
"license": "MIT"
},
"node_modules/v8-to-istanbul": { "node_modules/v8-to-istanbul": {
"version": "9.3.0", "version": "9.3.0",
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
...@@ -6261,26 +6671,6 @@ ...@@ -6261,26 +6671,6 @@
"node": ">=10.12.0" "node": ">=10.12.0"
} }
}, },
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
"engines": [
"node >=0.6.0"
],
"license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"node_modules/verror/node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
"license": "MIT"
},
"node_modules/walker": { "node_modules/walker": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
...@@ -6597,6 +6987,16 @@ ...@@ -6597,6 +6987,16 @@
"ygopro-deck-encode": "^1.0.15" "ygopro-deck-encode": "^1.0.15"
} }
}, },
"node_modules/yn": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/yocto-queue": { "node_modules/yocto-queue": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
"build": "tsc", "build": "tsc",
"gen:config-example": "npm run build && node dist/src/scripts/gen-config-example.js", "gen:config-example": "npm run build && node dist/src/scripts/gen-config-example.js",
"test": "jest --passWithNoTests", "test": "jest --passWithNoTests",
"dev": "ts-node index.ts",
"start": "node dist/index.js" "start": "node dist/index.js"
}, },
"repository": { "repository": {
...@@ -40,7 +41,6 @@ ...@@ -40,7 +41,6 @@
"testEnvironment": "node" "testEnvironment": "node"
}, },
"devDependencies": { "devDependencies": {
"@types/ip6addr": "^0.2.6",
"@types/jest": "^30.0.0", "@types/jest": "^30.0.0",
"@types/node": "^25.2.3", "@types/node": "^25.2.3",
"@types/ws": "^8.18.1", "@types/ws": "^8.18.1",
...@@ -52,12 +52,16 @@ ...@@ -52,12 +52,16 @@
"jest": "^30.2.0", "jest": "^30.2.0",
"prettier": "^3.8.1", "prettier": "^3.8.1",
"ts-jest": "^29.4.6", "ts-jest": "^29.4.6",
"ts-node": "^10.9.2",
"typescript": "^5.9.3" "typescript": "^5.9.3"
}, },
"dependencies": { "dependencies": {
"ip6addr": "^0.2.5", "axios": "^1.13.5",
"http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.6",
"ipaddr.js": "^2.3.0",
"koishipro-core.js": "^1.3.0", "koishipro-core.js": "^1.3.0",
"nfkit": "^1.0.21", "nfkit": "^1.0.22",
"pino": "^10.3.1", "pino": "^10.3.1",
"pino-pretty": "^13.1.3", "pino-pretty": "^13.1.3",
"rxjs": "^7.8.2", "rxjs": "^7.8.2",
......
...@@ -5,6 +5,13 @@ import { Emitter } from './services/emitter'; ...@@ -5,6 +5,13 @@ import { Emitter } from './services/emitter';
import { SSLFinder } from './services/ssl-finder'; import { SSLFinder } from './services/ssl-finder';
import { ClientHandler } from './services/client-handler'; import { ClientHandler } from './services/client-handler';
import { IpResolver } from './services/ip-resolver'; import { IpResolver } from './services/ip-resolver';
import { HttpClient } from './services/http-client';
import { Chnroute } from './services/chnroute';
import { I18nService } from './services/i18n';
import { YGOProCtosJoinGame } from 'ygopro-msg-encode';
import { TcpServer } from './transport/tcp/server';
import { WsServer } from './transport/ws/server';
import { ClientVersionCheck } from './services/client-version-check';
const core = createAppContext() const core = createAppContext()
.provide(ConfigService, { .provide(ConfigService, {
...@@ -12,6 +19,7 @@ const core = createAppContext() ...@@ -12,6 +19,7 @@ const core = createAppContext()
}) })
.provide(Logger, { merge: ['createLogger'] }) .provide(Logger, { merge: ['createLogger'] })
.provide(Emitter, { merge: ['dispatch', 'middleware', 'removeMiddleware'] }) .provide(Emitter, { merge: ['dispatch', 'middleware', 'removeMiddleware'] })
.provide(HttpClient, { merge: ['http'] })
.define(); .define();
export type Context = typeof core; export type Context = typeof core;
...@@ -19,5 +27,21 @@ export type Context = typeof core; ...@@ -19,5 +27,21 @@ export type Context = typeof core;
export const app = core export const app = core
.provide(SSLFinder) .provide(SSLFinder)
.provide(IpResolver) .provide(IpResolver)
.provide(Chnroute)
.provide(I18nService)
.provide(ClientHandler) .provide(ClientHandler)
.provide(TcpServer)
.provide(WsServer)
.provide(ClientVersionCheck)
.define(); .define();
app.middleware(YGOProCtosJoinGame, async (msg, client, next) => {
await client.sendChat(`Welcome ${client.name_vpass || client.name}!`);
await client.sendChat(`Your IP: ${client.ip}`);
await client.sendChat(`Your physical IP: ${client.physicalIp()}`);
await client.sendChat(`Your pass: ${msg.pass}`);
await client.die(
'This server is for testing purposes only. Please use an official server to play the game.',
);
return undefined;
});
import { import {
filter, filter,
firstValueFrom, firstValueFrom,
merge,
Observable, Observable,
Subject, Subject,
timeout, timeout,
TimeoutError, TimeoutError,
} from 'rxjs'; } from 'rxjs';
import { take } from 'rxjs/operators';
import { Context } from './app'; import { Context } from './app';
import { import {
YGOProCtos, YGOProCtos,
...@@ -18,22 +20,26 @@ import { ...@@ -18,22 +20,26 @@ import {
import { YGOProProtoPipe } from './utility/ygopro-proto-pipe'; import { YGOProProtoPipe } from './utility/ygopro-proto-pipe';
import { ClassType } from 'nfkit'; import { ClassType } from 'nfkit';
import { I18nService } from './services/i18n'; import { I18nService } from './services/i18n';
import { Chnroute } from './services/chnroute';
export abstract class Client { export abstract class Client {
protected abstract _send(data: Buffer): Promise<void>; protected abstract _send(data: Buffer): Promise<void>;
protected abstract _receive(): Observable<Buffer<ArrayBufferLike>>; protected abstract _receive(): Observable<Buffer<ArrayBufferLike>>;
abstract disconnect(): Promise<void>; protected abstract _disconnect(): Promise<void>;
abstract onDisconnect(): Observable<void>; protected abstract _onDisconnect(): Observable<void>;
abstract physicalIp(): string; abstract physicalIp(): string;
ip = ''; ip = '';
isLocal = false; isLocal = false;
private logger = this.ctx.createLogger(`Client ${this.physicalIp()}`); private logger = this.ctx.createLogger(this.constructor.name);
private receiveSubject?: Subject<YGOProCtosBase>; private receiveSubject?: Subject<YGOProCtosBase>;
private disconnectSubject = new Subject<void>();
private manuallyDisconnected = false;
constructor(protected ctx: Context) { constructor(protected ctx: Context) {}
// Subscribe to disconnect event to clean up subject
init() {
this.onDisconnect().subscribe(() => { this.onDisconnect().subscribe(() => {
if (this.receiveSubject) { if (this.receiveSubject) {
this.receiveSubject.complete(); this.receiveSubject.complete();
...@@ -42,6 +48,23 @@ export abstract class Client { ...@@ -42,6 +48,23 @@ export abstract class Client {
}); });
} }
async disconnect(): Promise<void> {
this.manuallyDisconnected = true;
this.disconnectSubject.next();
this.disconnectSubject.complete();
await this._disconnect();
}
onDisconnect(): Observable<void> {
if (this.manuallyDisconnected) {
return this.disconnectSubject.asObservable();
}
return merge(
this.disconnectSubject.asObservable(),
this._onDisconnect(),
).pipe(take(1));
}
async send(data: YGOProStocBase) { async send(data: YGOProStocBase) {
try { try {
await this._send(Buffer.from(data.toFullPayload())); await this._send(Buffer.from(data.toFullPayload()));
...@@ -53,16 +76,18 @@ export abstract class Client { ...@@ -53,16 +76,18 @@ export abstract class Client {
} }
} }
async sendChat(msg: string, type: number) { async sendChat(msg: string, type = ChatColor.BABYBLUE) {
return this.send( return this.send(
new YGOProStocChat().fromPartial({ new YGOProStocChat().fromPartial({
msg: await this.ctx.get(I18nService).translate('en-US', msg), msg: await this.ctx
.get(I18nService)
.translate(this.ctx.get(Chnroute).getLocale(this.ip), msg),
player_type: type, player_type: type,
}), }),
); );
} }
async die(msg?: string, type?: number) { async die(msg?: string, type = ChatColor.BABYBLUE) {
if (msg) { if (msg) {
await this.sendChat(msg, type || ChatColor.BABYBLUE); await this.sendChat(msg, type || ChatColor.BABYBLUE);
} }
...@@ -115,34 +140,6 @@ export abstract class Client { ...@@ -115,34 +140,6 @@ export abstract class Client {
return this.receiveSubject.asObservable(); return this.receiveSubject.asObservable();
} }
/**
* Wait for a message of any of the specified types
* @param types Array of message classes to wait for
* @param timeoutMs Timeout in milliseconds (default: 5000)
* @returns Promise that resolves with the matching message
* @throws Error if timeout is reached
*/
async waitForMessage<const C extends ClassType<YGOProCtosBase>[]>(
types: C,
timeoutMs = 5000,
): Promise<InstanceType<C[number]>> {
try {
return (await firstValueFrom(
this.receive().pipe(
filter((msg) => types.some((type) => msg instanceof type)) as any,
timeout(timeoutMs),
),
)) as InstanceType<C[number]>;
} catch (err) {
if (err instanceof TimeoutError) {
throw new Error(
`Timeout waiting for message after ${timeoutMs}ms (IP: ${this.loggingIp()})`,
);
}
throw err;
}
}
name = ''; name = '';
vpass = ''; vpass = '';
name_vpass = ''; name_vpass = '';
......
...@@ -12,6 +12,7 @@ export const defaultConfig = { ...@@ -12,6 +12,7 @@ export const defaultConfig = {
TRUSTED_PROXIES: '127.0.0.0/8,::1/128', TRUSTED_PROXIES: '127.0.0.0/8,::1/128',
NO_CONNECT_COUNT_LIMIT: '', NO_CONNECT_COUNT_LIMIT: '',
ALT_VERSIONS: '', ALT_VERSIONS: '',
USE_PROXY: '',
}; };
export type Config = typeof defaultConfig; export type Config = typeof defaultConfig;
......
export const TRANSLATIONS = { export const TRANSLATIONS = {
'en-US': {}, 'en-US': {
'zh-CN': {}, update_required: 'Please update your client version',
} wait_update:
'Your client version is higher than the server version, please wait for the server to update',
version_to_polyfill:
'Your client version is not fully supported. Please rejoin to enable temporary compatibility mode. For the best experience, we recommend updating your game to the latest version.',
version_polyfilled:
'Temporary compatibility mode has been enabled for your version. We recommend updating your game to avoid potential compatibility issues in the future.',
},
'zh-CN': {
update_required: '请更新你的客户端版本',
wait_update: '你的客户端版本高于服务器版本,请等待服务器更新',
version_to_polyfill:
'当前客户端版本暂未完全支持。请重新加入以启用临时兼容模式。为获得更佳体验,建议尽快更新游戏版本。',
version_polyfilled:
'已为当前版本启用临时兼容模式。建议尽快更新游戏,以避免后续兼容性问题。',
},
};
...@@ -8,35 +8,37 @@ import { IpResolver } from './ip-resolver'; ...@@ -8,35 +8,37 @@ import { IpResolver } from './ip-resolver';
import { WsClient } from '../transport/ws/client'; import { WsClient } from '../transport/ws/client';
export class ClientHandler { export class ClientHandler {
constructor(private ctx: Context) {} constructor(private ctx: Context) {
this.ctx.middleware(
private logger = this.ctx.createLogger('ClientHandler');
async handleClient(client: Client): Promise<void> {
try {
const first = await client.waitForMessage([
YGOProCtosPlayerInfo,
YGOProCtosExternalAddress, YGOProCtosExternalAddress,
]); async (msg, client, next) => {
let playerInfo: YGOProCtosPlayerInfo; if (client instanceof WsClient) {
return next();
if (first instanceof YGOProCtosExternalAddress) {
if (!(client instanceof WsClient)) {
this.ctx.get(IpResolver).setClientIp(client, first.real_ip);
}
playerInfo = await client.waitForMessage([YGOProCtosPlayerInfo]);
} else {
if (!(client instanceof WsClient)) {
this.ctx.get(IpResolver).setClientIp(client);
}
playerInfo = first;
} }
this.ctx
.get(IpResolver)
.setClientIp(
client,
msg.real_ip === '0.0.0.0' ? undefined : msg.real_ip,
);
return next();
},
);
client.name_vpass = playerInfo.name; this.ctx.middleware(YGOProCtosPlayerInfo, async (msg, client, next) => {
const [name, vpass] = playerInfo.name.split('$'); const [name, vpass] = msg.name.split('$');
client.name = name; client.name = name;
client.vpass = vpass || ''; client.vpass = vpass || '';
return next();
});
}
private logger = this.ctx.createLogger('ClientHandler');
async handleClient(client: Client): Promise<void> {
client.init();
try {
client.init();
client.receive().subscribe(async (msg) => { client.receive().subscribe(async (msg) => {
try { try {
await this.ctx.dispatch(msg, client); await this.ctx.dispatch(msg, client);
......
import { YGOProCtosJoinGame } from 'ygopro-msg-encode'; import {
ChatColor,
YGOProCtosJoinGame,
YGOProStocErrorMsg,
} from 'ygopro-msg-encode';
import { Context } from '../app'; import { Context } from '../app';
const YGOPRO_VERSION = 0x1362; const YGOPRO_VERSION = 0x1362;
...@@ -15,6 +19,18 @@ export class ClientVersionCheck { ...@@ -15,6 +19,18 @@ export class ClientVersionCheck {
if (msg.version === YGOPRO_VERSION) { if (msg.version === YGOPRO_VERSION) {
return next(); return next();
} }
if (this.altVersions.includes(msg.version)) {
await client.sendChat('#{version_polyfilled}', ChatColor.BABYBLUE);
return next();
}
await client.sendChat('#{update_required}', ChatColor.RED);
await client.send(
new YGOProStocErrorMsg().fromPartial({
msg: 4,
code: YGOPRO_VERSION,
}),
);
await client.disconnect();
}); });
} }
} }
import { Context } from '../app'; import { Context } from '../app';
import { Client } from '../client'; import { Client } from '../client';
import * as ip6addr from 'ip6addr'; import * as ipaddr from 'ipaddr.js';
export class IpResolver { export class IpResolver {
private logger = this.ctx.createLogger('IpResolver'); private logger = this.ctx.createLogger('IpResolver');
private connectedIpCount = new Map<string, number>(); private connectedIpCount = new Map<string, number>();
private badIpCount = new Map<string, number>(); private badIpCount = new Map<string, number>();
private trustedProxies: Array< private trustedProxies: Array<[ipaddr.IPv4 | ipaddr.IPv6, number]> = [];
ReturnType<typeof ip6addr.createCIDR | typeof ip6addr.createAddrRange>
> = [];
constructor(private ctx: Context) { constructor(private ctx: Context) {
// Parse trusted proxies configuration // Parse trusted proxies configuration
...@@ -23,11 +21,7 @@ export class IpResolver { ...@@ -23,11 +21,7 @@ export class IpResolver {
for (const trusted of proxies) { for (const trusted of proxies) {
try { try {
if (trusted.includes('/')) { this.trustedProxies.push(ipaddr.parseCIDR(trusted));
this.trustedProxies.push(ip6addr.createCIDR(trusted));
} else {
this.trustedProxies.push(ip6addr.createAddrRange(trusted, trusted));
}
} catch (e: any) { } catch (e: any) {
this.logger.warn( this.logger.warn(
{ trusted, err: e.message }, { trusted, err: e.message },
...@@ -57,13 +51,17 @@ export class IpResolver { ...@@ -57,13 +51,17 @@ export class IpResolver {
} }
isTrustedProxy(ip: string): boolean { isTrustedProxy(ip: string): boolean {
return this.trustedProxies.some((trusted) => { if (ip.startsWith('::ffff:')) {
ip = this.toIpv4(ip);
}
try { try {
return trusted.contains(ip); const addr = ipaddr.parse(ip);
return this.trustedProxies.some(([range, mask]) => {
return addr.match(range, mask);
});
} catch { } catch {
return false; return false;
} }
});
} }
getRealIp(physicalIp: string, xffIp?: string): string { getRealIp(physicalIp: string, xffIp?: string): string {
......
import { Socket } from 'node:net'; import { Socket } from 'node:net';
import { Observable, fromEvent } from 'rxjs'; import { Observable, fromEvent, merge } from 'rxjs';
import { map, take } from 'rxjs/operators';
import { Context } from '../../app'; import { Context } from '../../app';
import { Client } from '../../client'; import { Client } from '../../client';
...@@ -11,7 +12,7 @@ export class TcpClient extends Client { ...@@ -11,7 +12,7 @@ export class TcpClient extends Client {
super(ctx); super(ctx);
} }
_send(data: Buffer): Promise<void> { protected _send(data: Buffer): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sock.write(data, (error) => { this.sock.write(data, (error) => {
if (error) { if (error) {
...@@ -23,13 +24,13 @@ export class TcpClient extends Client { ...@@ -23,13 +24,13 @@ export class TcpClient extends Client {
}); });
} }
_receive(): Observable<Buffer> { protected _receive(): Observable<Buffer> {
return fromEvent<Buffer>(this.sock, 'data'); return fromEvent<Buffer>(this.sock, 'data');
} }
disconnect(): Promise<void> { protected async _disconnect(): Promise<void> {
if (this.sock.destroyed) { if (this.sock.destroyed) {
return Promise.resolve(); return;
} }
return new Promise((resolve) => { return new Promise((resolve) => {
this.sock.once('close', () => resolve()); this.sock.once('close', () => resolve());
...@@ -37,8 +38,11 @@ export class TcpClient extends Client { ...@@ -37,8 +38,11 @@ export class TcpClient extends Client {
}); });
} }
onDisconnect(): Observable<void> { protected _onDisconnect(): Observable<void> {
return fromEvent<void>(this.sock, 'close'); return merge(
fromEvent<void>(this.sock, 'close'),
fromEvent<Error>(this.sock, 'error').pipe(map(() => undefined)),
).pipe(take(1));
} }
physicalIp(): string { physicalIp(): string {
......
import { IncomingMessage } from 'node:http'; import { IncomingMessage } from 'node:http';
import { Socket } from 'node:net'; import { Socket } from 'node:net';
import { Observable, filter, fromEvent, map } from 'rxjs'; import { Observable, filter, fromEvent, map, merge } from 'rxjs';
import { take } from 'rxjs/operators';
import WebSocket, { RawData } from 'ws'; import WebSocket, { RawData } from 'ws';
import { Context } from '../../app'; import { Context } from '../../app';
import { Client } from '../../client'; import { Client } from '../../client';
...@@ -14,7 +15,7 @@ export class WsClient extends Client { ...@@ -14,7 +15,7 @@ export class WsClient extends Client {
super(ctx); super(ctx);
} }
_send(data: Buffer): Promise<void> { protected _send(data: Buffer): Promise<void> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.sock.send(data, (error) => { this.sock.send(data, (error) => {
if (error) { if (error) {
...@@ -26,7 +27,7 @@ export class WsClient extends Client { ...@@ -26,7 +27,7 @@ export class WsClient extends Client {
}); });
} }
_receive(): Observable<Buffer> { protected _receive(): Observable<Buffer> {
return fromEvent<[RawData, boolean]>(this.sock, 'message').pipe( return fromEvent<[RawData, boolean]>(this.sock, 'message').pipe(
filter(([, isBinary]) => isBinary), filter(([, isBinary]) => isBinary),
map(([data]) => { map(([data]) => {
...@@ -41,9 +42,9 @@ export class WsClient extends Client { ...@@ -41,9 +42,9 @@ export class WsClient extends Client {
); );
} }
disconnect(): Promise<void> { protected async _disconnect(): Promise<void> {
if (this.sock.readyState === WebSocket.CLOSED) { if (this.sock.readyState === WebSocket.CLOSED) {
return Promise.resolve(); return;
} }
return new Promise((resolve) => { return new Promise((resolve) => {
this.sock.once('close', () => resolve()); this.sock.once('close', () => resolve());
...@@ -51,8 +52,11 @@ export class WsClient extends Client { ...@@ -51,8 +52,11 @@ export class WsClient extends Client {
}); });
} }
onDisconnect(): Observable<void> { protected _onDisconnect(): Observable<void> {
return fromEvent<void>(this.sock, 'close'); return merge(
fromEvent<void>(this.sock, 'close'),
fromEvent<Error>(this.sock, 'error').pipe(map(() => undefined)),
).pipe(take(1));
} }
physicalIp(): string { physicalIp(): string {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment