@googlemaps/google-maps-services-js
Version:
Node.js client library for Google Maps API Web Services
97 lines (88 loc) • 2.64 kB
text/typescript
/**
* Copyright 2020 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Status } from "./common";
import axios from "axios";
import type { AxiosResponse } from "axios";
export function statusToCode(status: Status): number {
switch (status) {
case Status.OK:
case Status.ZERO_RESULTS: {
return 200;
}
case Status.INVALID_REQUEST:
case Status.MAX_ROUTE_LENGTH_EXCEEDED:
case Status.MAX_WAYPOINTS_EXCEEDED: {
return 400;
}
case Status.REQUEST_DENIED: {
return 403;
}
case Status.NOT_FOUND: {
return 404;
}
case Status.OVER_DAILY_LIMIT:
case Status.OVER_QUERY_LIMIT: {
return 429;
}
case Status.UNKNOWN_ERROR: {
return 500;
}
default: {
return 200;
}
}
}
function settle(resolve, reject, response) {
const validateStatus = response.config.validateStatus;
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(
new axios.AxiosError(
"Request failed with status code " + response.status,
[axios.AxiosError.ERR_BAD_REQUEST, axios.AxiosError.ERR_BAD_RESPONSE][
Math.floor(response.status / 100) - 4
],
response.config,
response.request,
response
)
);
}
}
export const customAdapter = axios.getAdapter((config) => {
const httpAdapter = axios.getAdapter("http");
return new Promise((resolve, reject) => {
httpAdapter(config)
.then((r: AxiosResponse) => {
// unfortunately data is transformed after the adapter
let data = r.data;
if (config.transformResponse) {
const t = Array.isArray(config.transformResponse)
? config.transformResponse
: [config.transformResponse];
for (const fn of t) {
data = fn.call(config, data, r.headers, r.status);
}
}
if (r.status === 200 && data.status) {
r.status = statusToCode(data.status);
}
settle(resolve, reject, r);
})
.catch(reject);
});
});