Skip to content

Commit ce2f903

Browse files
authored
iri#issue
Iri#issue
2 parents 8040431 + bad8dd8 commit ce2f903

File tree

3 files changed

+51
-11
lines changed

3 files changed

+51
-11
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "solid-logic",
3-
"version": "4.0.2",
3+
"version": "4.0.3",
44
"description": "Core business logic of SolidOS",
55
"type": "module",
66
"main": "dist/solid-logic.js",

src/typeIndex/typeIndexLogic.ts

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)