chat-pane 2.5.1 → 3.0.0-1587940f

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.
@@ -0,0 +1,8 @@
1
+ import { NamedNode } from 'rdflib';
2
+ export declare function findChat(invitee: NamedNode): Promise<{
3
+ me: NamedNode;
4
+ chatContainer: NamedNode;
5
+ exists: boolean;
6
+ }>;
7
+ export declare function getChat(invitee: NamedNode, createIfMissing?: boolean): Promise<NamedNode>;
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAM,MAAM,QAAQ,CAAA;AAuHtC,wBAAsB,QAAQ,CAAE,OAAO,EAAE,SAAS;;;;GAWjD;AAED,wBAAsB,OAAO,CAAE,OAAO,EAAE,SAAS,EAAE,eAAe,UAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAc7F"}
package/dist/create.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.findChat = findChat;
7
+ exports.getChat = getChat;
8
+ var _solidUi = require("solid-ui");
9
+ var _solidLogic = require("solid-logic");
10
+ var _rdflib = require("rdflib");
11
+ var _longChatPane = require("./longChatPane");
12
+ async function getMe() {
13
+ const me = _solidLogic.authn.currentUser();
14
+ if (me === null) {
15
+ throw new Error('Current user not found! Not logged in?');
16
+ }
17
+ await _solidLogic.store.fetcher.load(me.doc());
18
+ return me;
19
+ }
20
+ async function getPodRoot(me) {
21
+ const podRoot = _solidLogic.store.any(me, _solidUi.ns.space('storage'), undefined, me.doc());
22
+ if (!podRoot) {
23
+ throw new Error('Current user pod root not found!');
24
+ }
25
+ return podRoot;
26
+ }
27
+ async function sendInvite(invitee, chatThing) {
28
+ await _solidLogic.store.fetcher.load(invitee.doc());
29
+ const inviteeInbox = _solidLogic.store.any(invitee, _solidUi.ns.ldp('inbox'), undefined, invitee.doc());
30
+ if (!inviteeInbox) {
31
+ throw new Error(`Invitee inbox not found! ${invitee.value}`);
32
+ }
33
+ const inviteBody = `
34
+ <> a <http://www.w3.org/ns/pim/meeting#LongChatInvite> ;
35
+ ${_solidUi.ns.rdf('seeAlso')} <${chatThing.value}> .
36
+ `;
37
+ const inviteResponse = await _solidLogic.store.fetcher.webOperation('POST', inviteeInbox.value, {
38
+ data: inviteBody,
39
+ contentType: 'text/turtle'
40
+ });
41
+ const locationStr = inviteResponse.headers.get('location');
42
+ if (!locationStr) {
43
+ throw new Error(`Invite sending returned a ${inviteResponse.status}`);
44
+ }
45
+ }
46
+ function determineChatContainer(invitee, podRoot) {
47
+ // Create chat
48
+ // See https://gitter.im/solid/chat-app?at=5f3c800f855be416a23ae74a
49
+ const chatContainerStr = new URL(`IndividualChats/${new URL(invitee.value).host}/`, podRoot.value).toString();
50
+ return new _rdflib.NamedNode(chatContainerStr);
51
+ }
52
+ async function createChatThing(chatContainer, me) {
53
+ const created = await _longChatPane.longChatPane.mintNew({
54
+ session: {
55
+ store: _solidLogic.store
56
+ }
57
+ }, {
58
+ me,
59
+ newBase: chatContainer.value
60
+ });
61
+ return created.newInstance;
62
+ }
63
+ async function setAcl(chatContainer, me, invitee) {
64
+ // Some servers don't present a Link http response header
65
+ // if the container doesn't exist yet, so refetch the container
66
+ // now that it has been created:
67
+ await _solidLogic.store.fetcher.load(chatContainer);
68
+
69
+ // FIXME: check the Why value on this quad:
70
+ const chatAclDoc = _solidLogic.store.any(chatContainer, new _rdflib.NamedNode('http://www.iana.org/assignments/link-relations/acl'));
71
+ if (!chatAclDoc) {
72
+ throw new Error('Chat ACL doc not found!');
73
+ }
74
+ const aclBody = `
75
+ @prefix acl: <http://www.w3.org/ns/auth/acl#>.
76
+ <#owner>
77
+ a acl:Authorization;
78
+ acl:agent <${me.value}>;
79
+ acl:accessTo <.>;
80
+ acl:default <.>;
81
+ acl:mode
82
+ acl:Read, acl:Write, acl:Control.
83
+ <#invitee>
84
+ a acl:Authorization;
85
+ acl:agent <${invitee.value}>;
86
+ acl:accessTo <.>;
87
+ acl:default <.>;
88
+ acl:mode
89
+ acl:Read, acl:Append.
90
+ `;
91
+ const aclResponse = await _solidLogic.store.fetcher.webOperation('PUT', chatAclDoc.value, {
92
+ data: aclBody,
93
+ contentType: 'text/turtle'
94
+ });
95
+ }
96
+ async function addToPrivateTypeIndex(chatThing, me) {
97
+ // Add to private type index
98
+ const privateTypeIndex = _solidLogic.store.any(me, _solidUi.ns.solid('privateTypeIndex'));
99
+ if (!privateTypeIndex) {
100
+ throw new Error('Private type index not found!');
101
+ }
102
+ await _solidLogic.store.fetcher.load(privateTypeIndex);
103
+ const reg = _solidUi.widgets.newThing(privateTypeIndex);
104
+ const ins = [(0, _rdflib.st)(reg, _solidUi.ns.rdf('type'), _solidUi.ns.solid('TypeRegistration'), privateTypeIndex.doc()), (0, _rdflib.st)(reg, _solidUi.ns.solid('forClass'), _solidUi.ns.meeting('LongChat'), privateTypeIndex.doc()), (0, _rdflib.st)(reg, _solidUi.ns.solid('instance'), chatThing, privateTypeIndex.doc())];
105
+ await new Promise((resolve, reject) => {
106
+ _solidLogic.store.updater.update([], ins, function (_uri, ok, errm) {
107
+ if (!ok) {
108
+ reject(new Error(errm));
109
+ } else {
110
+ resolve();
111
+ }
112
+ });
113
+ });
114
+ }
115
+ async function findChat(invitee) {
116
+ const me = await getMe();
117
+ const podRoot = await getPodRoot(me);
118
+ const chatContainer = determineChatContainer(invitee, podRoot);
119
+ let exists = true;
120
+ try {
121
+ await _solidLogic.store.fetcher.load(new _rdflib.NamedNode(chatContainer.value + _longChatPane.longChatPane.CHAT_LOCATION_IN_CONTAINER));
122
+ } catch (e) {
123
+ exists = false;
124
+ }
125
+ return {
126
+ me,
127
+ chatContainer,
128
+ exists
129
+ };
130
+ }
131
+ async function getChat(invitee, createIfMissing = true) {
132
+ const {
133
+ me,
134
+ chatContainer,
135
+ exists
136
+ } = await findChat(invitee);
137
+ if (exists) {
138
+ return new _rdflib.NamedNode(chatContainer.value + _longChatPane.longChatPane.CHAT_LOCATION_IN_CONTAINER);
139
+ }
140
+ if (createIfMissing) {
141
+ const chatThing = await createChatThing(chatContainer, me);
142
+ await sendInvite(invitee, chatThing);
143
+ await setAcl(chatContainer, me, invitee);
144
+ await addToPrivateTypeIndex(chatThing, me);
145
+ return chatThing;
146
+ }
147
+ throw new Error('Chat does not exist and createIfMissing is false');
148
+ }
149
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","names":["_solidUi","require","_solidLogic","_rdflib","_longChatPane","getMe","me","authn","currentUser","Error","store","fetcher","load","doc","getPodRoot","podRoot","any","ns","space","undefined","sendInvite","invitee","chatThing","inviteeInbox","ldp","value","inviteBody","rdf","inviteResponse","webOperation","data","contentType","locationStr","headers","get","status","determineChatContainer","chatContainerStr","URL","host","toString","NamedNode","createChatThing","chatContainer","created","longChatPane","mintNew","session","newBase","newInstance","setAcl","chatAclDoc","aclBody","aclResponse","addToPrivateTypeIndex","privateTypeIndex","solid","reg","widgets","newThing","ins","st","meeting","Promise","resolve","reject","updater","update","_uri","ok","errm","findChat","exists","CHAT_LOCATION_IN_CONTAINER","e","getChat","createIfMissing"],"sources":["../src/create.ts"],"sourcesContent":["import { ns, widgets } from 'solid-ui'\nimport { authn, store } from 'solid-logic'\nimport { NamedNode, st } from 'rdflib'\nimport { longChatPane } from './longChatPane'\n\nasync function getMe () {\n const me = authn.currentUser()\n if (me === null) {\n throw new Error('Current user not found! Not logged in?')\n }\n await store.fetcher.load(me.doc())\n return me\n}\n\nasync function getPodRoot (me): Promise<NamedNode> {\n const podRoot = store.any(me, ns.space('storage'), undefined, me.doc())\n if (!podRoot) {\n throw new Error('Current user pod root not found!')\n }\n return podRoot as NamedNode\n}\n\nasync function sendInvite (invitee: NamedNode, chatThing: NamedNode) {\n await store.fetcher.load(invitee.doc())\n const inviteeInbox = store.any(invitee, ns.ldp('inbox'), undefined, invitee.doc())\n if (!inviteeInbox) {\n throw new Error(`Invitee inbox not found! ${invitee.value}`)\n }\n const inviteBody = `\n<> a <http://www.w3.org/ns/pim/meeting#LongChatInvite> ;\n${ns.rdf('seeAlso')} <${chatThing.value}> . \n `\n\n const inviteResponse = await store.fetcher.webOperation('POST', inviteeInbox.value, {\n data: inviteBody,\n contentType: 'text/turtle'\n })\n const locationStr = inviteResponse.headers.get('location')\n if (!locationStr) {\n throw new Error(`Invite sending returned a ${inviteResponse.status}`)\n }\n}\n\nfunction determineChatContainer (invitee, podRoot) {\n // Create chat\n // See https://gitter.im/solid/chat-app?at=5f3c800f855be416a23ae74a\n const chatContainerStr = new URL(`IndividualChats/${new URL(invitee.value).host}/`, podRoot.value).toString()\n return new NamedNode(chatContainerStr)\n}\n\nasync function createChatThing (chatContainer, me) {\n const created = await longChatPane.mintNew({\n session: {\n store\n }\n },\n {\n me,\n newBase: chatContainer.value\n })\n return created.newInstance\n}\n\nasync function setAcl (chatContainer, me, invitee) {\n // Some servers don't present a Link http response header\n // if the container doesn't exist yet, so refetch the container\n // now that it has been created:\n await store.fetcher.load(chatContainer)\n\n // FIXME: check the Why value on this quad:\n const chatAclDoc = store.any(chatContainer, new NamedNode('http://www.iana.org/assignments/link-relations/acl'))\n if (!chatAclDoc) {\n throw new Error('Chat ACL doc not found!')\n }\n\n const aclBody = `\n@prefix acl: <http://www.w3.org/ns/auth/acl#>.\n<#owner>\n a acl:Authorization;\n acl:agent <${me.value}>;\n acl:accessTo <.>;\n acl:default <.>;\n acl:mode\n acl:Read, acl:Write, acl:Control.\n<#invitee>\n a acl:Authorization;\n acl:agent <${invitee.value}>;\n acl:accessTo <.>;\n acl:default <.>;\n acl:mode\n acl:Read, acl:Append.\n`\n const aclResponse = await store.fetcher.webOperation('PUT', chatAclDoc.value, {\n data: aclBody,\n contentType: 'text/turtle'\n })\n}\nasync function addToPrivateTypeIndex (chatThing, me) {\n // Add to private type index\n const privateTypeIndex = store.any(me, ns.solid('privateTypeIndex')) as NamedNode | null\n if (!privateTypeIndex) {\n throw new Error('Private type index not found!')\n }\n await store.fetcher.load(privateTypeIndex)\n const reg = widgets.newThing(privateTypeIndex)\n const ins = [\n st(reg, ns.rdf('type'), ns.solid('TypeRegistration'), privateTypeIndex.doc()),\n st(reg, ns.solid('forClass'), ns.meeting('LongChat'), privateTypeIndex.doc()),\n st(reg, ns.solid('instance'), chatThing, privateTypeIndex.doc())\n ]\n await new Promise<void>((resolve, reject) => {\n store.updater.update([], ins, function (_uri, ok, errm) {\n if (!ok) {\n reject(new Error(errm))\n } else {\n resolve()\n }\n })\n })\n}\n\nexport async function findChat (invitee: NamedNode) {\n const me = await getMe()\n const podRoot = await getPodRoot(me)\n const chatContainer = determineChatContainer(invitee, podRoot)\n let exists = true\n try {\n await store.fetcher.load(new NamedNode(chatContainer.value + longChatPane.CHAT_LOCATION_IN_CONTAINER))\n } catch (e) {\n exists = false\n }\n return { me, chatContainer, exists }\n}\n\nexport async function getChat (invitee: NamedNode, createIfMissing = true): Promise<NamedNode> {\n const { me, chatContainer, exists } = await findChat(invitee)\n if (exists) {\n return new NamedNode(chatContainer.value + longChatPane.CHAT_LOCATION_IN_CONTAINER)\n }\n\n if (createIfMissing) {\n const chatThing = await createChatThing(chatContainer, me)\n await sendInvite(invitee, chatThing)\n await setAcl(chatContainer, me, invitee)\n await addToPrivateTypeIndex(chatThing, me)\n return chatThing\n }\n throw new Error('Chat does not exist and createIfMissing is false')\n}\n"],"mappings":"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","ignoreList":[]}