@@ -19,14 +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 )
23- let publicTypeIndex
22+ let suggestion : NamedNode | null = null
2423 try {
25- publicTypeIndex = await utilityLogic . followOrCreateLink ( user , ns . solid ( 'publicTypeIndex' ) as NamedNode , suggestion , profile )
24+ suggestion = suggestPublicTypeIndex ( user )
2625 } catch ( err ) {
27- const message = `User ${ user } has no pointer in profile to publicTypeIndex file .`
26+ const message = `User ${ user } has no usable profile document directory for publicTypeIndex .`
2827 debug . warn ( message )
2928 }
29+ let publicTypeIndex
30+ if ( suggestion ) {
31+ try {
32+ publicTypeIndex = await utilityLogic . followOrCreateLink ( user , ns . solid ( 'publicTypeIndex' ) as NamedNode , suggestion , profile )
33+ } catch ( err ) {
34+ const message = `User ${ user } has no pointer in profile to publicTypeIndex file.`
35+ debug . warn ( message )
36+ }
37+ }
3038 const publicScopes = publicTypeIndex ? [ { label : 'public' , index : publicTypeIndex as NamedNode , agent : user } ] : [ ]
3139
3240 let preferencesFile
@@ -40,11 +48,19 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
4048 if ( preferencesFile ) { // watch out - can be in either as spec was not clear. Legacy is profile.
4149 // If there is a legacy one linked from the profile, use that.
4250 // Otherwiae use or make one linked from Preferences
43- const suggestedPrivateTypeIndex = suggestPrivateTypeIndex ( preferencesFile )
51+ let suggestedPrivateTypeIndex : NamedNode | null = null
52+ try {
53+ suggestedPrivateTypeIndex = suggestPrivateTypeIndex ( preferencesFile )
54+ } catch ( err ) {
55+ const message = `User ${ user } has no usable preferences document directory for privateTypeIndex.`
56+ debug . warn ( message )
57+ }
4458 let privateTypeIndex
4559 try {
4660 privateTypeIndex = store . any ( user , ns . solid ( 'privateTypeIndex' ) , undefined , profile ) ||
47- await utilityLogic . followOrCreateLink ( user , ns . solid ( 'privateTypeIndex' ) as NamedNode , suggestedPrivateTypeIndex , preferencesFile )
61+ ( suggestedPrivateTypeIndex
62+ ? await utilityLogic . followOrCreateLink ( user , ns . solid ( 'privateTypeIndex' ) as NamedNode , suggestedPrivateTypeIndex , preferencesFile )
63+ : null )
4864 } catch ( err ) {
4965 const message = `User ${ user } has no pointer in preference file to privateTypeIndex file.`
5066 debug . warn ( message )
@@ -109,13 +125,35 @@ export function createTypeIndexLogic(store, authn, profileLogic, utilityLogic):
109125 return scopedAppInstances . map ( scoped => scoped . instance )
110126 }
111127
128+ function docDirUri ( node : NamedNode ) : string | null {
129+ const doc = node . doc ( )
130+ const dir = doc . dir ( )
131+ if ( dir ?. uri ) return dir . uri
132+ const docUri = doc . uri
133+ if ( ! docUri ) {
134+ debug . log ( `docDirUri: missing doc uri for ${ node ?. uri } ` )
135+ return null
136+ }
137+ const withoutFragment = docUri . split ( '#' ) [ 0 ]
138+ const lastSlash = withoutFragment . lastIndexOf ( '/' )
139+ if ( lastSlash === - 1 ) {
140+ debug . log ( `docDirUri: no slash in doc uri ${ docUri } ` )
141+ return null
142+ }
143+ return withoutFragment . slice ( 0 , lastSlash + 1 )
144+ }
145+
112146 function suggestPublicTypeIndex ( me : NamedNode ) {
113- return sym ( me . doc ( ) . dir ( ) ?. uri + 'publicTypeIndex.ttl' )
147+ const dirUri = docDirUri ( me )
148+ if ( ! dirUri ) throw new Error ( `suggestPublicTypeIndex: Cannot derive directory for ${ me . uri } ` )
149+ return sym ( dirUri + 'publicTypeIndex.ttl' )
114150 }
115151 // Note this one is based off the pref file not the profile
116152
117153 function suggestPrivateTypeIndex ( preferencesFile : NamedNode ) {
118- return sym ( preferencesFile . doc ( ) . dir ( ) ?. uri + 'privateTypeIndex.ttl' )
154+ const dirUri = docDirUri ( preferencesFile )
155+ if ( ! dirUri ) throw new Error ( `suggestPrivateTypeIndex: Cannot derive directory for ${ preferencesFile . uri } ` )
156+ return sym ( dirUri + 'privateTypeIndex.ttl' )
119157 }
120158
121159 /*
0 commit comments