diff --git a/libs/common/src/auth/send-access/abstractions/send-token.service.ts b/libs/common/src/auth/send-access/abstractions/send-token.service.ts index 2f70c750931..b45290f0e94 100644 --- a/libs/common/src/auth/send-access/abstractions/send-token.service.ts +++ b/libs/common/src/auth/send-access/abstractions/send-token.service.ts @@ -1,3 +1,5 @@ +import { Observable } from "rxjs"; + import { SendHashedPassword } from "../../../key-management/sends/send-password.service"; import { SendAccessToken } from "../models/send-access-token"; import { @@ -29,7 +31,6 @@ export type SendAccessCredentials = | SendEmailOtpCredentials; export abstract class SendTokenService { - // TODO: consider converting to observable. /** * Attempts to retrieve a SendAccessToken for the given sendId. * If the access token is found in session storage and is not expired, then it returns the token. @@ -39,11 +40,11 @@ export abstract class SendTokenService { * If an access token cannot be granted b/c the send requires credentials, then it returns a SendTokenRetrievalError indicating which credentials are required. * Any submissions of credentials will be handled by the getSendAccessTokenWithCredentials method. * @param sendId The ID of the send to retrieve the access token for. - * @returns A promise that resolves to a SendAccessToken if found and valid, or a SendTokenRetrievalError if not. + * @returns An observable that emits a SendAccessToken if successful, or a TryGetSendAccessTokenError if not. */ - abstract tryGetSendAccessToken: ( + abstract tryGetSendAccessToken$: ( sendId: string, - ) => Promise; + ) => Observable; /** * Retrieves a SendAccessToken for the given sendId using the provided credentials. @@ -51,12 +52,12 @@ export abstract class SendTokenService { * If the access token cannot be granted due to invalid credentials, it returns a GetSendAcccessTokenError. * @param sendId The ID of the send to retrieve the access token for. * @param sendAccessCredentials The credentials to use for accessing the send. - * @returns A promise that resolves to a SendAccessToken if found and valid, or a GetSendAcccessTokenError if not. + * @returns An observable that emits a SendAccessToken if successful, or a GetSendAcccessTokenError if not. */ - abstract getSendAccessToken: ( + abstract getSendAccessToken$: ( sendId: string, sendAccessCredentials: SendAccessCredentials, - ) => Promise; + ) => Observable; /** * Hashes a password for send access. diff --git a/libs/common/src/auth/send-access/services/send-token.service.ts b/libs/common/src/auth/send-access/services/send-token.service.ts index 7325289d7a0..cdc09ca5b2e 100644 --- a/libs/common/src/auth/send-access/services/send-token.service.ts +++ b/libs/common/src/auth/send-access/services/send-token.service.ts @@ -1,4 +1,4 @@ -import { firstValueFrom } from "rxjs"; +import { defer, firstValueFrom, from, Observable } from "rxjs"; import { Jsonify } from "type-fest"; import { @@ -76,7 +76,12 @@ export class SendTokenService implements SendTokenServiceAbstraction { this.sendAccessTokenDictGlobalState = this.globalStateProvider.get(SEND_ACCESS_TOKEN_DICT); } - async tryGetSendAccessToken( + tryGetSendAccessToken$(sendId: string): Observable { + // Defer the execution to ensure that a cold observable is returned. + return defer(() => from(this._tryGetSendAccessToken(sendId))); + } + + private async _tryGetSendAccessToken( sendId: string, ): Promise { // Validate the sendId is a non-empty string. @@ -116,7 +121,15 @@ export class SendTokenService implements SendTokenServiceAbstraction { throw new Error(`Unexpected and unhandled API error retrieving send access token: ${result}`); } - async getSendAccessToken( + getSendAccessToken$( + sendId: string, + sendCredentials: SendAccessCredentials, + ): Observable { + // Defer the execution to ensure that a cold observable is returned. + return defer(() => from(this._getSendAccessToken(sendId, sendCredentials))); + } + + private async _getSendAccessToken( sendId: string, sendCredentials: SendAccessCredentials, ): Promise {