1
0
mirror of https://github.com/gusaul/grpcox.git synced 2024-11-17 06:26:56 +00:00
grpcox/index/js/style.js

298 lines
7.6 KiB
JavaScript
Raw Normal View History

2018-11-04 19:56:06 +00:00
var target, use_tls, editor;
$('#get-services').click(function(){
// reset all selected list
resetReqResData()
removeRequestSelectedClass()
2018-11-04 19:56:06 +00:00
var t = get_valid_target();
2019-03-13 03:38:30 +00:00
use_tls = "false";
2019-03-13 03:38:30 +00:00
var restart = "0"
if($('#restart-conn').is(":checked")) {
restart = "1"
}
2021-07-23 16:41:02 +00:00
if($('#use-tls').is(":checked")) {
use_tls = "true"
}
feat(descriptor): add support for local proto descriptor Currently, grpcox depends on server reflection to get proto descriptor. It has a significant drawback, since not every grpc server support [server reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md#known-implementations). Using local proto files is more feasible, as every grpc server certainly have one. Even though using protofile should be simple enough, there's still a problem regarding this. Some protofile use extra plugins for their proto. i.e. gogoprotobuf is a project that does just that. The problems with plugins are most of them require explicit import to the plugin inside of the protofile. It will break grpcurl proto descriptor extraction. Thus, the plugin proto must be uploaded alongside the protofile. Also, the protofile should be modified automatically to change their import to local import. Given that, I proposed a way for the user to upload multiple protofile to grpcox. Then, use that to get the descriptor. Changelog: - Add `use local proto` checkbox in HTML client. On checked it will show upload button and list of selected proto. - `get-service` ajax will use POST when `use local proto` is checked. The uploaded protofile will be the payload for the ajax request. - Add a new route to handle POST "get-service". It will persist the uploaded protofile to `/tmp/` directory and add protos field in the resource. - Modify `openDescriptor` to use local proto if protos field in the resource is available. - Modify `openDescriptor` to return an error, as opening descriptor from local proto may fail. - Modify the main server so it can be shut down gracefully. This is necessary as grpcox need to remove persisted proto right after the server is turned off. This Pull Request will resolve #16
2020-01-29 12:14:41 +00:00
// determine whether the proto connection will use local proto or not
const use_proto = $('#local-proto').is(":checked");
if (target != t || restart == "1" || use_proto) {
target = t;
} else {
return false;
}
feat(descriptor): add support for local proto descriptor Currently, grpcox depends on server reflection to get proto descriptor. It has a significant drawback, since not every grpc server support [server reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md#known-implementations). Using local proto files is more feasible, as every grpc server certainly have one. Even though using protofile should be simple enough, there's still a problem regarding this. Some protofile use extra plugins for their proto. i.e. gogoprotobuf is a project that does just that. The problems with plugins are most of them require explicit import to the plugin inside of the protofile. It will break grpcurl proto descriptor extraction. Thus, the plugin proto must be uploaded alongside the protofile. Also, the protofile should be modified automatically to change their import to local import. Given that, I proposed a way for the user to upload multiple protofile to grpcox. Then, use that to get the descriptor. Changelog: - Add `use local proto` checkbox in HTML client. On checked it will show upload button and list of selected proto. - `get-service` ajax will use POST when `use local proto` is checked. The uploaded protofile will be the payload for the ajax request. - Add a new route to handle POST "get-service". It will persist the uploaded protofile to `/tmp/` directory and add protos field in the resource. - Modify `openDescriptor` to use local proto if protos field in the resource is available. - Modify `openDescriptor` to return an error, as opening descriptor from local proto may fail. - Modify the main server so it can be shut down gracefully. This is necessary as grpcox need to remove persisted proto right after the server is turned off. This Pull Request will resolve #16
2020-01-29 12:14:41 +00:00
// prepare ajax options beforehand
// makes it easier for local proto to modify some of its properties
const ajaxProps = {
2019-03-13 03:38:30 +00:00
url: "server/"+target+"/services?restart="+restart,
2018-11-04 19:56:06 +00:00
global: true,
method: "GET",
success: function(res){
if (res.error) {
target = "";
use_tls = "";
alert(res.error);
return;
}
$("#select-service").html(new Option("Choose Service", ""));
$.each(res.data, (_, item) => $("#select-service").append(new Option(item, item)));
$('#choose-service').show();
},
error: function(_, _, errorThrown) {
target = "";
use_tls = "";
alert(errorThrown);
},
beforeSend: function(xhr){
2019-03-12 04:18:27 +00:00
$('#choose-service').hide();
2018-11-04 19:56:06 +00:00
xhr.setRequestHeader('use_tls', use_tls);
$(this).html("Loading...");
2019-03-12 04:18:27 +00:00
show_loading();
2018-11-04 19:56:06 +00:00
},
complete: function(){
2019-03-13 03:38:30 +00:00
applyConnCount();
2018-11-04 19:56:06 +00:00
$(this).html(button);
2019-03-12 04:18:27 +00:00
hide_loading();
2018-11-04 19:56:06 +00:00
}
feat(descriptor): add support for local proto descriptor Currently, grpcox depends on server reflection to get proto descriptor. It has a significant drawback, since not every grpc server support [server reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md#known-implementations). Using local proto files is more feasible, as every grpc server certainly have one. Even though using protofile should be simple enough, there's still a problem regarding this. Some protofile use extra plugins for their proto. i.e. gogoprotobuf is a project that does just that. The problems with plugins are most of them require explicit import to the plugin inside of the protofile. It will break grpcurl proto descriptor extraction. Thus, the plugin proto must be uploaded alongside the protofile. Also, the protofile should be modified automatically to change their import to local import. Given that, I proposed a way for the user to upload multiple protofile to grpcox. Then, use that to get the descriptor. Changelog: - Add `use local proto` checkbox in HTML client. On checked it will show upload button and list of selected proto. - `get-service` ajax will use POST when `use local proto` is checked. The uploaded protofile will be the payload for the ajax request. - Add a new route to handle POST "get-service". It will persist the uploaded protofile to `/tmp/` directory and add protos field in the resource. - Modify `openDescriptor` to use local proto if protos field in the resource is available. - Modify `openDescriptor` to return an error, as opening descriptor from local proto may fail. - Modify the main server so it can be shut down gracefully. This is necessary as grpcox need to remove persisted proto right after the server is turned off. This Pull Request will resolve #16
2020-01-29 12:14:41 +00:00
};
// modify ajax options if use local proto
if (use_proto) {
ajaxProps.method = "POST";
ajaxProps.enctype = "multipart/form-data";
ajaxProps.processData = false;
ajaxProps.contentType = false;
ajaxProps.cache = false;
ajaxProps.data = getProtos();
}
$('.other-elem').hide();
var button = $(this).html();
$.ajax(ajaxProps);
2018-11-04 19:56:06 +00:00
});
$('#select-service').change(function(){
var selected = $(this).val();
if (selected == "") {
return false;
}
$('#body-request').hide();
$('#response').hide();
$.ajax({
url: "server/"+target+"/service/"+selected+"/functions",
global: true,
method: "GET",
success: function(res){
if (res.error) {
alert(res.error);
return;
}
2018-11-05 03:57:30 +00:00
$("#select-function").html(new Option("Choose Method", ""));
2018-11-04 19:56:06 +00:00
$.each(res.data, (_, item) => $("#select-function").append(new Option(item.substr(selected.length) , item)));
$('#choose-function').show();
},
error: err,
beforeSend: function(xhr){
2019-03-12 04:18:27 +00:00
$('#choose-function').hide();
2018-11-04 19:56:06 +00:00
xhr.setRequestHeader('use_tls', use_tls);
show_loading();
},
complete: function(){
hide_loading();
}
});
});
$('#select-function').change(function(){
var selected = $(this).val();
if (selected == "") {
return false;
}
$('#response').hide();
$.ajax({
url: "server/"+target+"/function/"+selected+"/describe",
global: true,
method: "GET",
success: function(res){
if (res.error) {
alert(res.error);
return;
}
generate_editor(res.data.template);
$("#schema-proto").html(PR.prettyPrintOne(res.data.schema));
$('#body-request').show();
},
error: err,
beforeSend: function(xhr){
2019-03-12 04:18:27 +00:00
$('#body-request').hide();
2018-11-04 19:56:06 +00:00
xhr.setRequestHeader('use_tls', use_tls);
show_loading();
},
complete: function(){
hide_loading();
}
});
});
$('#invoke-func').click(function(){
2020-06-01 17:22:22 +00:00
// use metadata if there is any
ctxArr = [];
$(".ctx-metadata-input-field").each(function(index, val){
ctxArr.push($(val).text())
});
2018-11-04 19:56:06 +00:00
var func = $('#select-function').val();
if (func == "") {
return false;
}
var body = editor.getValue();
var button = $(this).html();
$.ajax({
url: "server/"+target+"/function/"+func+"/invoke",
global: true,
method: "POST",
data: body,
dataType: "json",
success: function(res){
if (res.error) {
alert(res.error);
return;
}
$("#json-response").html(PR.prettyPrintOne(res.data.result));
$("#timer-resp span").html(res.data.timer);
$('#response').show();
},
error: err,
beforeSend: function(xhr){
2019-03-12 04:18:27 +00:00
$('#response').hide();
2018-11-04 19:56:06 +00:00
xhr.setRequestHeader('use_tls', use_tls);
2020-06-01 17:22:22 +00:00
if(ctxUse) {
xhr.setRequestHeader('Metadata', ctxArr);
}
2018-11-04 19:56:06 +00:00
$(this).html("Loading...");
2019-03-12 04:18:27 +00:00
show_loading();
2018-11-04 19:56:06 +00:00
},
complete: function(){
$(this).html(button);
2019-03-12 04:18:27 +00:00
hide_loading();
2018-11-04 19:56:06 +00:00
}
});
});
function generate_editor(content) {
if(editor) {
editor.setValue(content);
return true;
}
$("#editor").html(content);
editor = ace.edit("editor");
editor.setOptions({
maxLines: Infinity
});
editor.renderer.setScrollMargin(10, 10, 10, 10);
editor.setTheme("ace/theme/github");
editor.session.setMode("ace/mode/json");
editor.renderer.setShowGutter(false);
}
function get_valid_target() {
t = $('#server-target').val().trim();
if (t == "") {
return target;
}
ts = t.split("://");
if (ts.length > 1) {
$('#server-target').val(ts[1]);
return ts[1];
}
return ts[0];
}
function err(_, _, errorThrown) {
alert(errorThrown);
}
function show_loading() {
2019-03-12 04:18:27 +00:00
$('.spinner').show();
2018-11-04 19:56:06 +00:00
}
function hide_loading() {
2019-03-12 04:18:27 +00:00
$('.spinner').hide();
2019-03-13 03:38:30 +00:00
}
$(".connections ul").on("click", "i", function(){
2019-04-05 01:58:49 +00:00
$icon = $(this);
2019-03-13 03:38:30 +00:00
$parent = $(this).parent("li");
var ip = $(this).siblings("span").text();
$.ajax({
2019-03-21 02:43:47 +00:00
url: "active/close/" + ip,
2019-03-13 03:38:30 +00:00
global: true,
method: "DELETE",
success: function(res){
2019-04-05 01:58:49 +00:00
$('[data-toggle="tooltip"]').tooltip('hide');
2019-03-13 03:38:30 +00:00
if(res.data.success) {
$parent.remove();
updateCountNum();
}
},
error: err,
beforeSend: function(xhr){
2019-04-05 01:58:49 +00:00
$icon.attr('class', 'fa fa-spinner');
2019-03-13 03:38:30 +00:00
},
});
});
function updateCountNum() {
$(".connections .title span").html($(".connections ul li").length);
}
function applyConnCount() {
$('[data-toggle="tooltip"]').tooltip('hide');
2019-03-13 03:38:30 +00:00
$.ajax({
url: "active/get",
global: true,
method: "GET",
success: function(res){
$(".connections .title span").html(res.data.length);
$(".connections .nav").html("");
res.data.forEach(function(item){
$list = $("#conn-list-template").clone();
$list.find(".ip").html(item);
$(".connections .nav").append($list.html());
});
refreshToolTip();
2019-03-13 03:38:30 +00:00
},
error: function (_, _, thrownError) {
console.warn("Failed to update active connections", thrownError)
},
2019-03-13 03:38:30 +00:00
});
}
function refreshConnCount() {
applyConnCount();
setTimeout(refreshConnCount, 10000);
2019-03-13 03:38:30 +00:00
}
function refreshToolTip() {
$(function () {
2019-04-02 02:45:50 +00:00
$('[data-toggle="tooltip"]').tooltip('dispose');
$('[data-toggle="tooltip"]').tooltip();
})
}
2019-03-13 03:38:30 +00:00
$(document).ready(function(){
refreshConnCount();
});