morethanwords/tweb/master • ea3c535 • 9 files, +468/-80
perf: move the bubble text-spoiler overlays into the spoiler worker
The last main-thread spoiler rendering is gone: the overlay canvas of a
bubble text spoiler now transfers control to the shared spoiler worker,
which draws the tinted particle chunks and animates the click unwrap
from the same text simulation that feeds the bluff masks. The main
thread keeps everything DOM-bound - measuring the line rects and
colors, hover/click handling, the visibility class machinery - and
pushes snapshots to the worker only when they change (the unwrap
progress signal still runs on main for the class toggles; the worker
mirrors the same curve for the pixels).
The displayed size of a transferred canvas has to be pinned via inline
CSS: the placeholder keeps its default 300x150 intrinsic size, so with
the worker-side resize alone the committed bitmap would stretch (the
legacy path derives it from the width/height attributes instead).
simpleEasing/unwrapEasing/defaultEasing move into a @helpers/easings
leaf so the worker shares the exact curves, and drawImageFromSource
accepts offscreen contexts. Browsers without WebGL in OffscreenCanvas
keep the previous main-thread overlay path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#webk
perf: move the bubble text-spoiler overlays into the spoiler worker
The last main-thread spoiler rendering is gone: the overlay canvas of a
bubble text spoiler now transfers control to the shared spoiler worker,
which draws the tinted particle chunks and animates the click unwrap
from the same text simulation that feeds the bluff masks. The main
thread keeps everything DOM-bound - measuring the line rects and
colors, hover/click handling, the visibility class machinery - and
pushes snapshots to the worker only when they change (the unwrap
progress signal still runs on main for the class toggles; the worker
mirrors the same curve for the pixels).
The displayed size of a transferred canvas has to be pinned via inline
CSS: the placeholder keeps its default 300x150 intrinsic size, so with
the worker-side resize alone the committed bitmap would stretch (the
legacy path derives it from the width/height attributes instead).
simpleEasing/unwrapEasing/defaultEasing move into a @helpers/easings
leaf so the worker shares the exact curves, and drawImageFromSource
accepts offscreen contexts. Browsers without WebGL in OffscreenCanvas
keep the previous main-thread overlay path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#webk
🫡4
🫡2
morethanwords/tweb/master • 5f9c0fb • 8 files, +92/-60
refactor: migrate from deprecated mp4-muxer to mediabunny
mp4-muxer is deprecated in favor of mediabunny. Muxer/ArrayBufferTarget
become Output/Mp4OutputFormat/BufferTarget, and chunks now go through
EncodedVideo/AudioPacketSources whose async add() calls are chained from
the sync encoder callbacks (decode order + backpressure), so finalize()
is async for both callers. The opus track config is no longer declared
upfront — it is deduced from the encoder metadata passed with the first
packet. frameRate is forwarded to the video track only when the caller
sets one, because mediabunny snaps timestamps to it (gifToVideo frames
sit off-grid). mediabunny's bundled dom-mediacapture-transform typings
narrow MediaStream.getVideoTracks() globally, hence the cast in
callInstanceBase.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#webk
refactor: migrate from deprecated mp4-muxer to mediabunny
mp4-muxer is deprecated in favor of mediabunny. Muxer/ArrayBufferTarget
become Output/Mp4OutputFormat/BufferTarget, and chunks now go through
EncodedVideo/AudioPacketSources whose async add() calls are chained from
the sync encoder callbacks (decode order + backpressure), so finalize()
is async for both callers. The opus track config is no longer declared
upfront — it is deduced from the encoder metadata passed with the first
packet. frameRate is forwarded to the video track only when the caller
sets one, because mediabunny snaps timestamps to it (gifToVideo frames
sit off-grid). mediabunny's bundled dom-mediacapture-transform typings
narrow MediaStream.getVideoTracks() globally, hence the cast in
callInstanceBase.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#webk
🫡3
morethanwords/tweb/master • 12b30e9 • 6 files, +267/-60
feat: convert .mov attachments to mp4 in the send popup
QuickTime files — the default macOS screen-recording/camera format — were
sent as plain documents in browsers that can't play video/quicktime
(Chrome on macOS), and even Safari sent them as .mov that recipients on
other platforms couldn't stream. Now they get the same treatment as GIFs:
conversion starts the moment the file lands in the new-media popup (after
the open animation finishes, so the heavy work doesn't jank it), with a
progress circle on the item and the send button locked until it's done.
The conversion (helpers/movToVideo) goes through mediabunny's Conversion:
H.264+AAC sources are remuxed without re-encoding (lossless, I/O-bound —
a 650MB file repackages in about a second), other codecs are transcoded
via WebCodecs to the universally playable pair; a track that can't be
carried over makes the conversion throw, falling back to the old document
behavior with the same error toast as GIFs. Eligibility is capped by the
user's upload limit (upload_max_fileparts default/premium = 2GB/4GB, read
from the cached app config); non-H.264 sources keep the media-editor
100MB cap instead, since a real transcode runs at roughly realtime.
Outputs over 512MB use moov-at-end instead of fastStart 'in-memory',
halving the memory peak.
A convertible .mov counts as media throughout the popup (routing, albums,
spoilers, paid-media and rights checks — keyed off the converted form,
video/mp4), in the paste/drop/share entry points, and is selectable in
the "Photo or Video" picker. The GIF conversion state maps are
generalized (convertedFiles/fileConversions/failedConversions) and shared
by both flows.
Polish that fell out of testing, also affecting shared video code:
- the uploaded/local video poster box grew from 320x240 (blurry on
retina, 135x240 for portrait) to 720 max per side, matching the media
editor's thumbnail cap, never upscaling a smaller source;
- attachFiles destroys the old items only after the new ones replace
them in the DOM — destroying upfront blanked the still-visible media
out for the whole rebuild (createVideo clears src on destroy);
- an uploading video bubble no longer autoplays under the progress
spinner: the autoplay attribute is suppressed while
message.uploadingFileName is set, and since the bubble isn't
re-rendered on message_sent, playback resumes when the upload promise
resolves (rounds keep their own is_outgoing handling).
Verified e2e in the preview: a generated h264+pcm .mov pasted into Saved
Messages converts (video copied, audio transcoded to AAC) and arrives as
a streamable video/mp4; a corrupt .mov falls back to a document with the
error toast; 162MB and 647MB files remux in ~1s.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#webk
feat: convert .mov attachments to mp4 in the send popup
QuickTime files — the default macOS screen-recording/camera format — were
sent as plain documents in browsers that can't play video/quicktime
(Chrome on macOS), and even Safari sent them as .mov that recipients on
other platforms couldn't stream. Now they get the same treatment as GIFs:
conversion starts the moment the file lands in the new-media popup (after
the open animation finishes, so the heavy work doesn't jank it), with a
progress circle on the item and the send button locked until it's done.
The conversion (helpers/movToVideo) goes through mediabunny's Conversion:
H.264+AAC sources are remuxed without re-encoding (lossless, I/O-bound —
a 650MB file repackages in about a second), other codecs are transcoded
via WebCodecs to the universally playable pair; a track that can't be
carried over makes the conversion throw, falling back to the old document
behavior with the same error toast as GIFs. Eligibility is capped by the
user's upload limit (upload_max_fileparts default/premium = 2GB/4GB, read
from the cached app config); non-H.264 sources keep the media-editor
100MB cap instead, since a real transcode runs at roughly realtime.
Outputs over 512MB use moov-at-end instead of fastStart 'in-memory',
halving the memory peak.
A convertible .mov counts as media throughout the popup (routing, albums,
spoilers, paid-media and rights checks — keyed off the converted form,
video/mp4), in the paste/drop/share entry points, and is selectable in
the "Photo or Video" picker. The GIF conversion state maps are
generalized (convertedFiles/fileConversions/failedConversions) and shared
by both flows.
Polish that fell out of testing, also affecting shared video code:
- the uploaded/local video poster box grew from 320x240 (blurry on
retina, 135x240 for portrait) to 720 max per side, matching the media
editor's thumbnail cap, never upscaling a smaller source;
- attachFiles destroys the old items only after the new ones replace
them in the DOM — destroying upfront blanked the still-visible media
out for the whole rebuild (createVideo clears src on destroy);
- an uploading video bubble no longer autoplays under the progress
spinner: the autoplay attribute is suppressed while
message.uploadingFileName is set, and since the bubble isn't
re-rendered on message_sent, playback resumes when the upload promise
resolves (rounds keep their own is_outgoing handling).
Verified e2e in the preview: a generated h264+pcm .mov pasted into Saved
Messages converts (video copied, audio transcoded to AAC) and arrives as
a streamable video/mp4; a corrupt .mov falls back to a document with the
error toast; 162MB and 647MB files remux in ~1s.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#webk
🫡3
UnigramDev/Unigram/develop • 4a2df73 • 2 files, +0/-2
Remove dangling event handle
UnigramDev/Unigram/develop • 83448cb • 9 files, +218/-18
Supergroup guard bot settings
UnigramDev/Unigram/develop • 3db6204 • 23 files, +1358/-334
Rich messages improvements
UnigramDev/Unigram/develop • 41773a9 • 1 files, +1/-1
Update TDLib
UnigramDev/Unigram/develop • 7012117 • 1 files, +4/-0
Handle automatic decline
UnigramDev/Unigram/develop • f059eee • 5 files, +55/-16
Show rich messages in shared media
UnigramDev/Unigram/develop • b1d121b • 1 files, +8/-0
Update enum
UnigramDev/Unigram/develop • 4f43ba8 • 1 files, +10/-2
Delete ranges
UnigramDev/Unigram/develop • 0fd865e • 1 files, +6/-6
Fix native compilation
UnigramDev/Unigram/develop • 23c5d29 • 1 files, +143/-15
Improve text formatting
UnigramDev/Unigram/develop • 7789fa5 • 3 files, +38/-22
Update session api
UnigramDev/Unigram/develop • 29dab75 • 1 files, +1/-1
Bump version to 12.8
UnigramDev/Unigram/develop • 4ef4df6 • 1 files, +1/-1
Update microtex
UnigramDev/Unigram/develop • d9749d9 • 1 files, +1/-1
Ignore formulas in inline text
UnigramDev/Unigram/develop • 4c1b6d6 • 2 files, +257/-160
Rich messages improvements
#unigram
Remove dangling event handle
UnigramDev/Unigram/develop • 83448cb • 9 files, +218/-18
Supergroup guard bot settings
UnigramDev/Unigram/develop • 3db6204 • 23 files, +1358/-334
Rich messages improvements
UnigramDev/Unigram/develop • 41773a9 • 1 files, +1/-1
Update TDLib
UnigramDev/Unigram/develop • 7012117 • 1 files, +4/-0
Handle automatic decline
UnigramDev/Unigram/develop • f059eee • 5 files, +55/-16
Show rich messages in shared media
UnigramDev/Unigram/develop • b1d121b • 1 files, +8/-0
Update enum
UnigramDev/Unigram/develop • 4f43ba8 • 1 files, +10/-2
Delete ranges
UnigramDev/Unigram/develop • 0fd865e • 1 files, +6/-6
Fix native compilation
UnigramDev/Unigram/develop • 23c5d29 • 1 files, +143/-15
Improve text formatting
UnigramDev/Unigram/develop • 7789fa5 • 3 files, +38/-22
Update session api
UnigramDev/Unigram/develop • 29dab75 • 1 files, +1/-1
Bump version to 12.8
UnigramDev/Unigram/develop • 4ef4df6 • 1 files, +1/-1
Update microtex
UnigramDev/Unigram/develop • d9749d9 • 1 files, +1/-1
Ignore formulas in inline text
UnigramDev/Unigram/develop • 4c1b6d6 • 2 files, +257/-160
Rich messages improvements
#unigram
🫡2
🫡2
telegramdesktop/tdesktop/dev • 8ca06bd • 1 files, +2/-2
Fix OpenGL in Windows builds.
telegramdesktop/tdesktop/dev • 7db0d5d • 1 files, +1/-1
Fix parsing some incorrect formulas.
#tdesktop
Fix OpenGL in Windows builds.
telegramdesktop/tdesktop/dev • 7db0d5d • 1 files, +1/-1
Fix parsing some incorrect formulas.
#tdesktop
🫡3
morethanwords/tweb/master • c29dfcf • 1 files, +2/-2
Add .kml / .kmz as potentially IP-revealing.
#webk
Add .kml / .kmz as potentially IP-revealing.
#webk
🫡3
New telegramdesktop/tdesktop release:
- Fix possible crash in formula parsing.
- Fix field resize after Undo/Redo.
- Fix OpenGL in Windows build.
#tdesktop
v6.9.3 (stable)- Fix possible crash in formula parsing.
- Fix field resize after Undo/Redo.
- Fix OpenGL in Windows build.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 82c2954 • 1 files, +1/-1
Fix content size checks after undo/redo.
telegramdesktop/tdesktop/dev • 3887c78 • 6 files, +21/-15
Version 6.9.3.
- Fix possible crash in formula parsing.
- Fix field resize after Undo/Redo.
- Fix OpenGL in Windows build.
#tdesktop
Fix content size checks after undo/redo.
telegramdesktop/tdesktop/dev • 3887c78 • 6 files, +21/-15
Version 6.9.3.
- Fix possible crash in formula parsing.
- Fix field resize after Undo/Redo.
- Fix OpenGL in Windows build.
#tdesktop
🫡3
tdlib/td/master • 912b29b • 6 files, +38/-27
Add source to get_message_content_object.
tdlib/td/master • 0917763 • 1 files, +1/-1
Fix spelling.
tdlib/td/master • 9ae32a3 • 1 files, +0/-3
unset CMAKE_FIND_ROOT_PATH_MODE_PROGRAM
tdlib/td/master • c0757dd • 1 files, +1/-1
Revert "Set CMAKE_MAKE_PROGRAM for iOS build"
This reverts commit 04adfc87deea4c804def118e88c89a08c388b32b.
tdlib/td/master • a17f87c • 1 files, +33/-33
Fix typos in API scheme docs
#tdlib
Add source to get_message_content_object.
tdlib/td/master • 0917763 • 1 files, +1/-1
Fix spelling.
tdlib/td/master • 9ae32a3 • 1 files, +0/-3
unset CMAKE_FIND_ROOT_PATH_MODE_PROGRAM
tdlib/td/master • c0757dd • 1 files, +1/-1
Revert "Set CMAKE_MAKE_PROGRAM for iOS build"
This reverts commit 04adfc87deea4c804def118e88c89a08c388b32b.
tdlib/td/master • a17f87c • 1 files, +33/-33
Fix typos in API scheme docs
#tdlib
🫡3
Assets for release
• Source code (tar.gz, full)
• Windows on ARM: Portable
• Windows 64 bit: Portable
• Windows 32 bit: Portable
• Windows on ARM: Installer
• Windows 64 bit: Installer
• macOS 10.13+: Installer
• Windows 32 bit: Installer
• Linux 64 bit: Binary
#tdesktop
v6.9.3 of telegramdesktop/tdesktop:• Source code (tar.gz, full)
• Windows on ARM: Portable
• Windows 64 bit: Portable
• Windows 32 bit: Portable
• Windows on ARM: Installer
• Windows 64 bit: Installer
• macOS 10.13+: Installer
• Windows 32 bit: Installer
• Linux 64 bit: Binary
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 49ff0bc • 1 files, +1/-1
Fixed usedId assignment logic in edit_todo_list_box
#tdesktop
Fixed usedId assignment logic in edit_todo_list_box
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 8f06924 • 1 files, +774/-669
Use heredoc in Dockerfile
telegramdesktop/tdesktop/dev • d9a4283 • 1 files, +1/-1
Compress debug info in Docker
That should decrease cache size a lot
telegramdesktop/tdesktop/dev • 6da54a2 • 1 files, +1/-2
Save dnf cache in Docker
telegramdesktop/tdesktop/dev • 6a87fe2 • 1 files, +55/-46
Use ccache in Docker
telegramdesktop/tdesktop/dev • 64dce78 • 1 files, +2/-0
Prevent cache invalidation by date/time in Docker
telegramdesktop/tdesktop/dev • 6571285 • 1 files, +13/-1
Use ccache for libraries in Linux action
telegramdesktop/tdesktop/dev • 999b28a • 1 files, +19/-3
Cache tdesktop itself in Linux action
#tdesktop
Use heredoc in Dockerfile
telegramdesktop/tdesktop/dev • d9a4283 • 1 files, +1/-1
Compress debug info in Docker
That should decrease cache size a lot
telegramdesktop/tdesktop/dev • 6da54a2 • 1 files, +1/-2
Save dnf cache in Docker
telegramdesktop/tdesktop/dev • 6a87fe2 • 1 files, +55/-46
Use ccache in Docker
telegramdesktop/tdesktop/dev • 64dce78 • 1 files, +2/-0
Prevent cache invalidation by date/time in Docker
telegramdesktop/tdesktop/dev • 6571285 • 1 files, +13/-1
Use ccache for libraries in Linux action
telegramdesktop/tdesktop/dev • 999b28a • 1 files, +19/-3
Cache tdesktop itself in Linux action
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 2ed2083 • 3 files, +2/-3
Restore dispatch autodetection
telegramdesktop/tdesktop/dev • ae167db • 3 files, +3/-3
Update patches
#tdesktop
Restore dispatch autodetection
telegramdesktop/tdesktop/dev • ae167db • 3 files, +3/-3
Update patches
#tdesktop
🫡4
telegramdesktop/tdesktop/dev • c486314 • 28 files, +27/-1
Avoid full Telegram target rebuild on version change
#tdesktop
Avoid full Telegram target rebuild on version change
#tdesktop
🫡3
TelegramMessenger/tgcalls/development • f308020 • 1 files, +30/-0
InstanceV2ReferenceImpl: add 20s rolling connection-failure watchdog
Mirrors NativeNetworkingImpl::checkConnectionTimeout(): a 1s media-thread
timer latches _isFailed only after 20s of continuous disconnect, armed from
start() so never-connected calls are bounded too (previously they hung in
Reconnecting forever because legacy ICE state stays STATE_INIT with no
candidate pairs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TelegramMessenger/tgcalls/development • ac59fdb • 1 files, +42/-15
InstanceV2ReferenceImpl: ICE-failed is no longer terminal; debounce Reconnecting
kIceConnectionFailed previously mapped straight to State::Failed, which the
app treats as a permanent drop - WebRTC raises it ~15s after all so-far-
created pairs time out, killing calls a late-trickled candidate could still
rescue. It now just marks the connection not-connected; Failed comes only
from the 20s watchdog (V2Impl parity). Disconnected->Reconnecting reporting
is debounced 2s so the ~2.5s legacy receiving-timeout blips stop surfacing
as reconnecting episodes. Adds an empty maybeRestartIce() stub (filled in
by the ICE-restart commit).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TelegramMessenger/tgcalls/development • 51438ad • 1 files, +19/-0
InstanceV2ReferenceImpl: caller-side RestartIce() on legacy ICE-failed
On kIceConnectionFailed (all so-far-created pairs write-timed-out) the
offerer now requests an ICE restart, rate-limited to once per 5s; the
existing onRenegotiationNeeded handler ships the restart offer and
GATHER_CONTINUALLY supplies fresh candidates. Previously the impl took no
recovery action. Callee side never restarts (avoids offer glare; failure
is symmetric so the offerer also observes it).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TelegramMessenger/tgcalls/development • e306932 • 1 files, +6/-0
Merge commit '6926af015580a1377e1b1bcad191d076453192cb' into development
#tgcalls
InstanceV2ReferenceImpl: add 20s rolling connection-failure watchdog
Mirrors NativeNetworkingImpl::checkConnectionTimeout(): a 1s media-thread
timer latches _isFailed only after 20s of continuous disconnect, armed from
start() so never-connected calls are bounded too (previously they hung in
Reconnecting forever because legacy ICE state stays STATE_INIT with no
candidate pairs).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TelegramMessenger/tgcalls/development • ac59fdb • 1 files, +42/-15
InstanceV2ReferenceImpl: ICE-failed is no longer terminal; debounce Reconnecting
kIceConnectionFailed previously mapped straight to State::Failed, which the
app treats as a permanent drop - WebRTC raises it ~15s after all so-far-
created pairs time out, killing calls a late-trickled candidate could still
rescue. It now just marks the connection not-connected; Failed comes only
from the 20s watchdog (V2Impl parity). Disconnected->Reconnecting reporting
is debounced 2s so the ~2.5s legacy receiving-timeout blips stop surfacing
as reconnecting episodes. Adds an empty maybeRestartIce() stub (filled in
by the ICE-restart commit).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TelegramMessenger/tgcalls/development • 51438ad • 1 files, +19/-0
InstanceV2ReferenceImpl: caller-side RestartIce() on legacy ICE-failed
On kIceConnectionFailed (all so-far-created pairs write-timed-out) the
offerer now requests an ICE restart, rate-limited to once per 5s; the
existing onRenegotiationNeeded handler ships the restart offer and
GATHER_CONTINUALLY supplies fresh candidates. Previously the impl took no
recovery action. Callee side never restarts (avoids offer glare; failure
is symmetric so the offerer also observes it).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
TelegramMessenger/tgcalls/development • e306932 • 1 files, +6/-0
Merge commit '6926af015580a1377e1b1bcad191d076453192cb' into development
#tgcalls
🫡4
telegramdesktop/tdesktop/dev • 9cca005 • 1 files, +10/-1
Fix order in auctions list hashing.
#tdesktop
Fix order in auctions list hashing.
#tdesktop
🫡3
🫡3
🫡3
telegramdesktop/tdesktop/dev • 4ce9177 • 1 files, +1/-1
Update TooManyCooks for LoongArch support
#tdesktop
Update TooManyCooks for LoongArch support
#tdesktop
🫡4