refactor(traffic-monitor): Move traffic sampling/compression to a dedicated Web Worker (#5588)

* refactor(traffic-monitor): Move traffic sampling/compression to a dedicated Web Worker

* refactor(traffic-monitor): introduce shared sampler, safe fallback, and decoupled range handling

* refactor(traffic-monitor): add optional subscribe flag and fix range handling

* fix(traffic-monitor): age out idle samples and prevent ref-count updates after unmount
This commit is contained in:
Sline
2025-11-25 11:43:45 +08:00
committed by GitHub
parent caca8b2bc4
commit b83ef994f8
6 changed files with 702 additions and 228 deletions
+81
View File
@@ -0,0 +1,81 @@
export interface ITrafficDataPoint {
up: number;
down: number;
timestamp: number;
name: string;
}
export interface ISamplingConfig {
rawDataMinutes: number;
compressedDataMinutes: number;
compressionRatio: number;
}
export interface ISamplerStats {
rawBufferSize: number;
compressedBufferSize: number;
compressionQueueSize: number;
totalMemoryPoints: number;
}
export interface ITrafficWorkerInitMessage {
type: "init";
config: ISamplingConfig & {
snapshotIntervalMs: number;
defaultRangeMinutes: number;
};
}
export interface ITrafficWorkerAppendMessage {
type: "append";
payload: {
up: number;
down: number;
timestamp?: number;
};
}
export interface ITrafficWorkerClearMessage {
type: "clear";
}
export interface ITrafficWorkerSetRangeMessage {
type: "setRange";
minutes: number;
}
export interface ITrafficWorkerRequestSnapshotMessage {
type: "requestSnapshot";
}
export type TrafficWorkerRequestMessage =
| ITrafficWorkerInitMessage
| ITrafficWorkerAppendMessage
| ITrafficWorkerClearMessage
| ITrafficWorkerSetRangeMessage
| ITrafficWorkerRequestSnapshotMessage;
export interface ITrafficWorkerSnapshotMessage {
type: "snapshot";
dataPoints: ITrafficDataPoint[];
availableDataPoints: ITrafficDataPoint[];
samplerStats: ISamplerStats;
rangeMinutes: number;
lastTimestamp?: number;
reason:
| "init"
| "interval"
| "range-change"
| "request"
| "append-throttle"
| "clear";
}
export interface ITrafficWorkerLogMessage {
type: "log";
message: string;
}
export type TrafficWorkerResponseMessage =
| ITrafficWorkerSnapshotMessage
| ITrafficWorkerLogMessage;