Skip to content

Commit 9b00db6

Browse files
committed
Update for SSE
1 parent d228d2a commit 9b00db6

File tree

3 files changed

+133
-61
lines changed

3 files changed

+133
-61
lines changed

pom.xml

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<packaging>war</packaging>
1212
<name>chat</name>
1313
<description>chat application</description>
14+
<url>https://github.com/Red5/red5-websocket-chat</url>
1415
<organization>
1516
<name>Red5</name>
1617
<url>https://github.com/Red5</url>
@@ -54,18 +55,36 @@
5455
<red5.version>2.0.23</red5.version>
5556
<gson.version>2.13.1</gson.version>
5657
</properties>
58+
<repositories>
59+
<repository>
60+
<id>central</id>
61+
<name>Central Repository</name>
62+
<url>https://repo.maven.apache.org/maven2</url>
63+
<layout>default</layout>
64+
<snapshots>
65+
<enabled>false</enabled>
66+
</snapshots>
67+
</repository>
68+
<repository>
69+
<id>sonatype-snapshots</id>
70+
<name>Sonatype Snapshots</name>
71+
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
72+
</repository>
73+
<repository>
74+
<id>sonatype-releases</id>
75+
<name>Sonatype Releases</name>
76+
<url>https://oss.sonatype.org/content/repositories/releases</url>
77+
</repository>
78+
</repositories>
5779
<build>
58-
<defaultGoal>package</defaultGoal>
80+
<defaultGoal>clean package</defaultGoal>
5981
<plugins>
6082
<plugin>
6183
<artifactId>maven-source-plugin</artifactId>
6284
</plugin>
6385
<plugin>
6486
<artifactId>maven-javadoc-plugin</artifactId>
6587
</plugin>
66-
<plugin>
67-
<artifactId>maven-dependency-plugin</artifactId>
68-
</plugin>
6988
<plugin>
7089
<artifactId>maven-war-plugin</artifactId>
7190
<version>3.4.0</version>
@@ -77,6 +96,7 @@
7796
<plugin>
7897
<groupId>org.apache.felix</groupId>
7998
<artifactId>maven-bundle-plugin</artifactId>
99+
<version>6.0.0</version>
80100
<extensions>true</extensions>
81101
</plugin>
82102
</plugins>
@@ -87,14 +107,13 @@
87107
<build>
88108
<plugins>
89109
<plugin>
90-
<groupId>org.sonatype.plugins</groupId>
91-
<artifactId>nexus-staging-maven-plugin</artifactId>
92-
<version>1.7.0</version>
110+
<groupId>org.sonatype.central</groupId>
111+
<artifactId>central-publishing-maven-plugin</artifactId>
112+
<version>0.8.0</version>
93113
<extensions>true</extensions>
94114
<configuration>
95-
<serverId>ossrh</serverId>
96-
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
97-
<autoReleaseAfterClose>true</autoReleaseAfterClose>
115+
<publishingServerId>ossrh</publishingServerId>
116+
<autoPublish>true</autoPublish>
98117
</configuration>
99118
</plugin>
100119
<plugin>
@@ -152,6 +171,7 @@
152171
<dependency>
153172
<groupId>org.springframework</groupId>
154173
<artifactId>spring-context</artifactId>
174+
<version>${spring.version}</version>
155175
<exclusions>
156176
<exclusion>
157177
<groupId>commons-logging</groupId>
@@ -162,6 +182,7 @@
162182
<dependency>
163183
<groupId>org.springframework</groupId>
164184
<artifactId>spring-context-support</artifactId>
185+
<version>${spring.version}</version>
165186
<exclusions>
166187
<exclusion>
167188
<groupId>commons-logging</groupId>

src/main/java/org/red5/demos/chat/Router.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void setApp(Application app) {
106106
final IScope appScope = app.getScope();
107107
sseService = (SSEService) appScope.getServiceHandler(SSEService.BEAN_NAME);
108108
if (sseService == null) {
109-
log.warn("SSE service was null, SSE will not be available");
109+
log.warn("SSE service was null, SSE will not be available");
110110
} else {
111111
log.info("SSE service found in application scope: {}", appScope.getName());
112112
}

src/main/webapp/sse.html

Lines changed: 101 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616
border-radius: 8px;
1717
margin-bottom: 20px;
1818
}
19-
.status {
20-
padding: 10px;
21-
border-radius: 4px;
22-
margin-bottom: 10px;
23-
}
19+
.status { padding: 5px; margin: 5px 0; border-radius: 3px; }
20+
.success { background: #d4edda; color: #155724; }
21+
.error { background: #f8d7da; color: #721c24; }
2422
.connected {
2523
background: #d4edda;
2624
color: #155724;
@@ -59,6 +57,9 @@
5957
.event.app {
6058
border-left-color: #dc3545;
6159
}
60+
input, select, textarea, button { margin: 5px; padding: 8px; }
61+
.form-group { margin: 10px 0; }
62+
label { display: inline-block; width: 120px; }
6263
button {
6364
background: #007bff;
6465
color: white;
@@ -100,19 +101,39 @@ <h2>Connection Status</h2>
100101
<strong>Last Event:</strong> <span id="lastEventTime">-</span>
101102
</div>
102103
</div>
104+
105+
<div class="container">
106+
<h2>Messages</h2>
107+
<form onsubmit="sendMessage(event)">
108+
<div class="form-group">
109+
<label>Event Type:</label>
110+
<input type="text" id="eventType" value="message" placeholder="message" required>
111+
</div>
112+
<div class="form-group">
113+
<label>Event Data:</label>
114+
<input type="text" id="eventData" value="Hello SSE" required>
115+
</div>
116+
<div class="form-group">
117+
<label>Target:</label>
118+
<select id="targetType" onchange="updateTargetField()">
119+
<option value="all">All Connections</option>
120+
<option value="scope">Specific Scope</option>
121+
<option value="connection">Specific Connection</option>
122+
</select>
123+
</div>
124+
<div class="form-group" id="targetValueGroup" style="display: none;">
125+
<label>Target Value:</label>
126+
<input type="text" id="targetValue" placeholder="chat">
127+
</div>
128+
<button type="submit">Send Message</button>
129+
</form>
130+
</div>
103131

104132
<div class="container">
105133
<h2>Event Log</h2>
106134
<div id="log" class="log"></div>
107135
</div>
108136

109-
<div class="container">
110-
<h2>Messages</h2>
111-
<div id="messages" class="log"></div>
112-
<input id="m" autocomplete="off" />
113-
<button id="sendBtn" onclick="sendMessage()">Send</button>
114-
</div>
115-
116137
<script>
117138
let eventSource = null;
118139
let eventCount = 0;
@@ -181,7 +202,6 @@ <h2>Messages</h2>
181202
eventSource.onerror = function(event) {
182203
updateStatus('disconnected', 'Connection error');
183204
log('Connection error occurred', 'error');
184-
185205
if (eventSource.readyState === EventSource.CLOSED) {
186206
log('Connection closed by server', 'connection');
187207
}
@@ -200,34 +220,7 @@ <h2>Messages</h2>
200220
document.getElementById('connectionId').textContent = connectionId;
201221
}
202222
});
203-
204-
eventSource.addEventListener('message', function(event) {
205-
eventCount++;
206-
document.getElementById('eventCount').textContent = eventCount;
207-
const msgsEl = document.getElementById('messages');
208-
const mEl = document.createElement('div');
209-
mEl.innerHTML = `${event.data}`;
210-
msgsEl.appendChild(mEl);
211-
msgsEl.scrollTop = msgsEl.scrollHeight;
212-
});
213-
214-
eventSource.addEventListener('user.connect', function(event) {
215-
eventCount++;
216-
document.getElementById('eventCount').textContent = eventCount;
217-
log('User connected: ' + event.data, 'user');
218-
});
219-
220-
eventSource.addEventListener('user.disconnect', function(event) {
221-
eventCount++;
222-
document.getElementById('eventCount').textContent = eventCount;
223-
log('User disconnected: ' + event.data, 'user');
224-
});
225-
226-
eventSource.addEventListener('user.event', function(event) {
227-
eventCount++;
228-
document.getElementById('eventCount').textContent = eventCount;
229-
log('' + event.data, 'user');
230-
});
223+
231224
}
232225

233226
function disconnect() {
@@ -240,15 +233,73 @@ <h2>Messages</h2>
240233
document.getElementById('connectionId').textContent = '-';
241234
}
242235

243-
function sendMessage() {
244-
var input = document.getElementById('m');
245-
var message = input.value;
246-
if (message) {
247-
log('Sending message: ' + message);
248-
var jsonMessage = '{"name":"chat","method":"messageTransmit","message":{"data":"' + message + '"}}';
249-
eventSource.dispatchEvent(new MessageEvent('message', { data: jsonMessage }));
250-
// Clear input field
251-
input.value = '';
236+
//function sendMessage() {
237+
// var input = document.getElementById('m');
238+
// var message = input.value;
239+
// if (message) {
240+
// log('Sending message: ' + message);
241+
// var jsonMessage = '{"name":"chat","method":"messageTransmit","message":{"data":"' + message + '"}}';
242+
// eventSource.dispatchEvent(new MessageEvent('message', { data: jsonMessage }));
243+
// input.value = '';
244+
// }
245+
//}
246+
247+
async function sendMessage(event) {
248+
event.preventDefault();
249+
const eventType = document.getElementById('eventType').value;
250+
const eventData = document.getElementById('eventData').value;
251+
const targetType = document.getElementById('targetType').value;
252+
const targetValue = document.getElementById('targetValue').value;
253+
const sender = 'sse01';
254+
// Build request payload
255+
const payload = {
256+
event: eventType,
257+
data: eventData,
258+
name: 'chat',
259+
method: 'messageTransmit',
260+
message: {
261+
data: eventData
262+
},
263+
sender: sender
264+
};
265+
if (targetType === 'scope' && targetValue) {
266+
payload.scope = targetValue;
267+
} else if (targetType === 'connection' && targetValue) {
268+
payload.connectionId = targetValue;
269+
}
270+
try {
271+
const response = await fetch(eventUrl, {
272+
method: 'POST',
273+
headers: {
274+
'Content-Type': 'application/json',
275+
},
276+
body: JSON.stringify(payload)
277+
});
278+
if (response.ok) {
279+
log('Event sent successfully', 'success');
280+
} else {
281+
log('Failed to send event', 'error');
282+
}
283+
document.getElementById('eventData').value = '';
284+
} catch (error) {
285+
log('Error sending event: ${error.message}', 'error');
286+
}
287+
}
288+
289+
// Update target field visibility
290+
function updateTargetField() {
291+
const targetType = document.getElementById('targetType').value;
292+
const targetGroup = document.getElementById('targetValueGroup');
293+
const targetInput = document.getElementById('targetValue');
294+
if (targetType === 'all') {
295+
targetGroup.style.display = 'none';
296+
} else {
297+
targetGroup.style.display = 'block';
298+
if (targetType === 'scope') {
299+
targetInput.placeholder = 'chat';
300+
} else if (targetType === 'connection') {
301+
targetInput.placeholder = currentConnectionId || 'connection-id';
302+
}
252303
}
253304
}
254305

0 commit comments

Comments
 (0)