@leofcoin/peernet 0.9.0 → 0.9.3
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/README.md +26 -2
- package/dist/browser/peernet.js +88 -37
- package/dist/commonjs/codec.js +2 -2
- package/dist/commonjs/peernet-message-b6925673.js +32 -0
- package/dist/commonjs/peernet.js +76 -25
- package/dist/module/peernet.js +85 -35
- package/package.json +1 -1
- package/test/lastBlock.js +7 -0
package/README.md
CHANGED
|
@@ -5,6 +5,30 @@
|
|
|
5
5
|
import discovery from 'socket-discovery'
|
|
6
6
|
```
|
|
7
7
|
|
|
8
|
+
## API
|
|
9
|
+
#### addRequestHandler
|
|
10
|
+
|
|
11
|
+
examples
|
|
12
|
+
```js
|
|
13
|
+
peernet.addRequestHandler('lastBlock', () => {
|
|
14
|
+
let response;
|
|
15
|
+
const height = await chainStore.get('localIndex')
|
|
16
|
+
const hash = await chainStore.get('localBlock')
|
|
17
|
+
response = JSON.stringify({ height: height.toString(), hash: hash.toString() })
|
|
18
|
+
return new ResponseMessage({ response })
|
|
19
|
+
// or
|
|
20
|
+
return new peernet.protos['peernet-response']({ response })
|
|
21
|
+
})
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```js
|
|
25
|
+
peernet.addRequestHandler('hello', () => {
|
|
26
|
+
return new ResponseMessage({ response: 'hi' })
|
|
27
|
+
// or
|
|
28
|
+
return new peernet.protos['peernet-response']({ response: 'hi' })
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
8
32
|
## Development
|
|
9
33
|
### watch
|
|
10
34
|
```sh
|
|
@@ -19,7 +43,7 @@ npm run c
|
|
|
19
43
|
npm run demo
|
|
20
44
|
```
|
|
21
45
|
|
|
22
|
-
`note: you need to install jsproject`
|
|
46
|
+
`note: you need to install jsproject`
|
|
23
47
|
```sh
|
|
24
48
|
npm i -g @vandeurenglenn/project
|
|
25
|
-
```
|
|
49
|
+
```
|
package/dist/browser/peernet.js
CHANGED
|
@@ -261,7 +261,7 @@ class LeofcoinStorage$1 {
|
|
|
261
261
|
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
var version = "0.
|
|
264
|
+
var version = "0.9.2";
|
|
265
265
|
|
|
266
266
|
var api$1 = {
|
|
267
267
|
version: ({send}) => send({client: '@peernet/api/http', version}),
|
|
@@ -916,7 +916,7 @@ class LeofcoinStorageClient {
|
|
|
916
916
|
}
|
|
917
917
|
}
|
|
918
918
|
|
|
919
|
-
var proto$
|
|
919
|
+
var proto$a = `
|
|
920
920
|
// PeernetMessage
|
|
921
921
|
message PeernetMessage {
|
|
922
922
|
required bytes data = 1;
|
|
@@ -1002,8 +1002,8 @@ var codecs = {
|
|
|
1002
1002
|
// chat message
|
|
1003
1003
|
'chat-message': {
|
|
1004
1004
|
codec: '636d',
|
|
1005
|
-
hashAlg: 'dbl-keccak-512'
|
|
1006
|
-
}
|
|
1005
|
+
hashAlg: 'dbl-keccak-512',
|
|
1006
|
+
},
|
|
1007
1007
|
};
|
|
1008
1008
|
|
|
1009
1009
|
class PeernetCodec {
|
|
@@ -1395,11 +1395,11 @@ class PeernetMessage extends FormatInterface {
|
|
|
1395
1395
|
|
|
1396
1396
|
constructor(buffer) {
|
|
1397
1397
|
const name = 'peernet-message';
|
|
1398
|
-
super(buffer, protons__default['default'](proto$
|
|
1398
|
+
super(buffer, protons__default['default'](proto$a).PeernetMessage, {name});
|
|
1399
1399
|
}
|
|
1400
1400
|
}
|
|
1401
1401
|
|
|
1402
|
-
var proto$
|
|
1402
|
+
var proto$9 = `
|
|
1403
1403
|
// PeernetDHTMessage
|
|
1404
1404
|
message PeernetDHTMessage {
|
|
1405
1405
|
required string hash = 1;
|
|
@@ -1425,11 +1425,11 @@ class DHTMessage extends FormatInterface {
|
|
|
1425
1425
|
|
|
1426
1426
|
constructor(data) {
|
|
1427
1427
|
const name = 'peernet-dht';
|
|
1428
|
-
super(data, protons__default['default'](proto$
|
|
1428
|
+
super(data, protons__default['default'](proto$9).PeernetDHTMessage, {name});
|
|
1429
1429
|
}
|
|
1430
1430
|
}
|
|
1431
1431
|
|
|
1432
|
-
var proto$
|
|
1432
|
+
var proto$8 = `
|
|
1433
1433
|
// PeernetDHTMessageResponse
|
|
1434
1434
|
message PeernetDHTMessageResponse {
|
|
1435
1435
|
required string hash = 1;
|
|
@@ -1444,11 +1444,11 @@ class DHTMessageResponse extends FormatInterface {
|
|
|
1444
1444
|
|
|
1445
1445
|
constructor(data) {
|
|
1446
1446
|
const name = 'peernet-dht-response';
|
|
1447
|
-
super(data, protons__default['default'](proto$
|
|
1447
|
+
super(data, protons__default['default'](proto$8).PeernetDHTMessageResponse, {name});
|
|
1448
1448
|
}
|
|
1449
1449
|
}
|
|
1450
1450
|
|
|
1451
|
-
var proto$
|
|
1451
|
+
var proto$7 = `
|
|
1452
1452
|
// PeernetDataMessage
|
|
1453
1453
|
message PeernetDataMessage {
|
|
1454
1454
|
required string hash = 1;
|
|
@@ -1463,11 +1463,11 @@ class DataMessage extends FormatInterface {
|
|
|
1463
1463
|
|
|
1464
1464
|
constructor(data) {
|
|
1465
1465
|
const name = 'peernet-data';
|
|
1466
|
-
super(data, protons__default['default'](proto$
|
|
1466
|
+
super(data, protons__default['default'](proto$7).PeernetDataMessage, {name});
|
|
1467
1467
|
}
|
|
1468
1468
|
}
|
|
1469
1469
|
|
|
1470
|
-
var proto$
|
|
1470
|
+
var proto$6 = `
|
|
1471
1471
|
// PsMessage
|
|
1472
1472
|
message PsMessage {
|
|
1473
1473
|
required bytes data = 1;
|
|
@@ -1481,11 +1481,11 @@ class PsMessage extends FormatInterface {
|
|
|
1481
1481
|
|
|
1482
1482
|
constructor(buffer) {
|
|
1483
1483
|
const name = 'peernet-ps';
|
|
1484
|
-
super(buffer, protons__default['default'](proto$
|
|
1484
|
+
super(buffer, protons__default['default'](proto$6).PsMessage, {name});
|
|
1485
1485
|
}
|
|
1486
1486
|
}
|
|
1487
1487
|
|
|
1488
|
-
var proto$
|
|
1488
|
+
var proto$5 = `
|
|
1489
1489
|
// PeernetPeerMessage
|
|
1490
1490
|
message PeernetPeerMessage {
|
|
1491
1491
|
required string id = 1;
|
|
@@ -1499,11 +1499,11 @@ class PeerMessage extends FormatInterface {
|
|
|
1499
1499
|
|
|
1500
1500
|
constructor(data) {
|
|
1501
1501
|
const name = 'peernet-peer';
|
|
1502
|
-
super(data, protons__default['default'](proto$
|
|
1502
|
+
super(data, protons__default['default'](proto$5).PeernetPeerMessage, {name});
|
|
1503
1503
|
}
|
|
1504
1504
|
}
|
|
1505
1505
|
|
|
1506
|
-
var proto$
|
|
1506
|
+
var proto$4 = `
|
|
1507
1507
|
// PeernetRequestMessage
|
|
1508
1508
|
message PeernetRequestMessage {
|
|
1509
1509
|
required string request = 1;
|
|
@@ -1517,11 +1517,11 @@ class RequestMessage extends FormatInterface {
|
|
|
1517
1517
|
|
|
1518
1518
|
constructor(data) {
|
|
1519
1519
|
const name = 'peernet-request';
|
|
1520
|
-
super(data, protons__default['default'](proto$
|
|
1520
|
+
super(data, protons__default['default'](proto$4).PeernetRequestMessage, {name});
|
|
1521
1521
|
}
|
|
1522
1522
|
}
|
|
1523
1523
|
|
|
1524
|
-
var proto$
|
|
1524
|
+
var proto$3 = `
|
|
1525
1525
|
// PeernetResponseMessage
|
|
1526
1526
|
message PeernetResponseMessage {
|
|
1527
1527
|
required string response = 1;
|
|
@@ -1535,11 +1535,11 @@ class ResponseMessage extends FormatInterface {
|
|
|
1535
1535
|
|
|
1536
1536
|
constructor(data) {
|
|
1537
1537
|
const name = 'peernet-response';
|
|
1538
|
-
super(data, protons__default['default'](proto$
|
|
1538
|
+
super(data, protons__default['default'](proto$3).PeernetResponseMessage, {name});
|
|
1539
1539
|
}
|
|
1540
1540
|
}
|
|
1541
1541
|
|
|
1542
|
-
var proto$
|
|
1542
|
+
var proto$2 = `
|
|
1543
1543
|
// PeernetPeerMessageResponse
|
|
1544
1544
|
message PeernetPeerMessageResponse {
|
|
1545
1545
|
required string id = 1;
|
|
@@ -1553,11 +1553,11 @@ class PeerMessageResponse extends FormatInterface {
|
|
|
1553
1553
|
|
|
1554
1554
|
constructor(data) {
|
|
1555
1555
|
const name = 'peernet-peer-response';
|
|
1556
|
-
super(data, protons__default['default'](proto$
|
|
1556
|
+
super(data, protons__default['default'](proto$2).PeernetPeerMessageResponse, {name});
|
|
1557
1557
|
}
|
|
1558
1558
|
}
|
|
1559
1559
|
|
|
1560
|
-
var proto = `
|
|
1560
|
+
var proto$1 = `
|
|
1561
1561
|
// PeernetDataMessageResponse
|
|
1562
1562
|
message PeernetDataMessageResponse {
|
|
1563
1563
|
required string hash = 1;
|
|
@@ -1572,7 +1572,26 @@ class DataMessageResponse extends FormatInterface {
|
|
|
1572
1572
|
|
|
1573
1573
|
constructor(data) {
|
|
1574
1574
|
const name = 'peernet-data-response';
|
|
1575
|
-
super(data, protons__default['default'](proto).PeernetDataMessageResponse, {name});
|
|
1575
|
+
super(data, protons__default['default'](proto$1).PeernetDataMessageResponse, {name});
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
var proto = `
|
|
1580
|
+
message ChatMessage {
|
|
1581
|
+
required string value = 1;
|
|
1582
|
+
required string author = 2;
|
|
1583
|
+
required uint64 timestamp = 3;
|
|
1584
|
+
repeated string files = 4;
|
|
1585
|
+
}`;
|
|
1586
|
+
|
|
1587
|
+
class ChatMessage extends FormatInterface {
|
|
1588
|
+
get keys() {
|
|
1589
|
+
return ['author', 'value', 'timestamp', 'files']
|
|
1590
|
+
}
|
|
1591
|
+
|
|
1592
|
+
constructor(buffer) {
|
|
1593
|
+
const name = 'chat-message';
|
|
1594
|
+
super(buffer, protons__default['default'](proto).ChatMessage, {name});
|
|
1576
1595
|
}
|
|
1577
1596
|
}
|
|
1578
1597
|
|
|
@@ -1977,7 +1996,7 @@ class Peernet {
|
|
|
1977
1996
|
}
|
|
1978
1997
|
|
|
1979
1998
|
get defaultStores() {
|
|
1980
|
-
return ['account', 'wallet', 'block', 'transaction', 'chain', 'data']
|
|
1999
|
+
return ['account', 'wallet', 'block', 'transaction', 'chain', 'data', 'message']
|
|
1981
2000
|
}
|
|
1982
2001
|
|
|
1983
2002
|
addProto(name, proto) {
|
|
@@ -1990,7 +2009,7 @@ class Peernet {
|
|
|
1990
2009
|
|
|
1991
2010
|
async addStore(name, prefix, root, isPrivate = true) {
|
|
1992
2011
|
if (name === 'block' || name === 'transaction' || name === 'chain' ||
|
|
1993
|
-
name === 'data') isPrivate = false;
|
|
2012
|
+
name === 'data' || name === 'message') isPrivate = false;
|
|
1994
2013
|
|
|
1995
2014
|
let Storage;
|
|
1996
2015
|
if (this.hasDaemon) {
|
|
@@ -2043,6 +2062,7 @@ class Peernet {
|
|
|
2043
2062
|
*/
|
|
2044
2063
|
this.peerMap = new Map();
|
|
2045
2064
|
this.stores = [];
|
|
2065
|
+
this.requestProtos = {};
|
|
2046
2066
|
this.storePrefix = options.storePrefix;
|
|
2047
2067
|
this.root = options.root;
|
|
2048
2068
|
|
|
@@ -2066,6 +2086,7 @@ class Peernet {
|
|
|
2066
2086
|
'peernet-data': DataMessage,
|
|
2067
2087
|
'peernet-data-response': DataMessageResponse,
|
|
2068
2088
|
'peernet-ps': PsMessage,
|
|
2089
|
+
'chat-message': ChatMessage,
|
|
2069
2090
|
};
|
|
2070
2091
|
this.protos = globalThis.peernet.protos;
|
|
2071
2092
|
|
|
@@ -2166,6 +2187,10 @@ class Peernet {
|
|
|
2166
2187
|
}
|
|
2167
2188
|
}
|
|
2168
2189
|
|
|
2190
|
+
addRequestHandler(name, method) {
|
|
2191
|
+
this.requestProtos[name] = method;
|
|
2192
|
+
}
|
|
2193
|
+
|
|
2169
2194
|
/**
|
|
2170
2195
|
* @private
|
|
2171
2196
|
*
|
|
@@ -2268,16 +2293,13 @@ class Peernet {
|
|
|
2268
2293
|
} else if (proto.name === 'peernet-request') {
|
|
2269
2294
|
// TODO: make dynamic
|
|
2270
2295
|
// exposeddevapi[proto.decoded.request](proto.decoded.params)
|
|
2271
|
-
|
|
2272
|
-
if (
|
|
2273
|
-
const
|
|
2274
|
-
const hash = await chainStore.get('localBlock');
|
|
2275
|
-
response = JSON.stringify({ height: height.toString(), hash: hash.toString() });
|
|
2276
|
-
const data = new ResponseMessage({ response });
|
|
2296
|
+
const method = this.requestProtos[proto.decoded.request];
|
|
2297
|
+
if (method) {
|
|
2298
|
+
const data = await method();
|
|
2277
2299
|
const node = await this.prepareMessage(from, data.encoded);
|
|
2278
|
-
|
|
2279
2300
|
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
2280
2301
|
}
|
|
2302
|
+
|
|
2281
2303
|
} else if (proto.name === 'peernet-ps' &&
|
|
2282
2304
|
this._getPeerId(peer.id) !== this.id.toString()) {
|
|
2283
2305
|
globalSub.publish(proto.decoded.topic.toString(), proto.decoded.data.toString());
|
|
@@ -2418,6 +2440,35 @@ class Peernet {
|
|
|
2418
2440
|
return null
|
|
2419
2441
|
}
|
|
2420
2442
|
|
|
2443
|
+
|
|
2444
|
+
get message() {
|
|
2445
|
+
return {
|
|
2446
|
+
/**
|
|
2447
|
+
* Get content for given message hash
|
|
2448
|
+
*
|
|
2449
|
+
* @param {String} hash
|
|
2450
|
+
*/
|
|
2451
|
+
get: async (hash) => {
|
|
2452
|
+
debug(`get message ${hash}`);
|
|
2453
|
+
const message = await messageStore.has(hash);
|
|
2454
|
+
if (message) return await messageStore.get(hash)
|
|
2455
|
+
return this.requestData(hash, 'message')
|
|
2456
|
+
},
|
|
2457
|
+
/**
|
|
2458
|
+
* put message content
|
|
2459
|
+
*
|
|
2460
|
+
* @param {String} hash
|
|
2461
|
+
* @param {Buffer} message
|
|
2462
|
+
*/
|
|
2463
|
+
put: async (hash, message) => await messageStore.put(hash, message),
|
|
2464
|
+
/**
|
|
2465
|
+
* @param {String} hash
|
|
2466
|
+
* @return {Boolean}
|
|
2467
|
+
*/
|
|
2468
|
+
has: async (hash) => await messageStore.has(hash),
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
|
|
2421
2472
|
get data() {
|
|
2422
2473
|
return {
|
|
2423
2474
|
/**
|
|
@@ -2508,16 +2559,16 @@ class Peernet {
|
|
|
2508
2559
|
*/
|
|
2509
2560
|
async publish(topic, data) {
|
|
2510
2561
|
// globalSub.publish(topic, data)
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
2562
|
if (!Buffer.isBuffer(topic)) topic = Buffer.from(topic);
|
|
2514
2563
|
if (!Buffer.isBuffer(data)) data = Buffer.from(data);
|
|
2515
2564
|
const id = Math.random().toString(36).slice(-12);
|
|
2516
2565
|
data = new PsMessage({data, topic});
|
|
2517
2566
|
for (const peer of this.peers) {
|
|
2518
|
-
if (peer.connection._connected
|
|
2519
|
-
|
|
2520
|
-
|
|
2567
|
+
if (peer.connection._connected) {
|
|
2568
|
+
if (peer.id.toString() !== this.peerId.toString()) {
|
|
2569
|
+
const node = await this.prepareMessage(peer.id, data.encoded);
|
|
2570
|
+
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
2571
|
+
}
|
|
2521
2572
|
} else {
|
|
2522
2573
|
this.removePeer(peer);
|
|
2523
2574
|
}
|
package/dist/commonjs/codec.js
CHANGED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var protons = require('protons');
|
|
4
|
+
var codecFormatInterface = require('./codec-format-interface.js');
|
|
5
|
+
|
|
6
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
7
|
+
|
|
8
|
+
var protons__default = /*#__PURE__*/_interopDefaultLegacy(protons);
|
|
9
|
+
|
|
10
|
+
var proto = `
|
|
11
|
+
// PeernetMessage
|
|
12
|
+
message PeernetMessage {
|
|
13
|
+
required bytes data = 1;
|
|
14
|
+
required bytes signature = 2;
|
|
15
|
+
optional bytes from = 3;
|
|
16
|
+
optional bytes to = 4;
|
|
17
|
+
optional string id = 5;
|
|
18
|
+
}`;
|
|
19
|
+
|
|
20
|
+
class PeernetMessage extends codecFormatInterface {
|
|
21
|
+
get keys() {
|
|
22
|
+
return ['data', 'signature', 'from', 'to', 'id']
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
constructor(buffer) {
|
|
26
|
+
const name = 'peernet-message';
|
|
27
|
+
super(buffer, protons__default['default'](proto).PeernetMessage, {name});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.PeernetMessage = PeernetMessage;
|
|
32
|
+
exports.proto = proto;
|
package/dist/commonjs/peernet.js
CHANGED
|
@@ -264,7 +264,7 @@ class LeofcoinStorage$1 {
|
|
|
264
264
|
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
-
var version = "0.
|
|
267
|
+
var version = "0.9.2";
|
|
268
268
|
|
|
269
269
|
var api$1 = {
|
|
270
270
|
version: ({send}) => send({client: '@peernet/api/http', version}),
|
|
@@ -919,7 +919,7 @@ class LeofcoinStorageClient {
|
|
|
919
919
|
}
|
|
920
920
|
}
|
|
921
921
|
|
|
922
|
-
var proto$
|
|
922
|
+
var proto$5 = `
|
|
923
923
|
// PeernetDataMessage
|
|
924
924
|
message PeernetDataMessage {
|
|
925
925
|
required string hash = 1;
|
|
@@ -934,11 +934,11 @@ class DataMessage extends codecFormatInterface {
|
|
|
934
934
|
|
|
935
935
|
constructor(data) {
|
|
936
936
|
const name = 'peernet-data';
|
|
937
|
-
super(data, protons__default['default'](proto$
|
|
937
|
+
super(data, protons__default['default'](proto$5).PeernetDataMessage, {name});
|
|
938
938
|
}
|
|
939
939
|
}
|
|
940
940
|
|
|
941
|
-
var proto$
|
|
941
|
+
var proto$4 = `
|
|
942
942
|
// PsMessage
|
|
943
943
|
message PsMessage {
|
|
944
944
|
required bytes data = 1;
|
|
@@ -952,11 +952,11 @@ class PsMessage extends codecFormatInterface {
|
|
|
952
952
|
|
|
953
953
|
constructor(buffer) {
|
|
954
954
|
const name = 'peernet-ps';
|
|
955
|
-
super(buffer, protons__default['default'](proto$
|
|
955
|
+
super(buffer, protons__default['default'](proto$4).PsMessage, {name});
|
|
956
956
|
}
|
|
957
957
|
}
|
|
958
958
|
|
|
959
|
-
var proto$
|
|
959
|
+
var proto$3 = `
|
|
960
960
|
// PeernetPeerMessage
|
|
961
961
|
message PeernetPeerMessage {
|
|
962
962
|
required string id = 1;
|
|
@@ -970,11 +970,11 @@ class PeerMessage extends codecFormatInterface {
|
|
|
970
970
|
|
|
971
971
|
constructor(data) {
|
|
972
972
|
const name = 'peernet-peer';
|
|
973
|
-
super(data, protons__default['default'](proto$
|
|
973
|
+
super(data, protons__default['default'](proto$3).PeernetPeerMessage, {name});
|
|
974
974
|
}
|
|
975
975
|
}
|
|
976
976
|
|
|
977
|
-
var proto$
|
|
977
|
+
var proto$2 = `
|
|
978
978
|
// PeernetPeerMessageResponse
|
|
979
979
|
message PeernetPeerMessageResponse {
|
|
980
980
|
required string id = 1;
|
|
@@ -988,11 +988,11 @@ class PeerMessageResponse extends codecFormatInterface {
|
|
|
988
988
|
|
|
989
989
|
constructor(data) {
|
|
990
990
|
const name = 'peernet-peer-response';
|
|
991
|
-
super(data, protons__default['default'](proto$
|
|
991
|
+
super(data, protons__default['default'](proto$2).PeernetPeerMessageResponse, {name});
|
|
992
992
|
}
|
|
993
993
|
}
|
|
994
994
|
|
|
995
|
-
var proto = `
|
|
995
|
+
var proto$1 = `
|
|
996
996
|
// PeernetDataMessageResponse
|
|
997
997
|
message PeernetDataMessageResponse {
|
|
998
998
|
required string hash = 1;
|
|
@@ -1007,7 +1007,26 @@ class DataMessageResponse extends codecFormatInterface {
|
|
|
1007
1007
|
|
|
1008
1008
|
constructor(data) {
|
|
1009
1009
|
const name = 'peernet-data-response';
|
|
1010
|
-
super(data, protons__default['default'](proto).PeernetDataMessageResponse, {name});
|
|
1010
|
+
super(data, protons__default['default'](proto$1).PeernetDataMessageResponse, {name});
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
var proto = `
|
|
1015
|
+
message ChatMessage {
|
|
1016
|
+
required string value = 1;
|
|
1017
|
+
required string author = 2;
|
|
1018
|
+
required uint64 timestamp = 3;
|
|
1019
|
+
repeated string files = 4;
|
|
1020
|
+
}`;
|
|
1021
|
+
|
|
1022
|
+
class ChatMessage extends codecFormatInterface {
|
|
1023
|
+
get keys() {
|
|
1024
|
+
return ['author', 'value', 'timestamp', 'files']
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
constructor(buffer) {
|
|
1028
|
+
const name = 'chat-message';
|
|
1029
|
+
super(buffer, protons__default['default'](proto).ChatMessage, {name});
|
|
1011
1030
|
}
|
|
1012
1031
|
}
|
|
1013
1032
|
|
|
@@ -1412,7 +1431,7 @@ class Peernet {
|
|
|
1412
1431
|
}
|
|
1413
1432
|
|
|
1414
1433
|
get defaultStores() {
|
|
1415
|
-
return ['account', 'wallet', 'block', 'transaction', 'chain', 'data']
|
|
1434
|
+
return ['account', 'wallet', 'block', 'transaction', 'chain', 'data', 'message']
|
|
1416
1435
|
}
|
|
1417
1436
|
|
|
1418
1437
|
addProto(name, proto) {
|
|
@@ -1425,7 +1444,7 @@ class Peernet {
|
|
|
1425
1444
|
|
|
1426
1445
|
async addStore(name, prefix, root, isPrivate = true) {
|
|
1427
1446
|
if (name === 'block' || name === 'transaction' || name === 'chain' ||
|
|
1428
|
-
name === 'data') isPrivate = false;
|
|
1447
|
+
name === 'data' || name === 'message') isPrivate = false;
|
|
1429
1448
|
|
|
1430
1449
|
let Storage;
|
|
1431
1450
|
if (this.hasDaemon) {
|
|
@@ -1478,6 +1497,7 @@ class Peernet {
|
|
|
1478
1497
|
*/
|
|
1479
1498
|
this.peerMap = new Map();
|
|
1480
1499
|
this.stores = [];
|
|
1500
|
+
this.requestProtos = {};
|
|
1481
1501
|
this.storePrefix = options.storePrefix;
|
|
1482
1502
|
this.root = options.root;
|
|
1483
1503
|
|
|
@@ -1501,6 +1521,7 @@ class Peernet {
|
|
|
1501
1521
|
'peernet-data': DataMessage,
|
|
1502
1522
|
'peernet-data-response': DataMessageResponse,
|
|
1503
1523
|
'peernet-ps': PsMessage,
|
|
1524
|
+
'chat-message': ChatMessage,
|
|
1504
1525
|
};
|
|
1505
1526
|
this.protos = globalThis.peernet.protos;
|
|
1506
1527
|
|
|
@@ -1601,6 +1622,10 @@ class Peernet {
|
|
|
1601
1622
|
}
|
|
1602
1623
|
}
|
|
1603
1624
|
|
|
1625
|
+
addRequestHandler(name, method) {
|
|
1626
|
+
this.requestProtos[name] = method;
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1604
1629
|
/**
|
|
1605
1630
|
* @private
|
|
1606
1631
|
*
|
|
@@ -1703,16 +1728,13 @@ class Peernet {
|
|
|
1703
1728
|
} else if (proto.name === 'peernet-request') {
|
|
1704
1729
|
// TODO: make dynamic
|
|
1705
1730
|
// exposeddevapi[proto.decoded.request](proto.decoded.params)
|
|
1706
|
-
|
|
1707
|
-
if (
|
|
1708
|
-
const
|
|
1709
|
-
const hash = await chainStore.get('localBlock');
|
|
1710
|
-
response$1 = JSON.stringify({ height: height.toString(), hash: hash.toString() });
|
|
1711
|
-
const data = new response({ response: response$1 });
|
|
1731
|
+
const method = this.requestProtos[proto.decoded.request];
|
|
1732
|
+
if (method) {
|
|
1733
|
+
const data = await method();
|
|
1712
1734
|
const node = await this.prepareMessage(from, data.encoded);
|
|
1713
|
-
|
|
1714
1735
|
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
1715
1736
|
}
|
|
1737
|
+
|
|
1716
1738
|
} else if (proto.name === 'peernet-ps' &&
|
|
1717
1739
|
this._getPeerId(peer.id) !== this.id.toString()) {
|
|
1718
1740
|
globalSub.publish(proto.decoded.topic.toString(), proto.decoded.data.toString());
|
|
@@ -1853,6 +1875,35 @@ class Peernet {
|
|
|
1853
1875
|
return null
|
|
1854
1876
|
}
|
|
1855
1877
|
|
|
1878
|
+
|
|
1879
|
+
get message() {
|
|
1880
|
+
return {
|
|
1881
|
+
/**
|
|
1882
|
+
* Get content for given message hash
|
|
1883
|
+
*
|
|
1884
|
+
* @param {String} hash
|
|
1885
|
+
*/
|
|
1886
|
+
get: async (hash) => {
|
|
1887
|
+
debug(`get message ${hash}`);
|
|
1888
|
+
const message = await messageStore.has(hash);
|
|
1889
|
+
if (message) return await messageStore.get(hash)
|
|
1890
|
+
return this.requestData(hash, 'message')
|
|
1891
|
+
},
|
|
1892
|
+
/**
|
|
1893
|
+
* put message content
|
|
1894
|
+
*
|
|
1895
|
+
* @param {String} hash
|
|
1896
|
+
* @param {Buffer} message
|
|
1897
|
+
*/
|
|
1898
|
+
put: async (hash, message) => await messageStore.put(hash, message),
|
|
1899
|
+
/**
|
|
1900
|
+
* @param {String} hash
|
|
1901
|
+
* @return {Boolean}
|
|
1902
|
+
*/
|
|
1903
|
+
has: async (hash) => await messageStore.has(hash),
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1856
1907
|
get data() {
|
|
1857
1908
|
return {
|
|
1858
1909
|
/**
|
|
@@ -1943,16 +1994,16 @@ class Peernet {
|
|
|
1943
1994
|
*/
|
|
1944
1995
|
async publish(topic, data) {
|
|
1945
1996
|
// globalSub.publish(topic, data)
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
1997
|
if (!Buffer.isBuffer(topic)) topic = Buffer.from(topic);
|
|
1949
1998
|
if (!Buffer.isBuffer(data)) data = Buffer.from(data);
|
|
1950
1999
|
const id = Math.random().toString(36).slice(-12);
|
|
1951
2000
|
data = new PsMessage({data, topic});
|
|
1952
2001
|
for (const peer of this.peers) {
|
|
1953
|
-
if (peer.connection._connected
|
|
1954
|
-
|
|
1955
|
-
|
|
2002
|
+
if (peer.connection._connected) {
|
|
2003
|
+
if (peer.id.toString() !== this.peerId.toString()) {
|
|
2004
|
+
const node = await this.prepareMessage(peer.id, data.encoded);
|
|
2005
|
+
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
2006
|
+
}
|
|
1956
2007
|
} else {
|
|
1957
2008
|
this.removePeer(peer);
|
|
1958
2009
|
}
|
package/dist/module/peernet.js
CHANGED
|
@@ -244,7 +244,7 @@ class LeofcoinStorage$1 {
|
|
|
244
244
|
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
-
var version = "0.
|
|
247
|
+
var version = "0.9.2";
|
|
248
248
|
|
|
249
249
|
var api$1 = {
|
|
250
250
|
version: ({send}) => send({client: '@peernet/api/http', version}),
|
|
@@ -899,7 +899,7 @@ class LeofcoinStorageClient {
|
|
|
899
899
|
}
|
|
900
900
|
}
|
|
901
901
|
|
|
902
|
-
var proto$
|
|
902
|
+
var proto$a = `
|
|
903
903
|
// PeernetMessage
|
|
904
904
|
message PeernetMessage {
|
|
905
905
|
required bytes data = 1;
|
|
@@ -1378,11 +1378,11 @@ class PeernetMessage extends FormatInterface {
|
|
|
1378
1378
|
|
|
1379
1379
|
constructor(buffer) {
|
|
1380
1380
|
const name = 'peernet-message';
|
|
1381
|
-
super(buffer, protons(proto$
|
|
1381
|
+
super(buffer, protons(proto$a).PeernetMessage, {name});
|
|
1382
1382
|
}
|
|
1383
1383
|
}
|
|
1384
1384
|
|
|
1385
|
-
var proto$
|
|
1385
|
+
var proto$9 = `
|
|
1386
1386
|
// PeernetDHTMessage
|
|
1387
1387
|
message PeernetDHTMessage {
|
|
1388
1388
|
required string hash = 1;
|
|
@@ -1408,11 +1408,11 @@ class DHTMessage extends FormatInterface {
|
|
|
1408
1408
|
|
|
1409
1409
|
constructor(data) {
|
|
1410
1410
|
const name = 'peernet-dht';
|
|
1411
|
-
super(data, protons(proto$
|
|
1411
|
+
super(data, protons(proto$9).PeernetDHTMessage, {name});
|
|
1412
1412
|
}
|
|
1413
1413
|
}
|
|
1414
1414
|
|
|
1415
|
-
var proto$
|
|
1415
|
+
var proto$8 = `
|
|
1416
1416
|
// PeernetDHTMessageResponse
|
|
1417
1417
|
message PeernetDHTMessageResponse {
|
|
1418
1418
|
required string hash = 1;
|
|
@@ -1427,11 +1427,11 @@ class DHTMessageResponse extends FormatInterface {
|
|
|
1427
1427
|
|
|
1428
1428
|
constructor(data) {
|
|
1429
1429
|
const name = 'peernet-dht-response';
|
|
1430
|
-
super(data, protons(proto$
|
|
1430
|
+
super(data, protons(proto$8).PeernetDHTMessageResponse, {name});
|
|
1431
1431
|
}
|
|
1432
1432
|
}
|
|
1433
1433
|
|
|
1434
|
-
var proto$
|
|
1434
|
+
var proto$7 = `
|
|
1435
1435
|
// PeernetDataMessage
|
|
1436
1436
|
message PeernetDataMessage {
|
|
1437
1437
|
required string hash = 1;
|
|
@@ -1446,11 +1446,11 @@ class DataMessage extends FormatInterface {
|
|
|
1446
1446
|
|
|
1447
1447
|
constructor(data) {
|
|
1448
1448
|
const name = 'peernet-data';
|
|
1449
|
-
super(data, protons(proto$
|
|
1449
|
+
super(data, protons(proto$7).PeernetDataMessage, {name});
|
|
1450
1450
|
}
|
|
1451
1451
|
}
|
|
1452
1452
|
|
|
1453
|
-
var proto$
|
|
1453
|
+
var proto$6 = `
|
|
1454
1454
|
// PsMessage
|
|
1455
1455
|
message PsMessage {
|
|
1456
1456
|
required bytes data = 1;
|
|
@@ -1464,11 +1464,11 @@ class PsMessage extends FormatInterface {
|
|
|
1464
1464
|
|
|
1465
1465
|
constructor(buffer) {
|
|
1466
1466
|
const name = 'peernet-ps';
|
|
1467
|
-
super(buffer, protons(proto$
|
|
1467
|
+
super(buffer, protons(proto$6).PsMessage, {name});
|
|
1468
1468
|
}
|
|
1469
1469
|
}
|
|
1470
1470
|
|
|
1471
|
-
var proto$
|
|
1471
|
+
var proto$5 = `
|
|
1472
1472
|
// PeernetPeerMessage
|
|
1473
1473
|
message PeernetPeerMessage {
|
|
1474
1474
|
required string id = 1;
|
|
@@ -1482,11 +1482,11 @@ class PeerMessage extends FormatInterface {
|
|
|
1482
1482
|
|
|
1483
1483
|
constructor(data) {
|
|
1484
1484
|
const name = 'peernet-peer';
|
|
1485
|
-
super(data, protons(proto$
|
|
1485
|
+
super(data, protons(proto$5).PeernetPeerMessage, {name});
|
|
1486
1486
|
}
|
|
1487
1487
|
}
|
|
1488
1488
|
|
|
1489
|
-
var proto$
|
|
1489
|
+
var proto$4 = `
|
|
1490
1490
|
// PeernetRequestMessage
|
|
1491
1491
|
message PeernetRequestMessage {
|
|
1492
1492
|
required string request = 1;
|
|
@@ -1500,11 +1500,11 @@ class RequestMessage extends FormatInterface {
|
|
|
1500
1500
|
|
|
1501
1501
|
constructor(data) {
|
|
1502
1502
|
const name = 'peernet-request';
|
|
1503
|
-
super(data, protons(proto$
|
|
1503
|
+
super(data, protons(proto$4).PeernetRequestMessage, {name});
|
|
1504
1504
|
}
|
|
1505
1505
|
}
|
|
1506
1506
|
|
|
1507
|
-
var proto$
|
|
1507
|
+
var proto$3 = `
|
|
1508
1508
|
// PeernetResponseMessage
|
|
1509
1509
|
message PeernetResponseMessage {
|
|
1510
1510
|
required string response = 1;
|
|
@@ -1518,11 +1518,11 @@ class ResponseMessage extends FormatInterface {
|
|
|
1518
1518
|
|
|
1519
1519
|
constructor(data) {
|
|
1520
1520
|
const name = 'peernet-response';
|
|
1521
|
-
super(data, protons(proto$
|
|
1521
|
+
super(data, protons(proto$3).PeernetResponseMessage, {name});
|
|
1522
1522
|
}
|
|
1523
1523
|
}
|
|
1524
1524
|
|
|
1525
|
-
var proto$
|
|
1525
|
+
var proto$2 = `
|
|
1526
1526
|
// PeernetPeerMessageResponse
|
|
1527
1527
|
message PeernetPeerMessageResponse {
|
|
1528
1528
|
required string id = 1;
|
|
@@ -1536,11 +1536,11 @@ class PeerMessageResponse extends FormatInterface {
|
|
|
1536
1536
|
|
|
1537
1537
|
constructor(data) {
|
|
1538
1538
|
const name = 'peernet-peer-response';
|
|
1539
|
-
super(data, protons(proto$
|
|
1539
|
+
super(data, protons(proto$2).PeernetPeerMessageResponse, {name});
|
|
1540
1540
|
}
|
|
1541
1541
|
}
|
|
1542
1542
|
|
|
1543
|
-
var proto = `
|
|
1543
|
+
var proto$1 = `
|
|
1544
1544
|
// PeernetDataMessageResponse
|
|
1545
1545
|
message PeernetDataMessageResponse {
|
|
1546
1546
|
required string hash = 1;
|
|
@@ -1555,7 +1555,26 @@ class DataMessageResponse extends FormatInterface {
|
|
|
1555
1555
|
|
|
1556
1556
|
constructor(data) {
|
|
1557
1557
|
const name = 'peernet-data-response';
|
|
1558
|
-
super(data, protons(proto).PeernetDataMessageResponse, {name});
|
|
1558
|
+
super(data, protons(proto$1).PeernetDataMessageResponse, {name});
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
var proto = `
|
|
1563
|
+
message ChatMessage {
|
|
1564
|
+
required string value = 1;
|
|
1565
|
+
required string author = 2;
|
|
1566
|
+
required uint64 timestamp = 3;
|
|
1567
|
+
repeated string files = 4;
|
|
1568
|
+
}`;
|
|
1569
|
+
|
|
1570
|
+
class ChatMessage extends FormatInterface {
|
|
1571
|
+
get keys() {
|
|
1572
|
+
return ['author', 'value', 'timestamp', 'files']
|
|
1573
|
+
}
|
|
1574
|
+
|
|
1575
|
+
constructor(buffer) {
|
|
1576
|
+
const name = 'chat-message';
|
|
1577
|
+
super(buffer, protons(proto).ChatMessage, {name});
|
|
1559
1578
|
}
|
|
1560
1579
|
}
|
|
1561
1580
|
|
|
@@ -1960,7 +1979,7 @@ class Peernet {
|
|
|
1960
1979
|
}
|
|
1961
1980
|
|
|
1962
1981
|
get defaultStores() {
|
|
1963
|
-
return ['account', 'wallet', 'block', 'transaction', 'chain', 'data']
|
|
1982
|
+
return ['account', 'wallet', 'block', 'transaction', 'chain', 'data', 'message']
|
|
1964
1983
|
}
|
|
1965
1984
|
|
|
1966
1985
|
addProto(name, proto) {
|
|
@@ -1973,7 +1992,7 @@ class Peernet {
|
|
|
1973
1992
|
|
|
1974
1993
|
async addStore(name, prefix, root, isPrivate = true) {
|
|
1975
1994
|
if (name === 'block' || name === 'transaction' || name === 'chain' ||
|
|
1976
|
-
name === 'data') isPrivate = false;
|
|
1995
|
+
name === 'data' || name === 'message') isPrivate = false;
|
|
1977
1996
|
|
|
1978
1997
|
let Storage;
|
|
1979
1998
|
if (this.hasDaemon) {
|
|
@@ -2026,6 +2045,7 @@ class Peernet {
|
|
|
2026
2045
|
*/
|
|
2027
2046
|
this.peerMap = new Map();
|
|
2028
2047
|
this.stores = [];
|
|
2048
|
+
this.requestProtos = {};
|
|
2029
2049
|
this.storePrefix = options.storePrefix;
|
|
2030
2050
|
this.root = options.root;
|
|
2031
2051
|
|
|
@@ -2049,6 +2069,7 @@ class Peernet {
|
|
|
2049
2069
|
'peernet-data': DataMessage,
|
|
2050
2070
|
'peernet-data-response': DataMessageResponse,
|
|
2051
2071
|
'peernet-ps': PsMessage,
|
|
2072
|
+
'chat-message': ChatMessage,
|
|
2052
2073
|
};
|
|
2053
2074
|
this.protos = globalThis.peernet.protos;
|
|
2054
2075
|
|
|
@@ -2149,6 +2170,10 @@ class Peernet {
|
|
|
2149
2170
|
}
|
|
2150
2171
|
}
|
|
2151
2172
|
|
|
2173
|
+
addRequestHandler(name, method) {
|
|
2174
|
+
this.requestProtos[name] = method;
|
|
2175
|
+
}
|
|
2176
|
+
|
|
2152
2177
|
/**
|
|
2153
2178
|
* @private
|
|
2154
2179
|
*
|
|
@@ -2251,14 +2276,10 @@ class Peernet {
|
|
|
2251
2276
|
} else if (proto.name === 'peernet-request') {
|
|
2252
2277
|
// TODO: make dynamic
|
|
2253
2278
|
// exposeddevapi[proto.decoded.request](proto.decoded.params)
|
|
2254
|
-
|
|
2255
|
-
if (
|
|
2256
|
-
const
|
|
2257
|
-
const hash = await chainStore.get('localBlock');
|
|
2258
|
-
response = JSON.stringify({ height: height.toString(), hash: hash.toString() });
|
|
2259
|
-
const data = new ResponseMessage({ response });
|
|
2279
|
+
const method = this.requestProtos[proto.decoded.request];
|
|
2280
|
+
if (method) {
|
|
2281
|
+
const data = await method();
|
|
2260
2282
|
const node = await this.prepareMessage(from, data.encoded);
|
|
2261
|
-
|
|
2262
2283
|
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
2263
2284
|
}
|
|
2264
2285
|
} else if (proto.name === 'peernet-ps' &&
|
|
@@ -2401,6 +2422,35 @@ class Peernet {
|
|
|
2401
2422
|
return null
|
|
2402
2423
|
}
|
|
2403
2424
|
|
|
2425
|
+
|
|
2426
|
+
get message() {
|
|
2427
|
+
return {
|
|
2428
|
+
/**
|
|
2429
|
+
* Get content for given message hash
|
|
2430
|
+
*
|
|
2431
|
+
* @param {String} hash
|
|
2432
|
+
*/
|
|
2433
|
+
get: async (hash) => {
|
|
2434
|
+
debug(`get message ${hash}`);
|
|
2435
|
+
const message = await messageStore.has(hash);
|
|
2436
|
+
if (message) return await messageStore.get(hash)
|
|
2437
|
+
return this.requestData(hash, 'message')
|
|
2438
|
+
},
|
|
2439
|
+
/**
|
|
2440
|
+
* put message content
|
|
2441
|
+
*
|
|
2442
|
+
* @param {String} hash
|
|
2443
|
+
* @param {Buffer} message
|
|
2444
|
+
*/
|
|
2445
|
+
put: async (hash, message) => await messageStore.put(hash, message),
|
|
2446
|
+
/**
|
|
2447
|
+
* @param {String} hash
|
|
2448
|
+
* @return {Boolean}
|
|
2449
|
+
*/
|
|
2450
|
+
has: async (hash) => await messageStore.has(hash),
|
|
2451
|
+
}
|
|
2452
|
+
}
|
|
2453
|
+
|
|
2404
2454
|
get data() {
|
|
2405
2455
|
return {
|
|
2406
2456
|
/**
|
|
@@ -2491,16 +2541,16 @@ class Peernet {
|
|
|
2491
2541
|
*/
|
|
2492
2542
|
async publish(topic, data) {
|
|
2493
2543
|
// globalSub.publish(topic, data)
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
2544
|
if (!Buffer.isBuffer(topic)) topic = Buffer.from(topic);
|
|
2497
2545
|
if (!Buffer.isBuffer(data)) data = Buffer.from(data);
|
|
2498
2546
|
const id = Math.random().toString(36).slice(-12);
|
|
2499
2547
|
data = new PsMessage({data, topic});
|
|
2500
2548
|
for (const peer of this.peers) {
|
|
2501
|
-
if (peer.connection._connected
|
|
2502
|
-
|
|
2503
|
-
|
|
2549
|
+
if (peer.connection._connected) {
|
|
2550
|
+
if (peer.id.toString() !== this.peerId.toString()) {
|
|
2551
|
+
const node = await this.prepareMessage(peer.id, data.encoded);
|
|
2552
|
+
peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
|
|
2553
|
+
}
|
|
2504
2554
|
} else {
|
|
2505
2555
|
this.removePeer(peer);
|
|
2506
2556
|
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
peernet.addRequestHandler('lastBlock', () => {
|
|
2
|
+
let response;
|
|
3
|
+
const height = await chainStore.get('localIndex')
|
|
4
|
+
const hash = await chainStore.get('localBlock')
|
|
5
|
+
response = JSON.stringify({ height: height.toString(), hash: hash.toString() })
|
|
6
|
+
return new peernet.protos['peernet-response']({ response })
|
|
7
|
+
})
|