@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
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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>;