export enum CallState { PJSIP_INV_STATE_NULL = 'PJSIP_INV_STATE_NULL', PJSIP_INV_STATE_CALLING = 'PJSIP_INV_STATE_CALLING', PJSIP_INV_STATE_INCOMING = 'PJSIP_INV_STATE_INCOMING', PJSIP_INV_STATE_EARLY = 'PJSIP_INV_STATE_EARLY', PJSIP_INV_STATE_CONNECTING = 'PJSIP_INV_STATE_CONNECTING', PJSIP_INV_STATE_CONFIRMED = 'PJSIP_INV_STATE_CONFIRMED', PJSIP_INV_STATE_DISCONNECTED = 'PJSIP_INV_STATE_DISCONNECTED', }; export type CallData = { id: number callId: string accountId: number localContact: string localUri: string remoteContact: string remoteUri: string state: CallState stateText: string held: boolean muted: boolean speaker: boolean connectDuration: number totalDuration: number remoteOfferer: number remoteAudioCount: number remoteVideoCount: number remoteNumber: string remoteName: string audioCount: number videoCount: number lastStatusCode: string lastReason: string media: string provisionalMedia: string } /** * This class describes the information and current status of a call. */ class Call { _id: number; _callId: string; _accountId: number; _localContact: string; _localUri: string; _remoteContact: string; _remoteUri: string; _state: CallState; _stateText: string; _held: boolean; _muted: boolean; _speaker: boolean; _connectDuration: number; _totalDuration: number; _remoteOfferer: number; _remoteAudioCount: number; _remoteVideoCount: number; _remoteNumber: string; _remoteName: string; _audioCount: number; _videoCount: number; _lastStatusCode: string; _lastReason: string; _media: string; _provisionalMedia: string; _constructionTime: number; constructor({ id, callId, accountId, localContact, localUri, remoteContact, remoteUri, state, stateText, held, muted, speaker, connectDuration, totalDuration, remoteOfferer, remoteAudioCount, remoteVideoCount, audioCount, videoCount, lastStatusCode, lastReason, media, provisionalMedia, }: CallData) { let remoteNumber = null; let remoteName = null; if (remoteUri) { let match = remoteUri.match(/"([^"]+)" `; } else if (this._remoteNumber) { return this._remoteNumber; } else { return this._remoteUri } } /** * Invite session state. * * PJSIP_INV_STATE_NULL Before INVITE is sent or received * PJSIP_INV_STATE_CALLING After INVITE is sent * PJSIP_INV_STATE_INCOMING After INVITE is received. * PJSIP_INV_STATE_EARLY After response with To tag. * PJSIP_INV_STATE_CONNECTING After 2xx is sent/received. * PJSIP_INV_STATE_CONFIRMED After ACK is sent/received. * PJSIP_INV_STATE_DISCONNECTED Session is terminated. * * @returns {String} */ getState(): CallState { return this._state; } /** * Text describing the state. * * @returns {String} */ getStateText(): string { return this._stateText; } isHeld(): boolean { return this._held; } isMuted(): boolean { return this._muted; } isSpeaker(): boolean { return this._speaker; } isTerminated(): boolean { return this._state === 'PJSIP_INV_STATE_DISCONNECTED'; } /** * Flag if remote was SDP offerer * @returns {boolean} */ getRemoteOfferer(): number { // TODO Verify whether boolean value return this._remoteOfferer; } /** * Number of audio streams offered by remote. * @returns {int} */ getRemoteAudioCount(): number { return this._remoteAudioCount; } /** * Number of video streams offered by remote. * @returns {int} */ getRemoteVideoCount(): number { return this._remoteVideoCount; } /** * Number of simultaneous active audio streams for this call. If zero - audio is disabled in this call. * @returns {int} */ getAudioCount(): number { return this._audioCount; } /** * Number of simultaneous active video streams for this call. If zero - video is disabled in this call. * @returns {*} */ getVideoCount(): number { return this._videoCount; } /** * Last status code heard, which can be used as cause code. * Possible values: * - PJSIP_SC_TRYING / 100 * - PJSIP_SC_RINGING / 180 * - PJSIP_SC_CALL_BEING_FORWARDED / 181 * - PJSIP_SC_QUEUED / 182 * - PJSIP_SC_PROGRESS / 183 * - PJSIP_SC_OK / 200 * - PJSIP_SC_ACCEPTED / 202 * - PJSIP_SC_MULTIPLE_CHOICES / 300 * - PJSIP_SC_MOVED_PERMANENTLY / 301 * - PJSIP_SC_MOVED_TEMPORARILY / 302 * - PJSIP_SC_USE_PROXY / 305 * - PJSIP_SC_ALTERNATIVE_SERVICE / 380 * - PJSIP_SC_BAD_REQUEST / 400 * - PJSIP_SC_UNAUTHORIZED / 401 * - PJSIP_SC_PAYMENT_REQUIRED / 402 * - PJSIP_SC_FORBIDDEN / 403 * - PJSIP_SC_NOT_FOUND / 404 * - PJSIP_SC_METHOD_NOT_ALLOWED / 405 * - PJSIP_SC_NOT_ACCEPTABLE / 406 * - PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED / 407 * - PJSIP_SC_REQUEST_TIMEOUT / 408 * - PJSIP_SC_GONE / 410 * - PJSIP_SC_REQUEST_ENTITY_TOO_LARGE / 413 * - PJSIP_SC_REQUEST_URI_TOO_LONG / 414 * - PJSIP_SC_UNSUPPORTED_MEDIA_TYPE / 415 * - PJSIP_SC_UNSUPPORTED_URI_SCHEME / 416 * - PJSIP_SC_BAD_EXTENSION / 420 * - PJSIP_SC_EXTENSION_REQUIRED / 421 * - PJSIP_SC_SESSION_TIMER_TOO_SMALL / 422 * - PJSIP_SC_INTERVAL_TOO_BRIEF / 423 * - PJSIP_SC_TEMPORARILY_UNAVAILABLE / 480 * - PJSIP_SC_CALL_TSX_DOES_NOT_EXIST / 481 * - PJSIP_SC_LOOP_DETECTED / 482 * - PJSIP_SC_TOO_MANY_HOPS / 483 * - PJSIP_SC_ADDRESS_INCOMPLETE / 484 * - PJSIP_AC_AMBIGUOUS / 485 * - PJSIP_SC_BUSY_HERE / 486 * - PJSIP_SC_REQUEST_TERMINATED / 487 * - PJSIP_SC_NOT_ACCEPTABLE_HERE / 488 * - PJSIP_SC_BAD_EVENT / 489 * - PJSIP_SC_REQUEST_UPDATED / 490 * - PJSIP_SC_REQUEST_PENDING / 491 * - PJSIP_SC_UNDECIPHERABLE / 493 * - PJSIP_SC_INTERNAL_SERVER_ERROR / 500 * - PJSIP_SC_NOT_IMPLEMENTED / 501 * - PJSIP_SC_BAD_GATEWAY / 502 * - PJSIP_SC_SERVICE_UNAVAILABLE / 503 * - PJSIP_SC_SERVER_TIMEOUT / 504 * - PJSIP_SC_VERSION_NOT_SUPPORTED / 505 * - PJSIP_SC_MESSAGE_TOO_LARGE / 513 * - PJSIP_SC_PRECONDITION_FAILURE / 580 * - PJSIP_SC_BUSY_EVERYWHERE / 600 * - PJSIP_SC_DECLINE / 603 * - PJSIP_SC_DOES_NOT_EXIST_ANYWHERE / 604 * - PJSIP_SC_NOT_ACCEPTABLE_ANYWHERE / 606 * - PJSIP_SC_TSX_TIMEOUT / PJSIP_SC_REQUEST_TIMEOUT * - PJSIP_SC_TSX_TRANSPORT_ERROR / PJSIP_SC_SERVICE_UNAVAILABLE * * @returns {string} */ getLastStatusCode(): string { return this._lastStatusCode; } /** * The reason phrase describing the last status. * * @returns {string} */ getLastReason(): string { return this._lastReason; } getMedia(): string { return this._media; } getProvisionalMedia(): string { return this._provisionalMedia; } /** * Format seconds to "MM:SS" format. * * @public * @returns {string} */ _formatTime(seconds: number): string { if (isNaN(seconds) || seconds < 0) { return "00:00"; } var hours = parseInt(String(seconds/3600)) % 24; var minutes = parseInt(String(seconds/60)) % 60; var result = ""; seconds = seconds % 60; if (hours > 0) { result += (hours < 10 ? "0" + hours : hours) + ":"; } result += (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds); return result; }; } export { Call }; export default Call;