mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 09:13:33 +00:00
Refactored message listener observable to handle angular change detection
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import { NgZone } from "@angular/core";
|
||||||
import { Observable } from "rxjs";
|
import { Observable } from "rxjs";
|
||||||
|
|
||||||
import { DeviceType } from "@bitwarden/common/enums";
|
import { DeviceType } from "@bitwarden/common/enums";
|
||||||
@@ -212,9 +213,15 @@ export class BrowserApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static messageListener$() {
|
static messageListener$(zone?: NgZone) {
|
||||||
return new Observable<unknown>((subscriber) => {
|
return new Observable<unknown>((subscriber) => {
|
||||||
const handler = (message: unknown) => subscriber.next(message);
|
const handler = (message: unknown) => {
|
||||||
|
if (zone) {
|
||||||
|
zone.run(() => subscriber.next(message));
|
||||||
|
} else {
|
||||||
|
subscriber.next(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
chrome.runtime.onMessage.addListener(handler);
|
chrome.runtime.onMessage.addListener(handler);
|
||||||
return () => chrome.runtime.onMessage.removeListener(handler);
|
return () => chrome.runtime.onMessage.removeListener(handler);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { CipherType } from "@bitwarden/common/vault/enums/cipher-type";
|
|||||||
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||||
import { Fido2KeyView } from "@bitwarden/common/vault/models/view/fido2-key.view";
|
import { Fido2KeyView } from "@bitwarden/common/vault/models/view/fido2-key.view";
|
||||||
|
|
||||||
|
import { BrowserApi } from "../../../../platform/browser/browser-api";
|
||||||
import {
|
import {
|
||||||
BrowserFido2Message,
|
BrowserFido2Message,
|
||||||
BrowserFido2UserInterfaceSession,
|
BrowserFido2UserInterfaceSession,
|
||||||
@@ -57,16 +58,10 @@ export class Fido2Component implements OnInit, OnDestroy {
|
|||||||
map((queryParamMap) => queryParamMap.get("sessionId"))
|
map((queryParamMap) => queryParamMap.get("sessionId"))
|
||||||
);
|
);
|
||||||
|
|
||||||
// Duplicated from BrowserApi.MessageListener$, but adds ngZone.run to make sure
|
combineLatest([
|
||||||
// Angular change detection knows when a new value is emitted. Otherwise it is outside the zone.
|
sessionId$,
|
||||||
// TODO: refactor so that this is reusable in other components to help others avoid this trap!
|
BrowserApi.messageListener$(this.ngZone) as Observable<BrowserFido2Message>,
|
||||||
const messageListener$ = new Observable<unknown>((subscriber) => {
|
])
|
||||||
const handler = (message: unknown) => this.ngZone.run(() => subscriber.next(message)); // <-- the magic is here
|
|
||||||
chrome.runtime.onMessage.addListener(handler);
|
|
||||||
return () => chrome.runtime.onMessage.removeListener(handler);
|
|
||||||
}) as Observable<BrowserFido2Message>;
|
|
||||||
|
|
||||||
combineLatest([sessionId$, messageListener$])
|
|
||||||
.pipe(takeUntil(this.destroy$))
|
.pipe(takeUntil(this.destroy$))
|
||||||
.subscribe(([sessionId, message]) => {
|
.subscribe(([sessionId, message]) => {
|
||||||
this.sessionId = sessionId;
|
this.sessionId = sessionId;
|
||||||
|
|||||||
Reference in New Issue
Block a user