1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-06 19:53:59 +00:00

PM-20532 - SendTokenService - per Tools request, use observable interface.

This commit is contained in:
Jared Snider
2025-06-05 17:36:58 -04:00
parent 6499b5546c
commit bc8725aa69
2 changed files with 24 additions and 10 deletions

View File

@@ -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<SendAccessToken | TryGetSendAccessTokenError>;
) => Observable<SendAccessToken | TryGetSendAccessTokenError>;
/**
* 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<SendAccessToken | GetSendAcccessTokenError>;
) => Observable<SendAccessToken | GetSendAcccessTokenError>;
/**
* Hashes a password for send access.

View File

@@ -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<SendAccessToken | TryGetSendAccessTokenError> {
// Defer the execution to ensure that a cold observable is returned.
return defer(() => from(this._tryGetSendAccessToken(sendId)));
}
private async _tryGetSendAccessToken(
sendId: string,
): Promise<SendAccessToken | TryGetSendAccessTokenError> {
// 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<SendAccessToken | GetSendAcccessTokenError> {
// 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<SendAccessToken | GetSendAcccessTokenError> {