@libp2p/tls 2.2.7-6059227cb → 2.2.7-87bc8d4fb

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,11 +1,13 @@
1
1
  import { serviceCapabilities } from '@libp2p/interface';
2
- import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, MessageStream } 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';
3
5
  export declare class TLS implements ConnectionEncrypter {
4
6
  protocol: string;
5
7
  constructor();
6
8
  readonly [Symbol.toStringTag] = "@libp2p/tls";
7
9
  readonly [serviceCapabilities]: string[];
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>>;
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>>;
10
12
  }
11
13
  //# 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,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
+ {"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 +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;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"}
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"}
package/dist/src/tls.d.ts CHANGED
@@ -19,7 +19,7 @@
19
19
  */
20
20
  import { serviceCapabilities } from '@libp2p/interface';
21
21
  import type { TLSComponents } from './index.js';
22
- import type { ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, MessageStream } from '@libp2p/interface';
22
+ import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, SecurableStream } from '@libp2p/interface';
23
23
  export declare class TLS implements ConnectionEncrypter {
24
24
  protocol: string;
25
25
  private readonly log;
@@ -28,11 +28,11 @@ export declare class TLS implements ConnectionEncrypter {
28
28
  constructor(components: TLSComponents);
29
29
  readonly [Symbol.toStringTag] = "@libp2p/tls";
30
30
  readonly [serviceCapabilities]: string[];
31
- secureInbound(connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection>;
32
- secureOutbound(connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection>;
31
+ secureInbound<Stream extends SecurableStream = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
32
+ secureOutbound<Stream extends SecurableStream = MultiaddrConnection>(conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
33
33
  /**
34
34
  * Encrypt connection
35
35
  */
36
- _encrypt(connection: MessageStream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection>;
36
+ _encrypt<Stream extends SecurableStream = MultiaddrConnection>(conn: Stream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>>;
37
37
  }
38
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,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"}
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,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGxL,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,eAAe,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAI1J,cAAc,CAAE,MAAM,SAAS,eAAe,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAIjK;;OAEG;IACG,QAAQ,CAAE,MAAM,SAAS,eAAe,GAAG,mBAAmB,EAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;CAyJ/K"}
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, toNodeDuplex, toMessageStream } from './utils.js';
23
+ import { generateCertificate, verifyPeerCertificate, itToStream, streamToIt } from './utils.js';
24
24
  import { PROTOCOL } from './index.js';
25
25
  export class TLS {
26
26
  protocol = PROTOCOL;
@@ -57,17 +57,17 @@ export class TLS {
57
57
  [serviceCapabilities] = [
58
58
  '@libp2p/connection-encryption'
59
59
  ];
60
- async secureInbound(connection, options) {
61
- return this._encrypt(connection, true, options);
60
+ async secureInbound(conn, options) {
61
+ return this._encrypt(conn, true, options);
62
62
  }
63
- async secureOutbound(connection, options) {
64
- return this._encrypt(connection, false, options);
63
+ async secureOutbound(conn, options) {
64
+ return this._encrypt(conn, false, options);
65
65
  }
66
66
  /**
67
67
  * Encrypt connection
68
68
  */
69
- async _encrypt(connection, isServer, options) {
70
- const log = connection.log?.newScope('tls') ?? this.log;
69
+ async _encrypt(conn, isServer, options) {
70
+ const log = conn.log?.newScope('tls') ?? this.log;
71
71
  let streamMuxer;
72
72
  let streamMuxers = [];
73
73
  if (options?.skipStreamMuxerNegotiation !== true) {
@@ -102,10 +102,9 @@ export class TLS {
102
102
  return chosenProtocol;
103
103
  }
104
104
  };
105
- const duplex = toNodeDuplex(connection);
106
105
  let socket;
107
106
  if (isServer) {
108
- socket = new TLSSocket(duplex, {
107
+ socket = new TLSSocket(itToStream(conn), {
109
108
  ...opts,
110
109
  // require clients to send certificates
111
110
  requestCert: true
@@ -113,13 +112,10 @@ export class TLS {
113
112
  }
114
113
  else {
115
114
  socket = connect({
116
- socket: duplex,
115
+ socket: itToStream(conn),
117
116
  ...opts
118
117
  });
119
118
  }
120
- duplex.on('error', (err) => {
121
- socket.emit('error', err);
122
- });
123
119
  const onAbort = () => {
124
120
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
125
121
  abort: true
@@ -133,7 +129,7 @@ export class TLS {
133
129
  return new Promise((resolve, reject) => {
134
130
  const verifyRemote = () => {
135
131
  const remote = socket.getPeerCertificate();
136
- verifyPeerCertificate(remote.raw, options?.remotePeer, log)
132
+ verifyPeerCertificate(remote.raw, options?.remotePeer, this.log)
137
133
  .then(remotePeer => {
138
134
  log('remote certificate ok, remote peer %p', remotePeer);
139
135
  // 'libp2p' is a special protocol - if it's sent the remote does not
@@ -144,13 +140,18 @@ export class TLS {
144
140
  if (streamMuxer == null) {
145
141
  const err = new InvalidCryptoExchangeError(`Selected muxer ${socket.alpnProtocol} did not exist`);
146
142
  log.error(`Selected muxer ${socket.alpnProtocol} did not exist - %e`, err);
147
- connection.abort(err);
148
- reject(err);
143
+ if (isAbortable(conn)) {
144
+ conn.abort(err);
145
+ reject(err);
146
+ }
149
147
  }
150
148
  }
151
149
  resolve({
152
150
  remotePeer,
153
- connection: toMessageStream(connection, socket),
151
+ conn: {
152
+ ...conn,
153
+ ...streamToIt(socket)
154
+ },
154
155
  streamMuxer
155
156
  });
156
157
  })
@@ -162,18 +163,20 @@ export class TLS {
162
163
  });
163
164
  };
164
165
  socket.on('error', (err) => {
165
- log.error('error encrypting %s connection - %e', connection.direction, err);
166
+ this.log.error('error encrypting %s connection - %e', isServer ? 'server' : 'client', err);
166
167
  if (err.name !== 'HandshakeTimeoutError') {
167
168
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
168
169
  error: true
169
170
  });
170
171
  }
171
- socket.destroy();
172
- connection.abort(err);
172
+ socket.destroy(err);
173
+ if (isAbortable(conn)) {
174
+ conn.abort(err);
175
+ }
173
176
  reject(err);
174
177
  });
175
178
  socket.once('secure', () => {
176
- log('verifying remote certificate of %s connection', connection.direction);
179
+ this.log('verifying remote certificate');
177
180
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
178
181
  secure: true
179
182
  });
@@ -195,4 +198,7 @@ export class TLS {
195
198
  });
196
199
  }
197
200
  }
201
+ function isAbortable(obj) {
202
+ return typeof obj?.abort === 'function';
203
+ }
198
204
  //# 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":"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"}
@@ -1,6 +1,7 @@
1
- import { Duplex } from 'node:stream';
2
- import tls from 'node:tls';
3
- import type { PeerId, Logger, PrivateKey, AbortOptions, MessageStream } from '@libp2p/interface';
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';
4
5
  export declare function verifyPeerCertificate(rawCertificate: Uint8Array, expectedPeerId?: PeerId, log?: Logger): Promise<PeerId>;
5
6
  export declare function generateCertificate(privateKey: PrivateKey, options?: AbortOptions): Promise<{
6
7
  cert: string;
@@ -10,6 +11,6 @@ export declare function generateCertificate(privateKey: PrivateKey, options?: Ab
10
11
  * @see https://github.com/libp2p/specs/blob/master/tls/tls.md#libp2p-public-key-extension
11
12
  */
12
13
  export declare function encodeSignatureData(certPublicKey: ArrayBuffer): Uint8Array;
13
- export declare function toNodeDuplex(stream: MessageStream): Duplex;
14
- export declare function toMessageStream(stream: MessageStream, socket: tls.TLSSocket): MessageStream;
14
+ export declare function itToStream(conn: Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>>): DuplexStream;
15
+ export declare function streamToIt(stream: DuplexStream): Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>>;
15
16
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
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"}
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"}
package/dist/src/utils.js CHANGED
@@ -1,17 +1,13 @@
1
- import net from 'node:net';
2
- import { Duplex } from 'node:stream';
3
- import tls from 'node:tls';
1
+ import { Duplex as DuplexStream } from 'node:stream';
4
2
  import { publicKeyFromProtobuf } from '@libp2p/crypto/keys';
5
- import { InvalidCryptoExchangeError, UnexpectedPeerError, StreamMessageEvent } from '@libp2p/interface';
3
+ import { InvalidCryptoExchangeError, UnexpectedPeerError } from '@libp2p/interface';
6
4
  import { peerIdFromCID } from '@libp2p/peer-id';
7
- import { AbstractMessageStream } from '@libp2p/utils';
8
5
  import { AsnConvert } from '@peculiar/asn1-schema';
9
6
  import * as asn1X509 from '@peculiar/asn1-x509';
10
7
  import { Crypto } from '@peculiar/webcrypto';
11
8
  import * as x509 from '@peculiar/x509';
12
9
  import * as asn1js from 'asn1js';
13
- import { pEvent } from 'p-event';
14
- import { Uint8ArrayList } from 'uint8arraylist';
10
+ import { queuelessPushable } from 'it-queueless-pushable';
15
11
  import { concat as uint8ArrayConcat } from 'uint8arrays/concat';
16
12
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
17
13
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
@@ -66,7 +62,7 @@ export async function verifyPeerCertificate(rawCertificate, expectedPeerId, log)
66
62
  }
67
63
  const remotePeerId = peerIdFromCID(remoteLibp2pPublicKey.toCID());
68
64
  if (expectedPeerId?.equals(remotePeerId) === false) {
69
- log?.error('invalid peer id - expected %p got %p', expectedPeerId, remotePeerId);
65
+ log?.error('invalid peer id');
70
66
  throw new UnexpectedPeerError();
71
67
  }
72
68
  return remotePeerId;
@@ -154,138 +150,112 @@ function formatAsPem(str) {
154
150
  finalString = finalString + '-----END PRIVATE KEY-----';
155
151
  return finalString;
156
152
  }
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
- })
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)
169
161
  .then(() => {
170
- socket.resume();
171
162
  callback();
172
- }, (err) => {
163
+ }, err => {
173
164
  callback(err);
174
165
  });
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);
188
166
  },
189
167
  read() {
190
- stream.resume();
191
- },
192
- final(cb) {
193
- stream.close()
194
- .then(() => cb(), (err) => cb(err));
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
+ });
195
179
  }
196
180
  });
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) {
209
- stream.pause();
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;
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;
218
187
  }
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);
236
- });
237
- this.socket.on('error', err => {
238
- stream.abort(err);
188
+ class DuplexIterable {
189
+ source;
190
+ stream;
191
+ constructor(stream) {
192
+ this.stream = stream;
193
+ this.source = queuelessPushable();
194
+ stream.addListener('data', (buf) => {
195
+ stream.pause();
196
+ this.source.push(buf.subarray())
197
+ .then(() => {
198
+ stream.resume();
199
+ }, (err) => {
200
+ stream.emit('error', err);
201
+ });
239
202
  });
240
- this.socket.on('close', () => {
241
- stream.close()
203
+ // both ends closed
204
+ stream.addListener('close', () => {
205
+ this.source.end()
242
206
  .catch(err => {
243
- stream.abort(err);
207
+ stream.emit('error', err);
244
208
  });
245
209
  });
246
- // can accept more plaintext data
247
- this.socket.on('drain', () => {
248
- this.safeDispatchEvent('drain');
210
+ stream.addListener('error', (err) => {
211
+ this.source.end(err)
212
+ .catch(() => { });
249
213
  });
250
- stream.addEventListener('close', () => {
251
- socket.destroy();
252
- this.onTransportClosed();
214
+ // just writable end closed
215
+ stream.addListener('finish', () => {
216
+ this.source.end()
217
+ .catch(() => { });
253
218
  });
219
+ this.sink = this.sink.bind(this);
254
220
  }
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;
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
+ }
280
228
  }
229
+ // close writable end
230
+ this.stream.end();
231
+ }
232
+ catch (err) {
233
+ this.stream.destroy(err);
234
+ throw err;
281
235
  }
282
- return {
283
- sentBytes,
284
- canSendMore
285
- };
286
236
  }
287
237
  }
288
- export function toMessageStream(stream, socket) {
289
- return new EncryptedMultiaddrConnection(stream, socket);
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
+ });
290
260
  }
291
261
  //# 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.7-6059227cb",
3
+ "version": "2.2.7-87bc8d4fb",
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,25 +41,26 @@
41
41
  "doc-check": "aegir doc-check"
42
42
  },
43
43
  "dependencies": {
44
- "@libp2p/crypto": "5.1.8-6059227cb",
45
- "@libp2p/interface": "2.11.0-6059227cb",
46
- "@libp2p/peer-id": "5.1.9-6059227cb",
47
- "@libp2p/utils": "6.7.2-6059227cb",
48
- "@peculiar/asn1-schema": "^2.4.0",
49
- "@peculiar/asn1-x509": "^2.4.0",
44
+ "@libp2p/crypto": "5.1.8-87bc8d4fb",
45
+ "@libp2p/interface": "2.11.0-87bc8d4fb",
46
+ "@libp2p/peer-id": "5.1.9-87bc8d4fb",
47
+ "@peculiar/asn1-schema": "^2.3.15",
48
+ "@peculiar/asn1-x509": "^2.3.15",
50
49
  "@peculiar/webcrypto": "^1.5.0",
51
- "@peculiar/x509": "^1.13.0",
50
+ "@peculiar/x509": "^1.12.3",
52
51
  "asn1js": "^3.0.6",
53
- "p-event": "^6.0.1",
54
- "protons-runtime": "^5.6.0",
52
+ "it-queueless-pushable": "^2.0.1",
53
+ "it-stream-types": "^2.0.2",
54
+ "protons-runtime": "^5.5.0",
55
55
  "uint8arraylist": "^2.4.8",
56
56
  "uint8arrays": "^5.1.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@libp2p/logger": "5.2.0-6059227cb",
60
- "aegir": "^47.0.22",
61
- "protons": "^7.7.0",
62
- "sinon": "^21.0.0",
59
+ "@libp2p/logger": "5.2.0-87bc8d4fb",
60
+ "aegir": "^47.0.14",
61
+ "it-pair": "^2.0.6",
62
+ "protons": "^7.6.1",
63
+ "sinon": "^20.0.0",
63
64
  "sinon-ts": "^2.0.0"
64
65
  },
65
66
  "browser": {
@@ -1,6 +1,8 @@
1
1
  import { serviceCapabilities } from '@libp2p/interface'
2
2
  import { PROTOCOL } from './index.js'
3
- import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions, MessageStream } from '@libp2p/interface'
3
+ import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, SecureConnectionOptions } from '@libp2p/interface'
4
+ import type { Duplex } from 'it-stream-types'
5
+ import type { Uint8ArrayList } from 'uint8arraylist'
4
6
 
5
7
  export class TLS implements ConnectionEncrypter {
6
8
  public protocol: string = PROTOCOL
@@ -15,11 +17,11 @@ export class TLS implements ConnectionEncrypter {
15
17
  '@libp2p/connection-encryption'
16
18
  ]
17
19
 
18
- async secureInbound <Stream extends MessageStream = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
20
+ async secureInbound <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
19
21
  throw new Error('TLS encryption is not possible in browsers')
20
22
  }
21
23
 
22
- async secureOutbound <Stream extends MessageStream = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
24
+ async secureOutbound <Stream extends Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
23
25
  throw new Error('TLS encryption is not possible in browsers')
24
26
  }
25
27
  }
package/src/tls.ts CHANGED
@@ -21,10 +21,10 @@
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, toNodeDuplex, toMessageStream } from './utils.js'
24
+ import { generateCertificate, verifyPeerCertificate, itToStream, streamToIt } from './utils.js'
25
25
  import { PROTOCOL } from './index.js'
26
26
  import type { TLSComponents } from './index.js'
27
- import type { ConnectionEncrypter, SecuredConnection, Logger, SecureConnectionOptions, CounterGroup, StreamMuxerFactory, MessageStream } from '@libp2p/interface'
27
+ import type { MultiaddrConnection, ConnectionEncrypter, SecuredConnection, Logger, SecureConnectionOptions, CounterGroup, StreamMuxerFactory, SecurableStream } from '@libp2p/interface'
28
28
  import type { TLSSocketOptions } from 'node:tls'
29
29
 
30
30
  export class TLS implements ConnectionEncrypter {
@@ -75,19 +75,19 @@ export class TLS implements ConnectionEncrypter {
75
75
  '@libp2p/connection-encryption'
76
76
  ]
77
77
 
78
- async secureInbound (connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection> {
79
- return this._encrypt(connection, true, options)
78
+ async secureInbound <Stream extends SecurableStream = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
79
+ return this._encrypt(conn, true, options)
80
80
  }
81
81
 
82
- async secureOutbound (connection: MessageStream, options?: SecureConnectionOptions): Promise<SecuredConnection> {
83
- return this._encrypt(connection, false, options)
82
+ async secureOutbound <Stream extends SecurableStream = MultiaddrConnection> (conn: Stream, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
83
+ return this._encrypt(conn, false, options)
84
84
  }
85
85
 
86
86
  /**
87
87
  * Encrypt connection
88
88
  */
89
- async _encrypt (connection: MessageStream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection> {
90
- const log = connection.log?.newScope('tls') ?? this.log
89
+ async _encrypt <Stream extends SecurableStream = MultiaddrConnection> (conn: Stream, isServer: boolean, options?: SecureConnectionOptions): Promise<SecuredConnection<Stream>> {
90
+ const log = conn.log?.newScope('tls') ?? this.log
91
91
  let streamMuxer: StreamMuxerFactory | undefined
92
92
 
93
93
  let streamMuxers: string[] = []
@@ -131,26 +131,21 @@ export class TLS implements ConnectionEncrypter {
131
131
  }
132
132
  }
133
133
 
134
- const duplex = toNodeDuplex(connection)
135
134
  let socket: TLSSocket
136
135
 
137
136
  if (isServer) {
138
- socket = new TLSSocket(duplex, {
137
+ socket = new TLSSocket(itToStream(conn), {
139
138
  ...opts,
140
139
  // require clients to send certificates
141
140
  requestCert: true
142
141
  })
143
142
  } else {
144
143
  socket = connect({
145
- socket: duplex,
144
+ socket: itToStream(conn),
146
145
  ...opts
147
146
  })
148
147
  }
149
148
 
150
- duplex.on('error', (err) => {
151
- socket.emit('error', err)
152
- })
153
-
154
149
  const onAbort = (): void => {
155
150
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
156
151
  abort: true
@@ -163,11 +158,11 @@ export class TLS implements ConnectionEncrypter {
163
158
 
164
159
  options?.signal?.addEventListener('abort', onAbort)
165
160
 
166
- return new Promise<SecuredConnection<MessageStream>>((resolve, reject) => {
161
+ return new Promise<SecuredConnection<Stream>>((resolve, reject) => {
167
162
  const verifyRemote = (): void => {
168
163
  const remote = socket.getPeerCertificate()
169
164
 
170
- verifyPeerCertificate(remote.raw, options?.remotePeer, log)
165
+ verifyPeerCertificate(remote.raw, options?.remotePeer, this.log)
171
166
  .then(remotePeer => {
172
167
  log('remote certificate ok, remote peer %p', remotePeer)
173
168
 
@@ -181,14 +176,19 @@ export class TLS implements ConnectionEncrypter {
181
176
  const err = new InvalidCryptoExchangeError(`Selected muxer ${socket.alpnProtocol} did not exist`)
182
177
  log.error(`Selected muxer ${socket.alpnProtocol} did not exist - %e`, err)
183
178
 
184
- connection.abort(err)
185
- reject(err)
179
+ if (isAbortable(conn)) {
180
+ conn.abort(err)
181
+ reject(err)
182
+ }
186
183
  }
187
184
  }
188
185
 
189
186
  resolve({
190
187
  remotePeer,
191
- connection: toMessageStream(connection, socket),
188
+ conn: {
189
+ ...conn,
190
+ ...streamToIt(socket)
191
+ },
192
192
  streamMuxer
193
193
  })
194
194
  })
@@ -196,13 +196,12 @@ export class TLS implements ConnectionEncrypter {
196
196
  this.metrics[isServer ? 'server' : 'client'].errors?.increment({
197
197
  verify_peer_certificate: true
198
198
  })
199
-
200
199
  socket.emit('error', err)
201
200
  })
202
201
  }
203
202
 
204
203
  socket.on('error', (err: Error) => {
205
- log.error('error encrypting %s connection - %e', connection.direction, err)
204
+ this.log.error('error encrypting %s connection - %e', isServer ? 'server' : 'client', err)
206
205
 
207
206
  if (err.name !== 'HandshakeTimeoutError') {
208
207
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
@@ -210,13 +209,16 @@ export class TLS implements ConnectionEncrypter {
210
209
  })
211
210
  }
212
211
 
213
- socket.destroy()
214
- connection.abort(err)
212
+ socket.destroy(err)
213
+
214
+ if (isAbortable(conn)) {
215
+ conn.abort(err)
216
+ }
215
217
 
216
218
  reject(err)
217
219
  })
218
220
  socket.once('secure', () => {
219
- log('verifying remote certificate of %s connection', connection.direction)
221
+ this.log('verifying remote certificate')
220
222
  this.metrics[isServer ? 'server' : 'client'].events?.increment({
221
223
  secure: true
222
224
  })
@@ -238,3 +240,11 @@ export class TLS implements ConnectionEncrypter {
238
240
  })
239
241
  }
240
242
  }
243
+
244
+ interface Abortable {
245
+ abort (err: Error): void
246
+ }
247
+
248
+ function isAbortable <T> (obj: T & Partial<Abortable>): obj is T & Abortable {
249
+ return typeof obj?.abort === 'function'
250
+ }
package/src/utils.ts CHANGED
@@ -1,24 +1,22 @@
1
- import net from 'node:net'
2
- import { Duplex } from 'node:stream'
3
- import tls from 'node:tls'
1
+ import { Duplex as DuplexStream } from 'node:stream'
4
2
  import { publicKeyFromProtobuf } from '@libp2p/crypto/keys'
5
- import { InvalidCryptoExchangeError, UnexpectedPeerError, StreamMessageEvent } from '@libp2p/interface'
3
+ import { InvalidCryptoExchangeError, UnexpectedPeerError } from '@libp2p/interface'
6
4
  import { peerIdFromCID } from '@libp2p/peer-id'
7
- import { AbstractMessageStream } from '@libp2p/utils'
8
5
  import { AsnConvert } from '@peculiar/asn1-schema'
9
6
  import * as asn1X509 from '@peculiar/asn1-x509'
10
7
  import { Crypto } from '@peculiar/webcrypto'
11
8
  import * as x509 from '@peculiar/x509'
12
9
  import * as asn1js from 'asn1js'
13
- import { pEvent } from 'p-event'
14
- import { Uint8ArrayList } from 'uint8arraylist'
10
+ import { queuelessPushable } from 'it-queueless-pushable'
15
11
  import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
16
12
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
17
13
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
18
14
  import { InvalidCertificateError } from './errors.js'
19
15
  import { KeyType, PublicKey } from './pb/index.js'
20
- import type { PeerId, PublicKey as Libp2pPublicKey, Logger, PrivateKey, AbortOptions, MessageStream, StreamCloseEvent } from '@libp2p/interface'
21
- import type { SendResult } from '@libp2p/utils'
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'
22
20
 
23
21
  const crypto = new Crypto()
24
22
  x509.cryptoProvider.set(crypto)
@@ -86,7 +84,7 @@ export async function verifyPeerCertificate (rawCertificate: Uint8Array, expecte
86
84
  const remotePeerId = peerIdFromCID(remoteLibp2pPublicKey.toCID())
87
85
 
88
86
  if (expectedPeerId?.equals(remotePeerId) === false) {
89
- log?.error('invalid peer id - expected %p got %p', expectedPeerId, remotePeerId)
87
+ log?.error('invalid peer id')
90
88
  throw new UnexpectedPeerError()
91
89
  }
92
90
 
@@ -193,162 +191,123 @@ function formatAsPem (str: string): string {
193
191
  return finalString
194
192
  }
195
193
 
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)
200
-
201
- if (sendMore) {
202
- callback()
203
- return
204
- }
205
-
206
- socket.pause()
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>
207
197
 
208
- pEvent(stream, 'drain', {
209
- rejectionEvents: ['close']
210
- })
198
+ const stream = new DuplexStream({
199
+ autoDestroy: false,
200
+ allowHalfOpen: true,
201
+ write (chunk, encoding, callback) {
202
+ output.push(chunk)
211
203
  .then(() => {
212
- socket.resume()
213
204
  callback()
214
- }, (err) => {
205
+ }, err => {
215
206
  callback(err)
216
207
  })
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)
231
208
  },
232
209
  read () {
233
- stream.resume()
234
- },
235
- final (cb) {
236
- stream.close()
237
- .then(() => cb(), (err) => cb(err))
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
+ })
238
220
  }
239
221
  })
240
222
 
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)
223
+ // @ts-expect-error return type of sink is unknown
224
+ conn.sink(output)
225
+ .catch((err: any) => {
226
+ stream.destroy(err)
227
+ })
263
228
 
264
- return socket
229
+ return stream
265
230
  }
266
231
 
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
- })
232
+ class DuplexIterable implements Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> {
233
+ source: Pushable<Uint8Array>
234
+ private readonly stream: DuplexStream
281
235
 
282
- this.socket = socket
236
+ constructor (stream: DuplexStream) {
237
+ this.stream = stream
238
+ this.source = queuelessPushable<Uint8Array>()
283
239
 
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)
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
+ })
290
248
  })
291
- this.socket.on('close', () => {
292
- stream.close()
249
+ // both ends closed
250
+ stream.addListener('close', () => {
251
+ this.source.end()
293
252
  .catch(err => {
294
- stream.abort(err)
253
+ stream.emit('error', err)
295
254
  })
296
255
  })
297
-
298
- // can accept more plaintext data
299
- this.socket.on('drain', () => {
300
- this.safeDispatchEvent('drain')
256
+ stream.addListener('error', (err) => {
257
+ this.source.end(err)
258
+ .catch(() => {})
301
259
  })
302
-
303
- stream.addEventListener('close', () => {
304
- socket.destroy()
305
- this.onTransportClosed()
260
+ // just writable end closed
261
+ stream.addListener('finish', () => {
262
+ this.source.end()
263
+ .catch(() => {})
306
264
  })
307
- }
308
-
309
- async close (options?: AbortOptions): Promise<void> {
310
- this.socket.destroySoon()
311
265
 
312
- await pEvent(this.socket, 'close', options)
266
+ this.sink = this.sink.bind(this)
313
267
  }
314
268
 
315
- sendPause (): void {
316
- this.socket.pause()
317
- }
318
-
319
- sendResume (): void {
320
- this.socket.resume()
321
- }
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())
322
273
 
323
- async sendClose (options?: AbortOptions): Promise<void> {
324
- this.socket.destroySoon()
325
- options?.signal?.throwIfAborted()
326
- }
274
+ if (!sendMore) {
275
+ await waitForBackpressure(this.stream)
276
+ }
277
+ }
327
278
 
328
- sendReset (): void {
329
- this.socket.resetAndDestroy()
279
+ // close writable end
280
+ this.stream.end()
281
+ } catch (err: any) {
282
+ this.stream.destroy(err)
283
+ throw err
284
+ }
330
285
  }
286
+ }
331
287
 
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)
288
+ export function streamToIt (stream: DuplexStream): Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>> {
289
+ return new DuplexIterable(stream)
290
+ }
339
291
 
340
- if (!canSendMore) {
341
- break
342
- }
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'))
343
301
  }
344
302
 
345
- return {
346
- sentBytes,
347
- canSendMore
303
+ const cleanUp = (): void => {
304
+ stream.removeListener('drain', continueListener)
305
+ stream.removeListener('end', stopListener)
306
+ stream.removeListener('error', stopListener)
348
307
  }
349
- }
350
- }
351
308
 
352
- export function toMessageStream (stream: MessageStream, socket: tls.TLSSocket): MessageStream {
353
- return new EncryptedMultiaddrConnection(stream, socket)
309
+ stream.addListener('drain', continueListener)
310
+ stream.addListener('end', stopListener)
311
+ stream.addListener('error', stopListener)
312
+ })
354
313
  }