@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.
Files changed (55) hide show
  1. package/dist/development/index.cjs +0 -4
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +0 -4
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/production/index.cjs +0 -4
  6. package/dist/production/index.cjs.map +1 -1
  7. package/dist/production/index.js +0 -4
  8. package/dist/production/index.js.map +1 -1
  9. package/dist/types/content/upload/index.d.ts +0 -6
  10. package/dist/types/content/upload/index.d.ts.map +1 -1
  11. package/dist/types/tsconfig.tsbuildinfo +1 -1
  12. package/package.json +5 -6
  13. package/src/content/upload/index.ts +0 -6
  14. package/dist/development/content/upload/FileUploadError.cjs +0 -10
  15. package/dist/development/content/upload/FileUploadError.cjs.map +0 -1
  16. package/dist/development/content/upload/FileUploadError.js +0 -10
  17. package/dist/development/content/upload/FileUploadError.js.map +0 -1
  18. package/dist/development/content/upload/S3FileUploader.cjs +0 -107
  19. package/dist/development/content/upload/S3FileUploader.cjs.map +0 -1
  20. package/dist/development/content/upload/S3FileUploader.js +0 -107
  21. package/dist/development/content/upload/S3FileUploader.js.map +0 -1
  22. package/dist/development/utils/readFileAsArrayBuffer.cjs +0 -15
  23. package/dist/development/utils/readFileAsArrayBuffer.cjs.map +0 -1
  24. package/dist/development/utils/readFileAsArrayBuffer.js +0 -15
  25. package/dist/development/utils/readFileAsArrayBuffer.js.map +0 -1
  26. package/dist/production/content/upload/FileUploadError.cjs +0 -10
  27. package/dist/production/content/upload/FileUploadError.cjs.map +0 -1
  28. package/dist/production/content/upload/FileUploadError.js +0 -10
  29. package/dist/production/content/upload/FileUploadError.js.map +0 -1
  30. package/dist/production/content/upload/S3FileUploader.cjs +0 -107
  31. package/dist/production/content/upload/S3FileUploader.cjs.map +0 -1
  32. package/dist/production/content/upload/S3FileUploader.js +0 -107
  33. package/dist/production/content/upload/S3FileUploader.js.map +0 -1
  34. package/dist/production/utils/readFileAsArrayBuffer.cjs +0 -15
  35. package/dist/production/utils/readFileAsArrayBuffer.cjs.map +0 -1
  36. package/dist/production/utils/readFileAsArrayBuffer.js +0 -15
  37. package/dist/production/utils/readFileAsArrayBuffer.js.map +0 -1
  38. package/dist/types/content/upload/FileUploadError.d.ts +0 -9
  39. package/dist/types/content/upload/FileUploadError.d.ts.map +0 -1
  40. package/dist/types/content/upload/FileUploadProgress.d.ts +0 -4
  41. package/dist/types/content/upload/FileUploadProgress.d.ts.map +0 -1
  42. package/dist/types/content/upload/FileUploader.d.ts +0 -15
  43. package/dist/types/content/upload/FileUploader.d.ts.map +0 -1
  44. package/dist/types/content/upload/S3FileUploader.d.ts +0 -33
  45. package/dist/types/content/upload/S3FileUploader.d.ts.map +0 -1
  46. package/dist/types/content/upload/SwitchFileUploader.d.ts +0 -13
  47. package/dist/types/content/upload/SwitchFileUploader.d.ts.map +0 -1
  48. package/dist/types/content/upload/UploadedFileMetadata.d.ts +0 -4
  49. package/dist/types/content/upload/UploadedFileMetadata.d.ts.map +0 -1
  50. package/src/content/upload/FileUploadError.ts +0 -10
  51. package/src/content/upload/FileUploadProgress.ts +0 -3
  52. package/src/content/upload/FileUploader.ts +0 -19
  53. package/src/content/upload/S3FileUploader.ts +0 -150
  54. package/src/content/upload/SwitchFileUploader.ts +0 -40
  55. 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 }
@@ -1,3 +0,0 @@
1
- export interface UploadedFileMetadata {
2
- abortSignal: AbortSignal
3
- }