@protontech/drive-sdk 0.7.0 → 0.7.2
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/index.d.ts +1 -0
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +14 -10
- package/dist/interface/nodes.js +5 -8
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/photos.d.ts +62 -0
- package/dist/interface/photos.js +3 -0
- package/dist/interface/photos.js.map +1 -0
- package/dist/internal/apiService/driveTypes.d.ts +1294 -517
- package/dist/internal/errors.d.ts +1 -0
- package/dist/internal/errors.js +4 -0
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/nodes/apiService.d.ts +60 -9
- package/dist/internal/nodes/apiService.js +125 -81
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +2 -0
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +16 -8
- package/dist/internal/nodes/cache.js +19 -5
- 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.d.ts +1 -1
- package/dist/internal/nodes/cryptoService.js +4 -4
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/cryptoService.test.js +3 -3
- package/dist/internal/nodes/cryptoService.test.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +2 -2
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/index.test.js +1 -0
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +1 -0
- package/dist/internal/nodes/nodesAccess.d.ts +29 -20
- package/dist/internal/nodes/nodesAccess.js +41 -29
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +32 -12
- package/dist/internal/nodes/nodesManagement.js +30 -13
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +39 -4
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/nodes/nodesRevisions.d.ts +2 -2
- package/dist/internal/nodes/nodesRevisions.js.map +1 -1
- package/dist/internal/photos/albums.d.ts +2 -2
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/index.d.ts +19 -3
- package/dist/internal/photos/index.js +38 -8
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +18 -9
- package/dist/internal/photos/nodes.d.ts +57 -0
- package/dist/internal/photos/nodes.js +166 -0
- package/dist/internal/photos/nodes.js.map +1 -0
- package/dist/internal/photos/nodes.test.d.ts +1 -0
- package/dist/internal/photos/nodes.test.js +233 -0
- package/dist/internal/photos/nodes.test.js.map +1 -0
- package/dist/internal/photos/timeline.d.ts +2 -2
- package/dist/internal/photos/timeline.js.map +1 -1
- package/dist/internal/photos/timeline.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +10 -1
- package/dist/protonDriveClient.js +18 -3
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +12 -8
- package/dist/protonDrivePhotosClient.js +15 -9
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +7 -1
- package/dist/protonDrivePublicLinkClient.js +9 -0
- package/dist/protonDrivePublicLinkClient.js.map +1 -1
- package/dist/transformers.d.ts +7 -2
- package/dist/transformers.js +37 -0
- package/dist/transformers.js.map +1 -1
- package/package.json +1 -1
- package/src/interface/index.ts +1 -0
- package/src/interface/nodes.ts +14 -11
- package/src/interface/photos.ts +67 -0
- package/src/internal/apiService/driveTypes.ts +1294 -517
- package/src/internal/errors.ts +4 -0
- package/src/internal/nodes/apiService.test.ts +2 -0
- package/src/internal/nodes/apiService.ts +187 -114
- package/src/internal/nodes/cache.test.ts +1 -0
- package/src/internal/nodes/cache.ts +32 -13
- package/src/internal/nodes/cryptoService.test.ts +13 -3
- package/src/internal/nodes/cryptoService.ts +4 -4
- package/src/internal/nodes/events.ts +2 -2
- package/src/internal/nodes/index.test.ts +1 -0
- package/src/internal/nodes/interface.ts +1 -0
- package/src/internal/nodes/nodesAccess.ts +82 -54
- package/src/internal/nodes/nodesManagement.test.ts +48 -4
- package/src/internal/nodes/nodesManagement.ts +76 -26
- package/src/internal/nodes/nodesRevisions.ts +3 -3
- package/src/internal/photos/albums.ts +2 -2
- package/src/internal/photos/index.ts +45 -3
- package/src/internal/photos/interface.ts +21 -9
- package/src/internal/photos/nodes.test.ts +258 -0
- package/src/internal/photos/nodes.ts +234 -0
- package/src/internal/photos/timeline.test.ts +2 -2
- package/src/internal/photos/timeline.ts +2 -2
- package/src/protonDriveClient.ts +20 -3
- package/src/protonDrivePhotosClient.ts +31 -23
- package/src/protonDrivePublicLinkClient.ts +11 -0
- package/src/transformers.ts +49 -2
package/src/protonDriveClient.ts
CHANGED
|
@@ -424,6 +424,12 @@ export class ProtonDriveClient {
|
|
|
424
424
|
* The operation is performed node by node and the results are yielded
|
|
425
425
|
* as they are available. Order of the results is not guaranteed.
|
|
426
426
|
*
|
|
427
|
+
* The `nodeUids` can be a list of node entities or their UIDs, or a list
|
|
428
|
+
* of objects with `uid` and `name` properties where the name is the new
|
|
429
|
+
* name of the copied node. By default, the name is the same as the
|
|
430
|
+
* original node. Use `getAvailableName` to get the available name for the
|
|
431
|
+
* new node in the target parent node in case of a name conflict.
|
|
432
|
+
*
|
|
427
433
|
* If one of the nodes fails to copy, the operation continues with the
|
|
428
434
|
* rest of the nodes. Use `NodeResult` to check the status of the action.
|
|
429
435
|
*
|
|
@@ -433,12 +439,23 @@ export class ProtonDriveClient {
|
|
|
433
439
|
* @returns An async generator of the results of the copy operation
|
|
434
440
|
*/
|
|
435
441
|
async *copyNodes(
|
|
436
|
-
|
|
442
|
+
nodesOrNodeUidsOrWithNames: (NodeOrUid | { uid: string; name: string })[],
|
|
437
443
|
newParentNodeUid: NodeOrUid,
|
|
438
444
|
signal?: AbortSignal,
|
|
439
445
|
): AsyncGenerator<NodeResultWithNewUid> {
|
|
440
|
-
this.logger.info(`Copying ${
|
|
441
|
-
|
|
446
|
+
this.logger.info(`Copying ${nodesOrNodeUidsOrWithNames.length} nodes to ${getUid(newParentNodeUid)}`);
|
|
447
|
+
|
|
448
|
+
const nodeUidsOrWithNames = nodesOrNodeUidsOrWithNames.map((param) => {
|
|
449
|
+
if (typeof param === 'string') {
|
|
450
|
+
return param;
|
|
451
|
+
}
|
|
452
|
+
if ('uid' in param && 'name' in param && typeof param.uid === 'string' && typeof param.name === 'string') {
|
|
453
|
+
return { uid: param.uid, name: param.name };
|
|
454
|
+
}
|
|
455
|
+
return getUid(param);
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
yield* this.nodes.management.copyNodes(nodeUidsOrWithNames, getUid(newParentNodeUid), signal);
|
|
442
459
|
}
|
|
443
460
|
|
|
444
461
|
/**
|
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
Logger,
|
|
3
3
|
ProtonDriveClientContructorParameters,
|
|
4
4
|
NodeOrUid,
|
|
5
|
-
|
|
5
|
+
MaybeMissingPhotoNode,
|
|
6
6
|
UploadMetadata,
|
|
7
7
|
FileDownloader,
|
|
8
8
|
FileUploader,
|
|
9
9
|
SDKEvent,
|
|
10
|
-
|
|
10
|
+
MaybePhotoNode,
|
|
11
11
|
ThumbnailType,
|
|
12
12
|
ThumbnailResult,
|
|
13
13
|
ShareNodeSettings,
|
|
@@ -22,22 +22,22 @@ import { getConfig } from './config';
|
|
|
22
22
|
import { DriveCrypto } from './crypto';
|
|
23
23
|
import { Telemetry } from './telemetry';
|
|
24
24
|
import {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
convertInternalMissingPhotoNodeIterator,
|
|
26
|
+
convertInternalPhotoNode,
|
|
27
|
+
convertInternalPhotoNodeIterator,
|
|
28
|
+
convertInternalPhotoNodePromise,
|
|
29
29
|
getUid,
|
|
30
30
|
getUids,
|
|
31
31
|
} from './transformers';
|
|
32
32
|
import { DriveAPIService } from './internal/apiService';
|
|
33
33
|
import { initDownloadModule } from './internal/download';
|
|
34
34
|
import { DriveEventsService, DriveListener, EventSubscription } from './internal/events';
|
|
35
|
-
import { initNodesModule } from './internal/nodes';
|
|
36
35
|
import {
|
|
37
36
|
PHOTOS_SHARE_TARGET_TYPES,
|
|
38
37
|
initPhotosModule,
|
|
39
38
|
initPhotoSharesModule,
|
|
40
39
|
initPhotoUploadModule,
|
|
40
|
+
initPhotosNodesModule,
|
|
41
41
|
} from './internal/photos';
|
|
42
42
|
import { SDKEvents } from './internal/sdkEvents';
|
|
43
43
|
import { initSharesModule } from './internal/shares';
|
|
@@ -56,7 +56,7 @@ export class ProtonDrivePhotosClient {
|
|
|
56
56
|
private sdkEvents: SDKEvents;
|
|
57
57
|
private events: DriveEventsService;
|
|
58
58
|
private photoShares: ReturnType<typeof initPhotoSharesModule>;
|
|
59
|
-
private nodes: ReturnType<typeof
|
|
59
|
+
private nodes: ReturnType<typeof initPhotosNodesModule>;
|
|
60
60
|
private sharing: ReturnType<typeof initSharingModule>;
|
|
61
61
|
private download: ReturnType<typeof initDownloadModule>;
|
|
62
62
|
private upload: ReturnType<typeof initPhotoUploadModule>;
|
|
@@ -107,7 +107,7 @@ export class ProtonDrivePhotosClient {
|
|
|
107
107
|
cryptoModule,
|
|
108
108
|
coreShares,
|
|
109
109
|
);
|
|
110
|
-
this.nodes =
|
|
110
|
+
this.nodes = initPhotosNodesModule(
|
|
111
111
|
telemetry,
|
|
112
112
|
apiService,
|
|
113
113
|
entitiesCache,
|
|
@@ -197,6 +197,14 @@ export class ProtonDrivePhotosClient {
|
|
|
197
197
|
return this.events.subscribeToCoreEvents(callback);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
+
/**
|
|
201
|
+
* @returns The root folder to Photos section of the user.
|
|
202
|
+
*/
|
|
203
|
+
async getMyPhotosRootFolder(): Promise<MaybePhotoNode> {
|
|
204
|
+
this.logger.info('Getting my photos root folder');
|
|
205
|
+
return convertInternalPhotoNodePromise(this.nodes.access.getVolumeRootFolder());
|
|
206
|
+
}
|
|
207
|
+
|
|
200
208
|
/**
|
|
201
209
|
* Iterates all the photos for the timeline view.
|
|
202
210
|
*
|
|
@@ -224,9 +232,9 @@ export class ProtonDrivePhotosClient {
|
|
|
224
232
|
*
|
|
225
233
|
* See `ProtonDriveClient.iterateTrashedNodes` for more information.
|
|
226
234
|
*/
|
|
227
|
-
async *iterateTrashedNodes(signal?: AbortSignal): AsyncGenerator<
|
|
235
|
+
async *iterateTrashedNodes(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
|
|
228
236
|
this.logger.info('Iterating trashed nodes');
|
|
229
|
-
yield*
|
|
237
|
+
yield * convertInternalPhotoNodeIterator(this.nodes.access.iterateTrashedNodes(signal));
|
|
230
238
|
}
|
|
231
239
|
|
|
232
240
|
/**
|
|
@@ -234,10 +242,10 @@ export class ProtonDrivePhotosClient {
|
|
|
234
242
|
*
|
|
235
243
|
* See `ProtonDriveClient.iterateNodes` for more information.
|
|
236
244
|
*/
|
|
237
|
-
async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<
|
|
245
|
+
async *iterateNodes(nodeUids: NodeOrUid[], signal?: AbortSignal): AsyncGenerator<MaybeMissingPhotoNode> {
|
|
238
246
|
this.logger.info(`Iterating ${nodeUids.length} nodes`);
|
|
239
247
|
// TODO: expose photo type
|
|
240
|
-
yield*
|
|
248
|
+
yield * convertInternalMissingPhotoNodeIterator(this.nodes.access.iterateNodes(getUids(nodeUids), signal));
|
|
241
249
|
}
|
|
242
250
|
|
|
243
251
|
/**
|
|
@@ -245,9 +253,9 @@ export class ProtonDrivePhotosClient {
|
|
|
245
253
|
*
|
|
246
254
|
* See `ProtonDriveClient.getNode` for more information.
|
|
247
255
|
*/
|
|
248
|
-
async getNode(nodeUid: NodeOrUid): Promise<
|
|
256
|
+
async getNode(nodeUid: NodeOrUid): Promise<MaybePhotoNode> {
|
|
249
257
|
this.logger.info(`Getting node ${getUid(nodeUid)}`);
|
|
250
|
-
return
|
|
258
|
+
return convertInternalPhotoNodePromise(this.nodes.access.getNode(getUid(nodeUid)));
|
|
251
259
|
}
|
|
252
260
|
|
|
253
261
|
/**
|
|
@@ -255,9 +263,9 @@ export class ProtonDrivePhotosClient {
|
|
|
255
263
|
*
|
|
256
264
|
* See `ProtonDriveClient.renameNode` for more information.
|
|
257
265
|
*/
|
|
258
|
-
async renameNode(nodeUid: NodeOrUid, newName: string): Promise<
|
|
266
|
+
async renameNode(nodeUid: NodeOrUid, newName: string): Promise<MaybePhotoNode> {
|
|
259
267
|
this.logger.info(`Renaming node ${getUid(nodeUid)}`);
|
|
260
|
-
return
|
|
268
|
+
return convertInternalPhotoNodePromise(this.nodes.management.renameNode(getUid(nodeUid), newName));
|
|
261
269
|
}
|
|
262
270
|
|
|
263
271
|
/**
|
|
@@ -305,9 +313,9 @@ export class ProtonDrivePhotosClient {
|
|
|
305
313
|
*
|
|
306
314
|
* See `ProtonDriveClient.iterateSharedNodes` for more information.
|
|
307
315
|
*/
|
|
308
|
-
async *iterateSharedNodes(signal?: AbortSignal): AsyncGenerator<
|
|
316
|
+
async *iterateSharedNodes(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
|
|
309
317
|
this.logger.info('Iterating shared nodes by me');
|
|
310
|
-
yield*
|
|
318
|
+
yield * convertInternalPhotoNodeIterator(this.sharing.access.iterateSharedNodes(signal));
|
|
311
319
|
}
|
|
312
320
|
|
|
313
321
|
/**
|
|
@@ -315,11 +323,11 @@ export class ProtonDrivePhotosClient {
|
|
|
315
323
|
*
|
|
316
324
|
* See `ProtonDriveClient.iterateSharedNodesWithMe` for more information.
|
|
317
325
|
*/
|
|
318
|
-
async *iterateSharedNodesWithMe(signal?: AbortSignal): AsyncGenerator<
|
|
326
|
+
async *iterateSharedNodesWithMe(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
|
|
319
327
|
this.logger.info('Iterating shared nodes with me');
|
|
320
328
|
|
|
321
329
|
for await (const node of this.sharing.access.iterateSharedNodesWithMe(signal)) {
|
|
322
|
-
yield
|
|
330
|
+
yield convertInternalPhotoNode(node);
|
|
323
331
|
}
|
|
324
332
|
}
|
|
325
333
|
|
|
@@ -482,9 +490,9 @@ export class ProtonDrivePhotosClient {
|
|
|
482
490
|
*
|
|
483
491
|
* The output is not sorted and the order of the nodes is not guaranteed.
|
|
484
492
|
*/
|
|
485
|
-
async *iterateAlbums(signal?: AbortSignal): AsyncGenerator<
|
|
493
|
+
async *iterateAlbums(signal?: AbortSignal): AsyncGenerator<MaybePhotoNode> {
|
|
486
494
|
this.logger.info('Iterating albums');
|
|
487
495
|
// TODO: expose album type
|
|
488
|
-
yield*
|
|
496
|
+
yield * convertInternalPhotoNodeIterator(this.photos.albums.iterateAlbums(signal));
|
|
489
497
|
}
|
|
490
498
|
}
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
UploadMetadata,
|
|
19
19
|
FileUploader,
|
|
20
20
|
NodeResult,
|
|
21
|
+
SDKEvent,
|
|
21
22
|
} from './interface';
|
|
22
23
|
import { Telemetry } from './telemetry';
|
|
23
24
|
import {
|
|
@@ -164,6 +165,16 @@ export class ProtonDrivePublicLinkClient {
|
|
|
164
165
|
};
|
|
165
166
|
}
|
|
166
167
|
|
|
168
|
+
/**
|
|
169
|
+
* Subscribes to the general SDK events.
|
|
170
|
+
*
|
|
171
|
+
* See `ProtonDriveClient.onMessage` for more information.
|
|
172
|
+
*/
|
|
173
|
+
onMessage(eventName: SDKEvent, callback: () => void): () => void {
|
|
174
|
+
this.logger.debug(`Subscribing to event ${eventName}`);
|
|
175
|
+
return this.sdkEvents.addListener(eventName, callback);
|
|
176
|
+
}
|
|
177
|
+
|
|
167
178
|
/**
|
|
168
179
|
* @returns The root folder to the public link.
|
|
169
180
|
*/
|
package/src/transformers.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MaybeNode as PublicMaybeNode,
|
|
3
3
|
MaybeMissingNode as PublicMaybeMissingNode,
|
|
4
|
-
NodeEntity as PublicNodeEntity,
|
|
5
4
|
DegradedNode as PublicDegradedNode,
|
|
6
5
|
Revision as PublicRevision,
|
|
7
6
|
Result,
|
|
8
7
|
resultOk,
|
|
9
8
|
resultError,
|
|
10
9
|
MissingNode,
|
|
10
|
+
MaybePhotoNode as PublicMaybePhotoNode,
|
|
11
|
+
MaybeMissingPhotoNode as PublicMaybeMissingPhotoNode,
|
|
12
|
+
PhotoNode as PublicPhotoNode,
|
|
13
|
+
DegradedPhotoNode as PublicDegradedPhotoNode,
|
|
11
14
|
} from './interface';
|
|
12
15
|
import { DecryptedNode as InternalNode, DecryptedRevision as InternalRevision } from './internal/nodes';
|
|
16
|
+
import { DecryptedPhotoNode as InternalPartialPhotoNode } from './internal/photos';
|
|
13
17
|
|
|
14
18
|
type InternalPartialNode = Pick<
|
|
15
19
|
InternalNode,
|
|
@@ -25,6 +29,7 @@ type InternalPartialNode = Pick<
|
|
|
25
29
|
| 'isShared'
|
|
26
30
|
| 'isSharedPublicly'
|
|
27
31
|
| 'creationTime'
|
|
32
|
+
| 'modificationTime'
|
|
28
33
|
| 'trashTime'
|
|
29
34
|
| 'activeRevision'
|
|
30
35
|
| 'folder'
|
|
@@ -93,6 +98,7 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
|
|
|
93
98
|
isShared: node.isShared,
|
|
94
99
|
isSharedPublicly: node.isSharedPublicly,
|
|
95
100
|
creationTime: node.creationTime,
|
|
101
|
+
modificationTime: node.modificationTime,
|
|
96
102
|
trashTime: node.trashTime,
|
|
97
103
|
totalStorageSize: node.totalStorageSize,
|
|
98
104
|
folder: node.folder,
|
|
@@ -118,7 +124,48 @@ export function convertInternalNode(node: InternalPartialNode): PublicMaybeNode
|
|
|
118
124
|
...baseNodeMetadata,
|
|
119
125
|
name: name.value,
|
|
120
126
|
activeRevision: activeRevision?.ok ? convertInternalRevision(activeRevision.value) : undefined,
|
|
121
|
-
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export async function* convertInternalPhotoNodeIterator(
|
|
131
|
+
photoNodeIterator: AsyncGenerator<InternalPartialPhotoNode>,
|
|
132
|
+
): AsyncGenerator<PublicMaybePhotoNode> {
|
|
133
|
+
for await (const photoNode of photoNodeIterator) {
|
|
134
|
+
yield convertInternalPhotoNode(photoNode);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export async function* convertInternalMissingPhotoNodeIterator(
|
|
139
|
+
photoNodeIterator: AsyncGenerator<InternalPartialPhotoNode | MissingNode>,
|
|
140
|
+
): AsyncGenerator<PublicMaybeMissingPhotoNode> {
|
|
141
|
+
for await (const photoNode of photoNodeIterator) {
|
|
142
|
+
if ('missingUid' in photoNode) {
|
|
143
|
+
yield resultError(photoNode);
|
|
144
|
+
} else {
|
|
145
|
+
yield convertInternalPhotoNode(photoNode);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export async function convertInternalPhotoNodePromise(
|
|
151
|
+
photoNodePromise: Promise<InternalPartialPhotoNode>,
|
|
152
|
+
): Promise<PublicMaybePhotoNode> {
|
|
153
|
+
const photoNode = await photoNodePromise;
|
|
154
|
+
return convertInternalPhotoNode(photoNode);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function convertInternalPhotoNode(photoNode: InternalPartialPhotoNode): PublicMaybePhotoNode {
|
|
158
|
+
const node = convertInternalNode(photoNode);
|
|
159
|
+
if (node.ok) {
|
|
160
|
+
return resultOk({
|
|
161
|
+
...node.value,
|
|
162
|
+
photo: photoNode.photo,
|
|
163
|
+
} as PublicPhotoNode);
|
|
164
|
+
}
|
|
165
|
+
return resultError({
|
|
166
|
+
...node.error,
|
|
167
|
+
photo: photoNode.photo,
|
|
168
|
+
} as PublicDegradedPhotoNode);
|
|
122
169
|
}
|
|
123
170
|
|
|
124
171
|
export async function* convertInternalRevisionIterator(
|