Skip to content

Commit

Permalink
feat!: remove HttpBody and Response classes
Browse files Browse the repository at this point in the history
BREAKING CHANGE: removed HttpBody and Response. Now using the simpler DzResponse. Clients must implement the methods to consume and parse response data.
  • Loading branch information
vitorsalgado committed Dec 6, 2021
1 parent 81310de commit 257f6f1
Show file tree
Hide file tree
Showing 17 changed files with 240 additions and 586 deletions.
54 changes: 54 additions & 0 deletions pkgs/drizzle-http-core/src/DzResponse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { DzHeaders } from './http.headers'
import { BodyType } from './types'

interface DzResponseInit<R> {
original: R
headers: DzHeaders
body: BodyType
status: number
url: string
}

export abstract class DzResponse<R = unknown, BLOB = unknown, FORM_DATA = unknown> {
private readonly _original: R
private readonly _body: BodyType
readonly headers: DzHeaders
readonly status: number
readonly url: string

protected constructor(init: DzResponseInit<R>) {
this._original = init.original
this._body = init.body
this.headers = init.headers
this.status = init.status
this.url = init.url
}

get ok(): boolean {
return DzResponse.isOK(this.status)
}

original(): R {
return this._original
}

get body(): BodyType {
return this._body
}

abstract get bodyUsed(): boolean

abstract arrayBuffer(): Promise<ArrayBuffer>

abstract json<T>(): Promise<T>

abstract text(): Promise<string>

abstract blob(): Promise<BLOB>

abstract formData(): Promise<FORM_DATA>

static isOK(statusCode: number): boolean {
return statusCode >= 200 && statusCode <= 299
}
}
8 changes: 4 additions & 4 deletions pkgs/drizzle-http-core/src/builtin/converters/json/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { RequestBodyConverter, RequestConverterFactory } from '../../../request.
import { RequestFactory } from '../../../request.factory'
import { ResponseConverter, ResponseConverterFactory } from '../../../response.converter'
import { Drizzle } from '../../../drizzle'
import { Response } from '../../../response'
import { RequestParameterization } from '../../../request.parameterization'
import MediaTypes from '../../../http.media.types'
import { DzResponse } from '../../../DzResponse'

export class JsonRequestConverter implements RequestBodyConverter<string> {
static INSTANCE: JsonRequestConverter = new JsonRequestConverter()
Expand All @@ -19,10 +19,10 @@ export class JsonRequestConverter implements RequestBodyConverter<string> {
}
}

export class JsonResponseConverter<T> implements ResponseConverter<Response, Promise<T>> {
export class JsonResponseConverter<T> implements ResponseConverter<DzResponse, Promise<T>> {
static INSTANCE: JsonResponseConverter<unknown> = new JsonResponseConverter<unknown>()

convert<T>(from: Response): Promise<T> {
convert<T>(from: DzResponse): Promise<T> {
return from.json()
}
}
Expand Down Expand Up @@ -50,7 +50,7 @@ export class JsonResponseConverterFactory extends ResponseConverterFactory {
_drizzle: Drizzle,
_method: string,
requestFactory: RequestFactory
): ResponseConverter<Response, Promise<T>> | null {
): ResponseConverter<DzResponse, Promise<T>> | null {
if (requestFactory.contentTypeContains(MediaTypes.APPLICATION_JSON)) {
return JsonResponseConverter.INSTANCE
}
Expand Down
18 changes: 8 additions & 10 deletions pkgs/drizzle-http-core/src/builtin/converters/raw/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { RequestBodyConverter, RequestConverterFactory } from '../../../request.
import { RequestFactory } from '../../../request.factory'
import { ResponseConverter, ResponseConverterFactory } from '../../../response.converter'
import { Drizzle } from '../../../drizzle'
import { Response } from '../../../response'
import { BodyType } from '../../../types'
import { RequestParameterization } from '../../../request.parameterization'
import { DrizzleMeta } from '../../../drizzle.meta'
import { DzResponse } from '../../../DzResponse'

const ReturnIdentifier = 'raw'

/**
* Use this to return the full response, including status code, headers, unprocessed body.
Expand All @@ -14,14 +16,14 @@ import { DrizzleMeta } from '../../../drizzle.meta'
export function FullResponse() {
return function (target: any, method: string) {
const requestFactory = DrizzleMeta.provideRequestFactory(target, method)
requestFactory.returnGenericType = Response
requestFactory.returnIdentifier = ReturnIdentifier
}
}

export class RawResponseConverter implements ResponseConverter<Response, Promise<Response>> {
export class RawResponseConverter implements ResponseConverter<DzResponse, Promise<DzResponse>> {
static INSTANCE: RawResponseConverter = new RawResponseConverter()

async convert(from: Response): Promise<Response> {
async convert(from: DzResponse): Promise<DzResponse> {
return from
}
}
Expand Down Expand Up @@ -54,12 +56,8 @@ export class RawResponseConverterFactory extends ResponseConverterFactory {
_drizzle: Drizzle,
_method: string,
requestFactory: RequestFactory
): ResponseConverter<Response, Promise<Response>> | null {
// the return V is the internal Response, similar to Fetch API
if (requestFactory.isGenericReturnTypeOf(Response)) {
return RawResponseConverter.INSTANCE
// attempt to check if return handledType is a Fetch Response
} else if (requestFactory.returnType?.prototype[Symbol.toStringTag] === 'Response') {
): ResponseConverter<DzResponse, Promise<DzResponse>> | null {
if (requestFactory.isReturnIdentifier(ReturnIdentifier)) {
return RawResponseConverter.INSTANCE
}

Expand Down
18 changes: 9 additions & 9 deletions pkgs/drizzle-http-core/src/builtin/converters/raw/raw.spec.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import { closeTestServer, setupTestServer, startTestServer } from '@drizzle-http/test-utils'
import { RequestFactory } from '../../../request.factory'
import CommonHeaders from '../../../http.common.headers'
import MediaTypes from '../../../http.media.types'
import { Response } from '../../../response'
import { DrizzleBuilder, initDrizzleHttp } from '../../../drizzle.builder'
import { TestCallFactory } from '../../../internal/http/test'
import { Body, ContentType, POST } from '../../../decorators'
import { DzResponse } from '../../../DzResponse'
import {
FullResponse,
RawRequestConverter,
RawRequestConverterFactory,
RawResponseConverter,
RawResponseConverterFactory
} from './index'
import { DrizzleBuilder, initDrizzleHttp } from '../../../drizzle.builder'
import { TestCallFactory } from '../../../internal/http/test'
import { Body, ContentType, POST } from '../../../decorators'
import { closeTestServer, setupTestServer, startTestServer } from '@drizzle-http/test-utils'
} from '.'

class API {
@POST('/raw-test')
Expand All @@ -21,7 +21,7 @@ class API {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-empty-function
test(@Body() data: string): Promise<Response> {}
test(@Body() data: string): Promise<DzResponse> {}
}

describe('Raw Converter', function () {
Expand Down Expand Up @@ -53,7 +53,7 @@ describe('Raw Converter', function () {
requestFactory.path = '/test'
requestFactory.addDefaultHeader(CommonHeaders.CONTENT_TYPE, MediaTypes.APPLICATION_JSON_UTF8)
requestFactory.returnType = Promise
requestFactory.returnGenericType = Response
requestFactory.returnIdentifier = 'raw'

requestFactory.preProcessAndValidate(drizzle)

Expand Down Expand Up @@ -86,7 +86,7 @@ describe('Raw Converter', function () {
requestFactory.path = '/test'
requestFactory.addDefaultHeader(CommonHeaders.CONTENT_TYPE, MediaTypes.APPLICATION_JSON_UTF8)
requestFactory.returnType = Promise
requestFactory.returnGenericType = Response
requestFactory.returnIdentifier = 'raw'

requestFactory.preProcessAndValidate(drizzle)

Expand Down
8 changes: 4 additions & 4 deletions pkgs/drizzle-http-core/src/call.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { Drizzle } from './drizzle'
import { ExecutorChain } from './interceptor.http'
import { Interceptor } from './interceptor'
import { ResponseConverter } from './response.converter'
import { Response } from './response'
import { DzRequest } from './DzRequest'
import { DzResponse } from './DzResponse'

/**
* Represents a single HTTP call.
Expand Down Expand Up @@ -51,11 +51,11 @@ export abstract class CallFactory {
* @typeParam V - Type of the response
*/
export class BridgeCall<T> extends Call<T> {
private readonly responseConverter: ResponseConverter<Response, T>
private readonly responseConverter: ResponseConverter<DzResponse, T>
private readonly chain: ExecutorChain<unknown, unknown>

constructor(
responseConverter: ResponseConverter<Response, T>,
responseConverter: ResponseConverter<DzResponse, T>,
interceptors: Interceptor<unknown, unknown>[],
request: DzRequest,
argv: unknown[]
Expand All @@ -68,6 +68,6 @@ export class BridgeCall<T> extends Call<T> {
execute(): T {
return this.chain
.proceed(this.request)
.then(response => this.responseConverter.convert(response as Response)) as unknown as T
.then(response => this.responseConverter.convert(response as DzResponse)) as unknown as T
}
}
Loading

0 comments on commit 257f6f1

Please sign in to comment.