From 1da41443caa8e68a7afb10f85bb7eb7114bde807 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Fri, 8 Apr 2022 20:59:45 +0200 Subject: [PATCH] Calls: Introduce peer-to-peer calls (#1791) --- .stylelintrc.json | 8 +- public/call_busy.mp3 | Bin 0 -> 85889 bytes public/call_connect.mp3 | Bin 0 -> 27584 bytes public/call_end.mp3 | Bin 0 -> 25703 bytes public/call_incoming.mp3 | Bin 0 -> 50154 bytes public/call_ringing.mp3 | Bin 0 -> 66454 bytes src/@types/global.d.ts | 2 + src/api/gramjs/apiBuilders/calls.ts | 146 +++++- src/api/gramjs/apiBuilders/messages.ts | 11 + src/api/gramjs/gramjsBuilders/index.ts | 9 +- src/api/gramjs/methods/calls.ts | 140 +++++- src/api/gramjs/methods/index.ts | 6 + src/api/gramjs/methods/phoneCallState.ts | 184 ++++++++ src/api/gramjs/updater.ts | 22 +- src/api/types/calls.ts | 49 +- src/api/types/messages.ts | 3 +- src/api/types/updates.ts | 38 +- src/assets/call-fallback-avatar.png | Bin 18478 -> 0 bytes src/assets/fonts/icomoon.woff | Bin 42220 -> 43412 bytes src/assets/fonts/icomoon.woff2 | Bin 19880 -> 20332 bytes src/bundles/calls.ts | 3 +- .../calls/ActiveCallHeader.async.tsx | 6 +- src/components/calls/ActiveCallHeader.tsx | 29 +- .../calls/CallFallbackConfirm.async.tsx | 15 - src/components/calls/CallFallbackConfirm.tsx | 66 --- src/components/calls/group/GroupCall.tsx | 10 +- .../calls/group/MicrophoneButton.tsx | 2 +- .../calls/phone/PhoneCall.async.tsx | 16 + .../calls/phone/PhoneCall.module.scss | 179 +++++++ src/components/calls/phone/PhoneCall.tsx | 362 +++++++++++++++ .../calls/phone/PhoneCallButton.module.scss | 36 ++ .../calls/phone/PhoneCallButton.tsx | 45 ++ .../calls/phone/RatePhoneCallModal.async.tsx | 16 + .../phone/RatePhoneCallModal.module.scss | 28 ++ .../calls/phone/RatePhoneCallModal.tsx | 77 ++++ src/components/common/Avatar.tsx | 5 +- src/components/left/settings/SettingsMain.tsx | 2 +- src/components/main/Main.scss | 4 +- src/components/main/Main.tsx | 23 +- src/components/middle/HeaderActions.tsx | 10 +- src/components/middle/HeaderMenuContainer.tsx | 22 +- src/components/middle/MessageListContent.tsx | 7 +- src/components/middle/message/Message.tsx | 23 +- .../message/MessagePhoneCall.module.scss | 49 ++ .../middle/message/MessagePhoneCall.tsx | 89 ++++ src/components/ui/FloatingActionButton.scss | 4 +- src/global/actions/api/calls.async.ts | 249 ++++------ src/global/actions/apiUpdaters/calls.async.ts | 202 ++++++++ src/global/actions/apiUpdaters/calls.ts | 30 ++ src/global/actions/calls.ts | 1 + src/global/actions/ui/calls.ts | 123 +++-- src/global/cache.ts | 3 +- src/global/helpers/messages.ts | 5 +- src/global/selectors/calls.ts | 12 +- src/global/types.ts | 35 +- src/lib/gramjs/Helpers.js | 5 +- src/lib/gramjs/network/MTProtoState.js | 175 ++++--- src/lib/gramjs/tl/apiTl.js | 8 + src/lib/gramjs/tl/static/api.json | 8 + src/lib/secret-sauce/buildSdp.d.ts | 2 +- src/lib/secret-sauce/index.d.ts | 2 + src/lib/secret-sauce/index.js | 2 +- src/lib/secret-sauce/p2p.d.ts | 16 + src/lib/secret-sauce/p2pMessage.d.ts | 47 ++ src/lib/secret-sauce/parseSdp.d.ts | 2 +- src/lib/secret-sauce/secretsauce.d.ts | 3 +- src/lib/secret-sauce/types.d.ts | 26 ++ src/lib/secret-sauce/utils.d.ts | 7 +- src/styles/Telegram T.json | 435 ++++++++++-------- src/styles/icons.scss | 11 +- src/util/dateFormat.ts | 41 ++ src/util/notifications.ts | 39 +- src/util/phoneCallEmojiConstants.ts | 88 ++++ webpack.config.js | 11 +- 74 files changed, 2706 insertions(+), 628 deletions(-) create mode 100644 public/call_busy.mp3 create mode 100644 public/call_connect.mp3 create mode 100644 public/call_end.mp3 create mode 100644 public/call_incoming.mp3 create mode 100644 public/call_ringing.mp3 create mode 100644 src/api/gramjs/methods/phoneCallState.ts delete mode 100644 src/assets/call-fallback-avatar.png delete mode 100644 src/components/calls/CallFallbackConfirm.async.tsx delete mode 100644 src/components/calls/CallFallbackConfirm.tsx create mode 100644 src/components/calls/phone/PhoneCall.async.tsx create mode 100644 src/components/calls/phone/PhoneCall.module.scss create mode 100644 src/components/calls/phone/PhoneCall.tsx create mode 100644 src/components/calls/phone/PhoneCallButton.module.scss create mode 100644 src/components/calls/phone/PhoneCallButton.tsx create mode 100644 src/components/calls/phone/RatePhoneCallModal.async.tsx create mode 100644 src/components/calls/phone/RatePhoneCallModal.module.scss create mode 100644 src/components/calls/phone/RatePhoneCallModal.tsx create mode 100644 src/components/middle/message/MessagePhoneCall.module.scss create mode 100644 src/components/middle/message/MessagePhoneCall.tsx create mode 100644 src/global/actions/apiUpdaters/calls.async.ts create mode 100644 src/lib/secret-sauce/p2p.d.ts create mode 100644 src/lib/secret-sauce/p2pMessage.d.ts create mode 100644 src/util/phoneCallEmojiConstants.ts diff --git a/.stylelintrc.json b/.stylelintrc.json index 0f100bc98..9e945e829 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -24,6 +24,12 @@ } ], "plugin/stylelint-group-selectors": [true, { "severity": "warning" }], - "plugin/whole-pixel": [true, { "ignoreList": ["letter-spacing"] }] + "plugin/whole-pixel": [true, { "ignoreList": ["letter-spacing"] }], + "selector-pseudo-class-no-unknown": [ + true, + { + "ignorePseudoClasses": ["global"] + } + ] } } diff --git a/public/call_busy.mp3 b/public/call_busy.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..96827921515a684a343572881624180a0defbcea GIT binary patch literal 85889 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 literal 0 HcmV?d00001 diff --git a/public/call_connect.mp3 b/public/call_connect.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5db9355ea7e591947cc8bff1cd23af556552ff66 GIT binary patch literal 27584 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 G8~9)PzvCMK literal 0 HcmV?d00001 diff --git a/public/call_end.mp3 b/public/call_end.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..177373e77736d03b8e40b8377e608d4beb523027 GIT binary patch literal 25703 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 Q0RNA*|LZ=<|BoB`KlK^wI{*Lx literal 0 HcmV?d00001 diff --git a/public/call_ringing.mp3 b/public/call_ringing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..16125a94535b0c3b7f445fa8f802b2b931d5eb92 GIT binary patch literal 66454 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 F{{Z+GfB^si literal 0 HcmV?d00001 diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 8b651cafd..2ea0d835e 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -1,5 +1,7 @@ declare const process: NodeJS.Process; +declare module '*.module.scss'; + declare const APP_REVISION: string; declare namespace React { diff --git a/src/api/gramjs/apiBuilders/calls.ts b/src/api/gramjs/apiBuilders/calls.ts index 4430a6e0a..8e9c1681f 100644 --- a/src/api/gramjs/apiBuilders/calls.ts +++ b/src/api/gramjs/apiBuilders/calls.ts @@ -1,6 +1,12 @@ -import { GroupCallParticipant, GroupCallParticipantVideo, SsrcGroup } from '../../../lib/secret-sauce'; +import type { + ApiCallProtocol, + ApiPhoneCallConnection, + GroupCallParticipant, + GroupCallParticipantVideo, + SsrcGroup, +} from '../../../lib/secret-sauce'; import { Api as GramJs } from '../../../lib/gramjs'; -import { ApiGroupCall } from '../../types'; +import { ApiGroupCall, ApiPhoneCall } from '../../types'; import { getApiChatIdFromMtpPeer, isPeerUser } from './peers'; export function buildApiGroupCallParticipant(participant: GramJs.GroupCallParticipant): GroupCallParticipant { @@ -96,3 +102,139 @@ export function buildApiGroupCall(groupCall: GramJs.TypeGroupCall): ApiGroupCall export function getGroupCallId(groupCall: GramJs.TypeInputGroupCall) { return groupCall.id.toString(); } + +export function buildPhoneCall(call: GramJs.TypePhoneCall): ApiPhoneCall { + const { id } = call; + + let phoneCall: ApiPhoneCall = { + id: id.toString(), + }; + + if (call instanceof GramJs.PhoneCallAccepted + || call instanceof GramJs.PhoneCallWaiting + || call instanceof GramJs.PhoneCall + || call instanceof GramJs.PhoneCallRequested) { + const { + accessHash, adminId, date, video, participantId, protocol, + } = call; + + phoneCall = { + ...phoneCall, + accessHash: accessHash.toString(), + adminId: adminId.toString(), + participantId: participantId.toString(), + date, + isVideo: video, + protocol: buildApiCallProtocol(protocol), + }; + } + + if (call instanceof GramJs.PhoneCall) { + const { + p2pAllowed, gAOrB, keyFingerprint, connections, startDate, + } = call; + + phoneCall = { + ...phoneCall, + state: 'active', + gAOrB: Array.from(gAOrB), + keyFingerprint: keyFingerprint.toString(), + startDate, + p2pAllowed, + connections: connections.map(buildApiCallConnection).filter(Boolean) as ApiPhoneCallConnection[], + }; + } + + if (call instanceof GramJs.PhoneCallDiscarded) { + phoneCall = { + ...phoneCall, + state: 'discarded', + duration: call.duration, + reason: buildApiCallDiscardReason(call.reason), + needRating: call.needRating, + needDebug: call.needDebug, + }; + } + + if (call instanceof GramJs.PhoneCallWaiting) { + phoneCall = { + ...phoneCall, + state: 'waiting', + receiveDate: call.receiveDate, + }; + } + + if (call instanceof GramJs.PhoneCallAccepted) { + phoneCall = { + ...phoneCall, + state: 'accepted', + gB: Array.from(call.gB), + }; + } + + if (call instanceof GramJs.PhoneCallRequested) { + phoneCall = { + ...phoneCall, + state: 'requested', + gAHash: Array.from(call.gAHash), + }; + } + + return phoneCall; +} + +export function buildApiCallDiscardReason(discardReason?: GramJs.TypePhoneCallDiscardReason) { + if (discardReason instanceof GramJs.PhoneCallDiscardReasonMissed) { + return 'missed'; + } else if (discardReason instanceof GramJs.PhoneCallDiscardReasonBusy) { + return 'busy'; + } else if (discardReason instanceof GramJs.PhoneCallDiscardReasonHangup) { + return 'hangup'; + } else { + return 'disconnect'; + } +} + +function buildApiCallConnection(connection: GramJs.TypePhoneConnection): ApiPhoneCallConnection | undefined { + if (connection instanceof GramJs.PhoneConnectionWebrtc) { + const { + username, password, turn, stun, ip, ipv6, port, + } = connection; + + return { + username, + password, + isTurn: turn, + isStun: stun, + ip, + ipv6, + port, + }; + } else { + return undefined; + } +} + +export function buildApiCallProtocol(protocol: GramJs.PhoneCallProtocol): ApiCallProtocol { + const { + libraryVersions, minLayer, maxLayer, udpP2p, udpReflector, + } = protocol; + + return { + libraryVersions, + minLayer, + maxLayer, + isUdpP2p: udpP2p, + isUdpReflector: udpReflector, + }; +} + +export function buildCallProtocol() { + return new GramJs.PhoneCallProtocol({ + libraryVersions: ['4.0.0'], + minLayer: 92, + maxLayer: 92, + udpReflector: true, + udpP2p: true, + }); +} diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts index 64bd4aff4..67ad93b59 100644 --- a/src/api/gramjs/apiBuilders/messages.ts +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -30,6 +30,7 @@ import { ApiUser, ApiLocation, ApiGame, + PhoneCallAction, } from '../../types'; import { @@ -50,6 +51,7 @@ import { interpolateArray } from '../../../util/waveform'; import { buildPeer } from '../gramjsBuilders'; import { addPhotoToLocalDb, resolveMessageApiChatId, serializeBytes } from '../helpers'; import { buildApiPeerId, getApiChatIdFromMtpPeer, isPeerUser } from './peers'; +import { buildApiCallDiscardReason } from './calls'; const LOCAL_MEDIA_UPLOADING_TEMP_ID = 'temp'; const INPUT_WAVEFORM_LENGTH = 63; @@ -785,6 +787,7 @@ function buildAction( return undefined; } + let phoneCall: PhoneCallAction | undefined; let call: Partial | undefined; let amount: number | undefined; let currency: string | undefined; @@ -871,6 +874,13 @@ function buildAction( const mins = Math.max(Math.round(action.duration! / 60), 1); translationValues.push(`${mins} min${mins > 1 ? 's' : ''}`); } + + phoneCall = { + isOutgoing, + isVideo: action.video, + duration: action.duration, + reason: buildApiCallDiscardReason(action.reason), + }; } else if (action instanceof GramJs.MessageActionInviteToGroupCall) { text = 'Notification.VoiceChatInvitation'; call = { @@ -933,6 +943,7 @@ function buildAction( currency, translationValues, call, + phoneCall, score, }; } diff --git a/src/api/gramjs/gramjsBuilders/index.ts b/src/api/gramjs/gramjsBuilders/index.ts index de5071d42..c091dd87a 100644 --- a/src/api/gramjs/gramjsBuilders/index.ts +++ b/src/api/gramjs/gramjsBuilders/index.ts @@ -11,7 +11,7 @@ import { ApiGroupCall, ApiMessageEntity, ApiMessageEntityTypes, - ApiNewPoll, + ApiNewPoll, ApiPhoneCall, ApiReportReason, ApiSendMessageAction, ApiSticker, @@ -465,3 +465,10 @@ export function buildInputGroupCall(groupCall: Partial) { accessHash: BigInt(groupCall.accessHash!), }); } + +export function buildInputPhoneCall({ id, accessHash }: ApiPhoneCall) { + return new GramJs.InputPhoneCall({ + id: BigInt(id), + accessHash: BigInt(accessHash!), + }); +} diff --git a/src/api/gramjs/methods/calls.ts b/src/api/gramjs/methods/calls.ts index ce22d7c0f..92e7fe040 100644 --- a/src/api/gramjs/methods/calls.ts +++ b/src/api/gramjs/methods/calls.ts @@ -1,14 +1,18 @@ -import { JoinGroupCallPayload } from '../../../lib/secret-sauce'; +import BigInt from 'big-integer'; +import type { JoinGroupCallPayload } from '../../../lib/secret-sauce'; import { - ApiChat, ApiUser, OnApiUpdate, ApiGroupCall, + ApiChat, ApiUser, OnApiUpdate, ApiGroupCall, ApiPhoneCall, } from '../../types'; import { Api as GramJs } from '../../../lib/gramjs'; import { invokeRequest } from './client'; -import { buildInputGroupCall, buildInputPeer, generateRandomInt } from '../gramjsBuilders'; import { + buildInputGroupCall, buildInputPeer, buildInputPhoneCall, generateRandomInt, +} from '../gramjsBuilders'; +import { + buildCallProtocol, buildApiGroupCall, - buildApiGroupCallParticipant, + buildApiGroupCallParticipant, buildPhoneCall, } from '../apiBuilders/calls'; import { buildApiUser } from '../apiBuilders/users'; @@ -234,3 +238,131 @@ export function leaveGroupCallPresentation({ call: buildInputGroupCall(call), }), true); } + +export async function getDhConfig() { + const dhConfig = await invokeRequest(new GramJs.messages.GetDhConfig({})); + + if (!dhConfig || dhConfig instanceof GramJs.messages.DhConfigNotModified) return undefined; + + return { + g: dhConfig.g, + p: Array.from(dhConfig.p), + random: Array.from(dhConfig.random), + }; +} + +export function discardCall({ + call, isBusy, +}: { + call: ApiPhoneCall; isBusy?: boolean; +}) { + return invokeRequest(new GramJs.phone.DiscardCall({ + peer: buildInputPhoneCall(call), + reason: isBusy ? new GramJs.PhoneCallDiscardReasonBusy() : new GramJs.PhoneCallDiscardReasonHangup(), + }), true); +} + +export async function requestCall({ + user, gAHash, isVideo, +}: { + user: ApiUser; gAHash: number[]; isVideo?: boolean; +}) { + const result = await invokeRequest(new GramJs.phone.RequestCall({ + randomId: generateRandomInt(), + userId: buildInputPeer(user.id, user.accessHash), + gAHash: Buffer.from(gAHash), + ...(isVideo && { video: true }), + protocol: buildCallProtocol(), + })); + + if (!result) { + return; + } + + const call = buildPhoneCall(result.phoneCall); + + onUpdate({ + '@type': 'updatePhoneCall', + call, + }); +} + +export function setCallRating({ + call, rating, comment, +}: { + call: ApiPhoneCall; rating: number; comment: string; +}) { + return invokeRequest(new GramJs.phone.SetCallRating({ + rating, + peer: buildInputPhoneCall(call), + comment, + }), true); +} + +export function receivedCall({ + call, +}: { + call: ApiPhoneCall; +}) { + return invokeRequest(new GramJs.phone.ReceivedCall({ + peer: buildInputPhoneCall(call), + })); +} + +export async function acceptCall({ + call, gB, +}: { + call: ApiPhoneCall; gB: number[]; +}) { + const result = await invokeRequest(new GramJs.phone.AcceptCall({ + peer: buildInputPhoneCall(call), + gB: Buffer.from(gB), + protocol: buildCallProtocol(), + })); + + if (!result) { + return; + } + + call = buildPhoneCall(result.phoneCall); + + onUpdate({ + '@type': 'updatePhoneCall', + call, + }); +} + +export async function confirmCall({ + call, gA, keyFingerprint, +}: { + call: ApiPhoneCall; gA: number[]; keyFingerprint: string; +}) { + const result = await invokeRequest(new GramJs.phone.ConfirmCall({ + peer: buildInputPhoneCall(call), + gA: Buffer.from(gA), + keyFingerprint: BigInt(keyFingerprint), + protocol: buildCallProtocol(), + })); + + if (!result) { + return; + } + + call = buildPhoneCall(result.phoneCall); + + onUpdate({ + '@type': 'updatePhoneCall', + call, + }); +} + +export function sendSignalingData({ + data, call, +}: { + data: number[]; call: ApiPhoneCall; +}) { + return invokeRequest(new GramJs.phone.SendSignalingData({ + data: Buffer.from(data), + peer: buildInputPhoneCall(call), + })); +} diff --git a/src/api/gramjs/methods/index.ts b/src/api/gramjs/methods/index.ts index 2b021a711..692e9455d 100644 --- a/src/api/gramjs/methods/index.ts +++ b/src/api/gramjs/methods/index.ts @@ -70,6 +70,7 @@ export { getGroupCall, joinGroupCall, discardGroupCall, createGroupCall, editGroupCallTitle, editGroupCallParticipant, exportGroupCallInvite, fetchGroupCallParticipants, joinGroupCallPresentation, leaveGroupCall, leaveGroupCallPresentation, toggleGroupCallStartSubscription, + requestCall, getDhConfig, confirmCall, sendSignalingData, acceptCall, discardCall, setCallRating, receivedCall, } from './calls'; export { @@ -78,3 +79,8 @@ export { } from './reactions'; export { fetchChannelStatistics, fetchGroupStatistics, fetchStatisticsAsyncGraph } from './statistics'; + +export { + acceptPhoneCall, confirmPhoneCall, requestPhoneCall, decodePhoneCallData, createPhoneCallState, + destroyPhoneCallState, encodePhoneCallData, +} from './phoneCallState'; diff --git a/src/api/gramjs/methods/phoneCallState.ts b/src/api/gramjs/methods/phoneCallState.ts new file mode 100644 index 000000000..0cd2f8b6b --- /dev/null +++ b/src/api/gramjs/methods/phoneCallState.ts @@ -0,0 +1,184 @@ +import BigInt from 'big-integer'; +import type bigInt from 'big-integer'; +import MTProtoState from '../../../lib/gramjs/network/MTProtoState'; +import Logger from '../../../lib/gramjs/extensions/Logger'; +import Helpers from '../../../lib/gramjs/Helpers'; +import AuthKey from '../../../lib/gramjs/crypto/AuthKey'; + +type DhConfig = { + p: number[]; + g: number; + random: number[]; +}; + +let currentPhoneCallState: PhoneCallState | undefined; + +class PhoneCallState { + private state?: MTProtoState; + + private seq = 0; + + private gA?: bigInt.BigInteger; + + private gB: any; + + private p?: bigInt.BigInteger; + + private random?: bigInt.BigInteger; + + private waitForState: Promise; + + private resolveState?: VoidFunction; + + constructor( + private isOutgoing: boolean, + ) { + this.waitForState = new Promise((resolve) => { + this.resolveState = resolve; + }); + } + + async requestCall({ p, g, random }: DhConfig) { + const pBN = Helpers.readBigIntFromBuffer(Buffer.from(p), false); + const randomBN = Helpers.readBigIntFromBuffer(Buffer.from(random), false); + + const gA = Helpers.modExp(BigInt(g), randomBN, pBN); + + this.gA = gA; + this.p = pBN; + this.random = randomBN; + + const gAHash: Buffer = await Helpers.sha256(Helpers.getByteArray(gA)); + return Array.from(gAHash); + } + + acceptCall({ p, g, random }: DhConfig) { + const pLast = Helpers.readBigIntFromBuffer(p, false); + const randomLast = Helpers.readBigIntFromBuffer(random, false); + + const gB = Helpers.modExp(BigInt(g), randomLast, pLast); + this.gB = gB; + this.p = pLast; + this.random = randomLast; + + return Array.from(Helpers.getByteArray(gB)); + } + + async confirmCall(gAOrB: number[], emojiData: Uint16Array, emojiOffsets: number[]) { + if (this.isOutgoing) { + this.gB = Helpers.readBigIntFromBuffer(Buffer.from(gAOrB), false); + } else { + this.gA = Helpers.readBigIntFromBuffer(Buffer.from(gAOrB), false); + } + const authKey = Helpers.modExp( + !this.isOutgoing ? this.gA : this.gB, + this.random, + this.p, + ); + const fingerprint: Buffer = await Helpers.sha1(Helpers.getByteArray(authKey)); + const keyFingerprint = Helpers.readBigIntFromBuffer(fingerprint.slice(-8).reverse(), false); + + const emojis = await generateEmojiFingerprint( + Helpers.getByteArray(authKey), + Helpers.getByteArray(this.gA), + emojiData, + emojiOffsets, + ); + + const key = new AuthKey(); + await key.setKey(Helpers.getByteArray(authKey)); + this.state = new MTProtoState(key, new Logger(), true, this.isOutgoing); + this.resolveState!(); + + return { gA: Array.from(Helpers.getByteArray(this.gA)), keyFingerprint: keyFingerprint.toString(), emojis }; + } + + async encode(data: string) { + if (!this.state) return undefined; + + const seqArray = new Uint32Array(1); + seqArray[0] = this.seq++; + const encodedData = await this.state.encryptMessageData( + Buffer.concat([Helpers.convertToLittle(seqArray), Buffer.from(data)]), + ); + return Array.from(encodedData); + } + + async decode(data: number[]): Promise { + if (!this.state) { + return this.waitForState.then(() => { + return this.decode(data); + }); + } + + const message = await this.state.decryptMessageData(Buffer.from(data)); + + return JSON.parse(message.toString()); + } +} + +// https://github.com/TelegramV/App/blob/ead52320975362139cabad18cf8346f98c349a22/src/js/MTProto/Calls/Internal.js#L72 +function computeEmojiIndex(bytes: Uint8Array) { + return ((BigInt(bytes[0]).and(0x7F)).shiftLeft(56)) + .or((BigInt(bytes[1]).shiftLeft(48))) + .or((BigInt(bytes[2]).shiftLeft(40))) + .or((BigInt(bytes[3]).shiftLeft(32))) + .or((BigInt(bytes[4]).shiftLeft(24))) + .or((BigInt(bytes[5]).shiftLeft(16))) + .or((BigInt(bytes[6]).shiftLeft(8))) + .or((BigInt(bytes[7]))); +} + +export async function generateEmojiFingerprint( + authKey: Uint8Array, gA: Uint8Array, emojiData: Uint16Array, emojiOffsets: number[], +) { + const hash = await Helpers.sha256(Buffer.concat([new Uint8Array(authKey), new Uint8Array(gA)])); + const result = []; + const emojiCount = emojiOffsets.length - 1; + const kPartSize = 8; + for (let partOffset = 0; partOffset !== hash.byteLength; partOffset += kPartSize) { + const value = computeEmojiIndex(hash.subarray(partOffset, partOffset + kPartSize)); + const index = value.modPow(1, emojiCount).toJSNumber(); + const offset = emojiOffsets[index]; + const size = emojiOffsets[index + 1] - offset; + result.push(String.fromCharCode(...emojiData.subarray(offset, offset + size))); + } + return result.join(''); +} + +export function createPhoneCallState(params: ConstructorParameters) { + currentPhoneCallState = new PhoneCallState(...params); +} + +export function destroyPhoneCallState() { + currentPhoneCallState = undefined; +} + +type FunctionPropertyOf = { + [P in keyof T]: T[P] extends Function + ? P + : never +}[keyof T]; + +type ParamsOf> = Parameters; +type ReturnTypeOf> = ReturnType; + +export function encodePhoneCallData(params: ParamsOf<'encode'>): ReturnTypeOf<'encode'> { + return currentPhoneCallState!.encode(...params); +} + +export function decodePhoneCallData(params: ParamsOf<'decode'>): ReturnTypeOf<'decode'> { + return currentPhoneCallState!.decode(...params); +} + +export function confirmPhoneCall(params: ParamsOf<'confirmCall'>): ReturnTypeOf<'confirmCall'> { + return currentPhoneCallState!.confirmCall(...params); +} + +export function acceptPhoneCall(params: ParamsOf<'acceptCall'>): ReturnTypeOf<'acceptCall'> { + return currentPhoneCallState!.acceptCall(...params); +} + +export function requestPhoneCall(params: ParamsOf<'requestCall'>): ReturnTypeOf<'requestCall'> { + return currentPhoneCallState!.requestCall(...params); +} diff --git a/src/api/gramjs/updater.ts b/src/api/gramjs/updater.ts index 7b99ec2e7..787850ee6 100644 --- a/src/api/gramjs/updater.ts +++ b/src/api/gramjs/updater.ts @@ -1,4 +1,4 @@ -import { GroupCallConnectionData } from '../../lib/secret-sauce'; +import type { GroupCallConnectionData } from '../../lib/secret-sauce'; import { Api as GramJs, connection } from '../../lib/gramjs'; import { ApiMessage, ApiUpdateConnectionStateType, OnApiUpdate } from '../types'; @@ -44,7 +44,7 @@ import { buildApiNotifyException, buildPrivacyKey, buildPrivacyRules } from './a import { buildApiPhoto } from './apiBuilders/common'; import { buildApiGroupCall, - buildApiGroupCallParticipant, + buildApiGroupCallParticipant, buildPhoneCall, getGroupCallId, } from './apiBuilders/calls'; import { buildApiPeerId, getApiChatIdFromMtpPeer } from './apiBuilders/peers'; @@ -897,6 +897,24 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { recentRequesterIds: update.recentRequesters.map((id) => buildApiPeerId(id, 'user')), requestsPending: update.requestsPending, }); + } else if (update instanceof GramJs.UpdatePhoneCall) { + // eslint-disable-next-line no-underscore-dangle + const entities = update._entities; + if (entities) { + addEntitiesWithPhotosToLocalDb(entities); + dispatchUserAndChatUpdates(entities); + } + + onUpdate({ + '@type': 'updatePhoneCall', + call: buildPhoneCall(update.phoneCall), + }); + } else if (update instanceof GramJs.UpdatePhoneCallSignalingData) { + onUpdate({ + '@type': 'updatePhoneCallSignalingData', + callId: update.phoneCallId.toString(), + data: Array.from(update.data), + }); } else if (DEBUG) { const params = typeof update === 'object' && 'className' in update ? update.className : update; // eslint-disable-next-line no-console diff --git a/src/api/types/calls.ts b/src/api/types/calls.ts index 7f2a6dc3c..5541bd540 100644 --- a/src/api/types/calls.ts +++ b/src/api/types/calls.ts @@ -1,4 +1,9 @@ -import { GroupCallParticipant, GroupCallConnectionState } from '../../lib/secret-sauce'; +import type { + GroupCallParticipant, + GroupCallConnectionState, + ApiPhoneCallConnection, + ApiCallProtocol, VideoState, VideoRotation, +} from '../../lib/secret-sauce'; export interface ApiGroupCall { chatId?: string; @@ -24,3 +29,45 @@ export interface ApiGroupCall { connectionState: GroupCallConnectionState; isSpeakerDisabled?: boolean; } + +export interface PhoneCallAction { + isOutgoing: boolean; + isVideo?: boolean; + duration?: number; + reason?: 'missed' | 'disconnect' | 'hangup' | 'busy'; +} + +export interface ApiPhoneCall { + state?: 'active' | 'waiting' | 'discarded' | 'requested' | 'accepted' | 'requesting'; + isConnected?: boolean; + id: string; + accessHash?: string; + adminId?: string; + participantId?: string; + isVideo?: boolean; + date?: number; + startDate?: number; + receiveDate?: number; + p2pAllowed?: boolean; + connections?: ApiPhoneCallConnection[]; + protocol?: ApiCallProtocol; + needRating?: boolean; + needDebug?: boolean; + reason?: 'missed' | 'disconnect' | 'hangup' | 'busy'; + duration?: number; + + emojis?: string; + gA?: number[]; + gB?: number[]; + pLast?: number[]; + randomLast?: number[]; + gAOrB?: number[]; + gAHash?: number[]; + keyFingerprint?: string; + + isMuted?: boolean; + videoState?: VideoState; + videoRotation?: VideoRotation; + screencastState?: VideoState; + isBatteryLow?: boolean; +} diff --git a/src/api/types/messages.ts b/src/api/types/messages.ts index 6068ba2cd..c7b065ece 100644 --- a/src/api/types/messages.ts +++ b/src/api/types/messages.ts @@ -1,4 +1,4 @@ -import { ApiGroupCall } from './calls'; +import { ApiGroupCall, PhoneCallAction } from './calls'; export interface ApiDimensions { width: number; @@ -203,6 +203,7 @@ export interface ApiAction { currency?: string; translationValues: string[]; call?: Partial; + phoneCall?: PhoneCallAction; score?: number; } diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts index 3aab76bb1..662f6f7a5 100644 --- a/src/api/types/updates.ts +++ b/src/api/types/updates.ts @@ -1,4 +1,9 @@ -import { GroupCallConnectionData, GroupCallParticipant, GroupCallConnectionState } from '../../lib/secret-sauce'; +import type { + GroupCallConnectionData, + GroupCallParticipant, + GroupCallConnectionState, + VideoState, VideoRotation, +} from '../../lib/secret-sauce'; import { ApiChat, ApiChatFullInfo, @@ -15,7 +20,7 @@ import { ApiError, ApiInviteInfo, ApiNotifyException, ApiSessionData, } from './misc'; import { - ApiGroupCall, + ApiGroupCall, ApiPhoneCall, } from './calls'; export type ApiUpdateReady = { @@ -456,6 +461,31 @@ export type ApiUpdateGroupCallConnectionState = { isSpeakerDisabled?: boolean; }; +export type ApiUpdatePhoneCall = { + '@type': 'updatePhoneCall'; + call: ApiPhoneCall; +}; + +export type ApiUpdatePhoneCallSignalingData = { + '@type': 'updatePhoneCallSignalingData'; + callId: string; + data: number[]; +}; + +export type ApiUpdatePhoneCallMediaState = { + '@type': 'updatePhoneCallMediaState'; + isMuted: boolean; + videoState: VideoState; + videoRotation: VideoRotation; + screencastState: VideoState; + isBatteryLow: boolean; +}; + +export type ApiUpdatePhoneCallConnectionState = { + '@type': 'updatePhoneCallConnectionState'; + connectionState: RTCPeerConnectionState; +}; + export type ApiUpdate = ( ApiUpdateReady | ApiUpdateSession | ApiUpdateAuthorizationState | ApiUpdateAuthorizationError | ApiUpdateConnectionState | ApiUpdateCurrentUser | @@ -476,7 +506,9 @@ export type ApiUpdate = ( ApiUpdateServerTimeOffset | ApiUpdateShowInvite | ApiUpdateMessageReactions | ApiUpdateGroupCallParticipants | ApiUpdateGroupCallConnection | ApiUpdateGroupCall | ApiUpdateGroupCallStreams | ApiUpdateGroupCallConnectionState | ApiUpdateGroupCallLeavePresentation | ApiUpdateGroupCallChatId | - ApiUpdatePendingJoinRequests | ApiUpdatePaymentVerificationNeeded | ApiUpdatePaymentStateCompleted + ApiUpdatePendingJoinRequests | ApiUpdatePaymentVerificationNeeded | ApiUpdatePaymentStateCompleted | + ApiUpdatePhoneCall | ApiUpdatePhoneCallSignalingData | ApiUpdatePhoneCallMediaState | + ApiUpdatePhoneCallConnectionState ); export type OnApiUpdate = (update: ApiUpdate) => void; diff --git a/src/assets/call-fallback-avatar.png b/src/assets/call-fallback-avatar.png deleted file mode 100644 index 3a850f2ee00e6bd32841e1a89e55fd3490aaa87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18478 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 M07*qoM6N<$f{zOeQ~&?~ diff --git a/src/assets/fonts/icomoon.woff b/src/assets/fonts/icomoon.woff index e3c35824cf385afd178b7c4f1aa85e9c993421de..fce9bb749e3ed02a281f9a8770c56c20e87c698c 100644 GIT binary patch delta 2825 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 coh_X=ASip`aeNb?A4dT0C+yDRo diff --git a/src/assets/fonts/icomoon.woff2 b/src/assets/fonts/icomoon.woff2 index 16cbbc484b12173322fa8ed2ff64920ed7fad613..cdaca717b990d2b2969b6a6e540a1cda1a95c8de 100644 GIT binary patch literal 20332 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 = (props) => { - const { groupCallId } = props; - const ActiveCallHeader = useModuleLoader(Bundles.Calls, 'ActiveCallHeader', !groupCallId); + const { isActive } = props; + const ActiveCallHeader = useModuleLoader(Bundles.Calls, 'ActiveCallHeader', !isActive); return ActiveCallHeader ? : undefined; }; diff --git a/src/components/calls/ActiveCallHeader.tsx b/src/components/calls/ActiveCallHeader.tsx index 5d3be4d3b..54c68a588 100644 --- a/src/components/calls/ActiveCallHeader.tsx +++ b/src/components/calls/ActiveCallHeader.tsx @@ -1,51 +1,50 @@ -import { GroupCallParticipant } from '../../lib/secret-sauce'; import React, { FC, memo, useEffect, } from '../../lib/teact/teact'; import { getActions, withGlobal } from '../../global'; -import { ApiGroupCall } from '../../api/types'; +import { ApiGroupCall, ApiUser } from '../../api/types'; -import { selectActiveGroupCall, selectGroupCallParticipant } from '../../global/selectors/calls'; +import { selectActiveGroupCall, selectPhoneCallUser } from '../../global/selectors/calls'; import buildClassName from '../../util/buildClassName'; import useLang from '../../hooks/useLang'; import './ActiveCallHeader.scss'; type StateProps = { - isGroupCallPanelHidden?: boolean; - meParticipant: GroupCallParticipant; + isCallPanelVisible?: boolean; groupCall?: ApiGroupCall; + phoneCallUser?: ApiUser; }; const ActiveCallHeader: FC = ({ groupCall, - meParticipant, - isGroupCallPanelHidden, + phoneCallUser, + isCallPanelVisible, }) => { const { toggleGroupCallPanel } = getActions(); const lang = useLang(); useEffect(() => { - document.body.classList.toggle('has-group-call-header', isGroupCallPanelHidden); + document.body.classList.toggle('has-call-header', Boolean(isCallPanelVisible)); return () => { - document.body.classList.toggle('has-group-call-header', false); + document.body.classList.toggle('has-call-header', false); }; - }, [isGroupCallPanelHidden]); + }, [isCallPanelVisible]); - if (!groupCall || !meParticipant) return undefined; + if (!groupCall && !phoneCallUser) return undefined; return (

); }; @@ -54,8 +53,8 @@ export default memo(withGlobal( (global): StateProps => { return { groupCall: selectActiveGroupCall(global), - isGroupCallPanelHidden: global.groupCalls.isGroupCallPanelHidden, - meParticipant: selectGroupCallParticipant(global, global.groupCalls.activeGroupCallId!, global.currentUserId!), + isCallPanelVisible: global.isCallPanelVisible, + phoneCallUser: selectPhoneCallUser(global), }; }, )(ActiveCallHeader)); diff --git a/src/components/calls/CallFallbackConfirm.async.tsx b/src/components/calls/CallFallbackConfirm.async.tsx deleted file mode 100644 index c106cd23f..000000000 --- a/src/components/calls/CallFallbackConfirm.async.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { FC, memo } from '../../lib/teact/teact'; -import useModuleLoader from '../../hooks/useModuleLoader'; -import { Bundles } from '../../util/moduleLoader'; - -type OwnProps = { - isOpen: boolean; -}; - -const CallFallbackConfirmAsync: FC = ({ isOpen }) => { - const CallFallbackConfirm = useModuleLoader(Bundles.Calls, 'CallFallbackConfirm', !isOpen); - - return CallFallbackConfirm ? : undefined; -}; - -export default memo(CallFallbackConfirmAsync); diff --git a/src/components/calls/CallFallbackConfirm.tsx b/src/components/calls/CallFallbackConfirm.tsx deleted file mode 100644 index 0b6a92716..000000000 --- a/src/components/calls/CallFallbackConfirm.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, { - FC, memo, useCallback, useState, -} from '../../lib/teact/teact'; -import { getActions, withGlobal } from '../../global'; - -import ConfirmDialog from '../ui/ConfirmDialog'; -import Checkbox from '../ui/Checkbox'; -import { selectCallFallbackChannelTitle } from '../../global/selectors/calls'; -import { getUserFullName } from '../../global/helpers'; -import { selectCurrentMessageList, selectUser } from '../../global/selectors'; -import useCurrentOrPrev from '../../hooks/useCurrentOrPrev'; - -export type OwnProps = { - isOpen: boolean; -}; - -interface StateProps { - userFullName?: string; - channelTitle: string; -} - -const CallFallbackConfirm: FC = ({ - isOpen, - channelTitle, - userFullName, -}) => { - const { - closeCallFallbackConfirm, - inviteToCallFallback, - } = getActions(); - - const [shouldRemove, setShouldRemove] = useState(true); - const renderingUserFullName = useCurrentOrPrev(userFullName, true); - - const handleConfirm = useCallback(() => { - inviteToCallFallback({ shouldRemove }); - }, [inviteToCallFallback, shouldRemove]); - - return ( - -

The call will be started in a private channel {channelTitle}.

- -
- ); -}; - -export default memo(withGlobal( - (global): StateProps => { - const { chatId } = selectCurrentMessageList(global) || {}; - const user = chatId ? selectUser(global, chatId) : undefined; - - return { - userFullName: user ? getUserFullName(user) : undefined, - channelTitle: selectCallFallbackChannelTitle(global), - }; - }, -)(CallFallbackConfirm)); diff --git a/src/components/calls/group/GroupCall.tsx b/src/components/calls/group/GroupCall.tsx index 71334a4e5..4e00c2fd7 100644 --- a/src/components/calls/group/GroupCall.tsx +++ b/src/components/calls/group/GroupCall.tsx @@ -47,7 +47,7 @@ export type OwnProps = { }; type StateProps = { - isGroupCallPanelHidden: boolean; + isCallPanelVisible: boolean; connectionState: GroupCallConnectionState; title?: string; meParticipant?: TypeGroupCallParticipant; @@ -59,7 +59,7 @@ type StateProps = { const GroupCall: FC = ({ groupCallId, - isGroupCallPanelHidden, + isCallPanelVisible, connectionState, isSpeakerEnabled, title, @@ -246,7 +246,7 @@ const GroupCall: FC = ({ return ( = ({ > {IS_SCREENSHARE_SUPPORTED && !shouldRaiseHand && ( {lang(hasPresentation ? 'VoipChatStopScreenCapture' : 'VoipChatStartScreenCapture')} @@ -405,7 +405,7 @@ export default memo(withGlobal( isSpeakerEnabled: !isSpeakerDisabled, participantsCount, meParticipant: selectGroupCallParticipant(global, groupCallId, global.currentUserId!), - isGroupCallPanelHidden: Boolean(global.groupCalls.isGroupCallPanelHidden), + isCallPanelVisible: Boolean(global.isCallPanelVisible), isAdmin: selectIsAdminInActiveGroupCall(global), participants, }; diff --git a/src/components/calls/group/MicrophoneButton.tsx b/src/components/calls/group/MicrophoneButton.tsx index 63b5546ea..73b7ba143 100644 --- a/src/components/calls/group/MicrophoneButton.tsx +++ b/src/components/calls/group/MicrophoneButton.tsx @@ -51,7 +51,7 @@ const MicrophoneButton: FC = ({ useEffect(() => { if (prevShouldRaiseHand && !shouldRaiseHand) { - playGroupCallSound('allowTalk'); + playGroupCallSound({ sound: 'allowTalk' }); } }, [playGroupCallSound, prevShouldRaiseHand, shouldRaiseHand]); diff --git a/src/components/calls/phone/PhoneCall.async.tsx b/src/components/calls/phone/PhoneCall.async.tsx new file mode 100644 index 000000000..9122e5e92 --- /dev/null +++ b/src/components/calls/phone/PhoneCall.async.tsx @@ -0,0 +1,16 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; +import useModuleLoader from '../../../hooks/useModuleLoader'; +import { Bundles } from '../../../util/moduleLoader'; + +type OwnProps = { + isActive?: boolean; +}; + +const PhoneCallAsync: FC = (props) => { + const { isActive } = props; + const PhoneCall = useModuleLoader(Bundles.Calls, 'PhoneCall', !isActive); + + return PhoneCall ? : undefined; +}; + +export default memo(PhoneCallAsync); diff --git a/src/components/calls/phone/PhoneCall.module.scss b/src/components/calls/phone/PhoneCall.module.scss new file mode 100644 index 000000000..55551473c --- /dev/null +++ b/src/components/calls/phone/PhoneCall.module.scss @@ -0,0 +1,179 @@ +.root { + :global(.modal-dialog) { + overflow: hidden; + } + :global(.modal-content) { + display: flex; + flex-direction: column; + align-items: center; + height: 80vh; + padding: 0; + } + + :global(.Avatar) { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 0; + z-index: -1; + transform: scale(1.1); + + :global(.Avatar__img) { + border-radius: 0; + object-fit: cover; + } + + &.blurred :global(.Avatar__img) { + filter: blur(10px); + } + } +} + +.single-column { + :global(.modal-dialog) { + max-width: 100% !important; + border-radius: 0; + margin: 0; + } + + :global(.modal-content) { + height: calc(var(--vh) * 100); + max-height: calc(var(--vh) * 100); + } +} + +.header { + width: 100%; + display: flex; + align-items: center; + color: #fff; + position: absolute; + padding: 0.5rem; + + :global(.Button) { + color: #fff; + } +} + +.close-button { + margin-left: auto; +} + +.emojis-backdrop { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + pointer-events: none; + transition: 0.25s ease-in-out background-color; + z-index: 2; + + &.open { + background-color: rgba(0, 0, 0, 0.7); + pointer-events: all; + } +} + +.emojis { + user-select: none; + pointer-events: all; + cursor: pointer; + margin-top: 1rem; + height: 3rem; + transition: 0.25s ease-in-out transform; + top: 0; + font-size: 1.5rem; + + &.open { + transform: scale(2) translateY(3rem); + } +} + +.emoji-tooltip { + user-select: none; + position: absolute; + margin-top: 10rem; + color: white; + max-width: 20rem; + text-align: center; + font-weight: 500; + opacity: 0; + transition: 0.25s ease-in-out opacity; + + &.open { + opacity: 1; + } +} + +.user-info { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + margin-top: 0; + padding-top: 4rem; + padding-bottom: 2rem; + margin-bottom: auto; + color: #fff; + background: linear-gradient(180deg, rgba(0, 0, 0, 0.2) 0%, transparent 100%); + pointer-events: none; + user-select: none; +} + +.buttons { + display: flex; + position: absolute; + bottom: 1rem; + user-select: none; +} + +.leave { + background: #ff595a !important; + + &:hover { + background-color: #d24646 !important; + } +} + +.accept { + background: #5CC85E !important; + + &:hover { + background-color: #4eab50 !important; + } +} + +.accept-icon { + transform: rotate(-135deg); +} + +.main-video { + z-index: -1; + position: absolute; + width: 100%; + height: 100%; +} + +.second-video { + z-index: -1; + position: absolute; + width: 9rem; + bottom: 1rem; + right: 1rem; + border-radius: 0.5rem; + transform: translateY(calc(100% + 1rem)); + transition: 0.25s ease-in-out transform; + + &.visible { + transform: translateY(-5.5rem); + } + + &.fullscreen { + transform: translateY(0); + } +} diff --git a/src/components/calls/phone/PhoneCall.tsx b/src/components/calls/phone/PhoneCall.tsx new file mode 100644 index 000000000..d8edf20fd --- /dev/null +++ b/src/components/calls/phone/PhoneCall.tsx @@ -0,0 +1,362 @@ +import React, { + FC, memo, useCallback, useEffect, useMemo, useRef, +} from '../../../lib/teact/teact'; +import { getActions, withGlobal } from '../../../global'; +import '../../../global/actions/calls'; + +import { ApiPhoneCall, ApiUser } from '../../../api/types'; + +import { + IS_ANDROID, + IS_IOS, + IS_REQUEST_FULLSCREEN_SUPPORTED, + IS_SINGLE_COLUMN_LAYOUT, +} from '../../../util/environment'; +import buildClassName from '../../../util/buildClassName'; +import { selectPhoneCallUser } from '../../../global/selectors/calls'; +import useLang from '../../../hooks/useLang'; +import renderText from '../../common/helpers/renderText'; +import useFlag from '../../../hooks/useFlag'; +import { formatMediaDuration } from '../../../util/dateFormat'; +import { + getStreams, IS_SCREENSHARE_SUPPORTED, switchCameraInputP2p, toggleStreamP2p, +} from '../../../lib/secret-sauce'; +import useInterval from '../../../hooks/useInterval'; +import useForceUpdate from '../../../hooks/useForceUpdate'; + +import Modal from '../../ui/Modal'; +import Avatar from '../../common/Avatar'; +import Button from '../../ui/Button'; +import PhoneCallButton from './PhoneCallButton'; +import AnimatedIcon from '../../common/AnimatedIcon'; + +import styles from './PhoneCall.module.scss'; + +type StateProps = { + user?: ApiUser; + phoneCall?: ApiPhoneCall; + isOutgoing: boolean; + isCallPanelVisible?: boolean; +}; + +const PhoneCall: FC = ({ + user, + isOutgoing, + phoneCall, + isCallPanelVisible, +}) => { + const lang = useLang(); + const { + hangUp, acceptCall, playGroupCallSound, toggleGroupCallPanel, connectToActivePhoneCall, + } = getActions(); + // eslint-disable-next-line no-null/no-null + const containerRef = useRef(null); + + const [isFullscreen, openFullscreen, closeFullscreen] = useFlag(); + + const toggleFullscreen = useCallback(() => { + if (isFullscreen) { + closeFullscreen(); + } else { + openFullscreen(); + } + }, [closeFullscreen, isFullscreen, openFullscreen]); + + const handleToggleFullscreen = useCallback(() => { + if (!containerRef.current) return; + + if (isFullscreen) { + document.exitFullscreen().then(closeFullscreen); + } else { + containerRef.current.requestFullscreen().then(openFullscreen); + } + }, [closeFullscreen, isFullscreen, openFullscreen]); + + useEffect(() => { + if (!IS_REQUEST_FULLSCREEN_SUPPORTED) return undefined; + const container = containerRef.current; + if (!container) return undefined; + + container.addEventListener('fullscreenchange', toggleFullscreen); + + return () => { + container.removeEventListener('fullscreenchange', toggleFullscreen); + }; + }, [toggleFullscreen]); + + const handleClose = useCallback(() => { + toggleGroupCallPanel(); + if (isFullscreen) { + closeFullscreen(); + } + }, [closeFullscreen, isFullscreen, toggleGroupCallPanel]); + + const isDiscarded = phoneCall?.state === 'discarded'; + const isBusy = phoneCall?.reason === 'busy'; + + const isIncomingRequested = phoneCall?.state === 'requested' && !isOutgoing; + const isOutgoingRequested = (phoneCall?.state === 'requested' || phoneCall?.state === 'waiting') && isOutgoing; + const isActive = phoneCall?.state === 'active'; + const isConnected = phoneCall?.isConnected; + + useEffect(() => { + if (isIncomingRequested) { + playGroupCallSound({ sound: 'incoming' }); + } else if (isBusy) { + playGroupCallSound({ sound: 'busy' }); + } else if (isDiscarded) { + playGroupCallSound({ sound: 'end' }); + } else if (isOutgoingRequested) { + playGroupCallSound({ sound: 'ringing' }); + } else if (isConnected) { + playGroupCallSound({ sound: 'connect' }); + } + }, [isBusy, isDiscarded, isIncomingRequested, isOutgoingRequested, isConnected, playGroupCallSound]); + + const [isHangingUp, startHangingUp, stopHangingUp] = useFlag(); + const handleHangUp = useCallback(() => { + startHangingUp(); + hangUp(); + }, [hangUp, startHangingUp]); + + useEffect(() => { + if (phoneCall?.id) { + stopHangingUp(); + } else { + connectToActivePhoneCall(); + } + }, [connectToActivePhoneCall, phoneCall?.id, stopHangingUp]); + + const forceUpdate = useForceUpdate(); + + useInterval(() => { + forceUpdate(); + }, isConnected ? 1000 : undefined); + + const callStatus = useMemo(() => { + const state = phoneCall?.state; + if (isHangingUp) { + return lang('lng_call_status_hanging'); + } + if (isBusy) return 'busy'; + if (state === 'requesting') { + return lang('lng_call_status_requesting'); + } else if (state === 'requested') { + return isOutgoing ? lang('lng_call_status_ringing') : lang('lng_call_status_incoming'); + } else if (state === 'waiting') { + return lang('lng_call_status_waiting'); + } else if (state === 'active' && isConnected) { + return undefined; + } else { + return lang('lng_call_status_exchanging'); + } + }, [isBusy, isConnected, isHangingUp, isOutgoing, lang, phoneCall?.state]); + + const hasVideo = phoneCall?.videoState === 'active'; + const hasPresentation = phoneCall?.screencastState === 'active'; + + const streams = getStreams(); + const hasOwnAudio = streams?.ownAudio?.getTracks()[0].enabled; + const hasOwnPresentation = streams?.ownPresentation?.getTracks()[0].enabled; + const hasOwnVideo = streams?.ownVideo?.getTracks()[0].enabled; + + const [isHidingPresentation, startHidingPresentation, stopHidingPresentation] = useFlag(); + const [isHidingVideo, startHidingVideo, stopHidingVideo] = useFlag(); + + const handleTogglePresentation = useCallback(() => { + if (hasOwnPresentation) { + startHidingPresentation(); + } + if (hasOwnVideo) { + startHidingVideo(); + } + setTimeout(async () => { + await toggleStreamP2p('presentation'); + stopHidingPresentation(); + stopHidingVideo(); + }, 250); + }, [ + hasOwnPresentation, hasOwnVideo, startHidingPresentation, startHidingVideo, stopHidingPresentation, stopHidingVideo, + ]); + + const handleToggleVideo = useCallback(() => { + if (hasOwnVideo) { + startHidingVideo(); + } + if (hasOwnPresentation) { + startHidingPresentation(); + } + setTimeout(async () => { + await toggleStreamP2p('video'); + stopHidingPresentation(); + stopHidingVideo(); + }, 250); + }, [ + hasOwnPresentation, hasOwnVideo, startHidingPresentation, startHidingVideo, stopHidingPresentation, stopHidingVideo, + ]); + + const handleToggleAudio = useCallback(() => { + void toggleStreamP2p('audio'); + }, []); + + const [isEmojiOpen, openEmoji, closeEmoji] = useFlag(); + + const [isFlipping, startFlipping, stopFlipping] = useFlag(); + + const handleFlipCamera = useCallback(() => { + startFlipping(); + switchCameraInputP2p(); + setTimeout(stopFlipping, 250); + }, [startFlipping, stopFlipping]); + + const timeElapsed = phoneCall?.startDate && (Number(new Date()) / 1000 - phoneCall.startDate); + + useEffect(() => { + if (phoneCall?.state === 'discarded') { + setTimeout(hangUp, 250); + } + }, [hangUp, phoneCall?.reason, phoneCall?.state]); + + return ( + + + {phoneCall?.screencastState === 'active' && streams?.presentation + && + ); +}; + +export default memo(withGlobal( + (global): StateProps => { + const { phoneCall, currentUserId } = global; + + return { + isCallPanelVisible: Boolean(global.isCallPanelVisible), + user: selectPhoneCallUser(global), + isOutgoing: phoneCall?.adminId === currentUserId, + phoneCall, + }; + }, +)(PhoneCall)); diff --git a/src/components/calls/phone/PhoneCallButton.module.scss b/src/components/calls/phone/PhoneCallButton.module.scss new file mode 100644 index 000000000..12de885ae --- /dev/null +++ b/src/components/calls/phone/PhoneCallButton.module.scss @@ -0,0 +1,36 @@ +.root { + width: 5rem; + display: flex; + flex-direction: column; + align-items: center; + + &:not(:first-child) { + margin-left: 1rem; + } +} + +.button { + background-color: rgba(0, 0, 0, 0.1) !important; + color: #fff !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.2) !important; + } + + &.active { + background-color: #fff !important; + color: var(--color-text-secondary) !important; + + &:hover { + background-color: #ddd !important; + } + } +} + +.button-text { + color: #fff; + font-size: 0.75rem; + text-transform: lowercase; + margin-top: 0.25rem; + white-space: nowrap; +} diff --git a/src/components/calls/phone/PhoneCallButton.tsx b/src/components/calls/phone/PhoneCallButton.tsx new file mode 100644 index 000000000..050b744af --- /dev/null +++ b/src/components/calls/phone/PhoneCallButton.tsx @@ -0,0 +1,45 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; + +import buildClassName from '../../../util/buildClassName'; + +import Button from '../../ui/Button'; + +import styles from './PhoneCallButton.module.scss'; + +type OwnProps = { + onClick: VoidFunction; + label: string; + icon?: string; + iconClassName?: string; + customIcon?: React.ReactNode; + className?: string; + isDisabled?: boolean; + isActive?: boolean; +}; + +const PhoneCallButton: FC = ({ + onClick, + label, + customIcon, + icon, + iconClassName, + className, + isDisabled, + isActive, +}) => { + return ( +
+ +
{label}
+
+ ); +}; + +export default memo(PhoneCallButton); diff --git a/src/components/calls/phone/RatePhoneCallModal.async.tsx b/src/components/calls/phone/RatePhoneCallModal.async.tsx new file mode 100644 index 000000000..14dae1537 --- /dev/null +++ b/src/components/calls/phone/RatePhoneCallModal.async.tsx @@ -0,0 +1,16 @@ +import React, { FC, memo } from '../../../lib/teact/teact'; + +import { OwnProps } from './RatePhoneCallModal'; +import { Bundles } from '../../../util/moduleLoader'; + +import useModuleLoader from '../../../hooks/useModuleLoader'; + +const RatePhoneCallModalAsync: FC = (props) => { + const { isOpen } = props; + const RatePhoneCallModal = useModuleLoader(Bundles.Calls, 'RatePhoneCallModal', !isOpen); + + // eslint-disable-next-line react/jsx-props-no-spreading + return RatePhoneCallModal ? : undefined; +}; + +export default memo(RatePhoneCallModalAsync); diff --git a/src/components/calls/phone/RatePhoneCallModal.module.scss b/src/components/calls/phone/RatePhoneCallModal.module.scss new file mode 100644 index 000000000..191fc7e12 --- /dev/null +++ b/src/components/calls/phone/RatePhoneCallModal.module.scss @@ -0,0 +1,28 @@ +.stars { + width: 100%; + display: flex; + justify-content: center; + font-size: 1.5rem; +} + +.star { + cursor: pointer; + color: var(--color-text-secondary); + + &:not(:first-child) { + margin-left: 1rem; + } + + &.isFilled { + color: var(--color-primary); + } +} + +.comment { + margin-top: 1rem; + overflow: hidden; + + &:not(.visible) { + display: none; + } +} diff --git a/src/components/calls/phone/RatePhoneCallModal.tsx b/src/components/calls/phone/RatePhoneCallModal.tsx new file mode 100644 index 000000000..e4a922075 --- /dev/null +++ b/src/components/calls/phone/RatePhoneCallModal.tsx @@ -0,0 +1,77 @@ +import React, { + FC, memo, useRef, useState, +} from '../../../lib/teact/teact'; +import { getActions } from '../../../global'; + +import useLang from '../../../hooks/useLang'; +import buildClassName from '../../../util/buildClassName'; + +import Modal from '../../ui/Modal'; +import Button from '../../ui/Button'; +import InputText from '../../ui/InputText'; + +import styles from './RatePhoneCallModal.module.scss'; + +export type OwnProps = { + isOpen?: boolean; +}; + +const RatePhoneCallModal: FC = ({ + isOpen, +}) => { + const { closeCallRatingModal, setCallRating } = getActions(); + + // eslint-disable-next-line no-null/no-null + const inputRef = useRef(null); + + const lang = useLang(); + const [rating, setRating] = useState(); + + function handleSend() { + if (!rating) { + closeCallRatingModal(); + return; + } + setCallRating({ + rating: rating + 1, + comment: inputRef.current?.value || '', + }); + } + + function handleClickStar(index: number) { + return () => setRating(rating === index ? undefined : index); + } + + return ( + +
+ {new Array(5).fill(undefined).map((_, i) => { + const isFilled = rating !== undefined && rating >= i; + return ( + + ); + })} +
+ + + {/* eslint-disable-next-line react/jsx-no-bind */} + + +
+ ); +}; + +export default memo(RatePhoneCallModal); diff --git a/src/components/common/Avatar.tsx b/src/components/common/Avatar.tsx index 285cf37ac..1047d7684 100644 --- a/src/components/common/Avatar.tsx +++ b/src/components/common/Avatar.tsx @@ -58,11 +58,12 @@ const Avatar: FC = ({ const isReplies = user && isChatWithRepliesBot(user.id); let imageHash: string | undefined; + const shouldFetchBig = size === 'jumbo'; if (!isSavedMessages && !isDeleted) { if (user) { - imageHash = getChatAvatarHash(user); + imageHash = getChatAvatarHash(user, shouldFetchBig ? 'big' : undefined); } else if (chat) { - imageHash = getChatAvatarHash(chat); + imageHash = getChatAvatarHash(chat, shouldFetchBig ? 'big' : undefined); } else if (photo) { imageHash = `photo${photo.id}?size=m`; } diff --git a/src/components/left/settings/SettingsMain.tsx b/src/components/left/settings/SettingsMain.tsx index 9c98377f8..f56d64b65 100644 --- a/src/components/left/settings/SettingsMain.tsx +++ b/src/components/left/settings/SettingsMain.tsx @@ -44,7 +44,7 @@ const SettingsMain: FC = ({ }, [lastSyncTime, profileId, loadProfilePhotos]); useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main); - + useEffect(() => { if (lastSyncTime) { loadAuthorizations(); diff --git a/src/components/main/Main.scss b/src/components/main/Main.scss index 8a60ec532..ccf731ce2 100644 --- a/src/components/main/Main.scss +++ b/src/components/main/Main.scss @@ -18,8 +18,8 @@ } } -.has-group-call-header { - --group-call-header-height: 2rem; +.has-call-header { + --call-header-height: 2rem; #LeftColumn, #MiddleColumn, #RightColumn-wrapper { height: calc(100% - 2rem); margin-top: 2rem; diff --git a/src/components/main/Main.tsx b/src/components/main/Main.tsx index e63c33671..395af9aa4 100644 --- a/src/components/main/Main.tsx +++ b/src/components/main/Main.tsx @@ -49,8 +49,9 @@ import SafeLinkModal from './SafeLinkModal.async'; import HistoryCalendar from './HistoryCalendar.async'; import GroupCall from '../calls/group/GroupCall.async'; import ActiveCallHeader from '../calls/ActiveCallHeader.async'; -import CallFallbackConfirm from '../calls/CallFallbackConfirm.async'; +import PhoneCall from '../calls/phone/PhoneCall.async'; import NewContactModal from './NewContactModal.async'; +import RatePhoneCallModal from '../calls/phone/RatePhoneCallModal.async'; import './Main.scss'; @@ -74,12 +75,13 @@ type StateProps = { animationLevel: number; language?: LangCode; wasTimeFormatSetManually?: boolean; - isCallFallbackConfirmOpen: boolean; + isPhoneCallActive?: boolean; addedSetIds?: string[]; newContactUserId?: string; newContactByPhoneNumber?: boolean; openedGame?: GlobalState['openedGame']; gameTitle?: string; + isRatePhoneCallModalOpen?: boolean; }; const NOTIFICATION_INTERVAL = 1000; @@ -109,12 +111,13 @@ const Main: FC = ({ animationLevel, language, wasTimeFormatSetManually, - isCallFallbackConfirmOpen, addedSetIds, + isPhoneCallActive, newContactUserId, newContactByPhoneNumber, openedGame, gameTitle, + isRatePhoneCallModalOpen, }) => { const { sync, @@ -335,12 +338,8 @@ const Main: FC = ({ onClose={handleStickerSetModalClose} stickerSetShortName={openedStickerSetShortName} /> - {activeGroupCallId && ( - <> - - - - )} + {activeGroupCallId && } + = ({ /> - + + ); }; @@ -406,12 +406,13 @@ export default memo(withGlobal( animationLevel, language, wasTimeFormatSetManually, - isCallFallbackConfirmOpen: Boolean(global.groupCalls.isFallbackConfirmOpen), + isPhoneCallActive: Boolean(global.phoneCall), addedSetIds: global.stickers.added.setIds, newContactUserId: global.newContact?.userId, newContactByPhoneNumber: global.newContact?.isByPhoneNumber, openedGame, gameTitle, + isRatePhoneCallModalOpen: Boolean(global.ratingPhoneCall), }; }, )(Main)); diff --git a/src/components/middle/HeaderActions.tsx b/src/components/middle/HeaderActions.tsx index d0ad9ec3f..9d5c6b22e 100644 --- a/src/components/middle/HeaderActions.tsx +++ b/src/components/middle/HeaderActions.tsx @@ -84,10 +84,9 @@ const HeaderActions: FC = ({ sendBotCommand, openLocalTextSearch, restartBot, - openCallFallbackConfirm, + requestCall, requestNextManagementScreen, } = getActions(); - // eslint-disable-next-line no-null/no-null const menuButtonRef = useRef(null); const [isMenuOpen, setIsMenuOpen] = useState(false); @@ -140,6 +139,10 @@ const HeaderActions: FC = ({ } }, [openLocalTextSearch]); + function handleRequestCall() { + requestCall({ userId: chatId }); + } + useEffect(() => { if (!canSearch) { return undefined; @@ -214,7 +217,8 @@ const HeaderActions: FC = ({ round color="translucent" size="smaller" - onClick={openCallFallbackConfirm} + // eslint-disable-next-line react/jsx-no-bind + onClick={handleRequestCall} ariaLabel="Call" > diff --git a/src/components/middle/HeaderMenuContainer.tsx b/src/components/middle/HeaderMenuContainer.tsx index 61f13eb09..92de5c404 100644 --- a/src/components/middle/HeaderMenuContainer.tsx +++ b/src/components/middle/HeaderMenuContainer.tsx @@ -110,10 +110,9 @@ const HeaderMenuContainer: FC = ({ createGroupCall, openLinkedChat, openAddContactDialog, - openCallFallbackConfirm, + requestCall, toggleStatistics, } = getActions(); - const [isMenuOpen, setIsMenuOpen] = useState(true); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const { x, y } = anchor; @@ -177,10 +176,15 @@ const HeaderMenuContainer: FC = ({ closeMenu(); }, [closeMenu, onSubscribeChannel]); - const handleCall = useCallback(() => { - openCallFallbackConfirm(); + const handleVideoCall = useCallback(() => { + requestCall({ userId: chatId, isVideo: true }); closeMenu(); - }, [closeMenu, openCallFallbackConfirm]); + }, [chatId, closeMenu, requestCall]); + + const handleCall = useCallback(() => { + requestCall({ userId: chatId }); + closeMenu(); + }, [chatId, closeMenu, requestCall]); const handleSearch = useCallback(() => { onSearchClick(); @@ -276,6 +280,14 @@ const HeaderMenuContainer: FC = ({ {lang('Call')}
)} + {canCall && ( + + {lang('VideoCall')} + + )} {IS_SINGLE_COLUMN_LAYOUT && canSearch && ( = ({ senderGroupIndex, senderGroupsArray, ) => { - if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) { + if ( + senderGroup.length === 1 + && !isAlbum(senderGroup[0]) + && isActionMessage(senderGroup[0]) + && !senderGroup[0].content.action?.phoneCall + ) { const message = senderGroup[0]; const isLastInList = ( senderGroupIndex === senderGroupsArray.length - 1 diff --git a/src/components/middle/message/Message.tsx b/src/components/middle/message/Message.tsx index dd4afaf6d..aab6a337c 100644 --- a/src/components/middle/message/Message.tsx +++ b/src/components/middle/message/Message.tsx @@ -114,6 +114,7 @@ import CommentButton from './CommentButton'; import Reactions from './Reactions'; import ReactionStaticEmoji from '../../common/ReactionStaticEmoji'; import LocalAnimatedEmoji from '../../common/LocalAnimatedEmoji'; +import MessagePhoneCall from './MessagePhoneCall'; import './Message.scss'; @@ -354,9 +355,6 @@ const Message: FC = ({ && forwardInfo.fromMessageId )); - const withCommentButton = threadInfo && !isInDocumentGroupNotLast && messageListType === 'thread' && !noComments; - const withQuickReactionButton = !IS_TOUCH_ENV && !isInSelectMode && defaultReaction && !isInDocumentGroupNotLast; - const selectMessage = useCallback((e?: React.MouseEvent, groupedId?: string) => { toggleMessageSelection({ messageId, @@ -462,9 +460,15 @@ const Message: FC = ({ ); const { - text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice, location, game, + text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice, location, action, game, } = getMessageContent(message); + const { phoneCall } = action || {}; + + const withCommentButton = threadInfo && !isInDocumentGroupNotLast && messageListType === 'thread' && !noComments; + const withQuickReactionButton = !IS_TOUCH_ENV && !phoneCall && !isInSelectMode && defaultReaction + && !isInDocumentGroupNotLast; + const contentClassName = buildContentClassName(message, { hasReply, customShape, @@ -482,7 +486,9 @@ const Message: FC = ({ const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape)); let metaPosition!: MetaPosition; - if (isInDocumentGroupNotLast) { + if (phoneCall) { + metaPosition = 'none'; + } else if (isInDocumentGroupNotLast) { metaPosition = 'none'; } else if (textParts && !hasAnimatedEmoji && !webPage) { metaPosition = 'in-text'; @@ -680,6 +686,13 @@ const Message: FC = ({ onMediaClick={handleAlbumMediaClick} /> )} + {phoneCall && ( + + )} {!isAlbum && photo && ( = ({ + phoneCall, + message, + chatId, +}) => { + const { requestCall } = getActions(); + + const lang = useLang(); + const { isOutgoing, isVideo, reason } = phoneCall; + const isMissed = reason === 'missed'; + const isCancelled = reason === 'busy' && !isOutgoing; + + const handleCall = useCallback(() => { + requestCall({ isVideo, userId: chatId }); + }, [chatId, isVideo, requestCall]); + + const reasonText = useMemo(() => { + if (isVideo) { + if (isCancelled) return 'CallMessageVideoIncomingDeclined'; + if (isMissed) return isOutgoing ? 'CallMessageVideoOutgoingMissed' : 'CallMessageVideoIncomingMissed'; + + return isOutgoing ? 'CallMessageVideoOutgoing' : 'CallMessageVideoIncoming'; + } else { + if (isCancelled) return 'CallMessageIncomingDeclined'; + if (isMissed) return isOutgoing ? 'CallMessageOutgoingMissed' : 'CallMessageIncomingMissed'; + + return isOutgoing ? 'CallMessageOutgoing' : 'CallMessageIncoming'; + } + }, [isCancelled, isMissed, isOutgoing, isVideo]); + + const duration = useMemo(() => { + return phoneCall.duration ? formatTimeDuration(lang, phoneCall.duration) : undefined; + }, [lang, phoneCall.duration]); + + const timeFormatted = formatTime(lang, message.date * 1000); + return ( +
+ +
+
{lang(reasonText)}
+
+ + + {duration ? lang('CallMessageWithDuration', [timeFormatted, duration]) : timeFormatted} + +
+
+
+ ); +}; + +export default memo(MessagePhoneCall); diff --git a/src/components/ui/FloatingActionButton.scss b/src/components/ui/FloatingActionButton.scss index 80c185275..b19b99ebb 100644 --- a/src/components/ui/FloatingActionButton.scss +++ b/src/components/ui/FloatingActionButton.scss @@ -2,7 +2,7 @@ position: absolute; right: 1rem; bottom: 1rem; - transform: translateY(calc(5rem - var(--group-call-header-height, 0rem))); + transform: translateY(calc(5rem - var(--call-header-height, 0rem))); transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1); body.animation-level-0 & { @@ -10,6 +10,6 @@ } &.revealed { - transform: translateY(calc(0rem - var(--group-call-header-height, 0rem))); + transform: translateY(calc(0rem - var(--call-header-height, 0rem))); } } diff --git a/src/global/actions/api/calls.async.ts b/src/global/actions/api/calls.async.ts index 1cfb8c894..072724c07 100644 --- a/src/global/actions/api/calls.async.ts +++ b/src/global/actions/api/calls.async.ts @@ -5,87 +5,22 @@ import { leaveGroupCall, toggleStream, isStreamEnabled, - setVolume, - handleUpdateGroupCallParticipants, handleUpdateGroupCallConnection, + setVolume, stopPhoneCall, } from '../../../lib/secret-sauce'; import { GROUP_CALL_VOLUME_MULTIPLIER } from '../../../config'; import { callApi } from '../../../api/gramjs'; -import { selectChat, selectCurrentMessageList, selectUser } from '../../selectors'; +import { selectChat, selectUser } from '../../selectors'; import { - selectActiveGroupCall, - selectCallFallbackChannelTitle, - selectGroupCallParticipant, + selectActiveGroupCall, selectPhoneCallUser, } from '../../selectors/calls'; import { removeGroupCall, updateActiveGroupCall, - updateGroupCall, - updateGroupCallParticipant, } from '../../reducers/calls'; -import { omit } from '../../../util/iteratees'; -import { getServerTime } from '../../../util/serverTime'; -import { fetchFile } from '../../../util/files'; import { getGroupCallAudioContext, getGroupCallAudioElement, removeGroupCallAudioElement } from '../ui/calls'; import { loadFullChat } from './chats'; -import callFallbackAvatarPath from '../../../assets/call-fallback-avatar.png'; - -const FALLBACK_INVITE_EXPIRE_SECONDS = 1800; // 30 min - -addActionHandler('apiUpdate', (global, actions, update) => { - const { activeGroupCallId } = global.groupCalls; - - switch (update['@type']) { - case 'updateGroupCallLeavePresentation': { - actions.toggleGroupCallPresentation({ value: false }); - break; - } - case 'updateGroupCallStreams': { - if (!update.userId || !activeGroupCallId) break; - if (!selectGroupCallParticipant(global, activeGroupCallId, update.userId)) break; - - return updateGroupCallParticipant(global, activeGroupCallId, update.userId, omit(update, ['@type', 'userId'])); - } - case 'updateGroupCallConnectionState': { - if (!activeGroupCallId) break; - - if (update.connectionState === 'disconnected') { - actions.leaveGroupCall({ isFromLibrary: true }); - break; - } - - return updateGroupCall(global, activeGroupCallId, { - connectionState: update.connectionState, - isSpeakerDisabled: update.isSpeakerDisabled, - }); - } - case 'updateGroupCallParticipants': { - const { groupCallId, participants } = update; - if (activeGroupCallId === groupCallId) { - void handleUpdateGroupCallParticipants(participants); - } - break; - } - case 'updateGroupCallConnection': { - if (update.data.stream) { - actions.showNotification({ message: 'Big live streams are not yet supported' }); - actions.leaveGroupCall(); - break; - } - void handleUpdateGroupCallConnection(update.data, update.presentation); - - const groupCall = selectActiveGroupCall(global); - if (groupCall?.participants && Object.keys(groupCall.participants).length > 0) { - void handleUpdateGroupCallParticipants(Object.values(groupCall.participants)); - } - break; - } - } - - return undefined; -}); - addActionHandler('leaveGroupCall', async (global, actions, payload) => { const { isFromLibrary, shouldDiscard, shouldRemove, rejoin, @@ -101,18 +36,7 @@ addActionHandler('leaveGroupCall', async (global, actions, payload) => { call: groupCall, }); - let shouldResetFallbackState = false; if (shouldDiscard) { - global = getGlobal(); - - if (global.groupCalls.fallbackChatId === groupCall.chatId) { - shouldResetFallbackState = true; - - global.groupCalls.fallbackUserIdsToRemove?.forEach((userId) => { - actions.deleteChatMember({ chatId: global.groupCalls.fallbackChatId, userId }); - }); - } - await callApi('discardGroupCall', { call: groupCall, }); @@ -129,13 +53,9 @@ addActionHandler('leaveGroupCall', async (global, actions, payload) => { ...global, groupCalls: { ...global.groupCalls, - isGroupCallPanelHidden: true, activeGroupCallId: undefined, - ...(shouldResetFallbackState && { - fallbackChatId: undefined, - fallbackUserIdsToRemove: undefined, - }), }, + isCallPanelVisible: undefined, }); if (!isFromLibrary) { @@ -292,79 +212,106 @@ addActionHandler('connectToActiveGroupCall', async (global, actions) => { } }); -addActionHandler('inviteToCallFallback', async (global, actions, payload) => { - const { chatId } = selectCurrentMessageList(global) || {}; - if (!chatId) { - return; - } +addActionHandler('connectToActivePhoneCall', async (global) => { + const { phoneCall } = global; - const user = selectUser(global, chatId); - if (!user) { - return; - } + if (!phoneCall) return; - const { shouldRemove } = payload; + const user = selectPhoneCallUser(global); - const fallbackChannelTitle = selectCallFallbackChannelTitle(global); + if (!user) return; - let fallbackChannel = Object.values(global.chats.byId).find((channel) => { - return ( - channel.title === fallbackChannelTitle - && channel.isCreator - && !channel.isRestricted - && !channel.isForbidden - ); - }); - if (!fallbackChannel) { - fallbackChannel = await callApi('createChannel', { - title: fallbackChannelTitle, - users: [user], - }); + const dhConfig = await callApi('getDhConfig'); - if (!fallbackChannel) { - return; - } + if (!dhConfig) return; - const photo = await fetchFile(callFallbackAvatarPath, 'avatar.png'); - void callApi('editChatPhoto', { - chatId: fallbackChannel.id, - accessHash: fallbackChannel.accessHash, - photo, - }); - } else { - actions.updateChatMemberBannedRights({ - chatId: fallbackChannel.id, - userId: chatId, - bannedRights: {}, - }); + await callApi('createPhoneCallState', [true]); - void callApi('addChatMembers', fallbackChannel, [user], true); - } + const gAHash = await callApi('requestPhoneCall', [dhConfig])!; - const inviteLink = await callApi('updatePrivateLink', { - chat: fallbackChannel, - usageLimit: 1, - expireDate: getServerTime(global.serverTimeOffset) + FALLBACK_INVITE_EXPIRE_SECONDS, - }); - if (!inviteLink) { - return; - } - - if (shouldRemove) { - global = getGlobal(); - const fallbackUserIdsToRemove = global.groupCalls.fallbackUserIdsToRemove || []; - setGlobal({ - ...global, - groupCalls: { - ...global.groupCalls, - fallbackChatId: fallbackChannel.id, - fallbackUserIdsToRemove: [...fallbackUserIdsToRemove, chatId], - }, - }); - } - - actions.sendMessage({ text: `Join a call: ${inviteLink}` }); - actions.openChat({ id: fallbackChannel.id }); - actions.createGroupCall({ chatId: fallbackChannel.id }); - actions.closeCallFallbackConfirm(); + await callApi('requestCall', { user, gAHash, isVideo: phoneCall.isVideo }); +}); + +addActionHandler('acceptCall', async (global) => { + const { phoneCall } = global; + + if (!phoneCall) return; + + const dhConfig = await callApi('getDhConfig'); + if (!dhConfig) return; + + await callApi('createPhoneCallState', [false]); + + const gB = await callApi('acceptPhoneCall', [dhConfig])!; + callApi('acceptCall', { call: phoneCall, gB }); +}); + +addActionHandler('sendSignalingData', (global, actions, payload) => { + const { phoneCall } = global; + if (!phoneCall) { + return; + } + + const data = JSON.stringify(payload); + + (async () => { + const encodedData = await callApi('encodePhoneCallData', [data]); + + if (!encodedData) return; + + callApi('sendSignalingData', { data: encodedData, call: phoneCall }); + })(); +}); + +addActionHandler('closeCallRatingModal', (global) => { + return { + ...global, + ratingPhoneCall: undefined, + }; +}); + +addActionHandler('setCallRating', (global, actions, payload) => { + const { ratingPhoneCall } = global; + if (!ratingPhoneCall) { + return undefined; + } + + const { rating, comment } = payload; + + callApi('setCallRating', { call: ratingPhoneCall, rating, comment }); + + return { + ...global, + ratingPhoneCall: undefined, + }; +}); + +addActionHandler('hangUp', (global) => { + const { phoneCall } = global; + + if (!phoneCall) return undefined; + + if (phoneCall.state === 'discarded') { + callApi('destroyPhoneCallState'); + stopPhoneCall(); + return { + ...global, + phoneCall: undefined, + isCallPanelVisible: undefined, + }; + } + + callApi('destroyPhoneCallState'); + stopPhoneCall(); + callApi('discardCall', { call: phoneCall }); + + if (phoneCall.state === 'requesting') { + return { + ...global, + phoneCall: undefined, + isCallPanelVisible: undefined, + }; + } + + return undefined; }); diff --git a/src/global/actions/apiUpdaters/calls.async.ts b/src/global/actions/apiUpdaters/calls.async.ts new file mode 100644 index 000000000..fc372782c --- /dev/null +++ b/src/global/actions/apiUpdaters/calls.async.ts @@ -0,0 +1,202 @@ +import { addActionHandler, getGlobal, setGlobal } from '../../index'; +import { selectActiveGroupCall, selectGroupCallParticipant, selectPhoneCallUser } from '../../selectors/calls'; +import { updateGroupCall, updateGroupCallParticipant } from '../../reducers/calls'; +import { omit } from '../../../util/iteratees'; +import { + ApiCallProtocol, + handleUpdateGroupCallConnection, + handleUpdateGroupCallParticipants, + joinPhoneCall, processSignalingMessage, +} from '../../../lib/secret-sauce'; +import { ApiPhoneCall } from '../../../api/types'; +import { ARE_CALLS_SUPPORTED } from '../../../util/environment'; +import { callApi } from '../../../api/gramjs'; +import * as langProvider from '../../../util/langProvider'; +import { EMOJI_DATA, EMOJI_OFFSETS } from '../../../util/phoneCallEmojiConstants'; + +addActionHandler('apiUpdate', (global, actions, update) => { + const { activeGroupCallId } = global.groupCalls; + + switch (update['@type']) { + case 'updateGroupCallLeavePresentation': { + actions.toggleGroupCallPresentation({ value: false }); + break; + } + case 'updateGroupCallStreams': { + if (!update.userId || !activeGroupCallId) break; + if (!selectGroupCallParticipant(global, activeGroupCallId, update.userId)) break; + + return updateGroupCallParticipant(global, activeGroupCallId, update.userId, omit(update, ['@type', 'userId'])); + } + case 'updateGroupCallConnectionState': { + if (!activeGroupCallId) break; + + if (update.connectionState === 'disconnected') { + actions.leaveGroupCall({ isFromLibrary: true }); + break; + } + + return updateGroupCall(global, activeGroupCallId, { + connectionState: update.connectionState, + isSpeakerDisabled: update.isSpeakerDisabled, + }); + } + case 'updateGroupCallParticipants': { + const { groupCallId, participants } = update; + if (activeGroupCallId === groupCallId) { + void handleUpdateGroupCallParticipants(participants); + } + break; + } + case 'updateGroupCallConnection': { + if (update.data.stream) { + actions.showNotification({ message: 'Big live streams are not yet supported' }); + actions.leaveGroupCall(); + break; + } + void handleUpdateGroupCallConnection(update.data, update.presentation); + + const groupCall = selectActiveGroupCall(global); + if (groupCall?.participants && Object.keys(groupCall.participants).length > 0) { + void handleUpdateGroupCallParticipants(Object.values(groupCall.participants)); + } + break; + } + case 'updatePhoneCallMediaState': + return { + ...global, + phoneCall: { + ...global.phoneCall, + ...omit(update, ['@type']), + } as ApiPhoneCall, + }; + case 'updatePhoneCall': { + if (!ARE_CALLS_SUPPORTED) return undefined; + const { phoneCall, currentUserId } = global; + + const call: ApiPhoneCall = { + ...phoneCall, + ...update.call, + }; + + const isOutgoing = phoneCall?.adminId === currentUserId; + + global = { + ...global, + phoneCall: call, + }; + + if (phoneCall && phoneCall.id && call.id !== phoneCall.id) { + if (call.state !== 'discarded') { + callApi('discardCall', { + call, + isBusy: true, + }); + } + return undefined; + } + + const { + accessHash, state, connections, gB, + } = call; + + if (state === 'active' || state === 'accepted') { + if (!verifyPhoneCallProtocol(call.protocol)) { + const user = selectPhoneCallUser(global); + actions.hangUp(); + actions.showNotification({ message: langProvider.getTranslation('VoipPeerIncompatible', user?.firstName) }); + return undefined; + } + } + + if (state === 'discarded') { + // Discarded from other device + if (!phoneCall) return undefined; + + return { + ...global, + ...(call.needRating && { ratingPhoneCall: call }), + isCallPanelVisible: undefined, + }; + } else if (state === 'accepted' && accessHash && gB) { + (async () => { + const { gA, keyFingerprint, emojis } = await callApi('confirmPhoneCall', [gB, EMOJI_DATA, EMOJI_OFFSETS])!; + + global = getGlobal(); + const newCall = { + ...global.phoneCall, + emojis, + } as ApiPhoneCall; + + setGlobal({ + ...global, + phoneCall: newCall, + }); + + callApi('confirmCall', { + call, gA, keyFingerprint, + }); + })(); + } else if (state === 'active' && connections && phoneCall?.state !== 'active') { + if (!isOutgoing) { + callApi('receivedCall', { call }); + (async () => { + const { emojis } = await callApi('confirmPhoneCall', [call!.gAOrB!, EMOJI_DATA, EMOJI_OFFSETS])!; + + global = getGlobal(); + const newCall = { + ...global.phoneCall, + emojis, + } as ApiPhoneCall; + + setGlobal({ + ...global, + phoneCall: newCall, + }); + })(); + } + void joinPhoneCall( + connections, actions.sendSignalingData, isOutgoing, Boolean(call?.isVideo), actions.apiUpdate, + ); + } + + return global; + } + case 'updatePhoneCallConnectionState': { + const { connectionState } = update; + + if (!global.phoneCall) return global; + + if (connectionState === 'closed' || connectionState === 'disconnected' || connectionState === 'failed') { + actions.hangUp(); + return undefined; + } + + return { + ...global, + phoneCall: { + ...global.phoneCall, + isConnected: connectionState === 'connected', + }, + }; + } + case 'updatePhoneCallSignalingData': { + const { phoneCall } = global; + + if (!phoneCall) { + break; + } + + callApi('decodePhoneCallData', [update.data])?.then(processSignalingMessage); + break; + } + } + + return undefined; +}); + +function verifyPhoneCallProtocol(protocol?: ApiCallProtocol) { + return protocol?.libraryVersions.some((version) => { + return version === '4.0.0' || version === '4.0.1'; + }); +} diff --git a/src/global/actions/apiUpdaters/calls.ts b/src/global/actions/apiUpdaters/calls.ts index 7891232ae..8de1b42ae 100644 --- a/src/global/actions/apiUpdaters/calls.ts +++ b/src/global/actions/apiUpdaters/calls.ts @@ -3,6 +3,10 @@ import { removeGroupCall, updateGroupCall, updateGroupCallParticipant } from '.. import { omit } from '../../../util/iteratees'; import { selectChat } from '../../selectors'; import { updateChat } from '../../reducers'; +import { ARE_CALLS_SUPPORTED } from '../../../util/environment'; +import { notifyAboutCall } from '../../../util/notifications'; +import { selectPhoneCallUser } from '../../selectors/calls'; +import { initializeSoundsForSafari } from '../ui/calls'; addActionHandler('apiUpdate', (global, actions, update) => { switch (update['@type']) { @@ -54,6 +58,32 @@ addActionHandler('apiUpdate', (global, actions, update) => { } return global; } + case 'updatePhoneCall': { + if (!ARE_CALLS_SUPPORTED) return undefined; + + const { + phoneCall, + currentUserId, + } = global; + + if (phoneCall) return undefined; + + const { call } = update; + const isOutgoing = call?.adminId === currentUserId; + + if (!isOutgoing && call.state === 'requested') { + notifyAboutCall({ + call, + user: selectPhoneCallUser(global)!, + }); + void initializeSoundsForSafari(); + return { + ...global, + phoneCall: call, + isCallPanelVisible: false, + }; + } + } } return undefined; diff --git a/src/global/actions/calls.ts b/src/global/actions/calls.ts index 5828e6c0a..293c9c317 100644 --- a/src/global/actions/calls.ts +++ b/src/global/actions/calls.ts @@ -1 +1,2 @@ import './api/calls.async'; +import './apiUpdaters/calls.async'; diff --git a/src/global/actions/ui/calls.ts b/src/global/actions/ui/calls.ts index d457bb227..1f1c37a30 100644 --- a/src/global/actions/ui/calls.ts +++ b/src/global/actions/ui/calls.ts @@ -1,7 +1,7 @@ import { addActionHandler, getGlobal, setGlobal } from '../../index'; import { selectActiveGroupCall, selectChatGroupCall, selectGroupCall } from '../../selectors/calls'; import { callApi } from '../../../api/gramjs'; -import { selectChat } from '../../selectors'; +import { selectChat, selectUser } from '../../selectors'; import { copyTextToClipboard } from '../../../util/clipboard'; import { ApiGroupCall } from '../../../api/types'; import { updateGroupCall } from '../../reducers/calls'; @@ -11,29 +11,43 @@ import { fetchChatByUsername, loadFullChat } from '../api/chats'; import safePlay from '../../../util/safePlay'; import { ARE_CALLS_SUPPORTED } from '../../../util/environment'; import * as langProvider from '../../../util/langProvider'; +import { CallSound } from '../../types'; // Workaround for Safari not playing audio without user interaction let audioElement: HTMLAudioElement | undefined; let audioContext: AudioContext | undefined; -const joinAudio = new Audio('./voicechat_join.mp3'); -const connectingAudio = new Audio('./voicechat_connecting.mp3'); -connectingAudio.loop = true; -const leaveAudio = new Audio('./voicechat_leave.mp3'); -const allowTalkAudio = new Audio('./voicechat_onallowtalk.mp3'); - -const sounds: Record = { - join: joinAudio, - allowTalk: allowTalkAudio, - leave: leaveAudio, - connecting: connectingAudio, -}; - +let sounds: Record; let initializationPromise: Promise | undefined = Promise.resolve(); -const initializeSoundsForSafari = () => { +export const initializeSoundsForSafari = () => { if (!initializationPromise) return Promise.resolve(); + const joinAudio = new Audio('./voicechat_join.mp3'); + const connectingAudio = new Audio('./voicechat_connecting.mp3'); + connectingAudio.loop = true; + const leaveAudio = new Audio('./voicechat_leave.mp3'); + const allowTalkAudio = new Audio('./voicechat_onallowtalk.mp3'); + const busyAudio = new Audio('./call_busy.mp3'); + const connectAudio = new Audio('./call_connect.mp3'); + const endAudio = new Audio('./call_end.mp3'); + const incomingAudio = new Audio('./call_incoming.mp3'); + incomingAudio.loop = true; + const ringingAudio = new Audio('./call_ringing.mp3'); + ringingAudio.loop = true; + + sounds = { + join: joinAudio, + allowTalk: allowTalkAudio, + leave: leaveAudio, + connecting: connectingAudio, + incoming: incomingAudio, + end: endAudio, + connect: connectAudio, + busy: busyAudio, + ringing: ringingAudio, + }; + initializationPromise = Promise.all(Object.values(sounds).map((l) => { l.muted = true; l.volume = 0.0001; @@ -95,10 +109,7 @@ async function fetchGroupCallParticipants(groupCall: Partial, next addActionHandler('toggleGroupCallPanel', (global) => { return { ...global, - groupCalls: { - ...global.groupCalls, - isGroupCallPanelHidden: !global.groupCalls.isGroupCallPanelHidden, - }, + isCallPanelVisible: !global.isCallPanelVisible, }; }); @@ -194,6 +205,11 @@ addActionHandler('joinVoiceChatByLink', async (global, actions, payload) => { addActionHandler('joinGroupCall', async (global, actions, payload) => { if (!ARE_CALLS_SUPPORTED) return undefined; + if (global.phoneCall) { + actions.toggleGroupCallPanel(); + return undefined; + } + const { chatId, id, accessHash, inviteHash, } = payload; @@ -246,8 +262,8 @@ addActionHandler('joinGroupCall', async (global, actions, payload) => { groupCalls: { ...global.groupCalls, activeGroupCallId: groupCall.id, - isGroupCallPanelHidden: false, }, + isCallPanelVisible: false, }; return global; }); @@ -259,15 +275,23 @@ addActionHandler('playGroupCallSound', (global, actions, payload) => { return; } - if (initializationPromise) { - initializationPromise.then(() => { - safePlay(sounds[sound]); - }); - } else { + const doPlay = () => { if (sound !== 'connecting') { sounds.connecting.pause(); } + if (sound !== 'incoming') { + sounds.incoming.pause(); + } + if (sound !== 'ringing') { + sounds.ringing.pause(); + } safePlay(sounds[sound]); + }; + + if (initializationPromise) { + initializationPromise.then(doPlay); + } else { + doPlay(); } }); @@ -280,6 +304,35 @@ addActionHandler('loadMoreGroupCallParticipants', (global) => { void fetchGroupCallParticipants(groupCall, groupCall.nextOffset); }); +addActionHandler('requestCall', async (global, actions, payload) => { + const { userId, isVideo } = payload; + + if (global.phoneCall) { + actions.toggleGroupCallPanel(); + return; + } + + const user = selectUser(global, userId); + + if (!user) { + return; + } + + await initializeSoundsForSafari(); + + setGlobal({ + ...getGlobal(), + phoneCall: { + id: '', + state: 'requesting', + participantId: userId, + isVideo, + adminId: global.currentUserId, + }, + isCallPanelVisible: false, + }); +}); + function createAudioContext() { return (new (window.AudioContext || (window as any).webkitAudioContext)()); } @@ -312,23 +365,3 @@ export function removeGroupCallAudioElement() { audioContext = undefined; audioElement = undefined; } - -addActionHandler('openCallFallbackConfirm', (global) => { - return { - ...global, - groupCalls: { - ...global.groupCalls, - isFallbackConfirmOpen: true, - }, - }; -}); - -addActionHandler('closeCallFallbackConfirm', (global) => { - return { - ...global, - groupCalls: { - ...global.groupCalls, - isFallbackConfirmOpen: false, - }, - }; -}); diff --git a/src/global/cache.ts b/src/global/cache.ts index 371c60116..2cb608a10 100644 --- a/src/global/cache.ts +++ b/src/global/cache.ts @@ -276,6 +276,7 @@ function updateCache() { chatFolders: reduceChatFolders(global), groupCalls: reduceGroupCalls(global), availableReactions: reduceAvailableReactions(global), + isCallPanelVisible: undefined, }; const json = JSON.stringify(reducedGlobal); @@ -389,8 +390,6 @@ function reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] { ...global.groupCalls, byId: {}, activeGroupCallId: undefined, - isGroupCallPanelHidden: undefined, - isFallbackConfirmOpen: undefined, }; } diff --git a/src/global/helpers/messages.ts b/src/global/helpers/messages.ts index 30a836cca..cda288a16 100644 --- a/src/global/helpers/messages.ts +++ b/src/global/helpers/messages.ts @@ -44,7 +44,8 @@ export function getMessageOriginalId(message: ApiMessage) { export function getMessageText(message: ApiMessage) { const { - text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice, location, game, + text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice, location, + game, action, } = message.content; if (text) { @@ -52,7 +53,7 @@ export function getMessageText(message: ApiMessage) { } if (sticker || photo || video || audio || voice || document - || contact || poll || webPage || invoice || location || game) { + || contact || poll || webPage || invoice || location || game || action?.phoneCall) { return undefined; } diff --git a/src/global/selectors/calls.ts b/src/global/selectors/calls.ts index c7e2f4c09..961edf5e0 100644 --- a/src/global/selectors/calls.ts +++ b/src/global/selectors/calls.ts @@ -1,6 +1,6 @@ import { GlobalState } from '../types'; import { selectChat } from './chats'; -import { getUserFullName, isChatBasicGroup } from '../helpers'; +import { isChatBasicGroup } from '../helpers'; import { selectUser } from './users'; export function selectChatGroupCall(global: GlobalState, chatId: string) { @@ -38,8 +38,12 @@ export function selectActiveGroupCall(global: GlobalState) { return selectGroupCall(global, activeGroupCallId); } -export function selectCallFallbackChannelTitle(global: GlobalState) { - const currentUser = selectUser(global, global.currentUserId!); +export function selectPhoneCallUser(global: GlobalState) { + const { phoneCall, currentUserId } = global; + if (!phoneCall || !phoneCall.participantId || !phoneCall.adminId) { + return undefined; + } - return `Calls: ${getUserFullName(currentUser!)}`; + const id = phoneCall.adminId === currentUserId ? phoneCall.participantId : phoneCall.adminId; + return selectUser(global, id); } diff --git a/src/global/types.ts b/src/global/types.ts index a10debb35..c54e12204 100644 --- a/src/global/types.ts +++ b/src/global/types.ts @@ -31,6 +31,7 @@ import { ApiPaymentFormNativeParams, ApiUpdate, ApiKeyboardButton, + ApiPhoneCall, } from '../api/types'; import { FocusDirection, @@ -58,6 +59,7 @@ import { ManagementState, } from '../types'; import { typify } from '../lib/teact/teactn'; +import type { P2pMessage } from '../lib/secret-sauce'; export type MessageListType = 'thread' @@ -200,12 +202,12 @@ export type GlobalState = { groupCalls: { byId: Record; activeGroupCallId?: string; - isGroupCallPanelHidden?: boolean; - isFallbackConfirmOpen?: boolean; - fallbackChatId?: string; - fallbackUserIdsToRemove?: string[]; }; + isCallPanelVisible?: boolean; + phoneCall?: ApiPhoneCall; + ratingPhoneCall?: ApiPhoneCall; + scheduledMessages: { byChatId: Record; @@ -541,6 +543,10 @@ export type GlobalState = { }; }; +export type CallSound = ( + 'join' | 'allowTalk' | 'leave' | 'connecting' | 'incoming' | 'end' | 'connect' | 'busy' | 'ringing' +); + export interface ActionPayloads { // Initial signOut: { forceInitApi?: boolean } | undefined; @@ -673,6 +679,24 @@ export interface ActionPayloads { isQuiz?: boolean; }; closePollModal: {}; + + // Calls + requestCall: { + userId: string; + isVideo?: boolean; + }; + sendSignalingData: P2pMessage; + hangUp: {}; + acceptCall: {}; + setCallRating: { + rating: number; + comment: string; + }; + closeCallRatingModal: {}; + playGroupCallSound: { + sound: CallSound; + }; + connectToActivePhoneCall: {}; } export type NonTypedActionNames = ( @@ -769,8 +793,7 @@ export type NonTypedActionNames = ( 'joinGroupCall' | 'toggleGroupCallMute' | 'toggleGroupCallPresentation' | 'leaveGroupCall' | 'toggleGroupCallVideo' | 'requestToSpeak' | 'setGroupCallParticipantVolume' | 'toggleGroupCallPanel' | 'createGroupCall' | 'joinVoiceChatByLink' | 'subscribeToGroupCallUpdates' | 'createGroupCallInviteLink' | - 'loadMoreGroupCallParticipants' | 'connectToActiveGroupCall' | 'playGroupCallSound' | - 'openCallFallbackConfirm' | 'closeCallFallbackConfirm' | 'inviteToCallFallback' | + 'loadMoreGroupCallParticipants' | 'connectToActiveGroupCall' | // stats 'loadStatistics' | 'loadStatisticsAsyncGraph' ); diff --git a/src/lib/gramjs/Helpers.js b/src/lib/gramjs/Helpers.js index 0306fddb8..f7e68a2e7 100644 --- a/src/lib/gramjs/Helpers.js +++ b/src/lib/gramjs/Helpers.js @@ -38,7 +38,6 @@ function toSignedLittleBuffer(big, number = 8) { return Buffer.from(byteArray); } - /** * converts a big int to a buffer * @param bigInt {bigInt.BigInteger} @@ -205,7 +204,6 @@ function sha1(data) { return shaSum.digest(); } - /** * Calculates the SHA256 digest for the given data * @param data @@ -241,10 +239,9 @@ function modExp(a, b, n) { return result; } - /** * Gets the arbitrary-length byte array corresponding to the given integer - * @param integer {number,BigInteger} + * @param integer {any} * @param signed {boolean} * @returns {Buffer} */ diff --git a/src/lib/gramjs/network/MTProtoState.js b/src/lib/gramjs/network/MTProtoState.js index 21e7a5411..b45b6d06b 100644 --- a/src/lib/gramjs/network/MTProtoState.js +++ b/src/lib/gramjs/network/MTProtoState.js @@ -1,4 +1,5 @@ const BigInt = require('big-integer'); +const aes = require('@cryptography/aes'); const Helpers = require('../Helpers'); const IGE = require('../crypto/IGE'); @@ -39,10 +40,14 @@ class MTProtoState { authentication process, at which point the `MTProtoPlainSender` is better * @param authKey * @param loggers + * @param isCall + * @param isOutgoing */ - constructor(authKey, loggers) { + constructor(authKey, loggers, isCall = false, isOutgoing = false) { this.authKey = authKey; this._log = loggers; + this._isCall = isCall; + this._isOutgoing = isOutgoing; this.timeOffset = 0; this.salt = 0; @@ -81,12 +86,20 @@ class MTProtoState { * @returns {{iv: Buffer, key: Buffer}} */ async _calcKey(authKey, msgKey, client) { - const x = client === true ? 0 : 8; + const x = (this._isCall ? 128 + ((this._isOutgoing ^ client) ? 8 : 0) : (client === true ? 0 : 8)); const [sha256a, sha256b] = await Promise.all([ Helpers.sha256(Buffer.concat([msgKey, authKey.slice(x, x + 36)])), Helpers.sha256(Buffer.concat([authKey.slice(x + 40, x + 76), msgKey])), ]); const key = Buffer.concat([sha256a.slice(0, 8), sha256b.slice(8, 24), sha256a.slice(24, 32)]); + if (this._isCall) { + const iv = Buffer.concat([sha256b.slice(0, 4), sha256a.slice(8, 16), sha256b.slice(24, 28)]); + + return { + key, + iv, + }; + } const iv = Buffer.concat([sha256b.slice(0, 8), sha256a.slice(8, 24), sha256b.slice(24, 32)]); return { key, @@ -133,24 +146,48 @@ class MTProtoState { */ async encryptMessageData(data) { await this.authKey.waitForKey(); - const s = toSignedLittleBuffer(this.salt, 8); - const i = toSignedLittleBuffer(this.id, 8); - data = Buffer.concat([Buffer.concat([s, i]), data]); - const padding = Helpers.generateRandomBytes(Helpers.mod(-(data.length + 12), 16) + 12); - // Being substr(what, offset, length); x = 0 for client - // "msg_key_large = SHA256(substr(auth_key, 88+x, 32) + pt + padding)" - const msgKeyLarge = await Helpers.sha256(Buffer.concat([this.authKey.getKey() - .slice(88, 88 + 32), data, padding])); - // "msg_key = substr (msg_key_large, 8, 16)" - const msgKey = msgKeyLarge.slice(8, 24); + if (this._isCall) { + const x = 128 + (this._isOutgoing ? 0 : 8); + const lengthStart = data.length; - const { - iv, - key, - } = await this._calcKey(this.authKey.getKey(), msgKey, true); + data = Buffer.from(data); + if (lengthStart % 4 !== 0) { + data = Buffer.concat([data, Buffer.from(new Array(4 - (lengthStart % 4)).fill(0x20))]); + } - const keyId = Helpers.readBufferFromBigInt(this.authKey.keyId, 8); - return Buffer.concat([keyId, msgKey, new IGE(key, iv).encryptIge(Buffer.concat([data, padding]))]); + const msgKeyLarge = await Helpers.sha256(Buffer.concat([this.authKey.getKey() + .slice(88 + x, 88 + x + 32), Buffer.from(data)])); + + const msgKey = msgKeyLarge.slice(8, 24); + + const { + iv, + key, + } = await this._calcKey(this.authKey.getKey(), msgKey, true); + + data = Helpers.convertToLittle(new aes.CTR(key, iv).encrypt(data)); + // data = data.slice(0, lengthStart) + return Buffer.concat([msgKey, data]); + } else { + const s = toSignedLittleBuffer(this.salt, 8); + const i = toSignedLittleBuffer(this.id, 8); + data = Buffer.concat([Buffer.concat([s, i]), data]); + const padding = Helpers.generateRandomBytes(Helpers.mod(-(data.length + 12), 16) + 12); + // Being substr(what, offset, length); x = 0 for client + // "msg_key_large = SHA256(substr(auth_key, 88+x, 32) + pt + padding)" + const msgKeyLarge = await Helpers.sha256(Buffer.concat([this.authKey.getKey() + .slice(88, 88 + 32), data, padding])); + // "msg_key = substr (msg_key_large, 8, 16)" + const msgKey = msgKeyLarge.slice(8, 24); + + const { + iv, + key, + } = await this._calcKey(this.authKey.getKey(), msgKey, true); + + const keyId = Helpers.readBufferFromBigInt(this.authKey.keyId, 8); + return Buffer.concat([keyId, msgKey, new IGE(key, iv).encryptIge(Buffer.concat([data, padding]))]); + } } /** @@ -164,65 +201,87 @@ class MTProtoState { if (body.length < 0) { // length needs to be positive throw new SecurityError('Server replied with negative length'); } - if (body.length % 4 !== 0) { + if (body.length % 4 !== 0 && !this._isCall) { throw new SecurityError('Server replied with length not divisible by 4'); } // TODO Check salt,sessionId, and sequenceNumber - const keyId = Helpers.readBigIntFromBuffer(body.slice(0, 8)); - if (keyId.neq(this.authKey.keyId)) { - throw new SecurityError('Server replied with an invalid auth key'); - } + if (!this._isCall) { + const keyId = Helpers.readBigIntFromBuffer(body.slice(0, 8)); - const msgKey = body.slice(8, 24); + if (keyId.neq(this.authKey.keyId)) { + throw new SecurityError('Server replied with an invalid auth key'); + } + } + const msgKey = this._isCall ? body.slice(0, 16) : body.slice(8, 24); + + const x = this._isCall ? 128 + (this.isOutgoing ? 8 : 0) : undefined; const { iv, key, } = await this._calcKey(this.authKey.getKey(), msgKey, false); - body = new IGE(key, iv).decryptIge(body.slice(24)); + if (this._isCall) { + body = body.slice(16); + const lengthStart = body.length; + + body = Buffer.concat([body, Buffer.from(new Array(4 - (lengthStart % 4)).fill(0))]); + + body = Helpers.convertToLittle(new aes.CTR(key, iv).decrypt(body)); + + body = body.slice(0, lengthStart); + } else { + body = new IGE(key, iv).decryptIge(this._isCall ? body.slice(16) : body.slice(24)); + } // https://core.telegram.org/mtproto/security_guidelines // Sections "checking sha256 hash" and "message length" - const ourKey = await Helpers.sha256(Buffer.concat([this.authKey.getKey() - .slice(96, 96 + 32), body])); + const ourKey = this._isCall + ? await Helpers.sha256(Buffer.concat([this.authKey.getKey() + .slice(88 + x, 88 + x + 32), body])) + : await Helpers.sha256(Buffer.concat([this.authKey.getKey() + .slice(96, 96 + 32), body])); - if (!msgKey.equals(ourKey.slice(8, 24))) { + if (!this._isCall && !msgKey.equals(ourKey.slice(8, 24))) { throw new SecurityError('Received msg_key doesn\'t match with expected one'); } - const reader = new BinaryReader(body); - reader.readLong(); // removeSalt - const serverId = reader.readLong(); - if (!serverId.eq(this.id)) { - throw new SecurityError('Server replied with a wrong session ID'); - } - const remoteMsgId = reader.readLong(); - // if we get a duplicate message id we should ignore it. - if (this.msgIds.includes(remoteMsgId.toString())) { - throw new SecurityError('Duplicate msgIds'); - } - // we only store the latest 500 message ids from the server - if (this.msgIds.length > 500) { - this.msgIds.shift(); - } - this.msgIds.push(remoteMsgId.toString()); + if (this._isCall) { + // Seq + reader.readInt(false); + return reader.read(body.length - 4); + } else { + reader.readLong(); // removeSalt + const serverId = reader.readLong(); + if (!serverId.eq(this.id)) { + throw new SecurityError('Server replied with a wrong session ID'); + } - const remoteSequence = reader.readInt(); - const containerLen = reader.readInt(); // msgLen for the inner object, padding ignored - const diff = body.length - containerLen; - // We want to check if it's between 12 and 1024 - // https://core.telegram.org/mtproto/security_guidelines#checking-message-length - if (diff < 12 || diff > 1024) { - throw new SecurityError('Server replied with the wrong message padding'); + const remoteMsgId = reader.readLong(); + // if we get a duplicate message id we should ignore it. + if (this.msgIds.includes(remoteMsgId.toString())) { + throw new SecurityError('Duplicate msgIds'); + } + // we only store the latest 500 message ids from the server + if (this.msgIds.length > 500) { + this.msgIds.shift(); + } + this.msgIds.push(remoteMsgId.toString());const remoteSequence = reader.readInt(); + const containerLen = reader.readInt(); // msgLen for the inner object, padding ignored + const diff = body.length - containerLen; + // We want to check if it's between 12 and 1024 + // https://core.telegram.org/mtproto/security_guidelines#checking-message-length + if (diff < 12 || diff > 1024) { + throw new SecurityError('Server replied with the wrong message padding'); + } + + // We could read msg_len bytes and use those in a new reader to read + // the next TLObject without including the padding, but since the + // reader isn't used for anything else after this, it's unnecessary. + const obj = reader.tgReadObject(); + + return new TLMessage(remoteMsgId, remoteSequence, obj); } - - // We could read msg_len bytes and use those in a new reader to read - // the next TLObject without including the padding, but since the - // reader isn't used for anything else after this, it's unnecessary. - const obj = reader.tgReadObject(); - - return new TLMessage(remoteMsgId, remoteSequence, obj); } /** diff --git a/src/lib/gramjs/tl/apiTl.js b/src/lib/gramjs/tl/apiTl.js index 3cf7ae3bb..16866f1c7 100644 --- a/src/lib/gramjs/tl/apiTl.js +++ b/src/lib/gramjs/tl/apiTl.js @@ -1154,6 +1154,14 @@ payments.getPaymentReceipt#2478d1cc peer:InputPeer msg_id:int = payments.Payment payments.validateRequestedInfo#db103170 flags:# save:flags.0?true peer:InputPeer msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo; payments.sendPaymentForm#30c3bc9d flags:# form_id:long peer:InputPeer msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials tip_amount:flags.2?long = payments.PaymentResult; payments.getSavedInfo#227d824b = payments.SavedInfo; +phone.requestCall#42ff96ed flags:# video:flags.0?true user_id:InputUser random_id:int g_a_hash:bytes protocol:PhoneCallProtocol = phone.PhoneCall; +phone.acceptCall#3bd2b4a0 peer:InputPhoneCall g_b:bytes protocol:PhoneCallProtocol = phone.PhoneCall; +phone.confirmCall#2efe1722 peer:InputPhoneCall g_a:bytes key_fingerprint:long protocol:PhoneCallProtocol = phone.PhoneCall; +phone.receivedCall#17d54f61 peer:InputPhoneCall = Bool; +phone.discardCall#b2cbc1c0 flags:# video:flags.0?true peer:InputPhoneCall duration:int reason:PhoneCallDiscardReason connection_id:long = Updates; +phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhoneCall rating:int comment:string = Updates; +phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool; +phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool; phone.createGroupCall#48cdc6d8 flags:# rtmp_stream:flags.2?true peer:InputPeer random_id:int title:flags.0?string schedule_date:flags.1?int = Updates; phone.joinGroupCall#b132ff7b flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string params:DataJSON = Updates; phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates; diff --git a/src/lib/gramjs/tl/static/api.json b/src/lib/gramjs/tl/static/api.json index aeef75df6..09840e2fb 100644 --- a/src/lib/gramjs/tl/static/api.json +++ b/src/lib/gramjs/tl/static/api.json @@ -203,6 +203,14 @@ "phone.toggleGroupCallStartSubscription", "phone.joinGroupCallPresentation", "phone.leaveGroupCallPresentation", + "phone.requestCall", + "phone.acceptCall", + "phone.confirmCall", + "phone.receivedCall", + "phone.discardCall", + "phone.setCallRating", + "phone.saveCallDebug", + "phone.sendSignalingData", "messages.sendReaction", "messages.getMessagesReactions", "messages.getMessageReactionsList", diff --git a/src/lib/secret-sauce/buildSdp.d.ts b/src/lib/secret-sauce/buildSdp.d.ts index f2e1d31f8..ea2c1c99f 100644 --- a/src/lib/secret-sauce/buildSdp.d.ts +++ b/src/lib/secret-sauce/buildSdp.d.ts @@ -17,5 +17,5 @@ export declare type Ssrc = { isPresentation?: boolean; sourceGroups: SsrcGroup[]; }; -declare const _default: (conference: Conference, isAnswer?: boolean, isPresentation?: boolean) => string; +declare const _default: (conference: Conference, isAnswer?: boolean, isPresentation?: boolean, isP2p?: boolean) => string; export default _default; diff --git a/src/lib/secret-sauce/index.d.ts b/src/lib/secret-sauce/index.d.ts index f887e1781..098fe6c24 100644 --- a/src/lib/secret-sauce/index.d.ts +++ b/src/lib/secret-sauce/index.d.ts @@ -1,3 +1,5 @@ export { handleUpdateGroupCallConnection, startSharingScreen, joinGroupCall, getDevices, getUserStreams, setVolume, isStreamEnabled, toggleStream, leaveGroupCall, handleUpdateGroupCallParticipants, switchCameraInput, toggleSpeaker, toggleNoiseSuppression, } from './secretsauce'; +export { joinPhoneCall, processSignalingMessage, getStreams, toggleStreamP2p, stopPhoneCall, switchCameraInputP2p, } from './p2p'; +export * from './p2pMessage'; export { IS_SCREENSHARE_SUPPORTED, THRESHOLD, } from './utils'; export * from './types'; diff --git a/src/lib/secret-sauce/index.js b/src/lib/secret-sauce/index.js index 5bb934341..42361cd8f 100644 --- a/src/lib/secret-sauce/index.js +++ b/src/lib/secret-sauce/index.js @@ -1,2 +1,2 @@ /*! For license information please see index.js.LICENSE.txt */ -(()=>{"use strict";var e={"./src/blacksilence.ts":(e,t,n)=>{n.r(t),n.d(t,{silence:()=>a,black:()=>i});const a=e=>{const t=e.createOscillator(),n=t.connect(e.createMediaStreamDestination());return t.start(),new MediaStream([Object.assign(n.stream.getAudioTracks()[0],{enabled:!1})])},i=({width:e=640,height:t=480}={})=>{const n=Object.assign(document.createElement("canvas"),{width:e,height:t}),a=n.getContext("2d");if(!a)throw Error("Cannot create canvas ctx");a.fillRect(0,0,e,t);const i=n.captureStream();return new MediaStream([Object.assign(i.getVideoTracks()[0],{enabled:!1})])}},"./src/buildSdp.ts":(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n("./src/utils.ts");const i=(e,t=!1,n=!1)=>{const i=[],r=e=>{i.push(e)},{sessionId:s,ssrcs:o,audioExtensions:c,videoExtensions:d,audioPayloadTypes:p,videoPayloadTypes:u,transport:{ufrag:l,pwd:m,fingerprints:f,candidates:g}}=e;r("v=0"),r(`o=- ${s} 2 IN IP4 0.0.0.0`),r("s=-"),r("t=0 0"),r(`a=group:BUNDLE ${o.map((e=>e.endpoint)).join(" ")}${n?"":" 2"}`),r("a=ice-lite");const S=e=>{let t="";t+="a=candidate:",t+=`${e.foundation} ${e.component} ${e.protocol} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`,"rel-addr"in e&&(t+=` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t+=` generation ${e.generation}`,r(t)},v=()=>{r(`a=ice-ufrag:${l}`),r(`a=ice-pwd:${m}`),f.forEach((e=>{r(`a=fingerprint:${e.hash} ${e.fingerprint}`),r("a=setup:passive")})),g.forEach(S)},h=e=>{const{channels:t,id:n,name:a,clockrate:i,parameters:s}=e;var o=t?`/${t}`:"";r(`a=rtpmap:${n} ${a}/${i}${o}`),s&&(o=Object.keys(s).map((e=>`${e}=${s[e]};`)).join(" "),r(`a=fmtp:${n} ${o}`)),e["rtcp-fbs"]?.forEach((e=>{r(`a=rtcp-fb:${n} ${e.type}${e.subtype?` ${e.subtype}`:""}`)}))};return e=e=>{const n=e.isVideo?u:p;var i=e.isVideo?"video":"audio";r(`m=${i} ${e.isMain?1:0} RTP/SAVPF ${n.map((e=>e.id)).join(" ")}`),r("c=IN IP4 0.0.0.0"),r("b=AS:1300"),r(`a=mid:${e.endpoint}`),r("a=rtcp-mux"),n.forEach(h),r("a=rtcp:1 IN IP4 0.0.0.0"),e.isVideo&&r("a=rtcp-rsize"),(e.isVideo?d:c).forEach((({id:e,uri:t})=>{r(`a=extmap:${e} ${t}`)})),e.isRemoved?r("a=inactive"):(v(),t?r("a=recvonly"):(e.isMain?r("a=sendrecv"):(r("a=sendonly"),r("a=bundle-only")),e.sourceGroups.forEach((t=>{r(`a=ssrc-group:${t.semantics} ${t.sources.map(a.fromTelegramSource).join(" ")}`),t.sources.forEach((t=>{t=(0,a.fromTelegramSource)(t),r(`a=ssrc:${t} cname:${e.endpoint}`),r(`a=ssrc:${t} msid:${e.endpoint} ${e.endpoint}`),r(`a=ssrc:${t} mslabel:${e.endpoint}`),r(`a=ssrc:${t} label:${e.endpoint}`)}))}))))},o.filter((e=>"0"===e.endpoint||"1"===e.endpoint)).map(e),n||(r("m=application 1 UDP/DTLS/SCTP webrtc-datachannel"),r("c=IN IP4 0.0.0.0"),v(),r("a=ice-options:trickle"),r("a=mid:"+(n?"1":"2")),r("a=sctp-port:5000"),r("a=max-message-size:262144")),o.filter((e=>"0"!==e.endpoint&&"1"!==e.endpoint)).map(e),`${i.join("\n")}\n`}},"./src/parseSdp.ts":(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});var a=n("./src/utils.ts");const i=e=>{if(!e||!e.sdp)throw Error("Failed parsing SDP: session description is null");const t=e.sdp.split("\r\nm=").map(((e,t)=>0===t?e:`m=${e}`)).reduce(((e,t)=>(e[t.match(/^m=(.+?)\s/)?.[1]||"header"]=t.split("\r\n").filter(Boolean),e)),{});var n=(e,n)=>n?t[n]?.find((t=>t.startsWith(e)))?.substr(e.length):Object.values(t).map((t=>t.find((t=>t.startsWith(e)))?.substr(e.length))).filter(Boolean)[0];const i=n("a=ssrc:","audio");var r=i&&Number(i.split(" ")[0]);const s=n("a=ssrc-group:","video")?.split(" ")||void 0;if(!s)throw Error("Failed parsing SDP: no video ssrc");var[o,c]=n("a=fingerprint:")?.split(" ")||[];if(!o||!c)throw Error("Failed parsing SDP: no fingerprint");if(e=n("a=ice-ufrag:"),n=n("a=ice-pwd:"),!e||!n)throw Error("Failed parsing SDP: no ICE ufrag or pwd");return{fingerprints:[{fingerprint:c,hash:o,setup:"active"}],pwd:n,ufrag:e,...r&&{ssrc:(0,a.toTelegramSource)(r)},...s&&{"ssrc-groups":[{semantics:s[0],sources:s.slice(1,s.length).map(Number).map(a.toTelegramSource)}]}}}},"./src/secretsauce.ts":(e,t,n)=>{n.r(t),n.d(t,{getDevices:()=>async function(e,t=!0){return(await navigator.mediaDevices.enumerateDevices()).filter((n=>n.kind===`${e}${t?"input":"output"}`))},toggleSpeaker:()=>function(){o&&(o.isSpeakerDisabled=!o.isSpeakerDisabled,o?.onUpdate?.({"@type":"updateGroupCallConnectionState",connectionState:"connected",isSpeakerDisabled:o.isSpeakerDisabled}),o.participantFunctions&&Object.values(o.participantFunctions).forEach((e=>{e.toggleMute?.(!!o?.isSpeakerDisabled)})))},toggleNoiseSuppression:()=>function(){if(o&&o.myId&&o.streams){const n=o.streams[o.myId].audio;if(n){const a=n.getTracks()[0];var e,t;a&&(({echoCancellation:e,noiseSuppression:t}=a.getConstraints()),a.applyConstraints({echoCancellation:!e,noiseSuppression:!t}))}}},getUserStreams:()=>d,setVolume:()=>function(e,t){const n=o?.participantFunctions?.[e];n&&n.setVolume?.(t)},isStreamEnabled:()=>p,switchCameraInput:()=>async function(){if(o?.myId&&o.connection&&o.streams&&o.facingMode){const e=d(o.myId)?.video;if(e){const t=e.getTracks()[0];if(t){const e=o.connection.getSenders().find((e=>t.id===e.track?.id));if(e){o.facingMode="environment"===o.facingMode?"user":"environment";try{const t=await l("video",o.facingMode);await e.replaceTrack(t.getTracks()[0]),o.streams[o.myId].video=t}catch(e){}}}}}},toggleStream:()=>m,leaveGroupCall:()=>g,handleUpdateGroupCallParticipants:()=>async function(e){if(o){const{participants:a,conference:r,connection:s,myId:c}=o;if(a&&r&&s&&r.ssrcs&&r.transport&&c)if(e.find((e=>e.isSelf&&e.source!==o?.conference?.ssrcs?.find((e=>e.isMain&&!e.isVideo))?.sourceGroups[0].sources[0])))g();else{const a=[];if(e.forEach((e=>{if(e.isSelf)e.isMuted&&!e.canSelfUnmute&&(m("audio",!1),m("video",!1),m("presentation",!1));else{var t=e.isLeft;const n=e.isMuted||e.isMutedByMe,i=!e.isVideoJoined||!e.video||t,s=!e.presentation||t;let o=!1,c=!1,d=!1;r.ssrcs.filter((t=>t.userId===e.id)).forEach((t=>{t.isVideo||(t.sourceGroups[0].sources[0]===e.source&&(c=!0),t.isRemoved=n),t.isVideo&&(t.isPresentation||(e.video&&t.endpoint===e.video.endpoint&&(o=!0),t.isRemoved=i),t.isPresentation&&(e.presentation&&t.endpoint===e.presentation.endpoint&&(d=!0),t.isRemoved=s))})),n||c||r.ssrcs.push({userId:e.id,isMain:!1,endpoint:`audio${e.source}`,isVideo:!1,sourceGroups:[{semantics:"FID",sources:[e.source]}]}),i||o||!e.video||(a.push(e.video.endpoint),r.ssrcs.push({userId:e.id,isMain:!1,endpoint:e.video.endpoint,isVideo:!0,sourceGroups:e.video.sourceGroups})),s||d||!e.presentation||r.ssrcs.push({isPresentation:!0,userId:e.id,isMain:!1,endpoint:e.presentation.endpoint,isVideo:!0,sourceGroups:e.presentation.sourceGroups})}})),o.updatingParticipantsQueue)o.updatingParticipantsQueue.push(r);else{o.updatingParticipantsQueue=[],e=(0,i.default)(r),await s.setRemoteDescription({type:"offer",sdp:e});try{var t=await s.createAnswer();if(await s.setLocalDescription(t),u(c),0async function(e,t){if(o){var n=t?o.screenshareConference:o.conference;const r=t?o.screenshareConnection:o.connection;if(n&&r&&n.ssrcs){var a=Date.now();e={...n,transport:e.transport,sessionId:a,audioExtensions:e.audio?.["rtp-hdrexts"],audioPayloadTypes:e.audio?.["payload-types"],videoExtensions:e.video?.["rtp-hdrexts"],videoPayloadTypes:e.video?.["payload-types"]};o={...o,...t?{screenshareConference:e}:{conference:e}};try{await r.setRemoteDescription({type:"answer",sdp:(0,i.default)(e,!0,t)})}catch(e){console.error(e)}}}},startSharingScreen:()=>async function(){if(o)try{const e=await l("presentation");return e?(e.getTracks()[0].onended=()=>{o&&o.myId&&(o.streams?.[o.myId].presentation,u(o.myId),c())},new Promise((t=>{var{connection:n,dataChannel:t}=h([e],t,!0);o={...o,screenshareConnection:n,screenshareDataChannel:t}}))):void 0}catch(e){return}},joinGroupCall:()=>function(e,t,n,a){if(o)throw Error("Already in call");f("connecting");var i=new MediaStream;return n.srcObject=i,n.play().catch((e=>console.warn(e))),o={onUpdate:a,participants:[],myId:e,speaking:{},silence:(0,r.silence)(t),black:(0,r.black)({width:640,height:480}),analyserInterval:setInterval(S,1e3),audioElement:n,audioContext:t,mediaStream:i},new Promise((e=>{o={...o,...h([o.silence,o.black],e)}}))}});var a=n("./src/parseSdp.ts"),i=n("./src/buildSdp.ts"),r=n("./src/blacksilence.ts"),s=n("./src/utils.ts");let o;function c(e){o&&(o.screenshareDataChannel?.close(),o.screenshareConnection?.close(),e||o.onUpdate?.({"@type":"updateGroupCallLeavePresentation"}))}function d(e){return o?.streams?.[e]}function p(e,t){const n=(t=t||o?.myId)&&d(t)?.[e];return!!n&&n.getTracks()[0]?.enabled}function u(e){o?.onUpdate?.({"@type":"updateGroupCallStreams",userId:e,hasAudioStream:p("audio",e),hasVideoStream:p("video",e),hasPresentationStream:p("presentation",e),amplitude:o.speaking?.[e]})}function l(e,t="user"){return"presentation"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...s.IS_ECHO_CANCELLATION_SUPPORTED&&{echoCancellation:!0},...s.IS_NOISE_SUPPRESSION_SUPPORTED&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}})}async function m(e,t){if(o&&o.myId&&o.connection&&o.streams){const n=d(o.myId)?.[e];if(n){const a=n.getTracks()[0];if(a){const n=[...o.connection.getSenders(),...o.screenshareConnection?.getSenders()||[]].find((e=>a.id===e.track?.id));if(n){t=void 0===t?!a.enabled:t;try{if(t&&!a.enabled){const t=await l(e);if(await n.replaceTrack(t.getTracks()[0]),o.streams[o.myId][e]=t,"video"===e)o.facingMode="user";else if("audio"===e){const e=o.audioContext;if(!e)return;const n=e.createMediaStreamSource(t),a=e.createAnalyser();a.minDecibels=-100,a.maxDecibels=-30,a.smoothingTimeConstant=.05,a.fftSize=1024,n.connect(a),o={...o,participantFunctions:{...o.participantFunctions,[o.myId]:{...o.participantFunctions?.[o.myId],getCurrentAmplitude:()=>{var e=new Uint8Array(a.frequencyBinCount);return a.getByteFrequencyData(e),(0,s.getAmplitude)(e,1.5)}}}}}}else if(!t&&a.enabled){a.stop();const t="audio"===e?o.silence:o.black;if(!t)return;await n.replaceTrack(t.getTracks()[0]),o.streams[o.myId][e]=t,"video"===e&&(o.facingMode=void 0)}u(o.myId),"presentation"!==e||t||c(!0)}catch(e){}}}}}}function f(e){o?.onUpdate?.({"@type":"updateGroupCallConnectionState",connectionState:e})}function g(){o&&(o.myId&&o.streams?.[o.myId]&&Object.values(o.streams[o.myId]||{}).forEach((e=>{e?.getTracks().forEach((e=>{e.stop()}))})),c(!0),o.dataChannel?.close(),o.connection?.close(),f("disconnected"),o.analyserInterval&&clearInterval(o.analyserInterval),o=void 0)}function S(){o&&o.participantFunctions&&Object.keys(o.participantFunctions).forEach((e=>{const t=o.participantFunctions[Number(e)].getCurrentAmplitude;var n,a;t&&(n=t(),a=o.speaking[e]||0,((o.speaking[e]=n)>s.THRESHOLD&&a<=s.THRESHOLD||n<=s.THRESHOLD&&a>s.THRESHOLD)&&u(e))}))}function v(e){if(o&&o.audioElement&&o.audioContext&&o.mediaStream){var t=o.conference?.ssrcs?.find((t=>t.endpoint===e.track.id));if(t&&t.userId){const{userId:a,isPresentation:i}=t;var n=o.participants?.find((e=>e.id===a));const r="video"===e.track.kind?i?"presentation":"video":"audio";if(e.track.onended=()=>{o?.streams?.[a][r],u(a)},t=e.streams[0],"audio"===e.track.kind){const e=o.mediaStream,i=new window.AudioContext,r=i.createMediaStreamSource(t),c=i.createGain();c.gain.value=(n?.volume||1e4)/1e4;const d=i.createGain();c.gain.value=1;const p=i.createAnalyser();p.minDecibels=-100,p.maxDecibels=-30,p.smoothingTimeConstant=.05,p.fftSize=1024,r.connect(p).connect(d).connect(c).connect(i.destination),e.addTrack(r.mediaStream.getAudioTracks()[0]);const u=new Audio;u.srcObject=t,u.muted=!0,u.remove(),o={...o,participantFunctions:{...o.participantFunctions,[a]:{...o.participantFunctions?.[a],setVolume:e=>{c.gain.value=1{d.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(p.frequencyBinCount);return p.getByteFrequencyData(e),(0,s.getAmplitude)(e,1.5)}}}}}o={...o,streams:{...o.streams,[a]:{...o.streams?.[a],[r]:t}}},u(a)}}}function h(e,t,n=!1){const i=new RTCPeerConnection;var r=n?void 0:function(e){const t=e.createDataChannel("data",{id:0});return t.onopen=()=>{},t.onmessage=e=>{JSON.parse(e.data).colibriClass},t.onerror=e=>{console.log("%conerror","background: green; font-size: 5em"),console.error(e)},t}(i);return e.forEach((e=>e.getTracks().forEach((t=>{i.addTrack(t,e)})))),n||(i.oniceconnectionstatechange=()=>{var e=i.iceConnectionState;"connected"===e||"completed"===e?f("connected"):"checking"===e||"new"===e?f("connecting"):"disconnected"===i.iceConnectionState&&f("reconnecting")}),i.ontrack=v,i.onnegotiationneeded=async()=>{if(o){var r=o.myId;if(r){var s=await i.createOffer({offerToReceiveVideo:!0,offerToReceiveAudio:!n});if(await i.setLocalDescription(s),s.sdp){var c=(0,a.default)(s),d=n?void 0:{userId:"",sourceGroups:[{semantics:"FID",sources:[c.ssrc||0]}],isRemoved:n,isMain:!0,isVideo:!1,isPresentation:n,endpoint:n?"1":"0"},p=c["ssrc-groups"]&&{isPresentation:n,userId:"",sourceGroups:c["ssrc-groups"],isMain:!0,isVideo:!0,endpoint:n?"0":"1"};s=n?o.screenshareConference:o.conference;const i=[];n?(p&&i.push(p),d&&i.push(d)):(d&&i.push(d),p&&i.push(p)),d=e.find((e=>"audio"===e.getTracks()[0].kind)),p=e.find((e=>"video"===e.getTracks()[0].kind)),o={...o,...n?{screenshareConference:{...s,ssrcs:i}}:{conference:{...s,ssrcs:i}},streams:{...o.streams,[r]:{...o.streams?.[r],...d&&{audio:d},...!n&&p?{video:p}:{presentation:p}}}},u(r),t(c)}}}},{connection:i,dataChannel:r}}},"./src/types.ts":(e,t,n)=>{n.r(t)},"./src/utils.ts":(e,t,n)=>{function a(){var{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}n.r(t),n.d(t,{toTelegramSource:()=>function(e){return e<<0},fromTelegramSource:()=>function(e){return e>>>0},getAmplitude:()=>function(e,t=3){if(!e)return 0;var n=e.length;let a=0;for(let t=0;ta,THRESHOLD:()=>i,PLATFORM_ENV:()=>r,IS_MAC_OS:()=>s,IS_IOS:()=>o,IS_SCREENSHARE_SUPPORTED:()=>c,IS_ECHO_CANCELLATION_SUPPORTED:()=>d,IS_NOISE_SUPPRESSION_SUPPORTED:()=>p});const i=.1,r=a(),s="macOS"===r,o="iOS"===r,c="getDisplayMedia"in(navigator?.mediaDevices||{}),d=navigator?.mediaDevices?.getSupportedConstraints().echoCancellation,p=navigator?.mediaDevices?.getSupportedConstraints().noiseSuppression}},t={};function n(a){var i=t[a];return void 0!==i||(i=t[a]={exports:{}},e[a](i,i.exports,n)),i.exports}n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};(()=>{n.r(a),n.d(a,{handleUpdateGroupCallConnection:()=>e.handleUpdateGroupCallConnection,startSharingScreen:()=>e.startSharingScreen,joinGroupCall:()=>e.joinGroupCall,getDevices:()=>e.getDevices,getUserStreams:()=>e.getUserStreams,setVolume:()=>e.setVolume,isStreamEnabled:()=>e.isStreamEnabled,toggleStream:()=>e.toggleStream,leaveGroupCall:()=>e.leaveGroupCall,handleUpdateGroupCallParticipants:()=>e.handleUpdateGroupCallParticipants,switchCameraInput:()=>e.switchCameraInput,toggleSpeaker:()=>e.toggleSpeaker,toggleNoiseSuppression:()=>e.toggleNoiseSuppression,IS_SCREENSHARE_SUPPORTED:()=>t.IS_SCREENSHARE_SUPPORTED,THRESHOLD:()=>t.THRESHOLD});var e=n("./src/secretsauce.ts"),t=n("./src/utils.ts");n("./src/types.ts")})();var i,r=exports;for(i in a)r[i]=a[i];a.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})(); \ No newline at end of file +(()=>{"use strict";var e={"./src/blacksilence.ts":(e,t,a)=>{a.r(t),a.d(t,{silence:()=>n,black:()=>s});const n=e=>{const t=e.createOscillator(),a=t.connect(e.createMediaStreamDestination());return t.start(),new MediaStream([Object.assign(a.stream.getAudioTracks()[0],{enabled:!1})])},s=({width:e=640,height:t=480}={})=>{const a=Object.assign(document.createElement("canvas"),{width:e,height:t}),n=a.getContext("2d");if(!n)throw Error("Cannot create canvas ctx");n.fillRect(0,0,e,t);const s=a.captureStream();return new MediaStream([Object.assign(s.getVideoTracks()[0],{enabled:!1})])}},"./src/buildSdp.ts":(e,t,a)=>{a.r(t),a.d(t,{default:()=>s});var n=a("./src/utils.ts");const s=(e,t=!1,a=!1,s=!1)=>{const i=[],r=e=>{i.push(e)},{sessionId:o,ssrcs:c,audioExtensions:d,videoExtensions:p,audioPayloadTypes:u,videoPayloadTypes:l,transport:{ufrag:m,pwd:f,fingerprints:g,candidates:v}}=e;r("v=0"),r(`o=- ${o} 2 IN IP4 0.0.0.0`),r("s=-"),r("t=0 0"),r("a=ice-options:trickle"),r("a=msid-semantic:WMS *"),r(`a=group:BUNDLE ${c.map((e=>e.endpoint)).join(" ")}${a?"":" "+(s?"3":"2")}`),s||r("a=ice-lite");const S=e=>{if(e.sdpString)r(`a=${e.sdpString}`);else{let t="";t+="a=candidate:",t+=`${e.foundation} ${e.component} ${e.protocol} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`,"rel-addr"in e&&(t+=` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t+=` generation ${e.generation}`,r(t)}},y=()=>{r(`a=ice-ufrag:${m}`),r(`a=ice-pwd:${f}`),g.forEach((e=>{r(`a=fingerprint:${e.hash} ${e.fingerprint}`),r(`a=setup:${s?e.setup:"passive"}`)})),v.forEach(S)},h=e=>{const{channels:t,id:a,name:n,clockrate:s,parameters:i}=e;var o=t?`/${t}`:"";r(`a=rtpmap:${a} ${n}/${s}${o}`),i&&(o=Object.keys(i).map((e=>`${e}=${i[e]};`)).join(" "),r(`a=fmtp:${a} ${o}`)),e["rtcp-fbs"]?.forEach((e=>{r(`a=rtcp-fb:${a} ${e.type}${e.subtype?` ${e.subtype}`:""}`)}))};return e=e=>{const a=e.isVideo?l:u;var i=e.isVideo?"video":"audio";if(r(`m=${i} ${e.isMain?1:0} RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`),r("c=IN IP4 0.0.0.0"),r("b=AS:1300"),r(`a=mid:${e.endpoint}`),r("a=rtcp-mux"),a.forEach(h),r("a=rtcp:1 IN IP4 0.0.0.0"),e.isVideo&&r("a=rtcp-rsize"),(e.isVideo?p:d).forEach((({id:e,uri:t})=>{r(`a=extmap:${e} ${t}`)})),e.isRemoved)r("a=inactive");else{if(y(),s)r("a=sendrecv"),r("a=bundle-only");else{if(t)return void r("a=recvonly");e.isMain?r("a=sendrecv"):(r("a=sendonly"),r("a=bundle-only"))}e.sourceGroups.forEach((t=>{r(`a=ssrc-group:${t.semantics} ${t.sources.map(n.fromTelegramSource).join(" ")}`),t.sources.forEach((t=>{t=(0,n.fromTelegramSource)(t),r(`a=ssrc:${t} cname:${e.endpoint}`),r(`a=ssrc:${t} msid:${e.endpoint} ${e.endpoint}`),r(`a=ssrc:${t} mslabel:${e.endpoint}`),r(`a=ssrc:${t} label:${e.endpoint}`)}))}))}},s?c.filter(e):c.filter((e=>"0"===e.endpoint||"1"===e.endpoint)).map(e),a||(r("m=application 1 UDP/DTLS/SCTP webrtc-datachannel"),r("c=IN IP4 0.0.0.0"),y(),r("a=ice-options:trickle"),r("a=mid:"+(s?"3":a?"1":"2")),r("a=sctp-port:5000"),r("a=max-message-size:262144")),s||c.filter((e=>"0"!==e.endpoint&&"1"!==e.endpoint)).map(e),`${i.join("\n")}\n`}},"./src/p2p.ts":(e,t,a)=>{a.r(t),a.d(t,{getStreams:()=>function(){return o?.streams},switchCameraInputP2p:()=>async function(){if(o&&o.facingMode){const e=o.streams.ownVideo;if(e){const t=e.getTracks()[0];if(t){const e=o.connection.getSenders().find((e=>t.id===e.track?.id));if(e){o.facingMode="environment"===o.facingMode?"user":"environment";try{const t=await d("video",o.facingMode);await e.replaceTrack(t.getTracks()[0]),o.streams.ownVideo=t,c()}catch(e){}}}}}},toggleStreamP2p:()=>p,joinPhoneCall:()=>async function(e,t,a,i,r){const d=new RTCPeerConnection({iceServers:e.map((e=>({urls:[e.isTurn&&`turn:${e.ip}:${e.port}`,e.isStun&&`stun:${e.ip}:${e.port}`].filter(Boolean),username:e.username,credentialType:"password",credential:e.password}))),iceCandidatePoolSize:2}),u=(0,n.silence)(new AudioContext),l=(0,n.black)({width:640,height:480}),g=(0,n.black)({width:640,height:480});d.addTrack(u.getTracks()[0],u),d.addTrack(l.getTracks()[0],l),d.addTrack(g.getTracks()[0],g),d.onicecandidate=e=>{e.candidate&&t({"@type":"Candidates",candidates:[{sdpString:e.candidate.candidate}]})},d.onconnectionstatechange=()=>{r({"@type":"updatePhoneCallConnectionState",connectionState:d.connectionState})},d.ontrack=e=>{var t;o&&(t=e.streams[0],"audio"===e.track.kind?(o.audio.srcObject=t,o.audio.play().catch(),o.streams.audio=t):"1"===e.transceiver.mid?o.streams.video=t:o.streams.presentation=t,c())};const v=d.createDataChannel("data",{id:0,negotiated:!0});v.onmessage=e=>{f(JSON.parse(e.data))},e=new Audio,o={audio:e,connection:d,emitSignalingData:t,isOutgoing:a,candidates:[],onUpdate:r,streams:{ownVideo:l,ownAudio:u,ownPresentation:g},mediaState:{isBatteryLow:!1,screencastState:"inactive",videoState:"inactive",videoRotation:0,isMuted:!0},blackVideo:l,blackPresentation:g,silence:u,dataChannel:v};try{i&&p("video",!0),p("audio",!0)}catch(e){}a&&(a=await d.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0}),await d.setLocalDescription(a),m((0,s.default)(a,!0)))},stopPhoneCall:()=>function(){o&&(o.streams.ownVideo?.getTracks().forEach((e=>e.stop())),o.streams.ownPresentation?.getTracks().forEach((e=>e.stop())),o.streams.ownAudio?.getTracks().forEach((e=>e.stop())),o.dataChannel.close(),o.connection.close(),o=void 0)},processSignalingMessage:()=>f});var n=a("./src/blacksilence.ts"),s=a("./src/parseSdp.ts"),i=a("./src/utils.ts"),r=a("./src/buildSdp.ts");let o;function c(){o?.onUpdate({...o.mediaState,"@type":"updatePhoneCallMediaState"})}function d(e,t="user"){return"presentation"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...i.IS_ECHO_CANCELLATION_SUPPORTED&&{echoCancellation:!0},...i.IS_NOISE_SUPPRESSION_SUPPORTED&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}})}async function p(e,t){if(o){const a="audio"===e?o.streams.ownAudio:"video"===e?o.streams.ownVideo:o.streams.ownPresentation;if(a){const n=a.getTracks()[0];if(n){const a=o.connection.getSenders().find((e=>n.id===e.track?.id));if(a){t=void 0===t?!n.enabled:t;try{if(t&&!n.enabled){const t=await d(e);t.getTracks()[0].onended=()=>{p(e,!1)},await a.replaceTrack(t.getTracks()[0]),"audio"===e?o.streams.ownAudio=t:"video"===e?(o.streams.ownVideo=t,o.facingMode="user"):o.streams.ownPresentation=t,"video"!==e&&"presentation"!==e||p("video"===e?"presentation":"video",!1)}else if(!t&&n.enabled){n.stop();const t="audio"===e?o.silence:"video"===e?o.blackVideo:o.blackPresentation;if(!t)return;await a.replaceTrack(t.getTracks()[0]),"audio"===e?o.streams.ownAudio=t:"video"===e?o.streams.ownVideo=t:o.streams.ownPresentation=t}c(),u()}catch(e){}}}}}}function u(){if(o){const{emitSignalingData:e,streams:t}=o;e({"@type":"MediaState",videoRotation:0,isMuted:!t.ownAudio?.getTracks()[0].enabled,isBatteryLow:!0,videoState:t.ownVideo?.getTracks()[0].enabled?"active":"inactive",screencastState:t.ownPresentation?.getTracks()[0].enabled?"active":"inactive"})}}function l(e){if(!o||o.isOutgoing)return e;const t=e.payloadTypes;var a=t.findIndex((e=>"VP8"===e.name));const n=t[a];var s=t.findIndex((e=>Number(e.parameters?.apt)===n.id));return e.payloadTypes=[t[a],t[s]],e}function m(e){if(o){const t=o.emitSignalingData;e.ssrc&&e["ssrc-groups"]&&e["ssrc-groups"][0]&&e["ssrc-groups"][1]&&t({"@type":"InitialSetup",fingerprints:e.fingerprints,ufrag:e.ufrag,pwd:e.pwd,audio:{ssrc:(0,i.fromTelegramSource)(e.ssrc).toString(),ssrcGroups:[],payloadTypes:e.audioPayloadTypes,rtpExtensions:e.audioExtmap},video:l({ssrc:(0,i.fromTelegramSource)(e["ssrc-groups"][0].sources[0]).toString(),ssrcGroups:[{semantics:e["ssrc-groups"][0].semantics,ssrcs:e["ssrc-groups"][0].sources.map(i.fromTelegramSource)}],payloadTypes:e.videoPayloadTypes,rtpExtensions:e.videoExtmap}),screencast:l({ssrc:(0,i.fromTelegramSource)(e["ssrc-groups"][1].sources[0]).toString(),ssrcGroups:[{semantics:e["ssrc-groups"][1].semantics,ssrcs:e["ssrc-groups"][1].sources.map(i.fromTelegramSource)}],payloadTypes:e.screencastPayloadTypes,rtpExtensions:e.screencastExtmap})})}}async function f(e){if(o&&o.connection)switch(e["@type"]){case"MediaState":o.mediaState=e,c(),u();break;case"Candidates":var{candidates:t,gotInitialSetup:a}=o;if(!t)return;e.candidates.forEach((e=>{o.candidates.push(e.sdpString)})),a&&await Promise.all(o.candidates.map((e=>o.connection.addIceCandidate({candidate:e,sdpMLineIndex:0}))));break;case"InitialSetup":{const{connection:t,isOutgoing:n}=o;if(!t)return;if(a={transport:{candidates:[],ufrag:e.ufrag,pwd:e.pwd,fingerprints:e.fingerprints,"rtcp-mux":!1,xmlns:""},sessionId:Date.now(),ssrcs:[e.audio&&{isVideo:!1,isMain:!1,userId:"123",endpoint:"0",sourceGroups:[{semantics:"FID",sources:[e.audio.ssrc]}]},e.video&&{isVideo:!0,isPresentation:!1,isMain:!1,userId:"123",endpoint:"1",sourceGroups:e.video.ssrcGroups.map((e=>({semantics:e.semantics,sources:e.ssrcs})))},e.screencast&&{isVideo:!0,isPresentation:!0,isMain:!1,userId:"123",endpoint:"2",sourceGroups:e.screencast.ssrcGroups.map((e=>({semantics:e.semantics,sources:e.ssrcs})))}],audioPayloadTypes:e.audio.payloadTypes?.map(i.p2pPayloadTypeToConference)||[],audioExtensions:e.audio.rtpExtensions,videoPayloadTypes:l(e.video).payloadTypes?.map(i.p2pPayloadTypeToConference)||[],videoExtensions:e.video.rtpExtensions},await t.setRemoteDescription({sdp:(0,r.default)(a,n,void 0,!0),type:n?"answer":"offer"}),o.conference=a,!n){if(a=await t.createAnswer(),!a)return;await t.setLocalDescription(a),m((0,s.default)(a,!0))}o.gotInitialSetup=!0,await Promise.all(o.candidates.map((e=>t.addIceCandidate({candidate:e,sdpMLineIndex:0}))));break}}}},"./src/p2pMessage.ts":(e,t,a)=>{a.r(t)},"./src/parseSdp.ts":(e,t,a)=>{a.r(t),a.d(t,{default:()=>s});var n=a("./src/utils.ts");const s=(e,t=!1)=>{if(!e||!e.sdp)throw Error("Failed parsing SDP: session description is null");const a=e.sdp.split("\r\nm=").map(((e,t)=>0===t?e:`m=${e}`)).reduce(((e,t)=>{var a=t.match(/^m=(.+?)\s/)?.[1]||"header";return e[e.hasOwnProperty(a)&&"video"===a?"screencast":a]=t.split("\r\n").filter(Boolean),e}),{});var s=(e,t)=>t?a[t]?.find((t=>t.startsWith(e)))?.substr(e.length):Object.values(a).map((t=>t.find((t=>t.startsWith(e)))?.substr(e.length))).filter(Boolean)[0],i=e=>a[e].filter((e=>e.startsWith("a=extmap"))).map((e=>{var[,t,e]=e.match(/extmap:(\d+)(?:\/.+)?\s(.+)/);return{id:Number(t),uri:e}})),r=e=>{const t=a[e].filter((e=>e.startsWith("a=rtpmap"))).map((e=>{const[,t,a]=e.match(/:(\d+)\s(.+)/)||[];var[n,s,e]=a.split("/");return{id:Number(t),name:n,clockrate:Number(s),...e&&{channels:Number(e)}}})),n=a[e].filter((e=>e.startsWith("a=rtcp-fb"))).map((e=>{const[,t,a]=e.match(/:(\d+)\s(.+)/)||[];var[n,e]=a.split(" ");return{id:Number(t),type:n,subtype:e||""}})),s=a[e].filter((e=>e.startsWith("a=fmtp"))).map((e=>{const[,t,a]=e.match(/:(\d+)\s(.+)/)||[];if(e=a.split(";").reduce(((e,t)=>{var[a,t]=t.split("=");return e[a]=t,e}),{}),!Object.values(e).some((e=>!e)))return{id:Number(t),data:e}})).filter(Boolean);return t.map((e=>{var t=s.filter((t=>t.id===e.id)).map((e=>e.data)).reduce(((e,t)=>Object.assign(e,t)),{}),a=n.filter((t=>t.id===e.id)).map((e=>({type:e.type,subtype:e.subtype})));return{...e,...0{a.r(t),a.d(t,{getDevices:()=>async function(e,t=!0){return(await navigator.mediaDevices.enumerateDevices()).filter((a=>a.kind===`${e}${t?"input":"output"}`))},toggleSpeaker:()=>function(){o&&(o.isSpeakerDisabled=!o.isSpeakerDisabled,o?.onUpdate?.({"@type":"updateGroupCallConnectionState",connectionState:"connected",isSpeakerDisabled:o.isSpeakerDisabled}),o.participantFunctions&&Object.values(o.participantFunctions).forEach((e=>{e.toggleMute?.(!!o?.isSpeakerDisabled)})))},toggleNoiseSuppression:()=>function(){if(o&&o.myId&&o.streams){const a=o.streams[o.myId].audio;if(a){const n=a.getTracks()[0];var e,t;n&&(({echoCancellation:e,noiseSuppression:t}=n.getConstraints()),n.applyConstraints({echoCancellation:!e,noiseSuppression:!t}))}}},getUserStreams:()=>d,setVolume:()=>function(e,t){const a=o?.participantFunctions?.[e];a&&a.setVolume?.(t)},isStreamEnabled:()=>p,switchCameraInput:()=>async function(){if(o?.myId&&o.connection&&o.streams&&o.facingMode){const e=d(o.myId)?.video;if(e){const t=e.getTracks()[0];if(t){const e=o.connection.getSenders().find((e=>t.id===e.track?.id));if(e){o.facingMode="environment"===o.facingMode?"user":"environment";try{const t=await l("video",o.facingMode);await e.replaceTrack(t.getTracks()[0]),o.streams[o.myId].video=t}catch(e){}}}}}},toggleStream:()=>m,leaveGroupCall:()=>g,handleUpdateGroupCallParticipants:()=>async function(e){if(o){const{participants:n,conference:i,connection:r,myId:c}=o;if(n&&i&&r&&i.ssrcs&&i.transport&&c)if(e.find((e=>e.isSelf&&e.source!==o?.conference?.ssrcs?.find((e=>e.isMain&&!e.isVideo))?.sourceGroups[0].sources[0])))g();else{const n=[];if(e.forEach((e=>{if(e.isSelf)e.isMuted&&!e.canSelfUnmute&&(m("audio",!1),m("video",!1),m("presentation",!1));else{var t=e.isLeft;const a=e.isMuted||e.isMutedByMe,s=!e.isVideoJoined||!e.video||t,r=!e.presentation||t;let o=!1,c=!1,d=!1;i.ssrcs.filter((t=>t.userId===e.id)).forEach((t=>{t.isVideo||(t.sourceGroups[0].sources[0]===e.source&&(c=!0),t.isRemoved=a),t.isVideo&&(t.isPresentation||(e.video&&t.endpoint===e.video.endpoint&&(o=!0),t.isRemoved=s),t.isPresentation&&(e.presentation&&t.endpoint===e.presentation.endpoint&&(d=!0),t.isRemoved=r))})),a||c||i.ssrcs.push({userId:e.id,isMain:!1,endpoint:`audio${e.source}`,isVideo:!1,sourceGroups:[{semantics:"FID",sources:[e.source]}]}),s||o||!e.video||(n.push(e.video.endpoint),i.ssrcs.push({userId:e.id,isMain:!1,endpoint:e.video.endpoint,isVideo:!0,sourceGroups:e.video.sourceGroups})),r||d||!e.presentation||i.ssrcs.push({isPresentation:!0,userId:e.id,isMain:!1,endpoint:e.presentation.endpoint,isVideo:!0,sourceGroups:e.presentation.sourceGroups})}})),o.updatingParticipantsQueue)o.updatingParticipantsQueue.push(i);else{o.updatingParticipantsQueue=[],e=(0,s.default)(i),await r.setRemoteDescription({type:"offer",sdp:e});try{var t=await r.createAnswer();if(await r.setLocalDescription(t),u(c),0async function(e,t){if(o){var a=t?o.screenshareConference:o.conference;const i=t?o.screenshareConnection:o.connection;if(a&&i&&a.ssrcs){var n=Date.now();e={...a,transport:e.transport,sessionId:n,audioExtensions:e.audio?.["rtp-hdrexts"],audioPayloadTypes:e.audio?.["payload-types"],videoExtensions:e.video?.["rtp-hdrexts"],videoPayloadTypes:e.video?.["payload-types"]};o={...o,...t?{screenshareConference:e}:{conference:e}};try{await i.setRemoteDescription({type:"answer",sdp:(0,s.default)(e,!0,t)})}catch(e){console.error(e)}}}},startSharingScreen:()=>async function(){if(o)try{const e=await l("presentation");return e?(e.getTracks()[0].onended=()=>{o&&o.myId&&(o.streams?.[o.myId].presentation,u(o.myId),c())},new Promise((t=>{var{connection:a,dataChannel:t}=y([e],t,!0);o={...o,screenshareConnection:a,screenshareDataChannel:t}}))):void 0}catch(e){return}},joinGroupCall:()=>function(e,t,a,n){if(o)throw Error("Already in call");f("connecting");var s=new MediaStream;return a.srcObject=s,a.play().catch((e=>console.warn(e))),o={onUpdate:n,participants:[],myId:e,speaking:{},silence:(0,i.silence)(t),black:(0,i.black)({width:640,height:480}),analyserInterval:setInterval(v,1e3),audioElement:a,audioContext:t,mediaStream:s},new Promise((e=>{o={...o,...y([o.silence,o.black],e)}}))}});var n=a("./src/parseSdp.ts"),s=a("./src/buildSdp.ts"),i=a("./src/blacksilence.ts"),r=a("./src/utils.ts");let o;function c(e){o&&(o.screenshareDataChannel?.close(),o.screenshareConnection?.close(),e||o.onUpdate?.({"@type":"updateGroupCallLeavePresentation"}))}function d(e){return o?.streams?.[e]}function p(e,t){const a=(t=t||o?.myId)&&d(t)?.[e];return!!a&&a.getTracks()[0]?.enabled}function u(e){o?.onUpdate?.({"@type":"updateGroupCallStreams",userId:e,hasAudioStream:p("audio",e),hasVideoStream:p("video",e),hasPresentationStream:p("presentation",e),amplitude:o.speaking?.[e]})}function l(e,t="user"){return"presentation"===e?navigator.mediaDevices.getDisplayMedia({audio:!1,video:!0}):navigator.mediaDevices.getUserMedia({audio:"audio"===e&&{...r.IS_ECHO_CANCELLATION_SUPPORTED&&{echoCancellation:!0},...r.IS_NOISE_SUPPRESSION_SUPPORTED&&{noiseSuppression:!0}},video:"video"===e&&{facingMode:t}})}async function m(e,t){if(o&&o.myId&&o.connection&&o.streams){const a=d(o.myId)?.[e];if(a){const n=a.getTracks()[0];if(n){const a=[...o.connection.getSenders(),...o.screenshareConnection?.getSenders()||[]].find((e=>n.id===e.track?.id));if(a){t=void 0===t?!n.enabled:t;try{if(t&&!n.enabled){const t=await l(e);if(await a.replaceTrack(t.getTracks()[0]),o.streams[o.myId][e]=t,"video"===e)o.facingMode="user";else if("audio"===e){const e=o.audioContext;if(!e)return;const a=e.createMediaStreamSource(t),n=e.createAnalyser();n.minDecibels=-100,n.maxDecibels=-30,n.smoothingTimeConstant=.05,n.fftSize=1024,a.connect(n),o={...o,participantFunctions:{...o.participantFunctions,[o.myId]:{...o.participantFunctions?.[o.myId],getCurrentAmplitude:()=>{var e=new Uint8Array(n.frequencyBinCount);return n.getByteFrequencyData(e),(0,r.getAmplitude)(e,1.5)}}}}}}else if(!t&&n.enabled){n.stop();const t="audio"===e?o.silence:o.black;if(!t)return;await a.replaceTrack(t.getTracks()[0]),o.streams[o.myId][e]=t,"video"===e&&(o.facingMode=void 0)}u(o.myId),"presentation"!==e||t||c(!0)}catch(e){}}}}}}function f(e){o?.onUpdate?.({"@type":"updateGroupCallConnectionState",connectionState:e})}function g(){o&&(o.myId&&o.streams?.[o.myId]&&Object.values(o.streams[o.myId]||{}).forEach((e=>{e?.getTracks().forEach((e=>{e.stop()}))})),c(!0),o.dataChannel?.close(),o.connection?.close(),f("disconnected"),o.analyserInterval&&clearInterval(o.analyserInterval),o=void 0)}function v(){o&&o.participantFunctions&&Object.keys(o.participantFunctions).forEach((e=>{const t=o.participantFunctions[Number(e)].getCurrentAmplitude;var a,n;t&&(a=t(),n=o.speaking[e]||0,((o.speaking[e]=a)>r.THRESHOLD&&n<=r.THRESHOLD||a<=r.THRESHOLD&&n>r.THRESHOLD)&&u(e))}))}function S(e){if(o&&o.audioElement&&o.audioContext&&o.mediaStream){var t=o.conference?.ssrcs?.find((t=>t.endpoint===e.track.id));if(t&&t.userId){const{userId:n,isPresentation:s}=t;var a=o.participants?.find((e=>e.id===n));const i="video"===e.track.kind?s?"presentation":"video":"audio";if(e.track.onended=()=>{o?.streams?.[n][i],u(n)},t=e.streams[0],"audio"===e.track.kind){const e=o.mediaStream,s=new window.AudioContext,i=s.createMediaStreamSource(t),c=s.createGain();c.gain.value=(a?.volume||1e4)/1e4;const d=s.createGain();c.gain.value=1;const p=s.createAnalyser();p.minDecibels=-100,p.maxDecibels=-30,p.smoothingTimeConstant=.05,p.fftSize=1024,i.connect(p).connect(d).connect(c).connect(s.destination),e.addTrack(i.mediaStream.getAudioTracks()[0]);const u=new Audio;u.srcObject=t,u.muted=!0,u.remove(),o={...o,participantFunctions:{...o.participantFunctions,[n]:{...o.participantFunctions?.[n],setVolume:e=>{c.gain.value=1{d.gain.value=e?0:1},getCurrentAmplitude:()=>{var e=new Uint8Array(p.frequencyBinCount);return p.getByteFrequencyData(e),(0,r.getAmplitude)(e,1.5)}}}}}o={...o,streams:{...o.streams,[n]:{...o.streams?.[n],[i]:t}}},u(n)}}}function y(e,t,a=!1){const s=new RTCPeerConnection;var i=a?void 0:function(e){const t=e.createDataChannel("data",{id:0});return t.onopen=()=>{},t.onmessage=e=>{JSON.parse(e.data).colibriClass},t.onerror=e=>{console.log("%conerror","background: green; font-size: 5em"),console.error(e)},t}(s);return e.forEach((e=>e.getTracks().forEach((t=>{s.addTrack(t,e)})))),a||(s.oniceconnectionstatechange=()=>{var e=s.iceConnectionState;"connected"===e||"completed"===e?f("connected"):"checking"===e||"new"===e?f("connecting"):"disconnected"===s.iceConnectionState&&f("reconnecting")}),s.ontrack=S,s.onnegotiationneeded=async()=>{if(o){var i=o.myId;if(i){var r=await s.createOffer({offerToReceiveVideo:!0,offerToReceiveAudio:!a});if(await s.setLocalDescription(r),r.sdp){var c=(0,n.default)(r),d=a?void 0:{userId:"",sourceGroups:[{semantics:"FID",sources:[c.ssrc||0]}],isRemoved:a,isMain:!0,isVideo:!1,isPresentation:a,endpoint:a?"1":"0"},p=c["ssrc-groups"]&&{isPresentation:a,userId:"",sourceGroups:c["ssrc-groups"],isMain:!0,isVideo:!0,endpoint:a?"0":"1"};r=a?o.screenshareConference:o.conference;const s=[];a?(p&&s.push(p),d&&s.push(d)):(d&&s.push(d),p&&s.push(p)),d=e.find((e=>"audio"===e.getTracks()[0].kind)),p=e.find((e=>"video"===e.getTracks()[0].kind)),o={...o,...a?{screenshareConference:{...r,ssrcs:s}}:{conference:{...r,ssrcs:s}},streams:{...o.streams,[i]:{...o.streams?.[i],...d&&{audio:d},...!a&&p?{video:p}:{presentation:p}}}},u(i),t(c)}}}},{connection:s,dataChannel:i}}},"./src/types.ts":(e,t,a)=>{a.r(t)},"./src/utils.ts":(e,t,a)=>{a.r(t),a.d(t,{toTelegramSource:()=>function(e){return e<<0},fromTelegramSource:()=>function(e){return e>>>0},getAmplitude:()=>function(e,t=3){if(!e)return 0;var a=e.length;let n=0;for(let t=0;tfunction(e){return{id:e.id,name:e.name,"rtcp-fbs":e.feedbackTypes,clockrate:e.clockrate,parameters:e.parameters,channels:e.channels}},THRESHOLD:()=>n,IS_SCREENSHARE_SUPPORTED:()=>s,IS_ECHO_CANCELLATION_SUPPORTED:()=>i,IS_NOISE_SUPPRESSION_SUPPORTED:()=>r});const n=.1,s="getDisplayMedia"in(navigator?.mediaDevices||{}),i=navigator?.mediaDevices?.getSupportedConstraints().echoCancellation,r=navigator?.mediaDevices?.getSupportedConstraints().noiseSuppression}},t={};function a(n){var s=t[n];return void 0!==s||(s=t[n]={exports:{}},e[n](s,s.exports,a)),s.exports}a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{a.r(n),a.d(n,{handleUpdateGroupCallConnection:()=>e.handleUpdateGroupCallConnection,startSharingScreen:()=>e.startSharingScreen,joinGroupCall:()=>e.joinGroupCall,getDevices:()=>e.getDevices,getUserStreams:()=>e.getUserStreams,setVolume:()=>e.setVolume,isStreamEnabled:()=>e.isStreamEnabled,toggleStream:()=>e.toggleStream,leaveGroupCall:()=>e.leaveGroupCall,handleUpdateGroupCallParticipants:()=>e.handleUpdateGroupCallParticipants,switchCameraInput:()=>e.switchCameraInput,toggleSpeaker:()=>e.toggleSpeaker,toggleNoiseSuppression:()=>e.toggleNoiseSuppression,joinPhoneCall:()=>t.joinPhoneCall,processSignalingMessage:()=>t.processSignalingMessage,getStreams:()=>t.getStreams,toggleStreamP2p:()=>t.toggleStreamP2p,stopPhoneCall:()=>t.stopPhoneCall,switchCameraInputP2p:()=>t.switchCameraInputP2p,IS_SCREENSHARE_SUPPORTED:()=>s.IS_SCREENSHARE_SUPPORTED,THRESHOLD:()=>s.THRESHOLD});var e=a("./src/secretsauce.ts"),t=a("./src/p2p.ts"),s=(a("./src/p2pMessage.ts"),a("./src/utils.ts"));a("./src/types.ts")})();var s,i=exports;for(s in n)i[s]=n[s];n.__esModule&&Object.defineProperty(i,"__esModule",{value:!0})})(); \ No newline at end of file diff --git a/src/lib/secret-sauce/p2p.d.ts b/src/lib/secret-sauce/p2p.d.ts new file mode 100644 index 000000000..3e646493b --- /dev/null +++ b/src/lib/secret-sauce/p2p.d.ts @@ -0,0 +1,16 @@ +import { ApiPhoneCallConnection } from './types'; +import { P2pMessage } from './p2pMessage'; +import { StreamType } from './secretsauce'; +export declare function getStreams(): { + video?: MediaStream | undefined; + audio?: MediaStream | undefined; + presentation?: MediaStream | undefined; + ownAudio?: MediaStream | undefined; + ownVideo?: MediaStream | undefined; + ownPresentation?: MediaStream | undefined; +} | undefined; +export declare function switchCameraInputP2p(): Promise; +export declare function toggleStreamP2p(streamType: StreamType, value?: boolean | undefined): Promise; +export declare function joinPhoneCall(connections: ApiPhoneCallConnection[], emitSignalingData: (data: P2pMessage) => void, isOutgoing: boolean, shouldStartVideo: boolean, onUpdate: (...args: any[]) => void): Promise; +export declare function stopPhoneCall(): void; +export declare function processSignalingMessage(message: P2pMessage): Promise; diff --git a/src/lib/secret-sauce/p2pMessage.d.ts b/src/lib/secret-sauce/p2pMessage.d.ts new file mode 100644 index 000000000..ace6969e4 --- /dev/null +++ b/src/lib/secret-sauce/p2pMessage.d.ts @@ -0,0 +1,47 @@ +import { Fingerprint, RTCPFeedbackParam, RTPExtension } from './types'; +export declare type VideoState = 'inactive' | 'active' | 'suspended'; +export declare type VideoRotation = 0 | 90 | 180 | 270; +export declare type MediaStateMessage = { + '@type': 'MediaState'; + isMuted: boolean; + videoState: VideoState; + videoRotation: VideoRotation; + screencastState: VideoState; + isBatteryLow: boolean; +}; +declare type CandidatesMessage = { + '@type': 'Candidates'; + candidates: P2pCandidate[]; +}; +export declare type InitialSetupMessage = { + '@type': 'InitialSetup'; + ufrag: string; + pwd: string; + fingerprints: Fingerprint[]; + audio?: MediaContent; + video?: MediaContent; + screencast?: MediaContent; +}; +export declare type MediaContent = { + ssrc: string; + ssrcGroups: P2pSsrcGroup[]; + payloadTypes: P2PPayloadType[]; + rtpExtensions: RTPExtension[]; +}; +export interface P2PPayloadType { + id: number; + name: string; + clockrate: number; + channels: number; + parameters?: Record; + feedbackTypes?: RTCPFeedbackParam[]; +} +declare type P2pSsrcGroup = { + semantics: string; + ssrcs: number[]; +}; +declare type P2pCandidate = { + sdpString: string; +}; +export declare type P2pMessage = CandidatesMessage | InitialSetupMessage | MediaStateMessage; +export {}; diff --git a/src/lib/secret-sauce/parseSdp.d.ts b/src/lib/secret-sauce/parseSdp.d.ts index d789bd62d..1d3c0246d 100644 --- a/src/lib/secret-sauce/parseSdp.d.ts +++ b/src/lib/secret-sauce/parseSdp.d.ts @@ -1,3 +1,3 @@ import { JoinGroupCallPayload } from './types'; -declare const _default: (sessionDescription: RTCSessionDescriptionInit) => JoinGroupCallPayload; +declare const _default: (sessionDescription: RTCSessionDescriptionInit, isP2p?: boolean) => JoinGroupCallPayload; export default _default; diff --git a/src/lib/secret-sauce/secretsauce.d.ts b/src/lib/secret-sauce/secretsauce.d.ts index 8d3829af9..10f35f456 100644 --- a/src/lib/secret-sauce/secretsauce.d.ts +++ b/src/lib/secret-sauce/secretsauce.d.ts @@ -1,5 +1,5 @@ import { GroupCallConnectionData, GroupCallParticipant, JoinGroupCallPayload } from './types'; -declare type StreamType = 'audio' | 'video' | 'presentation'; +export declare type StreamType = 'audio' | 'video' | 'presentation'; export declare function getDevices(streamType: StreamType, isInput?: boolean): Promise; export declare function toggleSpeaker(): void; export declare function toggleNoiseSuppression(): void; @@ -17,4 +17,3 @@ export declare function handleUpdateGroupCallParticipants(updatedParticipants: G export declare function handleUpdateGroupCallConnection(data: GroupCallConnectionData, isPresentation: boolean): Promise; export declare function startSharingScreen(): Promise; export declare function joinGroupCall(myId: string, audioContext: AudioContext, audioElement: HTMLAudioElement, onUpdate: (...args: any[]) => void): Promise; -export {}; diff --git a/src/lib/secret-sauce/types.d.ts b/src/lib/secret-sauce/types.d.ts index 57029540f..88f5af42f 100644 --- a/src/lib/secret-sauce/types.d.ts +++ b/src/lib/secret-sauce/types.d.ts @@ -1,3 +1,4 @@ +import { P2PPayloadType } from './p2pMessage'; export interface GroupCallParticipant { isSelf?: boolean; isMuted?: boolean; @@ -52,6 +53,7 @@ export declare type Candidate = { network: string; 'rel-addr': string; 'rel-port': string; + sdpString?: string; }; export declare type JoinGroupCallPayload = { ufrag: string; @@ -60,6 +62,14 @@ export declare type JoinGroupCallPayload = { ssrc?: number; 'ssrc-groups'?: SsrcGroup[]; }; +export declare type P2pParsedSdp = JoinGroupCallPayload & { + audioExtmap: RTPExtension[]; + videoExtmap: RTPExtension[]; + screencastExtmap: RTPExtension[]; + audioPayloadTypes: P2PPayloadType[]; + videoPayloadTypes: P2PPayloadType[]; + screencastPayloadTypes: P2PPayloadType[]; +}; export interface RTPExtension { id: number; uri: string; @@ -98,3 +108,19 @@ export interface GroupCallConnectionData { }; stream?: boolean; } +export interface ApiPhoneCallConnection { + username: string; + password: string; + isTurn?: boolean; + isStun?: boolean; + ip: string; + ipv6: string; + port: number; +} +export interface ApiCallProtocol { + libraryVersions: string[]; + minLayer: number; + maxLayer: number; + isUdpP2p?: boolean; + isUdpReflector?: boolean; +} diff --git a/src/lib/secret-sauce/utils.d.ts b/src/lib/secret-sauce/utils.d.ts index 2540de229..bd0cd6662 100644 --- a/src/lib/secret-sauce/utils.d.ts +++ b/src/lib/secret-sauce/utils.d.ts @@ -1,11 +1,10 @@ +import { P2PPayloadType } from './p2pMessage'; +import { PayloadType } from './types'; export declare function toTelegramSource(source: number): number; export declare function fromTelegramSource(source: number): number; export declare function getAmplitude(array: Uint8Array, scale?: number): number; -export declare function getPlatform(): "Windows" | "macOS" | "iOS" | "Android" | "Linux" | undefined; +export declare function p2pPayloadTypeToConference(p: P2PPayloadType): PayloadType; export declare const THRESHOLD = 0.1; -export declare const PLATFORM_ENV: "Windows" | "macOS" | "iOS" | "Android" | "Linux" | undefined; -export declare const IS_MAC_OS: boolean; -export declare const IS_IOS: boolean; export declare const IS_SCREENSHARE_SUPPORTED: boolean; export declare const IS_ECHO_CANCELLATION_SUPPORTED: boolean | undefined; export declare const IS_NOISE_SUPPRESSION_SUPPORTED: any; diff --git a/src/styles/Telegram T.json b/src/styles/Telegram T.json index f08d01098..bfe028fd5 100644 --- a/src/styles/Telegram T.json +++ b/src/styles/Telegram T.json @@ -2,7 +2,7 @@ "metadata": { "name": "Telegram T", "lastOpened": 0, - "created": 1648282440794 + "created": 1648554659780 }, "iconSets": [ { @@ -157,13 +157,37 @@ }, { "selection": [ + { + "order": 705, + "id": 53, + "name": "favorite-filled", + "prevSize": 32, + "code": 59800, + "tempChar": "" + }, + { + "order": 702, + "id": 52, + "name": "share-screen", + "prevSize": 32, + "code": 59770, + "tempChar": "" + }, + { + "order": 701, + "id": 51, + "name": "video-outlined", + "prevSize": 32, + "code": 59799, + "tempChar": "" + }, { "order": 700, "id": 50, "name": "stats", "prevSize": 32, "code": 59798, - "tempChar": "" + "tempChar": "" }, { "order": 699, @@ -171,7 +195,7 @@ "name": "copy-media", "prevSize": 32, "code": 59797, - "tempChar": "" + "tempChar": "" }, { "order": 698, @@ -179,7 +203,7 @@ "name": "reaction-filled", "prevSize": 32, "code": 59796, - "tempChar": "" + "tempChar": "" }, { "order": 695, @@ -187,15 +211,15 @@ "name": "reactions", "prevSize": 32, "code": 59795, - "tempChar": "" + "tempChar": "" }, { - "order": 693, + "order": 704, "id": 46, "name": "sidebar", "prevSize": 32, "code": 59794, - "tempChar": "" + "tempChar": "" }, { "order": 690, @@ -203,7 +227,7 @@ "name": "video-stop", "prevSize": 32, "code": 59787, - "tempChar": "" + "tempChar": "" }, { "order": 678, @@ -211,7 +235,7 @@ "name": "speaker", "prevSize": 32, "code": 59777, - "tempChar": "" + "tempChar": "" }, { "order": 679, @@ -219,7 +243,7 @@ "name": "speaker-outline", "prevSize": 32, "code": 59778, - "tempChar": "" + "tempChar": "" }, { "order": 680, @@ -227,7 +251,7 @@ "name": "phone-discard-outline", "prevSize": 32, "code": 59779, - "tempChar": "" + "tempChar": "" }, { "order": 681, @@ -235,7 +259,7 @@ "name": "allow-speak", "prevSize": 32, "code": 59780, - "tempChar": "" + "tempChar": "" }, { "order": 682, @@ -243,15 +267,15 @@ "name": "stop-raising-hand", "prevSize": 32, "code": 59781, - "tempChar": "" + "tempChar": "" }, { "order": 683, "id": 39, - "name": "share-screen", + "name": "share-screen-outlined", "prevSize": 32, "code": 59782, - "tempChar": "" + "tempChar": "" }, { "order": 684, @@ -259,7 +283,7 @@ "name": "voice-chat", "prevSize": 32, "code": 59783, - "tempChar": "" + "tempChar": "" }, { "order": 689, @@ -267,7 +291,7 @@ "name": "video", "prevSize": 32, "code": 59784, - "tempChar": "" + "tempChar": "" }, { "order": 686, @@ -275,15 +299,15 @@ "name": "noise-suppression", "prevSize": 32, "code": 59785, - "tempChar": "" + "tempChar": "" }, { - "order": 688, + "order": 703, "id": 35, "name": "phone-discard", "prevSize": 32, "code": 59786, - "tempChar": "" + "tempChar": "" }, { "order": 667, @@ -291,7 +315,7 @@ "name": "bot-commands-filled", "prevSize": 32, "code": 59775, - "tempChar": "" + "tempChar": "" }, { "order": 664, @@ -299,7 +323,7 @@ "name": "reply-filled", "prevSize": 32, "code": 59776, - "tempChar": "" + "tempChar": "" }, { "order": 656, @@ -307,7 +331,7 @@ "name": "bug", "prevSize": 32, "code": 59774, - "tempChar": "" + "tempChar": "" }, { "order": 619, @@ -315,7 +339,7 @@ "name": "data", "prevSize": 32, "code": 59773, - "tempChar": "" + "tempChar": "" }, { "order": 622, @@ -323,7 +347,7 @@ "name": "darkmode", "prevSize": 32, "code": 59769, - "tempChar": "" + "tempChar": "" }, { "order": 0, @@ -339,7 +363,7 @@ "name": "enter", "prevSize": 32, "code": 59771, - "tempChar": "" + "tempChar": "" }, { "order": 627, @@ -347,7 +371,7 @@ "name": "fontsize", "prevSize": 32, "code": 59772, - "tempChar": "" + "tempChar": "" }, { "order": 630, @@ -355,7 +379,7 @@ "name": "permissions", "prevSize": 32, "code": 59766, - "tempChar": "" + "tempChar": "" }, { "order": 631, @@ -363,7 +387,7 @@ "name": "card", "prevSize": 32, "code": 59767, - "tempChar": "" + "tempChar": "" }, { "order": 634, @@ -371,7 +395,7 @@ "name": "truck", "prevSize": 32, "code": 59768, - "tempChar": "" + "tempChar": "" }, { "order": 663, @@ -379,7 +403,7 @@ "name": "share-filled", "prevSize": 32, "code": 59738, - "tempChar": "" + "tempChar": "" }, { "order": 638, @@ -387,7 +411,7 @@ "name": "bold", "prevSize": 32, "code": 59745, - "tempChar": "" + "tempChar": "" }, { "order": 639, @@ -395,7 +419,7 @@ "name": "bot-command", "prevSize": 32, "code": 59746, - "tempChar": "" + "tempChar": "" }, { "order": 642, @@ -403,7 +427,7 @@ "name": "calendar-filter", "prevSize": 32, "code": 59747, - "tempChar": "" + "tempChar": "" }, { "order": 643, @@ -411,7 +435,7 @@ "name": "comments", "prevSize": 32, "code": 59748, - "tempChar": "" + "tempChar": "" }, { "order": 645, @@ -419,7 +443,7 @@ "name": "comments-sticker", "prevSize": 32, "code": 59749, - "tempChar": "" + "tempChar": "" }, { "order": 646, @@ -427,7 +451,7 @@ "name": "arrow-down", "prevSize": 32, "code": 59750, - "tempChar": "" + "tempChar": "" }, { "order": 668, @@ -435,7 +459,7 @@ "name": "email", "prevSize": 32, "code": 59751, - "tempChar": "" + "tempChar": "" }, { "order": 648, @@ -443,7 +467,7 @@ "name": "italic", "prevSize": 32, "code": 59752, - "tempChar": "" + "tempChar": "" }, { "order": 620, @@ -451,7 +475,7 @@ "name": "link", "prevSize": 32, "code": 59753, - "tempChar": "" + "tempChar": "" }, { "order": 621, @@ -459,7 +483,7 @@ "name": "mention", "prevSize": 32, "code": 59754, - "tempChar": "" + "tempChar": "" }, { "order": 624, @@ -467,7 +491,7 @@ "name": "monospace", "prevSize": 32, "code": 59755, - "tempChar": "" + "tempChar": "" }, { "order": 625, @@ -475,7 +499,7 @@ "name": "next", "prevSize": 32, "code": 59756, - "tempChar": "" + "tempChar": "" }, { "order": 628, @@ -483,7 +507,7 @@ "name": "password-off", "prevSize": 32, "code": 59757, - "tempChar": "" + "tempChar": "" }, { "order": 629, @@ -491,7 +515,7 @@ "name": "pin-list", "prevSize": 32, "code": 59758, - "tempChar": "" + "tempChar": "" }, { "order": 632, @@ -499,7 +523,7 @@ "name": "previous", "prevSize": 32, "code": 59759, - "tempChar": "" + "tempChar": "" }, { "order": 633, @@ -507,7 +531,7 @@ "name": "replace", "prevSize": 32, "code": 59760, - "tempChar": "" + "tempChar": "" }, { "order": 636, @@ -515,7 +539,7 @@ "name": "schedule", "prevSize": 32, "code": 59761, - "tempChar": "" + "tempChar": "" }, { "order": 691, @@ -523,7 +547,7 @@ "name": "strikethrough", "prevSize": 32, "code": 59762, - "tempChar": "" + "tempChar": "" }, { "order": 692, @@ -531,7 +555,7 @@ "name": "underlined", "prevSize": 32, "code": 59763, - "tempChar": "" + "tempChar": "" }, { "order": 641, @@ -539,7 +563,7 @@ "name": "zoom-in", "prevSize": 32, "code": 59764, - "tempChar": "" + "tempChar": "" }, { "order": 649, @@ -547,7 +571,7 @@ "name": "zoom-out", "prevSize": 32, "code": 59765, - "tempChar": "" + "tempChar": "" } ], "id": 2, @@ -561,6 +585,51 @@ "height": 1024, "prevSize": 32, "icons": [ + { + "id": 53, + "paths": [ + "M1004.533 455.333l-222.4 194 66.8 288.267c2.933 12.533 1.467 25.6-3.867 37.067l-3.067 5.6c-16.533 27.067-51.733 35.733-78.8 19.2l-251.2-152.533-251.2 152.667c-10.933 6.667-23.867 9.467-36.4 8l-6.267-1.067c-30.933-7.2-50.133-38-42.933-68.933l66.667-288.267-222.4-194c-9.6-8.4-16.133-19.733-18.533-32.133l-0.933-6.267c-2.667-31.6 20.667-59.333 52.267-62.133l292.533-24.933 114.4-271.6c4.933-11.867 13.733-21.6 24.933-27.867l5.733-2.8c29.2-12.267 62.8 1.467 75.2 30.667l114.267 271.6 292.533 24.933c12.667 1.067 24.667 6.4 34 14.933l4.4 4.533c20.667 24 18.133 60.267-5.733 81.067z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "favorite-filled" + ] + }, + { + "id": 52, + "paths": [ + "M42.667 358.4c0-95.582 0-143.373 18.601-179.881 16.363-32.113 42.471-58.222 74.584-74.584 36.508-18.601 84.299-18.601 179.881-18.601h307.2c95.582 0 143.373 0 179.883 18.601 32.111 16.363 58.219 42.471 74.581 74.584 18.603 36.508 18.603 84.299 18.603 179.881v136.533c0 9.178 0 17.911-0.017 26.24l-57.766-53.389c-16.098-14.878-32.128-29.7-46.199-40.546-12.898-9.94-39.228-29.061-74.833-30.877-40.213-2.051-79.044 14.937-104.832 45.862-18.999 22.788-24.841 48.994-27.102 66.492-74.615 13.956-134.413 46.891-180.568 91.836-51.985 50.62-82.353 112.196-100.339 167.45-88.048-0.030-133.463-0.755-168.491-18.603-32.113-16.363-58.222-42.47-74.584-74.581-18.601-36.51-18.601-84.301-18.601-179.883v-136.533zM782.596 532.578l119.697 110.622c18.842 17.408 28.258 26.112 31.753 36.309 3.068 8.96 3.068 18.688 0 27.648-3.494 10.197-12.911 18.901-31.753 36.309l-119.697 110.622c-36.22 33.472-54.327 50.206-69.76 50.995-13.406 0.683-26.347-4.979-34.944-15.287-9.899-11.87-9.899-36.527-9.899-85.841v-3.955c-92.523 0-159.77 24.922-207.275 55.091-47.136 29.935-70.704 44.902-78.879 43.627-7.913-1.237-12.819-4.851-16.339-12.045-3.637-7.433 2.144-28.689 13.705-71.202 4.233-15.565 9.449-31.543 15.872-47.471 36.913-91.52 113.7-181.333 272.915-181.333v-3.955c0-49.314 0-73.971 9.899-85.841 1.075-1.289 2.219-2.505 3.418-3.644 8.422-7.979 19.797-12.241 31.526-11.644 0 0 0 0 0 0 1.929 0.098 3.9 0.448 5.943 1.045 14.302 4.19 32.124 20.663 63.817 49.946 0 0 0 0.004 0 0.004z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "share-screen" + ] + }, + { + "id": 51, + "paths": [ + "M290.134 149.333h232.161v0c34.347-0 62.694-0.001 85.781 1.886 23.983 1.959 46.029 6.164 66.739 16.716 32.111 16.362 58.219 42.471 74.581 74.584 10.551 20.708 14.758 42.754 16.717 66.737 1.22 14.914 1.651 32.020 1.805 51.519l83.46-80.125c48.9-46.945 129.954-12.115 129.954 55.434v351.831c0 67.669-81.169 102.268-129.984 55.403l-83.43-80.094c-0.154 19.499-0.585 36.608-1.805 51.52-1.958 23.983-6.165 46.029-16.717 66.739-16.363 32.111-42.47 58.219-74.581 74.581-20.71 10.551-42.756 14.758-66.739 16.717-23.087 1.886-51.435 1.886-85.781 1.886h-233.925c-34.345 0-62.691 0-85.781-1.886-23.983-1.958-46.029-6.165-66.737-16.717-32.113-16.363-58.222-42.47-74.584-74.581-10.551-20.71-14.756-42.756-16.716-66.739-1.887-23.091-1.886-51.435-1.885-85.781v-233.926c-0.001-34.345-0.001-62.691 1.885-85.781 1.96-23.983 6.165-46.029 16.716-66.737 16.362-32.113 42.471-58.222 74.584-74.584 20.708-10.551 42.754-14.757 66.737-16.716 23.091-1.887 51.437-1.886 85.782-1.886h1.763zM768 497.088c0 0.026 0 0.055 0 0.081v29.662c0 0.026 0 0.055 0 0.081 0.021 11.588 4.757 22.669 13.12 30.694l114.88 110.289v-311.791l-114.893 110.297c-8.354 8.021-13.086 19.089-13.107 30.686zM682.667 497.067v-100.267c0-36.547-0.034-61.392-1.6-80.596-1.532-18.706-4.301-28.272-7.701-34.945-8.179-16.056-21.235-29.111-37.291-37.292-6.673-3.4-16.239-6.17-34.944-7.699-19.204-1.569-44.049-1.602-80.597-1.602h-230.399c-36.547 0-61.392 0.033-80.596 1.602-18.706 1.528-28.272 4.299-34.945 7.699-16.057 8.181-29.111 21.236-37.292 37.292-3.4 6.673-6.17 16.239-7.698 34.945-1.569 19.204-1.602 44.048-1.602 80.596v230.4c0 36.548 0.033 61.393 1.602 80.597 1.528 18.705 4.298 28.271 7.698 34.944 8.181 16.055 21.236 29.111 37.292 37.291 6.673 3.401 16.239 6.17 34.944 7.697 19.204 1.57 44.049 1.604 80.596 1.604h230.399c36.548 0 61.393-0.034 80.597-1.604 18.705-1.527 28.271-4.297 34.944-7.697 16.055-8.179 29.111-21.235 37.291-37.291 3.401-6.673 6.17-16.239 7.701-34.944 1.566-19.204 1.6-44.049 1.6-80.597v-100.271c0-0.030 0-0.064 0-0.098v-29.662c0-0.034 0-0.068 0-0.102z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 24, + "tags": [ + "video-outlined" + ] + }, { "id": 50, "paths": [ @@ -640,33 +709,27 @@ { "id": 46, "paths": [ - "M868 886.533h-734.4c-43.867 0-79.467-35.733-79.467-79.467v-569.067c0-43.867 35.733-79.467 79.467-79.467h734.4c43.867 0 79.467 35.733 79.467 79.467v569.067c0 43.733-35.733 79.467-79.467 79.467zM133.6 211.733c-14.4 0-26.133 11.733-26.133 26.133v569.067c0 14.4 11.733 26.133 26.133 26.133h734.4c14.4 0 26.133-11.733 26.133-26.133v-568.933c0-14.4-11.733-26.133-26.133-26.133h-734.4z", - "M346.667 185.067h53.333v674.667h-53.333v-674.667z", - "M272.533 549.2h-109.2c-14.667 0-26.667-12-26.667-26.667s12-26.667 26.667-26.667h109.2c14.667 0 26.667 12 26.667 26.667s-12 26.667-26.667 26.667z", - "M272.533 455.067h-107.867c-14.667 0-26.667-12-26.667-26.667s12-26.667 26.667-26.667h107.867c14.667 0 26.667 12 26.667 26.667s-12 26.667-26.667 26.667z", - "M272.533 356.4h-107.867c-14.667 0-26.667-12-26.667-26.667s12-26.667 26.667-26.667h107.867c14.667 0 26.667 12 26.667 26.667s-12 26.667-26.667 26.667z" + "M768 853.333h-512c-93.867 0-170.667-76.8-170.667-170.667v-341.333c0-93.867 76.8-170.667 170.667-170.667h512c93.867 0 170.667 76.8 170.667 170.667v341.333c0 93.867-76.8 170.667-170.667 170.667zM256 256c-46.933 0-85.333 38.4-85.333 85.333v341.333c0 46.933 38.4 85.333 85.333 85.333h512c46.933 0 85.333-38.4 85.333-85.333v-341.333c0-46.933-38.4-85.333-85.333-85.333h-512z", + "M533.333 213.333h85.333v597.333h-85.333v-597.333z" ], "attrs": [ - {}, - {}, - {}, {}, {} ], - "isMulticolor": false, - "isMulticolor2": false, "grid": 24, "tags": [ "sidebar" - ] + ], + "isMulticolor": false, + "isMulticolor2": false }, { "id": 45, "paths": [ - "M694.667 811.6c18.933-19.2 30.667-45.733 30.667-74.8v-406.933c0-58.933-47.733-106.667-106.667-106.667h-512c-0.133 0-0.4 0-0.533 0l588.533 588.4z", - "M42.667 244.533c-25.867 19.467-42.667 50.4-42.667 85.333v407.067c0 58.933 47.733 106.667 106.667 106.667h512c7.2 0 14.133-0.667 20.933-2.133l-596.933-596.933z", - "M806.8 477.067v104.133c0 40.533 0.8 46.133 27.733 72.933l128.4 128.4c8.933 8.933 34.933 8.933 44.4 0l15.733-15.733v-464.667l-15.733-16.267c-10.267-10.267-36.267-9.333-45.6 0l-130.133 130.933c-18.8 18.4-24.8 26.933-24.8 60.267v0z", - "M858.4 964.933c-7.733 0-15.333-2.933-21.2-8.8l-771.733-771.733c-11.733-11.733-11.733-30.667 0-42.4s30.667-11.733 42.4 0l771.733 771.733c11.733 11.733 11.733 30.667 0 42.4-5.867 5.867-13.467 8.8-21.2 8.8z" + "M217.6 844.8c25.6 0 51.2 0 89.6 0h132.267c89.6 0 136.533 0 170.667-17.067 29.867-17.067 55.467-42.667 72.533-72.533 17.067-34.133 17.067-81.067 17.067-170.667v-132.267c0-76.8 0-119.467-8.533-153.6l-473.6 546.133z", + "M140.8 836.267l512-593.067c-12.8-12.8-29.867-25.6-42.667-34.133-34.133-17.067-81.067-17.067-170.667-17.067h-136.533c-89.6 0-136.533 0-170.667 17.067-29.867 17.067-55.467 42.667-72.533 72.533-17.067 34.133-17.067 81.067-17.067 174.933v132.267c0 89.6 0 136.533 17.067 170.667 17.067 29.867 42.667 55.467 72.533 72.533 4.267 0 8.533 0 8.533 4.267z", + "M891.733 285.867l-140.8 170.667v110.933c0 12.8 4.267 25.6 12.8 34.133l128 153.6c25.6 29.867 76.8 12.8 76.8-29.867v-409.6c0-42.667-51.2-59.733-76.8-29.867z", + "M98.133 878.933c-8.533 0-12.8-4.267-21.333-8.533-12.8-12.8-12.8-29.867-4.267-46.933l597.333-691.2c12.8-12.8 29.867-12.8 46.933-4.267 12.8 12.8 12.8 29.867 4.267 46.933l-597.333 691.2c-8.533 8.533-17.067 12.8-25.6 12.8z" ], "attrs": [ {}, @@ -674,12 +737,12 @@ {}, {} ], - "isMulticolor": false, - "isMulticolor2": false, "grid": 24, "tags": [ "video-stop" - ] + ], + "isMulticolor": false, + "isMulticolor2": false }, { "id": 44, @@ -722,17 +785,17 @@ { "id": 42, "paths": [ - "M989.867 456.96c-236.373-208.64-715.52-208.64-951.893 0-44.373 39.253-45.227 108.8-3.413 150.613l46.933 46.933c37.12 33.707 93.867 35.413 133.973 3.84l69.973-55.467 5.12-4.267c21.76-19.627 34.133-47.787 34.133-77.227l7.253-111.36 16.213-3.413c73.813-14.080 273.92-12.8 347.307 3.413h0.427l7.253 113.493v6.4c1.707 27.733 15.787 55.040 39.253 73.387l69.12 55.040 5.12 3.84c41.387 28.587 97.707 24.32 133.547-11.947l46.933-46.933c37.973-42.24 35.84-108.373-7.253-146.347zM254.72 524.8c-1.28 9.813-5.547 17.92-12.8 23.893l-69.547 55.467-3.413 2.133c-13.653 8.533-31.147 6.4-42.24-4.693l-42.667-42.667-2.987-3.413c-11.52-14.080-10.24-34.987 2.987-46.507l8.96-7.68c50.347-42.667 106.24-74.667 165.12-96.853l3.413-1.28-6.827 121.6zM944.213 558.507l-42.667 42.667-2.987 2.56c-12.8 9.813-30.293 10.24-43.52 0l-69.12-54.613-3.413-2.987c-6.4-6.4-9.813-14.933-9.813-24.32l-5.973-118.187 3.413 1.28c62.293 23.040 121.6 58.027 174.080 104.533 13.653 11.947 14.080 34.987 0 49.067z" + "M182.8 677.333c-30.533 0-60.8-11.867-83.6-34.933l-46.4-46.4c-23.2-23.2-36-55.467-34.933-88.4 1.067-32.4 14.8-62 38.8-83.2 259.6-229.2 650.933-229.2 910.533 0 24 21.2 37.733 50.8 38.8 83.2 1.067 32.933-11.733 65.067-34.933 88.4l-46.533 46.533c-42.533 42.533-110.267 46.533-157.6 9.2l-0.133-0.133-75.467-59.867c-28.4-22.4-44.667-55.733-45.067-91.6l-7.733-148.933c-83.467-17.867-169.867-17.867-253.333 0l-7.733 148.4c-0.4 35.867-16.667 69.2-44.933 91.6l-76.133 60.533c-21.867 17.2-47.867 25.6-73.6 25.6zM298.4 376.8c-66.533 25.067-129.333 62.267-185.333 111.733-8.267 7.333-9.867 16.8-10 21.867-0.267 9.467 3.333 18.667 10 25.333l46.8 46.8c11.467 11.733 30.267 12.8 43.6 2.267l76-60.4c8-6.4 12.667-15.867 12.667-26v-2.267l6.267-119.333zM819.6 584.8c13.333 10.533 32.4 9.333 44.4-2.533l46.533-46.533c6.667-6.667 10.267-15.867 10-25.333-0.133-5.067-1.6-14.533-10-21.867-55.867-49.333-118.8-86.667-185.333-111.733l6.267 121.067v1.067c0 10.133 4.533 19.6 12.667 26l75.467 59.867z" ], "attrs": [ {} ], - "isMulticolor": false, - "isMulticolor2": false, "grid": 24, "tags": [ "phone-discard-outline" - ] + ], + "isMulticolor": false, + "isMulticolor2": false }, { "id": 41, @@ -781,23 +844,17 @@ { "id": 39, "paths": [ - "M896 1023.147h-547.84c-70.827 0-128-57.6-128-128v-769.707c0-70.827 57.6-128 128-128h547.84c70.827 0 128 57.6 128 128v769.707c0 70.4-57.6 128-128 128zM348.16 82.347c-23.467 0-42.667 19.2-42.667 42.667v769.707c0 23.467 19.2 42.667 42.667 42.667h547.84c23.467 0 42.667-19.2 42.667-42.667v-769.28c0-23.467-19.2-42.667-42.667-42.667h-547.84z", - "M148.053 968.96h-20.053c-70.4 0-128-57.173-128-128v-605.867c0-70.4 57.173-128 128-128h24.32c23.467 0 42.667 19.2 42.667 42.667s-19.2 42.667-42.667 42.667h-24.32c-23.467 0-42.667 19.2-42.667 42.667v606.293c0 23.467 19.2 42.667 42.667 42.667h20.48c23.467 0 42.667 19.2 42.667 42.667s-19.627 42.24-43.093 42.24z", - "M622.080 734.293c-23.467 0-42.667-19.2-42.667-42.667v-249.6l-87.893 87.893c-16.64 16.64-43.52 16.64-60.16 0s-16.64-43.52 0-60.16l153.173-153.173c13.227-13.653 33.28-17.92 51.2-10.24 17.493 7.253 29.013 24.32 29.013 43.52v342.187c0 23.467-19.2 42.24-42.667 42.24z", - "M622.080 734.293c-23.467 0-42.667-19.2-42.667-42.667v-341.76c0-19.2 11.52-36.267 29.013-43.52 17.92-7.253 37.973-3.413 51.2 10.24l153.173 152.747c16.64 16.64 16.64 43.52 0 60.16s-43.52 16.64-60.16 0l-87.893-87.893v249.6c0 24.32-19.2 43.093-42.667 43.093z" + "M768 170.667h-512c-47.128 0-85.333 38.205-85.333 85.333v341.333c0 47.13 38.205 85.333 85.333 85.333h128.356c-16.301 28.587-28.367 57.749-37.347 85.333h-91.009c-94.257 0-170.667-76.412-170.667-170.667v-341.333c0-94.257 76.41-170.667 170.667-170.667h512c94.255 0 170.667 76.41 170.667 170.667v265.186l-57.783-53.402c-9.327-8.623-18.633-17.225-27.55-25.045v-186.739c0-47.128-38.204-85.333-85.333-85.333zM437.747 768c11.942-29.619 28.066-59.059 49.809-85.333 44.023-53.205 111.087-93.431 213.167-95.881 3.277-0.081 6.588-0.119 9.937-0.119v0-3.955c0-49.314 0-73.971 9.899-85.841 7.757-9.301 19.051-14.818 31.031-15.309 1.297-0.051 2.603-0.043 3.913 0.021 15.433 0.789 33.54 17.523 69.76 50.995l119.697 110.622c18.837 17.408 28.258 26.112 31.753 36.309 3.068 8.96 3.068 18.688 0 27.648-1.715 5.009-4.864 9.655-9.852 15.155-4.535 4.992-10.59 10.688-18.479 17.993l-123.17 113.83c-31.659 29.257-49.472 45.717-63.765 49.903-2.044 0.597-4.015 0.947-5.943 1.045-10.052 0.512-19.849-2.543-27.742-8.452-2.633-1.971-5.052-4.258-7.202-6.835-9.899-11.87-9.899-36.527-9.899-85.841v-3.955c-2.748 0-5.47 0.021-8.175 0.064-100.326 1.609-173.965 32.661-225.003 66.978v0.004c-20.749 13.948-36.143 24.299-47.334 30.886-2.364 0.742-4.233 1.003-5.642 0.785-7.913-1.237-12.819-4.851-16.339-12.045-3.637-7.433 2.144-28.689 13.705-71.202l0.534-1.946c0.923-3.337 1.891-6.694 2.908-10.061 3.537-11.725 7.65-23.607 12.433-35.465z" ], "attrs": [ - {}, - {}, - {}, {} ], - "isMulticolor": false, - "isMulticolor2": false, "grid": 24, "tags": [ - "share-screen" - ] + "share-screen-outlined" + ], + "isMulticolor": false, + "isMulticolor2": false }, { "id": 38, @@ -823,19 +880,17 @@ { "id": 37, "paths": [ - "M618.667 843.52h-512c-58.88 0-106.667-47.787-106.667-106.667v-407.040c0-58.88 47.787-106.667 106.667-106.667h512c58.88 0 106.667 47.787 106.667 106.667v407.040c0 58.88-47.787 106.667-106.667 106.667z", - "M806.827 477.013v104.107c0 40.533 0.853 46.080 27.733 72.96l128.427 128.427c8.96 8.96 34.987 8.96 44.373 0l15.787-15.787v-464.64l-15.787-16.213c-10.24-10.24-36.267-9.387-45.653 0l-130.133 130.987c-18.773 18.347-24.747 26.88-24.747 60.16z" + "M59.733 759.467c-17.067-34.133-17.067-81.067-17.067-174.933v-132.267c0-89.6 0-136.533 17.067-170.667 17.067-29.867 42.667-55.467 72.533-72.533 34.133-17.067 81.067-17.067 170.667-17.067h132.267c89.6 0 136.533 0 170.667 17.067 29.867 17.067 55.467 42.667 72.533 72.533 17.067 34.133 17.067 81.067 17.067 170.667v132.267c0 89.6 0 136.533-17.067 170.667-17.067 29.867-42.667 55.467-72.533 72.533-34.133 17.067-81.067 17.067-170.667 17.067h-132.267c-89.6 0-136.533 0-170.667-17.067-29.867-12.8-55.467-38.4-72.533-68.267v0zM763.733 601.6c-8.533-8.533-12.8-21.333-12.8-34.133v-110.933l140.8-170.667c25.6-29.867 76.8-12.8 76.8 29.867v409.6c0 42.667-51.2 59.733-76.8 29.867l-128-153.6z" ], "attrs": [ - {}, {} ], - "isMulticolor": false, - "isMulticolor2": false, "grid": 24, "tags": [ "video" - ] + ], + "isMulticolor": false, + "isMulticolor2": false }, { "id": 36, @@ -855,9 +910,11 @@ { "id": 35, "paths": [ - "M997.267 610.72l-4.213 4.467-42.747 42.733c-36.16 36.173-92.573 40.787-134.12 11.88l-5.107-3.787-69.44-55.107c-23.307-18.493-37.493-45.733-39.36-73.64l-0.213-6.453-7.36-114-0.4-0.093c-73.907-16.213-274.587-17.333-348.84-3.267l-16.173 3.307-7.307 111.707c0 29.653-12.533 57.693-34.4 77.48l-5.213 4.413-70.040 55.693c-40.267 31.72-97.107 29.733-134.28-3.973l-4.36-4.2-42.747-42.733c-42.2-42.2-41.373-111.893 3.307-151.36 237.133-209.387 718.307-209.427 955.493 0.040 43.147 38.107 45.387 104.387 7.52 146.893z" + "M940.667 565.867l-46.533 46.533c-27.333 27.467-70.667 29.867-101.067 5.867l-75.467-59.867c-18.267-14.533-28.8-36.267-28.8-59.333l-8.133-155.867h-337.733l-8.133 155.333c0 23.067-10.533 44.933-28.8 59.333l-76 60.4c-30.4 23.867-73.6 21.467-100.533-5.867l-46.533-46.533c-30.4-30.4-30.4-80.933 1.867-109.333 243.467-214.933 610.267-215.2 854 0 32.267 28.4 32.267 78.933 1.867 109.333z", + "M182.8 677.333c-30.533 0-60.8-11.867-83.6-34.933l-46.4-46.4c-23.2-23.2-36-55.467-34.933-88.4 1.067-32.4 14.8-62 38.8-83.2 259.6-229.2 650.933-229.2 910.533 0 24 21.2 37.733 50.8 38.8 83.2 1.067 32.933-11.733 65.067-34.933 88.4l-46.533 46.533c-42.533 42.533-110.267 46.533-157.6 9.2l-0.133-0.133-75.467-59.867c-28.4-22.4-44.667-55.733-45.067-91.6l-7.733-148.933c-83.467-17.867-169.867-17.867-253.333 0l-7.733 148.4c-0.4 35.867-16.667 69.2-44.933 91.6l-76.133 60.533c-21.867 17.2-47.867 25.6-73.6 25.6zM298.4 376.8c-66.533 25.067-129.333 62.267-185.333 111.733-8.267 7.333-9.867 16.8-10 21.867-0.267 9.467 3.333 18.667 10 25.333l46.8 46.8c11.467 11.733 30.267 12.8 43.6 2.267l76-60.4c8-6.4 12.667-15.867 12.667-26v-2.267l6.267-119.333zM819.6 584.8c13.333 10.533 32.4 9.333 44.4-2.533l46.533-46.533c6.667-6.667 10.267-15.867 10-25.333-0.133-5.067-1.6-14.533-10-21.867-55.867-49.333-118.8-86.667-185.333-111.733l6.267 121.067v1.067c0 10.133 4.533 19.6 12.667 26l75.467 59.867z" ], "attrs": [ + {}, {} ], "grid": 24, @@ -2919,7 +2976,7 @@ "name": "select", "prevSize": 32, "code": 59744, - "tempChar": "" + "tempChar": "" }, { "order": 480, @@ -2927,7 +2984,7 @@ "name": "folder", "prevSize": 32, "code": 59667, - "tempChar": "" + "tempChar": "" }, { "order": 481, @@ -2935,7 +2992,7 @@ "name": "bots", "prevSize": 32, "code": 59669, - "tempChar": "" + "tempChar": "" }, { "order": 482, @@ -2943,7 +3000,7 @@ "name": "calendar", "prevSize": 32, "code": 59670, - "tempChar": "" + "tempChar": "" }, { "order": 483, @@ -2951,7 +3008,7 @@ "name": "cloud-download", "prevSize": 32, "code": 59671, - "tempChar": "" + "tempChar": "" }, { "order": 484, @@ -2959,7 +3016,7 @@ "name": "colorize", "prevSize": 32, "code": 59672, - "tempChar": "" + "tempChar": "" }, { "order": 651, @@ -2967,7 +3024,7 @@ "name": "forward", "prevSize": 32, "code": 59687, - "tempChar": "" + "tempChar": "" }, { "order": 650, @@ -2975,7 +3032,7 @@ "name": "reply", "prevSize": 32, "code": 59719, - "tempChar": "" + "tempChar": "" }, { "order": 487, @@ -2983,7 +3040,7 @@ "name": "help", "prevSize": 32, "code": 59690, - "tempChar": "" + "tempChar": "" }, { "order": 488, @@ -2991,7 +3048,7 @@ "name": "info", "prevSize": 32, "code": 59691, - "tempChar": "" + "tempChar": "" }, { "order": 489, @@ -2999,7 +3056,7 @@ "name": "info-filled", "prevSize": 32, "code": 59675, - "tempChar": "" + "tempChar": "" }, { "order": 490, @@ -3007,7 +3064,7 @@ "name": "delete-filled", "prevSize": 32, "code": 59676, - "tempChar": "" + "tempChar": "" }, { "order": 491, @@ -3015,7 +3072,7 @@ "name": "delete", "prevSize": 32, "code": 59677, - "tempChar": "" + "tempChar": "" }, { "order": 492, @@ -3023,7 +3080,7 @@ "name": "edit", "prevSize": 32, "code": 59683, - "tempChar": "" + "tempChar": "" }, { "order": 493, @@ -3031,7 +3088,7 @@ "name": "new-chat-filled", "prevSize": 32, "code": 59705, - "tempChar": "" + "tempChar": "" }, { "order": 494, @@ -3039,7 +3096,7 @@ "name": "send", "prevSize": 32, "code": 59722, - "tempChar": "" + "tempChar": "" }, { "order": 495, @@ -3047,7 +3104,7 @@ "name": "send-outline", "prevSize": 32, "code": 59723, - "tempChar": "" + "tempChar": "" }, { "order": 496, @@ -3055,7 +3112,7 @@ "name": "add-user-filled", "prevSize": 32, "code": 59652, - "tempChar": "" + "tempChar": "" }, { "order": 497, @@ -3063,7 +3120,7 @@ "name": "add-user", "prevSize": 32, "code": 59653, - "tempChar": "" + "tempChar": "" }, { "order": 498, @@ -3071,7 +3128,7 @@ "name": "delete-user", "prevSize": 32, "code": 59678, - "tempChar": "" + "tempChar": "" }, { "order": 499, @@ -3079,7 +3136,7 @@ "name": "microphone", "prevSize": 32, "code": 59701, - "tempChar": "" + "tempChar": "" }, { "order": 500, @@ -3087,7 +3144,7 @@ "name": "microphone-alt", "prevSize": 32, "code": 59707, - "tempChar": "" + "tempChar": "" }, { "order": 501, @@ -3095,7 +3152,7 @@ "name": "poll", "prevSize": 32, "code": 59704, - "tempChar": "" + "tempChar": "" }, { "order": 502, @@ -3103,7 +3160,7 @@ "name": "revote", "prevSize": 32, "code": 59706, - "tempChar": "" + "tempChar": "" }, { "order": 503, @@ -3111,7 +3168,7 @@ "name": "photo", "prevSize": 32, "code": 59712, - "tempChar": "" + "tempChar": "" }, { "order": 504, @@ -3119,7 +3176,7 @@ "name": "document", "prevSize": 32, "code": 59679, - "tempChar": "" + "tempChar": "" }, { "order": 505, @@ -3127,7 +3184,7 @@ "name": "camera", "prevSize": 32, "code": 59662, - "tempChar": "" + "tempChar": "" }, { "order": 506, @@ -3135,7 +3192,7 @@ "name": "camera-add", "prevSize": 32, "code": 59663, - "tempChar": "" + "tempChar": "" }, { "order": 507, @@ -3143,7 +3200,7 @@ "name": "logout", "prevSize": 32, "code": 59698, - "tempChar": "" + "tempChar": "" }, { "order": 508, @@ -3151,7 +3208,7 @@ "name": "saved-messages", "prevSize": 32, "code": 59720, - "tempChar": "" + "tempChar": "" }, { "order": 509, @@ -3159,7 +3216,7 @@ "name": "settings", "prevSize": 32, "code": 59726, - "tempChar": "" + "tempChar": "" }, { "order": 652, @@ -3167,7 +3224,7 @@ "name": "phone", "prevSize": 32, "code": 59711, - "tempChar": "" + "tempChar": "" }, { "order": 653, @@ -3175,7 +3232,7 @@ "name": "attach", "prevSize": 32, "code": 59657, - "tempChar": "" + "tempChar": "" }, { "order": 512, @@ -3183,7 +3240,7 @@ "name": "copy", "prevSize": 32, "code": 59674, - "tempChar": "" + "tempChar": "" }, { "order": 513, @@ -3191,7 +3248,7 @@ "name": "channel", "prevSize": 32, "code": 59665, - "tempChar": "" + "tempChar": "" }, { "order": 514, @@ -3199,7 +3256,7 @@ "name": "group", "prevSize": 32, "code": 59689, - "tempChar": "" + "tempChar": "" }, { "order": 515, @@ -3207,7 +3264,7 @@ "name": "user", "prevSize": 32, "code": 59737, - "tempChar": "" + "tempChar": "" }, { "order": 516, @@ -3215,7 +3272,7 @@ "name": "non-contacts", "prevSize": 32, "code": 59688, - "tempChar": "" + "tempChar": "" }, { "order": 517, @@ -3223,7 +3280,7 @@ "name": "active-sessions", "prevSize": 32, "code": 59650, - "tempChar": "" + "tempChar": "" }, { "order": 518, @@ -3231,7 +3288,7 @@ "name": "admin", "prevSize": 32, "code": 59654, - "tempChar": "" + "tempChar": "" }, { "order": 519, @@ -3239,7 +3296,7 @@ "name": "download", "prevSize": 32, "code": 59681, - "tempChar": "" + "tempChar": "" }, { "order": 520, @@ -3247,7 +3304,7 @@ "name": "location", "prevSize": 32, "code": 59696, - "tempChar": "" + "tempChar": "" }, { "order": 521, @@ -3255,7 +3312,7 @@ "name": "stop", "prevSize": 32, "code": 59730, - "tempChar": "" + "tempChar": "" }, { "order": 523, @@ -3263,7 +3320,7 @@ "name": "archive", "prevSize": 32, "code": 59656, - "tempChar": "" + "tempChar": "" }, { "order": 524, @@ -3271,7 +3328,7 @@ "name": "unarchive", "prevSize": 32, "code": 59731, - "tempChar": "" + "tempChar": "" }, { "order": 525, @@ -3279,7 +3336,7 @@ "name": "readchats", "prevSize": 32, "code": 59699, - "tempChar": "" + "tempChar": "" }, { "order": 526, @@ -3287,7 +3344,7 @@ "name": "unread", "prevSize": 32, "code": 59735, - "tempChar": "" + "tempChar": "" }, { "order": 654, @@ -3295,7 +3352,7 @@ "name": "message", "prevSize": 32, "code": 59700, - "tempChar": "" + "tempChar": "" }, { "order": 659, @@ -3303,7 +3360,7 @@ "name": "lock", "prevSize": 32, "code": 59697, - "tempChar": "" + "tempChar": "" }, { "order": 529, @@ -3311,7 +3368,7 @@ "name": "unlock", "prevSize": 32, "code": 59732, - "tempChar": "" + "tempChar": "" }, { "order": 530, @@ -3319,7 +3376,7 @@ "name": "mute", "prevSize": 32, "code": 59703, - "tempChar": "" + "tempChar": "" }, { "order": 531, @@ -3327,7 +3384,7 @@ "name": "unmute", "prevSize": 32, "code": 59733, - "tempChar": "" + "tempChar": "" }, { "order": 532, @@ -3335,7 +3392,7 @@ "name": "pin", "prevSize": 32, "code": 59713, - "tempChar": "" + "tempChar": "" }, { "order": 533, @@ -3343,7 +3400,7 @@ "name": "unpin", "prevSize": 32, "code": 59734, - "tempChar": "" + "tempChar": "" }, { "order": 534, @@ -3351,7 +3408,7 @@ "name": "smallscreen", "prevSize": 32, "code": 59742, - "tempChar": "" + "tempChar": "" }, { "order": 535, @@ -3359,7 +3416,7 @@ "name": "fullscreen", "prevSize": 32, "code": 59743, - "tempChar": "" + "tempChar": "" }, { "order": 536, @@ -3367,7 +3424,7 @@ "name": "large-pause", "prevSize": 32, "code": 59694, - "tempChar": "" + "tempChar": "" }, { "order": 537, @@ -3375,7 +3432,7 @@ "name": "large-play", "prevSize": 32, "code": 59695, - "tempChar": "" + "tempChar": "" }, { "order": 538, @@ -3383,7 +3440,7 @@ "name": "pause", "prevSize": 32, "code": 59709, - "tempChar": "" + "tempChar": "" }, { "order": 539, @@ -3391,7 +3448,7 @@ "name": "play", "prevSize": 32, "code": 59715, - "tempChar": "" + "tempChar": "" }, { "order": 540, @@ -3399,7 +3456,7 @@ "name": "channelviews", "prevSize": 32, "code": 59666, - "tempChar": "" + "tempChar": "" }, { "order": 541, @@ -3407,7 +3464,7 @@ "name": "message-succeeded", "prevSize": 32, "code": 59648, - "tempChar": "" + "tempChar": "" }, { "order": 657, @@ -3415,7 +3472,7 @@ "name": "message-read", "prevSize": 32, "code": 59649, - "tempChar": "" + "tempChar": "" }, { "order": 543, @@ -3423,7 +3480,7 @@ "name": "message-pending", "prevSize": 32, "code": 59724, - "tempChar": "" + "tempChar": "" }, { "order": 544, @@ -3431,7 +3488,7 @@ "name": "message-failed", "prevSize": 32, "code": 59725, - "tempChar": "" + "tempChar": "" }, { "order": 545, @@ -3439,7 +3496,7 @@ "name": "favorite", "prevSize": 32, "code": 59710, - "tempChar": "" + "tempChar": "" }, { "order": 546, @@ -3447,7 +3504,7 @@ "name": "keyboard", "prevSize": 32, "code": 59716, - "tempChar": "" + "tempChar": "" }, { "order": 547, @@ -3455,7 +3512,7 @@ "name": "delete-left", "prevSize": 32, "code": 59717, - "tempChar": "" + "tempChar": "" }, { "order": 548, @@ -3463,7 +3520,7 @@ "name": "recent", "prevSize": 32, "code": 59718, - "tempChar": "" + "tempChar": "" }, { "order": 549, @@ -3471,7 +3528,7 @@ "name": "gifs", "prevSize": 32, "code": 59727, - "tempChar": "" + "tempChar": "" }, { "order": 550, @@ -3479,7 +3536,7 @@ "name": "stickers", "prevSize": 32, "code": 59739, - "tempChar": "" + "tempChar": "" }, { "order": 551, @@ -3487,7 +3544,7 @@ "name": "smile", "prevSize": 32, "code": 59728, - "tempChar": "" + "tempChar": "" }, { "order": 552, @@ -3495,7 +3552,7 @@ "name": "animals", "prevSize": 32, "code": 59655, - "tempChar": "" + "tempChar": "" }, { "order": 553, @@ -3503,7 +3560,7 @@ "name": "eats", "prevSize": 32, "code": 59682, - "tempChar": "" + "tempChar": "" }, { "order": 554, @@ -3511,7 +3568,7 @@ "name": "sport", "prevSize": 32, "code": 59729, - "tempChar": "" + "tempChar": "" }, { "order": 555, @@ -3519,7 +3576,7 @@ "name": "car", "prevSize": 32, "code": 59664, - "tempChar": "" + "tempChar": "" }, { "order": 556, @@ -3527,7 +3584,7 @@ "name": "lamp", "prevSize": 32, "code": 59692, - "tempChar": "" + "tempChar": "" }, { "order": 557, @@ -3535,7 +3592,7 @@ "name": "language", "prevSize": 32, "code": 59693, - "tempChar": "" + "tempChar": "" }, { "order": 558, @@ -3543,7 +3600,7 @@ "name": "flag", "prevSize": 32, "code": 59686, - "tempChar": "" + "tempChar": "" }, { "order": 559, @@ -3551,7 +3608,7 @@ "name": "more", "prevSize": 32, "code": 59702, - "tempChar": "" + "tempChar": "" }, { "order": 560, @@ -3559,7 +3616,7 @@ "name": "search", "prevSize": 32, "code": 59721, - "tempChar": "" + "tempChar": "" }, { "order": 561, @@ -3567,7 +3624,7 @@ "name": "remove", "prevSize": 32, "code": 59740, - "tempChar": "" + "tempChar": "" }, { "order": 562, @@ -3575,7 +3632,7 @@ "name": "add", "prevSize": 32, "code": 59651, - "tempChar": "" + "tempChar": "" }, { "order": 563, @@ -3583,7 +3640,7 @@ "name": "check", "prevSize": 32, "code": 59668, - "tempChar": "" + "tempChar": "" }, { "order": 564, @@ -3591,7 +3648,7 @@ "name": "close", "prevSize": 32, "code": 59673, - "tempChar": "" + "tempChar": "" }, { "order": 610, @@ -3599,7 +3656,7 @@ "name": "arrow-left", "prevSize": 32, "code": 59661, - "tempChar": "" + "tempChar": "" }, { "order": 566, @@ -3607,7 +3664,7 @@ "name": "arrow-right", "prevSize": 32, "code": 59708, - "tempChar": "" + "tempChar": "" }, { "order": 567, @@ -3615,7 +3672,7 @@ "name": "down", "prevSize": 32, "code": 59680, - "tempChar": "" + "tempChar": "" }, { "order": 568, @@ -3623,7 +3680,7 @@ "name": "up", "prevSize": 32, "code": 59736, - "tempChar": "" + "tempChar": "" }, { "order": 569, @@ -3631,7 +3688,7 @@ "name": "eye-closed", "prevSize": 32, "code": 59685, - "tempChar": "" + "tempChar": "" }, { "order": 570, @@ -3639,7 +3696,7 @@ "name": "eye", "prevSize": 32, "code": 59684, - "tempChar": "" + "tempChar": "" }, { "order": 571, @@ -3647,7 +3704,7 @@ "name": "muted", "prevSize": 32, "code": 59741, - "tempChar": "" + "tempChar": "" }, { "order": 572, @@ -3655,7 +3712,7 @@ "name": "avatar-archived-chats", "prevSize": 32, "code": 59658, - "tempChar": "" + "tempChar": "" }, { "order": 573, @@ -3663,7 +3720,7 @@ "name": "avatar-deleted-account", "prevSize": 32, "code": 59659, - "tempChar": "" + "tempChar": "" }, { "order": 574, @@ -3671,7 +3728,7 @@ "name": "avatar-saved-messages", "prevSize": 32, "code": 59660, - "tempChar": "" + "tempChar": "" }, { "order": 575, @@ -3679,7 +3736,7 @@ "name": "pinned-chat", "prevSize": 32, "code": 59714, - "tempChar": "" + "tempChar": "" } ], "prevSize": 32, @@ -3727,4 +3784,4 @@ "showLiga": false }, "uid": -1 -} +} \ No newline at end of file diff --git a/src/styles/icons.scss b/src/styles/icons.scss index 35124fce8..da1c22e89 100644 --- a/src/styles/icons.scss +++ b/src/styles/icons.scss @@ -51,6 +51,15 @@ .icon-volume-3:before { content: "\e991"; } +.icon-favorite-filled:before { + content: "\e998"; +} +.icon-share-screen:before { + content: "\e97a"; +} +.icon-video-outlined:before { + content: "\e997"; +} .icon-stats:before { content: "\e996"; } @@ -84,7 +93,7 @@ .icon-stop-raising-hand:before { content: "\e985"; } -.icon-share-screen:before { +.icon-share-screen-outlined:before { content: "\e986"; } .icon-voice-chat:before { diff --git a/src/util/dateFormat.ts b/src/util/dateFormat.ts index d7090c50c..25fde8338 100644 --- a/src/util/dateFormat.ts +++ b/src/util/dateFormat.ts @@ -121,6 +121,47 @@ export function formatLastUpdated(lang: LangFn, currentTime: number, lastUpdated } } +type DurationType = 'Seconds' | 'Minutes' | 'Hours' | 'Days' | 'Weeks'; + +export function formatTimeDuration(lang: LangFn, duration: number, showLast = 2) { + if (!duration) { + return undefined; + } + + const durationRecords: { duration: number; type: DurationType }[] = []; + const labels = [ + { multiplier: 1, type: 'Seconds' }, + { multiplier: 60, type: 'Minutes' }, + { multiplier: 60, type: 'Hours' }, + { multiplier: 24, type: 'Days' }, + { multiplier: 7, type: 'Weeks' }, + ] as Array<{ multiplier: number; type: DurationType }>; + let t = 1; + labels.forEach((label, idx) => { + t *= label.multiplier; + + if (duration < t) { + return; + } + + const modulus = labels[idx === (labels.length - 1) ? idx : idx + 1].multiplier!; + durationRecords.push({ + duration: Math.floor((duration / t) % modulus), + type: label.type, + }); + }); + + const out = durationRecords.slice(-showLast).reverse(); + for (let i = out.length - 1; i >= 0; --i) { + if (out[i].duration === 0) { + out.splice(i, 1); + } + } + + // TODO In arabic we don't use "," as delimiter rather we use "and" each time + return out.map((l) => lang(l.type, l.duration, 'i')).join(', '); +} + export function formatHumanDate( lang: LangFn, datetime: number | Date, diff --git a/src/util/notifications.ts b/src/util/notifications.ts index 0145ae0ef..ec5f57040 100644 --- a/src/util/notifications.ts +++ b/src/util/notifications.ts @@ -1,6 +1,6 @@ import { callApi } from '../api/gramjs'; import { - ApiChat, ApiMediaFormat, ApiMessage, ApiUser, ApiUserReaction, + ApiChat, ApiMediaFormat, ApiMessage, ApiPhoneCall, ApiUser, ApiUserReaction, } from '../api/types'; import { renderActionMessageText } from '../components/common/helpers/renderActionMessageText'; import { DEBUG, IS_TEST } from '../config'; @@ -12,7 +12,7 @@ import { getMessageRecentReaction, getMessageSenderName, getMessageSummaryText, - getPrivateChatUserId, + getPrivateChatUserId, getUserFullName, isActionMessage, isChatChannel, selectIsChatMuted, @@ -322,7 +322,7 @@ function getNotificationContent(chat: ApiChat, message: ApiMessage, reaction?: A }; } -async function getAvatar(chat: ApiChat) { +async function getAvatar(chat: ApiChat | ApiUser) { const imageHash = getChatAvatarHash(chat); if (!imageHash) return undefined; let mediaData = mediaLoader.getFromMemory(imageHash); @@ -333,6 +333,39 @@ async function getAvatar(chat: ApiChat) { return mediaData; } +export async function notifyAboutCall({ + call, user, +}: { + call: ApiPhoneCall; user: ApiUser; +}) { + const { hasWebNotifications } = await loadNotificationSettings(); + if (document.hasFocus() || !hasWebNotifications) return; + const areNotificationsSupported = checkIfNotificationsSupported(); + if (!areNotificationsSupported) return; + + const icon = await getAvatar(user); + + const options: NotificationOptions = { + body: getUserFullName(user), + icon, + badge: icon, + tag: `call_${call.id}`, + }; + + if ('vibrate' in navigator) { + options.vibrate = [200, 100, 200]; + } + + const notification = new Notification(getTranslation('VoipIncoming'), options); + + notification.onclick = () => { + notification.close(); + if (window.focus) { + window.focus(); + } + }; +} + export async function notifyAboutMessage({ chat, message, diff --git a/src/util/phoneCallEmojiConstants.ts b/src/util/phoneCallEmojiConstants.ts new file mode 100644 index 000000000..c02b5ab8d --- /dev/null +++ b/src/util/phoneCallEmojiConstants.ts @@ -0,0 +1,88 @@ +export const EMOJI_DATA = new Uint16Array([ + 0xd83d, 0xde09, 0xd83d, 0xde0d, 0xd83d, 0xde1b, 0xd83d, 0xde2d, 0xd83d, 0xde31, 0xd83d, 0xde21, + 0xd83d, 0xde0e, 0xd83d, 0xde34, 0xd83d, 0xde35, 0xd83d, 0xde08, 0xd83d, 0xde2c, 0xd83d, 0xde07, + 0xd83d, 0xde0f, 0xd83d, 0xdc6e, 0xd83d, 0xdc77, 0xd83d, 0xdc82, 0xd83d, 0xdc76, 0xd83d, 0xdc68, + 0xd83d, 0xdc69, 0xd83d, 0xdc74, 0xd83d, 0xdc75, 0xd83d, 0xde3b, 0xd83d, 0xde3d, 0xd83d, 0xde40, + 0xd83d, 0xdc7a, 0xd83d, 0xde48, 0xd83d, 0xde49, 0xd83d, 0xde4a, 0xd83d, 0xdc80, 0xd83d, 0xdc7d, + 0xd83d, 0xdca9, 0xd83d, 0xdd25, 0xd83d, 0xdca5, 0xd83d, 0xdca4, 0xd83d, 0xdc42, 0xd83d, 0xdc40, + 0xd83d, 0xdc43, 0xd83d, 0xdc45, 0xd83d, 0xdc44, 0xd83d, 0xdc4d, 0xd83d, 0xdc4e, 0xd83d, 0xdc4c, + 0xd83d, 0xdc4a, 0x270c, 0x270b, 0xd83d, 0xdc50, 0xd83d, 0xdc46, 0xd83d, 0xdc47, 0xd83d, 0xdc49, + 0xd83d, 0xdc48, 0xd83d, 0xde4f, 0xd83d, 0xdc4f, 0xd83d, 0xdcaa, 0xd83d, 0xdeb6, 0xd83c, 0xdfc3, + 0xd83d, 0xdc83, 0xd83d, 0xdc6b, 0xd83d, 0xdc6a, 0xd83d, 0xdc6c, 0xd83d, 0xdc6d, 0xd83d, 0xdc85, + 0xd83c, 0xdfa9, 0xd83d, 0xdc51, 0xd83d, 0xdc52, 0xd83d, 0xdc5f, 0xd83d, 0xdc5e, 0xd83d, 0xdc60, + 0xd83d, 0xdc55, 0xd83d, 0xdc57, 0xd83d, 0xdc56, 0xd83d, 0xdc59, 0xd83d, 0xdc5c, 0xd83d, 0xdc53, + 0xd83c, 0xdf80, 0xd83d, 0xdc84, 0xd83d, 0xdc9b, 0xd83d, 0xdc99, 0xd83d, 0xdc9c, 0xd83d, 0xdc9a, + 0xd83d, 0xdc8d, 0xd83d, 0xdc8e, 0xd83d, 0xdc36, 0xd83d, 0xdc3a, 0xd83d, 0xdc31, 0xd83d, 0xdc2d, + 0xd83d, 0xdc39, 0xd83d, 0xdc30, 0xd83d, 0xdc38, 0xd83d, 0xdc2f, 0xd83d, 0xdc28, 0xd83d, 0xdc3b, + 0xd83d, 0xdc37, 0xd83d, 0xdc2e, 0xd83d, 0xdc17, 0xd83d, 0xdc34, 0xd83d, 0xdc11, 0xd83d, 0xdc18, + 0xd83d, 0xdc3c, 0xd83d, 0xdc27, 0xd83d, 0xdc25, 0xd83d, 0xdc14, 0xd83d, 0xdc0d, 0xd83d, 0xdc22, + 0xd83d, 0xdc1b, 0xd83d, 0xdc1d, 0xd83d, 0xdc1c, 0xd83d, 0xdc1e, 0xd83d, 0xdc0c, 0xd83d, 0xdc19, + 0xd83d, 0xdc1a, 0xd83d, 0xdc1f, 0xd83d, 0xdc2c, 0xd83d, 0xdc0b, 0xd83d, 0xdc10, 0xd83d, 0xdc0a, + 0xd83d, 0xdc2b, 0xd83c, 0xdf40, 0xd83c, 0xdf39, 0xd83c, 0xdf3b, 0xd83c, 0xdf41, 0xd83c, 0xdf3e, + 0xd83c, 0xdf44, 0xd83c, 0xdf35, 0xd83c, 0xdf34, 0xd83c, 0xdf33, 0xd83c, 0xdf1e, 0xd83c, 0xdf1a, + 0xd83c, 0xdf19, 0xd83c, 0xdf0e, 0xd83c, 0xdf0b, 0x26a1, 0x2614, 0x2744, 0x26c4, 0xd83c, 0xdf00, + 0xd83c, 0xdf08, 0xd83c, 0xdf0a, 0xd83c, 0xdf93, 0xd83c, 0xdf86, 0xd83c, 0xdf83, 0xd83d, 0xdc7b, + 0xd83c, 0xdf85, 0xd83c, 0xdf84, 0xd83c, 0xdf81, 0xd83c, 0xdf88, 0xd83d, 0xdd2e, 0xd83c, 0xdfa5, + 0xd83d, 0xdcf7, 0xd83d, 0xdcbf, 0xd83d, 0xdcbb, 0x260e, 0xd83d, 0xdce1, 0xd83d, 0xdcfa, 0xd83d, + 0xdcfb, 0xd83d, 0xdd09, 0xd83d, 0xdd14, 0x23f3, 0x23f0, 0x231a, 0xd83d, 0xdd12, 0xd83d, 0xdd11, + 0xd83d, 0xdd0e, 0xd83d, 0xdca1, 0xd83d, 0xdd26, 0xd83d, 0xdd0c, 0xd83d, 0xdd0b, 0xd83d, 0xdebf, + 0xd83d, 0xdebd, 0xd83d, 0xdd27, 0xd83d, 0xdd28, 0xd83d, 0xdeaa, 0xd83d, 0xdeac, 0xd83d, 0xdca3, + 0xd83d, 0xdd2b, 0xd83d, 0xdd2a, 0xd83d, 0xdc8a, 0xd83d, 0xdc89, 0xd83d, 0xdcb0, 0xd83d, 0xdcb5, + 0xd83d, 0xdcb3, 0x2709, 0xd83d, 0xdceb, 0xd83d, 0xdce6, 0xd83d, 0xdcc5, 0xd83d, 0xdcc1, 0x2702, + 0xd83d, 0xdccc, 0xd83d, 0xdcce, 0x2712, 0x270f, 0xd83d, 0xdcd0, 0xd83d, 0xdcda, 0xd83d, 0xdd2c, + 0xd83d, 0xdd2d, 0xd83c, 0xdfa8, 0xd83c, 0xdfac, 0xd83c, 0xdfa4, 0xd83c, 0xdfa7, 0xd83c, 0xdfb5, + 0xd83c, 0xdfb9, 0xd83c, 0xdfbb, 0xd83c, 0xdfba, 0xd83c, 0xdfb8, 0xd83d, 0xdc7e, 0xd83c, 0xdfae, + 0xd83c, 0xdccf, 0xd83c, 0xdfb2, 0xd83c, 0xdfaf, 0xd83c, 0xdfc8, 0xd83c, 0xdfc0, 0x26bd, 0x26be, + 0xd83c, 0xdfbe, 0xd83c, 0xdfb1, 0xd83c, 0xdfc9, 0xd83c, 0xdfb3, 0xd83c, 0xdfc1, 0xd83c, 0xdfc7, + 0xd83c, 0xdfc6, 0xd83c, 0xdfca, 0xd83c, 0xdfc4, 0x2615, 0xd83c, 0xdf7c, 0xd83c, 0xdf7a, 0xd83c, + 0xdf77, 0xd83c, 0xdf74, 0xd83c, 0xdf55, 0xd83c, 0xdf54, 0xd83c, 0xdf5f, 0xd83c, 0xdf57, 0xd83c, + 0xdf71, 0xd83c, 0xdf5a, 0xd83c, 0xdf5c, 0xd83c, 0xdf61, 0xd83c, 0xdf73, 0xd83c, 0xdf5e, 0xd83c, + 0xdf69, 0xd83c, 0xdf66, 0xd83c, 0xdf82, 0xd83c, 0xdf70, 0xd83c, 0xdf6a, 0xd83c, 0xdf6b, 0xd83c, + 0xdf6d, 0xd83c, 0xdf6f, 0xd83c, 0xdf4e, 0xd83c, 0xdf4f, 0xd83c, 0xdf4a, 0xd83c, 0xdf4b, 0xd83c, + 0xdf52, 0xd83c, 0xdf47, 0xd83c, 0xdf49, 0xd83c, 0xdf53, 0xd83c, 0xdf51, 0xd83c, 0xdf4c, 0xd83c, + 0xdf50, 0xd83c, 0xdf4d, 0xd83c, 0xdf46, 0xd83c, 0xdf45, 0xd83c, 0xdf3d, 0xd83c, 0xdfe1, 0xd83c, + 0xdfe5, 0xd83c, 0xdfe6, 0x26ea, 0xd83c, 0xdff0, 0x26fa, 0xd83c, 0xdfed, 0xd83d, 0xddfb, 0xd83d, + 0xddfd, 0xd83c, 0xdfa0, 0xd83c, 0xdfa1, 0x26f2, 0xd83c, 0xdfa2, 0xd83d, 0xdea2, 0xd83d, 0xdea4, + 0x2693, 0xd83d, 0xde80, 0x2708, 0xd83d, 0xde81, 0xd83d, 0xde82, 0xd83d, 0xde8b, 0xd83d, 0xde8e, + 0xd83d, 0xde8c, 0xd83d, 0xde99, 0xd83d, 0xde97, 0xd83d, 0xde95, 0xd83d, 0xde9b, 0xd83d, 0xdea8, + 0xd83d, 0xde94, 0xd83d, 0xde92, 0xd83d, 0xde91, 0xd83d, 0xdeb2, 0xd83d, 0xdea0, 0xd83d, 0xde9c, + 0xd83d, 0xdea6, 0x26a0, 0xd83d, 0xdea7, 0x26fd, 0xd83c, 0xdfb0, 0xd83d, 0xddff, 0xd83c, 0xdfaa, + 0xd83c, 0xdfad, 0xd83c, 0xddef, 0xd83c, 0xddf5, 0xd83c, 0xddf0, 0xd83c, 0xddf7, 0xd83c, 0xdde9, + 0xd83c, 0xddea, 0xd83c, 0xdde8, 0xd83c, 0xddf3, 0xd83c, 0xddfa, 0xd83c, 0xddf8, 0xd83c, 0xddeb, + 0xd83c, 0xddf7, 0xd83c, 0xddea, 0xd83c, 0xddf8, 0xd83c, 0xddee, 0xd83c, 0xddf9, 0xd83c, 0xddf7, + 0xd83c, 0xddfa, 0xd83c, 0xddec, 0xd83c, 0xdde7, 0x0031, 0x20e3, 0x0032, 0x20e3, 0x0033, 0x20e3, + 0x0034, 0x20e3, 0x0035, 0x20e3, 0x0036, 0x20e3, 0x0037, 0x20e3, 0x0038, 0x20e3, 0x0039, 0x20e3, + 0x0030, 0x20e3, 0xd83d, 0xdd1f, 0x2757, 0x2753, 0x2665, 0x2666, 0xd83d, 0xdcaf, 0xd83d, 0xdd17, + 0xd83d, 0xdd31, 0xd83d, 0xdd34, 0xd83d, 0xdd35, 0xd83d, 0xdd36, 0xd83d, 0xdd37, +]); + +export const EMOJI_OFFSETS = [ + 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, + 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, + 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, + 72, 74, 76, 78, 80, 82, 84, 86, 87, 88, 90, 92, + 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, + 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, + 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, + 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, + 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, + 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, + 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 259, + 260, 261, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, + 282, 284, 286, 288, 290, 292, 294, 295, 297, 299, 301, 303, + 305, 306, 307, 308, 310, 312, 314, 316, 318, 320, 322, 324, + 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, + 350, 351, 353, 355, 357, 359, 360, 362, 364, 365, 366, 368, + 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, + 394, 396, 398, 400, 402, 404, 406, 407, 408, 410, 412, 414, + 416, 418, 420, 422, 424, 426, 427, 429, 431, 433, 435, 437, + 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, 459, 461, + 463, 465, 467, 469, 471, 473, 475, 477, 479, 481, 483, 485, + 487, 489, 491, 493, 495, 497, 499, 501, 503, 505, 507, 508, + 510, 511, 513, 515, 517, 519, 521, 522, 524, 526, 528, 529, + 531, 532, 534, 536, 538, 540, 542, 544, 546, 548, 550, 552, + 554, 556, 558, 560, 562, 564, 566, 567, 569, 570, 572, 574, + 576, 578, 582, 586, 590, 594, 598, 602, 606, 610, 614, 618, + 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 641, + 642, 643, 644, 646, 648, 650, 652, 654, 656, 658, +]; diff --git a/webpack.config.js b/webpack.config.js index 1e8881bf9..9f2c965a3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -80,7 +80,16 @@ module.exports = (env = {}, argv = {}) => { test: /\.scss$/, use: [ MiniCssExtractPlugin.loader, - 'css-loader', + { + loader: 'css-loader', + options: { + modules: { + exportLocalsConvention: 'camelCase', + auto: true, + localIdentName: argv['optimize-minimize'] ? '[hash:base64]' : '[path][name]__[local]' + } + } + }, 'postcss-loader', 'sass-loader', ],