diff --git a/features/app/index.ts b/features/app/index.ts index 5dd1b8f..9495f30 100644 --- a/features/app/index.ts +++ b/features/app/index.ts @@ -10,9 +10,18 @@ axiosRetry(axiosClient, { if (error.response) { const retryAfter = error.response.headers["retry-after"] if (retryAfter) { - return retryAfter + const retryAfterSeconds = parseInt(retryAfter.trim(), 10) + if (!isNaN(retryAfterSeconds)) { + return retryAfterSeconds * 1000 + } + const retryAfterDate = Date.parse(retryAfter.trim()) + if (!isNaN(retryAfterDate)) { + const currentTime = Date.now() + const delay = Math.max(retryAfterDate - currentTime, 0) + return delay + } } - if (error.response.status === 429 && error.config.url?.includes(HYPOTHESIS_API_BASE_URL)) { + if (error.response.status === 429 && error.config?.url?.includes(HYPOTHESIS_API_BASE_URL)) { return retryCount * 2000 /** ms */ } } diff --git a/package-lock.json b/package-lock.json index f5217e7..4178b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10515,11 +10515,13 @@ "dev": true }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.28.0.tgz", + "integrity": "sha512-Tu7NYoGY4Yoc7I+Npf9HhUMtEEpV7ZiLH9yndTCoNhcpBH0kwcvFbzYN9/u5QKI5A6uefjsNNWaz5olJVYS62Q==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "axios-retry": { @@ -21760,6 +21762,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", diff --git a/package.json b/package.json index df5c50e..6db1180 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@prisma/client": "^2.27.0", "@types/carbon-components-react": "^7.44.0", "@types/carbon__icons-react": "^10.31.2", - "axios": "^0.21.4", + "axios": "^0.28.0", "axios-retry": "^3.2.4", "carbon-components": "^10.45.0", "carbon-components-react": "^7.45.0", diff --git a/pages/api/arcore/[id]/index.ts b/pages/api/arcore/[id]/index.ts index 188da83..729c335 100644 --- a/pages/api/arcore/[id]/index.ts +++ b/pages/api/arcore/[id]/index.ts @@ -20,7 +20,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) try { await axiosClient.put(`${process.env.ARCORE_SERVER_URL}/api/documents/${id}`, undefined, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Creating ingest PDF and extracting annotations from source manuscript ${id}`, }, }) @@ -29,7 +29,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) `${process.env.ARCORE_SERVER_URL}/api/documents/${id}/ann`, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Getting annotations from source manuscript ${id}`, }, } diff --git a/pages/api/datasets/[id]/annorep/delete.ts b/pages/api/datasets/[id]/annorep/delete.ts index 530fcaf..42d6030 100644 --- a/pages/api/datasets/[id]/annorep/delete.ts +++ b/pages/api/datasets/[id]/annorep/delete.ts @@ -26,7 +26,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) }, headers: { "Content-Type": "application/json-ld", //TODO: change ld+json? - [DATAVERSE_HEADER_NAME]: session.dataverseApiToken, + [DATAVERSE_HEADER_NAME]: session.dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: requestDesc, }, }) diff --git a/pages/api/datasets/[id]/annorep/index.ts b/pages/api/datasets/[id]/annorep/index.ts index 903d6a7..9a982f1 100644 --- a/pages/api/datasets/[id]/annorep/index.ts +++ b/pages/api/datasets/[id]/annorep/index.ts @@ -29,7 +29,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) }, headers: { "Content-Type": "application/json-ld", //TODO: change ld+json? - [DATAVERSE_HEADER_NAME]: session.dataverseApiToken, + [DATAVERSE_HEADER_NAME]: session.dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: requestDesc, }, }) diff --git a/pages/api/datasets/[id]/data-files.ts b/pages/api/datasets/[id]/data-files.ts index 8ae267c..14da636 100644 --- a/pages/api/datasets/[id]/data-files.ts +++ b/pages/api/datasets/[id]/data-files.ts @@ -18,7 +18,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) method: "GET", url: `${process.env.DATAVERSE_SERVER_URL}/api/datasets/${id}`, headers: { - [DATAVERSE_HEADER_NAME]: session.dataverseApiToken, + [DATAVERSE_HEADER_NAME]: session.dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: requestDesc, }, }) diff --git a/pages/api/datasets/[id]/manuscript/index.ts b/pages/api/datasets/[id]/manuscript/index.ts index 8cbd1d2..22c8709 100644 --- a/pages/api/datasets/[id]/manuscript/index.ts +++ b/pages/api/datasets/[id]/manuscript/index.ts @@ -59,7 +59,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) data: addManuscriptForm, headers: { "Content-Type": `${addManuscriptForm.getHeaders()["content-type"]}`, - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: requestDesc, }, }) diff --git a/pages/api/datasets/[id]/submit-for-review.ts b/pages/api/datasets/[id]/submit-for-review.ts index be88831..7c30507 100644 --- a/pages/api/datasets/[id]/submit-for-review.ts +++ b/pages/api/datasets/[id]/submit-for-review.ts @@ -18,7 +18,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) method: "POST", url: `${process.env.DATAVERSE_SERVER_URL}/api/datasets/${id}/submitForReview`, headers: { - [DATAVERSE_HEADER_NAME]: session.dataverseApiToken, + [DATAVERSE_HEADER_NAME]: session.dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: requestDesc, }, }) diff --git a/pages/api/hypothesis/[id]/title-annotation.ts b/pages/api/hypothesis/[id]/title-annotation.ts index fdac843..5fa3588 100644 --- a/pages/api/hypothesis/[id]/title-annotation.ts +++ b/pages/api/hypothesis/[id]/title-annotation.ts @@ -33,7 +33,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) `${process.env.ARCORE_SERVER_URL}/api/documents/${manuscriptId}/titleann`, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Getting title annotation from source manuscript ${manuscriptId}`, Accept: "application/json", }, diff --git a/pages/ati/[id]/exportAnnotations.tsx b/pages/ati/[id]/exportAnnotations.tsx index 2374c9e..50d2e2a 100644 --- a/pages/ati/[id]/exportAnnotations.tsx +++ b/pages/ati/[id]/exportAnnotations.tsx @@ -86,7 +86,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { await axiosClient .get(`${process.env.DATAVERSE_SERVER_URL}/api/datasets/${datasetId}`, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Getting JSON for data project ${datasetId}`, Accept: "application/json", }, @@ -108,7 +108,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { { responseType: "arraybuffer", headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, Accept: "application/pdf", }, } diff --git a/pages/ati/[id]/manuscript.tsx b/pages/ati/[id]/manuscript.tsx index d9e490b..3e0653d 100644 --- a/pages/ati/[id]/manuscript.tsx +++ b/pages/ati/[id]/manuscript.tsx @@ -68,7 +68,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { await axiosClient .get(`${process.env.DATAVERSE_SERVER_URL}/api/datasets/${datasetId}`, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Getting JSON for data project ${datasetId}`, Accept: "application/json", }, @@ -89,7 +89,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { { responseType: "arraybuffer", headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, Accept: "application/pdf", }, } diff --git a/pages/ati/[id]/settings.tsx b/pages/ati/[id]/settings.tsx index c103948..0b67657 100644 --- a/pages/ati/[id]/settings.tsx +++ b/pages/ati/[id]/settings.tsx @@ -58,7 +58,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { await axios .get(`${process.env.DATAVERSE_SERVER_URL}/api/datasets/${datasetId}`, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Getting JSON for data project ${datasetId}`, Accept: "application/json", }, diff --git a/pages/ati/[id]/summary.tsx b/pages/ati/[id]/summary.tsx index 61df9c7..e28ce2e 100644 --- a/pages/ati/[id]/summary.tsx +++ b/pages/ati/[id]/summary.tsx @@ -79,7 +79,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { await axiosClient .get(`${process.env.DATAVERSE_SERVER_URL}/api/datasets/${datasetId}`, { headers: { - [DATAVERSE_HEADER_NAME]: dataverseApiToken, + [DATAVERSE_HEADER_NAME]: dataverseApiToken as string, [REQUEST_DESC_HEADER_NAME]: `Getting JSON for data project ${datasetId}`, Accept: "application/json", }, diff --git a/utils/httpRequestUtils.ts b/utils/httpRequestUtils.ts index ac6d14d..160d72a 100644 --- a/utils/httpRequestUtils.ts +++ b/utils/httpRequestUtils.ts @@ -5,10 +5,14 @@ import { AnnoRepResponse } from "../types/http" export const getResponseFromError = (e: unknown, requestDesc?: string): AnnoRepResponse => { const annoRepResponse: AnnoRepResponse = { status: 400, message: "" } if (axios.isAxiosError(e)) { - const requestInfo = - e.config.headers[REQUEST_DESC_HEADER_NAME] || - requestDesc || - `${e.config.method} ${e.config.url}` + let requestInfo = "Request" + if (e.config && e.config.headers && e.config.headers[REQUEST_DESC_HEADER_NAME]) { + requestInfo = e.config.headers[REQUEST_DESC_HEADER_NAME] as string + } else if (requestDesc) { + requestInfo = requestDesc + } else if (e.config && e.config.method && e.config.url) { + requestInfo = `${e.config.method} ${e.config.url}` + } let failureMessage = `${requestInfo} failed.` if (e.response) { const additional =