Compare commits

...

19 commits

Author SHA1 Message Date
MotorTruck1221
d2455e8157
Whatever I've done here is shit 2024-11-04 23:32:40 -07:00
MotorTruck1221
3f520528b6
Merge pull request #265 from Percslol/main
update to bare mux v2 & major cleanup
2024-09-23 18:45:12 -06:00
Percs
c5138d6f06 fix merge conflictss 2024-09-23 19:41:18 -05:00
rifting
cbf06ad254
Merge pull request #272 from MotorTruck1221/main
Switch to nebula services version of bare server node
2024-09-13 18:37:10 -05:00
MotorTruck1221
acd1345934 Regen package locks 2024-09-12 05:30:02 +00:00
MotorTruck1221
d1f890ca7b Switch to nebula's version of bare server node 2024-09-12 05:25:14 +00:00
rifting
9267cfedb2
Merge pull request #269 from NebulaServices/MotorTruck1221-patch-1
Enforce v2.0.3 of bare server node
2024-09-10 16:58:10 -05:00
MotorTruck1221
065499a041
Enforce v2.0.3 of bare server node 2024-09-10 12:03:06 -06:00
MotorTruck1221
6c77aa0864
Merge pull request #267 from NebulaServices/snyk-upgrade-764175f2aa867746622d4e55444cddbc
[Snyk] Upgrade @tomphttp/bare-server-node from 2.0.3 to 2.0.4
2024-08-17 16:44:40 -06:00
snyk-bot
3f76b7b7a3
fix: upgrade @tomphttp/bare-server-node from 2.0.3 to 2.0.4
Snyk has created this PR to upgrade @tomphttp/bare-server-node from 2.0.3 to 2.0.4.

See this package in npm:
@tomphttp/bare-server-node

See this project in Snyk:
https://app.snyk.io/org/greenydev/project/d2cc9035-af19-487f-bbb7-3d864ce3a3c3?utm_source=github&utm_medium=referral&page=upgrade-pr
2024-08-17 22:27:04 +00:00
Percs
0fde43f4ff make bareinput show the real url 2024-07-16 03:11:06 -05:00
Percs
6306992e11 change the port variable 2024-07-16 03:01:07 -05:00
Percs
5992735a51 bump package version 2024-07-16 02:52:58 -05:00
Percs
fe93b0d5d5 dont import bare transport in page 2024-07-16 02:45:10 -05:00
Percs
bb8b2b6d60 add loading suspense when registering service worker 2024-07-16 02:43:12 -05:00
Percs
b1ba8502ea stop refactor 2024-07-12 23:43:23 -05:00
Percs
10e686cd2d make the service worker get registered on suggestions too 2024-07-11 17:26:00 -05:00
Percs
22d74d484f update and fix uv bug 2024-07-11 16:30:51 -05:00
Percs
105b6c9796 update to support bare-mux v2 2024-07-11 15:29:26 -05:00
28 changed files with 9792 additions and 855 deletions

11
.astro/astro/env.d.ts vendored Normal file
View file

@ -0,0 +1,11 @@
declare module 'astro:env/client' {
export const VERSION: string;
export const MARKETPLACE_ENABLED: boolean;
}
declare module 'astro:env/server' {
export const getSecret: (key: string) => string | undefined;
}

9167
.astro/icon.d.ts vendored Normal file

File diff suppressed because it is too large Load diff

5
.astro/settings.json Normal file
View file

@ -0,0 +1,5 @@
{
"_variables": {
"lastUpdateCheck": 1730783343720
}
}

2
.astro/types.d.ts vendored Normal file
View file

@ -0,0 +1,2 @@
/// <reference types="astro/client" />
/// <reference path="astro/env.d.ts" />

24
config.toml Normal file
View file

@ -0,0 +1,24 @@
[marketplace]
enabled = true # Turn on or off the marketplace entirely
psk = "CHANGEME" # Change this to something more secure.
level = 1
[db]
name = "database" # Your databsae name
username = "username" # The username of your DB (SQLITE just ignores this)
password = "password" # The password to your DB (SQLITE ignores this)
postgres = false # Enable to use postgres over sqlite (recommended for large prod instances)
[postgres] # Set the "domain" to either and ip address or a actual domain
domain = ""
port = 5432
[server.server]
port = 8080
wisp = true
logging = true # Disable for the tons & tons of logs to go away (useful for debugging but otherwise eh)
[server.rammerhead] # Don't touch this section unless you KNOW what you are doing
reverseproxy = true
localstorage_sync = true
http2 = true

BIN
database.sqlite Normal file

Binary file not shown.

View file

@ -3,7 +3,6 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<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,12 +14,13 @@
"@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.1.1", "@mercuryworkshop/bare-mux": "^2.0.9",
"@mercuryworkshop/epoxy-transport": "^2.0.1", "@mercuryworkshop/epoxy-transport": "^2.1.11",
"@mercuryworkshop/libcurl-transport": "^1.3.1", "@mercuryworkshop/libcurl-transport": "^1.3.10",
"@nebula-services/dynamic": "0.7.2-patch.2", "@nebula-services/dynamic": "0.7.2-patch.2",
"@titaniumnetwork-dev/ultraviolet": "^3.1.2", "@titaniumnetwork-dev/ultraviolet": "^3.2.7",
"@tomphttp/bare-server-node": "2.0.3", "@mercuryworkshop/bare-as-module3": "^2.2.2",
"@nebula-services/bare-server-node": "^2.0.4",
"@tsparticles/engine": "^3.4.0", "@tsparticles/engine": "^3.4.0",
"@tsparticles/react": "^3.0.0", "@tsparticles/react": "^3.0.0",
"@tsparticles/slim": "^3.4.0", "@tsparticles/slim": "^3.4.0",

127
pnpm-lock.yaml generated
View file

@ -17,24 +17,27 @@ importers:
'@fastify/static': '@fastify/static':
specifier: ^6.12.0 specifier: ^6.12.0
version: 6.12.0 version: 6.12.0
'@mercuryworkshop/bare-as-module3':
specifier: ^2.2.2
version: 2.2.2
'@mercuryworkshop/bare-mux': '@mercuryworkshop/bare-mux':
specifier: ^1.1.1 specifier: ^2.0.9
version: 1.1.1 version: 2.0.9
'@mercuryworkshop/epoxy-transport': '@mercuryworkshop/epoxy-transport':
specifier: ^2.0.1 specifier: ^2.1.11
version: 2.0.1(bufferutil@4.0.8)(typescript@5.5.2)(utf-8-validate@6.0.4) version: 2.1.11
'@mercuryworkshop/libcurl-transport': '@mercuryworkshop/libcurl-transport':
specifier: ^1.3.1 specifier: ^1.3.10
version: 1.3.1(bufferutil@4.0.8)(typescript@5.5.2)(utf-8-validate@6.0.4) version: 1.3.10(typescript@5.5.2)
'@nebula-services/bare-server-node':
specifier: ^2.0.4
version: 2.0.4(bufferutil@4.0.8)(utf-8-validate@6.0.4)
'@nebula-services/dynamic': '@nebula-services/dynamic':
specifier: 0.7.2-patch.2 specifier: 0.7.2-patch.2
version: 0.7.2-patch.2(bufferutil@4.0.8)(utf-8-validate@6.0.4) version: 0.7.2-patch.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)
'@titaniumnetwork-dev/ultraviolet': '@titaniumnetwork-dev/ultraviolet':
specifier: ^3.1.2 specifier: ^3.2.7
version: 3.1.2 version: 3.2.7
'@tomphttp/bare-server-node':
specifier: 2.0.3
version: 2.0.3(bufferutil@4.0.8)(utf-8-validate@6.0.4)
'@tsparticles/engine': '@tsparticles/engine':
specifier: ^3.4.0 specifier: ^3.4.0
version: 3.4.0 version: 3.4.0
@ -797,17 +800,25 @@ packages:
'@mdn/browser-compat-data@5.5.35': '@mdn/browser-compat-data@5.5.35':
resolution: {integrity: sha512-APtxt3S+a64EcXpG7E3a0bLx+CPqEcgN45FY/GEmbBBgX51AGIPkkYFy0JQDuOR0MFCozjo50q5Im74jflrkiQ==} resolution: {integrity: sha512-APtxt3S+a64EcXpG7E3a0bLx+CPqEcgN45FY/GEmbBBgX51AGIPkkYFy0JQDuOR0MFCozjo50q5Im74jflrkiQ==}
'@mercuryworkshop/bare-mux@1.1.1': '@mercuryworkshop/bare-as-module3@2.2.2':
resolution: {integrity: sha512-qKOnTsIjwv4wBvToek3Jm+y3F/BcFtjy6HOsdyzIUemCOw51kodzRsvWvU9Pf/JYDVPV8or0zbsg+qOKtasjhA==} resolution: {integrity: sha512-Ds8981SmI1DQp1mDCVax1x0I5mH2dR1tYKytW7xTjlnpsfwn3RzQDiVJHUCrpc7cWGCe+7mHCF3EoMjM3hFfvQ==}
'@mercuryworkshop/epoxy-tls@2.0.0-3': '@mercuryworkshop/bare-mux@2.0.9':
resolution: {integrity: sha512-iC5CViTh2xn44xtjvDW4YW9qoeoJcCBOqcNmffBx3RHdK7FAzAWFHLTUBtdlnMVv6cjYZtV+eUTzxyreqlgOVA==} resolution: {integrity: sha512-g+F/Oz33iSQwLf3rJU3Vr1bh5cbxHRKS/Tnr6ayk060UzcJ+EDGad5pUdRJFz1MRyinpYC5MrG67QDA9Dlta9A==}
'@mercuryworkshop/epoxy-transport@2.0.1': '@mercuryworkshop/epoxy-tls@2.1.4-1':
resolution: {integrity: sha512-iGuH/CT5hCVRYBa+5ZrlTG0DWII9VOCMHnmv9CPFLM17obE84y9EUXpTp9hXdfENnuAcNzQVPizjwVas7HiYQA==} resolution: {integrity: sha512-kRbW12tU4TAf9GuoLfyFYvUATqFZq6n9ScRSfwAECceOBWDlr+bACnSH45lLDXvjBKwxZotTyYE5aNc+Ow+M3Q==}
'@mercuryworkshop/libcurl-transport@1.3.1': '@mercuryworkshop/epoxy-transport@2.1.11':
resolution: {integrity: sha512-yGt8K7D1j8WLn7LgH6YPnxmHc+JUCB0x/QPIStuRftl0tq3D8uHskRFeOJ8ksTrru7mTAjk5Cpmvix8jNJ+Lug==} resolution: {integrity: sha512-kp1MDWbrTOr55ZvD4KLbaWcfwwugdhjourBXLh5inJcKFsVKqbbLWMfs/JGGTluwBoTG52UpLUU4OW0suruBwg==}
'@mercuryworkshop/libcurl-transport@1.3.10':
resolution: {integrity: sha512-XLSkk1n4uMu6M0sS5Rh5ZNT7dBGILHDneJYD9oOpWMU5yxzNDlwcmJggNaYqMfH7B8jjLmw5sK2gPU5hDFPAVg==}
'@nebula-services/bare-server-node@2.0.4':
resolution: {integrity: sha512-Jcr+QtkLJVmppdbBarEbRp1TtCsL4pjFIcX6+KPURRqcsOP7hZfYclhjmCserwEC7jT+WBduXpFd3qwqeRBNew==}
engines: {node: '>=18.0.0'}
hasBin: true
'@nebula-services/dynamic@0.7.2-patch.2': '@nebula-services/dynamic@0.7.2-patch.2':
resolution: {integrity: sha512-0g1ygwVNS0dmT38NIeZYc2Z5HiZKHT3tP7ZagIeWC/VlcZjINIPR4ThNndWVaGiZey2Y2JS2807ABb41OSYTrw==} resolution: {integrity: sha512-0g1ygwVNS0dmT38NIeZYc2Z5HiZKHT3tP7ZagIeWC/VlcZjINIPR4ThNndWVaGiZey2Y2JS2807ABb41OSYTrw==}
@ -946,8 +957,8 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@titaniumnetwork-dev/ultraviolet@3.1.2': '@titaniumnetwork-dev/ultraviolet@3.2.7':
resolution: {integrity: sha512-PvhyL9IQtSwHTVRRpNGn+YCWkSzP7JEk0wX7M5YfUSobBicoRLOJhCC4u6T9qh/vObDpLDE3TfP4GKqMTSa2rw==} resolution: {integrity: sha512-leR8Cxtgld9NykRbEbYejbD85dOLh0rqQe6tfcsaFEBIChWG9QF10x1qoJBQ3wXSvZ+wqh3cBNYrucYpHOWpUA==}
'@tomphttp/bare-client@2.2.0-alpha': '@tomphttp/bare-client@2.2.0-alpha':
resolution: {integrity: sha512-xhcflOpwr92tkpp8SoDhB3nK3LHMBIjx+vgow37XobQew2k0/mXSxmaU7BsDFpOIa1CcLCEsR8gWn0v7Cy9+7Q==} resolution: {integrity: sha512-xhcflOpwr92tkpp8SoDhB3nK3LHMBIjx+vgow37XobQew2k0/mXSxmaU7BsDFpOIa1CcLCEsR8gWn0v7Cy9+7Q==}
@ -1091,9 +1102,6 @@ packages:
'@types/semver@7.5.8': '@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
'@types/uuid@9.0.8':
resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
'@typescript-eslint/experimental-utils@5.62.0': '@typescript-eslint/experimental-utils@5.62.0':
resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -2508,8 +2516,8 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
libcurl.js@0.6.8: libcurl.js@0.6.15:
resolution: {integrity: sha512-KYkWFxnSdnIeN00AZRWv1tywDawVqb7VKxw213GjqxehGQDBv0rWAKZ/R/rwEKumVYlPvRNrzZPRa9wlYgEjCg==} resolution: {integrity: sha512-rKcGhvJiju/V6RoH0mYW0l/w9GnTRFtidp8qC+3cMliHXHEHnbqwpOPzauMeOd2CtcEW5ZPZ29PpXLJ1bdHbyQ==}
lie@3.1.1: lie@3.1.1:
resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==}
@ -3709,6 +3717,11 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
typescript@5.5.3:
resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
engines: {node: '>=14.17'}
hasBin: true
uglify-js@3.18.0: uglify-js@3.18.0:
resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==}
engines: {node: '>=0.8.0'} engines: {node: '>=0.8.0'}
@ -3766,10 +3779,6 @@ packages:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true hasBin: true
uuid@9.0.1:
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
hasBin: true
vary@1.1.2: vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@ -3873,8 +3882,8 @@ packages:
wrappy@1.0.2: wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
ws@8.16.0: ws@8.17.1:
resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
peerDependencies: peerDependencies:
bufferutil: ^4.0.1 bufferutil: ^4.0.1
@ -3885,8 +3894,8 @@ packages:
utf-8-validate: utf-8-validate:
optional: true optional: true
ws@8.17.1: ws@8.18.0:
resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
peerDependencies: peerDependencies:
bufferutil: ^4.0.1 bufferutil: ^4.0.1
@ -4473,37 +4482,39 @@ snapshots:
'@mdn/browser-compat-data@5.5.35': {} '@mdn/browser-compat-data@5.5.35': {}
'@mercuryworkshop/bare-mux@1.1.1': '@mercuryworkshop/bare-as-module3@2.2.2':
dependencies: dependencies:
'@types/uuid': 9.0.8 typescript: 5.5.3
uuid: 9.0.1
'@mercuryworkshop/epoxy-tls@2.0.0-3': {} '@mercuryworkshop/bare-mux@2.0.9': {}
'@mercuryworkshop/epoxy-transport@2.0.1(bufferutil@4.0.8)(typescript@5.5.2)(utf-8-validate@6.0.4)': '@mercuryworkshop/epoxy-tls@2.1.4-1': {}
'@mercuryworkshop/epoxy-transport@2.1.11':
dependencies:
'@mercuryworkshop/epoxy-tls': 2.1.4-1
'@mercuryworkshop/libcurl-transport@1.3.10(typescript@5.5.2)':
dependencies: dependencies:
'@mercuryworkshop/epoxy-tls': 2.0.0-3
esbuild-plugin-umd-wrapper: 2.0.0 esbuild-plugin-umd-wrapper: 2.0.0
libcurl.js: 0.6.15
rollup: 4.18.0 rollup: 4.18.0
rollup-plugin-node-resolve: 5.2.0(rollup@4.18.0) rollup-plugin-node-resolve: 5.2.0(rollup@4.18.0)
rollup-plugin-typescript2: 0.36.0(rollup@4.18.0)(typescript@5.5.2) rollup-plugin-typescript2: 0.36.0(rollup@4.18.0)(typescript@5.5.2)
ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil
- typescript - typescript
- utf-8-validate
'@mercuryworkshop/libcurl-transport@1.3.1(bufferutil@4.0.8)(typescript@5.5.2)(utf-8-validate@6.0.4)': '@nebula-services/bare-server-node@2.0.4(bufferutil@4.0.8)(utf-8-validate@6.0.4)':
dependencies: dependencies:
esbuild-plugin-umd-wrapper: 2.0.0 async-exit-hook: 2.0.1
libcurl.js: 0.6.8 commander: 10.0.1
rollup: 4.18.0 dotenv: 16.4.5
rollup-plugin-node-resolve: 5.2.0(rollup@4.18.0) http-errors: 2.0.0
rollup-plugin-typescript2: 0.36.0(rollup@4.18.0)(typescript@5.5.2) ipaddr.js: 2.2.0
ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) source-map-support: 0.5.21
ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
- typescript
- utf-8-validate - utf-8-validate
'@nebula-services/dynamic@0.7.2-patch.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)': '@nebula-services/dynamic@0.7.2-patch.2(bufferutil@4.0.8)(utf-8-validate@6.0.4)':
@ -4657,7 +4668,7 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.18.0': '@rollup/rollup-win32-x64-msvc@4.18.0':
optional: true optional: true
'@titaniumnetwork-dev/ultraviolet@3.1.2': {} '@titaniumnetwork-dev/ultraviolet@3.2.7': {}
'@tomphttp/bare-client@2.2.0-alpha': {} '@tomphttp/bare-client@2.2.0-alpha': {}
@ -4869,8 +4880,6 @@ snapshots:
'@types/semver@7.5.8': {} '@types/semver@7.5.8': {}
'@types/uuid@9.0.8': {}
'@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.2)': '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.2)':
dependencies: dependencies:
'@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.2) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.2)
@ -6541,7 +6550,7 @@ snapshots:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
type-check: 0.4.0 type-check: 0.4.0
libcurl.js@0.6.8: {} libcurl.js@0.6.15: {}
lie@3.1.1: lie@3.1.1:
dependencies: dependencies:
@ -7844,6 +7853,8 @@ snapshots:
typescript@5.5.2: {} typescript@5.5.2: {}
typescript@5.5.3: {}
uglify-js@3.18.0: {} uglify-js@3.18.0: {}
unbox-primitive@1.0.2: unbox-primitive@1.0.2:
@ -7898,8 +7909,6 @@ snapshots:
uuid@8.3.2: {} uuid@8.3.2: {}
uuid@9.0.1: {}
vary@1.1.2: {} vary@1.1.2: {}
vite-plugin-static-copy@1.0.5(vite@5.3.2(@types/node@20.14.9)): vite-plugin-static-copy@1.0.5(vite@5.3.2(@types/node@20.14.9)):
@ -8007,12 +8016,12 @@ snapshots:
wrappy@1.0.2: {} wrappy@1.0.2: {}
ws@8.16.0(bufferutil@4.0.8)(utf-8-validate@6.0.4): ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4):
optionalDependencies: optionalDependencies:
bufferutil: 4.0.8 bufferutil: 4.0.8
utf-8-validate: 6.0.4 utf-8-validate: 6.0.4
ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4): ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4):
optionalDependencies: optionalDependencies:
bufferutil: 4.0.8 bufferutil: 4.0.8
utf-8-validate: 6.0.4 utf-8-validate: 6.0.4

View file

@ -1,6 +1,3 @@
importScripts("/epoxy/index.js");
importScripts("/libcurl/index.js");
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");
@ -30,33 +27,20 @@ const dynPromise = new Promise(async (resolve) => {
}); });
self.addEventListener("fetch", (event) => { self.addEventListener("fetch", (event) => {
if (
event.request.url.startsWith(location.origin + self.__dynamic$config.prefix)
) {
event.respondWith( event.respondWith(
(async function () { (async function () {
if (uv.route(event)) {
return await uv.fetch(event);
}
if (await dynamic.route(event)) {
try { try {
await dynPromise; await dynPromise;
} catch (error) {} } catch (e) {
if (await self.dynamic.route(event)) { console.error(error)
return await self.dynamic.fetch(event); }
return await dynamic.fetch(event);
} }
await fetch(event.request);
})()
);
} else if (
event.request.url.startsWith(location.origin + __uv$config.prefix)
) {
event.respondWith(
(async function () {
return await uv.fetch(event);
})()
);
} else {
event.respondWith(
(async function () {
return await fetch(event.request); return await fetch(event.request);
})() })()
); );
}
}); });

View file

@ -1,612 +0,0 @@
//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

@ -1,6 +1,5 @@
self.__uv$config = { self.__uv$config = {
prefix: "/~/uv/", prefix: "/~/uv/",
bare: "/bare/",
encodeUrl: function encode(str) { encodeUrl: function encode(str) {
if (!str) return str; if (!str) return str;
return encodeURIComponent( return encodeURIComponent(
@ -30,7 +29,5 @@ self.__uv$config = {
client: "/uv/uv.client.js", client: "/uv/uv.client.js",
bundle: "/uv/uv.bundle.js", bundle: "/uv/uv.bundle.js",
config: "/uv/uv.config.js", config: "/uv/uv.config.js",
sw: "/uv/uv.sw.js", sw: "/uv/uv.sw.js"
proxyIp: "",
proxyPort: ""
}; };

View file

@ -49,7 +49,7 @@ function routeRhRequest(req, res) {
function routeRhUpgrade(req, socket, head) { function routeRhUpgrade(req, socket, head) {
rh.emit("upgrade", req, socket, head); rh.emit("upgrade", req, socket, head);
} }
const port = parseInt(process.env.PORT) || 8080;
const serverFactory = (handler, opts) => { const serverFactory = (handler, opts) => {
return createServer() return createServer()
.on("request", (req, res) => { .on("request", (req, res) => {
@ -101,13 +101,15 @@ app.setNotFoundHandler((req, res) => {
}); });
console.log( console.log(
chalk.green(`Server listening on ${chalk.bold("http://localhost:8080")}`) chalk.green(`Server listening on ${chalk.bold(`http://localhost:${port}`)}`)
); );
console.log( console.log(
chalk.magenta(`Server also listening on ${chalk.bold("http://0.0.0.0:8080")}`) chalk.magenta(
`Server also listening on ${chalk.bold(`http://0.0.0.0:${port}`)}`
)
); );
app.listen({ app.listen({
port: 8080, port: port,
host: "0.0.0.0" host: "0.0.0.0"
}); });

38
server/config.js Normal file
View file

@ -0,0 +1,38 @@
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import chalk from "chalk";
import { parse } from "smol-toml";
let doc = readFileSync(fileURLToPath(new URL("../config.toml", import.meta.url))).toString();
const parsedDoc = parse(doc);
function verify(t) {
for (let i = 0; i !== t.length; i++) {
if (typeof t[i].typeOF !== t[i].type) {
throw new Error(`Invalid structure: "${t[i].name}" should be a(n) ${t[i].type}`);
}
}
}
verify([
{ name: "marketplace", typeOF: parsedDoc.marketplace, type: "object" },
{ name: "marketplace.enabled", typeOF: parsedDoc.marketplace.enabled, type: "boolean" },
{ name: "marketplace.psk", typeOF: parsedDoc.marketplace.psk, type: "string" },
{ name: "server", typeOF: parsedDoc.server, type: "object" },
{ name: "server.server", typeOF: parsedDoc.server.server, type: "object" },
{ name: "server.server.port", typeOF: parsedDoc.server.server.port, type: "number" },
{ name: "server.server.wisp", typeOF: parsedDoc.server.server.wisp, type: "boolean" },
{ name: "server.server.logging", typeOF: parsedDoc.server.server.logging, type: "boolean" },
{ name: "db", typeOF: parsedDoc.db, type: "object" },
{ name: "db.name", typeOF: parsedDoc.db.name, type: "string" },
{ name: "db.username", typeOF: parsedDoc.db.username, type: "string" },
{ name: "db.password", typeOF: parsedDoc.db.password, type: "string" },
{ name: "db.postgres", typeOF: parsedDoc.db.postgres, type: "boolean" },
{ name: "postgres", typeOF: parsedDoc.postgres, type: "object" },
{ name: "postgres.domain", typeOF: parsedDoc.postgres.domain, type: "string" },
{ name: "postgres.port", typeOF: parsedDoc.postgres.port, type: "number" }
]);
if (parsedDoc.marketplace.psk === "CHANGEME") {
console.warn(chalk.yellow.bold('PSK should be changed from "CHANGEME"'));
}
if (parsedDoc.db.password === "password") {
console.warn(chalk.red.bold("You should change your DB password!!"));
}
export { parsedDoc };

76
server/dbSetup.js Normal file
View file

@ -0,0 +1,76 @@
import chalk from "chalk";
import ora from "ora";
async function installItems(db, items) {
items.forEach(async (item) => {
await db.create({
package_name: item.package_name,
title: item.title,
image: item.image,
author: item.author,
version: item.version,
description: item.description,
tags: item.tags,
payload: item.payload,
background_video: item.background_video,
background_image: item.background_image,
type: item.type
});
});
}
async function setupDB(db) {
//We have some packages that need to be installed if they aren't.
const items = [
{
package_name: "com.nebula.gruvbox",
title: "Gruvbox",
image: "gruvbox.jpeg",
author: "Nebula Services",
version: "1.0.0",
description: "The gruvbox theme",
tags: ["Theme", "Simple"],
payload: "gruvbox.css",
type: "theme"
},
{
package_name: "com.nebula.oled",
title: "Oled theme",
image: "oled.jpg",
author: "Nebula Services",
version: "1.0.0",
description: "A sleek & simple Oled theme for Nebula",
tags: ["Theme", "Simple", "Sleek"],
payload: "oled.css",
type: "theme"
},
{
package_name: "com.nebula.lightTheme",
title: "Light Theme",
image: "light.png",
author: "Nebula Services",
version: "1.0.0",
description: "A sleek light theme for Nebula",
tags: ["Theme", "Simple", "Light"],
payload: "light.css",
type: "theme"
},
{
package_name: "com.nebula.retro",
title: "Retro Theme",
image: "retro.png",
author: "Nebula Services",
version: "1.0.0",
description: "Give a retro look to Nebula",
tags: ["Theme", "Simple", "Dark", "Retro"],
payload: "retro.css",
type: "theme"
}
//To add plugins: plugin types consist of plugin-sw (workerware) & plugin-page (uv.config.inject)
];
const dbItems = await db.findAll();
if (dbItems.length === 0) {
const spinner = ora(chalk.hex("#7967dd")("Performing DB setup...")).start();
await installItems(db, items);
spinner.succeed(chalk.hex("#eb6f92")("DB setup complete!"));
}
}
export { setupDB };

169
server/marketplace.js Normal file
View file

@ -0,0 +1,169 @@
import { createWriteStream } from "node:fs";
import { constants, access, mkdir } from "node:fs/promises";
import { pipeline } from "node:stream/promises";
import { fileURLToPath } from "node:url";
import { DataTypes, Sequelize } from "sequelize";
import { parsedDoc } from "./config.js";
const db = new Sequelize(parsedDoc.db.name, parsedDoc.db.username, parsedDoc.db.password, {
host: parsedDoc.db.postgres ? `${parsedDoc.postgres.domain}` : "localhost",
port: parsedDoc.db.postgres ? parsedDoc.postgres.port : undefined,
dialect: parsedDoc.db.postgres ? "postgres" : "sqlite",
logging: parsedDoc.server.server.logging,
storage: "database.sqlite" //this is sqlite only
});
const catalogAssets = db.define("catalog_assets", {
package_name: { type: DataTypes.STRING, unique: true },
title: { type: DataTypes.TEXT },
description: { type: DataTypes.TEXT },
author: { type: DataTypes.TEXT },
image: { type: DataTypes.TEXT },
tags: { type: DataTypes.JSON, allowNull: true },
version: { type: DataTypes.TEXT },
background_image: { type: DataTypes.TEXT, allowNull: true },
background_video: { type: DataTypes.TEXT, allowNull: true },
payload: { type: DataTypes.TEXT },
type: { type: DataTypes.TEXT }
});
function marketplaceAPI(app) {
app.get("/api/catalog-stats/", (request, reply) => {
reply.send({
version: "1.0.0",
spec: "Nebula Services",
enabled: true
});
});
app.get("/api/catalog-assets/", async (request, reply) => {
try {
const { page } = request.query;
const pageNum = parseInt(page, 10) || 1;
if (pageNum < 1) {
reply.status(400).send({ error: "Page must be a positive number!" });
}
const offset = (pageNum - 1) * 20;
const totalItems = await catalogAssets.count();
const dbAssets = await catalogAssets.findAll({ offset: offset, limit: 20 });
const assets = dbAssets.reduce((acc, asset) => {
acc[asset.package_name] = {
title: asset.title,
description: asset.description,
author: asset.author,
image: asset.image,
tags: asset.tags,
version: asset.version,
background_image: asset.background_image,
background_video: asset.background_video,
payload: asset.payload,
type: asset.type
};
return acc;
}, {});
return reply.send({ assets, pages: Math.ceil(totalItems / 20) });
}
catch (error) {
return reply.status(500).send({ error: "An error occured" });
}
});
app.get("/api/packages/:package", async (request, reply) => {
try {
const packageRow = await catalogAssets.findOne({
where: { package_name: request.params.package }
});
if (!packageRow)
return reply.status(404).send({ error: "Package not found!" });
const details = {
title: packageRow.get("title"),
description: packageRow.get("description"),
image: packageRow.get("image"),
author: packageRow.get("author"),
tags: packageRow.get("tags"),
version: packageRow.get("version"),
background_image: packageRow.get("background_image"),
background_video: packageRow.get("background_video"),
payload: packageRow.get("payload"),
type: packageRow.get("type")
};
reply.send(details);
}
catch (error) {
reply.status(500).send({ error: "An unexpected error occured" });
}
});
async function verifyReq(request, upload, data) {
if (request.headers.psk !== parsedDoc.marketplace.psk) {
return { status: 403, error: new Error("PSK isn't correct!") };
}
else if (upload && !request.headers.packagename) {
return { status: 500, error: new Error("No packagename defined!") };
}
else if (upload && !data) {
return { status: 400, error: new Error("No file uploaded!") };
}
else {
return { status: 200 };
}
}
app.post("/api/upload-asset", async (request, reply) => {
const data = await request.file();
const verify = await verifyReq(request, true, data);
if (verify.error !== undefined) {
reply.status(verify.status).send({ status: verify.error.message });
}
else {
try {
await pipeline(data.file, createWriteStream(fileURLToPath(new URL(`../database_assets/${request.headers.packagename}/${data.filename}`, import.meta.url))));
}
catch (error) {
return reply.status(500).send({
status: `File couldn't be uploaded! (Package most likely doesn't exist)`
});
}
return reply.status(verify.status).send({ status: "File uploaded successfully!" });
}
});
app.post("/api/create-package", async (request, reply) => {
const verify = await verifyReq(request, false, undefined);
if (verify.error !== undefined) {
reply.status(verify.status).send({ status: verify.error.message });
}
else {
const body = {
package_name: request.body.uuid,
title: request.body.title,
image: request.body.image,
author: request.body.author,
version: request.body.version,
description: request.body.description,
tags: request.body.tags,
payload: request.body.payload,
background_video: request.body.background_video,
background_image: request.body.background_image,
type: request.body.type
};
await catalogAssets.create({
package_name: body.package_name,
title: body.title,
image: body.image,
author: body.author,
version: body.version,
description: body.description,
tags: body.tags,
payload: body.payload,
background_video: body.background_video,
background_image: body.background_image,
type: body.type
});
const assets = fileURLToPath(new URL("../database_assets", import.meta.url));
try {
await access(`${assets}/${body.package_name}/`, constants.F_OK);
return reply.status(500).send({ status: "Package already exists!" });
}
catch (err) {
await mkdir(`${assets}/${body.package_name}/`);
return reply
.status(verify.status)
.send({ status: "Package created successfully!" });
}
}
});
}
export { marketplaceAPI, db, catalogAssets };

66
server/server.js Normal file
View file

@ -0,0 +1,66 @@
import { fileURLToPath } from "node:url";
import fastifyCompress from "@fastify/compress";
import fastifyHelmet from "@fastify/helmet";
import fastifyMiddie from "@fastify/middie";
import fastifyMultipart from "@fastify/multipart";
import fastifyStatic from "@fastify/static";
import chalk from "chalk";
import Fastify from "fastify";
import gradient from "gradient-string";
//@ts-ignore WHY would I want this typechecked AT ALL
import { handler as ssrHandler } from "../dist/server/entry.mjs";
import { parsedDoc } from "./config.js";
import { setupDB } from "./dbSetup.js";
import { catalogAssets, marketplaceAPI } from "./marketplace.js";
import { serverFactory } from "./serverFactory.js";
const app = Fastify({
logger: parsedDoc.server.server.logging,
ignoreDuplicateSlashes: true,
ignoreTrailingSlash: true,
serverFactory: serverFactory
});
await app.register(fastifyCompress, {
encodings: ["br", "gzip", "deflate"]
});
await app.register(fastifyMultipart);
await app.register(fastifyHelmet, {
xPoweredBy: false,
crossOriginEmbedderPolicy: true,
crossOriginOpenerPolicy: true,
contentSecurityPolicy: false //Disabled because astro DOES NOT LIKE IT
});
await app.register(fastifyStatic, {
root: fileURLToPath(new URL("../dist/client", import.meta.url))
});
//Our marketplace API. Not middleware as I don't want to deal with that LOL. Just a function that passes our app to it.
if (parsedDoc.marketplace.enabled) {
await app.register(fastifyStatic, {
root: fileURLToPath(new URL("../database_assets", import.meta.url)),
prefix: "/packages/",
decorateReply: false
});
marketplaceAPI(app);
}
await app.register(fastifyMiddie);
app.use(ssrHandler);
const port = parseInt(process.env.PORT) || parsedDoc.server.server.port || parseInt("8080");
const titleText = `
_ _ _ _ ____ _
| \\ | | ___| |__ _ _| | __ _ / ___| ___ _ ____ _(_) ___ ___ ___
| \\| |/ _ \\ '_ \\| | | | |/ _' | \\___ \\ / _ \\ '__\\ \\ / / |/ __/ _ \\/ __|
| |\\ | __/ |_) | |_| | | (_| | ___) | __/ | \\ V /| | (_| __/\\__ \\
|_| \\_|\\___|_.__/ \\__,_|_|\\__,_| |____/ \\___|_| \\_/ |_|\\___\\___||___/
`;
const titleColors = {
purple: "#7967dd",
pink: "#eb6f92"
};
console.log(gradient(Object.values(titleColors)).multiline(titleText));
app.listen({ port: port, host: "0.0.0.0" }).then(async () => {
console.log(chalk.hex("#7967dd")(`Server listening on ${chalk.hex("#eb6f92").bold("http://localhost:" + port + "/")}`));
console.log(chalk.hex("#7967dd")(`Server also listening on ${chalk.hex("#eb6f92").bold("http://0.0.0.0:" + port + "/")}`));
if (parsedDoc.marketplace.enabled) {
await catalogAssets.sync();
await setupDB(catalogAssets);
}
});

23
server/serverFactory.js Normal file
View file

@ -0,0 +1,23 @@
import { createServer } from "node:http";
import wisp from "wisp-server-node";
import { LOG_LEVEL } from "wisp-server-node/dist/Types.js";
import { parsedDoc } from "./config.js";
const wispOptions = {
logLevel: parsedDoc.server.server.logging ? LOG_LEVEL.DEBUG : LOG_LEVEL.NONE,
pingInterval: 30,
};
const serverFactory = (handler) => {
const httpServer = createServer();
httpServer.on("request", (req, res) => {
handler(req, res);
});
httpServer.on("upgrade", (req, socket, head) => {
if (parsedDoc.server.server.wisp) {
if (req.url?.endsWith("/wisp/")) {
wisp.routeRequest(req, socket, head, wispOptions);
}
}
});
return httpServer;
};
export { serverFactory };

View file

@ -9,7 +9,7 @@ import { RxMixerVertical, RxHamburgerMenu } from "react-icons/rx";
import { RiLinksFill } from "react-icons/ri"; import { RiLinksFill } from "react-icons/ri";
import { BsQuestionLg } from "react-icons/bs"; import { BsQuestionLg } from "react-icons/bs";
import { useState } from "preact/hooks"; import { useState } from "preact/hooks";
import { Logo } from "./logo"; import { Logo } from "./Logo";
export function Header() { export function Header() {
const { t } = useTranslation(); const { t } = useTranslation();

View file

@ -8,7 +8,7 @@ export const Logo = () => {
height="400" height="400"
style="width: 100%; height: 100%;" style="width: 100%; height: 100%;"
> >
<title>nebula</title> <title>Nebula</title>
<g id="svgg"> <g id="svgg">
<path <path
id="path0" id="path0"

View file

@ -1,28 +1,25 @@
import { useState } from "preact/hooks"; import { useState } from "preact/hooks";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { HeaderRoute } from "../components/HeaderRoute"; import { HeaderRoute } from "../components/HeaderRoute";
import { LoadSuspense } from "../LoadSuspense";
import { set } from "../util/IDB"; import { set } from "../util/IDB";
import { uninstallServiceWorkers } from "../util/SWHelper"; import { uninstallServiceWorkers } from "../util/SWHelper";
import prod from "./config.json"; // Set prod to true if you wish to load balance import prod from "./config.json"; // Set prod to true if you wish to load balance
import { enc } from "../aes"; import { enc } from "../aes";
import CloakedHead from "../util/CloakedHead"; import CloakedHead from "../util/CloakedHead";
import { useEffect } from "preact/hooks"; import { useEffect } from "preact/hooks";
import { updateServiceWorkers } from "../util/SWHelper.js"; import { registerServiceWorker } from "../util/SWHelper.js";
import { setTransport } from "../util/transports";
export function Home() { export function Home() {
const [isFocused, setIsFocused] = useState(false); const [isFocused, setIsFocused] = useState(false);
const [showSuggestions, setShowSuggestions] = useState(false); const [showSuggestions, setShowSuggestions] = useState(false);
const [inputValue, setInputValue] = useState(""); const [inputValue, setInputValue] = useState("");
const [suggestions, setSuggestions] = useState([]); const [suggestions, setSuggestions] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => { useEffect(() => {
const handleLoad = () => { const handleLoad = () => {
const firstLoad = localStorage.getItem("firstLoad") || "true"; const firstLoad = localStorage.getItem("firstLoad") || "true";
console.log(firstLoad); console.log(firstLoad);
//make sure service workers are updated
//updateServiceWorkers();
//make sure transport is set
//setTransport();
if (firstLoad == "true" && prod) { if (firstLoad == "true" && prod) {
function changeBare(url: string) { function changeBare(url: string) {
set("bare", url); set("bare", url);
@ -89,9 +86,13 @@ export function Home() {
setSuggestions(newSuggestions); setSuggestions(newSuggestions);
}; };
const handleSubmit = (event) => { const handleSubmit = async (event) => {
event.preventDefault(); event.preventDefault();
setTransport(); setLoading(true);
{
loading && <LoadSuspense />;
}
await registerServiceWorker();
window.location.href = window.location.href =
"/go/" + "/go/" +
encodeURIComponent( encodeURIComponent(
@ -103,24 +104,6 @@ export function Home() {
); );
}; };
useEffect(() => {
const epoxyScript = document.createElement("script");
epoxyScript.src = "/epoxy/index.js";
epoxyScript.onload = function () {
console.log("lazy loaded epoxy");
};
const libcurlScript = document.createElement("script");
libcurlScript.src = "/libcurl/index.js";
libcurlScript.onload = function () {
console.log("lazy loaded libcurl");
};
document.body.appendChild(epoxyScript);
document.body.appendChild(libcurlScript);
}, []);
return ( return (
<HeaderRoute> <HeaderRoute>
<CloakedHead <CloakedHead
@ -167,17 +150,24 @@ export function Home() {
{showSuggestions && {showSuggestions &&
suggestions.map((suggestion, index) => ( suggestions.map((suggestion, index) => (
<a <a
onClick={() => {setTransport()}} onClick={async (event) => {
href={ event.preventDefault();
setLoading(true);
{
loading && <LoadSuspense />;
}
await registerServiceWorker();
window.location.href =
"/go/" + "/go/" +
encodeURIComponent( encodeURIComponent(
//@ts-ignore //@ts-ignore
enc( enc(
suggestion, suggestion,
window.location.origin.slice(8) + navigator.userAgent window.location.origin.slice(8) +
navigator.userAgent
).substring(10) ).substring(10)
) );
} }}
> >
<div <div
className={`font-roboto w-110 flex h-10 flex-none shrink-0 items-center justify-center border border-input-border-color bg-input p-2 text-xl text-input-text hover:bg-dropdown-option-hover-color ${ className={`font-roboto w-110 flex h-10 flex-none shrink-0 items-center justify-center border border-input-border-color bg-input p-2 text-xl text-input-text hover:bg-dropdown-option-hover-color ${

View file

@ -1,4 +1,5 @@
import { RammerheadEncode } from "../util/RammerheadEncode"; import { RammerheadEncode } from "../util/RammerheadEncode";
import { setTransport } from "../util/transports";
import { searchUtil } from "../util/searchUtil"; import { searchUtil } from "../util/searchUtil";
import { LoadSuspense } from "../LoadSuspense"; import { LoadSuspense } from "../LoadSuspense";
import { useEffect, useState } from "preact/hooks"; import { useEffect, useState } from "preact/hooks";
@ -78,8 +79,9 @@ export function ProxyFrame(props: { url: string }) {
console.error("Error fetching data:", error); console.error("Error fetching data:", error);
} }
}; };
setTransport().then(() => {
fetchData(); fetchData();
});
}, [localProxy, decodedUrl]); }, [localProxy, decodedUrl]);
if (proxyMode == "direct") { if (proxyMode == "direct") {

View file

@ -17,11 +17,11 @@ function BareInput(props: BareInputProps) {
function validateUrl(url: string) { function validateUrl(url: string) {
let finalUrl = url; let finalUrl = url;
if (url === "/bare/" || url === "/bare") { if (url === "/bare/" || url === "/bare") {
finalUrl = "/bare/"; finalUrl = location.origin + "/bare/";
return finalUrl; return finalUrl;
} }
if (url === null || url === undefined || url === "") { if (url === null || url === undefined || url === "") {
finalUrl = "/bare/"; finalUrl = location.origin + "/bare/";
return finalUrl; return finalUrl;
} }
if (!url.endsWith("/")) { if (!url.endsWith("/")) {
@ -51,7 +51,7 @@ function BareInput(props: BareInputProps) {
window.location.reload(); window.location.reload();
} else { } else {
(document.getElementById("input") as HTMLInputElement).value = (document.getElementById("input") as HTMLInputElement).value =
localStorage.getItem("bare") || "/bare/"; localStorage.getItem("bare") || location.origin + "/bare/";
toast(t("bareError"), { toast(t("bareError"), {
type: "error" type: "error"
}); });

View file

@ -117,7 +117,10 @@ const Proxy = ({ id, active }) => {
<div className="text-md p-4 font-bold text-input-text"> <div className="text-md p-4 font-bold text-input-text">
{t("settings.bare.subtitle")} {t("settings.bare.subtitle")}
</div> </div>
<BareInput placeholder="/bare/" storageKey="bare" /> <BareInput
placeholder={location.origin + "/bare/"}
storageKey="bare"
/>
</div> </div>
)} )}
{transport !== "bare" && ( {transport !== "bare" && (

View file

@ -7,24 +7,10 @@ import { Radon } from "./pages/Radon";
import { Settings } from "./pages/Settings/"; import { Settings } from "./pages/Settings/";
import { AboutBlank } from "./AboutBlank"; import { AboutBlank } from "./AboutBlank";
import { Faq } from "./pages/Faq"; import { Faq } from "./pages/Faq";
// import { registerRemoteListener } from "@mercuryworkshop/bare-mux";
import "./style.css"; import "./style.css";
import "./i18n"; import "./i18n";
export default function Routes() { export default function Routes() {
const wispUrl =
(location.protocol === "https:" ? "wss://" : "ws://") +
location.host +
"/wisp/"; // @TODO Japan - US ping
if ("serviceWorker" in navigator) {
navigator.serviceWorker.ready.then(async () => {
//await registerRemoteListener(sw.active!)
console.log("SW ready")
});
navigator.serviceWorker.register("/sw.js", {
scope: "/"
});
}
return ( return (
<LocationProvider> <LocationProvider>
<Router> <Router>

View file

@ -1,7 +1,7 @@
import { setTransport } from "./transports.ts"; async function updateServiceWorkers() {
await navigator.serviceWorker
function updateServiceWorkers() { .getRegistrations()
navigator.serviceWorker.getRegistrations().then(function (registrations) { .then(function (registrations) {
for (let registration of registrations) { for (let registration of registrations) {
registration.update(); registration.update();
console.log("Service Worker Updated"); console.log("Service Worker Updated");
@ -9,8 +9,10 @@ function updateServiceWorkers() {
}); });
} }
function uninstallServiceWorkers() { async function uninstallServiceWorkers() {
navigator.serviceWorker.getRegistrations().then(function (registrations) { await navigator.serviceWorker
.getRegistrations()
.then(function (registrations) {
for (let registration of registrations) { for (let registration of registrations) {
registration.unregister(); registration.unregister();
console.log("Service Worker Unregistered"); console.log("Service Worker Unregistered");
@ -18,15 +20,10 @@ function uninstallServiceWorkers() {
}); });
} }
function registerServiceWorker() { async function registerServiceWorker() {
if ("serviceWorker" in navigator) { if ("serviceWorker" in navigator) {
navigator.serviceWorker await navigator.serviceWorker.register("/sw.js", {
.register("/sw.js", {
scope: "/~/" scope: "/~/"
})
.then(() => {
console.log("Service worker registered successfully");
setTransport();
}); });
} }
} }

View file

@ -1,28 +1,28 @@
import { import { BareMuxConnection } from "@mercuryworkshop/bare-mux";
SetTransport,
registerRemoteListener
} from "@mercuryworkshop/bare-mux";
//import { isIOS } from "./IosDetector"; //import { isIOS } from "./IosDetector";
declare global { declare global {
interface Window { interface Window {
setTransport: () => void; setTransport: () => void;
connection: BareMuxConnection
} }
} }
function changeTransport(transport: string, wispUrl: string) { async function changeTransport(transport: string, wispUrl: string) {
switch (transport) { switch (transport) {
case "epoxy": case "epoxy":
localStorage.setItem("transport", "epoxy"); localStorage.setItem("transport", "epoxy");
console.log("Setting transport to Epoxy"); console.log("Setting transport to Epoxy");
SetTransport("EpxMod.EpoxyClient", { wisp: wispUrl }); await window.connection.setTransport("/epoxy/index.mjs", [{ wisp: wispUrl }]);
break; break;
case "libcurl": case "libcurl":
localStorage.setItem("transport", "libcurl"); localStorage.setItem("transport", "libcurl");
console.log("Setting transport to Libcurl"); console.log("Setting transport to Libcurl");
SetTransport("CurlMod.LibcurlClient", { await window.connection.setTransport("/libcurl/index.mjs", [
{
wisp: wispUrl wisp: wispUrl
}); }
]);
break; break;
case "bare": case "bare":
localStorage.setItem("transport", "bare"); localStorage.setItem("transport", "bare");
@ -30,12 +30,14 @@ function changeTransport(transport: string, wispUrl: string) {
const bare = const bare =
localStorage.getItem("bare") || window.location.origin + "/bare/"; localStorage.getItem("bare") || window.location.origin + "/bare/";
console.log("Bare URL: " + bare); console.log("Bare URL: " + bare);
SetTransport("BareMod.BareClient", bare); await window.connection.setTransport("/baremod/index.mjs", [bare]);
break; break;
default: default:
SetTransport("CurlMod.LibcurlClient", { await window.connection.setTransport("/libcurl/index.mjs", [
{
wisp: wispUrl wisp: wispUrl
}); }
]);
break; break;
} }
} }
@ -48,29 +50,11 @@ const wispUrl =
(location.protocol === "https:" ? "wss://" : "ws://") + (location.protocol === "https:" ? "wss://" : "ws://") +
location.host + location.host +
"/wisp/"; "/wisp/";
//registerRemoteListener(navigator.serviceWorker.controller!); window.connection = new BareMuxConnection("/baremux/worker.js");
//if (isIOS) {
// console.log("iOS device detected. Bare will be used.");
// changeTransport(
// localStorage.getItem("transport") || "libcurl",
// localStorage.getItem("wispUrl") || wispUrl
// );
//} else {
// changeTransport(
// localStorage.getItem("transport") || "bare",
// localStorage.getItem("wispUrl") || wispUrl
// );
//}
//changeTransport(
// localStorage.getItem("transport") || "libcurl",
// localStorage.getItem("wispUrl") || wispUrl
//);
// helper function for ../routes.tsx // helper function for ../routes.tsx
function setTransport() { async function setTransport() {
changeTransport( await changeTransport(
localStorage.getItem("transport") || "epoxy", localStorage.getItem("transport") || "epoxy",
localStorage.getItem("wispUrl") || wispUrl localStorage.getItem("wispUrl") || wispUrl
); );

View file

@ -8,6 +8,9 @@ import { dynamicPath } from "@nebula-services/dynamic";
import { epoxyPath } from "@mercuryworkshop/epoxy-transport"; import { epoxyPath } from "@mercuryworkshop/epoxy-transport";
//@ts-ignore //@ts-ignore
import { libcurlPath } from "@mercuryworkshop/libcurl-transport"; import { libcurlPath } from "@mercuryworkshop/libcurl-transport";
import { baremuxPath } from "@mercuryworkshop/bare-mux/node";
//@ts-ignore
import { bareModulePath } from "@mercuryworkshop/bare-as-module3"
import path from "path"; import path from "path";
import { createBareServer } from "@tomphttp/bare-server-node"; import { createBareServer } from "@tomphttp/bare-server-node";
import wisp from "wisp-server-node"; import wisp from "wisp-server-node";
@ -25,16 +28,27 @@ export default defineConfig({
dest: "uv", dest: "uv",
overwrite: false overwrite: false
}, },
{
src: `${baremuxPath}/**/*`.replace(/\\/g, "/"),
dest: "baremux",
overwrite: false
},
{ {
src: `${epoxyPath}/**/*`.replace(/\\/g, "/"), src: `${epoxyPath}/**/*`.replace(/\\/g, "/"),
dest: "epoxy", dest: "epoxy",
overwrite: false overwrite: false
}, },
{ {
src: `${libcurlPath}/**/*`.replace(/\\/g, "/"), src: `${libcurlPath}/**/*`.replace(/\\/g, "/"),
dest: "libcurl", dest: "libcurl",
overwrite: false overwrite: false
}, },
{
src: `${bareModulePath}/**/*`.replace(/\\/g, "/"),
dest: "baremod",
overwrite: false
},
{ {
src: `${dynamicPath}/dynamic.*.js`.replace(/\\/g, "/"), src: `${dynamicPath}/dynamic.*.js`.replace(/\\/g, "/"),
dest: "dynamic", dest: "dynamic",