Skip to content

Commit b9eb164

Browse files
committed
refactor(react-uploader): s3 client accepts url signer function
1 parent 89dfa0c commit b9eb164

File tree

4 files changed

+36
-31
lines changed

4 files changed

+36
-31
lines changed

build/api/react-uploader.api.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { Environment as Environment_2 } from '@contember/react-binding';
1212
import { ErrorAccessor } from '@contember/binding';
1313
import { ErrorAccessorHolder } from '@contember/binding';
1414
import { GenerateUploadUrlMutationBuilder } from '@contember/client';
15-
import { GraphQlClient } from '@contember/graphql-client';
1615
import { JSX as JSX_2 } from 'react/jsx-runtime';
1716
import { JSXElementConstructor } from 'react';
1817
import { NamedExoticComponent } from 'react';
@@ -273,7 +272,7 @@ export interface S3FileOptions {
273272

274273
// @public (undocumented)
275274
export class S3UploadClient implements UploadClient<S3FileOptions> {
276-
constructor(contentApiClient: GraphQlClient, options?: S3UploadClientOptions);
275+
constructor(s3UrlSigner: S3UrlSigner, options?: S3UploadClientOptions);
277276
// (undocumented)
278277
readonly options: S3UploadClientOptions;
279278
// (undocumented)
@@ -290,6 +289,9 @@ export interface S3UploadClientOptions {
290289
getUploadOptions?: (file: File) => S3FileOptions;
291290
}
292291

292+
// @public (undocumented)
293+
export type S3UrlSigner = (parameters: GenerateUploadUrlMutationBuilder.FileParameters) => Promise<GenerateUploadUrlMutationBuilder.ResponseBody>;
294+
293295
// @public (undocumented)
294296
export type StartUploadEvent = {
295297
file: FileWithMeta;
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { S3UploadClient } from '../uploadClient/S3UploadClient'
22
import { useCurrentContentGraphQlClient } from '@contember/react-client'
3+
import { createBatchSignedUrlGenerator } from '../internal/utils/urlSigner'
34

4-
export const useS3Client = () => new S3UploadClient(useCurrentContentGraphQlClient())
5+
export const useS3Client = () => new S3UploadClient(createBatchSignedUrlGenerator(useCurrentContentGraphQlClient()))
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { GenerateUploadUrlMutationBuilder } from '@contember/client'
2+
import { GraphQlClient } from '@contember/graphql-client'
3+
4+
export const createBatchSignedUrlGenerator = (client: GraphQlClient) => {
5+
6+
let uploadUrlBatchParameters: GenerateUploadUrlMutationBuilder.FileParameters[] = []
7+
let uploadUrlBatchResult: null | Promise<GenerateUploadUrlMutationBuilder.MutationResponse> = null
8+
9+
return async (parameters: GenerateUploadUrlMutationBuilder.FileParameters): Promise<GenerateUploadUrlMutationBuilder.ResponseBody> => {
10+
const index = uploadUrlBatchParameters.length
11+
uploadUrlBatchParameters.push(parameters)
12+
if (uploadUrlBatchResult === null) {
13+
uploadUrlBatchResult = (async () => {
14+
await new Promise(resolve => setTimeout(resolve, 0))
15+
16+
const mutation = GenerateUploadUrlMutationBuilder.buildQuery(Object.fromEntries(uploadUrlBatchParameters.map((_, i) => ['url_' + i, _])))
17+
uploadUrlBatchResult = null
18+
uploadUrlBatchParameters = []
19+
20+
return await client.execute<GenerateUploadUrlMutationBuilder.MutationResponse>(mutation.query, { variables: mutation.variables })
21+
})()
22+
}
23+
return (await uploadUrlBatchResult)[`url_${index}`]
24+
}
25+
}

packages/react-uploader/src/uploadClient/S3UploadClient.ts

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { FileUploadProgress, UploadClient, UploadClientUploadArgs } from './UploadClient'
1+
import { UploadClient, UploadClientUploadArgs } from './UploadClient'
22
import { GenerateUploadUrlMutationBuilder } from '@contember/client'
3-
import { GraphQlClient } from '@contember/graphql-client'
43
import { UploaderError } from '../UploaderError'
54

65
export interface S3UploadClientOptions {
@@ -19,17 +18,17 @@ export interface S3FileOptions {
1918
acl?: GenerateUploadUrlMutationBuilder.Acl
2019
}
2120

21+
export type S3UrlSigner = (parameters: GenerateUploadUrlMutationBuilder.FileParameters) => Promise<GenerateUploadUrlMutationBuilder.ResponseBody>
22+
2223
export class S3UploadClient implements UploadClient<S3FileOptions> {
2324

24-
private getSignedUploadUrl: ReturnType<typeof createBatchSignedUrlGenerator>
2525
private activeCount = 0
2626
private resolverQueue: Array<() => void> = []
2727

2828
public constructor(
29-
contentApiClient: GraphQlClient,
29+
private readonly s3UrlSigner: S3UrlSigner,
3030
public readonly options: S3UploadClientOptions = {},
3131
) {
32-
this.getSignedUploadUrl = createBatchSignedUrlGenerator(contentApiClient)
3332
}
3433

3534

@@ -44,7 +43,7 @@ export class S3UploadClient implements UploadClient<S3FileOptions> {
4443
contentType: file.type,
4544
...resolvedOptions,
4645
}
47-
const responseData = await this.getSignedUploadUrl(parameters)
46+
const responseData = await this.s3UrlSigner(parameters)
4847
await this.uploadSingleFile(responseData, { file, onProgress, signal })
4948

5049
return {
@@ -131,25 +130,3 @@ const xhrAdapter = async (
131130
}
132131

133132

134-
const createBatchSignedUrlGenerator = (client: GraphQlClient) => {
135-
136-
let uploadUrlBatchParameters: GenerateUploadUrlMutationBuilder.FileParameters[] = []
137-
let uploadUrlBatchResult: null | Promise<GenerateUploadUrlMutationBuilder.MutationResponse> = null
138-
139-
return async (parameters: GenerateUploadUrlMutationBuilder.FileParameters): Promise<GenerateUploadUrlMutationBuilder.ResponseBody> => {
140-
const index = uploadUrlBatchParameters.length
141-
uploadUrlBatchParameters.push(parameters)
142-
if (uploadUrlBatchResult === null) {
143-
uploadUrlBatchResult = (async () => {
144-
await new Promise(resolve => setTimeout(resolve, 0))
145-
146-
const mutation = GenerateUploadUrlMutationBuilder.buildQuery(Object.fromEntries(uploadUrlBatchParameters.map((_, i) => ['url_' + i, _])))
147-
const response = await client.execute<GenerateUploadUrlMutationBuilder.MutationResponse>(mutation.query, { variables: mutation.variables })
148-
uploadUrlBatchParameters = []
149-
uploadUrlBatchResult = null
150-
return response
151-
})()
152-
}
153-
return (await uploadUrlBatchResult)[`url_${index}`]
154-
}
155-
}

0 commit comments

Comments
 (0)