sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
38 lines (33 loc) • 1.34 kB
text/typescript
import {type SanityClient} from '@sanity/client'
import {type Schema} from '@sanity/types'
import {concat, EMPTY, merge, type Observable, of} from 'rxjs'
import {map, mergeMap, shareReplay} from 'rxjs/operators'
import {type HistoryStore} from '../../history'
import {type IdPair} from '../types'
import {memoize} from '../utils/createMemoizer'
import {memoizeKeyGen} from './memoizeKeyGen'
import {operationArgs} from './operationArgs'
import {operationEvents} from './operationEvents'
import {type OperationsAPI} from './operations'
import {createOperationsAPI, GUARDED} from './operations/helpers'
export const editOperations = memoize(
(
ctx: {
client: SanityClient
historyStore: HistoryStore
schema: Schema
},
idPair: IdPair,
typeName: string,
): Observable<OperationsAPI> => {
const operationEvents$ = operationEvents(ctx)
const operationArgs$ = operationArgs(ctx, idPair, typeName)
const operations$ = operationArgs$.pipe(map(createOperationsAPI))
// To makes sure we connect the stream that actually performs the operations
return concat(
of(GUARDED),
merge(operationEvents$.pipe(mergeMap(() => EMPTY)), operations$),
).pipe(shareReplay({refCount: true, bufferSize: 1}))
},
(ctx, idPair, typeName) => memoizeKeyGen(ctx.client, idPair, typeName),
)