2016-08-08 07:54:06 +00:00
|
|
|
import express from 'express'
|
|
|
|
|
import graphqlHTTP from 'express-graphql'
|
2016-11-26 01:38:32 +00:00
|
|
|
import compression from 'compression'
|
2017-10-20 04:40:29 +00:00
|
|
|
import cors from 'cors'
|
2017-10-19 08:00:21 +00:00
|
|
|
import MusicBrainz from './api'
|
|
|
|
|
import schema, { createSchema } from './schema'
|
|
|
|
|
import { createContext } from './context'
|
|
|
|
|
|
|
|
|
|
const debug = require('debug')('graphbrainz')
|
2016-08-08 07:54:06 +00:00
|
|
|
|
2017-11-07 05:54:56 +00:00
|
|
|
const formatError = err => ({
|
2016-11-26 01:38:32 +00:00
|
|
|
message: err.message,
|
|
|
|
|
locations: err.locations,
|
|
|
|
|
stack: err.stack
|
|
|
|
|
})
|
2016-08-08 07:54:06 +00:00
|
|
|
|
2017-11-07 05:54:56 +00:00
|
|
|
const middleware = (
|
|
|
|
|
{
|
|
|
|
|
client = new MusicBrainz(),
|
|
|
|
|
extensions = process.env.GRAPHBRAINZ_EXTENSIONS
|
|
|
|
|
? JSON.parse(process.env.GRAPHBRAINZ_EXTENSIONS)
|
|
|
|
|
: [
|
|
|
|
|
'./extensions/cover-art-archive',
|
|
|
|
|
'./extensions/fanart-tv',
|
|
|
|
|
'./extensions/mediawiki',
|
|
|
|
|
'./extensions/the-audio-db'
|
|
|
|
|
],
|
|
|
|
|
...middlewareOptions
|
|
|
|
|
} = {}
|
|
|
|
|
) => {
|
2017-10-19 08:00:21 +00:00
|
|
|
debug(`Loading ${extensions.length} extension(s).`)
|
|
|
|
|
const options = {
|
|
|
|
|
client,
|
|
|
|
|
extensions: extensions.map(extensionModule => {
|
|
|
|
|
if (typeof extensionModule === 'object') {
|
|
|
|
|
return extensionModule
|
|
|
|
|
}
|
|
|
|
|
const extension = require(extensionModule)
|
|
|
|
|
return extension.default ? extension.default : extension
|
|
|
|
|
}),
|
|
|
|
|
...middlewareOptions
|
|
|
|
|
}
|
2016-11-26 01:38:32 +00:00
|
|
|
const DEV = process.env.NODE_ENV !== 'production'
|
2016-11-26 02:18:41 +00:00
|
|
|
const graphiql = DEV || process.env.GRAPHBRAINZ_GRAPHIQL === 'true'
|
2016-11-26 01:38:32 +00:00
|
|
|
return graphqlHTTP({
|
2017-10-19 08:00:21 +00:00
|
|
|
schema: createSchema(schema, options),
|
|
|
|
|
context: createContext(options),
|
2016-11-26 01:38:32 +00:00
|
|
|
pretty: DEV,
|
2016-11-26 02:18:41 +00:00
|
|
|
graphiql,
|
2016-11-26 01:38:32 +00:00
|
|
|
formatError: DEV ? formatError : undefined,
|
2017-10-19 08:00:21 +00:00
|
|
|
...middlewareOptions
|
2016-08-08 07:54:06 +00:00
|
|
|
})
|
2016-11-26 01:38:32 +00:00
|
|
|
}
|
2016-08-08 07:54:06 +00:00
|
|
|
|
2016-11-26 01:38:32 +00:00
|
|
|
export default middleware
|
2016-08-20 05:59:32 +00:00
|
|
|
|
2017-11-07 05:54:56 +00:00
|
|
|
export function start(options) {
|
2016-11-26 01:38:32 +00:00
|
|
|
require('dotenv').config({ silent: true })
|
|
|
|
|
const app = express()
|
|
|
|
|
const port = process.env.PORT || 3000
|
|
|
|
|
const route = process.env.GRAPHBRAINZ_PATH || '/'
|
2017-10-20 04:40:29 +00:00
|
|
|
const corsOptions = {
|
|
|
|
|
origin: process.env.GRAPHBRAINZ_CORS_ORIGIN || false,
|
|
|
|
|
methods: 'HEAD,GET,POST'
|
|
|
|
|
}
|
|
|
|
|
switch (corsOptions.origin) {
|
|
|
|
|
case 'true':
|
|
|
|
|
corsOptions.origin = true
|
|
|
|
|
break
|
|
|
|
|
case 'false':
|
|
|
|
|
corsOptions.origin = false
|
|
|
|
|
break
|
|
|
|
|
default:
|
|
|
|
|
break
|
|
|
|
|
}
|
2016-11-26 01:38:32 +00:00
|
|
|
app.use(compression())
|
2017-11-04 22:32:05 +00:00
|
|
|
app.use(route, cors(corsOptions), middleware(options))
|
2016-11-26 01:38:32 +00:00
|
|
|
app.listen(port)
|
2016-11-26 02:18:41 +00:00
|
|
|
console.log(`Listening on port ${port}.`)
|
2016-11-26 01:38:32 +00:00
|
|
|
}
|
2017-05-16 04:28:54 +00:00
|
|
|
|
|
|
|
|
if (require.main === module) {
|
|
|
|
|
start()
|
|
|
|
|
}
|