@dxos/signal 2.33.9-dev.9246a07b → 2.33.9-dev.a2586ac4
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/.eslintrc.js +6 -0
- package/.rush/temp/package-deps_build.json +17 -0
- package/.rush/temp/package-deps_build_test.json +17 -0
- package/.rush/temp/shrinkwrap-deps.json +296 -0
- package/bin/signal-test-darwin-amd64 +0 -0
- package/bin/signal-test-darwin-arm64 +0 -0
- package/bin/signal-test-linux-amd64 +0 -0
- package/bin/signal-test-linux-arm64 +0 -0
- package/bin/signal.js +0 -0
- package/dist/src/index.d.ts +1 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/test-broker.d.ts +19 -0
- package/dist/src/test-broker.d.ts.map +1 -0
- package/dist/src/test-broker.js +104 -0
- package/dist/src/test-broker.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -57
- package/signal.build.log +13 -0
- package/src/index.ts +2 -4
- package/src/test-broker.ts +94 -0
- package/tsconfig.json +20 -0
- package/dist/package.json +0 -94
- package/dist/src/bin.d.ts +0 -3
- package/dist/src/bin.d.ts.map +0 -1
- package/dist/src/bin.js +0 -79
- package/dist/src/bin.js.map +0 -1
- package/dist/src/broker.d.ts +0 -30
- package/dist/src/broker.d.ts.map +0 -1
- package/dist/src/broker.js +0 -99
- package/dist/src/broker.js.map +0 -1
- package/dist/src/broker.test.d.ts +0 -2
- package/dist/src/broker.test.d.ts.map +0 -1
- package/dist/src/broker.test.js +0 -30
- package/dist/src/broker.test.js.map +0 -1
- package/dist/src/presence.test.d.ts +0 -2
- package/dist/src/presence.test.d.ts.map +0 -1
- package/dist/src/presence.test.js +0 -54
- package/dist/src/presence.test.js.map +0 -1
- package/dist/src/serializer.d.ts +0 -7
- package/dist/src/serializer.d.ts.map +0 -1
- package/dist/src/serializer.js +0 -21
- package/dist/src/serializer.js.map +0 -1
- package/dist/src/services/discovery.d.ts +0 -21
- package/dist/src/services/discovery.d.ts.map +0 -1
- package/dist/src/services/discovery.js +0 -93
- package/dist/src/services/discovery.js.map +0 -1
- package/dist/src/services/index.d.ts +0 -6
- package/dist/src/services/index.d.ts.map +0 -1
- package/dist/src/services/index.js +0 -25
- package/dist/src/services/index.js.map +0 -1
- package/dist/src/services/network.d.ts +0 -24
- package/dist/src/services/network.d.ts.map +0 -1
- package/dist/src/services/network.js +0 -105
- package/dist/src/services/network.js.map +0 -1
- package/dist/src/services/presence.d.ts +0 -17
- package/dist/src/services/presence.d.ts.map +0 -1
- package/dist/src/services/presence.js +0 -74
- package/dist/src/services/presence.js.map +0 -1
- package/dist/src/services/status.d.ts +0 -46
- package/dist/src/services/status.d.ts.map +0 -1
- package/dist/src/services/status.js +0 -248
- package/dist/src/services/status.js.map +0 -1
- package/dist/src/services/web.d.ts +0 -8
- package/dist/src/services/web.d.ts.map +0 -1
- package/dist/src/services/web.js +0 -28
- package/dist/src/services/web.js.map +0 -1
- package/dist/src/signal/index.d.ts +0 -3
- package/dist/src/signal/index.d.ts.map +0 -1
- package/dist/src/signal/index.js +0 -22
- package/dist/src/signal/index.js.map +0 -1
- package/dist/src/signal/peer-map.d.ts +0 -63
- package/dist/src/signal/peer-map.d.ts.map +0 -1
- package/dist/src/signal/peer-map.js +0 -135
- package/dist/src/signal/peer-map.js.map +0 -1
- package/dist/src/signal/peer-map.test.d.ts +0 -2
- package/dist/src/signal/peer-map.test.d.ts.map +0 -1
- package/dist/src/signal/peer-map.test.js +0 -44
- package/dist/src/signal/peer-map.test.js.map +0 -1
- package/dist/src/signal/signal-server.d.ts +0 -17
- package/dist/src/signal/signal-server.d.ts.map +0 -1
- package/dist/src/signal/signal-server.js +0 -92
- package/dist/src/signal/signal-server.js.map +0 -1
- package/dist/src/signal.test.d.ts +0 -2
- package/dist/src/signal.test.d.ts.map +0 -1
- package/dist/src/signal.test.js +0 -67
- package/dist/src/signal.test.js.map +0 -1
- package/dist/src/system-information.d.ts +0 -5
- package/dist/src/system-information.d.ts.map +0 -1
- package/dist/src/system-information.js +0 -96
- package/dist/src/system-information.js.map +0 -1
- package/dist/src/testing.d.ts +0 -9
- package/dist/src/testing.d.ts.map +0 -1
- package/dist/src/testing.js +0 -25
- package/dist/src/testing.js.map +0 -1
- package/dist/src/transporter/bootstrap-node.d.ts +0 -2
- package/dist/src/transporter/bootstrap-node.d.ts.map +0 -1
- package/dist/src/transporter/bootstrap-node.js +0 -95
- package/dist/src/transporter/bootstrap-node.js.map +0 -1
- package/dist/src/transporter/index.d.ts +0 -38
- package/dist/src/transporter/index.d.ts.map +0 -1
- package/dist/src/transporter/index.js +0 -151
- package/dist/src/transporter/index.js.map +0 -1
- package/dist/src/transporter/messenger.d.ts +0 -2
- package/dist/src/transporter/messenger.d.ts.map +0 -1
- package/dist/src/transporter/messenger.js +0 -193
- package/dist/src/transporter/messenger.js.map +0 -1
- package/src/bin.ts +0 -81
- package/src/broker.test.js +0 -35
- package/src/broker.ts +0 -134
- package/src/presence.test.js +0 -67
- package/src/serializer.js +0 -17
- package/src/services/discovery.js +0 -101
- package/src/services/index.ts +0 -9
- package/src/services/network.ts +0 -129
- package/src/services/presence.js +0 -77
- package/src/services/status.js +0 -259
- package/src/services/web.ts +0 -24
- package/src/shims.d.ts +0 -6
- package/src/signal/index.ts +0 -6
- package/src/signal/peer-map.test.js +0 -58
- package/src/signal/peer-map.ts +0 -174
- package/src/signal/signal-server.js +0 -106
- package/src/signal.test.js +0 -78
- package/src/system-information.ts +0 -110
- package/src/testing.ts +0 -27
- package/src/transporter/bootstrap-node.js +0 -112
- package/src/transporter/index.js +0 -179
- package/src/transporter/messenger.js +0 -223
package/src/presence.test.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import crypto from 'crypto';
|
|
6
|
-
import debug from 'debug';
|
|
7
|
-
import pEvent from 'p-event';
|
|
8
|
-
|
|
9
|
-
import { createBroker } from './broker';
|
|
10
|
-
|
|
11
|
-
const log = debug('dxos:test:presence');
|
|
12
|
-
|
|
13
|
-
// TODO(burdon): A worker process has failed to exit gracefully and has been force exited.
|
|
14
|
-
jest.setTimeout(100 * 1000);
|
|
15
|
-
|
|
16
|
-
const complete = (nodeID, graph, max) => {
|
|
17
|
-
if (graph.nodes().length !== max) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const nodes = graph.nodes().filter(id => id !== nodeID);
|
|
22
|
-
|
|
23
|
-
const edges = [];
|
|
24
|
-
for (const edge of graph.edgeEntries(nodeID)) {
|
|
25
|
-
const source = edge[2];
|
|
26
|
-
const target = edge[3];
|
|
27
|
-
edges.push(source === nodeID ? target : source);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (edges.length < (max - 1)) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
for (const id of nodes) {
|
|
35
|
-
if (!edges.includes(id)) {
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return true;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
test('5 brokers full network connected', async () => {
|
|
44
|
-
const MAX_BROKERS = 5;
|
|
45
|
-
|
|
46
|
-
const topic = crypto.randomBytes(32);
|
|
47
|
-
|
|
48
|
-
const brokers = [...Array(MAX_BROKERS).keys()].map(i => createBroker(topic, { port: 6000 + i, logger: false, hyperswarm: { bootstrap: false } }));
|
|
49
|
-
|
|
50
|
-
const waitForPresenceGraph = Promise.all(brokers.map(async (broker) => pEvent(broker.localBus, '$broker.presence-update', (graph) => complete(broker.nodeID, graph, MAX_BROKERS))));
|
|
51
|
-
|
|
52
|
-
const waitForConnected = Promise.all(brokers.map(broker => {
|
|
53
|
-
const nodes = brokers.filter(b => b.nodeID !== broker.nodeID).map(b => b.nodeID);
|
|
54
|
-
return Promise.all(nodes.map(nodeID => pEvent(broker.localBus, '$node.connected', ({ node }) => node.id === nodeID)));
|
|
55
|
-
}));
|
|
56
|
-
|
|
57
|
-
log('Starting brokers...');
|
|
58
|
-
await Promise.all(brokers.map(b => b.start()));
|
|
59
|
-
|
|
60
|
-
await waitForConnected;
|
|
61
|
-
|
|
62
|
-
log('Waiting for the nodes to be fully connected...');
|
|
63
|
-
await waitForPresenceGraph;
|
|
64
|
-
|
|
65
|
-
log('Stopping brokers...');
|
|
66
|
-
return Promise.all(brokers.map(b => b.stop()));
|
|
67
|
-
});
|
package/src/serializer.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import jsonCodec from 'buffer-json-encoding';
|
|
6
|
-
|
|
7
|
-
const { Serializers: { Base: BaseSerializer } } = require('moleculer'); // eslint-disable-line @typescript-eslint/no-var-requires
|
|
8
|
-
|
|
9
|
-
export class Serializer extends BaseSerializer {
|
|
10
|
-
serialize (obj) {
|
|
11
|
-
return jsonCodec.encode(obj);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
deserialize (buf) {
|
|
15
|
-
return jsonCodec.decode(buf);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import debounce from 'lodash.debounce';
|
|
6
|
-
import pLimit from 'p-limit';
|
|
7
|
-
|
|
8
|
-
export const DiscoveryService = {
|
|
9
|
-
name: 'discovery',
|
|
10
|
-
events: {
|
|
11
|
-
'$node.disconnected' (ctx) {
|
|
12
|
-
const { peerMap } = this.broker.shared;
|
|
13
|
-
|
|
14
|
-
peerMap.deletePeersByOwner(Buffer.from(ctx.params.node.id, 'hex'));
|
|
15
|
-
},
|
|
16
|
-
'$node.connected' () {
|
|
17
|
-
const { peerMap } = this.broker.shared;
|
|
18
|
-
const owner = Buffer.from(this.broker.nodeID, 'hex');
|
|
19
|
-
const peers = peerMap
|
|
20
|
-
.peers
|
|
21
|
-
.filter(p => p.owner.equals(owner))
|
|
22
|
-
.map(peerMap.encode);
|
|
23
|
-
|
|
24
|
-
if (peers.length === 0) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
return this.broker.broadcast('discovery.update', { peers }).catch(() => {});
|
|
28
|
-
},
|
|
29
|
-
'discovery.update' (ctx) {
|
|
30
|
-
const { peerMap } = this.broker.shared;
|
|
31
|
-
const { peers } = ctx.params;
|
|
32
|
-
|
|
33
|
-
if (ctx.nodeID === this.broker.nodeID) {
|
|
34
|
-
this._discoveryUpdate();
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
peerMap.updatePeersByOwner(Buffer.from(ctx.nodeID, 'hex'), peers.map(peerMap.decode));
|
|
39
|
-
this._discoveryUpdate();
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
actions: {
|
|
43
|
-
offer (ctx) {
|
|
44
|
-
this.logger.debug('offer', ctx.params);
|
|
45
|
-
|
|
46
|
-
const { peerMap } = this.broker.shared;
|
|
47
|
-
const { remoteId } = ctx.params;
|
|
48
|
-
|
|
49
|
-
const peer = peerMap.peers.find(p => p.id.equals(remoteId) && p.rpc);
|
|
50
|
-
if (!peer) {
|
|
51
|
-
throw new Error('rpc not found');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return peer.rpc.call('offer', ctx.params);
|
|
55
|
-
},
|
|
56
|
-
signal (ctx) {
|
|
57
|
-
this.logger.debug('signal', ctx.params);
|
|
58
|
-
|
|
59
|
-
const { peerMap } = this.broker.shared;
|
|
60
|
-
const { remoteId } = ctx.params;
|
|
61
|
-
|
|
62
|
-
const peer = peerMap.peers.find(p => p.id.equals(remoteId) && p.rpc);
|
|
63
|
-
if (!peer) {
|
|
64
|
-
throw new Error('rpc not found');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return peer.rpc.emit('signal', ctx.params);
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
created () {
|
|
71
|
-
const { peerMap } = this.broker.shared;
|
|
72
|
-
const owner = Buffer.from(this.broker.nodeID, 'hex');
|
|
73
|
-
|
|
74
|
-
this._limit = pLimit(1);
|
|
75
|
-
|
|
76
|
-
this._updatePeers = debounce(() => {
|
|
77
|
-
this._limit(() => {
|
|
78
|
-
this._limit.clearQueue();
|
|
79
|
-
const peers = peerMap
|
|
80
|
-
.peers
|
|
81
|
-
.filter(p => p.owner.equals(owner))
|
|
82
|
-
.map(peerMap.encode);
|
|
83
|
-
return this.broker.broadcast('discovery.update', { peers }).catch(() => {});
|
|
84
|
-
}).catch(() => {});
|
|
85
|
-
}, 1000);
|
|
86
|
-
|
|
87
|
-
this._discoveryUpdate = debounce(() => {
|
|
88
|
-
this.broker.broadcastLocal('$broker.discovery-update');
|
|
89
|
-
}, 1000);
|
|
90
|
-
},
|
|
91
|
-
async started () {
|
|
92
|
-
const { peerMap } = this.broker.shared;
|
|
93
|
-
peerMap.on('peer-added', this._updatePeers);
|
|
94
|
-
peerMap.on('peer-deleted', this._updatePeers);
|
|
95
|
-
},
|
|
96
|
-
async stopped () {
|
|
97
|
-
const { peerMap } = this.broker.shared;
|
|
98
|
-
peerMap.off('peer-added', this._updatePeers);
|
|
99
|
-
peerMap.off('peer-deleted', this._updatePeers);
|
|
100
|
-
}
|
|
101
|
-
};
|
package/src/services/index.ts
DELETED
package/src/services/network.ts
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { EventEmitter } from 'events';
|
|
6
|
-
import Graph from 'graphology';
|
|
7
|
-
import debounce from 'lodash.debounce';
|
|
8
|
-
import timestamp from 'monotonic-timestamp';
|
|
9
|
-
import pLimit from 'p-limit';
|
|
10
|
-
import lru, { Lru } from 'tiny-lru';
|
|
11
|
-
|
|
12
|
-
const MAX_WAIT = 2 * 1000;
|
|
13
|
-
|
|
14
|
-
export interface Connection {
|
|
15
|
-
key: string,
|
|
16
|
-
target: string
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class Network extends EventEmitter {
|
|
20
|
-
private readonly _owner: string
|
|
21
|
-
private readonly _graph: Graph;
|
|
22
|
-
private readonly _limit: pLimit.Limit;
|
|
23
|
-
private readonly _lastUpdate: Lru;
|
|
24
|
-
readonly publish: ReturnType<typeof debounce>;
|
|
25
|
-
|
|
26
|
-
constructor (owner: string, publish: ReturnType<typeof debounce>) {
|
|
27
|
-
super();
|
|
28
|
-
|
|
29
|
-
this._owner = owner;
|
|
30
|
-
this._graph = new Graph({ multi: true, type: 'undirected' });
|
|
31
|
-
this._graph.addNode(owner);
|
|
32
|
-
this._limit = pLimit(1);
|
|
33
|
-
this._lastUpdate = lru(1000);
|
|
34
|
-
|
|
35
|
-
this.publish = debounce(() => {
|
|
36
|
-
void this._limit(() => {
|
|
37
|
-
this._limit.clearQueue();
|
|
38
|
-
return publish({ timestamp: timestamp(), connections: this.getConnections() });
|
|
39
|
-
});
|
|
40
|
-
}, MAX_WAIT);
|
|
41
|
-
|
|
42
|
-
const onChange = debounce(() => this.emit('change', this._graph), MAX_WAIT);
|
|
43
|
-
['nodeAdded', 'edgeAdded', 'nodeDropped', 'edgeDropped'].forEach(ev => this._graph.on(ev, onChange));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
get graph () {
|
|
47
|
-
return this._graph;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
getConnections (id = this._owner) {
|
|
51
|
-
const connections: Connection[] = [];
|
|
52
|
-
if (!this._graph.hasNode(id)) {
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
this._graph.forEachEdge(id, (key, attr, source, target) => {
|
|
57
|
-
if (source === id) {
|
|
58
|
-
connections.push({ key, target });
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
return connections;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
update (id: string, timestamp: number, connections: Connection[] = []) {
|
|
66
|
-
// ignore old messages
|
|
67
|
-
const lastTimestamp = this._lastUpdate.get(id) || 0;
|
|
68
|
-
if (lastTimestamp > timestamp) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
this._lastUpdate.set(id, timestamp);
|
|
72
|
-
|
|
73
|
-
if (!this._graph.hasNode(id)) {
|
|
74
|
-
this._graph.addNode(id);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
this._graph.forEachEdge(id, (key, attr, source) => {
|
|
78
|
-
if (source === id) {
|
|
79
|
-
this._graph.dropEdge(key);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
this._graph.import({
|
|
84
|
-
edges: connections.map(conn => ({
|
|
85
|
-
key: conn.key,
|
|
86
|
-
source: id,
|
|
87
|
-
target: conn.target,
|
|
88
|
-
undirected: true
|
|
89
|
-
})),
|
|
90
|
-
nodes: Array.from(new Set(
|
|
91
|
-
connections.reduce((acc, { key, target }) => [...acc, key, target], [] as string[])).values()
|
|
92
|
-
).map(key => ({ key }))
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
addPeer (id: string) {
|
|
97
|
-
if (!this._graph.hasNode(id)) {
|
|
98
|
-
this._graph.addNode(id);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
deletePeer (id: string) {
|
|
103
|
-
if (this._graph.hasNode(id)) {
|
|
104
|
-
this._graph.dropNode(id);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
addConnection (initiator: any, sessionKey: string, peerId: string) {
|
|
109
|
-
if (!this._graph.hasNode(peerId)) {
|
|
110
|
-
this._graph.addNode(peerId);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (initiator) {
|
|
114
|
-
this._graph.addEdgeWithKey(sessionKey, this._owner, peerId);
|
|
115
|
-
} else {
|
|
116
|
-
this._graph.addEdgeWithKey(sessionKey, peerId, this._owner);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
this.publish();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
deleteConnection (peer1: string, peer2: string) {
|
|
123
|
-
if (!this._graph.hasEdge(peer1, peer2)) {
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
this._graph.dropEdge(peer1, peer2);
|
|
127
|
-
this.publish();
|
|
128
|
-
}
|
|
129
|
-
}
|
package/src/services/presence.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { Network } from './network';
|
|
6
|
-
|
|
7
|
-
export const PresenceService = {
|
|
8
|
-
name: 'presence',
|
|
9
|
-
events: {
|
|
10
|
-
'$node.disconnected' (ctx) {
|
|
11
|
-
const { node } = ctx.params;
|
|
12
|
-
this._network.deletePeer(node.id);
|
|
13
|
-
},
|
|
14
|
-
'$node.connected' (ctx) {
|
|
15
|
-
const { node } = ctx.params;
|
|
16
|
-
this._network.addPeer(node.id);
|
|
17
|
-
this._network.publish();
|
|
18
|
-
},
|
|
19
|
-
'presence.update' (ctx) {
|
|
20
|
-
if (ctx.nodeID === this.broker.nodeID) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const { timestamp, connections } = ctx.params;
|
|
25
|
-
return this._network.update(ctx.nodeID, timestamp, connections);
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
actions: {
|
|
29
|
-
network () {
|
|
30
|
-
return this._network.graph.export();
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
created () {
|
|
34
|
-
const { transporter } = this.broker.options;
|
|
35
|
-
|
|
36
|
-
this._network = new Network(this.broker.nodeID, data => {
|
|
37
|
-
return this.broker.broadcast('presence.update', data);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
this.broker.shared.network = this._network;
|
|
41
|
-
|
|
42
|
-
this._network.on('change', (graph) => {
|
|
43
|
-
this.broker.broadcastLocal('$broker.presence-update', graph);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
transporter.peers.forEach(peer => {
|
|
47
|
-
try {
|
|
48
|
-
this._network.addConnection(peer.initiator, peer.sessionKey.toString('hex'), peer.id.toString('hex'));
|
|
49
|
-
} catch (err) {
|
|
50
|
-
this.logger.error(err);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
transporter.on('peer-added', ({ initiator, sessionKey, peerId }) => {
|
|
55
|
-
try {
|
|
56
|
-
this._network.addConnection(initiator, sessionKey.toString('hex'), peerId.toString('hex'));
|
|
57
|
-
} catch (err) {
|
|
58
|
-
this.logger.error(err);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
transporter.on('peer-deleted', ({ sessionKey }) => {
|
|
63
|
-
if (!sessionKey) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
this._network.deleteConnection(sessionKey.toString('hex'));
|
|
69
|
-
} catch (err) {
|
|
70
|
-
this.logger.error(err);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
async started () {
|
|
75
|
-
this._network.publish();
|
|
76
|
-
}
|
|
77
|
-
};
|
package/src/services/status.js
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { AbortController } from '@azure/abort-controller';
|
|
6
|
-
import moment from 'moment';
|
|
7
|
-
|
|
8
|
-
import { getSystemInfo, getServiceInfo } from '../system-information';
|
|
9
|
-
|
|
10
|
-
const delay = (ms, signal) => new Promise((resolve, reject) => {
|
|
11
|
-
const timer = setTimeout(() => {
|
|
12
|
-
signal.removeEventListener('abort', onAbort);
|
|
13
|
-
resolve();
|
|
14
|
-
}, ms);
|
|
15
|
-
|
|
16
|
-
const onAbort = () => {
|
|
17
|
-
signal.removeEventListener('abort', onAbort);
|
|
18
|
-
clearTimeout(timer);
|
|
19
|
-
reject(new Error('aborted'));
|
|
20
|
-
};
|
|
21
|
-
signal.addEventListener('abort', onAbort);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
export const StatusService = {
|
|
25
|
-
name: 'status',
|
|
26
|
-
settings: {
|
|
27
|
-
graphql: {
|
|
28
|
-
type: `
|
|
29
|
-
type Status {
|
|
30
|
-
id: String!
|
|
31
|
-
updatedAt: Timestamp!
|
|
32
|
-
version: String!
|
|
33
|
-
nodes: [Node]!
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
type Node {
|
|
37
|
-
id: String!
|
|
38
|
-
kubeStatus: KubeStatus!
|
|
39
|
-
connections: [Connection]!
|
|
40
|
-
signal: Signal
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
type Connection {
|
|
44
|
-
id: String!
|
|
45
|
-
target: String!
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
type Signal {
|
|
49
|
-
topics: [Topic]!
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
type Topic {
|
|
53
|
-
id: String!
|
|
54
|
-
peers: [String]!
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
type KubeStatus {
|
|
58
|
-
system: KubeSystemInfo
|
|
59
|
-
services: [KubeService!]
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
type KubeSystemInfo {
|
|
63
|
-
version: String
|
|
64
|
-
cpu: CPUInfo,
|
|
65
|
-
memory: MemoryInfo,
|
|
66
|
-
device: DeviceInfo,
|
|
67
|
-
network: NetworkInfo
|
|
68
|
-
os: OSInfo
|
|
69
|
-
time: TimeInfo
|
|
70
|
-
nodejs: NodeJSInfo
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
type KubeService {
|
|
74
|
-
name: String!
|
|
75
|
-
status: String!
|
|
76
|
-
cpu: Int!
|
|
77
|
-
memory: Int!
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
type CPUInfo {
|
|
81
|
-
brand: String!
|
|
82
|
-
cores: Int!
|
|
83
|
-
manufacturer: String!
|
|
84
|
-
vendor: String!
|
|
85
|
-
speed: String!
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
type MemoryInfo {
|
|
89
|
-
total: String!
|
|
90
|
-
free: String!
|
|
91
|
-
used: String!
|
|
92
|
-
swaptotal: String!
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
type DeviceInfo {
|
|
96
|
-
model: String!
|
|
97
|
-
serial: String!
|
|
98
|
-
version: String!
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
type NetworkInfo {
|
|
102
|
-
hostname: String
|
|
103
|
-
addresses: [String]!
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
type OSInfo {
|
|
107
|
-
arch: String!
|
|
108
|
-
platform: String!
|
|
109
|
-
version: String
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
type TimeInfo {
|
|
113
|
-
now: Timestamp!
|
|
114
|
-
up: Timestamp!
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
type NodeJSInfo {
|
|
118
|
-
version: String!
|
|
119
|
-
}
|
|
120
|
-
`
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
actions: {
|
|
124
|
-
status: {
|
|
125
|
-
graphql: {
|
|
126
|
-
query: 'status: Status'
|
|
127
|
-
},
|
|
128
|
-
handler (ctx) {
|
|
129
|
-
const status = this.getStatus();
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
updatedAt: status.updatedAt,
|
|
133
|
-
id: ctx.nodeID,
|
|
134
|
-
nodes: Array.from(status.nodes.values()),
|
|
135
|
-
version: this.broker.metadata.version
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
},
|
|
140
|
-
events: {
|
|
141
|
-
'$node.connected' (ctx) {
|
|
142
|
-
this._status.toUpdate = true;
|
|
143
|
-
},
|
|
144
|
-
'$node.disconnected' (ctx) {
|
|
145
|
-
const { node } = ctx.params;
|
|
146
|
-
this._status.nodes.delete(node.id);
|
|
147
|
-
this._status.toUpdate = true;
|
|
148
|
-
},
|
|
149
|
-
'$broker.presence-update' (ctx) {
|
|
150
|
-
this._status.toUpdate = true;
|
|
151
|
-
},
|
|
152
|
-
'$broker.discovery-update' (ctx) {
|
|
153
|
-
this._status.toUpdate = true;
|
|
154
|
-
},
|
|
155
|
-
'status.kube-status' (ctx) {
|
|
156
|
-
this.updateKubeStatus(ctx.nodeID, ctx.params);
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
methods: {
|
|
160
|
-
getStatus () {
|
|
161
|
-
const { network } = this.broker.shared;
|
|
162
|
-
|
|
163
|
-
const nodes = this.broker.registry.getNodeList({ onlyAvailable: true, withServices: true });
|
|
164
|
-
|
|
165
|
-
if (!this._status.toUpdate) {
|
|
166
|
-
return this._status;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
nodes.forEach(node => {
|
|
170
|
-
const oldNode = this._status.nodes.get(node.id) || {};
|
|
171
|
-
|
|
172
|
-
this._status.nodes.set(node.id, {
|
|
173
|
-
id: node.id,
|
|
174
|
-
kubeStatus: oldNode.kubeStatus || { services: [] },
|
|
175
|
-
connections: network.getConnections(node.id).map(conn => ({
|
|
176
|
-
id: conn.key,
|
|
177
|
-
target: conn.target
|
|
178
|
-
})),
|
|
179
|
-
signal: {
|
|
180
|
-
topics: this.getSignalPeers(node.id)
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
this._status.toUpdate = false;
|
|
186
|
-
this._status.updatedAt = moment();
|
|
187
|
-
|
|
188
|
-
return this._status;
|
|
189
|
-
},
|
|
190
|
-
updateKubeStatus (nodeID, { system, services }) {
|
|
191
|
-
if (!this._status.nodes.has(nodeID)) {
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const node = this._status.nodes.get(nodeID);
|
|
196
|
-
node.kubeStatus = { system, services: services || [] };
|
|
197
|
-
|
|
198
|
-
this._status.updatedAt = moment();
|
|
199
|
-
},
|
|
200
|
-
getSignalPeers (peerId) {
|
|
201
|
-
const { peerMap } = this.broker.shared;
|
|
202
|
-
const peerIdBuf = Buffer.from(peerId, 'hex');
|
|
203
|
-
const peersByTopic = new Map();
|
|
204
|
-
|
|
205
|
-
peerMap.topics.forEach(topic => {
|
|
206
|
-
const topicStr = topic.toString('hex');
|
|
207
|
-
peerMap.getPeersByTopic(topic)
|
|
208
|
-
.filter(peer => peer.owner.equals(peerIdBuf))
|
|
209
|
-
.map(peerMap.encode)
|
|
210
|
-
.forEach(peer => {
|
|
211
|
-
let value;
|
|
212
|
-
if (peersByTopic.has(topicStr)) {
|
|
213
|
-
value = peersByTopic.get(topicStr);
|
|
214
|
-
} else {
|
|
215
|
-
value = { id: topicStr, peers: [] };
|
|
216
|
-
peersByTopic.set(topicStr, value);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (value.peers.includes(peer.id)) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
value.peers.push(peer.id);
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
return Array.from(peersByTopic.values());
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
created () {
|
|
230
|
-
this._status = {
|
|
231
|
-
updatedAt: moment(),
|
|
232
|
-
toUpdate: true,
|
|
233
|
-
nodes: new Map()
|
|
234
|
-
};
|
|
235
|
-
},
|
|
236
|
-
async started () {
|
|
237
|
-
this.getStatus();
|
|
238
|
-
|
|
239
|
-
this._controller = new AbortController();
|
|
240
|
-
const signal = this._controller.signal;
|
|
241
|
-
|
|
242
|
-
(async () => {
|
|
243
|
-
while (!signal.aborted) {
|
|
244
|
-
// TODO(unknown): This could be an option (pollInterval).
|
|
245
|
-
await delay(10 * 1000, signal);
|
|
246
|
-
const system = await getSystemInfo().catch(() => {});
|
|
247
|
-
const services = await getServiceInfo().catch(() => {});
|
|
248
|
-
if (system || services) {
|
|
249
|
-
this.broker.broadcast('status.kube-status', { system, services });
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
})().catch(() => {});
|
|
253
|
-
},
|
|
254
|
-
async stopped () {
|
|
255
|
-
if (this._controller) {
|
|
256
|
-
this._controller.abort();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
};
|
package/src/services/web.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import MoleculerWebService from 'moleculer-web';
|
|
6
|
-
|
|
7
|
-
import { SignalServer } from '../signal';
|
|
8
|
-
|
|
9
|
-
export const WebService = {
|
|
10
|
-
name: 'web',
|
|
11
|
-
mixins: [
|
|
12
|
-
MoleculerWebService as any
|
|
13
|
-
],
|
|
14
|
-
created (this: any) {
|
|
15
|
-
this.settings.port = this.broker.metadata.port || 4000;
|
|
16
|
-
this._signal = new SignalServer(this.server, this.broker);
|
|
17
|
-
},
|
|
18
|
-
async started (this: any) {
|
|
19
|
-
return this._signal.open();
|
|
20
|
-
},
|
|
21
|
-
async stopped (this: any) {
|
|
22
|
-
return this._signal.close();
|
|
23
|
-
}
|
|
24
|
-
};
|
package/src/shims.d.ts
DELETED