mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-12 07:36:42 +08:00
1ceed6c145
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Introduced a Document Summary module, enabling live and cached document summaries with cloud revalidation. * Added a feature flag for enabling battery save mode. * Added explicit pause and resume controls for sync operations, accessible via UI events and programmatically. * **Improvements** * Enhanced sync and indexing logic to support pausing, resuming, and battery save mode, with improved job prioritization. * Updated navigation and preview components to use the new document summary service and improved priority handling. * Improved logging and state reporting for sync and indexing processes. * Refined backlink handling with reactive loading states and cloud revalidation. * Replaced backlink and link management to use a new dedicated document links service. * Enhanced workspace engine to conditionally enable battery save mode based on feature flags and workspace flavor. * **Bug Fixes** * Removed unnecessary debug console logs from various components for cleaner output. * **Refactor** * Replaced battery save mode methods with explicit pause/resume methods throughout the app and services. * Modularized and streamlined document summary and sync-related code for better maintainability. * Restructured backlink components to improve visibility handling and data fetching. * Simplified and improved document backlink data fetching with retry and loading state management. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import { PriorityQueue } from './priority-queue';
|
|
|
|
export class AsyncPriorityQueue extends PriorityQueue {
|
|
private _resolveUpdate: (() => void) | null = null;
|
|
private _waitForUpdate: Promise<void> | null = null;
|
|
|
|
async asyncPop(
|
|
minimumPriority?: number,
|
|
abort?: AbortSignal
|
|
): Promise<string> {
|
|
const update = this.pop(minimumPriority);
|
|
if (update) {
|
|
return update;
|
|
} else {
|
|
if (!this._waitForUpdate) {
|
|
this._waitForUpdate = new Promise(resolve => {
|
|
this._resolveUpdate = resolve;
|
|
});
|
|
}
|
|
|
|
await Promise.race([
|
|
this._waitForUpdate,
|
|
new Promise((_, reject) => {
|
|
if (abort?.aborted) {
|
|
reject(abort?.reason);
|
|
}
|
|
abort?.addEventListener('abort', () => {
|
|
reject(abort.reason);
|
|
});
|
|
}),
|
|
]);
|
|
|
|
return this.asyncPop(minimumPriority, abort);
|
|
}
|
|
}
|
|
|
|
override push(id: string, priority: number = 0) {
|
|
super.push(id, priority);
|
|
if (this._resolveUpdate) {
|
|
const resolve = this._resolveUpdate;
|
|
this._resolveUpdate = null;
|
|
this._waitForUpdate = null;
|
|
resolve();
|
|
}
|
|
}
|
|
}
|