var textRenderer = new AnsiUp();
function parseTimestamps() {
$("span.ts").each(function(idx, el) {
if ($(el).data("loaded")) return;
var unixTime = parseInt($(el).text()) / 1000;
$(el).
data("loaded", true).
text(moment.unix(unixTime).format("MM/DD/YYYY, h:mm:ss a"));
});
}
function resetLogLines() {
$(".lines").html("");
}
function setLines(events, nextToken) {
var lines = [];
for (var i = 0; i < events.length; i++) {
var event = events[i];
var item = "
\
" + event.Timestamp + " \
" + event.LogStreamName + " \
" + textRenderer.ansi_to_html(event.Message) + " \
";
lines.push(item);
}
$("#results").data("next", nextToken);
lines.push("load more
");
if ($("#results").data("append")) {
$(lines.join("\n")).appendTo(".lines");
} else {
$(".lines").html(lines.join("\n"));
}
parseTimestamps();
}
function fetch() {
$("form").submit();
}
function loadInitialSearch() {
var q = window.location.search.split("?")[1] || "";
var chunks = q.split("&");
var params = {};
for (var i = 0; i < chunks.length; i++) {
var kv = chunks[i].split("=");
if (kv[0] == "filter") {
try {
kv[1] = atob(kv[1]);
}
catch(err) {
console.log("cant parse out filter value:", err);
}
}
params[kv[0]] = unescape(kv[1]);
}
if (params.filter) $("#filter").val(params.filter);
if (params.start_time) $("#start_time").val(params.start_time);
if (params.group) {
$("#log_group").val(params.group);
loadGroupStreams(params.group, function() {
if (params.stream) {
$("#log_stream").val(params.stream);
}
fetch();
});
}
}
function loadGroupStreams(group, cb) {
$.get("/streams", { group: group }, function (resp) {
var opts = ["All Streams"];
for (var i = 0; i < resp.length; i++) {
opts.push(" " + resp[i].LogStreamName + " ");
}
$("#log_stream").html(opts.join("\n"));
if (cb) {
cb();
}
});
}
function fetchLogEvents(form) {
var formData = form.serializeArray();
var params = [];
for (var i = 0; i < formData.length; i++) {
var field = formData[i];
if (field.name == "next_token") continue;
if (field.name == "filter") {
field.value = btoa(field.value);
}
params.push(field.name + "=" + field.value);
}
var url = "/?" + params.join("&");
history.pushState(params, "search", url);
$.ajax({
method: "POST",
url: "/logs",
data: form.serialize(),
success: function (data) {
$("#results").data("loading", false);
$("#error").text("").hide();
setLines(data.Events, data.NextToken);
},
error: function (xhr) {
$("#results").data("loading", false);
$("#results .lines").html("");
$("#error").text(xhr.responseJSON.error).show();
}
});
}
$(function() {
loadInitialSearch();
$("form").on("submit", function(e) {
e.preventDefault();
fetchLogEvents($(this));
});
$("#log_group").on("change", function() {
$("#results").data("append", false);
$("#log_stream").val("");
$("#start_time").val("5m");
$("#next_token").val("");
$("#filter").val("");
$("#results").scrollTop(0);
loadGroupStreams($(this).val());
fetch();
});
$("#log_stream").on("change", function () {
$("#results").data("append", false);
$("#next_token").val("");
$("#results").scrollTop(0);
fetch();
});
$("#start_time").on("change", function() {
$("#results").data("append", false);
$("#next_token").val("");
$("#results").scrollTop(0);
fetch();
});
$("#filter").on("change", function() {
$("#results").data("append", false);
$("#next_token").val("");
$("#results").scrollTop(0);
});
$("body").on("click", "span.src", function(e) {
var stream = $(this).text();
$("#log_stream").val(stream);
fetch();
});
$("#results").on("scroll", function(e) {
var height = $("#results .lines").height();
var containerHeight = $("#results").height();
var offset = Math.abs($("#results .lines").offset().top);
var scrollPercent = ((containerHeight + offset) * 100) / height;
if (scrollPercent < 95) {
return;
}
var loading = $("#results").data("loading");
if (loading) return;
var token = $("#results").data("next");
if (!token) return;
$("#next_token").val(token);
$("#results").data("loading", true);
$("#results").data("append", true);
fetch();
});
});