@@ -83,6 +83,11 @@ type CreateLaneTextDelivererParams = {
8383 deletePreviewMessage : ( messageId : number ) => Promise < void > ;
8484 log : ( message : string ) => void ;
8585 markDelivered : ( ) => void ;
86+ onFinalPreviewDelivered ?: ( params : {
87+ laneName : LaneName ;
88+ text : string ;
89+ messageId ?: number ;
90+ } ) => Promise < void > | void ;
8691} ;
8792
8893type DeliverLaneTextParams = {
@@ -167,6 +172,17 @@ function resolvePreviewTarget(params: ResolvePreviewTargetParams): PreviewTarget
167172}
168173
169174export function createLaneTextDeliverer ( params : CreateLaneTextDelivererParams ) {
175+ const notifyFinalPreviewDelivered = async (
176+ laneName : LaneName ,
177+ text : string ,
178+ messageId ?: number ,
179+ ) => {
180+ await params . onFinalPreviewDelivered ?.( {
181+ laneName,
182+ text,
183+ messageId,
184+ } ) ;
185+ } ;
170186 const getLanePreviewText = ( lane : DraftLaneState ) => lane . lastPartialText ;
171187 const markActivePreviewComplete = ( laneName : LaneName ) => {
172188 params . activePreviewLifecycleByLane [ laneName ] = "complete" ;
@@ -206,6 +222,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
206222 }
207223 args . lane . lastPartialText = args . text ;
208224 params . markDelivered ( ) ;
225+ await notifyFinalPreviewDelivered ( args . laneName , args . text , materializedMessageId ) ;
209226 return true ;
210227 } ;
211228
@@ -232,13 +249,19 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
232249 args . lane . lastPartialText = args . text ;
233250 }
234251 params . markDelivered ( ) ;
252+ if ( args . context === "final" ) {
253+ await notifyFinalPreviewDelivered ( args . laneName , args . text , args . messageId ) ;
254+ }
235255 return "edited" ;
236256 } catch ( err ) {
237257 if ( isMessageNotModifiedError ( err ) ) {
238258 params . log (
239259 `telegram: ${ args . laneName } preview ${ args . context } edit returned "message is not modified"; treating as delivered` ,
240260 ) ;
241261 params . markDelivered ( ) ;
262+ if ( args . context === "final" ) {
263+ await notifyFinalPreviewDelivered ( args . laneName , args . text , args . messageId ) ;
264+ }
242265 return "edited" ;
243266 }
244267 if ( args . context === "final" ) {
@@ -247,6 +270,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
247270 `telegram: ${ args . laneName } preview final edit failed after stop flush; keeping existing preview (${ String ( err ) } )` ,
248271 ) ;
249272 params . markDelivered ( ) ;
273+ await notifyFinalPreviewDelivered ( args . laneName , args . text , args . messageId ) ;
250274 return "retained" ;
251275 }
252276 if ( isSafeToRetrySendError ( err ) ) {
@@ -261,6 +285,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
261285 `telegram: ${ args . laneName } preview final edit target missing; keeping alternate preview without fallback (${ String ( err ) } )` ,
262286 ) ;
263287 params . markDelivered ( ) ;
288+ await notifyFinalPreviewDelivered ( args . laneName , args . text , args . messageId ) ;
264289 return "retained" ;
265290 }
266291 params . log (
@@ -273,6 +298,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
273298 `telegram: ${ args . laneName } preview final edit may have landed despite network error; keeping existing preview (${ String ( err ) } )` ,
274299 ) ;
275300 params . markDelivered ( ) ;
301+ await notifyFinalPreviewDelivered ( args . laneName , args . text , args . messageId ) ;
276302 return "retained" ;
277303 }
278304 if ( isTelegramClientRejection ( err ) ) {
@@ -286,6 +312,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
286312 `telegram: ${ args . laneName } preview final edit failed with ambiguous error; keeping existing preview to avoid duplicate (${ String ( err ) } )` ,
287313 ) ;
288314 params . markDelivered ( ) ;
315+ await notifyFinalPreviewDelivered ( args . laneName , args . text , args . messageId ) ;
289316 return "retained" ;
290317 }
291318 params . log (
@@ -323,12 +350,12 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
323350 finalTextAlreadyLanded,
324351 retainAlternatePreviewOnMissingTarget,
325352 } ) ;
326- const finalizePreview = (
353+ const finalizePreview = async (
327354 previewMessageId : number ,
328355 finalTextAlreadyLanded : boolean ,
329356 hadPreviewMessage : boolean ,
330357 retainAlternatePreviewOnMissingTarget = false ,
331- ) : PreviewEditResult | Promise < PreviewEditResult > => {
358+ ) : Promise < PreviewEditResult > => {
332359 const currentPreviewText = previewTextSnapshot ?? getLanePreviewText ( lane ) ;
333360 const shouldSkipRegressive = shouldSkipRegressivePreviewUpdate ( {
334361 currentPreviewText,
@@ -338,6 +365,9 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
338365 } ) ;
339366 if ( shouldSkipRegressive ) {
340367 params . markDelivered ( ) ;
368+ if ( context === "final" ) {
369+ await notifyFinalPreviewDelivered ( laneName , text , previewMessageId ) ;
370+ }
341371 return "edited" ;
342372 }
343373 return editPreview (
@@ -389,6 +419,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) {
389419 `telegram: ${ laneName } preview send may have landed despite missing message id; keeping to avoid duplicate` ,
390420 ) ;
391421 params . markDelivered ( ) ;
422+ await notifyFinalPreviewDelivered ( laneName , text ) ;
392423 return "retained" ;
393424 }
394425 return "fallback" ;
0 commit comments