Skip to content

Commit

Permalink
Use customisable filter
Browse files Browse the repository at this point in the history
  • Loading branch information
BBB committed Nov 30, 2023
1 parent 6fa6a87 commit 29b7e29
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 109 deletions.
38 changes: 20 additions & 18 deletions packages/http-client/src/Filter.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
import { ImmutableResponse } from "~/src/ImmutableResponse.js";
import { ImmutableRequest } from "~/src/ImmutableRequest.js";
import { ImmutableRequest } from "~/src/ImmutableRequest";
import { Task } from "@ollierelph/result4t";

type FilterApply = (next: HttpHandler) => HttpHandler;
export type HttpHandler<Return> = (request: ImmutableRequest) => Return;

export type HttpHandler = (
request: ImmutableRequest,
) => Promise<ImmutableResponse>;

export class Filter {
protected constructor(protected base: FilterApply) {}

static from(base: FilterApply) {
return new Filter(base);
export class Filter<HttpHandlerSignature extends HttpHandler<unknown>> {
#task: Task<[input: HttpHandlerSignature], HttpHandlerSignature>;
protected constructor(
fn: (next: HttpHandlerSignature) => HttpHandlerSignature,
) {
this.#task = Task.of(fn);
}

then(filter: Filter): Filter {
return new Filter((other) => this.base(filter.base(other)));
static from<HttpHandlerSignature extends HttpHandler<unknown>>(
fn: (next: HttpHandlerSignature) => HttpHandlerSignature,
) {
return new Filter<HttpHandlerSignature>(fn);
}

apply(filter: HttpHandler): HttpHandler {
return this.base(filter);
then<Other extends Filter<HttpHandlerSignature>>(otherFilter: Other) {
return new Filter((next: HttpHandlerSignature) =>
this.#task.call(otherFilter.apply(next)),
);
}
apply(filter: HttpHandlerSignature): HttpHandlerSignature {
return this.#task.call(filter);
}
}
26 changes: 0 additions & 26 deletions packages/http-client/src/FilterResult.ts

This file was deleted.

24 changes: 15 additions & 9 deletions packages/http-client/test/Filter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,24 @@ import { Filter, HttpHandler } from "~/src/Filter";
import { ImmutableURL } from "~/src/ImmutableURL";

const setHostnameForEnvironment = (env: string) =>
Filter.from((next) => async (request: ImmutableRequest) => {
const finalUrl = request.url.copy({ hostname: `${env}.example.com` });
return next(request.copy({ url: finalUrl }));
});
Filter.from(
(next: HttpHandler<Promise<ImmutableResponse>>) =>
async (request: ImmutableRequest) => {
const finalUrl = request.url.copy({ hostname: `${env}.example.com` });
return next(request.copy({ url: finalUrl }));
},
);

const addAuth = Filter.from((next) => async (request: ImmutableRequest) => {
const finalHeaders = request.headers.append("Authorization", "Basic 123");
return next(request.copy({ headers: finalHeaders }));
});
const addAuth = Filter.from(
(next: HttpHandler<Promise<ImmutableResponse>>) =>
async (request: ImmutableRequest) => {
const finalHeaders = request.headers.append("Authorization", "Basic 123");
return next(request.copy({ headers: finalHeaders }));
},
);

const alwaysStatusAndReflectRequest =
(status: StatusCode): HttpHandler =>
(status: StatusCode): HttpHandler<Promise<ImmutableResponse>> =>
async (req) =>
ImmutableResponse.of(null, {
status,
Expand Down
56 changes: 0 additions & 56 deletions packages/http-client/test/FilterResult.ts

This file was deleted.

0 comments on commit 29b7e29

Please sign in to comment.