@protontech/drive-sdk 0.0.12 → 0.1.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 (274) hide show
  1. package/dist/cache/index.d.ts +1 -0
  2. package/dist/cache/index.js +3 -1
  3. package/dist/cache/index.js.map +1 -1
  4. package/dist/cache/memoryCache.d.ts +1 -1
  5. package/dist/cache/nullCache.d.ts +14 -0
  6. package/dist/cache/nullCache.js +37 -0
  7. package/dist/cache/nullCache.js.map +1 -0
  8. package/dist/config.d.ts +16 -1
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/crypto/openPGPCrypto.js +2 -0
  12. package/dist/crypto/openPGPCrypto.js.map +1 -1
  13. package/dist/diagnostic/eventsGenerator.d.ts +14 -0
  14. package/dist/diagnostic/eventsGenerator.js +49 -0
  15. package/dist/diagnostic/eventsGenerator.js.map +1 -0
  16. package/dist/diagnostic/httpClient.d.ts +16 -0
  17. package/dist/diagnostic/httpClient.js +81 -0
  18. package/dist/diagnostic/httpClient.js.map +1 -0
  19. package/dist/diagnostic/index.d.ts +10 -0
  20. package/dist/diagnostic/index.js +35 -0
  21. package/dist/diagnostic/index.js.map +1 -0
  22. package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
  23. package/dist/diagnostic/integrityVerificationStream.js +56 -0
  24. package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
  25. package/dist/diagnostic/interface.d.ts +102 -0
  26. package/dist/diagnostic/interface.js +3 -0
  27. package/dist/diagnostic/interface.js.map +1 -0
  28. package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
  29. package/dist/diagnostic/sdkDiagnostic.js +216 -0
  30. package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
  31. package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
  32. package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
  33. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
  34. package/dist/diagnostic/telemetry.d.ts +25 -0
  35. package/dist/diagnostic/telemetry.js +70 -0
  36. package/dist/diagnostic/telemetry.js.map +1 -0
  37. package/dist/diagnostic/zipGenerators.d.ts +9 -0
  38. package/dist/diagnostic/zipGenerators.js +64 -0
  39. package/dist/diagnostic/zipGenerators.js.map +1 -0
  40. package/dist/diagnostic/zipGenerators.test.js +144 -0
  41. package/dist/diagnostic/zipGenerators.test.js.map +1 -0
  42. package/dist/errors.d.ts +8 -3
  43. package/dist/errors.js +11 -4
  44. package/dist/errors.js.map +1 -1
  45. package/dist/interface/config.d.ts +26 -0
  46. package/dist/interface/config.js +3 -0
  47. package/dist/interface/config.js.map +1 -0
  48. package/dist/interface/download.d.ts +2 -2
  49. package/dist/interface/events.d.ts +60 -20
  50. package/dist/interface/events.js +11 -1
  51. package/dist/interface/events.js.map +1 -1
  52. package/dist/interface/httpClient.d.ts +0 -14
  53. package/dist/interface/index.d.ts +9 -5
  54. package/dist/interface/index.js +2 -1
  55. package/dist/interface/index.js.map +1 -1
  56. package/dist/interface/nodes.d.ts +21 -1
  57. package/dist/interface/nodes.js +11 -0
  58. package/dist/interface/nodes.js.map +1 -1
  59. package/dist/interface/sharing.d.ts +1 -0
  60. package/dist/interface/upload.d.ts +57 -3
  61. package/dist/internal/apiService/driveTypes.d.ts +1341 -465
  62. package/dist/internal/apiService/errors.js +2 -2
  63. package/dist/internal/apiService/errors.js.map +1 -1
  64. package/dist/internal/apiService/transformers.js +2 -0
  65. package/dist/internal/apiService/transformers.js.map +1 -1
  66. package/dist/internal/asyncIteratorMap.d.ts +15 -0
  67. package/dist/internal/asyncIteratorMap.js +59 -0
  68. package/dist/internal/asyncIteratorMap.js.map +1 -0
  69. package/dist/internal/asyncIteratorMap.test.js +120 -0
  70. package/dist/internal/asyncIteratorMap.test.js.map +1 -0
  71. package/dist/internal/download/apiService.js +32 -31
  72. package/dist/internal/download/apiService.js.map +1 -1
  73. package/dist/internal/download/fileDownloader.d.ts +2 -2
  74. package/dist/internal/download/fileDownloader.js.map +1 -1
  75. package/dist/internal/events/apiService.d.ts +4 -6
  76. package/dist/internal/events/apiService.js +15 -22
  77. package/dist/internal/events/apiService.js.map +1 -1
  78. package/dist/internal/events/coreEventManager.d.ts +7 -10
  79. package/dist/internal/events/coreEventManager.js +19 -36
  80. package/dist/internal/events/coreEventManager.js.map +1 -1
  81. package/dist/internal/events/coreEventManager.test.d.ts +1 -0
  82. package/dist/internal/events/coreEventManager.test.js +87 -0
  83. package/dist/internal/events/coreEventManager.test.js.map +1 -0
  84. package/dist/internal/events/eventManager.d.ts +11 -36
  85. package/dist/internal/events/eventManager.js +59 -105
  86. package/dist/internal/events/eventManager.js.map +1 -1
  87. package/dist/internal/events/eventManager.test.js +167 -82
  88. package/dist/internal/events/eventManager.test.js.map +1 -1
  89. package/dist/internal/events/index.d.ts +13 -33
  90. package/dist/internal/events/index.js +56 -72
  91. package/dist/internal/events/index.js.map +1 -1
  92. package/dist/internal/events/interface.d.ts +59 -14
  93. package/dist/internal/events/interface.js +13 -3
  94. package/dist/internal/events/interface.js.map +1 -1
  95. package/dist/internal/events/volumeEventManager.d.ts +7 -17
  96. package/dist/internal/events/volumeEventManager.js +58 -45
  97. package/dist/internal/events/volumeEventManager.js.map +1 -1
  98. package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
  99. package/dist/internal/events/volumeEventManager.test.js +203 -0
  100. package/dist/internal/events/volumeEventManager.test.js.map +1 -0
  101. package/dist/internal/nodes/apiService.d.ts +2 -2
  102. package/dist/internal/nodes/apiService.js +16 -6
  103. package/dist/internal/nodes/apiService.js.map +1 -1
  104. package/dist/internal/nodes/apiService.test.js +30 -8
  105. package/dist/internal/nodes/apiService.test.js.map +1 -1
  106. package/dist/internal/nodes/cache.d.ts +10 -1
  107. package/dist/internal/nodes/cache.js +18 -0
  108. package/dist/internal/nodes/cache.js.map +1 -1
  109. package/dist/internal/nodes/cache.test.js +1 -0
  110. package/dist/internal/nodes/cache.test.js.map +1 -1
  111. package/dist/internal/nodes/cryptoService.d.ts +1 -1
  112. package/dist/internal/nodes/cryptoService.js.map +1 -1
  113. package/dist/internal/nodes/cryptoService.test.js +34 -0
  114. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  115. package/dist/internal/nodes/events.d.ts +7 -83
  116. package/dist/internal/nodes/events.js +43 -217
  117. package/dist/internal/nodes/events.js.map +1 -1
  118. package/dist/internal/nodes/events.test.js +27 -277
  119. package/dist/internal/nodes/events.test.js.map +1 -1
  120. package/dist/internal/nodes/index.d.ts +3 -4
  121. package/dist/internal/nodes/index.js +5 -5
  122. package/dist/internal/nodes/index.js.map +1 -1
  123. package/dist/internal/nodes/interface.d.ts +3 -1
  124. package/dist/internal/nodes/nodesAccess.d.ts +15 -0
  125. package/dist/internal/nodes/nodesAccess.js +65 -7
  126. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  127. package/dist/internal/nodes/nodesAccess.test.js +132 -93
  128. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  129. package/dist/internal/nodes/nodesManagement.d.ts +1 -3
  130. package/dist/internal/nodes/nodesManagement.js +12 -26
  131. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  132. package/dist/internal/nodes/nodesManagement.test.js +35 -14
  133. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  134. package/dist/internal/shares/cache.d.ts +2 -0
  135. package/dist/internal/shares/cache.js +2 -0
  136. package/dist/internal/shares/cache.js.map +1 -1
  137. package/dist/internal/shares/manager.d.ts +1 -0
  138. package/dist/internal/shares/manager.js +3 -0
  139. package/dist/internal/shares/manager.js.map +1 -1
  140. package/dist/internal/sharing/apiService.js +20 -2
  141. package/dist/internal/sharing/apiService.js.map +1 -1
  142. package/dist/internal/sharing/cryptoService.js +1 -0
  143. package/dist/internal/sharing/cryptoService.js.map +1 -1
  144. package/dist/internal/sharing/events.d.ts +23 -55
  145. package/dist/internal/sharing/events.js +46 -138
  146. package/dist/internal/sharing/events.js.map +1 -1
  147. package/dist/internal/sharing/events.test.js +77 -180
  148. package/dist/internal/sharing/events.test.js.map +1 -1
  149. package/dist/internal/sharing/index.d.ts +4 -5
  150. package/dist/internal/sharing/index.js +5 -5
  151. package/dist/internal/sharing/index.js.map +1 -1
  152. package/dist/internal/sharing/interface.d.ts +3 -0
  153. package/dist/internal/sharing/sharingManagement.d.ts +2 -3
  154. package/dist/internal/sharing/sharingManagement.js +7 -9
  155. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  156. package/dist/internal/sharing/sharingManagement.test.js +9 -39
  157. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  158. package/dist/internal/upload/apiService.d.ts +2 -3
  159. package/dist/internal/upload/apiService.js +7 -4
  160. package/dist/internal/upload/apiService.js.map +1 -1
  161. package/dist/internal/upload/fileUploader.d.ts +49 -53
  162. package/dist/internal/upload/fileUploader.js +91 -395
  163. package/dist/internal/upload/fileUploader.js.map +1 -1
  164. package/dist/internal/upload/fileUploader.test.js +38 -292
  165. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  166. package/dist/internal/upload/index.d.ts +5 -5
  167. package/dist/internal/upload/index.js +23 -44
  168. package/dist/internal/upload/index.js.map +1 -1
  169. package/dist/internal/upload/interface.d.ts +2 -0
  170. package/dist/internal/upload/manager.d.ts +6 -6
  171. package/dist/internal/upload/manager.js +32 -66
  172. package/dist/internal/upload/manager.js.map +1 -1
  173. package/dist/internal/upload/manager.test.js +100 -117
  174. package/dist/internal/upload/manager.test.js.map +1 -1
  175. package/dist/internal/upload/streamUploader.d.ts +62 -0
  176. package/dist/internal/upload/streamUploader.js +440 -0
  177. package/dist/internal/upload/streamUploader.js.map +1 -0
  178. package/dist/internal/upload/streamUploader.test.d.ts +1 -0
  179. package/dist/internal/upload/streamUploader.test.js +358 -0
  180. package/dist/internal/upload/streamUploader.test.js.map +1 -0
  181. package/dist/protonDriveClient.d.ts +22 -165
  182. package/dist/protonDriveClient.js +27 -191
  183. package/dist/protonDriveClient.js.map +1 -1
  184. package/dist/protonDrivePhotosClient.js +3 -2
  185. package/dist/protonDrivePhotosClient.js.map +1 -1
  186. package/package.json +4 -4
  187. package/src/cache/index.ts +1 -0
  188. package/src/cache/memoryCache.ts +1 -1
  189. package/src/cache/nullCache.ts +38 -0
  190. package/src/config.ts +17 -2
  191. package/src/crypto/openPGPCrypto.ts +2 -0
  192. package/src/diagnostic/eventsGenerator.ts +48 -0
  193. package/src/diagnostic/httpClient.ts +80 -0
  194. package/src/diagnostic/index.ts +38 -0
  195. package/src/diagnostic/integrityVerificationStream.ts +56 -0
  196. package/src/diagnostic/interface.ts +158 -0
  197. package/src/diagnostic/sdkDiagnostic.ts +238 -0
  198. package/src/diagnostic/sdkDiagnosticFull.ts +40 -0
  199. package/src/diagnostic/telemetry.ts +71 -0
  200. package/src/diagnostic/zipGenerators.test.ts +177 -0
  201. package/src/diagnostic/zipGenerators.ts +70 -0
  202. package/src/errors.ts +13 -4
  203. package/src/interface/config.ts +28 -0
  204. package/src/interface/download.ts +2 -2
  205. package/src/interface/events.ts +66 -21
  206. package/src/interface/httpClient.ts +0 -16
  207. package/src/interface/index.ts +9 -5
  208. package/src/interface/nodes.ts +32 -12
  209. package/src/interface/sharing.ts +1 -0
  210. package/src/interface/upload.ts +59 -3
  211. package/src/internal/apiService/driveTypes.ts +1341 -465
  212. package/src/internal/apiService/errors.ts +3 -2
  213. package/src/internal/apiService/transformers.ts +2 -0
  214. package/src/internal/asyncIteratorMap.test.ts +150 -0
  215. package/src/internal/asyncIteratorMap.ts +64 -0
  216. package/src/internal/download/apiService.ts +11 -8
  217. package/src/internal/download/fileDownloader.ts +2 -2
  218. package/src/internal/events/apiService.ts +25 -28
  219. package/src/internal/events/coreEventManager.test.ts +101 -0
  220. package/src/internal/events/coreEventManager.ts +20 -45
  221. package/src/internal/events/eventManager.test.ts +201 -88
  222. package/src/internal/events/eventManager.ts +69 -115
  223. package/src/internal/events/index.ts +54 -84
  224. package/src/internal/events/interface.ts +70 -15
  225. package/src/internal/events/volumeEventManager.test.ts +243 -0
  226. package/src/internal/events/volumeEventManager.ts +55 -53
  227. package/src/internal/nodes/apiService.test.ts +36 -7
  228. package/src/internal/nodes/apiService.ts +19 -7
  229. package/src/internal/nodes/cache.test.ts +1 -0
  230. package/src/internal/nodes/cache.ts +21 -2
  231. package/src/internal/nodes/cryptoService.test.ts +38 -0
  232. package/src/internal/nodes/cryptoService.ts +1 -1
  233. package/src/internal/nodes/events.test.ts +29 -335
  234. package/src/internal/nodes/events.ts +45 -253
  235. package/src/internal/nodes/index.ts +6 -8
  236. package/src/internal/nodes/interface.ts +6 -3
  237. package/src/internal/nodes/nodesAccess.test.ts +133 -91
  238. package/src/internal/nodes/nodesAccess.ts +70 -8
  239. package/src/internal/nodes/nodesManagement.test.ts +39 -15
  240. package/src/internal/nodes/nodesManagement.ts +12 -30
  241. package/src/internal/shares/cache.ts +4 -2
  242. package/src/internal/shares/manager.ts +9 -5
  243. package/src/internal/sharing/apiService.ts +25 -2
  244. package/src/internal/sharing/cache.ts +1 -1
  245. package/src/internal/sharing/cryptoService.ts +1 -0
  246. package/src/internal/sharing/events.test.ts +89 -195
  247. package/src/internal/sharing/events.ts +42 -156
  248. package/src/internal/sharing/index.ts +6 -9
  249. package/src/internal/sharing/interface.ts +6 -2
  250. package/src/internal/sharing/sharingManagement.test.ts +10 -40
  251. package/src/internal/sharing/sharingManagement.ts +7 -11
  252. package/src/internal/upload/apiService.ts +5 -6
  253. package/src/internal/upload/fileUploader.test.ts +46 -376
  254. package/src/internal/upload/fileUploader.ts +114 -494
  255. package/src/internal/upload/index.ts +30 -54
  256. package/src/internal/upload/interface.ts +2 -0
  257. package/src/internal/upload/manager.test.ts +107 -124
  258. package/src/internal/upload/manager.ts +48 -80
  259. package/src/internal/upload/streamUploader.test.ts +468 -0
  260. package/src/internal/upload/streamUploader.ts +550 -0
  261. package/src/protonDriveClient.ts +80 -248
  262. package/src/protonDrivePhotosClient.ts +4 -3
  263. package/dist/internal/events/cache.d.ts +0 -28
  264. package/dist/internal/events/cache.js +0 -67
  265. package/dist/internal/events/cache.js.map +0 -1
  266. package/dist/internal/events/cache.test.js +0 -43
  267. package/dist/internal/events/cache.test.js.map +0 -1
  268. package/dist/internal/nodes/index.test.js +0 -112
  269. package/dist/internal/nodes/index.test.js.map +0 -1
  270. package/src/internal/events/cache.test.ts +0 -47
  271. package/src/internal/events/cache.ts +0 -80
  272. package/src/internal/nodes/index.test.ts +0 -135
  273. /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
  274. /package/dist/internal/{nodes/index.test.d.ts → asyncIteratorMap.test.d.ts} +0 -0
@@ -1,12 +1,13 @@
1
1
  import { c } from "ttag";
2
2
 
3
- import { Logger, MemberRole, NodeType, ProtonDriveTelemetry, resultOk, Revision, RevisionState, UploadMetadata } from "../../interface";
3
+ import { Logger, ProtonDriveTelemetry, UploadMetadata } from "../../interface";
4
4
  import { ValidationError, NodeAlreadyExistsValidationError } from "../../errors";
5
5
  import { ErrorCode } from "../apiService";
6
- import { DecryptedNode, generateFileExtendedAttributes } from "../nodes";
6
+ import { generateFileExtendedAttributes } from "../nodes";
7
7
  import { UploadAPIService } from "./apiService";
8
8
  import { UploadCryptoService } from "./cryptoService";
9
- import { NodeRevisionDraft, NodesService, NodesEvents, NodeCrypto } from "./interface";
9
+ import { NodeRevisionDraft, NodesService, NodeCrypto } from "./interface";
10
+ import { makeNodeUid, splitNodeUid } from "../uids";
10
11
 
11
12
  /**
12
13
  * UploadManager is responsible for creating and deleting draft nodes
@@ -21,12 +22,13 @@ export class UploadManager {
21
22
  private apiService: UploadAPIService,
22
23
  private cryptoService: UploadCryptoService,
23
24
  private nodesService: NodesService,
24
- private nodesEvents: NodesEvents,
25
+ private clientUid: string | undefined,
25
26
  ) {
26
27
  this.logger = telemetry.getLogger('upload');
27
28
  this.apiService = apiService;
28
29
  this.cryptoService = cryptoService;
29
30
  this.nodesService = nodesService;
31
+ this.clientUid = clientUid;
30
32
  }
31
33
 
32
34
  async createDraftNode(parentFolderUid: string, name: string, metadata: UploadMetadata): Promise<NodeRevisionDraft> {
@@ -88,30 +90,40 @@ export class UploadManager {
88
90
  base64ContentKeyPacket: generatedNodeCrypto.contentKey.encrypted.base64ContentKeyPacket,
89
91
  armoredContentKeyPacketSignature: generatedNodeCrypto.contentKey.encrypted.armoredContentKeyPacketSignature,
90
92
  signatureEmail: generatedNodeCrypto.signatureAddress.email,
91
- // FIXME: client UID
92
93
  });
93
94
  return result;
94
95
  } catch (error: unknown) {
95
96
  if (error instanceof ValidationError) {
96
97
  if (error.code === ErrorCode.ALREADY_EXISTS) {
97
98
  this.logger.info(`Node with given name already exists`);
98
- const availableName = await this.findAvailableName(
99
- parentFolderUid,
100
- parentHashKey,
101
- name,
102
- generatedNodeCrypto.encryptedNode.hash,
99
+
100
+ const typedDetails = error.details as {
101
+ ConflictLinkID: string,
102
+ ConflictRevisionID?: string,
103
+ ConflictDraftRevisionID?: string,
104
+ ConflictDraftClientUID?: string,
105
+ } | undefined;
106
+
107
+ // If the client doesn't specify the client UID, it should
108
+ // never be considered own draft.
109
+ const isOwnDraftConflict = (
110
+ typedDetails?.ConflictDraftRevisionID &&
111
+ this.clientUid &&
112
+ typedDetails?.ConflictDraftClientUID === this.clientUid
103
113
  );
104
114
 
105
115
  // If there is existing draft created by this client,
106
116
  // automatically delete it and try to create a new one
107
117
  // with the same name again.
108
- if (availableName.existingDraftNodeUid) {
118
+ if (typedDetails?.ConflictDraftRevisionID && (isOwnDraftConflict || metadata.overrideExistingDraftByOtherClient)) {
119
+ const existingDraftNodeUid = makeNodeUid(splitNodeUid(parentFolderUid).volumeId, typedDetails.ConflictLinkID);
120
+
109
121
  let deleteFailed = false;
110
122
  try {
111
- this.logger.warn(`Deleting existing draft node ${availableName.existingDraftNodeUid}`);
112
- await this.apiService.deleteDraft(availableName.existingDraftNodeUid);
123
+ this.logger.warn(`Deleting existing draft node ${existingDraftNodeUid} by ${typedDetails.ConflictDraftClientUID}`);
124
+ await this.apiService.deleteDraft(existingDraftNodeUid);
113
125
  } catch (deleteDraftError: unknown) {
114
- // Do not throw, let return the next available name to the client.
126
+ // Do not throw, let throw the conflict error.
115
127
  deleteFailed = true;
116
128
  this.logger.error('Failed to delete existing draft node', deleteDraftError);
117
129
  }
@@ -120,12 +132,19 @@ export class UploadManager {
120
132
  }
121
133
  }
122
134
 
135
+ if (isOwnDraftConflict) {
136
+ this.logger.warn(`Existing draft conflict by another client ${typedDetails.ConflictDraftClientUID}`);
137
+ }
138
+
139
+ const existingNodeUid = typedDetails ? makeNodeUid(splitNodeUid(parentFolderUid).volumeId, typedDetails.ConflictLinkID) : undefined;
140
+
123
141
  // If there is existing node, return special error
124
142
  // that includes the available name the client can use.
125
143
  throw new NodeAlreadyExistsValidationError(
126
144
  error.message,
127
145
  error.code,
128
- availableName.availableName,
146
+ existingNodeUid,
147
+ !!typedDetails?.ConflictDraftRevisionID,
129
148
  );
130
149
  }
131
150
  }
@@ -133,10 +152,12 @@ export class UploadManager {
133
152
  }
134
153
  }
135
154
 
136
- private async findAvailableName(parentFolderUid: string, parentHashKey: Uint8Array, name: string, nameHash: string): Promise<{
137
- availableName: string,
138
- existingDraftNodeUid?: string,
139
- }> {
155
+ async findAvailableName(parentFolderUid: string, name: string): Promise<string> {
156
+ const { hashKey: parentHashKey } = await this.nodesService.getNodeKeys(parentFolderUid);
157
+ if (!parentHashKey) {
158
+ throw new ValidationError(c('Error').t`Creating files in non-folders is not allowed`);
159
+ }
160
+
140
161
  const [namePart, extension] = splitExtension(name);
141
162
 
142
163
  const batchSize = 10;
@@ -149,14 +170,9 @@ export class UploadManager {
149
170
 
150
171
  const hashesToCheck = await this.cryptoService.generateNameHashes(parentHashKey, namesToCheck);
151
172
 
152
- const { pendingHashes, availalbleHashes } = await this.apiService.checkAvailableHashes(
173
+ const { availalbleHashes } = await this.apiService.checkAvailableHashes(
153
174
  parentFolderUid,
154
- [
155
- ...hashesToCheck.map(({ hash }) => hash),
156
- // Adding the current name hash to get the existing draft
157
- // node UID if it exists.
158
- ...startIndex ? [nameHash] : [],
159
- ],
175
+ hashesToCheck.map(({ hash }) => hash),
160
176
  );
161
177
 
162
178
  if (!availalbleHashes.length) {
@@ -169,12 +185,7 @@ export class UploadManager {
169
185
  throw Error('Backend returned unexpected hash');
170
186
  }
171
187
 
172
- // FIXME: use client UID to ensure its own pending draft
173
- const ownPendingHash = pendingHashes.find(({ hash }) => hash === nameHash);
174
- return {
175
- availableName: availableHash.name,
176
- existingDraftNodeUid: ownPendingHash?.nodeUid,
177
- }
188
+ return availableHash.name;
178
189
  }
179
190
  }
180
191
 
@@ -229,7 +240,7 @@ export class UploadManager {
229
240
  async commitDraft(
230
241
  nodeRevisionDraft: NodeRevisionDraft,
231
242
  manifest: Uint8Array,
232
- metadata: UploadMetadata,
243
+ _metadata: UploadMetadata,
233
244
  extendedAttributes: {
234
245
  modificationTime?: Date,
235
246
  size?: number,
@@ -238,56 +249,13 @@ export class UploadManager {
238
249
  sha1?: string,
239
250
  },
240
251
  },
241
- encryptedSize: number,
242
252
  ): Promise<void> {
243
253
  const generatedExtendedAttributes = generateFileExtendedAttributes(extendedAttributes);
244
254
  const nodeCommitCrypto = await this.cryptoService.commitFile(nodeRevisionDraft.nodeKeys, manifest, generatedExtendedAttributes);
245
255
  await this.apiService.commitDraftRevision(nodeRevisionDraft.nodeRevisionUid, nodeCommitCrypto);
246
-
247
- const activeRevision = resultOk<Revision, Error>({
248
- uid: nodeRevisionDraft.nodeRevisionUid,
249
- state: RevisionState.Active,
250
- creationTime: new Date(),
251
- storageSize: encryptedSize,
252
- contentAuthor: resultOk(nodeCommitCrypto.signatureEmail),
253
- claimedSize: metadata.expectedSize,
254
- claimedModificationTime: extendedAttributes.modificationTime,
255
- claimedDigests: {
256
- sha1: extendedAttributes.digests?.sha1,
257
- },
258
- });
259
- if (nodeRevisionDraft.newNodeInfo) {
260
- const node: DecryptedNode = {
261
- // Internal metadata
262
- hash: nodeRevisionDraft.newNodeInfo.hash,
263
- encryptedName: nodeRevisionDraft.newNodeInfo.encryptedName,
264
-
265
- // Basic node metadata
266
- uid: nodeRevisionDraft.nodeUid,
267
- parentUid: nodeRevisionDraft.newNodeInfo.parentUid,
268
- type: NodeType.File,
269
- mediaType: metadata.mediaType,
270
- creationTime: new Date(),
271
- totalStorageSize: encryptedSize,
272
-
273
- // Share node metadata
274
- isShared: false,
275
- directMemberRole: MemberRole.Inherited,
276
-
277
- // Decrypted metadata
278
- isStale: false,
279
- keyAuthor: resultOk(nodeRevisionDraft.nodeKeys.signatureAddress.email),
280
- nameAuthor: resultOk(nodeRevisionDraft.nodeKeys.signatureAddress.email),
281
- name: resultOk(nodeRevisionDraft.newNodeInfo.name),
282
-
283
- activeRevision,
284
- }
285
- await this.nodesEvents.nodeCreated(node);
286
- } else {
287
- await this.nodesEvents.nodeUpdated({
288
- uid: nodeRevisionDraft.nodeUid,
289
- activeRevision,
290
- });
256
+ const node = await this.nodesService.getNode(nodeRevisionDraft.nodeUid);
257
+ if (node.parentUid) {
258
+ await this.nodesService.notifyChildCreated(node.parentUid);
291
259
  }
292
260
  }
293
261
  }
@@ -297,7 +265,7 @@ export class UploadManager {
297
265
  */
298
266
  function splitExtension(filename = ''): [string, string] {
299
267
  const endIdx = filename.lastIndexOf('.');
300
- if (endIdx === -1 || endIdx === filename.length-1) {
268
+ if (endIdx === -1 || endIdx === filename.length - 1) {
301
269
  return [filename, ''];
302
270
  }
303
271
  return [filename.slice(0, endIdx), filename.slice(endIdx + 1)];