* -------------------------------------------------------------------------
* This file is part of the MindStudio project.
* Copyright (c) 2025 Huawei Technologies Co.,Ltd.
*
* MindStudio is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*/
import { makeAutoObservable } from 'mobx';
import { type BlocksTableData, EvenItem, EventsTableData, ThreShold } from '../utils/RequestUtils';
import { type MenuItemModel } from '../components/ContextMenu';
interface TypeOption {
label: string | number;
value: string | number;
}
interface ContextMenu {
visible: boolean;
xPos: number;
yPos: number;
}
interface MarkStamps {
first: number;
last: number;
}
export const LEAKS_WORKER_INFO_DEFAULT = {
sizeInfo: {
maxTimestamp: 0,
minTimestamp: 0,
maxSize: 0,
minSize: 0,
},
renderOptions: {
transform: {
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
},
viewport: {
width: 0,
height: 0,
},
zoom: {
x: 1,
y: 1,
offset: 0,
},
},
mousePosition: {
x: -1,
y: -1,
},
hoverItem: null,
clickItem: null,
};
export const MARK_LINE_POSITION_DEFAULT = {
block: { x: -1, y: -1 },
stack: { x: -1, y: -1 },
currentTimestamp: -1,
};
export const STATE_WORKER_INFO_DEFAULT = {
renderOptions: {
transform: { x: 0, y: 0, scaleX: 1, scaleY: 1 },
viewport: { width: 0, height: 0 },
zoom: { x: 1, y: 1, offset: 0 },
},
hoverItem: null,
clickItem: null,
eventId: -1,
};
export class Session {
module: 'memsnapshot' | 'leaks' = 'leaks';
language: 'zhCN' | 'enUS' = 'enUS';
deviceIds: any = {};
threadIds: number[] = [];
blockData: any = { blocks: [], minSize: 0, maxSize: 0, minTimestamp: 0, maxTimestamp: 0 };
allocationData: any = { allocations: [], maxTimestamp: 0, minTimestamp: 0 };
memoryData: any = { size: 0, name: '', subNodes: [] };
funcData: any = { traces: [], maxTimestamp: 0, minTimestamp: 0 };
memoryStamp: number = 0;
deviceId: string = '';
eventType: string = '';
threadId: number | string = '';
maxTime: number = 0;
minTime: number = 0;
deviceIdOpts: TypeOption[] = [];
typeOpts: TypeOption[] = [];
threadOps: TypeOption[] = [];
legendSelect: any = {};
synStartTime: number = 0;
synEndTime: number = 0;
searchFunc: string[] = [];
funcOptions: any = [];
threadFlag: boolean = false;
maxDepth: number = 0;
tableType: 'blocks' | 'events' = 'blocks';
blocksTableData: BlocksTableData['blocks'] = [];
eventsTableData: EventsTableData['events'] = [];
blocksTableHeader: BlocksTableData['headers'] = [];
eventsTableHeader: EventsTableData['headers'] = [];
blocksOrder: boolean | string = '';
eventsOrder: boolean | string = '';
blocksOrderBy: string = '';
eventsOrderBy: string = '';
blocksFilters: { [key: string]: string } = {};
blocksRangeFilters: { [key: string]: number[] } = {};
eventsFilters: { [key: string]: string } = {};
eventsRangeFilters: { [key: string]: number[] } = {};
blocksCurrentPage: number = 1;
eventsCurrentPage: number = 1;
blocksPageSize: number = 10;
eventsPageSize: number = 10;
blocksTotal: number = 0;
eventsTotal: number = 0;
tableKey: number = 0;
firstOffset: number = 0;
lastOffset: number = 0;
firstLastStamps: MarkStamps = { first: 0, last: 0 };
markLineshow: 'none' | 'block' = 'none';
allowMark: boolean = true;
contextMenu: ContextMenu = { visible: false, xPos: 0, yPos: 0 };
menuItems: MenuItemModel[] = [];
lazyUsedThreshold: ThreShold = { perT: null, valueT: null };
delayedFreeThreshold: ThreShold = { perT: null, valueT: null };
longIdleThreshold: ThreShold = { perT: null, valueT: null };
onlyInefficient: boolean = false;
allowTrim: boolean = true;
leaksWorkerInfo: {
sizeInfo: Omit<RenderData, 'blocks'>;
renderOptions: RenderOptions;
hoverItem: Block | null;
clickItem: Block | null;
} = LEAKS_WORKER_INFO_DEFAULT;
markLineInfo: {
block: { x: number; y: number };
stack: { x: number; y: number };
currentTimestamp: number;
} = MARK_LINE_POSITION_DEFAULT;
stateWorkerInfo: {
renderOptions: RenderOptions;
hoverItem: StateDataHoverResult | null;
clickItem: StateDataHoverResult | null;
eventId: number;
} = { ...STATE_WORKER_INFO_DEFAULT };
clickEventItem: EvenItem | null = null;
pendingEventLocate: { eventId: number; deviceId: string } | null = null;
pendingBlockLocateId: number | null = null;
selectionVersion: number = 0;
leakStats: { totalSize: number; maxSize: number; minSize: number; loading: boolean; error: boolean; requestId: number } = {
totalSize: 0,
maxSize: 0,
minSize: 0,
loading: false,
error: false,
requestId: 0,
};
autoFilterPotentialLeaks: boolean = false;
loadingBlocks: boolean = false;
loadingFunc: boolean = false;
loadingState: boolean = false;
memSnapshotParseLoading: boolean = false;
memSnapshotParseProgress: number = 0;
memSnapshotParseFileId: string = '';
constructor() {
makeAutoObservable(this);
}
}