Skip to main content

WebSocket Plugin

The WebSocket plugin provides WebSocket connections from the Java backend, bypassing webview restrictions.

Installation

<dependency>
<groupId>build.krema</groupId>
<artifactId>krema-plugin-websocket</artifactId>
<version>${krema.version}</version>
</dependency>

Permissions

[permissions]
allow = ["websocket:connect"]

Commands

websocket:connect

Opens a WebSocket connection.

await window.krema.invoke('websocket:connect', {
name: 'chat',
url: 'wss://chat.example.com/ws',
headers: { 'Authorization': 'Bearer token123' } // Optional
});

websocket:send

Sends a message.

await window.krema.invoke('websocket:send', {
name: 'chat',
message: JSON.stringify({ type: 'message', text: 'Hello!' })
});

websocket:disconnect

Closes the connection.

await window.krema.invoke('websocket:disconnect', { name: 'chat' });

Events

// Connection established
window.krema.on('websocket:connected', (data) => {
console.log('Connected:', data.name);
});

// Message received
window.krema.on('websocket:message', (data) => {
console.log('Message from', data.name, ':', data.data);
});

// Connection closed
window.krema.on('websocket:disconnected', (data) => {
console.log('Disconnected:', data.name, 'code:', data.code);
});

// Error occurred
window.krema.on('websocket:error', (data) => {
console.error('Error on', data.name, ':', data.error);
});

Example: Chat Client

class ChatClient {
constructor(url, token) {
this.url = url;
this.token = token;
this.setupListeners();
}

setupListeners() {
window.krema.on('websocket:message', (data) => {
if (data.name === 'chat') {
const msg = JSON.parse(data.data);
this.onMessage(msg);
}
});

window.krema.on('websocket:disconnected', () => {
setTimeout(() => this.connect(), 5000); // Reconnect
});
}

async connect() {
await window.krema.invoke('websocket:connect', {
name: 'chat',
url: this.url,
headers: { 'Authorization': `Bearer ${this.token}` }
});
}

async send(message) {
await window.krema.invoke('websocket:send', {
name: 'chat',
message: JSON.stringify(message)
});
}

onMessage(msg) {
// Handle incoming message
}
}