@@ -11,22 +11,24 @@ import { ServerChannelTransport, getServerChannel } from '../get-server-channel'
1111describe ( 'getServerChannel' , ( ) => {
1212 it ( 'should return a channel' , ( ) => {
1313 const server = { on : vi . fn ( ) } as any as Server ;
14- const result = getServerChannel ( server ) ;
14+ const result = getServerChannel ( server , 'test-token-123' ) ;
1515 expect ( result ) . toBeInstanceOf ( Channel ) ;
1616 } ) ;
1717
1818 it ( 'should attach to the http server' , ( ) => {
1919 const server = { on : vi . fn ( ) } as any as Server ;
20- getServerChannel ( server ) ;
20+ getServerChannel ( server , 'test-token-123' ) ;
2121 expect ( server . on ) . toHaveBeenCalledWith ( 'upgrade' , expect . any ( Function ) ) ;
2222 } ) ;
2323} ) ;
2424
2525describe ( 'ServerChannelTransport' , ( ) => {
26+ const mockToken = 'test-token-123' ;
27+
2628 it ( 'parses simple JSON' , ( ) => {
2729 const server = new EventEmitter ( ) as any as Server ;
2830 const socket = new EventEmitter ( ) ;
29- const transport = new ServerChannelTransport ( server ) ;
31+ const transport = new ServerChannelTransport ( server , mockToken ) ;
3032 const handler = vi . fn ( ) ;
3133 transport . setHandler ( handler ) ;
3234
@@ -36,10 +38,11 @@ describe('ServerChannelTransport', () => {
3638
3739 expect ( handler ) . toHaveBeenCalledWith ( 'hello' ) ;
3840 } ) ;
41+
3942 it ( 'parses object JSON' , ( ) => {
4043 const server = new EventEmitter ( ) as any as Server ;
4144 const socket = new EventEmitter ( ) ;
42- const transport = new ServerChannelTransport ( server ) ;
45+ const transport = new ServerChannelTransport ( server , mockToken ) ;
4346 const handler = vi . fn ( ) ;
4447 transport . setHandler ( handler ) ;
4548
@@ -49,10 +52,11 @@ describe('ServerChannelTransport', () => {
4952
5053 expect ( handler ) . toHaveBeenCalledWith ( { type : 'hello' } ) ;
5154 } ) ;
55+
5256 it ( 'supports telejson cyclical data' , ( ) => {
5357 const server = new EventEmitter ( ) as any as Server ;
5458 const socket = new EventEmitter ( ) ;
55- const transport = new ServerChannelTransport ( server ) ;
59+ const transport = new ServerChannelTransport ( server , mockToken ) ;
5660 const handler = vi . fn ( ) ;
5761 transport . setHandler ( handler ) ;
5862
@@ -70,4 +74,71 @@ describe('ServerChannelTransport', () => {
7074 }
7175 ` ) ;
7276 } ) ;
77+
78+ it ( 'skips telejson classes and functions in data' , ( ) => {
79+ const server = new EventEmitter ( ) as any as Server ;
80+ const socket = new EventEmitter ( ) ;
81+ const transport = new ServerChannelTransport ( server , mockToken ) ;
82+ const handler = vi . fn ( ) ;
83+ transport . setHandler ( handler ) ;
84+
85+ // @ts -expect-error (an internal API)
86+ transport . socket . emit ( 'connection' , socket ) ;
87+
88+ const input = { a ( ) { } , b : class { } , c : true , d : 3 } ;
89+ socket . emit ( 'message' , stringify ( input ) ) ;
90+
91+ console . log ( handler . mock . calls ) ;
92+
93+ expect ( handler . mock . calls [ 0 ] [ 0 ] . a ) . toBeUndefined ( ) ;
94+ expect ( handler . mock . calls [ 0 ] [ 0 ] . b ) . toBeUndefined ( ) ;
95+ } ) ;
96+
97+ it ( 'rejects connections with invalid token' , ( ) => {
98+ const server = new EventEmitter ( ) as any as Server ;
99+ const socket = new EventEmitter ( ) as any ;
100+ socket . write = vi . fn ( ) ;
101+ socket . destroy = vi . fn ( ) ;
102+ const destroySpy = vi . spyOn ( socket , 'destroy' ) ;
103+ new ServerChannelTransport ( server , mockToken ) ;
104+
105+ // Simulate upgrade request with wrong token
106+ const request = {
107+ url : '/storybook-server-channel?token=wrong-token' ,
108+ } as any ;
109+ const head = Buffer . from ( '' ) ;
110+
111+ server . listeners ( 'upgrade' ) [ 0 ] ( request , socket , head ) ;
112+
113+ expect ( socket . write ) . toHaveBeenCalledWith (
114+ 'HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n'
115+ ) ;
116+ expect ( destroySpy ) . toHaveBeenCalled ( ) ;
117+ } ) ;
118+
119+ it ( 'accepts connections with valid token' , ( ) => {
120+ const server = new EventEmitter ( ) as any as Server ;
121+ const socket = new EventEmitter ( ) as any ;
122+ socket . write = vi . fn ( ) ;
123+ socket . destroy = vi . fn ( ) ;
124+ const destroySpy = vi . spyOn ( socket , 'destroy' ) ;
125+ const handleUpgradeSpy = vi . fn ( ) ;
126+ const transport = new ServerChannelTransport ( server , mockToken ) ;
127+
128+ // Mock handleUpgrade to track if it's called
129+ // @ts -expect-error (accessing private property)
130+ transport . socket . handleUpgrade = handleUpgradeSpy ;
131+
132+ // Simulate upgrade request with correct token
133+ const request = {
134+ url : `/storybook-server-channel?token=${ mockToken } ` ,
135+ } as any ;
136+ const head = Buffer . from ( '' ) ;
137+
138+ server . listeners ( 'upgrade' ) [ 0 ] ( request , socket , head ) ;
139+
140+ expect ( socket . write ) . not . toHaveBeenCalled ( ) ;
141+ expect ( destroySpy ) . not . toHaveBeenCalled ( ) ;
142+ expect ( handleUpgradeSpy ) . toHaveBeenCalled ( ) ;
143+ } ) ;
73144} ) ;
0 commit comments