diff --git a/packages/js/README.md b/packages/js/README.md index 6918a035..84d0939f 100644 --- a/packages/js/README.md +++ b/packages/js/README.md @@ -190,6 +190,15 @@ client.newCall({ }); ``` +### Getting the Registration State + +To retrieve the registration state from the server gateway you can +use `client.getIsRegistered` method + +```js +client.getIsRegistered().then(isRegistered => {...}) +``` + --- ## Examples diff --git a/packages/js/src/Modules/Verto/BaseSession.ts b/packages/js/src/Modules/Verto/BaseSession.ts index 5e1fc4dc..05a3e0b2 100644 --- a/packages/js/src/Modules/Verto/BaseSession.ts +++ b/packages/js/src/Modules/Verto/BaseSession.ts @@ -8,6 +8,7 @@ import { register, trigger, } from './services/Handler'; +import { RegisterAgent } from './services/RegisterAgent'; import { SwEvent } from './util/constants'; import { isFunction, isValidOptions, randomInt } from './util/helpers'; import { BroadcastParams, IVertoOptions } from './util/interfaces'; @@ -36,6 +37,7 @@ export default abstract class BaseSession { private _executeQueue: { resolve?: Function; msg: any }[] = []; private _pong: boolean; + private registerAgent: RegisterAgent; constructor(public options: IVertoOptions) { if (!this.validateOptions()) { @@ -48,6 +50,7 @@ export default abstract class BaseSession { this._attachListeners(); this.connection = new Connection(this); + this.registerAgent = new RegisterAgent(this); } get __logger(): log.Logger { @@ -412,4 +415,12 @@ export default abstract class BaseSession { public hasAutoReconnect() { return this._autoReconnect; } + + /** + * Get the registration state of the client + * @return Promise + */ + public getIsRegistered() { + return this.registerAgent.getIsRegistered(); + } } diff --git a/packages/js/src/Modules/Verto/services/RegisterAgent.ts b/packages/js/src/Modules/Verto/services/RegisterAgent.ts new file mode 100644 index 00000000..4b32ee52 --- /dev/null +++ b/packages/js/src/Modules/Verto/services/RegisterAgent.ts @@ -0,0 +1,39 @@ +import BaseSession from '../BaseSession'; +import { Gateway } from '../messages/verto/Gateway'; +import { + deferredPromise, + DeferredPromise, + getGatewayState, +} from '../util/helpers'; +import { GatewayStateType } from '../webrtc/constants'; + +export class RegisterAgent { + private session: BaseSession; + private gatewayStateTask: DeferredPromise; + private pendingRequestId: string | null = null; + + constructor(session: BaseSession) { + this.session = session; + this.gatewayStateTask = deferredPromise({}); + this.session.on('telnyx.socket.message', this.onSocketMessage); + } + + public onSocketMessage = async (response) => { + if (response.id === this.pendingRequestId) { + this.gatewayStateTask.resolve(getGatewayState(response)); + } + }; + + public getIsRegistered = async () => { + const message = new Gateway(); + this.pendingRequestId = message.request.id; + this.gatewayStateTask = deferredPromise({}); + + this.session.execute(message); + const state = await this.gatewayStateTask.promise; + if (!state) { + return false; + } + return [GatewayStateType.REGISTER, GatewayStateType.REGED].includes(state); + }; +}