Changelog
Co nowego.
Każde ulepszenie platformy, jak to wysyła.
· kamo-shared-library
Zwieńczenie DISTINCT wydarzeń między właścicielami rollupu
Numer telefonu może być punktem kontaktowym dla więcej niż jednego właściciela na raz i dwóch Promy na jednym koncie, który dzieli się jednym z nich, jest przypadek z dnia RUSZNE - są one powszechnie Osoba pyta dwa razy. Mecz pisze celowo wiersz na jednego właściciela, Ponieważ każda z tych linii czasowych potrzebuje własnego. Podsumowując zwijanie, zwykły Liczy raport o jednym wezwaniu jako dwa, a odczyt kolejowy 11 powyżej listy pokazującej 6 is Gorzej niż w ogóle nie szyna. COUNT(DISTINCT sourceId) nad listą właścicieli jednego rodzaju liczy się dokładnie co Pojawia się merged timeline i zamienia 26 zapytań o liczenie konta na dwa.
· kamo-internal
Brać okno linii na członka i pokaż, w jakim trybie jesteś
Kontrola rolloutu. Domyślnie, opt-in na jednego członka z Ustawienia telefonu, zagnieżdżone Pod przełącznikiem VOIP, ponieważ nie oznacza to nic dla członka bez linii. Jeden haczyk jest właścicielem bramy, więc jej dwaj konsumenci nie mogą się nie zgodzić – kontrola NavTop To otwiera okno i pasek wewnątrz softphone, który go oferuje. A A. () Członek, który widzi jednego, ale nie drugiego, jest w gorszej sytuacji niż ten, który nie widzi żadnego. To się dzieje. Porażka zamknięta: nieosiągalna konfig odczytuje raczej cechę, niż oferuje Okno, które może nie działać, a softphone na stronie jest nienaruszony w żaden sposób. Pasek odpowiada na pytanie, na które członek w przeciwnym razie nie może zobaczyć odpowiedzi: To wezwanie bezpieczne od odświeżenia? Z okienkiem otwórz wezwanie, tam mieszka i Panel jest pilotem, więc oferuje przesunięcie okna do przodu - wyskakujące okienko Może skończyć za przeglądarką i nic innego nie może jej podnieść. Z oknem Zamknęła życie telefoniczne w zakładce, a odświeżenie kończy się, więc tak jest napisane. Inbound teraz używa jednego gestu, który może wykonać: powiadomienie pulpitu Kliknij, który wcześniej nie miał żadnego obsługi.
· VOIPService
Czytaj i zapisu bramy okiennej linii
Linia powierzchni GETWindowEnabled; PUT akceptuje go jako zniweczalny Boolean, tak że Nieobecność oznacza "niewsprę wspominany" i zachowuje wartość przechowywaną. Każdy istniejący Dzwoniący z tego punktu końcowego pomija pole, a traktowanie ich jako fałszywych Wyłącz funkcję dla każdego członka, którego ustawienia telefonu zostały zapisane dla Niezwiązany z tym powód. Normalizuje również null odczytanie na fałszywą przed zapisem: wiersz napisany przed Nieistniejąca kolumna może nadal przenosić null przez Hibernację, a kolumna NIE jest NULL.
· kamo-shared-library
Mapa LINE_WINDOW_ENABLED na MemberVoipKonfiskat
Brama naczłonkowe dla dedykowanego okna linii softfonowej. Szpilka wersji pozostaje przy 1.6.0 - dodanie pola nie wymaga uderzenia, a split pin złamie CI dla Każdy konsument od razu. Kolumna już istnieje w bazie danych; DDL wylądował w KamoInitializer Po pierwsze, celowo, ponieważ usługa, która mapuje brakującą kolumnę, zawodzi przy fasoli Stworzenie zamiast poniżania.
· InitializerService
DDL dla bramki liniowej na linię
Dodaje - domyślnie do false. Kolumna zamiast flagi cechowej, ponieważ nie ma tu systemu flagowego i MemberCapaable to zamknięty, zamknięty zestaw bez zamknięty bez zapasowego gniazda - więc Kontrola życia obok innych preferencji telefonicznych członka, które jest również miejscem, w którym Administrator by tego posłowił. Jego własny biegacz, a nie linia w MultiInstancePhoneMigration, ponieważ Uporządkowanie jest celem: KamoInitializer nie ma CI, więc jest to stosowane ręcznie i Przed zwieńczeniem VOIPService musi wylądować, który mapuje kolumnę, lub Hibernate zawodzi na Tworzenie fasoli i usługa nie zacznie się. ALTER został już zastosowany Do bazy danych na żywo z tego właśnie powodu; ten biegacz sprawia, że jest powtarzalny Idempotent dla każdego innego środowiska.
· kamo-internal
Sub-tab AI w Centrum Interaction
Sesje AI na żywo w AIService i nie są MediaSessions, więc to wiadro dostaje Własna ładowarka przed /api/media/sessions/chat pobierz pozostałe cztery Udział, a następnie dostosowuje każdą sesję do tego samego kształtu rzędu, a nie do sekundy Renderator – lista, jego wyszukiwanie, awatary i jego nieprzeczytany chip są jednym Powierzchnia, a drugi dryfowałby od pierwszego w ramach uwolnienia. Nieprzeczytane Przechodzi przez ai: przestrzeń nazw, którą czytają odznaki hexhead (getUnread, nie RozmowaKeyForWindow — wiersz listy czatów nie jest oknem narzędziowym, więc rząd i Zminimalizowane okno nigdy nie może się nie zgodzić na liczbę. Trzy luki poza własnym briefem planu, złapane, zanim zostały wysłane cicho: bucketOf() nigdy nie traterował sesjiType 'AI' gdziekolwiek, więc każdy wiersz AI postanowił "Muberzyjni" i zakładka AI uczyniliby trwale pustymi; wiersz Własny tytuł nigdy nie czytał row.title, więc każda rozmowa o sztucznej inteligencji pokazałaby się jako "Empty chat"; i 'ai' brakowało w ALL_BUCKETS, więc podtastota-członka Preferencja po cichu odmówi przywrócenia go po zmianie. Ten brief's's Przykład własny nie readFor() również nie jest używany jako pisany – zastępując istniejące Nieprzeczytane obliczenia z nim hurtowo zerowałyby z każdym rzędem Społecznym Odznaka (nigdy na mapie na żywo, w przeciwieństwie do CHAT / WSPARCIE) i błysnęła w każdym rzędzie zero przed załadowaniem migawki na żywo; gałąź AI jest składana w istniejące Zamiast tego obliczenia, zachowując oba.
· kamo-internal
Dedykowany okno linii
Wezwanie żyje teraz w oknie, którego przestrzeń robocza nie może dotknąć. SoftphoneProvider staje się właścicielem lub naśladowcą. Tylko właściciel REJESTA REJESTOŻY i Otwiera Gniazdo STOMP; naśladowca renderuje stan lustrzany, wysyła polecenia przez Mostek i pozostaje cichy – bez dzwonka, bez ringbacku, bez dźwięków zdarzeń, ponieważ Nie ma sesji, a jego przycisk odpowiedzi nic nie zrobiłby. Gdzie jest blokady sieci Niedostępna karta po prostu posiada linię i nie ma okna, które jest Dzisiejsze zachowanie: nigdy nie degraduj się do dwóch rejestracji. /foniczne rendery przez trzecią gałąź AuthedChrome przenoszącą SoundProvider i SoftphoneProvider i nic więcej. Wykluczenie ToolWindowRestore jest nośnikiem — jego osłona jest zakresem modułu, więc nowy dokument odtwarzałby całość członka Dok wewnątrz popup - i tak wyklucza SessionManager, który nawiguje do /logout po wygaśnięciu i usunie udostępnioną sesję Redis z dnia: Zakładka przestrzeni roboczej. Z tego samego powodu używaćUserInfo i apiCligent teraz odmawiają Z tej drogi nawigacja; przegrana sesja jest renderowana, a nie przekierowana. Okno otwiera się synchronicznie od kliknięcia w NavTop (przejściowa aktywacja Nie przetrwaj czekaj), jest nazwany, więc drugie kliknięcie skupia się, a nie Powiększenie i donosi o zablokowanym popupie zamiast po cichu – W stronę softphone działa w obie strony. Wewnątrz: brama startowa, która kupuje Aktywacja lepka, zanim cokolwiek będzie tego wymaga, przeładowanie klucza, zamknięcie Potwierdź i blokada czuwania ekranu.
· kamo-internal
Zakładka komunikacyjna, która zwija leady konta
Poziom, który większość ludzi zna, gdy mówią "wyzwania tych klientów". Kilka tropów Zwykle wieszaj jedno konto właśnie dlatego, że są tą samą osobą Zapytanie dwa razy, a każdy z ich połączeń był dopasowany do każdego, który prowadził. Liczba w tym czasie - więc czytanie osi czasu jednego ołowiu odpowiada na węższe pytanie Poza tym, o którego ktoś, kto patrzy na klienta, pyta. To sprawia, że istniejąca linia czasowa platformy, a nie druga. Kręgiem jest Historia leadów rysuje konto, które ma inną bazę. Jeden matcher, jeden Zakładka mówi, czego nie pokazuje. Bramy serwerowe z każdym zwiniętym leadem na Te same prawa, które dotyczy strona prowadząca i ogranicza, ile zwija się, i oba są Pojawia się: "Przewody N nie są wyświetlane, ponieważ nie masz uprawnień" jest Różne zdanie z "to konto ma więcej leadów niż my zwijamy się od razu", I jeden baner dla obu ukryłby pierwszy za drugim. Notatki i czat są nieobecne, a nie puste. Obaj są narodowi - nuta żyje Na strumieniu mediów smyczy, czacie na linku społecznościowym - więc konto nie ma nic wspólnego Umieszczony tam, a trwale pusta zakładka czyta się jako zepsuta, a nie niemożliwiona.
· KlusterServices
Odbij gołą wizytą na logowaniu Kamo i zakończ sesję na karcie zamknij
Zamknięcie zakładki KamoDesktop pozostawiło sesję na żywo siedzącą na maszynie. Guacamole (ang.) utrzymuje swój token auth w localStorage (GUAC_AUTH), który przetrwa zamykanie zakładki, Zamykanie okna i ponowne uruchomienie przeglądarki, a token pozostaje ważny przez 60 Minuty po ostatnim użyciu. Więc następna osoba, która otworzy bramę na tym Komputer odziedziczył komputer odziedziczony przez poprzednie urządzenie. Reprodukowany koniec do końca. Dwie zmiany, celowo obie strony serwerowe. Krawędź przekierowuje teraz żądanie gołego dokumentu do logowania.kamomocrm.com. KamoDesktop (ujednoznacznienie) Ma dokładnie jeden legalny punkt wyjścia – podpisany, jednorazowy link wybity dla Ktoś już uwierzytelniony do Kamo — więc osoba wpisuje nazwę hosta, lub Przywrócenie zakładki lub samoukończenie przeglądarki, nie ma żadnego interesu Widząc skrzynkę z hasłami Guacamole'a. Obsługa jednego z nich oferuje cel dotyczący masowania uwierzytelniania Na konto "sage" i pozwala przeglądarce trzymającej token na żywo po cichu wznowić Sesja. Celowo Scoped to Path(-/-): zimne obciążenie SPA ciągnie zasoby nr 41 i API To wywołuje, że nie niesie ze sobą „data”, więc wszystko, co szersze, rozbija aplikację wprost. Fragment „-client/... nigdy nie dociera do serwera, więc zakładka deep link jest Nagie - i jest również odbijane - co jest poprawne. A token jest teraz cofany, gdy zakładka znika, a nie po prostu Zapomniane: DELETE /api/sesja z nagłówkiem Guacamole-Token (zweryfikowany na żywo — 204, a token przestaje działać natychmiast). Pominięte na zamrożenie bfcache, więc Nacisk na plecy nie podpisuje nikogo. Kamo-reconnect.js już nie ma. Istniał do papieru nad upuszczonymi sesjami, zajęło mu Okazut dwukrotnie w dół, a przyczyny, które rekompensował – wdraża restartowanie Brama i OOM są u ich źródła. To, co go zastępuje, jest ćwierć wielkości i jego najgorszą porażką jest to, że jesteś zalogowany, czyli Wynik, jaki próbuje wytworzyć.
· kamo-internal
Własność linii, most i zasada przekazania bez jów
Trzy czyste moduły bez konsumentów, więc te statki są bezwładne. lineOwnership wybiera dokładnie jeden rejestrator SIP na przeglądarkę za pośrednictwem Web Locks. To jest Jest tu obowiązkowy, a nie defensywny: zweryfikowane na żywo, każdy FreePBX AOR jest max_contacts nr 1 z remove_istniejącym?, więc drugi REGISTER eksmituje pierwszy A eksmitowany dokument wciąż pokazuje "Rejestrowany", nie otrzymując nic. Zamki w sieci nie potrzebują protokołu liveness — blokada należy do agenta, więc Rozbite lub zabijące zadanie okno uwalnia go, a następny kelner jest promowany. Tam, gdzie API jest nieobecne, zgłaszamy "niewspierane", a dzwoniące trzymają dzisiejszą stronę Zachowanie zamiast ryzykować dwie rejestracje. lineBridge jest wersjonowaną kopertą BroadcastChannel. Nie okno. Otwieracz: to Idzie nieświeże dokładnie, gdy otwieracz przeładowuje, czyli wydarzenie w całości Funkcja istnieje po to, by przetrwać. Wersja skew ulega degradacji do nieświeżego pilota, Nigdy nie rzut w telefon na żywo UI. Stan lustrzany jest listą dopuszczalną — katalog Dane pozostają tam, gdzie są załadowane. Linia Handover to jedna zasada: rozmowa na żywo nigdy nie jest szarpana.
· kamo-internal
Tytuł karty liczy wszystko, co czeka, a nie tylko czat
Pasek tabu ma miejsce na jeden numer, a "tylko dochować i wsparcie" przestało być Na co członek czeka na raz SMS, sztuczną inteligencję, nieodebrane połączenia i nierecenzowane raporty Każdy z nich dostał wskaźnik.
· kamo-internal
Odznaka opcji AI z nierecenzowanym odpowiedziami
· kamo-internal
Całkowita liczba na ikonie telefonu, podział w menu
Ta ikona nie miała odznaki, więc nieodebrane połączenie, gdy softfon był Zamknięty dotarł do członka nigdzie. Otwarcie telefonu oczyszcza nieodebraną liczbę.
· kamo-internal
Suma na ikonie, podział w menu
W tokujne było całe odznakę, więc nierecenzowane raporty o błędach i webinaria zarezerwowane W czyimś imieniu nie miał możliwości dotarcia do nikogo. Otwieranie znaczków wiersza webinaru Widzieli, więc liczenie może faktycznie wyjść.
· kamo-internal
Odznaka na czacie liczy czaty
To było ciche pogawędki plus wsparcie, więc bilet zapalił dzwonek i nic Wyróżnił te dwie rzeczy. Wsparcie ma teraz własną ikonę; społecznościowe łączy czat, ponieważ Rozmowa towarzyska mieszka na liście Chats i nie ma własnej ikony.
· kamo-internal
Pozwól, by rozwijany rząd niósł własną liczbę
Ikona pokazuje sumę, a wiersze pokazują awarię - punkt podziału Wskaźniki widzą, że coś cię chce, nie otwierając niczego.
· kamo-internal
Thump po przybyciu, z blaskiem rozpraszającym się na zewnątrz
Własna warstwa wewnątrz .hex-scale: ten element już ożywia transformację dla Zawiołań rośnie, a dwie animacje na jednym elemencie nie komponują – drugi Zastępuje pierwszy, więc uderzenie w połowie porywiczy opadałoby skalę unoszącą się. Kluczowe, a nie przełączane klasą, lub dwie wiadomości w szybkim uderzeniu z rzędu raz. Gated impuls skali na klasie ".thumped" obecny dopiero po prawdziwym uderzeniu: Kluczowa zmiana sprawia, że ".hex-thump" jest świeżym węzłem DOM zarówno na prawdziwym uderzeniu, jak i pierwszym mount, a CSS nie może odróżnić tych dwóch od samego klucza, więc brief's Dosłowne okablowanie odtwarzałoby puls na każdej głowie przywróconą sesję Odradzają się - "ekran pełen pulsujących sześciokątów" powinien istniećThump, aby zapobiec.
· SecurityService
Oś czasu komunikacji na poziomie konta
Poziom, który większość ludzi zna, gdy mówią "wywołanie tego klienta". Kręgiem jest Już włączył się do właściciela, więc punkt końcowy konta jest ten sam połączony, Komponent renderuje go z niczym innym, jak tylko z inną podstawą. CommsSubjectResolver decyduje, którzy właściciele oś czasu mogą przeczytać, a jest to Jedno miejsce, w którym odpowiedź może być szersza, niż pytany jest temat. Tylko KONTO rozszerza się. Ołów nie dziedziczy ruchu ołowiu rodzeństwa: Dwa mogą być przydzielone różnym osobom. Pacjent w ogóle nic nie dziedziczy, Cokolwiek powie wykres konta - wykres pokazujący komunikaty czołówki CRM Być ujawnieniem, a ten test istnieje, aby utrzymać go w ten sposób. Zwój jest ograniczony do 25 właścicieli, a odpowiedź mówi, kiedy czapka jest bitowa. A A rollup, który po cichu upuszcza właścicieli, to linia czasu braku wiadomości na brak Widoczny powód, który jest gorszy niż ten, który przyznaje, że jest częściowy. Cross-org i brakujące konta otrzymują te same 404, więc odpowiedź nie może być wykorzystana Docieranie, które rachunki istnieją, a miss jest również audytowana. RozróżnijOrgId zamiast nowego synonimu: grzechotnik punktu końcowego uznaje, że Nazwa i czyta jedno ciało metody bez pozywania, więc pomaganie Nie można postrzegać odczytów jako niestrzeżonego punktu końcowego.
· kamo-shared-library
Pozwól kontu zwinąć komunikację swoich leadów
Kilka leadów często wiesza jedno konto właśnie dlatego, że są one Osoba pytająca dwa razy, a każdy z ich połączeń był dopasowany do każdego, ktokolwiek Lead utrzymywał w tym czasie numer. Więc "komunikacja tego klienta" jest Związek własnych rzędów konta i każdego z jego tropów” – czytając jeden Ołówek otwierający odpowiedź na węższe pytanie niż zadane. ZnajdźUidsByccount projekty uids zamiast jednostek celowo: Lead siedzi Hierarchia dziedziczenia JOINED, a wybór jednostek tutaj przeciągałby Cały plan w sprawie sporządzenia listy idów. PhiResourceType.ACCOUNT więc wiersze audytu okładki określają, co było Właściwie czytaj. Zaatakowany, nigdy nie wstawiony – enum jest wytrwałe.
· kamo-internal
Jeden kontekst dla liczby czterech wskaźników
Kompozytuje to, co istnieje i jest właścicielem trzech, które nie miały domu: nierecenzowany błąd Raporty, nierecenzowane webinaria oraz nieodebrane połączenia telefoniczne i wiadomości głosowe. Pierwszy kleszcz z lat 60. nie jest pasem i ogrami - kilka z nich przybywa Rdzeń NATS bez powtórki, więc ramka opublikowana do zakładki do spania nie nadchodzi.
· kamo-internal
Zrzutka beacon donosi, która ścieżka ICE faktycznie wybrała
Sygnała wysłała IceCandidateType jako pole trwale nieważne. To jest gorsze niż pominąć go: sprawia, że telemetria wygląda bardziej pouczająco niż jest, i Jest to jedyny pomiar, który może przekierować cały projekt okna liniowego. Internetowy softfon buduje swoje wzajemne połączenie z jednym zakodowanymi w twardo publicznym STUN Obrachunkowy ładowność nigdy go nie niosła. Więc członek za symetrycznym NAT, a VPN lub operator CGNAT może nie ustanowić mediów bez powrotu, I to, co zgłaszają, to "na wezwanie odrzucone". Po tym, jak jest, Nieodróżnialne od "I hit refresh", a obaj mają zupełnie inne Naprawy - jedna z nich dwie linie konfiskaty TURN, a nie nowy kontekst przeglądania. "przekaźnik" / "ssrflx" / nic nie jest dowodem ich rozdzielenia. Ścieżka SIP.js Ponowne wykorzystanie kandydata paruje istniejący wysypisko diagnostyczne już oblicza, więc Bez dodatkowych getStats; RingCentral path próbra raw.rtcPeerConnection na Odpowiedz. Odczyt zerowy jest raczej REKODNIONE niż pominięty – "ICE selected no pair" Jest to porażka bez przekaźników i najcenniejszy lektura dostępna – i callDurationSeconds oddziela go od "zadzwonionego zakończenia przed próbką". Również zapisy w planie, co faktycznie wysłano, w tym strażnika Zadania 6, który Różni się od planu, jak napisano.
· kamo-internal
Jeden dzień wybieracz, udostępniany przez kalendarz i kartę ustawień
Obie powierzchnie wyhodowały własną odpowiedź na "które dni?". Ustawienia Postaw Workweek Days, Weekend Days i Every Day za dropdown; Edytor kalendarza miał wstążkę multi-select i w ogóle nie miał grup. Niezależnie od tego, kto Najpierw nauczył się członek, drugi nie mógł zrobić tego, co zrobił. Dzielą teraz AvailabilityDayPicker — przyciski grupowe i siedem żetonów, Na obu stronach, zdefiniowane raz. To jedyny układ, który utrzymuje ich Tak samo następnym razem, gdy zostanie dotknięta. Grupy wybierają, a nie oszczędzają. Naciśnięcie "Dni tygodnia pracy" obraca się na pięciu żetonach i Nic w dół nie interpretuje strażnika: członek może natychmiast odznaczyć Środa, na którą są daleko, a to, co dociera do zaplecza, jest tym, co ma. Zawsze wzięte, jedno okno dziennie. Przycisk grupy odczytuje się jak w przypadku, gdy jest to dokładnie Wybierane są jego dni, więc kontrola może powiedzieć "to jest tydzień pracy" zamiast Zostawia kogoś, kto będzie liczył oświetlone żetony. Zakładka ustawień zyskuje coś, czego nigdy nie miała - dowolny wielodniowy wybór. "Poniedziałek, środa i piątek" nie było wyraźne wcześniej; to był jeden dzień Albo jedna grupa. DlategoAktuacja trwa dzień, a nie dzień-lub grupa, co jest tym, co jest tym, co Pozwala obie powierzchniom dzielić się rodzajem wyboru. Oba poręcze wciąż trzymają się i są Wciąż przypięta: edycja nigdy nie rozszerza się na kilka rzędów i wielodniowy wybór Nigdy nie załamuje się do jednego. Panel "Co to znaczy?" zaczyna się teraz zawalić dla wszystkich. Otwarcie To dla członka, który nie ma nic zadeklarowanego, był uważany za życzliwość i był niewłaściwy. Po pierwsze - nacisnął listę i przycisk, który zaczyna wszystko w dół Kolumna, więc pierwszą rzeczą, którą spotkał nowy prezenter, była ściana prozy, a nie O sterowaniu prozą. Również zwiększa timeout na skanowaniu całego drzewa katalogu dźwiękowego. To czyta i Konktumentuje każdy plik źródłowy w aplikacji, ląduje na 6-13s za każdym razem, gdy maszyna Jest zajęty i zawodził w apartamencie przeciwko domyśleniom Vtesta - z wiadomością Nie wymieniło tego żadnego zdarzenia, bo nigdy nie osiągnęło swojego twierdzenia. Skan jest warta Utrzymanie; domyślny timeout jest po prostu nie dobrany dla niego.
· kamo-internal
Odznaka zminimalizowane okno z nieprzeczytaną liczbą serwerów
Jedyny element, który widzi zarówno listę okien, jak i nieprzeczytane mapy — Silnik nic nie wie o rozmowach, a nieprzeczytany kontekst nic nie wie O oknach, więc żaden z nich nie mógł odpowiedzieć sam. Wysyłka tylko na zmianę: klucze uderzeń z podwyżki, więc powtarzana liczba Wyglądałoby to jak przyjazd, a głowy pulsowaliby na zegarze odświeżającym.
· kamo-internal
Ustaw bezwzględną liczbę nieprzeczytanych z serwera
Zastępuje hexhead: przychodzące, której nic nigdy nie wysłało. Jego +1 będzie miało Naliczono ponownie wyselekconą migawkę jako nową wiadomość, a jej odradzającą się - Gałąź pozostawiłaby głowicę, której okno nie istnieje – klikalne i bezwładne.
· kamo-internal
Wiadomości i połączenia, na istniejącym komponencie osi czasu
CommunicationsTimeline i EmailEntry biorą opcjonalny punkt końcowy i Utrzymuj ścieżkę prowadzącą jako domyślną, więc każda istniejąca witryna wywołania jest byte-for- Nie obchodzi, o czym jest oś czasu – kluczowanie właściciela jest całkowicie Po stronie serwera, dokładnie tak, jak MediaStream przyjmuje feedEndpoint i DocManager Przyjmuje (sassocType, assocObjectId). Wiadomości pacjenta są rysowane przez Pasek punktu kontaktowego nad osią czasu jest częścią, która w przeciwnym razie Zaginąć. Oś czasu to widok; połączenia przychodzące i wiadomości tylko LAND Na właścicielu matcher może rozwiązać, więc pacjent bez zarejestrowanego numeru Ma pustą linię czasową z powodu, w którym nic innego na ekranie Wyjaśnij. Jego pusty stan dokładnie to mówi, zamiast nic nie sugerować - Zawsze się zdarzało. 3149 testuje zielony, sprawdzaj czyszczenie.
· SecurityService
Wezwania pacjenta, SMS-y i e-mail – na własnym kręgosłupie platformy
Nie drugi harmonogram. LeadCommunicationsService teraz przyjmuje CommsSubject A przeciążenie ołówkami do niego, więc /leads zachowuje swoje dokładne zachowanie Dry. Pacjent jest po prostu kolejnym właścicielem. Notatki i czat pojawiają się tylko dla tropu, a to jest fakt, a nie Strażnik: notatki pochodzą z strumienia multimediów i czatu z SocialRemoteUserLead, z których żadne nie istnieje dla pacjenta. Oba źródła Już wraca pusto, gdy ich link jest nieobecny, więc pacjent zostaje dopasowany Ruch uliczny i nic nie udaje, że jest inaczej. Rejestracja punktów kontaktowych to połowa, która sprawia, że działa. Wskazując na a Oś czasu u nowego właściciela zmienia to, co jest CZYTAJ; ruch przychodzący tylko kiedykolwiek LANDS na właścicielu matcher może rozwiązać, więc pacjent, którego numer nie jest Punkt kontaktowy otrzymuje telefony, które determinują do nikogo. Rejestracja ma być Punkt w czasie, jak kręgosłup prowadzący - zmiana liczby zamyka stary punkt Otwiera nowy, więc telefon sprzed dwóch lat wciąż wyjaśnia, co to jest Mecz - i stosuje tę samą siedmiocyfrową podłogę, ponieważ czterocyfrowa Przedłużenie w przeciwnym razie pasuje do każdego pacjenta dzielącego te cyfry. Czytanie któregokolwiek z nich wymaga relacji opiekuńczej z pacjentem, dokładnie tak, jak Wykres, a każdy pokazany wpis pisze własny wiersz audytu. Poczta głosowa od Pacjent jest tak samo identyfikujący się jako lista problematycznych. Punkt końcowy email-body ponownie sprawdza rząd przeciwko pacjentowi na ścieżce. Kontrola opieki jest usatysfakcjonowana przez pacjenta w adresie URL, więc Bez tej drugiej kontroli lekarz z związkiem z jednym pacjentem Można odczytać każdą wiadomość w praktyce, dostarczając jej id — prowadzenie Punkt końcowy dokonuje tego samego ponownego sprawdzenia z tego samego powodu. 404 to jedna odpowiedź "Nie ten pacjent", "nie e-mail" i "nie jest jeszcze pochód", więc Odpowiedź nie może być wykorzystana do badania idów wiadomości. Również tutaj: kontroler giełdy TEFCA — pacjent nr 164.528 Rachunkowość, wszystko wysyłane do jednego partnera (kwestra, które ktoś uruchamia Zgłoszono godzinę naruszenia), część 2 ujawnienia jako własne pytanie, oraz Kolejka recenzji cross-organization match. 1278 testuje na zielono.
· kamo-internal
Przestań tracić połączenia do wygaśnięcia sesji, łez i nieświeżych urządzeń
Cztery poręcze, które dzielą się dwoma plikami, więc dzielą się zobowiązaniem. Rozmowa na żywo liczy się teraz jako aktywność sesyjna. ClientActivityTracker zrównany Obecność z wydarzeniami wejściowymi, więc członek słuchający długiego połączenia odczytuje jako bezczynnie: Redis TTL rozpadł się, ostrzeżenie o wygaśnięciu otworzyło się w zakładce, której nie szukali Na, i /logout zerwał drzewo z sesją SIP. Trasa przez Istniejące markNow(), więc wyłączenia wylogowania nadal wygrywa - sesję Własne podłogiMonitora (okno aktywności 120s, 60s ponownie wydłużają minimum) regulują kadencję, więc nie może to być możliwe Uciekaj. Dokument, który umiera z powodu połączenia, mówi, że tak. Ukryj strzela do najlepszego wysiłku BYE – daleki koniec wcześniej siedział na martwej nodze, dopóki rejestrator nie zmierzył się z czasem Kontakt, do dziesięciu minut z wygasa:600 – i nośnik beaconowy Członek, org, dostawca i hadLiveSession. Nic nigdzie się nie liczyło, jak często Rozdarcie faktycznie kosztuje połączenie, więc nie było numeru, który mógłby ważyć większą poprawkę - przeciwko. Sygnała dopuszcza do listy swoich pól: brak zdalnych numerów w dzienniku strąków, oraz Ids pozostają strunami, ponieważ są wst64. Druga zakładka nie dzwoni już z martwym przyciskiem Answer. Temat VOIP STOMP jest Transmisja, więc każdy otwarty zestaw dokumentów macomingCall, podczas gdy tylko ten Dostawca wysłał INVITE, aby mógł odpowiedzieć. Gated na sesji, a nie na SDK, ponieważ z dwiema zakładkami otwarte obie karty posiadają rejestrację. Zmiana urządzenia dociera do połączenia z dowolnego okna. saveAVSettings wysyła Custom-vent jednookne CustomEvent; tylko useAVSettings również wsłuchiwano w celu uzyskania przeznaczy Wydarzenie magazynowe, więc każdy konsument call-path przegapił zmianę wprowadzoną gdzie indziej - Po cichu, ponieważ applySinkId połyka każdą awarię. Jedna subskrypcja AVSettings Teraz obejmuje obie połowy.
· InitializerService
Wytrzyj kręgosłup do właściciela, w kolejności, która zapewnia bezpieczeństwo
LEAD_CONTACT_POINTS i LEAD_COMMUNICATIONS zyskują menedżera dokumentu (assoc_type, assoc_object_id) więc konto, pacjent lub handel Rekord może posiadać komunikację bez pożyczania ołowiu. Cztery kroki, a kolej jest cały punkt. Backfill first: każdy istniejący wiersz jest ołowiu, więc assoc_type - 'LEAD' i assoc_object_id - lead_uid::text. Prowadzenie go po zamianie ograniczeń Zbuduje nowy unikalny indeks nad rępami, nie egzekwowając niczego. Następnie zamień unikalne ograniczenie na parę właścicieli. (org_id, lead_uid, Kanał, source_id) jest tym, co powoduje, że spożycie idempotentuje — połączenie RingCentral Jest widziany dwa razy, raz przez webhook i raz przez pojednanie – Z ołowianiem_uidem null dla pacjenta, Postgres leczy każdy z nich NULLs jako odrębne, więc druga obserwacja wstawia duplikat. Nowy Następuje się przed upuszczeniem starego, więc porażka między Pozostawia stół chroniony przez jednego, a nie przez żadnego. Tylko wtedy zrelaksuj lead_uid's NOT NOT NULL. Hibernate's ddl-auto: update dodaje Kolumny, ale nigdy nie rozluźnia ograniczeń, więc nie można tego pozostawić do mapowanie - i robienie tego, zanim swap otworzy dokładnie zduplikowane okno - powyżej. Następnie sprawdź, czytając pg_constraint i information_schema z powrotem. Natchiwni w tym, w tym, że pont w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym Klawisze kliniczne były poprawne w Javie i błędne w emitowanym DDL, I tylko odczytać pg_constraint pokazał to. Rząd pozostawiony bez typu właściciela Nigdy nie pojawi się na żadnej osi czasu, więc ten przypadek rejestruje błąd, a nie Zgłoszeniu sukcesu. Idempotent przez cały czas, a brakujący stół jest pomijany, a nie zawodzi But – wyjątek tutaj zabrałby z nim każdego późniejszego biegacza. 176 testów na zielono.
· kamo-shared-library
Klucz do komunikacji kręgosłupa na właściciela, a nie trop
Kręgosłup został zbudowany w kształcie ołowiu — LEAD_CONTACT_POINTS.LEAD_UID, LEAD_COMMUNICATIONS.LEAD_UID — a stowarzyszenie, którego faktycznie potrzebuje, to Szersza. Konto jest właścicielem kilku leadów, zazwyczaj dzieląc ten sam punkt Kontakt, ponieważ są to ta sama osoba, która dwa razy pyta. Rekord handlowy Zwisają się z konta, a nie z jednego tropu. I wykres pacjenta ma Rozmowy i e-maile na ten temat i nie ma żadnego leadu. Klucz do leadów oznaczał, że Ci, którzy pożyczyli ołów, albo wyhodowali równoległą linię czasu. Obie tabele mają teraz menedżera dokumentu (sassoc_type, assoc_object_id) Para, z LEAD, KONTO, PATIENT i COMMERCE_RECORD jako właściciele. LEAD_UID jest KEPT i nadal wypełniany dla rzędów należących do ołowiu, więc każdy istniejący Zapytanie, indeks i strona wywoławcza są nietknięte - repozytorium klucza prowadzącego Metody i przeciążenie linii czasu leadów pozostają, a nowy właściciel One siedzą obok nich. Trzy rzeczy, które musiały zrobić dobrze, a jedna prawie się pomyliłam. Unikalne ograniczenie przenosi się do pary właściciela. (ORG_ID, LEAD_UID, CHANNEL, SOURCE_ID) jest tym, co sprawia, że spożycie idempotentuje — widać połączenie RingCentral Dwa razy, raz przez webhook i raz przez pojednanie. W przypadku LEAD_UID null dla pacjenta, Postgres traktuje każdego z tych NULL jako Wyraźna i druga obserwacja wstawia duplikat. Tabela punktów kontaktowych ma większe znaczenie niż oś czasu. Wskazywanie osi czasu U nowego właściciela zmienia to, co jest CZYTAJ; ruch przychodzący tylko LANDS na Właściciel, który ma punkty kontaktowe, ponieważ to jest to, co łączy - W meczu. Pacjent, którego numer nie jest punktem kontaktowym, otrzymuje połączenia, które Postanów do nikogo. Ten, który prawie wysłałem: linker de-duped match by cp.getLeadUid(). Dla nieołowionego punktu kontaktowego, który jest nieważny, więc widzianyLeads.add(null) pozwoliłby Dokładnie JEDEN właściciel bezołowiowy przez wiadomość przygrana – połączenie z numerem Dwóch pacjentów dotrze do jednego z nich, po cichu. Teraz de-dupes on Właściciel. assoc_type jest STRING, nigdy ordynalnym. Hibernacja zamraża CHECK (Około między 0 i N) nad kolumną enum w TABLE BLICZACH TRETATE i nigdy Ponowne dotowanie go, więc dołączenie wartości później odrzuca każdą wkładkę niosącą ją - Po cichu, ponieważ stwierdzenie w nieudanej formie siedzi wewnątrz metody transakcyjnej Które wycofanie usuwa dowody. Siedem z nich zostało znalezionych pełnych i Już w sierpniu łamią rzeczy na tej platformie. Przechowywane null odczytuje jako LEAD, ponieważ każdy wiersz napisany przed kolumną Istniał trop, a powracający null dla tych, którzy wymazaliby linię czasu. Ta zmiana istnieje do poszerzenia. Wartość NIEZNANA brzmi raczej jako nieważna niż LEAD – przywiązanie czyjegoś ruchu do linii czasu prowadzącej jest tym jedynym Zła odpowiedź gorsza niż żadna. Również w tym zobowiązaniu: warstwa giełdowa TEFCA (partnerzy, ujawnienie informacji Dżuma, dopasowywanie pacjenta do pracy). Jego kody celowe są teraz Te same HL7 v3 ActReason strings PhiPurposOfUzy już używane - test złowiony Wymyśliłam "T" do leczenia, gdzie platforma mówi "TREAT", i "Ak" wiersz wymiany i wiersz audytu opisują to samo ujawnienie z dwóch kątów, Tak więc raport, do którego dołączyli, łączy się z tymi strunami. 1932 testuje na zielono.
· kamo-internal
Liczy się SMS i sztuczna inteligencja oraz podział na powierzchni
One MediaService snapshot obejmuje trzy powierzchnie, które należą do dwóch różnych nav Wskaźniki, więc sumy są oddzielone od zadeklarowanej sesji serweraType Od których okna są otwarte. Wpis bez sesjiType liczy się jako czat - to jest to, co wysyła starsza kompilacji, I utrzymuje odznakę robiąc to, co robiła, zamiast porzucać liczenie w połowie rozmieszczenia.

Twój wszechświat czeka.
Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.
Bezpłatne na zawsze — nie wymaga karty kredytowej