diff --git a/README.md b/README.md index fbb540e..24b5761 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,5 @@ A browser-based game client written with TypeScript, React, and ThreeJS. This project is very much an early work-in-progress and is not able to be used to log into the game at this time. Please use the existing [Java Game Client](https://github.com/runejs/refactored-client-435) to log into the [RuneJS game server](https://github.com/runejs/server). -Running the webclient requires the filestore HTTP server to first be running. Checkout the [`kiko/http` branch of the filestore repository](https://github.com/runejs/filestore/tree/kiko/http) and run the command `npm run http` to load the game cache HTTP server. A valid RuneJS JS5 game cache must be placed within the `packed/` folder of the filestore project to use the HTTP server, like so: - -![JS5 packed directory example](https://i.imgur.com/53dLQDa.png) +Running the webclient requires the filestore HTTP server to first be running with a valid filestore index. +Checkout the [`kiko/file-system` branch of the filestore repository](https://github.com/runejs/filestore/tree/kiko/file-system) and run the command `npm run index -- --build 435` to index the 435 game cache, then run `npm run http:js5` to load the game cache HTTP server. diff --git a/config-overrides.js b/config-overrides.js index 12e0e81..3f188b6 100644 --- a/config-overrides.js +++ b/config-overrides.js @@ -1,7 +1,6 @@ -const webpack = require('webpack'); +const webpack = require('webpack'); module.exports = function override (config, env) { - console.log('override'); let loaders = config.resolve; loaders.fallback = { "fs": false, @@ -10,20 +9,20 @@ module.exports = function override (config, env) { "https": false, "zlib": require.resolve("browserify-zlib") , "path": require.resolve("path-browserify"), + "process": require.resolve("process/browser"), "stream": require.resolve("stream-browserify"), "util": require.resolve("util/"), "crypto": false, - "constants": false, - "process": false + "constants": false }; - - config.plugins = (config.plugins || []).concat([ - new webpack.ProvidePlugin({ - process: 'process/browser', - Buffer: ['buffer', 'Buffer'] - }) - ]) - + + config.plugins = (config.plugins || []).concat([ + new webpack.ProvidePlugin({ + Buffer: ['buffer', 'Buffer'], + process: 'process/browser', + }) + ]); + return config; -} +}; diff --git a/package-lock.json b/package-lock.json index 69a3c75..e334d0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,9 @@ "name": "react-client", "version": "0.1.0", "dependencies": { + "@ledgerhq/compressjs": "^1.3.2", "@react-three/fiber": "^8.0.27", - "@runejs/common": "file:../common", + "@runejs/common": "2.0.2-beta.2", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^13.5.0", @@ -28,6 +29,7 @@ "http-proxy-middleware": "^2.0.6", "path-browserify": "^1.0.1", "pngjs": "^6.0.0", + "process": "^0.11.10", "react": "^18.1.0", "react-app-rewired": "^2.2.1", "react-dom": "^18.1.0", @@ -39,31 +41,36 @@ "util": "^0.12.4", "web-vitals": "^2.1.4", "zlib": "^1.0.5" + }, + "devDependencies": { + "react-error-overlay": "^6.0.9" } }, "../common": { "name": "@runejs/common", - "version": "2.0.2-beta.2", + "version": "3.0.0-beta.3", + "extraneous": true, "license": "GPL-3.0", "dependencies": { + "buffer": "^6.0.3", "compressjs": "^1.0.3", - "js-yaml": "^3.14.1", - "pino": "^6.14.0", - "pino-pretty": "^4.8.0", - "sonic-boom": "^2.6.0", - "tslib": "^2.3.1" + "dotenv": "^16.0.0", + "path": "^0.12.7", + "pino": "^7.10.0", + "pino-pretty": "^7.6.1", + "zlib": "^1.0.5" }, "devDependencies": { - "@runejs/eslint-config": "^1.1.0", + "@runejs/eslint-config": "^2.0.0", "@types/node": "^16.11.26", - "@types/pino": "^6.3.12", "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/parser": "^5.14.0", "copyfiles": "^2.4.1", "eslint": "^8.11.0", "rimraf": "^3.0.2", "ts-node-dev": "^1.1.8", - "typescript": "^4.5.5" + "tslib": "^2.3.1", + "typescript": "^4.6.3" }, "peerDependencies": { "tslib": ">=2.3.0" @@ -2187,6 +2194,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", @@ -2910,6 +2922,19 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@ledgerhq/compressjs": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ledgerhq/compressjs/-/compressjs-1.3.2.tgz", + "integrity": "sha512-gonFwAifRkSYDO7rt3NIBlvjvY8Nw+NM6LT1SuOBppuvoKbYtBViNh3EBPbP86+3Y4ux7DLUsNiUlqOgubJsdA==", + "dependencies": { + "commander": "^2.20.0" + } + }, + "node_modules/@ledgerhq/compressjs/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -3119,8 +3144,21 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@runejs/common": { - "resolved": "../common", - "link": true + "version": "2.0.2-beta.2", + "resolved": "https://registry.npmjs.org/@runejs/common/-/common-2.0.2-beta.2.tgz", + "integrity": "sha512-Xd9/Ws3ByAdI1R08Ye9fWqlS8SImjQw05Bsw0w46zcGyDx8N6jmeClf9Y/s4Akh9VZQuoAMFg2ANKsRK0MucNw==", + "dependencies": { + "compressjs": "^1.0.3", + "js-yaml": "^3.14.1", + "pino": "^6.14.0", + "pino-pretty": "^4.8.0", + "sonic-boom": "^2.6.0", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "tslib": ">=2.3.0", + "typescript": ">=4.5.0" + } }, "node_modules/@rushstack/eslint-patch": { "version": "1.1.3", @@ -4474,6 +4512,14 @@ "ajv": "^6.9.1" } }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "engines": { + "node": ">=0.4.2" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -4543,6 +4589,36 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/args": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz", + "integrity": "sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==", + "dependencies": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/args/node_modules/camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/args/node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", @@ -4688,6 +4764,14 @@ "node": ">= 4.5.0" } }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.7", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", @@ -5638,6 +5722,29 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/compressjs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz", + "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==", + "dependencies": { + "amdefine": "~1.0.0", + "commander": "~2.8.1" + }, + "bin": { + "compressjs": "bin/compressjs" + } + }, + "node_modules/compressjs/node_modules/commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -6222,6 +6329,14 @@ "node": ">=10" } }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -6636,6 +6751,14 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", @@ -7656,6 +7779,19 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -7832,6 +7968,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -8302,6 +8443,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -11212,6 +11358,22 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/joycon": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", + "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -11765,6 +11927,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12288,6 +12458,123 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "dependencies": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-pretty": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.8.0.tgz", + "integrity": "sha512-mhQfHG4rw5ZFpWL44m0Utjo4GC2+HMfdNvxyA8lLw0sIqn6fCf7uQe6dPckUcW/obly+OQHD7B/MTso6LNizYw==", + "dependencies": { + "@hapi/bourne": "^2.0.0", + "args": "^5.0.1", + "chalk": "^4.0.0", + "dateformat": "^4.5.1", + "fast-safe-stringify": "^2.0.7", + "jmespath": "^0.15.0", + "joycon": "^2.2.5", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "rfdc": "^1.3.0", + "split2": "^3.1.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pino-pretty/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/pino-pretty/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/pino-pretty/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==" + }, + "node_modules/pino-pretty/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pino-pretty/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, + "node_modules/pino/node_modules/sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -13567,11 +13854,24 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "node_modules/promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -13632,6 +13932,15 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -13682,6 +13991,11 @@ } ] }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -13905,6 +14219,11 @@ "node": ">= 12.13.0" } }, + "node_modules/react-dev-utils/node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, "node_modules/react-dev-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13929,9 +14248,10 @@ } }, "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true }, "node_modules/react-is": { "version": "17.0.2", @@ -14369,6 +14689,11 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -14815,6 +15140,14 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -14916,6 +15249,14 @@ "wbuf": "^1.7.3" } }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -18270,6 +18611,11 @@ } } }, + "@hapi/bourne": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", + "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" + }, "@humanwhocodes/config-array": { "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", @@ -18805,6 +19151,21 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@ledgerhq/compressjs": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ledgerhq/compressjs/-/compressjs-1.3.2.tgz", + "integrity": "sha512-gonFwAifRkSYDO7rt3NIBlvjvY8Nw+NM6LT1SuOBppuvoKbYtBViNh3EBPbP86+3Y4ux7DLUsNiUlqOgubJsdA==", + "requires": { + "commander": "^2.20.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, "@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -18922,24 +19283,16 @@ } }, "@runejs/common": { - "version": "file:../common", + "version": "2.0.2-beta.2", + "resolved": "https://registry.npmjs.org/@runejs/common/-/common-2.0.2-beta.2.tgz", + "integrity": "sha512-Xd9/Ws3ByAdI1R08Ye9fWqlS8SImjQw05Bsw0w46zcGyDx8N6jmeClf9Y/s4Akh9VZQuoAMFg2ANKsRK0MucNw==", "requires": { - "@runejs/eslint-config": "^1.1.0", - "@types/node": "^16.11.26", - "@types/pino": "^6.3.12", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", "compressjs": "^1.0.3", - "copyfiles": "^2.4.1", - "eslint": "^8.11.0", "js-yaml": "^3.14.1", "pino": "^6.14.0", "pino-pretty": "^4.8.0", - "rimraf": "^3.0.2", "sonic-boom": "^2.6.0", - "ts-node-dev": "^1.1.8", - "tslib": "^2.3.1", - "typescript": "^4.5.5" + "tslib": "^2.3.1" } }, "@rushstack/eslint-patch": { @@ -19975,6 +20328,11 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "requires": {} }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==" + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -20023,6 +20381,29 @@ "sprintf-js": "~1.0.2" } }, + "args": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.3.tgz", + "integrity": "sha512-h6k/zfFgusnv3i5TU08KQkVKuCPBtL/PWQbWkHUxvJrZ2nAyeaUupneemcrgn1xmqxPQsPIzwkUhOpoqPDRZuA==", + "requires": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==" + } + } + }, "aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", @@ -20129,6 +20510,11 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, "autoprefixer": { "version": "10.4.7", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", @@ -20833,6 +21219,25 @@ } } }, + "compressjs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz", + "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==", + "requires": { + "amdefine": "~1.0.0", + "commander": "~2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "requires": { + "graceful-readlink": ">= 1.0.0" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -21233,6 +21638,11 @@ "whatwg-url": "^8.0.0" } }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, "debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -21535,6 +21945,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", @@ -22290,6 +22708,16 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -22427,6 +22855,11 @@ "rimraf": "^3.0.2" } }, + "flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, "flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", @@ -22746,6 +23179,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -24823,6 +25261,16 @@ } } }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==" + }, + "joycon": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", + "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -25235,6 +25683,11 @@ "minimist": "^1.2.6" } }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -25608,6 +26061,100 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + }, + "dependencies": { + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + } + } + }, + "pino-pretty": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.8.0.tgz", + "integrity": "sha512-mhQfHG4rw5ZFpWL44m0Utjo4GC2+HMfdNvxyA8lLw0sIqn6fCf7uQe6dPckUcW/obly+OQHD7B/MTso6LNizYw==", + "requires": { + "@hapi/bourne": "^2.0.0", + "args": "^5.0.1", + "chalk": "^4.0.0", + "dateformat": "^4.5.1", + "fast-safe-stringify": "^2.0.7", + "jmespath": "^0.15.0", + "joycon": "^2.2.5", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "rfdc": "^1.3.0", + "split2": "^3.1.1", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -26381,11 +26928,21 @@ } } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "promise": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", @@ -26441,6 +26998,15 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -26464,6 +27030,11 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -26628,6 +27199,11 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" }, + "react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -26648,9 +27224,10 @@ } }, "react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true }, "react-is": { "version": "17.0.2", @@ -26971,6 +27548,11 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -27304,6 +27886,14 @@ "websocket-driver": "^0.7.4" } }, + "sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -27384,6 +27974,14 @@ "wbuf": "^1.7.3" } }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", diff --git a/package.json b/package.json index d8c5e7a..f553bd8 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,9 @@ "version": "0.1.0", "private": true, "dependencies": { + "@ledgerhq/compressjs": "^1.3.2", "@react-three/fiber": "^8.0.27", - "@runejs/common": "file:../common", + "@runejs/common": "2.0.2-beta.2", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^13.5.0", @@ -23,6 +24,7 @@ "http-proxy-middleware": "^2.0.6", "path-browserify": "^1.0.1", "pngjs": "^6.0.0", + "process": "^0.11.10", "react": "^18.1.0", "react-app-rewired": "^2.2.1", "react-dom": "^18.1.0", @@ -68,5 +70,8 @@ "last 1 firefox version", "last 1 safari version" ] + }, + "devDependencies": { + "react-error-overlay": "^6.0.9" } } diff --git a/src/game/game-view/GameView.tsx b/src/game/game-view/GameView.tsx index ed93e28..7199df6 100644 --- a/src/game/game-view/GameView.tsx +++ b/src/game/game-view/GameView.tsx @@ -25,7 +25,7 @@ const GameView = () => { const phat = await store.getModel(2635); modelRenderer.createRsModelMesh(phat); // modelRenderer.removeRsModelMesh(); - + const firecape = await store.getModel(9638); const firecapeMesh = await modelRenderer.createRsModelMesh(firecape); firecapeMesh.position.add(new Vector3(0, 10, 0)); diff --git a/src/index.tsx b/src/index.tsx index 4c316be..b36b088 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -3,6 +3,7 @@ import ReactDOM from 'react-dom/client'; import './index.scss'; import App from './App'; import reportWebVitals from './reportWebVitals'; +window.Buffer = window.Buffer || require('buffer').Buffer; const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement diff --git a/src/store/compress/bzip2.ts b/src/store/compress/bzip2.ts new file mode 100644 index 0000000..07361be --- /dev/null +++ b/src/store/compress/bzip2.ts @@ -0,0 +1,22 @@ +import { ByteBuffer } from '@runejs/common'; +import * as compressjs from '@ledgerhq/compressjs'; +const bzip = compressjs.Bzip2; + + +const charCode = (letter: string) => letter.charCodeAt(0); + + +export class Bzip2 { + + static decompress(compressedFileData: ByteBuffer | Buffer): Buffer { + const buffer = Buffer.alloc(compressedFileData.length + 4); + compressedFileData.copy(buffer, 4); + buffer[0] = charCode('B'); + buffer[1] = charCode('Z'); + buffer[2] = charCode('h'); + buffer[3] = charCode('1'); + + return bzip.decompressFile(buffer); + } + +} diff --git a/src/store/compress/gzip.ts b/src/store/compress/gzip.ts new file mode 100644 index 0000000..f89cab4 --- /dev/null +++ b/src/store/compress/gzip.ts @@ -0,0 +1,11 @@ +import { gunzipSync } from 'browserify-zlib'; +import { ByteBuffer } from '@runejs/common'; + + +export class Gzip { + + static decompress(buffer: ByteBuffer | Buffer): Buffer { + return gunzipSync(buffer); + } + +} diff --git a/src/store/compress/index.ts b/src/store/compress/index.ts new file mode 100644 index 0000000..f626245 --- /dev/null +++ b/src/store/compress/index.ts @@ -0,0 +1,2 @@ +export * from './bzip2'; +export * from './gzip'; diff --git a/src/store/maps/map-renderer.ts b/src/store/maps/map-renderer.ts index 6ac0b30..cac8cbc 100644 --- a/src/store/maps/map-renderer.ts +++ b/src/store/maps/map-renderer.ts @@ -51,16 +51,16 @@ export class MapRenderer { geometry.setAttribute( "color", new BufferAttribute(new Float32Array(colors), 3) - ); + ); geometry.setAttribute( "uv", new BufferAttribute(new Float32Array(uvs), 2) ); geometry.computeVertexNormals(); - + const materials = await this.createMaterials(); - + const planeMesh = new Mesh(geometry, materials); planeMesh.name = "Map"; @@ -79,11 +79,11 @@ export class MapRenderer { /** * Creates an array of materials to use - * + * * 0 is the default material * 1-... are the game textures (textureId + 1) - * - * @returns + * + * @returns */ async createMaterials() { const defaultMaterial = new MeshPhongMaterial({ @@ -107,8 +107,7 @@ export class MapRenderer { } } -function degrees_to_radians(degrees) -{ - var pi = Math.PI; - return degrees * (pi/180); +function degrees_to_radians(degrees) { + const pi = Math.PI; + return degrees * (pi / 180); } diff --git a/src/store/store.ts b/src/store/store.ts index 9e8bd53..5fe5b17 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -2,14 +2,14 @@ import axios from 'axios'; import { Buffer } from 'buffer'; import { ArchiveConfig } from './archive-config'; import { SpriteState, SpriteTranscoder } from './sprites/sprite-transcoder'; -import { ByteBuffer } from '@runejs/common'; -import { gunzipSync } from 'browserify-zlib'; +import { ByteBuffer, logger } from '@runejs/common'; import { Font, fontNames } from './fonts/font'; import { createContext } from 'react'; import { Rs2Model } from './models/rs2-model'; import { Rs2ModelDecoder } from './models/rs2-model-decoder'; import { TextureFileDecoder } from './maps/texture-file-decoder'; import { DoubleSide, Material, MeshPhongMaterial, TextureLoader } from 'three'; +import { Bzip2, Gzip } from './compress'; export enum FileCompression { @@ -29,89 +29,137 @@ export const getCompressionMethod = (compression: FileCompression | number): Com }; -const charCode = (letter: string) => letter.charCodeAt(0); -export const bunzipSync = async (compressedFileData: ByteBuffer) => { - const buffer = Buffer.alloc(compressedFileData.length + 4); - compressedFileData.copy(buffer, 4); - buffer[0] = charCode('B'); - buffer[1] = charCode('Z'); - buffer[2] = charCode('h'); - buffer[3] = charCode('1'); +interface FileDetails { + key: number; + name: string; + nameHash: number; +} - // @TODO fix me! - // return new ByteBuffer(bz2.decompress(buffer)); - return null; -}; +interface GroupDetails extends FileDetails { + childCount: number; + children: FileDetails[]; +} -export class Store { - private readonly groups = new Map>(); - private readonly files = new Map>>(); - private _archiveConfig: { [key: string]: ArchiveConfig }; +const decompress = (buffer: Buffer): Buffer | null => { + const compressedData = new ByteBuffer(buffer); + + const compressionMethod = getCompressionMethod(compressedData.get('byte', 'unsigned')); + const compressedLength = compressedData.get('int', 'unsigned'); - decompress(compressedData: ByteBuffer | Buffer): ByteBuffer | null { - if (!compressedData?.length) { + let data: Buffer; + + if (compressionMethod === 'none') { + // Uncompressed file + data = Buffer.alloc(compressedLength); + compressedData.copy(data, 0, compressedData.readerIndex, compressedLength); + compressedData.readerIndex = (compressedData.readerIndex + compressedLength); + } else { + // BZIP or GZIP compressed file + const decompressedLength = compressedData.get('int', 'unsigned'); + if (decompressedLength < 0) { return null; + } else { + const fileData = new ByteBuffer(compressedLength); + + compressedData.copy(fileData, 0, compressedData.readerIndex); + + data = compressionMethod === 'bzip' ? + Bzip2.decompress(fileData) : + Gzip.decompress(fileData); } + } - compressedData = new ByteBuffer(compressedData); - compressedData.readerIndex = 0; + return data; +}; - console.log(compressedData); - const compression = getCompressionMethod(compressedData.get('byte', 'unsigned')); - const compressedLength = compressedData.get('int', 'unsigned'); - console.log(`compression = ${compression}, compressedLength = ${compressedLength}`); +const decodeGroup = (buffer: Buffer, groupDetails: GroupDetails): Map | null => { + if (groupDetails.childCount === 1) { + return null; + } - const readerIndex = compressedData.readerIndex; + const data = new ByteBuffer(buffer); - compressedData.readerIndex = readerIndex; - // @TODO xtea - let data: ByteBuffer; + data.readerIndex = (data.length - 1); // EOF - 1 byte - if (compression === 'none') { - // Uncompressed file - data = new ByteBuffer(compressedLength); - compressedData.copy(data, 0, compressedData.readerIndex, compressedLength); - compressedData.readerIndex = (compressedData.readerIndex + compressedLength); - } else { - // BZIP or GZIP compressed file - const decompressedLength = compressedData.get('int', 'unsigned'); - if (decompressedLength < 0) { - console.error(`Invalid decompressed file length: ${decompressedLength}`); - } else { - const decompressedData = new ByteBuffer(compression === 'bzip' ? - decompressedLength : (compressedData.length - compressedData.readerIndex + 2)); + const stripeCount = data.get('byte', 'unsigned'); - compressedData.copy(decompressedData, 0, compressedData.readerIndex); + data.readerIndex = (data.length - 1 - stripeCount * groupDetails.childCount * 4); // Stripe data footer - try { - data = compression === 'bzip' ? bunzipSync(decompressedData) : - gunzipSync(decompressedData); + if (data.readerIndex < 0) { + logger.error(`Invalid reader index of ${ data.readerIndex } for group ` + + `${ groupDetails.name || groupDetails.key }.`); + return null; + } - compressedData.readerIndex = compressedData.readerIndex + compressedLength; + const fileSizeMap = new Map(); + const fileStripeMap = new Map(); + const fileDataMap = new Map(); + const files = new Map(); - if (data.length !== decompressedLength) { - console.error(`Compression length mismatch.`); - data = null; - } - } catch (error) { - console.error(`Unable to decompress file: ${error?.message ?? error}`); - data = null; - } - } - } + // groupDetails.children.sort((a, b) => a.key - b.key); + for (const file of groupDetails.children) { + files.set(file.key, file); + } + + for (const [ flatFileKey, ] of files) { + fileSizeMap.set(flatFileKey, 0); + fileStripeMap.set(flatFileKey, new Array(stripeCount)); + } - // Read the file footer, if it has one - if (compressedData.readable >= 2) { - // @TODO - const version = compressedData.get('short', 'unsigned'); + for (let stripe = 0; stripe < stripeCount; stripe++) { + let currentLength = 0; + + for (const [ flatFileKey, ] of files) { + const delta = data.get('int'); + currentLength += delta; + + const fileStripes = fileStripeMap.get(flatFileKey); + const size = fileSizeMap.get(flatFileKey) + currentLength; + + fileStripes[stripe] = currentLength; + fileSizeMap.set(flatFileKey, size + currentLength); } + } - return data ?? null; + for (const [ flatFileKey, ] of files) { + fileDataMap.set(flatFileKey, new ByteBuffer(fileSizeMap.get(flatFileKey))); } + data.readerIndex = 0; + + for (let stripe = 0; stripe < stripeCount; stripe++) { + for (const [ fileIndex, ] of files) { + let stripeLength = fileStripeMap.get(fileIndex)[stripe]; + let sourceEnd: number = data.readerIndex + stripeLength; + + if (data.readerIndex + stripeLength >= data.length) { + sourceEnd = data.length; + stripeLength = (data.readerIndex + stripeLength) - data.length; + } + + const stripeData = data.getSlice(data.readerIndex, stripeLength); + const fileData = fileDataMap.get(fileIndex); + + fileData.putBytes(stripeData); + + data.readerIndex = sourceEnd; + } + } + + return fileDataMap; +}; + + +export class Store { + + private readonly groupDetails = new Map(); + private readonly groups = new Map>(); + private readonly files = new Map>>(); + private _archiveConfig: { [key: string]: ArchiveConfig }; + async get(archiveIndex: number, groupName: string): Promise; async get(archiveIndex: number, groupIndex: number): Promise; async get(archiveIndex: number, groupName: string, fileIndex: number): Promise; @@ -119,21 +167,33 @@ export class Store { async get(archiveIndex: number, groupName: string, fileIndex?: number): Promise; async get(archiveIndex: number, groupIndex: number, fileIndex?: number): Promise; async get(archiveIndex: number, group: number | string, fileIndex?: number): Promise { - if(fileIndex !== undefined) { - if(!this.files.has(archiveIndex)) { - this.files.set(archiveIndex, new Map>()); - } + if (!this.groupDetails.has(archiveIndex)) { + const archiveGroupDetails = (await axios.get(`/store/archives/${ archiveIndex }/groups`)).data; + this.groupDetails.set(archiveIndex, archiveGroupDetails); + } - if(!this.files.get(archiveIndex).has(group)) { - this.files.get(archiveIndex).set(group, new Map()); - } + const groupDetails = this.groupDetails.get(archiveIndex) + .find(g => { + if (typeof group === 'number' || /^\d+$/.test(group)) { + return g.key === Number(group); + } else { + return g.name === group; + } + }); - if(this.files.get(archiveIndex).get(group).has(fileIndex)) { - return this.files.get(archiveIndex).get(group).get(fileIndex); - } + if (!groupDetails) { + logger.error(`Group details not found for group ${group} in archive ${archiveIndex}`); + } + + if (!this.groups.has(archiveIndex)) { + this.groups.set(archiveIndex, new Map()); + } + + if (!this.groups.get(archiveIndex).has(group)) { + logger.info(`Requesting archive = ${ archiveIndex }, group = ${ group }`); const response = await axios.get( - `/store/archives/${ archiveIndex }/groups/${ group }/files/${ fileIndex }`, { + `/store/archives/${ archiveIndex }/groups/${ group }`, { responseType: 'arraybuffer', headers: { 'accept': 'arraybuffer' @@ -142,31 +202,30 @@ export class Store { ); const compressedData = Buffer.from(response.data); - const fileData = gunzipSync(compressedData); - this.files.get(archiveIndex).get(group).set(fileIndex, fileData); - return fileData; - } else { - if(!this.groups.has(archiveIndex)) { - this.groups.set(archiveIndex, new Map()); - } + const fileData = decompress(compressedData); + this.groups.get(archiveIndex).set(group, fileData); + } - if(this.groups.get(archiveIndex).has(group)) { - return this.groups.get(archiveIndex).get(group); + if (fileIndex !== undefined) { + if (!this.files.has(archiveIndex)) { + this.files.set(archiveIndex, new Map>()); } - const response = await axios.get( - `/store/archives/${ archiveIndex }/groups/${ group }`, { - responseType: 'arraybuffer', - headers: { - 'accept': 'arraybuffer' + if (!this.files.get(archiveIndex).has(group)) { + this.files.get(archiveIndex).set(group, new Map()); + + const fileDataMap = decodeGroup(this.groups.get(archiveIndex).get(group), groupDetails); + + if (fileDataMap?.size) { + for (const [ fileIndex, fileData ] of fileDataMap) { + this.files.get(archiveIndex).get(group).set(fileIndex, fileData?.toNodeBuffer() || null); } } - ); + } - const compressedData = Buffer.from(response.data); - const fileData = gunzipSync(compressedData); - this.groups.get(archiveIndex).set(group, fileData); - return fileData; + return this.files.get(archiveIndex).get(group).get(fileIndex); + } else { + return this.groups.get(archiveIndex).get(group); } } @@ -211,7 +270,7 @@ export class Store { } async loadFonts(): Promise> { - for(const fontName of fontNames) { + for (const fontName of fontNames) { await new Font(fontName).load(); } @@ -226,7 +285,7 @@ export class Store { async getArchiveConfig(): Promise<{ [key: string]: ArchiveConfig }> { const response = await axios.get<{ [key: string]: ArchiveConfig }>(`/store/config`); this._archiveConfig = response.data; - for(const [ , archiveConfig ] of Object.entries(this._archiveConfig)) { + for (const [ , archiveConfig ] of Object.entries(this._archiveConfig)) { this.groups.set(archiveConfig.index, new Map()); } return this._archiveConfig;