// Copyright 2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only /* eslint-disable no-restricted-syntax */ import { explodePromise } from './explodePromise'; export interface IController { abort(): void; } export class AbortableProcess implements IController { private abortReject: (error: Error) => void; public readonly resultPromise: Promise; constructor( private readonly name: string, private readonly controller: IController, resultPromise: Promise ) { const { promise: abortPromise, reject: abortReject } = explodePromise(); this.abortReject = abortReject; this.resultPromise = Promise.race([abortPromise, resultPromise]); } public abort(): void { this.controller.abort(); this.abortReject(new Error(`Process "${this.name}" was aborted`)); } public getResult(): Promise { return this.resultPromise; } }