@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
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpGatewayReadChunkAsArrayBuffer = exports.httpGatewayReadAsArrayBuffer = exports.base64Encoding = exports.getMessageFromError = exports.sendTransferUpdate = exports.getSdkTransfer = exports.httpGatewaySelectFileFolderDialog = exports.handleHttpGatewayDrop = exports.createHtmlInputElement = exports.httpGetTransfer = exports.httpGetAllTransfers = exports.httpRemoveTransfer = void 0;
|
|
4
|
+
var messages_1 = require("../constants/messages");
|
|
5
|
+
var helpers_1 = require("../helpers/helpers");
|
|
6
|
+
var index_1 = require("../index");
|
|
7
|
+
var http_gateway_sdk_js_1 = require("@ibm-aspera/http-gateway-sdk-js");
|
|
8
|
+
// 50MiB which matches the limits in Connect and IBM Aspera for desktop
|
|
9
|
+
var MAX_FILE_SIZE = 50 * 1024 * 1024;
|
|
10
|
+
/**
|
|
11
|
+
* HTTP Gateway Core Logic
|
|
12
|
+
* - File/Folder picking
|
|
13
|
+
* - Starting and testing
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* Most logic is called directly by Desktop SDK functions
|
|
17
|
+
* You may not need to import anything from this file.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Remove a transfer from HTTP Gateway systems
|
|
21
|
+
* @param id - ID of the transfer
|
|
22
|
+
*
|
|
23
|
+
* @returns Promise indicating success
|
|
24
|
+
*/
|
|
25
|
+
var httpRemoveTransfer = function (id) {
|
|
26
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
27
|
+
(0, http_gateway_sdk_js_1.removeTransfer)(id);
|
|
28
|
+
return Promise.resolve({ removed: true });
|
|
29
|
+
}
|
|
30
|
+
var transfer = index_1.asperaSdk.httpGatewayTransferStore.get(id);
|
|
31
|
+
if (transfer) {
|
|
32
|
+
index_1.asperaSdk.httpGatewayTransferStore.delete(id);
|
|
33
|
+
return Promise.resolve({ removed: true });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return Promise.reject((0, helpers_1.generateErrorBody)(messages_1.messages.removeTransferFailed, { reason: 'Not found' }));
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.httpRemoveTransfer = httpRemoveTransfer;
|
|
40
|
+
/**
|
|
41
|
+
* Get the list of http gateway transfers
|
|
42
|
+
*
|
|
43
|
+
* @returns list of HTTP Gateway
|
|
44
|
+
*/
|
|
45
|
+
var httpGetAllTransfers = function () {
|
|
46
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
47
|
+
return (0, http_gateway_sdk_js_1.getAllTransfers)().transfers;
|
|
48
|
+
}
|
|
49
|
+
return Array.from(index_1.asperaSdk.httpGatewayTransferStore.values());
|
|
50
|
+
};
|
|
51
|
+
exports.httpGetAllTransfers = httpGetAllTransfers;
|
|
52
|
+
/**
|
|
53
|
+
* Get a HTTP Gateway transfer by ID
|
|
54
|
+
*
|
|
55
|
+
* @returns a transfer or null
|
|
56
|
+
*/
|
|
57
|
+
var httpGetTransfer = function (id) {
|
|
58
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
59
|
+
return (0, http_gateway_sdk_js_1.getTransferById)(id);
|
|
60
|
+
}
|
|
61
|
+
return index_1.asperaSdk.httpGatewayTransferStore.get(id);
|
|
62
|
+
};
|
|
63
|
+
exports.httpGetTransfer = httpGetTransfer;
|
|
64
|
+
/**
|
|
65
|
+
* Create HTML input element for file picking
|
|
66
|
+
*/
|
|
67
|
+
var createHtmlInputElement = function () {
|
|
68
|
+
var element = window.document.createElement('input');
|
|
69
|
+
element.type = 'file';
|
|
70
|
+
element.style = 'display: none;';
|
|
71
|
+
window.document.body.appendChild(element);
|
|
72
|
+
return element;
|
|
73
|
+
};
|
|
74
|
+
exports.createHtmlInputElement = createHtmlInputElement;
|
|
75
|
+
/**
|
|
76
|
+
* Handle drop events and store files for HTTP Gateway
|
|
77
|
+
* This works on top of desktop.
|
|
78
|
+
*/
|
|
79
|
+
var handleHttpGatewayDrop = function (items, callback, event) {
|
|
80
|
+
var files = [];
|
|
81
|
+
var callbackCount = 0;
|
|
82
|
+
var callbackFinishCount = 0;
|
|
83
|
+
var finalCallback = function () {
|
|
84
|
+
if (callbackFinishCount >= callbackCount) {
|
|
85
|
+
var finalFiles = files.map(function (file) {
|
|
86
|
+
index_1.asperaSdk.httpGatewaySelectedFiles.set(file.name, file);
|
|
87
|
+
return {
|
|
88
|
+
lastModified: file.lastModified,
|
|
89
|
+
name: file.name,
|
|
90
|
+
size: file.size,
|
|
91
|
+
type: file.type
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
callback({ event: event, files: { dataTransfer: { files: finalFiles } } });
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
var traverse = function (item) {
|
|
98
|
+
if (item.isFile) {
|
|
99
|
+
item.file(function (file) {
|
|
100
|
+
files.push(file);
|
|
101
|
+
callbackFinishCount++;
|
|
102
|
+
finalCallback();
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else if (item.isDirectory) {
|
|
106
|
+
var dirReader = item.createReader();
|
|
107
|
+
dirReader.readEntries(function (entries) {
|
|
108
|
+
for (var k = 0; k < entries.length; k++) {
|
|
109
|
+
callbackCount++;
|
|
110
|
+
traverse(entries[k]);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
callbackFinishCount++;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
callbackFinishCount++;
|
|
117
|
+
finalCallback();
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
for (var i = 0; i < items.length; i++) {
|
|
121
|
+
var item = items[i].webkitGetAsEntry();
|
|
122
|
+
if (item) {
|
|
123
|
+
callbackCount++;
|
|
124
|
+
traverse(item);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
exports.handleHttpGatewayDrop = handleHttpGatewayDrop;
|
|
129
|
+
/**
|
|
130
|
+
* Open native browser file or folder picker for files
|
|
131
|
+
*
|
|
132
|
+
* @param options - File picker options
|
|
133
|
+
* @param folder - Indicate if choosing folders
|
|
134
|
+
*
|
|
135
|
+
* @returns Promise that resolves with info about the files picked
|
|
136
|
+
*/
|
|
137
|
+
var httpGatewaySelectFileFolderDialog = function (options, folder) {
|
|
138
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
139
|
+
return (folder ? (0, http_gateway_sdk_js_1.getFoldersForUploadPromise)((options === null || options === void 0 ? void 0 : options.http_gateway_v2_transfer_id) || '') : (0, http_gateway_sdk_js_1.getFilesForUploadPromise)((options === null || options === void 0 ? void 0 : options.http_gateway_v2_transfer_id) || ''));
|
|
140
|
+
}
|
|
141
|
+
var _a = (0, helpers_1.generatePromiseObjects)(), promise = _a.promise, rejecter = _a.rejecter, resolver = _a.resolver;
|
|
142
|
+
var element = (0, exports.createHtmlInputElement)();
|
|
143
|
+
element.multiple = !!(options === null || options === void 0 ? void 0 : options.multiple);
|
|
144
|
+
if (folder) {
|
|
145
|
+
element.webkitdirectory = true;
|
|
146
|
+
}
|
|
147
|
+
element.oncancel = function () {
|
|
148
|
+
rejecter({ debugData: { code: -32002, message: messages_1.messages.filePickerCancel } });
|
|
149
|
+
};
|
|
150
|
+
element.onchange = function () {
|
|
151
|
+
var returnFiles = [];
|
|
152
|
+
for (var i = 0; i < element.files.length; i++) {
|
|
153
|
+
var file = element.files[i];
|
|
154
|
+
returnFiles.push(file);
|
|
155
|
+
index_1.asperaSdk.httpGatewaySelectedFiles.set(file.webkitRelativePath || file.name, file);
|
|
156
|
+
}
|
|
157
|
+
resolver({
|
|
158
|
+
dataTransfer: {
|
|
159
|
+
files: returnFiles.map(function (file) {
|
|
160
|
+
return {
|
|
161
|
+
size: file.size,
|
|
162
|
+
lastModified: file.lastModified,
|
|
163
|
+
name: file.webkitRelativePath || file.name,
|
|
164
|
+
type: file.type,
|
|
165
|
+
};
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
element.click();
|
|
171
|
+
return promise;
|
|
172
|
+
};
|
|
173
|
+
exports.httpGatewaySelectFileFolderDialog = httpGatewaySelectFileFolderDialog;
|
|
174
|
+
/**
|
|
175
|
+
* Get a generic transfer object for HTTP Gateway transfers.
|
|
176
|
+
*
|
|
177
|
+
* @param transferSpec - TransferSpec being provided for the HTTP Gateway transfer
|
|
178
|
+
*
|
|
179
|
+
* @returns a transfer object to track status and send to consumers
|
|
180
|
+
*/
|
|
181
|
+
var getSdkTransfer = function (transferSpec) {
|
|
182
|
+
return {
|
|
183
|
+
uuid: (0, helpers_1.randomUUID)(),
|
|
184
|
+
transfer_spec: transferSpec,
|
|
185
|
+
current_file: '',
|
|
186
|
+
add_time: new Date().toISOString(),
|
|
187
|
+
file_counts: {
|
|
188
|
+
attempted: 0,
|
|
189
|
+
completed: 0,
|
|
190
|
+
failed: 0,
|
|
191
|
+
skipped: 0,
|
|
192
|
+
},
|
|
193
|
+
end_time: '',
|
|
194
|
+
explorer_path: '',
|
|
195
|
+
status: 'queued',
|
|
196
|
+
bytes_written: 0,
|
|
197
|
+
bytes_expected: 0,
|
|
198
|
+
calculated_rate_kbps: 0,
|
|
199
|
+
elapsed_usec: 0,
|
|
200
|
+
percentage: 0,
|
|
201
|
+
title: '',
|
|
202
|
+
remaining_usec: 0,
|
|
203
|
+
httpGatewayTransfer: true,
|
|
204
|
+
httpDownloadExternalHandle: false,
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
exports.getSdkTransfer = getSdkTransfer;
|
|
208
|
+
/**
|
|
209
|
+
* Send a transfer update through the SDK
|
|
210
|
+
*
|
|
211
|
+
* @param transfer - Transsfer object to send to consumers
|
|
212
|
+
*/
|
|
213
|
+
var sendTransferUpdate = function (transfer) {
|
|
214
|
+
index_1.asperaSdk.httpGatewayTransferStore.set(transfer.uuid, transfer);
|
|
215
|
+
index_1.asperaSdk.activityTracking.handleTransferActivity({
|
|
216
|
+
type: 'transferUpdated',
|
|
217
|
+
data: { transfers: [transfer] },
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
exports.sendTransferUpdate = sendTransferUpdate;
|
|
221
|
+
/**
|
|
222
|
+
* Try to parse and get a useful string from API calls for HTTP Gateway
|
|
223
|
+
*
|
|
224
|
+
* @param error - Error from API call for Gateway
|
|
225
|
+
*
|
|
226
|
+
* @returns a string to use for errors
|
|
227
|
+
*/
|
|
228
|
+
var getMessageFromError = function (error) {
|
|
229
|
+
var data = (0, helpers_1.safeJsonParse)(error);
|
|
230
|
+
var message = messages_1.messages.httpNetworkFail;
|
|
231
|
+
var code = 500;
|
|
232
|
+
if (data && typeof data === 'object') {
|
|
233
|
+
message = data.message || data.description || messages_1.messages.httpNetworkFail;
|
|
234
|
+
code = data.code || 500;
|
|
235
|
+
}
|
|
236
|
+
else if (error && typeof error === 'object') {
|
|
237
|
+
message = error.message || error.description || messages_1.messages.httpNetworkFail;
|
|
238
|
+
code = error.code || 500;
|
|
239
|
+
}
|
|
240
|
+
else if (typeof error === 'string') {
|
|
241
|
+
message = error;
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
message: message,
|
|
245
|
+
code: code,
|
|
246
|
+
};
|
|
247
|
+
};
|
|
248
|
+
exports.getMessageFromError = getMessageFromError;
|
|
249
|
+
var base64Encoding = function (jsonString) {
|
|
250
|
+
var bytes = new TextEncoder().encode(jsonString);
|
|
251
|
+
var binString = Array.from(bytes, function (byte) {
|
|
252
|
+
return String.fromCodePoint(byte);
|
|
253
|
+
}).join('');
|
|
254
|
+
return btoa(binString);
|
|
255
|
+
};
|
|
256
|
+
exports.base64Encoding = base64Encoding;
|
|
257
|
+
/**
|
|
258
|
+
* Attempt to read the specified `File` object contents as a base64-encoded string.
|
|
259
|
+
*
|
|
260
|
+
* @param file - File previously selected by the user
|
|
261
|
+
*
|
|
262
|
+
* @returns an object with base64 data and mime type
|
|
263
|
+
*/
|
|
264
|
+
var readFileAsBase64 = function (file) {
|
|
265
|
+
return new Promise(function (resolve, reject) {
|
|
266
|
+
var reader = new FileReader();
|
|
267
|
+
reader.onload = function (event) {
|
|
268
|
+
var _a;
|
|
269
|
+
try {
|
|
270
|
+
var dataUrl = (_a = event.target) === null || _a === void 0 ? void 0 : _a.result;
|
|
271
|
+
if (typeof dataUrl !== 'string') {
|
|
272
|
+
reject((0, helpers_1.generateErrorBody)('FileReader did not return a data URL'));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// Remove `data:*/*;base64,` from the start of the data URL (https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL)
|
|
276
|
+
var base64 = dataUrl.split(';base64,')[1];
|
|
277
|
+
if (base64 === undefined) {
|
|
278
|
+
reject((0, helpers_1.generateErrorBody)('Invalid data URL format'));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
resolve({
|
|
282
|
+
data: base64,
|
|
283
|
+
type: file.type || 'application/octet-stream'
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
catch (err) {
|
|
287
|
+
reject((0, helpers_1.generateErrorBody)('Failed to process file data', err));
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
reader.onerror = function () {
|
|
291
|
+
reject((0, helpers_1.generateErrorBody)('Failed to read file', reader.error));
|
|
292
|
+
};
|
|
293
|
+
reader.readAsDataURL(file);
|
|
294
|
+
});
|
|
295
|
+
};
|
|
296
|
+
/**
|
|
297
|
+
* Returns the specified file's contents as a base64-encoded string.
|
|
298
|
+
*
|
|
299
|
+
* Note: The maximum file size allowed is 50 MiB.
|
|
300
|
+
*
|
|
301
|
+
* @param path path to the file to read
|
|
302
|
+
*
|
|
303
|
+
* @returns a promise that resolves with the file data as a base64-encoded string and mime type
|
|
304
|
+
*/
|
|
305
|
+
var httpGatewayReadAsArrayBuffer = function (path) {
|
|
306
|
+
// Pre-condition: Caller must have previously selected file via `showSelectFileDialog()`
|
|
307
|
+
var file = index_1.asperaSdk.httpGatewaySelectedFiles.get(path);
|
|
308
|
+
if (!file) {
|
|
309
|
+
return (0, helpers_1.throwError)(messages_1.messages.fileNotAllowed);
|
|
310
|
+
}
|
|
311
|
+
if (file.size > MAX_FILE_SIZE) {
|
|
312
|
+
return (0, helpers_1.throwError)('File exceeds allowed maximum');
|
|
313
|
+
}
|
|
314
|
+
return readFileAsBase64(file);
|
|
315
|
+
};
|
|
316
|
+
exports.httpGatewayReadAsArrayBuffer = httpGatewayReadAsArrayBuffer;
|
|
317
|
+
/**
|
|
318
|
+
* Attempt to read the specified `File` object contents as a base64-encoded string.
|
|
319
|
+
*
|
|
320
|
+
* @param file - File previously selected by the user
|
|
321
|
+
* @param offset offset to start reading the file, in bytes
|
|
322
|
+
* @param chunkSize the size of the chunk to read, in bytes
|
|
323
|
+
*
|
|
324
|
+
* @returns an object with base64 data and mime type
|
|
325
|
+
*/
|
|
326
|
+
var readFileChunkAsBase64 = function (file, offset, chunkSize) {
|
|
327
|
+
return new Promise(function (resolve, reject) {
|
|
328
|
+
if (offset > file.size) {
|
|
329
|
+
resolve({ data: '', type: file.type || 'application/octet-stream' });
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
var chunk = file.slice(offset, offset + chunkSize);
|
|
333
|
+
var reader = new FileReader();
|
|
334
|
+
reader.onload = function (event) {
|
|
335
|
+
var _a;
|
|
336
|
+
try {
|
|
337
|
+
var dataUrl = (_a = event.target) === null || _a === void 0 ? void 0 : _a.result;
|
|
338
|
+
if (typeof dataUrl !== 'string') {
|
|
339
|
+
reject((0, helpers_1.generateErrorBody)('FileReader did not return a data URL'));
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
// Remove `data:*/*;base64,` from the start of the data URL (https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL)
|
|
343
|
+
var base64 = dataUrl.split(';base64,')[1];
|
|
344
|
+
if (base64 === undefined) {
|
|
345
|
+
reject((0, helpers_1.generateErrorBody)('Invalid data URL format'));
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
resolve({
|
|
349
|
+
data: base64,
|
|
350
|
+
type: file.type || 'application/octet-stream'
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
reject((0, helpers_1.generateErrorBody)('Failed to process file data', err));
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
reader.onerror = function () {
|
|
358
|
+
reject((0, helpers_1.generateErrorBody)('Failed to read file', reader.error));
|
|
359
|
+
};
|
|
360
|
+
reader.readAsDataURL(chunk);
|
|
361
|
+
});
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* Read a chunk of a file as a base64-encoded string.
|
|
365
|
+
*
|
|
366
|
+
* Note: The maximum chunk size allowed is 50 MiB.
|
|
367
|
+
*
|
|
368
|
+
* @param path path to the file to read. For pure JS this will just be the filename.
|
|
369
|
+
* @param offset offset to start reading the file, in bytes
|
|
370
|
+
* @param chunkSize the size of the chunk to read, in bytes
|
|
371
|
+
*
|
|
372
|
+
* @returns a promise that resolves with the file chunk data as a base64-encoded string and mime type
|
|
373
|
+
*/
|
|
374
|
+
var httpGatewayReadChunkAsArrayBuffer = function (path, offset, chunkSize) {
|
|
375
|
+
if (offset < 0 || chunkSize <= 0) {
|
|
376
|
+
return (0, helpers_1.throwError)('Invalid offset or chunk size');
|
|
377
|
+
}
|
|
378
|
+
// Pre-condition: Caller must have previously selected file via `showSelectFileDialog()`
|
|
379
|
+
var file = index_1.asperaSdk.httpGatewaySelectedFiles.get(path);
|
|
380
|
+
if (!file) {
|
|
381
|
+
return (0, helpers_1.throwError)(messages_1.messages.fileNotAllowed);
|
|
382
|
+
}
|
|
383
|
+
if (chunkSize > MAX_FILE_SIZE) {
|
|
384
|
+
return (0, helpers_1.throwError)('Chunk size exceeds allowed maximum');
|
|
385
|
+
}
|
|
386
|
+
return readFileChunkAsBase64(file, offset, chunkSize);
|
|
387
|
+
};
|
|
388
|
+
exports.httpGatewayReadChunkAsArrayBuffer = httpGatewayReadChunkAsArrayBuffer;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AsperaSdkSpec, AsperaSdkTransfer, TransferSpec } from '../models/models';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Gateway Download Logic
|
|
4
|
+
*
|
|
5
|
+
* @param transferSpec - TransferSpec for the download
|
|
6
|
+
* @param asperaSdkSpec IBM Aspera settings when starting a transfer.
|
|
7
|
+
*
|
|
8
|
+
* @returns Promise that resolves on success invoke or rejects if unable to start
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* Most logic is called directly by Desktop SDK functions
|
|
12
|
+
* You may not need to import anything from this file.
|
|
13
|
+
*/
|
|
14
|
+
export declare const httpDownload: (transferSpec: TransferSpec, asperaSdkSpec?: AsperaSdkSpec) => Promise<AsperaSdkTransfer>;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpDownload = void 0;
|
|
4
|
+
var index_1 = require("../index");
|
|
5
|
+
var helpers_1 = require("../helpers/helpers");
|
|
6
|
+
var messages_1 = require("../constants/messages");
|
|
7
|
+
var core_1 = require("./core");
|
|
8
|
+
var http_gateway_sdk_js_1 = require("@ibm-aspera/http-gateway-sdk-js");
|
|
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
|
+
var httpDownloadPresigned = function (transferSpec, asperaSdkSpec) {
|
|
22
|
+
// create a transfer sdk object
|
|
23
|
+
var transferObject = (0, core_1.getSdkTransfer)(transferSpec);
|
|
24
|
+
transferObject.httpDownloadExternalHandle = true;
|
|
25
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
26
|
+
var triggerFailed = function (error) {
|
|
27
|
+
var errorData = (0, core_1.getMessageFromError)(error.response || error);
|
|
28
|
+
transferObject.status = 'failed';
|
|
29
|
+
transferObject.error_code = errorData.code;
|
|
30
|
+
transferObject.error_desc = errorData.message;
|
|
31
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
32
|
+
};
|
|
33
|
+
var url = new URL((asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_override_server_url) || index_1.asperaSdk.globals.httpGatewayUrl);
|
|
34
|
+
var headers = {
|
|
35
|
+
'Content-Type': 'application/json',
|
|
36
|
+
accept: 'application/json',
|
|
37
|
+
};
|
|
38
|
+
if (asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_authentication) {
|
|
39
|
+
headers['Authorization'] = "Bearer ".concat(asperaSdkSpec.http_gateway_authentication.token);
|
|
40
|
+
headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
|
|
41
|
+
}
|
|
42
|
+
var protocol = url.protocol === 'https:' ? 'https' : 'http';
|
|
43
|
+
return fetch("".concat(url.toString(), "/presign"), {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: headers,
|
|
46
|
+
body: (0, helpers_1.safeJsonString)({
|
|
47
|
+
transfer_spec: transferSpec,
|
|
48
|
+
method: 'GET',
|
|
49
|
+
protocol: protocol,
|
|
50
|
+
headers: {
|
|
51
|
+
host: url.host,
|
|
52
|
+
},
|
|
53
|
+
}),
|
|
54
|
+
}).then(function (response) {
|
|
55
|
+
return response.json().then(function (data) {
|
|
56
|
+
return {
|
|
57
|
+
headers: response.headers,
|
|
58
|
+
body: data,
|
|
59
|
+
status: response.status,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
}).then(function (response) {
|
|
63
|
+
if (response.status >= 400) {
|
|
64
|
+
triggerFailed(response.body);
|
|
65
|
+
return transferObject;
|
|
66
|
+
}
|
|
67
|
+
transferObject.httpRequestId = response.headers.get('X-Request-Id');
|
|
68
|
+
transferObject.status = 'running';
|
|
69
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
70
|
+
var iframe = document.createElement('iframe');
|
|
71
|
+
iframe.src = response.body.signed_url;
|
|
72
|
+
iframe.width = '1px';
|
|
73
|
+
iframe.height = '1px';
|
|
74
|
+
index_1.asperaSdk.globals.httpGatewayIframeContainer.appendChild(iframe);
|
|
75
|
+
return transferObject;
|
|
76
|
+
}).catch(function (error) {
|
|
77
|
+
triggerFailed(error);
|
|
78
|
+
return transferObject;
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* HTTP Gateway Download Logic for in browser download with progress
|
|
83
|
+
* This is used when the transfer size is known and under the threshold
|
|
84
|
+
*
|
|
85
|
+
* @param transferSpec - TransferSpec for the download
|
|
86
|
+
* @param asperaSdkSpec IBM Aspera settings when starting a transfer.
|
|
87
|
+
*
|
|
88
|
+
* @returns Promise that resolves on success invoke or rejects if unable to start
|
|
89
|
+
*
|
|
90
|
+
* @remarks
|
|
91
|
+
* This function is used internally and not exported.
|
|
92
|
+
*/
|
|
93
|
+
var httpDownloadInBrowser = function (transferSpec, asperaSdkSpec) {
|
|
94
|
+
// create a transfer sdk object
|
|
95
|
+
var transferObject = (0, core_1.getSdkTransfer)(transferSpec);
|
|
96
|
+
var triggerFailed = function (error) {
|
|
97
|
+
var errorData = (0, core_1.getMessageFromError)(error.response || error);
|
|
98
|
+
transferObject.status = 'failed';
|
|
99
|
+
transferObject.error_code = errorData.code;
|
|
100
|
+
transferObject.error_desc = errorData.message;
|
|
101
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
102
|
+
};
|
|
103
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
104
|
+
var headers = {
|
|
105
|
+
'X-Aspera-Spec': (0, core_1.base64Encoding)((0, helpers_1.safeJsonString)(transferSpec)),
|
|
106
|
+
};
|
|
107
|
+
if (asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_authentication) {
|
|
108
|
+
headers['Authorization'] = "Bearer ".concat(asperaSdkSpec.http_gateway_authentication.token);
|
|
109
|
+
headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
|
|
110
|
+
}
|
|
111
|
+
fetch("".concat((asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_override_server_url) || index_1.asperaSdk.globals.httpGatewayUrl, "/download"), { method: 'GET', headers: headers }).then(function (data) {
|
|
112
|
+
var responseHeaders = data.headers;
|
|
113
|
+
transferObject.httpRequestId = responseHeaders.get('X-Request-Id');
|
|
114
|
+
var chunks = [];
|
|
115
|
+
var reader = data.body.getReader();
|
|
116
|
+
transferObject.status = 'running';
|
|
117
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
118
|
+
transferObject.bytes_expected = Number(responseHeaders.get('Content-Length') || 0);
|
|
119
|
+
var readBytes = function () {
|
|
120
|
+
reader.read().then(function (content) {
|
|
121
|
+
var _a;
|
|
122
|
+
if (content.done) {
|
|
123
|
+
if (data.status >= 400 || !transferObject.bytes_written) {
|
|
124
|
+
triggerFailed(data.body);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
transferObject.status = 'completed';
|
|
128
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
129
|
+
var blobData = new Blob(chunks, { type: responseHeaders.get('Content-Type') });
|
|
130
|
+
var objectURL = URL.createObjectURL(blobData);
|
|
131
|
+
var a = document.createElement('a');
|
|
132
|
+
a.href = objectURL;
|
|
133
|
+
a.setAttribute('style', 'display: none;');
|
|
134
|
+
a.download = (responseHeaders.get('Content-Disposition') || 'download').replace('attachment; filename="', '').replace('"', '');
|
|
135
|
+
document.body.appendChild(a);
|
|
136
|
+
a.click();
|
|
137
|
+
document.body.removeChild(a);
|
|
138
|
+
URL.revokeObjectURL(objectURL);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
chunks.push(content.value);
|
|
142
|
+
transferObject.status = 'running';
|
|
143
|
+
transferObject.bytes_written += ((_a = content.value) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
144
|
+
transferObject.percentage = (transferObject.bytes_written / transferObject.bytes_expected);
|
|
145
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
146
|
+
readBytes();
|
|
147
|
+
}
|
|
148
|
+
}).catch(function (error) {
|
|
149
|
+
triggerFailed(error);
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
readBytes();
|
|
153
|
+
}).catch(function (error) {
|
|
154
|
+
triggerFailed(error);
|
|
155
|
+
});
|
|
156
|
+
return Promise.resolve(transferObject);
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* HTTP Gateway Download Logic
|
|
160
|
+
*
|
|
161
|
+
* @param transferSpec - TransferSpec for the download
|
|
162
|
+
* @param asperaSdkSpec IBM Aspera settings when starting a transfer.
|
|
163
|
+
*
|
|
164
|
+
* @returns Promise that resolves on success invoke or rejects if unable to start
|
|
165
|
+
*
|
|
166
|
+
* @remarks
|
|
167
|
+
* Most logic is called directly by Desktop SDK functions
|
|
168
|
+
* You may not need to import anything from this file.
|
|
169
|
+
*/
|
|
170
|
+
var httpDownload = function (transferSpec, asperaSdkSpec) {
|
|
171
|
+
if (!index_1.asperaSdk.httpGatewayIsReady) {
|
|
172
|
+
return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified, { type: 'download' });
|
|
173
|
+
}
|
|
174
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
175
|
+
return (0, http_gateway_sdk_js_1.download)(transferSpec);
|
|
176
|
+
}
|
|
177
|
+
if (transferSpec.tags &&
|
|
178
|
+
transferSpec.tags.aspera &&
|
|
179
|
+
transferSpec.tags.aspera['http-gateway'] &&
|
|
180
|
+
transferSpec.tags.aspera['http-gateway'].expected_size <= index_1.asperaSdk.httpGatewayInBrowserDownloadThreshold) {
|
|
181
|
+
return httpDownloadInBrowser(transferSpec, asperaSdkSpec);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
return httpDownloadPresigned(transferSpec, asperaSdkSpec);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
exports.httpDownload = httpDownload;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { httpDownload } from './download';
|
|
2
|
+
import { httpUpload } from './upload';
|
|
3
|
+
import { handleHttpGatewayDrop, httpGatewaySelectFileFolderDialog, createHtmlInputElement } from './core';
|
|
4
|
+
/**
|
|
5
|
+
* HTTP Gateway Exports
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* Most logic is called directly by Desktop SDK functions
|
|
9
|
+
* You may not need to import anything from this file.
|
|
10
|
+
*/
|
|
11
|
+
export { httpUpload, httpDownload, handleHttpGatewayDrop, httpGatewaySelectFileFolderDialog, createHtmlInputElement, };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createHtmlInputElement = exports.httpGatewaySelectFileFolderDialog = exports.handleHttpGatewayDrop = exports.httpDownload = exports.httpUpload = void 0;
|
|
4
|
+
var download_1 = require("./download");
|
|
5
|
+
Object.defineProperty(exports, "httpDownload", { enumerable: true, get: function () { return download_1.httpDownload; } });
|
|
6
|
+
var upload_1 = require("./upload");
|
|
7
|
+
Object.defineProperty(exports, "httpUpload", { enumerable: true, get: function () { return upload_1.httpUpload; } });
|
|
8
|
+
var core_1 = require("./core");
|
|
9
|
+
Object.defineProperty(exports, "handleHttpGatewayDrop", { enumerable: true, get: function () { return core_1.handleHttpGatewayDrop; } });
|
|
10
|
+
Object.defineProperty(exports, "httpGatewaySelectFileFolderDialog", { enumerable: true, get: function () { return core_1.httpGatewaySelectFileFolderDialog; } });
|
|
11
|
+
Object.defineProperty(exports, "createHtmlInputElement", { enumerable: true, get: function () { return core_1.createHtmlInputElement; } });
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface HttpGatewayInfo {
|
|
2
|
+
version: string;
|
|
3
|
+
name: string;
|
|
4
|
+
upload_endpoint: string[];
|
|
5
|
+
download_endpoint: string[];
|
|
6
|
+
endpoints: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface HttpGatewayDownloadLegacy {
|
|
9
|
+
transfer_spec_id: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
export type HttpGatewayDownload = ReadableStream<Uint8Array<ArrayBuffer>>;
|
|
13
|
+
export type HttpGatewayUpload = null;
|
|
14
|
+
export interface HttpGatewayPresign {
|
|
15
|
+
signed_url: string;
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AsperaSdkSpec, AsperaSdkTransfer, TransferSpec } from '../models/models';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Gateway Upload Logic
|
|
4
|
+
*
|
|
5
|
+
* @param transferSpec - TransferSpec for the upload
|
|
6
|
+
* @param asperaSdkSpec IBM Aspera settings when starting a transfer.
|
|
7
|
+
*
|
|
8
|
+
* @returns Promise that resolves on success invoke or rejects if unable to start
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* Most logic is called directly by Desktop SDK functions
|
|
12
|
+
* You may not need to import anything from this file.
|
|
13
|
+
*/
|
|
14
|
+
export declare const httpUpload: (transferSpec: TransferSpec, asperaSdkSpec?: AsperaSdkSpec) => Promise<AsperaSdkTransfer>;
|