Skip to content

Commit f9033ea

Browse files
committed
fix(client-fetch): interceptor exposes fetch errors
1 parent dcfad92 commit f9033ea

File tree

1 file changed

+66
-59
lines changed
  • examples/openapi-ts-fetch/src/client/client

1 file changed

+66
-59
lines changed

examples/openapi-ts-fetch/src/client/client/client.ts

Lines changed: 66 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -76,79 +76,86 @@ export const createClient = (config: Config = {}): Client => {
7676
// fetch must be assigned here, otherwise it would throw the error:
7777
// TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
7878
const _fetch = opts.fetch!;
79-
let response = await _fetch(request);
80-
81-
for (const fn of interceptors.response._fns) {
82-
if (fn) {
83-
response = await fn(response, request, opts);
84-
}
79+
let error : unknown;
80+
let response
81+
try {
82+
response = await _fetch(request);
83+
}catch (e) {
84+
error = e
8585
}
86-
87-
const result = {
88-
request,
89-
response,
90-
};
91-
92-
if (response.ok) {
93-
if (
94-
response.status === 204 ||
95-
response.headers.get('Content-Length') === '0'
96-
) {
97-
return opts.responseStyle === 'data'
98-
? {}
99-
: {
100-
data: {},
101-
...result,
102-
};
86+
if (response) {
87+
for (const fn of interceptors.response._fns) {
88+
if (fn) {
89+
response = await fn(response, request, opts);
90+
}
10391
}
10492

105-
const parseAs =
106-
(opts.parseAs === 'auto'
107-
? getParseAs(response.headers.get('Content-Type'))
108-
: opts.parseAs) ?? 'json';
109-
110-
let data: any;
111-
switch (parseAs) {
112-
case 'arrayBuffer':
113-
case 'blob':
114-
case 'formData':
115-
case 'json':
116-
case 'text':
117-
data = await response[parseAs]();
118-
break;
119-
case 'stream':
93+
const result = {
94+
request,
95+
response,
96+
};
97+
98+
if (response.ok) {
99+
if (
100+
response.status === 204 ||
101+
response.headers.get('Content-Length') === '0'
102+
) {
120103
return opts.responseStyle === 'data'
121-
? response.body
104+
? {}
122105
: {
123-
data: response.body,
106+
data: {},
124107
...result,
125108
};
126-
}
109+
}
127110

128-
if (parseAs === 'json') {
129-
if (opts.responseValidator) {
130-
await opts.responseValidator(data);
111+
const parseAs =
112+
(opts.parseAs === 'auto'
113+
? getParseAs(response.headers.get('Content-Type'))
114+
: opts.parseAs) ?? 'json';
115+
116+
let data: any;
117+
switch (parseAs) {
118+
case 'arrayBuffer':
119+
case 'blob':
120+
case 'formData':
121+
case 'json':
122+
case 'text':
123+
data = await response[parseAs]();
124+
break;
125+
case 'stream':
126+
return opts.responseStyle === 'data'
127+
? response.body
128+
: {
129+
data: response.body,
130+
...result,
131+
};
131132
}
132133

133-
if (opts.responseTransformer) {
134-
data = await opts.responseTransformer(data);
134+
if (parseAs === 'json') {
135+
if (opts.responseValidator) {
136+
await opts.responseValidator(data);
137+
}
138+
139+
if (opts.responseTransformer) {
140+
data = await opts.responseTransformer(data);
141+
}
135142
}
136-
}
137143

138-
return opts.responseStyle === 'data'
139-
? data
140-
: {
141-
data,
142-
...result,
143-
};
144-
}
144+
return opts.responseStyle === 'data'
145+
? data
146+
: {
147+
data,
148+
...result,
149+
};
150+
}
145151

146-
let error = await response.text();
152+
error = await response.text();
147153

148-
try {
149-
error = JSON.parse(error);
150-
} catch {
151-
// noop
154+
try {
155+
error = JSON.parse(error as string);
156+
} catch {
157+
// noop
158+
}
152159
}
153160

154161
let finalError = error;

0 commit comments

Comments
 (0)