@libp2p/tls 2.2.6 → 2.2.7-a02cb0461

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.
@@ -1,13 +1,11 @@
1
1
  import { serviceCapabilities } from '@libp2p/interface';
2
- import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions } from '@libp2p/interface';
3
- import type { Duplex } from 'it-stream-types';
4
- import type { Uint8ArrayList } from 'uint8arraylist';
2
+ import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, MessageStream } from '@libp2p/interface';
5
3
  export declare class TLS implements ConnectionEncrypter {
6
4
  protocol: string;
7
5
  constructor();
8
6
  readonly [Symbol.toStringTag] = "@libp2p/tls";
9
7
  readonly [serviceCapabilities]: string[];
10
- secureInbound<Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
11
- secureOutbound<Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
8
+ secureInbound<Stream extends MessageStream = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
9
+ secureOutbound<Stream extends MessageStream = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
12
10
  }
13
11
  //# sourceMappingURL=tls.browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tls.browser.d.ts","sourceRoot":"","sources":["../../src/tls.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC7H,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,qBAAa,GAAI,YAAW,mBAAmB;IACtC,QAAQ,EAAE,MAAM,CAAW;;IAMlC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAgB;IAE7C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAEK,aAAa,CAAE,MAAM,SAAS,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAI9L,cAAc,CAAE,MAAM,SAAS,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAGtM"}
1
+ {"version":3,"file":"tls.browser.d.ts","sourceRoot":"","sources":["../../src/tls.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAE5I,qBAAa,GAAI,YAAW,mBAAmB;IACtC,QAAQ,EAAE,MAAM,CAAW;;IAMlC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAgB;IAE7C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAEK,aAAa,CAAE,MAAM,SAAS,aAAa,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAIxJ,cAAc,CAAE,MAAM,SAAS,aAAa,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAGhK"}
@@ -1 +1 @@
1
- {"version":3,"file":"tls.browser.js","sourceRoot":"","sources":["../../src/tls.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAKrC,MAAM,OAAO,GAAG;IACP,QAAQ,GAAW,QAAQ,CAAA;IAElC;QACE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAEQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAA;IAEpC,CAAC,mBAAmB,CAAC,GAAa;QACzC,+BAA+B;KAChC,CAAA;IAED,KAAK,CAAC,aAAa,CAA6F,IAAY,EAAE,OAAiC;QAC7J,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,cAAc,CAA6F,IAAY,EAAE,OAAiC;QAC9J,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;CACF"}
1
+ {"version":3,"file":"tls.browser.js","sourceRoot":"","sources":["../../src/tls.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrC,MAAM,OAAO,GAAG;IACP,QAAQ,GAAW,QAAQ,CAAA;IAElC;QACE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAEQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAA;IAEpC,CAAC,mBAAmB,CAAC,GAAa;QACzC,+BAA+B;KAChC,CAAA;IAED,KAAK,CAAC,aAAa,CAAuD,IAAY,EAAE,OAAiC;QACvH,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,cAAc,CAAuD,IAAY,EAAE,OAAiC;QACxH,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;CACF"}
package/dist/src/tls.d.ts CHANGED
@@ -19,9 +19,7 @@
19
19
  */
20
20
  import { serviceCapabilities } from '@libp2p/interface';
21
21
  import type { TLSComponents } from './index.js';
22
- import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions } from '@libp2p/interface';
23
- import type { Duplex } from 'it-stream-types';
24
- import type { Uint8ArrayList } from 'uint8arraylist';
22
+ import type { ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, MessageStream } from '@libp2p/interface';
25
23
  export declare class TLS implements ConnectionEncrypter {
26
24
  protocol: string;
27
25
  private readonly log;
@@ -30,11 +28,11 @@ export declare class TLS implements ConnectionEncrypter {
30
28
  constructor(components: TLSComponents);
31
29
  readonly [Symbol.toStringTag] = "@libp2p/tls";
32
30
  readonly [serviceCapabilities]: string[];
33
- secureInbound<Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
34
- secureOutbound<Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
31
+ secureInbound(connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection>;
32
+ secureOutbound(connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection>;
35
33
  /**
36
34
  * Encrypt connection
37
35
  */
38
- _encrypt<Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection>(conn: Stream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
36
+ _encrypt(connection: MessageStream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection>;
39
37
  }
40
38
  //# sourceMappingURL=tls.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tls.d.ts","sourceRoot":"","sources":["../../src/tls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAA8B,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAInF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAU,uBAAuB,EAAoC,MAAM,mBAAmB,CAAA;AACvK,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,qBAAa,GAAI,YAAW,mBAAmB;IACtC,QAAQ,EAAE,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CASvB;gBAEY,UAAU,EAAE,aAAa;IA2BtC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAgB;IAE7C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAEK,aAAa,CAAE,MAAM,SAAS,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAI9L,cAAc,CAAE,MAAM,SAAS,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAIrM;;OAEG;IACG,QAAQ,CAAE,MAAM,SAAS,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAwJnN"}
1
+ {"version":3,"file":"tls.d.ts","sourceRoot":"","sources":["../../src/tls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAA8B,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAInF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAU,uBAAuB,EAAoC,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjK,qBAAa,GAAI,YAAW,mBAAmB;IACtC,QAAQ,EAAE,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CASvB;gBAEY,UAAU,EAAE,aAAa;IA2BtC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAgB;IAE7C,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAEK,aAAa,CAAE,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIxG,cAAc,CAAE,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI/G;;OAEG;IACG,QAAQ,CAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuJ7H"}
package/dist/src/tls.js CHANGED
@@ -20,7 +20,7 @@
20
20
  import { TLSSocket, connect } from 'node:tls';
21
21
  import { InvalidCryptoExchangeError, serviceCapabilities } from '@libp2p/interface';
22
22
  import { HandshakeTimeoutError } from './errors.js';
23
- import { generateCertificate, verifyPeerCertificate, itToStream, streamToIt } from './utils.js';
23
+ import { generateCertificate, verifyPeerCertificate, toNodeDuplex, toMessageStream } from './utils.js';
24
24
  import { PROTOCOL } from './index.js';
25
25
  export class TLS {
26
26
  protocol = PROTOCOL;
@@ -57,16 +57,17 @@ export class TLS {
57
57
  [serviceCapabilities] = [
58
58
  '@libp2p/connection-encryption'
59
59
  ];
60
- async secureInbound(conn, options) {
61
- return this._encrypt(conn, true, options);
60
+ async secureInbound(connection, options) {
61
+ return this._encrypt(connection, true, options);
62
62
  }
63
- async secureOutbound(conn, options) {
64
- return this._encrypt(conn, false, options);
63
+ async secureOutbound(connection, options) {
64
+ return this._encrypt(connection, false, options);
65
65
  }
66
66
  /**
67
67
  * Encrypt connection
68
68
  */
69
- async _encrypt(conn, isServer, options) {
69
+ async _encrypt(connection, isServer, options) {
70
+ const log = connection.log?.newScope('tls') ?? this.log;
70
71
  let streamMuxer;
71
72
  let streamMuxers = [];
72
73
  if (options?.skipStreamMuxerNegotiation !== true) {
@@ -86,7 +87,7 @@ export class TLS {
86
87
  'libp2p'
87
88
  ],
88
89
  ALPNCallback: ({ protocols }) => {
89
- this.log.trace('received protocols %s', protocols);
90
+ log.trace('received protocols %s', protocols);
90
91
  let chosenProtocol;
91
92
  for (const protocol of protocols) {
92
93
  if (protocol === 'libp2p') {
@@ -101,9 +102,10 @@ export class TLS {
101
102
  return chosenProtocol;
102
103
  }
103
104
  };
105
+ const duplex = toNodeDuplex(connection);
104
106
  let socket;
105
107
  if (isServer) {
106
- socket = new TLSSocket(itToStream(conn), {
108
+ socket = new TLSSocket(duplex, {
107
109
  ...opts,
108
110
  // require clients to send certificates
109
111
  requestCert: true
@@ -111,10 +113,13 @@ export class TLS {
111
113
  }
112
114
  else {
113
115
  socket = connect({
114
- socket: itToStream(conn),
116
+ socket: duplex,
115
117
  ...opts
116
118
  });
117
119
  }
120
+ duplex.on('error', (err) => {
121
+ socket.emit('error', err);
122
+ });
118
123
  const onAbort = () => {
119
124
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
120
125
  abort: true
@@ -128,9 +133,9 @@ export class TLS {
128
133
  return new Promise((resolve, reject) => {
129
134
  const verifyRemote = () => {
130
135
  const remote = socket.getPeerCertificate();
131
- verifyPeerCertificate(remote.raw, options?.remotePeer, this.log)
136
+ verifyPeerCertificate(remote.raw, options?.remotePeer, log)
132
137
  .then(remotePeer => {
133
- this.log('remote certificate ok, remote peer %p', remotePeer);
138
+ log('remote certificate ok, remote peer %p', remotePeer);
134
139
  // 'libp2p' is a special protocol - if it's sent the remote does not
135
140
  // support early muxer negotiation
136
141
  if (!isServer && typeof socket.alpnProtocol === 'string' && socket.alpnProtocol !== 'libp2p' && options?.skipStreamMuxerNegotiation !== true) {
@@ -138,19 +143,14 @@ export class TLS {
138
143
  streamMuxer = this.components.upgrader.getStreamMuxers().get(socket.alpnProtocol);
139
144
  if (streamMuxer == null) {
140
145
  const err = new InvalidCryptoExchangeError(`Selected muxer ${socket.alpnProtocol} did not exist`);
141
- this.log.error(`Selected muxer ${socket.alpnProtocol} did not exist - %e`, err);
142
- if (isAbortable(conn)) {
143
- conn.abort(err);
144
- reject(err);
145
- }
146
+ log.error(`Selected muxer ${socket.alpnProtocol} did not exist - %e`, err);
147
+ connection.abort(err);
148
+ reject(err);
146
149
  }
147
150
  }
148
151
  resolve({
149
152
  remotePeer,
150
- conn: {
151
- ...conn,
152
- ...streamToIt(socket)
153
- },
153
+ connection: toMessageStream(connection, socket),
154
154
  streamMuxer
155
155
  });
156
156
  })
@@ -162,20 +162,18 @@ export class TLS {
162
162
  });
163
163
  };
164
164
  socket.on('error', (err) => {
165
- this.log.error('error encrypting %s connection - %e', isServer ? 'server' : 'client', err);
165
+ log.error('error encrypting %s connection - %e', connection.direction, err);
166
166
  if (err.name !== 'HandshakeTimeoutError') {
167
167
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
168
168
  error: true
169
169
  });
170
170
  }
171
- socket.destroy(err);
172
- if (isAbortable(conn)) {
173
- conn.abort(err);
174
- }
171
+ socket.destroy();
172
+ connection.abort(err);
175
173
  reject(err);
176
174
  });
177
175
  socket.once('secure', () => {
178
- this.log('verifying remote certificate');
176
+ log('verifying remote certificate of %s connection', connection.direction);
179
177
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
180
178
  secure: true
181
179
  });
@@ -197,7 +195,4 @@ export class TLS {
197
195
  });
198
196
  }
199
197
  }
200
- function isAbortable(obj) {
201
- return typeof obj?.abort === 'function';
202
- }
203
198
  //# sourceMappingURL=tls.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tls.js","sourceRoot":"","sources":["../../src/tls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tls.js","sourceRoot":"","sources":["../../src/tls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACtG,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAKrC,MAAM,OAAO,GAAG;IACP,QAAQ,GAAW,QAAQ,CAAA;IACjB,GAAG,CAAQ;IACX,UAAU,CAAe;IACzB,OAAO,CASvB;IAED,YAAa,UAAyB;QACpC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;QACvD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG;YACb,MAAM,EAAE;gBACN,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,gCAAgC,EAAE;oBACjF,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,yDAAyD;iBAChE,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,gCAAgC,EAAE;oBACjF,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,yDAAyD;iBAChE,CAAC;aACH;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,gCAAgC,EAAE;oBACjF,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,yDAAyD;iBAChE,CAAC;gBACF,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,gCAAgC,EAAE;oBACjF,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,yDAAyD;iBAChE,CAAC;aACH;SACF,CAAA;IACH,CAAC;IAEQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAA;IAEpC,CAAC,mBAAmB,CAAC,GAAa;QACzC,+BAA+B;KAChC,CAAA;IAED,KAAK,CAAC,aAAa,CAAE,UAAyB,EAAE,OAAiC;QAC/E,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,KAAK,CAAC,cAAc,CAAE,UAAyB,EAAE,OAAiC;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAE,UAAyB,EAAE,QAAiB,EAAE,OAAiC;QAC7F,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAA;QACvD,IAAI,WAA2C,CAAA;QAE/C,IAAI,YAAY,GAAa,EAAE,CAAA;QAE/B,IAAI,OAAO,EAAE,0BAA0B,KAAK,IAAI,EAAE,CAAC;YACjD,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,IAAI,GAAqB;YAC7B,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC;YACjE,QAAQ;YACR,2BAA2B;YAC3B,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;YACrB,kCAAkC;YAClC,kBAAkB,EAAE,KAAK;YAEzB,gDAAgD;YAChD,aAAa,EAAE;gBACb,GAAG,YAAY;gBACf,QAAQ;aACT;YACD,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC9B,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAA;gBAC7C,IAAI,cAAkC,CAAA;gBAEtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC1B,cAAc,GAAG,QAAQ,CAAA;oBAC3B,CAAC;oBAED,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;oBAEtE,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;wBACxB,cAAc,GAAG,QAAQ,CAAA;wBACzB,MAAK;oBACP,CAAC;gBACH,CAAC;gBAED,OAAO,cAAc,CAAA;YACvB,CAAC;SACF,CAAA;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;QACvC,IAAI,MAAiB,CAAA;QAErB,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE;gBAC7B,GAAG,IAAI;gBACP,uCAAuC;gBACvC,WAAW,EAAE,IAAI;aAClB,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,OAAO,CAAC;gBACf,MAAM,EAAE,MAAM;gBACd,GAAG,IAAI;aACR,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;gBAC7D,KAAK,EAAE,IAAI;aACZ,CAAC,CAAA;YACF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;gBAC7D,aAAa,EAAE,IAAI;aACpB,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,qBAAqB,EAAE,CAAC,CAAA;QACnD,CAAC,CAAA;QAED,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAEnD,OAAO,IAAI,OAAO,CAAmC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvE,MAAM,YAAY,GAAG,GAAS,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAA;gBAE1C,qBAAqB,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC;qBACxD,IAAI,CAAC,UAAU,CAAC,EAAE;oBACjB,GAAG,CAAC,uCAAuC,EAAE,UAAU,CAAC,CAAA;oBAExD,oEAAoE;oBACpE,kCAAkC;oBAClC,IAAI,CAAC,QAAQ,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,EAAE,0BAA0B,KAAK,IAAI,EAAE,CAAC;wBAC7I,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;wBACtD,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;wBAEjF,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;4BACxB,MAAM,GAAG,GAAG,IAAI,0BAA0B,CAAC,kBAAkB,MAAM,CAAC,YAAY,gBAAgB,CAAC,CAAA;4BACjG,GAAG,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,YAAY,qBAAqB,EAAE,GAAG,CAAC,CAAA;4BAE1E,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;4BACrB,MAAM,CAAC,GAAG,CAAC,CAAA;wBACb,CAAC;oBACH,CAAC;oBAED,OAAO,CAAC;wBACN,UAAU;wBACV,UAAU,EAAE,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC;wBAC/C,WAAW;qBACZ,CAAC,CAAA;gBACJ,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;oBACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;wBAC7D,uBAAuB,EAAE,IAAI;qBAC9B,CAAC,CAAA;oBAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBAC3B,CAAC,CAAC,CAAA;YACN,CAAC,CAAA;YAED,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBAChC,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;gBAE3E,IAAI,GAAG,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;oBACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;wBAC7D,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAA;gBACJ,CAAC;gBAED,MAAM,CAAC,OAAO,EAAE,CAAA;gBAChB,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAErB,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACzB,GAAG,CAAC,+CAA+C,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;gBAC1E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;oBAC7D,MAAM,EAAE,IAAI;iBACb,CAAC,CAAA;gBACF,YAAY,EAAE,CAAA;YAChB,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;oBAC7D,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC;oBAC7D,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC;aACC,OAAO,CAAC,GAAG,EAAE;YACZ,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACN,CAAC;CACF"}
@@ -1,7 +1,6 @@
1
- import { Duplex as DuplexStream } from 'node:stream';
2
- import type { PeerId, Logger, PrivateKey, AbortOptions } from '@libp2p/interface';
3
- import type { Duplex } from 'it-stream-types';
4
- import type { Uint8ArrayList } from 'uint8arraylist';
1
+ import { Duplex } from 'node:stream';
2
+ import tls from 'node:tls';
3
+ import type { PeerId, Logger, PrivateKey, AbortOptions, MessageStream } from '@libp2p/interface';
5
4
  export declare function verifyPeerCertificate(rawCertificate: Uint8Array, expectedPeerId?: PeerId, log?: Logger): Promise<PeerId>;
6
5
  export declare function generateCertificate(privateKey: PrivateKey, options?: AbortOptions): Promise<{
7
6
  cert: string;
@@ -11,6 +10,6 @@ export declare function generateCertificate(privateKey: PrivateKey, options?: Ab
11
10
  * @see https://github.com/libp2p/specs/blob/master/tls/tls.md#libp2p-public-key-extension
12
11
  */
13
12
  export declare function encodeSignatureData(certPublicKey: ArrayBuffer): Uint8Array;
14
- export declare function itToStream(conn: Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>>): DuplexStream;
15
- export declare function streamToIt(stream: DuplexStream): Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>>;
13
+ export declare function toNodeDuplex(stream: MessageStream): Duplex;
14
+ export declare function toMessageStream(stream: MessageStream, socket: tls.TLSSocket): MessageStream;
16
15
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AAepD,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE/G,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAapD,wBAAsB,qBAAqB,CAAE,cAAc,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D/H;AAED,wBAAsB,mBAAmB,CAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAuDjI;AAeD;;GAEG;AACH,wBAAgB,mBAAmB,CAAE,aAAa,EAAE,WAAW,GAAG,UAAU,CAQ3E;AAmBD,wBAAgB,UAAU,CAAE,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,GAAG,YAAY,CAoCnG;AA0DD,wBAAgB,UAAU,CAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,CAAC,CAErG"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,GAAG,MAAM,UAAU,CAAA;AAiB1B,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAA;AAchJ,wBAAsB,qBAAqB,CAAE,cAAc,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D/H;AAED,wBAAsB,mBAAmB,CAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAuDjI;AAeD;;GAEG;AACH,wBAAgB,mBAAmB,CAAE,aAAa,EAAE,WAAW,GAAG,UAAU,CAQ3E;AAmBD,wBAAgB,YAAY,CAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAqE3D;AAuFD,wBAAgB,eAAe,CAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,aAAa,CAE5F"}
package/dist/src/utils.js CHANGED
@@ -1,13 +1,17 @@
1
- import { Duplex as DuplexStream } from 'node:stream';
1
+ import net from 'node:net';
2
+ import { Duplex } from 'node:stream';
3
+ import tls from 'node:tls';
2
4
  import { publicKeyFromProtobuf } from '@libp2p/crypto/keys';
3
- import { InvalidCryptoExchangeError, UnexpectedPeerError } from '@libp2p/interface';
5
+ import { InvalidCryptoExchangeError, UnexpectedPeerError, StreamMessageEvent } from '@libp2p/interface';
4
6
  import { peerIdFromCID } from '@libp2p/peer-id';
7
+ import { AbstractMessageStream } from '@libp2p/utils';
5
8
  import { AsnConvert } from '@peculiar/asn1-schema';
6
9
  import * as asn1X509 from '@peculiar/asn1-x509';
7
10
  import { Crypto } from '@peculiar/webcrypto';
8
11
  import * as x509 from '@peculiar/x509';
9
12
  import * as asn1js from 'asn1js';
10
- import { queuelessPushable } from 'it-queueless-pushable';
13
+ import { pEvent } from 'p-event';
14
+ import { Uint8ArrayList } from 'uint8arraylist';
11
15
  import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
12
16
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
13
17
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
@@ -62,7 +66,7 @@ export async function verifyPeerCertificate(rawCertificate, expectedPeerId, log)
62
66
  }
63
67
  const remotePeerId = peerIdFromCID(remoteLibp2pPublicKey.toCID());
64
68
  if (expectedPeerId?.equals(remotePeerId) === false) {
65
- log?.error('invalid peer id');
69
+ log?.error('invalid peer id - expected %p got %p', expectedPeerId, remotePeerId);
66
70
  throw new UnexpectedPeerError();
67
71
  }
68
72
  return remotePeerId;
@@ -150,112 +154,138 @@ function formatAsPem(str) {
150
154
  finalString = finalString + '-----END PRIVATE KEY-----';
151
155
  return finalString;
152
156
  }
153
- export function itToStream(conn) {
154
- const output = queuelessPushable();
155
- const iterator = conn.source[Symbol.asyncIterator]();
156
- const stream = new DuplexStream({
157
- autoDestroy: false,
158
- allowHalfOpen: true,
159
- write(chunk, encoding, callback) {
160
- output.push(chunk)
157
+ export function toNodeDuplex(stream) {
158
+ function sendAndCallback(chunk, callback) {
159
+ try {
160
+ const sendMore = stream.send(chunk);
161
+ if (sendMore) {
162
+ callback();
163
+ return;
164
+ }
165
+ socket.pause();
166
+ pEvent(stream, 'drain', {
167
+ rejectionEvents: ['close']
168
+ })
161
169
  .then(() => {
170
+ socket.resume();
162
171
  callback();
163
- }, err => {
172
+ }, (err) => {
164
173
  callback(err);
165
174
  });
175
+ }
176
+ catch (err) {
177
+ callback(err);
178
+ }
179
+ }
180
+ // pause incoming messages until pulled from duplex
181
+ stream.pause();
182
+ const socket = new Duplex({
183
+ write(chunk, encoding, callback) {
184
+ sendAndCallback(chunk, callback);
185
+ },
186
+ writev(chunks, callback) {
187
+ sendAndCallback(new Uint8ArrayList(...chunks.map(({ chunk }) => chunk)), callback);
166
188
  },
167
189
  read() {
168
- iterator.next()
169
- .then(result => {
170
- if (result.done === true) {
171
- this.push(null);
172
- }
173
- else {
174
- this.push(result.value);
175
- }
176
- }, (err) => {
177
- this.destroy(err);
178
- });
190
+ stream.resume();
191
+ },
192
+ final(cb) {
193
+ stream.close()
194
+ .then(() => cb(), (err) => cb(err));
179
195
  }
180
196
  });
181
- // @ts-expect-error return type of sink is unknown
182
- conn.sink(output)
183
- .catch((err) => {
184
- stream.destroy(err);
185
- });
186
- return stream;
187
- }
188
- class DuplexIterable {
189
- source;
190
- stream;
191
- constructor(stream) {
192
- this.stream = stream;
193
- this.source = queuelessPushable();
194
- stream.addListener('data', (buf) => {
197
+ const onMessage = (evt) => {
198
+ const buf = evt.data;
199
+ let sendMore = true;
200
+ if (buf instanceof Uint8Array) {
201
+ sendMore = socket.push(buf);
202
+ }
203
+ else {
204
+ for (const chunk of buf) {
205
+ sendMore = socket.push(chunk);
206
+ }
207
+ }
208
+ if (!sendMore) {
195
209
  stream.pause();
196
- this.source.push(buf.subarray())
197
- .then(() => {
198
- stream.resume();
199
- }, (err) => {
200
- stream.emit('error', err);
201
- });
210
+ }
211
+ };
212
+ stream.addEventListener('message', onMessage);
213
+ const onClose = (evt) => {
214
+ socket.destroy(evt.error);
215
+ };
216
+ stream.addEventListener('close', onClose);
217
+ return socket;
218
+ }
219
+ class EncryptedMultiaddrConnection extends AbstractMessageStream {
220
+ socket;
221
+ /**
222
+ * @param stream - The maConn that encrypted data is transferred over
223
+ * @param socket - Performs encryption/decryption
224
+ */
225
+ constructor(stream, socket) {
226
+ super({
227
+ log: stream.log,
228
+ inactivityTimeout: stream.inactivityTimeout,
229
+ maxReadBufferLength: stream.maxReadBufferLength,
230
+ direction: stream.direction
231
+ });
232
+ this.socket = socket;
233
+ // accept decrypted data
234
+ this.socket.on('data', (buf) => {
235
+ this.onData(buf);
202
236
  });
203
- // both ends closed
204
- stream.addListener('close', () => {
205
- this.source.end()
237
+ this.socket.on('error', err => {
238
+ stream.abort(err);
239
+ });
240
+ this.socket.on('close', () => {
241
+ stream.close()
206
242
  .catch(err => {
207
- stream.emit('error', err);
243
+ stream.abort(err);
208
244
  });
209
245
  });
210
- stream.addListener('error', (err) => {
211
- this.source.end(err)
212
- .catch(() => { });
246
+ // can accept more plaintext data
247
+ this.socket.on('drain', () => {
248
+ this.safeDispatchEvent('drain');
213
249
  });
214
- // just writable end closed
215
- stream.addListener('finish', () => {
216
- this.source.end()
217
- .catch(() => { });
250
+ stream.addEventListener('close', () => {
251
+ socket.destroy();
252
+ this.onTransportClosed();
218
253
  });
219
- this.sink = this.sink.bind(this);
220
254
  }
221
- async sink(source) {
222
- try {
223
- for await (const buf of source) {
224
- const sendMore = this.stream.write(buf.subarray());
225
- if (!sendMore) {
226
- await waitForBackpressure(this.stream);
227
- }
255
+ async close(options) {
256
+ this.socket.destroySoon();
257
+ await pEvent(this.socket, 'close', options);
258
+ }
259
+ sendPause() {
260
+ this.socket.pause();
261
+ }
262
+ sendResume() {
263
+ this.socket.resume();
264
+ }
265
+ async sendClose(options) {
266
+ this.socket.destroySoon();
267
+ options?.signal?.throwIfAborted();
268
+ }
269
+ sendReset() {
270
+ this.socket.resetAndDestroy();
271
+ }
272
+ sendData(data) {
273
+ let sentBytes = 0;
274
+ let canSendMore = true;
275
+ for (const buf of data) {
276
+ sentBytes += buf.byteLength;
277
+ canSendMore = this.socket.write(buf);
278
+ if (!canSendMore) {
279
+ break;
228
280
  }
229
- // close writable end
230
- this.stream.end();
231
- }
232
- catch (err) {
233
- this.stream.destroy(err);
234
- throw err;
235
281
  }
282
+ return {
283
+ sentBytes,
284
+ canSendMore
285
+ };
236
286
  }
237
287
  }
238
- export function streamToIt(stream) {
239
- return new DuplexIterable(stream);
240
- }
241
- async function waitForBackpressure(stream) {
242
- await new Promise((resolve, reject) => {
243
- const continueListener = () => {
244
- cleanUp();
245
- resolve();
246
- };
247
- const stopListener = (err) => {
248
- cleanUp();
249
- reject(err ?? new Error('Stream ended'));
250
- };
251
- const cleanUp = () => {
252
- stream.removeListener('drain', continueListener);
253
- stream.removeListener('end', stopListener);
254
- stream.removeListener('error', stopListener);
255
- };
256
- stream.addListener('drain', continueListener);
257
- stream.addListener('end', stopListener);
258
- stream.addListener('error', stopListener);
259
- });
288
+ export function toMessageStream(stream, socket) {
289
+ return new EncryptedMultiaddrConnection(stream, socket);
260
290
  }
261
291
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/tls",
3
- "version": "2.2.6",
3
+ "version": "2.2.7-a02cb0461",
4
4
  "description": "A connection encrypter that uses TLS 1.3",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/connection-encrypter-tls#readme",
@@ -41,26 +41,25 @@
41
41
  "doc-check": "aegir doc-check"
42
42
  },
43
43
  "dependencies": {
44
- "@libp2p/crypto": "^5.1.7",
45
- "@libp2p/interface": "^2.10.5",
46
- "@libp2p/peer-id": "^5.1.8",
47
- "@peculiar/asn1-schema": "^2.3.15",
48
- "@peculiar/asn1-x509": "^2.3.15",
44
+ "@libp2p/crypto": "5.1.8-a02cb0461",
45
+ "@libp2p/interface": "2.11.0-a02cb0461",
46
+ "@libp2p/peer-id": "5.1.9-a02cb0461",
47
+ "@libp2p/utils": "6.7.2-a02cb0461",
48
+ "@peculiar/asn1-schema": "^2.4.0",
49
+ "@peculiar/asn1-x509": "^2.4.0",
49
50
  "@peculiar/webcrypto": "^1.5.0",
50
- "@peculiar/x509": "^1.12.3",
51
+ "@peculiar/x509": "^1.13.0",
51
52
  "asn1js": "^3.0.6",
52
- "it-queueless-pushable": "^2.0.1",
53
- "it-stream-types": "^2.0.2",
54
- "protons-runtime": "^5.5.0",
53
+ "p-event": "^6.0.1",
54
+ "protons-runtime": "^5.6.0",
55
55
  "uint8arraylist": "^2.4.8",
56
56
  "uint8arrays": "^5.1.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@libp2p/logger": "^5.1.21",
60
- "aegir": "^47.0.14",
61
- "it-pair": "^2.0.6",
62
- "protons": "^7.6.1",
63
- "sinon": "^20.0.0",
59
+ "@libp2p/logger": "5.2.0-a02cb0461",
60
+ "aegir": "^47.0.21",
61
+ "protons": "^7.7.0",
62
+ "sinon": "^21.0.0",
64
63
  "sinon-ts": "^2.0.0"
65
64
  },
66
65
  "browser": {
@@ -1,8 +1,6 @@
1
1
  import { serviceCapabilities } from '@libp2p/interface'
2
2
  import { PROTOCOL } from './index.js'
3
- import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions } from '@libp2p/interface'
4
- import type { Duplex } from 'it-stream-types'
5
- import type { Uint8ArrayList } from 'uint8arraylist'
3
+ import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, MessageStream } from '@libp2p/interface'
6
4
 
7
5
  export class TLS implements ConnectionEncrypter {
8
6
  public protocol: string = PROTOCOL
@@ -17,11 +15,11 @@ export class TLS implements ConnectionEncrypter {
17
15
  '@libp2p/connection-encryption'
18
16
  ]
19
17
 
20
- async secureInbound <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
18
+ async secureInbound <Stream extends MessageStream = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
21
19
  throw new Error('TLS encryption is not possible in browsers')
22
20
  }
23
21
 
24
- async secureOutbound <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
22
+ async secureOutbound <Stream extends MessageStream = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
25
23
  throw new Error('TLS encryption is not possible in browsers')
26
24
  }
27
25
  }
package/src/tls.ts CHANGED
@@ -21,13 +21,11 @@
21
21
  import { TLSSocket, connect } from 'node:tls'
22
22
  import { InvalidCryptoExchangeError, serviceCapabilities } from '@libp2p/interface'
23
23
  import { HandshakeTimeoutError } from './errors.js'
24
- import { generateCertificate, verifyPeerCertificate, itToStream, streamToIt } from './utils.js'
24
+ import { generateCertificate, verifyPeerCertificate, toNodeDuplex, toMessageStream } from './utils.js'
25
25
  import { PROTOCOL } from './index.js'
26
26
  import type { TLSComponents } from './index.js'
27
- import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, Logger, SecureConnectionOptions, CounterGroup, StreamMuxerFactory } from '@libp2p/interface'
28
- import type { Duplex } from 'it-stream-types'
27
+ import type { ConnectionEncrypter, SecuredConnection, Logger, SecureConnectionOptions, CounterGroup, StreamMuxerFactory, MessageStream } from '@libp2p/interface'
29
28
  import type { TLSSocketOptions } from 'node:tls'
30
- import type { Uint8ArrayList } from 'uint8arraylist'
31
29
 
32
30
  export class TLS implements ConnectionEncrypter {
33
31
  public protocol: string = PROTOCOL
@@ -77,18 +75,19 @@ export class TLS implements ConnectionEncrypter {
77
75
  '@libp2p/connection-encryption'
78
76
  ]
79
77
 
80
- async secureInbound <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
81
- return this._encrypt(conn, true, options)
78
+ async secureInbound (connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection> {
79
+ return this._encrypt(connection, true, options)
82
80
  }
83
81
 
84
- async secureOutbound <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
85
- return this._encrypt(conn, false, options)
82
+ async secureOutbound (connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection> {
83
+ return this._encrypt(connection, false, options)
86
84
  }
87
85
 
88
86
  /**
89
87
  * Encrypt connection
90
88
  */
91
- async _encrypt <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
89
+ async _encrypt (connection: MessageStream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection> {
90
+ const log = connection.log?.newScope('tls') ?? this.log
92
91
  let streamMuxer: StreamMuxerFactory | undefined
93
92
 
94
93
  let streamMuxers: string[] = []
@@ -112,7 +111,7 @@ export class TLS implements ConnectionEncrypter {
112
111
  'libp2p'
113
112
  ],
114
113
  ALPNCallback: ({ protocols }) => {
115
- this.log.trace('received protocols %s', protocols)
114
+ log.trace('received protocols %s', protocols)
116
115
  let chosenProtocol: string | undefined
117
116
 
118
117
  for (const protocol of protocols) {
@@ -132,21 +131,26 @@ export class TLS implements ConnectionEncrypter {
132
131
  }
133
132
  }
134
133
 
134
+ const duplex = toNodeDuplex(connection)
135
135
  let socket: TLSSocket
136
136
 
137
137
  if (isServer) {
138
- socket = new TLSSocket(itToStream(conn), {
138
+ socket = new TLSSocket(duplex, {
139
139
  ...opts,
140
140
  // require clients to send certificates
141
141
  requestCert: true
142
142
  })
143
143
  } else {
144
144
  socket = connect({
145
- socket: itToStream(conn),
145
+ socket: duplex,
146
146
  ...opts
147
147
  })
148
148
  }
149
149
 
150
+ duplex.on('error', (err) => {
151
+ socket.emit('error', err)
152
+ })
153
+
150
154
  const onAbort = (): void => {
151
155
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
152
156
  abort: true
@@ -159,13 +163,13 @@ export class TLS implements ConnectionEncrypter {
159
163
 
160
164
  options?.signal?.addEventListener('abort', onAbort)
161
165
 
162
- return new Promise<SecuredConnection<Stream>>((resolve, reject) => {
166
+ return new Promise<SecuredConnection<MessageStream>>((resolve, reject) => {
163
167
  const verifyRemote = (): void => {
164
168
  const remote = socket.getPeerCertificate()
165
169
 
166
- verifyPeerCertificate(remote.raw, options?.remotePeer, this.log)
170
+ verifyPeerCertificate(remote.raw, options?.remotePeer, log)
167
171
  .then(remotePeer => {
168
- this.log('remote certificate ok, remote peer %p', remotePeer)
172
+ log('remote certificate ok, remote peer %p', remotePeer)
169
173
 
170
174
  // 'libp2p' is a special protocol - if it's sent the remote does not
171
175
  // support early muxer negotiation
@@ -175,21 +179,16 @@ export class TLS implements ConnectionEncrypter {
175
179
 
176
180
  if (streamMuxer == null) {
177
181
  const err = new InvalidCryptoExchangeError(`Selected muxer ${socket.alpnProtocol} did not exist`)
178
- this.log.error(`Selected muxer ${socket.alpnProtocol} did not exist - %e`, err)
182
+ log.error(`Selected muxer ${socket.alpnProtocol} did not exist - %e`, err)
179
183
 
180
- if (isAbortable(conn)) {
181
- conn.abort(err)
182
- reject(err)
183
- }
184
+ connection.abort(err)
185
+ reject(err)
184
186
  }
185
187
  }
186
188
 
187
189
  resolve({
188
190
  remotePeer,
189
- conn: {
190
- ...conn,
191
- ...streamToIt(socket)
192
- },
191
+ connection: toMessageStream(connection, socket),
193
192
  streamMuxer
194
193
  })
195
194
  })
@@ -197,12 +196,13 @@ export class TLS implements ConnectionEncrypter {
197
196
  this.metrics[isServer ? 'server' : 'client'].errors?.increment({
198
197
  verify_peer_certificate: true
199
198
  })
199
+
200
200
  socket.emit('error', err)
201
201
  })
202
202
  }
203
203
 
204
204
  socket.on('error', (err: Error) => {
205
- this.log.error('error encrypting %s connection - %e', isServer ? 'server' : 'client', err)
205
+ log.error('error encrypting %s connection - %e', connection.direction, err)
206
206
 
207
207
  if (err.name !== 'HandshakeTimeoutError') {
208
208
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
@@ -210,16 +210,13 @@ export class TLS implements ConnectionEncrypter {
210
210
  })
211
211
  }
212
212
 
213
- socket.destroy(err)
214
-
215
- if (isAbortable(conn)) {
216
- conn.abort(err)
217
- }
213
+ socket.destroy()
214
+ connection.abort(err)
218
215
 
219
216
  reject(err)
220
217
  })
221
218
  socket.once('secure', () => {
222
- this.log('verifying remote certificate')
219
+ log('verifying remote certificate of %s connection', connection.direction)
223
220
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
224
221
  secure: true
225
222
  })
@@ -241,11 +238,3 @@ export class TLS implements ConnectionEncrypter {
241
238
  })
242
239
  }
243
240
  }
244
-
245
- interface Abortable {
246
- abort (err: Error): void
247
- }
248
-
249
- function isAbortable <T> (obj: T & Partial<Abortable>): obj is T & Abortable {
250
- return typeof obj?.abort === 'function'
251
- }
package/src/utils.ts CHANGED
@@ -1,22 +1,24 @@
1
- import { Duplex as DuplexStream } from 'node:stream'
1
+ import net from 'node:net'
2
+ import { Duplex } from 'node:stream'
3
+ import tls from 'node:tls'
2
4
  import { publicKeyFromProtobuf } from '@libp2p/crypto/keys'
3
- import { InvalidCryptoExchangeError, UnexpectedPeerError } from '@libp2p/interface'
5
+ import { InvalidCryptoExchangeError, UnexpectedPeerError, StreamMessageEvent } from '@libp2p/interface'
4
6
  import { peerIdFromCID } from '@libp2p/peer-id'
7
+ import { AbstractMessageStream } from '@libp2p/utils'
5
8
  import { AsnConvert } from '@peculiar/asn1-schema'
6
9
  import * as asn1X509 from '@peculiar/asn1-x509'
7
10
  import { Crypto } from '@peculiar/webcrypto'
8
11
  import * as x509 from '@peculiar/x509'
9
12
  import * as asn1js from 'asn1js'
10
- import { queuelessPushable } from 'it-queueless-pushable'
13
+ import { pEvent } from 'p-event'
14
+ import { Uint8ArrayList } from 'uint8arraylist'
11
15
  import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
12
16
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
13
17
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
14
18
  import { InvalidCertificateError } from './errors.js'
15
19
  import { KeyType, PublicKey } from './pb/index.js'
16
- import type { PeerId, PublicKey as Libp2pPublicKey, Logger, PrivateKey, AbortOptions } from '@libp2p/interface'
17
- import type { Pushable } from 'it-queueless-pushable'
18
- import type { Duplex, Source } from 'it-stream-types'
19
- import type { Uint8ArrayList } from 'uint8arraylist'
20
+ import type { PeerId, PublicKey as Libp2pPublicKey, Logger, PrivateKey, AbortOptions, MessageStream, StreamCloseEvent } from '@libp2p/interface'
21
+ import type { SendResult } from '@libp2p/utils'
20
22
 
21
23
  const crypto = new Crypto()
22
24
  x509.cryptoProvider.set(crypto)
@@ -84,7 +86,7 @@ export async function verifyPeerCertificate (rawCertificate: Uint8Array, expecte
84
86
  const remotePeerId = peerIdFromCID(remoteLibp2pPublicKey.toCID())
85
87
 
86
88
  if (expectedPeerId?.equals(remotePeerId) === false) {
87
- log?.error('invalid peer id')
89
+ log?.error('invalid peer id - expected %p got %p', expectedPeerId, remotePeerId)
88
90
  throw new UnexpectedPeerError()
89
91
  }
90
92
 
@@ -191,123 +193,162 @@ function formatAsPem (str: string): string {
191
193
  return finalString
192
194
  }
193
195
 
194
- export function itToStream (conn: Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>>): DuplexStream {
195
- const output = queuelessPushable<Uint8Array>()
196
- const iterator = conn.source[Symbol.asyncIterator]() as AsyncGenerator<Uint8Array>
196
+ export function toNodeDuplex (stream: MessageStream): Duplex {
197
+ function sendAndCallback (chunk: Uint8Array | Uint8ArrayList, callback: (err?: Error | null) => void): void {
198
+ try {
199
+ const sendMore = stream.send(chunk)
197
200
 
198
- const stream = new DuplexStream({
199
- autoDestroy: false,
200
- allowHalfOpen: true,
201
- write (chunk, encoding, callback) {
202
- output.push(chunk)
201
+ if (sendMore) {
202
+ callback()
203
+ return
204
+ }
205
+
206
+ socket.pause()
207
+
208
+ pEvent(stream, 'drain', {
209
+ rejectionEvents: ['close']
210
+ })
203
211
  .then(() => {
212
+ socket.resume()
204
213
  callback()
205
- }, err => {
214
+ }, (err) => {
206
215
  callback(err)
207
216
  })
217
+ } catch (err: any) {
218
+ callback(err)
219
+ }
220
+ }
221
+
222
+ // pause incoming messages until pulled from duplex
223
+ stream.pause()
224
+
225
+ const socket = new Duplex({
226
+ write (chunk, encoding, callback) {
227
+ sendAndCallback(chunk, callback)
228
+ },
229
+ writev (chunks, callback) {
230
+ sendAndCallback(new Uint8ArrayList(...chunks.map(({ chunk }) => chunk)), callback)
208
231
  },
209
232
  read () {
210
- iterator.next()
211
- .then(result => {
212
- if (result.done === true) {
213
- this.push(null)
214
- } else {
215
- this.push(result.value)
216
- }
217
- }, (err) => {
218
- this.destroy(err)
219
- })
233
+ stream.resume()
234
+ },
235
+ final (cb) {
236
+ stream.close()
237
+ .then(() => cb(), (err) => cb(err))
220
238
  }
221
239
  })
222
240
 
223
- // @ts-expect-error return type of sink is unknown
224
- conn.sink(output)
225
- .catch((err: any) => {
226
- stream.destroy(err)
227
- })
241
+ const onMessage = (evt: StreamMessageEvent): void => {
242
+ const buf = evt.data
243
+ let sendMore = true
244
+
245
+ if (buf instanceof Uint8Array) {
246
+ sendMore = socket.push(buf)
247
+ } else {
248
+ for (const chunk of buf) {
249
+ sendMore = socket.push(chunk)
250
+ }
251
+ }
252
+
253
+ if (!sendMore) {
254
+ stream.pause()
255
+ }
256
+ }
257
+ stream.addEventListener('message', onMessage)
258
+
259
+ const onClose = (evt: StreamCloseEvent): void => {
260
+ socket.destroy(evt.error)
261
+ }
262
+ stream.addEventListener('close', onClose)
228
263
 
229
- return stream
264
+ return socket
230
265
  }
231
266
 
232
- class DuplexIterable implements Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> {
233
- source: Pushable<Uint8Array>
234
- private readonly stream: DuplexStream
267
+ class EncryptedMultiaddrConnection extends AbstractMessageStream {
268
+ private socket: net.Socket
269
+
270
+ /**
271
+ * @param stream - The maConn that encrypted data is transferred over
272
+ * @param socket - Performs encryption/decryption
273
+ */
274
+ constructor (stream: MessageStream, socket: tls.TLSSocket) {
275
+ super({
276
+ log: stream.log,
277
+ inactivityTimeout: stream.inactivityTimeout,
278
+ maxReadBufferLength: stream.maxReadBufferLength,
279
+ direction: stream.direction
280
+ })
235
281
 
236
- constructor (stream: DuplexStream) {
237
- this.stream = stream
238
- this.source = queuelessPushable<Uint8Array>()
282
+ this.socket = socket
239
283
 
240
- stream.addListener('data', (buf) => {
241
- stream.pause()
242
- this.source.push(buf.subarray())
243
- .then(() => {
244
- stream.resume()
245
- }, (err) => {
246
- stream.emit('error', err)
247
- })
284
+ // accept decrypted data
285
+ this.socket.on('data', (buf) => {
286
+ this.onData(buf)
287
+ })
288
+ this.socket.on('error', err => {
289
+ stream.abort(err)
248
290
  })
249
- // both ends closed
250
- stream.addListener('close', () => {
251
- this.source.end()
291
+ this.socket.on('close', () => {
292
+ stream.close()
252
293
  .catch(err => {
253
- stream.emit('error', err)
294
+ stream.abort(err)
254
295
  })
255
296
  })
256
- stream.addListener('error', (err) => {
257
- this.source.end(err)
258
- .catch(() => {})
297
+
298
+ // can accept more plaintext data
299
+ this.socket.on('drain', () => {
300
+ this.safeDispatchEvent('drain')
259
301
  })
260
- // just writable end closed
261
- stream.addListener('finish', () => {
262
- this.source.end()
263
- .catch(() => {})
302
+
303
+ stream.addEventListener('close', () => {
304
+ socket.destroy()
305
+ this.onTransportClosed()
264
306
  })
307
+ }
308
+
309
+ async close (options?: AbortOptions): Promise<void> {
310
+ this.socket.destroySoon()
265
311
 
266
- this.sink = this.sink.bind(this)
312
+ await pEvent(this.socket, 'close', options)
267
313
  }
268
314
 
269
- async sink (source: Source<Uint8Array | Uint8ArrayList>): Promise<void> {
270
- try {
271
- for await (const buf of source) {
272
- const sendMore = this.stream.write(buf.subarray())
315
+ sendPause (): void {
316
+ this.socket.pause()
317
+ }
273
318
 
274
- if (!sendMore) {
275
- await waitForBackpressure(this.stream)
276
- }
277
- }
319
+ sendResume (): void {
320
+ this.socket.resume()
321
+ }
278
322
 
279
- // close writable end
280
- this.stream.end()
281
- } catch (err: any) {
282
- this.stream.destroy(err)
283
- throw err
284
- }
323
+ async sendClose (options?: AbortOptions): Promise<void> {
324
+ this.socket.destroySoon()
325
+ options?.signal?.throwIfAborted()
285
326
  }
286
- }
287
327
 
288
- export function streamToIt (stream: DuplexStream): Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> {
289
- return new DuplexIterable(stream)
290
- }
328
+ sendReset (): void {
329
+ this.socket.resetAndDestroy()
330
+ }
291
331
 
292
- async function waitForBackpressure (stream: DuplexStream): Promise<void> {
293
- await new Promise<void>((resolve, reject) => {
294
- const continueListener = (): void => {
295
- cleanUp()
296
- resolve()
297
- }
298
- const stopListener = (err?: Error): void => {
299
- cleanUp()
300
- reject(err ?? new Error('Stream ended'))
332
+ sendData (data: Uint8ArrayList): SendResult {
333
+ let sentBytes = 0
334
+ let canSendMore = true
335
+
336
+ for (const buf of data) {
337
+ sentBytes += buf.byteLength
338
+ canSendMore = this.socket.write(buf)
339
+
340
+ if (!canSendMore) {
341
+ break
342
+ }
301
343
  }
302
344
 
303
- const cleanUp = (): void => {
304
- stream.removeListener('drain', continueListener)
305
- stream.removeListener('end', stopListener)
306
- stream.removeListener('error', stopListener)
345
+ return {
346
+ sentBytes,
347
+ canSendMore
307
348
  }
349
+ }
350
+ }
308
351
 
309
- stream.addListener('drain', continueListener)
310
- stream.addListener('end', stopListener)
311
- stream.addListener('error', stopListener)
312
- })
352
+ export function toMessageStream (stream: MessageStream, socket: tls.TLSSocket): MessageStream {
353
+ return new EncryptedMultiaddrConnection(stream, socket)
313
354
  }
@@ -1,8 +0,0 @@
1
- {
2
- "TLSComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_tls.TLSComponents.html",
3
- ".:TLSComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_tls.TLSComponents.html",
4
- "PROTOCOL": "https://libp2p.github.io/js-libp2p/variables/_libp2p_tls.PROTOCOL.html",
5
- ".:PROTOCOL": "https://libp2p.github.io/js-libp2p/variables/_libp2p_tls.PROTOCOL.html",
6
- "tls": "https://libp2p.github.io/js-libp2p/functions/_libp2p_tls.tls.html",
7
- ".:tls": "https://libp2p.github.io/js-libp2p/functions/_libp2p_tls.tls.html"
8
- }