tauri-plugin-centrifugo-api
Version:
Tauri plugin for Centrifugo real-time communication using tokio-centrifuge
317 lines (313 loc) • 9.52 kB
JavaScript
;
var core = require('@tauri-apps/api/core');
var event = require('@tauri-apps/api/event');
/**
* Connect to Centrifugo
*/
async function connect(config) {
return await core.invoke('plugin:centrifugo|connect', { config });
}
/**
* Disconnect from Centrifugo
*/
async function disconnect() {
return await core.invoke('plugin:centrifugo|disconnect');
}
/**
* Set authentication token
*/
async function setToken(token) {
return await core.invoke('plugin:centrifugo|set_token', { token });
}
/**
* Publish message to channel
*/
async function publish(request) {
return await core.invoke('plugin:centrifugo|publish', { request });
}
/**
* Execute RPC call
*/
async function rpc(request) {
return await core.invoke('plugin:centrifugo|rpc', { request });
}
/**
* Get presence information for channel
*/
async function presence(request) {
return await core.invoke('plugin:centrifugo|presence', { request });
}
/**
* Get presence statistics for channel
*/
async function presenceStats(request) {
return await core.invoke('plugin:centrifugo|presence_stats', { request });
}
/**
* Get message history for channel
*/
async function history(request) {
return await core.invoke('plugin:centrifugo|history', { request });
}
/**
* Send message to server
*/
async function send(request) {
return await core.invoke('plugin:centrifugo|send', { request });
}
/**
* Refresh authentication token
*/
async function refresh(request) {
return await core.invoke('plugin:centrifugo|refresh', { request });
}
/**
* Refresh subscription token
*/
async function subRefresh(request) {
return await core.invoke('plugin:centrifugo|sub_refresh', { request });
}
/**
* Ping server
*/
async function ping() {
return await core.invoke('plugin:centrifugo|ping');
}
/**
* Check if connected to Centrifugo
*/
async function isConnected() {
return await core.invoke('plugin:centrifugo|is_connected');
}
/**
* Get current subscriptions
*/
async function getSubscriptions() {
return await core.invoke('plugin:centrifugo|get_subscriptions');
}
/**
* Get connection state
*/
async function getConnectionState() {
return await core.invoke('plugin:centrifugo|get_connection_state');
}
/**
* Add new subscription to channel
*/
async function addSubscription(channel) {
return await core.invoke('plugin:centrifugo|add_subscription', { channel });
}
/**
* Remove subscription from channel
*/
async function removeSubscription(channel) {
return await core.invoke('plugin:centrifugo|remove_subscription', { channel });
}
/**
* Listen to Centrifugo events
*/
async function onCentrifugoEvent(event$1, callback) {
return await event.listen(`centrifugo:${event$1}`, callback);
}
// Event listener helpers
const onConnecting = async (callback) => await onCentrifugoEvent('connecting', callback);
const onConnected = async (callback) => await onCentrifugoEvent('connected', callback);
const onDisconnected = async (callback) => await onCentrifugoEvent('disconnected', callback);
const onError = async (callback) => await onCentrifugoEvent('error', callback);
const onSubscribed = async (callback) => await onCentrifugoEvent('subscribed', callback);
const onUnsubscribed = async (callback) => await onCentrifugoEvent('unsubscribed', callback);
const onSubscribing = async (callback) => await onCentrifugoEvent('subscribing', callback);
const onPublication = async (callback) => await onCentrifugoEvent('publication', callback);
// Convenient event listeners for messages
const onMessage = async (callback) => await onCentrifugoEvent('publication', (pubData) => {
try {
const decodedData = utils.decodeJson(pubData.payload.data);
callback({
channel: pubData.payload.channel,
data: decodedData
});
}
catch (error) {
// If failed to decode JSON, return raw data
callback({
channel: pubData.payload.channel,
data: pubData.payload.data
});
}
});
const onChannelMessage = async (channel, callback) => await onCentrifugoEvent('publication', (pubData) => {
if (pubData.payload.channel === channel) {
try {
const decodedData = utils.decodeJson(pubData.payload.data);
callback(decodedData);
}
catch (error) {
// If failed to decode JSON, return raw data
callback(pubData.payload.data);
}
}
});
const onAnyMessage = async (callback) => await onCentrifugoEvent('publication', (pubData) => {
try {
const decodedData = utils.decodeJson(pubData.payload.data);
callback({
channel: pubData.payload.channel,
data: decodedData,
timestamp: Date.now()
});
}
catch (error) {
callback({
channel: pubData.payload.channel,
data: pubData.payload.data,
timestamp: Date.now()
});
}
});
// Utility functions for base64 encoding/decoding
const utils = {
/**
* Encode string to base64
*/
encode: (data) => {
if (typeof window !== 'undefined' && window.btoa) {
return window.btoa(data);
}
throw new Error('btoa not available in this environment');
},
/**
* Decode base64 to string
*/
decode: (data) => {
if (typeof window !== 'undefined' && window.atob) {
return window.atob(data);
}
throw new Error('atob not available in this environment');
},
/**
* Encode object to base64 JSON
*/
encodeJson: (data) => {
const jsonString = JSON.stringify(data);
return utils.encode(jsonString);
},
/**
* Decode base64 JSON to object
*/
decodeJson: (data) => {
const jsonString = utils.decode(data);
return JSON.parse(jsonString);
}
};
// Convenience methods for common operations
const helpers = {
/**
* Publish JSON data to channel (automatically encodes to base64)
*/
publishJson: async (channel, data) => {
const base64Data = utils.encodeJson(data);
await publish({ channel, data: base64Data });
},
/**
* Execute RPC with JSON data (automatically encodes/decodes)
*/
rpcJson: async (method, data) => {
const base64Data = utils.encodeJson(data);
const result = await rpc({ method, data: base64Data });
return utils.decodeJson(result);
},
/**
* Subscribe to channel and listen for messages
*/
subscribeToChannel: async (channel, callback) => {
await addSubscription(channel);
return await onChannelMessage(channel, callback);
},
/**
* Subscribe to multiple channels
*/
subscribeToChannels: async (channels, callback) => {
const unlisteners = [];
for (const channel of channels) {
await addSubscription(channel);
const unlisten = await onChannelMessage(channel, (data) => {
callback({ channel, data });
});
unlisteners.push(unlisten);
}
return unlisteners;
},
/**
* Wait for connection to be established
*/
waitForConnection: async (timeout = 10000) => {
return new Promise((resolve) => {
const startTime = Date.now();
const checkConnection = async () => {
try {
const connected = await isConnected();
if (connected) {
resolve(true);
return;
}
if (Date.now() - startTime > timeout) {
resolve(false);
return;
}
setTimeout(checkConnection, 100);
}
catch {
resolve(false);
}
};
checkConnection();
});
},
/**
* Get connection status with retry
*/
getConnectionStatus: async (retries = 3) => {
for (let i = 0; i < retries; i++) {
try {
return await getConnectionState();
}
catch (error) {
if (i === retries - 1)
throw error;
await new Promise(resolve => setTimeout(resolve, 100));
}
}
throw new Error('Failed to get connection status');
}
};
exports.addSubscription = addSubscription;
exports.connect = connect;
exports.disconnect = disconnect;
exports.getConnectionState = getConnectionState;
exports.getSubscriptions = getSubscriptions;
exports.helpers = helpers;
exports.history = history;
exports.isConnected = isConnected;
exports.onAnyMessage = onAnyMessage;
exports.onCentrifugoEvent = onCentrifugoEvent;
exports.onChannelMessage = onChannelMessage;
exports.onConnected = onConnected;
exports.onConnecting = onConnecting;
exports.onDisconnected = onDisconnected;
exports.onError = onError;
exports.onMessage = onMessage;
exports.onPublication = onPublication;
exports.onSubscribed = onSubscribed;
exports.onSubscribing = onSubscribing;
exports.onUnsubscribed = onUnsubscribed;
exports.ping = ping;
exports.presence = presence;
exports.presenceStats = presenceStats;
exports.publish = publish;
exports.refresh = refresh;
exports.removeSubscription = removeSubscription;
exports.rpc = rpc;
exports.send = send;
exports.setToken = setToken;
exports.subRefresh = subRefresh;
exports.utils = utils;