@dxos/signal 2.33.9-dev.d0ae5f95 → 2.33.9-dev.d0dce35f

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/.eslintrc.js +6 -0
  2. package/.rush/temp/package-deps_build.json +17 -0
  3. package/.rush/temp/package-deps_build_test.json +17 -0
  4. package/.rush/temp/shrinkwrap-deps.json +296 -0
  5. package/bin/signal-test-darwin-amd64 +0 -0
  6. package/bin/signal-test-darwin-arm64 +0 -0
  7. package/bin/signal-test-linux-amd64 +0 -0
  8. package/bin/signal-test-linux-arm64 +0 -0
  9. package/bin/signal.js +0 -0
  10. package/dist/src/index.d.ts +1 -3
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +2 -4
  13. package/dist/src/index.js.map +1 -1
  14. package/dist/src/test-broker.d.ts +19 -0
  15. package/dist/src/test-broker.d.ts.map +1 -0
  16. package/dist/src/test-broker.js +104 -0
  17. package/dist/src/test-broker.js.map +1 -0
  18. package/dist/tsconfig.tsbuildinfo +1 -1
  19. package/package.json +11 -57
  20. package/signal.build.log +0 -0
  21. package/src/index.ts +2 -4
  22. package/src/test-broker.ts +94 -0
  23. package/tsconfig.json +20 -0
  24. package/dist/package.json +0 -94
  25. package/dist/src/bin.d.ts +0 -3
  26. package/dist/src/bin.d.ts.map +0 -1
  27. package/dist/src/bin.js +0 -79
  28. package/dist/src/bin.js.map +0 -1
  29. package/dist/src/broker.d.ts +0 -30
  30. package/dist/src/broker.d.ts.map +0 -1
  31. package/dist/src/broker.js +0 -99
  32. package/dist/src/broker.js.map +0 -1
  33. package/dist/src/broker.test.d.ts +0 -2
  34. package/dist/src/broker.test.d.ts.map +0 -1
  35. package/dist/src/broker.test.js +0 -30
  36. package/dist/src/broker.test.js.map +0 -1
  37. package/dist/src/presence.test.d.ts +0 -2
  38. package/dist/src/presence.test.d.ts.map +0 -1
  39. package/dist/src/presence.test.js +0 -54
  40. package/dist/src/presence.test.js.map +0 -1
  41. package/dist/src/serializer.d.ts +0 -7
  42. package/dist/src/serializer.d.ts.map +0 -1
  43. package/dist/src/serializer.js +0 -21
  44. package/dist/src/serializer.js.map +0 -1
  45. package/dist/src/services/discovery.d.ts +0 -21
  46. package/dist/src/services/discovery.d.ts.map +0 -1
  47. package/dist/src/services/discovery.js +0 -93
  48. package/dist/src/services/discovery.js.map +0 -1
  49. package/dist/src/services/index.d.ts +0 -6
  50. package/dist/src/services/index.d.ts.map +0 -1
  51. package/dist/src/services/index.js +0 -25
  52. package/dist/src/services/index.js.map +0 -1
  53. package/dist/src/services/network.d.ts +0 -24
  54. package/dist/src/services/network.d.ts.map +0 -1
  55. package/dist/src/services/network.js +0 -105
  56. package/dist/src/services/network.js.map +0 -1
  57. package/dist/src/services/presence.d.ts +0 -17
  58. package/dist/src/services/presence.d.ts.map +0 -1
  59. package/dist/src/services/presence.js +0 -74
  60. package/dist/src/services/presence.js.map +0 -1
  61. package/dist/src/services/status.d.ts +0 -46
  62. package/dist/src/services/status.d.ts.map +0 -1
  63. package/dist/src/services/status.js +0 -248
  64. package/dist/src/services/status.js.map +0 -1
  65. package/dist/src/services/web.d.ts +0 -8
  66. package/dist/src/services/web.d.ts.map +0 -1
  67. package/dist/src/services/web.js +0 -28
  68. package/dist/src/services/web.js.map +0 -1
  69. package/dist/src/signal/index.d.ts +0 -3
  70. package/dist/src/signal/index.d.ts.map +0 -1
  71. package/dist/src/signal/index.js +0 -22
  72. package/dist/src/signal/index.js.map +0 -1
  73. package/dist/src/signal/peer-map.d.ts +0 -63
  74. package/dist/src/signal/peer-map.d.ts.map +0 -1
  75. package/dist/src/signal/peer-map.js +0 -135
  76. package/dist/src/signal/peer-map.js.map +0 -1
  77. package/dist/src/signal/peer-map.test.d.ts +0 -2
  78. package/dist/src/signal/peer-map.test.d.ts.map +0 -1
  79. package/dist/src/signal/peer-map.test.js +0 -44
  80. package/dist/src/signal/peer-map.test.js.map +0 -1
  81. package/dist/src/signal/signal-server.d.ts +0 -17
  82. package/dist/src/signal/signal-server.d.ts.map +0 -1
  83. package/dist/src/signal/signal-server.js +0 -92
  84. package/dist/src/signal/signal-server.js.map +0 -1
  85. package/dist/src/signal.test.d.ts +0 -2
  86. package/dist/src/signal.test.d.ts.map +0 -1
  87. package/dist/src/signal.test.js +0 -67
  88. package/dist/src/signal.test.js.map +0 -1
  89. package/dist/src/system-information.d.ts +0 -5
  90. package/dist/src/system-information.d.ts.map +0 -1
  91. package/dist/src/system-information.js +0 -96
  92. package/dist/src/system-information.js.map +0 -1
  93. package/dist/src/testing.d.ts +0 -9
  94. package/dist/src/testing.d.ts.map +0 -1
  95. package/dist/src/testing.js +0 -25
  96. package/dist/src/testing.js.map +0 -1
  97. package/dist/src/transporter/bootstrap-node.d.ts +0 -2
  98. package/dist/src/transporter/bootstrap-node.d.ts.map +0 -1
  99. package/dist/src/transporter/bootstrap-node.js +0 -95
  100. package/dist/src/transporter/bootstrap-node.js.map +0 -1
  101. package/dist/src/transporter/index.d.ts +0 -38
  102. package/dist/src/transporter/index.d.ts.map +0 -1
  103. package/dist/src/transporter/index.js +0 -151
  104. package/dist/src/transporter/index.js.map +0 -1
  105. package/dist/src/transporter/messenger.d.ts +0 -2
  106. package/dist/src/transporter/messenger.d.ts.map +0 -1
  107. package/dist/src/transporter/messenger.js +0 -193
  108. package/dist/src/transporter/messenger.js.map +0 -1
  109. package/src/bin.ts +0 -81
  110. package/src/broker.test.js +0 -35
  111. package/src/broker.ts +0 -134
  112. package/src/presence.test.js +0 -67
  113. package/src/serializer.js +0 -17
  114. package/src/services/discovery.js +0 -101
  115. package/src/services/index.ts +0 -9
  116. package/src/services/network.ts +0 -129
  117. package/src/services/presence.js +0 -77
  118. package/src/services/status.js +0 -259
  119. package/src/services/web.ts +0 -24
  120. package/src/shims.d.ts +0 -6
  121. package/src/signal/index.ts +0 -6
  122. package/src/signal/peer-map.test.js +0 -58
  123. package/src/signal/peer-map.ts +0 -174
  124. package/src/signal/signal-server.js +0 -106
  125. package/src/signal.test.js +0 -78
  126. package/src/system-information.ts +0 -110
  127. package/src/testing.ts +0 -27
  128. package/src/transporter/bootstrap-node.js +0 -112
  129. package/src/transporter/index.js +0 -179
  130. package/src/transporter/messenger.js +0 -223
@@ -1,179 +0,0 @@
1
- //
2
- // Copyright 2021 DXOS.org
3
- //
4
-
5
- import { EventEmitter } from 'events';
6
- import { discoveryKey } from 'hypercore-crypto';
7
- import hyperswarm from 'hyperswarm';
8
- import assert from 'node:assert';
9
- import pEvent from 'p-event';
10
- import Protocol from 'simple-hypercore-protocol';
11
-
12
- import { BootstrapNode } from './bootstrap-node';
13
- import { Messenger } from './messenger';
14
-
15
- const { Transporters: { Base: BaseTransporter } } = require('moleculer'); // eslint-disable-line @typescript-eslint/no-var-requires
16
-
17
- export class ProtocolTransporter extends BaseTransporter {
18
- static keyPair () {
19
- return Protocol.keyPair();
20
- }
21
-
22
- constructor (opts) {
23
- const { topic, keyPair, hyperswarm = {}, asBootstrap = false, bootstrapPort } = opts;
24
-
25
- assert(Buffer.isBuffer(topic), 'topic is required and must be a buffer of 32 bytes');
26
- assert(keyPair && Buffer.isBuffer(keyPair.publicKey) && Buffer.isBuffer(keyPair.secretKey), 'keyPair is required and must be an object of { publicKey: Buffer<32>, secretKey: Buffer<32> }');
27
-
28
- super(opts);
29
-
30
- this._topic = topic;
31
- this._keyPair = keyPair;
32
- this._discoveryKey = discoveryKey(topic);
33
- this._hyperswarmOptions = hyperswarm;
34
- this._messenger = new Messenger(this._topic, this._keyPair);
35
-
36
- this._ee = new EventEmitter();
37
- this._nanomessage = null;
38
- this._swarm = null;
39
- this._bootstrapNode = null;
40
-
41
- if (asBootstrap) {
42
- this._bootstrapNode = new BootstrapNode({ port: bootstrapPort });
43
- }
44
-
45
- this.onPeerConnection = this.onPeerConnection.bind(this);
46
- this._messenger.on('message', message => this._ee.emit(message.topic, message.data));
47
- this._messenger.on('peer-added', (peer) => this._ee.emit('peer-added', peer));
48
- this._messenger.on('peer-deleted', (peer) => this._ee.emit('peer-deleted', peer));
49
- }
50
-
51
- get dht () {
52
- return this._swarm && this._swarm.network.discovery && this._swarm.network.discovery.dht;
53
- }
54
-
55
- get onlyLocal () {
56
- return this._messenger.peers.length === 0;
57
- }
58
-
59
- get peers () {
60
- return this._messenger ? this._messenger.peers : [];
61
- }
62
-
63
- on (event, handler) {
64
- this._ee.on(event, handler);
65
- }
66
-
67
- off (event, handler) {
68
- this._ee.off(event, handler);
69
- }
70
-
71
- waitForConnected () {
72
- if (this.connected) {
73
- return;
74
- }
75
- return pEvent(this, 'connected');
76
- }
77
-
78
- async connect () {
79
- const opts = {
80
- ...this._hyperswarmOptions
81
- };
82
-
83
- if (this._bootstrapNode) {
84
- await this._bootstrapNode.start(this.broker);
85
-
86
- if (!opts.bootstrap) {
87
- opts.bootstrap = [];
88
- }
89
-
90
- const address = await this._bootstrapNode.getAddress();
91
- opts.bootstrap.push(`${address.address}:${address.port}`);
92
- }
93
-
94
- if (opts.bootstrap) {
95
- opts.bootstrap = [...new Set(opts.bootstrap)];
96
- }
97
-
98
- this.logger.info('Bootstrap nodes', opts.bootstrap ? opts.bootstrap : 'default');
99
-
100
- this._swarm = hyperswarm(opts);
101
- this._swarm.on('connection', this.onPeerConnection);
102
- this._swarm.once('close', () => {
103
- if (this.connected) {
104
- this.connected = false;
105
- }
106
-
107
- this._swarm.removeListener('connection', this.onPeerConnection);
108
- this.logger.warn('ProtocolTransporter disconnected');
109
- });
110
-
111
- await this._messenger.open();
112
-
113
- return new Promise((resolve, reject) => {
114
- const onError = (err) => {
115
- this.logger.error('ProtocolTransporter error', err.message);
116
- reject(err);
117
- };
118
-
119
- this._swarm.once('error', onError);
120
-
121
- this._swarm.join(this._discoveryKey, {
122
- lookup: true,
123
- announce: true
124
- }, () => {
125
- this.logger.info('ProtocolTransporter connected');
126
- this._swarm.removeListener('error', onError);
127
- this._ee.emit('connected');
128
- void this.onConnected().then(resolve);
129
- });
130
- });
131
- }
132
-
133
- async disconnect () {
134
- if (this._bootstrapNode) {
135
- await this._bootstrapNode.stop();
136
- }
137
-
138
- if (this._swarm) {
139
- await new Promise(resolve => this._swarm.destroy(() => resolve()));
140
- await this._messenger.close();
141
- }
142
- }
143
-
144
- subscribe (cmd, nodeID) {
145
- const t = this.getTopicName(cmd, nodeID);
146
-
147
- this._ee.on(t, msg => this.receive(cmd, msg));
148
-
149
- return Promise.resolve();
150
- }
151
-
152
- /**
153
- * Send data buffer.
154
- *
155
- * @param {String} topic
156
- * @param {Buffer} data
157
- * @param {Object} meta
158
- *
159
- * @returns {Promise}
160
- */
161
- send (topic, data, { packet }) {
162
- if (!this._swarm || this._messenger.closed || this._messenger.closing || this._messenger.peers.length === 0) {
163
- return Promise.resolve();
164
- }
165
-
166
- const sended = this._messenger.send(packet.target, { topic, data });
167
- if (!sended) {
168
- return this._messenger.broadcast({ topic, data });
169
- }
170
- }
171
-
172
- async onPeerConnection (socket, info) {
173
- try {
174
- await this._messenger.addPeer(socket, info);
175
- } catch (err) {
176
- this.logger.error('Peer error', err);
177
- }
178
- }
179
- }
@@ -1,223 +0,0 @@
1
- //
2
- // Copyright 2021 DXOS.org
3
- //
4
-
5
- import eos from 'end-of-stream';
6
- import { EventEmitter } from 'events';
7
- import crypto from 'hypercore-crypto';
8
- import { NanoresourcePromise } from 'nanoresource-promise/emitter';
9
- import Protocol from 'simple-hypercore-protocol';
10
- import varint from 'varint';
11
-
12
- import { Broadcast } from '@dxos/broadcast';
13
-
14
- const BROADCAST_CHANNEL = 0;
15
- const DIRECT_CHANNEL = 1;
16
-
17
- const packetCodec = {
18
- encode: (obj) => {
19
- const length = Buffer.byteLength(obj.topic, 'utf8');
20
- const buf = Buffer.allocUnsafe(varint.encodingLength(length) + length + obj.data.length);
21
- varint.encode(length, buf);
22
- buf.write(obj.topic, varint.encode.bytes, length, 'utf8');
23
- obj.data.copy(buf, varint.encode.bytes + length);
24
- return buf;
25
- },
26
- decode: (buf) => {
27
- const length = varint.decode(buf);
28
- const topic = buf.slice(varint.decode.bytes, varint.decode.bytes + length);
29
- const data = buf.slice(varint.decode.bytes + length);
30
- return { topic: topic.toString(), data };
31
- }
32
- };
33
-
34
- class Peer extends EventEmitter {
35
- constructor ({ initiator, socket, topic, keyPair }) {
36
- super();
37
-
38
- this._initiator = initiator;
39
- this._socket = socket;
40
- this._initializeProtocol(topic, keyPair);
41
- }
42
-
43
- get destroyed () {
44
- return this._socket.destroyed;
45
- }
46
-
47
- get initiator () {
48
- return this._initiator;
49
- }
50
-
51
- get publicKey () {
52
- return this._protocol.publicKey;
53
- }
54
-
55
- get remotePublicKey () {
56
- return this._protocol.remotePublicKey;
57
- }
58
-
59
- get sessionKey () {
60
- return this._protocol.handshakeHash ? crypto.discoveryKey(this._protocol.handshakeHash) : null;
61
- }
62
-
63
- // The broadcast use an `id` prop.
64
- get id () {
65
- return this.remotePublicKey;
66
- }
67
-
68
- broadcast (buf) {
69
- if (this._socket.destroyed) {
70
- return;
71
- }
72
- this._protocol.extension(BROADCAST_CHANNEL, 0, buf);
73
- }
74
-
75
- send (buf) {
76
- if (this._socket.destroyed) {
77
- return;
78
- }
79
- this._protocol.extension(DIRECT_CHANNEL, 0, buf);
80
- }
81
-
82
- destroy () {
83
- if (this._socket.destroyed) {
84
- return;
85
- }
86
- return this._socket.destroy();
87
- }
88
-
89
- _initializeProtocol (topic, keyPair) {
90
- const socket = this._socket;
91
-
92
- this._protocol = new Protocol(this._initiator, {
93
- keyPair,
94
- send (data) {
95
- socket.write(data);
96
- },
97
- onclose () {
98
- if (socket.destroyed) {
99
- return;
100
- }
101
- socket.destroy();
102
- },
103
- onhandshake: () => this.emit('handshake'),
104
- onextension: (ch, id, data) => this.emit('message', ch, data)
105
- });
106
-
107
- socket.on('data', (data) => this._protocol.recv(data));
108
-
109
- eos(socket, () => this._protocol.destroy());
110
- }
111
- }
112
-
113
- class Messenger extends NanoresourcePromise {
114
- constructor (topic, keyPair) {
115
- super();
116
-
117
- this._topic = topic;
118
- this._keyPair = keyPair;
119
- this._maxAge = 30 * 1000;
120
- this._broadcast = new Broadcast(this._middleware(), {
121
- id: this.publicKey,
122
- maxAge: this._maxAge,
123
- maxSize: Number.MAX_SAFE_INTEGER
124
- });
125
- this._peers = new Set();
126
- }
127
-
128
- get publicKey () {
129
- return this._keyPair.publicKey;
130
- }
131
-
132
- get peers () {
133
- return Array.from(this._peers.values());
134
- }
135
-
136
- addPeer (socket, info) {
137
- const peer = new Peer({
138
- initiator: info.client,
139
- socket,
140
- topic: this._topic,
141
- keyPair: this._keyPair
142
- });
143
-
144
- peer.on('handshake', () => {
145
- if (socket.destroyed) {
146
- return;
147
- }
148
- if (info.deduplicate(peer.remotePublicKey, peer.publicKey)) {
149
- return;
150
- }
151
- this._peers.add(peer);
152
- this._broadcast.updatePeers(this.peers);
153
- this.emit('peer-added', { initiator: peer.initiator, sessionKey: peer.sessionKey, peerId: peer.id });
154
- });
155
-
156
- const onBroadcast = (ch, message) => this.emit('peer-message', ch, message);
157
- peer.on('message', onBroadcast);
158
-
159
- eos(socket, () => {
160
- this._peers.delete(peer);
161
- this._broadcast.updatePeers(this.peers);
162
- peer.off('message', onBroadcast);
163
- this.emit('peer-deleted', { initiator: peer.initiator, sessionKey: peer.sessionKey, peerId: peer.id });
164
- });
165
-
166
- return peer;
167
- }
168
-
169
- broadcast (message, options) {
170
- return this._broadcast.publish(packetCodec.encode(message), options);
171
- }
172
-
173
- send (id, message) {
174
- const peer = this.peers.find(p => p.remotePublicKey.toString('hex') === id);
175
-
176
- if (!peer) {
177
- return false;
178
- }
179
-
180
- return peer.send(packetCodec.encode(message));
181
- }
182
-
183
- async _open () {
184
- await this._broadcast.open();
185
-
186
- this._pruneCacheInterval = setInterval(() => {
187
- this._broadcast.pruneCache();
188
- }, this._maxAge);
189
- }
190
-
191
- async _close () {
192
- await this._broadcast.close();
193
- clearInterval(this._pruneCacheInterval);
194
- }
195
-
196
- _middleware () {
197
- return {
198
- // Send must be async.
199
- send: async (packet, node) => node.broadcast(packet),
200
- subscribe: (onData) => {
201
- const onMessage = (ch, message) => {
202
- try {
203
- if (ch === BROADCAST_CHANNEL) {
204
- const response = onData(message);
205
- if (response && response.data) {
206
- this.emit('message', packetCodec.decode(response.data));
207
- }
208
- } else {
209
- this.emit('message', packetCodec.decode(message));
210
- }
211
- } catch (err) {}
212
- };
213
-
214
- this.on('peer-message', onMessage);
215
- return () => {
216
- this.off('peer-message', onMessage);
217
- };
218
- }
219
- };
220
- }
221
- }
222
-
223
- exports.Messenger = Messenger;