@amityco/ts-sdk-react-native
Version:
Amity Social Cloud Typescript SDK
130 lines (110 loc) • 3.13 kB
text/typescript
/* eslint-disable @typescript-eslint/no-unused-vars */
import mitt from 'mitt';
import { getActiveClient } from '~/client/api/activeClient';
import { scheduleTask } from './microtasks';
// need to sync up the list
const WS_EVENTS = [
'disconnected',
'error',
'connect_error',
'reconnect_error',
'reconnect_failed',
'sessionStateChange',
// for internal use by accessTokenExpiryWatcher
'tokenExpired',
] as const;
const MQTT_EVENTS = [
'connect',
'message',
'disconnect',
'error',
'close',
'end',
'reconnect',
'video-streaming.didStart',
'video-streaming.didRecord',
'video-streaming.didStop',
'video-streaming.didFlag',
'video-streaming.didTerminate',
'video-streaming.viewerDidBan',
'video-streaming.viewerDidUnban',
'liveReaction.created',
] as const;
/** @hidden */
export const createEventEmitter = () => {
return mitt<Amity.Events>();
};
export const proxyMqttEvents = (
mqttClient: Amity.Client['mqtt'],
emitter: Amity.Client['emitter'],
) => {
MQTT_EVENTS.forEach(event => {
mqttClient?.on(event, (...params: any[]) => {
emitter.emit(event, params.length === 1 ? params[0] : params);
});
});
// @ts-ignore
mqttClient.on('message', (topic: string, payload: Buffer) => {
const message = JSON.parse(payload.toString());
emitter.emit(message.eventType, message.data);
});
};
/**
* Standardize the subscription of SSE through web sockets
*
* @param client The current client for which to subscribe the event to
* @param namespace A unique name for the logger
* @param event The websocket event name
* @param fn A wrapper for the callback.
* @returns A dispose function to unsubscribe to the event
*
* @category Transport
* @hidden
*/
export const createEventSubscriber = <T extends keyof Amity.Events>(
client: Amity.Client,
namespace: string,
event: T,
fn: Amity.Listener<Amity.Events[T]>,
): Amity.Unsubscriber => {
const { log, emitter } = client;
const timestamp = Date.now();
log(`${namespace}(tmpid: ${timestamp}) > listen`);
const handler = (...payload: Parameters<typeof fn>) => {
log(`${namespace}(tmpid: ${timestamp}) > trigger`, payload);
try {
fn(...payload);
} catch (e) {
log(`${namespace}(tmpid: ${timestamp}) > error`, e);
}
};
emitter.on(event, handler);
return () => {
log(`${namespace}(tmpid: ${timestamp}) > dispose`);
emitter.off(event, handler);
};
};
export const createMqttMessageSubscriber = <T extends keyof Amity.Events>(
client: Amity.Client,
namespace: string,
event: T,
fn: (params: Record<string, unknown>) => void,
): Amity.Unsubscriber => {
return createEventSubscriber(client, namespace, 'message', ([topic, message]) => {
const payload = JSON.parse(message.toString());
if (payload.eventType === event) {
fn(payload.data);
}
});
};
/**
* Wrapper around dispatch event
*
* @hidden
*/
export const fireEvent = <T extends keyof Amity.Events>(event: T, payload: Amity.Events[T]) => {
const { emitter } = getActiveClient();
scheduleTask(() => {
emitter.emit(event, payload);
});
};