mirror of
https://github.com/lifegpc/eh-downloader.git
synced 2026-06-06 05:38:44 +08:00
feat: Add log filtering options to real-time log streaming
This commit is contained in:
@@ -1,13 +1,27 @@
|
|||||||
import { Handlers } from "$fresh/server.ts";
|
import { Handlers } from "$fresh/server.ts";
|
||||||
import { return_error } from "../../../server/utils.ts";
|
import { return_error } from "../../../server/utils.ts";
|
||||||
import { User, UserPermission } from "../../../db.ts";
|
import { User, UserPermission } from "../../../db.ts";
|
||||||
import { base_logger, LogEntry } from "../../../utils/logger.ts";
|
import { base_logger, LogEntry, LogLevel } from "../../../utils/logger.ts";
|
||||||
import { ExitTarget } from "../../../signal_handler.ts";
|
import { ExitTarget } from "../../../signal_handler.ts";
|
||||||
import { toJSON } from "../../../utils.ts";
|
import { DiscriminatedUnion, toJSON } from "../../../utils.ts";
|
||||||
|
|
||||||
|
export type LogFilterOptions = {
|
||||||
|
min_level?: number;
|
||||||
|
type?: string;
|
||||||
|
allowed_level?: number[];
|
||||||
|
};
|
||||||
|
|
||||||
|
type Detail<T extends Record<PropertyKey, unknown>> = {
|
||||||
|
[P in keyof T]: { detail: T[P] };
|
||||||
|
};
|
||||||
|
|
||||||
|
type ClientMap = {
|
||||||
|
log_options: LogFilterOptions;
|
||||||
|
};
|
||||||
|
|
||||||
export type LogRealtimeClientData = { type: "ping" } | { type: "close" } | {
|
export type LogRealtimeClientData = { type: "ping" } | { type: "close" } | {
|
||||||
type: "pong";
|
type: "pong";
|
||||||
};
|
} | DiscriminatedUnion<"type", Detail<ClientMap>>;
|
||||||
|
|
||||||
export const handler: Handlers = {
|
export const handler: Handlers = {
|
||||||
GET(req, ctx) {
|
GET(req, ctx) {
|
||||||
@@ -19,11 +33,34 @@ export const handler: Handlers = {
|
|||||||
return return_error(403, "Permission denied.");
|
return return_error(403, "Permission denied.");
|
||||||
}
|
}
|
||||||
const { socket, response } = Deno.upgradeWebSocket(req);
|
const { socket, response } = Deno.upgradeWebSocket(req);
|
||||||
|
let options: LogFilterOptions = {
|
||||||
|
min_level: LogLevel.Info,
|
||||||
|
};
|
||||||
const handle = (
|
const handle = (
|
||||||
e: CustomEvent<LogEntry>,
|
e: CustomEvent<LogEntry>,
|
||||||
) => {
|
) => {
|
||||||
if (socket.readyState === socket.OPEN) {
|
if (socket.readyState === socket.OPEN) {
|
||||||
socket.send(toJSON({ type: e.type, detail: e.detail }));
|
if (e.type == "new_log") {
|
||||||
|
if (
|
||||||
|
options.min_level &&
|
||||||
|
e.detail.level < options.min_level
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
options.type &&
|
||||||
|
e.detail.type != options.type
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
options.allowed_level &&
|
||||||
|
!options.allowed_level.includes(e.detail.level)
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
socket.send(toJSON({ type: e.type, detail: e.detail }));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const close_handle = () => {
|
const close_handle = () => {
|
||||||
@@ -54,6 +91,8 @@ export const handler: Handlers = {
|
|||||||
socket.close();
|
socket.close();
|
||||||
} else if (d.type == "ping") {
|
} else if (d.type == "ping") {
|
||||||
sendMessage({ type: "pong" });
|
sendMessage({ type: "pong" });
|
||||||
|
} else if (d.type == "log_options") {
|
||||||
|
options = d.detail;
|
||||||
}
|
}
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
null;
|
null;
|
||||||
|
|||||||
Reference in New Issue
Block a user