story-research-zapwall/lib/configStorageNip95.ts

81 lines
2.2 KiB
TypeScript

/**
* NIP-95 API management methods for ConfigStorage
*/
import type { Nip95Config, ConfigData } from './configStorageTypes'
import { DEFAULT_NIP95_APIS } from './configStorageTypes'
export function getEnabledNip95Apis(config: ConfigData): string[] {
return config.nip95Apis
.filter((api) => api.enabled)
.sort((a, b) => a.priority - b.priority)
.map((api) => api.url)
}
export function getPrimaryNip95ApiFromConfig(config: ConfigData): string {
const apis = getEnabledNip95Apis(config)
if (apis.length === 0) {
const defaultApi = DEFAULT_NIP95_APIS[0]
if (!defaultApi) {
throw new Error('No default NIP-95 API configured')
}
return defaultApi.url
}
const primaryApi = apis[0]
if (!primaryApi) {
const defaultApi = DEFAULT_NIP95_APIS[0]
if (!defaultApi) {
throw new Error('No default NIP-95 API configured')
}
return defaultApi.url
}
return primaryApi
}
export function createNip95Config(url: string, enabled: boolean, priority: number): Nip95Config {
return {
id: `nip95_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
url,
enabled,
priority,
createdAt: Date.now(),
}
}
export function addNip95ApiToConfig(config: ConfigData, url: string, enabled: boolean, priority?: number): ConfigData {
const maxPriority = Math.max(...config.nip95Apis.map((a) => a.priority), 0)
const newApi = createNip95Config(url, enabled, priority ?? maxPriority + 1)
return {
...config,
nip95Apis: [...config.nip95Apis, newApi],
}
}
export function updateNip95ApiInConfig(
config: ConfigData,
id: string,
updates: Partial<Omit<Nip95Config, 'id' | 'createdAt'>>
): ConfigData {
const apiIndex = config.nip95Apis.findIndex((a) => a.id === id)
if (apiIndex === -1) {
throw new Error(`NIP-95 API with id ${id} not found`)
}
const existingApi = config.nip95Apis[apiIndex]
const updatedApis = [...config.nip95Apis]
updatedApis[apiIndex] = {
...existingApi,
...updates,
} as Nip95Config
return {
...config,
nip95Apis: updatedApis,
}
}
export function removeNip95ApiFromConfig(config: ConfigData, id: string): ConfigData {
return {
...config,
nip95Apis: config.nip95Apis.filter((a) => a.id !== id),
}
}