@ibm-aspera/sdk 0.2.7 → 0.2.9

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 (91) hide show
  1. package/.whitesource +3 -0
  2. package/README.md +1 -1
  3. package/dist/commonjs/app/core.d.ts +7 -21
  4. package/dist/commonjs/app/core.js +115 -47
  5. package/dist/commonjs/constants/constants.d.ts +1 -1
  6. package/dist/commonjs/constants/messages.d.ts +6 -0
  7. package/dist/commonjs/constants/messages.js +6 -0
  8. package/dist/commonjs/helpers/client/http-client.js +1 -1
  9. package/dist/commonjs/helpers/client/safari-client.js +1 -1
  10. package/dist/commonjs/helpers/helpers.d.ts +20 -2
  11. package/dist/commonjs/helpers/helpers.js +40 -2
  12. package/dist/commonjs/helpers/ws.js +2 -8
  13. package/dist/commonjs/http-gateway/core.d.ts +76 -0
  14. package/dist/commonjs/http-gateway/core.js +254 -0
  15. package/dist/commonjs/http-gateway/download.d.ts +14 -0
  16. package/dist/commonjs/http-gateway/download.js +186 -0
  17. package/dist/commonjs/http-gateway/index.d.ts +11 -0
  18. package/dist/commonjs/http-gateway/index.js +11 -0
  19. package/dist/commonjs/http-gateway/models.d.ts +16 -0
  20. package/dist/commonjs/http-gateway/models.js +2 -0
  21. package/dist/commonjs/http-gateway/upload.d.ts +14 -0
  22. package/dist/commonjs/http-gateway/upload.js +124 -0
  23. package/dist/commonjs/index.d.ts +2 -2
  24. package/dist/commonjs/index.js +36 -5
  25. package/dist/commonjs/models/aspera-sdk.model.d.ts +39 -27
  26. package/dist/commonjs/models/aspera-sdk.model.js +62 -58
  27. package/dist/commonjs/models/models.d.ts +49 -3
  28. package/dist/js/aspera-sdk.js +1 -1
  29. package/dist/js/aspera-sdk.js.LICENSE.txt +9 -1
  30. package/dist/js/aspera-sdk.js.map +1 -1
  31. package/package.json +21 -19
  32. package/.editorconfig +0 -13
  33. package/.eslintrc.js +0 -131
  34. package/.github/CODE_OF_CONDUCT.md +0 -128
  35. package/.github/CONTRIBUTING.md +0 -147
  36. package/.github/workflows/ci.yml +0 -36
  37. package/.github/workflows/documentation.yml +0 -43
  38. package/.github/workflows/npm_upload.yml +0 -30
  39. package/.husky/pre-commit +0 -4
  40. package/CHANGELOG.md +0 -165
  41. package/docs/DEVELOPMENT.md +0 -38
  42. package/example/README.md +0 -7
  43. package/example/index.html +0 -14
  44. package/example/package-lock.json +0 -2847
  45. package/example/package.json +0 -29
  46. package/example/public/404.html +0 -5
  47. package/example/public/sdk-code.js +0 -334
  48. package/example/src/App/App.scss +0 -40
  49. package/example/src/App/index.tsx +0 -174
  50. package/example/src/Views/AllTogether.tsx +0 -26
  51. package/example/src/Views/DragDrop.tsx +0 -23
  52. package/example/src/Views/Home.tsx +0 -10
  53. package/example/src/Views/Initialize.tsx +0 -21
  54. package/example/src/Views/Installer.tsx +0 -119
  55. package/example/src/Views/MonitorTransfers.tsx +0 -88
  56. package/example/src/Views/Other.tsx +0 -25
  57. package/example/src/Views/SelectItems.tsx +0 -46
  58. package/example/src/Views/StartTransfer.tsx +0 -32
  59. package/example/src/Views/Test.tsx +0 -20
  60. package/example/src/Views/Views.scss +0 -111
  61. package/example/src/helpers/index.ts +0 -19
  62. package/example/src/index.scss +0 -47
  63. package/example/src/main.tsx +0 -17
  64. package/example/src/vite-env.d.ts +0 -2
  65. package/example/tsconfig.json +0 -30
  66. package/example/vite.config.ts +0 -22
  67. package/jest.config.js +0 -15
  68. package/jest.setup.js +0 -0
  69. package/src/app/core.ts +0 -611
  70. package/src/app/installer.ts +0 -53
  71. package/src/constants/constants.ts +0 -19
  72. package/src/constants/messages.ts +0 -29
  73. package/src/helpers/client/client.ts +0 -11
  74. package/src/helpers/client/http-client.ts +0 -92
  75. package/src/helpers/client/safari-client.ts +0 -334
  76. package/src/helpers/helpers.ts +0 -214
  77. package/src/helpers/http.ts +0 -39
  78. package/src/helpers/ws.ts +0 -215
  79. package/src/index.ts +0 -78
  80. package/src/models/aspera-sdk.model.ts +0 -399
  81. package/src/models/models.ts +0 -676
  82. package/tests/client.spec.ts +0 -52
  83. package/tests/core.spec.ts +0 -13
  84. package/tests/helpers.spec.ts +0 -124
  85. package/tests/http.spec.ts +0 -14
  86. package/tests/installer.spec.ts +0 -135
  87. package/tests/mocks.ts +0 -11
  88. package/tsconfig.json +0 -13
  89. package/tsconfig.module.json +0 -16
  90. package/typedoc.js +0 -17
  91. package/webpack.config.js +0 -35
package/.whitesource ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "settingsInheritedFrom": "ibm-mend-config/mend-config@main"
3
+ }
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # IBM Aspera JavaScript SDK
2
- This JavaScript SDK allows web applications to integrate with IBM Aspera to perform high-speed Aspera file transfers.
2
+ This JavaScript SDK allows web applications to integrate with `IBM Aspera for desktop` to perform high-speed Aspera file transfers.
3
3
 
4
4
  Documentation is available on [GitHub Pages](https://ibm.github.io/aspera-sdk-js/docs/)
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { AsperaSdkInfo, TransferResponse } from '../models/aspera-sdk.model';
2
- import { CustomBrandingOptions, DataTransferResponse, AsperaSdkSpec, AsperaSdkTransfer, FileDialogOptions, FolderDialogOptions, InitOptions, ModifyTransferOptions, ResumeTransferOptions, SafariExtensionEvent, TransferSpec, WebsocketEvent } from '../models/models';
2
+ import { CustomBrandingOptions, DataTransferResponse, AsperaSdkSpec, AsperaSdkTransfer, FileDialogOptions, FolderDialogOptions, InitOptions, ModifyTransferOptions, ResumeTransferOptions, TransferSpec, WebsocketEvent } from '../models/models';
3
3
  /**
4
4
  * Check if IBM Aspera for Desktop connection works. This function is called by init
5
5
  * when initializing the SDK. This function can be used at any point for checking.
@@ -8,11 +8,13 @@ import { CustomBrandingOptions, DataTransferResponse, AsperaSdkSpec, AsperaSdkTr
8
8
  */
9
9
  export declare const testConnection: () => Promise<any>;
10
10
  /**
11
- * Initialize drag and drop.
11
+ * Initialize drag and drop. HTTP Gateway does not need to init.
12
+ * Ignore if only HTTP Gateway
13
+ * @param initCall - Indicate if called via init flow and should not reject
12
14
  *
13
15
  * @returns a promise that resolves if the initialization was successful or not
14
16
  */
15
- export declare const initDragDrop: () => Promise<boolean>;
17
+ export declare const initDragDrop: (initCall?: boolean) => Promise<boolean>;
16
18
  /**
17
19
  * Initialize IBM Aspera client. If client cannot (reject/catch), then
18
20
  * client should attempt fixing server URL or trying again. If still fails disable UI elements.
@@ -36,7 +38,7 @@ export declare const init: (options?: InitOptions) => Promise<any>;
36
38
  * Start a transfer
37
39
  *
38
40
  * @param transferSpec standard transferSpec for transfer
39
- * @param asperaSdkSpec IBM Aspera settings when starting a transfer
41
+ * @param asperaSdkSpec IBM Aspera settings when starting a transfer.
40
42
  *
41
43
  * @returns a promise that resolves if transfer initiation is successful and rejects if transfer cannot be started
42
44
  */
@@ -89,22 +91,6 @@ export declare const registerStatusCallback: (callback: (status: WebsocketEvent)
89
91
  * @param id the ID returned by `registerStatusCallback`
90
92
  */
91
93
  export declare const deregisterStatusCallback: (id: string) => void;
92
- /**
93
- * Register a callback for getting updates about the Safari extension status.
94
- *
95
- * This can be useful if you want to handle the case where the user enable or disable the Safari extension.
96
- *
97
- * @param callback callback function to receive events
98
- *
99
- * @returns ID representing the callback for deregistration purposes
100
- */
101
- export declare const registerSafariExtensionStatusCallback: (callback: (status: SafariExtensionEvent) => void) => string;
102
- /**
103
- * Remove a callback from getting Safari extension status events.
104
- *
105
- * @param id the ID returned by `registerStatusCallback`
106
- */
107
- export declare const deregisterSafariExtensionStatusCallback: (id: string) => void;
108
94
  /**
109
95
  * Remove a transfer. This will stop the transfer if it is in progress.
110
96
  *
@@ -202,7 +188,7 @@ export declare const setBranding: (id: string, options: CustomBrandingOptions) =
202
188
  * @param elementSelector the selector of the element on the page that should watch for drop events
203
189
  */
204
190
  export declare const createDropzone: (callback: (data: {
205
- event: any;
191
+ event: DragEvent;
206
192
  files: DataTransferResponse;
207
193
  }) => void, elementSelector: string) => void;
208
194
  /**
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getInfo = exports.removeDropzone = exports.createDropzone = exports.setBranding = exports.modifyTransfer = exports.showDirectory = exports.getTransfer = exports.getAllTransfers = exports.showPreferences = exports.showSelectFolderDialog = exports.showSelectFileDialog = exports.resumeTransfer = exports.stopTransfer = exports.removeTransfer = exports.deregisterSafariExtensionStatusCallback = exports.registerSafariExtensionStatusCallback = exports.deregisterStatusCallback = exports.registerStatusCallback = exports.deregisterRemovedCallback = exports.registerRemovedCallback = exports.deregisterActivityCallback = exports.registerActivityCallback = exports.startTransfer = exports.init = exports.initDragDrop = exports.testConnection = void 0;
3
+ exports.getInfo = exports.removeDropzone = exports.createDropzone = exports.setBranding = exports.modifyTransfer = exports.showDirectory = exports.getTransfer = exports.getAllTransfers = exports.showPreferences = exports.showSelectFolderDialog = exports.showSelectFileDialog = exports.resumeTransfer = exports.stopTransfer = exports.removeTransfer = exports.deregisterStatusCallback = exports.registerStatusCallback = exports.deregisterRemovedCallback = exports.registerRemovedCallback = exports.deregisterActivityCallback = exports.registerActivityCallback = exports.startTransfer = exports.init = exports.initDragDrop = exports.testConnection = void 0;
4
4
  var messages_1 = require("../constants/messages");
5
5
  var client_1 = require("../helpers/client/client");
6
6
  var helpers_1 = require("../helpers/helpers");
7
+ var http_gateway_1 = require("../http-gateway");
8
+ var core_1 = require("../http-gateway/core");
7
9
  var index_1 = require("../index");
10
+ var http_gateway_sdk_js_1 = require("@ibm-aspera/http-gateway-sdk-js");
8
11
  /**
9
12
  * Check if IBM Aspera for Desktop connection works. This function is called by init
10
13
  * when initializing the SDK. This function can be used at any point for checking.
@@ -14,19 +17,24 @@ var index_1 = require("../index");
14
17
  var testConnection = function () {
15
18
  return client_1.client.request('get_info')
16
19
  .then(function (data) {
17
- index_1.asperaSdk.globals.AsperaSdkInfo = data;
20
+ index_1.asperaSdk.globals.asperaSdkInfo = data;
18
21
  index_1.asperaSdk.globals.asperaAppVerified = true;
19
- return data;
22
+ return index_1.asperaSdk.globals.sdkResponseData;
20
23
  });
21
24
  };
22
25
  exports.testConnection = testConnection;
23
26
  /**
24
- * Initialize drag and drop.
27
+ * Initialize drag and drop. HTTP Gateway does not need to init.
28
+ * Ignore if only HTTP Gateway
29
+ * @param initCall - Indicate if called via init flow and should not reject
25
30
  *
26
31
  * @returns a promise that resolves if the initialization was successful or not
27
32
  */
28
- var initDragDrop = function () {
29
- if (!index_1.asperaSdk.isReady) {
33
+ var initDragDrop = function (initCall) {
34
+ if (index_1.asperaSdk.useHttpGateway) {
35
+ return Promise.resolve(true);
36
+ }
37
+ else if (!index_1.asperaSdk.isReady) {
30
38
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
31
39
  }
32
40
  var promiseInfo = (0, helpers_1.generatePromiseObjects)();
@@ -34,7 +42,13 @@ var initDragDrop = function () {
34
42
  .then(function (data) { return promiseInfo.resolver(data); })
35
43
  .catch(function (error) {
36
44
  (0, helpers_1.errorLog)(messages_1.messages.dragDropInitFailed, error);
37
- promiseInfo.rejecter((0, helpers_1.generateErrorBody)(messages_1.messages.dragDropInitFailed, error));
45
+ if (initCall) {
46
+ promiseInfo.resolver(false);
47
+ (0, helpers_1.errorLog)(messages_1.messages.dragDropInitFailedInit, error);
48
+ }
49
+ else {
50
+ promiseInfo.rejecter((0, helpers_1.generateErrorBody)(messages_1.messages.dragDropInitFailed, error));
51
+ }
38
52
  });
39
53
  return promiseInfo.promise;
40
54
  };
@@ -62,35 +76,85 @@ var init = function (options) {
62
76
  var appId = (_a = options === null || options === void 0 ? void 0 : options.appId) !== null && _a !== void 0 ? _a : (0, helpers_1.randomUUID)();
63
77
  var supportMultipleUsers = (_b = options === null || options === void 0 ? void 0 : options.supportMultipleUsers) !== null && _b !== void 0 ? _b : false;
64
78
  index_1.asperaSdk.globals.appId = appId;
79
+ // Watch for old HTTP Gateway transfers in case used.
80
+ (0, http_gateway_sdk_js_1.registerActivityCallback)(function (oldHttpTransfers) {
81
+ oldHttpTransfers.transfers.forEach(function (oldHttpTransfer) {
82
+ (0, core_1.sendTransferUpdate)(oldHttpTransfer);
83
+ });
84
+ });
65
85
  if (supportMultipleUsers) {
66
86
  index_1.asperaSdk.globals.supportMultipleUsers = true;
67
87
  index_1.asperaSdk.globals.sessionId = (0, helpers_1.randomUUID)();
68
88
  }
69
- return index_1.asperaSdk.activityTracking.setup()
70
- .then(function () { return (0, exports.testConnection)(); })
71
- .then(function () { return (0, exports.initDragDrop)(); })
72
- .catch(function (error) {
89
+ var handleErrors = function (error) {
73
90
  (0, helpers_1.errorLog)(messages_1.messages.serverError, error);
74
91
  index_1.asperaSdk.globals.asperaAppVerified = false;
75
92
  throw (0, helpers_1.generateErrorBody)(messages_1.messages.serverError, error);
76
- });
93
+ };
94
+ var getDesktopStartCalls = function () {
95
+ return index_1.asperaSdk.activityTracking.setup()
96
+ .then(function () { return (0, exports.testConnection)(); })
97
+ .then(function () { return (0, exports.initDragDrop)(true); })
98
+ .then(function () { return index_1.asperaSdk.globals.sdkResponseData; })
99
+ .catch(handleErrors);
100
+ };
101
+ if (options.httpGatewayUrl && !index_1.asperaSdk.globals.httpGatewayVerified) {
102
+ var finalHttpGatewayUrl = options.httpGatewayUrl.trim();
103
+ if (finalHttpGatewayUrl.indexOf('http') !== 0) {
104
+ finalHttpGatewayUrl = "https://".concat(finalHttpGatewayUrl);
105
+ }
106
+ if (finalHttpGatewayUrl.endsWith('/')) {
107
+ finalHttpGatewayUrl = finalHttpGatewayUrl.slice(0, -1);
108
+ }
109
+ index_1.asperaSdk.globals.httpGatewayUrl = finalHttpGatewayUrl;
110
+ return fetch("".concat(index_1.asperaSdk.globals.httpGatewayUrl, "/info"), { method: 'GET' }).then(function (response) {
111
+ return response.json().then(function (responseData) {
112
+ if (response.status >= 400) {
113
+ throw Error(responseData);
114
+ }
115
+ return responseData;
116
+ });
117
+ }).then(function (response) {
118
+ index_1.asperaSdk.globals.httpGatewayInfo = response;
119
+ index_1.asperaSdk.globals.httpGatewayVerified = true;
120
+ var iframeContainer = document.createElement('div');
121
+ iframeContainer.id = 'aspera-http-gateway-iframes';
122
+ iframeContainer.style = 'display: none;';
123
+ document.body.appendChild(iframeContainer);
124
+ index_1.asperaSdk.globals.httpGatewayIframeContainer = iframeContainer;
125
+ if (options.forceHttpGateway) {
126
+ return Promise.resolve(index_1.asperaSdk.globals.sdkResponseData);
127
+ }
128
+ else {
129
+ return getDesktopStartCalls();
130
+ }
131
+ }).catch(function (error) {
132
+ // If HTTP Gateway fails log and move on to desktop
133
+ (0, helpers_1.errorLog)(messages_1.messages.httpInitFail, error);
134
+ return getDesktopStartCalls();
135
+ });
136
+ }
137
+ return getDesktopStartCalls();
77
138
  };
78
139
  exports.init = init;
79
140
  /**
80
141
  * Start a transfer
81
142
  *
82
143
  * @param transferSpec standard transferSpec for transfer
83
- * @param asperaSdkSpec IBM Aspera settings when starting a transfer
144
+ * @param asperaSdkSpec IBM Aspera settings when starting a transfer.
84
145
  *
85
146
  * @returns a promise that resolves if transfer initiation is successful and rejects if transfer cannot be started
86
147
  */
87
148
  var startTransfer = function (transferSpec, asperaSdkSpec) {
88
- if (!index_1.asperaSdk.isReady) {
89
- return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
90
- }
91
149
  if (!(0, helpers_1.isValidTransferSpec)(transferSpec)) {
92
150
  return (0, helpers_1.throwError)(messages_1.messages.notValidTransferSpec, { transferSpec: transferSpec });
93
151
  }
152
+ if (index_1.asperaSdk.useHttpGateway) {
153
+ return transferSpec.direction === 'receive' ? (0, http_gateway_1.httpDownload)(transferSpec, asperaSdkSpec) : (0, http_gateway_1.httpUpload)(transferSpec, asperaSdkSpec);
154
+ }
155
+ else if (!index_1.asperaSdk.isReady) {
156
+ return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
157
+ }
94
158
  var promiseInfo = (0, helpers_1.generatePromiseObjects)();
95
159
  var payload = {
96
160
  transfer_spec: transferSpec,
@@ -172,28 +236,6 @@ var deregisterStatusCallback = function (id) {
172
236
  index_1.asperaSdk.activityTracking.removeWebSocketEventCallback(id);
173
237
  };
174
238
  exports.deregisterStatusCallback = deregisterStatusCallback;
175
- /**
176
- * Register a callback for getting updates about the Safari extension status.
177
- *
178
- * This can be useful if you want to handle the case where the user enable or disable the Safari extension.
179
- *
180
- * @param callback callback function to receive events
181
- *
182
- * @returns ID representing the callback for deregistration purposes
183
- */
184
- var registerSafariExtensionStatusCallback = function (callback) {
185
- return index_1.asperaSdk.activityTracking.setSafariExtensionEventCallback(callback);
186
- };
187
- exports.registerSafariExtensionStatusCallback = registerSafariExtensionStatusCallback;
188
- /**
189
- * Remove a callback from getting Safari extension status events.
190
- *
191
- * @param id the ID returned by `registerStatusCallback`
192
- */
193
- var deregisterSafariExtensionStatusCallback = function (id) {
194
- index_1.asperaSdk.activityTracking.removeSafariExtensionEventCallback(id);
195
- };
196
- exports.deregisterSafariExtensionStatusCallback = deregisterSafariExtensionStatusCallback;
197
239
  /**
198
240
  * Remove a transfer. This will stop the transfer if it is in progress.
199
241
  *
@@ -202,6 +244,9 @@ exports.deregisterSafariExtensionStatusCallback = deregisterSafariExtensionStatu
202
244
  * @returns a promise that resolves if transfer is removed and rejects if transfer cannot be removed
203
245
  */
204
246
  var removeTransfer = function (id) {
247
+ if (index_1.asperaSdk.useHttpGateway) {
248
+ return (0, core_1.httpRemoveTransfer)(id);
249
+ }
205
250
  if (!index_1.asperaSdk.isReady) {
206
251
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
207
252
  }
@@ -276,7 +321,10 @@ exports.resumeTransfer = resumeTransfer;
276
321
  * @returns a promise that resolves with the selected file(s) and rejects if user cancels dialog
277
322
  */
278
323
  var showSelectFileDialog = function (options) {
279
- if (!index_1.asperaSdk.isReady) {
324
+ if (index_1.asperaSdk.useHttpGateway) {
325
+ return (0, core_1.httpGatewaySelectFileFolderDialog)(options, false);
326
+ }
327
+ else if (!index_1.asperaSdk.isReady) {
280
328
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
281
329
  }
282
330
  var promiseInfo = (0, helpers_1.generatePromiseObjects)();
@@ -301,7 +349,10 @@ exports.showSelectFileDialog = showSelectFileDialog;
301
349
  * @returns a promise that resolves with the selected folder(s) and rejects if user cancels dialog
302
350
  */
303
351
  var showSelectFolderDialog = function (options) {
304
- if (!index_1.asperaSdk.isReady) {
352
+ if (index_1.asperaSdk.useHttpGateway) {
353
+ return (0, core_1.httpGatewaySelectFileFolderDialog)(options, true);
354
+ }
355
+ else if (!index_1.asperaSdk.isReady) {
305
356
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
306
357
  }
307
358
  var promiseInfo = (0, helpers_1.generatePromiseObjects)();
@@ -343,6 +394,9 @@ exports.showPreferences = showPreferences;
343
394
  * @returns a promise that resolves with an array of transfers.
344
395
  */
345
396
  var getAllTransfers = function () {
397
+ if (index_1.asperaSdk.useHttpGateway) {
398
+ return Promise.resolve((0, core_1.httpGetAllTransfers)());
399
+ }
346
400
  if (!index_1.asperaSdk.isReady) {
347
401
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
348
402
  }
@@ -367,6 +421,15 @@ exports.getAllTransfers = getAllTransfers;
367
421
  * @returns a promise that resolves with the transfer.
368
422
  */
369
423
  var getTransfer = function (id) {
424
+ if (index_1.asperaSdk.useHttpGateway) {
425
+ var transfer = (0, core_1.httpGetTransfer)(id);
426
+ if (transfer) {
427
+ return Promise.resolve(transfer);
428
+ }
429
+ else {
430
+ return Promise.reject((0, helpers_1.generateErrorBody)(messages_1.messages.getTransferFailed, { reason: 'Not found' }));
431
+ }
432
+ }
370
433
  if (!index_1.asperaSdk.isReady) {
371
434
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
372
435
  }
@@ -483,8 +546,8 @@ var createDropzone = function (callback, elementSelector) {
483
546
  };
484
547
  var dropEvent = function (event) {
485
548
  event.preventDefault();
486
- var files = [];
487
549
  if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files.length && event.dataTransfer.files[0]) {
550
+ var files = [];
488
551
  for (var i = 0; i < event.dataTransfer.files.length; i++) {
489
552
  var file = event.dataTransfer.files[i];
490
553
  files.push({
@@ -498,11 +561,16 @@ var createDropzone = function (callback, elementSelector) {
498
561
  files: files,
499
562
  app_id: index_1.asperaSdk.globals.appId,
500
563
  };
501
- client_1.client.request('dropped_files', payload)
502
- .then(function (data) { return callback({ event: event, files: data }); })
503
- .catch(function (error) {
504
- (0, helpers_1.errorLog)(messages_1.messages.unableToReadDropped, error);
505
- });
564
+ if (index_1.asperaSdk.isReady) {
565
+ client_1.client.request('dropped_files', payload)
566
+ .then(function (data) { return callback({ event: event, files: data }); })
567
+ .catch(function (error) {
568
+ (0, helpers_1.errorLog)(messages_1.messages.unableToReadDropped, error);
569
+ });
570
+ }
571
+ else if (index_1.asperaSdk.httpGatewayIsReady) {
572
+ (0, core_1.handleHttpGatewayDrop)(event.dataTransfer.items, callback, event);
573
+ }
506
574
  }
507
575
  };
508
576
  elements.forEach(function (element) {
@@ -541,7 +609,7 @@ var getInfo = function () {
541
609
  return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
542
610
  }
543
611
  return new Promise(function (resolve, _) {
544
- resolve(index_1.asperaSdk.globals.AsperaSdkInfo);
612
+ resolve(index_1.asperaSdk.globals.sdkResponseData);
545
613
  });
546
614
  };
547
615
  exports.getInfo = getInfo;
@@ -5,4 +5,4 @@ export declare const protocol = "aspera://";
5
5
  /** @ignore */
6
6
  export declare const baseInstallerUrl = "https://downloads.ibmaspera.com/downloads/desktop";
7
7
  /** @ignore */
8
- export declare const installerUrl: string;
8
+ export declare const installerUrl = "https://downloads.ibmaspera.com/downloads/desktop/latest/stable";
@@ -2,6 +2,7 @@
2
2
  export declare const messages: {
3
3
  callbackIsNotFunction: string;
4
4
  dragDropInitFailed: string;
5
+ dragDropInitFailedInit: string;
5
6
  failedToGenerateIframe: string;
6
7
  getInstallerError: string;
7
8
  getAllTransfersFailed: string;
@@ -26,4 +27,9 @@ export declare const messages: {
26
27
  websocketClosedError: string;
27
28
  websocketClosedUnexpect: string;
28
29
  websocketNotReady: string;
30
+ httpNotAvailable: string;
31
+ httpInitFail: string;
32
+ filePickerCancel: string;
33
+ fileNotAllowed: string;
34
+ httpNetworkFail: string;
29
35
  };
@@ -5,6 +5,7 @@ exports.messages = void 0;
5
5
  exports.messages = {
6
6
  callbackIsNotFunction: 'The provided callback is not a function',
7
7
  dragDropInitFailed: 'Unable to initialize drag-drop',
8
+ dragDropInitFailedInit: 'Unable to initialize drag-drop as part of init flow',
8
9
  failedToGenerateIframe: 'Unable to generate IFRAME for download. Using new window',
9
10
  getInstallerError: 'Unable to get latest installers',
10
11
  getAllTransfersFailed: 'Unable to get all transfers',
@@ -29,4 +30,9 @@ exports.messages = {
29
30
  websocketClosedError: 'The websocket was closed due to an error',
30
31
  websocketClosedUnexpect: 'The websocket was closed unexpectedly',
31
32
  websocketNotReady: 'The websocket is not ready. Run init first',
33
+ httpNotAvailable: 'IBM Aspera HTTP Gateway is not available',
34
+ httpInitFail: 'IBM Aspera HTTP Gateway could not be started',
35
+ filePickerCancel: 'User canceled the select file or folder dialog.',
36
+ fileNotAllowed: 'TransferSpec contained file not selected by user.',
37
+ httpNetworkFail: 'HTTP network encountered unknown error.',
32
38
  };
@@ -43,7 +43,7 @@ var JSONRPCHttpClient = /** @class */ (function () {
43
43
  headers: {
44
44
  'content-type': 'application/json',
45
45
  },
46
- body: JSON.stringify(request),
46
+ body: (0, helpers_1.safeJsonString)(request),
47
47
  };
48
48
  var rpcServerURL = (0, exports.getRpcServerUrl)();
49
49
  return fetch(rpcServerURL, options).then(function (response) {
@@ -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(JSON.stringify(request)));
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: () => 'macos' | 'windows' | 'linux' | 'unknown';
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: () => "unknown" | "macos" | "windows" | "linux";
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,13 +48,7 @@ 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);
@@ -78,7 +72,7 @@ var WebsocketService = /** @class */ (function () {
78
72
  this.handleNotReady();
79
73
  return false;
80
74
  }
81
- this.globalSocket.send(JSON.stringify({ jsonrpc: '2.0', method: 'subscribe_transfer_activity', params: [index_1.asperaSdk.globals.appId], id: 1 }));
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;