solid-logic 1.3.12 → 1.3.13
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.
- package/lib/chat/ChatLogic.d.ts +2 -2
- package/lib/chat/ChatLogic.d.ts.map +1 -1
- package/lib/chat/ChatLogic.js +37 -32
- package/lib/chat/ChatLogic.js.map +1 -1
- package/lib/inbox/InboxLogic.d.ts +2 -2
- package/lib/inbox/InboxLogic.d.ts.map +1 -1
- package/lib/inbox/InboxLogic.js +14 -13
- package/lib/inbox/InboxLogic.js.map +1 -1
- package/lib/index.d.ts +2 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/profile/ProfileLogic.d.ts +2 -2
- package/lib/profile/ProfileLogic.d.ts.map +1 -1
- package/lib/profile/ProfileLogic.js +10 -8
- package/lib/profile/ProfileLogic.js.map +1 -1
- package/lib/util/UtilityLogic.d.ts +2 -2
- package/lib/util/UtilityLogic.d.ts.map +1 -1
- package/lib/util/UtilityLogic.js +10 -8
- package/lib/util/UtilityLogic.js.map +1 -1
- package/package.json +2 -2
- package/src/chat/ChatLogic.ts +12 -12
- package/src/inbox/InboxLogic.ts +3 -3
- package/src/index.ts +3 -2
- package/src/profile/ProfileLogic.ts +4 -4
- package/src/util/UtilityLogic.ts +4 -4
- package/lib/index-alain.d.ts +0 -75
- package/lib/index-alain.d.ts.map +0 -1
- package/lib/index-alain.js +0 -398
- package/lib/index-alain.js.map +0 -1
- package/lib/util/UtilityLogic-alain.d.ts +0 -32
- package/lib/util/UtilityLogic-alain.d.ts.map +0 -1
- package/lib/util/UtilityLogic-alain.js +0 -248
- package/lib/util/UtilityLogic-alain.js.map +0 -1
- package/src/index-alain.txt +0 -316
- package/src/util/UtilityLogic-alain.txt +0 -181
package/src/chat/ChatLogic.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { NamedNode, Node, st, term } from "rdflib";
|
|
2
|
-
import {
|
|
1
|
+
import { LiveStore, NamedNode, Node, st, term } from "rdflib";
|
|
2
|
+
import { SolidNamespace } from "../index";
|
|
3
3
|
import { ProfileLogic } from "../profile/ProfileLogic";
|
|
4
4
|
import { newThing } from "../uri";
|
|
5
5
|
import { determineChatContainer } from "./determineChatContainer";
|
|
@@ -38,7 +38,7 @@ export class ChatLogic {
|
|
|
38
38
|
// Some servers don't present a Link http response header
|
|
39
39
|
// if the container doesn't exist yet, so refetch the container
|
|
40
40
|
// now that it has been created:
|
|
41
|
-
await this.store.fetcher
|
|
41
|
+
await this.store.fetcher?.load(chatContainer);
|
|
42
42
|
|
|
43
43
|
// FIXME: check the Why value on this quad:
|
|
44
44
|
const chatAclDoc = this.store.any(
|
|
@@ -66,7 +66,7 @@ export class ChatLogic {
|
|
|
66
66
|
acl:mode
|
|
67
67
|
acl:Read, acl:Append.
|
|
68
68
|
`;
|
|
69
|
-
await this.store.fetcher
|
|
69
|
+
await this.store.fetcher?.webOperation("PUT", chatAclDoc.value, {
|
|
70
70
|
data: aclBody,
|
|
71
71
|
contentType: "text/turtle",
|
|
72
72
|
});
|
|
@@ -81,7 +81,7 @@ export class ChatLogic {
|
|
|
81
81
|
if (!privateTypeIndex) {
|
|
82
82
|
throw new Error("Private type index not found!");
|
|
83
83
|
}
|
|
84
|
-
await this.store.fetcher
|
|
84
|
+
await this.store.fetcher?.load(privateTypeIndex);
|
|
85
85
|
const reg = newThing(privateTypeIndex);
|
|
86
86
|
const ins = [
|
|
87
87
|
st(
|
|
@@ -99,7 +99,7 @@ export class ChatLogic {
|
|
|
99
99
|
st(reg, this.ns.solid("instance"), chatThing, privateTypeIndex.doc()),
|
|
100
100
|
];
|
|
101
101
|
await new Promise((resolve, reject) => {
|
|
102
|
-
this.store.updater
|
|
102
|
+
this.store.updater?.update([], ins, function (_uri, ok, errm) {
|
|
103
103
|
if (!ok) {
|
|
104
104
|
reject(new Error(errm));
|
|
105
105
|
} else {
|
|
@@ -115,7 +115,7 @@ export class ChatLogic {
|
|
|
115
115
|
const chatContainer = determineChatContainer(invitee, podRoot);
|
|
116
116
|
let exists = true;
|
|
117
117
|
try {
|
|
118
|
-
await this.store.fetcher
|
|
118
|
+
await this.store.fetcher?.load(
|
|
119
119
|
new NamedNode(chatContainer.value + "index.ttl#this")
|
|
120
120
|
);
|
|
121
121
|
} catch (e) {
|
|
@@ -165,7 +165,7 @@ export class ChatLogic {
|
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
return new Promise(function (resolve, reject) {
|
|
168
|
-
updater
|
|
168
|
+
updater?.put(
|
|
169
169
|
newChatDoc,
|
|
170
170
|
kb.statementsMatching(undefined, undefined, undefined, newChatDoc),
|
|
171
171
|
"text/turtle",
|
|
@@ -213,7 +213,7 @@ export class ChatLogic {
|
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
private async sendInvite(invitee: NamedNode, chatThing: NamedNode) {
|
|
216
|
-
await this.store.fetcher
|
|
216
|
+
await this.store.fetcher?.load(invitee.doc());
|
|
217
217
|
const inviteeInbox = this.store.any(
|
|
218
218
|
invitee,
|
|
219
219
|
this.ns.ldp("inbox"),
|
|
@@ -228,7 +228,7 @@ export class ChatLogic {
|
|
|
228
228
|
${this.ns.rdf("seeAlso")} <${chatThing.value}> .
|
|
229
229
|
`;
|
|
230
230
|
|
|
231
|
-
const inviteResponse = await this.store.fetcher
|
|
231
|
+
const inviteResponse = await this.store.fetcher?.webOperation(
|
|
232
232
|
"POST",
|
|
233
233
|
inviteeInbox.value,
|
|
234
234
|
{
|
|
@@ -236,9 +236,9 @@ ${this.ns.rdf("seeAlso")} <${chatThing.value}> .
|
|
|
236
236
|
contentType: "text/turtle",
|
|
237
237
|
}
|
|
238
238
|
);
|
|
239
|
-
const locationStr = inviteResponse
|
|
239
|
+
const locationStr = inviteResponse?.headers.get("location");
|
|
240
240
|
if (!locationStr) {
|
|
241
|
-
throw new Error(`Invite sending returned a ${inviteResponse
|
|
241
|
+
throw new Error(`Invite sending returned a ${inviteResponse?.status}`);
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
244
|
}
|
package/src/inbox/InboxLogic.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// import { v4 as uuid } from "uuid";
|
|
2
|
-
import { NamedNode, Node, st, term } from "rdflib";
|
|
3
|
-
import {
|
|
2
|
+
import { LiveStore, NamedNode, Node, st, term } from "rdflib";
|
|
3
|
+
import { SolidNamespace } from "../index";
|
|
4
4
|
import { ProfileLogic } from "../profile/ProfileLogic";
|
|
5
5
|
import { UtilityLogic } from "../util/UtilityLogic";
|
|
6
6
|
// import { newThing } from "../uri";
|
|
@@ -70,7 +70,7 @@ export class InboxLogic {
|
|
|
70
70
|
};
|
|
71
71
|
const uploaded = await this.util.fetcher.fetch(archiveUrl, options);
|
|
72
72
|
if (uploaded.status.toString()[0] === '2') {
|
|
73
|
-
await this.store.fetcher
|
|
73
|
+
await this.store.fetcher?._fetch(url, {
|
|
74
74
|
method: 'DELETE'
|
|
75
75
|
});
|
|
76
76
|
}
|
package/src/index.ts
CHANGED
|
@@ -10,18 +10,19 @@ import { ChatLogic } from "./chat/ChatLogic";
|
|
|
10
10
|
import * as debug from "./debug";
|
|
11
11
|
import { ProfileLogic } from "./profile/ProfileLogic";
|
|
12
12
|
import { UtilityLogic } from "./util/UtilityLogic";
|
|
13
|
+
import { ConnectedStore, LiveStore } from 'rdflib'
|
|
13
14
|
|
|
14
15
|
export { ACL_LINK } from './util/UtilityLogic';
|
|
15
16
|
|
|
16
17
|
const ns: SolidNamespace = solidNamespace(rdf);
|
|
17
18
|
|
|
18
|
-
interface ConnectedStore extends Store {
|
|
19
|
+
/* interface ConnectedStore extends Store {
|
|
19
20
|
fetcher: Fetcher;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export interface LiveStore extends ConnectedStore {
|
|
23
24
|
updater: UpdateManager;
|
|
24
|
-
}
|
|
25
|
+
} */
|
|
25
26
|
|
|
26
27
|
export interface SolidNamespace {
|
|
27
28
|
[key: string]: (term: string) => NamedNode;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { NamedNode } from "rdflib";
|
|
1
|
+
import { LiveStore, NamedNode } from "rdflib";
|
|
2
2
|
import { AuthnLogic } from "../authn";
|
|
3
|
-
import {
|
|
3
|
+
import { SolidNamespace } from "../index";
|
|
4
4
|
|
|
5
5
|
export class ProfileLogic {
|
|
6
6
|
store: LiveStore;
|
|
@@ -18,7 +18,7 @@ export class ProfileLogic {
|
|
|
18
18
|
if (me === null) {
|
|
19
19
|
throw new Error("Current user not found! Not logged in?");
|
|
20
20
|
}
|
|
21
|
-
await this.store.fetcher
|
|
21
|
+
await this.store.fetcher?.load(me.doc());
|
|
22
22
|
return me;
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -31,7 +31,7 @@ export class ProfileLogic {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
async getMainInbox(user: NamedNode): Promise<NamedNode> {
|
|
34
|
-
await this.store.fetcher
|
|
34
|
+
await this.store.fetcher?.load(user);
|
|
35
35
|
const mainInbox = this.store.any(user, this.ns.ldp("inbox"), undefined, user.doc());
|
|
36
36
|
if (!mainInbox) {
|
|
37
37
|
throw new Error("User main inbox not found!");
|
package/src/util/UtilityLogic.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { NamedNode, Node, st, term, sym, Statement } from "rdflib";
|
|
2
|
-
import {
|
|
1
|
+
import { LiveStore, NamedNode, Node, st, term, sym, Statement } from "rdflib";
|
|
2
|
+
import { SolidNamespace } from "../index";
|
|
3
3
|
import { ProfileLogic } from "../profile/ProfileLogic";
|
|
4
4
|
import { newThing } from "../uri";
|
|
5
5
|
|
|
@@ -33,7 +33,7 @@ export class UtilityLogic {
|
|
|
33
33
|
|
|
34
34
|
async findAclDocUrl(url: string) {
|
|
35
35
|
const doc = this.store.sym(url);
|
|
36
|
-
await this.store.fetcher
|
|
36
|
+
await this.store.fetcher?.load(doc);
|
|
37
37
|
const docNode = this.store.any(doc, ACL_LINK);
|
|
38
38
|
if (!docNode) {
|
|
39
39
|
throw new Error(`No ACL link discovered for ${url}`);
|
|
@@ -137,7 +137,7 @@ export class UtilityLogic {
|
|
|
137
137
|
|
|
138
138
|
async getContainerMembers(containerUrl: string): Promise<string[]> {
|
|
139
139
|
const containerNode = this.store.sym(containerUrl);
|
|
140
|
-
await this.store.fetcher
|
|
140
|
+
await this.store.fetcher?.load(containerNode);
|
|
141
141
|
const nodes = this.getContainerElements(containerNode);
|
|
142
142
|
return nodes.map(node => node.value);
|
|
143
143
|
}
|
package/lib/index-alain.d.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { Session } from "@inrupt/solid-client-authn-browser";
|
|
2
|
-
import * as rdf from "rdflib";
|
|
3
|
-
import { Fetcher, NamedNode, Statement, Store, UpdateManager } from "rdflib";
|
|
4
|
-
import { AuthnLogic } from "./authn";
|
|
5
|
-
import { ChatLogic } from "./chat/ChatLogic";
|
|
6
|
-
import { ProfileLogic } from "./profile/ProfileLogic";
|
|
7
|
-
import { UtilityLogic } from "./util/UtilityLogic";
|
|
8
|
-
export { ACL_LINK } from './util/UtilityLogic';
|
|
9
|
-
interface ConnectedStore extends Store {
|
|
10
|
-
fetcher: Fetcher;
|
|
11
|
-
}
|
|
12
|
-
export interface LiveStore extends ConnectedStore {
|
|
13
|
-
updater: UpdateManager;
|
|
14
|
-
}
|
|
15
|
-
export interface SolidNamespace {
|
|
16
|
-
[key: string]: (term: string) => NamedNode;
|
|
17
|
-
}
|
|
18
|
-
export declare class SolidLogic {
|
|
19
|
-
cache: {
|
|
20
|
-
profileDocument: {
|
|
21
|
-
[WebID: string]: NamedNode;
|
|
22
|
-
};
|
|
23
|
-
preferencesFile: {
|
|
24
|
-
[WebID: string]: NamedNode;
|
|
25
|
-
};
|
|
26
|
-
};
|
|
27
|
-
store: LiveStore;
|
|
28
|
-
me: string | undefined;
|
|
29
|
-
fetcher: {
|
|
30
|
-
fetch: (url: string, options?: any) => any;
|
|
31
|
-
};
|
|
32
|
-
_fetch: Function;
|
|
33
|
-
chat: ChatLogic;
|
|
34
|
-
profile: ProfileLogic;
|
|
35
|
-
authn: AuthnLogic;
|
|
36
|
-
util: UtilityLogic;
|
|
37
|
-
constructor(fetcher: {
|
|
38
|
-
fetch: (url: any, requestInit: any) => any;
|
|
39
|
-
}, solidAuthSession: Session);
|
|
40
|
-
findAclDocUrl(url: string): Promise<string>;
|
|
41
|
-
loadDoc(doc: NamedNode): Promise<void>;
|
|
42
|
-
loadProfile(me: NamedNode): Promise<NamedNode>;
|
|
43
|
-
loadPreferences(me: NamedNode): Promise<NamedNode>;
|
|
44
|
-
getTypeIndex(me: NamedNode | string, preferencesFile: NamedNode | string, isPublic: boolean): NamedNode[];
|
|
45
|
-
getRegistrations(instance: any, theClass: any): rdf.Node[];
|
|
46
|
-
load(doc: NamedNode | NamedNode[] | string): Promise<Response> | Promise<Response[]>;
|
|
47
|
-
loadIndexes(me: NamedNode | string, publicProfile: NamedNode | string | null, preferencesFile: NamedNode | string | null, onWarning?: (_err: Error) => Promise<undefined>): Promise<{
|
|
48
|
-
private: any;
|
|
49
|
-
public: any;
|
|
50
|
-
}>;
|
|
51
|
-
createEmptyRdfDoc(doc: NamedNode, comment: string): Promise<void>;
|
|
52
|
-
updatePromise(del: Array<Statement>, ins?: Array<Statement>): Promise<void>;
|
|
53
|
-
isContainer(url: string): boolean;
|
|
54
|
-
getContainerElements(containerNode: NamedNode): NamedNode[];
|
|
55
|
-
getContainerMembers(containerUrl: string): Promise<string[]>;
|
|
56
|
-
recursiveDelete(url: string): Promise<any>;
|
|
57
|
-
clearStore(): void;
|
|
58
|
-
fetch(url: string, options?: any): Promise<any>;
|
|
59
|
-
}
|
|
60
|
-
declare class CustomError extends Error {
|
|
61
|
-
constructor(message?: string);
|
|
62
|
-
}
|
|
63
|
-
export declare class UnauthorizedError extends CustomError {
|
|
64
|
-
}
|
|
65
|
-
export declare class CrossOriginForbiddenError extends CustomError {
|
|
66
|
-
}
|
|
67
|
-
export declare class SameOriginForbiddenError extends CustomError {
|
|
68
|
-
}
|
|
69
|
-
export declare class NotFoundError extends CustomError {
|
|
70
|
-
}
|
|
71
|
-
export declare class FetchError extends CustomError {
|
|
72
|
-
status: number;
|
|
73
|
-
constructor(status: number, message?: string);
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=index-alain.d.ts.map
|
package/lib/index-alain.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-alain.d.ts","sourceRoot":"","sources":["../src/index-alain.ts"],"names":[],"mappings":"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"}
|
package/lib/index-alain.js
DELETED
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
-
if (k2 === undefined) k2 = k;
|
|
19
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
20
|
-
}) : (function(o, m, k, k2) {
|
|
21
|
-
if (k2 === undefined) k2 = k;
|
|
22
|
-
o[k2] = m[k];
|
|
23
|
-
}));
|
|
24
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
-
}) : function(o, v) {
|
|
27
|
-
o["default"] = v;
|
|
28
|
-
});
|
|
29
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
-
if (mod && mod.__esModule) return mod;
|
|
31
|
-
var result = {};
|
|
32
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
-
__setModuleDefault(result, mod);
|
|
34
|
-
return result;
|
|
35
|
-
};
|
|
36
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
37
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
38
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
39
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
40
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
41
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
42
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
46
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
47
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
48
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
49
|
-
function step(op) {
|
|
50
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
51
|
-
while (_) try {
|
|
52
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
53
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
54
|
-
switch (op[0]) {
|
|
55
|
-
case 0: case 1: t = op; break;
|
|
56
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
57
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
58
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
59
|
-
default:
|
|
60
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
61
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
62
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
63
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
64
|
-
if (t[2]) _.ops.pop();
|
|
65
|
-
_.trys.pop(); continue;
|
|
66
|
-
}
|
|
67
|
-
op = body.call(thisArg, _);
|
|
68
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
69
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
73
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
74
|
-
};
|
|
75
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
76
|
-
exports.FetchError = exports.NotFoundError = exports.SameOriginForbiddenError = exports.CrossOriginForbiddenError = exports.UnauthorizedError = exports.SolidLogic = exports.ACL_LINK = void 0;
|
|
77
|
-
var rdf = __importStar(require("rdflib"));
|
|
78
|
-
var solid_namespace_1 = __importDefault(require("solid-namespace"));
|
|
79
|
-
var NoAuthnLogic_1 = require("./authn/NoAuthnLogic");
|
|
80
|
-
var SolidAuthnLogic_1 = require("./authn/SolidAuthnLogic");
|
|
81
|
-
var ChatLogic_1 = require("./chat/ChatLogic");
|
|
82
|
-
var debug = __importStar(require("./debug"));
|
|
83
|
-
var ProfileLogic_1 = require("./profile/ProfileLogic");
|
|
84
|
-
var UtilityLogic_1 = require("./util/UtilityLogic");
|
|
85
|
-
var UtilityLogic_2 = require("./util/UtilityLogic");
|
|
86
|
-
Object.defineProperty(exports, "ACL_LINK", { enumerable: true, get: function () { return UtilityLogic_2.ACL_LINK; } });
|
|
87
|
-
var ns = (0, solid_namespace_1.default)(rdf);
|
|
88
|
-
var SolidLogic = /** @class */ (function () {
|
|
89
|
-
function SolidLogic(fetcher, solidAuthSession) {
|
|
90
|
-
this.store = rdf.graph(); // Make a Quad store
|
|
91
|
-
rdf.fetcher(this.store, fetcher); // Attach a web I/O module, store.fetcher
|
|
92
|
-
this.store.updater = new rdf.UpdateManager(this.store); // Add real-time live updates store.updater
|
|
93
|
-
this.cache = {
|
|
94
|
-
profileDocument: {},
|
|
95
|
-
preferencesFile: {},
|
|
96
|
-
};
|
|
97
|
-
this.fetcher = fetcher;
|
|
98
|
-
/*this._fetch = this.fetcher.fetch
|
|
99
|
-
|| typeof global !== 'undefined' && global.solidFetch
|
|
100
|
-
|| typeof window !== 'undefined' && window.solidFetch
|
|
101
|
-
|| crossFetch
|
|
102
|
-
if (!this._fetch) {
|
|
103
|
-
throw new Error('No _fetch function available for Fetcher')
|
|
104
|
-
} */
|
|
105
|
-
if (solidAuthSession) {
|
|
106
|
-
this.authn = new SolidAuthnLogic_1.SolidAuthnLogic(solidAuthSession);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
this.authn = new NoAuthnLogic_1.NoAuthnLogic();
|
|
110
|
-
}
|
|
111
|
-
this.profile = new ProfileLogic_1.ProfileLogic(this.store, ns, this.authn);
|
|
112
|
-
this.chat = new ChatLogic_1.ChatLogic(this.store, ns, this.profile);
|
|
113
|
-
this.util = new UtilityLogic_1.UtilityLogic(this.store, ns, this.fetcher);
|
|
114
|
-
}
|
|
115
|
-
SolidLogic.prototype.findAclDocUrl = function (url) {
|
|
116
|
-
return this.util.findAclDocUrl(url);
|
|
117
|
-
};
|
|
118
|
-
SolidLogic.prototype.loadDoc = function (doc) {
|
|
119
|
-
return this.util.loadDoc(doc);
|
|
120
|
-
};
|
|
121
|
-
SolidLogic.prototype.loadProfile = function (me) {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
123
|
-
var profileDocument, err_1, message;
|
|
124
|
-
return __generator(this, function (_a) {
|
|
125
|
-
switch (_a.label) {
|
|
126
|
-
case 0:
|
|
127
|
-
// console.log('loadProfile', me)
|
|
128
|
-
if (this.cache.profileDocument[me.value]) {
|
|
129
|
-
return [2 /*return*/, this.cache.profileDocument[me.value]];
|
|
130
|
-
}
|
|
131
|
-
_a.label = 1;
|
|
132
|
-
case 1:
|
|
133
|
-
_a.trys.push([1, 3, , 4]);
|
|
134
|
-
profileDocument = me.doc();
|
|
135
|
-
return [4 /*yield*/, this.loadDoc(profileDocument)];
|
|
136
|
-
case 2:
|
|
137
|
-
_a.sent();
|
|
138
|
-
return [2 /*return*/, profileDocument];
|
|
139
|
-
case 3:
|
|
140
|
-
err_1 = _a.sent();
|
|
141
|
-
message = "Logged in but cannot load profile ".concat(profileDocument, " : ").concat(err_1);
|
|
142
|
-
throw new Error(message);
|
|
143
|
-
case 4: return [2 /*return*/];
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
};
|
|
148
|
-
SolidLogic.prototype.loadPreferences = function (me) {
|
|
149
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
150
|
-
// console.log('this.store.any()', this.store.any())
|
|
151
|
-
/**
|
|
152
|
-
* Are we working cross-origin?
|
|
153
|
-
* Returns True if we are in a webapp at an origin, and the file origin is different
|
|
154
|
-
*/
|
|
155
|
-
function differentOrigin() {
|
|
156
|
-
if (!preferencesFile) {
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
|
-
return ("".concat(window.location.origin, "/") !== new URL(preferencesFile.value).origin);
|
|
160
|
-
}
|
|
161
|
-
var preferencesFile, err_2, status_1;
|
|
162
|
-
return __generator(this, function (_a) {
|
|
163
|
-
switch (_a.label) {
|
|
164
|
-
case 0:
|
|
165
|
-
// console.log('loadPreferences', me)
|
|
166
|
-
if (this.cache.preferencesFile[me.value]) {
|
|
167
|
-
return [2 /*return*/, this.cache.preferencesFile[me.value]];
|
|
168
|
-
}
|
|
169
|
-
preferencesFile = this.store.any(me, ns.space("preferencesFile"));
|
|
170
|
-
if (!preferencesFile) {
|
|
171
|
-
throw new Error("Can't find a preference file pointer in profile ".concat(me.doc()));
|
|
172
|
-
}
|
|
173
|
-
if (!this.store.fetcher) {
|
|
174
|
-
throw new Error("Cannot load doc, have no fetcher");
|
|
175
|
-
}
|
|
176
|
-
_a.label = 1;
|
|
177
|
-
case 1:
|
|
178
|
-
_a.trys.push([1, 3, , 4]);
|
|
179
|
-
return [4 /*yield*/, this.store.fetcher.load(preferencesFile, {
|
|
180
|
-
withCredentials: true,
|
|
181
|
-
})];
|
|
182
|
-
case 2:
|
|
183
|
-
_a.sent();
|
|
184
|
-
return [3 /*break*/, 4];
|
|
185
|
-
case 3:
|
|
186
|
-
err_2 = _a.sent();
|
|
187
|
-
status_1 = err_2.status;
|
|
188
|
-
debug.log("HTTP status ".concat(status_1, " for preference file ").concat(preferencesFile));
|
|
189
|
-
if (status_1 === 401) {
|
|
190
|
-
throw new UnauthorizedError();
|
|
191
|
-
}
|
|
192
|
-
if (status_1 === 403) {
|
|
193
|
-
if (differentOrigin()) {
|
|
194
|
-
throw new CrossOriginForbiddenError();
|
|
195
|
-
}
|
|
196
|
-
throw new SameOriginForbiddenError();
|
|
197
|
-
}
|
|
198
|
-
if (status_1 === 404) {
|
|
199
|
-
throw new NotFoundError(preferencesFile.value);
|
|
200
|
-
}
|
|
201
|
-
throw new FetchError(err_2.status, err_2.message);
|
|
202
|
-
case 4: return [2 /*return*/, preferencesFile];
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
};
|
|
207
|
-
SolidLogic.prototype.getTypeIndex = function (me, preferencesFile, isPublic) {
|
|
208
|
-
// console.log('getTypeIndex', this.store.each(me, undefined, undefined, preferencesFile), isPublic, preferencesFile)
|
|
209
|
-
return this.store.each(me, isPublic ? ns.solid("publicTypeIndex") : ns.solid("privateTypeIndex"), undefined, preferencesFile);
|
|
210
|
-
};
|
|
211
|
-
SolidLogic.prototype.getRegistrations = function (instance, theClass) {
|
|
212
|
-
var _this = this;
|
|
213
|
-
return this.store
|
|
214
|
-
.each(undefined, ns.solid("instance"), instance)
|
|
215
|
-
.filter(function (r) {
|
|
216
|
-
return _this.store.holds(r, ns.solid("forClass"), theClass);
|
|
217
|
-
});
|
|
218
|
-
};
|
|
219
|
-
SolidLogic.prototype.load = function (doc) {
|
|
220
|
-
if (!this.store.fetcher) {
|
|
221
|
-
throw new Error("Cannot load doc(s), have no fetcher");
|
|
222
|
-
}
|
|
223
|
-
return this.store.fetcher.load(doc);
|
|
224
|
-
};
|
|
225
|
-
SolidLogic.prototype.loadIndexes = function (me, publicProfile, preferencesFile, onWarning) {
|
|
226
|
-
var _this = this;
|
|
227
|
-
if (onWarning === void 0) { onWarning = function (_err) { return __awaiter(_this, void 0, void 0, function () {
|
|
228
|
-
return __generator(this, function (_a) {
|
|
229
|
-
return [2 /*return*/, undefined];
|
|
230
|
-
});
|
|
231
|
-
}); }; }
|
|
232
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
233
|
-
var privateIndexes, publicIndexes, err_3, err_4;
|
|
234
|
-
return __generator(this, function (_a) {
|
|
235
|
-
switch (_a.label) {
|
|
236
|
-
case 0:
|
|
237
|
-
privateIndexes = [];
|
|
238
|
-
publicIndexes = [];
|
|
239
|
-
if (!publicProfile) return [3 /*break*/, 4];
|
|
240
|
-
publicIndexes = this.getTypeIndex(me, publicProfile, true);
|
|
241
|
-
_a.label = 1;
|
|
242
|
-
case 1:
|
|
243
|
-
_a.trys.push([1, 3, , 4]);
|
|
244
|
-
return [4 /*yield*/, this.load(publicIndexes)];
|
|
245
|
-
case 2:
|
|
246
|
-
_a.sent();
|
|
247
|
-
return [3 /*break*/, 4];
|
|
248
|
-
case 3:
|
|
249
|
-
err_3 = _a.sent();
|
|
250
|
-
onWarning(new Error("loadIndex: loading public type index(es) ".concat(err_3)));
|
|
251
|
-
return [3 /*break*/, 4];
|
|
252
|
-
case 4:
|
|
253
|
-
if (!preferencesFile) return [3 /*break*/, 9];
|
|
254
|
-
privateIndexes = this.getTypeIndex(me, preferencesFile, false);
|
|
255
|
-
if (!(privateIndexes.length === 0)) return [3 /*break*/, 6];
|
|
256
|
-
return [4 /*yield*/, onWarning(new Error("Your preference file ".concat(preferencesFile, " does not point to a private type index.")))];
|
|
257
|
-
case 5:
|
|
258
|
-
_a.sent();
|
|
259
|
-
return [3 /*break*/, 9];
|
|
260
|
-
case 6:
|
|
261
|
-
_a.trys.push([6, 8, , 9]);
|
|
262
|
-
return [4 /*yield*/, this.load(privateIndexes)];
|
|
263
|
-
case 7:
|
|
264
|
-
_a.sent();
|
|
265
|
-
return [3 /*break*/, 9];
|
|
266
|
-
case 8:
|
|
267
|
-
err_4 = _a.sent();
|
|
268
|
-
onWarning(new Error("loadIndex: loading private type index(es) ".concat(err_4)));
|
|
269
|
-
return [3 /*break*/, 9];
|
|
270
|
-
case 9: return [2 /*return*/, {
|
|
271
|
-
private: privateIndexes,
|
|
272
|
-
public: publicIndexes,
|
|
273
|
-
}];
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
};
|
|
278
|
-
SolidLogic.prototype.createEmptyRdfDoc = function (doc, comment) {
|
|
279
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
280
|
-
return __generator(this, function (_a) {
|
|
281
|
-
switch (_a.label) {
|
|
282
|
-
case 0:
|
|
283
|
-
if (!this.store.fetcher) {
|
|
284
|
-
throw new Error("Cannot create empty rdf doc, have no fetcher");
|
|
285
|
-
}
|
|
286
|
-
return [4 /*yield*/, this.store.fetcher.webOperation("PUT", doc.uri, {
|
|
287
|
-
data: "# ".concat(new Date(), " ").concat(comment, "\n"),
|
|
288
|
-
contentType: "text/turtle",
|
|
289
|
-
})];
|
|
290
|
-
case 1:
|
|
291
|
-
_a.sent();
|
|
292
|
-
return [2 /*return*/];
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
});
|
|
296
|
-
};
|
|
297
|
-
// @@@@ use the one in rdflib.js when it is available and delete this
|
|
298
|
-
SolidLogic.prototype.updatePromise = function (del, ins) {
|
|
299
|
-
var _this = this;
|
|
300
|
-
if (ins === void 0) { ins = []; }
|
|
301
|
-
return new Promise(function (resolve, reject) {
|
|
302
|
-
if (!_this.store.updater) {
|
|
303
|
-
throw new Error("Cannot updatePromise, have no updater");
|
|
304
|
-
}
|
|
305
|
-
_this.store.updater.update(del, ins, function (_uri, ok, errorBody) {
|
|
306
|
-
if (!ok) {
|
|
307
|
-
reject(new Error(errorBody));
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
resolve();
|
|
311
|
-
}
|
|
312
|
-
}); // callback
|
|
313
|
-
}); // promise
|
|
314
|
-
};
|
|
315
|
-
SolidLogic.prototype.isContainer = function (url) {
|
|
316
|
-
return this.util.isContainer(url);
|
|
317
|
-
};
|
|
318
|
-
SolidLogic.prototype.getContainerElements = function (containerNode) {
|
|
319
|
-
return this.util.getContainerElements(containerNode);
|
|
320
|
-
};
|
|
321
|
-
SolidLogic.prototype.getContainerMembers = function (containerUrl) {
|
|
322
|
-
return this.util.getContainerMembers(containerUrl);
|
|
323
|
-
};
|
|
324
|
-
SolidLogic.prototype.recursiveDelete = function (url) {
|
|
325
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
326
|
-
return __generator(this, function (_a) {
|
|
327
|
-
return [2 /*return*/, this.util.recursiveDelete(url)];
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
};
|
|
331
|
-
SolidLogic.prototype.clearStore = function () {
|
|
332
|
-
return this.util.clearStore();
|
|
333
|
-
};
|
|
334
|
-
SolidLogic.prototype.fetch = function (url, options) {
|
|
335
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
336
|
-
return __generator(this, function (_a) {
|
|
337
|
-
return [2 /*return*/, this.fetcher.fetch(url, options)];
|
|
338
|
-
});
|
|
339
|
-
});
|
|
340
|
-
};
|
|
341
|
-
return SolidLogic;
|
|
342
|
-
}());
|
|
343
|
-
exports.SolidLogic = SolidLogic;
|
|
344
|
-
var CustomError = /** @class */ (function (_super) {
|
|
345
|
-
__extends(CustomError, _super);
|
|
346
|
-
function CustomError(message) {
|
|
347
|
-
var _newTarget = this.constructor;
|
|
348
|
-
var _this = _super.call(this, message) || this;
|
|
349
|
-
// see: typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html
|
|
350
|
-
Object.setPrototypeOf(_this, _newTarget.prototype); // restore prototype chain
|
|
351
|
-
_this.name = _newTarget.name; // stack traces display correctly now
|
|
352
|
-
return _this;
|
|
353
|
-
}
|
|
354
|
-
return CustomError;
|
|
355
|
-
}(Error));
|
|
356
|
-
var UnauthorizedError = /** @class */ (function (_super) {
|
|
357
|
-
__extends(UnauthorizedError, _super);
|
|
358
|
-
function UnauthorizedError() {
|
|
359
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
360
|
-
}
|
|
361
|
-
return UnauthorizedError;
|
|
362
|
-
}(CustomError));
|
|
363
|
-
exports.UnauthorizedError = UnauthorizedError;
|
|
364
|
-
var CrossOriginForbiddenError = /** @class */ (function (_super) {
|
|
365
|
-
__extends(CrossOriginForbiddenError, _super);
|
|
366
|
-
function CrossOriginForbiddenError() {
|
|
367
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
368
|
-
}
|
|
369
|
-
return CrossOriginForbiddenError;
|
|
370
|
-
}(CustomError));
|
|
371
|
-
exports.CrossOriginForbiddenError = CrossOriginForbiddenError;
|
|
372
|
-
var SameOriginForbiddenError = /** @class */ (function (_super) {
|
|
373
|
-
__extends(SameOriginForbiddenError, _super);
|
|
374
|
-
function SameOriginForbiddenError() {
|
|
375
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
376
|
-
}
|
|
377
|
-
return SameOriginForbiddenError;
|
|
378
|
-
}(CustomError));
|
|
379
|
-
exports.SameOriginForbiddenError = SameOriginForbiddenError;
|
|
380
|
-
var NotFoundError = /** @class */ (function (_super) {
|
|
381
|
-
__extends(NotFoundError, _super);
|
|
382
|
-
function NotFoundError() {
|
|
383
|
-
return _super !== null && _super.apply(this, arguments) || this;
|
|
384
|
-
}
|
|
385
|
-
return NotFoundError;
|
|
386
|
-
}(CustomError));
|
|
387
|
-
exports.NotFoundError = NotFoundError;
|
|
388
|
-
var FetchError = /** @class */ (function (_super) {
|
|
389
|
-
__extends(FetchError, _super);
|
|
390
|
-
function FetchError(status, message) {
|
|
391
|
-
var _this = _super.call(this, message) || this;
|
|
392
|
-
_this.status = status;
|
|
393
|
-
return _this;
|
|
394
|
-
}
|
|
395
|
-
return FetchError;
|
|
396
|
-
}(CustomError));
|
|
397
|
-
exports.FetchError = FetchError;
|
|
398
|
-
//# sourceMappingURL=index-alain.js.map
|