feat(core): reduce profile loading time (#6616)

This commit is contained in:
EYHN
2024-04-18 15:23:12 +00:00
parent c3438fde21
commit 6a23fe37a7
3 changed files with 28 additions and 20 deletions

View File

@@ -1,8 +1,14 @@
import { DebugLogger } from '@affine/debug';
import { catchError, EMPTY, from, mergeMap, switchMap } from 'rxjs';
import { catchError, EMPTY, mergeMap, switchMap } from 'rxjs';
import { Entity } from '../../../framework';
import { effect, LiveData, onComplete, onStart } from '../../../livedata';
import {
effect,
fromPromise,
LiveData,
onComplete,
onStart,
} from '../../../livedata';
import type { WorkspaceMetadata } from '../metadata';
import type { WorkspaceFlavourProvider } from '../providers/flavour';
import type { WorkspaceProfileCacheStore } from '../stores/profile-cache';
@@ -54,11 +60,12 @@ export class WorkspaceProfile extends Entity<{ metadata: WorkspaceMetadata }> {
revalidate = effect(
switchMap(() => {
if (!this.provider) {
const provider = this.provider;
if (!provider) {
return EMPTY;
}
return from(
this.provider.getWorkspaceProfile(this.props.metadata.id)
return fromPromise(signal =>
provider.getWorkspaceProfile(this.props.metadata.id, signal)
).pipe(
mergeMap(info => {
if (info) {

View File

@@ -47,7 +47,10 @@ export interface WorkspaceFlavourProvider {
*/
revalidate?: () => void;
getWorkspaceProfile(id: string): Promise<WorkspaceProfileInfo | undefined>;
getWorkspaceProfile(
id: string,
signal?: AbortSignal
): Promise<WorkspaceProfileInfo | undefined>;
getWorkspaceBlob(id: string, blob: string): Promise<Blob | null>;

View File

@@ -26,7 +26,7 @@ import {
} from '@toeverything/infra';
import { effect, globalBlockSuiteSchema, Service } from '@toeverything/infra';
import { nanoid } from 'nanoid';
import { EMPTY, lastValueFrom, map, mergeMap, timeout } from 'rxjs';
import { EMPTY, map, mergeMap } from 'rxjs';
import { applyUpdate, encodeStateAsUpdate } from 'yjs';
import type {
@@ -179,7 +179,8 @@ export class CloudWorkspaceFlavourProviderService
isLoading$ = new LiveData(false);
workspaces$ = new LiveData<WorkspaceMetadata[]>([]);
async getWorkspaceProfile(
id: string
id: string,
signal?: AbortSignal
): Promise<WorkspaceProfileInfo | undefined> {
// get information from both cloud and local storage
@@ -190,7 +191,7 @@ export class CloudWorkspaceFlavourProviderService
const localData = await docStorage.doc.get(id);
const cloudData = await cloudStorage.pull(id);
const isOwner = await this.getIsOwner(id);
const isOwner = await this.getIsOwner(id, signal);
if (!cloudData && !localData) {
return {
@@ -255,18 +256,15 @@ export class CloudWorkspaceFlavourProviderService
};
}
private async getIsOwner(workspaceId: string) {
private async getIsOwner(workspaceId: string, signal?: AbortSignal) {
return (
await lastValueFrom(
this.graphqlService
.rxGql({
query: getIsOwnerQuery,
variables: {
workspaceId,
},
})
.pipe(timeout(3000))
)
await this.graphqlService.gql({
query: getIsOwnerQuery,
variables: {
workspaceId,
},
context: { signal },
})
).isOwner;
}