Nie wiem czy to w sumie bardziej problem z Javy czy Javy w wersji script, no ale mam problem z połączeniem Angulara i Springa za pomocą Socket.io.
Po stronie backendu, mam tak zbudowany serwer
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>1.7.7</version>
</dependency>
@Configuration
public class SocketServerConfiguration {
private com.corundumstudio.socketio.Configuration configuration() {
final var config = new com.corundumstudio.socketio.Configuration();
config.setHostname("localhost");
config.setPort(9092);
return config;
}
@Bean
public SocketIOServer socketServer() {
final var server = new SocketIOServer(configuration());
server.start();
return server;
}
}
I jakiś @Component
który z tego korzysta, na wstępie zaznaczę - event jest łapany i emitowany.
@Component
public class LobbyServerSocket implements ApplicationListener<LobbyUpdatedEvent> {
public static final String NAMESPACE = "lobby";
private final LobbyService lobbyService;
private final SocketIOServer socketServer;
public LobbyServerSocket(final SocketIOServer socketServer, final LobbyService lobbyService) {
this.lobbyService = lobbyService;
this.socketServer = socketServer;
socketServer.addNamespace(NAMESPACE);
}
@Override
public void onApplicationEvent(final LobbyUpdatedEvent event) {
socketServer.getNamespace(NAMESPACE).getBroadcastOperations().sendEvent(event.getType().toString(), lobbyService.getRooms());
}
}
No i po stronie Angulara, mam taki service
, zakomentowane linijki to inne próby, które również nie działają.
import { Socket } from 'ngx-socket-io';
@Injectable({
providedIn: 'root'
})
export class LobbyService extends Socket {
constructor() {
super({ url: 'http://localhost:9092/lobby', options: {} });
// super({ url: 'http://localhost:9092', options: {path: '/lobby'} });
// super({ url: 'http://localhost:9092', options: {path: 'lobby'} });
// super({ url: 'http://localhost:9092', options: {namespace: '/lobby'} });
// super({ url: 'http://localhost:9092', options: {namespace: 'lobby'} });
}
}
No i component
który z tego korzysta, w skrócie.
ngOnInit(): void {
this.lobbyService.on('lobby-updated', (event) => {
console.log(event)
});
}
No i niestety nie dzieje się nic, to znaczy eventy są emitowane, ale frontend ich nie odbiera. I nie jestem pewien gdzie jest błąd, bo jeżeli zarówno po stronie serwisu Angularowego usunę `/lobby' z URLa jak i po stronie Springa zrobię
@Override
public void onApplicationEvent(final LobbyUpdatedEvent event) {
socketServer.getBroadcastOperations().sendEvent(event.getType().toString(), lobbyService.getRooms());
}
to jest ok, fronted odbiera emitowane eventy. Tyle, że chciałbym jednak z tych namespaceów skorzystać, nie mam jednak pojęcia co zrobić by to działało.