import { EventEmitter } from 'eventemitter3' import { DispatchedJargonEvent, Events, JargonEvent } from './models' const ActionCable = require('./action-cable.js').ActionCable export interface JargonEvents { on(event: Events.WindowFocusChangeEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.CameraMetricsEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.BookmarkEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.FaceDataEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.PublicChatEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.PulseDataEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.SessionStartEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: Events.SessionStopEvent['type'], handler: (payload: DispatchedJargonEvent) => void): this on(event: 'connected' | 'disconnected' | 'rejected', handler: () => void): this } export class JargonEvents extends EventEmitter implements JargonEvents { private consumer: any private subscription: any public connect(sessionToken?: string) { this.consumer = ActionCable.createConsumer(this.baseURL + sessionToken) const params = { channel: 'API::V1::SessionEventsChannel', } this.subscription = this.consumer.subscriptions.create(params, { connected: () => this.emit('connected'), disconnected: () => this.emit('disconnected'), received: (event: JargonEvent) => this.emit(event.type, event), rejected: () => this.emit('rejected'), }) } public disconnect() { if (this.subscription) { this.subscription.unsubscribe() } if (this.consumer) { this.consumer.disconnect() } } public dispatch(event: JargonEvent) { if (!this.subscription) { this.emit('error', `Unable to dispatch event "${event.type}": No active subscription.`) } this.subscription.perform(event.type, event) } private get baseURL(): string { return process.env.NODE_ENV === 'production' ? 'wss://api.jargon.ai/cable/' : 'wss://api-staging.jargon.ai/cable/' } }