@@ -223,15 +223,18 @@ describe('RTCEngine', () => {
223223
224224 describe ( 'sendDataPacket' , ( ) => {
225225 const MAX_DATA_PACKET_SIZE = 64 * 1024 - 1 ; // 65535 bytes (64 KB - 1)
226- function stubConnectedEngine ( engine : RTCEngine ) {
226+ function stubConnectedEngine (
227+ engine : RTCEngine ,
228+ maxDataPacketSize : number = MAX_DATA_PACKET_SIZE ,
229+ ) {
227230 const send = vi . fn ( ) ;
228231 Object . assign ( engine as unknown as Record < string , unknown > , {
229232 ensurePublisherConnected : vi . fn ( ) . mockResolvedValue ( undefined ) ,
230233 waitForBufferStatusLow : vi . fn ( ) . mockResolvedValue ( undefined ) ,
231234 updateAndEmitDCBufferStatus : vi . fn ( ) ,
232235 dataChannelForKind : vi . fn ( ( ) => ( { send } ) ) ,
233236 pcManager : {
234- getMaxPublisherMessageSize : vi . fn ( ( ) => MAX_DATA_PACKET_SIZE ) ,
237+ getMaxPublisherMessageSize : vi . fn ( ( ) => maxDataPacketSize ) ,
235238 } ,
236239 } ) ;
237240 return send ;
@@ -257,6 +260,25 @@ describe('RTCEngine', () => {
257260 expect ( send ) . not . toHaveBeenCalled ( ) ;
258261 } ) ;
259262
263+ it ( 'does not reject packets if the max data packet size is 0' , async ( ) => {
264+ const engine = new RTCEngine ( roomOptionDefaults ) ;
265+ const send = stubConnectedEngine ( engine , 0 ) ;
266+
267+ const packet = new DataPacket ( {
268+ kind : DataPacket_Kind . RELIABLE ,
269+ value : {
270+ case : 'user' ,
271+ value : new UserPacket ( { payload : new Uint8Array ( 100 ) } ) ,
272+ } ,
273+ } ) ;
274+
275+ // Sending the packet should succeed, there isn't a size limit
276+ await expect (
277+ engine . sendDataPacket ( packet , DataChannelKind . RELIABLE ) ,
278+ ) . resolves . toBeUndefined ( ) ;
279+ expect ( send ) . toHaveBeenCalledTimes ( 1 ) ;
280+ } ) ;
281+
260282 it ( 'sends packets within the max data packet size' , async ( ) => {
261283 const engine = new RTCEngine ( roomOptionDefaults ) ;
262284 const send = stubConnectedEngine ( engine ) ;
@@ -275,4 +297,57 @@ describe('RTCEngine', () => {
275297 expect ( send ) . toHaveBeenCalledTimes ( 1 ) ;
276298 } ) ;
277299 } ) ;
300+
301+ describe ( 'handleDataChannelClose' , ( ) => {
302+ function stubCloseEnv (
303+ engine : RTCEngine ,
304+ { closed, publisherState } : { closed : boolean ; publisherState : RTCPeerConnectionState } ,
305+ ) {
306+ const error = vi . fn ( ) ;
307+ Object . assign ( engine as unknown as Record < string , unknown > , {
308+ _isClosed : closed ,
309+ log : { error } ,
310+ pcManager : {
311+ publisher : { getConnectionState : ( ) => publisherState } ,
312+ } ,
313+ } ) ;
314+ return error ;
315+ }
316+
317+ function fireClose ( engine : RTCEngine , kind : DataChannelKind ) {
318+ (
319+ engine as unknown as {
320+ handleDataChannelClose : ( kind : DataChannelKind ) => ( ) => void ;
321+ }
322+ ) . handleDataChannelClose ( kind ) ( ) ;
323+ }
324+
325+ it ( 'logs an error when a publisher channel closes while connected' , ( ) => {
326+ const engine = new RTCEngine ( roomOptionDefaults ) ;
327+ const error = stubCloseEnv ( engine , { closed : false , publisherState : 'connected' } ) ;
328+
329+ fireClose ( engine , DataChannelKind . RELIABLE ) ;
330+
331+ expect ( error ) . toHaveBeenCalledOnce ( ) ;
332+ expect ( error . mock . calls [ 0 ] [ 0 ] ) . toContain ( 'RELIABLE' ) ;
333+ } ) ;
334+
335+ it ( 'stays quiet when the engine is already closed' , ( ) => {
336+ const engine = new RTCEngine ( roomOptionDefaults ) ;
337+ const error = stubCloseEnv ( engine , { closed : true , publisherState : 'connected' } ) ;
338+
339+ fireClose ( engine , DataChannelKind . RELIABLE ) ;
340+
341+ expect ( error ) . not . toHaveBeenCalled ( ) ;
342+ } ) ;
343+
344+ it ( 'stays quiet when the publisher PC is no longer connected' , ( ) => {
345+ const engine = new RTCEngine ( roomOptionDefaults ) ;
346+ const error = stubCloseEnv ( engine , { closed : false , publisherState : 'closed' } ) ;
347+
348+ fireClose ( engine , DataChannelKind . RELIABLE ) ;
349+
350+ expect ( error ) . not . toHaveBeenCalled ( ) ;
351+ } ) ;
352+ } ) ;
278353} ) ;
0 commit comments