77
88import static java .nio .charset .StandardCharsets .UTF_8 ;
99
10- import java .io .ByteArrayOutputStream ;
11- import java .util .Arrays ;
10+ import java .util .function .IntPredicate ;
1211
1312import edu .umd .cs .findbugs .annotations .NonNull ;
1413import edu .umd .cs .findbugs .annotations .Nullable ;
14+ import io .jooby .buffer .DataBuffer ;
1515
1616/**
1717 * Server-Sent message.
@@ -129,14 +129,14 @@ public ServerSentMessage(@NonNull Object data) {
129129 * @param ctx Web context. To encode complex objects.
130130 * @return Encoded data.
131131 */
132- public @ NonNull byte [] toByteArray (@ NonNull Context ctx ) {
132+ public @ NonNull DataBuffer toByteArray (@ NonNull Context ctx ) {
133133 try {
134134 Route route = ctx .getRoute ();
135135 MessageEncoder encoder = route .getEncoder ();
136- // TODO: ByteBuffer fix me this need to be better once we add buffer API
137- var bytes = encoder .encode (ctx , data ).array ();
136+ var bufferFactory = ctx .getBufferFactory ();
137+ var buffer = bufferFactory .allocateBuffer ();
138+ var message = encoder .encode (ctx , data );
138139
139- ByteArrayOutputStream buffer = new ByteArrayOutputStream (bytes .length );
140140 if (id != null ) {
141141 buffer .write (ID );
142142 buffer .write (id .toString ().getBytes (UTF_8 ));
@@ -152,29 +152,22 @@ public ServerSentMessage(@NonNull Object data) {
152152 buffer .write (retry .toString ().getBytes (UTF_8 ));
153153 buffer .write (SEPARATOR );
154154 }
155- /** do multi-line processing: */
155+ /* do multi-line processing: */
156156 buffer .write (DATA );
157- int offset = 0 ;
158- for (int i = 0 ; i < bytes .length ; i ++) {
159- byte ch = bytes [i ];
160- if (ch == '\n' ) {
161- buffer .write (Arrays .copyOfRange (bytes , offset , offset + i ));
162- buffer .write (SEPARATOR );
163- if (i + 1 < bytes .length ) {
164- buffer .write (DATA );
165- }
166- offset = i + 1 ;
157+ IntPredicate nl = ch -> ch == '\n' ;
158+ var i = message .indexOf (nl , 0 );
159+ while (i > 0 ) {
160+ buffer .write (message .split (i + 1 ));
161+ if (message .readableByteCount () > 0 ) {
162+ buffer .write (DATA );
167163 }
164+ i = message .indexOf (nl , 1 );
168165 }
169- if (offset == 0 ) {
170- buffer .write (bytes );
171- } else if (offset < bytes .length ) {
172- buffer .write (Arrays .copyOfRange (bytes , offset , bytes .length ));
173- }
166+ // write any pending bytes
167+ buffer .write (message );
174168 buffer .write (SEPARATOR );
175169 buffer .write (SEPARATOR );
176-
177- return buffer .toByteArray ();
170+ return buffer ;
178171 } catch (Exception x ) {
179172 throw SneakyThrows .propagate (x );
180173 }
0 commit comments