diff --git a/package-lock.json b/package-lock.json index 5a9b775..2ce85ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,23 +9,26 @@ "version": "0.1.1", "license": "MIT", "dependencies": { - "@hazae41/binary": "^1.2.10", - "@hazae41/bytes": "^1.0.4", - "@hazae41/cascade": "^1.0.0", + "@hazae41/binary": "^1.2.26", + "@hazae41/bytes": "^1.1.7", + "@hazae41/cascade": "^1.1.0", + "@hazae41/cursor": "^1.1.11", "@hazae41/future": "^1.0.3", - "@hazae41/plume": "^1.0.0" + "@hazae41/option": "^1.0.6", + "@hazae41/plume": "^2.0.1", + "@hazae41/result": "^1.0.20" }, "devDependencies": { "@hazae41/deimos": "^1.0.6", "@hazae41/phobos": "^1.0.10", "@rollup/plugin-inject": "^5.0.3", - "@rollup/plugin-typescript": "^11.0.0", - "@types/node": "^18.15.7", - "rimraf": "^4.4.1", - "rollup": "^3.20.2", + "@rollup/plugin-typescript": "^11.1.0", + "@types/node": "^20.1.2", + "rimraf": "^5.0.0", + "rollup": "^3.21.6", "rollup-plugin-dts": "^5.3.0", - "rollup-plugin-node-externals": "^5.1.2", - "typescript": "^5.0.2" + "rollup-plugin-node-externals": "^6.0.0", + "typescript": "^5.0.4" } }, "../../telsa": { @@ -93,22 +96,39 @@ } }, "node_modules/@hazae41/binary": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@hazae41/binary/-/binary-1.2.10.tgz", - "integrity": "sha512-2eb4TseoGdF6UwCfmIg4eDV3VoBoJThMUDQ/8x/yQE593FTuhwqmCEUASeFBm1crtZeowgAUJS2RYaY3Sd21xQ==", + "version": "1.2.26", + "resolved": "https://registry.npmjs.org/@hazae41/binary/-/binary-1.2.26.tgz", + "integrity": "sha512-z1ncvMWd9c6Bm6xTBL5Z4eYxWketBtFecXk6+ZAbG61dOf0+0iGzyi7un6j7/MjCPrfxlao57UYDy5WtDIEglA==", "dependencies": { - "@hazae41/bytes": "^1.0.3" + "@hazae41/bytes": "^1.1.7", + "@hazae41/cursor": "^1.1.9", + "@hazae41/result": "^1.0.19" } }, "node_modules/@hazae41/bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@hazae41/bytes/-/bytes-1.0.4.tgz", - "integrity": "sha512-VozzJM/OZM57+KyQeDkwZx4hLe3kYq1yZO2NzghOErJcrwOhv5hVydvJnjXcovsoxslC7eR2Ia6GxHKALDrS9Q==" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@hazae41/bytes/-/bytes-1.1.7.tgz", + "integrity": "sha512-+IvKaxkfb4PfEIPLbsvT5xr+hiohdLYQIJ0ynSbv6cEbCnSkPgrSF8GlD8QHS8DzKj9GclfLV1GZSg7UYnu6ig==", + "dependencies": { + "@hazae41/result": "^1.0.19" + } }, "node_modules/@hazae41/cascade": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hazae41/cascade/-/cascade-1.0.0.tgz", - "integrity": "sha512-5C5p3kNbE2plHl/kkt5WuA3P4D/LG0wWWuJmTSb+cYXO6OovpLO3IX37O0GVZK2krd1OoPKQHhKTEbpMuW15tw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@hazae41/cascade/-/cascade-1.1.0.tgz", + "integrity": "sha512-ILCaBSNm8BVMBxmFPCI8Xe9Ahv+L0Z8aokMDtaeBYH3jDVj9b09MoFC+IaJrMzith4n1sC6o0p8vB1t9GK0nfw==", + "dependencies": { + "@hazae41/result": "^1.0.20" + } + }, + "node_modules/@hazae41/cursor": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@hazae41/cursor/-/cursor-1.1.11.tgz", + "integrity": "sha512-vb3N/q/S2u7JsMuO5mVlCVicWjTFJ2mK/LGhxEHd+6PZOakA5C+V6h+yzD5V4wI5yH/DMMJQBq8H9gjagXno3A==", + "dependencies": { + "@hazae41/bytes": "^1.1.7", + "@hazae41/result": "^1.0.19" + } }, "node_modules/@hazae41/deimos": { "version": "1.0.6", @@ -121,6 +141,14 @@ "resolved": "https://registry.npmjs.org/@hazae41/future/-/future-1.0.3.tgz", "integrity": "sha512-tc6xV7buZI1P8d66OTH7noD5L3fKCZpTOfyvlVMIcjqvkY/gRcBinFzegc6DmXx08ZlwfAlnebU+ZX5NO+9+iw==" }, + "node_modules/@hazae41/option": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@hazae41/option/-/option-1.0.6.tgz", + "integrity": "sha512-+HxTYczL2cFtDN9heOspN+V/MGYleIM7hL6qIH5rWryZcIuLWutTT/jIpNgtx0PMr4sHBTiBe+GhobbTcVRLzg==", + "dependencies": { + "@hazae41/result": "^1.0.15" + } + }, "node_modules/@hazae41/phobos": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@hazae41/phobos/-/phobos-1.0.10.tgz", @@ -128,11 +156,38 @@ "dev": true }, "node_modules/@hazae41/plume": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hazae41/plume/-/plume-1.0.0.tgz", - "integrity": "sha512-ZYfR/81lQydn/HAk/DZ9NQfqM3M5oxejSwRdXkD1KLptBDDuKF3qTjqxetd3/IKY9ku0Gizw0WUo+s2r84j5cA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hazae41/plume/-/plume-2.0.1.tgz", + "integrity": "sha512-vzzbrg7fJg69vq+h0fjsEsrlatNFEAaO/m76XDbD1n4y5A6cls+eJzXCXjSarm2CNXkEEtA9alZ3Y755bL9C7A==", + "dependencies": { + "@hazae41/future": "^1.0.3", + "@hazae41/option": "^1.0.6", + "@hazae41/result": "^1.0.18" + } + }, + "node_modules/@hazae41/result": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@hazae41/result/-/result-1.0.20.tgz", + "integrity": "sha512-YLkex8mwLMyFs1eWxjK09/RWKuOBGqGejppsSSgLCJ+gvWinv7tsX9Ip2VXrv6E0bEFr2wsLixZJEXcU3OmBSw==", + "dependencies": { + "@hazae41/option": "^1.0.6" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "dependencies": { - "@hazae41/future": "^1.0.3" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -141,6 +196,16 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-inject": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", @@ -164,9 +229,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.0.0.tgz", - "integrity": "sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.0.tgz", + "integrity": "sha512-86flrfE+bSHB69znnTV6kVjkncs2LBMhcTCyxWgRxLyfXfQrxg4UwlAqENnjrrxnSNS/XKCDJCl8EkdFJVHOxw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -218,11 +283,23 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.15.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz", - "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", "dev": true }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -283,6 +360,32 @@ "dev": true, "optional": true }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -299,11 +402,21 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/fsevents": { "version": "2.3.2", @@ -326,15 +439,19 @@ "dev": true }, "node_modules/glob": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz", - "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", + "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -377,6 +494,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -385,12 +535,12 @@ "optional": true }, "node_modules/lru-cache": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", - "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" } }, "node_modules/magic-string": { @@ -406,24 +556,33 @@ } }, "node_modules/minimatch": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", - "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minipass": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", - "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" @@ -436,16 +595,16 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", - "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.8.0.tgz", + "integrity": "sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==", "dev": true, "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" + "lru-cache": "^9.1.1", + "minipass": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -481,12 +640,12 @@ } }, "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", + "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", "dev": true, "dependencies": { - "glob": "^9.2.0" + "glob": "^10.0.0" }, "bin": { "rimraf": "dist/cjs/src/bin.js" @@ -499,9 +658,9 @@ } }, "node_modules/rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "version": "3.21.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", + "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -549,15 +708,144 @@ } }, "node_modules/rollup-plugin-node-externals": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-5.1.2.tgz", - "integrity": "sha512-M32v8yPeVT0dYOYHfd6SNyl0X1xskB15jYFlwUPzIIVpLQ200KVlilbFsoNMUho4SnQuT7Di3s/aLm79bnP48w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-6.0.0.tgz", + "integrity": "sha512-T3JivXptrPQfz3hWOCLK6cFsHFMKRCipPPHXhqmY2CUuiHcT5EKfuS1uVm8WwBF7L2XYtkantmLyunuLbrY71A==", "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "peerDependencies": { - "rollup": "^2.60.0 || ^3.0.0" + "rollup": "^3.0.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/supports-color": { @@ -594,9 +882,9 @@ "peer": true }, "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -605,6 +893,142 @@ "engines": { "node": ">=12.20" } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } } }, "dependencies": { @@ -638,22 +1062,39 @@ } }, "@hazae41/binary": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@hazae41/binary/-/binary-1.2.10.tgz", - "integrity": "sha512-2eb4TseoGdF6UwCfmIg4eDV3VoBoJThMUDQ/8x/yQE593FTuhwqmCEUASeFBm1crtZeowgAUJS2RYaY3Sd21xQ==", + "version": "1.2.26", + "resolved": "https://registry.npmjs.org/@hazae41/binary/-/binary-1.2.26.tgz", + "integrity": "sha512-z1ncvMWd9c6Bm6xTBL5Z4eYxWketBtFecXk6+ZAbG61dOf0+0iGzyi7un6j7/MjCPrfxlao57UYDy5WtDIEglA==", "requires": { - "@hazae41/bytes": "^1.0.3" + "@hazae41/bytes": "^1.1.7", + "@hazae41/cursor": "^1.1.9", + "@hazae41/result": "^1.0.19" } }, "@hazae41/bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@hazae41/bytes/-/bytes-1.0.4.tgz", - "integrity": "sha512-VozzJM/OZM57+KyQeDkwZx4hLe3kYq1yZO2NzghOErJcrwOhv5hVydvJnjXcovsoxslC7eR2Ia6GxHKALDrS9Q==" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@hazae41/bytes/-/bytes-1.1.7.tgz", + "integrity": "sha512-+IvKaxkfb4PfEIPLbsvT5xr+hiohdLYQIJ0ynSbv6cEbCnSkPgrSF8GlD8QHS8DzKj9GclfLV1GZSg7UYnu6ig==", + "requires": { + "@hazae41/result": "^1.0.19" + } }, "@hazae41/cascade": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hazae41/cascade/-/cascade-1.0.0.tgz", - "integrity": "sha512-5C5p3kNbE2plHl/kkt5WuA3P4D/LG0wWWuJmTSb+cYXO6OovpLO3IX37O0GVZK2krd1OoPKQHhKTEbpMuW15tw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@hazae41/cascade/-/cascade-1.1.0.tgz", + "integrity": "sha512-ILCaBSNm8BVMBxmFPCI8Xe9Ahv+L0Z8aokMDtaeBYH3jDVj9b09MoFC+IaJrMzith4n1sC6o0p8vB1t9GK0nfw==", + "requires": { + "@hazae41/result": "^1.0.20" + } + }, + "@hazae41/cursor": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@hazae41/cursor/-/cursor-1.1.11.tgz", + "integrity": "sha512-vb3N/q/S2u7JsMuO5mVlCVicWjTFJ2mK/LGhxEHd+6PZOakA5C+V6h+yzD5V4wI5yH/DMMJQBq8H9gjagXno3A==", + "requires": { + "@hazae41/bytes": "^1.1.7", + "@hazae41/result": "^1.0.19" + } }, "@hazae41/deimos": { "version": "1.0.6", @@ -666,6 +1107,14 @@ "resolved": "https://registry.npmjs.org/@hazae41/future/-/future-1.0.3.tgz", "integrity": "sha512-tc6xV7buZI1P8d66OTH7noD5L3fKCZpTOfyvlVMIcjqvkY/gRcBinFzegc6DmXx08ZlwfAlnebU+ZX5NO+9+iw==" }, + "@hazae41/option": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@hazae41/option/-/option-1.0.6.tgz", + "integrity": "sha512-+HxTYczL2cFtDN9heOspN+V/MGYleIM7hL6qIH5rWryZcIuLWutTT/jIpNgtx0PMr4sHBTiBe+GhobbTcVRLzg==", + "requires": { + "@hazae41/result": "^1.0.15" + } + }, "@hazae41/phobos": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@hazae41/phobos/-/phobos-1.0.10.tgz", @@ -673,11 +1122,35 @@ "dev": true }, "@hazae41/plume": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hazae41/plume/-/plume-1.0.0.tgz", - "integrity": "sha512-ZYfR/81lQydn/HAk/DZ9NQfqM3M5oxejSwRdXkD1KLptBDDuKF3qTjqxetd3/IKY9ku0Gizw0WUo+s2r84j5cA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hazae41/plume/-/plume-2.0.1.tgz", + "integrity": "sha512-vzzbrg7fJg69vq+h0fjsEsrlatNFEAaO/m76XDbD1n4y5A6cls+eJzXCXjSarm2CNXkEEtA9alZ3Y755bL9C7A==", + "requires": { + "@hazae41/future": "^1.0.3", + "@hazae41/option": "^1.0.6", + "@hazae41/result": "^1.0.18" + } + }, + "@hazae41/result": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/@hazae41/result/-/result-1.0.20.tgz", + "integrity": "sha512-YLkex8mwLMyFs1eWxjK09/RWKuOBGqGejppsSSgLCJ+gvWinv7tsX9Ip2VXrv6E0bEFr2wsLixZJEXcU3OmBSw==", "requires": { - "@hazae41/future": "^1.0.3" + "@hazae41/option": "^1.0.6" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "@jridgewell/sourcemap-codec": { @@ -686,6 +1159,13 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@rollup/plugin-inject": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", @@ -698,9 +1178,9 @@ } }, "@rollup/plugin-typescript": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.0.0.tgz", - "integrity": "sha512-goPyCWBiimk1iJgSTgsehFD5OOFHiAknrRJjqFCudcW8JtWiBlK284Xnn4flqMqg6YAjVG/EE+3aVzrL5qNSzQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.0.tgz", + "integrity": "sha512-86flrfE+bSHB69znnTV6kVjkncs2LBMhcTCyxWgRxLyfXfQrxg4UwlAqENnjrrxnSNS/XKCDJCl8EkdFJVHOxw==", "dev": true, "requires": { "@rollup/pluginutils": "^5.0.1", @@ -725,9 +1205,15 @@ "dev": true }, "@types/node": { - "version": "18.15.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz", - "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==", + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.2.tgz", + "integrity": "sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g==", + "dev": true + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "ansi-styles": { @@ -784,6 +1270,29 @@ "dev": true, "optional": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -797,11 +1306,15 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } }, "fsevents": { "version": "2.3.2", @@ -817,15 +1330,16 @@ "dev": true }, "glob": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz", - "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz", + "integrity": "sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" } }, "has": { @@ -853,6 +1367,28 @@ "has": "^1.0.3" } }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jackspeak": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz", + "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -861,9 +1397,9 @@ "optional": true }, "lru-cache": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", - "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true }, "magic-string": { @@ -876,18 +1412,24 @@ } }, "minimatch": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", - "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, "minipass": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.4.tgz", - "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -897,13 +1439,13 @@ "dev": true }, "path-scurry": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", - "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.8.0.tgz", + "integrity": "sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g==", "dev": true, "requires": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" + "lru-cache": "^9.1.1", + "minipass": "^5.0.0" } }, "picomatch": { @@ -924,18 +1466,18 @@ } }, "rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", + "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", "dev": true, "requires": { - "glob": "^9.2.0" + "glob": "^10.0.0" } }, "rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "version": "3.21.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.6.tgz", + "integrity": "sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -963,12 +1505,104 @@ } }, "rollup-plugin-node-externals": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-5.1.2.tgz", - "integrity": "sha512-M32v8yPeVT0dYOYHfd6SNyl0X1xskB15jYFlwUPzIIVpLQ200KVlilbFsoNMUho4SnQuT7Di3s/aLm79bnP48w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-6.0.0.tgz", + "integrity": "sha512-T3JivXptrPQfz3hWOCLK6cFsHFMKRCipPPHXhqmY2CUuiHcT5EKfuS1uVm8WwBF7L2XYtkantmLyunuLbrY71A==", "dev": true, "requires": {} }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -994,10 +1628,107 @@ "peer": true }, "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } } } } diff --git a/package.json b/package.json index 56cca72..9f0a73a 100644 --- a/package.json +++ b/package.json @@ -23,23 +23,26 @@ "prepare": "npm run build" }, "dependencies": { - "@hazae41/binary": "^1.2.10", - "@hazae41/bytes": "^1.0.4", - "@hazae41/cascade": "^1.0.0", + "@hazae41/binary": "^1.2.26", + "@hazae41/bytes": "^1.1.7", + "@hazae41/cascade": "^1.1.0", + "@hazae41/cursor": "^1.1.11", "@hazae41/future": "^1.0.3", - "@hazae41/plume": "^1.0.0" + "@hazae41/option": "^1.0.6", + "@hazae41/plume": "^2.0.1", + "@hazae41/result": "^1.0.20" }, "devDependencies": { "@hazae41/deimos": "^1.0.6", "@hazae41/phobos": "^1.0.10", "@rollup/plugin-inject": "^5.0.3", - "@rollup/plugin-typescript": "^11.0.0", - "@types/node": "^18.15.7", - "rimraf": "^4.4.1", - "rollup": "^3.20.2", + "@rollup/plugin-typescript": "^11.1.0", + "@types/node": "^20.1.2", + "rimraf": "^5.0.0", + "rollup": "^3.21.6", "rollup-plugin-dts": "^5.3.0", - "rollup-plugin-node-externals": "^5.1.2", - "typescript": "^5.0.2" + "rollup-plugin-node-externals": "^6.0.0", + "typescript": "^5.0.4" }, "exports": { ".": { diff --git a/src/libs/transports/websocket.ts b/src/libs/transports/websocket.ts index c7ee416..0b6dc49 100644 --- a/src/libs/transports/websocket.ts +++ b/src/libs/transports/websocket.ts @@ -1,4 +1,6 @@ import { Opaque, Writable } from "@hazae41/binary" +import { ResultableUnderlyingDefaultSource, ResultableUnderlyingSink, SuperReadableStream, SuperWritableStream } from "@hazae41/cascade" +import { Ok, Result } from "@hazae41/result" export async function createWebSocketStream(url: string) { const websocket = new WebSocket(url) @@ -31,6 +33,9 @@ export type WebSocketStreamParams = & WebSocketSinkParams export class WebSocketStream { + readonly reader: SuperReadableStream + readonly writer: SuperWritableStream + readonly readable: ReadableStream readonly writable: WritableStream @@ -47,8 +52,11 @@ export class WebSocketStream { if (websocket.binaryType !== "arraybuffer") throw new Error(`WebSocket binaryType is not arraybuffer`) - this.readable = new ReadableStream(new WebSocketSource(websocket, params)) - this.writable = new WritableStream(new WebSocketSink(websocket, params)) + this.reader = new SuperReadableStream(new WebSocketSource(websocket, params)) + this.writer = new SuperWritableStream(new WebSocketSink(websocket, params)) + + this.readable = this.reader.start() + this.writable = this.writer.start() } } @@ -60,7 +68,7 @@ export interface WebSocketSourceParams { shouldCloseOnCancel?: boolean } -export class WebSocketSource implements UnderlyingDefaultSource { +export class WebSocketSource implements ResultableUnderlyingDefaultSource { constructor( readonly websocket: WebSocket, @@ -95,13 +103,18 @@ export class WebSocketSource implements UnderlyingDefaultSource { this.websocket.addEventListener("message", onMessage, { passive: true }) this.websocket.addEventListener("error", onError, { passive: true }) this.websocket.addEventListener("close", onClose, { passive: true }) + + return Ok.void() } async cancel() { - if (!this.params.shouldCloseOnCancel) return + if (!this.params.shouldCloseOnCancel) + return Ok.void() this.websocket.close() + return Ok.void() } + } export interface WebSocketSinkParams { @@ -119,7 +132,7 @@ export interface WebSocketSinkParams { shouldCloseOnAbort?: boolean } -export class WebSocketSink implements UnderlyingSink { +export class WebSocketSink implements ResultableUnderlyingSink { constructor( readonly websocket: WebSocket, @@ -146,23 +159,35 @@ export class WebSocketSink implements UnderlyingSink { this.websocket.addEventListener("error", onError, { passive: true }) this.websocket.addEventListener("close", onClose, { passive: true }) + + return Ok.void() } - async write(chunk: Writable) { - const bytes = Writable.toBytes(chunk) + async write(chunk: Writable): Promise> { + const bytes = Writable.tryWriteToBytes(chunk) + + if (bytes.isErr()) + return bytes + // console.debug("ws ->", bytes) - this.websocket.send(bytes) + this.websocket.send(bytes.inner) + + return Ok.void() } async abort() { - if (!this.params.shouldCloseOnAbort) return + if (!this.params.shouldCloseOnAbort) + return Ok.void() await tryClose(this.websocket) + return Ok.void() } async close() { - if (!this.params.shouldCloseOnClose) return + if (!this.params.shouldCloseOnClose) + return Ok.void() await tryClose(this.websocket) + return Ok.void() } } \ No newline at end of file diff --git a/src/mods/kcp/reader.ts b/src/mods/kcp/reader.ts index ec1c2e2..4f72bff 100644 --- a/src/mods/kcp/reader.ts +++ b/src/mods/kcp/reader.ts @@ -1,16 +1,18 @@ -import { Cursor, Empty, Opaque } from "@hazae41/binary"; +import { Empty, Opaque, Readable } from "@hazae41/binary"; import { SuperTransformStream } from "@hazae41/cascade"; -import { AsyncEventTarget, CloseAndErrorEvents } from "@hazae41/plume"; +import { Cursor } from "@hazae41/cursor"; +import { EventError, StreamEvents, SuperEventTarget } from "@hazae41/plume"; +import { Ok, Result } from "@hazae41/result"; import { KcpSegment } from "./segment.js"; import { SecretKcpDuplex } from "./stream.js"; -export type SecretKcpReaderEvents = CloseAndErrorEvents & { - ack: MessageEvent> +export type SecretKcpReaderEvents = StreamEvents & { + ack: KcpSegment } export class SecretKcpReader { - readonly events = new AsyncEventTarget() + readonly events = new SuperEventTarget() readonly stream: SuperTransformStream @@ -24,24 +26,31 @@ export class SecretKcpReader { }) } - async #onRead(chunk: Opaque) { + async #onRead(chunk: Opaque): Promise> { const cursor = new Cursor(chunk.bytes) while (cursor.remaining) { - const segment = KcpSegment.tryRead(cursor) + const segment = Readable.tryReadOrRollback(KcpSegment, cursor) - if (!segment) { + if (segment.isErr()) { console.warn(`Not a KCP segment`) break } - await this.#onSegment(segment) + const result = await this.#onSegment(segment.inner) + + if (result.isErr()) + return result + + continue } + + return Ok.void() } - async #onSegment(segment: KcpSegment) { + async #onSegment(segment: KcpSegment): Promise> { if (segment.conversation !== this.parent.conversation) - return + return Ok.void() if (segment.command === KcpSegment.commands.push) return await this.#onPushSegment(segment) @@ -49,27 +58,32 @@ export class SecretKcpReader { return await this.#onAckSegment(segment) if (segment.command === KcpSegment.commands.wask) return await this.#onWaskSegment(segment) + + console.warn(`Unknown KCP command`) + return Ok.void() } - async #onPushSegment(segment: KcpSegment) { + async #onPushSegment(segment: KcpSegment): Promise> { const conversation = this.parent.conversation const command = KcpSegment.commands.ack const timestamp = segment.timestamp const serial = segment.serial const unackSerial = this.parent.recv_counter const fragment = new Empty() - const ack = KcpSegment.new({ conversation, command, timestamp, serial, unackSerial, fragment }) - this.parent.writer.stream.enqueue(ack.prepare()) + + const ack = KcpSegment.tryNew({ conversation, command, timestamp, serial, unackSerial, fragment }).inner + + this.parent.writer.stream.enqueue(ack) if (segment.serial < this.parent.recv_counter) { console.warn(`Received previous KCP segment`) - return + return Ok.void() } if (segment.serial > this.parent.recv_counter) { console.warn(`Received next KCP segment`) this.#buffer.set(segment.serial, segment) - return + return Ok.void() } this.stream.enqueue(segment.fragment) @@ -83,21 +97,26 @@ export class SecretKcpReader { this.#buffer.delete(this.parent.recv_counter) this.parent.recv_counter++ } + + return Ok.void() } - async #onAckSegment(segment: KcpSegment) { - const msgEvent = new MessageEvent("ack", { data: segment }) - await this.events.dispatchEvent(msgEvent, "ack") + async #onAckSegment(segment: KcpSegment): Promise> { + return await this.events.tryEmit("ack", segment).then(r => r.clear()) } - async #onWaskSegment(segment: KcpSegment) { + async #onWaskSegment(segment: KcpSegment): Promise> { const conversation = this.parent.conversation const command = KcpSegment.commands.wins const serial = 0 const unackSerial = this.parent.recv_counter const fragment = new Empty() - const wins = KcpSegment.new({ conversation, command, serial, unackSerial, fragment }) - this.parent.writer.stream.enqueue(wins.prepare()) + + const wins = KcpSegment.tryNew({ conversation, command, serial, unackSerial, fragment }).inner + + this.parent.writer.stream.enqueue(wins) + + return Ok.void() } } \ No newline at end of file diff --git a/src/mods/kcp/segment.test.ts b/src/mods/kcp/segment.test.ts index 856e68b..03e89c3 100644 --- a/src/mods/kcp/segment.test.ts +++ b/src/mods/kcp/segment.test.ts @@ -12,9 +12,19 @@ console.log(relative(directory, pathname.replace(".mjs", ".ts"))) globalThis.crypto = webcrypto as any test("kcp segment", async ({ test }) => { - const frame = new KcpSegment(12345, KcpSegment.commands.push, 0, 65535, Date.now() / 1000, 0, 0, Opaque.random(130)) - const bytes = Writable.toBytes(frame.prepare()) - const frame2 = Readable.fromBytes(KcpSegment, bytes) + const conversation = 12345 + const command = KcpSegment.commands.push + const count = 0 + const window = 65_535 + const timestamp = Date.now() / 1000 + const serial = 0 + const unackSerial = 0 + const fragment = Opaque.random(130) - assert(Bytes.equals(frame.fragment.bytes, frame2.fragment.bytes)) + const segment = KcpSegment.tryNew({ conversation, command, count, window, timestamp, serial, unackSerial, fragment }).unwrap() + + const bytes = Writable.tryWriteToBytes(segment).unwrap() + const frame2 = Readable.tryReadFromBytes(KcpSegment, bytes).unwrap() + + assert(Bytes.equals2(segment.fragment.bytes, frame2.fragment.bytes)) }) \ No newline at end of file diff --git a/src/mods/kcp/segment.ts b/src/mods/kcp/segment.ts index 6627afa..3e19907 100644 --- a/src/mods/kcp/segment.ts +++ b/src/mods/kcp/segment.ts @@ -1,6 +1,8 @@ -import { Cursor, Opaque, Readable, UnsafeOpaque, Writable } from "@hazae41/binary"; +import { Opaque, Writable } from "@hazae41/binary"; +import { Cursor, CursorReadError, CursorWriteUnknownError } from "@hazae41/cursor"; +import { Ok, Result } from "@hazae41/result"; -export class KcpSegment { +export class KcpSegment { readonly #class = KcpSegment static readonly commands = { @@ -10,7 +12,7 @@ export class KcpSegment { wins: 84 } as const - constructor( + private constructor( /** * conv */ @@ -42,10 +44,14 @@ export class KcpSegment { /** * data */ - readonly fragment: T + readonly fragment: Fragment, + /** + * data size + */ + readonly fragmentSize: number ) { } - static new(params: { + static tryNew(params: { conversation: number, command: number, count?: number, @@ -53,28 +59,20 @@ export class KcpSegment { timestamp?: number, serial: number, unackSerial: number, - fragment: T - }) { + fragment: Fragment + }): Result, Writable.SizeError> { const { conversation, command, count, window, timestamp, serial, unackSerial, fragment } = params - return new this(conversation, command, count, window, timestamp, serial, unackSerial, fragment) - } - #data?: { - size: number - } + const fragmentSize = fragment.trySize() - prepare() { - const size = this.fragment.size() - this.#data = { size } - return this - } + if (fragmentSize.isErr()) + return fragmentSize - size() { - if (!this.#data) - throw new Error(`Unprepared ${this.#class.name}`) - const { size } = this.#data + return new Ok(new KcpSegment(conversation, command, count, window, timestamp, serial, unackSerial, fragment, fragmentSize.inner)) + } - return 0 + trySize(): Result { + return new Ok(0 + 4 + 1 + 1 @@ -83,48 +81,42 @@ export class KcpSegment { + 4 + 4 + 4 - + size + + this.fragmentSize) } - write(cursor: Cursor) { - if (!this.#data) - throw new Error(`Unprepared ${this.#class.name}`) - const { size } = this.#data + tryWrite(cursor: Cursor): Result | CursorWriteUnknownError> { + return Result.unthrowSync(t => { + cursor.tryWriteUint32(this.conversation, true).throw(t) + cursor.tryWriteUint8(this.command).throw(t) + cursor.tryWriteUint8(this.count).throw(t) + cursor.tryWriteUint16(this.window, true).throw(t) + cursor.tryWriteUint32(this.timestamp, true).throw(t) + cursor.tryWriteUint32(this.serial, true).throw(t) + cursor.tryWriteUint32(this.unackSerial, true).throw(t) + cursor.tryWriteUint32(this.fragmentSize, true).throw(t) + + this.fragment.tryWrite(cursor).throw(t) - cursor.writeUint32(this.conversation, true) - cursor.writeUint8(this.command) - cursor.writeUint8(this.count) - cursor.writeUint16(this.window, true) - cursor.writeUint32(this.timestamp, true) - cursor.writeUint32(this.serial, true) - cursor.writeUint32(this.unackSerial, true) - cursor.writeUint32(size, true) - this.fragment.write(cursor) + return Ok.void() + }) } - static read(cursor: Cursor) { - const conversation = cursor.readUint32(true) - const command = cursor.readUint8() - const count = cursor.readUint8() - const window = cursor.readUint16(true) - const timestamp = cursor.readUint32(true) - const serial = cursor.readUint32(true) - const unackSerial = cursor.readUint32(true) - const length = cursor.readUint32(true) - const bytes = cursor.read(length) + static tryRead(cursor: Cursor): Result, CursorReadError> { + return Result.unthrowSync(t => { + const conversation = cursor.tryReadUint32(true).throw(t) + const command = cursor.tryReadUint8().throw(t) + const count = cursor.tryReadUint8().throw(t) + const window = cursor.tryReadUint16(true).throw(t) + const timestamp = cursor.tryReadUint32(true).throw(t) + const serial = cursor.tryReadUint32(true).throw(t) + const unackSerial = cursor.tryReadUint32(true).throw(t) + const length = cursor.tryReadUint32(true).throw(t) + const bytes = cursor.tryRead(length).throw(t) - const opaque = Readable.fromBytes(UnsafeOpaque, bytes) + const fragment = new Opaque(bytes) - return new this(conversation, command, count, window, timestamp, serial, unackSerial, opaque) + return KcpSegment.tryNew({ conversation, command, count, window, timestamp, serial, unackSerial, fragment }) + }) } - static tryRead(cursor: Cursor) { - const offset = cursor.offset - - try { - return this.read(cursor) - } catch (e: unknown) { - cursor.offset = offset - } - } } \ No newline at end of file diff --git a/src/mods/kcp/stream.ts b/src/mods/kcp/stream.ts index 5987b3f..4e5fc2c 100644 --- a/src/mods/kcp/stream.ts +++ b/src/mods/kcp/stream.ts @@ -1,4 +1,5 @@ -import { Cursor, Opaque, Writable } from "@hazae41/binary"; +import { Opaque, Writable } from "@hazae41/binary"; +import { Cursor } from "@hazae41/cursor"; import { SecretKcpReader } from "./reader.js"; import { SecretKcpWriter } from "./writer.js"; @@ -12,11 +13,11 @@ export class KcpDuplex { this.#secret = new SecretKcpDuplex(stream) } - get readable() { + get readable(): ReadableStream { return this.#secret.readable } - get writable() { + get writable(): WritableStream { return this.#secret.writable } @@ -38,7 +39,7 @@ export class SecretKcpDuplex { readonly readable: ReadableStream readonly writable: WritableStream - readonly conversation = Cursor.random(4).getUint32(true) + readonly conversation = Cursor.random(4).tryGetUint32(true).unwrap() constructor( readonly stream: ReadableWritablePair @@ -68,8 +69,7 @@ export class SecretKcpDuplex { this.reader.stream.closed = {} - const closeEvent = new CloseEvent("close", {}) - await this.reader.events.dispatchEvent(closeEvent, "close") + await this.reader.events.tryEmit("close", undefined).then(r => r.unwrap()) } async #onReadError(reason?: unknown) { @@ -78,9 +78,7 @@ export class SecretKcpDuplex { this.reader.stream.closed = { reason } this.writer.stream.error(reason) - const error = new Error(`Errored`, { cause: reason }) - const errorEvent = new ErrorEvent("error", { error }) - await this.reader.events.dispatchEvent(errorEvent, "error") + await this.reader.events.tryEmit("error", reason).then(r => r.unwrap()) } async #onWriteClose() { @@ -88,8 +86,7 @@ export class SecretKcpDuplex { this.writer.stream.closed = {} - const closeEvent = new CloseEvent("close", {}) - await this.writer.events.dispatchEvent(closeEvent, "close") + await this.writer.events.tryEmit("close", undefined).then(r => r.unwrap()) } async #onWriteError(reason?: unknown) { @@ -98,9 +95,7 @@ export class SecretKcpDuplex { this.writer.stream.closed = { reason } this.reader.stream.error(reason) - const error = new Error(`Errored`, { cause: reason }) - const errorEvent = new ErrorEvent("error", { error }) - await this.writer.events.dispatchEvent(errorEvent, "error") + await this.writer.events.tryEmit("error", reason).then(r => r.unwrap()) } } \ No newline at end of file diff --git a/src/mods/kcp/writer.ts b/src/mods/kcp/writer.ts index 4c53dc7..252ae9a 100644 --- a/src/mods/kcp/writer.ts +++ b/src/mods/kcp/writer.ts @@ -1,13 +1,14 @@ -import { Opaque, Writable } from "@hazae41/binary"; +import { Writable } from "@hazae41/binary"; import { SuperTransformStream } from "@hazae41/cascade"; -import { Future } from "@hazae41/future"; -import { AsyncEventTarget, CloseAndErrorEvents, Plume } from "@hazae41/plume"; +import { None, Some } from "@hazae41/option"; +import { AbortError, CloseError, ErrorError, Plume, StreamEvents, SuperEventTarget } from "@hazae41/plume"; +import { Ok, Result } from "@hazae41/result"; import { KcpSegment } from "./segment.js"; import { SecretKcpDuplex } from "./stream.js"; export class SecretKcpWriter { - readonly events = new AsyncEventTarget() + readonly events = new SuperEventTarget() readonly stream: SuperTransformStream @@ -21,16 +22,17 @@ export class SecretKcpWriter { }) } - async #onWrite(fragment: Writable) { - if (this.stream.closed) return + async #onWrite(fragment: Writable): Promise> { + if (this.stream.closed) return Ok.void() const conversation = this.parent.conversation const command = KcpSegment.commands.push const serial = this.parent.send_counter++ const unackSerial = this.parent.recv_counter - const segment = KcpSegment.new({ conversation, command, serial, unackSerial, fragment }) - const writable = segment.prepare() - this.stream.enqueue(writable) + + const segment = KcpSegment.tryNew({ conversation, command, serial, unackSerial, fragment }).unwrap() + + this.stream.enqueue(segment) const start = Date.now() @@ -42,19 +44,20 @@ export class SecretKcpWriter { const delay = Date.now() - start console.debug(`Retrying KCP after`, delay, `milliseconds`) - this.stream.enqueue(writable) + this.stream.enqueue(segment) }, 1000) - const future = new Future() + const signal = AbortSignal.timeout(60 * 1000) + + const result = await Plume.tryWaitStream(this.parent.reader.events, "ack", segment => { + if (segment.serial !== serial) + return new Ok(new None()) + return new Ok(new Some(Ok.void())) + }, signal) - const onEvent = (event: MessageEvent>) => { - if (event.data.serial !== serial) return - future.resolve() - } + clearInterval(retry) - Plume.waitMapCloseOrError(this.parent.reader.events, "ack", { future, onEvent }) - .catch(() => { }) - .finally(() => clearInterval(retry)) + return result } } \ No newline at end of file