@@ -33,3 +33,53 @@ test('should be reusable after clearing', () => {
3333 readBuffer . append ( Buffer . from ( '\n' ) ) ;
3434 expect ( readBuffer . readMessage ( ) ) . toEqual ( testMessage ) ;
3535} ) ;
36+
37+ describe ( 'multi-byte UTF-8 across chunk boundaries' , ( ) => {
38+ test ( 'should preserve em-dash split across two chunks' , ( ) => {
39+ const readBuffer = new ReadBuffer ( ) ;
40+ const message : JSONRPCMessage = { jsonrpc : '2.0' , method : 'test' , params : { text : 'a—b' } } ;
41+ const fullBuffer = Buffer . from ( JSON . stringify ( message ) + '\n' ) ;
42+ const splitIndex = fullBuffer . indexOf ( 0xe2 ) + 1 ;
43+
44+ readBuffer . append ( fullBuffer . subarray ( 0 , splitIndex ) ) ;
45+ readBuffer . append ( fullBuffer . subarray ( splitIndex ) ) ;
46+
47+ expect ( readBuffer . readMessage ( ) ) . toEqual ( message ) ;
48+ } ) ;
49+
50+ test ( 'should preserve emoji split across two chunks' , ( ) => {
51+ const readBuffer = new ReadBuffer ( ) ;
52+ const message : JSONRPCMessage = { jsonrpc : '2.0' , method : 'test' , params : { text : '✅' } } ;
53+ const fullBuffer = Buffer . from ( JSON . stringify ( message ) + '\n' ) ;
54+ const splitIndex = fullBuffer . indexOf ( 0xe2 ) + 2 ;
55+
56+ readBuffer . append ( fullBuffer . subarray ( 0 , splitIndex ) ) ;
57+ readBuffer . append ( fullBuffer . subarray ( splitIndex ) ) ;
58+
59+ expect ( readBuffer . readMessage ( ) ) . toEqual ( message ) ;
60+ } ) ;
61+
62+ test ( 'should preserve four-byte emoji split across chunks' , ( ) => {
63+ const readBuffer = new ReadBuffer ( ) ;
64+ const message : JSONRPCMessage = { jsonrpc : '2.0' , method : 'test' , params : { text : '🎉' } } ;
65+ const fullBuffer = Buffer . from ( JSON . stringify ( message ) + '\n' ) ;
66+ const splitIndex = fullBuffer . indexOf ( 0xf0 ) + 2 ;
67+
68+ readBuffer . append ( fullBuffer . subarray ( 0 , splitIndex ) ) ;
69+ readBuffer . append ( fullBuffer . subarray ( splitIndex ) ) ;
70+
71+ expect ( readBuffer . readMessage ( ) ) . toEqual ( message ) ;
72+ } ) ;
73+
74+ test ( 'should preserve multi-byte chars across many chunks of size 1' , ( ) => {
75+ const readBuffer = new ReadBuffer ( ) ;
76+ const message : JSONRPCMessage = { jsonrpc : '2.0' , method : 'test' , params : { text : 'em — dash and ✅ check' } } ;
77+ const fullBuffer = Buffer . from ( JSON . stringify ( message ) + '\n' ) ;
78+
79+ for ( let i = 0 ; i < fullBuffer . length ; i ++ ) {
80+ readBuffer . append ( fullBuffer . subarray ( i , i + 1 ) ) ;
81+ }
82+
83+ expect ( readBuffer . readMessage ( ) ) . toEqual ( message ) ;
84+ } ) ;
85+ } ) ;
0 commit comments