wildebeest/backend/src/activitypub/objects/collection.ts

42 wiersze
1.1 KiB
TypeScript

import type { Object } from 'wildebeest/backend/src/activitypub/objects'
export interface Collection<T> extends Object {
totalItems: number
current?: string
first: URL
last: URL
items: Array<T>
}
export interface OrderedCollection<T> extends Collection<T> {}
export interface OrderedCollectionPage<T> extends Object {
orderedItems: Array<T>
}
const headers = {
accept: 'application/activity+json',
}
export async function getMetadata(url: URL): Promise<OrderedCollection<any>> {
const res = await fetch(url, { headers })
if (!res.ok) {
throw new Error(`${url} returned ${res.status}`)
}
return res.json<OrderedCollection<any>>()
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export async function loadItems<T>(collection: OrderedCollection<T>, max?: number): Promise<Array<T>> {
// FIXME: implement max and multi page support
const res = await fetch(collection.first, { headers })
if (!res.ok) {
throw new Error(`${collection.first} returned ${res.status}`)
}
const data = await res.json<OrderedCollectionPage<T>>()
return data.orderedItems
}