@ibm-aspera/sdk 0.4.18 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,4 +29,4 @@ Along with the examples, you can find an example test application [here](https:/
29
29
 
30
30
  ## Migration from Connect SDK
31
31
 
32
- Refer to [MIGRATION](MIGRATION.md) for recommended changes when migrating your web application from the Connect SDK (`@ibm-aspera/connect-sdk-js`).
32
+ Refer to [MIGRATION](https://github.com/IBM/aspera-sdk-js/blob/main/MIGRATION.md) for recommended changes when migrating your web application from the Connect SDK (`@ibm-aspera/connect-sdk-js`).
@@ -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, TransferSpec, WebsocketEvent, ReadChunkAsArrayBufferResponse, ReadAsArrayBufferResponse, SdkCapabilities } from '../models/models';
2
+ import { CustomBrandingOptions, DataTransferResponse, AsperaSdkSpec, AsperaSdkTransfer, FileDialogOptions, FolderDialogOptions, InitOptions, ModifyTransferOptions, Pagination, PaginatedFilesResponse, ResumeTransferOptions, TransferSpec, WebsocketEvent, ReadChunkAsArrayBufferResponse, ReadAsArrayBufferResponse, SdkCapabilities, GetChecksumOptions, ChecksumFileResponse } from '../models/models';
3
3
  import * as ConnectTypes from '@ibm-aspera/connect-sdk-js/dist/esm/core/types';
4
4
  /**
5
5
  * Check if IBM Aspera for Desktop connection works. This function is called by init
@@ -137,6 +137,15 @@ export declare const getAllTransfers: () => Promise<AsperaSdkTransfer[]>;
137
137
  * @returns a promise that resolves with the transfer.
138
138
  */
139
139
  export declare const getTransfer: (id: string) => Promise<AsperaSdkTransfer>;
140
+ /**
141
+ * Get paginated file-level progress for a specific transfer.
142
+ *
143
+ * @param id transfer uuid
144
+ * @param pagination optional pagination options (limit and offset)
145
+ *
146
+ * @returns a promise that resolves with the paginated file progress list
147
+ */
148
+ export declare const getFilesList: (id: string, pagination?: Pagination) => Promise<PaginatedFilesResponse>;
140
149
  /**
141
150
  * Opens and highlights the downloaded file in Finder or Windows Explorer. If multiple files,
142
151
  * then only the first file will be selected.
@@ -211,6 +220,14 @@ export declare const readAsArrayBuffer: (path: string) => Promise<ReadAsArrayBuf
211
220
  * @returns a promise that resolves with the file chunk data as a base64-encoded string and mime type
212
221
  */
213
222
  export declare const readChunkAsArrayBuffer: (path: string, offset: number, chunkSize: number) => Promise<ReadChunkAsArrayBufferResponse>;
223
+ /**
224
+ * Get a checksum of the specified chunk size of the file.
225
+ *
226
+ * @param options checksum options including path, offset, chunkSize, and checksumMethod
227
+ *
228
+ * @returns a promise that resolves with the checksum information
229
+ */
230
+ export declare const getChecksum: (options: GetChecksumOptions) => Promise<ChecksumFileResponse>;
214
231
  /**
215
232
  * Returns an object describing the high-level capabilities supported by the user's
216
233
  * transfer client (e.g. IBM Aspera for desktop, Connect, or HTTP Gateway).
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.getCapabilities = exports.readChunkAsArrayBuffer = exports.readAsArrayBuffer = 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.deregisterActivityCallback = exports.registerActivityCallback = exports.startTransfer = exports.init = exports.initDragDrop = exports.testConnection = void 0;
14
+ exports.getCapabilities = exports.getChecksum = exports.readChunkAsArrayBuffer = exports.readAsArrayBuffer = exports.getInfo = exports.removeDropzone = exports.createDropzone = exports.setBranding = exports.modifyTransfer = exports.showDirectory = exports.getFilesList = exports.getTransfer = exports.getAllTransfers = exports.showPreferences = exports.showSelectFolderDialog = exports.showSelectFileDialog = exports.resumeTransfer = exports.stopTransfer = exports.removeTransfer = exports.deregisterStatusCallback = exports.registerStatusCallback = exports.deregisterActivityCallback = exports.registerActivityCallback = exports.startTransfer = exports.init = exports.initDragDrop = exports.testConnection = void 0;
15
15
  var messages_1 = require("../constants/messages");
16
16
  var client_1 = require("../helpers/client/client");
17
17
  var helpers_1 = require("../helpers/helpers");
@@ -316,6 +316,9 @@ exports.removeTransfer = removeTransfer;
316
316
  * @returns a promise that resolves if transfer is stopped and rejects if transfer cannot be stopped
317
317
  */
318
318
  var stopTransfer = function (id) {
319
+ if (index_1.asperaSdk.useHttpGateway) {
320
+ return (0, core_1.httpStopTransfer)(id);
321
+ }
319
322
  if (index_1.asperaSdk.useConnect) {
320
323
  return index_1.asperaSdk.globals.connect.stopTransfer(id);
321
324
  }
@@ -527,6 +530,34 @@ var getTransfer = function (id) {
527
530
  return promiseInfo.promise;
528
531
  };
529
532
  exports.getTransfer = getTransfer;
533
+ /**
534
+ * Get paginated file-level progress for a specific transfer.
535
+ *
536
+ * @param id transfer uuid
537
+ * @param pagination optional pagination options (limit and offset)
538
+ *
539
+ * @returns a promise that resolves with the paginated file progress list
540
+ */
541
+ var getFilesList = function (id, pagination) {
542
+ if (!index_1.asperaSdk.isReady) {
543
+ return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
544
+ }
545
+ var promiseInfo = (0, helpers_1.generatePromiseObjects)();
546
+ var payload = {
547
+ transfer_id: id,
548
+ };
549
+ if (pagination) {
550
+ payload.pagination = pagination;
551
+ }
552
+ client_1.client.request('get_files_list', payload)
553
+ .then(function (data) { return promiseInfo.resolver(data); })
554
+ .catch(function (error) {
555
+ (0, helpers_1.errorLog)(messages_1.messages.getFilesListFailed, error);
556
+ promiseInfo.rejecter((0, helpers_1.generateErrorBody)(messages_1.messages.getFilesListFailed, error));
557
+ });
558
+ return promiseInfo.promise;
559
+ };
560
+ exports.getFilesList = getFilesList;
530
561
  /**
531
562
  * Opens and highlights the downloaded file in Finder or Windows Explorer. If multiple files,
532
563
  * then only the first file will be selected.
@@ -789,7 +820,48 @@ var readChunkAsArrayBuffer = function (path, offset, chunkSize) {
789
820
  return promiseInfo.promise;
790
821
  };
791
822
  exports.readChunkAsArrayBuffer = readChunkAsArrayBuffer;
823
+ /**
824
+ * Get a checksum of the specified chunk size of the file.
825
+ *
826
+ * @param options checksum options including path, offset, chunkSize, and checksumMethod
827
+ *
828
+ * @returns a promise that resolves with the checksum information
829
+ */
830
+ var getChecksum = function (options) {
831
+ if (index_1.asperaSdk.useHttpGateway) {
832
+ return (0, helpers_1.throwError)(messages_1.messages.getChecksumNotSupported);
833
+ }
834
+ if (index_1.asperaSdk.useConnect) {
835
+ return index_1.asperaSdk.globals.connect.getChecksum(options);
836
+ }
837
+ if (!index_1.asperaSdk.isReady) {
838
+ return (0, helpers_1.throwError)(messages_1.messages.serverNotVerified);
839
+ }
840
+ var promiseInfo = (0, helpers_1.generatePromiseObjects)();
841
+ var payload = {
842
+ request: {
843
+ path: options.path,
844
+ offset: options.offset || 0,
845
+ chunkSize: options.chunkSize || 0,
846
+ checksumMethod: options.checksumMethod || 'md5',
847
+ },
848
+ app_id: index_1.asperaSdk.globals.appId,
849
+ };
850
+ client_1.client.request('get_checksum', payload)
851
+ .then(function (data) { return promiseInfo.resolver(data); })
852
+ .catch(function (error) {
853
+ (0, helpers_1.errorLog)(messages_1.messages.getChecksumFailed, error);
854
+ promiseInfo.rejecter((0, helpers_1.generateErrorBody)(messages_1.messages.getChecksumFailed, error));
855
+ });
856
+ return promiseInfo.promise;
857
+ };
858
+ exports.getChecksum = getChecksum;
792
859
  var supportsMethod = function (method) {
860
+ // We currently do not support calculating file checksums when using HTTP Gateway. In theory it should be possible
861
+ // to calculate this direclty in the browser similar to how `readAsArrayBuffer()` is implemented.
862
+ if (index_1.asperaSdk.useHttpGateway && method === 'get_checksum') {
863
+ return false;
864
+ }
793
865
  // HTTP Gateway and Connect do not have any RPC methods so fallback to true
794
866
  if (index_1.asperaSdk.useHttpGateway || index_1.asperaSdk.useConnect) {
795
867
  return true;
@@ -819,6 +891,7 @@ var supportsMethod = function (method) {
819
891
  var getCapabilities = function () {
820
892
  return {
821
893
  imagePreview: supportsMethod('read_as_array_buffer') && supportsMethod('read_chunk_as_array_buffer'),
894
+ fileChecksum: supportsMethod('get_checksum'),
822
895
  };
823
896
  };
824
897
  exports.getCapabilities = getCapabilities;
@@ -21,6 +21,7 @@ export declare const messages: {
21
21
  showSelectFolderDialogFailed: string;
22
22
  showPreferencesFailed: string;
23
23
  stopTransferFailed: string;
24
+ stopTransferFailedExternal: string;
24
25
  transferFailed: string;
25
26
  unableToFindElementOnPage: string;
26
27
  unableToReadDropped: string;
@@ -35,4 +36,7 @@ export declare const messages: {
35
36
  readAsArrayBufferFailed: string;
36
37
  readChunkAsArrayBufferFailed: string;
37
38
  rpcDiscoverFailed: string;
39
+ getFilesListFailed: string;
40
+ getChecksumFailed: string;
41
+ getChecksumNotSupported: string;
38
42
  };
@@ -24,6 +24,7 @@ exports.messages = {
24
24
  showSelectFolderDialogFailed: 'Unable to show select folder dialog',
25
25
  showPreferencesFailed: 'Unable to show preferences',
26
26
  stopTransferFailed: 'Unable to stop transfer',
27
+ stopTransferFailedExternal: 'Unable to stop transfer. The download must be canceled from the browser\'s download manager',
27
28
  transferFailed: 'The transfer failed to initiate',
28
29
  unableToFindElementOnPage: 'Unable to find the element on the current page',
29
30
  unableToReadDropped: 'The dropped item could not be parsed. Please try selecting via the select file/folder option',
@@ -38,4 +39,7 @@ exports.messages = {
38
39
  readAsArrayBufferFailed: 'Unable to read file as array buffer',
39
40
  readChunkAsArrayBufferFailed: 'Unable to read file chunk as array buffer',
40
41
  rpcDiscoverFailed: 'Unable to discover RPC endpoints',
42
+ getFilesListFailed: 'Unable to get files list for transfer',
43
+ getChecksumFailed: 'Unable to get file checksum',
44
+ getChecksumNotSupported: 'File checksum not supported for current transfer client',
41
45
  };
@@ -25,6 +25,18 @@ export declare const sendTransferUpdate: (transfer: AsperaSdkTransfer) => void;
25
25
  * @returns a promise that resolves when the HTTP Gateway is initialized
26
26
  */
27
27
  export declare const initHttpGateway: (response: HttpGatewayInfo) => Promise<void>;
28
+ /**
29
+ * Stop an in-progress HTTP Gateway transfer.
30
+ * Aborts the underlying HTTP request and sets the transfer status to 'canceled'.
31
+ *
32
+ * Note: If the download is being directly handled by the browser's download manager, this will return
33
+ * an error. The user must cancel the download themselves in the browser's download manger.
34
+ *
35
+ * @param id - ID of the transfer
36
+ *
37
+ * @returns Promise indicating success
38
+ */
39
+ export declare const httpStopTransfer: (id: string) => Promise<void>;
28
40
  /**
29
41
  * Remove a transfer from HTTP Gateway systems
30
42
  * @param id - ID of the transfer
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.httpGatewayReadChunkAsArrayBuffer = exports.httpGatewayReadAsArrayBuffer = exports.base64Encoding = exports.getMessageFromError = exports.getSdkTransfer = exports.httpGatewaySelectFileFolderDialog = exports.handleHttpGatewayDrop = exports.createHtmlInputElement = exports.httpGetTransfer = exports.httpGetAllTransfers = exports.httpRemoveTransfer = exports.initHttpGateway = exports.sendTransferUpdate = void 0;
3
+ exports.httpGatewayReadChunkAsArrayBuffer = exports.httpGatewayReadAsArrayBuffer = exports.base64Encoding = exports.getMessageFromError = exports.getSdkTransfer = exports.httpGatewaySelectFileFolderDialog = exports.handleHttpGatewayDrop = exports.createHtmlInputElement = exports.httpGetTransfer = exports.httpGetAllTransfers = exports.httpRemoveTransfer = exports.httpStopTransfer = exports.initHttpGateway = exports.sendTransferUpdate = void 0;
4
4
  var messages_1 = require("../constants/messages");
5
5
  var helpers_1 = require("../helpers/helpers");
6
6
  var index_1 = require("../index");
@@ -41,6 +41,8 @@ exports.sendTransferUpdate = sendTransferUpdate;
41
41
  var initHttpGateway = function (response) {
42
42
  index_1.asperaSdk.globals.httpGatewayInfo = response;
43
43
  index_1.asperaSdk.globals.httpGatewayVerified = true;
44
+ var majorVersion = Number(response.version.split('.')[0] || 3);
45
+ index_1.asperaSdk.globals.httpGatewayRoutePrefix = majorVersion >= 3 ? '/v3' : '';
44
46
  if (index_1.asperaSdk.useOldHttpGateway) {
45
47
  // Watch for old HTTP Gateway transfers in case used.
46
48
  (0, http_gateway_sdk_js_1.registerActivityCallback)(function (oldHttpTransfers) {
@@ -58,6 +60,39 @@ var initHttpGateway = function (response) {
58
60
  return Promise.resolve();
59
61
  };
60
62
  exports.initHttpGateway = initHttpGateway;
63
+ /**
64
+ * Stop an in-progress HTTP Gateway transfer.
65
+ * Aborts the underlying HTTP request and sets the transfer status to 'canceled'.
66
+ *
67
+ * Note: If the download is being directly handled by the browser's download manager, this will return
68
+ * an error. The user must cancel the download themselves in the browser's download manger.
69
+ *
70
+ * @param id - ID of the transfer
71
+ *
72
+ * @returns Promise indicating success
73
+ */
74
+ var httpStopTransfer = function (id) {
75
+ if (index_1.asperaSdk.useOldHttpGateway) {
76
+ (0, http_gateway_sdk_js_1.cancelTransfer)(id);
77
+ return Promise.resolve();
78
+ }
79
+ var transfer = index_1.asperaSdk.httpGatewayTransferStore.get(id);
80
+ if (!transfer) {
81
+ return Promise.reject((0, helpers_1.generateErrorBody)(messages_1.messages.stopTransferFailed, { reason: 'Not found' }));
82
+ }
83
+ else if (transfer.httpDownloadExternalHandle) {
84
+ return Promise.reject((0, helpers_1.generateErrorBody)(messages_1.messages.stopTransferFailedExternal, { reason: 'External handle' }));
85
+ }
86
+ transfer.status = 'canceled';
87
+ var request = index_1.asperaSdk.httpGatewayRequestStore.get(id);
88
+ if (request) {
89
+ request.abort();
90
+ index_1.asperaSdk.httpGatewayRequestStore.delete(id);
91
+ }
92
+ (0, exports.sendTransferUpdate)(transfer);
93
+ return Promise.resolve();
94
+ };
95
+ exports.httpStopTransfer = httpStopTransfer;
61
96
  /**
62
97
  * Remove a transfer from HTTP Gateway systems
63
98
  * @param id - ID of the transfer
@@ -69,14 +104,18 @@ var httpRemoveTransfer = function (id) {
69
104
  (0, http_gateway_sdk_js_1.removeTransfer)(id);
70
105
  return Promise.resolve({ removed: true });
71
106
  }
72
- var transfer = index_1.asperaSdk.httpGatewayTransferStore.get(id);
73
- if (transfer) {
107
+ /* Cancel the transfer before removing it.
108
+ *
109
+ * Note: This is slightly different from the behavior in the v2 JS SDK. When removing
110
+ * a transfer, v2 will NOT cancel it beforehand. In the desktop and Connect transfer clients,
111
+ * removing a transfer also stops it, so we do the same here for HTTP Gateway v3.
112
+ */
113
+ return (0, exports.httpStopTransfer)(id)
114
+ .catch(function () { })
115
+ .then(function () {
74
116
  index_1.asperaSdk.httpGatewayTransferStore.delete(id);
75
- return Promise.resolve({ removed: true });
76
- }
77
- else {
78
- return Promise.reject((0, helpers_1.generateErrorBody)(messages_1.messages.removeTransferFailed, { reason: 'Not found' }));
79
- }
117
+ return { removed: true };
118
+ });
80
119
  };
81
120
  exports.httpRemoveTransfer = httpRemoveTransfer;
82
121
  /**
@@ -31,6 +31,7 @@ var httpDownloadPresigned = function (transferSpec, asperaSdkSpec) {
31
31
  (0, core_1.sendTransferUpdate)(transferObject);
32
32
  };
33
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 baseUrl = (url.origin + url.pathname).replace(/\/+$/, '');
34
35
  var headers = {
35
36
  'Content-Type': 'application/json',
36
37
  accept: 'application/json',
@@ -40,7 +41,7 @@ var httpDownloadPresigned = function (transferSpec, asperaSdkSpec) {
40
41
  headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
41
42
  }
42
43
  var protocol = url.protocol === 'https:' ? 'https' : 'http';
43
- return fetch("".concat(url.toString(), "/presign"), {
44
+ return fetch("".concat(baseUrl).concat(index_1.asperaSdk.globals.httpGatewayRoutePrefix, "/presign"), {
44
45
  method: 'POST',
45
46
  headers: headers,
46
47
  body: (0, helpers_1.safeJsonString)({
@@ -108,7 +109,7 @@ var httpDownloadInBrowser = function (transferSpec, asperaSdkSpec) {
108
109
  headers['Authorization'] = "Bearer ".concat(asperaSdkSpec.http_gateway_authentication.token);
109
110
  headers['X-Aspera-AccessKey'] = asperaSdkSpec.http_gateway_authentication.access_key;
110
111
  }
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
+ fetch("".concat((asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_override_server_url) || index_1.asperaSdk.globals.httpGatewayUrl).concat(index_1.asperaSdk.globals.httpGatewayRoutePrefix, "/download"), { method: 'GET', headers: headers }).then(function (data) {
112
113
  var responseHeaders = data.headers;
113
114
  transferObject.httpRequestId = responseHeaders.get('X-Request-Id');
114
115
  var chunks = [];
@@ -44,20 +44,25 @@ var httpUpload = function (transferSpec, asperaSdkSpec) {
44
44
  return (0, helpers_1.throwError)(messages_1.messages.fileNotAllowed, { type: 'upload', invalidFiles: hasBadFile, transferSpec: transferSpec });
45
45
  }
46
46
  var transferObject = (0, core_1.getSdkTransfer)(transferSpec);
47
+ index_1.asperaSdk.httpGatewayRequestStore.set(transferObject.uuid, request);
47
48
  if (asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_authentication) {
48
49
  request.setRequestHeader('Authorization', "Bearer ".concat(asperaSdkSpec.http_gateway_authentication.token));
49
50
  request.setRequestHeader('X-Aspera-AccessKey', asperaSdkSpec.http_gateway_authentication.access_key);
50
51
  }
51
- request.open('POST', "".concat((asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_override_server_url) || index_1.asperaSdk.globals.httpGatewayUrl, "/upload"), true);
52
+ request.open('POST', "".concat((asperaSdkSpec === null || asperaSdkSpec === void 0 ? void 0 : asperaSdkSpec.http_gateway_override_server_url) || index_1.asperaSdk.globals.httpGatewayUrl).concat(index_1.asperaSdk.globals.httpGatewayRoutePrefix, "/upload"), true);
52
53
  var triggerUpdate = function () {
53
54
  (0, core_1.sendTransferUpdate)(transferObject);
54
55
  };
55
56
  var triggerFailed = function () {
57
+ if (transferObject.status === 'canceled') {
58
+ return;
59
+ }
56
60
  var errorData = (0, core_1.getMessageFromError)(request.response);
57
61
  transferObject.httpRequestId = request.getResponseHeader('X-Request-Id');
58
62
  transferObject.status = 'failed';
59
63
  transferObject.error_code = errorData.code;
60
64
  transferObject.error_desc = errorData.message;
65
+ index_1.asperaSdk.httpGatewayRequestStore.delete(transferObject.uuid);
61
66
  triggerUpdate();
62
67
  };
63
68
  request.upload.addEventListener('progress', function (event) {
@@ -87,6 +92,7 @@ var httpUpload = function (transferSpec, asperaSdkSpec) {
87
92
  transferObject.bytes_written = event.loaded;
88
93
  transferObject.percentage = (event.loaded / event.total);
89
94
  }
95
+ index_1.asperaSdk.httpGatewayRequestStore.delete(transferObject.uuid);
90
96
  triggerUpdate();
91
97
  });
92
98
  request.upload.addEventListener('loadstart', function () {
@@ -1,11 +1,11 @@
1
1
  import { AsperaSdk } from './models/aspera-sdk.model';
2
- import { createDropzone, deregisterActivityCallback, deregisterStatusCallback, getAllTransfers, getCapabilities, getInfo, getTransfer, init, initDragDrop, modifyTransfer, readAsArrayBuffer, readChunkAsArrayBuffer, registerActivityCallback, registerStatusCallback, removeDropzone, removeTransfer, resumeTransfer, setBranding, showDirectory, showPreferences, showSelectFileDialog, showSelectFolderDialog, startTransfer, stopTransfer, testConnection } from './app/core';
2
+ import { createDropzone, deregisterActivityCallback, deregisterStatusCallback, getAllTransfers, getCapabilities, getChecksum, getFilesList, getInfo, getTransfer, init, initDragDrop, modifyTransfer, readAsArrayBuffer, readChunkAsArrayBuffer, registerActivityCallback, registerStatusCallback, removeDropzone, removeTransfer, resumeTransfer, setBranding, showDirectory, showPreferences, showSelectFileDialog, showSelectFolderDialog, startTransfer, stopTransfer, testConnection } from './app/core';
3
3
  import { getInstallerInfo } from './app/installer';
4
4
  import { getInstallerUrls, isSafari } from './helpers/helpers';
5
5
  export declare const asperaSdk: AsperaSdk;
6
6
  declare const launch: () => void;
7
- export { isSafari, init, testConnection, startTransfer, launch, registerActivityCallback, deregisterActivityCallback, removeTransfer, showDirectory, stopTransfer, resumeTransfer, getAllTransfers, getTransfer, showSelectFileDialog, showSelectFolderDialog, showPreferences, modifyTransfer, createDropzone, removeDropzone, initDragDrop, getInstallerInfo, registerStatusCallback, deregisterStatusCallback, setBranding, getInfo, readAsArrayBuffer, readChunkAsArrayBuffer, getInstallerUrls, getCapabilities, };
8
- export type { AsperaSdkSpec, AsperaSdkTransfer, BrowserStyleFile, CustomBrandingOptions, CustomTheme, CustomThemeItems, DataTransferResponse, FileDialogOptions, FileFilter, FolderDialogOptions, InitOptions, InstallerInfo, InstallerInfoResponse, InstallerOptions, InstallerUrlInfo, ModifyTransferOptions, OverwritePolicy, Path, ReadAsArrayBufferResponse, ReadChunkAsArrayBufferResponse, ResumePolicy, ResumeTransferOptions, SafariExtensionEvent, SdkCapabilities, TransferSpec, TransferStatus, WebsocketEvent, } from './models/models';
7
+ export { isSafari, init, testConnection, startTransfer, launch, registerActivityCallback, deregisterActivityCallback, removeTransfer, showDirectory, stopTransfer, resumeTransfer, getAllTransfers, getTransfer, getFilesList, showSelectFileDialog, showSelectFolderDialog, showPreferences, modifyTransfer, createDropzone, removeDropzone, initDragDrop, getInstallerInfo, registerStatusCallback, deregisterStatusCallback, setBranding, getInfo, readAsArrayBuffer, readChunkAsArrayBuffer, getInstallerUrls, getCapabilities, getChecksum, };
8
+ export type { AsperaSdkSpec, AsperaSdkTransfer, BrowserStyleFile, ChecksumFileResponse, CustomBrandingOptions, CustomTheme, CustomThemeItems, DataTransferResponse, FileDialogOptions, FileError, FileFilter, FileStat, FileStatus, FolderDialogOptions, GetChecksumOptions, InitOptions, InstallerInfo, InstallerInfoResponse, InstallerOptions, InstallerUrlInfo, ModifyTransferOptions, OverwritePolicy, PaginatedFilesResponse, Pagination, Path, ReadAsArrayBufferResponse, ReadChunkAsArrayBufferResponse, ResumePolicy, ResumeTransferOptions, SafariExtensionEvent, SdkCapabilities, TransferSpec, TransferStatus, WebsocketEvent, } from './models/models';
9
9
  export type { ActivityMessage, ActivityMessageTypes, AsperaSdkClientInfo, AsperaSdkInfo, TransferResponse, } from './models/aspera-sdk.model';
10
10
  export { AsperaSdk, AsperaSdkGlobals } from './models/aspera-sdk.model';
11
11
  export type { HttpGatewayInfo } from './http-gateway/models';
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.AsperaSdkGlobals = exports.AsperaSdk = exports.getCapabilities = exports.getInstallerUrls = exports.readChunkAsArrayBuffer = exports.readAsArrayBuffer = exports.getInfo = exports.setBranding = exports.deregisterStatusCallback = exports.registerStatusCallback = exports.getInstallerInfo = exports.initDragDrop = exports.removeDropzone = exports.createDropzone = exports.modifyTransfer = exports.showPreferences = exports.showSelectFolderDialog = exports.showSelectFileDialog = exports.getTransfer = exports.getAllTransfers = exports.resumeTransfer = exports.stopTransfer = exports.showDirectory = exports.removeTransfer = exports.deregisterActivityCallback = exports.registerActivityCallback = exports.launch = exports.startTransfer = exports.testConnection = exports.init = exports.isSafari = exports.asperaSdk = void 0;
36
+ exports.AsperaSdkGlobals = exports.AsperaSdk = exports.getChecksum = exports.getCapabilities = exports.getInstallerUrls = exports.readChunkAsArrayBuffer = exports.readAsArrayBuffer = exports.getInfo = exports.setBranding = exports.deregisterStatusCallback = exports.registerStatusCallback = exports.getInstallerInfo = exports.initDragDrop = exports.removeDropzone = exports.createDropzone = exports.modifyTransfer = exports.showPreferences = exports.showSelectFolderDialog = exports.showSelectFileDialog = exports.getFilesList = exports.getTransfer = exports.getAllTransfers = exports.resumeTransfer = exports.stopTransfer = exports.showDirectory = exports.removeTransfer = exports.deregisterActivityCallback = exports.registerActivityCallback = exports.launch = exports.startTransfer = exports.testConnection = exports.init = exports.isSafari = exports.asperaSdk = void 0;
37
37
  var aspera_sdk_model_1 = require("./models/aspera-sdk.model");
38
38
  var core_1 = require("./app/core");
39
39
  Object.defineProperty(exports, "createDropzone", { enumerable: true, get: function () { return core_1.createDropzone; } });
@@ -41,6 +41,8 @@ Object.defineProperty(exports, "deregisterActivityCallback", { enumerable: true,
41
41
  Object.defineProperty(exports, "deregisterStatusCallback", { enumerable: true, get: function () { return core_1.deregisterStatusCallback; } });
42
42
  Object.defineProperty(exports, "getAllTransfers", { enumerable: true, get: function () { return core_1.getAllTransfers; } });
43
43
  Object.defineProperty(exports, "getCapabilities", { enumerable: true, get: function () { return core_1.getCapabilities; } });
44
+ Object.defineProperty(exports, "getChecksum", { enumerable: true, get: function () { return core_1.getChecksum; } });
45
+ Object.defineProperty(exports, "getFilesList", { enumerable: true, get: function () { return core_1.getFilesList; } });
44
46
  Object.defineProperty(exports, "getInfo", { enumerable: true, get: function () { return core_1.getInfo; } });
45
47
  Object.defineProperty(exports, "getTransfer", { enumerable: true, get: function () { return core_1.getTransfer; } });
46
48
  Object.defineProperty(exports, "init", { enumerable: true, get: function () { return core_1.init; } });
@@ -79,6 +81,7 @@ exports.asperaSdk.stopTransfer = core_1.stopTransfer;
79
81
  exports.asperaSdk.resumeTransfer = core_1.resumeTransfer;
80
82
  exports.asperaSdk.getAllTransfers = core_1.getAllTransfers;
81
83
  exports.asperaSdk.getTransfer = core_1.getTransfer;
84
+ exports.asperaSdk.getFilesList = core_1.getFilesList;
82
85
  exports.asperaSdk.showSelectFileDialog = core_1.showSelectFileDialog;
83
86
  exports.asperaSdk.showSelectFolderDialog = core_1.showSelectFolderDialog;
84
87
  exports.asperaSdk.showPreferences = core_1.showPreferences;
@@ -96,6 +99,7 @@ exports.asperaSdk.readChunkAsArrayBuffer = core_1.readChunkAsArrayBuffer;
96
99
  exports.asperaSdk.isSafari = helpers_1.isSafari;
97
100
  exports.asperaSdk.getInstallerUrls = helpers_1.getInstallerUrls;
98
101
  exports.asperaSdk.getCapabilities = core_1.getCapabilities;
102
+ exports.asperaSdk.getChecksum = core_1.getChecksum;
99
103
  exports.asperaSdk.httpGatewayCalls = httpGatewayCalls;
100
104
  var launch = exports.asperaSdk.globals.launch;
101
105
  exports.launch = launch;
@@ -1,4 +1,4 @@
1
- import { CustomBrandingOptions, DataTransferResponse, AsperaSdkSpec, AsperaSdkTransfer, FileDialogOptions, FolderDialogOptions, InitOptions, InstallerInfoResponse, InstallerOptions, ModifyTransferOptions, ResumeTransferOptions, SafariExtensionEvent, TransferSpec, WebsocketEvent, InstallerUrlInfo, SdkCapabilities } from './models';
1
+ import { CustomBrandingOptions, DataTransferResponse, AsperaSdkSpec, AsperaSdkTransfer, FileDialogOptions, FolderDialogOptions, InitOptions, InstallerInfoResponse, InstallerOptions, ModifyTransferOptions, Pagination, PaginatedFilesResponse, ResumeTransferOptions, SafariExtensionEvent, TransferSpec, WebsocketEvent, InstallerUrlInfo, SdkCapabilities, GetChecksumOptions, ChecksumFileResponse } from './models';
2
2
  import { HttpGatewayInfo } from '../http-gateway/models';
3
3
  import * as ConnectTypes from '@ibm-aspera/connect-sdk-js/dist/esm/core/types';
4
4
  import { Connect, ConnectInstaller } from '@ibm-aspera/connect-sdk-js';
@@ -28,6 +28,8 @@ export declare class AsperaSdkGlobals {
28
28
  }[]>;
29
29
  /** HTTP Gateway URL after successful passing */
30
30
  httpGatewayUrl?: string;
31
+ /** Version-based route prefix for HTTP Gateway API endpoints (e.g. "/v3" for v3+, "" for v2) */
32
+ httpGatewayRoutePrefix: string;
31
33
  /** Indicate that the HTTP Gateway has been verified as working */
32
34
  httpGatewayVerified: boolean;
33
35
  /** HTTP Gateway info */
@@ -216,6 +218,8 @@ export declare class AsperaSdk {
216
218
  getInstallerInfo: (options: InstallerOptions) => Promise<InstallerInfoResponse>;
217
219
  /** Initialize drag and drop */
218
220
  initDragDrop: () => Promise<any>;
221
+ /** Function to get paginated file-level progress for a transfer */
222
+ getFilesList: (transferId: string, pagination?: Pagination) => Promise<PaginatedFilesResponse>;
219
223
  /** Function to get information about the IBM Aspera instance */
220
224
  getInfo: () => Promise<AsperaSdkInfo>;
221
225
  /** Function to read an entire file as an array buffer (base64-encoded) */
@@ -234,12 +238,16 @@ export declare class AsperaSdk {
234
238
  getInstallerUrls: () => InstallerUrlInfo;
235
239
  /** Function to get the SDK capabilities. */
236
240
  getCapabilities: () => SdkCapabilities;
241
+ /** Function to get a checksum for a file */
242
+ getChecksum: (options: GetChecksumOptions) => Promise<ChecksumFileResponse>;
237
243
  /** Indicate if Safari Extension is enabled. If the extension is disabled during the lifecycle this will not update to disabled. */
238
244
  SAFARI_EXTENSION_STATUS: SafariExtensionEvent;
239
245
  /** Aspera HTTP Gateway calls. This normally is not needed by clients but expose just in case. */
240
246
  httpGatewayCalls: unknown;
241
247
  /** Store of HTTP Gateway transfers */
242
248
  httpGatewayTransferStore: Map<string, AsperaSdkTransfer>;
249
+ /** Store of active HTTP Gateway XMLHttpRequests for cancellation. Key is transfer UUID. */
250
+ httpGatewayRequestStore: Map<string, XMLHttpRequest>;
243
251
  /** HTTP Gateway in app threshold limit. This can be changed globally for the app. */
244
252
  httpGatewayInBrowserDownloadThreshold: number;
245
253
  /**
@@ -35,6 +35,8 @@ var AsperaSdkGlobals = /** @class */ (function () {
35
35
  this.supportMultipleUsers = false;
36
36
  /** Map of drop zones created by querySelector */
37
37
  this.dropZonesCreated = new Map();
38
+ /** Version-based route prefix for HTTP Gateway API endpoints (e.g. "/v3" for v3+, "" for v2) */
39
+ this.httpGatewayRoutePrefix = '';
38
40
  /** Indicate that the HTTP Gateway has been verified as working */
39
41
  this.httpGatewayVerified = false;
40
42
  /** Connect status */
@@ -297,6 +299,8 @@ var AsperaSdk = /** @class */ (function () {
297
299
  this.SAFARI_EXTENSION_STATUS = 'DISABLED';
298
300
  /** Store of HTTP Gateway transfers */
299
301
  this.httpGatewayTransferStore = new Map();
302
+ /** Store of active HTTP Gateway XMLHttpRequests for cancellation. Key is transfer UUID. */
303
+ this.httpGatewayRequestStore = new Map();
300
304
  /** HTTP Gateway in app threshold limit. This can be changed globally for the app. */
301
305
  this.httpGatewayInBrowserDownloadThreshold = 1000000000;
302
306
  }
@@ -96,6 +96,24 @@ export interface ReadChunkAsArrayBufferResponse {
96
96
  /** Mime type of the file */
97
97
  type: string;
98
98
  }
99
+ /** Request to get a file checksum */
100
+ export interface GetChecksumOptions {
101
+ /** Absolute path to the file */
102
+ path: string;
103
+ /** Byte offset to start reading from. Default: 0 */
104
+ offset?: number;
105
+ /** Number of bytes to read. If 0, read entire file from offset to end. Default: 0 */
106
+ chunkSize?: number;
107
+ /** Hash algorithm to use. Default: 'md5' */
108
+ checksumMethod?: 'md5' | 'sha1' | 'sha256' | 'sha512';
109
+ }
110
+ /** Response containing file checksum information */
111
+ export interface ChecksumFileResponse {
112
+ /** Hexadecimal string representation of the computed hash */
113
+ checksum: string;
114
+ /** The algorithm used */
115
+ checksumMethod: 'md5' | 'sha1' | 'sha256' | 'sha512';
116
+ }
99
117
  export interface ModifyTransferOptions {
100
118
  /**
101
119
  * @deprecated Use `lock_min_rate_kbps` instead.
@@ -445,6 +463,48 @@ export interface TransferSpec {
445
463
  use_ascp4?: boolean;
446
464
  }
447
465
  export type TransferStatus = 'failed' | 'completed' | 'running' | 'queued' | 'removed' | 'canceled' | 'orphaned' | 'paused';
466
+ /** Pagination options for paginated API requests. */
467
+ export interface Pagination {
468
+ /** Maximum number of entries to return. (Default: 1000) */
469
+ limit?: number;
470
+ /** Number of entries to skip from the beginning. (Default: 0) */
471
+ offset?: number;
472
+ }
473
+ /** Paginated response containing file-level transfer progress. */
474
+ export interface PaginatedFilesResponse {
475
+ /** The file entries for this page. */
476
+ entries: FileStat[];
477
+ /** Total number of files in the transfer. */
478
+ total_count: number;
479
+ /** The limit used for the request. */
480
+ limit: number;
481
+ /** The offset used for the request. */
482
+ offset: number;
483
+ }
484
+ /** Status of an individual file within a transfer. */
485
+ export type FileStatus = 'failed' | 'skipped' | 'finished' | 'running';
486
+ /** Error information for a file that failed to transfer. */
487
+ export interface FileError {
488
+ /** Error code */
489
+ code: number;
490
+ /** Human-readable error description */
491
+ description: string;
492
+ }
493
+ /** Progress information for an individual file within a transfer. */
494
+ export interface FileStat {
495
+ /** The file path */
496
+ file: string;
497
+ /** Number of bytes written for this file */
498
+ bytes_written: number;
499
+ /** Number of bytes expected for this file */
500
+ bytes_expected: number;
501
+ /** Time elapsed in microseconds for this file */
502
+ elapsed_usec: number;
503
+ /** Error information if the file failed */
504
+ error?: FileError;
505
+ /** Status of this file */
506
+ status: FileStatus;
507
+ }
448
508
  export interface AsperaSdkTransfer {
449
509
  /** The ID of the transfer */
450
510
  uuid: string;
@@ -762,4 +822,8 @@ export interface SdkCapabilities {
762
822
  * with the required RPC methods.
763
823
  */
764
824
  imagePreview: boolean;
825
+ /**
826
+ * Whether the SDK can calculate checksums of a file chunk.
827
+ */
828
+ fileChecksum: boolean;
765
829
  }