close #320 use emitter handler to catch before load state

This commit is contained in:
Yanzhen Yu
2020-09-06 18:14:11 +08:00
parent 9f6f9a8c47
commit cdebe18803
3 changed files with 25 additions and 10 deletions

View File

@@ -403,7 +403,7 @@ export class Replayer {
private rebuildFullSnapshot( private rebuildFullSnapshot(
event: fullSnapshotEvent & { timestamp: number }, event: fullSnapshotEvent & { timestamp: number },
isSync: boolean = false isSync: boolean = false,
) { ) {
if (!this.iframe.contentDocument) { if (!this.iframe.contentDocument) {
return console.warn('Looks like your replayer has been destroyed.'); return console.warn('Looks like your replayer has been destroyed.');
@@ -426,7 +426,9 @@ export class Replayer {
(styleEl.sheet! as CSSStyleSheet).insertRule(injectStylesRules[idx], idx); (styleEl.sheet! as CSSStyleSheet).insertRule(injectStylesRules[idx], idx);
} }
this.emitter.emit(ReplayerEvents.FullsnapshotRebuilded, event); this.emitter.emit(ReplayerEvents.FullsnapshotRebuilded, event);
if (!isSync) this.waitForStylesheetLoad(); if (!isSync) {
this.waitForStylesheetLoad();
}
if (this.config.UNSAFE_replayCanvas) { if (this.config.UNSAFE_replayCanvas) {
this.preloadAllImages(); this.preloadAllImages();
} }
@@ -441,9 +443,15 @@ export class Replayer {
const unloadSheets: Set<HTMLLinkElement> = new Set(); const unloadSheets: Set<HTMLLinkElement> = new Set();
let timer: number; let timer: number;
let beforeLoadState = this.service.state; let beforeLoadState = this.service.state;
const { unsubscribe } = this.service.subscribe((state) => { const stateHandler = () => {
beforeLoadState = state; beforeLoadState = this.service.state;
}); };
this.emitter.on(ReplayerEvents.Start, stateHandler);
this.emitter.on(ReplayerEvents.Pause, stateHandler);
const unsubscribe = () => {
this.emitter.off(ReplayerEvents.Start, stateHandler);
this.emitter.off(ReplayerEvents.Pause, stateHandler);
};
head head
.querySelectorAll('link[rel="stylesheet"]') .querySelectorAll('link[rel="stylesheet"]')
.forEach((css: HTMLLinkElement) => { .forEach((css: HTMLLinkElement) => {
@@ -487,9 +495,15 @@ export class Replayer {
*/ */
private preloadAllImages() { private preloadAllImages() {
let beforeLoadState = this.service.state; let beforeLoadState = this.service.state;
const { unsubscribe } = this.service.subscribe((state) => { const stateHandler = () => {
beforeLoadState = state; beforeLoadState = this.service.state;
}); };
this.emitter.on(ReplayerEvents.Start, stateHandler);
this.emitter.on(ReplayerEvents.Pause, stateHandler);
const unsubscribe = () => {
this.emitter.off(ReplayerEvents.Start, stateHandler);
this.emitter.off(ReplayerEvents.Pause, stateHandler);
};
let count = 0; let count = 0;
let resolved = 0; let resolved = 0;
for (const event of this.service.state.context.events) { for (const event of this.service.state.context.events) {

View File

@@ -116,8 +116,8 @@ export function createPlayerService(
}, },
TO_LIVE: { TO_LIVE: {
target: 'live', target: 'live',
actions: ['startLive'] actions: ['startLive'],
} },
}, },
}, },
live: { live: {

View File

@@ -409,6 +409,7 @@ export type Handler = (event?: unknown) => void;
export type Emitter = { export type Emitter = {
on(type: string, handler: Handler): void; on(type: string, handler: Handler): void;
emit(type: string, event?: unknown): void; emit(type: string, event?: unknown): void;
off(type: string, handler: Handler): void;
}; };
export type Arguments<T> = T extends (...payload: infer U) => unknown export type Arguments<T> = T extends (...payload: infer U) => unknown