UNPKG

1.92 kBJavaScriptView Raw
1import express from 'express'
2import graphqlHTTP from 'express-graphql'
3import compression from 'compression'
4import cors from 'cors'
5import MusicBrainz from './api'
6import schema, { createSchema } from './schema'
7import { createContext } from './context'
8
9const formatError = err => ({
10 message: err.message,
11 locations: err.locations,
12 stack: err.stack
13})
14
15export const defaultExtensions = [
16 require.resolve('./extensions/cover-art-archive'),
17 require.resolve('./extensions/fanart-tv'),
18 require.resolve('./extensions/mediawiki'),
19 require.resolve('./extensions/the-audio-db')
20]
21
22const middleware = ({
23 client = new MusicBrainz(),
24 extensions = process.env.GRAPHBRAINZ_EXTENSIONS
25 ? JSON.parse(process.env.GRAPHBRAINZ_EXTENSIONS)
26 : defaultExtensions,
27 ...middlewareOptions
28} = {}) => {
29 const options = { client, extensions, ...middlewareOptions }
30 const DEV = process.env.NODE_ENV !== 'production'
31 const graphiql = DEV || process.env.GRAPHBRAINZ_GRAPHIQL === 'true'
32 return graphqlHTTP({
33 schema: createSchema(schema, options),
34 context: createContext(options),
35 pretty: DEV,
36 graphiql,
37 formatError: DEV ? formatError : undefined,
38 ...middlewareOptions
39 })
40}
41
42export default middleware
43
44export function start(options) {
45 require('dotenv').config({ silent: true })
46 const app = express()
47 const port = process.env.PORT || 3000
48 const route = process.env.GRAPHBRAINZ_PATH || '/'
49 const corsOptions = {
50 origin: process.env.GRAPHBRAINZ_CORS_ORIGIN || false,
51 methods: 'HEAD,GET,POST'
52 }
53 switch (corsOptions.origin) {
54 case 'true':
55 corsOptions.origin = true
56 break
57 case 'false':
58 corsOptions.origin = false
59 break
60 default:
61 break
62 }
63 app.use(compression())
64 app.use(route, cors(corsOptions), middleware(options))
65 app.listen(port)
66 console.log(`Listening on port ${port}.`)
67}
68
69if (require.main === module) {
70 start()
71}