@@ -43,18 +43,21 @@ interface LabelEdges {
4343interface GetGraphParams {
4444 services : GraphContextServices ;
4545 query : {
46- showUnknownTarget : boolean ;
4746 eventIds : string [ ] ;
4847 spaceId ?: string ;
4948 start : string | number ;
5049 end : string | number ;
5150 esQuery ?: EsQuery ;
5251 } ;
52+ showUnknownTarget : boolean ;
53+ nodesLimit ?: number ;
5354}
5455
5556export const getGraph = async ( {
5657 services : { esClient, logger } ,
57- query : { eventIds, showUnknownTarget, spaceId = 'default' , start, end, esQuery } ,
58+ query : { eventIds, spaceId = 'default' , start, end, esQuery } ,
59+ showUnknownTarget,
60+ nodesLimit,
5861} : GetGraphParams ) : Promise < {
5962 nodes : NodeDataModel [ ] ;
6063 edges : EdgeDataModel [ ] ;
@@ -72,22 +75,31 @@ export const getGraph = async ({
7275 } ) ;
7376
7477 // Convert results into set of nodes and edges
75- const graphContext = parseRecords ( logger , results . records ) ;
78+ const graphContext = parseRecords ( logger , results . records , nodesLimit ) ;
7679
7780 return { nodes : graphContext . nodes , edges : graphContext . edges } ;
7881} ;
7982
8083interface ParseContext {
81- nodesMap : Record < string , NodeDataModel > ;
82- edgesMap : Record < string , EdgeDataModel > ;
83- edgeLabelsNodes : Record < string , string [ ] > ;
84- labelEdges : Record < string , LabelEdges > ;
84+ readonly nodesLimit ?: number ;
85+ readonly nodesMap : Record < string , NodeDataModel > ;
86+ readonly edgesMap : Record < string , EdgeDataModel > ;
87+ readonly edgeLabelsNodes : Record < string , string [ ] > ;
88+ readonly labelEdges : Record < string , LabelEdges > ;
89+ readonly logger : Logger ;
8590}
8691
87- const parseRecords = ( logger : Logger , records : GraphEdge [ ] ) : GraphContext => {
88- const ctx : ParseContext = { nodesMap : { } , edgeLabelsNodes : { } , edgesMap : { } , labelEdges : { } } ;
92+ const parseRecords = ( logger : Logger , records : GraphEdge [ ] , nodesLimit ?: number ) : GraphContext => {
93+ const ctx : ParseContext = {
94+ nodesLimit,
95+ logger,
96+ nodesMap : { } ,
97+ edgeLabelsNodes : { } ,
98+ edgesMap : { } ,
99+ labelEdges : { } ,
100+ } ;
89101
90- logger . trace ( `Parsing records [length: ${ records . length } ]` ) ;
102+ logger . trace ( `Parsing records [length: ${ records . length } ] [nodesLimit: ${ nodesLimit ?? 'none' } ] ` ) ;
91103
92104 createNodes ( records , ctx ) ;
93105 createEdgesAndGroups ( ctx ) ;
@@ -205,6 +217,15 @@ const createNodes = (records: GraphEdge[], context: Omit<ParseContext, 'edgesMap
205217 const { nodesMap, edgeLabelsNodes, labelEdges } = context ;
206218
207219 for ( const record of records ) {
220+ if ( context . nodesLimit !== undefined && Object . keys ( nodesMap ) . length >= context . nodesLimit ) {
221+ context . logger . debug (
222+ `Reached nodes limit [limit: ${ context . nodesLimit } ] [current: ${
223+ Object . keys ( nodesMap ) . length
224+ } ]`
225+ ) ;
226+ break ;
227+ }
228+
208229 const { ips, hosts, users, actorIds, action, targetIds, isAlert, eventOutcome } = record ;
209230 const actorIdsArray = castArray ( actorIds ) ;
210231 const targetIdsArray = castArray ( targetIds ) ;
0 commit comments