Merge pull request #192 from gnh1201/dev

Improve initial warming up time, and add WHOIS request feature
This commit is contained in:
Namhyeon Go 2025-03-19 16:02:23 +09:00 committed by GitHub
commit 07e0665275
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 109 additions and 31 deletions

View File

@ -5,6 +5,7 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace WelsonJS.Launcher
{
@ -14,9 +15,12 @@ namespace WelsonJS.Launcher
public ExecutablesCollector()
{
executables.AddRange(GetInstalledSoftwareExecutables());
executables.AddRange(GetExecutablesFromPath());
executables.AddRange(GetExecutablesFromNetFx());
new Task(() =>
{
executables.AddRange(GetInstalledSoftwareExecutables());
executables.AddRange(GetExecutablesFromPath());
executables.AddRange(GetExecutablesFromNetFx());
}).Start();
}
public List<string> GetExecutables()

View File

@ -9,7 +9,6 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;
namespace WelsonJS.Launcher
@ -73,7 +72,7 @@ namespace WelsonJS.Launcher
{
try
{
ProcessRequest(await _listener.GetContextAsync());
await ProcessRequest(await _listener.GetContextAsync());
}
catch (Exception ex)
{
@ -83,7 +82,7 @@ namespace WelsonJS.Launcher
}
}
private void ProcessRequest(HttpListenerContext context)
private async Task ProcessRequest(HttpListenerContext context)
{
string path = context.Request.Url.AbsolutePath.TrimStart('/');
@ -106,7 +105,15 @@ namespace WelsonJS.Launcher
const string devtoolsPrefix = "devtools/";
if (path.StartsWith(devtoolsPrefix, StringComparison.OrdinalIgnoreCase))
{
ServeDevTools(context, path.Substring(devtoolsPrefix.Length - 1));
await ServeDevTools(context, path.Substring(devtoolsPrefix.Length - 1));
return;
}
// Serve WHOIS request (use KRNIC server)
const string whoisPrefix = "whois/";
if (path.StartsWith(whoisPrefix, StringComparison.OrdinalIgnoreCase))
{
await ServeWhoisRequest(context, path.Substring(whoisPrefix.Length));
return;
}
@ -149,14 +156,14 @@ namespace WelsonJS.Launcher
}
}
private void ServeDevTools(HttpListenerContext context, string endpoint)
private async Task ServeDevTools(HttpListenerContext context, string endpoint)
{
try
{
using (HttpClient client = new HttpClient())
{
string url = "http://localhost:9222" + endpoint;
string data = client.GetStringAsync(url).GetAwaiter().GetResult();
string data = await client.GetStringAsync(url);
ServeResource(context, data, "application/json");
}
@ -167,6 +174,43 @@ namespace WelsonJS.Launcher
}
}
private async Task ServeWhoisRequest(HttpListenerContext context, string query)
{
if (string.IsNullOrWhiteSpace(query) || query.Length > 255)
{
ServeResource(context, "<error>Invalid query parameter</error>", "application/xml", 400);
return;
}
string whoisServerUrl = "https://xn--c79as89aj0e29b77z.xn--3e0b707e";
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromSeconds(10);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, $"{whoisServerUrl}/kor/whois.jsc")
{
Content = new StringContent($"query={Uri.EscapeDataString(query)}&ip=141.101.82.1", Encoding.UTF8, "application/x-www-form-urlencoded")
};
request.Headers.Add("Accept", "*/*");
request.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.3124.77");
client.DefaultRequestHeaders.Referrer = new Uri($"{whoisServerUrl}/kor/whois/whois.jsp");
try
{
HttpResponseMessage response = await client.SendAsync(request);
string responseBody = await response.Content.ReadAsStringAsync();
ServeResource(context, responseBody, "text/plain", (int)response.StatusCode);
}
catch (Exception ex)
{
ServeResource(context, $"<error>Failed to process WHOIS request. {ex.Message}</error>", "application/xml", 500);
}
}
}
private void ServeResource(HttpListenerContext context, byte[] data, string mimeType = "text/html", int statusCode = 200)
{
string xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>WelsonJS Code Editor</title>
<title>WelsonJS Editor</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<link rel="stylesheet" href="https://cdn.metroui.org.ua/dev/metro.css">
<link rel="stylesheet" href="https://cdn.metroui.org.ua/dev/icons.css">
@ -36,27 +36,39 @@
<body>
<nav data-role="ribbonmenu">
<ul class="tabs-holder">
<li class="static"><a href="#">File</a></li>
<li class="static"><a href="#">WelsonJS</a></li>
<li><a href="#editor-tab">Editor</a></li>
</ul>
<div class="content-holder">
<div class="section" id="editor-tab">
<button id="btnOpenFile" class="ribbon-button">
<span class="icon mif-folder-open"></span>
<span class="caption">Open File</span>
</button>
<button id="btnSaveFile" class="ribbon-button">
<span class="icon mif-floppy-disks"></span>
<span class="caption">Save File</span>
</button>
<button id="btnGenerate" class="ribbon-button">
<span class="icon mif-rocket"></span>
<span class="caption">Generate</span>
</button>
<button id="btnSponsor" class="ribbon-button">
<span class="icon mif-heart"></span>
<span class="caption">Sponsor</span>
</button>
<div class="group">
<button id="btnOpenFile" class="ribbon-button">
<span class="icon mif-folder-open"></span>
<span class="caption">Open File</span>
</button>
<button id="btnSaveFile" class="ribbon-button">
<span class="icon mif-floppy-disks"></span>
<span class="caption">Save File</span>
</button>
<button id="btnGenerate" class="ribbon-button">
<span class="icon mif-rocket"></span>
<span class="caption">Generate</span>
</button>
<button id="btnSponsor" class="ribbon-button">
<span class="icon mif-heart"></span>
<span class="caption">Sponsor</span>
</button>
<span class="title">Common</span>
</div>
<div class="group">
<button id="btnWhois" class="ribbon-button">
<span class="icon mif-earth"></span>
<span class="caption">Whois</span>
</button>
<span class="title">Specific</span>
</div>
</div>
</div>
</nav>
@ -75,6 +87,7 @@
</script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fast-xml-parser/4.5.1/fxparser.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.2.4/purify.min.js"></script>
<script src="https://cdn.metroui.org.ua/dev/metro.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.2/min/vs/loader.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.2/min/vs/editor/editor.main.js"></script>
@ -94,7 +107,7 @@
}
function getSuggestions(word, range) {
return axios.get(serverBaseUrl + "/completion/" + encodeURIComponent(word))
return axios.get(`${serverBaseUrl}/completion/${encodeURIComponent(word)}`)
.then(function (response) {
var parser = new XMLParser();
var result = parser.parse(response.data);
@ -234,7 +247,7 @@
return;
}
appendTextToEditor("\n// " + promptMessage + "... Thinking with Generative AI...");
appendTextToEditor(`\n//${promptMessage}... Thinking with Generative AI...`);
(async function () {
const targetWsUrl = await getTargetByUrl('copilot.microsoft.com');
@ -246,8 +259,24 @@
})();
};
document.getElementById("btnWhois").onclick = function () {
const hostname = prompt("Enter a hostname or IP address:", '');
if (!hostname || hostname.trim() == '') {
alert("A hostname or IP address is required.");
return;
}
axios.get(`${serverBaseUrl}/whois/${hostname}`).then(response => {
const responseText = DOMPurify.sanitize(response.data, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] });
appendTextToEditor(`/*\n${responseText}\n*/`);
}).catch(error => {
console.error(error);
});
};
async function getTargetByUrl(urlPart) {
const response = await fetch(serverBaseUrl + "/devtools/json");
const response = await fetch(`${serverBaseUrl}/devtools/json`);
const targets = await response.json();
const target = targets.find(target => target.url.includes(urlPart));
@ -303,10 +332,11 @@
socket.onmessage = (event) => {
const response = JSON.parse(event.data);
console.log('Sent successfully:', response.result);
console.log("Sent successfully:", response.result);
if (response.id == 3) {
appendTextToEditor(response.result.result.value);
socket.close();
}
};
}