diff --git a/src/matrix/verification/SAS/channel/Channel.ts b/src/matrix/verification/SAS/channel/Channel.ts index 35bd3842..700bd569 100644 --- a/src/matrix/verification/SAS/channel/Channel.ts +++ b/src/matrix/verification/SAS/channel/Channel.ts @@ -23,6 +23,7 @@ import {makeTxnId} from "../../../common.js"; import {CancelReason, VerificationEventTypes} from "./types"; import {Disposables} from "../../../../utils/Disposables"; import {VerificationCancelledError} from "../VerificationCancelledError"; +import {Deferred} from "../../../../utils/Deferred"; const messageFromErrorType = { [CancelReason.UserCancelled]: "User declined", @@ -71,7 +72,7 @@ export class ToDeviceChannel extends Disposables implements IChannel { private readonly deviceMessageHandler: DeviceMessageHandler; private readonly sentMessages: Map = new Map(); private readonly receivedMessages: Map = new Map(); - private readonly waitMap: Map}> = new Map(); + private readonly waitMap: Map> = new Map(); private readonly log: ILogItem; public otherUserDeviceId: string; public startMessage: any; @@ -270,14 +271,9 @@ export class ToDeviceChannel extends Disposables implements IChannel { if (existingWait) { return existingWait.promise; } - let resolve, reject; - // Add to wait map - const promise = new Promise((_resolve, _reject) => { - resolve = _resolve; - reject = _reject; - }); - this.waitMap.set(eventType, { resolve, reject, promise }); - return promise; + const deferred = new Deferred(); + this.waitMap.set(eventType, deferred); + return deferred.promise; } setStartMessage(event) { diff --git a/src/utils/Deferred.ts b/src/utils/Deferred.ts new file mode 100644 index 00000000..051708e4 --- /dev/null +++ b/src/utils/Deferred.ts @@ -0,0 +1,40 @@ +/* +Copyright 2023 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +export class Deferred { + public readonly promise: Promise; + public readonly resolve: (value: T) => void; + public readonly reject: (err: Error) => void; + private _value?: T; + + constructor() { + let resolve; + let reject; + this.promise = new Promise((_resolve, _reject) => { + resolve = _resolve; + reject = _reject; + }) + this.resolve = (value: T) => { + this._value = value; + resolve(value); + }; + this.reject = reject; + } + + get value(): T | undefined { + return this._value; + } +}