55use Exception ;
66use Illuminate \Support \Facades \Log ;
77use Illuminate \Support \Str ;
8- use OPGG \LaravelMcpServer \Transports \SeeAdapters \SseAdapterInterface ;
8+ use OPGG \LaravelMcpServer \Transports \SseAdapters \SseAdapterInterface ;
99use OPGG \LaravelMcpServer \Utils \StringUtil ;
1010
1111/**
@@ -96,13 +96,28 @@ public function initialize(): void
9696 */
9797 private function sendEvent (string $ event , string $ data ): void
9898 {
99- echo sprintf ('event: %s ' , $ event ).PHP_EOL ;
100- echo sprintf ('data: %s ' , $ data ).PHP_EOL ;
101- echo PHP_EOL ;
99+ // 헤더 설정이 이미 전송되었는지 확인
100+ if (!headers_sent ()) {
101+ // 버퍼링 비활성화
102+ ini_set ('output_buffering ' , 'off ' );
103+ ini_set ('zlib.output_compression ' , false );
104+
105+ // 필수 SSE 헤더 추가
106+ header ('Content-Type: text/event-stream ' );
107+ header ('Cache-Control: no-cache ' );
108+ header ('X-Accel-Buffering: no ' );
109+ header ('Connection: keep-alive ' );
110+ }
102111
103- if (ob_get_level () > 0 && ob_get_length () !== false ) {
104- ob_flush ();
112+ // 모든 버퍼 비우기
113+ while (ob_get_level () > 0 ) {
114+ ob_end_flush ();
105115 }
116+
117+ echo sprintf ("event: %s " , $ event ) . PHP_EOL ;
118+ echo sprintf ("data: %s " , $ data ) . PHP_EOL ;
119+ echo PHP_EOL ;
120+
106121 flush ();
107122 }
108123
@@ -131,7 +146,7 @@ public function send(string|array $message): void
131146 */
132147 public function close (): void
133148 {
134- if (! $ this ->connected ) {
149+ if (!$ this ->connected ) {
135150 return ;
136151 }
137152
@@ -141,22 +156,22 @@ public function close(): void
141156 try {
142157 call_user_func ($ handler );
143158 } catch (Exception $ e ) {
144- Log::error ('Error in SSE close handler: ' . $ e ->getMessage ());
159+ Log::error ('Error in SSE close handler: ' . $ e ->getMessage ());
145160 }
146161 }
147162
148163 if ($ this ->adapter !== null && $ this ->clientId !== null ) {
149164 try {
150165 $ this ->adapter ->removeAllMessages ($ this ->clientId );
151166 } catch (Exception $ e ) {
152- Log::error ('Error cleaning up SSE adapter resources on close: ' . $ e ->getMessage ());
167+ Log::error ('Error cleaning up SSE adapter resources on close: ' . $ e ->getMessage ());
153168 }
154169 }
155170
156171 try {
157172 $ this ->sendEvent (event: 'close ' , data: '{"reason":"server_closed"} ' );
158173 } catch (Exception $ e ) {
159- Log::info ('Could not send final SSE close event: ' . $ e ->getMessage ());
174+ Log::info ('Could not send final SSE close event: ' . $ e ->getMessage ());
160175 }
161176 }
162177
@@ -215,7 +230,7 @@ public function receive(): array
215230
216231 return $ messages ?: [];
217232 } catch (Exception $ e ) {
218- $ this ->triggerError ('SSE Failed to receive messages via adapter: ' . $ e ->getMessage ());
233+ $ this ->triggerError ('SSE Failed to receive messages via adapter: ' . $ e ->getMessage ());
219234 }
220235 } elseif ($ this ->adapter === null ) {
221236 Log::info ('SSE Transport::receive called but no adapter is configured. ' );
@@ -232,13 +247,13 @@ public function receive(): array
232247 */
233248 protected function triggerError (string $ message ): void
234249 {
235- Log::error ('SSE Transport error: ' . $ message );
250+ Log::error ('SSE Transport error: ' . $ message );
236251
237252 foreach ($ this ->errorHandlers as $ handler ) {
238253 try {
239254 call_user_func ($ handler , $ message );
240255 } catch (Exception $ e ) {
241- Log::error ('Error in SSE error handler itself: ' . $ e ->getMessage ());
256+ Log::error ('Error in SSE error handler itself: ' . $ e ->getMessage ());
242257 }
243258 }
244259 }
@@ -266,7 +281,7 @@ public function processMessage(string $clientId, array $message): void
266281 try {
267282 $ handler ($ clientId , $ message );
268283 } catch (Exception $ e ) {
269- Log::error ('Error processing SSE message via handler: ' . $ e ->getMessage (), [
284+ Log::error ('Error processing SSE message via handler: ' . $ e ->getMessage (), [
270285 'clientId ' => $ clientId ,
271286 // Avoid logging potentially sensitive message content in production
272287 // 'message_summary' => is_array($message) ? json_encode(array_keys($message)) : substr($message, 0, 100)
@@ -292,7 +307,7 @@ public function pushMessage(string $clientId, array $message): void
292307
293308 $ messageString = json_encode ($ message );
294309 if ($ messageString === false ) {
295- throw new Exception ('Failed to JSON encode message for pushing: ' . json_last_error_msg ());
310+ throw new Exception ('Failed to JSON encode message for pushing: ' . json_last_error_msg ());
296311 }
297312
298313 $ this ->adapter ->pushMessage (clientId: $ clientId , message: $ messageString );
0 commit comments