Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit 1c7df88

Browse files
committed
Merge branch 'release/0.3.0-rc.1' into master
2 parents 2fdd227 + 29f4866 commit 1c7df88

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "orbit-db-http-api",
3-
"version": "0.2.0",
3+
"version": "0.3.0-rc.1",
44
"description": "An HTTP API Server for the OrbitDB distributed peer-to-peer database",
55
"main": "src/cli.js",
66
"keywords": [

src/lib/orbitdb-api.js

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
const Hapi = require('hapi');
22
const Boom = require('boom');
33
const Http2 = require('http2');
4+
const Susie = require('susie');
45

6+
require('events').EventEmitter.defaultMaxListeners = 50 //Set warning higher then normal to handle many clients
57

68
class OrbitdbAPI {
79
constructor (dbm, server_opts) {
810
let comparisons, rawiterator, getraw, unpack_contents, listener;
9-
let dbMiddleware;
11+
let dbMiddleware, addEventListener;
1012

1113
listener = Http2.createSecureServer(server_opts.http2_opts);
1214
this.server = new Hapi.Server({
@@ -54,6 +56,41 @@ class OrbitdbAPI {
5456
return contents
5557
};
5658

59+
addEventListener = (db, event_name, request, h) => {
60+
let event_map = new Map(Object.entries({
61+
'replicated': (address) =>
62+
h.event({event:'replicated', data: {address:address}}),
63+
'replicate': (address) =>
64+
h.event({event:'replicate', data: {address:address}}),
65+
'replicate.progress': (address, hash, entry, progress, have) =>
66+
h.event({event:'replicate.progress', data: {address:address, hash:hash, entry:entry, progress:progress, have:have}}),
67+
'load': (dbname) =>
68+
h.event({event:'load', data: {dbname:dbname}}),
69+
'load.progress': (address, hash, entry, progress, total) =>
70+
h.event({event:'load.progress', data: {address:address, hash:hash, entry:entry, progress:progress, total:total}}),
71+
'ready': (dbname, heads) =>
72+
h.event({event:'ready', data: {dbname:dbname, heads:heads}}),
73+
'write': (dbname, hash, entry) =>
74+
h.event({event:'write', data: {dbname:dbname, hash:hash, entry:entry}}),
75+
'closed': (dbname) =>
76+
h.event({event:'closed', data: {dbname:dbname}})
77+
}));
78+
79+
let event_callback = event_map.get(event_name)
80+
if(event_callback){
81+
db.events.on(event_name, event_callback)
82+
let keepalive = setInterval(() => h.event({event:'keep-alive'}), 10000)
83+
request.events.on('disconnect', () => {
84+
db.events.removeListener(event_name, event_callback)
85+
clearInterval(keepalive)
86+
})
87+
} else {
88+
if(this.debug) throw Boom.badRequest(`Unrecognized event name: $(event_name)`)
89+
throw Boom.badRequest('Unrecognized event name')
90+
}
91+
}
92+
93+
Promise.resolve(this.server.register(Susie)).catch((err) => {throw err});
5794
this.server.route([
5895
{
5996
method: 'GET',
@@ -229,7 +266,17 @@ class OrbitdbAPI {
229266
await db.access.grant('write', request.payload.publicKey)
230267
return {};
231268
})
232-
}
269+
},
270+
{
271+
method: 'GET',
272+
path: '/db/{dbname}/events/{eventname}',
273+
handler: dbMiddleware( async (db, request, h) => {
274+
let events = request.params.eventname.split(',')
275+
events.forEach((event_name) => addEventListener(db,event_name, request, h));
276+
return h.event({event:'registered', data: {eventnames:events}})
277+
})
278+
},
279+
233280
]);
234281
}
235282
}

0 commit comments

Comments
 (0)