mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at react-sdui 97 lines 2.9 kB view raw
1import EventEmitter from 'eventemitter3' 2 3import BroadcastChannel from '#/lib/broadcast' 4import {logger} from '#/logger' 5import {migrate} from '#/state/persisted/legacy' 6import {defaults, Schema} from '#/state/persisted/schema' 7import * as store from '#/state/persisted/store' 8export type {PersistedAccount, Schema} from '#/state/persisted/schema' 9export {defaults} from '#/state/persisted/schema' 10 11const broadcast = new BroadcastChannel('BSKY_BROADCAST_CHANNEL') 12const UPDATE_EVENT = 'BSKY_UPDATE' 13 14let _state: Schema = defaults 15const _emitter = new EventEmitter() 16 17/** 18 * Initializes and returns persisted data state, so that it can be passed to 19 * the Provider. 20 */ 21export async function init() { 22 logger.debug('persisted state: initializing') 23 24 broadcast.onmessage = onBroadcastMessage 25 26 try { 27 await migrate() // migrate old store 28 const stored = await store.read() // check for new store 29 if (!stored) { 30 logger.debug('persisted state: initializing default storage') 31 await store.write(defaults) // opt: init new store 32 } 33 _state = stored || defaults // return new store 34 logger.debug('persisted state: initialized') 35 } catch (e) { 36 logger.error('persisted state: failed to load root state from storage', { 37 message: e, 38 }) 39 // AsyncStorage failure, but we can still continue in memory 40 return defaults 41 } 42} 43 44export function get<K extends keyof Schema>(key: K): Schema[K] { 45 return _state[key] 46} 47 48export async function write<K extends keyof Schema>( 49 key: K, 50 value: Schema[K], 51): Promise<void> { 52 try { 53 _state[key] = value 54 await store.write(_state) 55 // must happen on next tick, otherwise the tab will read stale storage data 56 setTimeout(() => broadcast.postMessage({event: UPDATE_EVENT}), 0) 57 logger.debug(`persisted state: wrote root state to storage`, { 58 updatedKey: key, 59 }) 60 } catch (e) { 61 logger.error(`persisted state: failed writing root state to storage`, { 62 message: e, 63 }) 64 } 65} 66 67export function onUpdate(cb: () => void): () => void { 68 _emitter.addListener('update', cb) 69 return () => _emitter.removeListener('update', cb) 70} 71 72async function onBroadcastMessage({data}: MessageEvent) { 73 // validate event 74 if (typeof data === 'object' && data.event === UPDATE_EVENT) { 75 try { 76 // read next state, possibly updated by another tab 77 const next = await store.read() 78 79 if (next) { 80 logger.debug(`persisted state: handling update from broadcast channel`) 81 _state = next 82 _emitter.emit('update') 83 } else { 84 logger.error( 85 `persisted state: handled update update from broadcast channel, but found no data`, 86 ) 87 } 88 } catch (e) { 89 logger.error( 90 `persisted state: failed handling update from broadcast channel`, 91 { 92 message: e, 93 }, 94 ) 95 } 96 } 97}