UNPKG

2.17 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 debug = require('debug')('graphbrainz')
10
11const formatError = (err) => ({
12 message: err.message,
13 locations: err.locations,
14 stack: err.stack
15})
16
17const middleware = ({
18 client = new MusicBrainz(),
19 extensions = process.env.GRAPHBRAINZ_EXTENSIONS
20 ? JSON.parse(process.env.GRAPHBRAINZ_EXTENSIONS)
21 : [
22 './extensions/cover-art-archive',
23 './extensions/fanart-tv',
24 './extensions/mediawiki',
25 './extensions/the-audio-db'
26 ],
27 ...middlewareOptions
28} = {}) => {
29 debug(`Loading ${extensions.length} extension(s).`)
30 const options = {
31 client,
32 extensions: extensions.map(extensionModule => {
33 if (typeof extensionModule === 'object') {
34 return extensionModule
35 }
36 const extension = require(extensionModule)
37 return extension.default ? extension.default : extension
38 }),
39 ...middlewareOptions
40 }
41 const DEV = process.env.NODE_ENV !== 'production'
42 const graphiql = DEV || process.env.GRAPHBRAINZ_GRAPHIQL === 'true'
43 return graphqlHTTP({
44 schema: createSchema(schema, options),
45 context: createContext(options),
46 pretty: DEV,
47 graphiql,
48 formatError: DEV ? formatError : undefined,
49 ...middlewareOptions
50 })
51}
52
53export default middleware
54
55export function start () {
56 require('dotenv').config({ silent: true })
57 const app = express()
58 const port = process.env.PORT || 3000
59 const route = process.env.GRAPHBRAINZ_PATH || '/'
60 const corsOptions = {
61 origin: process.env.GRAPHBRAINZ_CORS_ORIGIN || false,
62 methods: 'HEAD,GET,POST'
63 }
64 switch (corsOptions.origin) {
65 case 'true':
66 corsOptions.origin = true
67 break
68 case 'false':
69 corsOptions.origin = false
70 break
71 default:
72 break
73 }
74 app.use(compression())
75 app.use(route, cors(corsOptions), middleware())
76 app.listen(port)
77 console.log(`Listening on port ${port}.`)
78}
79
80if (require.main === module) {
81 start()
82}