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 debug = require('debug')('graphbrainz')
|
10 |
|
11 | const formatError = (err) => ({
|
12 | message: err.message,
|
13 | locations: err.locations,
|
14 | stack: err.stack
|
15 | })
|
16 |
|
17 | const 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 |
|
53 | export default middleware
|
54 |
|
55 | export 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 |
|
80 | if (require.main === module) {
|
81 | start()
|
82 | }
|