Files
shadow-gunbuilder-ai-proto/lib/sanityFetch.ts
T
2026-03-12 07:10:37 -04:00

46 lines
1.3 KiB
TypeScript

import https from 'https'
import { projectId, dataset, apiVersion } from './sanity'
const SANITY_IP = '34.102.242.91'
const SANITY_HOST = `${projectId}.api.sanity.io`
export function sanityFetch<T = unknown>(
query: string,
params?: Record<string, unknown>
): Promise<T> {
let path = `/v${apiVersion}/data/query/${dataset}?query=${encodeURIComponent(query)}`
if (params) {
for (const [key, value] of Object.entries(params)) {
path += `&$${key}=${encodeURIComponent(JSON.stringify(value))}`
}
}
return new Promise((resolve, reject) => {
const req = https.request(
{
method: 'GET',
hostname: SANITY_IP,
port: 443,
path,
servername: SANITY_HOST,
headers: { Host: SANITY_HOST, Accept: 'application/json', 'User-Agent': 'battl-builders/1.0' },
},
(res) => {
let data = ''
res.on('data', (c) => (data += c))
res.on('end', () => {
try {
const parsed = JSON.parse(data)
res.statusCode && res.statusCode >= 400
? reject(new Error(`Sanity ${res.statusCode}: ${JSON.stringify(parsed)}`))
: resolve(parsed.result as T)
} catch {
reject(new Error(`Sanity parse error: ${data.slice(0, 200)}`))
}
})
}
)
req.on('error', reject)
req.end()
})
}