Skip to content

Commit cf2e036

Browse files
committed
Merge branch 'main' of github.com:StarpTech/apollo-datasource-http into main
2 parents 2d53996 + 2713f33 commit cf2e036

File tree

6 files changed

+199
-70
lines changed

6 files changed

+199
-70
lines changed

README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,11 @@ const datasource = new (class MoviesAPI extends HTTPDataSource {
8282
return super.onResponse(request, response)
8383
}
8484

85-
onError(error: RequestError, request: Request): void {
86-
// log errors
85+
onError(error: Error, request: Request): void {
86+
// in case of a request error
87+
if (error instanceof RequestError) {
88+
console.log(error.request, error.response)
89+
}
8790
}
8891

8992
async getMovie(id) {
@@ -116,7 +119,7 @@ const datasource = new (class MoviesAPI extends HTTPDataSource {
116119

117120
## Error handling
118121

119-
The http client throws for unsuccessful responses (statusCode >= 400). In case of an request error `onError` is executed. By default the error is rethrown in form of the original error.
122+
The http client throws for unsuccessful responses (statusCode >= 400). In case of an request error `onError` is executed. By default the error is rethrown as a `ApolloError` to avoid exposing sensible information.
120123

121124
## Benchmark
122125

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "apollo-datasource-http",
3-
"version": "0.13.1",
3+
"version": "0.14.2",
44
"author": "Dustin Deus <[email protected]>",
55
"license": "MIT",
66
"repository": {

src/http-data-source.ts

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,25 @@ import sjson from 'secure-json-parse'
77

88
import { KeyValueCache } from 'apollo-server-caching'
99
import { ResponseData } from 'undici/types/dispatcher'
10-
import { ApolloError } from 'apollo-server-errors'
10+
import { toApolloError } from 'apollo-server-errors'
1111
import { EventEmitter, Readable } from 'stream'
1212
import { Logger } from 'apollo-server-types'
1313
import { URLSearchParams } from 'url'
1414

1515
type AbortSignal = unknown
1616

17+
export class RequestError<T = unknown> extends Error {
18+
constructor(
19+
public message: string,
20+
public code: number,
21+
public request: Request,
22+
public response: Response<T>,
23+
) {
24+
super(message)
25+
this.name = 'RequestError'
26+
}
27+
}
28+
1729
export type CacheTTLOptions = {
1830
requestCache?: {
1931
// In case of the cache does not respond for any reason. This defines the max duration (ms) until the operation is aborted.
@@ -158,16 +170,18 @@ export abstract class HTTPDataSource<TContext = any> extends DataSource {
158170
* @param response
159171
*/
160172
protected onResponse<TResult = unknown>(
161-
_request: Request,
173+
request: Request,
162174
response: Response<TResult>,
163175
): Response<TResult> {
164176
if (this.isResponseOk(response.statusCode)) {
165177
return response
166178
}
167179

168-
throw new ApolloError(
169-
`Response code ${response.statusCode} (${STATUS_CODES[response.statusCode]})`,
170-
response.statusCode.toString(),
180+
throw new RequestError(
181+
`Response code ${response.statusCode} (${STATUS_CODES[response.statusCode.toString()]})`,
182+
response.statusCode,
183+
request,
184+
response,
171185
)
172186
}
173187

@@ -268,23 +282,25 @@ export abstract class HTTPDataSource<TContext = any> extends DataSource {
268282
headers: request.headers,
269283
signal: request.signal,
270284
})
271-
272285
responseData.body.setEncoding('utf8')
286+
273287
let data = ''
274288
for await (const chunk of responseData.body) {
275289
data += chunk
276290
}
277291

278-
let json
279-
if (data) {
280-
json = sjson.parse(data)
292+
let json = null
293+
if (responseData.headers['content-type']?.includes('application/json')) {
294+
if (data !== '') {
295+
json = sjson.parse(data)
296+
}
281297
}
282298

283299
const response: Response<TResult> = {
284300
isFromCache: false,
285301
memoized: false,
286302
...responseData,
287-
body: json,
303+
body: json ?? data,
288304
}
289305

290306
this.onResponse<TResult>(request, response)
@@ -325,7 +341,7 @@ export abstract class HTTPDataSource<TContext = any> extends DataSource {
325341
}
326342
}
327343

328-
throw error
344+
throw toApolloError(error)
329345
}
330346
}
331347

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,8 @@ export {
55
RequestOptions,
66
Response,
77
Request,
8+
RequestError,
89
CacheTTLOptions,
910
} from './http-data-source'
11+
12+
export { ApolloError } from 'apollo-server-errors'

0 commit comments

Comments
 (0)