@ibm-aspera/sdk 0.2.8 → 0.2.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/.whitesource +3 -0
- package/README.md +1 -1
- package/dist/commonjs/app/core.d.ts +8 -37
- package/dist/commonjs/app/core.js +198 -70
- package/dist/commonjs/connect/core.d.ts +11 -0
- package/dist/commonjs/connect/core.js +73 -0
- package/dist/commonjs/constants/constants.d.ts +1 -1
- package/dist/commonjs/constants/messages.d.ts +5 -0
- package/dist/commonjs/constants/messages.js +5 -0
- package/dist/commonjs/helpers/client/http-client.js +1 -1
- package/dist/commonjs/helpers/client/safari-client.js +1 -1
- package/dist/commonjs/helpers/helpers.d.ts +20 -2
- package/dist/commonjs/helpers/helpers.js +40 -2
- package/dist/commonjs/helpers/ws.js +3 -9
- package/dist/commonjs/http-gateway/core.d.ts +76 -0
- package/dist/commonjs/http-gateway/core.js +254 -0
- package/dist/commonjs/http-gateway/download.d.ts +14 -0
- package/dist/commonjs/http-gateway/download.js +186 -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 +2 -2
- package/dist/commonjs/index.js +36 -9
- package/dist/commonjs/models/aspera-sdk.model.d.ts +60 -47
- package/dist/commonjs/models/aspera-sdk.model.js +84 -92
- package/dist/commonjs/models/models.d.ts +69 -3
- package/dist/js/aspera-sdk.js +1 -1
- package/dist/js/aspera-sdk.js.LICENSE.txt +9 -1
- package/dist/js/aspera-sdk.js.map +1 -1
- package/package.json +23 -27
- package/scripts/version.sh +24 -0
|
@@ -120,7 +120,7 @@ var SafariClient = /** @class */ (function () {
|
|
|
120
120
|
}
|
|
121
121
|
else {
|
|
122
122
|
console.warn('The Safari extension is disabled or unresponsive (dispatch event)');
|
|
123
|
-
console.warn("Failed event: ".concat(
|
|
123
|
+
console.warn("Failed event: ".concat((0, helpers_1.safeJsonString)(request)));
|
|
124
124
|
reject('The Safari extension is disabled or unresponsive (dispatch event)');
|
|
125
125
|
}
|
|
126
126
|
});
|
|
@@ -40,7 +40,7 @@ export declare const getWebsocketUrl: (serverUrl: string) => string;
|
|
|
40
40
|
*
|
|
41
41
|
* @returns a string indicating the current platform
|
|
42
42
|
*/
|
|
43
|
-
export declare const getCurrentPlatform: () =>
|
|
43
|
+
export declare const getCurrentPlatform: () => "macos" | "windows" | "linux" | "unknown";
|
|
44
44
|
/**
|
|
45
45
|
* Function used to create a random UUID
|
|
46
46
|
*
|
|
@@ -75,11 +75,27 @@ export declare const isSafari: () => boolean;
|
|
|
75
75
|
* @returns Info on URLs where installers live
|
|
76
76
|
*/
|
|
77
77
|
export declare const getInstallerUrls: () => InstallerUrlInfo;
|
|
78
|
+
/**
|
|
79
|
+
* Try to stringify a JSON string and log failures
|
|
80
|
+
*
|
|
81
|
+
* @param json - Object to make into a string
|
|
82
|
+
*
|
|
83
|
+
* @returns string representing JSON or empty string on error
|
|
84
|
+
*/
|
|
85
|
+
export declare const safeJsonString: (json: unknown) => string;
|
|
86
|
+
/**
|
|
87
|
+
* Try to parse a JSON string and log failures
|
|
88
|
+
*
|
|
89
|
+
* @param json - String to make into an object
|
|
90
|
+
*
|
|
91
|
+
* @returns object or array from the JSON string. Or undefined
|
|
92
|
+
*/
|
|
93
|
+
export declare const safeJsonParse: (json: string) => any | undefined;
|
|
78
94
|
declare const _default: {
|
|
79
95
|
errorLog: (message: string, debugData?: any) => void;
|
|
80
96
|
generateErrorBody: (message: string, debugData?: any) => ErrorResponse;
|
|
81
97
|
generatePromiseObjects: () => PromiseObject;
|
|
82
|
-
getCurrentPlatform: () => "
|
|
98
|
+
getCurrentPlatform: () => "macos" | "windows" | "linux" | "unknown";
|
|
83
99
|
getWebsocketUrl: (serverUrl: string) => string;
|
|
84
100
|
isSafari: () => boolean;
|
|
85
101
|
isValidURL: (url: string) => boolean;
|
|
@@ -87,5 +103,7 @@ declare const _default: {
|
|
|
87
103
|
randomUUID: () => string;
|
|
88
104
|
throwError: (message: string, debugData?: any) => Promise<any>;
|
|
89
105
|
getInstallerUrls: () => InstallerUrlInfo;
|
|
106
|
+
safeJsonString: (json: unknown) => string;
|
|
107
|
+
safeJsonParse: (json: string) => any | undefined;
|
|
90
108
|
};
|
|
91
109
|
export default _default;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getInstallerUrls = exports.isSafari = exports.isValidURL = exports.throwError = exports.randomUUID = exports.getCurrentPlatform = exports.getWebsocketUrl = exports.isValidTransferSpec = exports.generateErrorBody = exports.errorLog = exports.generatePromiseObjects = void 0;
|
|
3
|
+
exports.safeJsonParse = exports.safeJsonString = exports.getInstallerUrls = exports.isSafari = exports.isValidURL = exports.throwError = exports.randomUUID = exports.getCurrentPlatform = exports.getWebsocketUrl = exports.isValidTransferSpec = exports.generateErrorBody = exports.errorLog = exports.generatePromiseObjects = void 0;
|
|
4
4
|
var constants_1 = require("../constants/constants");
|
|
5
5
|
/**
|
|
6
6
|
* Generates promise object that can be resolved or rejected via functions
|
|
@@ -180,7 +180,6 @@ exports.isValidURL = isValidURL;
|
|
|
180
180
|
* @returns {boolean} Whether the browser is Safari.
|
|
181
181
|
*/
|
|
182
182
|
var isSafari = function () {
|
|
183
|
-
// eslint-disable-next-line
|
|
184
183
|
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && !window.MSStream;
|
|
185
184
|
};
|
|
186
185
|
exports.isSafari = isSafari;
|
|
@@ -196,6 +195,43 @@ var getInstallerUrls = function () {
|
|
|
196
195
|
};
|
|
197
196
|
};
|
|
198
197
|
exports.getInstallerUrls = getInstallerUrls;
|
|
198
|
+
/**
|
|
199
|
+
* Try to stringify a JSON string and log failures
|
|
200
|
+
*
|
|
201
|
+
* @param json - Object to make into a string
|
|
202
|
+
*
|
|
203
|
+
* @returns string representing JSON or empty string on error
|
|
204
|
+
*/
|
|
205
|
+
var safeJsonString = function (json) {
|
|
206
|
+
try {
|
|
207
|
+
return JSON.stringify(json);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
(0, exports.errorLog)('safeJsonString: unable to stringify JSON', { error: error, json: json });
|
|
211
|
+
return '';
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
exports.safeJsonString = safeJsonString;
|
|
215
|
+
/**
|
|
216
|
+
* Try to parse a JSON string and log failures
|
|
217
|
+
*
|
|
218
|
+
* @param json - String to make into an object
|
|
219
|
+
*
|
|
220
|
+
* @returns object or array from the JSON string. Or undefined
|
|
221
|
+
*/
|
|
222
|
+
var safeJsonParse = function (json) {
|
|
223
|
+
if (json && typeof json === 'object') {
|
|
224
|
+
return json;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
return JSON.parse(json);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
(0, exports.errorLog)('safeJsonParse: unable to parse JSON', { error: error, json: json });
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
exports.safeJsonParse = safeJsonParse;
|
|
199
235
|
exports.default = {
|
|
200
236
|
errorLog: exports.errorLog,
|
|
201
237
|
generateErrorBody: exports.generateErrorBody,
|
|
@@ -208,4 +244,6 @@ exports.default = {
|
|
|
208
244
|
randomUUID: exports.randomUUID,
|
|
209
245
|
throwError: exports.throwError,
|
|
210
246
|
getInstallerUrls: exports.getInstallerUrls,
|
|
247
|
+
safeJsonString: exports.safeJsonString,
|
|
248
|
+
safeJsonParse: exports.safeJsonParse,
|
|
211
249
|
};
|
|
@@ -48,20 +48,14 @@ var WebsocketService = /** @class */ (function () {
|
|
|
48
48
|
* This function handles messages received from the websocket
|
|
49
49
|
*/
|
|
50
50
|
this.handleMessage = function (message) {
|
|
51
|
-
var data;
|
|
52
|
-
try {
|
|
53
|
-
data = JSON.parse(message.data);
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
(0, helpers_1.errorLog)('Unable to parse Websocket message', { error: error, message: message });
|
|
57
|
-
}
|
|
51
|
+
var data = (0, helpers_1.safeJsonParse)(message.data);
|
|
58
52
|
// Message we get on subscription
|
|
59
53
|
if (data && data.id === 1) {
|
|
60
54
|
_this.initPromise.resolver(data);
|
|
61
55
|
return;
|
|
62
56
|
}
|
|
63
57
|
var socket = _this.sockets.get(data.method);
|
|
64
|
-
if (socket && data.params) {
|
|
58
|
+
if (typeof socket === 'function' && data.params) {
|
|
65
59
|
socket(data.params);
|
|
66
60
|
}
|
|
67
61
|
};
|
|
@@ -78,7 +72,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
78
72
|
this.handleNotReady();
|
|
79
73
|
return false;
|
|
80
74
|
}
|
|
81
|
-
this.globalSocket.send(
|
|
75
|
+
this.globalSocket.send((0, helpers_1.safeJsonString)({ jsonrpc: '2.0', method: 'subscribe_transfer_activity', params: [index_1.asperaSdk.globals.appId], id: 1 }));
|
|
82
76
|
return true;
|
|
83
77
|
};
|
|
84
78
|
/**
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { FileDialogOptions, DataTransferResponse, TransferSpec, AsperaSdkTransfer } from '../models/models';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Gateway Core Logic
|
|
4
|
+
* - File/Folder picking
|
|
5
|
+
* - Starting and testing
|
|
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
|
+
/**
|
|
12
|
+
* Remove a transfer from HTTP Gateway systems
|
|
13
|
+
* @param id - ID of the transfer
|
|
14
|
+
*
|
|
15
|
+
* @returns Promise indicating success
|
|
16
|
+
*/
|
|
17
|
+
export declare const httpRemoveTransfer: (id: string) => Promise<any>;
|
|
18
|
+
/**
|
|
19
|
+
* Get the list of http gateway transfers
|
|
20
|
+
*
|
|
21
|
+
* @returns list of HTTP Gateway
|
|
22
|
+
*/
|
|
23
|
+
export declare const httpGetAllTransfers: () => AsperaSdkTransfer[];
|
|
24
|
+
/**
|
|
25
|
+
* Get a HTTP Gateway transfer by ID
|
|
26
|
+
*
|
|
27
|
+
* @returns a transfer or null
|
|
28
|
+
*/
|
|
29
|
+
export declare const httpGetTransfer: (id: string) => AsperaSdkTransfer | null;
|
|
30
|
+
/**
|
|
31
|
+
* Create HTML input element for file picking
|
|
32
|
+
*/
|
|
33
|
+
export declare const createHtmlInputElement: () => HTMLInputElement;
|
|
34
|
+
/**
|
|
35
|
+
* Handle drop events and store files for HTTP Gateway
|
|
36
|
+
* This works on top of desktop.
|
|
37
|
+
*/
|
|
38
|
+
export declare const handleHttpGatewayDrop: (items: DataTransferItemList, callback: (data: {
|
|
39
|
+
event: DragEvent;
|
|
40
|
+
files: DataTransferResponse;
|
|
41
|
+
}) => void, event: DragEvent) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Open native browser file or folder picker for files
|
|
44
|
+
*
|
|
45
|
+
* @param options - File picker options
|
|
46
|
+
* @param folder - Indicate if choosing folders
|
|
47
|
+
*
|
|
48
|
+
* @returns Promise that resolves with info about the files picked
|
|
49
|
+
*/
|
|
50
|
+
export declare const httpGatewaySelectFileFolderDialog: (options?: FileDialogOptions, folder?: boolean) => Promise<DataTransferResponse>;
|
|
51
|
+
/**
|
|
52
|
+
* Get a generic transfer object for HTTP Gateway transfers.
|
|
53
|
+
*
|
|
54
|
+
* @param transferSpec - TransferSpec being provided for the HTTP Gateway transfer
|
|
55
|
+
*
|
|
56
|
+
* @returns a transfer object to track status and send to consumers
|
|
57
|
+
*/
|
|
58
|
+
export declare const getSdkTransfer: (transferSpec: TransferSpec) => AsperaSdkTransfer;
|
|
59
|
+
/**
|
|
60
|
+
* Send a transfer update through the SDK
|
|
61
|
+
*
|
|
62
|
+
* @param transfer - Transsfer object to send to consumers
|
|
63
|
+
*/
|
|
64
|
+
export declare const sendTransferUpdate: (transfer: AsperaSdkTransfer) => void;
|
|
65
|
+
/**
|
|
66
|
+
* Try to parse and get a useful string from API calls for HTTP Gateway
|
|
67
|
+
*
|
|
68
|
+
* @param error - Error from API call for Gateway
|
|
69
|
+
*
|
|
70
|
+
* @returns a string to use for errors
|
|
71
|
+
*/
|
|
72
|
+
export declare const getMessageFromError: (error: any) => {
|
|
73
|
+
message: string;
|
|
74
|
+
code: number;
|
|
75
|
+
};
|
|
76
|
+
export declare const base64Encoding: (jsonString: string) => string;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
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
|
+
/**
|
|
9
|
+
* HTTP Gateway Core Logic
|
|
10
|
+
* - File/Folder picking
|
|
11
|
+
* - Starting and testing
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* Most logic is called directly by Desktop SDK functions
|
|
15
|
+
* You may not need to import anything from this file.
|
|
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
|
+
var httpRemoveTransfer = function (id) {
|
|
24
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
25
|
+
(0, http_gateway_sdk_js_1.removeTransfer)(id);
|
|
26
|
+
return Promise.resolve({ removed: true });
|
|
27
|
+
}
|
|
28
|
+
var transfer = index_1.asperaSdk.httpGatewayTransferStore.get(id);
|
|
29
|
+
if (transfer) {
|
|
30
|
+
index_1.asperaSdk.httpGatewayTransferStore.delete(id);
|
|
31
|
+
return Promise.resolve({ removed: true });
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return Promise.reject((0, helpers_1.generateErrorBody)(messages_1.messages.removeTransferFailed, { reason: 'Not found' }));
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
exports.httpRemoveTransfer = httpRemoveTransfer;
|
|
38
|
+
/**
|
|
39
|
+
* Get the list of http gateway transfers
|
|
40
|
+
*
|
|
41
|
+
* @returns list of HTTP Gateway
|
|
42
|
+
*/
|
|
43
|
+
var httpGetAllTransfers = function () {
|
|
44
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
45
|
+
return (0, http_gateway_sdk_js_1.getAllTransfers)().transfers;
|
|
46
|
+
}
|
|
47
|
+
return Array.from(index_1.asperaSdk.httpGatewayTransferStore.values());
|
|
48
|
+
};
|
|
49
|
+
exports.httpGetAllTransfers = httpGetAllTransfers;
|
|
50
|
+
/**
|
|
51
|
+
* Get a HTTP Gateway transfer by ID
|
|
52
|
+
*
|
|
53
|
+
* @returns a transfer or null
|
|
54
|
+
*/
|
|
55
|
+
var httpGetTransfer = function (id) {
|
|
56
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
57
|
+
return (0, http_gateway_sdk_js_1.getTransferById)(id);
|
|
58
|
+
}
|
|
59
|
+
return index_1.asperaSdk.httpGatewayTransferStore.get(id);
|
|
60
|
+
};
|
|
61
|
+
exports.httpGetTransfer = httpGetTransfer;
|
|
62
|
+
/**
|
|
63
|
+
* Create HTML input element for file picking
|
|
64
|
+
*/
|
|
65
|
+
var createHtmlInputElement = function () {
|
|
66
|
+
var element = window.document.createElement('input');
|
|
67
|
+
element.type = 'file';
|
|
68
|
+
element.style = 'display: none;';
|
|
69
|
+
window.document.body.appendChild(element);
|
|
70
|
+
return element;
|
|
71
|
+
};
|
|
72
|
+
exports.createHtmlInputElement = createHtmlInputElement;
|
|
73
|
+
/**
|
|
74
|
+
* Handle drop events and store files for HTTP Gateway
|
|
75
|
+
* This works on top of desktop.
|
|
76
|
+
*/
|
|
77
|
+
var handleHttpGatewayDrop = function (items, callback, event) {
|
|
78
|
+
var files = [];
|
|
79
|
+
var callbackCount = 0;
|
|
80
|
+
var callbackFinishCount = 0;
|
|
81
|
+
var finalCallback = function () {
|
|
82
|
+
if (callbackFinishCount >= callbackCount) {
|
|
83
|
+
var finalFiles = files.map(function (file) {
|
|
84
|
+
index_1.asperaSdk.httpGatewaySelectedFiles.set(file.name, file);
|
|
85
|
+
return {
|
|
86
|
+
lastModified: file.lastModified,
|
|
87
|
+
name: file.name,
|
|
88
|
+
size: file.size,
|
|
89
|
+
type: file.type
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
callback({ event: event, files: { dataTransfer: { files: finalFiles } } });
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
var traverse = function (item) {
|
|
96
|
+
if (item.isFile) {
|
|
97
|
+
item.file(function (file) {
|
|
98
|
+
files.push(file);
|
|
99
|
+
callbackFinishCount++;
|
|
100
|
+
finalCallback();
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
else if (item.isDirectory) {
|
|
104
|
+
var dirReader = item.createReader();
|
|
105
|
+
dirReader.readEntries(function (entries) {
|
|
106
|
+
for (var k = 0; k < entries.length; k++) {
|
|
107
|
+
callbackCount++;
|
|
108
|
+
traverse(entries[k]);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
callbackFinishCount++;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
callbackFinishCount++;
|
|
115
|
+
finalCallback();
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
for (var i = 0; i < items.length; i++) {
|
|
119
|
+
var item = items[i].webkitGetAsEntry();
|
|
120
|
+
if (item) {
|
|
121
|
+
callbackCount++;
|
|
122
|
+
traverse(item);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
exports.handleHttpGatewayDrop = handleHttpGatewayDrop;
|
|
127
|
+
/**
|
|
128
|
+
* Open native browser file or folder picker for files
|
|
129
|
+
*
|
|
130
|
+
* @param options - File picker options
|
|
131
|
+
* @param folder - Indicate if choosing folders
|
|
132
|
+
*
|
|
133
|
+
* @returns Promise that resolves with info about the files picked
|
|
134
|
+
*/
|
|
135
|
+
var httpGatewaySelectFileFolderDialog = function (options, folder) {
|
|
136
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
137
|
+
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) || ''));
|
|
138
|
+
}
|
|
139
|
+
var _a = (0, helpers_1.generatePromiseObjects)(), promise = _a.promise, rejecter = _a.rejecter, resolver = _a.resolver;
|
|
140
|
+
var element = (0, exports.createHtmlInputElement)();
|
|
141
|
+
element.multiple = !!(options === null || options === void 0 ? void 0 : options.multiple);
|
|
142
|
+
if (folder) {
|
|
143
|
+
element.webkitdirectory = true;
|
|
144
|
+
}
|
|
145
|
+
element.oncancel = function () {
|
|
146
|
+
rejecter({ debugData: { code: -32002, message: messages_1.messages.filePickerCancel } });
|
|
147
|
+
};
|
|
148
|
+
element.onchange = function () {
|
|
149
|
+
var returnFiles = [];
|
|
150
|
+
for (var i = 0; i < element.files.length; i++) {
|
|
151
|
+
var file = element.files[i];
|
|
152
|
+
returnFiles.push(file);
|
|
153
|
+
index_1.asperaSdk.httpGatewaySelectedFiles.set(file.name, file);
|
|
154
|
+
}
|
|
155
|
+
resolver({
|
|
156
|
+
dataTransfer: {
|
|
157
|
+
files: returnFiles.map(function (file) {
|
|
158
|
+
return {
|
|
159
|
+
size: file.size,
|
|
160
|
+
lastModified: file.lastModified,
|
|
161
|
+
name: file.webkitRelativePath || file.name,
|
|
162
|
+
type: file.type,
|
|
163
|
+
};
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
element.click();
|
|
169
|
+
return promise;
|
|
170
|
+
};
|
|
171
|
+
exports.httpGatewaySelectFileFolderDialog = httpGatewaySelectFileFolderDialog;
|
|
172
|
+
/**
|
|
173
|
+
* Get a generic transfer object for HTTP Gateway transfers.
|
|
174
|
+
*
|
|
175
|
+
* @param transferSpec - TransferSpec being provided for the HTTP Gateway transfer
|
|
176
|
+
*
|
|
177
|
+
* @returns a transfer object to track status and send to consumers
|
|
178
|
+
*/
|
|
179
|
+
var getSdkTransfer = function (transferSpec) {
|
|
180
|
+
return {
|
|
181
|
+
uuid: (0, helpers_1.randomUUID)(),
|
|
182
|
+
transfer_spec: transferSpec,
|
|
183
|
+
current_file: '',
|
|
184
|
+
add_time: new Date().toISOString(),
|
|
185
|
+
file_counts: {
|
|
186
|
+
attempted: 0,
|
|
187
|
+
completed: 0,
|
|
188
|
+
failed: 0,
|
|
189
|
+
skipped: 0,
|
|
190
|
+
},
|
|
191
|
+
end_time: '',
|
|
192
|
+
explorer_path: '',
|
|
193
|
+
status: 'queued',
|
|
194
|
+
bytes_written: 0,
|
|
195
|
+
bytes_expected: 0,
|
|
196
|
+
calculated_rate_kbps: 0,
|
|
197
|
+
elapsed_usec: 0,
|
|
198
|
+
percentage: 0,
|
|
199
|
+
title: '',
|
|
200
|
+
remaining_usec: 0,
|
|
201
|
+
httpGatewayTransfer: true,
|
|
202
|
+
httpDownloadExternalHandle: false,
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
exports.getSdkTransfer = getSdkTransfer;
|
|
206
|
+
/**
|
|
207
|
+
* Send a transfer update through the SDK
|
|
208
|
+
*
|
|
209
|
+
* @param transfer - Transsfer object to send to consumers
|
|
210
|
+
*/
|
|
211
|
+
var sendTransferUpdate = function (transfer) {
|
|
212
|
+
index_1.asperaSdk.httpGatewayTransferStore.set(transfer.uuid, transfer);
|
|
213
|
+
index_1.asperaSdk.activityTracking.handleTransferActivity({
|
|
214
|
+
type: 'transferUpdated',
|
|
215
|
+
data: { transfers: [transfer] },
|
|
216
|
+
});
|
|
217
|
+
};
|
|
218
|
+
exports.sendTransferUpdate = sendTransferUpdate;
|
|
219
|
+
/**
|
|
220
|
+
* Try to parse and get a useful string from API calls for HTTP Gateway
|
|
221
|
+
*
|
|
222
|
+
* @param error - Error from API call for Gateway
|
|
223
|
+
*
|
|
224
|
+
* @returns a string to use for errors
|
|
225
|
+
*/
|
|
226
|
+
var getMessageFromError = function (error) {
|
|
227
|
+
var data = (0, helpers_1.safeJsonParse)(error);
|
|
228
|
+
var message = messages_1.messages.httpNetworkFail;
|
|
229
|
+
var code = 500;
|
|
230
|
+
if (data && typeof data === 'object') {
|
|
231
|
+
message = data.message || data.description || messages_1.messages.httpNetworkFail;
|
|
232
|
+
code = data.code || 500;
|
|
233
|
+
}
|
|
234
|
+
else if (error && typeof error === 'object') {
|
|
235
|
+
message = error.message || error.description || messages_1.messages.httpNetworkFail;
|
|
236
|
+
code = error.code || 500;
|
|
237
|
+
}
|
|
238
|
+
else if (typeof error === 'string') {
|
|
239
|
+
message = error;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
message: message,
|
|
243
|
+
code: code,
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
exports.getMessageFromError = getMessageFromError;
|
|
247
|
+
var base64Encoding = function (jsonString) {
|
|
248
|
+
var bytes = new TextEncoder().encode(jsonString);
|
|
249
|
+
var binString = Array.from(bytes, function (byte) {
|
|
250
|
+
return String.fromCodePoint(byte);
|
|
251
|
+
}).join('');
|
|
252
|
+
return btoa(binString);
|
|
253
|
+
};
|
|
254
|
+
exports.base64Encoding = base64Encoding;
|
|
@@ -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,186 @@
|
|
|
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
|
+
return fetch("".concat(url.toString(), "/presign"), {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: headers,
|
|
45
|
+
body: (0, helpers_1.safeJsonString)({
|
|
46
|
+
transfer_spec: transferSpec,
|
|
47
|
+
method: 'GET',
|
|
48
|
+
protocol: 'http',
|
|
49
|
+
headers: {
|
|
50
|
+
host: url.host,
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
}).then(function (response) {
|
|
54
|
+
return response.json().then(function (data) {
|
|
55
|
+
return {
|
|
56
|
+
headers: response.headers,
|
|
57
|
+
body: data,
|
|
58
|
+
status: response.status,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
}).then(function (response) {
|
|
62
|
+
if (response.status >= 400) {
|
|
63
|
+
triggerFailed(response.body);
|
|
64
|
+
return transferObject;
|
|
65
|
+
}
|
|
66
|
+
transferObject.httpRequestId = response.headers.get('X-Request-Id');
|
|
67
|
+
transferObject.status = 'running';
|
|
68
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
69
|
+
var iframe = document.createElement('iframe');
|
|
70
|
+
iframe.src = response.body.signed_url;
|
|
71
|
+
iframe.width = '1px';
|
|
72
|
+
iframe.height = '1px';
|
|
73
|
+
index_1.asperaSdk.globals.httpGatewayIframeContainer.appendChild(iframe);
|
|
74
|
+
return transferObject;
|
|
75
|
+
}).catch(function (error) {
|
|
76
|
+
triggerFailed(error);
|
|
77
|
+
return transferObject;
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* HTTP Gateway Download Logic for in browser download with progress
|
|
82
|
+
* This is used when the transfer size is known and under the threshold
|
|
83
|
+
*
|
|
84
|
+
* @param transferSpec - TransferSpec for the download
|
|
85
|
+
* @param asperaSdkSpec IBM Aspera settings when starting a transfer.
|
|
86
|
+
*
|
|
87
|
+
* @returns Promise that resolves on success invoke or rejects if unable to start
|
|
88
|
+
*
|
|
89
|
+
* @remarks
|
|
90
|
+
* This function is used internally and not exported.
|
|
91
|
+
*/
|
|
92
|
+
var httpDownloadInBrowser = function (transferSpec, asperaSdkSpec) {
|
|
93
|
+
// create a transfer sdk object
|
|
94
|
+
var transferObject = (0, core_1.getSdkTransfer)(transferSpec);
|
|
95
|
+
var triggerFailed = function (error) {
|
|
96
|
+
var errorData = (0, core_1.getMessageFromError)(error.response || error);
|
|
97
|
+
transferObject.status = 'failed';
|
|
98
|
+
transferObject.error_code = errorData.code;
|
|
99
|
+
transferObject.error_desc = errorData.message;
|
|
100
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
101
|
+
};
|
|
102
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
103
|
+
var headers = {
|
|
104
|
+
'X-Aspera-Spec': (0, core_1.base64Encoding)((0, helpers_1.safeJsonString)(transferSpec)),
|
|
105
|
+
};
|
|
106
|
+
if (asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_authentication) {
|
|
107
|
+
headers['Authorization'] = "Bearer ".concat(asperaSdkSpec.http_gateway_authentication.token);
|
|
108
|
+
headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
|
|
109
|
+
}
|
|
110
|
+
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) {
|
|
111
|
+
var responseHeaders = data.headers;
|
|
112
|
+
transferObject.httpRequestId = responseHeaders.get('X-Request-Id');
|
|
113
|
+
var chunks = [];
|
|
114
|
+
var reader = data.body.getReader();
|
|
115
|
+
transferObject.status = 'running';
|
|
116
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
117
|
+
transferObject.bytes_expected = Number(responseHeaders.get('Content-Length') || 0);
|
|
118
|
+
var readBytes = function () {
|
|
119
|
+
reader.read().then(function (content) {
|
|
120
|
+
var _a;
|
|
121
|
+
if (content.done) {
|
|
122
|
+
if (data.status >= 400 || !transferObject.bytes_written) {
|
|
123
|
+
triggerFailed(data.body);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
transferObject.status = 'completed';
|
|
127
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
128
|
+
var blobData = new Blob(chunks, { type: responseHeaders.get('Content-Type') });
|
|
129
|
+
var objectURL = URL.createObjectURL(blobData);
|
|
130
|
+
var a = document.createElement('a');
|
|
131
|
+
a.href = objectURL;
|
|
132
|
+
a.setAttribute('style', 'display: none;');
|
|
133
|
+
a.download = (responseHeaders.get('Content-Disposition') || 'download').replace('attachment; filename="', '').replace('"', '');
|
|
134
|
+
document.body.appendChild(a);
|
|
135
|
+
a.click();
|
|
136
|
+
document.body.removeChild(a);
|
|
137
|
+
URL.revokeObjectURL(objectURL);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
chunks.push(content.value);
|
|
141
|
+
transferObject.status = 'running';
|
|
142
|
+
transferObject.bytes_written += ((_a = content.value) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
143
|
+
transferObject.percentage = (transferObject.bytes_written / transferObject.bytes_expected);
|
|
144
|
+
(0, core_1.sendTransferUpdate)(transferObject);
|
|
145
|
+
readBytes();
|
|
146
|
+
}
|
|
147
|
+
}).catch(function (error) {
|
|
148
|
+
triggerFailed(error);
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
readBytes();
|
|
152
|
+
}).catch(function (error) {
|
|
153
|
+
triggerFailed(error);
|
|
154
|
+
});
|
|
155
|
+
return Promise.resolve(transferObject);
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* HTTP Gateway Download Logic
|
|
159
|
+
*
|
|
160
|
+
* @param transferSpec - TransferSpec for the download
|
|
161
|
+
* @param asperaSdkSpec IBM Aspera settings when starting a transfer.
|
|
162
|
+
*
|
|
163
|
+
* @returns Promise that resolves on success invoke or rejects if unable to start
|
|
164
|
+
*
|
|
165
|
+
* @remarks
|
|
166
|
+
* Most logic is called directly by Desktop SDK functions
|
|
167
|
+
* You may not need to import anything from this file.
|
|
168
|
+
*/
|
|
169
|
+
var httpDownload = function (transferSpec, asperaSdkSpec) {
|
|
170
|
+
if (!index_1.asperaSdk.httpGatewayIsReady) {
|
|
171
|
+
return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified, { type: 'download' });
|
|
172
|
+
}
|
|
173
|
+
if (index_1.asperaSdk.useOldHttpGateway) {
|
|
174
|
+
return (0, http_gateway_sdk_js_1.download)(transferSpec);
|
|
175
|
+
}
|
|
176
|
+
if (transferSpec.tags &&
|
|
177
|
+
transferSpec.tags.aspera &&
|
|
178
|
+
transferSpec.tags.aspera['http-gateway'] &&
|
|
179
|
+
transferSpec.tags.aspera['http-gateway'].expected_size <= index_1.asperaSdk.httpGatewayInBrowserDownloadThreshold) {
|
|
180
|
+
return httpDownloadInBrowser(transferSpec, asperaSdkSpec);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
return httpDownloadPresigned(transferSpec, asperaSdkSpec);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
exports.httpDownload = httpDownload;
|