@@ -8,7 +8,7 @@ import type { MatrixRawEvent } from "./types.js";
88import { EventType } from "./types.js" ;
99
1010type RoomEventListener = ( roomId : string , event : MatrixRawEvent ) => void ;
11- type FailedDecryptListener = ( roomId : string , event : MatrixRawEvent , error : Error ) => Promise < void > ;
11+ type FailedDecryptListener = ( roomId : string , event : MatrixRawEvent , error : Error ) => void ;
1212type VerificationSummaryListener = ( summary : MatrixVerificationSummary ) => void ;
1313
1414function getSentNoticeBody ( sendMessage : ReturnType < typeof vi . fn > , index = 0 ) : string {
@@ -1489,15 +1489,15 @@ describe("registerMatrixMonitorEvents verification routing", () => {
14891489 } ) ;
14901490
14911491 it ( "adds self-device guidance when decrypt failures come from the same Matrix user" , async ( ) => {
1492- const { logger, failedDecryptListener } = createHarness ( {
1492+ const { logger, failedDecryptListener, flushTasks } = createHarness ( {
14931493 accountId : "ops" ,
14941494 selfUserId : "@gumadeiras:matrix.example.org" ,
14951495 } ) ;
14961496 if ( ! failedDecryptListener ) {
14971497 throw new Error ( "room.failed_decryption listener was not registered" ) ;
14981498 }
14991499
1500- await failedDecryptListener (
1500+ failedDecryptListener (
15011501 "!room:example.org" ,
15021502 {
15031503 event_id : "$enc-self" ,
@@ -1508,6 +1508,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
15081508 } ,
15091509 new Error ( "The sender's device has not sent us the keys for this message." ) ,
15101510 ) ;
1511+ await flushTasks ( ) ;
15111512
15121513 expectWarnContextFields ( logger , 1 , "Failed to decrypt message" , {
15131514 roomId : "!room:example.org" ,
@@ -1527,15 +1528,15 @@ describe("registerMatrixMonitorEvents verification routing", () => {
15271528 } ) ;
15281529
15291530 it ( "does not add self-device guidance for decrypt failures from another sender" , async ( ) => {
1530- const { logger, failedDecryptListener } = createHarness ( {
1531+ const { logger, failedDecryptListener, flushTasks } = createHarness ( {
15311532 accountId : "ops" ,
15321533 selfUserId : "@gumadeiras:matrix.example.org" ,
15331534 } ) ;
15341535 if ( ! failedDecryptListener ) {
15351536 throw new Error ( "room.failed_decryption listener was not registered" ) ;
15361537 }
15371538
1538- await failedDecryptListener (
1539+ failedDecryptListener (
15391540 "!room:example.org" ,
15401541 {
15411542 event_id : "$enc-other" ,
@@ -1546,6 +1547,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
15461547 } ,
15471548 new Error ( "The sender's device has not sent us the keys for this message." ) ,
15481549 ) ;
1550+ await flushTasks ( ) ;
15491551
15501552 expect ( logger . warn ) . toHaveBeenCalledTimes ( 1 ) ;
15511553 expectWarnContextFields ( logger , 1 , "Failed to decrypt message" , {
@@ -1561,7 +1563,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
15611563 vi . setSystemTime ( new Date ( "2026-04-10T16:21:00.000Z" ) ) ;
15621564 try {
15631565 const healthySyncSinceMs = Date . now ( ) - 60_000 ;
1564- const { logger, failedDecryptListener } = createHarness ( {
1566+ const { logger, failedDecryptListener, flushTasks } = createHarness ( {
15651567 accountId : "ops" ,
15661568 getHealthySyncSinceMs : ( ) => healthySyncSinceMs ,
15671569 } ) ;
@@ -1574,7 +1576,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
15741576 "!room-b:example.org" ,
15751577 "!room-c:example.org" ,
15761578 ] . entries ( ) ) {
1577- await failedDecryptListener (
1579+ failedDecryptListener (
15781580 roomId ,
15791581 {
15801582 event_id : `$enc-fresh-${ index + 1 } ` ,
@@ -1585,6 +1587,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
15851587 } ,
15861588 new Error ( "The sender's device has not sent us the keys for this message." ) ,
15871589 ) ;
1590+ await flushTasks ( ) ;
15881591 }
15891592
15901593 expectWarnContextFields ( logger , 1 , "Failed to decrypt fresh post-healthy-sync message" , {
@@ -1624,15 +1627,15 @@ describe("registerMatrixMonitorEvents verification routing", () => {
16241627 vi . setSystemTime ( new Date ( "2026-04-10T16:21:00.000Z" ) ) ;
16251628 try {
16261629 const healthySync = { sinceMs : undefined as number | undefined } ;
1627- const { logger, failedDecryptListener } = createHarness ( {
1630+ const { logger, failedDecryptListener, flushTasks } = createHarness ( {
16281631 accountId : "ops" ,
16291632 getHealthySyncSinceMs : ( ) => healthySync . sinceMs ,
16301633 } ) ;
16311634 if ( ! failedDecryptListener ) {
16321635 throw new Error ( "room.failed_decryption listener was not registered" ) ;
16331636 }
16341637
1635- await failedDecryptListener (
1638+ failedDecryptListener (
16361639 "!room:example.org" ,
16371640 {
16381641 event_id : "$enc-old" ,
@@ -1643,6 +1646,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
16431646 } ,
16441647 new Error ( "The sender's device has not sent us the keys for this message." ) ,
16451648 ) ;
1649+ await flushTasks ( ) ;
16461650
16471651 expect ( logger . warn ) . toHaveBeenCalledTimes ( 1 ) ;
16481652 expectWarnContextFields ( logger , 1 , "Failed to decrypt message" , {
@@ -1652,7 +1656,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
16521656
16531657 healthySync . sinceMs = Date . now ( ) ;
16541658
1655- await failedDecryptListener (
1659+ failedDecryptListener (
16561660 "!room:example.org" ,
16571661 {
16581662 event_id : "$enc-fresh-after-ready" ,
@@ -1663,6 +1667,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
16631667 } ,
16641668 new Error ( "The sender's device has not sent us the keys for this message." ) ,
16651669 ) ;
1670+ await flushTasks ( ) ;
16661671
16671672 expectWarnContextFields ( logger , 2 , "Failed to decrypt fresh post-healthy-sync message" , {
16681673 eventId : "$enc-fresh-after-ready" ,
@@ -1679,7 +1684,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
16791684 vi . setSystemTime ( new Date ( "2026-04-10T16:21:00.000Z" ) ) ;
16801685 try {
16811686 const healthySyncSinceMs = Date . now ( ) - 60_000 ;
1682- const { logger, failedDecryptListener } = createHarness ( {
1687+ const { logger, failedDecryptListener, flushTasks } = createHarness ( {
16831688 accountId : "ops" ,
16841689 getHealthySyncSinceMs : ( ) => healthySyncSinceMs ,
16851690 } ) ;
@@ -1689,7 +1694,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
16891694
16901695 for ( const wave of [ 1 , 2 ] ) {
16911696 for ( const index of [ 1 , 2 , 3 ] ) {
1692- await failedDecryptListener (
1697+ failedDecryptListener (
16931698 `!room-${ wave } -${ index } :example.org` ,
16941699 {
16951700 event_id : `$enc-wave-${ wave } -${ index } ` ,
@@ -1700,6 +1705,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
17001705 } ,
17011706 new Error ( "The sender's device has not sent us the keys for this message." ) ,
17021707 ) ;
1708+ await flushTasks ( ) ;
17031709 }
17041710
17051711 if ( wave === 1 ) {
@@ -1733,7 +1739,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
17331739 vi . setSystemTime ( new Date ( "2026-04-10T16:21:00.000Z" ) ) ;
17341740 try {
17351741 let healthySyncSinceMs = Date . now ( ) - 60_000 ;
1736- const { logger, failedDecryptListener } = createHarness ( {
1742+ const { logger, failedDecryptListener, flushTasks } = createHarness ( {
17371743 accountId : "ops" ,
17381744 getHealthySyncSinceMs : ( ) => healthySyncSinceMs ,
17391745 } ) ;
@@ -1742,7 +1748,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
17421748 }
17431749
17441750 for ( const index of [ 1 , 2 , 3 ] ) {
1745- await failedDecryptListener (
1751+ failedDecryptListener (
17461752 `!room-first-${ index } :example.org` ,
17471753 {
17481754 event_id : `$enc-first-${ index } ` ,
@@ -1753,12 +1759,13 @@ describe("registerMatrixMonitorEvents verification routing", () => {
17531759 } ,
17541760 new Error ( "The sender's device has not sent us the keys for this message." ) ,
17551761 ) ;
1762+ await flushTasks ( ) ;
17561763 }
17571764
17581765 healthySyncSinceMs = Date . now ( ) ;
17591766
17601767 for ( const index of [ 1 , 2 , 3 ] ) {
1761- await failedDecryptListener (
1768+ failedDecryptListener (
17621769 `!room-second-${ index } :example.org` ,
17631770 {
17641771 event_id : `$enc-second-${ index } ` ,
@@ -1769,6 +1776,7 @@ describe("registerMatrixMonitorEvents verification routing", () => {
17691776 } ,
17701777 new Error ( "The sender's device has not sent us the keys for this message." ) ,
17711778 ) ;
1779+ await flushTasks ( ) ;
17721780 }
17731781
17741782 expectWarnContextFields ( logger , 5 , "Failed to decrypt fresh post-healthy-sync message" , {
@@ -1800,27 +1808,26 @@ describe("registerMatrixMonitorEvents verification routing", () => {
18001808 } ) ;
18011809
18021810 it ( "logs decrypt guidance when getUserId fails during lookup" , async ( ) => {
1803- const { logger, logVerboseMessage, failedDecryptListener } = createHarness ( {
1811+ const { logger, logVerboseMessage, failedDecryptListener, flushTasks } = createHarness ( {
18041812 accountId : "ops" ,
18051813 selfUserIdError : new Error ( "lookup failed" ) ,
18061814 } ) ;
18071815 if ( ! failedDecryptListener ) {
18081816 throw new Error ( "room.failed_decryption listener was not registered" ) ;
18091817 }
18101818
1811- await expect (
1812- failedDecryptListener (
1813- "!room:example.org" ,
1814- {
1815- event_id : "$enc-lookup-fail" ,
1816- sender : "@gumadeiras:matrix.example.org" ,
1817- type : EventType . RoomMessageEncrypted ,
1818- origin_server_ts : Date . now ( ) ,
1819- content : { } ,
1820- } ,
1821- new Error ( "The sender's device has not sent us the keys for this message." ) ,
1822- ) ,
1823- ) . resolves . toBeUndefined ( ) ;
1819+ failedDecryptListener (
1820+ "!room:example.org" ,
1821+ {
1822+ event_id : "$enc-lookup-fail" ,
1823+ sender : "@gumadeiras:matrix.example.org" ,
1824+ type : EventType . RoomMessageEncrypted ,
1825+ origin_server_ts : Date . now ( ) ,
1826+ content : { } ,
1827+ } ,
1828+ new Error ( "The sender's device has not sent us the keys for this message." ) ,
1829+ ) ;
1830+ await flushTasks ( ) ;
18241831
18251832 expect ( logger . warn ) . toHaveBeenCalledTimes ( 1 ) ;
18261833 expectWarnContextFields ( logger , 1 , "Failed to decrypt message" , {
0 commit comments