mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {LRUMap} from 'lru_map' 2import {RootStoreModel} from '../root-store' 3import { 4 AppBskyFeedDefs, 5 AppBskyEmbedRecord, 6 AppBskyEmbedRecordWithMedia, 7 AppBskyFeedPost, 8} from '@atproto/api' 9 10type PostView = AppBskyFeedDefs.PostView 11 12export class PostsCache { 13 cache: LRUMap<string, PostView> = new LRUMap(500) 14 15 constructor(public rootStore: RootStoreModel) {} 16 17 set(uri: string, postView: PostView) { 18 this.cache.set(uri, postView) 19 if (postView.author.handle) { 20 this.rootStore.handleResolutions.cache.set( 21 postView.author.handle, 22 postView.author.did, 23 ) 24 } 25 } 26 27 fromFeedItem(feedItem: AppBskyFeedDefs.FeedViewPost) { 28 this.set(feedItem.post.uri, feedItem.post) 29 if ( 30 feedItem.reply?.parent && 31 AppBskyFeedDefs.isPostView(feedItem.reply?.parent) 32 ) { 33 this.set(feedItem.reply.parent.uri, feedItem.reply.parent) 34 } 35 const embed = feedItem.post.embed 36 if ( 37 AppBskyEmbedRecord.isView(embed) && 38 AppBskyEmbedRecord.isViewRecord(embed.record) && 39 AppBskyFeedPost.isRecord(embed.record.value) && 40 AppBskyFeedPost.validateRecord(embed.record.value).success 41 ) { 42 this.set(embed.record.uri, embedViewToPostView(embed.record)) 43 } 44 if ( 45 AppBskyEmbedRecordWithMedia.isView(embed) && 46 AppBskyEmbedRecord.isViewRecord(embed.record?.record) && 47 AppBskyFeedPost.isRecord(embed.record.record.value) && 48 AppBskyFeedPost.validateRecord(embed.record.record.value).success 49 ) { 50 this.set( 51 embed.record.record.uri, 52 embedViewToPostView(embed.record.record), 53 ) 54 } 55 } 56} 57 58function embedViewToPostView( 59 embedView: AppBskyEmbedRecord.ViewRecord, 60): PostView { 61 return { 62 $type: 'app.bsky.feed.post#view', 63 uri: embedView.uri, 64 cid: embedView.cid, 65 author: embedView.author, 66 record: embedView.value, 67 indexedAt: embedView.indexedAt, 68 labels: embedView.labels, 69 } 70}