66import assert from 'node:assert' ;
77import { describe , it } from 'node:test' ;
88
9- import type { Browser , Frame , Page , PageEvents } from 'puppeteer-core' ;
9+ import type { Browser , Frame , Page , Target } from 'puppeteer-core' ;
1010
1111import { PageCollector } from '../src/PageCollector.js' ;
1212
1313import { getMockRequest } from './utils.js' ;
1414
15- function getMockPage ( ) : Page {
16- const listeners : Record < keyof PageEvents , ( data : unknown ) => void > = { } ;
17- const mainFrame = { } as Frame ;
15+ function mockListener ( ) {
16+ const listeners : Record < string , Array < ( data : unknown ) => void > > = { } ;
1817 return {
19- on ( eventName , listener ) {
20- listeners [ eventName ] = listener ;
18+ on ( eventName : string , listener : ( data : unknown ) => void ) {
19+ if ( listeners [ eventName ] ) {
20+ listeners [ eventName ] . push ( listener ) ;
21+ } else {
22+ listeners [ eventName ] = [ listener ] ;
23+ }
2124 } ,
22- emit ( eventName , data ) {
23- listeners [ eventName ] ?.( data ) ;
25+ emit ( eventName : string , data : unknown ) {
26+ for ( const listener of listeners [ eventName ] ?? [ ] ) {
27+ listener ( data ) ;
28+ }
2429 } ,
30+ } ;
31+ }
32+
33+ function getMockPage ( ) : Page {
34+ const mainFrame = { } as Frame ;
35+ return {
2536 mainFrame ( ) {
2637 return mainFrame ;
2738 } ,
39+ ...mockListener ( ) ,
2840 } as Page ;
2941}
3042
@@ -34,9 +46,7 @@ function getMockBrowser(): Browser {
3446 pages ( ) {
3547 return Promise . resolve ( pages ) ;
3648 } ,
37- on ( _type , _handler ) {
38- // Mock
39- } ,
49+ ...mockListener ( ) ,
4050 } as Browser ;
4151}
4252
@@ -113,4 +123,34 @@ describe('PageCollector', () => {
113123
114124 assert . equal ( collector . getData ( page ) . length , 1 ) ;
115125 } ) ;
126+
127+ it ( 'should only subscribe once' , async ( ) => {
128+ const browser = getMockBrowser ( ) ;
129+ const page = ( await browser . pages ( ) ) [ 0 ] ;
130+ const request = getMockRequest ( ) ;
131+ const collector = new PageCollector ( browser , ( pageListener , collect ) => {
132+ pageListener . on ( 'request' , req => {
133+ collect ( req ) ;
134+ } ) ;
135+ } ) ;
136+ await collector . init ( ) ;
137+ browser . emit ( 'targetcreated' , {
138+ page ( ) {
139+ return Promise . resolve ( page ) ;
140+ } ,
141+ } as Target ) ;
142+
143+ // The page inside part is async so we need to await some time
144+ await new Promise < void > ( res => res ( ) ) ;
145+
146+ assert . equal ( collector . getData ( page ) . length , 0 ) ;
147+
148+ page . emit ( 'request' , request ) ;
149+
150+ assert . equal ( collector . getData ( page ) . length , 1 ) ;
151+
152+ page . emit ( 'request' , request ) ;
153+
154+ assert . equal ( collector . getData ( page ) . length , 2 ) ;
155+ } ) ;
116156} ) ;
0 commit comments