Merge pull request #227 from MotorTruck1221/bare

Add the option to use a Bare Server
This commit is contained in:
rift 2024-03-11 13:36:07 -05:00 committed by GitHub
commit 6a655c48d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 714 additions and 98 deletions

View file

@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="/epoxy/index.js" defer></script> <script src="/epoxy/index.js" defer></script>
<script src="/libcurl/index.cjs" defer></script> <script src="/libcurl/index.cjs" defer></script>
<script src="/transports/bareTransport.js" defer></script>
<script src="/uv/uv.bundle.js" defer></script> <script src="/uv/uv.bundle.js" defer></script>
<script src="/uv/uv.config.js" defer></script> <script src="/uv/uv.config.js" defer></script>
<script src="/dynamic/dynamic.config.js" defer></script> <script src="/dynamic/dynamic.config.js" defer></script>

View file

@ -14,9 +14,9 @@
"@fastify/compress": "^6.5.0", "@fastify/compress": "^6.5.0",
"@fastify/cookie": "^9.3.1", "@fastify/cookie": "^9.3.1",
"@fastify/static": "^6.12.0", "@fastify/static": "^6.12.0",
"@mercuryworkshop/bare-mux": "^1.0.4", "@mercuryworkshop/bare-mux": "^1.0.5",
"@mercuryworkshop/epoxy-transport": "^1.0.2", "@mercuryworkshop/epoxy-transport": "^1.1.0",
"@mercuryworkshop/libcurl-transport": "^1.2.0", "@mercuryworkshop/libcurl-transport": "^1.2.1",
"@nebula-services/dynamic": "0.7.2-patch.2", "@nebula-services/dynamic": "0.7.2-patch.2",
"@titaniumnetwork-dev/ultraviolet": "^3.0.0", "@titaniumnetwork-dev/ultraviolet": "^3.0.0",
"@tomphttp/bare-server-node": "2.0.3", "@tomphttp/bare-server-node": "2.0.3",
@ -46,7 +46,7 @@
"react-icons": "^4.12.0", "react-icons": "^4.12.0",
"react-toastify": "^9.1.3", "react-toastify": "^9.1.3",
"tsx": "^4.7.1", "tsx": "^4.7.1",
"wisp-server-node": "^1.0.1", "wisp-server-node": "^1.0.2",
"ws": "^8.16.0" "ws": "^8.16.0"
}, },
"devDependencies": { "devDependencies": {

89
pnpm-lock.yaml generated
View file

@ -15,14 +15,14 @@ dependencies:
specifier: ^6.12.0 specifier: ^6.12.0
version: 6.12.0 version: 6.12.0
'@mercuryworkshop/bare-mux': '@mercuryworkshop/bare-mux':
specifier: ^1.0.4 specifier: ^1.0.5
version: 1.0.4 version: 1.0.5
'@mercuryworkshop/epoxy-transport': '@mercuryworkshop/epoxy-transport':
specifier: ^1.0.2 specifier: ^1.1.0
version: 1.0.2(typescript@5.4.2) version: 1.1.0(typescript@5.4.2)
'@mercuryworkshop/libcurl-transport': '@mercuryworkshop/libcurl-transport':
specifier: ^1.2.0 specifier: ^1.2.1
version: 1.2.0(typescript@5.4.2) version: 1.2.1(typescript@5.4.2)
'@nebula-services/dynamic': '@nebula-services/dynamic':
specifier: 0.7.2-patch.2 specifier: 0.7.2-patch.2
version: 0.7.2-patch.2 version: 0.7.2-patch.2
@ -111,8 +111,8 @@ dependencies:
specifier: ^4.7.1 specifier: ^4.7.1
version: 4.7.1 version: 4.7.1
wisp-server-node: wisp-server-node:
specifier: ^1.0.1 specifier: ^1.0.2
version: 1.0.1 version: 1.0.2
ws: ws:
specifier: ^8.16.0 specifier: ^8.16.0
version: 8.16.0 version: 8.16.0
@ -828,21 +828,21 @@ packages:
uuid: 9.0.1 uuid: 9.0.1
dev: false dev: false
/@mercuryworkshop/bare-mux@1.0.4: /@mercuryworkshop/bare-mux@1.0.5:
resolution: {integrity: sha512-u9vtjc9Gp4G6UO7NYB1SphEiNIZtHuwI7/wxebbeKJ+GegmogxFodXF0ZYsQl7AY0fo3RqQs4odex9pYPHDkgQ==} resolution: {integrity: sha512-5czcsWISUCrN49diTuF/8WXZUCyoWHn90Ea+gLhVWKGUTyJzPAG5gTVZ77rMcQYewSuSDA1WVPaF0n79ciL5Gg==}
dependencies: dependencies:
'@types/uuid': 9.0.8 '@types/uuid': 9.0.8
uuid: 9.0.1 uuid: 9.0.1
dev: false dev: false
/@mercuryworkshop/epoxy-tls@1.3.0: /@mercuryworkshop/epoxy-tls@1.4.1:
resolution: {integrity: sha512-aqa+6Sm7weAtSwuWrVZIlqabIvzb60NxebAm1gf9Haulviz0NCMTO1sCGQ2JJrgWAmzGp63PQ4CeB9ZvKq9odw==} resolution: {integrity: sha512-g4vuP25F+RUz2l46y0WJ6mm9p7GDJEwEsgtQn5SzsXgnS1iKstE8bHAtqIfEf6njs4kRZs9Lxkj2UwHw2y+S7g==}
dev: false dev: false
/@mercuryworkshop/epoxy-transport@1.0.2(typescript@5.4.2): /@mercuryworkshop/epoxy-transport@1.1.0(typescript@5.4.2):
resolution: {integrity: sha512-phd8dlaSZqOt1/suNShdBFf1dlXyYGVXYEjAX7vg0pW4cWN1kgJvpq58a/LZwNlIqb2vkFp6pXUXq7w/RW70vQ==} resolution: {integrity: sha512-JVdKr+u53qu3GQyehZDWRfWV1UWct2fAtU2/50plFl9TLzy2rPLUHqyHTmyAuErNS6SP2uZ9BlgMz6FN4PlpVg==}
dependencies: dependencies:
'@mercuryworkshop/epoxy-tls': 1.3.0 '@mercuryworkshop/epoxy-tls': 1.4.1
esbuild-plugin-umd-wrapper: 2.0.0 esbuild-plugin-umd-wrapper: 2.0.0
rollup: 4.12.1 rollup: 4.12.1
rollup-plugin-node-resolve: 5.2.0(rollup@4.12.1) rollup-plugin-node-resolve: 5.2.0(rollup@4.12.1)
@ -854,11 +854,11 @@ packages:
- utf-8-validate - utf-8-validate
dev: false dev: false
/@mercuryworkshop/libcurl-transport@1.2.0(typescript@5.4.2): /@mercuryworkshop/libcurl-transport@1.2.1(typescript@5.4.2):
resolution: {integrity: sha512-jONOZ/jbLAuSd+m0d1Z4JAnB08VbyYf1or8nKFdyNn4TudDnu0yDQnRYuD/nELUXnOJNT7WnjEGIpaeLcNdXCg==} resolution: {integrity: sha512-HwlC36KSMoUHQmZ8y2EkF57oV6UfLrg6rUbdniMQqWw2HEDBT5Ua+gcyQybjW6pNMqvneqnOWLJFF9LwZzGHoA==}
dependencies: dependencies:
esbuild-plugin-umd-wrapper: 2.0.0 esbuild-plugin-umd-wrapper: 2.0.0
libcurl.js: 0.4.2 libcurl.js: 0.5.1
rollup: 4.12.1 rollup: 4.12.1
rollup-plugin-node-resolve: 5.2.0(rollup@4.12.1) rollup-plugin-node-resolve: 5.2.0(rollup@4.12.1)
rollup-plugin-typescript2: 0.36.0(rollup@4.12.1)(typescript@5.4.2) rollup-plugin-typescript2: 0.36.0(rollup@4.12.1)(typescript@5.4.2)
@ -2109,7 +2109,7 @@ packages:
es-errors: 1.3.0 es-errors: 1.3.0
function-bind: 1.1.2 function-bind: 1.1.2
get-intrinsic: 1.2.4 get-intrinsic: 1.2.4
set-function-length: 1.2.1 set-function-length: 1.2.2
/callsite@1.0.0: /callsite@1.0.0:
resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==}
@ -2680,7 +2680,7 @@ packages:
has-property-descriptors: 1.0.2 has-property-descriptors: 1.0.2
has-proto: 1.0.3 has-proto: 1.0.3
has-symbols: 1.0.3 has-symbols: 1.0.3
hasown: 2.0.1 hasown: 2.0.2
internal-slot: 1.0.7 internal-slot: 1.0.7
is-array-buffer: 3.0.4 is-array-buffer: 3.0.4
is-callable: 1.2.7 is-callable: 1.2.7
@ -2694,7 +2694,7 @@ packages:
object-keys: 1.1.1 object-keys: 1.1.1
object.assign: 4.1.5 object.assign: 4.1.5
regexp.prototype.flags: 1.5.2 regexp.prototype.flags: 1.5.2
safe-array-concat: 1.1.0 safe-array-concat: 1.1.2
safe-regex-test: 1.0.3 safe-regex-test: 1.0.3
string.prototype.trim: 1.2.8 string.prototype.trim: 1.2.8
string.prototype.trimend: 1.0.7 string.prototype.trimend: 1.0.7
@ -2704,7 +2704,7 @@ packages:
typed-array-byte-offset: 1.0.2 typed-array-byte-offset: 1.0.2
typed-array-length: 1.0.5 typed-array-length: 1.0.5
unbox-primitive: 1.0.2 unbox-primitive: 1.0.2
which-typed-array: 1.1.14 which-typed-array: 1.1.15
dev: true dev: true
/es-define-property@1.0.0: /es-define-property@1.0.0:
@ -2735,7 +2735,7 @@ packages:
has-symbols: 1.0.3 has-symbols: 1.0.3
internal-slot: 1.0.7 internal-slot: 1.0.7
iterator.prototype: 1.1.2 iterator.prototype: 1.1.2
safe-array-concat: 1.1.0 safe-array-concat: 1.1.2
dev: true dev: true
/es-set-tostringtag@2.0.3: /es-set-tostringtag@2.0.3:
@ -2744,13 +2744,13 @@ packages:
dependencies: dependencies:
get-intrinsic: 1.2.4 get-intrinsic: 1.2.4
has-tostringtag: 1.0.2 has-tostringtag: 1.0.2
hasown: 2.0.1 hasown: 2.0.2
dev: true dev: true
/es-shim-unscopables@1.0.2: /es-shim-unscopables@1.0.2:
resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
dependencies: dependencies:
hasown: 2.0.1 hasown: 2.0.2
dev: true dev: true
/es-to-primitive@1.2.1: /es-to-primitive@1.2.1:
@ -3463,7 +3463,7 @@ packages:
function-bind: 1.1.2 function-bind: 1.1.2
has-proto: 1.0.3 has-proto: 1.0.3
has-symbols: 1.0.3 has-symbols: 1.0.3
hasown: 2.0.1 hasown: 2.0.2
/get-stream@3.0.0: /get-stream@3.0.0:
resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
@ -3635,8 +3635,8 @@ packages:
dev: false dev: false
optional: true optional: true
/hasown@2.0.1: /hasown@2.0.2:
resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dependencies: dependencies:
function-bind: 1.1.2 function-bind: 1.1.2
@ -3810,7 +3810,7 @@ packages:
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dependencies: dependencies:
es-errors: 1.3.0 es-errors: 1.3.0
hasown: 2.0.1 hasown: 2.0.2
side-channel: 1.0.6 side-channel: 1.0.6
dev: true dev: true
@ -3885,7 +3885,7 @@ packages:
/is-core-module@2.13.1: /is-core-module@2.13.1:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
dependencies: dependencies:
hasown: 2.0.1 hasown: 2.0.2
/is-date-object@1.0.5: /is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
@ -4037,7 +4037,7 @@ packages:
resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dependencies: dependencies:
which-typed-array: 1.1.14 which-typed-array: 1.1.15
dev: true dev: true
/is-weakmap@2.0.2: /is-weakmap@2.0.2:
@ -4188,8 +4188,8 @@ packages:
type-check: 0.4.0 type-check: 0.4.0
dev: true dev: true
/libcurl.js@0.4.2: /libcurl.js@0.5.1:
resolution: {integrity: sha512-WuL2EgeYVuSsHFeJhpq83pOMX8+ei1E4Vpym7SKz6vPvuOEK9TBDCZRXDN/zr9o4T9UIy0FXxwpIEyHvSBNGmA==} resolution: {integrity: sha512-tO6WLAQHt/4JWpGCxoaLd+C5lG2MVYM7Df7E68ElEO9YWxPNO0f4lEdy+NS6KyxfvVP0Il4PYlFnyXnoYvVWZA==}
dev: false dev: false
/lie@3.1.1: /lie@3.1.1:
@ -5649,8 +5649,8 @@ packages:
tslib: 2.6.2 tslib: 2.6.2
dev: true dev: true
/safe-array-concat@1.1.0: /safe-array-concat@1.1.2:
resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
engines: {node: '>=0.4'} engines: {node: '>=0.4'}
dependencies: dependencies:
call-bind: 1.0.7 call-bind: 1.0.7
@ -5760,8 +5760,8 @@ packages:
resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
dev: false dev: false
/set-function-length@1.2.1: /set-function-length@1.2.2:
resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dependencies: dependencies:
define-data-property: 1.1.4 define-data-property: 1.1.4
@ -6599,7 +6599,7 @@ packages:
isarray: 2.0.5 isarray: 2.0.5
which-boxed-primitive: 1.0.2 which-boxed-primitive: 1.0.2
which-collection: 1.0.2 which-collection: 1.0.2
which-typed-array: 1.1.14 which-typed-array: 1.1.15
dev: true dev: true
/which-collection@1.0.2: /which-collection@1.0.2:
@ -6612,8 +6612,8 @@ packages:
is-weakset: 2.0.3 is-weakset: 2.0.3
dev: true dev: true
/which-typed-array@1.1.14: /which-typed-array@1.1.15:
resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dependencies: dependencies:
available-typed-arrays: 1.0.7 available-typed-arrays: 1.0.7
@ -6645,8 +6645,13 @@ packages:
dev: false dev: false
optional: true optional: true
/wisp-server-node@1.0.1: /wisp-server-node@1.0.2:
resolution: {integrity: sha512-RPid1o/q8NWE0zVFmMIUBIWS7WnUeHmfzrxaNeFsWKXYKD5RO74qYnDLbXSKFDCTSrPQ+uXtRI2I/EpunXfAvw==} resolution: {integrity: sha512-a48BYDSaGljTV54OtDjdkTYGbqehEfuNhSMZ9ZHIqtFSesMBi84WmyPYSZ9IgJUenw5p8iR0xjbcx9/nVJWJ+A==}
dependencies:
ws: 8.16.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
dev: false dev: false
/wrap-ansi@7.0.0: /wrap-ansi@7.0.0:

Binary file not shown.

View file

@ -1,5 +1,6 @@
importScripts("/epoxy/index.js"); importScripts("/epoxy/index.js");
importScripts("/libcurl/index.cjs"); importScripts("/libcurl/index.cjs");
importScripts("/transports/bareTransport.js");
importScripts("/uv/uv.bundle.js"); importScripts("/uv/uv.bundle.js");
importScripts("/uv/uv.config.js"); importScripts("/uv/uv.config.js");
importScripts(__uv$config.sw || "/uv/uv.sw.js"); importScripts(__uv$config.sw || "/uv/uv.sw.js");
@ -15,6 +16,7 @@ localforage.config({
description: "Nebula Config for things reliant on IndexedDB" description: "Nebula Config for things reliant on IndexedDB"
}); });
const uv = new UVServiceWorker();
const dynPromise = new Promise(async (resolve) => { const dynPromise = new Promise(async (resolve) => {
try { try {
const bare = const bare =
@ -27,22 +29,6 @@ const dynPromise = new Promise(async (resolve) => {
resolve(); resolve();
}); });
const uvPromise = new Promise(async (resolve) => {
try {
const bare =
(await localforage.getItem("bare")) || location.origin + "/bare/";
const proxyUrl = (await localforage.getItem("HTTPProxy")) || "";
const [proxyIP, proxyPort] = proxyUrl.split(":");
self.__uv$config.bare = bare;
self.__uv$config.proxyPort = proxyPort;
self.__uv$config.proxyIp = proxyIP;
self.uv = new UVServiceWorker(self.__uv$config);
} catch (error) {
console.log(error);
}
resolve();
});
self.addEventListener("fetch", (event) => { self.addEventListener("fetch", (event) => {
if ( if (
event.request.url.startsWith(location.origin + self.__dynamic$config.prefix) event.request.url.startsWith(location.origin + self.__dynamic$config.prefix)
@ -59,14 +45,17 @@ self.addEventListener("fetch", (event) => {
})() })()
); );
} else if ( } else if (
event.request.url.startsWith(location.origin + self.__uv$config.prefix) event.request.url.startsWith(location.origin + __uv$config.prefix)
) { ) {
event.respondWith( event.respondWith(
(async function () { (async function () {
try { return await uv.fetch(event);
await uvPromise; })()
} catch (error) {} );
return await self.uv.fetch(event); } else {
event.respondWith(
(async function () {
return await fetch(event.request);
})() })()
); );
} }

View file

@ -0,0 +1,612 @@
//Built from: https://github.com/motortruck1221/bare-as-module3 (commit: 36759f801e0009027878edecff156408b06404c6)
(function (global, factory) {
typeof exports === "object" && typeof module !== "undefined"
? factory(exports)
: typeof define === "function" && define.amd
? define(["exports"], factory)
: ((global =
typeof globalThis !== "undefined" ? globalThis : global || self),
factory((global.BareMod = {})));
})(this, function (exports) {
"use strict";
// The user likely has overwritten all networking functions after importing bare-client
// It is our responsibility to make sure components of Bare-Client are using native networking functions
// These exports are provided to plugins by @rollup/plugin-inject
const fetch = globalThis.fetch;
const WebSocket = globalThis.WebSocket;
const WebSocketFields = {
prototype: {
send: WebSocket.prototype.send
},
CLOSED: WebSocket.CLOSED,
CLOSING: WebSocket.CLOSING,
CONNECTING: WebSocket.CONNECTING,
OPEN: WebSocket.OPEN
};
class BareError extends Error {
status;
body;
constructor(status, body) {
super(body.message || body.code);
this.status = status;
this.body = body;
}
}
class Client {
base;
/**
*
* @param version Version provided by extension
* @param server Bare Server URL provided by BareClient
*/
constructor(version, server) {
this.base = new URL(`./v${version}/`, server);
}
}
/*
* JavaScript MD5
* Adopted from https://github.com/blueimp/JavaScript-MD5
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*
* Based on
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
/**
* Add integers, wrapping at 2^32.
* This uses 16-bit operations internally to work around bugs in interpreters.
*
* @param x First integer
* @param y Second integer
* @returns Sum
*/
function safeAdd(x, y) {
const lsw = (x & 0xffff) + (y & 0xffff);
const msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xffff);
}
/**
* Bitwise rotate a 32-bit number to the left.
*
* @param num 32-bit number
* @param cnt Rotation count
* @returns Rotated number
*/
function bitRotateLeft(num, cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
/**
* Basic operation the algorithm uses.
*
* @param q q
* @param a a
* @param b b
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5cmn(q, a, b, x, s, t) {
return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5ff(a, b, c, d, x, s, t) {
return md5cmn((b & c) | (~b & d), a, b, x, s, t);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5gg(a, b, c, d, x, s, t) {
return md5cmn((b & d) | (c & ~d), a, b, x, s, t);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5hh(a, b, c, d, x, s, t) {
return md5cmn(b ^ c ^ d, a, b, x, s, t);
}
/**
* Basic operation the algorithm uses.
*
* @param a a
* @param b b
* @param c c
* @param d d
* @param x x
* @param s s
* @param t t
* @returns Result
*/
function md5ii(a, b, c, d, x, s, t) {
return md5cmn(c ^ (b | ~d), a, b, x, s, t);
}
/**
* Calculate the MD5 of an array of little-endian words, and a bit length.
*
* @param x Array of little-endian words
* @param len Bit length
* @returns MD5 Array
*/
function binlMD5(x, len) {
/* append padding */
x[len >> 5] |= 0x80 << len % 32;
x[(((len + 64) >>> 9) << 4) + 14] = len;
let a = 1732584193;
let b = -271733879;
let c = -1732584194;
let d = 271733878;
for (let i = 0; i < x.length; i += 16) {
const olda = a;
const oldb = b;
const oldc = c;
const oldd = d;
a = md5ff(a, b, c, d, x[i], 7, -680876936);
d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
b = md5gg(b, c, d, a, x[i], 20, -373897302);
a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
d = md5hh(d, a, b, c, x[i], 11, -358537222);
c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
a = md5ii(a, b, c, d, x[i], 6, -198630844);
d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
a = safeAdd(a, olda);
b = safeAdd(b, oldb);
c = safeAdd(c, oldc);
d = safeAdd(d, oldd);
}
return [a, b, c, d];
}
/**
* Convert an array of little-endian words to a string
*
* @param input MD5 Array
* @returns MD5 string
*/
function binl2rstr(input) {
let output = "";
const length32 = input.length * 32;
for (let i = 0; i < length32; i += 8) {
output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff);
}
return output;
}
/**
* Convert a raw string to an array of little-endian words
* Characters >255 have their high-byte silently ignored.
*
* @param input Raw input string
* @returns Array of little-endian words
*/
function rstr2binl(input) {
const output = [];
const outputLen = input.length >> 2;
for (let i = 0; i < outputLen; i += 1) {
output[i] = 0;
}
const length8 = input.length * 8;
for (let i = 0; i < length8; i += 8) {
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32;
}
return output;
}
/**
* Calculate the MD5 of a raw string
*
* @param s Input string
* @returns Raw MD5 string
*/
function rstrMD5(s) {
return binl2rstr(binlMD5(rstr2binl(s), s.length * 8));
}
/**
* Calculates the HMAC-MD5 of a key and some data (raw strings)
*
* @param key HMAC key
* @param data Raw input string
* @returns Raw MD5 string
*/
function rstrHMACMD5(key, data) {
let bkey = rstr2binl(key);
const ipad = [];
const opad = [];
if (bkey.length > 16) {
bkey = binlMD5(bkey, key.length * 8);
}
for (let i = 0; i < 16; i += 1) {
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5c5c5c5c;
}
const hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
return binl2rstr(binlMD5(opad.concat(hash), 512 + 128));
}
/**
* Convert a raw string to a hex string
*
* @param input Raw input string
* @returns Hex encoded string
*/
function rstr2hex(input) {
const hexTab = "0123456789abcdef";
let output = "";
for (let i = 0; i < input.length; i += 1) {
const x = input.charCodeAt(i);
output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
}
return output;
}
/**
* Encode a string as UTF-8
*
* @param input Input string
* @returns UTF8 string
*/
function str2rstrUTF8(input) {
return unescape(encodeURIComponent(input));
}
/**
* Encodes input string as raw MD5 string
*
* @param s Input string
* @returns Raw MD5 string
*/
function rawMD5(s) {
return rstrMD5(str2rstrUTF8(s));
}
/**
* Encodes input string as Hex encoded string
*
* @param s Input string
* @returns Hex encoded string
*/
function hexMD5(s) {
return rstr2hex(rawMD5(s));
}
/**
* Calculates the raw HMAC-MD5 for the given key and data
*
* @param k HMAC key
* @param d Input string
* @returns Raw MD5 string
*/
function rawHMACMD5(k, d) {
return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d));
}
/**
* Calculates the Hex encoded HMAC-MD5 for the given key and data
*
* @param k HMAC key
* @param d Input string
* @returns Raw MD5 string
*/
function hexHMACMD5(k, d) {
return rstr2hex(rawHMACMD5(k, d));
}
/**
* Calculates MD5 value for a given string.
* If a key is provided, calculates the HMAC-MD5 value.
* Returns a Hex encoded string unless the raw argument is given.
*
* @param string Input string
* @param key HMAC key
* @param raw Raw output switch
* @returns MD5 output
*/
function md5(string, key, raw) {
if (!key) {
if (!raw) {
return hexMD5(string);
}
return rawMD5(string);
}
if (!raw) {
return hexHMACMD5(key, string);
}
return rawHMACMD5(key, string);
}
const MAX_HEADER_VALUE = 3072;
/**
*
* Splits headers according to spec
* @param headers
* @returns Split headers
*/
function splitHeaders(headers) {
const output = new Headers(headers);
if (headers.has("x-bare-headers")) {
const value = headers.get("x-bare-headers");
if (value.length > MAX_HEADER_VALUE) {
output.delete("x-bare-headers");
let split = 0;
for (let i = 0; i < value.length; i += MAX_HEADER_VALUE) {
const part = value.slice(i, i + MAX_HEADER_VALUE);
const id = split++;
output.set(`x-bare-headers-${id}`, `;${part}`);
}
}
}
return output;
}
/**
* Joins headers according to spec
* @param headers
* @returns Joined headers
*/
function joinHeaders(headers) {
const output = new Headers(headers);
const prefix = "x-bare-headers";
if (headers.has(`${prefix}-0`)) {
const join = [];
for (const [header, value] of headers) {
if (!header.startsWith(prefix)) {
continue;
}
if (!value.startsWith(";")) {
throw new BareError(400, {
code: "INVALID_BARE_HEADER",
id: `request.headers.${header}`,
message: `Value didn't begin with semi-colon.`
});
}
const id = parseInt(header.slice(prefix.length + 1));
join[id] = value.slice(1);
output.delete(header);
}
output.set(prefix, join.join(""));
}
return output;
}
class ClientV3 extends Client {
ws;
http;
meta() {
return {};
}
constructor(server) {
super(3, server);
this.ws = new URL(this.base);
this.http = new URL(this.base);
if (this.ws.protocol === "https:") {
this.ws.protocol = "wss:";
} else {
this.ws.protocol = "ws:";
}
}
ready = true;
async init() {
this.ready = true;
}
connect(
url,
origin,
protocols,
requestHeaders,
onopen,
onmessage,
onclose,
onerror
) {
const ws = new WebSocket(this.ws);
const cleanup = () => {
ws.removeEventListener("close", closeListener);
ws.removeEventListener("message", messageListener);
};
const closeListener = () => {
cleanup();
};
const messageListener = (event) => {
cleanup();
// ws.binaryType is irrelevant when sending text
if (typeof event.data !== "string")
throw new TypeError(
"the first websocket message was not a text frame"
);
const message = JSON.parse(event.data);
// finally
if (message.type !== "open")
throw new TypeError("message was not of open type");
// onMeta({
// protocol: message.protocol,
// setCookies: message.setCookies,
// });
onopen(message.protocol);
// TODO
ws.addEventListener("message", (ev) => {
onmessage(ev.data);
});
};
ws.addEventListener("close", closeListener);
ws.addEventListener("message", messageListener);
// CONNECTED TO THE BARE SERVER, NOT THE REMOTE
ws.addEventListener(
"open",
(event) => {
// getRequestHeaders().then((headers:any) =>
WebSocketFields.prototype.send.call(
ws,
JSON.stringify({
type: "connect",
remote: url.toString(),
protocols,
headers: requestHeaders,
forwardHeaders: []
})
);
// );
},
// only block the open event once
{ once: true }
);
return ws.send.bind(ws);
}
async request(remote, method, body, headers, signal) {
const options = {
credentials: "omit",
method: method,
signal
};
if (body !== undefined) {
options.body = body;
}
options.headers = this.createBareHeaders(remote, headers);
const response = await fetch(
this.http + "?cache=" + md5(remote.toString()),
options
);
const readResponse = await this.readBareResponse(response);
// const result: Response & Partial<BareResponse> = new Response(
// statusEmpty.includes(readResponse.status!) ? undefined : response.body,
// {
// status: readResponse.status,
// statusText: readResponse.statusText ?? undefined,
// headers: new Headers(readResponse.headers as HeadersInit),
// }
// );
//
// result.rawHeaders = readResponse.headers;
// result.rawResponse = response;
return {
body: response.body,
headers: readResponse.headers,
status: readResponse.status,
statusText: readResponse.statusText
};
}
async readBareResponse(response) {
if (!response.ok) {
throw new BareError(response.status, await response.json());
}
const responseHeaders = joinHeaders(response.headers);
const result = {};
const xBareStatus = responseHeaders.get("x-bare-status");
if (xBareStatus !== null) result.status = parseInt(xBareStatus);
const xBareStatusText = responseHeaders.get("x-bare-status-text");
if (xBareStatusText !== null) result.statusText = xBareStatusText;
const xBareHeaders = responseHeaders.get("x-bare-headers");
if (xBareHeaders !== null) result.headers = JSON.parse(xBareHeaders);
return result;
}
createBareHeaders(
remote,
bareHeaders,
forwardHeaders = [],
passHeaders = [],
passStatus = []
) {
const headers = new Headers();
headers.set("x-bare-url", remote.toString());
headers.set("x-bare-headers", JSON.stringify(bareHeaders));
for (const header of forwardHeaders) {
headers.append("x-bare-forward-headers", header);
}
for (const header of passHeaders) {
headers.append("x-bare-pass-headers", header);
}
for (const status of passStatus) {
headers.append("x-bare-pass-status", status.toString());
}
splitHeaders(headers);
return headers;
}
}
exports.BareClient = ClientV3;
});
//# sourceMappingURL=bare.cjs.map

View file

@ -9,6 +9,8 @@ import { useTranslation } from "react-i18next";
const Proxy = ({ id, active }) => { const Proxy = ({ id, active }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const transport = localStorage.getItem("transport") || "libcurl";
const proccy = localStorage.getItem("proxy") || "automatic";
const engines = [ const engines = [
{ id: "automatic", label: t("settings.proxy.automatic") }, { id: "automatic", label: t("settings.proxy.automatic") },
@ -34,8 +36,9 @@ const Proxy = ({ id, active }) => {
location.host + location.host +
"/wisp/"; "/wisp/";
const transports = [ const transports = [
{ id: "epoxy", label: "Epoxy" }, { id: "libcurl", label: "Libcurl" },
{ id: "libcurl", label: "Libcurl" } { id: "bare", label: "Bare Server" },
{ id: "epoxy", label: "Epoxy" }
]; ];
return ( return (
@ -86,6 +89,7 @@ const Proxy = ({ id, active }) => {
refresh={false} refresh={false}
/> />
</div> </div>
{transport === "bare" && (
<div className="flex h-64 w-80 flex-col flex-wrap content-center items-center rounded-lg border border-input-border-color bg-lighter p-2 text-center"> <div className="flex h-64 w-80 flex-col flex-wrap content-center items-center rounded-lg border border-input-border-color bg-lighter p-2 text-center">
<div className="p-2 text-3xl font-bold text-input-text"> <div className="p-2 text-3xl font-bold text-input-text">
{t("settings.bare.title")} {t("settings.bare.title")}
@ -95,6 +99,8 @@ const Proxy = ({ id, active }) => {
</div> </div>
<BareInput placeholder="/bare/" storageKey="bare" /> <BareInput placeholder="/bare/" storageKey="bare" />
</div> </div>
)}
{transport !== "bare" && (
<div className="flex h-64 w-80 flex-col flex-wrap content-center items-center rounded-lg border border-input-border-color bg-lighter p-2 text-center"> <div className="flex h-64 w-80 flex-col flex-wrap content-center items-center rounded-lg border border-input-border-color bg-lighter p-2 text-center">
<div className="p-2 text-3xl font-bold text-input-text"> <div className="p-2 text-3xl font-bold text-input-text">
Wisp Server Wisp Server
@ -104,6 +110,7 @@ const Proxy = ({ id, active }) => {
</div> </div>
<WispInput placeholder={wispUrl} /> <WispInput placeholder={wispUrl} />
</div> </div>
)}
<div className="flex h-64 w-80 flex-col flex-wrap content-center items-center rounded-lg border border-input-border-color bg-lighter p-2 text-center"> <div className="flex h-64 w-80 flex-col flex-wrap content-center items-center rounded-lg border border-input-border-color bg-lighter p-2 text-center">
<div className="p-2 text-3xl font-bold text-input-text"> <div className="p-2 text-3xl font-bold text-input-text">
Transport Transport
@ -114,8 +121,7 @@ const Proxy = ({ id, active }) => {
<Dropdown <Dropdown
storageKey="transport" storageKey="transport"
options={transports} options={transports}
refresh={false} refresh={true}
onChange={(value) => changeTransport(value, wispUrl)}
/> />
</div> </div>
</motion.div> </motion.div>

View file

@ -3,13 +3,6 @@ import {
registerRemoteListener registerRemoteListener
} from "@mercuryworkshop/bare-mux"; } from "@mercuryworkshop/bare-mux";
declare global {
interface Window {
BareMux: any;
p: any;
}
}
function changeTransport(transport: string, wispUrl: string) { function changeTransport(transport: string, wispUrl: string) {
switch (transport) { switch (transport) {
case "epoxy": case "epoxy":
@ -22,12 +15,22 @@ function changeTransport(transport: string, wispUrl: string) {
console.log("Setting transport to Libcurl"); console.log("Setting transport to Libcurl");
SetTransport("CurlMod.LibcurlClient", { SetTransport("CurlMod.LibcurlClient", {
wisp: wispUrl, wisp: wispUrl,
wasm: "/libcurl.wasm" wasm: "https://cdn.jsdelivr.net/npm/libcurl.js@v0.5.2/libcurl.wasm"
}); });
break; break;
//stuff like bare-as-module3 COULD also be added case "bare":
localStorage.setItem("transport", "bare");
console.log("Setting transport to Bare");
const bare =
localStorage.getItem("bare") || window.location.origin + "/bare/";
console.log("Bare URL: " + bare);
SetTransport("BareMod.BareClient", bare);
break;
default: default:
SetTransport("EpxMod.EpoxyClient", { wisp: wispUrl }); SetTransport("CurlMod.LibcurlClient", {
wisp: wispUrl,
wasm: "/libcurl.wasm"
});
break; break;
} }
} }
@ -42,7 +45,7 @@ const wispUrl =
"/wisp/"; "/wisp/";
registerRemoteListener(navigator.serviceWorker.controller!); registerRemoteListener(navigator.serviceWorker.controller!);
changeTransport( changeTransport(
localStorage.getItem("transport") || "epoxy", localStorage.getItem("transport") || "libcurl",
localStorage.getItem("wispUrl") || wispUrl localStorage.getItem("wispUrl") || wispUrl
); );