@ibm-aspera/sdk 0.2.29 → 0.4.12

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 (113) hide show
  1. package/README.md +17 -13
  2. package/dist/commonjs/app/core.d.ts +234 -0
  3. package/dist/commonjs/app/core.js +812 -0
  4. package/dist/commonjs/app/installer.d.ts +9 -0
  5. package/dist/commonjs/app/installer.js +50 -0
  6. package/dist/commonjs/connect/core.d.ts +11 -0
  7. package/dist/commonjs/connect/core.js +73 -0
  8. package/dist/commonjs/constants/constants.d.ts +8 -0
  9. package/dist/commonjs/constants/constants.js +11 -0
  10. package/dist/commonjs/constants/messages.d.ts +38 -0
  11. package/dist/commonjs/constants/messages.js +41 -0
  12. package/dist/commonjs/helpers/client/client.d.ts +5 -0
  13. package/dist/commonjs/helpers/client/client.js +7 -0
  14. package/dist/commonjs/helpers/client/http-client.d.ts +42 -0
  15. package/dist/commonjs/helpers/client/http-client.js +84 -0
  16. package/dist/commonjs/helpers/client/safari-client.d.ts +101 -0
  17. package/dist/commonjs/helpers/client/safari-client.js +264 -0
  18. package/dist/commonjs/helpers/helpers.d.ts +109 -0
  19. package/dist/commonjs/helpers/helpers.js +249 -0
  20. package/dist/commonjs/helpers/http.d.ts +16 -0
  21. package/dist/commonjs/helpers/http.js +42 -0
  22. package/dist/commonjs/helpers/ws.d.ts +62 -0
  23. package/dist/commonjs/helpers/ws.js +161 -0
  24. package/dist/commonjs/http-gateway/core.d.ts +98 -0
  25. package/dist/commonjs/http-gateway/core.js +388 -0
  26. package/dist/commonjs/http-gateway/download.d.ts +14 -0
  27. package/dist/commonjs/http-gateway/download.js +187 -0
  28. package/dist/commonjs/http-gateway/index.d.ts +11 -0
  29. package/dist/commonjs/http-gateway/index.js +11 -0
  30. package/dist/commonjs/http-gateway/models.d.ts +16 -0
  31. package/dist/commonjs/http-gateway/models.js +2 -0
  32. package/dist/commonjs/http-gateway/upload.d.ts +14 -0
  33. package/dist/commonjs/http-gateway/upload.js +124 -0
  34. package/dist/commonjs/index.d.ts +12 -0
  35. package/dist/commonjs/index.js +109 -0
  36. package/dist/commonjs/models/aspera-sdk.model.d.ts +259 -0
  37. package/dist/commonjs/models/aspera-sdk.model.js +349 -0
  38. package/dist/commonjs/models/models.d.ts +760 -0
  39. package/dist/commonjs/models/models.js +2 -0
  40. package/dist/js/aspera-sdk.js +3 -0
  41. package/dist/js/aspera-sdk.js.LICENSE.txt +15 -0
  42. package/dist/js/aspera-sdk.js.map +1 -0
  43. package/package.json +8 -5
  44. package/.editorconfig +0 -13
  45. package/.github/CODEOWNERS +0 -1
  46. package/.github/CODE_OF_CONDUCT.md +0 -128
  47. package/.github/CONTRIBUTING.md +0 -147
  48. package/.github/dependabot.yml +0 -10
  49. package/.github/workflows/ci.yml +0 -39
  50. package/.github/workflows/documentation.yml +0 -44
  51. package/.github/workflows/publish.yml +0 -23
  52. package/.github/workflows/version.yml +0 -32
  53. package/.whitesource +0 -3
  54. package/CHANGELOG.md +0 -204
  55. package/docs/DEVELOPMENT.md +0 -38
  56. package/eslint.config.js +0 -104
  57. package/example/README.md +0 -7
  58. package/example/index.html +0 -14
  59. package/example/package-lock.json +0 -2989
  60. package/example/package.json +0 -30
  61. package/example/public/404.html +0 -5
  62. package/example/public/sdk-code.js +0 -326
  63. package/example/src/App/App.scss +0 -40
  64. package/example/src/App/index.tsx +0 -196
  65. package/example/src/Views/AllTogether.tsx +0 -26
  66. package/example/src/Views/DragDrop.tsx +0 -23
  67. package/example/src/Views/Home.tsx +0 -10
  68. package/example/src/Views/Initialize.tsx +0 -31
  69. package/example/src/Views/Installer.tsx +0 -154
  70. package/example/src/Views/MonitorTransfers.tsx +0 -88
  71. package/example/src/Views/Other.tsx +0 -24
  72. package/example/src/Views/SelectItems.tsx +0 -46
  73. package/example/src/Views/StartTransfer.tsx +0 -37
  74. package/example/src/Views/Test.tsx +0 -20
  75. package/example/src/Views/Views.scss +0 -111
  76. package/example/src/helpers/index.ts +0 -19
  77. package/example/src/index.scss +0 -47
  78. package/example/src/main.tsx +0 -17
  79. package/example/src/vite-env.d.ts +0 -2
  80. package/example/tsconfig.json +0 -30
  81. package/example/vite.config.ts +0 -23
  82. package/jest.config.js +0 -19
  83. package/jest.setup.js +0 -0
  84. package/renovate.json +0 -12
  85. package/src/app/core.ts +0 -765
  86. package/src/app/installer.ts +0 -53
  87. package/src/connect/core.ts +0 -83
  88. package/src/constants/constants.ts +0 -19
  89. package/src/constants/messages.ts +0 -35
  90. package/src/helpers/client/client.ts +0 -11
  91. package/src/helpers/client/http-client.ts +0 -92
  92. package/src/helpers/client/safari-client.ts +0 -334
  93. package/src/helpers/helpers.ts +0 -253
  94. package/src/helpers/http.ts +0 -39
  95. package/src/helpers/ws.ts +0 -191
  96. package/src/http-gateway/core.ts +0 -273
  97. package/src/http-gateway/download.ts +0 -217
  98. package/src/http-gateway/index.ts +0 -19
  99. package/src/http-gateway/models.ts +0 -20
  100. package/src/http-gateway/upload.ts +0 -148
  101. package/src/index.ts +0 -72
  102. package/src/models/aspera-sdk.model.ts +0 -446
  103. package/src/models/models.ts +0 -740
  104. package/tests/client.spec.ts +0 -52
  105. package/tests/core.spec.ts +0 -13
  106. package/tests/helpers.spec.ts +0 -127
  107. package/tests/http.spec.ts +0 -14
  108. package/tests/installer.spec.ts +0 -135
  109. package/tests/mocks.ts +0 -11
  110. package/tsconfig.json +0 -14
  111. package/tsconfig.module.json +0 -16
  112. package/typedoc.js +0 -7
  113. package/webpack.config.js +0 -35
@@ -1,273 +0,0 @@
1
- import {messages} from '../constants/messages';
2
- import {generateErrorBody, generatePromiseObjects, randomUUID, safeJsonParse} from '../helpers/helpers';
3
- import {asperaSdk} from '../index';
4
- import {removeTransfer as oldHttpRemoveTransfer, getAllTransfers as oldHttpGetAllTransfers, getTransferById as oldHttpGetTransfer, getFilesForUploadPromise as oldHttpGetFilesForUploadPromise, getFoldersForUploadPromise as oldHttpGetFoldersForUploadPromise} from '@ibm-aspera/http-gateway-sdk-js';
5
- import {FileDialogOptions, DataTransferResponse, TransferSpec, AsperaSdkTransfer} from '../models/models';
6
-
7
- /**
8
- * HTTP Gateway Core Logic
9
- * - File/Folder picking
10
- * - Starting and testing
11
- *
12
- * @remarks
13
- * Most logic is called directly by Desktop SDK functions
14
- * You may not need to import anything from this file.
15
- */
16
-
17
- /**
18
- * Remove a transfer from HTTP Gateway systems
19
- * @param id - ID of the transfer
20
- *
21
- * @returns Promise indicating success
22
- */
23
- export const httpRemoveTransfer = (id: string): Promise<any> => {
24
- if (asperaSdk.useOldHttpGateway) {
25
- oldHttpRemoveTransfer(id);
26
-
27
- return Promise.resolve({removed: true});
28
- }
29
-
30
- const transfer = asperaSdk.httpGatewayTransferStore.get(id);
31
-
32
- if (transfer) {
33
- asperaSdk.httpGatewayTransferStore.delete(id);
34
- return Promise.resolve({removed: true});
35
- } else {
36
- return Promise.reject(generateErrorBody(messages.removeTransferFailed, {reason: 'Not found'}));
37
- }
38
- };
39
-
40
- /**
41
- * Get the list of http gateway transfers
42
- *
43
- * @returns list of HTTP Gateway
44
- */
45
- export const httpGetAllTransfers = (): AsperaSdkTransfer[] => {
46
- if (asperaSdk.useOldHttpGateway) {
47
- return oldHttpGetAllTransfers().transfers as unknown as AsperaSdkTransfer[];
48
- }
49
-
50
- return Array.from(asperaSdk.httpGatewayTransferStore.values());
51
- };
52
-
53
- /**
54
- * Get a HTTP Gateway transfer by ID
55
- *
56
- * @returns a transfer or null
57
- */
58
- export const httpGetTransfer = (id: string): AsperaSdkTransfer|null => {
59
- if (asperaSdk.useOldHttpGateway) {
60
- return oldHttpGetTransfer(id) as unknown as AsperaSdkTransfer|null;
61
- }
62
-
63
- return asperaSdk.httpGatewayTransferStore.get(id);
64
- };
65
-
66
- /**
67
- * Create HTML input element for file picking
68
- */
69
- export const createHtmlInputElement = (): HTMLInputElement => {
70
- const element = window.document.createElement('input');
71
- element.type = 'file';
72
- element.style = 'display: none;';
73
- window.document.body.appendChild(element);
74
- return element;
75
- };
76
-
77
- /**
78
- * Handle drop events and store files for HTTP Gateway
79
- * This works on top of desktop.
80
- */
81
- export const handleHttpGatewayDrop = (items: DataTransferItemList, callback: (data: {event: DragEvent; files: DataTransferResponse}) => void, event: DragEvent): void => {
82
- const files: File[] = [];
83
- let callbackCount = 0;
84
- let callbackFinishCount = 0;
85
-
86
- const finalCallback = (): void => {
87
- if (callbackFinishCount >= callbackCount) {
88
- const finalFiles = files.map(file => {
89
- asperaSdk.httpGatewaySelectedFiles.set(file.name, file);
90
-
91
- return {
92
- lastModified: file.lastModified,
93
- name: file.name,
94
- size: file.size,
95
- type: file.type
96
- };
97
- });
98
- callback({event, files: {dataTransfer: {files: finalFiles}}});
99
- }
100
- };
101
-
102
- const traverse = (item: FileSystemEntry) => {
103
- if (item.isFile) {
104
- (item as FileSystemFileEntry).file(file => {
105
- files.push(file);
106
- callbackFinishCount++;
107
- finalCallback();
108
- });
109
-
110
- } else if (item.isDirectory) {
111
- const dirReader = (item as FileSystemDirectoryEntry).createReader();
112
-
113
- dirReader.readEntries(entries => {
114
- for (let k = 0; k < entries.length; k++) {
115
- callbackCount++;
116
- traverse(entries[k]);
117
- }
118
- });
119
-
120
- callbackFinishCount++;
121
- } else {
122
- callbackFinishCount++;
123
- finalCallback();
124
- }
125
-
126
- };
127
-
128
- for (let i = 0; i < items.length; i++) {
129
- const item = items[i].webkitGetAsEntry();
130
-
131
- if (item) {
132
- callbackCount++;
133
- traverse(item);
134
- }
135
- }
136
- };
137
-
138
- /**
139
- * Open native browser file or folder picker for files
140
- *
141
- * @param options - File picker options
142
- * @param folder - Indicate if choosing folders
143
- *
144
- * @returns Promise that resolves with info about the files picked
145
- */
146
- export const httpGatewaySelectFileFolderDialog = (options?: FileDialogOptions, folder?: boolean): Promise<DataTransferResponse> => {
147
- if (asperaSdk.useOldHttpGateway) {
148
- return (folder ? oldHttpGetFoldersForUploadPromise(options?.http_gateway_v2_transfer_id || '') : oldHttpGetFilesForUploadPromise(options?.http_gateway_v2_transfer_id || '')) as Promise<DataTransferResponse>;
149
- }
150
-
151
- const {promise, rejecter, resolver} = generatePromiseObjects();
152
- const element = createHtmlInputElement();
153
-
154
- element.multiple = !!options?.multiple;
155
-
156
- if (folder) {
157
- element.webkitdirectory = true;
158
- }
159
-
160
- element.oncancel = () => {
161
- rejecter({debugData: {code: -32002, message: messages.filePickerCancel}});
162
- };
163
-
164
- element.onchange = () => {
165
- const returnFiles: File[] = [];
166
-
167
- for (let i = 0; i < element.files.length; i++) {
168
- const file = element.files[i];
169
- returnFiles.push(file);
170
- asperaSdk.httpGatewaySelectedFiles.set(file.name, file);
171
- }
172
-
173
- resolver({
174
- dataTransfer: {
175
- files: returnFiles.map(file => {
176
- return {
177
- size: file.size,
178
- lastModified: file.lastModified,
179
- name: file.webkitRelativePath || file.name,
180
- type: file.type,
181
- };
182
- })
183
- }
184
- });
185
- };
186
-
187
- element.click();
188
-
189
- return promise;
190
- };
191
-
192
- /**
193
- * Get a generic transfer object for HTTP Gateway transfers.
194
- *
195
- * @param transferSpec - TransferSpec being provided for the HTTP Gateway transfer
196
- *
197
- * @returns a transfer object to track status and send to consumers
198
- */
199
- export const getSdkTransfer = (transferSpec: TransferSpec): AsperaSdkTransfer => {
200
- return {
201
- uuid: randomUUID(),
202
- transfer_spec: transferSpec,
203
- current_file: '',
204
- add_time: new Date().toISOString(),
205
- file_counts: {
206
- attempted: 0,
207
- completed: 0,
208
- failed: 0,
209
- skipped: 0,
210
- },
211
- end_time: '',
212
- explorer_path: '',
213
- status: 'queued',
214
- bytes_written: 0,
215
- bytes_expected: 0,
216
- calculated_rate_kbps: 0,
217
- elapsed_usec: 0,
218
- percentage: 0,
219
- title: '',
220
- remaining_usec: 0,
221
- httpGatewayTransfer: true,
222
- httpDownloadExternalHandle: false,
223
- };
224
- };
225
-
226
- /**
227
- * Send a transfer update through the SDK
228
- *
229
- * @param transfer - Transsfer object to send to consumers
230
- */
231
- export const sendTransferUpdate = (transfer: AsperaSdkTransfer): void => {
232
- asperaSdk.httpGatewayTransferStore.set(transfer.uuid, transfer);
233
- asperaSdk.activityTracking.handleTransferActivity({
234
- type: 'transferUpdated',
235
- data: {transfers: [transfer]},
236
- });
237
- };
238
-
239
- /**
240
- * Try to parse and get a useful string from API calls for HTTP Gateway
241
- *
242
- * @param error - Error from API call for Gateway
243
- *
244
- * @returns a string to use for errors
245
- */
246
- export const getMessageFromError = (error: any): {message: string, code: number} => {
247
- const data = safeJsonParse(error);
248
- let message = messages.httpNetworkFail;
249
- let code = 500;
250
-
251
- if (data && typeof data === 'object') {
252
- message = data.message || data.description || messages.httpNetworkFail;
253
- code = data.code || 500;
254
- } else if (error && typeof error === 'object') {
255
- message = error.message || error.description || messages.httpNetworkFail;
256
- code = error.code || 500;
257
- } else if (typeof error === 'string') {
258
- message = error;
259
- }
260
-
261
- return {
262
- message,
263
- code,
264
- };
265
- };
266
-
267
- export const base64Encoding = (jsonString: string): string => {
268
- const bytes = new TextEncoder().encode(jsonString);
269
- const binString = Array.from(bytes, (byte) =>
270
- String.fromCodePoint(byte),
271
- ).join('');
272
- return btoa(binString);
273
- };
@@ -1,217 +0,0 @@
1
- import {AsperaSdkSpec, AsperaSdkTransfer, TransferSpec} from '../models/models';
2
- import {asperaSdk} from '../index';
3
- import {safeJsonString, throwError} from '../helpers/helpers';
4
- import {messages} from '../constants/messages';
5
- import { base64Encoding, getMessageFromError, getSdkTransfer, sendTransferUpdate } from './core';
6
- import {download as oldHttpDownload} from '@ibm-aspera/http-gateway-sdk-js';
7
- import { HttpGatewayPresign } from './models';
8
-
9
- /**
10
- * HTTP Gateway Download Logic for presigned flow
11
- * Presigned flow is when used files are too large or unknown file size
12
- *
13
- * @param transferSpec - TransferSpec for the download
14
- * @param asperaSdkSpec IBM Aspera settings when starting a transfer.
15
- *
16
- * @returns Promise that resolves on success invoke or rejects if unable to start
17
- *
18
- * @remarks
19
- * This function is used internally and not exported.
20
- */
21
- const httpDownloadPresigned = (transferSpec: TransferSpec, asperaSdkSpec?: AsperaSdkSpec): Promise<AsperaSdkTransfer> => {
22
- // create a transfer sdk object
23
- const transferObject = getSdkTransfer(transferSpec);
24
- transferObject.httpDownloadExternalHandle = true;
25
- sendTransferUpdate(transferObject);
26
-
27
- const triggerFailed = (error: any): void => {
28
- const errorData = getMessageFromError(error.response || error);
29
-
30
- transferObject.status = 'failed';
31
- transferObject.error_code = errorData.code;
32
- transferObject.error_desc = errorData.message;
33
- sendTransferUpdate(transferObject);
34
- };
35
-
36
- const url = new URL(asperaSdkSpec?.http_gateway_override_server_url || asperaSdk.globals.httpGatewayUrl);
37
-
38
- const headers: HeadersInit = {
39
- 'Content-Type': 'application/json',
40
- accept: 'application/json',
41
- };
42
-
43
- if (asperaSdkSpec?.http_gateway_authentication) {
44
- headers['Authorization'] = `Bearer ${asperaSdkSpec.http_gateway_authentication.token}`;
45
- headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
46
- }
47
-
48
- const protocol = url.protocol === 'https:' ? 'https' : 'http';
49
-
50
- return fetch(
51
- `${url.toString()}/presign`,
52
- {
53
- method: 'POST',
54
- headers,
55
- body: safeJsonString({
56
- transfer_spec: transferSpec,
57
- method: 'GET',
58
- protocol,
59
- headers: {
60
- host: url.host,
61
- },
62
- }),
63
- },
64
- ).then(response => {
65
- return response.json().then(data => {
66
- return {
67
- headers: response.headers,
68
- body: data as HttpGatewayPresign,
69
- status: response.status,
70
- };
71
- });
72
- }).then(response => {
73
- if (response.status >= 400) {
74
- triggerFailed(response.body);
75
-
76
- return transferObject;
77
- }
78
-
79
- transferObject.httpRequestId = response.headers.get('X-Request-Id');
80
- transferObject.status = 'running';
81
- sendTransferUpdate(transferObject);
82
-
83
- const iframe = document.createElement('iframe');
84
- iframe.src = response.body.signed_url;
85
- iframe.width = '1px';
86
- iframe.height = '1px';
87
-
88
- asperaSdk.globals.httpGatewayIframeContainer.appendChild(iframe);
89
-
90
- return transferObject;
91
- }).catch(error => {
92
- triggerFailed(error);
93
-
94
- return transferObject;
95
- });
96
- };
97
-
98
- /**
99
- * HTTP Gateway Download Logic for in browser download with progress
100
- * This is used when the transfer size is known and under the threshold
101
- *
102
- * @param transferSpec - TransferSpec for the download
103
- * @param asperaSdkSpec IBM Aspera settings when starting a transfer.
104
- *
105
- * @returns Promise that resolves on success invoke or rejects if unable to start
106
- *
107
- * @remarks
108
- * This function is used internally and not exported.
109
- */
110
- const httpDownloadInBrowser = (transferSpec: TransferSpec, asperaSdkSpec?: AsperaSdkSpec): Promise<AsperaSdkTransfer> => {
111
- // create a transfer sdk object
112
- const transferObject = getSdkTransfer(transferSpec);
113
-
114
- const triggerFailed = (error: any): void => {
115
- const errorData = getMessageFromError(error.response || error);
116
-
117
- transferObject.status = 'failed';
118
- transferObject.error_code = errorData.code;
119
- transferObject.error_desc = errorData.message;
120
- sendTransferUpdate(transferObject);
121
- };
122
-
123
- sendTransferUpdate(transferObject);
124
-
125
- const headers: HeadersInit = {
126
- 'X-Aspera-Spec': base64Encoding(safeJsonString(transferSpec)),
127
- };
128
-
129
- if (asperaSdkSpec?.http_gateway_authentication) {
130
- headers['Authorization'] = `Bearer ${asperaSdkSpec.http_gateway_authentication.token}`;
131
- headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
132
- }
133
-
134
- fetch(`${asperaSdkSpec?.http_gateway_override_server_url || asperaSdk.globals.httpGatewayUrl}/download`, {method: 'GET', headers}).then(data => {
135
- const responseHeaders = data.headers;
136
- transferObject.httpRequestId = responseHeaders.get('X-Request-Id');
137
- const chunks: Uint8Array<ArrayBuffer>[] = [];
138
- const reader = data.body.getReader();
139
- transferObject.status = 'running';
140
- sendTransferUpdate(transferObject);
141
-
142
- transferObject.bytes_expected = Number(responseHeaders.get('Content-Length') || 0);
143
-
144
- const readBytes = () => {
145
- reader.read().then(content => {
146
- if (content.done){
147
- if (data.status >= 400 || !transferObject.bytes_written) {
148
- triggerFailed(data.body);
149
-
150
- return;
151
- }
152
-
153
- transferObject.status = 'completed';
154
- sendTransferUpdate(transferObject);
155
- const blobData = new Blob(chunks, {type: responseHeaders.get('Content-Type')});
156
- const objectURL = URL.createObjectURL(blobData);
157
- const a = document.createElement('a');
158
- a.href = objectURL;
159
- a.setAttribute('style', 'display: none;');
160
- a.download = (responseHeaders.get('Content-Disposition') || 'download').replace('attachment; filename="', '').replace('"', '');
161
- document.body.appendChild(a);
162
- a.click();
163
- document.body.removeChild(a);
164
- URL.revokeObjectURL(objectURL);
165
- }else{
166
- chunks.push(content.value);
167
- transferObject.status = 'running';
168
- transferObject.bytes_written += content.value?.length || 0;
169
- transferObject.percentage = (transferObject.bytes_written /transferObject.bytes_expected);
170
- sendTransferUpdate(transferObject);
171
- readBytes();
172
- }
173
- }).catch(error => {
174
- triggerFailed(error);
175
- });
176
- };
177
-
178
- readBytes();
179
- }).catch(error => {
180
- triggerFailed(error);
181
- });
182
-
183
- return Promise.resolve(transferObject);
184
- };
185
-
186
- /**
187
- * HTTP Gateway Download Logic
188
- *
189
- * @param transferSpec - TransferSpec for the download
190
- * @param asperaSdkSpec IBM Aspera settings when starting a transfer.
191
- *
192
- * @returns Promise that resolves on success invoke or rejects if unable to start
193
- *
194
- * @remarks
195
- * Most logic is called directly by Desktop SDK functions
196
- * You may not need to import anything from this file.
197
- */
198
- export const httpDownload = (transferSpec: TransferSpec, asperaSdkSpec?: AsperaSdkSpec): Promise<AsperaSdkTransfer> => {
199
- if (!asperaSdk.httpGatewayIsReady) {
200
- return throwError(messages.serverNotVerified, {type: 'download'});
201
- }
202
-
203
- if (asperaSdk.useOldHttpGateway) {
204
- return oldHttpDownload(transferSpec);
205
- }
206
-
207
- if (
208
- transferSpec.tags &&
209
- transferSpec.tags.aspera &&
210
- transferSpec.tags.aspera['http-gateway'] &&
211
- transferSpec.tags.aspera['http-gateway'].expected_size <= asperaSdk.httpGatewayInBrowserDownloadThreshold
212
- ) {
213
- return httpDownloadInBrowser(transferSpec, asperaSdkSpec);
214
- } else {
215
- return httpDownloadPresigned(transferSpec, asperaSdkSpec);
216
- }
217
- };
@@ -1,19 +0,0 @@
1
- import {httpDownload} from './download';
2
- import {httpUpload} from './upload';
3
- import {handleHttpGatewayDrop, httpGatewaySelectFileFolderDialog, createHtmlInputElement} from './core';
4
-
5
- /**
6
- * HTTP Gateway Exports
7
- *
8
- * @remarks
9
- * Most logic is called directly by Desktop SDK functions
10
- * You may not need to import anything from this file.
11
- */
12
-
13
- export {
14
- httpUpload,
15
- httpDownload,
16
- handleHttpGatewayDrop,
17
- httpGatewaySelectFileFolderDialog,
18
- createHtmlInputElement,
19
- };
@@ -1,20 +0,0 @@
1
- export interface HttpGatewayInfo {
2
- version: string;
3
- name: string;
4
- upload_endpoint: string[];
5
- download_endpoint: string[];
6
- endpoints: string[];
7
- }
8
-
9
- export interface HttpGatewayDownloadLegacy {
10
- transfer_spec_id: string;
11
- url: string;
12
- }
13
-
14
- export type HttpGatewayDownload = ReadableStream<Uint8Array<ArrayBuffer>>;
15
-
16
- export type HttpGatewayUpload = null
17
-
18
- export interface HttpGatewayPresign {
19
- signed_url: string;
20
- }
@@ -1,148 +0,0 @@
1
- import {AsperaSdkSpec, AsperaSdkTransfer, TransferSpec} from '../models/models';
2
- import {asperaSdk} from '../index';
3
- import {generatePromiseObjects, safeJsonString, throwError} from '../helpers/helpers';
4
- import {messages} from '../constants/messages';
5
- import {getMessageFromError, getSdkTransfer, sendTransferUpdate} from './core';
6
- import {upload as oldHttpUpload} from '@ibm-aspera/http-gateway-sdk-js';
7
-
8
- /**
9
- * HTTP Gateway Upload Logic
10
- *
11
- * @param transferSpec - TransferSpec for the upload
12
- * @param asperaSdkSpec IBM Aspera settings when starting a transfer.
13
- *
14
- * @returns Promise that resolves on success invoke or rejects if unable to start
15
- *
16
- * @remarks
17
- * Most logic is called directly by Desktop SDK functions
18
- * You may not need to import anything from this file.
19
- */
20
- export const httpUpload = (transferSpec: TransferSpec, asperaSdkSpec?: AsperaSdkSpec): Promise<AsperaSdkTransfer> => {
21
- if (!asperaSdk.httpGatewayIsReady) {
22
- return throwError(messages.serverNotVerified, {type: 'upload'});
23
- }
24
-
25
- if (asperaSdk.useOldHttpGateway) {
26
- return oldHttpUpload(transferSpec, asperaSdkSpec?.http_gateway_v2_transfer_id || '');
27
- }
28
-
29
- const promiseInfo = generatePromiseObjects();
30
- const request = new XMLHttpRequest();
31
- const body = new FormData();
32
- body.append('x-aspera-spec', safeJsonString(transferSpec));
33
- const hasBadFile: string[] = [];
34
-
35
- transferSpec.paths.forEach(path => {
36
- const foundFile = asperaSdk.httpGatewaySelectedFiles.get(path.source);
37
-
38
- if (foundFile) {
39
- body.append('Content-Length', String(foundFile.size));
40
- body.append('file', foundFile);
41
- } else {
42
- hasBadFile.push(path.source);
43
- }
44
- });
45
-
46
- if (hasBadFile.length) {
47
- return throwError(messages.fileNotAllowed, {type: 'upload', invalidFiles: hasBadFile, transferSpec});
48
- }
49
-
50
- const transferObject = getSdkTransfer(transferSpec);
51
-
52
- if (asperaSdkSpec?.http_gateway_authentication) {
53
- request.setRequestHeader('Authorization', `Bearer ${asperaSdkSpec.http_gateway_authentication.token}`);
54
- request.setRequestHeader('X-Aspera-AccessKey', asperaSdkSpec.http_gateway_authentication.access_key);
55
- }
56
-
57
- request.open('POST', `${asperaSdkSpec?.http_gateway_override_server_url || asperaSdk.globals.httpGatewayUrl}/upload`, true);
58
-
59
- const triggerUpdate = (): void => {
60
- sendTransferUpdate(transferObject);
61
- };
62
-
63
- const triggerFailed = (): void => {
64
- const errorData = getMessageFromError(request.response);
65
- transferObject.httpRequestId = request.getResponseHeader('X-Request-Id');
66
- transferObject.status = 'failed';
67
- transferObject.error_code = errorData.code;
68
- transferObject.error_desc = errorData.message;
69
- triggerUpdate();
70
- };
71
-
72
- request.upload.addEventListener('progress', event => {
73
- if (transferObject.status === 'failed') {
74
- return;
75
- }
76
- transferObject.status = 'running';
77
- transferObject.elapsed_usec = (new Date().getTime() - new Date(transferObject.add_time).getTime()) * 1000;
78
-
79
- if (event.lengthComputable) {
80
- transferObject.bytes_expected = event.total;
81
- transferObject.bytes_written = event.loaded;
82
- transferObject.percentage = (event.loaded / event.total);
83
- }
84
-
85
- triggerUpdate();
86
- });
87
-
88
- request.addEventListener('load', () => {
89
- transferObject.httpRequestId = request.getResponseHeader('X-Request-Id');
90
- });
91
-
92
- request.upload.addEventListener('load', event => {
93
- if (transferObject.status === 'failed') {
94
- return;
95
- }
96
-
97
- transferObject.status = 'completed';
98
- transferObject.elapsed_usec = (new Date().getTime() - new Date(transferObject.add_time).getTime()) * 1000;
99
-
100
- if (event.lengthComputable) {
101
- transferObject.bytes_expected = event.total;
102
- transferObject.bytes_written = event.loaded;
103
- transferObject.percentage = (event.loaded / event.total);
104
- }
105
-
106
- triggerUpdate();
107
- });
108
-
109
- request.upload.addEventListener('loadstart', () => {
110
- if (transferObject.status === 'failed') {
111
- return;
112
- }
113
-
114
- transferObject.status = 'running';
115
- promiseInfo.resolver(transferObject);
116
- triggerUpdate();
117
- });
118
-
119
- request.addEventListener('readystatechange', () => {
120
- if (request.status >= 400) {
121
- triggerFailed();
122
- }
123
- });
124
-
125
- request.upload.addEventListener('error', event => {
126
- triggerFailed();
127
- promiseInfo.rejecter(event);
128
- });
129
-
130
- request.upload.addEventListener('abort', event => {
131
- triggerFailed();
132
- promiseInfo.rejecter(event);
133
- });
134
-
135
- request.addEventListener('error', event => {
136
- triggerFailed();
137
- promiseInfo.rejecter(event);
138
- });
139
-
140
- request.addEventListener('abort', event => {
141
- triggerFailed();
142
- promiseInfo.rejecter(event);
143
- });
144
-
145
- request.send(body);
146
-
147
- return promiseInfo.promise;
148
- };