solid-logic 1.3.17-2bf19bb6 → 1.3.17-2d62034f

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 (119) hide show
  1. package/lib/acl/aclLogic.d.ts +12 -30
  2. package/lib/acl/aclLogic.d.ts.map +1 -1
  3. package/lib/acl/aclLogic.js +152 -119
  4. package/lib/acl/aclLogic.js.map +1 -1
  5. package/lib/authn/SolidAuthnLogic.d.ts.map +1 -1
  6. package/lib/authn/SolidAuthnLogic.js +3 -3
  7. package/lib/authn/SolidAuthnLogic.js.map +1 -1
  8. package/lib/chat/chatLogic.d.ts +16 -0
  9. package/lib/chat/chatLogic.d.ts.map +1 -0
  10. package/lib/chat/{ChatLogic.js → chatLogic.js} +82 -87
  11. package/lib/chat/chatLogic.js.map +1 -0
  12. package/lib/inbox/inboxLogic.d.ts +7 -0
  13. package/lib/inbox/inboxLogic.d.ts.map +1 -0
  14. package/lib/inbox/{InboxLogic.js → inboxLogic.js} +58 -64
  15. package/lib/inbox/inboxLogic.js.map +1 -0
  16. package/lib/index.d.ts +18 -9
  17. package/lib/index.d.ts.map +1 -1
  18. package/lib/index.js +76 -22
  19. package/lib/index.js.map +1 -1
  20. package/lib/logic/CustomError.d.ts +4 -0
  21. package/lib/logic/CustomError.d.ts.map +1 -1
  22. package/lib/logic/CustomError.js +17 -1
  23. package/lib/logic/CustomError.js.map +1 -1
  24. package/lib/logic/SolidLogic.d.ts +8 -34
  25. package/lib/logic/SolidLogic.d.ts.map +1 -1
  26. package/lib/logic/SolidLogic.js +16 -250
  27. package/lib/logic/SolidLogic.js.map +1 -1
  28. package/lib/logic/solidLogicSingleton.js +1 -1
  29. package/lib/logic/solidLogicSingleton.js.map +1 -1
  30. package/lib/logic/solidLogicSingletonNew.d.ts +67 -0
  31. package/lib/logic/solidLogicSingletonNew.d.ts.map +1 -0
  32. package/lib/logic/solidLogicSingletonNew.js +219 -0
  33. package/lib/logic/solidLogicSingletonNew.js.map +1 -0
  34. package/lib/profile/profileLogic.d.ts +11 -0
  35. package/lib/profile/profileLogic.d.ts.map +1 -0
  36. package/lib/profile/profileLogic.js +246 -0
  37. package/lib/profile/profileLogic.js.map +1 -0
  38. package/lib/typeIndex/typeIndexLogic.d.ts +18 -21
  39. package/lib/typeIndex/typeIndexLogic.d.ts.map +1 -1
  40. package/lib/typeIndex/typeIndexLogic.js +304 -296
  41. package/lib/typeIndex/typeIndexLogic.js.map +1 -1
  42. package/lib/types.d.ts +17 -0
  43. package/lib/types.d.ts.map +1 -1
  44. package/lib/util/containerLogic.d.ts +11 -0
  45. package/lib/util/containerLogic.d.ts.map +1 -0
  46. package/lib/{profile/ProfileLogic.js → util/containerLogic.js} +53 -44
  47. package/lib/util/containerLogic.js.map +1 -0
  48. package/lib/util/ns.d.ts +2 -0
  49. package/lib/util/ns.d.ts.map +1 -0
  50. package/lib/util/ns.js +34 -0
  51. package/lib/util/ns.js.map +1 -0
  52. package/lib/util/utilityLogic.d.ts +15 -0
  53. package/lib/util/utilityLogic.d.ts.map +1 -0
  54. package/lib/util/utilityLogic.js +272 -0
  55. package/lib/util/utilityLogic.js.map +1 -0
  56. package/lib/util/utils.d.ts +8 -0
  57. package/lib/util/utils.d.ts.map +1 -0
  58. package/lib/util/utils.js +48 -0
  59. package/lib/util/utils.js.map +1 -0
  60. package/package.json +3 -1
  61. package/src/acl/aclLogic.ts +136 -118
  62. package/src/authn/SolidAuthnLogic.ts +8 -7
  63. package/src/chat/chatLogic.ts +225 -0
  64. package/src/inbox/inboxLogic.ts +57 -0
  65. package/src/index.ts +124 -20
  66. package/src/logic/CustomError.ts +5 -1
  67. package/src/logic/SolidLogic.ts +30 -211
  68. package/src/logic/solidLogicSingleton.ts +1 -1
  69. package/src/logic/solidLogicSingletonNew.ts +210 -0
  70. package/src/profile/profileLogic.ts +125 -0
  71. package/src/typeIndex/typeIndexLogic.ts +175 -182
  72. package/src/types.ts +7 -3
  73. package/src/util/containerLogic.ts +54 -0
  74. package/src/util/ns.ts +5 -0
  75. package/src/util/utilityLogic.ts +155 -0
  76. package/src/util/utils.ts +52 -0
  77. package/test/aclLogic.test.ts +13 -4
  78. package/test/chatLogic.test.ts +70 -71
  79. package/test/container.test.ts +56 -0
  80. package/test/helpers/dataSetup.ts +134 -0
  81. package/test/helpers/setup.ts +4 -0
  82. package/test/inboxLogic.test.ts +39 -38
  83. package/test/logic.test.ts +10 -9
  84. package/test/profileLogic.test.ts +246 -0
  85. package/test/typeIndexLogic.test.ts +488 -30
  86. package/test/utilityLogic.test.ts +172 -126
  87. package/test/utils.test.ts +32 -0
  88. package/lib/chat/ChatLogic.d.ts +0 -26
  89. package/lib/chat/ChatLogic.d.ts.map +0 -1
  90. package/lib/chat/ChatLogic.js.map +0 -1
  91. package/lib/chat/determineChatContainer.d.ts +0 -3
  92. package/lib/chat/determineChatContainer.d.ts.map +0 -1
  93. package/lib/chat/determineChatContainer.js +0 -12
  94. package/lib/chat/determineChatContainer.js.map +0 -1
  95. package/lib/discovery/discoveryLogic.d.ts +0 -13
  96. package/lib/discovery/discoveryLogic.d.ts.map +0 -1
  97. package/lib/discovery/discoveryLogic.js +0 -203
  98. package/lib/discovery/discoveryLogic.js.map +0 -1
  99. package/lib/inbox/InboxLogic.d.ts +0 -18
  100. package/lib/inbox/InboxLogic.d.ts.map +0 -1
  101. package/lib/inbox/InboxLogic.js.map +0 -1
  102. package/lib/profile/ProfileLogic.d.ts +0 -13
  103. package/lib/profile/ProfileLogic.d.ts.map +0 -1
  104. package/lib/profile/ProfileLogic.js.map +0 -1
  105. package/lib/util/UtilityLogic.d.ts +0 -33
  106. package/lib/util/UtilityLogic.d.ts.map +0 -1
  107. package/lib/util/UtilityLogic.js +0 -240
  108. package/lib/util/UtilityLogic.js.map +0 -1
  109. package/lib/util/uri.d.ts +0 -3
  110. package/lib/util/uri.d.ts.map +0 -1
  111. package/lib/util/uri.js +0 -9
  112. package/lib/util/uri.js.map +0 -1
  113. package/src/chat/ChatLogic.ts +0 -244
  114. package/src/chat/determineChatContainer.ts +0 -14
  115. package/src/discovery/discoveryLogic.ts +0 -90
  116. package/src/inbox/InboxLogic.ts +0 -66
  117. package/src/profile/ProfileLogic.ts +0 -44
  118. package/src/util/UtilityLogic.ts +0 -161
  119. package/src/util/uri.ts +0 -5
@@ -1,90 +0,0 @@
1
- import { NamedNode, Namespace, LiveStore } from "rdflib";
2
-
3
- type TypeIndex = { label: string, index: NamedNode, agent: NamedNode } ;
4
-
5
- const ns ={
6
- solid: Namespace('http://www.w3.org/ns/solid/terms#'),
7
- space: Namespace('http://www.w3.org/ns/pim/space#')
8
- }
9
-
10
- export async function loadProfile(store: LiveStore, user) {
11
- if (!user) {
12
- throw new Error(`loadProfile: no user given.`)
13
- }
14
- try {
15
- await store.fetcher.load(user.doc())
16
- } catch (err) {
17
- throw new Error(`Unable to load profile of user <${user}>: ${err}`)
18
- }
19
- return user.doc()
20
- }
21
-
22
- export async function loadPreferences(store: LiveStore, user): Promise <NamedNode | undefined > {
23
- const profile = await loadProfile(store as LiveStore, user)
24
- const preferencesFile = store.any(user, ns.space('preferencesFile'), undefined, profile)
25
- if (!preferencesFile) {
26
- // throw new Error(`USer ${user} has no pointer in profile to preferences file.`)
27
- return undefined
28
- }
29
- try {
30
- store.fetcher.load(preferencesFile as NamedNode)
31
- } catch (err) { // Mabeb a permission propblem or origin problem
32
- return undefined
33
- // throw new Error(`Unable to load preferences file ${preferencesFile} of user <${user}>: ${err}`)
34
- }
35
- return preferencesFile as NamedNode
36
- }
37
-
38
- export async function loadTypeIndexesFor(store: LiveStore, user:NamedNode): Promise<Array<TypeIndex>> {
39
- if (!user) throw new Error(`loadTypeIndexesFor: No user given`)
40
- const profile = await loadProfile(store, user)
41
- const publicTypeIndex = store.any(user, ns.solid('publicTypeIndex'), undefined, profile)
42
- if (publicTypeIndex) {
43
- try {
44
- await store.fetcher.load(publicTypeIndex as NamedNode)
45
- } catch {
46
- // never mind
47
- }
48
- }
49
- const pub = publicTypeIndex ? [ { label: 'public', index: publicTypeIndex as NamedNode, agent: user } ] : []
50
-
51
- const preferencesFile = await loadPreferences(store, user)
52
- if (preferencesFile) { // watch out - can be in either as spec was not clear
53
- const privateTypeIndexes = store.each(user, ns.solid('privateTypeIndex'), undefined, preferencesFile as NamedNode)
54
- .concat(store.each(user, ns.solid('privateTypeIndex'), undefined, profile))
55
- const priv = privateTypeIndexes.length > 0 ? [ { label: 'priSo @@@@@vate', index: privateTypeIndexes[0] as NamedNode, agent: user } ] : []
56
- return pub.concat(priv)
57
- }
58
- return pub
59
- }
60
-
61
- export async function loadCommunityTypeIndexes (store:LiveStore, user:NamedNode): Promise<TypeIndex[][]> {
62
- const preferencesFile = await loadPreferences(store, user)
63
- if (preferencesFile) {
64
- const communities = store.each(user, ns.solid('community'), undefined, preferencesFile as NamedNode)
65
- const communityTypeIndexesPromise = communities.map(async community => await loadTypeIndexesFor(store, community as NamedNode))
66
- const result1 = Promise.all(communityTypeIndexesPromise)
67
- // const result2 = Promise.all(result1)
68
- // const flat = result2.flat()
69
- return result1
70
- // const communityTypeIndexes = await Promise.all(communityTypeIndexesPromise)
71
- /*
72
- let result = [] as TypeIndex[]
73
- for(const community of communities) {
74
- result = result.concat(await loadTypeIndexesFor(store, community as NamedNode)) as TypeIndex[] // @@ how oto make functional with async?
75
- }
76
- */
77
- // return communityTypeIndexesPromise.resolve()
78
- }
79
- return []
80
- }
81
-
82
- export async function loadAllTypeIndexes (store:LiveStore, user:NamedNode) {
83
- return (await loadTypeIndexesFor(store, user)).concat((await loadCommunityTypeIndexes(store, user)).flat())
84
- }
85
-
86
- /*
87
- export async function getAppInstances (store:LiveStore, klass: NamedNode) {
88
-
89
- }
90
- */
@@ -1,66 +0,0 @@
1
- import { NamedNode, LiveStore } from "rdflib";
2
- import { ProfileLogic } from "../profile/ProfileLogic";
3
- import { SolidNamespace } from "../types";
4
- import { UtilityLogic } from "../util/UtilityLogic";
5
-
6
- /**
7
- * Inbox-related logic
8
- */
9
- export class InboxLogic {
10
- store: LiveStore;
11
- ns: SolidNamespace;
12
- profile: ProfileLogic;
13
- util: UtilityLogic;
14
-
15
- constructor(store: LiveStore, ns: SolidNamespace, profile: ProfileLogic, util: UtilityLogic) {
16
- this.store = store;
17
- this.ns = ns;
18
- this.profile = profile;
19
- this.util = util;
20
- }
21
-
22
- async getNewMessages(
23
- user?: NamedNode
24
- ): Promise<string[]> {
25
- if (!user) {
26
- user = await this.profile.loadMe();
27
- }
28
- const inbox = await this.profile.getMainInbox(user);
29
- const urls = await this.util.getContainerMembers(inbox.value);
30
- return urls.filter(url => !this.util.isContainer(url));
31
- }
32
- async createInboxFor(peerWebId: string, nick: string) {
33
- const myWebId: NamedNode = (await this.profile.loadMe());
34
- const podRoot: NamedNode = await this.profile.getPodRoot(myWebId);
35
- const ourInbox = `${podRoot.value}p2p-inboxes/${encodeURIComponent(nick)}/`;
36
- await this.util.createContainer(ourInbox);
37
- const aclDocUrl = await this.util.findAclDocUrl(ourInbox);
38
- await this.util.setSinglePeerAccess({
39
- ownerWebId: myWebId.value,
40
- peerWebId,
41
- accessToModes: 'acl:Append',
42
- target: ourInbox
43
- });
44
- return ourInbox;
45
- }
46
- async markAsRead(url: string, date: Date) {
47
- const downloaded = await this.util.underlyingFetch.fetch(url);
48
- if (downloaded.status !== 200) {
49
- throw new Error(`Not OK! ${url}`);
50
- }
51
- const archiveUrl = this.util.getArchiveUrl(url, date);
52
- const options = {
53
- method: 'PUT',
54
- body: await downloaded.text(),
55
- headers: [
56
- [ 'Content-Type', downloaded.headers.get('Content-Type') || 'application/octet-stream' ]
57
- ]
58
- };
59
- const uploaded = await this.util.underlyingFetch.fetch(archiveUrl, options);
60
- if (uploaded.status.toString()[0] === '2') {
61
- await this.store.fetcher?._fetch(url, {
62
- method: 'DELETE'
63
- });
64
- }
65
- }
66
- }
@@ -1,44 +0,0 @@
1
- import { NamedNode, LiveStore } from "rdflib";
2
- import { AuthnLogic, SolidNamespace } from "../types";
3
-
4
- export class ProfileLogic {
5
- store: LiveStore;
6
- ns: SolidNamespace;
7
- authn: AuthnLogic;
8
-
9
- constructor(store: LiveStore, ns: SolidNamespace, authn: AuthnLogic) {
10
- this.store = store;
11
- this.ns = ns;
12
- this.authn = authn;
13
- }
14
-
15
- async loadMe(): Promise<NamedNode> {
16
- const me = this.authn.currentUser();
17
- if (me === null) {
18
- throw new Error("Current user not found! Not logged in?");
19
- }
20
- await this.store.fetcher?.load(me.doc());
21
- return me;
22
- }
23
-
24
- getPodRoot(user: NamedNode): NamedNode {
25
- const podRoot = this.findStorage(user);
26
- if (!podRoot) {
27
- throw new Error("User pod root not found!");
28
- }
29
- return podRoot as NamedNode;
30
- }
31
-
32
- async getMainInbox(user: NamedNode): Promise<NamedNode> {
33
- await this.store.fetcher?.load(user);
34
- const mainInbox = this.store.any(user, this.ns.ldp("inbox"), undefined, user.doc());
35
- if (!mainInbox) {
36
- throw new Error("User main inbox not found!");
37
- }
38
- return mainInbox as NamedNode;
39
- }
40
-
41
- private findStorage(me: NamedNode) {
42
- return this.store.any(me, this.ns.space("storage"), undefined, me.doc());
43
- }
44
- }
@@ -1,161 +0,0 @@
1
- import { NamedNode, Statement, sym, LiveStore } from "rdflib";
2
- import { SolidNamespace } from "../types";
3
-
4
- export const ACL_LINK = sym(
5
- "http://www.iana.org/assignments/link-relations/acl"
6
- );
7
-
8
- /**
9
- * Utility-related logic
10
- */
11
- export class UtilityLogic {
12
- store: LiveStore;
13
- ns: SolidNamespace;
14
- underlyingFetch: { fetch: (url: string, options?: any) => any };
15
-
16
- constructor(store: LiveStore, ns: SolidNamespace, underlyingFetch: { fetch: (url: string, options?: any) => any }) {
17
- this.store = store;
18
- this.ns = ns;
19
- this.underlyingFetch = underlyingFetch;
20
- }
21
-
22
- async findAclDocUrl(url: string) {
23
- const doc = this.store.sym(url);
24
- await this.store.fetcher?.load(doc);
25
- const docNode = this.store.any(doc, ACL_LINK);
26
- if (!docNode) {
27
- throw new Error(`No ACL link discovered for ${url}`);
28
- }
29
- return docNode.value;
30
- }
31
-
32
- // Copied from https://github.com/solidos/web-access-control-tests/blob/v3.0.0/test/surface/delete.test.ts#L5
33
- async setSinglePeerAccess(options: {
34
- ownerWebId: string,
35
- peerWebId: string,
36
- accessToModes?: string,
37
- defaultModes?: string,
38
- target: string
39
- }) {
40
- let str = [
41
- '@prefix acl: <http://www.w3.org/ns/auth/acl#>.',
42
- '',
43
- `<#alice> a acl:Authorization;\n acl:agent <${options.ownerWebId}>;`,
44
- ` acl:accessTo <${options.target}>;`,
45
- ` acl:default <${options.target}>;`,
46
- ' acl:mode acl:Read, acl:Write, acl:Control.',
47
- ''
48
- ].join('\n')
49
- if (options.accessToModes) {
50
- str += [
51
- '<#bobAccessTo> a acl:Authorization;',
52
- ` acl:agent <${options.peerWebId}>;`,
53
- ` acl:accessTo <${options.target}>;`,
54
- ` acl:mode ${options.accessToModes}.`,
55
- ''
56
- ].join('\n')
57
- }
58
- if (options.defaultModes) {
59
- str += [
60
- '<#bobDefault> a acl:Authorization;',
61
- ` acl:agent <${options.peerWebId}>;`,
62
- ` acl:default <${options.target}>;`,
63
- ` acl:mode ${options.defaultModes}.`,
64
- ''
65
- ].join('\n')
66
- }
67
- const aclDocUrl = await this.findAclDocUrl(options.target);
68
- return this.underlyingFetch.fetch(aclDocUrl, {
69
- method: 'PUT',
70
- body: str,
71
- headers: [
72
- [ 'Content-Type', 'text/turtle' ]
73
- ]
74
- });
75
- }
76
-
77
- async loadDoc(doc: NamedNode): Promise<void> {
78
- // Load a document into the knowledge base (fetcher.store)
79
- // withCredentials: Web arch should let us just load by turning off creds helps CORS
80
- // reload: Gets around a specific old Chrome bug caching/origin/cors
81
- // console.log('loading', profileDocument)
82
- if (!this.store.fetcher) {
83
- throw new Error("Cannot load doc, have no fetcher");
84
- }
85
- await this.store.fetcher.load(doc, {
86
- withCredentials: false, // @@ BUT this won't work when logged in an accessing private stuff!
87
- cache: "reload",
88
- });
89
- // console.log('loaded', profileDocument, this.store)
90
- }
91
-
92
- isContainer(url: string) {
93
- return url.substr(-1) === "/";
94
- }
95
-
96
- async createContainer(url: string) {
97
- if (!this.isContainer(url)) {
98
- throw new Error(`Not a container URL ${url}`);
99
- }
100
- // Copied from https://github.com/solidos/solid-crud-tests/blob/v3.1.0/test/surface/create-container.test.ts#L56-L64
101
- const result = await this.underlyingFetch.fetch(url, {
102
- method: "PUT",
103
- headers: {
104
- "Content-Type": "text/turtle",
105
- "If-None-Match": "*",
106
- Link: '<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"', // See https://github.com/solidos/node-solid-server/issues/1465
107
- },
108
- body: " ", // work around https://github.com/michielbdejong/community-server/issues/4#issuecomment-776222863
109
- });
110
- if (result.status.toString()[0] !== '2') {
111
- throw new Error(`Not OK: got ${result.status} response while creating container at ${url}`);
112
- }
113
- }
114
-
115
- getContainerElements(containerNode: NamedNode): NamedNode[] {
116
- return this.store
117
- .statementsMatching(
118
- containerNode,
119
- this.store.sym("http://www.w3.org/ns/ldp#contains"),
120
- undefined,
121
- containerNode.doc()
122
- )
123
- .map((st: Statement) => st.object as NamedNode);
124
- }
125
-
126
- async getContainerMembers(containerUrl: string): Promise<string[]> {
127
- const containerNode = this.store.sym(containerUrl);
128
- await this.store.fetcher?.load(containerNode);
129
- const nodes = this.getContainerElements(containerNode);
130
- return nodes.map(node => node.value);
131
- }
132
-
133
- async recursiveDelete(url: string) {
134
- try {
135
- if (this.isContainer(url)) {
136
- const aclDocUrl = await this.findAclDocUrl(url);
137
- await this.underlyingFetch.fetch(aclDocUrl, { method: "DELETE" });
138
- const containerMembers = await this.getContainerMembers(url);
139
- await Promise.all(
140
- containerMembers.map((url) => this.recursiveDelete(url))
141
- );
142
- }
143
- return this.underlyingFetch.fetch(url, { method: "DELETE" });
144
- } catch (e) {
145
- // console.log(`Please manually remove ${url} from your system under test.`, e);
146
- }
147
- }
148
-
149
- clearStore() {
150
- this.store.statements.slice().forEach(this.store.remove.bind(this.store));
151
- }
152
-
153
- getArchiveUrl(baseUrl: string, date: Date) {
154
- const year = date.getUTCFullYear();
155
- const month = ('0' + (date.getUTCMonth()+1)).slice(-2);
156
- const day = ('0' + (date.getUTCDate())).slice(-2);
157
- const parts = baseUrl.split('/');
158
- const filename = parts[parts.length -1 ];
159
- return new URL(`./archive/${year}/${month}/${day}/${filename}`, baseUrl).toString();
160
- }
161
- }
package/src/util/uri.ts DELETED
@@ -1,5 +0,0 @@
1
- import { NamedNode, sym } from "rdflib";
2
-
3
- export function newThing(doc: NamedNode): NamedNode {
4
- return sym(doc.uri + "#" + "id" + ("" + Date.now()));
5
- }