import { addMinutes } from 'date-fns' import { debug, Debugger } from 'debug' import { isNil } from 'lodash' import { nanoid } from 'nanoid' import * as Opentok from 'opentok' const TIME_EXPIRES_DEFAULT = addMinutes(Date.now(), 45).getTime() export class Vonage { private debug: Debugger = debug(`http:${this.constructor.name}`) private opentok: Opentok constructor() { this.opentok = new Opentok(globalThis.secret.vonage.key, globalThis.secret.vonage.secret) } async createSession(): Promise { const id = nanoid() this.debug.extend('request')( JSON.stringify({ id, type: 'create_session', body: { mediaMode: 'relayed', }, }), ) return new Promise((resolve, reject) => { this.opentok.createSession( { mediaMode: 'relayed', }, (error, session: Opentok.Session) => { this.debug.extend('response')(JSON.stringify({ id, type: 'create_session', response: { session, error } })) if (!isNil(error)) return reject(error) return resolve(session.sessionId) }, ) }) } generateToken( sessionId: string, options: Opentok.TokenOptions = { expireTime: TIME_EXPIRES_DEFAULT, role: 'publisher', initialLayoutClassList: ['focus'], }, ): string { this.debug.extend('generate_token')( JSON.stringify({ type: 'generate_token', body: { sessionId, options, }, }), ) const token = this.opentok.generateToken(sessionId, options) this.debug.extend('generate_token')( JSON.stringify({ type: 'generate_token_response', response: { token, }, }), ) return token } }