1
0
Fork 0
forked from svrjs/svrjs

Update to SVR.JS 3.9.4

This commit is contained in:
Dorian Niemiec 2023-09-08 20:20:40 +02:00
parent 7587932250
commit faa043cb99
33 changed files with 40 additions and 1443 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

View file

@ -1,124 +0,0 @@
//Base64.js for hexstrbase64 library for Node.js
/*
* Copyright (c) 2012 Miles Shang <mail@mshang.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Usage:
* Set your settings:
* base64.settings.char62 = "-";
* base64.settings.char63 = "_";
* etc.
*
* Then:
* base64.encode(str) takes a string and returns the base64 encoding of it.
* base64.decode(str) does the reverse.
*/
/* TODO:
* Add a "padding_mandatory" flag to check for bad padding in the decoder.
* Add test cases that throw errors.
*/
var base64 = new Object();
base64.settings = { // defaults
"char62" : "+",
"char63" : "/",
"pad" : "=",
"ascii" : false
};
/*
* Settings:
* If "pad" is not null or undefined, then it will be used for encoding.
*
* If "ascii" is set to true, then the encoder
* will assume that plaintext is in 8-bit chars (the standard).
* In this case, for every 3 chars in plaintext, you get 4 chars of base64.
* Any non-8-bit chars will cause an error.
* Otherwise, assume that all plaintext can be in the full range
* of Javascript chars, i.e. 16 bits. Get 8 chars of base64 for 3 chars
* of plaintext. Any possible JS string can be encoded.
*/
base64.encode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
for (var i = 0; i < str.length; ++i) {
var c_num = str.charCodeAt(i);
if (this.settings.ascii)
if (c_num >= 256)
throw "Not an 8-bit char.";
var c_bin = c_num.toString(2);
while (c_bin.length < (this.settings.ascii ? 8 : 16))
c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= 6) {
var sextet = buf.slice(0, 6);
buf = buf.slice(6);
output += this.char_set.charAt(parseInt(sextet, 2));
}
}
if (buf) { // not empty
while (buf.length < 6) buf += "0";
output += this.char_set.charAt(parseInt(buf, 2));
}
if (this.settings.pad)
while (output.length % (this.settings.ascii ? 4 : 8) != 0)
output += this.settings.pad;
return output;
}
base64.decode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
var bits = (this.settings.ascii ? 8 : 16);
for (var i = 0; i < str.length; ++i) {
if (str[i] == this.settings.pad) break;
var c_num = this.char_set.indexOf(str.charAt(i));
if (c_num == -1) throw "Not base64.";
var c_bin = c_num.toString(2);
while (c_bin.length < 6) c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= bits) {
var octet = buf.slice(0, bits);
buf = buf.slice(bits);
output += String.fromCharCode(parseInt(octet, 2));
}
}
return output;
}
module.exports = base64;

View file

@ -1,123 +0,0 @@
//Base64.js for hexstrbase64 library for browser
/*
* Copyright (c) 2012 Miles Shang <mail@mshang.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Usage:
* Set your settings:
* base64.settings.char62 = "-";
* base64.settings.char63 = "_";
* etc.
*
* Then:
* base64.encode(str) takes a string and returns the base64 encoding of it.
* base64.decode(str) does the reverse.
*/
/* TODO:
* Add a "padding_mandatory" flag to check for bad padding in the decoder.
* Add test cases that throw errors.
*/
var base64 = new Object();
base64.settings = { // defaults
"char62" : "+",
"char63" : "/",
"pad" : "=",
"ascii" : false
};
/*
* Settings:
* If "pad" is not null or undefined, then it will be used for encoding.
*
* If "ascii" is set to true, then the encoder
* will assume that plaintext is in 8-bit chars (the standard).
* In this case, for every 3 chars in plaintext, you get 4 chars of base64.
* Any non-8-bit chars will cause an error.
* Otherwise, assume that all plaintext can be in the full range
* of Javascript chars, i.e. 16 bits. Get 8 chars of base64 for 3 chars
* of plaintext. Any possible JS string can be encoded.
*/
base64.encode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
for (var i = 0; i < str.length; ++i) {
var c_num = str.charCodeAt(i);
if (this.settings.ascii)
if (c_num >= 256)
throw "Not an 8-bit char.";
var c_bin = c_num.toString(2);
while (c_bin.length < (this.settings.ascii ? 8 : 16))
c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= 6) {
var sextet = buf.slice(0, 6);
buf = buf.slice(6);
output += this.char_set.charAt(parseInt(sextet, 2));
}
}
if (buf) { // not empty
while (buf.length < 6) buf += "0";
output += this.char_set.charAt(parseInt(buf, 2));
}
if (this.settings.pad)
while (output.length % (this.settings.ascii ? 4 : 8) != 0)
output += this.settings.pad;
return output;
}
base64.decode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
var bits = (this.settings.ascii ? 8 : 16);
for (var i = 0; i < str.length; ++i) {
if (str[i] == this.settings.pad) break;
var c_num = this.char_set.indexOf(str.charAt(i));
if (c_num == -1) throw "Not base64.";
var c_bin = c_num.toString(2);
while (c_bin.length < 6) c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= bits) {
var octet = buf.slice(0, bits);
buf = buf.slice(bits);
output += String.fromCharCode(parseInt(octet, 2));
}
}
return output;
}

View file

@ -1,129 +0,0 @@
//Requires base64
var base64 = require('./base64.js');
var HexStrBase64Buffer = {
from: function(s, e) {
var type = e;
var value = '';
if (e == 'base64') {
value = base64.decode(s);
} else if (e == 'hex') {
try {
var escaped = "";
var hex = "";
if(s.length%4 > 0) {
for(i=0;i<(4-(s.length%4));i++) {
hex += "0";
}
}
hex += s;
for(var i = 0;i<hex.length;i += 4) {
escaped += new String("%u" + hex.charAt(i) + hex.charAt(i + 1) + hex.charAt(i + 2) + hex.charAt(i + 3)).toString().split("undefined").join("");
}
value = unescape(escaped).split(unescape("%00")).join("");
} catch (ex) {
var modex = ex.toString().split('Error: ');
modex[0] = '';
if (typeof modex == 'object') {
throw new Error(
'Invaild hex input: ' + s + '. Reason: ' + modex.join('')
);
} else {
throw new Error('Invaild hex input: ' + s + '. Reason: ' + ex);
}
}
} else {
value = Buffer.from(s, 'utf8').toString(e);
}
function toString(en) {
//function toStringE(en,type) {
if (en == 'base64') {
return base64.encode(value);
} else if (en == 'hex') {
var result = "";
for(var i=0;i<value.length;i++) {
var unicode = escape(value.charAt(i));
var hex = "";
if(value.charAt(i) == "\n") {
hex = "000a";
} else if(value.charAt(i) == "\r") {
hex = "000d";
} else if(value.charAt(i) == " ") {
hex = "0020";
} else if(value.charAt(i) == "\0") {
hex = "";
} else if(unicode == value.charAt(i)) {
var oldhex = value.charCodeAt(i).toString(16);
var newhex = "";
if(oldhex.length < 4) {
for(var j=0;j<4-(oldhex.length%4);j++) {
newhex += "0";
}
newhex += oldhex;
} else {
newhex = oldhex;
}
hex = newhex;
} else {
hex = unicode.split("%u").join("");
}
if(hex.length == 4 || hex === "") {
result += hex;
} else if(hex.length > 4) {
result += hex.substring(hex.length-5,hex.length-1);
} else if(hex.length < 4) {
for(var j=0;j<=4-(hex.length%4);j++) {
result += "0";
}
result += hex;
}
}
return result.split("undefined").join("").split("%").join("");
} else {
//return Buffer.from(value, type).toString(en);
return Buffer.from(value,"utf8").toString(en);
}
}
//}
//function toString(en) {
//return toStringE(en,type);
//}
return { type: type, value: value, toString: toString };
}
};
var hexstrbase64 = {
strtobase64: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('base64');
},
base64tostr: function(b) {
return HexStrBase64Buffer.from(b, 'base64').toString('utf8');
},
strtohex: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('hex');
},
hextostr: function(h) {
return HexStrBase64Buffer.from(h, 'hex').toString('utf8');
},
hextobase64: function(h) {
return hexstrbase64.strtobase64(hexstrbase64.hextostr(h));
},
base64tohex: function(b) {
return hexstrbase64.strtohex(hexstrbase64.base64tostr(b));
},
cipher: function() {
this.strtobase64 = hexstrbase64.strtobase64;
this.base64tostr = hexstrbase64.base64tostr;
this.strtohex = hexstrbase64.strtohex;
this.hextostr = hexstrbase64.hextostr;
this.hextobase64 = hextobase64.hextobase64;
this.base64tohex = hextobase64.base64tohex;
},
native: {
btoa: function(b) {
return hexstrbase64.strtobase64(b);
},
atob: function(a) {
return hexstrbase64.base64tostr(a);
}
}
};
module.exports = hexstrbase64;

View file

@ -1,126 +0,0 @@
//Requires base64_browser.js
var HexStrBase64Buffer = {
from: function(s, e) {
var type = e;
var value = '';
if (e == 'base64') {
value = base64.decode(s);
} else if (e == 'hex') {
try {
var escaped = "";
var hex = "";
if(s.length%4 > 0) {
for(i=0;i<(4-(s.length%4));i++) {
hex += "0";
}
}
hex += s;
for(var i = 0;i<hex.length;i += 4) {
escaped += new String("%u" + hex.charAt(i) + hex.charAt(i + 1) + hex.charAt(i + 2) + hex.charAt(i + 3)).toString().split("undefined").join("");
}
value = unescape(escaped).split(unescape("%00")).join("");
} catch (ex) {
var modex = ex.toString().split('Error: ');
modex[0] = '';
if (typeof modex == 'object') {
throw new Error(
'Invaild hex input: ' + s + '. Reason: ' + modex.join('')
);
} else {
throw new Error('Invaild hex input: ' + s + '. Reason: ' + ex);
}
}
} else {
value = new TextDecoder(e).decode(new TextEncoder('utf8').encode(s));
}
//function toStringE(en,type) {
function toString(en) {
if (en == 'base64') {
return base64.encode(value);
} else if (en == 'hex') {
var result = "";
for(var i=0;i<value.length;i++) {
var unicode = escape(value.charAt(i));
var hex = "";
if(value.charAt(i) == "\n") {
hex = "000a";
} else if(value.charAt(i) == "\r") {
hex = "000d";
} else if(value.charAt(i) == " ") {
hex = "0020";
} else if(value.charAt(i) == "\0") {
hex = "";
} else if(unicode == value.charAt(i)) {
var oldhex = value.charCodeAt(i).toString(16);
var newhex = "";
if(oldhex.length < 4) {
for(var j=0;j<4-(oldhex.length%4);j++) {
newhex += "0";
}
newhex += oldhex;
} else {
newhex = oldhex;
}
hex = newhex;
} else {
hex = unicode.split("%u").join("");
}
if(hex.length == 4 || hex === "") {
result += hex;
} else if(hex.length > 4) {
result += hex.substring(hex.length-5,hex.length-1);
} else if(hex.length < 4) {
for(var j=0;j<=4-(hex.length%4);j++) {
result += "0";
}
result += hex;
}
}
return result.split("undefined").join("").split("%").join("");
} else {
//return new TextDecoder(en).decode(new TextEncoder(type).encode(value));
return new TextDecoder(en).decode(new TextEncoder("utf8").encode(value));
}
}
//function toString(en) {
//return toStringE(en,type);
//}
return { type: type, value: value, toString: toString };
}
};
var hexstrbase64 = {
strtobase64: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('base64');
},
base64tostr: function(b) {
return HexStrBase64Buffer.from(b, 'base64').toString('utf8');
},
strtohex: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('hex');
},
hextostr: function(h) {
return HexStrBase64Buffer.from(h, 'hex').toString('utf8');
},
hextobase64: function(h) {
return hexstrbase64.strtobase64(hexstrbase64.hextostr(h));
},
base64tohex: function(b) {
return hexstrbase64.strtohex(hexstrbase64.base64tostr(b));
},
cipher: function() {
this.strtobase64 = hexstrbase64.strtobase64;
this.base64tostr = hexstrbase64.base64tostr;
this.strtohex = hexstrbase64.strtohex;
this.hextostr = hexstrbase64.hextostr;
this.hextobase64 = hextobase64.hextobase64;
this.base64tohex = hextobase64.base64tohex;
},
native: {
btoa: function(b) {
return hexstrbase64.strtobase64(b);
},
atob: function(a) {
return hexstrbase64.base64tostr(a);
}
}
};

View file

@ -1,11 +0,0 @@
let hexstrbase64 = require("./hexstrbase64/main.js");
function decodeBase(b) {
return hexstrbase64.native.atob(b);
}
function encodeStr(s) {
return hexstrbase64.native.btoa(s);
}
var m = Object.create(hexstrbase64);
m.decodeBase = decodeBase;
m.encodeBase = encodeStr;
module.exports = m;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

View file

@ -1,8 +0,0 @@
.code {
border-width: 5px;
border-color: #BEBEBE;
border-style: solid;
color:black;
background-color: #7F7F7F;
font-family: Hack,Consolas,Monaco,monospace;
}

View file

@ -1,31 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>HexStrBase64 Readme</title>
<link rel="stylesheet" href="readme.css">
</head>
<body>
<h1>hexstrbase64</h1>
<h2>How to install?</h2>
<h3>Node.js</h3>
<ol>
<li>Download library from <a href="https://repl.it/@DorianNiemiec/Hex-String-Base64-NodeJS-Library.zip" download>here</a>.</li>
<li>Modify index.js</li>
<li>Write header in program (replace <b>./hexstrbase64</b> with your path to hexstrbase64 library):</li>
<div class="code">
var hexstrbase64 = require("<b>./hexstrbase64</b>/index.js");<br/>
</div>
<li>Now hexstrbase64 library added to program!</li>
</ol>
<h3>Browser Javascript</h3>
<ol>
<li>Download library from <a href="https://repl.it/@DorianNiemiec/Hex-String-Base64-NodeJS-Library.zip" download>here</a>.</li>
<li>Write this code in &lt;head&gt; element (replace <b>hexstrbase64/</b> with your path to hexstrbase64 library):</li>
<div class="code">
&lt;script src="<b>hexstrbase64/</b>hexstrbase64/base64_browser.js"&gt;&lt;/script&gt;<br/>
&lt;script src="<b>hexstrbase64/</b>hexstrbase64/main_browser.js"&gt;&lt;/script&gt;
</div>
<li>Now hexstrbase64 library added to HTML!</li>
</ol>
</body>
</html>

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hexstrbase64 base64 test</title>
<script src="../hexstrbase64/base64_browser.js"></script>
<script src="../hexstrbase64/main_browser.js"></script>
<script src="base64.js"></script>
<script>
testStart();
</script>
</head>
</html>

View file

@ -1,56 +0,0 @@
function nameObj(n, v) {
return {name:n, value:v};
}
function testStart() {
document.write('<meta charset="UTF-8">');
document.write('<title>hexstrbase64 base64 test</title>');
console.log("TESTING STARTED");
for (var i = 0; i < 3; i++) {
document.write('<h1>' + enccases[i].name + '</h1>');
console.log("SWITCH " + enccases[i].name);
for (var j = 0; j < 2; j++) {
document.write('<h2>' + enccases[i].value[j].name + '</h2>');
console.log("CASE " + enccases[i].value[j].name);
console.log("MUST BE: " + enccases[i].value[j].value);
console.log("IS : " + hexstrbase64.strtobase64(enccases[i].value[j].name));
if (hexstrbase64.strtobase64(enccases[i].value[j].name) == enccases[i].value[j].value) {
document.write('<p><img src="../ok.png"></img>Equals</p>');
console.log("EQUALS");
} else {
document.write('<p><img src="../fail.png"></img>Not Equals</p>');
console.log("NOT EQUALS");
}
console.log("CASE " + enccases[i].value[j].name + " ENDED");
}
console.log("SWITCH " + enccases[i].name + " ENDED");
}
console.log("TESTING ENDED");
}
var enccases = [
nameObj('Ascii', [
nameObj('Hello world!', 'AEgAZQBsAGwAbwAgAHcAbwByAGwAZAAh'),
nameObj('Lorem ipsum', 'AEwAbwByAGUAbQAgAGkAcABzAHUAbQ==')
]),
nameObj('Ascii More Than 64 Bytes', [
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ac nisl a sollicitudin. Cras interdum dui turpis, non scelerisque.',
'AEwAbwByAGUAbQAgAGkAcABzAHUAbQAgAGQAbwBsAG8AcgAgAHMAaQB0ACAAYQBtAGUAdAAsACAAYwBvAG4AcwBlAGMAdABlAHQAdQByACAAYQBkAGkAcABpAHMAYwBpAG4AZwAgAGUAbABpAHQALgAgAFYAZQBzAHQAaQBiAHUAbAB1AG0AIABmAGUAcgBtAGUAbgB0AHUAbQAgAGEAYwAgAG4AaQBzAGwAIABhACAAcwBvAGwAbABpAGMAaQB0AHUAZABpAG4ALgAgAEMAcgBhAHMAIABpAG4AdABlAHIAZAB1AG0AIABkAHUAaQAgAHQAdQByAHAAaQBzACwAIABuAG8AbgAgAHMAYwBlAGwAZQByAGkAcwBxAHUAZQAu'
),
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus dapibus volutpat ligula at pulvinar. Etiam consequat mi fringilla facilisis eleifend.',
'AEwAbwByAGUAbQAgAGkAcABzAHUAbQAgAGQAbwBsAG8AcgAgAHMAaQB0ACAAYQBtAGUAdAAsACAAYwBvAG4AcwBlAGMAdABlAHQAdQByACAAYQBkAGkAcABpAHMAYwBpAG4AZwAgAGUAbABpAHQALgAgAFAAaABhAHMAZQBsAGwAdQBzACAAZABhAHAAaQBiAHUAcwAgAHYAbwBsAHUAdABwAGEAdAAgAGwAaQBnAHUAbABhACAAYQB0ACAAcAB1AGwAdgBpAG4AYQByAC4AIABFAHQAaQBhAG0AIABjAG8AbgBzAGUAcQB1AGEAdAAgAG0AaQAgAGYAcgBpAG4AZwBpAGwAbABhACAAZgBhAGMAaQBsAGkAcwBpAHMAIABlAGwAZQBpAGYAZQBuAGQALg=='
)
]),
nameObj('Unicode UTF8', [
nameObj(
'DorianTech Hex String Base64转换器',
'AEQAbwByAGkAYQBuAFQAZQBjAGgAIABIAGUAeAAgAFMAdAByAGkAbgBnACAAQgBhAHMAZQA2ADSPbGNiVmg====='
),
nameObj(
'DorianTech Hex String Base64转换器用于由DorianTech提供的Node.js',
'AEQAbwByAGkAYQBuAFQAZQBjAGgAIABIAGUAeAAgAFMAdAByAGkAbgBnACAAQgBhAHMAZQA2ADSPbGNiVmj/DHUoTo51MQBEAG8AcgBpAGEAbgBUAGUAYwBoY9BPm3aEAE4AbwBkAGUALgBqAHM====='
)
])
];

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hexstrbase64 hex test</title>
<script src="../hexstrbase64/base64_browser.js"></script>
<script src="../hexstrbase64/main_browser.js"></script>
<script src="hex.js"></script>
<script>
testStart();
</script>
</head>
</html>

View file

@ -1,56 +0,0 @@
function nameObj(n, v) {
return {name:n, value:v};
}
function testStart() {
document.write('<meta charset="UTF-8">');
document.write('<title>hexstrbase64 hex test</title>');
console.log("TESTING STARTED");
for (var i = 0; i < 3; i++) {
document.write('<h1>' + enccases[i].name + '</h1>');
console.log("SWITCH " + enccases[i].name);
for (var j = 0; j < 2; j++) {
document.write('<h2>' + enccases[i].value[j].name + '</h2>');
console.log("CASE " + enccases[i].value[j].name);
console.log("MUST BE: " + enccases[i].value[j].value);
console.log("IS : " + hexstrbase64.strtohex(enccases[i].value[j].name));
if (hexstrbase64.strtohex(enccases[i].value[j].name) == enccases[i].value[j].value) {
document.write('<p><img src="../ok.png"></img>Equals</p>');
console.log("EQUALS");
} else {
document.write('<p><img src="../fail.png"></img>Not Equals</p>');
console.log("NOT EQUALS");
}
console.log("CASE " + enccases[i].value[j].name + " ENDED");
}
console.log("SWITCH " + enccases[i].name + " ENDED");
}
console.log("TESTING ENDED");
}
var enccases = [
nameObj('Ascii', [
nameObj('Hello world!', '00480065006c006c006f00200077006f0072006c00640021'),
nameObj('Lorem ipsum', '004c006f00720065006d00200069007000730075006d')
]),
nameObj('Ascii More Than 64 Bytes', [
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ac nisl a sollicitudin. Cras interdum dui turpis, non scelerisque.',
'004c006f00720065006d00200069007000730075006d00200064006f006c006f0072002000730069007400200061006d00650074002C00200063006f006e00730065006300740065007400750072002000610064006900700069007300630069006e006700200065006c00690074002e00200056006500730074006900620075006c0075006d0020006600650072006d0065006e00740075006d0020006100630020006e00690073006c0020006100200073006f006c006c0069006300690074007500640069006e002e0020004300720061007300200069006e00740065007200640075006d00200064007500690020007400750072007000690073002C0020006e006f006e0020007300630065006c0065007200690073007100750065002e'
),
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus dapibus volutpat ligula at pulvinar. Etiam consequat mi fringilla facilisis eleifend.',
'004c006f00720065006d00200069007000730075006d00200064006f006c006f0072002000730069007400200061006d00650074002C00200063006f006e00730065006300740065007400750072002000610064006900700069007300630069006e006700200065006c00690074002e002000500068006100730065006c006c007500730020006400610070006900620075007300200076006f006c007500740070006100740020006c006900670075006c0061002000610074002000700075006c00760069006e00610072002e00200045007400690061006d00200063006f006e0073006500710075006100740020006d00690020006600720069006e00670069006c006c006100200066006100630069006c006900730069007300200065006c0065006900660065006e0064002e'
)
]),
nameObj('Unicode UTF8', [
nameObj(
'DorianTech Hex String Base64转换器',
'0044006f007200690061006e0054006500630068002000480065007800200053007400720069006e006700200042006100730065003600348F6C63625668'
),
nameObj(
'DorianTech Hex String Base64转换器用于由DorianTech提供的Node.js',
'0044006f007200690061006e0054006500630068002000480065007800200053007400720069006e006700200042006100730065003600348F6C63625668FF0C75284E8E75310044006f007200690061006e005400650063006863D04F9B7684004e006f00640065002e006a0073'
)
])
];

View file

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>hexstrbase64 test</title>
<style>
iframe {
width: 200px;
height: 200px;
}
</style>
</head>
<body>
<iframe src="base64.html"></iframe>
<iframe src="hex.html"></iframe>
</body>
</html>

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>SVR.JS 3.9.3</title> <title>SVR.JS 3.9.4</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style> <style>
@ -12,7 +12,7 @@
</style> </style>
</head> </head>
<body> <body>
<h1>Welcome to SVR.JS 3.9.3</h1> <h1>Welcome to SVR.JS 3.9.4</h1>
<br/> <br/>
<img src="/logo.png" style="width: 256px;" /> <img src="/logo.png" style="width: 256px;" />
<br/> <br/>
@ -117,11 +117,14 @@
</div> </div>
<p>Changes:</p> <p>Changes:</p>
<ul> <ul>
<li>Mitigated security vulnerability: SVR.JS mods and server-side JavaScript not using href or uobject.pathname in some path checks are no longer vulnerable to access control bypass (from SVR.JS configuration).</li> <li>Changed warning about no support for HTTP/2.</li>
<li>Added "svrmodpack" deprecation warning.</li>
<li>Removed unmaintained primitive analytics mod.</li>
<li>Removed unmaintained and undocumented hexstrbase64 library.</li>
<li>Added TypeError workaround for Bun 1.0.0</li>
</ul> </ul>
<p>Bugs:</p> <p>Bugs:</p>
<ul> <ul>
<li>Some very old mods requiring hexstrbase64 will fail to load.</li>
<li>On first load server-side JavaScript will fail to load when SVR.JS is running on Bun.</li> <li>On first load server-side JavaScript will fail to load when SVR.JS is running on Bun.</li>
</ul> </ul>
<br/> <br/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

View file

@ -1,124 +0,0 @@
//Base64.js for hexstrbase64 library for Node.js
/*
* Copyright (c) 2012 Miles Shang <mail@mshang.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Usage:
* Set your settings:
* base64.settings.char62 = "-";
* base64.settings.char63 = "_";
* etc.
*
* Then:
* base64.encode(str) takes a string and returns the base64 encoding of it.
* base64.decode(str) does the reverse.
*/
/* TODO:
* Add a "padding_mandatory" flag to check for bad padding in the decoder.
* Add test cases that throw errors.
*/
var base64 = new Object();
base64.settings = { // defaults
"char62" : "+",
"char63" : "/",
"pad" : "=",
"ascii" : false
};
/*
* Settings:
* If "pad" is not null or undefined, then it will be used for encoding.
*
* If "ascii" is set to true, then the encoder
* will assume that plaintext is in 8-bit chars (the standard).
* In this case, for every 3 chars in plaintext, you get 4 chars of base64.
* Any non-8-bit chars will cause an error.
* Otherwise, assume that all plaintext can be in the full range
* of Javascript chars, i.e. 16 bits. Get 8 chars of base64 for 3 chars
* of plaintext. Any possible JS string can be encoded.
*/
base64.encode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
for (var i = 0; i < str.length; ++i) {
var c_num = str.charCodeAt(i);
if (this.settings.ascii)
if (c_num >= 256)
throw "Not an 8-bit char.";
var c_bin = c_num.toString(2);
while (c_bin.length < (this.settings.ascii ? 8 : 16))
c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= 6) {
var sextet = buf.slice(0, 6);
buf = buf.slice(6);
output += this.char_set.charAt(parseInt(sextet, 2));
}
}
if (buf) { // not empty
while (buf.length < 6) buf += "0";
output += this.char_set.charAt(parseInt(buf, 2));
}
if (this.settings.pad)
while (output.length % (this.settings.ascii ? 4 : 8) != 0)
output += this.settings.pad;
return output;
}
base64.decode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
var bits = (this.settings.ascii ? 8 : 16);
for (var i = 0; i < str.length; ++i) {
if (str[i] == this.settings.pad) break;
var c_num = this.char_set.indexOf(str.charAt(i));
if (c_num == -1) throw "Not base64.";
var c_bin = c_num.toString(2);
while (c_bin.length < 6) c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= bits) {
var octet = buf.slice(0, bits);
buf = buf.slice(bits);
output += String.fromCharCode(parseInt(octet, 2));
}
}
return output;
}
module.exports = base64;

View file

@ -1,123 +0,0 @@
//Base64.js for hexstrbase64 library for browser
/*
* Copyright (c) 2012 Miles Shang <mail@mshang.ca>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Usage:
* Set your settings:
* base64.settings.char62 = "-";
* base64.settings.char63 = "_";
* etc.
*
* Then:
* base64.encode(str) takes a string and returns the base64 encoding of it.
* base64.decode(str) does the reverse.
*/
/* TODO:
* Add a "padding_mandatory" flag to check for bad padding in the decoder.
* Add test cases that throw errors.
*/
var base64 = new Object();
base64.settings = { // defaults
"char62" : "+",
"char63" : "/",
"pad" : "=",
"ascii" : false
};
/*
* Settings:
* If "pad" is not null or undefined, then it will be used for encoding.
*
* If "ascii" is set to true, then the encoder
* will assume that plaintext is in 8-bit chars (the standard).
* In this case, for every 3 chars in plaintext, you get 4 chars of base64.
* Any non-8-bit chars will cause an error.
* Otherwise, assume that all plaintext can be in the full range
* of Javascript chars, i.e. 16 bits. Get 8 chars of base64 for 3 chars
* of plaintext. Any possible JS string can be encoded.
*/
base64.encode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
for (var i = 0; i < str.length; ++i) {
var c_num = str.charCodeAt(i);
if (this.settings.ascii)
if (c_num >= 256)
throw "Not an 8-bit char.";
var c_bin = c_num.toString(2);
while (c_bin.length < (this.settings.ascii ? 8 : 16))
c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= 6) {
var sextet = buf.slice(0, 6);
buf = buf.slice(6);
output += this.char_set.charAt(parseInt(sextet, 2));
}
}
if (buf) { // not empty
while (buf.length < 6) buf += "0";
output += this.char_set.charAt(parseInt(buf, 2));
}
if (this.settings.pad)
while (output.length % (this.settings.ascii ? 4 : 8) != 0)
output += this.settings.pad;
return output;
}
base64.decode = function (str) {
this.char_set =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+ this.settings.char62 + this.settings.char63;
var output = ""; // final output
var buf = ""; // binary buffer
var bits = (this.settings.ascii ? 8 : 16);
for (var i = 0; i < str.length; ++i) {
if (str[i] == this.settings.pad) break;
var c_num = this.char_set.indexOf(str.charAt(i));
if (c_num == -1) throw "Not base64.";
var c_bin = c_num.toString(2);
while (c_bin.length < 6) c_bin = "0" + c_bin;
buf += c_bin;
while (buf.length >= bits) {
var octet = buf.slice(0, bits);
buf = buf.slice(bits);
output += String.fromCharCode(parseInt(octet, 2));
}
}
return output;
}

View file

@ -1,129 +0,0 @@
//Requires base64
var base64 = require('./base64.js');
var HexStrBase64Buffer = {
from: function(s, e) {
var type = e;
var value = '';
if (e == 'base64') {
value = base64.decode(s);
} else if (e == 'hex') {
try {
var escaped = "";
var hex = "";
if(s.length%4 > 0) {
for(i=0;i<(4-(s.length%4));i++) {
hex += "0";
}
}
hex += s;
for(var i = 0;i<hex.length;i += 4) {
escaped += new String("%u" + hex.charAt(i) + hex.charAt(i + 1) + hex.charAt(i + 2) + hex.charAt(i + 3)).toString().split("undefined").join("");
}
value = unescape(escaped).split(unescape("%00")).join("");
} catch (ex) {
var modex = ex.toString().split('Error: ');
modex[0] = '';
if (typeof modex == 'object') {
throw new Error(
'Invaild hex input: ' + s + '. Reason: ' + modex.join('')
);
} else {
throw new Error('Invaild hex input: ' + s + '. Reason: ' + ex);
}
}
} else {
value = Buffer.from(s, 'utf8').toString(e);
}
function toString(en) {
//function toStringE(en,type) {
if (en == 'base64') {
return base64.encode(value);
} else if (en == 'hex') {
var result = "";
for(var i=0;i<value.length;i++) {
var unicode = escape(value.charAt(i));
var hex = "";
if(value.charAt(i) == "\n") {
hex = "000a";
} else if(value.charAt(i) == "\r") {
hex = "000d";
} else if(value.charAt(i) == " ") {
hex = "0020";
} else if(value.charAt(i) == "\0") {
hex = "";
} else if(unicode == value.charAt(i)) {
var oldhex = value.charCodeAt(i).toString(16);
var newhex = "";
if(oldhex.length < 4) {
for(var j=0;j<4-(oldhex.length%4);j++) {
newhex += "0";
}
newhex += oldhex;
} else {
newhex = oldhex;
}
hex = newhex;
} else {
hex = unicode.split("%u").join("");
}
if(hex.length == 4 || hex === "") {
result += hex;
} else if(hex.length > 4) {
result += hex.substring(hex.length-5,hex.length-1);
} else if(hex.length < 4) {
for(var j=0;j<=4-(hex.length%4);j++) {
result += "0";
}
result += hex;
}
}
return result.split("undefined").join("").split("%").join("");
} else {
//return Buffer.from(value, type).toString(en);
return Buffer.from(value,"utf8").toString(en);
}
}
//}
//function toString(en) {
//return toStringE(en,type);
//}
return { type: type, value: value, toString: toString };
}
};
var hexstrbase64 = {
strtobase64: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('base64');
},
base64tostr: function(b) {
return HexStrBase64Buffer.from(b, 'base64').toString('utf8');
},
strtohex: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('hex');
},
hextostr: function(h) {
return HexStrBase64Buffer.from(h, 'hex').toString('utf8');
},
hextobase64: function(h) {
return hexstrbase64.strtobase64(hexstrbase64.hextostr(h));
},
base64tohex: function(b) {
return hexstrbase64.strtohex(hexstrbase64.base64tostr(b));
},
cipher: function() {
this.strtobase64 = hexstrbase64.strtobase64;
this.base64tostr = hexstrbase64.base64tostr;
this.strtohex = hexstrbase64.strtohex;
this.hextostr = hexstrbase64.hextostr;
this.hextobase64 = hextobase64.hextobase64;
this.base64tohex = hextobase64.base64tohex;
},
native: {
btoa: function(b) {
return hexstrbase64.strtobase64(b);
},
atob: function(a) {
return hexstrbase64.base64tostr(a);
}
}
};
module.exports = hexstrbase64;

View file

@ -1,126 +0,0 @@
//Requires base64_browser.js
var HexStrBase64Buffer = {
from: function(s, e) {
var type = e;
var value = '';
if (e == 'base64') {
value = base64.decode(s);
} else if (e == 'hex') {
try {
var escaped = "";
var hex = "";
if(s.length%4 > 0) {
for(i=0;i<(4-(s.length%4));i++) {
hex += "0";
}
}
hex += s;
for(var i = 0;i<hex.length;i += 4) {
escaped += new String("%u" + hex.charAt(i) + hex.charAt(i + 1) + hex.charAt(i + 2) + hex.charAt(i + 3)).toString().split("undefined").join("");
}
value = unescape(escaped).split(unescape("%00")).join("");
} catch (ex) {
var modex = ex.toString().split('Error: ');
modex[0] = '';
if (typeof modex == 'object') {
throw new Error(
'Invaild hex input: ' + s + '. Reason: ' + modex.join('')
);
} else {
throw new Error('Invaild hex input: ' + s + '. Reason: ' + ex);
}
}
} else {
value = new TextDecoder(e).decode(new TextEncoder('utf8').encode(s));
}
//function toStringE(en,type) {
function toString(en) {
if (en == 'base64') {
return base64.encode(value);
} else if (en == 'hex') {
var result = "";
for(var i=0;i<value.length;i++) {
var unicode = escape(value.charAt(i));
var hex = "";
if(value.charAt(i) == "\n") {
hex = "000a";
} else if(value.charAt(i) == "\r") {
hex = "000d";
} else if(value.charAt(i) == " ") {
hex = "0020";
} else if(value.charAt(i) == "\0") {
hex = "";
} else if(unicode == value.charAt(i)) {
var oldhex = value.charCodeAt(i).toString(16);
var newhex = "";
if(oldhex.length < 4) {
for(var j=0;j<4-(oldhex.length%4);j++) {
newhex += "0";
}
newhex += oldhex;
} else {
newhex = oldhex;
}
hex = newhex;
} else {
hex = unicode.split("%u").join("");
}
if(hex.length == 4 || hex === "") {
result += hex;
} else if(hex.length > 4) {
result += hex.substring(hex.length-5,hex.length-1);
} else if(hex.length < 4) {
for(var j=0;j<=4-(hex.length%4);j++) {
result += "0";
}
result += hex;
}
}
return result.split("undefined").join("").split("%").join("");
} else {
//return new TextDecoder(en).decode(new TextEncoder(type).encode(value));
return new TextDecoder(en).decode(new TextEncoder("utf8").encode(value));
}
}
//function toString(en) {
//return toStringE(en,type);
//}
return { type: type, value: value, toString: toString };
}
};
var hexstrbase64 = {
strtobase64: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('base64');
},
base64tostr: function(b) {
return HexStrBase64Buffer.from(b, 'base64').toString('utf8');
},
strtohex: function(s) {
return HexStrBase64Buffer.from(s, 'utf8').toString('hex');
},
hextostr: function(h) {
return HexStrBase64Buffer.from(h, 'hex').toString('utf8');
},
hextobase64: function(h) {
return hexstrbase64.strtobase64(hexstrbase64.hextostr(h));
},
base64tohex: function(b) {
return hexstrbase64.strtohex(hexstrbase64.base64tostr(b));
},
cipher: function() {
this.strtobase64 = hexstrbase64.strtobase64;
this.base64tostr = hexstrbase64.base64tostr;
this.strtohex = hexstrbase64.strtohex;
this.hextostr = hexstrbase64.hextostr;
this.hextobase64 = hextobase64.hextobase64;
this.base64tohex = hextobase64.base64tohex;
},
native: {
btoa: function(b) {
return hexstrbase64.strtobase64(b);
},
atob: function(a) {
return hexstrbase64.base64tostr(a);
}
}
};

View file

@ -1,11 +0,0 @@
let hexstrbase64 = require("./hexstrbase64/main.js");
function decodeBase(b) {
return hexstrbase64.native.atob(b);
}
function encodeStr(s) {
return hexstrbase64.native.btoa(s);
}
var m = Object.create(hexstrbase64);
m.decodeBase = decodeBase;
m.encodeBase = encodeStr;
module.exports = m;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

View file

@ -1,8 +0,0 @@
.code {
border-width: 5px;
border-color: #BEBEBE;
border-style: solid;
color:black;
background-color: #7F7F7F;
font-family: Hack,Consolas,Monaco,monospace;
}

View file

@ -1,31 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>HexStrBase64 Readme</title>
<link rel="stylesheet" href="readme.css">
</head>
<body>
<h1>hexstrbase64</h1>
<h2>How to install?</h2>
<h3>Node.js</h3>
<ol>
<li>Download library from <a href="https://repl.it/@DorianNiemiec/Hex-String-Base64-NodeJS-Library.zip" download>here</a>.</li>
<li>Modify index.js</li>
<li>Write header in program (replace <b>./hexstrbase64</b> with your path to hexstrbase64 library):</li>
<div class="code">
var hexstrbase64 = require("<b>./hexstrbase64</b>/index.js");<br/>
</div>
<li>Now hexstrbase64 library added to program!</li>
</ol>
<h3>Browser Javascript</h3>
<ol>
<li>Download library from <a href="https://repl.it/@DorianNiemiec/Hex-String-Base64-NodeJS-Library.zip" download>here</a>.</li>
<li>Write this code in &lt;head&gt; element (replace <b>hexstrbase64/</b> with your path to hexstrbase64 library):</li>
<div class="code">
&lt;script src="<b>hexstrbase64/</b>hexstrbase64/base64_browser.js"&gt;&lt;/script&gt;<br/>
&lt;script src="<b>hexstrbase64/</b>hexstrbase64/main_browser.js"&gt;&lt;/script&gt;
</div>
<li>Now hexstrbase64 library added to HTML!</li>
</ol>
</body>
</html>

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hexstrbase64 base64 test</title>
<script src="../hexstrbase64/base64_browser.js"></script>
<script src="../hexstrbase64/main_browser.js"></script>
<script src="base64.js"></script>
<script>
testStart();
</script>
</head>
</html>

View file

@ -1,56 +0,0 @@
function nameObj(n, v) {
return {name:n, value:v};
}
function testStart() {
document.write('<meta charset="UTF-8">');
document.write('<title>hexstrbase64 base64 test</title>');
console.log("TESTING STARTED");
for (var i = 0; i < 3; i++) {
document.write('<h1>' + enccases[i].name + '</h1>');
console.log("SWITCH " + enccases[i].name);
for (var j = 0; j < 2; j++) {
document.write('<h2>' + enccases[i].value[j].name + '</h2>');
console.log("CASE " + enccases[i].value[j].name);
console.log("MUST BE: " + enccases[i].value[j].value);
console.log("IS : " + hexstrbase64.strtobase64(enccases[i].value[j].name));
if (hexstrbase64.strtobase64(enccases[i].value[j].name) == enccases[i].value[j].value) {
document.write('<p><img src="../ok.png"></img>Equals</p>');
console.log("EQUALS");
} else {
document.write('<p><img src="../fail.png"></img>Not Equals</p>');
console.log("NOT EQUALS");
}
console.log("CASE " + enccases[i].value[j].name + " ENDED");
}
console.log("SWITCH " + enccases[i].name + " ENDED");
}
console.log("TESTING ENDED");
}
var enccases = [
nameObj('Ascii', [
nameObj('Hello world!', 'AEgAZQBsAGwAbwAgAHcAbwByAGwAZAAh'),
nameObj('Lorem ipsum', 'AEwAbwByAGUAbQAgAGkAcABzAHUAbQ==')
]),
nameObj('Ascii More Than 64 Bytes', [
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ac nisl a sollicitudin. Cras interdum dui turpis, non scelerisque.',
'AEwAbwByAGUAbQAgAGkAcABzAHUAbQAgAGQAbwBsAG8AcgAgAHMAaQB0ACAAYQBtAGUAdAAsACAAYwBvAG4AcwBlAGMAdABlAHQAdQByACAAYQBkAGkAcABpAHMAYwBpAG4AZwAgAGUAbABpAHQALgAgAFYAZQBzAHQAaQBiAHUAbAB1AG0AIABmAGUAcgBtAGUAbgB0AHUAbQAgAGEAYwAgAG4AaQBzAGwAIABhACAAcwBvAGwAbABpAGMAaQB0AHUAZABpAG4ALgAgAEMAcgBhAHMAIABpAG4AdABlAHIAZAB1AG0AIABkAHUAaQAgAHQAdQByAHAAaQBzACwAIABuAG8AbgAgAHMAYwBlAGwAZQByAGkAcwBxAHUAZQAu'
),
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus dapibus volutpat ligula at pulvinar. Etiam consequat mi fringilla facilisis eleifend.',
'AEwAbwByAGUAbQAgAGkAcABzAHUAbQAgAGQAbwBsAG8AcgAgAHMAaQB0ACAAYQBtAGUAdAAsACAAYwBvAG4AcwBlAGMAdABlAHQAdQByACAAYQBkAGkAcABpAHMAYwBpAG4AZwAgAGUAbABpAHQALgAgAFAAaABhAHMAZQBsAGwAdQBzACAAZABhAHAAaQBiAHUAcwAgAHYAbwBsAHUAdABwAGEAdAAgAGwAaQBnAHUAbABhACAAYQB0ACAAcAB1AGwAdgBpAG4AYQByAC4AIABFAHQAaQBhAG0AIABjAG8AbgBzAGUAcQB1AGEAdAAgAG0AaQAgAGYAcgBpAG4AZwBpAGwAbABhACAAZgBhAGMAaQBsAGkAcwBpAHMAIABlAGwAZQBpAGYAZQBuAGQALg=='
)
]),
nameObj('Unicode UTF8', [
nameObj(
'DorianTech Hex String Base64转换器',
'AEQAbwByAGkAYQBuAFQAZQBjAGgAIABIAGUAeAAgAFMAdAByAGkAbgBnACAAQgBhAHMAZQA2ADSPbGNiVmg====='
),
nameObj(
'DorianTech Hex String Base64转换器用于由DorianTech提供的Node.js',
'AEQAbwByAGkAYQBuAFQAZQBjAGgAIABIAGUAeAAgAFMAdAByAGkAbgBnACAAQgBhAHMAZQA2ADSPbGNiVmj/DHUoTo51MQBEAG8AcgBpAGEAbgBUAGUAYwBoY9BPm3aEAE4AbwBkAGUALgBqAHM====='
)
])
];

View file

@ -1,13 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hexstrbase64 hex test</title>
<script src="../hexstrbase64/base64_browser.js"></script>
<script src="../hexstrbase64/main_browser.js"></script>
<script src="hex.js"></script>
<script>
testStart();
</script>
</head>
</html>

View file

@ -1,56 +0,0 @@
function nameObj(n, v) {
return {name:n, value:v};
}
function testStart() {
document.write('<meta charset="UTF-8">');
document.write('<title>hexstrbase64 hex test</title>');
console.log("TESTING STARTED");
for (var i = 0; i < 3; i++) {
document.write('<h1>' + enccases[i].name + '</h1>');
console.log("SWITCH " + enccases[i].name);
for (var j = 0; j < 2; j++) {
document.write('<h2>' + enccases[i].value[j].name + '</h2>');
console.log("CASE " + enccases[i].value[j].name);
console.log("MUST BE: " + enccases[i].value[j].value);
console.log("IS : " + hexstrbase64.strtohex(enccases[i].value[j].name));
if (hexstrbase64.strtohex(enccases[i].value[j].name) == enccases[i].value[j].value) {
document.write('<p><img src="../ok.png"></img>Equals</p>');
console.log("EQUALS");
} else {
document.write('<p><img src="../fail.png"></img>Not Equals</p>');
console.log("NOT EQUALS");
}
console.log("CASE " + enccases[i].value[j].name + " ENDED");
}
console.log("SWITCH " + enccases[i].name + " ENDED");
}
console.log("TESTING ENDED");
}
var enccases = [
nameObj('Ascii', [
nameObj('Hello world!', '00480065006c006c006f00200077006f0072006c00640021'),
nameObj('Lorem ipsum', '004c006f00720065006d00200069007000730075006d')
]),
nameObj('Ascii More Than 64 Bytes', [
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum fermentum ac nisl a sollicitudin. Cras interdum dui turpis, non scelerisque.',
'004c006f00720065006d00200069007000730075006d00200064006f006c006f0072002000730069007400200061006d00650074002C00200063006f006e00730065006300740065007400750072002000610064006900700069007300630069006e006700200065006c00690074002e00200056006500730074006900620075006c0075006d0020006600650072006d0065006e00740075006d0020006100630020006e00690073006c0020006100200073006f006c006c0069006300690074007500640069006e002e0020004300720061007300200069006e00740065007200640075006d00200064007500690020007400750072007000690073002C0020006e006f006e0020007300630065006c0065007200690073007100750065002e'
),
nameObj(
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus dapibus volutpat ligula at pulvinar. Etiam consequat mi fringilla facilisis eleifend.',
'004c006f00720065006d00200069007000730075006d00200064006f006c006f0072002000730069007400200061006d00650074002C00200063006f006e00730065006300740065007400750072002000610064006900700069007300630069006e006700200065006c00690074002e002000500068006100730065006c006c007500730020006400610070006900620075007300200076006f006c007500740070006100740020006c006900670075006c0061002000610074002000700075006c00760069006e00610072002e00200045007400690061006d00200063006f006e0073006500710075006100740020006d00690020006600720069006e00670069006c006c006100200066006100630069006c006900730069007300200065006c0065006900660065006e0064002e'
)
]),
nameObj('Unicode UTF8', [
nameObj(
'DorianTech Hex String Base64转换器',
'0044006f007200690061006e0054006500630068002000480065007800200053007400720069006e006700200042006100730065003600348F6C63625668'
),
nameObj(
'DorianTech Hex String Base64转换器用于由DorianTech提供的Node.js',
'0044006f007200690061006e0054006500630068002000480065007800200053007400720069006e006700200042006100730065003600348F6C63625668FF0C75284E8E75310044006f007200690061006e005400650063006863D04F9B7684004e006f00640065002e006a0073'
)
])
];

View file

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>hexstrbase64 test</title>
<style>
iframe {
width: 200px;
height: 200px;
}
</style>
</head>
<body>
<iframe src="base64.html"></iframe>
<iframe src="hex.html"></iframe>
</body>
</html>

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>SVR.JS 3.9.3 Licenses</title> <title>SVR.JS 3.9.4 Licenses</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style> <style>
@ -12,8 +12,8 @@
</style> </style>
</head> </head>
<body> <body>
<h1>SVR.JS 3.9.3 Licenses</h1> <h1>SVR.JS 3.9.4 Licenses</h1>
<h2>SVR.JS 3.9.3</h2> <h2>SVR.JS 3.9.4</h2>
<div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;"> <div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;">
MIT License<br/> MIT License<br/>
<br/> <br/>
@ -37,7 +37,7 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/>
SOFTWARE.<br/> SOFTWARE.<br/>
</div> </div>
<h2>Packages used by SVR.JS 3.9.3 and utilities</h2> <h2>Packages used by SVR.JS 3.9.4 and utilities</h2>
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;"> <div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
<div style="float: right;">License: MIT</div> <div style="float: right;">License: MIT</div>
<div style="font-size: 20px;"> <div style="font-size: 20px;">

Binary file not shown.

10
svr.js
View file

@ -81,7 +81,7 @@ function deleteFolderRecursive(path) {
} }
var os = require("os"); var os = require("os");
var version = "3.9.3"; var version = "3.9.4";
var singlethreaded = false; var singlethreaded = false;
if (process.versions) process.versions.svrjs = version; // Inject SVR.JS into process.versions if (process.versions) process.versions.svrjs = version; // Inject SVR.JS into process.versions
@ -223,6 +223,7 @@ if (!singlethreaded) {
function checkSendImplementation(worker) { function checkSendImplementation(worker) {
var sendImplemented = true; var sendImplemented = true;
if (!(process.versions && process.versions.bun && process.versions.bun[0] != "0")) {
if (!worker.send) { if (!worker.send) {
sendImplemented = false; sendImplemented = false;
} }
@ -242,9 +243,11 @@ if (!singlethreaded) {
if (err.message === "NOT IMPLEMENTED") { if (err.message === "NOT IMPLEMENTED") {
sendImplemented = false; sendImplemented = false;
} }
console.log(err);
} }
console.log = oldLog; console.log = oldLog;
}
return sendImplemented; return sendImplemented;
} }
@ -1423,6 +1426,7 @@ process.exit = function (code) {
var modLoadingErrors = []; var modLoadingErrors = [];
var SSJSError = undefined; var SSJSError = undefined;
var svrmodpackUsed = false;
// Load mods if the `disableMods` flag is not set // Load mods if the `disableMods` flag is not set
if (!disableMods) { if (!disableMods) {
@ -1487,6 +1491,7 @@ if (!disableMods) {
// If it's not a ".tar.gz" file, unpack it using `svrmodpack` // If it's not a ".tar.gz" file, unpack it using `svrmodpack`
if (svrmodpack._errored) throw svrmodpack._errored; if (svrmodpack._errored) throw svrmodpack._errored;
svrmodpack.unpack(modFile, __dirname + "/temp/" + modloaderFolderName + "/" + modFileRaw); svrmodpack.unpack(modFile, __dirname + "/temp/" + modloaderFolderName + "/" + modFileRaw);
svrmodpackUsed = true;
} }
// Initialize variables for mod loading // Initialize variables for mod loading
@ -4801,7 +4806,7 @@ function start(init) {
console.log("Welcome to DorianTech SVR.JS server."); console.log("Welcome to DorianTech SVR.JS server.");
// Print warnings // Print warnings
if (version.indexOf("Nightly-") === 0) serverconsole.locwarnmessage("This version is only for test purposes and may be unstable."); if (version.indexOf("Nightly-") === 0) serverconsole.locwarnmessage("This version is only for test purposes and may be unstable.");
if (http2.__disabled__ !== undefined) serverconsole.locwarnmessage("HTTP/2 isn't supported by your Node.JS version! You may not be able to use HTTP/2 with SVR.JS"); if (svrmodpackUsed) serverconsole.locwarnmessage("The \"svrmodpack\" library is deprecated. Mods using svrmodpack format may not work in future SVR.JS versions.");
if (configJSON.enableHTTP2 && !secure) serverconsole.locwarnmessage("HTTP/2 without HTTPS may not work in web browsers. Web browsers only support HTTP/2 with HTTPS!"); if (configJSON.enableHTTP2 && !secure) serverconsole.locwarnmessage("HTTP/2 without HTTPS may not work in web browsers. Web browsers only support HTTP/2 with HTTPS!");
if (process.isBun) { if (process.isBun) {
serverconsole.locwarnmessage("Bun support is experimental. Some features of SVR.JS, SVR.JS mods and SVR.JS server-side JavaScript may not work as expected."); serverconsole.locwarnmessage("Bun support is experimental. Some features of SVR.JS, SVR.JS mods and SVR.JS server-side JavaScript may not work as expected.");
@ -4850,6 +4855,7 @@ function start(init) {
if (configJSONRErr) throw new Error("Can't read SVR.JS configuration file: " + configJSONRErr.message); if (configJSONRErr) throw new Error("Can't read SVR.JS configuration file: " + configJSONRErr.message);
if (configJSONPErr) throw new Error("SVR.JS configuration parse error: " + configJSONPErr.message); if (configJSONPErr) throw new Error("SVR.JS configuration parse error: " + configJSONPErr.message);
if (configJSON.enableHTTP2 && !secure && (typeof port != "number")) throw new Error("HTTP/2 without HTTPS, along with Unix sockets/Windows named pipes aren't supported by SVR.JS."); if (configJSON.enableHTTP2 && !secure && (typeof port != "number")) throw new Error("HTTP/2 without HTTPS, along with Unix sockets/Windows named pipes aren't supported by SVR.JS.");
if (configJSON.enableHTTP2 && http2.__disabled__ !== undefined) throw new Error("HTTP/2 isn't supported by your Node.JS version! You may not be able to use HTTP/2 with SVR.JS");
if (listenAddress) { if (listenAddress) {
if (listenAddress.match(/^[0-9]+$/)) throw new Error("Listening network address can't be numeric (it need to be either valid IP address, or valid domain name)."); if (listenAddress.match(/^[0-9]+$/)) throw new Error("Listening network address can't be numeric (it need to be either valid IP address, or valid domain name).");
if (listenAddress.match(/^(?:2(?:2[4-9]|3[0-9])\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$|ff[0-9a-f][0-9a-f]:[0-9a-f:])/i)) throw new Error("SVR.JS can't listen on multicast address."); if (listenAddress.match(/^(?:2(?:2[4-9]|3[0-9])\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$|ff[0-9a-f][0-9a-f]:[0-9a-f:])/i)) throw new Error("SVR.JS can't listen on multicast address.");

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>SVR.JS 3.9.3 Tests</title> <title>SVR.JS 3.9.4 Tests</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<style> <style>
@ -12,7 +12,7 @@
</style> </style>
</head> </head>
<body> <body>
<h1>SVR.JS 3.9.3 Tests</h1> <h1>SVR.JS 3.9.4 Tests</h1>
<h2>Directory</h2> <h2>Directory</h2>
<iframe src="/testdir" width="50%" height="300px"></iframe> <iframe src="/testdir" width="50%" height="300px"></iframe>
<h2>Directory (with query)</h2> <h2>Directory (with query)</h2>