@contember/client 2.0.0-alpha.4 → 2.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +0 -4
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +0 -4
- package/dist/development/index.js.map +1 -1
- package/dist/production/index.cjs +0 -4
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +0 -4
- package/dist/production/index.js.map +1 -1
- package/dist/types/content/upload/index.d.ts +0 -6
- package/dist/types/content/upload/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -6
- package/src/content/upload/index.ts +0 -6
- package/dist/development/content/upload/FileUploadError.cjs +0 -10
- package/dist/development/content/upload/FileUploadError.cjs.map +0 -1
- package/dist/development/content/upload/FileUploadError.js +0 -10
- package/dist/development/content/upload/FileUploadError.js.map +0 -1
- package/dist/development/content/upload/S3FileUploader.cjs +0 -107
- package/dist/development/content/upload/S3FileUploader.cjs.map +0 -1
- package/dist/development/content/upload/S3FileUploader.js +0 -107
- package/dist/development/content/upload/S3FileUploader.js.map +0 -1
- package/dist/development/utils/readFileAsArrayBuffer.cjs +0 -15
- package/dist/development/utils/readFileAsArrayBuffer.cjs.map +0 -1
- package/dist/development/utils/readFileAsArrayBuffer.js +0 -15
- package/dist/development/utils/readFileAsArrayBuffer.js.map +0 -1
- package/dist/production/content/upload/FileUploadError.cjs +0 -10
- package/dist/production/content/upload/FileUploadError.cjs.map +0 -1
- package/dist/production/content/upload/FileUploadError.js +0 -10
- package/dist/production/content/upload/FileUploadError.js.map +0 -1
- package/dist/production/content/upload/S3FileUploader.cjs +0 -107
- package/dist/production/content/upload/S3FileUploader.cjs.map +0 -1
- package/dist/production/content/upload/S3FileUploader.js +0 -107
- package/dist/production/content/upload/S3FileUploader.js.map +0 -1
- package/dist/production/utils/readFileAsArrayBuffer.cjs +0 -15
- package/dist/production/utils/readFileAsArrayBuffer.cjs.map +0 -1
- package/dist/production/utils/readFileAsArrayBuffer.js +0 -15
- package/dist/production/utils/readFileAsArrayBuffer.js.map +0 -1
- package/dist/types/content/upload/FileUploadError.d.ts +0 -9
- package/dist/types/content/upload/FileUploadError.d.ts.map +0 -1
- package/dist/types/content/upload/FileUploadProgress.d.ts +0 -4
- package/dist/types/content/upload/FileUploadProgress.d.ts.map +0 -1
- package/dist/types/content/upload/FileUploader.d.ts +0 -15
- package/dist/types/content/upload/FileUploader.d.ts.map +0 -1
- package/dist/types/content/upload/S3FileUploader.d.ts +0 -33
- package/dist/types/content/upload/S3FileUploader.d.ts.map +0 -1
- package/dist/types/content/upload/SwitchFileUploader.d.ts +0 -13
- package/dist/types/content/upload/SwitchFileUploader.d.ts.map +0 -1
- package/dist/types/content/upload/UploadedFileMetadata.d.ts +0 -4
- package/dist/types/content/upload/UploadedFileMetadata.d.ts.map +0 -1
- package/src/content/upload/FileUploadError.ts +0 -10
- package/src/content/upload/FileUploadProgress.ts +0 -3
- package/src/content/upload/FileUploader.ts +0 -19
- package/src/content/upload/S3FileUploader.ts +0 -150
- package/src/content/upload/SwitchFileUploader.ts +0 -40
- package/src/content/upload/UploadedFileMetadata.ts +0 -3
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import pLimit from 'p-limit'
|
|
2
|
-
import { readFileAsArrayBuffer } from '../../utils'
|
|
3
|
-
import { FileUploadError } from './FileUploadError'
|
|
4
|
-
import type { FileUploader, FileUploaderInitializeOptions } from './FileUploader'
|
|
5
|
-
import { GenerateUploadUrlMutationBuilder } from './GenerateUploadUrlMutationBuilder'
|
|
6
|
-
import type { UploadedFileMetadata } from './UploadedFileMetadata'
|
|
7
|
-
|
|
8
|
-
interface S3UploadState {
|
|
9
|
-
request?: XMLHttpRequest
|
|
10
|
-
alias: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
class S3FileUploader implements FileUploader<S3FileUploader.SuccessMetadata> {
|
|
14
|
-
private readonly uploadState: WeakMap<File, S3UploadState>
|
|
15
|
-
|
|
16
|
-
public constructor(public readonly options: S3FileUploader.Options = {}) {
|
|
17
|
-
this.uploadState = new WeakMap()
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
private generateNewAlias = (() => {
|
|
21
|
-
let alias = 1
|
|
22
|
-
return () => alias++
|
|
23
|
-
})()
|
|
24
|
-
|
|
25
|
-
private static formatFullAlias(alias: number) {
|
|
26
|
-
return `file${alias}`
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public async upload(
|
|
30
|
-
files: Map<File, UploadedFileMetadata>,
|
|
31
|
-
options: FileUploaderInitializeOptions,
|
|
32
|
-
) {
|
|
33
|
-
const parameters: GenerateUploadUrlMutationBuilder.MutationParameters = {}
|
|
34
|
-
|
|
35
|
-
for (const [file, metadata] of files) {
|
|
36
|
-
if (this.uploadState.has(file)) {
|
|
37
|
-
const uploadState = this.uploadState.get(file)!
|
|
38
|
-
uploadState.request?.abort()
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const alias = this.generateNewAlias()
|
|
42
|
-
this.uploadState.set(file, {
|
|
43
|
-
alias,
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
const uploadOptions = this.options.getUploadOptions?.(file)
|
|
47
|
-
|
|
48
|
-
parameters[S3FileUploader.formatFullAlias(alias)] = {
|
|
49
|
-
contentType: uploadOptions?.fileType ?? file.type,
|
|
50
|
-
prefix: uploadOptions?.filePrefix,
|
|
51
|
-
suffix: uploadOptions?.fileSuffix,
|
|
52
|
-
size: uploadOptions?.fileSize,
|
|
53
|
-
extension: uploadOptions?.fileExtension,
|
|
54
|
-
fileName: uploadOptions?.fileName,
|
|
55
|
-
expiration: uploadOptions?.fileExpiration,
|
|
56
|
-
acl: uploadOptions?.fileAcl,
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
metadata.abortSignal.addEventListener('abort', () => {
|
|
60
|
-
this.uploadState.get(file)?.request?.abort()
|
|
61
|
-
})
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const mutation = GenerateUploadUrlMutationBuilder.buildQuery(parameters)
|
|
65
|
-
try {
|
|
66
|
-
const responseData = await options.contentApiClient.execute<GenerateUploadUrlMutationBuilder.MutationResponse>(mutation.query, { variables: mutation.variables })
|
|
67
|
-
const limit = pLimit(this.options.concurrency ?? 5)
|
|
68
|
-
const promises: Promise<void>[] = []
|
|
69
|
-
for (const [file] of files) {
|
|
70
|
-
promises.push(limit(() => this.uploadSingleFile(file, responseData, options)))
|
|
71
|
-
}
|
|
72
|
-
await Promise.all(promises)
|
|
73
|
-
} catch (error) {
|
|
74
|
-
if (error instanceof FileUploadError) {
|
|
75
|
-
const fileUploadError = error
|
|
76
|
-
options.onError(Array.from(files).map(([file]) => [file, fileUploadError]))
|
|
77
|
-
|
|
78
|
-
} else {
|
|
79
|
-
throw error
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
private uploadSingleFile(
|
|
85
|
-
file: File,
|
|
86
|
-
responseData: GenerateUploadUrlMutationBuilder.MutationResponse,
|
|
87
|
-
{ onProgress, onError, onSuccess }: FileUploaderInitializeOptions,
|
|
88
|
-
) {
|
|
89
|
-
return new Promise<void>(async (resolve, reject) => {
|
|
90
|
-
const fileState = this.uploadState.get(file)!
|
|
91
|
-
const datumBody = responseData[S3FileUploader.formatFullAlias(fileState.alias)]
|
|
92
|
-
const uploadRequestBody = await readFileAsArrayBuffer(file)
|
|
93
|
-
const xhr = new XMLHttpRequest()
|
|
94
|
-
|
|
95
|
-
fileState.request = xhr
|
|
96
|
-
|
|
97
|
-
xhr.open(datumBody.method, datumBody.url)
|
|
98
|
-
|
|
99
|
-
for (const header of datumBody.headers) {
|
|
100
|
-
xhr.setRequestHeader(header.key, header.value)
|
|
101
|
-
}
|
|
102
|
-
xhr.addEventListener('load', () => {
|
|
103
|
-
const successMetadata: S3FileUploader.SuccessMetadata = {
|
|
104
|
-
fileUrl: datumBody.publicUrl,
|
|
105
|
-
}
|
|
106
|
-
onSuccess([[file, successMetadata]])
|
|
107
|
-
resolve()
|
|
108
|
-
})
|
|
109
|
-
xhr.addEventListener('error', e => {
|
|
110
|
-
onError([file])
|
|
111
|
-
reject(e)
|
|
112
|
-
})
|
|
113
|
-
xhr.upload?.addEventListener('progress', e => {
|
|
114
|
-
onProgress([
|
|
115
|
-
[
|
|
116
|
-
file,
|
|
117
|
-
{
|
|
118
|
-
progress: e.loaded / e.total,
|
|
119
|
-
},
|
|
120
|
-
],
|
|
121
|
-
])
|
|
122
|
-
})
|
|
123
|
-
xhr.send(uploadRequestBody)
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
namespace S3FileUploader {
|
|
129
|
-
export interface SuccessMetadata {
|
|
130
|
-
fileUrl: string
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
export interface Options {
|
|
134
|
-
getUploadOptions?: (file: File) => S3UploadOptions
|
|
135
|
-
concurrency?: number
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
export interface S3UploadOptions {
|
|
139
|
-
fileType?: GenerateUploadUrlMutationBuilder.FileParameters['contentType']
|
|
140
|
-
fileExpiration?: number
|
|
141
|
-
fileSize?: number
|
|
142
|
-
filePrefix?: string
|
|
143
|
-
fileSuffix?: string
|
|
144
|
-
fileName?: string
|
|
145
|
-
fileExtension?: string
|
|
146
|
-
fileAcl?: GenerateUploadUrlMutationBuilder.Acl
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export { S3FileUploader }
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import type { FileUploader, FileUploaderInitializeOptions } from './FileUploader'
|
|
2
|
-
import type { UploadedFileMetadata } from './UploadedFileMetadata'
|
|
3
|
-
|
|
4
|
-
class SwitchFileUploader implements FileUploader {
|
|
5
|
-
public constructor(private readonly subUploaders: SwitchFileUploader.SubUploaders) {}
|
|
6
|
-
|
|
7
|
-
public async upload(files: Map<File, UploadedFileMetadata>, options: FileUploaderInitializeOptions) {
|
|
8
|
-
const fileKinds: Map<FileUploader, Map<File, UploadedFileMetadata>> = new Map()
|
|
9
|
-
const unhandledFiles: Array<[File, any]> = []
|
|
10
|
-
|
|
11
|
-
fileLoop: for (const [file, metadata] of files) {
|
|
12
|
-
for (const [predicate, uploader] of this.subUploaders) {
|
|
13
|
-
if (predicate(file)) {
|
|
14
|
-
let nestedMap = fileKinds.get(uploader)
|
|
15
|
-
if (nestedMap === undefined) {
|
|
16
|
-
fileKinds.set(uploader, (nestedMap = new Map()))
|
|
17
|
-
}
|
|
18
|
-
nestedMap.set(file, metadata)
|
|
19
|
-
continue fileLoop
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
unhandledFiles.push([file, undefined])
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (unhandledFiles.length && options.onError) {
|
|
26
|
-
options.onError(unhandledFiles)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
for (const [uploader, files] of fileKinds) {
|
|
30
|
-
uploader.upload(files, options) // Deliberately no await
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
namespace SwitchFileUploader {
|
|
36
|
-
export type FilePredicate = (file: File) => boolean
|
|
37
|
-
export type SubUploaders = Iterable<[FilePredicate, FileUploader]>
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export { SwitchFileUploader }
|