release: 1.14.0#1037
Merged
Merged
Conversation
In media settings user can see ice and Ice. It was changed to ICE because it is abbreviation. Also settings_iceSettings_Section_tooltip in Italian language was changed because with abbreviation meaning was changed.
* fix: fixed displaying wrong name in keypad Fixed displaying inconsistent name hint in keypad view. Added storing raw number and sanitized versions together. * fix: fix comments * feat: remove trimming whitespaces from number * style: fix styling
In this pull requests bug with not showing Google contacts in Android was not showing. App only displays contacts that saved on device.
* feat: add style enums and extend ImageRenderSpec with alignment and fit - Introduce common style enums (BorderType, AlignmentConfig, BoxFitConfig) - Export new style_types module from common models - Extend ImageRenderSpec to support alignment and BoxFit options - Update JSON serialization/deserialization and Freezed models - Improve image rendering flexibility for theme-driven layouts * chore: add alignment to onboarding image render config - Set explicit center alignment for onboarding logo images - Update both light and dark theme JSON configs - Align theme configuration with new ImageRenderSpec capabilities * feat: add configurable theme image support with alignment and fit - Add AlignmentConfig and BoxFitConfig extensions for Flutter mapping - Introduce ThemeImageStyle and factory for theme-driven image styling - Implement ConfigurableThemeImage widget for rendering themed SVG assets - Wire new style and extensions into theme exports - Enable alignment, fit, padding, and scaling via theme configuration * refactor: migrate remaining onboarding/logo usage to ConfigurableThemeImage - Replace OnboardingLogo/OnboardingPictureLogo usages with ConfigurableThemeImage - Extend login screen styles to use ThemeImageStyle + onboarding text style - Refactor About screen to render themed logo via ThemeImageStyleFactory - Update style factories to build pictureLogoStyle from mainLogo config - Remove legacy onboarding logo widgets and exports * style: migrate login screenshots to ConfigurableThemeImage
) * feat: add page background models and settings page config * feat: add gradient page backgrounds to login/settings/keypad configs * feat: add page background config > style mapping * feat: allow passing backgroundColor and elevation to MainAppBar * feat: introduce BackgroundStyle and ThemedScaffold * feat: add background support to screen styles and use ThemedScaffold * feat: introduce BackgroundStyle and ThemedScaffold
Extension for external contact was removed. Fetter for safeSourceId was tranferred to ExternalContact model.
) * refactor: extract and extend appearance theme config models * refactor: improve GroupTitleList style merging and theming * feat: extend AppBar and TabBar theming via config-driven factories - Add IconThemeConfig extensions to map config to Flutter IconThemeData - Replace string-based border types with BorderTypeConfig enums - Expand AppBarThemeDataFactory to support full AppBarConfig options - Enhance TabBarThemeDataFactory with configurable indicators, alignment, animation, and splash - Wire new AppBarConfig and TabBarConfig through ThemeStyleFactoryProvider - Remove hardcoded TabBar indicator in ExtTabBar in favor of theme-driven styling * docs: document TabBarConfig and AppBarConfig usage * docs: clarify BorderConfig documentation and formatting * refactor: replace TabBar string options with enums and typed extensions
Fixed bug with no available media for 20 seconds in Firefox after enabling video.
* feat: add themed SettingsScreen styles and support item iconColor * fix: use resolved effective settings style for icons and text * refactor: fix typo by renaming GroutTitleListStyle to GroupTitleListStyle * docs: add documentation for SettingScreenStyle * fix: include background in SettingScreenStyle merge and lerp * chore: fix import to use GroupTitleListStyle definition * docs: document SettingsTile and tidy widgets exports * chore: reorder imports and constructor parameters for consistency
…820) * fix: guard background message handler with runZonedGuarded * refactor: pass logger into background message handler * fix: guard contact lookup in background isolate with fallback on DB errors * fix: report background handler errors to Crashlytics - rename _initFirebase to _initFirebaseApp for clarity - initialize Firebase in background isolate before Crashlytics usage - record unhandled bg isolate errors via Crashlytics + logger * fix: initialize Firebase before guarded background handler execution
…823) * fix: hide local camera preview when video is logically muted * docs: document soft-mute camera strategy and RecvOnly server issue * docs: fix typos and complete camera preview comment
* refactor: extract local camera preview overlay widget * refactor: tweak camera preview overlay switch icon position * refactor: round local camera preview overlay corners * style: fix formatting in LocalCameraPreviewOverlay * refactor: rename localePlaceholderBuilder to localPlaceholderBuilder * docs: expand LocalCameraPreviewOverlay API documentation
* fix: stabilize draggable thumbnail by tracking offset state * fix: add drag safety checks to prevent thumbnail jumping * docs: add explanatory comments for draggable thumbnail bounds and snapping
* test: add fake_async as a dev dependency * refactor: export extensions from call barrel file * feat: add ActiveCall list auto-compact extension * feat: add CompactAutoResetController for auto-hide UI controls * test: add coverage for CompactAutoResetController and auto-compact extension * feat: add auto-hide compact controller to CallActiveScaffold * refactor: simplify CallActions callbacks and remove redundant setState
* feat: add auto-hide compact controller to CallActiveScaffold * refactor: simplify CallActions callbacks and remove redundant setState * feat: add configurable objectFit to RTCStreamView * feat: add remote video fit toggle via RTCVideoViewObjectFit extension * refactor: extract RemoteVideoViewOverlay widget * feat: add blurred background for remote video in contain mode * feat: add video view options menu for fit and blur toggles * refactor: show blur toggle only for contain fit * feat: add video background modes and refactor remote video options * refactor: clarify fit/background mode extensions and rename toggle helpers * feat: localize call video view and background toggle labels
Previously, when toggling the camera on an active call with an existing video track, the track's enabled state was modified, but the BLoC did not emit the updated state. This caused the UI button to become desynchronized from the actual camera state (e.g., camera turns off, but button stays active). This commit adds the missing emit call to ensure the activeCall.video property is updated in the state, triggering the necessary UI rebuilds.
Fixed not selectable value on slider
Added label for core version on About screen.
* fix: wrong source identifier * fix: remote push structure
…ingService abstraction (#1011) * refactor: decouple AppLogger from LogzioLoggingService via RemoteLoggingService abstraction * refactor: move remoteMinLevel extraction to init to avoid cast in applyConfig * refactor: add minLevel to RemoteLoggingService and remove cast from AppLogger * refactor: reorder LogzioLoggingService fields to match RemoteLoggingService interface order * refactor: remove labelsProvider from AppLogger state, pass labels explicitly * refactor: rename regenerateRemoteLabels to updateRemoteLabels and dispose before reinitialize * refactor: replace labels map with lazy callback in AppLogger to encapsulate labels retrieval * fix: attach remote appender before applyConfig so early logs are forwarded to remote
* feat: enable and disable log anonymization with env Added functionality to disable and enable log anonymization via environment variable * refactor: simplify AnonymizationType to none/full enum with bool flag Replace the mutable list-based anonymization approach with a single AnonymizationType enum (none/full), removing the race condition risk and simplifying the API surface. * docs: document intentional anonymization scope in AppLogger * fix: add @OverRide annotation to setAnonymizationEnabled in LogzioLoggingService --------- Co-authored-by: Dmytro Serdun <d.serdun@webtrit.com>
* fix: use shared static logger in WebtritSignalingClient with instance id prefix * fix: restore custom logger support via inner constructor parameter * fix: simplify logger to use fixed name without instance counter * fix: remove custom logger parameter from inner constructor
* fix: snackbar duration * fix: new persist option usage * fix: reconnect message repeating * fix: reconnect on keepalive timeout
* feat: main impl * refactor: call to actions fix * fix: call to actions provider * docs: getAndListed explain
* fix: migrate to 4.5 * fix: various fixes * fix: remove log file from standart test
…glare (WT-986) (#1003) * refactor: extract RenegotiationHandler with stable-state and concurrency guards - Extract renegotiation logic from CallBloc into a standalone RenegotiationHandler class - Add two stable-state guards: pre-offer check and TOCTOU guard after createOffer - Add _isHandling/_pendingRetry flags to serialize concurrent onRenegotiationNeeded firings - Catch WebtritSignalingErrorException for server-side error logging without swallowing - Catch plain String errors (flutter_webrtc native) separately from Dart exceptions - Add unit tests covering stable-state skip, concurrency serialization, and error paths - Document server-mediated vs P2P topology constraints and Perfect Negotiation limitation * fix: add signalingState guards and Perfect Negotiation rollback to call flow ICE restart handler: - Skip setLocalDescription when signalingState != stable to prevent native crash - Log warning instead of silently skipping Renegotiation / accepted handler: - Guard setRemoteDescription(answer) against wrong state after glare resolution - Log transceivers after setRemoteDescription for SDP debugging - Catch String errors from setRemoteDescription to prevent unhandled exception escalation Updating handler (Perfect Negotiation rollback): - Pre-check signalingState for glare: if have-local-offer, roll back local offer before setRemoteDescription - Catch String errors containing have-local-offer as fallback for stale flutter_webrtc signalingState cache - Roll back and retry setRemoteDescription on confirmed glare Renderer and state: - Always refresh srcObject in RTCStreamView.didUpdateWidget to handle renegotiation-replaced tracks - Fix remoteVideo getter to use logical OR (stream tracks || video flag) instead of short-circuit Add call_state_test.dart covering ActiveCall equality and remoteVideo edge cases * refactor: replace on String catch with typed RTC exceptions via RtcJsepErrorParser
…ompletes (#1027) * fix: guard RTCVideoRenderer srcObject assignment until initialize() completes Prevents a crash where didUpdateWidget set srcObject before the renderer was initialized, causing 'Call initialize before setting the stream'. The _initialized flag ensures srcObject is only set after initialize() resolves. Also always refreshes srcObject (not just on stream identity change) to handle track replacement during renegotiation. * fix: use setState and guard build before renderer initialization Wrap _initialized and srcObject assignment in setState so the flag change is properly synchronized with Flutter's build cycle. Guard build() to avoid passing an uninitialized renderer to RTCVideoView — the placeholderBuilder (or empty SizedBox) is shown until initialize() completes.
…ad of getLocalInfo (#1029)
* feat: handle 'voicemail_not_configured' error Added handling 'voicemail_not_configured' error from voicemail api * fix: properly handle voicemail_not_configured and endpoint_not_supported errors across all layers - WebtritApiClient: skip SEVERE log for expected VoicemailNotConfiguredException / EndpointNotSupportedException - VoicemailRepositoryImpl: add _featureSupported flag to skip API calls once feature is known unavailable; add _fetchingCompleter.future.ignore() to prevent unhandled future errors; suppress stack trace in warning log for expected exceptions; expose isFeatureSupported getter - VoicemailRepository: add isFeatureSupported to abstract interface; EmptyVoicemailRepository returns false - VoicemailCubit: check isFeatureSupported on init to immediately emit featureNotSupported without an API call - SettingsBloc: catch expected exceptions from unawaited fetchVoicemails() to prevent runZonedGuarded propagation - PollingService / ConnectivityLifecycleService: remove stack trace from WARNING logs in generic catch blocks * fix: always allow navigation to voicemail screen regardless of feature support Previously the settings tile was disabled with reduced opacity when voicemail was not configured, which was confusing. Now the tile is always tappable and the voicemail screen shows a placeholder explaining the reason. * fix: move VoicemailCubit provider from SettingsScreenPage to VoicemailScreenPage VoicemailCubit was provided at the settings level but consumed in a separate route, causing ProviderNotFoundException on navigation. Moving it to VoicemailScreenPage makes the provider scope match the consumer. * fix: add missing call feature import to VoicemailScreenPage * fix: remove unused stack trace variables from catch blocks in polling and connectivity services * fix: address Copilot review comments - VoicemailCubit: guard watchVoicemails subscription against overwriting featureNotSupported state - VoicemailNotConfiguredException: pass token and error fields to super; remove commented-out placeholder - WebtritApiClient: log xRequestId (never null) instead of requestId parameter; pass token/error to VoicemailNotConfiguredException - SettingsTile: add assert that opacity is in [0.0, 1.0] --------- Co-authored-by: Dmytro Serdun <d.serdun@webtrit.com>
…uctor inconsistency (#1030)
…#1031) Auto-triggered fetches (startup and connectivity restore) now use _fetchStatusSilently(), which skips handleError for SocketException, TimeoutException, and TlsException. The cubit retries automatically on the next connectivity change, so surfacing these transient failures to the user is misleading. User-initiated fetchStatus() retains the original behaviour and still calls handleError for all errors.
…andler (WT-1061) (#1032) Telecom on affected devices can become overloaded with phantom PhoneAccount registrations, causing reportNewIncomingCall() to hang indefinitely. This keeps FlutterFirebaseMessagingBackgroundService alive and blocks subsequent cold starts. Adding a 10s timeout bounds the handler lifetime and logs a warning when Telecom is slow to respond.
…server (WT-1061) (#1035) * fix: eliminate write-write SQLite contention via shared DriftIsolate server (WT-1061) Spawns a single dedicated DriftIsolate server in the main isolate bootstrap and registers its SendPort in IsolateNameServer under a fixed key. Background isolates (FCM handler, WorkManager) now connect to the same server via IsolateDatabase.connectOrCreate(), which looks up the port and creates a client connection — falling back to a direct NativeDatabase connection when the main app is not running (cold push with no foreground app). All writes are serialized through the single server isolate, making write-write SQLITE_BUSY (code=5) between concurrent isolates impossible. Changes: - app_database: add createAppDatabaseNative() for synchronous NativeDatabase creation inside the server isolate (no createInBackground needed) - IsolateDatabase: add spawnServer(), connectOrCreate(), kDbPortName - AppDatabaseScope.use(): connect via connectOrCreate() instead of create() - bootstrap(): spawn DriftIsolate server, register DriftIsolate in InstanceRegistry - AppDatabaseLifecycleHolder: connect to DriftIsolate, shutdown server on dispose * fix: address Copilot review — robust spawnServer error handling and stale port cleanup (WT-1061) * test: add integration tests for IsolateDatabase stale port handling (WT-1061)
* refactor: introduce SignalingModule stream abstraction (phase 1) Replace SignalingManager callback-based API with SignalingModule — a sealed-event broadcast stream that owns the WebtritSignalingClient lifecycle without any BLoC, CallState, or UI dependency. Key changes: - Add SignalingModule with fire-and-forget connect(), disconnect(), dispose() and a sealed SignalingModuleEvent hierarchy (Connecting, Connected, ConnectionFailed, Disconnecting, Disconnected, HandshakeReceived, ProtocolEvent) - Add isRepeated deduplication on ConnectionFailed to suppress repeated identical error notifications - Map disconnect codes to recommendedReconnectDelay: 4441 → Duration.zero, protocolError → null, all others → 3 s - Migrate CallBloc from direct WebtritSignalingClient callbacks to SignalingModule stream subscription; new _SignalingClientEvent variants: connecting, connected, failed, disconnecting, disconnected - Migrate IsolateManager (Push + Foreground) to SignalingModule, replacing SignalingManager; add connectivity monitoring and pending request queue inside IsolateManager - Construct SignalingModule in main_shell.dart and inject into CallBloc - Delete SignalingManager and remove its export from common.dart - Add 31 unit and integration tests for SignalingModule * fix(test): update ExternalContactsSyncBloc tests for getAndListen API The BLoC was updated to call userRepository.getAndListen() instead of getLocalInfo(), but the mocks were never updated. Fix the setUp mock and correct the RefreshFailure test to use load() failure (which is the actual trigger for that state) rather than userRepository failure. * fix(test): rename local function to avoid leading underscore lint warning * docs: translate signaling architecture doc to English * docs: remove phase 1 requirements planning doc from repo * refactor: remove coreUrl/tenantId/token/trustedCertificates from CallBloc These four fields were passed through CallBloc only to construct SignalingModule internally. Now that SignalingModule is constructed externally and injected via the constructor, the fields are dead code. Remove them and the corresponding import from ssl_certificates. * fix: address Copilot review comments on SignalingModule/IsolateManager - Guard delayed reconnect callbacks with signalingClient == null check to avoid tearing down a healthy connection that connected during the delay - Populate _incomingCallEvents from handshake and protocol events so _findIncomingEventLog returns real caller data instead of null - Use disconnect() instead of dispose() in handleLifecycleStatus so the module remains reusable when the app returns to the foreground - Fix post-dispose connect() test to actually subscribe to the event stream and assert Connecting/Connected events are absent after dispose * feat: replay session events to late subscribers in SignalingModule Adds a per-subscriber replay buffer so that consumers created after connect() (e.g. CallBloc constructed after SignalingModule already connected and received a handshake) do not miss any events from the current session. - events getter now returns a single-subscription stream that first replays all events buffered since the last connect() call, then pipes live events from the broadcast controller - connect() clears the buffer so late subscribers see only the current session, not stale events from previous reconnect cycles - dispose() also clears the buffer on teardown - Uses sync: true on the intermediate StreamController to avoid an extra async hop and keep delivery ordering consistent with callers that await module operations - Adds two integration tests covering the late-subscriber replay and the buffer-clear-on-reconnect behaviours * feat: connect SignalingModule early in initState to reduce call setup latency SignalingModule is now created and connected in _MainShellState.initState(), running the WebSocket handshake in parallel while the widget tree and CallBloc are being built. When CallBloc is eventually created it subscribes to the replay stream and receives all buffered session events without missing anything. _MainShellState.dispose() owns the module lifecycle; CallBloc.close() still calls dispose() on the module (idempotent, safe). * docs: update signaling architecture doc with layer descriptions and diagrams * fix: add concurrency lock to _connectAsync to prevent parallel connects * fix: await disconnect ack in dispose() to prevent SignalingDisconnected drop on race * fix: suppress reconnect hint on intentional disconnect to prevent spurious reconnect * fix: remove SignalingModule.dispose() from CallBloc.close() — ownership belongs to MainShellState * fix: snapshot buffer before live subscribe to prevent replay duplicates in events getter * fix: store reconnect Timer in IsolateManager so it can be cancelled on close() * fix: forward recommendedReconnectDelay from SignalingDisconnected to _scheduleReconnect in CallBloc * fix: suppress _onDisconnect after _onError to prevent double reconnect scheduling * fix: exclude SignalingProtocolEvent from session buffer to prevent unbounded growth * fix: replace force-unwrap of session.coreUrl/token with null-safe logout in initState * fix: remove performEndCall early return so pre-handshake declines are queued * fix: close liveController on subscription cancel to prevent StreamController leak * fix: use _networkNone state instead of stale results snapshot in connectivity timer closure * docs: fix _scheduleReconnectIfNeeded → _scheduleReconnect in signaling architecture doc * test: replace Future.delayed(Duration.zero) with pumpEventQueue() in signaling module tests * fix: make _controller sync:true to eliminate async-dispatch event duplication * docs: clarify disconnect() docstring — SignalingDisconnected is callback-driven, not synchronous * fix: wrap _signalingModule.disconnect() in unawaited() in _disconnectInitiated * fix: remove unused shouldReconnect variable from __onSignalingClientEventDisconnected * test: add 8 tests to reach 100% SignalingModule coverage - concurrent connect() dropped while factory in-flight (_connecting guard) - intentional disconnect() emits SignalingDisconnected with null delay - disconnect() passes goingAway code to the underlying client - _onError suppresses subsequent _onDisconnect (_errorHandled flag) - SignalingProtocolEvent excluded from replay buffer - cancelled subscription receives no further events - dispose() awaits disconnect ack before closing the stream - _onHandshake/_onEvent are no-ops after dispose() * test: add scenario-driven SignalingModule tests from CallBloc usage analysis Covers scenarios observed in CallBloc's signaling subscription: internet dropped mid-session: - _onError after handshake → ConnectionFailed not Disconnected, signalingClient cleared - Unexpected socket close (null code) → Disconnected with kSignalingClientReconnectDelay - ConnectionFailed buffered so late subscribers reconstruct last-known failure handshake not completed: - Disconnect before handshake → no HandshakeReceived in buffer, Disconnected with delay - Late subscriber after no-handshake disconnect → gets Connecting+Connected+Disconnected only - Error before handshake → ConnectionFailed buffered, no HandshakeReceived - Reconnect after no-handshake failure delivers fresh session events late subscriber mid-session: - Factory still pending → gets Connecting from buffer, Connected arrives live - After full connect+handshake → all three lifecycle events replayed, no protocol events disconnect() robustness: - client.disconnect() throws → dispose() still completes without hanging - Second disconnect() with no active client is a silent no-op * fix: restore callkeep_signaling_status_converter.dart lost during rebase * fix: remove unused fields in _ThrowingDisconnectClient test helper * fix: use normalClosure (1000) instead of goingAway (1001) when client disconnects WebSocket * test: update disconnect test to expect normalClosure (1000) instead of goingAway (1001) * fix: address Copilot review comments in SignalingModule and IsolateManager - Fix doc comment on events getter: protocol events are not replayed, only lifecycle/handshake events - Guard connect() buffer clear behind _connecting check to avoid clearing on redundant calls - Remove stale comment in _onDisconnect that contradicted the !_disposed guard - Treat empty connectivity result as offline in _monitorConnectivity (results.isEmpty || any(none)) - Treat empty connectivity result as offline in performAnswerCall (isNotEmpty && !contains(none)) * fix: address post-review issues in SignalingModule and IsolateManager - isolate_manager: fix connectivityNoneCounter reset — error now fires exactly once at maxConnectivityNoneRepeats; subsequent none-events are silently ignored until connectivity is restored and counter resets to 0 - main_shell: split SignalingModule construction into valid/invalid-creds branches to remove ?? '' fallbacks and make intent explicit - signaling_module: document sync:true reentrancy assumption, single-use constraint on events getter, and _errorHandled ordering invariant * revert: restore main_shell.dart SignalingModule construction with ?? '' fallback The split-branch approach still created a module with empty strings in the null-creds case — identical in behaviour to the original. Reverted to the original form which is honest about the fallback until a proper nullable refactor is done. * fix: remove dead null-guard in MainShellState.initState for SignalingModule The router guard (onMainShellRouteGuardNavigation) redirects to login when state.status != authenticated, so coreUrl and token are always non-null when MainShell is mounted. Replace ?? '' fallbacks and the unreachable null-branch with direct ! unwraps. * docs: sync signaling_architecture_target.md and call_architecture.md with current code - signaling_architecture_target: add timer cancellation to IsolateManager and CallBloc _scheduleReconnect snippets (Future.delayed → Timer with cancel) - signaling_architecture_target: add missing SignalingDisconnecting case to CallBloc subscription snippet - call_architecture: update ownership — CallBloc owns SignalingModule, not WebtritSignalingClient directly * fix: replace non-ASCII characters with ASCII equivalents in Dart sources Replace em dash (U+2014) with '-' and right arrow (U+2192) with '->' in comments and test descriptions across signaling_module.dart, isolate_manager.dart, signaling_module_test.dart, and call_bloc.dart.
Fixed status bar rendering with incorrect styling on initial app launch when theme is light
* feat: show progress indicator while sharing logs Co-Authored-By: Dmytro Serdun <serdun@webtrit.com> * refactor: replace inline SizedBox+CircularProgressIndicator with SizedCircularProgressIndicator --------- Co-authored-by: Dmytro Serdun <serdun@webtrit.com>
… safety net (WT-1214) (#1040) * fix: trigger reconnect when starting outgoing call with no signaling (WT-1214) After a blind transfer, the signaling WebSocket is closed with code 4610 and the disconnect is marked intentional by SignalingModule, so no reconnect is scheduled. Subsequent outgoing call attempts enter outgoingConnectingToSignaling and wait passively — neither signalingReady nor signalingFailed ever fires, causing the call to fail on timeout. Add _scheduleReconnect(Duration.zero) at the start of the waiting block so that initiating an outgoing call always recovers the signaling connection, regardless of whether the previous disconnect was intentional. * fix: skip hangup after successful blind transfer to avoid 4610 disconnect (WT-1214) When a blind transfer completes (NOTIFY SIP/2.0 200 OK + subscription_state: terminated), the SIP dialog is already closed server-side via REFER. Sending a hangup request on the freed dialog causes the server to close the WebSocket with code 4610 ("call request on wrong line error"), triggering an unintended signaling disconnect. Check the call's transfer state: if it is Transfering(fromBlindTransfer: true), skip the hangup request and clean up the peer connection locally only. This removes the root cause of the 4610 disconnect that led to signaling not being reconnected for subsequent outgoing calls. * test: cover blind-transfer hangup skip and 4610 reconnect hint Add tests for two fixes from WT-1214: - Transfer — isBlindTransferCompleted detection (call_state_test.dart): verifies the switch pattern that decides whether to skip the hangup request after a blind transfer. Covers Transfering(fromBlindTransfer: true/false), earlier transfer states, and null. - SignalingModule — requestCallIdError (4610) reconnect hint (signaling_module_test.dart): verifies that a non-intentional 4610 carries a non-null recommendedReconnectDelay (reconnect scheduled), while an intentional disconnect() followed by a server 4610 emits null (reconnect suppressed — the scenario that triggered WT-1214). * refactor: rename isBlindTransferCompleted → isBlindTransferInTransferingState Transfering state in the model means "server started to process the transfer", not "transfer completed". Rename the local variable and update the surrounding comments and test group names to match the actual Transfer model semantics, avoiding misinterpretation of the hangup guard. Addresses Copilot review comments on PR #1040.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release 1.14.0
Features
Bug Fixes
Refactoring