@@ -10,6 +10,7 @@ import type {
1010import {
1111 Folder ,
1212 Records ,
13+ getFolderAccessMessage ,
1314 getRecordAccessMessage ,
1415 getShareObjectsMessage ,
1516 normal64Bytes ,
@@ -1002,6 +1003,69 @@ export function findFolderAccessEntry(
10021003 )
10031004}
10041005
1006+ function toFolderAccessEntry ( folderUid : string , accessor : Folder . IFolderAccessData ) : DKdFolderAccess {
1007+ return {
1008+ kind : 'keeper_drive_folder_access' ,
1009+ accessUid : `${ folderUid } :${ webSafe64FromBytes ( accessor . accessTypeUid ! ) } ` ,
1010+ folderUid,
1011+ accessTypeUid : webSafe64FromBytes ( accessor . accessTypeUid ! ) ,
1012+ accessType : accessor . accessType ! ,
1013+ accessRoleType : accessor . accessRoleType ! ,
1014+ permission : accessor . permissions ?? { } ,
1015+ inherited : accessor . inherited ?? undefined ,
1016+ hidden : accessor . hidden ?? undefined ,
1017+ }
1018+ }
1019+
1020+ /** Live folder accessors — sync-down often only includes the current user's own access. */
1021+ export async function fetchLiveFolderAccessEntries (
1022+ auth : Auth ,
1023+ folderUid : string
1024+ ) : Promise < DKdFolderAccess [ ] > {
1025+ try {
1026+ const response = await auth . executeRest (
1027+ getFolderAccessMessage ( { folderUid : [ normal64Bytes ( folderUid ) ] } )
1028+ )
1029+ const result = response . folderAccessResults ?. find (
1030+ ( entry ) => entry . folderUid ?. length && webSafe64FromBytes ( entry . folderUid ) === folderUid
1031+ )
1032+ return ( result ?. accessors ?? [ ] )
1033+ . filter (
1034+ ( accessor ) =>
1035+ accessor . accessTypeUid ?. length &&
1036+ accessor . accessType != null &&
1037+ accessor . accessRoleType != null
1038+ )
1039+ . map ( ( accessor ) => toFolderAccessEntry ( folderUid , accessor ) )
1040+ } catch ( err ) {
1041+ throw new KeeperSdkError (
1042+ `Failed to fetch folder permissions for ${ folderUid } : ${ extractErrorMessage ( err ) } ` ,
1043+ ResultCodes . NSF_DETAILS_FAILED
1044+ )
1045+ }
1046+ }
1047+
1048+ export async function findFolderAccessEntryOrLive (
1049+ storage : InMemoryStorage ,
1050+ auth : Auth ,
1051+ folderUid : string ,
1052+ accessTypeUid : string ,
1053+ accessType : Folder . AccessType
1054+ ) : Promise < DKdFolderAccess | undefined > {
1055+ const fromStorage = findFolderAccessEntry ( storage , folderUid , accessTypeUid , accessType )
1056+ if ( fromStorage ) return fromStorage
1057+
1058+ try {
1059+ const liveEntries = await fetchLiveFolderAccessEntries ( auth , folderUid )
1060+ return liveEntries . find (
1061+ ( entry ) => entry . accessTypeUid === accessTypeUid && entry . accessType === accessType
1062+ )
1063+ } catch {
1064+ // If live lookup fails, fall through to add-path (previous behavior).
1065+ return undefined
1066+ }
1067+ }
1068+
10051069export function collectExistingFolderShareTargets (
10061070 storage : InMemoryStorage ,
10071071 folderUid : string ,
0 commit comments