Skip to content

Commit cb1d17c

Browse files
committed
Update namespace typos for SseAdapters, improve buffer handling
1 parent b412838 commit cb1d17c

File tree

4 files changed

+47
-32
lines changed

4 files changed

+47
-32
lines changed

src/Services/SseAdapterFactory.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
use Exception;
66
use Illuminate\Support\Facades\Config;
7-
use OPGG\LaravelMcpServer\Transports\SeeAdapters\RedisAdapter;
8-
use OPGG\LaravelMcpServer\Transports\SeeAdapters\SseAdapterInterface;
7+
use OPGG\LaravelMcpServer\Transports\SseAdapters\RedisAdapter;
8+
use OPGG\LaravelMcpServer\Transports\SseAdapters\SseAdapterInterface;
99

1010
/**
1111
* Factory for creating and managing SSE adapters.
@@ -59,14 +59,14 @@ public function createAdapter(): SseAdapterInterface
5959
*/
6060
private function initializeAdapter(): void
6161
{
62-
$adapterConfig = Config::get('mcp-server.adapters.'.$this->adapterType, []);
62+
$adapterConfig = Config::get('mcp-server.adapters.' . $this->adapterType, []);
6363

6464
switch ($this->adapterType) {
6565
case 'redis':
6666
$this->adapter = new RedisAdapter;
6767
break;
6868
default:
69-
throw new Exception('Unsupported SSE adapter type: '.$this->adapterType);
69+
throw new Exception('Unsupported SSE adapter type: ' . $this->adapterType);
7070
}
7171

7272
$this->adapter->initialize($adapterConfig);

src/Transports/SeeAdapters/RedisAdapter.php renamed to src/Transports/SseAdapters/RedisAdapter.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace OPGG\LaravelMcpServer\Transports\SeeAdapters;
3+
namespace OPGG\LaravelMcpServer\Transports\SseAdapters;
44

55
use Exception;
66
use Illuminate\Support\Facades\Log;
@@ -52,8 +52,8 @@ public function initialize(array $config): void
5252
$this->messageTtl = (int) $config['ttl'];
5353
}
5454
} catch (Exception $e) {
55-
Log::error('Failed to initialize Redis SSE Adapter: '.$e->getMessage());
56-
throw new Exception('Failed to initialize Redis SSE Adapter: '.$e->getMessage());
55+
Log::error('Failed to initialize Redis SSE Adapter: ' . $e->getMessage());
56+
throw new Exception('Failed to initialize Redis SSE Adapter: ' . $e->getMessage());
5757
}
5858
}
5959

@@ -75,8 +75,8 @@ public function pushMessage(string $clientId, string $message): void
7575
$this->redis->expire($key, $this->messageTtl);
7676

7777
} catch (Exception $e) {
78-
Log::error('Failed to add message to Redis queue: '.$e->getMessage());
79-
throw new Exception('Failed to add message to Redis queue: '.$e->getMessage());
78+
Log::error('Failed to add message to Redis queue: ' . $e->getMessage());
79+
throw new Exception('Failed to add message to Redis queue: ' . $e->getMessage());
8080
}
8181
}
8282

@@ -108,8 +108,8 @@ public function removeAllMessages(string $clientId): void
108108
$this->redis->del($key);
109109

110110
} catch (Exception $e) {
111-
Log::error('Failed to remove messages from Redis queue: '.$e->getMessage());
112-
throw new Exception('Failed to remove messages from Redis queue: '.$e->getMessage());
111+
Log::error('Failed to remove messages from Redis queue: ' . $e->getMessage());
112+
throw new Exception('Failed to remove messages from Redis queue: ' . $e->getMessage());
113113
}
114114
}
115115

@@ -133,7 +133,7 @@ public function receiveMessages(string $clientId): array
133133

134134
return $messages;
135135
} catch (Exception $e) {
136-
throw new Exception('Failed to receive messages from Redis queue: '.$e->getMessage());
136+
throw new Exception('Failed to receive messages from Redis queue: ' . $e->getMessage());
137137
}
138138
}
139139

@@ -158,8 +158,8 @@ public function popMessage(string $clientId): ?string
158158

159159
return $message;
160160
} catch (Exception $e) {
161-
Log::error('Failed to pop message from Redis queue: '.$e->getMessage());
162-
throw new Exception('Failed to pop message from Redis queue: '.$e->getMessage());
161+
Log::error('Failed to pop message from Redis queue: ' . $e->getMessage());
162+
throw new Exception('Failed to pop message from Redis queue: ' . $e->getMessage());
163163
}
164164
}
165165

@@ -178,7 +178,7 @@ public function hasMessages(string $clientId): bool
178178

179179
return $count > 0;
180180
} catch (Exception $e) {
181-
Log::error('Failed to check for messages in Redis queue: '.$e->getMessage());
181+
Log::error('Failed to check for messages in Redis queue: ' . $e->getMessage());
182182

183183
return false;
184184
}
@@ -199,7 +199,7 @@ public function getMessageCount(string $clientId): int
199199

200200
return (int) $count;
201201
} catch (Exception $e) {
202-
Log::error('Failed to get message count from Redis queue: '.$e->getMessage());
202+
Log::error('Failed to get message count from Redis queue: ' . $e->getMessage());
203203

204204
return 0;
205205
}

src/Transports/SeeAdapters/SseAdapterInterface.php renamed to src/Transports/SseAdapters/SseAdapterInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace OPGG\LaravelMcpServer\Transports\SeeAdapters;
3+
namespace OPGG\LaravelMcpServer\Transports\SseAdapters;
44

55
/**
66
* Interface SseAdapterInterface

src/Transports/SseTransport.php

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Exception;
66
use Illuminate\Support\Facades\Log;
77
use Illuminate\Support\Str;
8-
use OPGG\LaravelMcpServer\Transports\SeeAdapters\SseAdapterInterface;
8+
use OPGG\LaravelMcpServer\Transports\SseAdapters\SseAdapterInterface;
99
use 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

Comments
 (0)