Skip to content

Commit 03b8f43

Browse files
feat: Retry request with status code 202 (box/box-codegen#511) (#235)
1 parent 58d64fd commit 03b8f43

File tree

7 files changed

+91
-99
lines changed

7 files changed

+91
-99
lines changed

.codegen.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ "engineHash": "4be1a1e", "specHash": "ee83bc7", "version": "1.1.0" }
1+
{ "engineHash": "1090584", "specHash": "fc01415", "version": "1.1.0" }

docs/skills.md

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,12 @@ See the endpoint docs at
5252
await client.skills.createBoxSkillCardsOnFile(file.id, {
5353
cards: [
5454
{
55-
type: 'skill_card' as KeywordSkillCardTypeField,
56-
skillCardType: 'keyword' as KeywordSkillCardSkillCardTypeField,
57-
skillCardTitle: {
58-
code: 'license-plates',
59-
message: titleMessage,
60-
} satisfies KeywordSkillCardSkillCardTitleField,
61-
skill: new KeywordSkillCardSkillField({
62-
id: skillId,
63-
type: 'service' as KeywordSkillCardSkillTypeField,
64-
}),
65-
invocation: new KeywordSkillCardInvocationField({
66-
id: invocationId,
67-
type: 'skill_invocation' as KeywordSkillCardInvocationTypeField,
68-
}),
69-
entries: [{ text: 'DN86 BOX' } satisfies KeywordSkillCardEntriesField],
55+
type: 'skill_card',
56+
skillCardType: 'keyword',
57+
skillCardTitle: { code: 'license-plates', message: titleMessage },
58+
skill: { id: skillId, type: 'service' },
59+
invocation: { id: invocationId, type: 'skill_invocation' },
60+
entries: [{ text: 'DN86 BOX' }],
7061
} satisfies KeywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard,
7162
],
7263
} satisfies CreateBoxSkillCardsOnFileRequestBody);

package-lock.json

Lines changed: 53 additions & 50 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/managers/chunkedUploads.generated.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -713,11 +713,11 @@ export class ChunkedUploadsManager {
713713
const bytesEnd: number = lastIndex + chunkSize;
714714
const contentRange: string = ''.concat(
715715
'bytes ',
716-
toString(bytesStart) as string,
716+
(toString(bytesStart) as string)!,
717717
'-',
718-
toString(bytesEnd) as string,
718+
(toString(bytesEnd) as string)!,
719719
'/',
720-
toString(acc.fileSize) as string
720+
(toString(acc.fileSize) as string)!
721721
) as string;
722722
const uploadedPart: UploadedPart = await this.uploadFilePart(
723723
acc.uploadSessionId,
@@ -732,10 +732,10 @@ export class ChunkedUploadsManager {
732732
if (!(partSha1 == sha1)) {
733733
throw new Error('Assertion failed');
734734
}
735-
if (!(part.size == chunkSize)) {
735+
if (!(part.size! == chunkSize)) {
736736
throw new Error('Assertion failed');
737737
}
738-
if (!(part.offset == bytesStart)) {
738+
if (!(part.offset! == bytesStart)) {
739739
throw new Error('Assertion failed');
740740
}
741741
acc.fileHash.updateHash(chunkBuffer);

src/networking/fetch.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ async function createRequestInit(options: FetchOptions): Promise<RequestInit> {
202202

203203
const DEFAULT_MAX_ATTEMPTS = 5;
204204
const RETRY_BASE_INTERVAL = 1;
205+
const STATUS_CODE_ACCEPTED = 202,
206+
STATUS_CODE_UNAUTHORIZED = 401,
207+
STATUS_CODE_TOO_MANY_REQUESTS = 429;
205208

206209
export async function fetch(
207210
resource: string,
@@ -267,10 +270,14 @@ export async function fetch(
267270
return fetch(fetchResponse.headers['location'], options);
268271
}
269272

270-
if (fetchResponse.status >= 400) {
273+
const acceptedWithRetryAfter =
274+
fetchResponse.status === STATUS_CODE_ACCEPTED &&
275+
fetchResponse.headers['retry-after'];
276+
if (fetchResponse.status >= 400 || acceptedWithRetryAfter) {
271277
const { numRetries = 0 } = fetchOptions;
272278

273-
const reauthenticationNeeded = fetchResponse.status == 401;
279+
const reauthenticationNeeded =
280+
fetchResponse.status == STATUS_CODE_UNAUTHORIZED;
274281
if (reauthenticationNeeded && fetchOptions.auth) {
275282
await fetchOptions.auth.refreshToken(fetchOptions.networkSession);
276283

@@ -280,7 +287,9 @@ export async function fetch(
280287

281288
const isRetryable =
282289
fetchOptions.contentType !== 'application/x-www-form-urlencoded' &&
283-
(fetchResponse.status === 429 || fetchResponse.status >= 500);
290+
(fetchResponse.status === STATUS_CODE_TOO_MANY_REQUESTS ||
291+
acceptedWithRetryAfter ||
292+
fetchResponse.status >= 500);
284293

285294
if (isRetryable && numRetries < DEFAULT_MAX_ATTEMPTS) {
286295
const retryTimeout = fetchResponse.headers['retry-after']

src/test/chunkedUploads.generated.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ test('testChunkedUpload', async function testChunkedUpload(): Promise<any> {
2525
fileSize,
2626
parentFolderId
2727
);
28-
if (!(uploadedFile.name == fileName)) {
28+
if (!(uploadedFile.name! == fileName)) {
2929
throw new Error('Assertion failed');
3030
}
31-
if (!(uploadedFile.size == fileSize)) {
31+
if (!(uploadedFile.size! == fileSize)) {
3232
throw new Error('Assertion failed');
3333
}
3434
if (!(uploadedFile.parent!.id == parentFolderId)) {

src/test/skills.generated.test.ts

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import { serializeCreateBoxSkillCardsOnFileRequestBody } from '../managers/skill
66
import { deserializeCreateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
77
import { serializeKeywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard } from '../schemas/keywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard.generated.js';
88
import { deserializeKeywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard } from '../schemas/keywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard.generated.js';
9+
import { serializeUpdateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
10+
import { deserializeUpdateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
11+
import { serializeUpdateBoxSkillCardsOnFileRequestBodyOpField } from '../managers/skills.generated.js';
12+
import { deserializeUpdateBoxSkillCardsOnFileRequestBodyOpField } from '../managers/skills.generated.js';
913
import { serializeKeywordSkillCardTypeField } from '../schemas/keywordSkillCard.generated.js';
1014
import { deserializeKeywordSkillCardTypeField } from '../schemas/keywordSkillCard.generated.js';
1115
import { serializeKeywordSkillCardSkillCardTypeField } from '../schemas/keywordSkillCard.generated.js';
@@ -22,17 +26,15 @@ import { serializeKeywordSkillCardInvocationTypeField } from '../schemas/keyword
2226
import { deserializeKeywordSkillCardInvocationTypeField } from '../schemas/keywordSkillCard.generated.js';
2327
import { serializeKeywordSkillCardEntriesField } from '../schemas/keywordSkillCard.generated.js';
2428
import { deserializeKeywordSkillCardEntriesField } from '../schemas/keywordSkillCard.generated.js';
25-
import { serializeUpdateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
26-
import { deserializeUpdateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
27-
import { serializeUpdateBoxSkillCardsOnFileRequestBodyOpField } from '../managers/skills.generated.js';
28-
import { deserializeUpdateBoxSkillCardsOnFileRequestBodyOpField } from '../managers/skills.generated.js';
2929
import { serializeKeywordSkillCard } from '../schemas/keywordSkillCard.generated.js';
3030
import { deserializeKeywordSkillCard } from '../schemas/keywordSkillCard.generated.js';
3131
import { BoxClient } from '../client.generated.js';
3232
import { FileFull } from '../schemas/fileFull.generated.js';
3333
import { SkillCardsMetadata } from '../schemas/skillCardsMetadata.generated.js';
3434
import { CreateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
3535
import { KeywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard } from '../schemas/keywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard.generated.js';
36+
import { UpdateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
37+
import { UpdateBoxSkillCardsOnFileRequestBodyOpField } from '../managers/skills.generated.js';
3638
import { KeywordSkillCardTypeField } from '../schemas/keywordSkillCard.generated.js';
3739
import { KeywordSkillCardSkillCardTypeField } from '../schemas/keywordSkillCard.generated.js';
3840
import { KeywordSkillCardSkillCardTitleField } from '../schemas/keywordSkillCard.generated.js';
@@ -41,8 +43,6 @@ import { KeywordSkillCardSkillTypeField } from '../schemas/keywordSkillCard.gene
4143
import { KeywordSkillCardInvocationField } from '../schemas/keywordSkillCard.generated.js';
4244
import { KeywordSkillCardInvocationTypeField } from '../schemas/keywordSkillCard.generated.js';
4345
import { KeywordSkillCardEntriesField } from '../schemas/keywordSkillCard.generated.js';
44-
import { UpdateBoxSkillCardsOnFileRequestBody } from '../managers/skills.generated.js';
45-
import { UpdateBoxSkillCardsOnFileRequestBodyOpField } from '../managers/skills.generated.js';
4646
import { getUuid } from '../internal/utils.js';
4747
import { getDefaultClient } from './commons.generated.js';
4848
import { uploadNewFile } from './commons.generated.js';
@@ -64,23 +64,12 @@ test('test_skills_cards_CRUD', async function test_skills_cards_CRUD(): Promise<
6464
await client.skills.createBoxSkillCardsOnFile(file.id, {
6565
cards: [
6666
{
67-
type: 'skill_card' as KeywordSkillCardTypeField,
68-
skillCardType: 'keyword' as KeywordSkillCardSkillCardTypeField,
69-
skillCardTitle: {
70-
code: 'license-plates',
71-
message: titleMessage,
72-
} satisfies KeywordSkillCardSkillCardTitleField,
73-
skill: new KeywordSkillCardSkillField({
74-
id: skillId,
75-
type: 'service' as KeywordSkillCardSkillTypeField,
76-
}),
77-
invocation: new KeywordSkillCardInvocationField({
78-
id: invocationId,
79-
type: 'skill_invocation' as KeywordSkillCardInvocationTypeField,
80-
}),
81-
entries: [
82-
{ text: 'DN86 BOX' } satisfies KeywordSkillCardEntriesField,
83-
],
67+
type: 'skill_card',
68+
skillCardType: 'keyword',
69+
skillCardTitle: { code: 'license-plates', message: titleMessage },
70+
skill: { id: skillId, type: 'service' },
71+
invocation: { id: invocationId, type: 'skill_invocation' },
72+
entries: [{ text: 'DN86 BOX' }],
8473
} satisfies KeywordSkillCardOrStatusSkillCardOrTimelineSkillCardOrTranscriptSkillCard,
8574
],
8675
} satisfies CreateBoxSkillCardsOnFileRequestBody);

0 commit comments

Comments
 (0)