@protontech/drive-sdk 0.0.11 → 0.0.13
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/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/interface.d.ts +105 -0
- package/dist/cache/interface.js +3 -0
- package/dist/cache/interface.js.map +1 -0
- package/dist/cache/memoryCache.d.ts +18 -0
- package/dist/cache/memoryCache.js +78 -0
- package/dist/cache/memoryCache.js.map +1 -0
- package/dist/cache/memoryCache.test.d.ts +1 -0
- package/dist/cache/memoryCache.test.js +121 -0
- package/dist/cache/memoryCache.test.js.map +1 -0
- package/dist/crypto/hmac.d.ts +22 -0
- package/dist/crypto/hmac.js +44 -0
- package/dist/crypto/hmac.js.map +1 -0
- package/dist/crypto/utils.d.ts +2 -0
- package/dist/crypto/utils.js +35 -0
- package/dist/crypto/utils.js.map +1 -0
- package/dist/errors.d.ts +142 -0
- package/dist/errors.js +168 -0
- package/dist/errors.js.map +1 -0
- package/dist/interface/account.js +3 -0
- package/dist/interface/account.js.map +1 -0
- package/dist/interface/author.d.ts +26 -0
- package/dist/interface/author.js +3 -0
- package/dist/interface/author.js.map +1 -0
- package/dist/interface/download.d.ts +29 -0
- package/dist/interface/download.js +3 -0
- package/dist/interface/download.js.map +1 -0
- package/dist/interface/httpClient.d.ts +38 -0
- package/dist/interface/httpClient.js +3 -0
- package/dist/interface/httpClient.js.map +1 -0
- package/dist/interface/index.d.ts +1 -1
- package/dist/interface/nodes.d.ts +12 -1
- package/dist/interface/nodes.js +11 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/result.d.ts +9 -0
- package/dist/interface/result.js +11 -0
- package/dist/interface/result.js.map +1 -0
- package/dist/interface/thumbnail.d.ts +17 -0
- package/dist/interface/thumbnail.js +9 -0
- package/dist/interface/thumbnail.js.map +1 -0
- package/dist/interface/upload.d.ts +64 -0
- package/dist/interface/upload.js +3 -0
- package/dist/interface/upload.js.map +1 -0
- package/dist/internal/apiService/driveTypes.d.ts +1341 -465
- package/dist/internal/apiService/errorCodes.d.ts +30 -0
- package/dist/internal/apiService/errorCodes.js +11 -0
- package/dist/internal/apiService/errorCodes.js.map +1 -0
- package/dist/internal/apiService/errors.js +2 -2
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/observerStream.d.ts +3 -0
- package/dist/internal/apiService/observerStream.js +15 -0
- package/dist/internal/apiService/observerStream.js.map +1 -0
- package/dist/internal/apiService/transformers.js +2 -0
- package/dist/internal/apiService/transformers.js.map +1 -1
- package/dist/internal/asyncIteratorMap.d.ts +15 -0
- package/dist/internal/asyncIteratorMap.js +59 -0
- package/dist/internal/asyncIteratorMap.js.map +1 -0
- package/dist/internal/asyncIteratorMap.test.d.ts +1 -0
- package/dist/internal/asyncIteratorMap.test.js +120 -0
- package/dist/internal/asyncIteratorMap.test.js.map +1 -0
- package/dist/internal/batchLoading.d.ts +34 -0
- package/dist/internal/batchLoading.js +68 -0
- package/dist/internal/batchLoading.js.map +1 -0
- package/dist/internal/batchLoading.test.d.ts +1 -0
- package/dist/internal/batchLoading.test.js +50 -0
- package/dist/internal/batchLoading.test.js.map +1 -0
- package/dist/internal/download/controller.d.ts +8 -0
- package/dist/internal/download/controller.js +22 -0
- package/dist/internal/download/controller.js.map +1 -0
- package/dist/internal/download/queue.d.ts +5 -0
- package/dist/internal/download/queue.js +31 -0
- package/dist/internal/download/queue.js.map +1 -0
- package/dist/internal/errors.js +28 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/errors.test.js +22 -0
- package/dist/internal/errors.test.js.map +1 -0
- package/dist/internal/events/interface.d.ts +47 -0
- package/dist/internal/events/interface.js +12 -0
- package/dist/internal/events/interface.js.map +1 -0
- package/dist/internal/nodes/apiService.d.ts +2 -2
- package/dist/internal/nodes/apiService.js +16 -6
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +30 -8
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.js +1 -0
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +1 -0
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +34 -0
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/index.test.js +3 -1
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +3 -1
- package/dist/internal/nodes/mediaTypes.d.ts +2 -0
- package/dist/internal/nodes/mediaTypes.js +13 -0
- package/dist/internal/nodes/mediaTypes.js.map +1 -0
- package/dist/internal/nodes/nodesAccess.js +28 -7
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +7 -6
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/validations.d.ts +4 -0
- package/dist/internal/nodes/validations.js +21 -0
- package/dist/internal/nodes/validations.js.map +1 -0
- package/dist/internal/sharing/apiService.js +19 -2
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/uids.d.ts +38 -0
- package/dist/internal/uids.js +85 -0
- package/dist/internal/uids.js.map +1 -0
- package/dist/internal/upload/chunkStreamReader.d.ts +13 -0
- package/dist/internal/upload/chunkStreamReader.js +46 -0
- package/dist/internal/upload/chunkStreamReader.js.map +1 -0
- package/dist/internal/upload/chunkStreamReader.test.d.ts +1 -0
- package/dist/internal/upload/chunkStreamReader.test.js +75 -0
- package/dist/internal/upload/chunkStreamReader.test.js.map +1 -0
- package/dist/internal/upload/controller.d.ts +8 -0
- package/dist/internal/upload/controller.js +25 -0
- package/dist/internal/upload/controller.js.map +1 -0
- package/dist/internal/upload/digests.d.ts +8 -0
- package/dist/internal/upload/digests.js +22 -0
- package/dist/internal/upload/digests.js.map +1 -0
- package/dist/internal/upload/fileUploader.d.ts +49 -53
- package/dist/internal/upload/fileUploader.js +91 -395
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +38 -292
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +3 -3
- package/dist/internal/upload/index.js +20 -41
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/manager.d.ts +1 -1
- package/dist/internal/upload/manager.js +16 -19
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +42 -83
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/queue.d.ts +5 -0
- package/dist/internal/upload/queue.js +32 -0
- package/dist/internal/upload/queue.js.map +1 -0
- package/dist/internal/upload/streamUploader.d.ts +62 -0
- package/dist/internal/upload/streamUploader.js +441 -0
- package/dist/internal/upload/streamUploader.js.map +1 -0
- package/dist/internal/upload/streamUploader.test.d.ts +1 -0
- package/dist/internal/upload/streamUploader.test.js +358 -0
- package/dist/internal/upload/streamUploader.test.js.map +1 -0
- package/dist/internal/utils.d.ts +1 -0
- package/dist/internal/utils.js +13 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/internal/wait.d.ts +3 -0
- package/dist/internal/wait.js +28 -0
- package/dist/internal/wait.js.map +1 -0
- package/dist/internal/wait.test.d.ts +1 -0
- package/dist/internal/wait.test.js +21 -0
- package/dist/internal/wait.test.js.map +1 -0
- package/dist/protonDriveClient.d.ts +4 -4
- package/dist/protonDriveClient.js +1 -1
- package/dist/protonDriveClient.js.map +1 -1
- package/package.json +2 -2
- package/src/errors.ts +10 -4
- package/src/interface/index.ts +1 -1
- package/src/interface/nodes.ts +11 -0
- package/src/interface/upload.ts +53 -3
- package/src/internal/apiService/driveTypes.ts +1341 -465
- package/src/internal/apiService/errors.ts +3 -2
- package/src/internal/apiService/transformers.ts +2 -0
- package/src/internal/asyncIteratorMap.test.ts +150 -0
- package/src/internal/asyncIteratorMap.ts +64 -0
- package/src/internal/nodes/apiService.test.ts +36 -7
- package/src/internal/nodes/apiService.ts +19 -7
- package/src/internal/nodes/cache.test.ts +1 -0
- package/src/internal/nodes/cache.ts +1 -0
- package/src/internal/nodes/cryptoService.test.ts +38 -0
- package/src/internal/nodes/index.test.ts +3 -1
- package/src/internal/nodes/interface.ts +4 -1
- package/src/internal/nodes/nodesAccess.test.ts +7 -6
- package/src/internal/nodes/nodesAccess.ts +30 -7
- package/src/internal/sharing/apiService.ts +24 -2
- package/src/internal/upload/fileUploader.test.ts +46 -376
- package/src/internal/upload/fileUploader.ts +114 -494
- package/src/internal/upload/index.ts +26 -50
- package/src/internal/upload/manager.test.ts +45 -92
- package/src/internal/upload/manager.ts +30 -32
- package/src/internal/upload/streamUploader.test.ts +469 -0
- package/src/internal/upload/streamUploader.ts +552 -0
- package/src/protonDriveClient.ts +5 -4
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const enum HTTPErrorCode {
|
|
2
|
+
OK = 200,
|
|
3
|
+
NOT_FOUND = 404,
|
|
4
|
+
TOO_MANY_REQUESTS = 429,
|
|
5
|
+
INTERNAL_SERVER_ERROR = 500
|
|
6
|
+
}
|
|
7
|
+
export declare function isCodeOk(code: number): boolean;
|
|
8
|
+
export declare function isCodeOkAsync(code: number): boolean;
|
|
9
|
+
export declare const enum ErrorCode {
|
|
10
|
+
OK = 1000,
|
|
11
|
+
OK_MANY = 1001,
|
|
12
|
+
OK_ASYNC = 1002,
|
|
13
|
+
NOT_ENOUGH_PERMISSIONS = 2011,
|
|
14
|
+
NOT_ENOUGH_PERMISSIONS_TO_GRANT_PERMISSIONS = 2026,
|
|
15
|
+
ALREADY_EXISTS = 2500,
|
|
16
|
+
NOT_EXISTS = 2501,
|
|
17
|
+
INSUFFICIENT_QUOTA = 200001,
|
|
18
|
+
INSUFFICIENT_SPACE = 200002,
|
|
19
|
+
MAX_FILE_SIZE_FOR_FREE_USER = 200003,
|
|
20
|
+
MAX_PUBLIC_EDIT_MODE_FOR_FREE_USER = 200004,
|
|
21
|
+
INSUFFICIENT_VOLUME_QUOTA = 200100,
|
|
22
|
+
INSUFFICIENT_DEVICE_QUOTA = 200101,
|
|
23
|
+
ALREADY_MEMBER_OF_SHARE_IN_VOLUME_WITH_ANOTHER_ADDRESS = 200201,
|
|
24
|
+
TOO_MANY_CHILDREN = 200300,
|
|
25
|
+
NESTING_TOO_DEEP = 200301,
|
|
26
|
+
INSUFFICIENT_INVITATION_QUOTA = 200600,
|
|
27
|
+
INSUFFICIENT_SHARE_QUOTA = 200601,
|
|
28
|
+
INSUFFICIENT_SHARE_JOINED_QUOTA = 200602,
|
|
29
|
+
INSUFFICIENT_BOOKMARKS_QUOTA = 200800
|
|
30
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isCodeOk = isCodeOk;
|
|
4
|
+
exports.isCodeOkAsync = isCodeOkAsync;
|
|
5
|
+
function isCodeOk(code) {
|
|
6
|
+
return code === 1000 /* ErrorCode.OK */ || code === 1001 /* ErrorCode.OK_MANY */ || code === 1002 /* ErrorCode.OK_ASYNC */;
|
|
7
|
+
}
|
|
8
|
+
function isCodeOkAsync(code) {
|
|
9
|
+
return code === 1002 /* ErrorCode.OK_ASYNC */;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=errorCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorCodes.js","sourceRoot":"","sources":["../../../src/internal/apiService/errorCodes.ts"],"names":[],"mappings":";;AAOA,4BAEC;AAED,sCAEC;AAND,SAAgB,QAAQ,CAAC,IAAY;IACjC,OAAO,IAAI,4BAAiB,IAAI,IAAI,iCAAsB,IAAI,IAAI,kCAAuB,CAAC;AAC9F,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACtC,OAAO,IAAI,kCAAuB,CAAC;AACvC,CAAC"}
|
|
@@ -12,7 +12,7 @@ function apiErrorFactory({ response, result }) {
|
|
|
12
12
|
return new APIHTTPError(response.statusText || (0, ttag_1.c)('Error').t `Unknown error`, response.status);
|
|
13
13
|
}
|
|
14
14
|
const typedResult = result;
|
|
15
|
-
const [code, message] = [typedResult.Code || 0, typedResult.Error || (0, ttag_1.c)('Error').t `Unknown error
|
|
15
|
+
const [code, message, details] = [typedResult.Code || 0, typedResult.Error || (0, ttag_1.c)('Error').t `Unknown error`, typedResult.Details];
|
|
16
16
|
const debug = typedResult.exception ? {
|
|
17
17
|
exception: typedResult.exception,
|
|
18
18
|
message: typedResult.message,
|
|
@@ -44,7 +44,7 @@ function apiErrorFactory({ response, result }) {
|
|
|
44
44
|
case 200601 /* ErrorCode.INSUFFICIENT_SHARE_QUOTA */:
|
|
45
45
|
case 200602 /* ErrorCode.INSUFFICIENT_SHARE_JOINED_QUOTA */:
|
|
46
46
|
case 200800 /* ErrorCode.INSUFFICIENT_BOOKMARKS_QUOTA */:
|
|
47
|
-
return new errors_1.ValidationError(message, code);
|
|
47
|
+
return new errors_1.ValidationError(message, code, details);
|
|
48
48
|
default:
|
|
49
49
|
return new APICodeError(message, code, debug);
|
|
50
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/internal/apiService/errors.ts"],"names":[],"mappings":";;;AAKA,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/internal/apiService/errors.ts"],"names":[],"mappings":";;;AAKA,0CAyDC;AA9DD,+BAAyB;AAEzB,yCAA4D;AAG5D,SAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAA4C;IAC1F,iEAAiE;IACjE,mEAAmE;IACnE,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,MAAM,sCAA4B,IAAI,CAAC,MAAM,EAAE,CAAC;QACzD,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,WAAW,GAAG,MASnB,CAAC;IAEF,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,EAAE,WAAW,CAAC,KAAK,IAAI,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAEhI,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;QAClC,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,KAAK,EAAE,WAAW,CAAC,KAAK;KAC3B,CAAC,CAAC,CAAC,SAAS,CAAC;IAEd,QAAQ,IAAI,EAAE,CAAC;QACX;YACI,OAAO,IAAI,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,sEAAsE;QACtE,sCAAsC;QACtC,qEAAqE;QACrE,gEAAgE;QAChE,cAAc;QACd,iDAAsC;QACtC,sEAA2D;QAC3D,yCAA8B;QAC9B,+CAAkC;QAClC,+CAAkC;QAClC,wDAA2C;QAC3C,+DAAkD;QAClD,sDAAyC;QACzC,sDAAyC;QACzC,mFAAsE;QACtE,8CAAiC;QACjC,6CAAgC;QAChC,0DAA6C;QAC7C,qDAAwC;QACxC,4DAA+C;QAC/C;YACI,OAAO,IAAI,wBAAe,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD;YACI,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;AACL,CAAC;AAED,MAAa,YAAa,SAAQ,oBAAW;IACzC,IAAI,GAAG,cAAc,CAAC;IAEN,UAAU,CAAS;IAEnC,YAAY,OAAe,EAAE,UAAkB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;CACJ;AATD,oCASC;AAED,MAAa,YAAa,SAAQ,oBAAW;IACzC,IAAI,GAAG,cAAc,CAAC;IAEN,IAAI,CAAS;IAEb,KAAK,CAAU;IAE/B,YAAY,OAAe,EAAE,IAAY,EAAE,KAAc;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;CACJ;AAZD,oCAYC;AAED,MAAa,gBAAiB,SAAQ,YAAY;IAC9C,IAAI,GAAG,kBAAkB,CAAC;CAC7B;AAFD,4CAEC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObserverStream = void 0;
|
|
4
|
+
class ObserverStream extends TransformStream {
|
|
5
|
+
constructor(fn) {
|
|
6
|
+
super({
|
|
7
|
+
transform(chunk, controller) {
|
|
8
|
+
fn?.(chunk);
|
|
9
|
+
controller.enqueue(chunk);
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ObserverStream = ObserverStream;
|
|
15
|
+
//# sourceMappingURL=observerStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observerStream.js","sourceRoot":"","sources":["../../../src/internal/apiService/observerStream.ts"],"names":[],"mappings":";;;AAAA,MAAa,cAAe,SAAQ,eAAuC;IACvE,YAAY,EAAgC;QACxC,KAAK,CAAC;YACF,SAAS,CAAC,KAAK,EAAE,UAAU;gBACvB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACZ,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CACJ;AATD,wCASC"}
|
|
@@ -10,6 +10,8 @@ function nodeTypeNumberToNodeType(logger, nodeTypeNumber) {
|
|
|
10
10
|
return interface_1.NodeType.Folder;
|
|
11
11
|
case 2:
|
|
12
12
|
return interface_1.NodeType.File;
|
|
13
|
+
case 3:
|
|
14
|
+
return interface_1.NodeType.Album;
|
|
13
15
|
default:
|
|
14
16
|
logger.warn(`Unknown node type: ${nodeTypeNumber}`);
|
|
15
17
|
return interface_1.NodeType.File;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../../src/internal/apiService/transformers.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../../src/internal/apiService/transformers.ts"],"names":[],"mappings":";;AAEA,4DAYC;AAED,sEAeC;AAED,wDAaC;AA9CD,+CAA+D;AAE/D,SAAgB,wBAAwB,CAAC,MAAc,EAAE,cAAsB;IAC3E,QAAQ,cAAc,EAAE,CAAC;QACrB,KAAK,CAAC;YACF,OAAO,oBAAQ,CAAC,MAAM,CAAC;QAC3B,KAAK,CAAC;YACF,OAAO,oBAAQ,CAAC,IAAI,CAAC;QACzB,KAAK,CAAC;YACF,OAAO,oBAAQ,CAAC,KAAK,CAAC;QAC1B;YACI,MAAM,CAAC,IAAI,CAAC,sBAAsB,cAAc,EAAE,CAAC,CAAC;YACpD,OAAO,oBAAQ,CAAC,IAAI,CAAC;IAC7B,CAAC;AACL,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAAc,EAAE,iBAA0B;IACpF,QAAQ,iBAAiB,EAAE,CAAC;QACxB,KAAK,SAAS;YACV,OAAO,sBAAU,CAAC,SAAS,CAAC;QAChC,KAAK,CAAC;YACF,OAAO,sBAAU,CAAC,MAAM,CAAC;QAC7B,KAAK,CAAC;YACF,OAAO,sBAAU,CAAC,MAAM,CAAC;QAC7B,KAAK,EAAE;YACH,OAAO,sBAAU,CAAC,KAAK,CAAC;QAC5B;YACI,6DAA6D;YAC7D,MAAM,CAAC,IAAI,CAAC,gCAAgC,iBAAiB,EAAE,CAAC,CAAC;YACjE,OAAO,sBAAU,CAAC,MAAM,CAAC;IACjC,CAAC;AACL,CAAC;AAED,SAAgB,sBAAsB,CAAC,UAAsB;IACzD,IAAI,UAAU,KAAK,sBAAU,CAAC,SAAS,EAAE,CAAC;QACtC,2BAA2B;QAC3B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;IACD,QAAQ,UAAU,EAAE,CAAC;QACjB,KAAK,sBAAU,CAAC,MAAM;YAClB,OAAO,CAAC,CAAC;QACb,KAAK,sBAAU,CAAC,MAAM;YAClB,OAAO,CAAC,CAAC;QACb,KAAK,sBAAU,CAAC,KAAK;YACjB,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps values from an input iterator and produces a new iterator.
|
|
3
|
+
* The mapper function is not awaited immediately to allow for parallel
|
|
4
|
+
* execution. The order of the items in the output iterator is not the
|
|
5
|
+
* same as the order of the items in the input iterator.
|
|
6
|
+
*
|
|
7
|
+
* Any error from the input iterator or the mapper function is propagated
|
|
8
|
+
* to the output iterator.
|
|
9
|
+
*
|
|
10
|
+
* @param inputIterator - The input async iterator.
|
|
11
|
+
* @param mapper - The mapper function that maps the input values to output values.
|
|
12
|
+
* @param concurrency - The concurrency limit. How many parallel async mapper calls are allowed.
|
|
13
|
+
* @returns An async iterator that yields the mapped values.
|
|
14
|
+
*/
|
|
15
|
+
export declare function asyncIteratorMap<I, O>(inputIterator: AsyncGenerator<I>, mapper: (item: I) => Promise<O>, concurrency?: number): AsyncGenerator<O>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.asyncIteratorMap = asyncIteratorMap;
|
|
4
|
+
const DEFAULT_CONCURRENCY = 10;
|
|
5
|
+
/**
|
|
6
|
+
* Maps values from an input iterator and produces a new iterator.
|
|
7
|
+
* The mapper function is not awaited immediately to allow for parallel
|
|
8
|
+
* execution. The order of the items in the output iterator is not the
|
|
9
|
+
* same as the order of the items in the input iterator.
|
|
10
|
+
*
|
|
11
|
+
* Any error from the input iterator or the mapper function is propagated
|
|
12
|
+
* to the output iterator.
|
|
13
|
+
*
|
|
14
|
+
* @param inputIterator - The input async iterator.
|
|
15
|
+
* @param mapper - The mapper function that maps the input values to output values.
|
|
16
|
+
* @param concurrency - The concurrency limit. How many parallel async mapper calls are allowed.
|
|
17
|
+
* @returns An async iterator that yields the mapped values.
|
|
18
|
+
*/
|
|
19
|
+
async function* asyncIteratorMap(inputIterator, mapper, concurrency = DEFAULT_CONCURRENCY) {
|
|
20
|
+
let done = false;
|
|
21
|
+
const executing = new Set();
|
|
22
|
+
const results = [];
|
|
23
|
+
const pump = async () => {
|
|
24
|
+
let next;
|
|
25
|
+
try {
|
|
26
|
+
next = await inputIterator.next();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
results.push(Promise.reject(error));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (next.done) {
|
|
33
|
+
done = true;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const promise = mapper(next.value)
|
|
37
|
+
.then((result) => {
|
|
38
|
+
results.push(Promise.resolve(result));
|
|
39
|
+
})
|
|
40
|
+
.catch((error) => {
|
|
41
|
+
results.push(Promise.reject(error));
|
|
42
|
+
});
|
|
43
|
+
executing.add(promise);
|
|
44
|
+
void promise.finally(() => executing.delete(promise));
|
|
45
|
+
};
|
|
46
|
+
while (!done || executing.size > 0 || results.length > 0) {
|
|
47
|
+
while (!done && executing.size < concurrency) {
|
|
48
|
+
await pump();
|
|
49
|
+
}
|
|
50
|
+
if (results.length > 0) {
|
|
51
|
+
yield await results.shift();
|
|
52
|
+
}
|
|
53
|
+
else if (executing.size > 0) {
|
|
54
|
+
// Wait for at least one task to complete
|
|
55
|
+
await Promise.race(Array.from(executing));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=asyncIteratorMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncIteratorMap.js","sourceRoot":"","sources":["../../src/internal/asyncIteratorMap.ts"],"names":[],"mappings":";;AAgBA,4CA+CC;AA/DD,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B;;;;;;;;;;;;;GAaG;AACI,KAAK,SAAS,CAAC,CAAC,gBAAgB,CACnC,aAAgC,EAChC,MAA+B,EAC/B,cAAsB,mBAAmB;IAEzC,IAAI,IAAI,GAAG,KAAK,CAAC;IAEjB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC3C,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACpB,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACD,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpC,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aAC7B,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACb,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACP,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;YAC3C,MAAM,IAAI,EAAE,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,OAAO,CAAC,KAAK,EAAG,CAAC;QACjC,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC5B,yCAAyC;YACzC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const asyncIteratorMap_1 = require("./asyncIteratorMap");
|
|
4
|
+
// Helper function to create an async generator from array
|
|
5
|
+
async function* createAsyncGenerator(items) {
|
|
6
|
+
for (const item of items) {
|
|
7
|
+
yield item;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
// Helper function to collect all results from async generator
|
|
11
|
+
async function collectResults(asyncGen) {
|
|
12
|
+
const results = [];
|
|
13
|
+
for await (const item of asyncGen) {
|
|
14
|
+
results.push(item);
|
|
15
|
+
}
|
|
16
|
+
return results;
|
|
17
|
+
}
|
|
18
|
+
describe('asyncIteratorMap', () => {
|
|
19
|
+
test('works with empty input', async () => {
|
|
20
|
+
const inputGen = createAsyncGenerator([]);
|
|
21
|
+
const mapper = async (x) => x * 2;
|
|
22
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(inputGen, mapper);
|
|
23
|
+
const results = await collectResults(mappedGen);
|
|
24
|
+
expect(results).toEqual([]);
|
|
25
|
+
});
|
|
26
|
+
test('works with single item', async () => {
|
|
27
|
+
const inputGen = createAsyncGenerator([42]);
|
|
28
|
+
const mapper = async (x) => x * 2;
|
|
29
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(inputGen, mapper);
|
|
30
|
+
const results = await collectResults(mappedGen);
|
|
31
|
+
expect(results).toEqual([84]);
|
|
32
|
+
});
|
|
33
|
+
test('works with 5 values', async () => {
|
|
34
|
+
const inputGen = createAsyncGenerator([1, 2, 3, 4, 5]);
|
|
35
|
+
const mapper = async (x) => x * 2;
|
|
36
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(inputGen, mapper);
|
|
37
|
+
const results = await collectResults(mappedGen);
|
|
38
|
+
expect(results).toEqual([2, 4, 6, 8, 10]);
|
|
39
|
+
});
|
|
40
|
+
test('works with slow mapper - finishes as fast as the longest delay', async () => {
|
|
41
|
+
const delays = { 1: 100, 2: 50, 3: 200, 4: 30, 5: 80 };
|
|
42
|
+
const inputGen = createAsyncGenerator(Object.keys(delays).map(Number));
|
|
43
|
+
const slowMapper = async (x) => {
|
|
44
|
+
await new Promise(resolve => setTimeout(resolve, delays[x]));
|
|
45
|
+
return x * 2;
|
|
46
|
+
};
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(inputGen, slowMapper, 5);
|
|
49
|
+
const results = await collectResults(mappedGen);
|
|
50
|
+
const endTime = Date.now();
|
|
51
|
+
// Should complete in roughly the time of the longest delay (200ms) plus some overhead
|
|
52
|
+
const executionTime = endTime - startTime;
|
|
53
|
+
expect(executionTime).toBeGreaterThanOrEqual(195); // We had failures with 199ms - JS is not precise.
|
|
54
|
+
expect(executionTime).toBeLessThan(250);
|
|
55
|
+
// Results should be in the order of the delays
|
|
56
|
+
expect(results).toEqual([8, 4, 10, 2, 6]);
|
|
57
|
+
});
|
|
58
|
+
test('handles errors from input iterator properly', async () => {
|
|
59
|
+
const throwingInputGen = async function* () {
|
|
60
|
+
yield 1;
|
|
61
|
+
yield 2;
|
|
62
|
+
throw new Error('Error providing value: 3');
|
|
63
|
+
};
|
|
64
|
+
const mapper = async (x) => x * 2;
|
|
65
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(throwingInputGen(), mapper);
|
|
66
|
+
const results = [];
|
|
67
|
+
let caughtError = null;
|
|
68
|
+
try {
|
|
69
|
+
for await (const item of mappedGen) {
|
|
70
|
+
results.push(item);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
caughtError = error;
|
|
75
|
+
}
|
|
76
|
+
expect(caughtError?.message).toBe('Error providing value: 3');
|
|
77
|
+
expect(results).toEqual([2, 4]);
|
|
78
|
+
});
|
|
79
|
+
test('handles errors from mapper properly', async () => {
|
|
80
|
+
const inputGen = createAsyncGenerator([1, 2, 3, 4, 5]);
|
|
81
|
+
const throwingMapper = async (x) => {
|
|
82
|
+
if (x === 3) {
|
|
83
|
+
throw new Error(`Error processing value: ${x}`);
|
|
84
|
+
}
|
|
85
|
+
return x * 2;
|
|
86
|
+
};
|
|
87
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(inputGen, throwingMapper);
|
|
88
|
+
const results = [];
|
|
89
|
+
let caughtError = null;
|
|
90
|
+
try {
|
|
91
|
+
for await (const item of mappedGen) {
|
|
92
|
+
results.push(item);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
caughtError = error;
|
|
97
|
+
}
|
|
98
|
+
expect(caughtError?.message).toBe('Error processing value: 3');
|
|
99
|
+
expect(results).toEqual([2, 4]);
|
|
100
|
+
});
|
|
101
|
+
test('respects concurrency limit', async () => {
|
|
102
|
+
const inputGen = createAsyncGenerator([1, 2, 3, 4, 5, 6, 7, 8]);
|
|
103
|
+
let concurrentExecutions = 0;
|
|
104
|
+
let maxConcurrentExecutions = 0;
|
|
105
|
+
const mapper = async (x) => {
|
|
106
|
+
concurrentExecutions++;
|
|
107
|
+
maxConcurrentExecutions = Math.max(maxConcurrentExecutions, concurrentExecutions);
|
|
108
|
+
// Wait for 100ms to simulate work
|
|
109
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
110
|
+
concurrentExecutions--;
|
|
111
|
+
return x * 2;
|
|
112
|
+
};
|
|
113
|
+
const concurrencyLimit = 3;
|
|
114
|
+
const mappedGen = (0, asyncIteratorMap_1.asyncIteratorMap)(inputGen, mapper, concurrencyLimit);
|
|
115
|
+
const results = await collectResults(mappedGen);
|
|
116
|
+
expect(maxConcurrentExecutions).toBe(concurrencyLimit);
|
|
117
|
+
expect(results).toEqual([2, 4, 6, 8, 10, 12, 14, 16]);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=asyncIteratorMap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asyncIteratorMap.test.js","sourceRoot":"","sources":["../../src/internal/asyncIteratorMap.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper class for batch loading items.
|
|
3
|
+
*
|
|
4
|
+
* The class is responsible for fetching items in batches. Any call to
|
|
5
|
+
* `load` will add the item to the batch (without fetching anything),
|
|
6
|
+
* and if the batch reaches the limit, it will fetch the items and yield
|
|
7
|
+
* them transparently to the caller.
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const batchLoading = new BatchLoading<string, DecryptedNode>({ loadItems: loadNodesCallback });
|
|
13
|
+
* for (const nodeUid of nodeUids) {
|
|
14
|
+
* for await (const node of batchLoading.load(nodeUid)) {
|
|
15
|
+
* console.log(node);
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* for await (const node of batchLoading.loadRest()) {
|
|
19
|
+
* console.log(node);
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class BatchLoading<ID, ITEM> {
|
|
24
|
+
private batchSize;
|
|
25
|
+
private iterateItems;
|
|
26
|
+
private itemsToFetch;
|
|
27
|
+
constructor(options: {
|
|
28
|
+
loadItems?: (ids: ID[]) => Promise<ITEM[]>;
|
|
29
|
+
iterateItems?: (ids: ID[]) => AsyncGenerator<ITEM>;
|
|
30
|
+
batchSize?: number;
|
|
31
|
+
});
|
|
32
|
+
load(nodeUid: ID): AsyncGenerator<Awaited<ITEM>, void, any>;
|
|
33
|
+
loadRest(): AsyncGenerator<Awaited<ITEM>, void, any>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BatchLoading = void 0;
|
|
4
|
+
const DEFAULT_BATCH_LOADING = 10;
|
|
5
|
+
/**
|
|
6
|
+
* Helper class for batch loading items.
|
|
7
|
+
*
|
|
8
|
+
* The class is responsible for fetching items in batches. Any call to
|
|
9
|
+
* `load` will add the item to the batch (without fetching anything),
|
|
10
|
+
* and if the batch reaches the limit, it will fetch the items and yield
|
|
11
|
+
* them transparently to the caller.
|
|
12
|
+
*
|
|
13
|
+
* Example:
|
|
14
|
+
*
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const batchLoading = new BatchLoading<string, DecryptedNode>({ loadItems: loadNodesCallback });
|
|
17
|
+
* for (const nodeUid of nodeUids) {
|
|
18
|
+
* for await (const node of batchLoading.load(nodeUid)) {
|
|
19
|
+
* console.log(node);
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* for await (const node of batchLoading.loadRest()) {
|
|
23
|
+
* console.log(node);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
class BatchLoading {
|
|
28
|
+
batchSize = DEFAULT_BATCH_LOADING;
|
|
29
|
+
iterateItems;
|
|
30
|
+
itemsToFetch;
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.itemsToFetch = [];
|
|
33
|
+
if (options.loadItems) {
|
|
34
|
+
const loadItems = options.loadItems;
|
|
35
|
+
this.iterateItems = async function* (ids) {
|
|
36
|
+
for (const item of await loadItems(ids)) {
|
|
37
|
+
yield item;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else if (options.iterateItems) {
|
|
42
|
+
this.iterateItems = options.iterateItems;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// This is developer error.
|
|
46
|
+
throw new Error('Either loadItems or iterateItems must be provided');
|
|
47
|
+
}
|
|
48
|
+
if (options.batchSize) {
|
|
49
|
+
this.batchSize = options.batchSize;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async *load(nodeUid) {
|
|
53
|
+
this.itemsToFetch.push(nodeUid);
|
|
54
|
+
if (this.itemsToFetch.length >= this.batchSize) {
|
|
55
|
+
yield* this.iterateItems(this.itemsToFetch);
|
|
56
|
+
this.itemsToFetch = [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async *loadRest() {
|
|
60
|
+
if (this.itemsToFetch.length === 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
yield* this.iterateItems(this.itemsToFetch);
|
|
64
|
+
this.itemsToFetch = [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.BatchLoading = BatchLoading;
|
|
68
|
+
//# sourceMappingURL=batchLoading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchLoading.js","sourceRoot":"","sources":["../../src/internal/batchLoading.ts"],"names":[],"mappings":";;;AAAA,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAa,YAAY;IACb,SAAS,GAAG,qBAAqB,CAAC;IAClC,YAAY,CAAsC;IAElD,YAAY,CAAO;IAE3B,YAAY,OAIX;QACG,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,KAAK,SAAS,CAAC,EAAE,GAAS;gBAC1C,KAAK,MAAM,IAAI,IAAI,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,IAAI,CAAC;gBACf,CAAC;YACL,CAAC,CAAA;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,2BAA2B;YAC3B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACvC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CAAC,OAAW;QACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,CAAC,QAAQ;QACX,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;IAC3B,CAAC;CACJ;AAjDD,oCAiDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const batchLoading_1 = require("./batchLoading");
|
|
4
|
+
describe("BatchLoading", () => {
|
|
5
|
+
let batchLoading;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
jest.clearAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it("should load in batches with loadItems", async () => {
|
|
10
|
+
const loadItems = jest.fn((items) => Promise.resolve(items.map((item) => `loaded:${item}`)));
|
|
11
|
+
batchLoading = new batchLoading_1.BatchLoading({ loadItems, batchSize: 2 });
|
|
12
|
+
const result = [];
|
|
13
|
+
for (const item of ["a", "b", "c", "d", "e"]) {
|
|
14
|
+
for await (const loadedItem of batchLoading.load(item)) {
|
|
15
|
+
result.push(loadedItem);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for await (const loadedItem of batchLoading.loadRest()) {
|
|
19
|
+
result.push(loadedItem);
|
|
20
|
+
}
|
|
21
|
+
expect(result).toEqual(["loaded:a", "loaded:b", "loaded:c", "loaded:d", "loaded:e"]);
|
|
22
|
+
expect(loadItems).toHaveBeenCalledTimes(3);
|
|
23
|
+
expect(loadItems).toHaveBeenNthCalledWith(1, ["a", "b"]);
|
|
24
|
+
expect(loadItems).toHaveBeenNthCalledWith(2, ["c", "d"]);
|
|
25
|
+
expect(loadItems).toHaveBeenNthCalledWith(3, ["e"]);
|
|
26
|
+
});
|
|
27
|
+
it("should load in batches with iterateItems", async () => {
|
|
28
|
+
const iterateItems = jest.fn(async function* (items) {
|
|
29
|
+
for (const item of items) {
|
|
30
|
+
yield `loaded:${item}`;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
batchLoading = new batchLoading_1.BatchLoading({ iterateItems, batchSize: 2 });
|
|
34
|
+
const result = [];
|
|
35
|
+
for (const item of ["a", "b", "c", "d", "e"]) {
|
|
36
|
+
for await (const loadedItem of batchLoading.load(item)) {
|
|
37
|
+
result.push(loadedItem);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
for await (const loadedItem of batchLoading.loadRest()) {
|
|
41
|
+
result.push(loadedItem);
|
|
42
|
+
}
|
|
43
|
+
expect(result).toEqual(["loaded:a", "loaded:b", "loaded:c", "loaded:d", "loaded:e"]);
|
|
44
|
+
expect(iterateItems).toHaveBeenCalledTimes(3);
|
|
45
|
+
expect(iterateItems).toHaveBeenNthCalledWith(1, ["a", "b"]);
|
|
46
|
+
expect(iterateItems).toHaveBeenNthCalledWith(2, ["c", "d"]);
|
|
47
|
+
expect(iterateItems).toHaveBeenNthCalledWith(3, ["e"]);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=batchLoading.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchLoading.test.js","sourceRoot":"","sources":["../../src/internal/batchLoading.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DownloadController = void 0;
|
|
4
|
+
const wait_1 = require("../wait");
|
|
5
|
+
class DownloadController {
|
|
6
|
+
paused = false;
|
|
7
|
+
promise;
|
|
8
|
+
async waitWhilePaused() {
|
|
9
|
+
await (0, wait_1.waitForCondition)(() => !this.paused);
|
|
10
|
+
}
|
|
11
|
+
pause() {
|
|
12
|
+
this.paused = true;
|
|
13
|
+
}
|
|
14
|
+
resume() {
|
|
15
|
+
this.paused = false;
|
|
16
|
+
}
|
|
17
|
+
async completion() {
|
|
18
|
+
await this.promise;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.DownloadController = DownloadController;
|
|
22
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/internal/download/controller.ts"],"names":[],"mappings":";;;AAAA,kCAA2C;AAE3C,MAAa,kBAAkB;IACnB,MAAM,GAAG,KAAK,CAAC;IAChB,OAAO,CAAiB;IAE/B,KAAK,CAAC,eAAe;QACjB,MAAM,IAAA,uBAAgB,EAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM;QACF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,MAAM,IAAI,CAAC,OAAO,CAAC;IACvB,CAAC;CACJ;AAnBD,gDAmBC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DownloadQueue = void 0;
|
|
4
|
+
const wait_1 = require("../wait");
|
|
5
|
+
/**
|
|
6
|
+
* A queue that limits the number of concurrent downloads.
|
|
7
|
+
*
|
|
8
|
+
* This is used to limit the number of concurrent downloads to avoid
|
|
9
|
+
* overloading the server, or get rate limited.
|
|
10
|
+
*
|
|
11
|
+
* Each file download consumes memory and is limited by the number of
|
|
12
|
+
* concurrent block downloads for each file.
|
|
13
|
+
*
|
|
14
|
+
* This queue is straitforward and does not have any priority mechanism
|
|
15
|
+
* or other features, such as limiting total number of blocks being
|
|
16
|
+
* downloaded. That is something we want to add in the future to be
|
|
17
|
+
* more performant for many small file downloads.
|
|
18
|
+
*/
|
|
19
|
+
const MAX_CONCURRENT_DOWNLOADS = 5;
|
|
20
|
+
class DownloadQueue {
|
|
21
|
+
capacity = 0;
|
|
22
|
+
async waitForCapacity(signal) {
|
|
23
|
+
await (0, wait_1.waitForCondition)(() => this.capacity < MAX_CONCURRENT_DOWNLOADS, signal);
|
|
24
|
+
this.capacity++;
|
|
25
|
+
}
|
|
26
|
+
releaseCapacity() {
|
|
27
|
+
this.capacity--;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.DownloadQueue = DownloadQueue;
|
|
31
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/internal/download/queue.ts"],"names":[],"mappings":";;;AAAA,kCAA2C;AAE3C;;;;;;;;;;;;;GAaG;AACH,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAa,aAAa;IACd,QAAQ,GAAG,CAAC,CAAC;IAErB,KAAK,CAAC,eAAe,CAAC,MAAoB;QACtC,MAAM,IAAA,uBAAgB,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,eAAe;QACX,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;CACJ;AAXD,sCAWC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getErrorMessage = getErrorMessage;
|
|
4
|
+
exports.getVerificationMessage = getVerificationMessage;
|
|
5
|
+
const ttag_1 = require("ttag");
|
|
6
|
+
const crypto_1 = require("../crypto");
|
|
7
|
+
function getErrorMessage(error) {
|
|
8
|
+
return error instanceof Error ? error.message : (0, ttag_1.c)('Error').t `Unknown error`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @param signatureType - Must be translated before calling this function.
|
|
12
|
+
*/
|
|
13
|
+
function getVerificationMessage(verified, signatureType, notAvailableVerificationKeys = false) {
|
|
14
|
+
if (verified === crypto_1.VERIFICATION_STATUS.NOT_SIGNED) {
|
|
15
|
+
return signatureType
|
|
16
|
+
? (0, ttag_1.c)('Error').t `Missing signature for ${signatureType}`
|
|
17
|
+
: (0, ttag_1.c)('Error').t `Missing signature`;
|
|
18
|
+
}
|
|
19
|
+
if (notAvailableVerificationKeys) {
|
|
20
|
+
return signatureType
|
|
21
|
+
? (0, ttag_1.c)('Error').t `Verification keys for ${signatureType} are not available`
|
|
22
|
+
: (0, ttag_1.c)('Error').t `Verification keys are not available`;
|
|
23
|
+
}
|
|
24
|
+
return signatureType
|
|
25
|
+
? (0, ttag_1.c)('Error').t `Signature verification for ${signatureType} failed`
|
|
26
|
+
: (0, ttag_1.c)('Error').t `Signature verification failed`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":";;AAIA,0CAEC;AAKD,wDAgBC;AA3BD,+BAAyB;AAEzB,sCAAgD;AAEhD,SAAgB,eAAe,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,eAAe,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,QAA6B,EAAE,aAAsB,EAAE,4BAA4B,GAAG,KAAK;IAC9H,IAAI,QAAQ,KAAK,4BAAmB,CAAC,UAAU,EAAE,CAAC;QAC9C,OAAO,aAAa;YAChB,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,yBAAyB,aAAa,EAAE;YACtD,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,mBAAmB,CAAC;IAC1C,CAAC;IAED,IAAI,4BAA4B,EAAE,CAAC;QAC/B,OAAO,aAAa;YAChB,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,yBAAyB,aAAa,oBAAoB;YACxE,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,qCAAqC,CAAC;IAC5D,CAAC;IAED,OAAO,aAAa;QAChB,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,8BAA8B,aAAa,SAAS;QAClE,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,+BAA+B,CAAC;AACtD,CAAC"}
|