immers
Advanced tools
Comparing version 0.0.1 to 0.0.2
{ | ||
"port": 8081, | ||
"domain": "localhost:8081", | ||
"hub": "https://localhost:8080" | ||
"hub": "https://localhost:8080", | ||
"name": "immers.space" | ||
} |
101
index.js
@@ -0,1 +1,2 @@ | ||
'use strict' | ||
const fs = require('fs') | ||
@@ -8,4 +9,7 @@ const path = require('path') | ||
const ActivitypubExpress = require('activitypub-express') | ||
const socketio = require('socket.io') | ||
const request = require('request-promise-native') | ||
const { port, domain, hub } = JSON.parse(fs.readFileSync(path.join(__dirname, 'config.json'))) | ||
const config = JSON.parse(fs.readFileSync(path.join(__dirname, 'config.json'))) | ||
const { port, domain, hub, name } = config | ||
const app = express() | ||
@@ -32,7 +36,9 @@ const routes = { | ||
const client = new MongoClient('mongodb://localhost:27017', { useUnifiedTopology: true, useNewUrlParser: true }) | ||
const hubCors = cors({ origin: hub }) | ||
app.use(express.urlencoded({ extended: false })) | ||
app.use(express.urlencoded({ extended: true })) | ||
app.use(express.json({ type: ['application/json'].concat(apex.consts.jsonldTypes) })) | ||
app.use(cors({ origin: hub })) | ||
app.use(hubCors) | ||
// preflight needed for some socketio requests | ||
app.options('*', hubCors) | ||
app.use(apex) | ||
@@ -101,5 +107,78 @@ app | ||
// custom c2s apis | ||
async function friendsLocations (req, res, next) { | ||
const locals = res.locals.apex | ||
const friends = await apex.store.db.collection('streams').aggregate([ | ||
{ $match: { '_meta.collection': locals.target.inbox[0], type: { $in: ['Arrive', 'Leave', 'Accept'] } } }, | ||
{ $sort: { _id: -1 } }, | ||
{ $group: { _id: '$actor', loc: { $first: '$$ROOT' } } }, | ||
{ $replaceRoot: { newRoot: '$loc' } }, | ||
{ $lookup: { from: 'objects', localField: 'actor', foreignField: 'id', as: 'actor' } }, | ||
{ $project: { _id: 0, 'actor.publicKey': 0 } } | ||
]).toArray() | ||
locals.result = { | ||
id: `https://${domain}${req.originalUrl}`, | ||
type: 'OrderedCollection', | ||
totalItems: friends.length, | ||
orderedItems: friends | ||
} | ||
next() | ||
} | ||
app.get('/u/:actor/friends', [ | ||
apex.net.validators.jsonld, | ||
apex.net.validators.targetActor, | ||
friendsLocations, | ||
apex.net.responders.result | ||
]) | ||
const key = fs.readFileSync(path.join(__dirname, 'certs', 'server.key')) | ||
const cert = fs.readFileSync(path.join(__dirname, 'certs', 'server.cert')) | ||
const server = https.createServer({ key, cert }, app) | ||
// streaming updates | ||
const profilesSockets = new Map() | ||
const io = socketio(server) | ||
io.on('connection', socket => { | ||
socket.immers = {} | ||
socket.on('disconnect', async () => { | ||
if (socket.immers.id) { | ||
profilesSockets.delete(socket.immers.id) | ||
} | ||
if (socket.immers.outbox && socket.immers.leave) { | ||
request({ | ||
method: 'POST', | ||
url: socket.immers.outbox, | ||
headers: { | ||
'Content-Type': apex.consts.jsonldOutgoingType | ||
}, | ||
json: true, | ||
simple: false, | ||
body: await apex.toJSONLD(socket.immers.leave) | ||
}).catch(err => console.log(err.message)) | ||
delete socket.immers.leave | ||
} | ||
}) | ||
socket.on('profile', id => { | ||
if (!id) return | ||
socket.immers.id = id | ||
profilesSockets.set(id, socket) | ||
}) | ||
socket.on('entered', msg => { | ||
socket.immers.outbox = msg.outbox | ||
socket.immers.leave = msg.leave | ||
}) | ||
}) | ||
function onInboxFriendUpdate (msg) { | ||
if (!msg.recipient) return // ignore outbox | ||
const liveSocket = profilesSockets.get(msg.recipient.id) | ||
if (liveSocket) { | ||
liveSocket.emit('friends-update') | ||
} | ||
} | ||
app.on('apex-arrive', onInboxFriendUpdate) | ||
app.on('apex-leave', onInboxFriendUpdate) | ||
app.on('apex-accept', onInboxFriendUpdate) | ||
client | ||
@@ -109,6 +188,16 @@ .connect({ useNewUrlParser: true }) | ||
apex.store.db = client.db('immers') | ||
return apex.store.setup() | ||
// Place object representing this node | ||
const immer = { | ||
id: `https://${domain}/o/immer`, | ||
type: 'Place', | ||
name, | ||
url: `https://${domain}` | ||
} | ||
return apex.fromJSONLD(immer) | ||
}) | ||
.then(immer => { | ||
return apex.store.setup(immer) | ||
}) | ||
.then(() => { | ||
return https.createServer({ key, cert }, app).listen(port, () => console.log(`apex app listening on port ${port}`)) | ||
return server.listen(port, () => console.log(`apex app listening on port ${port}`)) | ||
}) |
{ | ||
"name": "immers", | ||
"version": "0.0.1", | ||
"version": "0.0.2", | ||
"description": "ActivityPub server for the metaverse", | ||
@@ -31,3 +31,4 @@ "main": "index.js", | ||
"express": "^4.17.1", | ||
"mongodb": "^3.5.7" | ||
"mongodb": "^3.5.7", | ||
"socket.io": "^2.3.0" | ||
}, | ||
@@ -34,0 +35,0 @@ "devDependencies": { |
# immers | ||
ActivityPub server for immers.space - a decentralized virtual reality metaverse platform powered by Mozilla Hubs. | ||
ActivityPub server for immers.space - a decentralized virtual reality metaverse platform powered by Mozilla Hubs and activitypub-express. | ||
Server | ||
* [x] Get followers with current location | ||
* [x] Streaming connection for updates/notifications | ||
Hubs client | ||
* [x] Follow button on users | ||
* [x] List followers with location in presence panel | ||
* [x] Update notification icon in VR | ||
* [x] Publish Arrive/Leave activities |
7721
194
17
5
+ Addedsocket.io@^2.3.0
+ Addedafter@0.8.2(transitive)
+ Addedarraybuffer.slice@0.0.7(transitive)
+ Addedbacko2@1.0.2(transitive)
+ Addedbase64-arraybuffer@0.1.4(transitive)
+ Addedbase64id@2.0.0(transitive)
+ Addedblob@0.0.5(transitive)
+ Addedcomponent-bind@1.0.0(transitive)
+ Addedcomponent-emitter@1.2.11.3.1(transitive)
+ Addedcomponent-inherit@0.0.3(transitive)
+ Addedcookie@0.4.2(transitive)
+ Addeddebug@3.1.04.1.1(transitive)
+ Addedengine.io@3.6.1(transitive)
+ Addedengine.io-client@3.5.3(transitive)
+ Addedengine.io-parser@2.2.1(transitive)
+ Addedhas-binary2@1.0.3(transitive)
+ Addedhas-cors@1.1.0(transitive)
+ Addedindexof@0.0.1(transitive)
+ Addedisarray@2.0.1(transitive)
+ Addedparseqs@0.0.6(transitive)
+ Addedparseuri@0.0.6(transitive)
+ Addedsocket.io@2.5.0(transitive)
+ Addedsocket.io-adapter@1.1.2(transitive)
+ Addedsocket.io-client@2.5.0(transitive)
+ Addedsocket.io-parser@3.3.33.4.3(transitive)
+ Addedto-array@0.1.4(transitive)
+ Addedws@7.4.6(transitive)
+ Addedxmlhttprequest-ssl@1.6.3(transitive)
+ Addedyeast@0.1.2(transitive)