Skip to content

Commit fd1d01e

Browse files
authored
Feat: Added CORS to config (#302)
1 parent a04c0fd commit fd1d01e

File tree

7 files changed

+97
-15
lines changed

7 files changed

+97
-15
lines changed

examples/social-network/config/environments/development.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
11
export default {
2+
server: {
3+
cors: {
4+
origin: '*',
5+
enabled: true,
6+
7+
headers: [
8+
'Accept',
9+
'Content-Type'
10+
],
11+
12+
methods: [
13+
'GET',
14+
'POST',
15+
'PATCH',
16+
'DELETE',
17+
'HEAD',
18+
'OPTIONS'
19+
]
20+
}
21+
},
22+
223
logging: {
324
level: 'DEBUG',
425
format: 'text',

src/packages/application/initialize.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ export default async function initialize<T: Application>(app: T, {
2020
path,
2121
port,
2222
logging,
23-
database
23+
database,
24+
server: serverConfig
2425
}: Application$opts) {
2526
const routes = loader(path, 'routes');
2627
const models = loader(path, 'models');
@@ -103,7 +104,8 @@ export default async function initialize<T: Application>(app: T, {
103104

104105
const server = new Server({
105106
router,
106-
logger
107+
logger,
108+
...serverConfig
107109
});
108110

109111
if (!LUX_CONSOLE) {

src/packages/config/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ export function createDefaultConfig(): Config {
88
const isProdENV = NODE_ENV === 'production';
99

1010
return {
11+
server: {
12+
cors: {
13+
enabled: false
14+
}
15+
},
1116
logging: {
1217
level: isProdENV ? 'INFO' : 'DEBUG',
1318
format: isProdENV ? 'json' : 'text',

src/packages/config/interfaces.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// @flow
22
import type { Logger$config } from '../logger';
3+
import type { Server$config } from '../server';
34

45
export type Config = {
56
logging: Logger$config;
7+
server: Server$config;
68
};

src/packages/server/index.js

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import { createResponder } from './responder';
1010
import { tryCatchSync } from '../../utils/try-catch';
1111
import validateAccept from './utils/validate-accept';
1212
import validateContentType from './utils/validate-content-type';
13+
import setCORSHeaders from './utils/set-cors-headers';
1314

1415
import type { Writable } from 'stream';
1516
import type { IncomingMessage, Server as HTTPServer } from 'http';
1617

1718
import type { Request } from './request/interfaces';
1819
import type { Response } from './response/interfaces';
19-
import type { Server$opts } from './interfaces';
20+
import type { Server$opts, Server$config } from './interfaces';
2021

2122
/**
2223
* @private
@@ -26,9 +27,11 @@ class Server {
2627

2728
router: Server$opts.router;
2829

30+
cors: Server$config.cors;
31+
2932
instance: HTTPServer;
3033

31-
constructor({ logger, router }: Server$opts) {
34+
constructor({ logger, router, cors }: Server$opts) {
3235
Object.defineProperties(this, {
3336
router: {
3437
value: router,
@@ -44,6 +47,13 @@ class Server {
4447
configurable: false
4548
},
4649

50+
cors: {
51+
value: cors,
52+
writable: false,
53+
enumerable: false,
54+
configurable: false
55+
},
56+
4757
instance: {
4858
value: createServer(this.receiveRequest),
4959
writable: false,
@@ -58,19 +68,22 @@ class Server {
5868
}
5969

6070
initializeRequest(req: IncomingMessage, res: Writable): [Request, Response] {
61-
const { logger, router } = this;
71+
const { logger, router, cors } = this;
6272

6373
req.setEncoding('utf8');
6474

65-
return [
66-
createRequest(req, {
67-
logger,
68-
router
69-
}),
70-
createResponse(res, {
71-
logger
72-
})
73-
];
75+
const response = createResponse(res, {
76+
logger
77+
});
78+
79+
setCORSHeaders(response, cors);
80+
81+
const request = createRequest(req, {
82+
logger,
83+
router
84+
});
85+
86+
return [request, response];
7487
}
7588

7689
validateRequest({ method, headers }: Request): true {
@@ -122,6 +135,8 @@ export default Server;
122135
export { getDomain } from './request';
123136
export { default as createServerError } from './utils/create-server-error';
124137

138+
export type { Server$config } from './interfaces';
139+
125140
export type {
126141
Request,
127142
Request$params,

src/packages/server/interfaces.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,18 @@
22
import type Logger from '../logger';
33
import type Router from '../router';
44

5-
export type Server$opts = {
5+
export type Server$cors = {
6+
enabled: boolean;
7+
origin?: string;
8+
headers?: Array<string>;
9+
methods?: Array<string>;
10+
};
11+
12+
export type Server$config = {
13+
cors: Server$cors;
14+
};
15+
16+
export type Server$opts = Server$config & {
617
logger: Logger;
718
router: Router;
819
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// @flow
2+
import type { Response } from '../index';
3+
import type { Server$cors } from '../interfaces';
4+
5+
export default function setCORSHeaders(res: Response, {
6+
origin,
7+
methods,
8+
headers,
9+
enabled
10+
}: Server$cors) {
11+
if (!enabled) {
12+
return;
13+
}
14+
15+
if (origin) {
16+
res.setHeader('Access-Control-Allow-Origin', origin);
17+
}
18+
19+
if (methods) {
20+
res.setHeader('Access-Control-Allow-Methods', methods.join());
21+
}
22+
23+
if (headers) {
24+
res.setHeader('Access-Control-Allow-Headers', headers.join());
25+
}
26+
}

0 commit comments

Comments
 (0)