1+ import fs from 'fs' ;
2+ import path from 'path' ;
3+ import os from 'os' ;
4+ import Logger , { LogLevel , StreamHandler } from '@matrixai/logger' ;
5+ import { QUICClient , QUICServer , events as quicEvents } from '@matrixai/quic' ;
6+ import { DB } from '@matrixai/db' ;
7+ import { RPCClient , RPCServer } from '@matrixai/rpc' ;
8+ import NodesAuditEventsGet from '@/nodes/agent/handlers/NodesAuditEventsGet' ;
9+ import { nodesAuditEventsGet } from '@/nodes/agent/callers' ;
10+ import * as nodesUtils from '@/nodes/utils' ;
11+
12+ import KeyRing from '@/keys/KeyRing' ;
13+ import Audit from '@/audit/Audit' ;
14+ import * as keysUtils from '@/keys/utils' ;
15+ import * as networkUtils from '@/network/utils' ;
16+ import * as tlsTestsUtils from '../../../utils/tls' ;
17+ import * as auditUtils from '@/audit/utils' ;
18+ import NodeConnectionManager from '@/nodes/NodeConnectionManager' ;
19+ import Discovery from '@/discovery/Discovery' ;
20+
21+ describe ( 'nodesAuditEventsGet' , ( ) => {
22+ const logger = new Logger ( 'nodesAuditEventsGet test' , LogLevel . WARN , [
23+ new StreamHandler ( ) ,
24+ ] ) ;
25+ const password = 'password' ;
26+ const localHost = '127.0.0.1' ;
27+
28+ let dataDir : string ;
29+
30+ let keyRing : KeyRing ;
31+ let db : DB ;
32+ let audit : Audit ;
33+ let rpcServer : RPCServer ;
34+ let quicServer : QUICServer ;
35+
36+ const clientManifest = {
37+ nodesAuditEventsGet : nodesAuditEventsGet ,
38+ } ;
39+ type ClientManifest = typeof clientManifest ;
40+ let rpcClient : RPCClient < ClientManifest > ;
41+ let quicClient : QUICClient ;
42+
43+ beforeEach ( async ( ) => {
44+ dataDir = await fs . promises . mkdtemp (
45+ path . join ( os . tmpdir ( ) , 'polykey-test-' ) ,
46+ ) ;
47+
48+ // Handler dependencies
49+ const keysPath = path . join ( dataDir , 'keys' ) ;
50+ keyRing = await KeyRing . createKeyRing ( {
51+ keysPath,
52+ password,
53+ passwordOpsLimit : keysUtils . passwordOpsLimits . min ,
54+ passwordMemLimit : keysUtils . passwordMemLimits . min ,
55+ strictMemoryLock : false ,
56+ logger,
57+ } ) ;
58+ const dbPath = path . join ( dataDir , 'db' ) ;
59+ db = await DB . createDB ( {
60+ dbPath,
61+ logger,
62+ } ) ;
63+ audit = await Audit . createAudit ( {
64+ db,
65+ nodeConnectionManager : new EventTarget ( ) as NodeConnectionManager ,
66+ discovery : new EventTarget ( ) as Discovery ,
67+ logger,
68+ } ) ;
69+
70+ // Setting up server
71+ const serverManifest = {
72+ nodesAuditEventsGet : new NodesAuditEventsGet ( {
73+ db,
74+ sigchain : { } as any , // Mock sigchain if needed
75+ } ) ,
76+ } ;
77+ rpcServer = new RPCServer ( {
78+ fromError : networkUtils . fromError ,
79+ logger,
80+ } ) ;
81+ await rpcServer . start ( { manifest : serverManifest } ) ;
82+ const tlsConfig = await tlsTestsUtils . createTLSConfig ( keyRing . keyPair ) ;
83+ quicServer = new QUICServer ( {
84+ config : {
85+ key : tlsConfig . keyPrivatePem ,
86+ cert : tlsConfig . certChainPem ,
87+ verifyPeer : false ,
88+ } ,
89+ crypto : nodesUtils . quicServerCrypto ,
90+ logger,
91+ } ) ;
92+ const handleStream = async (
93+ event : quicEvents . EventQUICConnectionStream ,
94+ ) => {
95+ // Streams are handled via the RPCServer.
96+ const stream = event . detail ;
97+ logger . info ( 'Handling new stream' ) ;
98+ rpcServer . handleStream ( stream ) ;
99+ } ;
100+ const handleConnection = async (
101+ event : quicEvents . EventQUICServerConnection ,
102+ ) => {
103+ // Needs to setup stream handler
104+ const conn = event . detail ;
105+ logger . info ( 'Handling new connection' ) ;
106+ conn . addEventListener (
107+ quicEvents . EventQUICConnectionStream . name ,
108+ handleStream ,
109+ ) ;
110+ conn . addEventListener (
111+ quicEvents . EventQUICConnectionStopped . name ,
112+ ( ) => {
113+ conn . removeEventListener (
114+ quicEvents . EventQUICConnectionStream . name ,
115+ handleStream ,
116+ ) ;
117+ } ,
118+ { once : true } ,
119+ ) ;
120+ } ;
121+ quicServer . addEventListener (
122+ quicEvents . EventQUICServerConnection . name ,
123+ handleConnection ,
124+ ) ;
125+ quicServer . addEventListener (
126+ quicEvents . EventQUICConnectionStopped . name ,
127+ ( ) => {
128+ quicServer . removeEventListener (
129+ quicEvents . EventQUICServerConnection . name ,
130+ handleConnection ,
131+ ) ;
132+ } ,
133+ { once : true } ,
134+ ) ;
135+ await quicServer . start ( {
136+ host : localHost ,
137+ } ) ;
138+
139+ // Setting up client
140+ rpcClient = new RPCClient ( {
141+ manifest : clientManifest ,
142+ streamFactory : async ( ) => {
143+ return quicClient . connection . newStream ( ) ;
144+ } ,
145+ toError : networkUtils . toError ,
146+ logger,
147+ } ) ;
148+ quicClient = await QUICClient . createQUICClient ( {
149+ crypto : nodesUtils . quicClientCrypto ,
150+ config : {
151+ verifyPeer : false ,
152+ } ,
153+ host : localHost ,
154+ port : quicServer . port ,
155+ localHost : localHost ,
156+ logger,
157+ } ) ;
158+ } ) ;
159+
160+ afterEach ( async ( ) => {
161+ await rpcServer . stop ( { force : true } ) ;
162+ await quicServer . stop ( { force : true } ) ;
163+ await audit . stop ( ) ;
164+ await db . stop ( ) ;
165+ await keyRing . stop ( ) ;
166+ } ) ;
167+
168+ test ( 'should get audit events' , async ( ) => {
169+ // Add mock audit events
170+ const mockAuditEvents = [
171+ { id : new Uint8Array ( [ 1 , 2 , 3 ] ) } ,
172+ { id : new Uint8Array ( [ 4 , 5 , 6 ] ) } ,
173+ ] ;
174+ for ( const event of mockAuditEvents ) {
175+ await audit . setAuditEvent ( [ 'node' , 'connection' , 'reverse' ] , {
176+ id : event . id ,
177+ path : [ 'node' , 'connection' ] ,
178+ data : { type : 'reverse' } ,
179+ } ) ;
180+ }
181+
182+ // Call the RPC method
183+ const response = await rpcClient . methods . nodesAuditEventsGet ( {
184+ seek : 0 , // Example seek value
185+ seekEnd : Date . now ( ) , // Example seekEnd value
186+ limit : 10 ,
187+ auditIdEncoded : undefined
188+ } ) ;
189+
190+ // Collect results
191+ const auditIds : Array < string > = [ ] ;
192+ for await ( const result of response ) {
193+ auditIds . push ( result . auditIdEncoded ?? '' ) ;
194+ }
195+
196+ // Assertions
197+ expect ( auditIds ) . toHaveLength ( mockAuditEvents . length ) ;
198+ expect ( auditIds ) . toEqual (
199+ mockAuditEvents . map ( ( event ) => auditUtils . encodeAuditEventId ( event . id ) ) ,
200+ ) ;
201+ } ) ;
202+ } ) ;
0 commit comments