@keeper-security/keeper-sdk-javascript 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 (173) hide show
  1. package/dist/auth/ConsoleAuthUI.d.ts +10 -0
  2. package/dist/auth/ConsoleAuthUI.js +152 -0
  3. package/dist/auth/ConsoleAuthUI.js.map +1 -0
  4. package/dist/auth/ConsoleLogin.d.ts +8 -0
  5. package/dist/auth/ConsoleLogin.js +266 -0
  6. package/dist/auth/ConsoleLogin.js.map +1 -0
  7. package/dist/auth/SessionManager.d.ts +66 -0
  8. package/dist/auth/SessionManager.js +211 -0
  9. package/dist/auth/SessionManager.js.map +1 -0
  10. package/dist/index.d.ts +17 -0
  11. package/dist/index.js +61 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/records/RecordOperations.d.ts +79 -0
  14. package/dist/records/RecordOperations.js +346 -0
  15. package/dist/records/RecordOperations.js.map +1 -0
  16. package/dist/records/RecordUtils.d.ts +36 -0
  17. package/dist/records/RecordUtils.js +224 -0
  18. package/dist/records/RecordUtils.js.map +1 -0
  19. package/dist/sharing/Sharing.d.ts +27 -0
  20. package/dist/sharing/Sharing.js +125 -0
  21. package/dist/sharing/Sharing.js.map +1 -0
  22. package/dist/src/auth/ConsoleAuthUI.d.ts +10 -0
  23. package/dist/src/auth/ConsoleAuthUI.js +161 -0
  24. package/dist/src/auth/ConsoleAuthUI.js.map +1 -0
  25. package/dist/src/auth/ConsoleLogin.d.ts +8 -0
  26. package/dist/src/auth/ConsoleLogin.js +311 -0
  27. package/dist/src/auth/ConsoleLogin.js.map +1 -0
  28. package/dist/src/auth/SessionManager.d.ts +67 -0
  29. package/dist/src/auth/SessionManager.js +212 -0
  30. package/dist/src/auth/SessionManager.js.map +1 -0
  31. package/dist/src/folders/FolderManager.d.ts +57 -0
  32. package/dist/src/folders/FolderManager.js +108 -0
  33. package/dist/src/folders/FolderManager.js.map +1 -0
  34. package/dist/src/folders/addFolder.d.ts +32 -0
  35. package/dist/src/folders/addFolder.js +207 -0
  36. package/dist/src/folders/addFolder.js.map +1 -0
  37. package/dist/src/folders/changeDirectory.d.ts +19 -0
  38. package/dist/src/folders/changeDirectory.js +171 -0
  39. package/dist/src/folders/changeDirectory.js.map +1 -0
  40. package/dist/src/folders/deleteFolder.d.ts +17 -0
  41. package/dist/src/folders/deleteFolder.js +237 -0
  42. package/dist/src/folders/deleteFolder.js.map +1 -0
  43. package/dist/src/folders/folderHelpers.d.ts +48 -0
  44. package/dist/src/folders/folderHelpers.js +100 -0
  45. package/dist/src/folders/folderHelpers.js.map +1 -0
  46. package/dist/src/folders/folderTree.d.ts +29 -0
  47. package/dist/src/folders/folderTree.js +250 -0
  48. package/dist/src/folders/folderTree.js.map +1 -0
  49. package/dist/src/folders/getFolder.d.ts +56 -0
  50. package/dist/src/folders/getFolder.js +143 -0
  51. package/dist/src/folders/getFolder.js.map +1 -0
  52. package/dist/src/folders/listFolder.d.ts +48 -0
  53. package/dist/src/folders/listFolder.js +276 -0
  54. package/dist/src/folders/listFolder.js.map +1 -0
  55. package/dist/src/folders/updateFolder.d.ts +31 -0
  56. package/dist/src/folders/updateFolder.js +137 -0
  57. package/dist/src/folders/updateFolder.js.map +1 -0
  58. package/dist/src/index.d.ts +49 -0
  59. package/dist/src/index.js +151 -0
  60. package/dist/src/index.js.map +1 -0
  61. package/dist/src/records/RecordOperations.d.ts +80 -0
  62. package/dist/src/records/RecordOperations.js +356 -0
  63. package/dist/src/records/RecordOperations.js.map +1 -0
  64. package/dist/src/records/RecordUtils.d.ts +37 -0
  65. package/dist/src/records/RecordUtils.js +263 -0
  66. package/dist/src/records/RecordUtils.js.map +1 -0
  67. package/dist/src/records/Totp.d.ts +14 -0
  68. package/dist/src/records/Totp.js +111 -0
  69. package/dist/src/records/Totp.js.map +1 -0
  70. package/dist/src/sharedFolders/SharedFolderManager.d.ts +20 -0
  71. package/dist/src/sharedFolders/SharedFolderManager.js +33 -0
  72. package/dist/src/sharedFolders/SharedFolderManager.js.map +1 -0
  73. package/dist/src/sharedFolders/listSharedFolders.d.ts +29 -0
  74. package/dist/src/sharedFolders/listSharedFolders.js +127 -0
  75. package/dist/src/sharedFolders/listSharedFolders.js.map +1 -0
  76. package/dist/src/sharedFolders/shareFolder.d.ts +36 -0
  77. package/dist/src/sharedFolders/shareFolder.js +352 -0
  78. package/dist/src/sharedFolders/shareFolder.js.map +1 -0
  79. package/dist/src/sharing/Sharing.d.ts +50 -0
  80. package/dist/src/sharing/Sharing.js +195 -0
  81. package/dist/src/sharing/Sharing.js.map +1 -0
  82. package/dist/src/storage/InMemoryStorage.d.ts +24 -0
  83. package/dist/src/storage/InMemoryStorage.js +139 -0
  84. package/dist/src/storage/InMemoryStorage.js.map +1 -0
  85. package/dist/src/teams/TeamManager.d.ts +17 -0
  86. package/dist/src/teams/TeamManager.js +38 -0
  87. package/dist/src/teams/TeamManager.js.map +1 -0
  88. package/dist/src/teams/enterpriseData.d.ts +106 -0
  89. package/dist/src/teams/enterpriseData.js +319 -0
  90. package/dist/src/teams/enterpriseData.js.map +1 -0
  91. package/dist/src/teams/listTeams.d.ts +42 -0
  92. package/dist/src/teams/listTeams.js +308 -0
  93. package/dist/src/teams/listTeams.js.map +1 -0
  94. package/dist/src/teams/viewTeam.d.ts +35 -0
  95. package/dist/src/teams/viewTeam.js +177 -0
  96. package/dist/src/teams/viewTeam.js.map +1 -0
  97. package/dist/src/utils/Logger.d.ts +28 -0
  98. package/dist/src/utils/Logger.js +62 -0
  99. package/dist/src/utils/Logger.js.map +1 -0
  100. package/dist/src/utils/constants.d.ts +50 -0
  101. package/dist/src/utils/constants.js +64 -0
  102. package/dist/src/utils/constants.js.map +1 -0
  103. package/dist/src/utils/errors.d.ts +10 -0
  104. package/dist/src/utils/errors.js +117 -0
  105. package/dist/src/utils/errors.js.map +1 -0
  106. package/dist/src/utils/guards.d.ts +7 -0
  107. package/dist/src/utils/guards.js +29 -0
  108. package/dist/src/utils/guards.js.map +1 -0
  109. package/dist/src/utils/index.d.ts +7 -0
  110. package/dist/src/utils/index.js +39 -0
  111. package/dist/src/utils/index.js.map +1 -0
  112. package/dist/src/utils/patterns.d.ts +9 -0
  113. package/dist/src/utils/patterns.js +20 -0
  114. package/dist/src/utils/patterns.js.map +1 -0
  115. package/dist/src/utils/types.d.ts +12 -0
  116. package/dist/src/utils/types.js +3 -0
  117. package/dist/src/utils/types.js.map +1 -0
  118. package/dist/src/vault/KeeperVault.d.ts +116 -0
  119. package/dist/src/vault/KeeperVault.js +443 -0
  120. package/dist/src/vault/KeeperVault.js.map +1 -0
  121. package/dist/storage/InMemoryStorage.d.ts +24 -0
  122. package/dist/storage/InMemoryStorage.js +132 -0
  123. package/dist/storage/InMemoryStorage.js.map +1 -0
  124. package/dist/utils/Logger.d.ts +28 -0
  125. package/dist/utils/Logger.js +62 -0
  126. package/dist/utils/Logger.js.map +1 -0
  127. package/dist/utils/constants.d.ts +26 -0
  128. package/dist/utils/constants.js +37 -0
  129. package/dist/utils/constants.js.map +1 -0
  130. package/dist/utils/errors.d.ts +10 -0
  131. package/dist/utils/errors.js +117 -0
  132. package/dist/utils/errors.js.map +1 -0
  133. package/dist/utils/index.d.ts +4 -0
  134. package/dist/utils/index.js +22 -0
  135. package/dist/utils/index.js.map +1 -0
  136. package/dist/vault/KeeperVault.d.ts +72 -0
  137. package/dist/vault/KeeperVault.js +338 -0
  138. package/dist/vault/KeeperVault.js.map +1 -0
  139. package/package.json +32 -0
  140. package/src/auth/ConsoleAuthUI.ts +169 -0
  141. package/src/auth/ConsoleLogin.ts +351 -0
  142. package/src/auth/SessionManager.ts +293 -0
  143. package/src/folders/FolderManager.ts +174 -0
  144. package/src/folders/addFolder.ts +294 -0
  145. package/src/folders/changeDirectory.ts +217 -0
  146. package/src/folders/deleteFolder.ts +293 -0
  147. package/src/folders/folderHelpers.ts +99 -0
  148. package/src/folders/folderTree.ts +321 -0
  149. package/src/folders/getFolder.ts +234 -0
  150. package/src/folders/listFolder.ts +358 -0
  151. package/src/folders/updateFolder.ts +210 -0
  152. package/src/index.ts +242 -0
  153. package/src/records/RecordOperations.ts +549 -0
  154. package/src/records/RecordUtils.ts +282 -0
  155. package/src/records/Totp.ts +119 -0
  156. package/src/sharedFolders/SharedFolderManager.ts +57 -0
  157. package/src/sharedFolders/listSharedFolders.ts +173 -0
  158. package/src/sharedFolders/shareFolder.ts +457 -0
  159. package/src/sharing/Sharing.ts +282 -0
  160. package/src/storage/InMemoryStorage.ts +163 -0
  161. package/src/teams/TeamManager.ts +61 -0
  162. package/src/teams/enterpriseData.ts +453 -0
  163. package/src/teams/listTeams.ts +373 -0
  164. package/src/teams/viewTeam.ts +248 -0
  165. package/src/utils/Logger.ts +71 -0
  166. package/src/utils/constants.ts +63 -0
  167. package/src/utils/errors.ts +108 -0
  168. package/src/utils/guards.ts +24 -0
  169. package/src/utils/index.ts +22 -0
  170. package/src/utils/patterns.ts +20 -0
  171. package/src/utils/types.ts +11 -0
  172. package/src/vault/KeeperVault.ts +612 -0
  173. package/tsconfig.json +16 -0
@@ -0,0 +1,453 @@
1
+ import {
2
+ decryptFromStorage,
3
+ decryptObjectFromStorage,
4
+ Enterprise,
5
+ getEnterpriseDataForUserMessage,
6
+ normal64Bytes,
7
+ platform,
8
+ webSafe64FromBytes,
9
+ type Auth,
10
+ type RestCommand,
11
+ } from '@keeper-security/keeperapi'
12
+ import { isNumber } from '../utils'
13
+
14
+ const DEFAULT_NODE_PATH_SEPARATOR = '\\'
15
+ const MAX_CONTINUATIONS = 50
16
+ const LEGACY_ENTERPRISE_DATA_COMMAND = 'get_enterprise_data'
17
+
18
+ export enum EnterpriseDataInclude {
19
+ Nodes = 'nodes',
20
+ Users = 'users',
21
+ Roles = 'roles',
22
+ RoleUsers = 'role_users',
23
+ RoleTeams = 'role_teams',
24
+ Teams = 'teams',
25
+ TeamUsers = 'team_users',
26
+ }
27
+
28
+ enum LegacyEnterpriseKeyType {
29
+ EncryptedByDataKey = 1,
30
+ EncryptedByPublicKey = 2,
31
+ }
32
+
33
+ const INCLUDE_TO_ENTITY: Record<EnterpriseDataInclude, Enterprise.EnterpriseDataEntity> = {
34
+ [EnterpriseDataInclude.Nodes]: Enterprise.EnterpriseDataEntity.NODES,
35
+ [EnterpriseDataInclude.Users]: Enterprise.EnterpriseDataEntity.USERS,
36
+ [EnterpriseDataInclude.Roles]: Enterprise.EnterpriseDataEntity.ROLES,
37
+ [EnterpriseDataInclude.RoleUsers]: Enterprise.EnterpriseDataEntity.ROLE_USERS,
38
+ [EnterpriseDataInclude.RoleTeams]: Enterprise.EnterpriseDataEntity.ROLE_TEAMS,
39
+ [EnterpriseDataInclude.Teams]: Enterprise.EnterpriseDataEntity.TEAMS,
40
+ [EnterpriseDataInclude.TeamUsers]: Enterprise.EnterpriseDataEntity.TEAM_USERS,
41
+ }
42
+
43
+ export type EnterpriseNode = {
44
+ node_id: number
45
+ parent_id?: number
46
+ encrypted_data?: string
47
+ displayName?: string
48
+ }
49
+
50
+ export type EnterpriseUser = {
51
+ enterprise_user_id: number
52
+ username: string
53
+ status?: string
54
+ node_id?: number
55
+ encrypted_data?: string
56
+ full_name?: string
57
+ job_title?: string
58
+ }
59
+
60
+ export type EnterpriseRole = {
61
+ role_id: number
62
+ node_id?: number
63
+ encrypted_data?: string
64
+ displayName?: string
65
+ }
66
+
67
+ export type EnterpriseTeamRecord = {
68
+ team_uid: string
69
+ name: string
70
+ node_id: number
71
+ restrict_view?: boolean
72
+ restrict_edit?: boolean
73
+ restrict_share?: boolean
74
+ restrict_sharing?: boolean
75
+ encrypted_data?: string
76
+ }
77
+
78
+ export type EnterpriseTeamUserLink = {
79
+ team_uid: string
80
+ enterprise_user_id: number
81
+ user_type?: string
82
+ }
83
+
84
+ export type EnterpriseRoleUserLink = {
85
+ role_id: number
86
+ enterprise_user_id: number
87
+ }
88
+
89
+ export type EnterpriseRoleTeamLink = {
90
+ role_id: number
91
+ team_uid: string
92
+ }
93
+
94
+ export type GetEnterpriseDataResponse = {
95
+ enterprise_name?: string
96
+ nodes?: EnterpriseNode[]
97
+ users?: EnterpriseUser[]
98
+ roles?: EnterpriseRole[]
99
+ teams?: EnterpriseTeamRecord[]
100
+ team_users?: EnterpriseTeamUserLink[]
101
+ role_users?: EnterpriseRoleUserLink[]
102
+ role_teams?: EnterpriseRoleTeamLink[]
103
+ }
104
+
105
+ export type NodePathOptions = {
106
+ omitRoot?: boolean
107
+ separator?: string
108
+ }
109
+
110
+ export type DecryptedNodeNames = Map<number, string>
111
+ export type DecryptedRoleNames = Map<number, string>
112
+ export type EnterpriseDisplayNames = {
113
+ nodes: DecryptedNodeNames
114
+ roles: DecryptedRoleNames
115
+ }
116
+
117
+ type LongLike = number | { toNumber: () => number; toString: () => string } | undefined | null
118
+
119
+ type LegacyEnterpriseDataNode = {
120
+ node_id: number
121
+ parent_id?: number
122
+ encrypted_data?: string
123
+ }
124
+
125
+ type LegacyEnterpriseDataRole = {
126
+ role_id: number
127
+ encrypted_data?: string
128
+ }
129
+
130
+ type LegacyEnterpriseDataResponse = {
131
+ tree_key?: string
132
+ key_type_id?: LegacyEnterpriseKeyType
133
+ nodes?: LegacyEnterpriseDataNode[]
134
+ roles?: LegacyEnterpriseDataRole[]
135
+ }
136
+
137
+ export interface EnterpriseDataManagerApi {
138
+ getData(includes: EnterpriseDataInclude[]): Promise<GetEnterpriseDataResponse>
139
+ getDisplayNames(): Promise<EnterpriseDisplayNames>
140
+ clearCache(): void
141
+ }
142
+
143
+ export class EnterpriseDataManager implements EnterpriseDataManagerApi {
144
+ private readonly auth: Auth
145
+ private displayNamesPromise: Promise<EnterpriseDisplayNames> | null = null
146
+ private readonly dataCache = new Map<string, Promise<GetEnterpriseDataResponse>>()
147
+
148
+ constructor(auth: Auth) {
149
+ this.auth = auth
150
+ }
151
+
152
+ public async getData(includes: EnterpriseDataInclude[]): Promise<GetEnterpriseDataResponse> {
153
+ const key = EnterpriseDataManager.cacheKeyForIncludes(includes)
154
+ let promise = this.dataCache.get(key)
155
+ if (!promise) {
156
+ promise = this.fetchEnterpriseData(includes)
157
+ this.dataCache.set(key, promise)
158
+ }
159
+ return promise
160
+ }
161
+
162
+ public async getDisplayNames(): Promise<EnterpriseDisplayNames> {
163
+ if (!this.displayNamesPromise) {
164
+ this.displayNamesPromise = this.fetchDisplayNames()
165
+ }
166
+ return this.displayNamesPromise
167
+ }
168
+
169
+ public clearCache(): void {
170
+ this.dataCache.clear()
171
+ this.displayNamesPromise = null
172
+ }
173
+
174
+ public static getNodePath(
175
+ nodes: EnterpriseNode[],
176
+ nodeId: number,
177
+ options: NodePathOptions = {}
178
+ ): string {
179
+ const { omitRoot = true, separator = DEFAULT_NODE_PATH_SEPARATOR } = options
180
+ const byId = new Map<number, EnterpriseNode>()
181
+ for (const node of nodes) byId.set(node.node_id, node)
182
+
183
+ const visited = new Set<number>()
184
+ const segments: string[] = []
185
+ let currentId: number | undefined = nodeId
186
+ while (isNumber(currentId) && currentId > 0 && !visited.has(currentId)) {
187
+ visited.add(currentId)
188
+ const node = byId.get(currentId)
189
+ if (!node) break
190
+ const parentId = node.parent_id || 0
191
+ const isRoot = parentId === 0
192
+ if (!isRoot || !omitRoot) {
193
+ const segmentName = (node.displayName || '').trim()
194
+ if (segmentName) segments.push(segmentName)
195
+ }
196
+ currentId = parentId
197
+ }
198
+ segments.reverse()
199
+ return segments.join(separator)
200
+ }
201
+
202
+ private static cacheKeyForIncludes(includes: EnterpriseDataInclude[]): string {
203
+ return [...includes].sort().join(',')
204
+ }
205
+
206
+ private async fetchEnterpriseData(
207
+ includes: EnterpriseDataInclude[]
208
+ ): Promise<GetEnterpriseDataResponse> {
209
+ const interesting = new Set<Enterprise.EnterpriseDataEntity>(
210
+ includes.map((key) => INCLUDE_TO_ENTITY[key])
211
+ )
212
+ const aggregate: GetEnterpriseDataResponse = {}
213
+ let continuationToken: Uint8Array | undefined
214
+
215
+ for (let iteration = 0; iteration < MAX_CONTINUATIONS; iteration += 1) {
216
+ const request: Enterprise.IEnterpriseDataRequest = {}
217
+ if (continuationToken) request.continuationToken = continuationToken
218
+
219
+ const response = await this.auth.executeRest(getEnterpriseDataForUserMessage(request))
220
+
221
+ if (response.generalData?.enterpriseName) {
222
+ aggregate.enterprise_name = response.generalData.enterpriseName
223
+ }
224
+
225
+ for (const chunk of response.data || []) {
226
+ const entity = chunk.entity ?? Enterprise.EnterpriseDataEntity.UNKNOWN
227
+ if (!interesting.has(entity)) continue
228
+ EnterpriseDataManager.applyChunk(chunk, aggregate)
229
+ }
230
+
231
+ if (!response.hasMore) break
232
+ if (!response.continuationToken || response.continuationToken.length === 0) break
233
+ continuationToken = response.continuationToken
234
+ }
235
+
236
+ return aggregate
237
+ }
238
+
239
+ private async fetchDisplayNames(): Promise<EnterpriseDisplayNames> {
240
+ const empty: EnterpriseDisplayNames = { nodes: new Map(), roles: new Map() }
241
+ const response = await this.fetchLegacyEnterpriseData()
242
+ if (!response) return empty
243
+
244
+ const treeKey = await this.decryptTreeKey(response)
245
+ if (!treeKey) return empty
246
+
247
+ const nodes: DecryptedNodeNames = new Map()
248
+ for (const node of response.nodes || []) {
249
+ if (!isNumber(node.node_id)) continue
250
+ if (!node.encrypted_data) continue
251
+ const display = await EnterpriseDataManager.decryptDisplayName(node.encrypted_data, treeKey)
252
+ if (display) nodes.set(node.node_id, display)
253
+ }
254
+
255
+ const roles: DecryptedRoleNames = new Map()
256
+ for (const role of response.roles || []) {
257
+ if (!isNumber(role.role_id)) continue
258
+ if (!role.encrypted_data) continue
259
+ const display = await EnterpriseDataManager.decryptDisplayName(role.encrypted_data, treeKey)
260
+ if (display) roles.set(role.role_id, display)
261
+ }
262
+
263
+ return { nodes, roles }
264
+ }
265
+
266
+ private async fetchLegacyEnterpriseData(): Promise<LegacyEnterpriseDataResponse | null> {
267
+ const command: RestCommand<{ include: string[] }, LegacyEnterpriseDataResponse> = {
268
+ baseRequest: { command: LEGACY_ENTERPRISE_DATA_COMMAND },
269
+ request: { include: [EnterpriseDataInclude.Nodes, EnterpriseDataInclude.Roles] },
270
+ authorization: {},
271
+ }
272
+
273
+ try {
274
+ const response = await this.auth.executeRestCommand(command)
275
+ if (response && (response.tree_key || response.nodes || response.roles)) return response
276
+ } catch {
277
+ }
278
+ return null
279
+ }
280
+
281
+ private async decryptTreeKey(response: LegacyEnterpriseDataResponse): Promise<Uint8Array | null> {
282
+ const treeKey = response.tree_key
283
+ if (!treeKey) return null
284
+
285
+ try {
286
+ if (response.key_type_id === LegacyEnterpriseKeyType.EncryptedByDataKey) {
287
+ const dataKey = (this.auth as unknown as { dataKey?: Uint8Array }).dataKey
288
+ if (!dataKey) return null
289
+ return await decryptFromStorage(treeKey, dataKey)
290
+ }
291
+
292
+ const privateKey = (this.auth as unknown as { privateKey?: Uint8Array }).privateKey
293
+ if (!privateKey) return null
294
+ return platform.privateDecrypt(normal64Bytes(treeKey), privateKey)
295
+ } catch {
296
+ return null
297
+ }
298
+ }
299
+
300
+ private static async decryptDisplayName(encrypted: string, treeKey: Uint8Array): Promise<string> {
301
+ try {
302
+ const decrypted = await decryptObjectFromStorage<{ displayname?: string }>(encrypted, treeKey)
303
+ return (decrypted?.displayname || '').trim()
304
+ } catch {
305
+ return ''
306
+ }
307
+ }
308
+
309
+ private static toNumber(value: LongLike): number {
310
+ if (value == null) return 0
311
+ if (isNumber(value)) return value
312
+ if (typeof value.toNumber === 'function') return value.toNumber()
313
+ const parsed = Number(value.toString())
314
+ return Number.isFinite(parsed) ? parsed : 0
315
+ }
316
+
317
+ private static toUid(bytes: Uint8Array | null | undefined): string {
318
+ return bytes && bytes.length > 0 ? webSafe64FromBytes(bytes) : ''
319
+ }
320
+
321
+ private static decodeChunk<T>(
322
+ chunkData: Uint8Array[] | null | undefined,
323
+ decoder: (bytes: Uint8Array) => T
324
+ ): T[] {
325
+ if (!chunkData || chunkData.length === 0) return []
326
+ const results: T[] = []
327
+ for (const bytes of chunkData) {
328
+ try {
329
+ results.push(decoder(bytes))
330
+ } catch {
331
+ }
332
+ }
333
+ return results
334
+ }
335
+
336
+ private static decodeNodeChunk(bytes: Uint8Array): EnterpriseNode {
337
+ const message = Enterprise.Node.decode(bytes)
338
+ const out: EnterpriseNode = { node_id: EnterpriseDataManager.toNumber(message.nodeId) }
339
+ if (message.parentId != null) out.parent_id = EnterpriseDataManager.toNumber(message.parentId)
340
+ if (message.encryptedData) out.encrypted_data = message.encryptedData
341
+ return out
342
+ }
343
+
344
+ private static decodeUserChunk(bytes: Uint8Array): EnterpriseUser {
345
+ const message = Enterprise.User.decode(bytes)
346
+ const out: EnterpriseUser = {
347
+ enterprise_user_id: EnterpriseDataManager.toNumber(message.enterpriseUserId),
348
+ username: message.username || '',
349
+ }
350
+ if (message.status) out.status = message.status
351
+ if (message.nodeId != null) out.node_id = EnterpriseDataManager.toNumber(message.nodeId)
352
+ if (message.encryptedData) out.encrypted_data = message.encryptedData
353
+ if (message.fullName) out.full_name = message.fullName
354
+ if (message.jobTitle) out.job_title = message.jobTitle
355
+ return out
356
+ }
357
+
358
+ private static decodeRoleChunk(bytes: Uint8Array): EnterpriseRole {
359
+ const message = Enterprise.Role.decode(bytes)
360
+ const out: EnterpriseRole = { role_id: EnterpriseDataManager.toNumber(message.roleId) }
361
+ if (message.nodeId != null) out.node_id = EnterpriseDataManager.toNumber(message.nodeId)
362
+ if (message.encryptedData) out.encrypted_data = message.encryptedData
363
+ return out
364
+ }
365
+
366
+ private static decodeTeamChunk(bytes: Uint8Array): EnterpriseTeamRecord {
367
+ const message = Enterprise.Team.decode(bytes)
368
+ const out: EnterpriseTeamRecord = {
369
+ team_uid: EnterpriseDataManager.toUid(message.teamUid),
370
+ name: message.name || '',
371
+ node_id: EnterpriseDataManager.toNumber(message.nodeId),
372
+ restrict_view: message.restrictView === true,
373
+ restrict_edit: message.restrictEdit === true,
374
+ restrict_share: message.restrictShare === true,
375
+ }
376
+ if (message.encryptedData) out.encrypted_data = message.encryptedData
377
+ return out
378
+ }
379
+
380
+ private static decodeTeamUserChunk(bytes: Uint8Array): EnterpriseTeamUserLink {
381
+ const message = Enterprise.TeamUser.decode(bytes)
382
+ const out: EnterpriseTeamUserLink = {
383
+ team_uid: EnterpriseDataManager.toUid(message.teamUid),
384
+ enterprise_user_id: EnterpriseDataManager.toNumber(message.enterpriseUserId),
385
+ }
386
+ if (message.userType) out.user_type = message.userType
387
+ return out
388
+ }
389
+
390
+ private static decodeRoleUserChunk(bytes: Uint8Array): EnterpriseRoleUserLink {
391
+ const message = Enterprise.RoleUser.decode(bytes)
392
+ return {
393
+ role_id: EnterpriseDataManager.toNumber(message.roleId),
394
+ enterprise_user_id: EnterpriseDataManager.toNumber(message.enterpriseUserId),
395
+ }
396
+ }
397
+
398
+ private static decodeRoleTeamChunk(bytes: Uint8Array): EnterpriseRoleTeamLink {
399
+ const message = Enterprise.RoleTeam.decode(bytes)
400
+ return {
401
+ role_id: EnterpriseDataManager.toNumber(message.roleId),
402
+ team_uid: EnterpriseDataManager.toUid(message.teamUid),
403
+ }
404
+ }
405
+
406
+ private static applyChunk(
407
+ chunk: Enterprise.IEnterpriseData,
408
+ target: GetEnterpriseDataResponse
409
+ ): void {
410
+ const entity = chunk.entity ?? Enterprise.EnterpriseDataEntity.UNKNOWN
411
+ const data = chunk.data || []
412
+
413
+ switch (entity) {
414
+ case Enterprise.EnterpriseDataEntity.NODES:
415
+ target.nodes = (target.nodes || []).concat(
416
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeNodeChunk)
417
+ )
418
+ break
419
+ case Enterprise.EnterpriseDataEntity.USERS:
420
+ target.users = (target.users || []).concat(
421
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeUserChunk)
422
+ )
423
+ break
424
+ case Enterprise.EnterpriseDataEntity.ROLES:
425
+ target.roles = (target.roles || []).concat(
426
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeRoleChunk)
427
+ )
428
+ break
429
+ case Enterprise.EnterpriseDataEntity.TEAMS:
430
+ target.teams = (target.teams || []).concat(
431
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeTeamChunk)
432
+ )
433
+ break
434
+ case Enterprise.EnterpriseDataEntity.TEAM_USERS:
435
+ target.team_users = (target.team_users || []).concat(
436
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeTeamUserChunk)
437
+ )
438
+ break
439
+ case Enterprise.EnterpriseDataEntity.ROLE_USERS:
440
+ target.role_users = (target.role_users || []).concat(
441
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeRoleUserChunk)
442
+ )
443
+ break
444
+ case Enterprise.EnterpriseDataEntity.ROLE_TEAMS:
445
+ target.role_teams = (target.role_teams || []).concat(
446
+ EnterpriseDataManager.decodeChunk(data, EnterpriseDataManager.decodeRoleTeamChunk)
447
+ )
448
+ break
449
+ default:
450
+ break
451
+ }
452
+ }
453
+ }