@ibm-aspera/sdk 0.19.0 → 0.20.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.
Files changed (45) hide show
  1. package/dist/commonjs/app/core.d.ts +43 -17
  2. package/dist/commonjs/app/core.js +144 -28
  3. package/dist/commonjs/app/status.d.ts +11 -1
  4. package/dist/commonjs/app/status.js +35 -4
  5. package/dist/commonjs/connect/core.js +3 -0
  6. package/dist/commonjs/helpers/connect-extension.d.ts +8 -0
  7. package/dist/commonjs/helpers/connect-extension.js +58 -0
  8. package/dist/commonjs/helpers/helpers.d.ts +6 -0
  9. package/dist/commonjs/helpers/helpers.js +19 -1
  10. package/dist/commonjs/helpers/ws.d.ts +16 -0
  11. package/dist/commonjs/helpers/ws.js +49 -2
  12. package/dist/commonjs/http-gateway/core.js +10 -12
  13. package/dist/commonjs/http-gateway/download.js +2 -2
  14. package/dist/commonjs/http-gateway/upload.js +2 -2
  15. package/dist/commonjs/http-gateway/v2/app/core.d.ts +84 -0
  16. package/dist/commonjs/http-gateway/v2/app/core.js +170 -0
  17. package/dist/commonjs/http-gateway/v2/app/download.d.ts +15 -0
  18. package/dist/commonjs/http-gateway/v2/app/download.js +68 -0
  19. package/dist/commonjs/http-gateway/v2/app/upload.d.ts +169 -0
  20. package/dist/commonjs/http-gateway/v2/app/upload.js +601 -0
  21. package/dist/commonjs/http-gateway/v2/constants/constants.d.ts +6 -0
  22. package/dist/commonjs/http-gateway/v2/constants/constants.js +9 -0
  23. package/dist/commonjs/http-gateway/v2/constants/messages.d.ts +35 -0
  24. package/dist/commonjs/http-gateway/v2/constants/messages.js +38 -0
  25. package/dist/commonjs/http-gateway/v2/helpers/helpers.d.ts +121 -0
  26. package/dist/commonjs/http-gateway/v2/helpers/helpers.js +294 -0
  27. package/dist/commonjs/http-gateway/v2/helpers/http.d.ts +86 -0
  28. package/dist/commonjs/http-gateway/v2/helpers/http.js +153 -0
  29. package/dist/commonjs/http-gateway/v2/index.d.ts +35 -0
  30. package/dist/commonjs/http-gateway/v2/index.js +70 -0
  31. package/dist/commonjs/http-gateway/v2/models/http-gateway-global.model.d.ts +254 -0
  32. package/dist/commonjs/http-gateway/v2/models/http-gateway-global.model.js +367 -0
  33. package/dist/commonjs/http-gateway/v2/models/models.d.ts +127 -0
  34. package/dist/commonjs/http-gateway/v2/models/models.js +87 -0
  35. package/dist/commonjs/index.d.ts +3 -3
  36. package/dist/commonjs/index.js +3 -1
  37. package/dist/commonjs/models/aspera-sdk.model.d.ts +2 -1
  38. package/dist/commonjs/models/aspera-sdk.model.js +8 -0
  39. package/dist/commonjs/models/models.d.ts +10 -1
  40. package/dist/js/aspera-sdk.js +1 -1
  41. package/dist/js/aspera-sdk.js.LICENSE.txt +1 -1
  42. package/dist/js/aspera-sdk.js.map +1 -1
  43. package/package.json +1 -2
  44. package/scripts/release.sh +7 -7
  45. package/scripts/version.sh +24 -15
@@ -0,0 +1,601 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removeDropzone = exports.createDropzone = exports.upload = exports.startWebSocketTransfer = exports.getFoldersForUploadPromise = exports.getFoldersForUpload = exports.getFilesForUploadPromise = exports.getFilesForUpload = exports.addFolderPickerToForm = exports.addFilePickerToForm = exports.startSendingData = exports.handleSoftwareModeSlicing = exports.handleBlobSlicing = exports.updateTransferActivity = void 0;
4
+ var index_1 = require("../index");
5
+ var helpers_1 = require("../helpers/helpers");
6
+ var messages_1 = require("../constants/messages");
7
+ var models_1 = require("../models/models");
8
+ var constants_1 = require("../constants/constants");
9
+ var core_1 = require("./core");
10
+ /**
11
+ * Used to update the transfer in the activity monitor for a specific transfer. If transfer not found it is ignored
12
+ *
13
+ * @param id the id of the transfer to update
14
+ * @param status the status of the transfer
15
+ * @param total the total bytes of the transfer
16
+ * @param current the amount of bytes transferred thus far
17
+ * @param error error body
18
+ * @param currentFile the current file being transferred
19
+ */
20
+ var updateTransferActivity = function (id, status, total, current, error, currentFile) {
21
+ var transfer = index_1.asperaHttpGateway.activityTracking.getTransferById(id);
22
+ if (!transfer || transfer.status === 'cancelled' || transfer.status === 'completed') {
23
+ return;
24
+ }
25
+ transfer.status = status;
26
+ transfer.bytes_expected = total ? total : transfer.bytes_expected;
27
+ transfer.bytes_written = current ? current : transfer.bytes_written;
28
+ if (currentFile) {
29
+ transfer.current_file = currentFile.name;
30
+ }
31
+ if (status === 'completed' || status === 'failed') {
32
+ if (index_1.asperaHttpGateway.activityTracking.queuedUploads.length) {
33
+ var transferToStart = index_1.asperaHttpGateway.activityTracking.queuedUploads.shift();
34
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
35
+ (0, exports.startWebSocketTransfer)(transferToStart.id, transferToStart.transferSpec, transferToStart.files, undefined, { serverUrlOverride: transfer.serverUrlOverride || undefined });
36
+ }
37
+ }
38
+ if (status === 'completed') {
39
+ transfer.setEndTime();
40
+ index_1.asperaHttpGateway.globals.deleteFormFromContainer(id.split(constants_1.keySplit)[0]);
41
+ }
42
+ else if (status === 'failed') {
43
+ transfer.error_desc = error.reason;
44
+ transfer.error_code = error.code;
45
+ index_1.asperaHttpGateway.globals.deleteFormFromContainer(id.split(constants_1.keySplit)[0]);
46
+ }
47
+ index_1.asperaHttpGateway.activityTracking.triggerActivityCallbacks();
48
+ };
49
+ exports.updateTransferActivity = updateTransferActivity;
50
+ /**
51
+ * Slice a file and read it in with FileReader. This uses the callback to send the read event.
52
+ * This function supports falling back to vendor prefix versions
53
+ * of the slice function for older Firefox and Webkit browsers.
54
+ *
55
+ * @param file the file to slice
56
+ * @param filePosition the start position of the file to slice
57
+ * @param chunksize the end position of the file to slice
58
+ * @param callback the callback to use for FileReader
59
+ * @param fileReader the FileReader to use for reading in data
60
+ */
61
+ var handleBlobSlicing = function (file, filePosition, chunksize, callback, fileReader) {
62
+ var chunk;
63
+ if (typeof file.slice === 'function') {
64
+ chunk = file.slice(filePosition, filePosition + chunksize);
65
+ }
66
+ else if (typeof file.mozSlice === 'function') {
67
+ chunk = file.mozSlice(filePosition, filePosition + chunksize);
68
+ }
69
+ else if (typeof file.webkitSlice === 'function') {
70
+ chunk = file.webkitSlice(filePosition, filePosition + chunksize);
71
+ }
72
+ fileReader.onload = callback;
73
+ fileReader[(0, helpers_1.getFeatureFlag)('noBase64Encoding') ? 'readAsArrayBuffer' : 'readAsDataURL'](chunk);
74
+ };
75
+ exports.handleBlobSlicing = handleBlobSlicing;
76
+ /**
77
+ * Software mode version of `handleBlobSlicing` for dealing with Buffer instead of File API
78
+ *
79
+ * @param file the file to slice (data string is a FileSystem readFile in binary format)
80
+ * @param filePosition the start position of the file to slice
81
+ * @param chunksize the end position of the file to slice
82
+ * @param callback the callback to use for triggering event on slice
83
+ *
84
+ * @example
85
+ * ```javascript
86
+ * const fileInfo = fs.statSync(filePointer);
87
+ * const file = {
88
+ * data: fs.readFileSync(filePointer, {encoding: 'binary'}),
89
+ * size: fileInfo.size,
90
+ * type: 'file',
91
+ * lastModified: fileInfo.mtime.toISOString(),
92
+ * name: filePointer,
93
+ * }
94
+ * ```
95
+ */
96
+ var handleSoftwareModeSlicing = function (file, filePosition, chunksize, callback) {
97
+ var chunk = file.data.slice(filePosition, filePosition + chunksize);
98
+ callback({
99
+ total: chunk.length,
100
+ target: {
101
+ result: (0, helpers_1.getFeatureFlag)('noBase64Encoding') ? chunk : Buffer.from(chunk).toString('base64'),
102
+ }
103
+ });
104
+ };
105
+ exports.handleSoftwareModeSlicing = handleSoftwareModeSlicing;
106
+ /**
107
+ * Start sending chunked data through the opened websocket
108
+ *
109
+ * @param socket the WebSocket to use for data transfer
110
+ * @param transferSpec the transferSpec to send for the upload
111
+ * @param id the ID of the transfer for monitoring
112
+ * @param queue the array of functions to call for sending data
113
+ * @param fileReaderToUse the file reader to use for this transfer
114
+ */
115
+ var startSendingData = function (socket, transferSpec, files, id, queue, fileReaderToUse) {
116
+ var totalFileSize = 0;
117
+ var totalSentSize = 0;
118
+ files.forEach(function (file) {
119
+ totalFileSize += file.size;
120
+ });
121
+ (0, exports.updateTransferActivity)(id, 'running', totalFileSize);
122
+ files.forEach(function (file, index) {
123
+ var filePiece = 0;
124
+ var totalSlices = Math.ceil(file.size / index_1.asperaHttpGateway.globals.chunkSize);
125
+ var _loop_1 = function (filePosition) {
126
+ queue.push(function () {
127
+ var sendChunkCallback = function (event) {
128
+ var transfer = index_1.asperaHttpGateway.activityTracking.getTransferById(id);
129
+ if (transfer && transfer.status === 'failed') {
130
+ return;
131
+ }
132
+ if (transfer && transfer.status === 'cancelled') {
133
+ socket.close();
134
+ return;
135
+ }
136
+ var binaryString = event.target.result;
137
+ try {
138
+ if ((0, helpers_1.getFeatureFlag)('noBase64Encoding')) {
139
+ if (filePiece === 0) {
140
+ socket.send(JSON.stringify({
141
+ slice_upload: {
142
+ name: file.asperaDropPath || file.webkitRelativePath || file.name,
143
+ type: file.type,
144
+ size: file.size,
145
+ slice: filePiece,
146
+ total_slices: totalSlices,
147
+ fileIndex: index
148
+ }
149
+ }));
150
+ }
151
+ socket.send(binaryString);
152
+ if (filePiece === totalSlices - 1) {
153
+ socket.send(JSON.stringify({
154
+ slice_upload: {
155
+ name: file.asperaDropPath || file.webkitRelativePath || file.name,
156
+ type: file.type,
157
+ size: file.size,
158
+ slice: filePiece,
159
+ total_slices: totalSlices,
160
+ fileIndex: index
161
+ }
162
+ }));
163
+ }
164
+ }
165
+ else {
166
+ if (typeof event.target.result === 'string' && event.target.result.indexOf('base64,') > -1) {
167
+ binaryString = event.target.result.split('base64,')[1];
168
+ }
169
+ socket.send(JSON.stringify({
170
+ slice_upload: {
171
+ name: file.asperaDropPath || file.webkitRelativePath || file.name,
172
+ type: file.type,
173
+ size: file.size,
174
+ data: binaryString,
175
+ slice: filePiece,
176
+ total_slices: totalSlices,
177
+ fileIndex: index
178
+ }
179
+ }));
180
+ }
181
+ }
182
+ catch (error) {
183
+ (0, exports.updateTransferActivity)(id, 'failed');
184
+ (0, helpers_1.errorLog)(messages_1.messages.unableToParseDataForUpload, error);
185
+ throw Error();
186
+ }
187
+ filePiece++;
188
+ if (event.total) {
189
+ totalSentSize += event.total;
190
+ }
191
+ var foundTransfer = index_1.asperaHttpGateway.activityTracking.getTransferById(id);
192
+ if (foundTransfer) {
193
+ foundTransfer.recentPacketTransfer(event.total);
194
+ }
195
+ (0, exports.updateTransferActivity)(id, 'running', undefined, totalSentSize, undefined, file);
196
+ queue.shift();
197
+ };
198
+ if (index_1.asperaHttpGateway.globals.softwareMode) {
199
+ (0, exports.handleSoftwareModeSlicing)(file, filePosition, index_1.asperaHttpGateway.globals.chunkSize, sendChunkCallback);
200
+ }
201
+ else {
202
+ (0, exports.handleBlobSlicing)(file, filePosition, index_1.asperaHttpGateway.globals.chunkSize, sendChunkCallback, fileReaderToUse);
203
+ }
204
+ });
205
+ };
206
+ for (var filePosition = 0; filePosition < file.size; filePosition += index_1.asperaHttpGateway.globals.chunkSize) {
207
+ _loop_1(filePosition);
208
+ }
209
+ });
210
+ try {
211
+ socket.send(JSON.stringify({
212
+ transfer_spec: transferSpec
213
+ }));
214
+ }
215
+ catch (error) {
216
+ (0, exports.updateTransferActivity)(id, 'failed');
217
+ (0, helpers_1.errorLog)(messages_1.messages.unableToParseDataForUpload, error);
218
+ throw Error();
219
+ }
220
+ };
221
+ exports.startSendingData = startSendingData;
222
+ /**
223
+ * Add file input to a form for getting files from the local computer
224
+ *
225
+ * @param form form to add new file input to
226
+ */
227
+ var addFilePickerToForm = function (form) {
228
+ var element = document.createElement('input');
229
+ element.type = 'file';
230
+ element.multiple = true;
231
+ element.name = 'file-' + form.children.length;
232
+ form.appendChild(element);
233
+ return element;
234
+ };
235
+ exports.addFilePickerToForm = addFilePickerToForm;
236
+ /**
237
+ * Add file input to a form with folder support for getting folders from the local computer
238
+ *
239
+ * NOTE: this cannot stop files from being picked.
240
+ *
241
+ * @param form form to add new file input to
242
+ */
243
+ var addFolderPickerToForm = function (form) {
244
+ var element = document.createElement('input');
245
+ element.type = 'file';
246
+ element.multiple = true;
247
+ element.webkitdirectory = true;
248
+ element.mozdirectory = true;
249
+ element.msdirectory = true;
250
+ element.odirectory = true;
251
+ element.directory = true;
252
+ element.name = 'file-' + form.children.length;
253
+ form.appendChild(element);
254
+ return element;
255
+ };
256
+ exports.addFolderPickerToForm = addFolderPickerToForm;
257
+ /**
258
+ * Request file picker for choosing files
259
+ *
260
+ * @param id the ID of the form to use (must be unique to each transfer grouping)
261
+ * @param callback the function to call once the files are added
262
+ */
263
+ var getFilesForUpload = function (callback, id) {
264
+ if (!index_1.asperaHttpGateway.isReady) {
265
+ (0, helpers_1.errorLog)(messages_1.messages.serverNotVerified);
266
+ return;
267
+ }
268
+ var formToUse = index_1.asperaHttpGateway.globals.createOrUseForm(id);
269
+ var inputFile = (0, exports.addFilePickerToForm)(formToUse);
270
+ inputFile.onchange = function () {
271
+ var files = [];
272
+ if (!inputFile.files) {
273
+ callback({ dataTransfer: { files: files } });
274
+ return;
275
+ }
276
+ for (var i = 0; i < inputFile.files.length; i++) {
277
+ files.push(new models_1.FileSelected(inputFile.files[i]));
278
+ }
279
+ callback({ dataTransfer: { files: files } });
280
+ };
281
+ inputFile.click();
282
+ };
283
+ exports.getFilesForUpload = getFilesForUpload;
284
+ /**
285
+ * Request file picker for choosing files and use promise.
286
+ * Uses `getFilesForUpload` logic wrapped in a Promise
287
+ *
288
+ * @param id the ID of the form to use (must be unique to each transfer grouping)
289
+ *
290
+ * @returns promise that resolves with the files (error state is never used)
291
+ */
292
+ var getFilesForUploadPromise = function (id) {
293
+ var promiseToUse = (0, helpers_1.generatePromiseObjects)();
294
+ var promiseCallback = function (data) {
295
+ promiseToUse.resolver(data);
296
+ };
297
+ (0, exports.getFilesForUpload)(promiseCallback, id);
298
+ return promiseToUse.promise;
299
+ };
300
+ exports.getFilesForUploadPromise = getFilesForUploadPromise;
301
+ /**
302
+ * Request folder picker for choosing folders
303
+ * @remarks Feature not supported. Will be introduced in future release.
304
+ *
305
+ * @param id the ID of the form to use (must be unique to each transfer grouping)
306
+ * @param callback the function to call once the folders are added
307
+ */
308
+ var getFoldersForUpload = function (callback, id) {
309
+ if (!index_1.asperaHttpGateway.isReady) {
310
+ (0, helpers_1.errorLog)(messages_1.messages.serverNotVerified);
311
+ return;
312
+ }
313
+ var formToUse = index_1.asperaHttpGateway.globals.createOrUseForm(id);
314
+ var inputFile = (0, exports.addFolderPickerToForm)(formToUse);
315
+ inputFile.onchange = function () {
316
+ var files = [];
317
+ var folders = new Map();
318
+ if (!inputFile.files) {
319
+ callback({ dataTransfer: { files: files } });
320
+ return;
321
+ }
322
+ for (var i = 0; i < inputFile.files.length; i++) {
323
+ var file = inputFile.files[i];
324
+ if (file.webkitRelativePath) {
325
+ // TODO: Does Windows return using forward slash?
326
+ var rootFolder = file.webkitRelativePath.split('/')[0];
327
+ if (!folders.get(rootFolder)) {
328
+ folders.set(rootFolder, { path: rootFolder, files: [] });
329
+ }
330
+ folders.get(rootFolder).files.push(file);
331
+ }
332
+ else {
333
+ files.push(new models_1.FileSelected(inputFile.files[i]));
334
+ }
335
+ }
336
+ var formFolderData = index_1.asperaHttpGateway.globals.getOrCreateFolderDataList(id);
337
+ (0, helpers_1.iterableToArray)(folders.values()).forEach(function (folder) {
338
+ formFolderData.set(folder.path, folder);
339
+ files.push(new models_1.FileSelected({ name: folder.path, size: 0, type: 'inode/directory' }));
340
+ });
341
+ callback({ dataTransfer: { files: files } });
342
+ };
343
+ inputFile.click();
344
+ };
345
+ exports.getFoldersForUpload = getFoldersForUpload;
346
+ /**
347
+ * Request folder picker for choosing folders and use promise.
348
+ * Uses `getFoldersForUpload` logic wrapped in a Promise
349
+ * @remarks Feature not supported. Will be introduced in future release.
350
+ *
351
+ * @param id the ID of the form to use (must be unique to each transfer grouping)
352
+ *
353
+ * @returns promise that resolves with the folders/file list (error state is never used)
354
+ */
355
+ var getFoldersForUploadPromise = function (id) {
356
+ var promiseToUse = (0, helpers_1.generatePromiseObjects)();
357
+ var promiseCallback = function (data) {
358
+ promiseToUse.resolver(data);
359
+ };
360
+ (0, exports.getFoldersForUpload)(promiseCallback, id);
361
+ return promiseToUse.promise;
362
+ };
363
+ exports.getFoldersForUploadPromise = getFoldersForUploadPromise;
364
+ /**
365
+ * Start the Websockets and transfer
366
+ *
367
+ * @param id the ID to use for the transfer
368
+ * @param transferSpec the transferSpec of the transfer
369
+ * @param files the files to transfer
370
+ * @param promiseInfo the promise data to resolve for the transfer if needed
371
+ */
372
+ var startWebSocketTransfer = function (id, transferSpec, files, promiseInfo, options) {
373
+ if (options === void 0) { options = {}; }
374
+ var queue = [];
375
+ var fileReaderToUse = typeof FileReader === 'function' ? new FileReader() : null;
376
+ var finalServerUrl = options.serverUrlOverride ? (0, core_1.cleanupServerUrl)(options.serverUrlOverride) : index_1.asperaHttpGateway.globals.serverUrl;
377
+ var socket = new WebSocket((0, helpers_1.getWebsocketUrl)(finalServerUrl, location.protocol));
378
+ socket.onopen = function (data) {
379
+ if (promiseInfo) {
380
+ promiseInfo.resolver(data);
381
+ }
382
+ index_1.asperaHttpGateway.activityTracking.setTransfer(id, new models_1.HttpTransfer(id, transferSpec, files, undefined, { serverUrlOverride: options.serverUrlOverride }));
383
+ (0, exports.startSendingData)(socket, transferSpec, files, id, queue, fileReaderToUse);
384
+ };
385
+ socket.onclose = function (data) {
386
+ var transfer = index_1.asperaHttpGateway.activityTracking.getTransferById(id);
387
+ if (transfer && transfer.status !== 'completed') {
388
+ (0, exports.updateTransferActivity)(id, 'failed', undefined, undefined, data);
389
+ (0, helpers_1.errorLog)(messages_1.messages.websocketClosedUnexpect, { error: data });
390
+ }
391
+ };
392
+ socket.onmessage = function (data) {
393
+ if (data.data === 'end upload') {
394
+ // TODO: check if fileReader is available due to dupe `end upload` events
395
+ if (queue.length) {
396
+ queue[0]();
397
+ }
398
+ else {
399
+ setTimeout(function () {
400
+ socket.close(1000);
401
+ }, 5000);
402
+ (0, exports.updateTransferActivity)(id, 'completed');
403
+ }
404
+ }
405
+ };
406
+ socket.onerror = function (error) {
407
+ (0, helpers_1.errorLog)(messages_1.messages.websocketClosedUnexpect, error);
408
+ (0, exports.updateTransferActivity)(id, 'failed', undefined, undefined, error);
409
+ if (promiseInfo) {
410
+ promiseInfo.rejecter(error);
411
+ }
412
+ };
413
+ };
414
+ exports.startWebSocketTransfer = startWebSocketTransfer;
415
+ /**
416
+ * Start a HTTP Gateway upload.
417
+ *
418
+ * @param transferSpec standard Connect transferSpec for uploading
419
+ * @param id the ID of the form group to use for files
420
+ * @param memoryFilesToLoad array of files from memory to use. These will be used all the time and if transferSpec does not contain them an error will raise.
421
+ * @param options options for customizing the upload
422
+ *
423
+ * @returns a promise that resolves if upload is successful and rejects if upload cannot be started
424
+ */
425
+ var upload = function (transferSpec, id, memoryFilesToLoad, options) {
426
+ if (options === void 0) { options = {}; }
427
+ if (!index_1.asperaHttpGateway.isReady) {
428
+ (0, helpers_1.errorLog)(messages_1.messages.serverNotVerified);
429
+ return new Promise(function (resolve, reject) {
430
+ reject((0, helpers_1.generateErrorBody)(messages_1.messages.serverNotVerified));
431
+ });
432
+ }
433
+ if (!(0, helpers_1.isValidTransferSpec)(transferSpec)) {
434
+ (0, helpers_1.errorLog)(messages_1.messages.notValidTransferSpec);
435
+ return new Promise(function (resolve, reject) {
436
+ reject((0, helpers_1.generateErrorBody)(messages_1.messages.notValidTransferSpec, { transferSpec: transferSpec }));
437
+ });
438
+ }
439
+ var files = (0, helpers_1.getFilesForTransfer)(id, transferSpec);
440
+ if (memoryFilesToLoad) {
441
+ memoryFilesToLoad.forEach(function (file) {
442
+ files.push(file);
443
+ });
444
+ }
445
+ var folderExplodeData = (0, helpers_1.folderTransferSpecExplode)(id, transferSpec);
446
+ if (folderExplodeData.files.length) {
447
+ folderExplodeData.files.forEach(function (file) {
448
+ files.push(file);
449
+ });
450
+ transferSpec.paths = folderExplodeData.newPath;
451
+ }
452
+ if (!files.length) {
453
+ (0, helpers_1.errorLog)(messages_1.messages.unableToGetFilesForUpload);
454
+ return new Promise(function (resolve, reject) {
455
+ reject((0, helpers_1.generateErrorBody)(messages_1.messages.unableToGetFilesForUpload, { transferSpec: transferSpec, files: files }));
456
+ });
457
+ }
458
+ else if (files.length !== transferSpec.paths.length) {
459
+ (0, helpers_1.errorLog)(messages_1.messages.unauthorizedFilesForUpload);
460
+ return new Promise(function (resolve, reject) {
461
+ reject((0, helpers_1.generateErrorBody)(messages_1.messages.unauthorizedFilesForUpload, { transferSpec: transferSpec, files: files }));
462
+ });
463
+ }
464
+ var promiseInfo = (0, helpers_1.generatePromiseObjects)();
465
+ id = "".concat(id).concat(constants_1.keySplit).concat((Math.random() * 10000000).toFixed());
466
+ var currentRunningTransfers = index_1.asperaHttpGateway.activityTracking.getActiveTransfers();
467
+ if (currentRunningTransfers.length >= index_1.asperaHttpGateway.globals.concurrentUploads) {
468
+ index_1.asperaHttpGateway.activityTracking.queuedUploads.push({ id: id, transferSpec: transferSpec, files: files });
469
+ index_1.asperaHttpGateway.activityTracking.setTransfer(id, new models_1.HttpTransfer(id, transferSpec, files, 'queued', { serverUrlOverride: options.serverUrlOverride }));
470
+ setTimeout(function () {
471
+ promiseInfo.resolver({});
472
+ }, 100);
473
+ }
474
+ else {
475
+ (0, exports.startWebSocketTransfer)(id, transferSpec, files, promiseInfo, options);
476
+ }
477
+ return promiseInfo.promise;
478
+ };
479
+ exports.upload = upload;
480
+ /**
481
+ * Create a dropzone linked to a form grouping.
482
+ * All drops are stored in same place to allow body drops.
483
+ *
484
+ * @param callback the function to call once the files are dropped
485
+ * @param elementSelector the selector of the element on the page that should watch for drop events
486
+ */
487
+ var createDropzone = function (callback, elementSelector) {
488
+ var elements = document.querySelectorAll(elementSelector);
489
+ if (!elements || !elements.length) {
490
+ (0, helpers_1.errorLog)(messages_1.messages.unableToFindElementOnPage);
491
+ return;
492
+ }
493
+ index_1.asperaHttpGateway.globals.createOrUseForm(constants_1.dropContainerName);
494
+ var currentFiles = index_1.asperaHttpGateway.globals.getOrCreateFormFileListFromDrop(constants_1.dropContainerName);
495
+ var formFolderData = index_1.asperaHttpGateway.globals.getOrCreateFolderDataList(constants_1.dropContainerName);
496
+ var dragEvent = function (event) {
497
+ event.preventDefault();
498
+ };
499
+ var dropEvent = function (event) {
500
+ event.preventDefault();
501
+ var files = [];
502
+ if (event.dataTransfer && event.dataTransfer.items && event.dataTransfer.items.length && event.dataTransfer.items[0] && event.dataTransfer.items[0].kind !== 'string') {
503
+ try {
504
+ var _loop_2 = function (i) {
505
+ var fileEntry = event.dataTransfer.items[i].webkitGetAsEntry();
506
+ if (fileEntry.isFile) {
507
+ var file = event.dataTransfer.items[i].getAsFile();
508
+ currentFiles.push(file);
509
+ files.push({
510
+ lastModified: file.lastModified,
511
+ name: file.name,
512
+ size: file.size,
513
+ type: file.type
514
+ });
515
+ }
516
+ else if (fileEntry.isDirectory) {
517
+ var folder_1 = {
518
+ path: fileEntry.name,
519
+ files: [],
520
+ };
521
+ files.push({
522
+ lastModified: 0,
523
+ name: fileEntry.name,
524
+ size: 0,
525
+ type: 'inode/directory'
526
+ });
527
+ var recursiveReader_1 = function (entry) {
528
+ var reader = entry.createReader();
529
+ reader.readEntries(function (entries) {
530
+ entries.forEach(function (entryItem) {
531
+ if (entryItem.isFile) {
532
+ entryItem.file(function (file) {
533
+ file.asperaDropPath = entryItem.fullPath;
534
+ folder_1.files.push(file);
535
+ });
536
+ }
537
+ else if (entryItem.isDirectory) {
538
+ recursiveReader_1(entryItem);
539
+ }
540
+ });
541
+ formFolderData.set(folder_1.path, folder_1);
542
+ });
543
+ };
544
+ recursiveReader_1(fileEntry);
545
+ }
546
+ };
547
+ for (var i = 0; i < event.dataTransfer.items.length; i++) {
548
+ _loop_2(i);
549
+ }
550
+ }
551
+ catch (error) {
552
+ (0, helpers_1.errorLog)(messages_1.messages.unableToReadFolder, { event: event, error: error });
553
+ alert(messages_1.messages.unableToReadFolder);
554
+ }
555
+ }
556
+ else if (event.dataTransfer.files) {
557
+ for (var i = 0; i < event.dataTransfer.files.length; i++) {
558
+ currentFiles.push(event.dataTransfer.files[i]);
559
+ files.push(event.dataTransfer.files[i]);
560
+ }
561
+ }
562
+ callback({ event: event, files: { dataTransfer: { files: files } } });
563
+ };
564
+ elements.forEach(function (element) {
565
+ element.addEventListener('dragover', dragEvent);
566
+ element.addEventListener('drop', dropEvent);
567
+ index_1.asperaHttpGateway.globals.dropzonesCreated.set(elementSelector, [{ event: 'dragover', callback: dragEvent }, { event: 'drop', callback: dropEvent }]);
568
+ });
569
+ };
570
+ exports.createDropzone = createDropzone;
571
+ /**
572
+ * Remove dropzone added by gateway.
573
+ *
574
+ * @param elementSelector the selector of the element on the page that should remove
575
+ */
576
+ var removeDropzone = function (elementSelector) {
577
+ var foundDropzone = index_1.asperaHttpGateway.globals.dropzonesCreated.get(elementSelector);
578
+ if (foundDropzone) {
579
+ foundDropzone.forEach(function (data) {
580
+ var elements = document.querySelectorAll(elementSelector);
581
+ if (elements && elements.length) {
582
+ elements.forEach(function (element) {
583
+ element.removeEventListener(data.event, data.callback);
584
+ });
585
+ }
586
+ });
587
+ }
588
+ };
589
+ exports.removeDropzone = removeDropzone;
590
+ exports.default = {
591
+ upload: exports.upload,
592
+ updateTransferActivity: exports.updateTransferActivity,
593
+ startSendingData: exports.startSendingData,
594
+ addFilePickerToForm: exports.addFilePickerToForm,
595
+ createDropzone: exports.createDropzone,
596
+ removeDropzone: exports.removeDropzone,
597
+ getFilesForUploadPromise: exports.getFilesForUploadPromise,
598
+ getFilesForUpload: exports.getFilesForUpload,
599
+ getFoldersForUploadPromise: exports.getFoldersForUploadPromise,
600
+ getFoldersForUpload: exports.getFoldersForUpload,
601
+ };
@@ -0,0 +1,6 @@
1
+ /** @ignore */
2
+ export declare const hiddenStyleList = "\n display: none !important;\n width: 1px !important;\n height: 1px !important;\n position: fixed !important;\n z-index: -99 !important;\n bottom: 0px !important;\n right: 0px !important;\n";
3
+ /** @ignore */
4
+ export declare const keySplit = "-*ASPGTW*-";
5
+ /** @ignore */
6
+ export declare const dropContainerName = "http-dropzone-container";
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dropContainerName = exports.keySplit = exports.hiddenStyleList = void 0;
4
+ /** @ignore */
5
+ exports.hiddenStyleList = "\n display: none !important;\n width: 1px !important;\n height: 1px !important;\n position: fixed !important;\n z-index: -99 !important;\n bottom: 0px !important;\n right: 0px !important;\n";
6
+ /** @ignore */
7
+ exports.keySplit = '-*ASPGTW*-';
8
+ /** @ignore */
9
+ exports.dropContainerName = 'http-dropzone-container';
@@ -0,0 +1,35 @@
1
+ /** @ignore */
2
+ export declare const messages: {
3
+ serverUrlNotSet: string;
4
+ serverError: string;
5
+ serverNotVerified: string;
6
+ downloadFailed: string;
7
+ streamFailed: string;
8
+ notValidTransferSpec: string;
9
+ invalidServerUrl: string;
10
+ unableToGetFilesForUpload: string;
11
+ unableToUpload: string;
12
+ failedToGetDownloadUrl: string;
13
+ failedToGetStreamUrl: string;
14
+ streamInjectDomInvalid: string;
15
+ failedToGenerateIframe: string;
16
+ callbackIsNotFunction: string;
17
+ websocketClosedUnexpect: string;
18
+ invalidChunkSize: string;
19
+ invalidConcurrentUploads: string;
20
+ unableToParseDataForUpload: string;
21
+ unableToDeepCopyObject: string;
22
+ unableToFindElementOnPage: string;
23
+ unauthorizedFilesForUpload: string;
24
+ startDownload: string;
25
+ dropFoldersNotAllowed: string;
26
+ yes: string;
27
+ no: string;
28
+ close: string;
29
+ leavingWhileUploading: string;
30
+ unableToReadFolder: string;
31
+ streamingTooManyFiles: string;
32
+ loadingDownload: string;
33
+ versionNotsupported: string;
34
+ deprecationWarning: string;
35
+ };