@protontech/drive-sdk 0.9.7 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/interface/upload.d.ts +10 -0
- package/dist/internal/nodes/mediaTypes.d.ts +2 -0
- package/dist/internal/nodes/mediaTypes.js +3 -0
- package/dist/internal/nodes/mediaTypes.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.js +2 -1
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +15 -1
- package/dist/internal/photos/albums.js +91 -1
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/albums.test.d.ts +1 -0
- package/dist/internal/photos/albums.test.js +217 -0
- package/dist/internal/photos/albums.test.js.map +1 -0
- package/dist/internal/photos/albumsCrypto.d.ts +35 -0
- package/dist/internal/photos/albumsCrypto.js +66 -0
- package/dist/internal/photos/albumsCrypto.js.map +1 -0
- package/dist/internal/photos/albumsCrypto.test.d.ts +1 -0
- package/dist/internal/photos/albumsCrypto.test.js +134 -0
- package/dist/internal/photos/albumsCrypto.test.js.map +1 -0
- package/dist/internal/photos/apiService.d.ts +22 -0
- package/dist/internal/photos/apiService.js +91 -0
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/index.d.ts +4 -4
- package/dist/internal/photos/index.js +5 -3
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +21 -0
- package/dist/internal/photos/interface.js +14 -0
- package/dist/internal/photos/interface.js.map +1 -1
- package/dist/internal/photos/timeline.d.ts +2 -5
- package/dist/internal/photos/timeline.js.map +1 -1
- package/dist/internal/photos/upload.js +3 -2
- package/dist/internal/photos/upload.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +3 -1
- package/dist/internal/upload/streamUploader.js +10 -3
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +10 -0
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +64 -6
- package/dist/protonDrivePhotosClient.js +75 -1
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +15 -0
- package/dist/protonDrivePublicLinkClient.js +20 -0
- package/dist/protonDrivePublicLinkClient.js.map +1 -1
- package/package.json +1 -1
- package/src/interface/upload.ts +10 -0
- package/src/internal/nodes/mediaTypes.ts +3 -0
- package/src/internal/nodes/nodesManagement.ts +2 -1
- package/src/internal/photos/albums.test.ts +268 -0
- package/src/internal/photos/albums.ts +136 -0
- package/src/internal/photos/albumsCrypto.test.ts +181 -0
- package/src/internal/photos/albumsCrypto.ts +100 -0
- package/src/internal/photos/apiService.ts +168 -2
- package/src/internal/photos/index.ts +7 -5
- package/src/internal/photos/interface.ts +24 -0
- package/src/internal/photos/timeline.ts +2 -5
- package/src/internal/photos/upload.ts +3 -2
- package/src/internal/upload/streamUploader.test.ts +38 -0
- package/src/internal/upload/streamUploader.ts +10 -3
- package/src/protonDrivePhotosClient.ts +104 -9
- package/src/protonDrivePublicLinkClient.ts +27 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const albumsCrypto_1 = require("./albumsCrypto");
|
|
4
|
+
describe('AlbumsCryptoService', () => {
|
|
5
|
+
let driveCrypto;
|
|
6
|
+
let albumsCryptoService;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
jest.clearAllMocks();
|
|
9
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
10
|
+
driveCrypto = {};
|
|
11
|
+
albumsCryptoService = new albumsCrypto_1.AlbumsCryptoService(driveCrypto);
|
|
12
|
+
});
|
|
13
|
+
describe('createAlbum', () => {
|
|
14
|
+
let parentKeys;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
parentKeys = {
|
|
17
|
+
key: 'parentKey',
|
|
18
|
+
hashKey: new Uint8Array([1, 2, 3]),
|
|
19
|
+
};
|
|
20
|
+
driveCrypto.generateKey = jest.fn().mockResolvedValue({
|
|
21
|
+
encrypted: {
|
|
22
|
+
armoredKey: 'encryptedNodeKey',
|
|
23
|
+
armoredPassphrase: 'encryptedPassphrase',
|
|
24
|
+
armoredPassphraseSignature: 'passphraseSignature',
|
|
25
|
+
},
|
|
26
|
+
decrypted: {
|
|
27
|
+
key: 'nodeKey',
|
|
28
|
+
passphrase: 'nodePassphrase',
|
|
29
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
driveCrypto.encryptNodeName = jest.fn().mockResolvedValue({
|
|
33
|
+
armoredNodeName: 'encryptedNodeName',
|
|
34
|
+
});
|
|
35
|
+
driveCrypto.generateLookupHash = jest.fn().mockResolvedValue('lookupHash');
|
|
36
|
+
driveCrypto.generateHashKey = jest.fn().mockResolvedValue({
|
|
37
|
+
armoredHashKey: 'encryptedHashKey',
|
|
38
|
+
hashKey: new Uint8Array([4, 5, 6]),
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('should encrypt new album with user address key', async () => {
|
|
42
|
+
const signingKeys = {
|
|
43
|
+
type: 'userAddress',
|
|
44
|
+
email: 'test@example.com',
|
|
45
|
+
addressId: 'addressId',
|
|
46
|
+
key: 'addressKey',
|
|
47
|
+
};
|
|
48
|
+
const result = await albumsCryptoService.createAlbum(parentKeys, signingKeys, 'My Album');
|
|
49
|
+
expect(result).toEqual({
|
|
50
|
+
encryptedCrypto: {
|
|
51
|
+
encryptedName: 'encryptedNodeName',
|
|
52
|
+
hash: 'lookupHash',
|
|
53
|
+
armoredKey: 'encryptedNodeKey',
|
|
54
|
+
armoredNodePassphrase: 'encryptedPassphrase',
|
|
55
|
+
armoredNodePassphraseSignature: 'passphraseSignature',
|
|
56
|
+
signatureEmail: 'test@example.com',
|
|
57
|
+
armoredHashKey: 'encryptedHashKey',
|
|
58
|
+
},
|
|
59
|
+
keys: {
|
|
60
|
+
passphrase: 'nodePassphrase',
|
|
61
|
+
key: 'nodeKey',
|
|
62
|
+
passphraseSessionKey: 'passphraseSessionKey',
|
|
63
|
+
hashKey: new Uint8Array([4, 5, 6]),
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
expect(driveCrypto.generateKey).toHaveBeenCalledWith([parentKeys.key], signingKeys.key);
|
|
67
|
+
expect(driveCrypto.encryptNodeName).toHaveBeenCalledWith('My Album', undefined, parentKeys.key, signingKeys.key);
|
|
68
|
+
expect(driveCrypto.generateLookupHash).toHaveBeenCalledWith('My Album', parentKeys.hashKey);
|
|
69
|
+
expect(driveCrypto.generateHashKey).toHaveBeenCalledWith('nodeKey');
|
|
70
|
+
});
|
|
71
|
+
it('should throw error when creating album by anonymous user', async () => {
|
|
72
|
+
const signingKeys = {
|
|
73
|
+
type: 'nodeKey',
|
|
74
|
+
nodeKey: 'nodeSigningKey',
|
|
75
|
+
parentNodeKey: 'parentNodeKey',
|
|
76
|
+
};
|
|
77
|
+
await expect(albumsCryptoService.createAlbum(parentKeys, signingKeys, 'My Album')).rejects.toThrow('Creating album by anonymous user is not supported');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('renameAlbum', () => {
|
|
81
|
+
let parentKeys;
|
|
82
|
+
let nodeNameSessionKey;
|
|
83
|
+
beforeEach(() => {
|
|
84
|
+
parentKeys = {
|
|
85
|
+
key: 'parentKey',
|
|
86
|
+
hashKey: new Uint8Array([1, 2, 3]),
|
|
87
|
+
};
|
|
88
|
+
nodeNameSessionKey = 'nameSessionKey';
|
|
89
|
+
driveCrypto.decryptSessionKey = jest.fn().mockResolvedValue(nodeNameSessionKey);
|
|
90
|
+
driveCrypto.encryptNodeName = jest.fn().mockResolvedValue({
|
|
91
|
+
armoredNodeName: 'encryptedNewNodeName',
|
|
92
|
+
});
|
|
93
|
+
driveCrypto.generateLookupHash = jest.fn().mockResolvedValue('newHash');
|
|
94
|
+
});
|
|
95
|
+
it('should encrypt new album name with user address key', async () => {
|
|
96
|
+
const signingKeys = {
|
|
97
|
+
type: 'userAddress',
|
|
98
|
+
email: 'test@example.com',
|
|
99
|
+
addressId: 'addressId',
|
|
100
|
+
key: 'addressKey',
|
|
101
|
+
};
|
|
102
|
+
const result = await albumsCryptoService.renameAlbum(parentKeys, 'oldEncryptedName', signingKeys, 'Renamed Album');
|
|
103
|
+
expect(result).toEqual({
|
|
104
|
+
signatureEmail: 'test@example.com',
|
|
105
|
+
armoredNodeName: 'encryptedNewNodeName',
|
|
106
|
+
hash: 'newHash',
|
|
107
|
+
});
|
|
108
|
+
expect(driveCrypto.decryptSessionKey).toHaveBeenCalledWith('oldEncryptedName', parentKeys.key);
|
|
109
|
+
expect(driveCrypto.encryptNodeName).toHaveBeenCalledWith('Renamed Album', nodeNameSessionKey, parentKeys.key, signingKeys.key);
|
|
110
|
+
expect(driveCrypto.generateLookupHash).toHaveBeenCalledWith('Renamed Album', parentKeys.hashKey);
|
|
111
|
+
});
|
|
112
|
+
it('should throw error when renaming album by anonymous user', async () => {
|
|
113
|
+
const signingKeys = {
|
|
114
|
+
type: 'nodeKey',
|
|
115
|
+
nodeKey: 'nodeSigningKey',
|
|
116
|
+
parentNodeKey: 'parentNodeKey',
|
|
117
|
+
};
|
|
118
|
+
await expect(albumsCryptoService.renameAlbum(parentKeys, 'oldEncryptedName', signingKeys, 'Renamed Album')).rejects.toThrow('Renaming album by anonymous user is not supported');
|
|
119
|
+
});
|
|
120
|
+
it('should throw error when parent hash key is not available', async () => {
|
|
121
|
+
const parentKeysWithoutHashKey = {
|
|
122
|
+
key: 'parentKey',
|
|
123
|
+
};
|
|
124
|
+
const signingKeys = {
|
|
125
|
+
type: 'userAddress',
|
|
126
|
+
email: 'test@example.com',
|
|
127
|
+
addressId: 'addressId',
|
|
128
|
+
key: 'addressKey',
|
|
129
|
+
};
|
|
130
|
+
await expect(albumsCryptoService.renameAlbum(parentKeysWithoutHashKey, 'oldEncryptedName', signingKeys, 'Renamed Album')).rejects.toThrow('Cannot rename album: parent folder hash key not available');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=albumsCrypto.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"albumsCrypto.test.js","sourceRoot":"","sources":["../../../src/internal/photos/albumsCrypto.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { NodeResult } from '../../interface';
|
|
1
2
|
import { DriveAPIService } from '../apiService';
|
|
2
3
|
import { EncryptedRootShare, EncryptedShareCrypto } from '../shares/interface';
|
|
4
|
+
import { AlbumItem } from './interface';
|
|
3
5
|
/**
|
|
4
6
|
* Provides API communication for fetching and manipulating photos and albums
|
|
5
7
|
* metadata.
|
|
@@ -36,10 +38,30 @@ export declare class PhotosAPIService {
|
|
|
36
38
|
photoCount: number;
|
|
37
39
|
lastActivityTime: Date;
|
|
38
40
|
}>;
|
|
41
|
+
iterateAlbumChildren(albumNodeUid: string, signal?: AbortSignal): AsyncGenerator<AlbumItem>;
|
|
39
42
|
checkPhotoDuplicates(volumeId: string, nameHashes: string[], signal?: AbortSignal): Promise<{
|
|
40
43
|
nameHash: string;
|
|
41
44
|
contentHash: string;
|
|
42
45
|
nodeUid: string;
|
|
43
46
|
clientUid?: string;
|
|
44
47
|
}[]>;
|
|
48
|
+
createAlbum(parentNodeUid: string, album: {
|
|
49
|
+
encryptedName: string;
|
|
50
|
+
hash: string;
|
|
51
|
+
armoredKey: string;
|
|
52
|
+
armoredNodePassphrase: string;
|
|
53
|
+
armoredNodePassphraseSignature: string;
|
|
54
|
+
signatureEmail: string;
|
|
55
|
+
armoredHashKey: string;
|
|
56
|
+
}): Promise<string>;
|
|
57
|
+
updateAlbum(albumNodeUid: string, coverPhotoNodeUid?: string, updatedName?: {
|
|
58
|
+
encryptedName: string;
|
|
59
|
+
hash: string;
|
|
60
|
+
originalHash: string;
|
|
61
|
+
nameSignatureEmail: string;
|
|
62
|
+
}): Promise<void>;
|
|
63
|
+
deleteAlbum(albumNodeUid: string, options?: {
|
|
64
|
+
force?: boolean;
|
|
65
|
+
}): Promise<void>;
|
|
66
|
+
removePhotosFromAlbum(albumNodeUid: string, photoNodeUids: string[], signal?: AbortSignal): AsyncGenerator<NodeResult>;
|
|
45
67
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PhotosAPIService = void 0;
|
|
4
|
+
const ttag_1 = require("ttag");
|
|
5
|
+
const errors_1 = require("../../errors");
|
|
6
|
+
const apiService_1 = require("../apiService");
|
|
7
|
+
const batch_1 = require("../batch");
|
|
4
8
|
const interface_1 = require("../shares/interface");
|
|
5
9
|
const uids_1 = require("../uids");
|
|
10
|
+
const ALBUM_CONTAINS_PHOTOS_NOT_IN_TIMELINE_ERROR_CODE = 200302;
|
|
6
11
|
/**
|
|
7
12
|
* Provides API communication for fetching and manipulating photos and albums
|
|
8
13
|
* metadata.
|
|
@@ -92,6 +97,23 @@ class PhotosAPIService {
|
|
|
92
97
|
anchor = response.AnchorID;
|
|
93
98
|
}
|
|
94
99
|
}
|
|
100
|
+
async *iterateAlbumChildren(albumNodeUid, signal) {
|
|
101
|
+
const { volumeId, nodeId: linkId } = (0, uids_1.splitNodeUid)(albumNodeUid);
|
|
102
|
+
let anchor = '';
|
|
103
|
+
while (true) {
|
|
104
|
+
const response = await this.apiService.get(`drive/photos/volumes/${volumeId}/albums/${linkId}/children?Sort=Captured&Desc=1${anchor ? `&AnchorID=${anchor}` : ''}`, signal);
|
|
105
|
+
for (const photo of response.Photos) {
|
|
106
|
+
yield {
|
|
107
|
+
nodeUid: (0, uids_1.makeNodeUid)(volumeId, photo.LinkID),
|
|
108
|
+
captureTime: new Date(photo.CaptureTime * 1000),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (!response.More || !response.AnchorID) {
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
anchor = response.AnchorID;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
95
117
|
async checkPhotoDuplicates(volumeId, nameHashes, signal) {
|
|
96
118
|
const response = await this.apiService.post(`drive/volumes/${volumeId}/photos/duplicates`, {
|
|
97
119
|
NameHashes: nameHashes,
|
|
@@ -108,6 +130,75 @@ class PhotosAPIService {
|
|
|
108
130
|
};
|
|
109
131
|
}).filter((duplicate) => duplicate !== undefined);
|
|
110
132
|
}
|
|
133
|
+
async createAlbum(parentNodeUid, album) {
|
|
134
|
+
const { volumeId } = (0, uids_1.splitNodeUid)(parentNodeUid);
|
|
135
|
+
const response = await this.apiService.post(`drive/photos/volumes/${volumeId}/albums`, {
|
|
136
|
+
Locked: false,
|
|
137
|
+
Link: {
|
|
138
|
+
Name: album.encryptedName,
|
|
139
|
+
Hash: album.hash,
|
|
140
|
+
NodeKey: album.armoredKey,
|
|
141
|
+
NodePassphrase: album.armoredNodePassphrase,
|
|
142
|
+
NodePassphraseSignature: album.armoredNodePassphraseSignature,
|
|
143
|
+
SignatureEmail: album.signatureEmail,
|
|
144
|
+
NodeHashKey: album.armoredHashKey,
|
|
145
|
+
XAttr: null,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
return (0, uids_1.makeNodeUid)(volumeId, response.Album.Link.LinkID);
|
|
149
|
+
}
|
|
150
|
+
async updateAlbum(albumNodeUid, coverPhotoNodeUid, updatedName) {
|
|
151
|
+
const { volumeId, nodeId: linkId } = (0, uids_1.splitNodeUid)(albumNodeUid);
|
|
152
|
+
const coverLinkId = coverPhotoNodeUid ? (0, uids_1.splitNodeUid)(coverPhotoNodeUid).nodeId : undefined;
|
|
153
|
+
await this.apiService.put(`drive/photos/volumes/${volumeId}/albums/${linkId}`, {
|
|
154
|
+
CoverLinkID: coverLinkId,
|
|
155
|
+
Link: updatedName
|
|
156
|
+
? {
|
|
157
|
+
Name: updatedName.encryptedName,
|
|
158
|
+
Hash: updatedName.hash,
|
|
159
|
+
OriginalHash: updatedName.originalHash,
|
|
160
|
+
NameSignatureEmail: updatedName.nameSignatureEmail,
|
|
161
|
+
}
|
|
162
|
+
: null,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async deleteAlbum(albumNodeUid, options = {}) {
|
|
166
|
+
const { volumeId, nodeId: linkId } = (0, uids_1.splitNodeUid)(albumNodeUid);
|
|
167
|
+
try {
|
|
168
|
+
await this.apiService.delete(`drive/photos/volumes/${volumeId}/albums/${linkId}?DeleteAlbumPhotos=${options.force ? 1 : 0}`);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (error instanceof apiService_1.APICodeError && error.code === ALBUM_CONTAINS_PHOTOS_NOT_IN_TIMELINE_ERROR_CODE) {
|
|
172
|
+
throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `Album contains photos not in timeline`);
|
|
173
|
+
}
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async *removePhotosFromAlbum(albumNodeUid, photoNodeUids, signal) {
|
|
178
|
+
const { volumeId, nodeId: albumLinkId } = (0, uids_1.splitNodeUid)(albumNodeUid);
|
|
179
|
+
const batchSize = 50;
|
|
180
|
+
for (const photoNodeUidsBatch of (0, batch_1.batch)(photoNodeUids, batchSize)) {
|
|
181
|
+
const linkIds = photoNodeUidsBatch.map((nodeUid) => (0, uids_1.splitNodeUid)(nodeUid).nodeId);
|
|
182
|
+
let errorMessage;
|
|
183
|
+
try {
|
|
184
|
+
await this.apiService.post(`drive/photos/volumes/${volumeId}/albums/${albumLinkId}/remove-multiple`, {
|
|
185
|
+
LinkIDs: linkIds,
|
|
186
|
+
}, signal);
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
errorMessage = error instanceof Error ? error.message : (0, ttag_1.c)('Error').t `Unknown error`;
|
|
190
|
+
}
|
|
191
|
+
// The API does not return individual results for each photo.
|
|
192
|
+
for (const uid of photoNodeUidsBatch) {
|
|
193
|
+
if (errorMessage) {
|
|
194
|
+
yield { uid, ok: false, error: errorMessage };
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
yield { uid, ok: true };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
111
202
|
}
|
|
112
203
|
exports.PhotosAPIService = PhotosAPIService;
|
|
113
204
|
//# sourceMappingURL=apiService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiService.js","sourceRoot":"","sources":["../../../src/internal/photos/apiService.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"apiService.js","sourceRoot":"","sources":["../../../src/internal/photos/apiService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { DriveAPIService } from '../apiService';
|
|
2
1
|
import { DriveCrypto } from '../../crypto';
|
|
3
2
|
import { ProtonDriveAccount, ProtonDriveCryptoCache, ProtonDriveEntitiesCache, ProtonDriveTelemetry } from '../../interface';
|
|
3
|
+
import { DriveAPIService } from '../apiService';
|
|
4
|
+
import { NodesEventsHandler } from '../nodes/events';
|
|
5
|
+
import { NodesRevisons } from '../nodes/nodesRevisions';
|
|
4
6
|
import { ShareTargetType } from '../shares';
|
|
5
7
|
import { NodesService as UploadNodesService } from '../upload/interface';
|
|
6
8
|
import { Albums } from './albums';
|
|
@@ -9,9 +11,7 @@ import { PhotosNodesAccess, PhotosNodesManagement } from './nodes';
|
|
|
9
11
|
import { PhotoSharesManager } from './shares';
|
|
10
12
|
import { PhotosTimeline } from './timeline';
|
|
11
13
|
import { PhotoFileUploader, PhotoUploadMetadata } from './upload';
|
|
12
|
-
|
|
13
|
-
import { NodesEventsHandler } from '../nodes/events';
|
|
14
|
-
export type { DecryptedPhotoNode } from './interface';
|
|
14
|
+
export type { DecryptedPhotoNode, TimelineItem, AlbumItem, PhotoTag } from './interface';
|
|
15
15
|
export declare const PHOTOS_SHARE_TARGET_TYPES: ShareTargetType[];
|
|
16
16
|
/**
|
|
17
17
|
* Provides facade for the whole photos module.
|
|
@@ -8,6 +8,8 @@ exports.initPhotoUploadModule = initPhotoUploadModule;
|
|
|
8
8
|
const cryptoService_1 = require("../nodes/cryptoService");
|
|
9
9
|
const cryptoReporter_1 = require("../nodes/cryptoReporter");
|
|
10
10
|
const cryptoCache_1 = require("../nodes/cryptoCache");
|
|
11
|
+
const events_1 = require("../nodes/events");
|
|
12
|
+
const nodesRevisions_1 = require("../nodes/nodesRevisions");
|
|
11
13
|
const shares_1 = require("../shares");
|
|
12
14
|
const cache_1 = require("../shares/cache");
|
|
13
15
|
const cryptoCache_2 = require("../shares/cryptoCache");
|
|
@@ -15,13 +17,12 @@ const cryptoService_2 = require("../shares/cryptoService");
|
|
|
15
17
|
const telemetry_1 = require("../upload/telemetry");
|
|
16
18
|
const queue_1 = require("../upload/queue");
|
|
17
19
|
const albums_1 = require("./albums");
|
|
20
|
+
const albumsCrypto_1 = require("./albumsCrypto");
|
|
18
21
|
const apiService_1 = require("./apiService");
|
|
19
22
|
const nodes_1 = require("./nodes");
|
|
20
23
|
const shares_2 = require("./shares");
|
|
21
24
|
const timeline_1 = require("./timeline");
|
|
22
25
|
const upload_1 = require("./upload");
|
|
23
|
-
const nodesRevisions_1 = require("../nodes/nodesRevisions");
|
|
24
|
-
const events_1 = require("../nodes/events");
|
|
25
26
|
// Only photos and albums can be shared in photos volume.
|
|
26
27
|
exports.PHOTOS_SHARE_TARGET_TYPES = [shares_1.ShareTargetType.Photo, shares_1.ShareTargetType.Album];
|
|
27
28
|
/**
|
|
@@ -32,8 +33,9 @@ exports.PHOTOS_SHARE_TARGET_TYPES = [shares_1.ShareTargetType.Photo, shares_1.Sh
|
|
|
32
33
|
*/
|
|
33
34
|
function initPhotosModule(telemetry, apiService, driveCrypto, photoShares, nodesService) {
|
|
34
35
|
const api = new apiService_1.PhotosAPIService(apiService);
|
|
36
|
+
const albumsCryptoService = new albumsCrypto_1.AlbumsCryptoService(driveCrypto);
|
|
35
37
|
const timeline = new timeline_1.PhotosTimeline(telemetry.getLogger('photos-timeline'), api, driveCrypto, photoShares, nodesService);
|
|
36
|
-
const albums = new albums_1.Albums(api, photoShares, nodesService);
|
|
38
|
+
const albums = new albums_1.Albums(api, albumsCryptoService, photoShares, nodesService);
|
|
37
39
|
return {
|
|
38
40
|
timeline,
|
|
39
41
|
albums,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/photos/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/photos/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,3 +40,24 @@ export type EcnryptedPhotoAttributes = Omit<PhotoAttributes, 'albums'> & {
|
|
|
40
40
|
contentHash?: string;
|
|
41
41
|
})[];
|
|
42
42
|
};
|
|
43
|
+
export type TimelineItem = {
|
|
44
|
+
nodeUid: string;
|
|
45
|
+
captureTime: Date;
|
|
46
|
+
tags: PhotoTag[];
|
|
47
|
+
};
|
|
48
|
+
export type AlbumItem = {
|
|
49
|
+
nodeUid: string;
|
|
50
|
+
captureTime: Date;
|
|
51
|
+
};
|
|
52
|
+
export declare enum PhotoTag {
|
|
53
|
+
Favorites = 0,
|
|
54
|
+
Screenshots = 1,
|
|
55
|
+
Videos = 2,
|
|
56
|
+
LivePhotos = 3,
|
|
57
|
+
MotionPhotos = 4,
|
|
58
|
+
Selfies = 5,
|
|
59
|
+
Portraits = 6,
|
|
60
|
+
Bursts = 7,
|
|
61
|
+
Panoramas = 8,
|
|
62
|
+
Raw = 9
|
|
63
|
+
}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PhotoTag = void 0;
|
|
4
|
+
var PhotoTag;
|
|
5
|
+
(function (PhotoTag) {
|
|
6
|
+
PhotoTag[PhotoTag["Favorites"] = 0] = "Favorites";
|
|
7
|
+
PhotoTag[PhotoTag["Screenshots"] = 1] = "Screenshots";
|
|
8
|
+
PhotoTag[PhotoTag["Videos"] = 2] = "Videos";
|
|
9
|
+
PhotoTag[PhotoTag["LivePhotos"] = 3] = "LivePhotos";
|
|
10
|
+
PhotoTag[PhotoTag["MotionPhotos"] = 4] = "MotionPhotos";
|
|
11
|
+
PhotoTag[PhotoTag["Selfies"] = 5] = "Selfies";
|
|
12
|
+
PhotoTag[PhotoTag["Portraits"] = 6] = "Portraits";
|
|
13
|
+
PhotoTag[PhotoTag["Bursts"] = 7] = "Bursts";
|
|
14
|
+
PhotoTag[PhotoTag["Panoramas"] = 8] = "Panoramas";
|
|
15
|
+
PhotoTag[PhotoTag["Raw"] = 9] = "Raw";
|
|
16
|
+
})(PhotoTag || (exports.PhotoTag = PhotoTag = {}));
|
|
3
17
|
//# sourceMappingURL=interface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/photos/interface.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/photos/interface.ts"],"names":[],"mappings":";;;AAwDA,IAAY,QAWX;AAXD,WAAY,QAAQ;IAChB,iDAAa,CAAA;IACb,qDAAe,CAAA;IACf,2CAAU,CAAA;IACV,mDAAc,CAAA;IACd,uDAAgB,CAAA;IAChB,6CAAW,CAAA;IACX,iDAAa,CAAA;IACb,2CAAU,CAAA;IACV,iDAAa,CAAA;IACb,qCAAO,CAAA;AACX,CAAC,EAXW,QAAQ,wBAAR,QAAQ,QAWnB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DriveCrypto } from '../../crypto';
|
|
2
2
|
import { Logger } from '../../interface';
|
|
3
3
|
import { PhotosAPIService } from './apiService';
|
|
4
|
+
import { TimelineItem } from './interface';
|
|
4
5
|
import { PhotosNodesAccess } from './nodes';
|
|
5
6
|
import { PhotoSharesManager } from './shares';
|
|
6
7
|
/**
|
|
@@ -13,10 +14,6 @@ export declare class PhotosTimeline {
|
|
|
13
14
|
private photoShares;
|
|
14
15
|
private nodesService;
|
|
15
16
|
constructor(logger: Logger, apiService: PhotosAPIService, driveCrypto: DriveCrypto, photoShares: PhotoSharesManager, nodesService: PhotosNodesAccess);
|
|
16
|
-
iterateTimeline(signal?: AbortSignal): AsyncGenerator<
|
|
17
|
-
nodeUid: string;
|
|
18
|
-
captureTime: Date;
|
|
19
|
-
tags: number[];
|
|
20
|
-
}>;
|
|
17
|
+
iterateTimeline(signal?: AbortSignal): AsyncGenerator<TimelineItem>;
|
|
21
18
|
findPhotoDuplicates(name: string, generateSha1: () => Promise<string>, signal?: AbortSignal): Promise<string[]>;
|
|
22
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/internal/photos/timeline.ts"],"names":[],"mappings":";;;AAEA,kCAAsC;
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/internal/photos/timeline.ts"],"names":[],"mappings":";;;AAEA,kCAAsC;AAMtC;;GAEG;AACH,MAAa,cAAc;IAEX;IACA;IACA;IACA;IACA;IALZ,YACY,MAAc,EACd,UAA4B,EAC5B,WAAwB,EACxB,WAA+B,EAC/B,YAA+B;QAJ/B,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAkB;QAC5B,gBAAW,GAAX,WAAW,CAAa;QACxB,gBAAW,GAAX,WAAW,CAAoB;QAC/B,iBAAY,GAAZ,YAAY,CAAmB;QAEvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,CAAC,eAAe,CAAC,MAAoB;QACvC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACzD,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,YAAmC,EAAE,MAAoB;QAC7F,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QACrE,MAAM,WAAW,GAAG,IAAA,kBAAW,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAE5F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE7E,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,WAAW,KAAK,WAAW,CAC1F,CAAC;QAEF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,KAAK,CACb,qCAAqC,QAAQ,mBAAmB,WAAW,gBAAgB,QAAQ,EAAE,CACxG,CAAC;QACF,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAtDD,wCAsDC"}
|
|
@@ -38,12 +38,13 @@ class PhotoStreamUploader extends streamUploader_1.StreamUploader {
|
|
|
38
38
|
this.photoMetadata = metadata;
|
|
39
39
|
}
|
|
40
40
|
async commitFile(thumbnails) {
|
|
41
|
-
this.
|
|
41
|
+
const digests = this.digests.digests();
|
|
42
|
+
this.verifyIntegrity(thumbnails, digests);
|
|
42
43
|
const extendedAttributes = {
|
|
43
44
|
modificationTime: this.metadata.modificationTime,
|
|
44
45
|
size: this.metadata.expectedSize,
|
|
45
46
|
blockSizes: this.uploadedBlockSizes,
|
|
46
|
-
digests
|
|
47
|
+
digests,
|
|
47
48
|
};
|
|
48
49
|
await this.photoUploadManager.commitDraftPhoto(this.revisionDraft, this.manifest, extendedAttributes, this.photoMetadata);
|
|
49
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/internal/photos/upload.ts"],"names":[],"mappings":";;;AAGA,oCAA0D;AAC1D,kCAA+C;AAC/C,qDAAwD;AAGxD,2DAA8D;AAC9D,yDAAsD;AAEtD,+CAAkD;AAClD,6DAA0D;AAiB1D,MAAa,iBAAkB,SAAQ,2BAAY;IACvC,eAAe,CAAwB;IACvC,YAAY,CAAqB;IACjC,aAAa,CAAsB;IAE3C,YACI,SAA0B,EAC1B,UAAiC,EACjC,aAAkC,EAClC,OAA2B,EAC3B,eAAuB,EACvB,IAAY,EACZ,QAA6B,EAC7B,QAAoB,EACpB,MAAoB;QAEpB,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxG,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;QAClC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;IAClC,CAAC;IAES,KAAK,CAAC,iBAAiB,CAC7B,aAA4B,EAC5B,aAAgC,EAChC,QAA6C;QAE7C,OAAO,IAAI,mBAAmB,CAC1B,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,YAAY,EACjB,aAAa,EACb,aAAa,EACb,IAAI,CAAC,aAAa,EAClB,QAAQ,EACR,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACd,CAAC;IACN,CAAC;CACJ;AAxCD,8CAwCC;AAED,MAAa,mBAAoB,SAAQ,+BAAc;IAC3C,kBAAkB,CAAqB;IACvC,aAAa,CAAsB;IAE3C,YACI,SAA0B,EAC1B,UAAiC,EACjC,aAAkC,EAClC,aAAiC,EACjC,aAA4B,EAC5B,aAAgC,EAChC,QAA6B,EAC7B,QAA6C,EAC7C,UAA4B,EAC5B,MAAoB;QAEpB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACT,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACP,CAAC;QAED,KAAK,CACD,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,CAClB,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,aAAa,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAuB;QACpC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/internal/photos/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,7 +63,9 @@ export declare class StreamUploader {
|
|
|
63
63
|
private limitUploadCapacity;
|
|
64
64
|
private waitForBufferCapacity;
|
|
65
65
|
private waitForUploadCapacityAndBufferedBlocks;
|
|
66
|
-
protected verifyIntegrity(thumbnails: Thumbnail[]
|
|
66
|
+
protected verifyIntegrity(thumbnails: Thumbnail[], digests: {
|
|
67
|
+
sha1: string;
|
|
68
|
+
}): void;
|
|
67
69
|
/**
|
|
68
70
|
* Check if the encryption is fully finished.
|
|
69
71
|
* This means that all blocks and thumbnails have been encrypted and
|
|
@@ -174,12 +174,13 @@ class StreamUploader {
|
|
|
174
174
|
await Promise.all(this.ongoingUploads.values().map(({ uploadPromise }) => uploadPromise));
|
|
175
175
|
}
|
|
176
176
|
async commitFile(thumbnails) {
|
|
177
|
-
this.
|
|
177
|
+
const digests = this.digests.digests();
|
|
178
|
+
this.verifyIntegrity(thumbnails, digests);
|
|
178
179
|
const extendedAttributes = {
|
|
179
180
|
modificationTime: this.metadata.modificationTime,
|
|
180
181
|
size: this.metadata.expectedSize,
|
|
181
182
|
blockSizes: this.uploadedBlockSizes,
|
|
182
|
-
digests
|
|
183
|
+
digests,
|
|
183
184
|
};
|
|
184
185
|
await this.uploadManager.commitDraft(this.revisionDraft, this.manifest, extendedAttributes, this.metadata.additionalMetadata);
|
|
185
186
|
}
|
|
@@ -466,7 +467,7 @@ class StreamUploader {
|
|
|
466
467
|
throw error;
|
|
467
468
|
}
|
|
468
469
|
}
|
|
469
|
-
verifyIntegrity(thumbnails) {
|
|
470
|
+
verifyIntegrity(thumbnails, digests) {
|
|
470
471
|
const expectedBlockCount = Math.ceil(this.metadata.expectedSize / exports.FILE_CHUNK_SIZE) + (thumbnails ? thumbnails?.length : 0);
|
|
471
472
|
if (this.uploadedBlockCount !== expectedBlockCount) {
|
|
472
473
|
throw new errors_1.IntegrityError((0, ttag_1.c)('Error').t `Some file parts failed to upload`, {
|
|
@@ -480,6 +481,12 @@ class StreamUploader {
|
|
|
480
481
|
expectedFileSize: this.metadata.expectedSize,
|
|
481
482
|
});
|
|
482
483
|
}
|
|
484
|
+
if (this.metadata.expectedSha1 && digests.sha1 !== this.metadata.expectedSha1) {
|
|
485
|
+
throw new errors_1.IntegrityError((0, ttag_1.c)('Error').t `File hash does not match expected hash`, {
|
|
486
|
+
uploadedSha1: digests.sha1,
|
|
487
|
+
expectedSha1: this.metadata.expectedSha1,
|
|
488
|
+
});
|
|
489
|
+
}
|
|
483
490
|
}
|
|
484
491
|
/**
|
|
485
492
|
* Check if the encryption is fully finished.
|