-
Notifications
You must be signed in to change notification settings - Fork 98
/
getWorkspacePages.ts
67 lines (60 loc) · 1.87 KB
/
getWorkspacePages.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { getBlocksuiteReader } from 'affine-reader'
import PQueue from 'p-queue';
import { ContentFileMeta, parseWorkspacePageMeta } from './resolveContentFile'
const reader = getBlocksuiteReader({
// public workspace id for affine.pro
workspaceId: `qf73AF6vzWphbTJdN7KiX`,
retry: 3,
})
const queue = new PQueue({ concurrency: 5 });
let lastFetch = 0
let _pages$: Promise<ContentFileMeta[] | undefined> | null = null
export async function getWorkspacePages(invalidateCache = false) {
if (!_pages$ || lastFetch < Date.now() - 1000 * 30 || invalidateCache) {
const start = performance.now()
if (lastFetch) {
console.log(
'Fetching pages again, last fetch is ' +
(Date.now() - lastFetch) +
'ms ago.'
)
}
_pages$ = reader.getDocPageMetas().then((pages) => {
console.log(
'Pages fetched in ' + (performance.now() - start).toFixed(1) + 'ms'
)
const filteredPages = pages
?.filter((p) => !p.trash)
.filter(p => p.title) || []
return queue.addAll(
filteredPages.map((page, idx) => () => {
console.log(`(${idx}/${filteredPages.length}) parsing ${page.id}:${page.title}`)
return parseWorkspacePageMeta(page, reader);
})
);
})
lastFetch = Date.now()
} else {
console.log('Using cached pages.')
}
const pages = await _pages$
return pages
}
export async function getWorkspacePage(
slug: string,
invalidateCache = false
): Promise<ContentFileMeta | undefined> {
const pages = await getWorkspacePages(invalidateCache)
const _slug = slug.toLowerCase().trim()
let page = pages?.find((p) => p.slug === _slug || p.id === _slug)
if (!page && !invalidateCache) {
page = await getWorkspacePage(slug, true)
}
if (page) {
return page
}
console.error(
'cannot find ' + slug + 'in ',
pages?.map((p) => p.slug)
)
}