Use proxy for fetching link meta (#716)

* Use proxy for fetching link meta

* Remove link meta test due to hitting proxy

* setup different staging and prod proxy URLs

---------

Co-authored-by: Ansh Nanda <anshnanda10@gmail.com>
Co-authored-by: Paul Frazee <pfrazee@gmail.com>
This commit is contained in:
Ollie H 2023-05-30 18:08:49 -07:00 committed by GitHub
parent 2018558585
commit c0ca27b7ce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 122 deletions

View file

@ -144,3 +144,18 @@ export const POST_IMG_MAX = {
height: 2000,
size: 1000000,
}
export const STAGING_LINK_META_PROXY =
'https://cardyb.staging.bsky.dev/v1/extract?url='
export const PROD_LINK_META_PROXY = 'https://cardyb.bsky.app/v1/extract?url='
export function LINK_META_PROXY(serviceUrl: string) {
if (serviceUrl.includes('localhost')) {
return STAGING_LINK_META_PROXY
} else if (serviceUrl.includes('staging')) {
return STAGING_LINK_META_PROXY
} else {
return PROD_LINK_META_PROXY
}
}

View file

@ -1,8 +1,7 @@
import he from 'he'
import {isBskyAppUrl} from '../strings/url-helpers'
import {RootStoreModel} from 'state/index'
import {extractBskyMeta} from './bsky'
import {extractHtmlMeta} from './html'
import {LINK_META_PROXY} from 'lib/constants'
export enum LikelyType {
HTML,
@ -54,26 +53,29 @@ export async function getLinkMeta(
try {
const controller = new AbortController()
const to = setTimeout(() => controller.abort(), timeout || 5e3)
const httpRes = await fetch(url, {
headers: {accept: 'text/html'},
signal: controller.signal,
})
const httpResBody = await httpRes.text()
const response = await fetch(
`${LINK_META_PROXY(
store.session.currentSession?.service || '',
)}${encodeURIComponent(url)}`,
)
const body = await response.json()
clearTimeout(to)
const httpResMeta = extractHtmlMeta({
html: httpResBody,
hostname: urlp?.hostname,
pathname: urlp?.pathname,
})
meta.title = httpResMeta.title ? he.decode(httpResMeta.title) : undefined
meta.description = httpResMeta.description
? he.decode(httpResMeta.description)
: undefined
meta.image = httpResMeta.image
const {description, error, image, title} = body
if (error !== '') {
throw new Error(error)
}
meta.description = description
meta.image = image
meta.title = title
} catch (e) {
// failed
console.error(e)
meta.error = 'Failed to fetch link'
meta.error = e instanceof Error ? e.toString() : 'Failed to fetch link'
}
return meta