11import * as net from 'net' ;
22import { expect } from "chai" ;
33
4- import { getAdminServer , getLocal , getRemote } from "../../.." ;
4+ import { getAdminServer , getLocal , getRemote , RawPassthroughDataEvent , RawPassthroughEvent } from "../../.." ;
55import {
66 sendRawRequest ,
77 openSocksSocket ,
88 makeDestroyable ,
99 nodeOnly ,
10- delay
10+ delay ,
11+ getDeferred
1112} from "../../test-utils" ;
1213
1314nodeOnly ( ( ) => {
@@ -21,7 +22,7 @@ nodeOnly(() => {
2122 // Simple TCP echo server:
2223 let remoteServer = makeDestroyable ( net . createServer ( ( socket ) => {
2324 socket . on ( 'data' , ( data ) => {
24- socket . end ( data ) ;
25+ socket . write ( data ) ;
2526 } ) ;
2627 } ) ) ;
2728 let remotePort ! : number ;
@@ -65,6 +66,50 @@ nodeOnly(() => {
6566 expect ( openEvent . upstreamPort ) . to . equal ( remotePort ) ;
6667 } ) ;
6768
69+ it ( "should expose sent & received data" , async ( ) => {
70+ const openDeferred = getDeferred < RawPassthroughEvent > ( ) ;
71+ let dataEvents = [ ] as RawPassthroughDataEvent [ ] ;
72+
73+ await server . on ( 'raw-passthrough-opened' , ( e ) => openDeferred . resolve ( e ) ) ;
74+ await server . on ( 'raw-passthrough-data' , ( e ) => dataEvents . push ( e ) ) ;
75+
76+ const socksSocket = await openSocksSocket ( server , 'localhost' , remotePort ) ;
77+
78+ socksSocket . write ( 'hello' ) ;
79+
80+ const openEvent = await openDeferred ;
81+ await delay ( 10 ) ;
82+
83+ expect ( dataEvents . length ) . to . equal ( 2 ) ;
84+ const [ firstDataEvent , secondDataEvent ] = dataEvents ;
85+ dataEvents = [ ] ;
86+
87+ expect ( firstDataEvent . id ) . to . equal ( openEvent . id ) ;
88+ expect ( firstDataEvent . direction ) . to . equal ( 'received' ) ;
89+ expect ( firstDataEvent . content . toString ( ) ) . to . equal ( 'hello' ) ;
90+
91+ expect ( secondDataEvent . id ) . to . equal ( openEvent . id ) ;
92+ expect ( secondDataEvent . direction ) . to . equal ( 'sent' ) ;
93+ expect ( secondDataEvent . content . toString ( ) ) . to . equal ( 'hello' ) ;
94+ expect ( secondDataEvent . eventTimestamp ) . to . be . greaterThan ( firstDataEvent . eventTimestamp ) ;
95+
96+ socksSocket . write ( 'world' ) ;
97+ await delay ( 10 ) ;
98+
99+ expect ( dataEvents . length ) . to . equal ( 2 ) ;
100+ const [ thirdDataEvent , fourthDataEvent ] = dataEvents ;
101+
102+ expect ( thirdDataEvent . id ) . to . equal ( openEvent . id ) ;
103+ expect ( thirdDataEvent . direction ) . to . equal ( 'received' ) ;
104+ expect ( thirdDataEvent . content . toString ( ) ) . to . equal ( 'world' ) ;
105+ expect ( thirdDataEvent . eventTimestamp ) . to . be . greaterThan ( secondDataEvent . eventTimestamp ) ;
106+
107+ expect ( fourthDataEvent . id ) . to . equal ( openEvent . id ) ;
108+ expect ( fourthDataEvent . direction ) . to . equal ( 'sent' ) ;
109+ expect ( fourthDataEvent . content . toString ( ) ) . to . equal ( 'world' ) ;
110+ expect ( fourthDataEvent . eventTimestamp ) . to . be . greaterThan ( thirdDataEvent . eventTimestamp ) ;
111+ } ) ;
112+
68113 describe ( "with a remote client" , ( ) => {
69114 const adminServer = getAdminServer ( ) ;
70115 const remoteClient = getRemote ( {
@@ -84,6 +129,7 @@ nodeOnly(() => {
84129 it ( "should fire for raw sockets that are passed through SOCKS" , async ( ) => {
85130 const events : any [ ] = [ ] ;
86131 await remoteClient . on ( 'raw-passthrough-opened' , ( e ) => events . push ( e ) ) ;
132+ await remoteClient . on ( 'raw-passthrough-data' , ( e ) => events . push ( e ) ) ;
87133 await remoteClient . on ( 'raw-passthrough-closed' , ( e ) => events . push ( e ) ) ;
88134
89135 const socksSocket = await openSocksSocket ( remoteClient , 'localhost' , remotePort ) ;
@@ -92,12 +138,21 @@ nodeOnly(() => {
92138
93139 await delay ( 10 ) ;
94140
95- expect ( events . length ) . to . equal ( 2 ) ;
96- const [ openEvent , closeEvent ] = events ;
141+ expect ( events . length ) . to . equal ( 4 ) ;
142+ const [ openEvent , receivedEvent , sentEvent , closeEvent ] = events ;
143+ expect ( receivedEvent . id ) . to . equal ( openEvent . id ) ;
144+ expect ( sentEvent . id ) . to . equal ( openEvent . id ) ;
97145 expect ( openEvent . id ) . to . equal ( closeEvent . id ) ;
98146
99147 expect ( openEvent . upstreamHost ) . to . equal ( 'localhost' ) ;
100148 expect ( openEvent . upstreamPort ) . to . equal ( remotePort ) ;
149+
150+ expect ( receivedEvent . content . toString ( ) ) . to . equal ( '123456789' ) ;
151+ expect ( receivedEvent . direction ) . to . equal ( 'received' ) ;
152+ expect ( receivedEvent . eventTimestamp ) . to . be . greaterThan ( openEvent . timingEvents . connectTimestamp ) ;
153+ expect ( sentEvent . content . toString ( ) ) . to . equal ( '123456789' ) ;
154+ expect ( sentEvent . direction ) . to . equal ( 'sent' ) ;
155+ expect ( sentEvent . eventTimestamp ) . to . be . greaterThan ( receivedEvent . eventTimestamp ) ;
101156 } ) ;
102157 } ) ;
103158
0 commit comments