@protontech/drive-sdk 0.1.1 → 0.2.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/dist/crypto/driveCrypto.d.ts +11 -0
- package/dist/crypto/driveCrypto.js +20 -7
- package/dist/crypto/driveCrypto.js.map +1 -1
- package/dist/crypto/interface.d.ts +10 -1
- package/dist/crypto/openPGPCrypto.d.ts +18 -2
- package/dist/crypto/openPGPCrypto.js +25 -6
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/telemetry.d.ts +1 -1
- package/dist/diagnostic/telemetry.js +1 -1
- package/dist/diagnostic/telemetry.js.map +1 -1
- package/dist/interface/download.d.ts +46 -0
- package/dist/interface/index.d.ts +2 -2
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +26 -1
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/telemetry.d.ts +5 -2
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/internal/apiService/apiService.js +1 -1
- package/dist/internal/apiService/apiService.js.map +1 -1
- package/dist/internal/apiService/driveTypes.d.ts +78 -165
- package/dist/internal/apiService/index.d.ts +1 -1
- package/dist/internal/apiService/index.js +2 -2
- package/dist/internal/apiService/index.js.map +1 -1
- package/dist/internal/apiService/transformers.d.ts +1 -1
- package/dist/internal/apiService/transformers.js +2 -2
- package/dist/internal/apiService/transformers.js.map +1 -1
- package/dist/internal/download/blockIndex.d.ts +11 -0
- package/dist/internal/download/blockIndex.js +35 -0
- package/dist/internal/download/blockIndex.js.map +1 -0
- package/dist/internal/download/blockIndex.test.d.ts +1 -0
- package/dist/internal/download/blockIndex.test.js +147 -0
- package/dist/internal/download/blockIndex.test.js.map +1 -0
- package/dist/internal/download/fileDownloader.d.ts +6 -2
- package/dist/internal/download/fileDownloader.js +83 -6
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/download/fileDownloader.test.js +69 -4
- package/dist/internal/download/fileDownloader.test.js.map +1 -1
- package/dist/internal/download/interface.d.ts +4 -4
- package/dist/internal/download/seekableStream.d.ts +80 -0
- package/dist/internal/download/seekableStream.js +163 -0
- package/dist/internal/download/seekableStream.js.map +1 -0
- package/dist/internal/download/seekableStream.test.d.ts +1 -0
- package/dist/internal/download/seekableStream.test.js +149 -0
- package/dist/internal/download/seekableStream.test.js.map +1 -0
- package/dist/internal/download/telemetry.js +1 -1
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +7 -7
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/errors.d.ts +1 -1
- package/dist/internal/errors.js +7 -1
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/errors.test.js +44 -10
- package/dist/internal/errors.test.js.map +1 -1
- package/dist/internal/events/eventManager.d.ts +1 -0
- package/dist/internal/events/eventManager.js +9 -0
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +53 -38
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +4 -3
- package/dist/internal/events/index.js +38 -32
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/nodes/apiService.js +16 -3
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +43 -7
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.js +9 -2
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +6 -1
- package/dist/internal/nodes/cache.test.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +4 -1
- package/dist/internal/nodes/cryptoService.js +66 -16
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +129 -46
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.js +7 -7
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.d.ts +2 -1
- package/dist/internal/nodes/extendedAttributes.js +27 -1
- package/dist/internal/nodes/extendedAttributes.js.map +1 -1
- package/dist/internal/nodes/extendedAttributes.test.js +59 -6
- package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
- package/dist/internal/nodes/index.test.js +1 -1
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +18 -2
- package/dist/internal/nodes/nodesAccess.js +11 -1
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.js +1 -1
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +4 -3
- package/dist/internal/nodes/nodesRevisions.js +2 -2
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/shares/cryptoService.js +7 -4
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/cryptoService.test.js +5 -3
- package/dist/internal/shares/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/apiService.js +5 -5
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cache.d.ts +1 -0
- package/dist/internal/sharing/cache.js +9 -0
- package/dist/internal/sharing/cache.js.map +1 -1
- package/dist/internal/sharing/cryptoService.js +8 -5
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.test.js +7 -4
- package/dist/internal/sharing/cryptoService.test.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +1 -0
- package/dist/internal/sharing/events.js +28 -18
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +98 -84
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +1 -0
- package/dist/internal/upload/manager.d.ts +1 -1
- package/dist/internal/upload/manager.js +8 -4
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +7 -10
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.js +1 -1
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +1 -1
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/internal/upload/telemetry.js +2 -2
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +7 -7
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/protonDriveClient.js +2 -2
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/telemetry.d.ts +2 -2
- package/dist/telemetry.js +2 -2
- package/dist/telemetry.js.map +1 -1
- package/dist/tests/telemetry.js +1 -1
- package/dist/tests/telemetry.js.map +1 -1
- package/dist/transformers.d.ts +1 -1
- package/dist/transformers.js +3 -1
- package/dist/transformers.js.map +1 -1
- package/package.json +1 -1
- package/src/crypto/driveCrypto.ts +70 -25
- package/src/crypto/interface.ts +15 -0
- package/src/crypto/openPGPCrypto.ts +37 -5
- package/src/diagnostic/telemetry.ts +1 -1
- package/src/interface/download.ts +46 -0
- package/src/interface/index.ts +2 -1
- package/src/interface/nodes.ts +28 -1
- package/src/interface/telemetry.ts +6 -1
- package/src/internal/apiService/apiService.ts +1 -1
- package/src/internal/apiService/driveTypes.ts +78 -165
- package/src/internal/apiService/index.ts +1 -1
- package/src/internal/apiService/transformers.ts +1 -1
- package/src/internal/download/blockIndex.test.ts +158 -0
- package/src/internal/download/blockIndex.ts +36 -0
- package/src/internal/download/fileDownloader.test.ts +100 -7
- package/src/internal/download/fileDownloader.ts +109 -9
- package/src/internal/download/interface.ts +4 -4
- package/src/internal/download/seekableStream.test.ts +187 -0
- package/src/internal/download/seekableStream.ts +182 -0
- package/src/internal/download/telemetry.test.ts +7 -7
- package/src/internal/download/telemetry.ts +1 -1
- package/src/internal/errors.test.ts +45 -11
- package/src/internal/errors.ts +8 -0
- package/src/internal/events/eventManager.test.ts +61 -40
- package/src/internal/events/eventManager.ts +10 -0
- package/src/internal/events/index.ts +53 -35
- package/src/internal/nodes/apiService.test.ts +59 -15
- package/src/internal/nodes/apiService.ts +21 -4
- package/src/internal/nodes/cache.test.ts +6 -1
- package/src/internal/nodes/cache.ts +9 -2
- package/src/internal/nodes/cryptoService.test.ts +139 -47
- package/src/internal/nodes/cryptoService.ts +94 -9
- package/src/internal/nodes/events.ts +6 -7
- package/src/internal/nodes/extendedAttributes.test.ts +60 -7
- package/src/internal/nodes/extendedAttributes.ts +37 -1
- package/src/internal/nodes/index.test.ts +1 -1
- package/src/internal/nodes/interface.ts +19 -2
- package/src/internal/nodes/nodesAccess.ts +15 -1
- package/src/internal/nodes/nodesManagement.ts +1 -1
- package/src/internal/nodes/nodesRevisions.ts +14 -5
- package/src/internal/shares/cryptoService.test.ts +5 -3
- package/src/internal/shares/cryptoService.ts +7 -4
- package/src/internal/sharing/apiService.ts +6 -6
- package/src/internal/sharing/cache.ts +9 -0
- package/src/internal/sharing/cryptoService.test.ts +7 -4
- package/src/internal/sharing/cryptoService.ts +8 -5
- package/src/internal/sharing/events.test.ts +104 -89
- package/src/internal/sharing/events.ts +33 -18
- package/src/internal/upload/interface.ts +1 -0
- package/src/internal/upload/manager.test.ts +7 -10
- package/src/internal/upload/manager.ts +7 -4
- package/src/internal/upload/streamUploader.test.ts +1 -1
- package/src/internal/upload/streamUploader.ts +1 -1
- package/src/internal/upload/telemetry.test.ts +7 -7
- package/src/internal/upload/telemetry.ts +2 -2
- package/src/protonDriveClient.ts +2 -2
- package/src/telemetry.ts +2 -2
- package/src/tests/telemetry.ts +1 -1
- package/src/transformers.ts +6 -2
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
interface UnderlyingSeekableSource extends UnderlyingDefaultSource<Uint8Array> {
|
|
2
|
+
seek: (position: number) => void | Promise<void>;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* A seekable readable stream that can be used to seek to a specific position
|
|
6
|
+
* in the stream.
|
|
7
|
+
*
|
|
8
|
+
* This is useful for downloading the file in chunks or jumping to a specific
|
|
9
|
+
* position in the file when streaming a video.
|
|
10
|
+
*
|
|
11
|
+
* Example to get next chunk of data from the stream at position 100:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* const stream = new SeekableReadableStream(underlyingSource);
|
|
15
|
+
* const reader = stream.getReader();
|
|
16
|
+
* await stream.seek(100);
|
|
17
|
+
* const data = await stream.read();
|
|
18
|
+
* console.log(data);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare class SeekableReadableStream extends ReadableStream<Uint8Array> {
|
|
22
|
+
private seekCallback;
|
|
23
|
+
constructor({ seek, ...underlyingSource }: UnderlyingSeekableSource, queuingStrategy?: QueuingStrategy<Uint8Array>);
|
|
24
|
+
seek(position: number): void | Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A buffered seekable stream that allows to seek and read specific number of
|
|
28
|
+
* bytes from the stream.
|
|
29
|
+
*
|
|
30
|
+
* This is useful for reading specific range of data from the stream. Example
|
|
31
|
+
* being video player buffering the next several bytes.
|
|
32
|
+
*
|
|
33
|
+
* The underlying source can chunk the data into various sizes. To ensure that
|
|
34
|
+
* every read operation is for the correct location, the SeekableStream is not
|
|
35
|
+
* queueing the data upfront. Instead, it will read the data and buffer it for
|
|
36
|
+
* the next read operation. If seek is called, the internal buffer is updated
|
|
37
|
+
* accordingly.
|
|
38
|
+
*
|
|
39
|
+
* Example to read 10 bytes from the stream at position 100:
|
|
40
|
+
*
|
|
41
|
+
* ```
|
|
42
|
+
* const stream = new BufferedSeekableStream(underlyingSource);
|
|
43
|
+
* await stream.seek(100);
|
|
44
|
+
* const data = await stream.read(10);
|
|
45
|
+
* console.log(data);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare class BufferedSeekableStream extends SeekableReadableStream {
|
|
49
|
+
private buffer;
|
|
50
|
+
private bufferPosition;
|
|
51
|
+
private reader;
|
|
52
|
+
private streamClosed;
|
|
53
|
+
private currentPosition;
|
|
54
|
+
constructor(underlyingSource: UnderlyingSeekableSource, queuingStrategy?: QueuingStrategy<Uint8Array>);
|
|
55
|
+
/**
|
|
56
|
+
* Read a specific number of bytes from the stream.
|
|
57
|
+
*
|
|
58
|
+
* When the underlying source provides more bytes than requested, the
|
|
59
|
+
* remaining bytes are buffered and used for the next read operation.
|
|
60
|
+
*
|
|
61
|
+
* @param numBytes - Number of bytes to read
|
|
62
|
+
* @returns Promise<Uint8Array> The read bytes
|
|
63
|
+
*/
|
|
64
|
+
read(numBytes: number): Promise<{
|
|
65
|
+
value: Uint8Array;
|
|
66
|
+
done: boolean;
|
|
67
|
+
}>;
|
|
68
|
+
private ensureBufferSize;
|
|
69
|
+
/**
|
|
70
|
+
* Seek to the given position in the stream.
|
|
71
|
+
*
|
|
72
|
+
* If the position is outside of internally buffered data, the buffer is
|
|
73
|
+
* cleared. If the position is seeked back, the buffer is read again from
|
|
74
|
+
* the underlying source.
|
|
75
|
+
*
|
|
76
|
+
* @param position - The position to seek to in bytes.
|
|
77
|
+
*/
|
|
78
|
+
seek(position: number): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BufferedSeekableStream = exports.SeekableReadableStream = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* A seekable readable stream that can be used to seek to a specific position
|
|
6
|
+
* in the stream.
|
|
7
|
+
*
|
|
8
|
+
* This is useful for downloading the file in chunks or jumping to a specific
|
|
9
|
+
* position in the file when streaming a video.
|
|
10
|
+
*
|
|
11
|
+
* Example to get next chunk of data from the stream at position 100:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* const stream = new SeekableReadableStream(underlyingSource);
|
|
15
|
+
* const reader = stream.getReader();
|
|
16
|
+
* await stream.seek(100);
|
|
17
|
+
* const data = await stream.read();
|
|
18
|
+
* console.log(data);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
class SeekableReadableStream extends ReadableStream {
|
|
22
|
+
seekCallback;
|
|
23
|
+
constructor({ seek, ...underlyingSource }, queuingStrategy) {
|
|
24
|
+
super(underlyingSource, queuingStrategy);
|
|
25
|
+
this.seekCallback = seek;
|
|
26
|
+
}
|
|
27
|
+
seek(position) {
|
|
28
|
+
return this.seekCallback(position);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.SeekableReadableStream = SeekableReadableStream;
|
|
32
|
+
/**
|
|
33
|
+
* A buffered seekable stream that allows to seek and read specific number of
|
|
34
|
+
* bytes from the stream.
|
|
35
|
+
*
|
|
36
|
+
* This is useful for reading specific range of data from the stream. Example
|
|
37
|
+
* being video player buffering the next several bytes.
|
|
38
|
+
*
|
|
39
|
+
* The underlying source can chunk the data into various sizes. To ensure that
|
|
40
|
+
* every read operation is for the correct location, the SeekableStream is not
|
|
41
|
+
* queueing the data upfront. Instead, it will read the data and buffer it for
|
|
42
|
+
* the next read operation. If seek is called, the internal buffer is updated
|
|
43
|
+
* accordingly.
|
|
44
|
+
*
|
|
45
|
+
* Example to read 10 bytes from the stream at position 100:
|
|
46
|
+
*
|
|
47
|
+
* ```
|
|
48
|
+
* const stream = new BufferedSeekableStream(underlyingSource);
|
|
49
|
+
* await stream.seek(100);
|
|
50
|
+
* const data = await stream.read(10);
|
|
51
|
+
* console.log(data);
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
class BufferedSeekableStream extends SeekableReadableStream {
|
|
55
|
+
buffer = new Uint8Array(0);
|
|
56
|
+
bufferPosition = 0;
|
|
57
|
+
reader = null;
|
|
58
|
+
streamClosed = false;
|
|
59
|
+
currentPosition = 0;
|
|
60
|
+
constructor(underlyingSource, queuingStrategy) {
|
|
61
|
+
// highWaterMark means that the stream will buffer up to this many
|
|
62
|
+
// bytes. We do not want to buffer anything
|
|
63
|
+
if (queuingStrategy && queuingStrategy.highWaterMark !== 0) {
|
|
64
|
+
throw new Error('highWaterMark must be 0');
|
|
65
|
+
}
|
|
66
|
+
super(underlyingSource, {
|
|
67
|
+
...queuingStrategy,
|
|
68
|
+
highWaterMark: 0,
|
|
69
|
+
});
|
|
70
|
+
this.reader = super.getReader();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Read a specific number of bytes from the stream.
|
|
74
|
+
*
|
|
75
|
+
* When the underlying source provides more bytes than requested, the
|
|
76
|
+
* remaining bytes are buffered and used for the next read operation.
|
|
77
|
+
*
|
|
78
|
+
* @param numBytes - Number of bytes to read
|
|
79
|
+
* @returns Promise<Uint8Array> The read bytes
|
|
80
|
+
*/
|
|
81
|
+
async read(numBytes) {
|
|
82
|
+
if (numBytes <= 0) {
|
|
83
|
+
throw new Error('Invalid number of bytes to read');
|
|
84
|
+
}
|
|
85
|
+
await this.ensureBufferSize(numBytes);
|
|
86
|
+
const result = this.buffer.slice(this.bufferPosition, this.bufferPosition + numBytes);
|
|
87
|
+
this.bufferPosition += numBytes;
|
|
88
|
+
this.currentPosition += numBytes;
|
|
89
|
+
return {
|
|
90
|
+
value: result,
|
|
91
|
+
done: this.streamClosed,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async ensureBufferSize(minBytes) {
|
|
95
|
+
const availableBytes = this.buffer.length - this.bufferPosition;
|
|
96
|
+
const neededBytes = minBytes - availableBytes;
|
|
97
|
+
if (neededBytes <= 0 || this.streamClosed) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const chunks = [];
|
|
101
|
+
let totalBytesRead = 0;
|
|
102
|
+
while (totalBytesRead < neededBytes && !this.streamClosed) {
|
|
103
|
+
if (!this.reader) {
|
|
104
|
+
throw new Error('Stream reader is not available');
|
|
105
|
+
}
|
|
106
|
+
const { done, value } = await this.reader.read();
|
|
107
|
+
if (done) {
|
|
108
|
+
this.streamClosed = true;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
if (value) {
|
|
112
|
+
chunks.push(value);
|
|
113
|
+
totalBytesRead += value.length;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (chunks.length > 0) {
|
|
117
|
+
// Create new buffer with existing unused data plus new chunks
|
|
118
|
+
const unusedBufferData = this.buffer.slice(this.bufferPosition);
|
|
119
|
+
const newTotalLength = unusedBufferData.length + totalBytesRead;
|
|
120
|
+
const newBuffer = new Uint8Array(newTotalLength);
|
|
121
|
+
newBuffer.set(unusedBufferData, 0);
|
|
122
|
+
let offset = unusedBufferData.length;
|
|
123
|
+
for (const chunk of chunks) {
|
|
124
|
+
newBuffer.set(chunk, offset);
|
|
125
|
+
offset += chunk.length;
|
|
126
|
+
}
|
|
127
|
+
this.buffer = newBuffer;
|
|
128
|
+
this.bufferPosition = 0;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Seek to the given position in the stream.
|
|
133
|
+
*
|
|
134
|
+
* If the position is outside of internally buffered data, the buffer is
|
|
135
|
+
* cleared. If the position is seeked back, the buffer is read again from
|
|
136
|
+
* the underlying source.
|
|
137
|
+
*
|
|
138
|
+
* @param position - The position to seek to in bytes.
|
|
139
|
+
*/
|
|
140
|
+
async seek(position) {
|
|
141
|
+
const endOfBufferPosition = this.currentPosition + (this.buffer.length - this.bufferPosition);
|
|
142
|
+
if (position > endOfBufferPosition) {
|
|
143
|
+
this.buffer = new Uint8Array(0);
|
|
144
|
+
this.bufferPosition = 0;
|
|
145
|
+
}
|
|
146
|
+
else if (position < this.currentPosition) {
|
|
147
|
+
this.buffer = new Uint8Array(0);
|
|
148
|
+
this.bufferPosition = 0;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this.bufferPosition += position - this.currentPosition;
|
|
152
|
+
}
|
|
153
|
+
await super.seek(position);
|
|
154
|
+
if (this.reader) {
|
|
155
|
+
this.reader.releaseLock();
|
|
156
|
+
}
|
|
157
|
+
this.reader = super.getReader();
|
|
158
|
+
this.streamClosed = false;
|
|
159
|
+
this.currentPosition = position;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.BufferedSeekableStream = BufferedSeekableStream;
|
|
163
|
+
//# sourceMappingURL=seekableStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seekableStream.js","sourceRoot":"","sources":["../../../src/internal/download/seekableStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const seekableStream_1 = require("./seekableStream");
|
|
4
|
+
describe('SeekableReadableStream', () => {
|
|
5
|
+
it('should call the seek callback when seek is called', async () => {
|
|
6
|
+
const mockSeek = jest.fn().mockResolvedValue(undefined);
|
|
7
|
+
const mockStart = jest.fn();
|
|
8
|
+
const stream = new seekableStream_1.SeekableReadableStream({
|
|
9
|
+
start: mockStart,
|
|
10
|
+
seek: mockSeek,
|
|
11
|
+
});
|
|
12
|
+
await stream.seek(100);
|
|
13
|
+
expect(mockSeek).toHaveBeenCalledWith(100);
|
|
14
|
+
expect(mockSeek).toHaveBeenCalledTimes(1);
|
|
15
|
+
});
|
|
16
|
+
it('should handle synchronous seek callback', async () => {
|
|
17
|
+
const mockSeek = jest.fn().mockReturnValue(undefined);
|
|
18
|
+
const stream = new seekableStream_1.SeekableReadableStream({
|
|
19
|
+
seek: mockSeek,
|
|
20
|
+
});
|
|
21
|
+
await stream.seek(250);
|
|
22
|
+
expect(mockSeek).toHaveBeenCalledWith(250);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('BufferedSeekableStream', () => {
|
|
26
|
+
let startWithCloseMock;
|
|
27
|
+
let pullMock;
|
|
28
|
+
const data1 = new Uint8Array([1, 2, 3, 4, 5]);
|
|
29
|
+
const data2 = new Uint8Array([6, 7, 8, 9, 10]);
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
startWithCloseMock = jest.fn().mockImplementation((controller) => {
|
|
32
|
+
controller.enqueue(data1);
|
|
33
|
+
controller.close();
|
|
34
|
+
});
|
|
35
|
+
let readIndex = 0;
|
|
36
|
+
pullMock = jest.fn().mockImplementation((controller) => {
|
|
37
|
+
if (readIndex === 0) {
|
|
38
|
+
controller.enqueue(data1);
|
|
39
|
+
}
|
|
40
|
+
else if (readIndex === 1) {
|
|
41
|
+
controller.enqueue(data2);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
controller.close();
|
|
45
|
+
}
|
|
46
|
+
readIndex++;
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it('should throw error if highWaterMark is not 0', () => {
|
|
50
|
+
expect(() => {
|
|
51
|
+
new seekableStream_1.BufferedSeekableStream({ seek: jest.fn() }, { highWaterMark: 1 });
|
|
52
|
+
}).toThrow('highWaterMark must be 0');
|
|
53
|
+
});
|
|
54
|
+
it('should throw error when reading invalid number of bytes', async () => {
|
|
55
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
56
|
+
seek: jest.fn(),
|
|
57
|
+
});
|
|
58
|
+
await expect(stream.read(0)).rejects.toThrow('Invalid number of bytes to read');
|
|
59
|
+
await expect(stream.read(-1)).rejects.toThrow('Invalid number of bytes to read');
|
|
60
|
+
});
|
|
61
|
+
it('should read exact number of bytes when underlying source provides exact amount', async () => {
|
|
62
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
63
|
+
start: startWithCloseMock,
|
|
64
|
+
seek: jest.fn(),
|
|
65
|
+
});
|
|
66
|
+
const result = await stream.read(5);
|
|
67
|
+
expect(result).toEqual({ value: data1, done: false });
|
|
68
|
+
});
|
|
69
|
+
it('should buffer extra bytes when underlying source provides more than requested', async () => {
|
|
70
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
71
|
+
pull: pullMock,
|
|
72
|
+
seek: jest.fn(),
|
|
73
|
+
});
|
|
74
|
+
const result1 = await stream.read(3);
|
|
75
|
+
expect(result1).toEqual({ value: new Uint8Array([1, 2, 3]), done: false });
|
|
76
|
+
expect(pullMock).toHaveBeenCalledTimes(1);
|
|
77
|
+
const result2 = await stream.read(2);
|
|
78
|
+
expect(result2).toEqual({ value: new Uint8Array([4, 5]), done: false });
|
|
79
|
+
expect(pullMock).toHaveBeenCalledTimes(1);
|
|
80
|
+
});
|
|
81
|
+
it('should use buffered data and read more when buffer is not enough for next read', async () => {
|
|
82
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
83
|
+
pull: pullMock,
|
|
84
|
+
seek: jest.fn(),
|
|
85
|
+
});
|
|
86
|
+
const result1 = await stream.read(3);
|
|
87
|
+
expect(result1).toEqual({ value: new Uint8Array([1, 2, 3]), done: false });
|
|
88
|
+
expect(pullMock).toHaveBeenCalledTimes(1);
|
|
89
|
+
const result2 = await stream.read(5);
|
|
90
|
+
expect(result2).toEqual({ value: new Uint8Array([4, 5, 6, 7, 8]), done: false });
|
|
91
|
+
expect(pullMock).toHaveBeenCalledTimes(2);
|
|
92
|
+
});
|
|
93
|
+
it('should handle end of file gracefully when not enough data available', async () => {
|
|
94
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
95
|
+
start: startWithCloseMock,
|
|
96
|
+
seek: jest.fn(),
|
|
97
|
+
});
|
|
98
|
+
const result = await stream.read(10);
|
|
99
|
+
expect(result).toEqual({ value: data1, done: true });
|
|
100
|
+
});
|
|
101
|
+
it('should clear buffer when seeking back', async () => {
|
|
102
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
103
|
+
pull: pullMock,
|
|
104
|
+
seek: jest.fn(),
|
|
105
|
+
});
|
|
106
|
+
const result1 = await stream.read(2);
|
|
107
|
+
expect(result1).toEqual({ value: new Uint8Array([1, 2]), done: false });
|
|
108
|
+
await stream.seek(0);
|
|
109
|
+
const result2 = await stream.read(3);
|
|
110
|
+
expect(result2).toEqual({ value: new Uint8Array([6, 7, 8]), done: false });
|
|
111
|
+
});
|
|
112
|
+
it('should clear buffer when seeking past buffer end', async () => {
|
|
113
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
114
|
+
pull: pullMock,
|
|
115
|
+
seek: jest.fn(),
|
|
116
|
+
});
|
|
117
|
+
const result1 = await stream.read(2);
|
|
118
|
+
expect(result1).toEqual({ value: new Uint8Array([1, 2]), done: false });
|
|
119
|
+
await stream.seek(100);
|
|
120
|
+
const result2 = await stream.read(3);
|
|
121
|
+
expect(result2).toEqual({ value: new Uint8Array([6, 7, 8]), done: false });
|
|
122
|
+
});
|
|
123
|
+
it('should update buffer correctly when seeking within buffer range', async () => {
|
|
124
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
125
|
+
pull: pullMock,
|
|
126
|
+
seek: jest.fn(),
|
|
127
|
+
});
|
|
128
|
+
const result1 = await stream.read(1);
|
|
129
|
+
expect(result1).toEqual({ value: new Uint8Array([1]), done: false });
|
|
130
|
+
await stream.seek(3);
|
|
131
|
+
const result2 = await stream.read(3);
|
|
132
|
+
expect(result2).toEqual({ value: new Uint8Array([4, 5, 6]), done: false });
|
|
133
|
+
});
|
|
134
|
+
it('should handle multiple read operations correctly', async () => {
|
|
135
|
+
const stream = new seekableStream_1.BufferedSeekableStream({
|
|
136
|
+
pull: pullMock,
|
|
137
|
+
seek: jest.fn(),
|
|
138
|
+
});
|
|
139
|
+
const result1 = await stream.read(2);
|
|
140
|
+
expect(result1).toEqual({ value: new Uint8Array([1, 2]), done: false });
|
|
141
|
+
const result2 = await stream.read(4);
|
|
142
|
+
expect(result2).toEqual({ value: new Uint8Array([3, 4, 5, 6]), done: false });
|
|
143
|
+
const result3 = await stream.read(3);
|
|
144
|
+
expect(result3).toEqual({ value: new Uint8Array([7, 8, 9]), done: false });
|
|
145
|
+
const result4 = await stream.read(2);
|
|
146
|
+
expect(result4).toEqual({ value: new Uint8Array([10]), done: true });
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=seekableStream.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seekableStream.test.js","sourceRoot":"","sources":["../../../src/internal/download/seekableStream.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/internal/download/telemetry.ts"],"names":[],"mappings":";;;AAAA,yCAAkG;AAElG,+CAAmD;AACnD,8CAA6C;AAC7C,kCAA6D;AAG7D,MAAa,iBAAiB;IAId;IACA;IAJJ,MAAM,CAAS;IAEvB,YACY,SAA+B,EAC/B,aAA4B;QAD5B,cAAS,GAAT,SAAS,CAAsB;QAC/B,kBAAa,GAAb,aAAa,CAAe;QAEpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,WAAmB;QACpC,OAAO,IAAI,4BAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAc;QACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,mBAAY,EAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE9C,wDAAwD;QACxD,gCAAgC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC/B,cAAc,EAAE,CAAC;YACjB,KAAK,EAAE,aAAa;YACpB,aAAa,EAAE,KAAK;SACvB,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,KAAc,EAAE,cAAsB,EAAE,eAAwB;QACtG,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,2BAAoB,EAAC,WAAW,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE9C,wDAAwD;QACxD,gCAAgC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC/B,cAAc;YACd,eAAe;YACf,KAAK,EAAE,aAAa;YACpB,aAAa,EAAE,KAAK;SACvB,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,cAAsB;QAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,2BAAoB,EAAC,WAAW,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC/B,cAAc;YACd,eAAe,EAAE,cAAc;SAClC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,aAAa,CACvB,QAAgB,EAChB,OAKC;QAED,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACD,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/internal/download/telemetry.ts"],"names":[],"mappings":";;;AAAA,yCAAkG;AAElG,+CAAmD;AACnD,8CAA6C;AAC7C,kCAA6D;AAG7D,MAAa,iBAAiB;IAId;IACA;IAJJ,MAAM,CAAS;IAEvB,YACY,SAA+B,EAC/B,aAA4B;QAD5B,cAAS,GAAT,SAAS,CAAsB;QAC/B,kBAAa,GAAb,aAAa,CAAe;QAEpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,WAAmB;QACpC,OAAO,IAAI,4BAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAc;QACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,mBAAY,EAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE9C,wDAAwD;QACxD,gCAAgC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC/B,cAAc,EAAE,CAAC;YACjB,KAAK,EAAE,aAAa;YACpB,aAAa,EAAE,KAAK;SACvB,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,KAAc,EAAE,cAAsB,EAAE,eAAwB;QACtG,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,2BAAoB,EAAC,WAAW,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE9C,wDAAwD;QACxD,gCAAgC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC/B,cAAc;YACd,eAAe;YACf,KAAK,EAAE,aAAa;YACpB,aAAa,EAAE,KAAK;SACvB,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,cAAsB;QAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,2BAAoB,EAAC,WAAW,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC/B,cAAc;YACd,eAAe,EAAE,cAAc;SAClC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,aAAa,CACvB,QAAgB,EAChB,OAKC;QAED,IAAI,UAAU,CAAC;QACf,IAAI,CAAC;YACD,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YACxB,SAAS,EAAE,UAAU;YACrB,UAAU;YACV,GAAG,OAAO;SACb,CAAC,CAAC;IACP,CAAC;CACJ;AAjFD,8CAiFC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,wBAAe,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,YAAY,yBAAgB,EAAE,CAAC;QACpC,OAAO,cAAc,CAAC;IAC1B,CAAC;IACD,IAAI,KAAK,YAAY,wBAAe,EAAE,CAAC;QACnC,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,YAAY,uBAAc,EAAE,CAAC;QAClC,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,YAAY,yBAAY,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO,cAAc,CAAC;QAC1B,CAAC;IACL,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAChC,OAAO,cAAc,CAAC;QAC1B,CAAC;QACD,IACI,KAAK,CAAC,IAAI,KAAK,cAAc;YAC7B,KAAK,CAAC,IAAI,KAAK,cAAc;YAC7B,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAClD,CAAC;YACC,OAAO,eAAe,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC"}
|
|
@@ -11,7 +11,7 @@ describe('DownloadTelemetry', () => {
|
|
|
11
11
|
const revisionUid = 'volumeId~nodeId~revisionId';
|
|
12
12
|
beforeEach(() => {
|
|
13
13
|
mockTelemetry = {
|
|
14
|
-
|
|
14
|
+
recordMetric: jest.fn(),
|
|
15
15
|
getLogger: jest.fn().mockReturnValue({
|
|
16
16
|
info: jest.fn(),
|
|
17
17
|
warn: jest.fn(),
|
|
@@ -27,7 +27,7 @@ describe('DownloadTelemetry', () => {
|
|
|
27
27
|
it('should log failure during init (excludes file size)', async () => {
|
|
28
28
|
const error = new Error('Failed');
|
|
29
29
|
await downloadTelemetry.downloadInitFailed(nodeUid, error);
|
|
30
|
-
expect(mockTelemetry.
|
|
30
|
+
expect(mockTelemetry.recordMetric).toHaveBeenCalledWith({
|
|
31
31
|
eventName: 'download',
|
|
32
32
|
volumeType: 'own_volume',
|
|
33
33
|
downloadedSize: 0,
|
|
@@ -38,7 +38,7 @@ describe('DownloadTelemetry', () => {
|
|
|
38
38
|
it('should log failure download', async () => {
|
|
39
39
|
const error = new Error('Failed');
|
|
40
40
|
await downloadTelemetry.downloadFailed(revisionUid, error, 123, 456);
|
|
41
|
-
expect(mockTelemetry.
|
|
41
|
+
expect(mockTelemetry.recordMetric).toHaveBeenCalledWith({
|
|
42
42
|
eventName: 'download',
|
|
43
43
|
volumeType: 'own_volume',
|
|
44
44
|
downloadedSize: 123,
|
|
@@ -49,7 +49,7 @@ describe('DownloadTelemetry', () => {
|
|
|
49
49
|
});
|
|
50
50
|
it('should log successful download (excludes error)', async () => {
|
|
51
51
|
await downloadTelemetry.downloadFinished(revisionUid, 500);
|
|
52
|
-
expect(mockTelemetry.
|
|
52
|
+
expect(mockTelemetry.recordMetric).toHaveBeenCalledWith({
|
|
53
53
|
eventName: 'download',
|
|
54
54
|
volumeType: 'own_volume',
|
|
55
55
|
downloadedSize: 500,
|
|
@@ -58,20 +58,20 @@ describe('DownloadTelemetry', () => {
|
|
|
58
58
|
});
|
|
59
59
|
describe('detect error category', () => {
|
|
60
60
|
const verifyErrorCategory = (error) => {
|
|
61
|
-
expect(mockTelemetry.
|
|
61
|
+
expect(mockTelemetry.recordMetric).toHaveBeenCalledWith(expect.objectContaining({
|
|
62
62
|
error,
|
|
63
63
|
}));
|
|
64
64
|
};
|
|
65
65
|
it('should ignore ValidationError', async () => {
|
|
66
66
|
const error = new errors_1.ValidationError('Validation error');
|
|
67
67
|
await downloadTelemetry.downloadFailed(revisionUid, error, 100, 200);
|
|
68
|
-
expect(mockTelemetry.
|
|
68
|
+
expect(mockTelemetry.recordMetric).not.toHaveBeenCalled();
|
|
69
69
|
});
|
|
70
70
|
it('should ignore AbortError', async () => {
|
|
71
71
|
const error = new Error('Aborted');
|
|
72
72
|
error.name = 'AbortError';
|
|
73
73
|
await downloadTelemetry.downloadFailed(revisionUid, error, 100, 200);
|
|
74
|
-
expect(mockTelemetry.
|
|
74
|
+
expect(mockTelemetry.recordMetric).not.toHaveBeenCalled();
|
|
75
75
|
});
|
|
76
76
|
it('should detect "rate_limited" error for RateLimitedError', async () => {
|
|
77
77
|
const error = new errors_1.RateLimitedError('Rate limited');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/internal/download/telemetry.test.ts"],"names":[],"mappings":";;AAAA,yCAAkG;AAElG,8CAA6C;AAE7C,2CAAgD;AAEhD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,IAAI,aAAgD,CAAC;IACrD,IAAI,aAAyC,CAAC;IAC9C,IAAI,iBAAoC,CAAC;IAEzC,MAAM,OAAO,GAAG,iBAAiB,CAAC;IAClC,MAAM,WAAW,GAAG,4BAA4B,CAAC;IAEjD,UAAU,CAAC,GAAG,EAAE;QACZ,aAAa,GAAG;YACZ,
|
|
1
|
+
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/internal/download/telemetry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,4 +3,4 @@ export declare function getErrorMessage(error: unknown): string;
|
|
|
3
3
|
/**
|
|
4
4
|
* @param signatureType - Must be translated before calling this function.
|
|
5
5
|
*/
|
|
6
|
-
export declare function getVerificationMessage(verified: VERIFICATION_STATUS, signatureType?: string, notAvailableVerificationKeys?: boolean): string;
|
|
6
|
+
export declare function getVerificationMessage(verified: VERIFICATION_STATUS, verificationErrors?: Error[], signatureType?: string, notAvailableVerificationKeys?: boolean): string;
|
package/dist/internal/errors.js
CHANGED
|
@@ -10,7 +10,7 @@ function getErrorMessage(error) {
|
|
|
10
10
|
/**
|
|
11
11
|
* @param signatureType - Must be translated before calling this function.
|
|
12
12
|
*/
|
|
13
|
-
function getVerificationMessage(verified, signatureType, notAvailableVerificationKeys = false) {
|
|
13
|
+
function getVerificationMessage(verified, verificationErrors, signatureType, notAvailableVerificationKeys = false) {
|
|
14
14
|
if (verified === crypto_1.VERIFICATION_STATUS.NOT_SIGNED) {
|
|
15
15
|
return signatureType ? (0, ttag_1.c)('Error').t `Missing signature for ${signatureType}` : (0, ttag_1.c)('Error').t `Missing signature`;
|
|
16
16
|
}
|
|
@@ -19,6 +19,12 @@ function getVerificationMessage(verified, signatureType, notAvailableVerificatio
|
|
|
19
19
|
? (0, ttag_1.c)('Error').t `Verification keys for ${signatureType} are not available`
|
|
20
20
|
: (0, ttag_1.c)('Error').t `Verification keys are not available`;
|
|
21
21
|
}
|
|
22
|
+
if (verificationErrors) {
|
|
23
|
+
const errorMessage = verificationErrors?.map((e) => e.message).join(', ');
|
|
24
|
+
return signatureType
|
|
25
|
+
? (0, ttag_1.c)('Error').t `Signature verification for ${signatureType} failed: ${errorMessage}`
|
|
26
|
+
: (0, ttag_1.c)('Error').t `Signature verification failed: ${errorMessage}`;
|
|
27
|
+
}
|
|
22
28
|
return signatureType
|
|
23
29
|
? (0, ttag_1.c)('Error').t `Signature verification for ${signatureType} failed`
|
|
24
30
|
: (0, ttag_1.c)('Error').t `Signature verification failed`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":";;AAIA,0CAEC;AAKD,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":";;AAIA,0CAEC;AAKD,wDA0BC;AArCD,+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,CAClC,QAA6B,EAC7B,kBAA4B,EAC5B,aAAsB,EACtB,4BAA4B,GAAG,KAAK;IAEpC,IAAI,QAAQ,KAAK,4BAAmB,CAAC,UAAU,EAAE,CAAC;QAC9C,OAAO,aAAa,CAAC,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,yBAAyB,aAAa,EAAE,CAAC,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,mBAAmB,CAAC;IAClH,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,IAAI,kBAAkB,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,OAAO,aAAa;YAChB,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,8BAA8B,aAAa,YAAY,YAAY,EAAE;YACnF,CAAC,CAAC,IAAA,QAAC,EAAC,OAAO,CAAC,CAAC,CAAC,CAAA,kCAAkC,YAAY,EAAE,CAAC;IACvE,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"}
|
|
@@ -4,18 +4,52 @@ const crypto_1 = require("../crypto");
|
|
|
4
4
|
const errors_1 = require("./errors");
|
|
5
5
|
describe('getVerificationMessage', () => {
|
|
6
6
|
const testCases = [
|
|
7
|
-
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, 'type', false, 'Missing signature for type'],
|
|
8
|
-
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, undefined, false, 'Missing signature'],
|
|
9
|
-
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, 'type', true, 'Missing signature for type'],
|
|
10
|
-
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, undefined, true, 'Missing signature'],
|
|
11
|
-
[crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID, 'type', false, 'Signature verification for type failed'],
|
|
12
|
-
[crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID, undefined, false, 'Signature verification failed'],
|
|
13
|
-
[
|
|
14
|
-
|
|
7
|
+
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, undefined, 'type', false, 'Missing signature for type'],
|
|
8
|
+
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, undefined, undefined, false, 'Missing signature'],
|
|
9
|
+
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, undefined, 'type', true, 'Missing signature for type'],
|
|
10
|
+
[crypto_1.VERIFICATION_STATUS.NOT_SIGNED, undefined, undefined, true, 'Missing signature'],
|
|
11
|
+
[crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID, undefined, 'type', false, 'Signature verification for type failed'],
|
|
12
|
+
[crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID, undefined, undefined, false, 'Signature verification failed'],
|
|
13
|
+
[
|
|
14
|
+
crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
15
|
+
undefined,
|
|
16
|
+
'type',
|
|
17
|
+
true,
|
|
18
|
+
'Verification keys for type are not available',
|
|
19
|
+
],
|
|
20
|
+
[crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID, undefined, undefined, true, 'Verification keys are not available'],
|
|
21
|
+
[
|
|
22
|
+
crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
23
|
+
[new Error('error1'), new Error('error2')],
|
|
24
|
+
undefined,
|
|
25
|
+
false,
|
|
26
|
+
'Signature verification failed: error1, error2',
|
|
27
|
+
],
|
|
28
|
+
[
|
|
29
|
+
crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
30
|
+
[new Error('error1'), new Error('error2')],
|
|
31
|
+
'type',
|
|
32
|
+
false,
|
|
33
|
+
'Signature verification for type failed: error1, error2',
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
37
|
+
[new Error('error1'), new Error('error2')],
|
|
38
|
+
undefined,
|
|
39
|
+
true,
|
|
40
|
+
'Verification keys are not available',
|
|
41
|
+
],
|
|
42
|
+
[
|
|
43
|
+
crypto_1.VERIFICATION_STATUS.SIGNED_AND_INVALID,
|
|
44
|
+
[new Error('error1'), new Error('error2')],
|
|
45
|
+
'type',
|
|
46
|
+
true,
|
|
47
|
+
'Verification keys for type are not available',
|
|
48
|
+
],
|
|
15
49
|
];
|
|
16
|
-
for (const [status, type, notAvailable, expected] of testCases) {
|
|
50
|
+
for (const [status, errors, type, notAvailable, expected] of testCases) {
|
|
17
51
|
it(`returns correct message for status ${status} with type ${type} and notAvailable ${notAvailable}`, () => {
|
|
18
|
-
expect((0, errors_1.getVerificationMessage)(status, type, notAvailable)).toBe(expected);
|
|
52
|
+
expect((0, errors_1.getVerificationMessage)(status, errors, type, notAvailable)).toBe(expected);
|
|
19
53
|
});
|
|
20
54
|
}
|
|
21
55
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/internal/errors.test.ts"],"names":[],"mappings":";;AAAA,sCAAgD;AAChD,qCAAkD;AAElD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACpC,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/internal/errors.test.ts"],"names":[],"mappings":";;AAAA,sCAAgD;AAChD,qCAAkD;AAElD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACpC,MAAM,SAAS,GAAsF;QACjG,CAAC,4BAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,4BAA4B,CAAC;QACxF,CAAC,4BAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,CAAC;QAClF,CAAC,4BAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,CAAC;QACvF,CAAC,4BAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,mBAAmB,CAAC;QACjF,CAAC,4BAAmB,CAAC,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,wCAAwC,CAAC;QAC5G,CAAC,4BAAmB,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,+BAA+B,CAAC;QACtG;YACI,4BAAmB,CAAC,kBAAkB;YACtC,SAAS;YACT,MAAM;YACN,IAAI;YACJ,8CAA8C;SACjD;QACD,CAAC,4BAAmB,CAAC,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,qCAAqC,CAAC;QAC3G;YACI,4BAAmB,CAAC,kBAAkB;YACtC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,SAAS;YACT,KAAK;YACL,+CAA+C;SAClD;QACD;YACI,4BAAmB,CAAC,kBAAkB;YACtC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM;YACN,KAAK;YACL,wDAAwD;SAC3D;QACD;YACI,4BAAmB,CAAC,kBAAkB;YACtC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,SAAS;YACT,IAAI;YACJ,qCAAqC;SACxC;QACD;YACI,4BAAmB,CAAC,kBAAkB;YACtC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM;YACN,IAAI;YACJ,8CAA8C;SACjD;KACJ,CAAC;IAEF,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QACrE,EAAE,CAAC,sCAAsC,MAAM,cAAc,IAAI,qBAAqB,YAAY,EAAE,EAAE,GAAG,EAAE;YACvG,MAAM,CAAC,IAAA,+BAAsB,EAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC,CAAC"}
|