Skip to content

Commit

Permalink
Merge pull request #87 from marblejs/imp/next/core/EffectResponse
Browse files Browse the repository at this point in the history
feat(core): introducing EffectHttpResponse type
  • Loading branch information
JozefFlakus committed Dec 9, 2018
2 parents 5a9f2ae + 938944f commit e15ea78
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 64 deletions.
13 changes: 6 additions & 7 deletions package.json
Expand Up @@ -56,20 +56,19 @@
"rxjs": "~6.2.2"
},
"devDependencies": {
"@types/jest": "^23.3.1",
"@types/jest": "~23.3.10",
"@types/supertest": "^2.0.4",
"husky": "^0.14.0",
"jest": "^23.5.0",
"jest": "~23.6.0",
"lerna": "~3.3.0",
"lint-staged": "^7.2.2",
"lint-staged": "~8.1.0",
"mock-req": "^0.2.0",
"rimraf": "^2.6.2",
"rxjs-compat": "^6.1.0",
"supertest": "^3.0.0",
"ts-jest": "^23.1.3",
"ts-jest": "~23.10.5",
"ts-loader": "^5.0.0",
"tslint": "~5.9.1",
"typescript": "~3.1.1"
"tslint": "~5.11.0",
"typescript": "~3.2.2"
},
"workspaces": [
"packages/*"
Expand Down
22 changes: 15 additions & 7 deletions packages/core/src/effects/effects.interface.ts
@@ -1,10 +1,13 @@
import { Observable } from 'rxjs';
import { HttpRequest, HttpResponse, HttpStatus } from '../http.interface';
import { HttpRequest, HttpResponse, HttpStatus, HttpHeaders } from '../http.interface';

export interface EffectResponse {
export interface EffectResponse<T = any> {
body?: T;
}

export interface EffectHttpResponse<T = any> extends EffectResponse<T> {
status?: HttpStatus;
body?: any;
headers?: Record<string, string>;
headers?: HttpHeaders;
}

export interface Middleware<
Expand All @@ -13,8 +16,13 @@ export interface Middleware<
> extends Effect<I, O> {}

export interface ErrorEffect<T extends Error = Error>
extends Effect<HttpRequest, EffectResponse, T> {}
extends Effect<HttpRequest, EffectHttpResponse, HttpResponse, T> {}

export interface Effect<T extends HttpRequest = HttpRequest, U = EffectResponse, V = any> {
(req$: Observable<T>, res: HttpResponse, meta: V): Observable<U>;
export interface Effect<
T = HttpRequest,
U = EffectHttpResponse,
V = HttpResponse,
W = any,
> {
(req$: Observable<T>, res: V, meta: W): Observable<U>;
}
4 changes: 2 additions & 2 deletions packages/core/src/http.interface.ts
@@ -1,6 +1,6 @@
import * as http from 'http';
import { Observable } from 'rxjs';
import { EffectResponse } from './effects/effects.interface';
import { EffectHttpResponse } from './effects/effects.interface';

export interface HttpRequest<
TBody = any,
Expand All @@ -24,7 +24,7 @@ export interface QueryParameters {
}

export interface HttpResponse extends http.ServerResponse {
send: (effect: EffectResponse) => Observable<never>;
send: (response: EffectHttpResponse) => Observable<never>;
}

export interface HttpHeaders extends Record<string, string> {}
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/http.listener.ts
Expand Up @@ -2,7 +2,7 @@ import { IncomingMessage, OutgoingMessage } from 'http';
import { of, Subject } from 'rxjs';
import { catchError, defaultIfEmpty, mergeMap, switchMap, tap, takeWhile } from 'rxjs/operators';
import { combineMiddlewares } from './effects/effects.combiner';
import { EffectResponse, Middleware, ErrorEffect } from './effects/effects.interface';
import { EffectHttpResponse, Middleware, ErrorEffect } from './effects/effects.interface';
import { errorEffectProvider } from './error/error.effect';
import { Http, HttpRequest, HttpResponse, HttpStatus } from './http.interface';
import { handleResponse } from './response/response.handler';
Expand All @@ -26,7 +26,7 @@ export const httpListener = ({
const combinedMiddlewares = combineMiddlewares(middlewares);
const routerEffects = factorizeRouting(effects);
const providedErrorEffect = errorEffectProvider(errorEffect);
const defaultResponse = { status: HttpStatus.NOT_FOUND } as EffectResponse;
const defaultResponse = { status: HttpStatus.NOT_FOUND } as EffectHttpResponse;

const effect$ = request$.pipe(
mergeMap(({ req, res }) => {
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/response/response.handler.ts
@@ -1,10 +1,10 @@
import { EMPTY } from 'rxjs';
import { EffectResponse } from '../effects/effects.interface';
import { EffectHttpResponse } from '../effects/effects.interface';
import { HttpRequest, HttpResponse, HttpStatus } from '../http.interface';
import { bodyFactory } from './responseBody.factory';
import { headersFactory } from './responseHeaders.factory';

export const handleResponse = (res: HttpResponse) => (req: HttpRequest) => (effect: EffectResponse) => {
export const handleResponse = (res: HttpResponse) => (req: HttpRequest) => (effect: EffectHttpResponse) => {
if (res.finished) { return EMPTY; }

const status = effect.status || HttpStatus.OK;
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/router/router.interface.ts
@@ -1,11 +1,11 @@
import { HttpMethod, HttpRequest } from '../http.interface';
import { Effect, Middleware, EffectResponse } from '../effects/effects.interface';
import { Effect, Middleware, EffectHttpResponse } from '../effects/effects.interface';

// Route
export interface RouteEffect<T extends HttpRequest = HttpRequest> {
path: string;
method: HttpMethod;
effect: Effect<T, EffectResponse>;
effect: Effect<T, EffectHttpResponse>;
middleware?: Middleware;
}

Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/router/router.resolver.ts
@@ -1,7 +1,7 @@
import { EMPTY, Observable, of } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
import { HttpMethod, HttpRequest, HttpResponse } from '../http.interface';
import { EffectResponse } from '../effects/effects.interface';
import { EffectHttpResponse } from '../effects/effects.interface';
import { RouteMatched, Routing, RoutingItem } from './router.interface';
import { queryParamsFactory } from './router.query.factory';
export { RoutingItem };
Expand Down Expand Up @@ -38,7 +38,7 @@ export const findRoute = (
export const resolveRouting =
(routing: Routing) =>
(res: HttpResponse) =>
(req: HttpRequest): Observable<EffectResponse> => {
(req: HttpRequest): Observable<EffectHttpResponse> => {
if (res.finished) { return EMPTY; }

const [urlPath, urlQuery] = req.url.split('?');
Expand Down

0 comments on commit e15ea78

Please sign in to comment.