mirror of
https://github.com/NebulaServices/Nebula.git
synced 2025-05-17 13:30:00 -04:00
Add files via upload
This commit is contained in:
parent
608923d7d0
commit
b21b03ae2f
20 changed files with 42249 additions and 0 deletions
12
.breakpoints
Normal file
12
.breakpoints
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"files": {
|
||||
"public/games.css": [
|
||||
{
|
||||
"id": "6e0f7b81-ddc9-45ea-88cb-d4a35adb387d",
|
||||
"line": 1,
|
||||
"version": 1,
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
2
.replit
Normal file
2
.replit
Normal file
|
@ -0,0 +1,2 @@
|
|||
language = "nodejs"
|
||||
run = "npm start"
|
7
app.json
Normal file
7
app.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"name": "Nebula",
|
||||
"description": "A site to bypass web filters, uses harmony proxy made by jango.",
|
||||
"repository": "https://github.com/jangodev",
|
||||
"logo": "https://avatars.githubusercontent.com/u/86420004?v=4",
|
||||
"keywords": ["educational", "science", "math"]
|
||||
}
|
22
index.js
Normal file
22
index.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
import Server from 'bare-server-node';
|
||||
import http from 'http';
|
||||
import nodeStatic from 'node-static';
|
||||
|
||||
const bare = new Server('/bare/', '');
|
||||
const serve = new nodeStatic.Server('static/');
|
||||
|
||||
const server = http.createServer();
|
||||
|
||||
server.on('request', (request, response) => {
|
||||
if (bare.route_request(request, response))
|
||||
return true;
|
||||
serve.serve(request, response);
|
||||
});
|
||||
|
||||
server.on('upgrade', (req, socket, head) => {
|
||||
if (bare.route_upgrade(req, socket, head))
|
||||
return;
|
||||
socket.end();
|
||||
});
|
||||
|
||||
server.listen(8080);
|
65
package-lock.json
generated
Normal file
65
package-lock.json
generated
Normal file
|
@ -0,0 +1,65 @@
|
|||
{
|
||||
"name": "nebula",
|
||||
"version": "2.3.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"bare-server-node": {
|
||||
"version": "github:tomphttp/bare-server-node#ebf421fd2a350c076e5aeea1fc8814da4f458853",
|
||||
"from": "github:tomphttp/bare-server-node",
|
||||
"requires": {
|
||||
"commander": "^9.0.0",
|
||||
"fetch-headers": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"colors": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
||||
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
|
||||
},
|
||||
"commander": {
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz",
|
||||
"integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w=="
|
||||
},
|
||||
"fetch-headers": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fetch-headers/-/fetch-headers-3.0.1.tgz",
|
||||
"integrity": "sha512-Kq+NyED/wLgT29St7aW47gAWg8EmmE5QmhwQ5RmPRULYLqpglA7Kc/ZnbqXu2vhH6mw1koikew2g94WiHLPmpA=="
|
||||
},
|
||||
"mime": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
|
||||
},
|
||||
"minimist": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
||||
},
|
||||
"node-static": {
|
||||
"version": "0.7.11",
|
||||
"resolved": "https://registry.npmjs.org/node-static/-/node-static-0.7.11.tgz",
|
||||
"integrity": "sha512-zfWC/gICcqb74D9ndyvxZWaI1jzcoHmf4UTHWQchBNuNMxdBLJMDiUgZ1tjGLEIe/BMhj2DxKD8HOuc2062pDQ==",
|
||||
"requires": {
|
||||
"colors": ">=0.6.0",
|
||||
"mime": "^1.2.9",
|
||||
"optimist": ">=0.3.4"
|
||||
}
|
||||
},
|
||||
"optimist": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
|
||||
"integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
|
||||
"requires": {
|
||||
"minimist": "~0.0.1",
|
||||
"wordwrap": "~0.0.2"
|
||||
}
|
||||
},
|
||||
"wordwrap": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
|
||||
"integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
|
||||
}
|
||||
}
|
||||
}
|
22
package.json
Normal file
22
package.json
Normal file
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"name": "nebula",
|
||||
"version": "2.3.0",
|
||||
"description": "Proxy by jango",
|
||||
"type": "module",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "test",
|
||||
"start": "node index.js"
|
||||
},
|
||||
"keywords": [
|
||||
"educational",
|
||||
"math",
|
||||
"science"
|
||||
],
|
||||
"author": "Jango",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"bare-server-node": "github:tomphttp/bare-server-node",
|
||||
"node-static": "^0.7.11"
|
||||
}
|
||||
}
|
241
static/css/main.css
Normal file
241
static/css/main.css
Normal file
|
@ -0,0 +1,241 @@
|
|||
@import url('https://fonts.googleapis.com/css2?family=Dongle&family=Roboto:wght@100&display=swap');
|
||||
|
||||
* {
|
||||
-webkit-user-select: none; /* Chrome all / Safari all */
|
||||
-moz-user-select: none; /* Firefox all */
|
||||
-ms-user-select: none; /* IE 10+ */
|
||||
user-select: none; /* Likely future */
|
||||
}
|
||||
body {
|
||||
background-color: rgb(60, 9, 108);
|
||||
margin:0;
|
||||
-webkit-background-size: cover;
|
||||
-moz-background-size: cover;
|
||||
-o-background-size: cover;
|
||||
background-size: cover;
|
||||
overflow-x: hidden;
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
|
||||
input {
|
||||
text-align: center;
|
||||
display: block;
|
||||
margin : 0 auto;
|
||||
font-family: "Roboto";
|
||||
font-weight: 90px;
|
||||
width: 300px;
|
||||
height: 50px;
|
||||
animation-name: inputwide;
|
||||
animation-duration: 2s;
|
||||
color: white;
|
||||
transition-duration: 0.5s;
|
||||
background-color: black;
|
||||
border-color: white;
|
||||
border-style: none;
|
||||
border-radius: 10px;
|
||||
font-size: 20px;
|
||||
z-index: 99999 !important;
|
||||
}
|
||||
|
||||
|
||||
#cont {
|
||||
animation-name: fadein;
|
||||
animation-duration: 2s;
|
||||
padding:23% 0;
|
||||
font-family: "Roboto";
|
||||
|
||||
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: "Roboto";
|
||||
text-align: center;
|
||||
animation-name: colorthing;
|
||||
animation-duration: 3s;
|
||||
color: #e9f5db;
|
||||
|
||||
|
||||
}
|
||||
h4 {
|
||||
font-family: "Roboto";
|
||||
text-align: right;
|
||||
animation-name: colorthing;
|
||||
animation-duration: 3s;
|
||||
color: #e9f5db;
|
||||
|
||||
|
||||
}
|
||||
.header_section_top {
|
||||
position: fixed;
|
||||
animation-name: fadein;
|
||||
animation-duration: 2s;
|
||||
width: 100%;
|
||||
float: left;
|
||||
background-color: rgb(90, 24, 154);
|
||||
clip-path: polygon(0 0, 100% 0, 96% 100%, 3% 100%);
|
||||
height: auto;
|
||||
padding: 10px 0px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.row {
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.custom_menu {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.custom_menu ul {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.custom_menu li {
|
||||
float: left;
|
||||
font-size: 16px;
|
||||
color: #f1f1f1;
|
||||
padding-left: 100px;
|
||||
padding-right: 100px;
|
||||
}
|
||||
|
||||
ul, li, ol {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
list-style: none;
|
||||
color: white;
|
||||
}
|
||||
|
||||
ul {
|
||||
display: block;
|
||||
list-style-type: disc;
|
||||
margin-block-start: 1em;
|
||||
margin-block-end: 1em;
|
||||
margin-inline-start: 0px;
|
||||
margin-inline-end: 0px;
|
||||
padding-inline-start: 40px;
|
||||
|
||||
}
|
||||
li {
|
||||
color: white;
|
||||
font-family: "Helvetica";
|
||||
/* background-color: #210535; */
|
||||
padding: 10px;
|
||||
border-radius: 10px;
|
||||
text-decoration: none;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
|
||||
a {
|
||||
color: white;
|
||||
font-family: "Helvetica";
|
||||
/* background-color: #210535; */
|
||||
padding: 10px;
|
||||
border-radius: 10px;
|
||||
text-decoration: none;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: grey;
|
||||
transition: 0.5s;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#ad {
|
||||
|
||||
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: transparent;
|
||||
border-color: #e9f5db;
|
||||
color: white;
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
transition: 0.5s;
|
||||
font-family: "Roboto";
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #e9f5db;
|
||||
border-color: #e9f5db;
|
||||
color: white;
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
canvas {
|
||||
display: block;
|
||||
vertical-align: bottom;
|
||||
z-index: -1 !important;
|
||||
}
|
||||
|
||||
|
||||
#particles-js {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: -1 !important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@keyframes inputwide {
|
||||
0% {
|
||||
width: 0px;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
50% {
|
||||
width: 200px;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
100% {
|
||||
width: 300px;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes colorthing {
|
||||
0% {
|
||||
color: #87986a;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
50% {
|
||||
color: #b5c99a;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
100% {
|
||||
color: #cfe1b9;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadein {
|
||||
0% {
|
||||
opacity: 0%;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
input:focus, textarea:focus, select:focus{
|
||||
outline: none;
|
||||
}
|
219
static/css/themes.css
Normal file
219
static/css/themes.css
Normal file
|
@ -0,0 +1,219 @@
|
|||
@import url('https://fonts.googleapis.com/css2?family=Dongle&family=Roboto:wght@100&display=swap');
|
||||
|
||||
|
||||
body {
|
||||
background-color: #718355;
|
||||
margin:0;
|
||||
-webkit-background-size: cover;
|
||||
-moz-background-size: cover;
|
||||
-o-background-size: cover;
|
||||
background-size: cover;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#cont {
|
||||
animation-name: fadein;
|
||||
animation-duration: 2s;
|
||||
padding: 200px 0;
|
||||
font-family: "Roboto";
|
||||
|
||||
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: "Roboto";
|
||||
text-align: center;
|
||||
animation-name: colorthing;
|
||||
animation-duration: 3s;
|
||||
color: #e9f5db;
|
||||
|
||||
|
||||
}
|
||||
|
||||
.header_section_top {
|
||||
position: fixed;
|
||||
animation-name: fadein;
|
||||
animation-duration: 2s;
|
||||
width: 100%;
|
||||
float: left;
|
||||
background-color: #87986a;
|
||||
clip-path: polygon(0 0, 100% 0, 96% 100%, 3% 100%);
|
||||
height: auto;
|
||||
padding: 10px 0px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
margin-right: -15px;
|
||||
margin-left: -15px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.custom_menu {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.custom_menu ul {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.custom_menu li {
|
||||
float: left;
|
||||
font-size: 16px;
|
||||
color: #f1f1f1;
|
||||
padding: 6px 10px 0px 10px;
|
||||
padding-left: 210px;
|
||||
}
|
||||
|
||||
ul, li, ol {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
list-style: none;
|
||||
color: white;
|
||||
}
|
||||
|
||||
ul {
|
||||
display: block;
|
||||
list-style-type: disc;
|
||||
margin-block-start: 1em;
|
||||
margin-block-end: 1em;
|
||||
margin-inline-start: 0px;
|
||||
margin-inline-end: 0px;
|
||||
padding-inline-start: 40px;
|
||||
|
||||
}
|
||||
li {
|
||||
color: white;
|
||||
font-family: "Helvetica";
|
||||
/* background-color: #210535; */
|
||||
padding: 10px;
|
||||
border-radius: 10px;
|
||||
text-decoration: none;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
|
||||
a {
|
||||
color: white;
|
||||
font-family: "Helvetica";
|
||||
/* background-color: #210535; */
|
||||
padding: 10px;
|
||||
border-radius: 10px;
|
||||
text-decoration: none;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: grey;
|
||||
transition: 0.5s;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
||||
button {
|
||||
display: block;
|
||||
margin: 5px auto;
|
||||
background-color: transparent;
|
||||
border-color: #e9f5db;
|
||||
color: white;
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
transition: 0.5s;
|
||||
font-family: "Roboto";
|
||||
text-align: center;
|
||||
padding: 5px;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #e9f5db;
|
||||
border-color: #e9f5db;
|
||||
color: black;
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
transition: 0.5s;
|
||||
}
|
||||
|
||||
canvas {
|
||||
display: block;
|
||||
vertical-align: bottom;
|
||||
z-index: -1 !important;
|
||||
}
|
||||
|
||||
|
||||
#particles-js {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: -1 !important;
|
||||
}
|
||||
|
||||
.foot {
|
||||
font-family: "Roboto";
|
||||
/* position: fixed; */
|
||||
color: white;
|
||||
padding: 5px;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
/* Height of the footer*/
|
||||
height: 10px;
|
||||
padding-bottom: 100px;
|
||||
|
||||
text-align: center;
|
||||
background-color: #1f1e1e;
|
||||
}
|
||||
|
||||
|
||||
@keyframes inputwide {
|
||||
0% {
|
||||
width: 0px;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
50% {
|
||||
width: 200px;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
100% {
|
||||
width: 300px;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes colorthing {
|
||||
0% {
|
||||
color: #87986a;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
50% {
|
||||
color: #b5c99a;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
|
||||
100% {
|
||||
color: #cfe1b9;
|
||||
transition-duration: 0.5s;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadein {
|
||||
0% {
|
||||
opacity: 0%;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 100%;
|
||||
}
|
||||
}
|
7
static/games/index.html
Normal file
7
static/games/index.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
|
||||
<p>Redirecting in 1 seconds</p>
|
||||
|
||||
<script>
|
||||
|
||||
setTimeout(() => { window.location = "/proxy/aHR0cHM6Ly8za2gwLmdpdGh1Yi5pbw==/"; }, 100);
|
||||
</script>
|
BIN
static/images/adtemplate.png
Normal file
BIN
static/images/adtemplate.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 54 KiB |
BIN
static/images/fav.png
Normal file
BIN
static/images/fav.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
1
static/images/git.svg
Normal file
1
static/images/git.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="github" class="svg-inline--fa fa-github fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="currentColor" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg>
|
After Width: | Height: | Size: 1.5 KiB |
190
static/index.html
Normal file
190
static/index.html
Normal file
File diff suppressed because one or more lines are too long
198
static/script.js
Normal file
198
static/script.js
Normal file
|
@ -0,0 +1,198 @@
|
|||
let advertisement = document.getElementById("ad")
|
||||
let disableadbtn = document.getElementById("disable")
|
||||
let menu = document.getElementById("header_section_top")
|
||||
|
||||
advertisement.style.display = ''
|
||||
|
||||
function toggleAds() {
|
||||
const ads = document.getElementById('ads');
|
||||
const option = sessionStorage.getItem('ads');
|
||||
if (option === 'on') {
|
||||
sessionStorage.setItem('ads', 'off');
|
||||
ads.style.color = '';
|
||||
advertisement.style.display = 'none';
|
||||
} else {
|
||||
sessionStorage.setItem('ads', 'on');
|
||||
advertisement.style.display = '';
|
||||
ads.style.color = '';
|
||||
}
|
||||
}
|
||||
|
||||
if (sessionStorage.getItem('ads') == 'off') {
|
||||
advertisement.style.display = "none"
|
||||
ads.style.color = '';
|
||||
} else {
|
||||
advertisement.style.display = ''
|
||||
ads.style.color = '';
|
||||
}
|
||||
|
||||
// document.body.style.backgroundColor = "rgb(60, 9, 108)"
|
||||
function galaxy() {
|
||||
window.localStorage.setItem('galaxy', 'true');
|
||||
document.body.style.backgroundColor = "rgb(60, 9, 108)"
|
||||
localStorage.setItem('ocean', 'false');
|
||||
menu.style.backgroundColor = "rgb(90, 24, 154)"
|
||||
window.localStorage.removeItem('ocean');
|
||||
}
|
||||
|
||||
function ocean() {
|
||||
window.localStorage.setItem('ocean', 'on');
|
||||
document.body.style.backgroundColor = "rgb(72, 202, 228)"
|
||||
localStorage.setItem('galaxy', 'false');
|
||||
window.localStorage.removeItem('galaxy');
|
||||
menu.style.backgroundColor = "rgb(144, 224, 239)"
|
||||
}
|
||||
|
||||
function classic() {
|
||||
window.localStorage.setItem('classic', 'on');
|
||||
document.body.style.backgroundColor = "rgb(113, 131, 85)"
|
||||
localStorage.setItem('galaxy', 'false');
|
||||
window.localStorage.removeItem('galaxy');
|
||||
window.localStorage.removeItem('ocean');
|
||||
menu.style.backgroundColor = "rgb(90, 24, 154)"
|
||||
menu.style.backgroundColor = "rgb(135, 152, 106)"
|
||||
}
|
||||
|
||||
function toggleNoGG() {
|
||||
const option = localStorage.getItem('nogg');
|
||||
const nogg = document.getElementById('nogg');
|
||||
if (option === 'on') {
|
||||
nogg.style.color = '';
|
||||
localStorage.setItem('nogg', 'off');
|
||||
} else {
|
||||
nogg.style.color = 'green';
|
||||
localStorage.setItem('nogg', 'on');
|
||||
}
|
||||
}
|
||||
|
||||
if (localStorage.getItem('nogg') === 'on')
|
||||
nogg.style.color = 'green';
|
||||
|
||||
if (window.localStorage.getItem('galaxy') == "true") {
|
||||
document.body.style.backgroundColor = "rgb(60, 9, 108)"
|
||||
|
||||
menu.style.backgroundColor = "rgb(90, 24, 154)"
|
||||
} else if (window.localStorage.getItem('ocean') == "on") {
|
||||
document.body.style.backgroundColor = "rgb(72, 202, 228)"
|
||||
|
||||
menu.style.backgroundColor = "rgb(144, 224, 239)"
|
||||
} else if (window.localStorage.getItem('classic') == "on") {
|
||||
menu.style.backgroundColor = "rgb(135, 152, 106)"
|
||||
document.body.style.backgroundColor = "rgb(113, 131, 85)"
|
||||
} else {
|
||||
document.body.style.backgroundColor = "rgb(60, 9, 108)"
|
||||
|
||||
menu.style.backgroundColor = "rgb(90, 24, 154)"
|
||||
}
|
||||
|
||||
particlesJS("particles-js", {
|
||||
"particles": {
|
||||
"number": {
|
||||
"value": 355,
|
||||
"density": {
|
||||
"enable": true,
|
||||
"value_area": 789.1476416322727
|
||||
}
|
||||
},
|
||||
"color": {
|
||||
"value": "#ffffff"
|
||||
},
|
||||
"shape": {
|
||||
"type": "circle",
|
||||
"stroke": {
|
||||
"width": 0,
|
||||
"color": "#000000"
|
||||
},
|
||||
"polygon": {
|
||||
"nb_sides": 5
|
||||
},
|
||||
"image": {
|
||||
"src": "img/github.svg",
|
||||
"width": 100,
|
||||
"height": 100
|
||||
}
|
||||
},
|
||||
"opacity": {
|
||||
"value": 0.48927153781200905,
|
||||
"random": false,
|
||||
"anim": {
|
||||
"enable": true,
|
||||
"speed": 0.2,
|
||||
"opacity_min": 0,
|
||||
"sync": false
|
||||
}
|
||||
},
|
||||
"size": {
|
||||
"value": 2,
|
||||
"random": true,
|
||||
"anim": {
|
||||
"enable": true,
|
||||
"speed": 2,
|
||||
"size_min": 0,
|
||||
"sync": false
|
||||
}
|
||||
},
|
||||
"line_linked": {
|
||||
"enable": false,
|
||||
"distance": 150,
|
||||
"color": "#ffffff",
|
||||
"opacity": 0.4,
|
||||
"width": 1
|
||||
},
|
||||
"move": {
|
||||
"enable": true,
|
||||
"speed": 0.2,
|
||||
"direction": "none",
|
||||
"random": true,
|
||||
"straight": false,
|
||||
"out_mode": "out",
|
||||
"bounce": false,
|
||||
"attract": {
|
||||
"enable": false,
|
||||
"rotateX": 600,
|
||||
"rotateY": 1200
|
||||
}
|
||||
}
|
||||
},
|
||||
"interactivity": {
|
||||
"detect_on": "canvas",
|
||||
"events": {
|
||||
"onhover": {
|
||||
"enable": true,
|
||||
"mode": "bubble"
|
||||
},
|
||||
"onclick": {
|
||||
"enable": true,
|
||||
"mode": "push"
|
||||
},
|
||||
"resize": true
|
||||
},
|
||||
"modes": {
|
||||
"grab": {
|
||||
"distance": 400,
|
||||
"line_linked": {
|
||||
"opacity": 1
|
||||
}
|
||||
},
|
||||
"bubble": {
|
||||
"distance": 83.91608391608392,
|
||||
"size": 1,
|
||||
"duration": 3,
|
||||
"opacity": 1,
|
||||
"speed": 3
|
||||
},
|
||||
"repulse": {
|
||||
"distance": 200,
|
||||
"duration": 0.4
|
||||
},
|
||||
"push": {
|
||||
"particles_nb": 4
|
||||
},
|
||||
"remove": {
|
||||
"particles_nb": 2
|
||||
}
|
||||
}
|
||||
},
|
||||
"retina_detect": true
|
||||
});
|
||||
|
5
static/sw.js
Normal file
5
static/sw.js
Normal file
|
@ -0,0 +1,5 @@
|
|||
importScripts('./uv/uv.sw.js');
|
||||
|
||||
const sw = new UVServiceWorker();
|
||||
|
||||
self.addEventListener('fetch', event => event.respondWith(sw.fetch(event)));
|
26
static/themes.html
Normal file
26
static/themes.html
Normal file
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nebula</title>
|
||||
<link rel="stylesheet" href="/css/themes.css">
|
||||
<link rel="icon" type="image/x-icon" href="/images/fav.png">
|
||||
</head>
|
||||
<body>
|
||||
<!-- particles.js container -->
|
||||
<div id="particles-js"></div>
|
||||
<!-- particles.js lib - https://github.com/VincentGarreau/particles.js -->
|
||||
<script src="https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>
|
||||
<a href='/'>
|
||||
<button id='back' onclick="redirect()">Back</button>
|
||||
</a>
|
||||
<h1>Themes</h1>
|
||||
<button id="galaxy" onclick="galaxy()">Galaxy Mode</button>
|
||||
<button id="ocean" onclick="ocean()">Ocean Mode</button>
|
||||
<button id="classic" onclick="classic()">Classic Mode</button>
|
||||
<script src="script.js">
|
||||
function redirect() {
|
||||
window.location.href = "/";
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
<html>
|
39304
static/uv/uv.bundle.js
Normal file
39304
static/uv/uv.bundle.js
Normal file
File diff suppressed because one or more lines are too long
10
static/uv/uv.config.js
Normal file
10
static/uv/uv.config.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
self.__uv$config = {
|
||||
prefix: '/go/',
|
||||
bare: '/bare/',
|
||||
encodeUrl: Ultraviolet.codec.xor.encode,
|
||||
decodeUrl: Ultraviolet.codec.xor.decode,
|
||||
handler: '/uv/uv.handler.js',
|
||||
bundle: '/uv/uv.bundle.js',
|
||||
config: '/uv/uv.config.js',
|
||||
sw: '/uv/uv.sw.js',
|
||||
};
|
1129
static/uv/uv.handler.js
Normal file
1129
static/uv/uv.handler.js
Normal file
File diff suppressed because it is too large
Load diff
789
static/uv/uv.sw.js
Normal file
789
static/uv/uv.sw.js
Normal file
|
@ -0,0 +1,789 @@
|
|||
importScripts('/uv/uv.bundle.js');
|
||||
importScripts('/uv/uv.config.js');
|
||||
|
||||
class UVServiceWorker extends EventEmitter {
|
||||
constructor(config = __uv$config) {
|
||||
super();
|
||||
if (!config.bare) config.bare = '/bare/';
|
||||
this.addresses = typeof config.bare === 'string' ? [ new URL(config.bare, location) ] : config.bare.map(str => new URL(str, location));
|
||||
this.headers = {
|
||||
csp: [
|
||||
'cross-origin-embedder-policy',
|
||||
'cross-origin-opener-policy',
|
||||
'cross-origin-resource-policy',
|
||||
'content-security-policy',
|
||||
'content-security-policy-report-only',
|
||||
'expect-ct',
|
||||
'feature-policy',
|
||||
'origin-isolation',
|
||||
'strict-transport-security',
|
||||
'upgrade-insecure-requests',
|
||||
'x-content-type-options',
|
||||
'x-download-options',
|
||||
'x-frame-options',
|
||||
'x-permitted-cross-domain-policies',
|
||||
'x-powered-by',
|
||||
'x-xss-protection',
|
||||
],
|
||||
forward: [
|
||||
'accept-encoding',
|
||||
'connection',
|
||||
'content-length',
|
||||
],
|
||||
};
|
||||
this.method = {
|
||||
empty: [
|
||||
'GET',
|
||||
'HEAD'
|
||||
]
|
||||
};
|
||||
this.statusCode = {
|
||||
empty: [
|
||||
204,
|
||||
304,
|
||||
],
|
||||
};
|
||||
this.config = config;
|
||||
this.browser = Ultraviolet.Bowser.getParser(self.navigator.userAgent).getBrowserName();
|
||||
|
||||
if (this.browser === 'Firefox') {
|
||||
this.headers.forward.push('user-agent');
|
||||
this.headers.forward.push('content-type');
|
||||
};
|
||||
};
|
||||
async fetch({ request }) {
|
||||
if (!request.url.startsWith(location.origin + (this.config.prefix || '/service/'))) {
|
||||
return fetch(request);
|
||||
};
|
||||
try {
|
||||
|
||||
const ultraviolet = new Ultraviolet(this.config);
|
||||
|
||||
if (typeof this.config.construct === 'function') {
|
||||
this.config.construct(ultraviolet, 'service');
|
||||
};
|
||||
|
||||
const db = await ultraviolet.cookie.db();
|
||||
|
||||
ultraviolet.meta.origin = location.origin;
|
||||
ultraviolet.meta.base = ultraviolet.meta.url = new URL(ultraviolet.sourceUrl(request.url));
|
||||
|
||||
const requestCtx = new RequestContext(
|
||||
request,
|
||||
this,
|
||||
ultraviolet,
|
||||
!this.method.empty.includes(request.method.toUpperCase()) ? await request.blob() : null
|
||||
);
|
||||
|
||||
if (ultraviolet.meta.url.protocol === 'blob:') {
|
||||
requestCtx.blob = true;
|
||||
requestCtx.base = requestCtx.url = new URL(requestCtx.url.pathname);
|
||||
};
|
||||
|
||||
if (request.referrer && request.referrer.startsWith(location.origin)) {
|
||||
const referer = new URL(ultraviolet.sourceUrl(request.referrer));
|
||||
|
||||
if (requestCtx.headers.origin || ultraviolet.meta.url.origin !== referer.origin && request.mode === 'cors') {
|
||||
requestCtx.headers.origin = referer.origin;
|
||||
};
|
||||
|
||||
requestCtx.headers.referer = referer.href;
|
||||
};
|
||||
|
||||
const cookies = await ultraviolet.cookie.getCookies(db) || [];
|
||||
const cookieStr = ultraviolet.cookie.serialize(cookies, ultraviolet.meta, false);
|
||||
|
||||
if (this.browser === 'Firefox' && !(request.destination === 'iframe' || request.destination === 'document')) {
|
||||
requestCtx.forward.shift();
|
||||
};
|
||||
|
||||
if (cookieStr) requestCtx.headers.cookie = cookieStr;
|
||||
requestCtx.headers.Host = requestCtx.url.host;
|
||||
|
||||
|
||||
const reqEvent = new HookEvent(requestCtx, null, null);
|
||||
this.emit('request', reqEvent);
|
||||
|
||||
if (reqEvent.intercepted) return reqEvent.returnValue;
|
||||
|
||||
const response = await fetch(requestCtx.send);
|
||||
|
||||
if (response.status === 500) {
|
||||
return Promise.reject('');
|
||||
};
|
||||
|
||||
const responseCtx = new ResponseContext(requestCtx, response, this);
|
||||
const resEvent = new HookEvent(responseCtx, null, null);
|
||||
|
||||
this.emit('beforemod', resEvent);
|
||||
if (resEvent.intercepted) return resEvent.returnValue;
|
||||
|
||||
for (const name of this.headers.csp) {
|
||||
if (responseCtx.headers[name]) delete responseCtx.headers[name];
|
||||
};
|
||||
|
||||
if (responseCtx.headers.location) {
|
||||
responseCtx.headers.location = ultraviolet.rewriteUrl(responseCtx.headers.location);
|
||||
};
|
||||
|
||||
if (responseCtx.headers['set-cookie']) {
|
||||
Promise.resolve(ultraviolet.cookie.setCookies(responseCtx.headers['set-cookie'], db, ultraviolet.meta)).then(() => {
|
||||
self.clients.matchAll().then(function (clients){
|
||||
clients.forEach(function(client){
|
||||
client.postMessage({
|
||||
msg: 'updateCookies',
|
||||
url: ultraviolet.meta.url.href,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
delete responseCtx.headers['set-cookie'];
|
||||
};
|
||||
|
||||
if (responseCtx.body) {
|
||||
switch(request.destination) {
|
||||
case 'script':
|
||||
case 'worker':
|
||||
responseCtx.body = `if (!self.__uv && self.importScripts) importScripts('${__uv$config.bundle}', '${__uv$config.config}', '${__uv$config.handler}');\n`;
|
||||
responseCtx.body += ultraviolet.js.rewrite(
|
||||
await response.text()
|
||||
);
|
||||
break;
|
||||
case 'style':
|
||||
responseCtx.body = ultraviolet.rewriteCSS(
|
||||
await response.text()
|
||||
);
|
||||
break;
|
||||
case 'iframe':
|
||||
case 'document':
|
||||
if (isHtml(ultraviolet.meta.url, (responseCtx.headers['content-type'] || ''))) {
|
||||
responseCtx.body = ultraviolet.rewriteHtml(
|
||||
await response.text(),
|
||||
{
|
||||
document: true ,
|
||||
injectHead: ultraviolet.createHtmlInject(
|
||||
this.config.handler,
|
||||
this.config.bundle,
|
||||
this.config.config,
|
||||
ultraviolet.cookie.serialize(cookies, ultraviolet.meta, true),
|
||||
request.referrer
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
if (requestCtx.headers.accept === 'text/event-stream') {
|
||||
responseCtx.headers['content-type'] = 'text/event-stream';
|
||||
};
|
||||
|
||||
this.emit('response', resEvent);
|
||||
if (resEvent.intercepted) return resEvent.returnValue;
|
||||
|
||||
return new Response(responseCtx.body, {
|
||||
headers: responseCtx.headers,
|
||||
status: responseCtx.status,
|
||||
statusText: responseCtx.statusText,
|
||||
});
|
||||
|
||||
} catch(err) {
|
||||
return new Response(err.toString(), {
|
||||
status: 500,
|
||||
});
|
||||
};
|
||||
};
|
||||
getBarerResponse(response) {
|
||||
const headers = {};
|
||||
const raw = JSON.parse(response.headers.get('x-bare-headers'));
|
||||
|
||||
for (const key in raw) {
|
||||
headers[key.toLowerCase()] = raw[key];
|
||||
};
|
||||
|
||||
return {
|
||||
headers,
|
||||
status: +response.headers.get('x-bare-status'),
|
||||
statusText: response.headers.get('x-bare-status-text'),
|
||||
body: !this.statusCode.empty.includes(+response.headers.get('x-bare-status')) ? response.body : null,
|
||||
};
|
||||
};
|
||||
get address() {
|
||||
return this.addresses[Math.floor(Math.random() * this.addresses.length)];
|
||||
};
|
||||
static Ultraviolet = Ultraviolet;
|
||||
};
|
||||
|
||||
self.UVServiceWorker = UVServiceWorker;
|
||||
|
||||
|
||||
class ResponseContext {
|
||||
constructor(request, response, worker) {
|
||||
const { headers, status, statusText, body } = !request.blob ? worker.getBarerResponse(response) : {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
headers: Object.fromEntries([...response.headers.entries()]),
|
||||
body: response.body,
|
||||
};
|
||||
this.request = request;
|
||||
this.raw = response;
|
||||
this.ultraviolet = request.ultraviolet;
|
||||
this.headers = headers;
|
||||
this.status = status;
|
||||
this.statusText = statusText;
|
||||
this.body = body;
|
||||
};
|
||||
get url() {
|
||||
return this.request.url;
|
||||
}
|
||||
get base() {
|
||||
return this.request.base;
|
||||
};
|
||||
set base(val) {
|
||||
this.request.base = val;
|
||||
};
|
||||
};
|
||||
|
||||
class RequestContext {
|
||||
constructor(request, worker, ultraviolet, body = null) {
|
||||
this.ultraviolet = ultraviolet;
|
||||
this.request = request;
|
||||
this.headers = Object.fromEntries([...request.headers.entries()]);
|
||||
this.method = request.method;
|
||||
this.forward = [...worker.headers.forward];
|
||||
this.address = worker.address;
|
||||
this.body = body || null;
|
||||
this.redirect = request.redirect;
|
||||
this.credentials = 'omit';
|
||||
this.mode = request.mode === 'cors' ? request.mode : 'same-origin';
|
||||
this.blob = false;
|
||||
};
|
||||
get send() {
|
||||
return new Request((!this.blob ? this.address.href + 'v1/' : 'blob:' + location.origin + this.url.pathname), {
|
||||
method: this.method,
|
||||
headers: {
|
||||
'x-bare-protocol': this.url.protocol,
|
||||
'x-bare-host': this.url.hostname,
|
||||
'x-bare-path': this.url.pathname + this.url.search,
|
||||
'x-bare-port': this.url.port || (this.url.protocol === 'https:' ? '443' : '80'),
|
||||
'x-bare-headers': JSON.stringify(this.headers),
|
||||
'x-bare-forward-headers': JSON.stringify(this.forward),
|
||||
},
|
||||
redirect: this.redirect,
|
||||
credentials: this.credentials,
|
||||
mode: location.origin !== this.address.origin ? 'cors' : this.mode,
|
||||
body: this.body
|
||||
});
|
||||
};
|
||||
get url() {
|
||||
return this.ultraviolet.meta.url;
|
||||
};
|
||||
set url(val) {
|
||||
this.ultraviolet.meta.url = val;
|
||||
};
|
||||
get base() {
|
||||
return this.ultraviolet.meta.base;
|
||||
};
|
||||
set base(val) {
|
||||
this.ultraviolet.meta.base = val;
|
||||
};
|
||||
}
|
||||
|
||||
function isHtml(url, contentType = '') {
|
||||
return (Ultraviolet.mime.contentType((contentType || url.pathname)) || 'text/html').split(';')[0] === 'text/html';
|
||||
};
|
||||
|
||||
class HookEvent {
|
||||
#intercepted;
|
||||
#returnValue;
|
||||
constructor(data = {}, target = null, that = null) {
|
||||
this.#intercepted = false;
|
||||
this.#returnValue = null;
|
||||
this.data = data;
|
||||
this.target = target;
|
||||
this.that = that;
|
||||
};
|
||||
get intercepted() {
|
||||
return this.#intercepted;
|
||||
};
|
||||
get returnValue() {
|
||||
return this.#returnValue;
|
||||
};
|
||||
respondWith(input) {
|
||||
this.#returnValue = input;
|
||||
this.#intercepted = true;
|
||||
};
|
||||
};
|
||||
|
||||
var R = typeof Reflect === 'object' ? Reflect : null
|
||||
var ReflectApply = R && typeof R.apply === 'function'
|
||||
? R.apply
|
||||
: function ReflectApply(target, receiver, args) {
|
||||
return Function.prototype.apply.call(target, receiver, args);
|
||||
}
|
||||
|
||||
var ReflectOwnKeys
|
||||
if (R && typeof R.ownKeys === 'function') {
|
||||
ReflectOwnKeys = R.ownKeys
|
||||
} else if (Object.getOwnPropertySymbols) {
|
||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
||||
return Object.getOwnPropertyNames(target)
|
||||
.concat(Object.getOwnPropertySymbols(target));
|
||||
};
|
||||
} else {
|
||||
ReflectOwnKeys = function ReflectOwnKeys(target) {
|
||||
return Object.getOwnPropertyNames(target);
|
||||
};
|
||||
}
|
||||
|
||||
function ProcessEmitWarning(warning) {
|
||||
if (console && console.warn) console.warn(warning);
|
||||
}
|
||||
|
||||
var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
|
||||
return value !== value;
|
||||
}
|
||||
|
||||
function EventEmitter() {
|
||||
EventEmitter.init.call(this);
|
||||
}
|
||||
|
||||
// Backwards-compat with node 0.10.x
|
||||
EventEmitter.EventEmitter = EventEmitter;
|
||||
|
||||
EventEmitter.prototype._events = undefined;
|
||||
EventEmitter.prototype._eventsCount = 0;
|
||||
EventEmitter.prototype._maxListeners = undefined;
|
||||
|
||||
// By default EventEmitters will print a warning if more than 10 listeners are
|
||||
// added to it. This is a useful default which helps finding memory leaks.
|
||||
var defaultMaxListeners = 10;
|
||||
|
||||
function checkListener(listener) {
|
||||
if (typeof listener !== 'function') {
|
||||
throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
|
||||
}
|
||||
}
|
||||
|
||||
Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
return defaultMaxListeners;
|
||||
},
|
||||
set: function(arg) {
|
||||
if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
|
||||
throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
|
||||
}
|
||||
defaultMaxListeners = arg;
|
||||
}
|
||||
});
|
||||
|
||||
EventEmitter.init = function() {
|
||||
|
||||
if (this._events === undefined ||
|
||||
this._events === Object.getPrototypeOf(this)._events) {
|
||||
this._events = Object.create(null);
|
||||
this._eventsCount = 0;
|
||||
}
|
||||
|
||||
this._maxListeners = this._maxListeners || undefined;
|
||||
};
|
||||
|
||||
// Obviously not all Emitters should be limited to 10. This function allows
|
||||
// that to be increased. Set to zero for unlimited.
|
||||
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
||||
if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
|
||||
throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
|
||||
}
|
||||
this._maxListeners = n;
|
||||
return this;
|
||||
};
|
||||
|
||||
function _getMaxListeners(that) {
|
||||
if (that._maxListeners === undefined)
|
||||
return EventEmitter.defaultMaxListeners;
|
||||
return that._maxListeners;
|
||||
}
|
||||
|
||||
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
||||
return _getMaxListeners(this);
|
||||
};
|
||||
|
||||
EventEmitter.prototype.emit = function emit(type) {
|
||||
var args = [];
|
||||
for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
|
||||
var doError = (type === 'error');
|
||||
|
||||
var events = this._events;
|
||||
if (events !== undefined)
|
||||
doError = (doError && events.error === undefined);
|
||||
else if (!doError)
|
||||
return false;
|
||||
|
||||
// If there is no 'error' event listener then throw.
|
||||
if (doError) {
|
||||
var er;
|
||||
if (args.length > 0)
|
||||
er = args[0];
|
||||
if (er instanceof Error) {
|
||||
// Note: The comments on the `throw` lines are intentional, they show
|
||||
// up in Node's output if this results in an unhandled exception.
|
||||
throw er; // Unhandled 'error' event
|
||||
}
|
||||
// At least give some kind of context to the user
|
||||
var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
|
||||
err.context = er;
|
||||
throw err; // Unhandled 'error' event
|
||||
}
|
||||
|
||||
var handler = events[type];
|
||||
|
||||
if (handler === undefined)
|
||||
return false;
|
||||
|
||||
if (typeof handler === 'function') {
|
||||
ReflectApply(handler, this, args);
|
||||
} else {
|
||||
var len = handler.length;
|
||||
var listeners = arrayClone(handler, len);
|
||||
for (var i = 0; i < len; ++i)
|
||||
ReflectApply(listeners[i], this, args);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
function _addListener(target, type, listener, prepend) {
|
||||
var m;
|
||||
var events;
|
||||
var existing;
|
||||
|
||||
checkListener(listener);
|
||||
|
||||
events = target._events;
|
||||
if (events === undefined) {
|
||||
events = target._events = Object.create(null);
|
||||
target._eventsCount = 0;
|
||||
} else {
|
||||
// To avoid recursion in the case that type === "newListener"! Before
|
||||
// adding it to the listeners, first emit "newListener".
|
||||
if (events.newListener !== undefined) {
|
||||
target.emit('newListener', type,
|
||||
listener.listener ? listener.listener : listener);
|
||||
|
||||
// Re-assign `events` because a newListener handler could have caused the
|
||||
// this._events to be assigned to a new object
|
||||
events = target._events;
|
||||
}
|
||||
existing = events[type];
|
||||
}
|
||||
|
||||
if (existing === undefined) {
|
||||
// Optimize the case of one listener. Don't need the extra array object.
|
||||
existing = events[type] = listener;
|
||||
++target._eventsCount;
|
||||
} else {
|
||||
if (typeof existing === 'function') {
|
||||
// Adding the second element, need to change to array.
|
||||
existing = events[type] =
|
||||
prepend ? [listener, existing] : [existing, listener];
|
||||
// If we've already got an array, just append.
|
||||
} else if (prepend) {
|
||||
existing.unshift(listener);
|
||||
} else {
|
||||
existing.push(listener);
|
||||
}
|
||||
|
||||
// Check for listener leak
|
||||
m = _getMaxListeners(target);
|
||||
if (m > 0 && existing.length > m && !existing.warned) {
|
||||
existing.warned = true;
|
||||
// No error code for this since it is a Warning
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
var w = new Error('Possible EventEmitter memory leak detected. ' +
|
||||
existing.length + ' ' + String(type) + ' listeners ' +
|
||||
'added. Use emitter.setMaxListeners() to ' +
|
||||
'increase limit');
|
||||
w.name = 'MaxListenersExceededWarning';
|
||||
w.emitter = target;
|
||||
w.type = type;
|
||||
w.count = existing.length;
|
||||
ProcessEmitWarning(w);
|
||||
}
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
EventEmitter.prototype.addListener = function addListener(type, listener) {
|
||||
return _addListener(this, type, listener, false);
|
||||
};
|
||||
|
||||
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
||||
|
||||
EventEmitter.prototype.prependListener =
|
||||
function prependListener(type, listener) {
|
||||
return _addListener(this, type, listener, true);
|
||||
};
|
||||
|
||||
function onceWrapper() {
|
||||
if (!this.fired) {
|
||||
this.target.removeListener(this.type, this.wrapFn);
|
||||
this.fired = true;
|
||||
if (arguments.length === 0)
|
||||
return this.listener.call(this.target);
|
||||
return this.listener.apply(this.target, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
function _onceWrap(target, type, listener) {
|
||||
var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
|
||||
var wrapped = onceWrapper.bind(state);
|
||||
wrapped.listener = listener;
|
||||
state.wrapFn = wrapped;
|
||||
return wrapped;
|
||||
}
|
||||
|
||||
EventEmitter.prototype.once = function once(type, listener) {
|
||||
checkListener(listener);
|
||||
this.on(type, _onceWrap(this, type, listener));
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.prependOnceListener =
|
||||
function prependOnceListener(type, listener) {
|
||||
checkListener(listener);
|
||||
this.prependListener(type, _onceWrap(this, type, listener));
|
||||
return this;
|
||||
};
|
||||
|
||||
// Emits a 'removeListener' event if and only if the listener was removed.
|
||||
EventEmitter.prototype.removeListener =
|
||||
function removeListener(type, listener) {
|
||||
var list, events, position, i, originalListener;
|
||||
|
||||
checkListener(listener);
|
||||
|
||||
events = this._events;
|
||||
if (events === undefined)
|
||||
return this;
|
||||
|
||||
list = events[type];
|
||||
if (list === undefined)
|
||||
return this;
|
||||
|
||||
if (list === listener || list.listener === listener) {
|
||||
if (--this._eventsCount === 0)
|
||||
this._events = Object.create(null);
|
||||
else {
|
||||
delete events[type];
|
||||
if (events.removeListener)
|
||||
this.emit('removeListener', type, list.listener || listener);
|
||||
}
|
||||
} else if (typeof list !== 'function') {
|
||||
position = -1;
|
||||
|
||||
for (i = list.length - 1; i >= 0; i--) {
|
||||
if (list[i] === listener || list[i].listener === listener) {
|
||||
originalListener = list[i].listener;
|
||||
position = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (position < 0)
|
||||
return this;
|
||||
|
||||
if (position === 0)
|
||||
list.shift();
|
||||
else {
|
||||
spliceOne(list, position);
|
||||
}
|
||||
|
||||
if (list.length === 1)
|
||||
events[type] = list[0];
|
||||
|
||||
if (events.removeListener !== undefined)
|
||||
this.emit('removeListener', type, originalListener || listener);
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
||||
|
||||
EventEmitter.prototype.removeAllListeners =
|
||||
function removeAllListeners(type) {
|
||||
var listeners, events, i;
|
||||
|
||||
events = this._events;
|
||||
if (events === undefined)
|
||||
return this;
|
||||
|
||||
// not listening for removeListener, no need to emit
|
||||
if (events.removeListener === undefined) {
|
||||
if (arguments.length === 0) {
|
||||
this._events = Object.create(null);
|
||||
this._eventsCount = 0;
|
||||
} else if (events[type] !== undefined) {
|
||||
if (--this._eventsCount === 0)
|
||||
this._events = Object.create(null);
|
||||
else
|
||||
delete events[type];
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
// emit removeListener for all listeners on all events
|
||||
if (arguments.length === 0) {
|
||||
var keys = Object.keys(events);
|
||||
var key;
|
||||
for (i = 0; i < keys.length; ++i) {
|
||||
key = keys[i];
|
||||
if (key === 'removeListener') continue;
|
||||
this.removeAllListeners(key);
|
||||
}
|
||||
this.removeAllListeners('removeListener');
|
||||
this._events = Object.create(null);
|
||||
this._eventsCount = 0;
|
||||
return this;
|
||||
}
|
||||
|
||||
listeners = events[type];
|
||||
|
||||
if (typeof listeners === 'function') {
|
||||
this.removeListener(type, listeners);
|
||||
} else if (listeners !== undefined) {
|
||||
// LIFO order
|
||||
for (i = listeners.length - 1; i >= 0; i--) {
|
||||
this.removeListener(type, listeners[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
function _listeners(target, type, unwrap) {
|
||||
var events = target._events;
|
||||
|
||||
if (events === undefined)
|
||||
return [];
|
||||
|
||||
var evlistener = events[type];
|
||||
if (evlistener === undefined)
|
||||
return [];
|
||||
|
||||
if (typeof evlistener === 'function')
|
||||
return unwrap ? [evlistener.listener || evlistener] : [evlistener];
|
||||
|
||||
return unwrap ?
|
||||
unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
|
||||
}
|
||||
|
||||
EventEmitter.prototype.listeners = function listeners(type) {
|
||||
return _listeners(this, type, true);
|
||||
};
|
||||
|
||||
EventEmitter.prototype.rawListeners = function rawListeners(type) {
|
||||
return _listeners(this, type, false);
|
||||
};
|
||||
|
||||
EventEmitter.listenerCount = function(emitter, type) {
|
||||
if (typeof emitter.listenerCount === 'function') {
|
||||
return emitter.listenerCount(type);
|
||||
} else {
|
||||
return listenerCount.call(emitter, type);
|
||||
}
|
||||
};
|
||||
|
||||
EventEmitter.prototype.listenerCount = listenerCount;
|
||||
function listenerCount(type) {
|
||||
var events = this._events;
|
||||
|
||||
if (events !== undefined) {
|
||||
var evlistener = events[type];
|
||||
|
||||
if (typeof evlistener === 'function') {
|
||||
return 1;
|
||||
} else if (evlistener !== undefined) {
|
||||
return evlistener.length;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EventEmitter.prototype.eventNames = function eventNames() {
|
||||
return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
|
||||
};
|
||||
|
||||
function arrayClone(arr, n) {
|
||||
var copy = new Array(n);
|
||||
for (var i = 0; i < n; ++i)
|
||||
copy[i] = arr[i];
|
||||
return copy;
|
||||
}
|
||||
|
||||
function spliceOne(list, index) {
|
||||
for (; index + 1 < list.length; index++)
|
||||
list[index] = list[index + 1];
|
||||
list.pop();
|
||||
}
|
||||
|
||||
function unwrapListeners(arr) {
|
||||
var ret = new Array(arr.length);
|
||||
for (var i = 0; i < ret.length; ++i) {
|
||||
ret[i] = arr[i].listener || arr[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
function once(emitter, name) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
function errorListener(err) {
|
||||
emitter.removeListener(name, resolver);
|
||||
reject(err);
|
||||
}
|
||||
|
||||
function resolver() {
|
||||
if (typeof emitter.removeListener === 'function') {
|
||||
emitter.removeListener('error', errorListener);
|
||||
}
|
||||
resolve([].slice.call(arguments));
|
||||
};
|
||||
|
||||
eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
|
||||
if (name !== 'error') {
|
||||
addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
|
||||
if (typeof emitter.on === 'function') {
|
||||
eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
|
||||
}
|
||||
}
|
||||
|
||||
function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
|
||||
if (typeof emitter.on === 'function') {
|
||||
if (flags.once) {
|
||||
emitter.once(name, listener);
|
||||
} else {
|
||||
emitter.on(name, listener);
|
||||
}
|
||||
} else if (typeof emitter.addEventListener === 'function') {
|
||||
// EventTarget does not have `error` event semantics like Node
|
||||
// EventEmitters, we do not listen for `error` events here.
|
||||
emitter.addEventListener(name, function wrapListener(arg) {
|
||||
// IE does not have builtin `{ once: true }` support so we
|
||||
// have to do it manually.
|
||||
if (flags.once) {
|
||||
emitter.removeEventListener(name, wrapListener);
|
||||
}
|
||||
listener(arg);
|
||||
});
|
||||
} else {
|
||||
throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue