@@ -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
@@ -73,7 +77,7 @@ describe('ServerChannelTransport', () => {
7377 it ( 'skips telejson classes and functions in data' , ( ) => {
7478 const server = new EventEmitter ( ) as any as Server ;
7579 const socket = new EventEmitter ( ) ;
76- const transport = new ServerChannelTransport ( server ) ;
80+ const transport = new ServerChannelTransport ( server , mockToken ) ;
7781 const handler = vi . fn ( ) ;
7882 transport . setHandler ( handler ) ;
7983
@@ -86,4 +90,52 @@ describe('ServerChannelTransport', () => {
8690 expect ( handler . mock . calls [ 0 ] [ 0 ] . a ) . toEqual ( expect . any ( String ) ) ;
8791 expect ( handler . mock . calls [ 0 ] [ 0 ] . b ) . toEqual ( expect . any ( String ) ) ;
8892 } ) ;
93+
94+ it ( 'rejects connections with invalid token' , ( ) => {
95+ const server = new EventEmitter ( ) as any as Server ;
96+ const socket = new EventEmitter ( ) as any ;
97+ socket . write = vi . fn ( ) ;
98+ socket . destroy = vi . fn ( ) ;
99+ const destroySpy = vi . spyOn ( socket , 'destroy' ) ;
100+ new ServerChannelTransport ( server , mockToken ) ;
101+
102+ // Simulate upgrade request with wrong token
103+ const request = {
104+ url : '/storybook-server-channel?token=wrong-token' ,
105+ } as any ;
106+ const head = Buffer . from ( '' ) ;
107+
108+ server . listeners ( 'upgrade' ) [ 0 ] ( request , socket , head ) ;
109+
110+ expect ( socket . write ) . toHaveBeenCalledWith (
111+ 'HTTP/1.1 403 Forbidden\r\nConnection: close\r\n\r\n'
112+ ) ;
113+ expect ( destroySpy ) . toHaveBeenCalled ( ) ;
114+ } ) ;
115+
116+ it ( 'accepts connections with valid token' , ( ) => {
117+ const server = new EventEmitter ( ) as any as Server ;
118+ const socket = new EventEmitter ( ) as any ;
119+ socket . write = vi . fn ( ) ;
120+ socket . destroy = vi . fn ( ) ;
121+ const destroySpy = vi . spyOn ( socket , 'destroy' ) ;
122+ const handleUpgradeSpy = vi . fn ( ) ;
123+ const transport = new ServerChannelTransport ( server , mockToken ) ;
124+
125+ // Mock handleUpgrade to track if it's called
126+ // @ts -expect-error (accessing private property)
127+ transport . socket . handleUpgrade = handleUpgradeSpy ;
128+
129+ // Simulate upgrade request with correct token
130+ const request = {
131+ url : `/storybook-server-channel?token=${ mockToken } ` ,
132+ } as any ;
133+ const head = Buffer . from ( '' ) ;
134+
135+ server . listeners ( 'upgrade' ) [ 0 ] ( request , socket , head ) ;
136+
137+ expect ( socket . write ) . not . toHaveBeenCalled ( ) ;
138+ expect ( destroySpy ) . not . toHaveBeenCalled ( ) ;
139+ expect ( handleUpgradeSpy ) . toHaveBeenCalled ( ) ;
140+ } ) ;
89141} ) ;
0 commit comments