@protontech/drive-sdk 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/dist/diagnostic/{sdkDiagnosticFull.d.ts → diagnostic.d.ts} +5 -4
  2. package/dist/diagnostic/{sdkDiagnosticFull.js → diagnostic.js} +13 -10
  3. package/dist/diagnostic/diagnostic.js.map +1 -0
  4. package/dist/diagnostic/index.js +2 -4
  5. package/dist/diagnostic/index.js.map +1 -1
  6. package/dist/diagnostic/interface.d.ts +22 -1
  7. package/dist/diagnostic/sdkDiagnostic.d.ts +3 -2
  8. package/dist/diagnostic/sdkDiagnostic.js +79 -7
  9. package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
  10. package/dist/interface/index.d.ts +2 -2
  11. package/dist/interface/index.js.map +1 -1
  12. package/dist/interface/nodes.d.ts +9 -0
  13. package/dist/interface/telemetry.d.ts +4 -1
  14. package/dist/interface/telemetry.js.map +1 -1
  15. package/dist/interface/upload.d.ts +1 -12
  16. package/dist/internal/apiService/driveTypes.d.ts +2571 -2356
  17. package/dist/internal/download/controller.d.ts +2 -0
  18. package/dist/internal/download/controller.js +15 -1
  19. package/dist/internal/download/controller.js.map +1 -1
  20. package/dist/internal/download/fileDownloader.js +6 -1
  21. package/dist/internal/download/fileDownloader.js.map +1 -1
  22. package/dist/internal/nodes/apiService.d.ts +11 -1
  23. package/dist/internal/nodes/apiService.js +47 -13
  24. package/dist/internal/nodes/apiService.js.map +1 -1
  25. package/dist/internal/nodes/apiService.test.js +61 -3
  26. package/dist/internal/nodes/apiService.test.js.map +1 -1
  27. package/dist/internal/nodes/cryptoService.d.ts +4 -0
  28. package/dist/internal/nodes/cryptoService.js +6 -0
  29. package/dist/internal/nodes/cryptoService.js.map +1 -1
  30. package/dist/internal/nodes/debouncer.d.ts +3 -2
  31. package/dist/internal/nodes/debouncer.js +16 -4
  32. package/dist/internal/nodes/debouncer.js.map +1 -1
  33. package/dist/internal/nodes/debouncer.test.js +20 -12
  34. package/dist/internal/nodes/debouncer.test.js.map +1 -1
  35. package/dist/internal/nodes/extendedAttributes.js +2 -2
  36. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  37. package/dist/internal/nodes/index.d.ts +1 -1
  38. package/dist/internal/nodes/index.js +3 -3
  39. package/dist/internal/nodes/index.js.map +1 -1
  40. package/dist/internal/nodes/index.test.js +1 -1
  41. package/dist/internal/nodes/index.test.js.map +1 -1
  42. package/dist/internal/nodes/nodeName.d.ts +8 -0
  43. package/dist/internal/nodes/nodeName.js +30 -0
  44. package/dist/internal/nodes/nodeName.js.map +1 -0
  45. package/dist/internal/nodes/nodeName.test.d.ts +1 -0
  46. package/dist/internal/nodes/nodeName.test.js +50 -0
  47. package/dist/internal/nodes/nodeName.test.js.map +1 -0
  48. package/dist/internal/nodes/nodesAccess.d.ts +5 -4
  49. package/dist/internal/nodes/nodesAccess.js +6 -5
  50. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  51. package/dist/internal/nodes/nodesAccess.test.js +17 -5
  52. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  53. package/dist/internal/nodes/nodesManagement.d.ts +3 -2
  54. package/dist/internal/nodes/nodesManagement.js +35 -4
  55. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  56. package/dist/internal/nodes/nodesManagement.test.js +64 -1
  57. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  58. package/dist/internal/photos/apiService.js +9 -20
  59. package/dist/internal/photos/apiService.js.map +1 -1
  60. package/dist/internal/photos/index.d.ts +2 -0
  61. package/dist/internal/photos/index.js +4 -0
  62. package/dist/internal/photos/index.js.map +1 -1
  63. package/dist/internal/photos/upload.js +7 -1
  64. package/dist/internal/photos/upload.js.map +1 -1
  65. package/dist/internal/shares/index.d.ts +1 -0
  66. package/dist/internal/shares/index.js +3 -0
  67. package/dist/internal/shares/index.js.map +1 -1
  68. package/dist/internal/shares/interface.d.ts +8 -0
  69. package/dist/internal/shares/interface.js +10 -1
  70. package/dist/internal/shares/interface.js.map +1 -1
  71. package/dist/internal/sharing/apiService.d.ts +4 -2
  72. package/dist/internal/sharing/apiService.js +18 -14
  73. package/dist/internal/sharing/apiService.js.map +1 -1
  74. package/dist/internal/sharing/index.d.ts +2 -1
  75. package/dist/internal/sharing/index.js +6 -2
  76. package/dist/internal/sharing/index.js.map +1 -1
  77. package/dist/internal/sharing/sharingManagement.d.ts +4 -1
  78. package/dist/internal/sharing/sharingManagement.js +7 -4
  79. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  80. package/dist/internal/sharingPublic/apiService.d.ts +8 -10
  81. package/dist/internal/sharingPublic/apiService.js +9 -63
  82. package/dist/internal/sharingPublic/apiService.js.map +1 -1
  83. package/dist/internal/sharingPublic/index.d.ts +3 -3
  84. package/dist/internal/sharingPublic/index.js +7 -12
  85. package/dist/internal/sharingPublic/index.js.map +1 -1
  86. package/dist/internal/sharingPublic/nodes.d.ts +13 -8
  87. package/dist/internal/sharingPublic/nodes.js +20 -2
  88. package/dist/internal/sharingPublic/nodes.js.map +1 -1
  89. package/dist/internal/sharingPublic/session/apiService.d.ts +7 -5
  90. package/dist/internal/sharingPublic/session/apiService.js +25 -4
  91. package/dist/internal/sharingPublic/session/apiService.js.map +1 -1
  92. package/dist/internal/sharingPublic/session/interface.d.ts +17 -0
  93. package/dist/internal/sharingPublic/session/manager.d.ts +12 -4
  94. package/dist/internal/sharingPublic/session/manager.js +14 -4
  95. package/dist/internal/sharingPublic/session/manager.js.map +1 -1
  96. package/dist/internal/sharingPublic/session/session.d.ts +5 -2
  97. package/dist/internal/sharingPublic/session/session.js +7 -3
  98. package/dist/internal/sharingPublic/session/session.js.map +1 -1
  99. package/dist/internal/sharingPublic/shares.d.ts +3 -10
  100. package/dist/internal/sharingPublic/shares.js +10 -33
  101. package/dist/internal/sharingPublic/shares.js.map +1 -1
  102. package/dist/internal/upload/apiService.d.ts +0 -9
  103. package/dist/internal/upload/apiService.js +0 -16
  104. package/dist/internal/upload/apiService.js.map +1 -1
  105. package/dist/internal/upload/controller.d.ts +3 -1
  106. package/dist/internal/upload/controller.js +16 -2
  107. package/dist/internal/upload/controller.js.map +1 -1
  108. package/dist/internal/upload/cryptoService.d.ts +0 -4
  109. package/dist/internal/upload/cryptoService.js +0 -6
  110. package/dist/internal/upload/cryptoService.js.map +1 -1
  111. package/dist/internal/upload/fileUploader.d.ts +0 -1
  112. package/dist/internal/upload/fileUploader.js +2 -6
  113. package/dist/internal/upload/fileUploader.js.map +1 -1
  114. package/dist/internal/upload/manager.d.ts +0 -1
  115. package/dist/internal/upload/manager.js +0 -51
  116. package/dist/internal/upload/manager.js.map +1 -1
  117. package/dist/internal/upload/manager.test.js +0 -61
  118. package/dist/internal/upload/manager.test.js.map +1 -1
  119. package/dist/internal/upload/streamUploader.d.ts +4 -3
  120. package/dist/internal/upload/streamUploader.js +61 -18
  121. package/dist/internal/upload/streamUploader.js.map +1 -1
  122. package/dist/internal/upload/streamUploader.test.js +38 -12
  123. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  124. package/dist/protonDriveClient.d.ts +24 -4
  125. package/dist/protonDriveClient.js +26 -7
  126. package/dist/protonDriveClient.js.map +1 -1
  127. package/dist/protonDrivePhotosClient.d.ts +100 -4
  128. package/dist/protonDrivePhotosClient.js +160 -9
  129. package/dist/protonDrivePhotosClient.js.map +1 -1
  130. package/dist/protonDrivePublicLinkClient.d.ts +4 -3
  131. package/dist/protonDrivePublicLinkClient.js +2 -2
  132. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  133. package/dist/tests/telemetry.d.ts +4 -2
  134. package/dist/tests/telemetry.js +3 -1
  135. package/dist/tests/telemetry.js.map +1 -1
  136. package/dist/transformers.d.ts +3 -2
  137. package/dist/transformers.js +6 -0
  138. package/dist/transformers.js.map +1 -1
  139. package/package.json +1 -1
  140. package/src/diagnostic/{sdkDiagnosticFull.ts → diagnostic.ts} +10 -6
  141. package/src/diagnostic/index.ts +3 -5
  142. package/src/diagnostic/interface.ts +39 -0
  143. package/src/diagnostic/sdkDiagnostic.ts +110 -9
  144. package/src/interface/index.ts +2 -1
  145. package/src/interface/nodes.ts +3 -0
  146. package/src/interface/telemetry.ts +5 -0
  147. package/src/interface/upload.ts +1 -13
  148. package/src/internal/apiService/driveTypes.ts +2698 -2529
  149. package/src/internal/download/controller.ts +13 -1
  150. package/src/internal/download/fileDownloader.ts +8 -1
  151. package/src/internal/nodes/apiService.test.ts +65 -1
  152. package/src/internal/nodes/apiService.ts +80 -17
  153. package/src/internal/nodes/cryptoService.ts +9 -0
  154. package/src/internal/nodes/debouncer.test.ts +25 -13
  155. package/src/internal/nodes/debouncer.ts +20 -4
  156. package/src/internal/nodes/extendedAttributes.ts +2 -2
  157. package/src/internal/nodes/index.test.ts +1 -0
  158. package/src/internal/nodes/index.ts +3 -9
  159. package/src/internal/nodes/nodeName.test.ts +57 -0
  160. package/src/internal/nodes/nodeName.ts +26 -0
  161. package/src/internal/nodes/nodesAccess.test.ts +17 -5
  162. package/src/internal/nodes/nodesAccess.ts +15 -5
  163. package/src/internal/nodes/nodesManagement.test.ts +68 -1
  164. package/src/internal/nodes/nodesManagement.ts +54 -6
  165. package/src/internal/photos/apiService.ts +12 -29
  166. package/src/internal/photos/index.ts +4 -0
  167. package/src/internal/photos/upload.ts +19 -1
  168. package/src/internal/shares/index.ts +1 -0
  169. package/src/internal/shares/interface.ts +9 -0
  170. package/src/internal/sharing/apiService.ts +17 -14
  171. package/src/internal/sharing/index.ts +7 -1
  172. package/src/internal/sharing/sharingManagement.ts +7 -4
  173. package/src/internal/sharingPublic/apiService.ts +23 -77
  174. package/src/internal/sharingPublic/index.ts +13 -11
  175. package/src/internal/sharingPublic/nodes.ts +33 -11
  176. package/src/internal/sharingPublic/session/apiService.ts +31 -9
  177. package/src/internal/sharingPublic/session/interface.ts +20 -0
  178. package/src/internal/sharingPublic/session/manager.ts +31 -8
  179. package/src/internal/sharingPublic/session/session.ts +10 -5
  180. package/src/internal/sharingPublic/shares.ts +7 -43
  181. package/src/internal/upload/apiService.ts +0 -39
  182. package/src/internal/upload/controller.ts +16 -4
  183. package/src/internal/upload/cryptoService.ts +0 -9
  184. package/src/internal/upload/fileUploader.ts +2 -7
  185. package/src/internal/upload/manager.test.ts +0 -65
  186. package/src/internal/upload/manager.ts +0 -64
  187. package/src/internal/upload/streamUploader.test.ts +46 -14
  188. package/src/internal/upload/streamUploader.ts +74 -21
  189. package/src/protonDriveClient.ts +46 -9
  190. package/src/protonDrivePhotosClient.ts +193 -8
  191. package/src/protonDrivePublicLinkClient.ts +7 -4
  192. package/src/tests/telemetry.ts +6 -3
  193. package/src/transformers.ts +8 -0
  194. package/dist/diagnostic/sdkDiagnosticFull.js.map +0 -1
  195. package/dist/internal/sharingPublic/cryptoCache.d.ts +0 -15
  196. package/dist/internal/sharingPublic/cryptoCache.js +0 -44
  197. package/dist/internal/sharingPublic/cryptoCache.js.map +0 -1
  198. package/dist/internal/sharingPublic/cryptoService.d.ts +0 -8
  199. package/dist/internal/sharingPublic/cryptoService.js +0 -19
  200. package/dist/internal/sharingPublic/cryptoService.js.map +0 -1
  201. package/dist/internal/sharingPublic/interface.d.ts +0 -5
  202. package/dist/internal/sharingPublic/interface.js +0 -3
  203. package/dist/internal/sharingPublic/interface.js.map +0 -1
  204. package/src/internal/sharingPublic/cryptoCache.ts +0 -45
  205. package/src/internal/sharingPublic/cryptoService.ts +0 -22
  206. package/src/internal/sharingPublic/interface.ts +0 -5
@@ -1,6 +1,6 @@
1
1
  import { Author, FileDownloader, MaybeNode, NodeType, Revision, ThumbnailType } from '../interface';
2
2
  import { ProtonDriveClient } from '../protonDriveClient';
3
- import { Diagnostic, DiagnosticOptions, DiagnosticResult, NodeDetails } from './interface';
3
+ import { DiagnosticOptions, DiagnosticResult, NodeDetails, ExcpectedTreeNode } from './interface';
4
4
  import { IntegrityVerificationStream } from './integrityVerificationStream';
5
5
 
6
6
  /**
@@ -10,7 +10,7 @@ import { IntegrityVerificationStream } from './integrityVerificationStream';
10
10
  * It produces only events that can be read by direct SDK invocation.
11
11
  * To get the full diagnostic, use {@link FullSDKDiagnostic}.
12
12
  */
13
- export class SDKDiagnostic implements Diagnostic {
13
+ export class SDKDiagnostic {
14
14
  constructor(private protonDriveClient: ProtonDriveClient) {
15
15
  this.protonDriveClient = protonDriveClient;
16
16
  }
@@ -58,7 +58,7 @@ export class SDKDiagnostic implements Diagnostic {
58
58
  yield* this.verifyAuthor(activeRevision.contentAuthor, 'content', node);
59
59
  }
60
60
 
61
- yield* this.verifyFileExtendedAttributes(node);
61
+ yield* this.verifyFileExtendedAttributes(node, options);
62
62
 
63
63
  if (options?.verifyContent) {
64
64
  yield* this.verifyContent(node);
@@ -80,12 +80,17 @@ export class SDKDiagnostic implements Diagnostic {
80
80
  }
81
81
  }
82
82
 
83
- private async *verifyFileExtendedAttributes(node: MaybeNode): AsyncGenerator<DiagnosticResult> {
83
+ private async *verifyFileExtendedAttributes(
84
+ node: MaybeNode,
85
+ options?: DiagnosticOptions,
86
+ ): AsyncGenerator<DiagnosticResult> {
84
87
  const activeRevision = getActiveRevision(node);
85
88
 
86
89
  const expectedAttributes = getNodeType(node) === NodeType.File;
87
90
 
88
91
  const claimedSha1 = activeRevision?.claimedDigests?.sha1;
92
+ const claimedSizeInBytes = activeRevision?.claimedSize;
93
+
89
94
  if (claimedSha1 && !/^[0-9a-f]{40}$/i.test(claimedSha1)) {
90
95
  yield {
91
96
  type: 'extended_attributes_error',
@@ -102,6 +107,24 @@ export class SDKDiagnostic implements Diagnostic {
102
107
  ...getNodeDetails(node),
103
108
  };
104
109
  }
110
+
111
+ if (options?.expectedStructure) {
112
+ const expectedSha1 = options.expectedStructure.expectedSha1;
113
+ const expectedSizeInBytes = options.expectedStructure.expectedSizeInBytes;
114
+
115
+ const wrongSha1 = expectedSha1 !== undefined && claimedSha1 !== expectedSha1;
116
+ const wrongSizeInBytes = expectedSizeInBytes !== undefined && claimedSizeInBytes !== expectedSizeInBytes;
117
+
118
+ if (wrongSha1 || wrongSizeInBytes) {
119
+ yield {
120
+ type: 'expected_structure_integrity_error',
121
+ claimedSha1,
122
+ claimedSizeInBytes,
123
+ expectedNode: getExpectedTreeNodeDetails(options.expectedStructure),
124
+ ...getNodeDetails(node),
125
+ };
126
+ }
127
+ }
105
128
  }
106
129
 
107
130
  private async *verifyContent(node: MaybeNode): AsyncGenerator<DiagnosticResult> {
@@ -195,19 +218,73 @@ export class SDKDiagnostic implements Diagnostic {
195
218
  }
196
219
  }
197
220
 
198
- private async *verifyNodeChildren(node: MaybeNode, options?: DiagnosticOptions): AsyncGenerator<DiagnosticResult> {
199
- const nodeUid = node.ok ? node.value.uid : node.error.uid;
221
+ private async *verifyNodeChildren(
222
+ parentNode: MaybeNode,
223
+ options?: DiagnosticOptions,
224
+ ): AsyncGenerator<DiagnosticResult> {
225
+ const parentNodeUid = parentNode.ok ? parentNode.value.uid : parentNode.error.uid;
226
+ const children: MaybeNode[] = [];
227
+
200
228
  try {
201
- for await (const child of this.protonDriveClient.iterateFolderChildren(node)) {
202
- yield* this.verifyNodeTree(child, options);
229
+ for await (const child of this.protonDriveClient.iterateFolderChildren(parentNode)) {
230
+ if (options?.expectedStructure) {
231
+ children.push(child);
232
+ }
233
+
234
+ yield *
235
+ this.verifyNodeTree(child, {
236
+ ...options,
237
+ expectedStructure: options?.expectedStructure
238
+ ? getTreeNodeChildByNodeName(options.expectedStructure, getNodeName(child))
239
+ : undefined,
240
+ });
203
241
  }
204
242
  } catch (error: unknown) {
205
243
  yield {
206
244
  type: 'sdk_error',
207
- call: `iterateFolderChildren(${nodeUid})`,
245
+ call: `iterateFolderChildren(${parentNodeUid})`,
208
246
  error,
209
247
  };
210
248
  }
249
+
250
+ if (options?.expectedStructure) {
251
+ yield* this.verifyExpectedNodeChildren(parentNodeUid, children, options);
252
+ }
253
+ }
254
+
255
+ private async *verifyExpectedNodeChildren(
256
+ parentNodeUid: string,
257
+ children: MaybeNode[],
258
+ options: DiagnosticOptions,
259
+ ): AsyncGenerator<DiagnosticResult> {
260
+ if (!options.expectedStructure) {
261
+ return;
262
+ }
263
+
264
+ const expectedNodes = options.expectedStructure.children ?? [];
265
+ const actualNodeNames = children.map((child) => getNodeName(child));
266
+
267
+ for (const expectedNode of expectedNodes) {
268
+ if (!actualNodeNames.includes(expectedNode.name)) {
269
+ yield {
270
+ type: 'expected_structure_missing_node',
271
+ expectedNode: getExpectedTreeNodeDetails(expectedNode),
272
+ parentNodeUid,
273
+ };
274
+ }
275
+ }
276
+
277
+ for (const child of children) {
278
+ const childName = getNodeName(child);
279
+ const isExpected = expectedNodes.some((expectedNode) => expectedNode.name === childName);
280
+
281
+ if (!isExpected) {
282
+ yield {
283
+ type: 'expected_structure_unexpected_node',
284
+ ...getNodeDetails(child),
285
+ };
286
+ }
287
+ }
211
288
  }
212
289
  }
213
290
 
@@ -275,3 +352,27 @@ function getActiveRevision(node: MaybeNode): Revision | undefined {
275
352
  }
276
353
  return undefined;
277
354
  }
355
+
356
+ function getNodeName(node: MaybeNode): string {
357
+ if (node.ok) {
358
+ return node.value.name;
359
+ }
360
+ if (node.error.name.ok) {
361
+ return node.error.name.value;
362
+ }
363
+ return 'N/A';
364
+ }
365
+
366
+ function getExpectedTreeNodeDetails(expectedNode: ExcpectedTreeNode): ExcpectedTreeNode {
367
+ return {
368
+ ...expectedNode,
369
+ children: undefined,
370
+ };
371
+ }
372
+
373
+ function getTreeNodeChildByNodeName(
374
+ expectedSubtree: ExcpectedTreeNode,
375
+ nodeName: string,
376
+ ): ExcpectedTreeNode | undefined {
377
+ return expectedSubtree.children?.find((expectedNode) => expectedNode.name === nodeName);
378
+ }
@@ -41,6 +41,7 @@ export type {
41
41
  NodeOrUid,
42
42
  RevisionOrUid,
43
43
  NodeResult,
44
+ NodeResultWithNewUid,
44
45
  Membership,
45
46
  } from './nodes';
46
47
  export { NodeType, MemberRole, RevisionState } from './nodes';
@@ -81,7 +82,7 @@ export type {
81
82
  MetricEvent,
82
83
  } from './telemetry';
83
84
  export { MetricVolumeType } from './telemetry';
84
- export type { FileUploader, FileRevisionUploader, UploadController, UploadMetadata } from './upload';
85
+ export type { FileUploader, UploadController, UploadMetadata } from './upload';
85
86
  export type { Thumbnail, ThumbnailResult } from './thumbnail';
86
87
  export { ThumbnailType } from './thumbnail';
87
88
 
@@ -224,3 +224,6 @@ export type NodeOrUid = MaybeNode | NodeEntity | DegradedNode | string;
224
224
  export type RevisionOrUid = Revision | string;
225
225
 
226
226
  export type NodeResult = { uid: string; ok: true } | { uid: string; ok: false; error: string };
227
+ export type NodeResultWithNewUid =
228
+ | { uid: string; newUid: string; ok: true }
229
+ | { uid: string; ok: false; error: string };
@@ -12,6 +12,7 @@ export interface Logger {
12
12
 
13
13
  export type MetricEvent =
14
14
  | MetricAPIRetrySucceededEvent
15
+ | MetricDebounceLongWaitEvent
15
16
  | MetricUploadEvent
16
17
  | MetricDownloadEvent
17
18
  | MetricDecryptionErrorEvent
@@ -25,6 +26,10 @@ export interface MetricAPIRetrySucceededEvent {
25
26
  failedAttempts: number;
26
27
  }
27
28
 
29
+ export interface MetricDebounceLongWaitEvent {
30
+ eventName: 'debounceLongWait';
31
+ }
32
+
28
33
  export interface MetricUploadEvent {
29
34
  eventName: 'upload';
30
35
  volumeType?: MetricVolumeType;
@@ -32,7 +32,7 @@ export type UploadMetadata = {
32
32
  overrideExistingDraftByOtherClient?: boolean;
33
33
  };
34
34
 
35
- export interface FileRevisionUploader {
35
+ export interface FileUploader {
36
36
  /**
37
37
  * Uploads a file from a stream.
38
38
  *
@@ -64,18 +64,6 @@ export interface FileRevisionUploader {
64
64
  ): Promise<UploadController>;
65
65
  }
66
66
 
67
- export interface FileUploader extends FileRevisionUploader {
68
- /**
69
- * Returns the available name for the file.
70
- *
71
- * The function will return a name that includes the original name with the
72
- * available index. The name is guaranteed to be unique in the parent folder.
73
- *
74
- * Example new name: `file (2).txt`.
75
- */
76
- getAvailableName(): Promise<string>;
77
- }
78
-
79
67
  export interface UploadController {
80
68
  pause(): void;
81
69
  resume(): void;