@@ -19,12 +19,22 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
1919 if ( ! user ) throw new Error ( 'loadTypeIndexesFor: No user given' )
2020 const profile = await profileLogic . loadProfile ( user )
2121
22- const suggestion = suggestPublicTypeIndex ( user )
22+ let suggestion : NamedNode | null = null
23+ try {
24+ suggestion = suggestPublicTypeIndex ( user )
25+ } catch ( err ) {
26+ const message = `User ${ user } has no usable profile document directory for publicTypeIndex.`
27+ debug . warn ( message )
28+ }
2329 let publicTypeIndex
2430 try {
25- publicTypeIndex = await utilityLogic . followOrCreateLink ( user , ns . solid ( 'publicTypeIndex' ) as NamedNode , suggestion , profile )
31+ publicTypeIndex =
32+ store . any ( user , ns . solid ( 'publicTypeIndex' ) , undefined , profile ) ||
33+ ( suggestion
34+ ? await utilityLogic . followOrCreateLink ( user , ns . solid ( 'publicTypeIndex' ) as NamedNode , suggestion , profile )
35+ : null )
2636 } catch ( err ) {
27- const message = `User ${ user } has no pointer in profile to publicTypeIndex file. `
37+ const message = `User ${ user } has no pointer in profile to publicTypeIndex file: ${ err } `
2838 debug . warn ( message )
2939 }
3040 const publicScopes = publicTypeIndex ? [ { label : 'public' , index : publicTypeIndex as NamedNode , agent : user } ] : [ ]
@@ -40,13 +50,21 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
4050 if ( preferencesFile ) { // watch out - can be in either as spec was not clear. Legacy is profile.
4151 // If there is a legacy one linked from the profile, use that.
4252 // Otherwiae use or make one linked from Preferences
43- const suggestedPrivateTypeIndex = suggestPrivateTypeIndex ( preferencesFile )
53+ let suggestedPrivateTypeIndex : NamedNode | null = null
54+ try {
55+ suggestedPrivateTypeIndex = suggestPrivateTypeIndex ( preferencesFile )
56+ } catch ( err ) {
57+ const message = `User ${ user } has no usable preferences document directory for privateTypeIndex.`
58+ debug . warn ( message )
59+ }
4460 let privateTypeIndex
4561 try {
4662 privateTypeIndex = store . any ( user , ns . solid ( 'privateTypeIndex' ) , undefined , profile ) ||
47- await utilityLogic . followOrCreateLink ( user , ns . solid ( 'privateTypeIndex' ) as NamedNode , suggestedPrivateTypeIndex , preferencesFile )
63+ ( suggestedPrivateTypeIndex
64+ ? await utilityLogic . followOrCreateLink ( user , ns . solid ( 'privateTypeIndex' ) as NamedNode , suggestedPrivateTypeIndex , preferencesFile )
65+ : null )
4866 } catch ( err ) {
49- const message = `User ${ user } has no pointer in preference file to privateTypeIndex file. `
67+ const message = `User ${ user } has no pointer in preference file to privateTypeIndex file: ${ err } `
5068 debug . warn ( message )
5169 }
5270 privateScopes = privateTypeIndex ? [ { label : 'private' , index : privateTypeIndex as NamedNode , agent : user } ] : [ ]
@@ -109,13 +127,35 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
109127 return scopedAppInstances . map ( scoped => scoped . instance )
110128 }
111129
130+ function docDirUri ( node : NamedNode ) : string | null {
131+ const doc = node . doc ( )
132+ const dir = doc . dir ( )
133+ if ( dir ?. uri ) return dir . uri
134+ const docUri = doc . uri
135+ if ( ! docUri ) {
136+ debug . log ( `docDirUri: missing doc uri for ${ node ?. uri } ` )
137+ return null
138+ }
139+ const withoutFragment = docUri . split ( '#' ) [ 0 ]
140+ const lastSlash = withoutFragment . lastIndexOf ( '/' )
141+ if ( lastSlash === - 1 ) {
142+ debug . log ( `docDirUri: no slash in doc uri ${ docUri } ` )
143+ return null
144+ }
145+ return withoutFragment . slice ( 0 , lastSlash + 1 )
146+ }
147+
112148 function suggestPublicTypeIndex ( me : NamedNode ) {
113- return sym ( me . doc ( ) . dir ( ) ?. uri + 'publicTypeIndex.ttl' )
149+ const dirUri = docDirUri ( me )
150+ if ( ! dirUri ) throw new Error ( `suggestPublicTypeIndex: Cannot derive directory for ${ me . uri } ` )
151+ return sym ( dirUri + 'publicTypeIndex.ttl' )
114152 }
115153 // Note this one is based off the pref file not the profile
116154
117155 function suggestPrivateTypeIndex ( preferencesFile : NamedNode ) {
118- return sym ( preferencesFile . doc ( ) . dir ( ) ?. uri + 'privateTypeIndex.ttl' )
156+ const dirUri = docDirUri ( preferencesFile )
157+ if ( ! dirUri ) throw new Error ( `suggestPrivateTypeIndex: Cannot derive directory for ${ preferencesFile . uri } ` )
158+ return sym ( dirUri + 'privateTypeIndex.ttl' )
119159 }
120160
121161 /*
0 commit comments