diff options
Diffstat (limited to 'src/state/models/cache')
| -rw-r--r-- | src/state/models/cache/handle-resolutions.ts | 5 | ||||
| -rw-r--r-- | src/state/models/cache/posts.ts | 70 | ||||
| -rw-r--r-- | src/state/models/cache/profiles-view.ts | 4 |
3 files changed, 76 insertions, 3 deletions
diff --git a/src/state/models/cache/handle-resolutions.ts b/src/state/models/cache/handle-resolutions.ts new file mode 100644 index 000000000..2e2b69661 --- /dev/null +++ b/src/state/models/cache/handle-resolutions.ts @@ -0,0 +1,5 @@ +import {LRUMap} from 'lru_map' + +export class HandleResolutionsCache { + cache: LRUMap<string, string> = new LRUMap(500) +} diff --git a/src/state/models/cache/posts.ts b/src/state/models/cache/posts.ts new file mode 100644 index 000000000..d3632f436 --- /dev/null +++ b/src/state/models/cache/posts.ts @@ -0,0 +1,70 @@ +import {LRUMap} from 'lru_map' +import {RootStoreModel} from '../root-store' +import { + AppBskyFeedDefs, + AppBskyEmbedRecord, + AppBskyEmbedRecordWithMedia, + AppBskyFeedPost, +} from '@atproto/api' + +type PostView = AppBskyFeedDefs.PostView + +export class PostsCache { + cache: LRUMap<string, PostView> = new LRUMap(500) + + constructor(public rootStore: RootStoreModel) {} + + set(uri: string, postView: PostView) { + this.cache.set(uri, postView) + if (postView.author.handle) { + this.rootStore.handleResolutions.cache.set( + postView.author.handle, + postView.author.did, + ) + } + } + + fromFeedItem(feedItem: AppBskyFeedDefs.FeedViewPost) { + this.set(feedItem.post.uri, feedItem.post) + if ( + feedItem.reply?.parent && + AppBskyFeedDefs.isPostView(feedItem.reply?.parent) + ) { + this.set(feedItem.reply.parent.uri, feedItem.reply.parent) + } + const embed = feedItem.post.embed + if ( + AppBskyEmbedRecord.isView(embed) && + AppBskyEmbedRecord.isViewRecord(embed.record) && + AppBskyFeedPost.isRecord(embed.record.value) && + AppBskyFeedPost.validateRecord(embed.record.value).success + ) { + this.set(embed.record.uri, embedViewToPostView(embed.record)) + } + if ( + AppBskyEmbedRecordWithMedia.isView(embed) && + AppBskyEmbedRecord.isViewRecord(embed.record?.record) && + AppBskyFeedPost.isRecord(embed.record.record.value) && + AppBskyFeedPost.validateRecord(embed.record.record.value).success + ) { + this.set( + embed.record.record.uri, + embedViewToPostView(embed.record.record), + ) + } + } +} + +function embedViewToPostView( + embedView: AppBskyEmbedRecord.ViewRecord, +): PostView { + return { + $type: 'app.bsky.feed.post#view', + uri: embedView.uri, + cid: embedView.cid, + author: embedView.author, + record: embedView.value, + indexedAt: embedView.indexedAt, + labels: embedView.labels, + } +} diff --git a/src/state/models/cache/profiles-view.ts b/src/state/models/cache/profiles-view.ts index b4bd70db5..e5a9be587 100644 --- a/src/state/models/cache/profiles-view.ts +++ b/src/state/models/cache/profiles-view.ts @@ -45,8 +45,6 @@ export class ProfilesCache { } overwrite(did: string, res: GetProfile.Response) { - if (this.cache.has(did)) { - this.cache.set(did, res) - } + this.cache.set(did, res) } } |
