@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 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
+ ```
@@ -261,7 +261,7 @@ class LeofcoinStorage$1 {
261
261
 
262
262
  }
263
263
 
264
- var version = "0.8.12";
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$9 = `
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$9).PeernetMessage, {name});
1398
+ super(buffer, protons__default['default'](proto$a).PeernetMessage, {name});
1399
1399
  }
1400
1400
  }
1401
1401
 
1402
- var proto$8 = `
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$8).PeernetDHTMessage, {name});
1428
+ super(data, protons__default['default'](proto$9).PeernetDHTMessage, {name});
1429
1429
  }
1430
1430
  }
1431
1431
 
1432
- var proto$7 = `
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$7).PeernetDHTMessageResponse, {name});
1447
+ super(data, protons__default['default'](proto$8).PeernetDHTMessageResponse, {name});
1448
1448
  }
1449
1449
  }
1450
1450
 
1451
- var proto$6 = `
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$6).PeernetDataMessage, {name});
1466
+ super(data, protons__default['default'](proto$7).PeernetDataMessage, {name});
1467
1467
  }
1468
1468
  }
1469
1469
 
1470
- var proto$5 = `
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$5).PsMessage, {name});
1484
+ super(buffer, protons__default['default'](proto$6).PsMessage, {name});
1485
1485
  }
1486
1486
  }
1487
1487
 
1488
- var proto$4 = `
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$4).PeernetPeerMessage, {name});
1502
+ super(data, protons__default['default'](proto$5).PeernetPeerMessage, {name});
1503
1503
  }
1504
1504
  }
1505
1505
 
1506
- var proto$3 = `
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$3).PeernetRequestMessage, {name});
1520
+ super(data, protons__default['default'](proto$4).PeernetRequestMessage, {name});
1521
1521
  }
1522
1522
  }
1523
1523
 
1524
- var proto$2 = `
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$2).PeernetResponseMessage, {name});
1538
+ super(data, protons__default['default'](proto$3).PeernetResponseMessage, {name});
1539
1539
  }
1540
1540
  }
1541
1541
 
1542
- var proto$1 = `
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$1).PeernetPeerMessageResponse, {name});
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
- let response;
2272
- if (proto.decoded.request === 'lastBlock') {
2273
- const height = await chainStore.get('localIndex');
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 && peer.id.toString() !== this.peerId.toString()) {
2519
- const node = await this.prepareMessage(peer.id, data.encoded);
2520
- peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
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
  }
@@ -88,8 +88,8 @@ var codecs = {
88
88
  // chat message
89
89
  'chat-message': {
90
90
  codec: '636d',
91
- hashAlg: 'dbl-keccak-512'
92
- }
91
+ hashAlg: 'dbl-keccak-512',
92
+ },
93
93
  };
94
94
 
95
95
  class PeernetCodec {
@@ -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;
@@ -264,7 +264,7 @@ class LeofcoinStorage$1 {
264
264
 
265
265
  }
266
266
 
267
- var version = "0.8.12";
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$4 = `
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$4).PeernetDataMessage, {name});
937
+ super(data, protons__default['default'](proto$5).PeernetDataMessage, {name});
938
938
  }
939
939
  }
940
940
 
941
- var proto$3 = `
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$3).PsMessage, {name});
955
+ super(buffer, protons__default['default'](proto$4).PsMessage, {name});
956
956
  }
957
957
  }
958
958
 
959
- var proto$2 = `
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$2).PeernetPeerMessage, {name});
973
+ super(data, protons__default['default'](proto$3).PeernetPeerMessage, {name});
974
974
  }
975
975
  }
976
976
 
977
- var proto$1 = `
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$1).PeernetPeerMessageResponse, {name});
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
- let response$1;
1707
- if (proto.decoded.request === 'lastBlock') {
1708
- const height = await chainStore.get('localIndex');
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 && peer.id.toString() !== this.peerId.toString()) {
1954
- const node = await this.prepareMessage(peer.id, data.encoded);
1955
- peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
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
  }
@@ -244,7 +244,7 @@ class LeofcoinStorage$1 {
244
244
 
245
245
  }
246
246
 
247
- var version = "0.8.12";
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$9 = `
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$9).PeernetMessage, {name});
1381
+ super(buffer, protons(proto$a).PeernetMessage, {name});
1382
1382
  }
1383
1383
  }
1384
1384
 
1385
- var proto$8 = `
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$8).PeernetDHTMessage, {name});
1411
+ super(data, protons(proto$9).PeernetDHTMessage, {name});
1412
1412
  }
1413
1413
  }
1414
1414
 
1415
- var proto$7 = `
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$7).PeernetDHTMessageResponse, {name});
1430
+ super(data, protons(proto$8).PeernetDHTMessageResponse, {name});
1431
1431
  }
1432
1432
  }
1433
1433
 
1434
- var proto$6 = `
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$6).PeernetDataMessage, {name});
1449
+ super(data, protons(proto$7).PeernetDataMessage, {name});
1450
1450
  }
1451
1451
  }
1452
1452
 
1453
- var proto$5 = `
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$5).PsMessage, {name});
1467
+ super(buffer, protons(proto$6).PsMessage, {name});
1468
1468
  }
1469
1469
  }
1470
1470
 
1471
- var proto$4 = `
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$4).PeernetPeerMessage, {name});
1485
+ super(data, protons(proto$5).PeernetPeerMessage, {name});
1486
1486
  }
1487
1487
  }
1488
1488
 
1489
- var proto$3 = `
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$3).PeernetRequestMessage, {name});
1503
+ super(data, protons(proto$4).PeernetRequestMessage, {name});
1504
1504
  }
1505
1505
  }
1506
1506
 
1507
- var proto$2 = `
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$2).PeernetResponseMessage, {name});
1521
+ super(data, protons(proto$3).PeernetResponseMessage, {name});
1522
1522
  }
1523
1523
  }
1524
1524
 
1525
- var proto$1 = `
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$1).PeernetPeerMessageResponse, {name});
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
- let response;
2255
- if (proto.decoded.request === 'lastBlock') {
2256
- const height = await chainStore.get('localIndex');
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 && peer.id.toString() !== this.peerId.toString()) {
2502
- const node = await this.prepareMessage(peer.id, data.encoded);
2503
- peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leofcoin/peernet",
3
- "version": "0.9.0",
3
+ "version": "0.9.3",
4
4
  "description": "",
5
5
  "main": "dist/commonjs/peernet.js",
6
6
  "module": "dist/module/peernet.js",
@@ -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
+ })