mirror of https://github.com/status-im/metro.git
metro-bundler: global cache: add uri info to the FetchFailedError
Reviewed By: davidaurelio Differential Revision: D5451939 fbshipit-source-id: 8fa460f714919488ab7a592e123e91adde4ed4c2
This commit is contained in:
parent
fd6c2a4013
commit
42d61ea63a
|
@ -157,17 +157,37 @@ class TransformProfileSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
type FetchFailedDetails =
|
type FetchFailedDetails =
|
||||||
{+type: 'unhandled_http_status', +statusCode: number} | {+type: 'unspecified'};
|
{
|
||||||
|
+statusCode: number,
|
||||||
|
+statusText: string,
|
||||||
|
+type: 'unhandled_http_status',
|
||||||
|
+uri: string,
|
||||||
|
} |
|
||||||
|
{+type: 'invalid_data'} |
|
||||||
|
{+type: 'invalid_key_data', key: string};
|
||||||
|
|
||||||
class FetchFailedError extends Error {
|
class FetchFailedError extends Error {
|
||||||
/** Separate object for details allows us to have a type union. */
|
/** Separate object for details allows us to have a type union. */
|
||||||
+details: FetchFailedDetails;
|
+details: FetchFailedDetails;
|
||||||
|
|
||||||
constructor(message: string, details: FetchFailedDetails) {
|
constructor(details: FetchFailedDetails) {
|
||||||
super();
|
super(FetchFailedError._getMessage(details));
|
||||||
this.message = message;
|
|
||||||
(this: any).details = details;
|
(this: any).details = details;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static _getMessage(details: FetchFailedDetails): string {
|
||||||
|
if (details.type === 'unhandled_http_status') {
|
||||||
|
return (
|
||||||
|
`Unexpected HTTP status: ${details.statusCode} ` +
|
||||||
|
JSON.stringify(details.statusText) +
|
||||||
|
` while fetching \`${details.uri}\``
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (details.type === 'invalid_key_data') {
|
||||||
|
return `Invalid data was returned for key \`${details.key}\``;
|
||||||
|
}
|
||||||
|
return `Invalid or empty data was returned.`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -197,7 +217,7 @@ class URIBasedGlobalTransformCache {
|
||||||
_optionsHasher: OptionsHasher;
|
_optionsHasher: OptionsHasher;
|
||||||
_store: ?KeyResultStore;
|
_store: ?KeyResultStore;
|
||||||
|
|
||||||
static FetchFailedError;
|
static FetchFailedError: Class<FetchFailedError>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For using the global cache one needs to have some kind of central key-value
|
* For using the global cache one needs to have some kind of central key-value
|
||||||
|
@ -246,16 +266,17 @@ class URIBasedGlobalTransformCache {
|
||||||
static async _fetchResultFromURI(uri: string): Promise<CachedResult> {
|
static async _fetchResultFromURI(uri: string): Promise<CachedResult> {
|
||||||
const response = await fetch(uri, {method: 'GET', timeout: 8000});
|
const response = await fetch(uri, {method: 'GET', timeout: 8000});
|
||||||
if (response.status !== 200) {
|
if (response.status !== 200) {
|
||||||
const msg = `Unexpected HTTP status: ${response.status} ${response.statusText} `;
|
throw new FetchFailedError({
|
||||||
throw new FetchFailedError(msg, {
|
|
||||||
type: 'unhandled_http_status',
|
|
||||||
statusCode: response.status,
|
statusCode: response.status,
|
||||||
|
statusText: response.statusText,
|
||||||
|
type: 'unhandled_http_status',
|
||||||
|
uri,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const unvalidatedResult = await response.json();
|
const unvalidatedResult = await response.json();
|
||||||
const result = validateCachedResult(unvalidatedResult);
|
const result = validateCachedResult(unvalidatedResult);
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
throw new FetchFailedError('Server returned invalid result.', {type: 'unspecified'});
|
throw new FetchFailedError({type: 'invalid_data'});
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue