Skip to content

Commit db58504

Browse files
committed
wip: responding to actions
1 parent 5cb1bba commit db58504

File tree

4 files changed

+58
-24
lines changed

4 files changed

+58
-24
lines changed

src/models/ldht/LocalRDFNode.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ export class LocalRDFNode extends LocalDHTNode implements RDFNode {
6767
.storeLocal(key, value)
6868
.then(() => {
6969
// Store in solid storage
70-
return this.network.remoteStore(this.uri, key, Array.isArray(value) ? value : [value]);
70+
const service = this.network.solidService;
71+
const session = service.session;
72+
return service.getDatasetStore(session, this.uri);
73+
}).then((store) => {
74+
const data = Array.isArray(value) ? value : [value];
7175
})
7276
.then(resolve)
7377
.catch(reject);

src/models/ldht/RemoteRDFNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ export class RemoteRDFNode extends RemoteDHTNode implements RDFNode {
163163
setTimeout(() => {
164164
clearInterval(interval);
165165
reject(new Error("Action timed out"));
166-
}, action.timeout ?? 10000);
166+
}, action.timeout ?? 30000);
167167
}).catch(reject);
168168
});
169169
}

src/services/DHTMemoryNetwork.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ export class DHTMemoryNetwork extends DHTNetwork {
124124
if (targetNode.length === 0) {
125125
throw new Error('No nodes found');
126126
}
127+
this.service.logger('info', `Storing value ${value} in node ${targetNode[0].nodeID}`);
127128
return targetNode[0].store(key, value);
128129
})
129130
.then(() => {

src/services/DHTRDFNetwork.ts

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { DataFactory, foaf, IriString, RDFSerializer, schema } from '@openhps/rdf';
22
import { LocalRDFNode } from '../models/ldht/LocalRDFNode';
3-
import { LDHTAddNodeAction, LDHTPingAction, LDHTRemoveNodeAction, LDHTStoreValueAction } from '../models/ldht';
3+
import { LDHTAction, LDHTAddNodeAction, LDHTPingAction, LDHTRemoveNodeAction, LDHTStoreValueAction } from '../models/ldht';
44

55
import { Activity, Collection, DatasetSubscription, SolidClientService } from '@openhps/solid';
66
import { DHTMemoryNetwork } from './DHTMemoryNetwork';
77
import { RemoteRDFNode } from '../models/ldht/RemoteRDFNode';
8-
import { Model } from '@openhps/core';
8+
import { createChangeLog, Model } from '@openhps/core';
99
import { DHTService } from './DHTService';
1010

1111
/**
@@ -119,17 +119,18 @@ export class DHTRDFNetwork extends DHTMemoryNetwork {
119119
const object = activity.object;
120120
if (object) {
121121
// Handle actions
122-
this.service.logger('debug', `Received action: ${object}`);
123122
this.solidService.getDatasetStore(this.solidService.session, object).then((store) => {
124-
const action = RDFSerializer.deserializeFromStore(undefined, store);
123+
let action: LDHTAction = RDFSerializer.deserializeFromStore(undefined, store);
125124
if (action) {
125+
this.service.logger('debug', `Received (${action.constructor.name}) action: ${object}`);
126126
if (action instanceof LDHTAddNodeAction) {
127127
// Add a node
128128
// Fetch the remote node first
129129
this.fetchRemoteNode(action.object).then((node) => {
130130
return this.addNode(node);
131131
}).then(() => {
132132
// Set action completed
133+
action = createChangeLog(action);
133134
action.actionStatus = schema.CompletedActionStatus;
134135
const changes = RDFSerializer.serializeToChangeLog(action);
135136
store.additions = changes.additions;
@@ -146,20 +147,28 @@ export class DHTRDFNetwork extends DHTMemoryNetwork {
146147
return this.removeNode(node);
147148
}).then(() => {
148149
// Set action completed
150+
action = createChangeLog(action);
149151
action.actionStatus = schema.CompletedActionStatus;
150-
// const store = RDFSerializer.serializeToStore(action);
151-
// return this.solidService.saveDataset(this.solidService.session, object, store);
152+
const changes = RDFSerializer.serializeToChangeLog(action);
153+
store.additions = changes.additions;
154+
store.deletions = changes.deletions;
155+
this.service.logger('debug', `Updating action status to completed for: ${object}`);
156+
return this.solidService.saveDataset(this.solidService.session, object, store);
152157
}).catch((err) => {
153158
this.service.logger('error', `Failed to fetch remote node: ${err.message}`);
154159
});
155160
} else if (action instanceof LDHTStoreValueAction) {
156161
// Store a value
157162
this.storeValue(action.object.identifier, action.object.value)
158163
.then(() => {
159-
// Set action completed
160-
action.actionStatus = schema.CompletedActionStatus;
161-
const store = RDFSerializer.serializeToStore(action);
162-
return this.solidService.saveDataset(this.solidService.session, object, store);
164+
// Set action completed
165+
action = createChangeLog(action);
166+
action.actionStatus = schema.CompletedActionStatus;
167+
const changes = RDFSerializer.serializeToChangeLog(action);
168+
store.additions = changes.additions;
169+
store.deletions = changes.deletions;
170+
this.service.logger('debug', `Updating action status to completed for: ${object}`);
171+
return this.solidService.saveDataset(this.solidService.session, object, store);
163172
}).catch((err) => {
164173
this.service.logger('error', `Failed to store value: ${err.message}`);
165174
});
@@ -300,23 +309,43 @@ export class DHTRDFNetwork extends DHTMemoryNetwork {
300309
foaf.Agent,
301310
this.solidService.session,
302311
);
312+
}).then(() => {
313+
// Create the nodes and data store
314+
this.service.logger('debug', `Creating nodes store at ${nodesUri}`);
315+
this.service.logger('debug', `Creating data store at ${dataUri}`);
316+
return Promise.all([
317+
this.solidService.saveDataset(this.solidService.session, nodesUri, this.solidService.createDataset()),
318+
this.solidService.saveDataset(this.solidService.session, dataUri, this.solidService.createDataset())
319+
]);
320+
}).then(() => {
321+
this.service.logger('debug', `Setting access rights for ${nodesUri}`);
322+
this.service.logger('debug', `Setting access rights for ${dataUri}`);
323+
return Promise.all([
324+
this.solidService.setAccess(
325+
nodesUri,
326+
{
327+
read: true,
328+
public: true,
329+
group: true
330+
},
331+
foaf.Agent,
332+
this.solidService.session,
333+
), this.solidService.setAccess(
334+
dataUri,
335+
{
336+
read: true,
337+
public: true,
338+
group: true
339+
},
340+
foaf.Agent,
341+
this.solidService.session,
342+
)
343+
]);
303344
}).then(() => {
304345
resolve(node);
305346
}).catch(err => {
306347
reject(err);
307348
});
308349
});
309350
}
310-
311-
remoteStore(uri: IriString, key: number, values: string[]): Promise<void> {
312-
return new Promise((resolve, reject) => {
313-
this.solidService
314-
.getDatasetStore(this.solidService.session, uri)
315-
.then((store) => {
316-
console.log(store, key, values);
317-
resolve();
318-
})
319-
.catch(reject);
320-
});
321-
}
322351
}

0 commit comments

Comments
 (0)