@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.
- package/README.md +17 -13
- package/dist/commonjs/app/core.d.ts +234 -0
- package/dist/commonjs/app/core.js +812 -0
- package/dist/commonjs/app/installer.d.ts +9 -0
- package/dist/commonjs/app/installer.js +50 -0
- package/dist/commonjs/connect/core.d.ts +11 -0
- package/dist/commonjs/connect/core.js +73 -0
- package/dist/commonjs/constants/constants.d.ts +8 -0
- package/dist/commonjs/constants/constants.js +11 -0
- package/dist/commonjs/constants/messages.d.ts +38 -0
- package/dist/commonjs/constants/messages.js +41 -0
- package/dist/commonjs/helpers/client/client.d.ts +5 -0
- package/dist/commonjs/helpers/client/client.js +7 -0
- package/dist/commonjs/helpers/client/http-client.d.ts +42 -0
- package/dist/commonjs/helpers/client/http-client.js +84 -0
- package/dist/commonjs/helpers/client/safari-client.d.ts +101 -0
- package/dist/commonjs/helpers/client/safari-client.js +264 -0
- package/dist/commonjs/helpers/helpers.d.ts +109 -0
- package/dist/commonjs/helpers/helpers.js +249 -0
- package/dist/commonjs/helpers/http.d.ts +16 -0
- package/dist/commonjs/helpers/http.js +42 -0
- package/dist/commonjs/helpers/ws.d.ts +62 -0
- package/dist/commonjs/helpers/ws.js +161 -0
- package/dist/commonjs/http-gateway/core.d.ts +98 -0
- package/dist/commonjs/http-gateway/core.js +388 -0
- package/dist/commonjs/http-gateway/download.d.ts +14 -0
- package/dist/commonjs/http-gateway/download.js +187 -0
- package/dist/commonjs/http-gateway/index.d.ts +11 -0
- package/dist/commonjs/http-gateway/index.js +11 -0
- package/dist/commonjs/http-gateway/models.d.ts +16 -0
- package/dist/commonjs/http-gateway/models.js +2 -0
- package/dist/commonjs/http-gateway/upload.d.ts +14 -0
- package/dist/commonjs/http-gateway/upload.js +124 -0
- package/dist/commonjs/index.d.ts +12 -0
- package/dist/commonjs/index.js +109 -0
- package/dist/commonjs/models/aspera-sdk.model.d.ts +259 -0
- package/dist/commonjs/models/aspera-sdk.model.js +349 -0
- package/dist/commonjs/models/models.d.ts +760 -0
- package/dist/commonjs/models/models.js +2 -0
- package/dist/js/aspera-sdk.js +3 -0
- package/dist/js/aspera-sdk.js.LICENSE.txt +15 -0
- package/dist/js/aspera-sdk.js.map +1 -0
- package/package.json +8 -5
- package/.editorconfig +0 -13
- package/.github/CODEOWNERS +0 -1
- package/.github/CODE_OF_CONDUCT.md +0 -128
- package/.github/CONTRIBUTING.md +0 -147
- package/.github/dependabot.yml +0 -10
- package/.github/workflows/ci.yml +0 -39
- package/.github/workflows/documentation.yml +0 -44
- package/.github/workflows/publish.yml +0 -23
- package/.github/workflows/version.yml +0 -32
- package/.whitesource +0 -3
- package/CHANGELOG.md +0 -204
- package/docs/DEVELOPMENT.md +0 -38
- package/eslint.config.js +0 -104
- package/example/README.md +0 -7
- package/example/index.html +0 -14
- package/example/package-lock.json +0 -2989
- package/example/package.json +0 -30
- package/example/public/404.html +0 -5
- package/example/public/sdk-code.js +0 -326
- package/example/src/App/App.scss +0 -40
- package/example/src/App/index.tsx +0 -196
- package/example/src/Views/AllTogether.tsx +0 -26
- package/example/src/Views/DragDrop.tsx +0 -23
- package/example/src/Views/Home.tsx +0 -10
- package/example/src/Views/Initialize.tsx +0 -31
- package/example/src/Views/Installer.tsx +0 -154
- package/example/src/Views/MonitorTransfers.tsx +0 -88
- package/example/src/Views/Other.tsx +0 -24
- package/example/src/Views/SelectItems.tsx +0 -46
- package/example/src/Views/StartTransfer.tsx +0 -37
- package/example/src/Views/Test.tsx +0 -20
- package/example/src/Views/Views.scss +0 -111
- package/example/src/helpers/index.ts +0 -19
- package/example/src/index.scss +0 -47
- package/example/src/main.tsx +0 -17
- package/example/src/vite-env.d.ts +0 -2
- package/example/tsconfig.json +0 -30
- package/example/vite.config.ts +0 -23
- package/jest.config.js +0 -19
- package/jest.setup.js +0 -0
- package/renovate.json +0 -12
- package/src/app/core.ts +0 -765
- package/src/app/installer.ts +0 -53
- package/src/connect/core.ts +0 -83
- package/src/constants/constants.ts +0 -19
- package/src/constants/messages.ts +0 -35
- package/src/helpers/client/client.ts +0 -11
- package/src/helpers/client/http-client.ts +0 -92
- package/src/helpers/client/safari-client.ts +0 -334
- package/src/helpers/helpers.ts +0 -253
- package/src/helpers/http.ts +0 -39
- package/src/helpers/ws.ts +0 -191
- package/src/http-gateway/core.ts +0 -273
- package/src/http-gateway/download.ts +0 -217
- package/src/http-gateway/index.ts +0 -19
- package/src/http-gateway/models.ts +0 -20
- package/src/http-gateway/upload.ts +0 -148
- package/src/index.ts +0 -72
- package/src/models/aspera-sdk.model.ts +0 -446
- package/src/models/models.ts +0 -740
- package/tests/client.spec.ts +0 -52
- package/tests/core.spec.ts +0 -13
- package/tests/helpers.spec.ts +0 -127
- package/tests/http.spec.ts +0 -14
- package/tests/installer.spec.ts +0 -135
- package/tests/mocks.ts +0 -11
- package/tsconfig.json +0 -14
- package/tsconfig.module.json +0 -16
- package/typedoc.js +0 -7
- package/webpack.config.js +0 -35
package/src/http-gateway/core.ts
DELETED
|
@@ -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
|
-
};
|