@libp2p/pubsub 0.0.0 → 0.2.0

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.
Files changed (76) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +35 -0
  3. package/dist/src/errors.d.ts +39 -0
  4. package/dist/src/errors.d.ts.map +1 -0
  5. package/dist/src/errors.js +41 -0
  6. package/dist/src/errors.js.map +1 -0
  7. package/dist/src/index.d.ts +180 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +467 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/message/rpc.d.ts +258 -0
  12. package/dist/src/message/rpc.js +699 -0
  13. package/dist/src/message/sign.d.ts +17 -0
  14. package/dist/src/message/sign.d.ts.map +1 -0
  15. package/dist/src/message/sign.js +84 -0
  16. package/dist/src/message/sign.js.map +1 -0
  17. package/dist/src/message/topic-descriptor.d.ts +254 -0
  18. package/dist/src/message/topic-descriptor.js +647 -0
  19. package/dist/src/peer-streams.d.ts +67 -0
  20. package/dist/src/peer-streams.d.ts.map +1 -0
  21. package/dist/src/peer-streams.js +112 -0
  22. package/dist/src/peer-streams.js.map +1 -0
  23. package/dist/src/utils.d.ts +29 -0
  24. package/dist/src/utils.d.ts.map +1 -0
  25. package/dist/src/utils.js +80 -0
  26. package/dist/src/utils.js.map +1 -0
  27. package/dist/test/emit-self.spec.d.ts +2 -0
  28. package/dist/test/emit-self.spec.d.ts.map +1 -0
  29. package/dist/test/emit-self.spec.js +63 -0
  30. package/dist/test/emit-self.spec.js.map +1 -0
  31. package/dist/test/instance.spec.d.ts +2 -0
  32. package/dist/test/instance.spec.d.ts.map +1 -0
  33. package/dist/test/instance.spec.js +50 -0
  34. package/dist/test/instance.spec.js.map +1 -0
  35. package/dist/test/lifesycle.spec.d.ts +2 -0
  36. package/dist/test/lifesycle.spec.d.ts.map +1 -0
  37. package/dist/test/lifesycle.spec.js +192 -0
  38. package/dist/test/lifesycle.spec.js.map +1 -0
  39. package/dist/test/message.spec.d.ts +2 -0
  40. package/dist/test/message.spec.d.ts.map +1 -0
  41. package/dist/test/message.spec.js +83 -0
  42. package/dist/test/message.spec.js.map +1 -0
  43. package/dist/test/pubsub.spec.d.ts +2 -0
  44. package/dist/test/pubsub.spec.d.ts.map +1 -0
  45. package/dist/test/pubsub.spec.js +310 -0
  46. package/dist/test/pubsub.spec.js.map +1 -0
  47. package/dist/test/sign.spec.d.ts +2 -0
  48. package/dist/test/sign.spec.d.ts.map +1 -0
  49. package/dist/test/sign.spec.js +93 -0
  50. package/dist/test/sign.spec.js.map +1 -0
  51. package/dist/test/topic-validators.spec.d.ts +2 -0
  52. package/dist/test/topic-validators.spec.d.ts.map +1 -0
  53. package/dist/test/topic-validators.spec.js +86 -0
  54. package/dist/test/topic-validators.spec.js.map +1 -0
  55. package/dist/test/utils/index.d.ts +22 -0
  56. package/dist/test/utils/index.d.ts.map +1 -0
  57. package/dist/test/utils/index.js +86 -0
  58. package/dist/test/utils/index.js.map +1 -0
  59. package/dist/test/utils.spec.d.ts +2 -0
  60. package/dist/test/utils.spec.d.ts.map +1 -0
  61. package/dist/test/utils.spec.js +53 -0
  62. package/dist/test/utils.spec.js.map +1 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +109 -4
  65. package/src/README.md +251 -0
  66. package/src/errors.ts +45 -0
  67. package/src/index.ts +610 -0
  68. package/src/message/rpc.d.ts +258 -0
  69. package/src/message/rpc.js +699 -0
  70. package/src/message/rpc.proto +20 -0
  71. package/src/message/sign.ts +101 -0
  72. package/src/message/topic-descriptor.d.ts +254 -0
  73. package/src/message/topic-descriptor.js +647 -0
  74. package/src/message/topic-descriptor.proto +30 -0
  75. package/src/peer-streams.ts +169 -0
  76. package/src/utils.ts +93 -0
package/LICENSE ADDED
@@ -0,0 +1,4 @@
1
+ This project is dual licensed under MIT and Apache-2.0.
2
+
3
+ MIT: https://www.opensource.org/licenses/mit
4
+ Apache-2.0: https://www.apache.org/licenses/license-2.0
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # libp2p-pubsub <!-- omit in toc -->
2
+
3
+ > Contains an implementation of the [Pubsub](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/pubsub/index.ts) interface
4
+
5
+ ## Table of contents <!-- omit in toc -->
6
+
7
+ - [Usage](#usage)
8
+ - [Contribute](#contribute)
9
+ - [License](#license)
10
+
11
+ ## Usage
12
+
13
+ ```console
14
+ npm i libp2p-pubsub
15
+ ```
16
+
17
+ ```javascript
18
+ import { PubsubBaseProtocol } from '@libp2p/pubsub'
19
+
20
+ class MyPubsubImplementation extends PubsubBaseProtocol {
21
+ // .. extra methods here
22
+ }
23
+ ```
24
+
25
+ ## Contribute
26
+
27
+ The libp2p implementation in JavaScript is a work in progress. As such, there are a few things you can do right now to help out:
28
+
29
+ - Go through the modules and **check out existing issues**. This would be especially useful for modules in active development. Some knowledge of IPFS/libp2p may be required, as well as the infrastructure behind it - for instance, you may need to read up on p2p and more complex operations like muxing to be able to help technically.
30
+ - **Perform code reviews**. More eyes will help a) speed the project along b) ensure quality and c) reduce possible future bugs.
31
+ - **Add tests**. There can never be enough tests.
32
+
33
+ ## License
34
+
35
+ [Apache-2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT) © Protocol Labs
@@ -0,0 +1,39 @@
1
+ export declare const codes: {
2
+ /**
3
+ * Signature policy is invalid
4
+ */
5
+ ERR_INVALID_SIGNATURE_POLICY: string;
6
+ /**
7
+ * Signature policy is unhandled
8
+ */
9
+ ERR_UNHANDLED_SIGNATURE_POLICY: string;
10
+ /**
11
+ * Message expected to have a `signature`, but doesn't
12
+ */
13
+ ERR_MISSING_SIGNATURE: string;
14
+ /**
15
+ * Message expected to have a `seqno`, but doesn't
16
+ */
17
+ ERR_MISSING_SEQNO: string;
18
+ /**
19
+ * Message `signature` is invalid
20
+ */
21
+ ERR_INVALID_SIGNATURE: string;
22
+ /**
23
+ * Message expected to not have a `from`, but does
24
+ */
25
+ ERR_UNEXPECTED_FROM: string;
26
+ /**
27
+ * Message expected to not have a `signature`, but does
28
+ */
29
+ ERR_UNEXPECTED_SIGNATURE: string;
30
+ /**
31
+ * Message expected to not have a `key`, but does
32
+ */
33
+ ERR_UNEXPECTED_KEY: string;
34
+ /**
35
+ * Message expected to not have a `seqno`, but does
36
+ */
37
+ ERR_UNEXPECTED_SEQNO: string;
38
+ };
39
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK;IAChB;;OAEG;;IAEH;;OAEG;;IAKH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAKH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;CAEJ,CAAA"}
@@ -0,0 +1,41 @@
1
+ export const codes = {
2
+ /**
3
+ * Signature policy is invalid
4
+ */
5
+ ERR_INVALID_SIGNATURE_POLICY: 'ERR_INVALID_SIGNATURE_POLICY',
6
+ /**
7
+ * Signature policy is unhandled
8
+ */
9
+ ERR_UNHANDLED_SIGNATURE_POLICY: 'ERR_UNHANDLED_SIGNATURE_POLICY',
10
+ // Strict signing codes
11
+ /**
12
+ * Message expected to have a `signature`, but doesn't
13
+ */
14
+ ERR_MISSING_SIGNATURE: 'ERR_MISSING_SIGNATURE',
15
+ /**
16
+ * Message expected to have a `seqno`, but doesn't
17
+ */
18
+ ERR_MISSING_SEQNO: 'ERR_MISSING_SEQNO',
19
+ /**
20
+ * Message `signature` is invalid
21
+ */
22
+ ERR_INVALID_SIGNATURE: 'ERR_INVALID_SIGNATURE',
23
+ // Strict no-signing codes
24
+ /**
25
+ * Message expected to not have a `from`, but does
26
+ */
27
+ ERR_UNEXPECTED_FROM: 'ERR_UNEXPECTED_FROM',
28
+ /**
29
+ * Message expected to not have a `signature`, but does
30
+ */
31
+ ERR_UNEXPECTED_SIGNATURE: 'ERR_UNEXPECTED_SIGNATURE',
32
+ /**
33
+ * Message expected to not have a `key`, but does
34
+ */
35
+ ERR_UNEXPECTED_KEY: 'ERR_UNEXPECTED_KEY',
36
+ /**
37
+ * Message expected to not have a `seqno`, but does
38
+ */
39
+ ERR_UNEXPECTED_SEQNO: 'ERR_UNEXPECTED_SEQNO'
40
+ };
41
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB;;OAEG;IACH,4BAA4B,EAAE,8BAA8B;IAC5D;;OAEG;IACH,8BAA8B,EAAE,gCAAgC;IAEhE,uBAAuB;IAEvB;;OAEG;IACH,qBAAqB,EAAE,uBAAuB;IAC9C;;OAEG;IACH,iBAAiB,EAAE,mBAAmB;IACtC;;OAEG;IACH,qBAAqB,EAAE,uBAAuB;IAE9C,0BAA0B;IAE1B;;OAEG;IACH,mBAAmB,EAAE,qBAAqB;IAC1C;;OAEG;IACH,wBAAwB,EAAE,0BAA0B;IACpD;;OAEG;IACH,kBAAkB,EAAE,oBAAoB;IACxC;;OAEG;IACH,oBAAoB,EAAE,sBAAsB;CAC7C,CAAA"}
@@ -0,0 +1,180 @@
1
+ /// <reference types="node" />
2
+ import debug from 'debug';
3
+ import { EventEmitter } from 'events';
4
+ import Queue from 'p-queue';
5
+ import { RPC, IRPC } from './message/rpc.js';
6
+ import { PeerStreams } from './peer-streams.js';
7
+ import type { PeerId } from '@libp2p/interfaces/peer-id';
8
+ import type { Registrar, IncomingStreamEvent } from '@libp2p/interfaces/registrar';
9
+ import type { Connection } from '@libp2p/interfaces/connection';
10
+ import type BufferList from 'bl';
11
+ import type { PubSub, Message, StrictNoSign, StrictSign, PubsubOptions } from '@libp2p/interfaces/pubsub';
12
+ import type { Startable } from '@libp2p/interfaces';
13
+ export interface TopicValidator {
14
+ (topic: string, message: Message): Promise<void>;
15
+ }
16
+ /**
17
+ * PubsubBaseProtocol handles the peers and connections logic for pubsub routers
18
+ * and specifies the API that pubsub routers should have.
19
+ */
20
+ export declare abstract class PubsubBaseProtocol extends EventEmitter implements PubSub, Startable {
21
+ peerId: PeerId;
22
+ started: boolean;
23
+ /**
24
+ * Map of topics to which peers are subscribed to
25
+ */
26
+ topics: Map<string, Set<string>>;
27
+ /**
28
+ * List of our subscriptions
29
+ */
30
+ subscriptions: Set<string>;
31
+ /**
32
+ * Map of peer streams
33
+ */
34
+ peers: Map<string, PeerStreams>;
35
+ /**
36
+ * The signature policy to follow by default
37
+ */
38
+ globalSignaturePolicy: StrictNoSign | StrictSign;
39
+ /**
40
+ * If router can relay received messages, even if not subscribed
41
+ */
42
+ canRelayMessage: boolean;
43
+ /**
44
+ * if publish should emit to self, if subscribed
45
+ */
46
+ emitSelf: boolean;
47
+ /**
48
+ * Topic validator map
49
+ *
50
+ * Keyed by topic
51
+ * Topic validators are functions with the following input:
52
+ */
53
+ topicValidators: Map<string, TopicValidator>;
54
+ queue: Queue;
55
+ registrar: Registrar;
56
+ protected log: debug.Debugger & {
57
+ err: debug.Debugger;
58
+ };
59
+ protected multicodecs: string[];
60
+ protected _libp2p: any;
61
+ private _registrarId;
62
+ constructor(props: PubsubOptions);
63
+ /**
64
+ * Register the pubsub protocol onto the libp2p node.
65
+ *
66
+ * @returns {void}
67
+ */
68
+ start(): void;
69
+ /**
70
+ * Unregister the pubsub protocol and the streams with other peers will be closed.
71
+ *
72
+ * @returns {void}
73
+ */
74
+ stop(): void;
75
+ isStarted(): boolean;
76
+ /**
77
+ * On an inbound stream opened
78
+ */
79
+ protected _onIncomingStream({ protocol, stream, connection }: IncomingStreamEvent): void;
80
+ /**
81
+ * Registrar notifies an established connection with pubsub protocol
82
+ */
83
+ protected _onPeerConnected(peerId: PeerId, conn: Connection): Promise<void>;
84
+ /**
85
+ * Registrar notifies a closing connection with pubsub protocol
86
+ */
87
+ protected _onPeerDisconnected(peerId: PeerId, conn?: Connection): void;
88
+ /**
89
+ * Notifies the router that a peer has been connected
90
+ */
91
+ protected _addPeer(peerId: PeerId, protocol: string): PeerStreams;
92
+ /**
93
+ * Notifies the router that a peer has been disconnected
94
+ */
95
+ protected _removePeer(peerId: PeerId): PeerStreams | undefined;
96
+ /**
97
+ * Responsible for processing each RPC message received by other peers.
98
+ */
99
+ _processMessages(idB58Str: string, stream: AsyncIterable<Uint8Array | BufferList>, peerStreams: PeerStreams): Promise<void>;
100
+ /**
101
+ * Handles an rpc request from a peer
102
+ */
103
+ _processRpc(idB58Str: string, peerStreams: PeerStreams, rpc: RPC): Promise<boolean>;
104
+ /**
105
+ * Handles a subscription change from a peer
106
+ */
107
+ _processRpcSubOpt(id: string, subOpt: RPC.ISubOpts): void;
108
+ /**
109
+ * Handles an message from a peer
110
+ */
111
+ _processRpcMessage(msg: Message): Promise<void>;
112
+ /**
113
+ * Emit a message from a peer
114
+ */
115
+ _emitMessage(message: Message): void;
116
+ /**
117
+ * The default msgID implementation
118
+ * Child class can override this.
119
+ */
120
+ getMsgId(msg: Message): import("multiformats/hashes/hasher").Await<Uint8Array>;
121
+ /**
122
+ * Whether to accept a message from a peer
123
+ * Override to create a graylist
124
+ */
125
+ _acceptFrom(id: string): boolean;
126
+ /**
127
+ * Decode Uint8Array into an RPC object.
128
+ * This can be override to use a custom router protobuf.
129
+ */
130
+ _decodeRpc(bytes: Uint8Array): RPC;
131
+ /**
132
+ * Encode RPC object into a Uint8Array.
133
+ * This can be override to use a custom router protobuf.
134
+ */
135
+ _encodeRpc(rpc: IRPC): Uint8Array;
136
+ /**
137
+ * Send an rpc object to a peer
138
+ */
139
+ _sendRpc(id: string, rpc: IRPC): void;
140
+ /**
141
+ * Send subscriptions to a peer
142
+ */
143
+ _sendSubscriptions(id: string, topics: string[], subscribe: boolean): void;
144
+ /**
145
+ * Validates the given message. The signature will be checked for authenticity.
146
+ * Throws an error on invalid messages
147
+ */
148
+ validate(message: Message): Promise<void>;
149
+ /**
150
+ * Normalizes the message and signs it, if signing is enabled.
151
+ * Should be used by the routers to create the message to send.
152
+ */
153
+ protected _buildMessage(message: Message): Promise<Message>;
154
+ /**
155
+ * Get a list of the peer-ids that are subscribed to one topic.
156
+ */
157
+ getSubscribers(topic: string): string[];
158
+ /**
159
+ * Publishes messages to all subscribed peers
160
+ */
161
+ publish(topic: string, message: Uint8Array): Promise<void>;
162
+ /**
163
+ * Overriding the implementation of publish should handle the appropriate algorithms for the publish/subscriber implementation.
164
+ * For example, a Floodsub implementation might simply publish each message to each topic for every peer
165
+ */
166
+ abstract _publish(message: Message): Promise<void>;
167
+ /**
168
+ * Subscribes to a given topic.
169
+ */
170
+ subscribe(topic: string): void;
171
+ /**
172
+ * Unsubscribe from the given topic.
173
+ */
174
+ unsubscribe(topic: string): void;
175
+ /**
176
+ * Get the list of topics which the peer is subscribed to.
177
+ */
178
+ getTopics(): string[];
179
+ }
180
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}