109 lines
3.0 KiB
TypeScript
109 lines
3.0 KiB
TypeScript
import { IncomingMessage } from 'http'
|
|
import { parse } from 'url'
|
|
import { ParsedRequest } from './types'
|
|
|
|
export function parseRequest(req: IncomingMessage) {
|
|
console.log('HTTP ' + req.url)
|
|
const { pathname, query } = parse(req.url || '/', true)
|
|
const {
|
|
fontSize,
|
|
images,
|
|
widths,
|
|
heights,
|
|
theme,
|
|
md,
|
|
|
|
// Attributes for Manifold card:
|
|
question,
|
|
probability,
|
|
numericValue,
|
|
metadata,
|
|
creatorName,
|
|
creatorUsername,
|
|
creatorAvatarUrl,
|
|
|
|
// Challenge attributes:
|
|
challengerAmount,
|
|
challengerOutcome,
|
|
creatorAmount,
|
|
creatorOutcome,
|
|
acceptedName,
|
|
acceptedAvatarUrl,
|
|
} = query || {}
|
|
|
|
if (Array.isArray(fontSize)) {
|
|
throw new Error('Expected a single fontSize')
|
|
}
|
|
if (Array.isArray(theme)) {
|
|
throw new Error('Expected a single theme')
|
|
}
|
|
|
|
const arr = (pathname || '/').slice(1).split('.')
|
|
let extension = ''
|
|
let text = ''
|
|
if (arr.length === 0) {
|
|
text = ''
|
|
} else if (arr.length === 1) {
|
|
text = arr[0]
|
|
} else {
|
|
extension = arr.pop() as string
|
|
text = arr.join('.')
|
|
}
|
|
|
|
// Take a url query param and return a single string
|
|
const getString = (stringOrArray: string[] | string | undefined): string => {
|
|
if (Array.isArray(stringOrArray)) {
|
|
// If the query param is an array, return the first element
|
|
return stringOrArray[0]
|
|
}
|
|
return stringOrArray || ''
|
|
}
|
|
|
|
const parsedRequest: ParsedRequest = {
|
|
fileType: extension === 'jpeg' ? extension : 'png',
|
|
text: decodeURIComponent(text),
|
|
theme: theme === 'dark' ? 'dark' : 'light',
|
|
md: md === '1' || md === 'true',
|
|
fontSize: fontSize || '96px',
|
|
images: getArray(images),
|
|
widths: getArray(widths),
|
|
heights: getArray(heights),
|
|
|
|
question:
|
|
getString(question) || 'Will you create a prediction market on Manifold?',
|
|
probability: getString(probability),
|
|
numericValue: getString(numericValue) || '',
|
|
metadata: getString(metadata) || 'Jan 1 • M$ 123 pool',
|
|
creatorName: getString(creatorName) || 'Manifold Markets',
|
|
creatorUsername: getString(creatorUsername) || 'ManifoldMarkets',
|
|
creatorAvatarUrl: getString(creatorAvatarUrl) || '',
|
|
challengerAmount: getString(challengerAmount) || '',
|
|
challengerOutcome: getString(challengerOutcome) || '',
|
|
creatorAmount: getString(creatorAmount) || '',
|
|
creatorOutcome: getString(creatorOutcome) || '',
|
|
acceptedName: getString(acceptedName) || '',
|
|
acceptedAvatarUrl: getString(acceptedAvatarUrl) || '',
|
|
}
|
|
parsedRequest.images = getDefaultImages(parsedRequest.images)
|
|
return parsedRequest
|
|
}
|
|
|
|
function getArray(stringOrArray: string[] | string | undefined): string[] {
|
|
if (typeof stringOrArray === 'undefined') {
|
|
return []
|
|
} else if (Array.isArray(stringOrArray)) {
|
|
return stringOrArray
|
|
} else {
|
|
return [stringOrArray]
|
|
}
|
|
}
|
|
|
|
function getDefaultImages(images: string[]): string[] {
|
|
const defaultImage = 'https://manifold.markets/logo.png'
|
|
|
|
if (!images || !images[0]) {
|
|
return [defaultImage]
|
|
}
|
|
return images
|
|
}
|