1 | import express from 'express'
|
2 | import graphqlHTTP from 'express-graphql'
|
3 | import compression from 'compression'
|
4 | import cors from 'cors'
|
5 | import MusicBrainz from './api'
|
6 | import schema, { createSchema } from './schema'
|
7 | import { createContext } from './context'
|
8 |
|
9 | const formatError = err => ({
|
10 | message: err.message,
|
11 | locations: err.locations,
|
12 | stack: err.stack
|
13 | })
|
14 |
|
15 | export 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 |
|
22 | const 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 |
|
42 | export default middleware
|
43 |
|
44 | export 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 |
|
69 | if (require.main === module) {
|
70 | start()
|
71 | }
|