@libp2p/utils 6.7.2-8484de8a2 → 6.7.2-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.
Files changed (164) hide show
  1. package/README.md +1 -1
  2. package/dist/index.min.js +1 -6
  3. package/dist/index.min.js.map +4 -4
  4. package/dist/src/abort-options.d.ts +7 -0
  5. package/dist/src/abort-options.d.ts.map +1 -0
  6. package/dist/src/abort-options.js +14 -0
  7. package/dist/src/abort-options.js.map +1 -0
  8. package/dist/src/abstract-stream.d.ts +130 -14
  9. package/dist/src/abstract-stream.d.ts.map +1 -1
  10. package/dist/src/abstract-stream.js +321 -39
  11. package/dist/src/abstract-stream.js.map +1 -1
  12. package/dist/src/array-equals.d.ts +24 -0
  13. package/dist/src/array-equals.d.ts.map +1 -0
  14. package/dist/src/array-equals.js +31 -0
  15. package/dist/src/array-equals.js.map +1 -0
  16. package/dist/src/close-source.d.ts +4 -0
  17. package/dist/src/close-source.d.ts.map +1 -0
  18. package/dist/src/close-source.js +11 -0
  19. package/dist/src/close-source.js.map +1 -0
  20. package/dist/src/close.d.ts +21 -0
  21. package/dist/src/close.d.ts.map +1 -0
  22. package/dist/src/close.js +49 -0
  23. package/dist/src/close.js.map +1 -0
  24. package/dist/src/errors.d.ts +0 -8
  25. package/dist/src/errors.d.ts.map +1 -1
  26. package/dist/src/errors.js +0 -8
  27. package/dist/src/errors.js.map +1 -1
  28. package/dist/src/get-thin-waist-addresses.browser.d.ts +1 -1
  29. package/dist/src/get-thin-waist-addresses.browser.d.ts.map +1 -1
  30. package/dist/src/get-thin-waist-addresses.browser.js +3 -4
  31. package/dist/src/get-thin-waist-addresses.browser.js.map +1 -1
  32. package/dist/src/get-thin-waist-addresses.d.ts +1 -1
  33. package/dist/src/get-thin-waist-addresses.d.ts.map +1 -1
  34. package/dist/src/get-thin-waist-addresses.js +9 -7
  35. package/dist/src/get-thin-waist-addresses.js.map +1 -1
  36. package/dist/src/index.d.ts +1 -33
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/index.js +1 -33
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/multiaddr/is-global-unicast.d.ts.map +1 -1
  41. package/dist/src/multiaddr/is-global-unicast.js +9 -8
  42. package/dist/src/multiaddr/is-global-unicast.js.map +1 -1
  43. package/dist/src/multiaddr/is-ip-based.d.ts +6 -0
  44. package/dist/src/multiaddr/is-ip-based.d.ts.map +1 -0
  45. package/dist/src/multiaddr/is-ip-based.js +18 -0
  46. package/dist/src/multiaddr/is-ip-based.js.map +1 -0
  47. package/dist/src/multiaddr/is-link-local.d.ts.map +1 -1
  48. package/dist/src/multiaddr/is-link-local.js +16 -11
  49. package/dist/src/multiaddr/is-link-local.js.map +1 -1
  50. package/dist/src/multiaddr/is-loopback.d.ts.map +1 -1
  51. package/dist/src/multiaddr/is-loopback.js +5 -12
  52. package/dist/src/multiaddr/is-loopback.js.map +1 -1
  53. package/dist/src/multiaddr/is-network-address.d.ts.map +1 -1
  54. package/dist/src/multiaddr/is-network-address.js +16 -4
  55. package/dist/src/multiaddr/is-network-address.js.map +1 -1
  56. package/dist/src/multiaddr/is-private.d.ts.map +1 -1
  57. package/dist/src/multiaddr/is-private.js +10 -9
  58. package/dist/src/multiaddr/is-private.js.map +1 -1
  59. package/dist/src/queue/index.d.ts +0 -3
  60. package/dist/src/queue/index.d.ts.map +1 -1
  61. package/dist/src/queue/index.js +4 -20
  62. package/dist/src/queue/index.js.map +1 -1
  63. package/dist/src/rate-limiter.d.ts +15 -1
  64. package/dist/src/rate-limiter.d.ts.map +1 -1
  65. package/dist/src/rate-limiter.js +14 -1
  66. package/dist/src/rate-limiter.js.map +1 -1
  67. package/dist/src/stream-to-ma-conn.d.ts +23 -0
  68. package/dist/src/stream-to-ma-conn.d.ts.map +1 -0
  69. package/dist/src/stream-to-ma-conn.js +75 -0
  70. package/dist/src/stream-to-ma-conn.js.map +1 -0
  71. package/package.json +163 -19
  72. package/src/abort-options.ts +20 -0
  73. package/src/abstract-stream.ts +464 -51
  74. package/src/array-equals.ts +34 -0
  75. package/src/close-source.ts +14 -0
  76. package/src/close.ts +65 -0
  77. package/src/errors.ts +0 -10
  78. package/src/get-thin-waist-addresses.browser.ts +4 -5
  79. package/src/get-thin-waist-addresses.ts +12 -8
  80. package/src/index.ts +1 -33
  81. package/src/multiaddr/is-global-unicast.ts +11 -8
  82. package/src/multiaddr/is-ip-based.ts +21 -0
  83. package/src/multiaddr/is-link-local.ts +20 -11
  84. package/src/multiaddr/is-loopback.ts +7 -12
  85. package/src/multiaddr/is-network-address.ts +19 -4
  86. package/src/multiaddr/is-private.ts +14 -9
  87. package/src/queue/index.ts +4 -24
  88. package/src/rate-limiter.ts +30 -3
  89. package/src/stream-to-ma-conn.ts +106 -0
  90. package/dist/src/abstract-message-stream.d.ts +0 -129
  91. package/dist/src/abstract-message-stream.d.ts.map +0 -1
  92. package/dist/src/abstract-message-stream.js +0 -389
  93. package/dist/src/abstract-message-stream.js.map +0 -1
  94. package/dist/src/abstract-multiaddr-connection.d.ts +0 -26
  95. package/dist/src/abstract-multiaddr-connection.d.ts.map +0 -1
  96. package/dist/src/abstract-multiaddr-connection.js +0 -66
  97. package/dist/src/abstract-multiaddr-connection.js.map +0 -1
  98. package/dist/src/abstract-stream-muxer.d.ts +0 -53
  99. package/dist/src/abstract-stream-muxer.d.ts.map +0 -1
  100. package/dist/src/abstract-stream-muxer.js +0 -169
  101. package/dist/src/abstract-stream-muxer.js.map +0 -1
  102. package/dist/src/length-prefixed-decoder.d.ts +0 -37
  103. package/dist/src/length-prefixed-decoder.d.ts.map +0 -1
  104. package/dist/src/length-prefixed-decoder.js +0 -64
  105. package/dist/src/length-prefixed-decoder.js.map +0 -1
  106. package/dist/src/message-queue.d.ts +0 -61
  107. package/dist/src/message-queue.d.ts.map +0 -1
  108. package/dist/src/message-queue.js +0 -93
  109. package/dist/src/message-queue.js.map +0 -1
  110. package/dist/src/mock-muxer.d.ts +0 -57
  111. package/dist/src/mock-muxer.d.ts.map +0 -1
  112. package/dist/src/mock-muxer.js +0 -204
  113. package/dist/src/mock-muxer.js.map +0 -1
  114. package/dist/src/mock-stream.d.ts +0 -31
  115. package/dist/src/mock-stream.d.ts.map +0 -1
  116. package/dist/src/mock-stream.js +0 -69
  117. package/dist/src/mock-stream.js.map +0 -1
  118. package/dist/src/multiaddr/get-net-config.d.ts +0 -55
  119. package/dist/src/multiaddr/get-net-config.d.ts.map +0 -1
  120. package/dist/src/multiaddr/get-net-config.js +0 -54
  121. package/dist/src/multiaddr/get-net-config.js.map +0 -1
  122. package/dist/src/multiaddr/index.d.ts +0 -7
  123. package/dist/src/multiaddr/index.d.ts.map +0 -1
  124. package/dist/src/multiaddr/index.js +0 -7
  125. package/dist/src/multiaddr/index.js.map +0 -1
  126. package/dist/src/multiaddr/utils.d.ts +0 -5
  127. package/dist/src/multiaddr/utils.d.ts.map +0 -1
  128. package/dist/src/multiaddr/utils.js +0 -32
  129. package/dist/src/multiaddr/utils.js.map +0 -1
  130. package/dist/src/multiaddr-connection-pair.d.ts +0 -25
  131. package/dist/src/multiaddr-connection-pair.d.ts.map +0 -1
  132. package/dist/src/multiaddr-connection-pair.js +0 -103
  133. package/dist/src/multiaddr-connection-pair.js.map +0 -1
  134. package/dist/src/socket-writer.browser.d.ts +0 -2
  135. package/dist/src/socket-writer.browser.d.ts.map +0 -1
  136. package/dist/src/socket-writer.browser.js +0 -4
  137. package/dist/src/socket-writer.browser.js.map +0 -1
  138. package/dist/src/socket-writer.d.ts +0 -19
  139. package/dist/src/socket-writer.d.ts.map +0 -1
  140. package/dist/src/socket-writer.js +0 -43
  141. package/dist/src/socket-writer.js.map +0 -1
  142. package/dist/src/stream-pair.d.ts +0 -42
  143. package/dist/src/stream-pair.d.ts.map +0 -1
  144. package/dist/src/stream-pair.js +0 -40
  145. package/dist/src/stream-pair.js.map +0 -1
  146. package/dist/src/stream-utils.d.ts +0 -198
  147. package/dist/src/stream-utils.d.ts.map +0 -1
  148. package/dist/src/stream-utils.js +0 -369
  149. package/dist/src/stream-utils.js.map +0 -1
  150. package/src/abstract-message-stream.ts +0 -549
  151. package/src/abstract-multiaddr-connection.ts +0 -93
  152. package/src/abstract-stream-muxer.ts +0 -239
  153. package/src/length-prefixed-decoder.ts +0 -98
  154. package/src/message-queue.ts +0 -156
  155. package/src/mock-muxer.ts +0 -304
  156. package/src/mock-stream.ts +0 -101
  157. package/src/multiaddr/get-net-config.ts +0 -112
  158. package/src/multiaddr/index.ts +0 -6
  159. package/src/multiaddr/utils.ts +0 -46
  160. package/src/multiaddr-connection-pair.ts +0 -147
  161. package/src/socket-writer.browser.ts +0 -3
  162. package/src/socket-writer.ts +0 -64
  163. package/src/stream-pair.ts +0 -90
  164. package/src/stream-utils.ts +0 -873
@@ -1,369 +0,0 @@
1
- import { StreamMessageEvent, StreamCloseEvent, InvalidParametersError } from '@libp2p/interface';
2
- import { pipe as itPipe } from 'it-pipe';
3
- import { pushable } from 'it-pushable';
4
- import { pEvent } from 'p-event';
5
- import { raceSignal } from 'race-signal';
6
- import * as varint from 'uint8-varint';
7
- import { Uint8ArrayList } from 'uint8arraylist';
8
- import { UnexpectedEOFError } from './errors.js';
9
- const DEFAULT_MAX_BUFFER_SIZE = 4_194_304;
10
- export class UnwrappedError extends Error {
11
- static name = 'UnwrappedError';
12
- name = 'UnwrappedError';
13
- }
14
- /**
15
- * The reported length of the next data message was not a positive integer
16
- */
17
- export class InvalidMessageLengthError extends Error {
18
- name = 'InvalidMessageLengthError';
19
- code = 'ERR_INVALID_MSG_LENGTH';
20
- }
21
- /**
22
- * The reported length of the next data message was larger than the configured
23
- * max allowable value
24
- */
25
- export class InvalidDataLengthError extends Error {
26
- name = 'InvalidDataLengthError';
27
- code = 'ERR_MSG_DATA_TOO_LONG';
28
- }
29
- /**
30
- * The varint used to specify the length of the next data message contained more
31
- * bytes than the configured max allowable value
32
- */
33
- export class InvalidDataLengthLengthError extends Error {
34
- name = 'InvalidDataLengthLengthError';
35
- code = 'ERR_MSG_LENGTH_TOO_LONG';
36
- }
37
- function isStream(obj) {
38
- return typeof obj?.closeRead === 'function';
39
- }
40
- function isMultiaddrConnection(obj) {
41
- return typeof obj?.close === 'function';
42
- }
43
- function isEOF(obj) {
44
- if (isStream(obj)) {
45
- return obj.readStatus === 'closing' || obj.readStatus === 'closed';
46
- }
47
- if (isMultiaddrConnection(obj)) {
48
- return obj.status !== 'open';
49
- }
50
- return false;
51
- }
52
- function isValid(obj) {
53
- return obj?.addEventListener != null && obj?.removeEventListener != null && obj?.send != null && obj?.push != null && obj?.log != null;
54
- }
55
- export function byteStream(stream, opts) {
56
- const maxBufferSize = opts?.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE;
57
- const readBuffer = new Uint8ArrayList();
58
- let hasBytes = Promise.withResolvers();
59
- let unwrapped = false;
60
- if (!isValid(stream)) {
61
- throw new InvalidParametersError('Argument should be a Stream or a Multiaddr');
62
- }
63
- const byteStreamOnMessageListener = (evt) => {
64
- if (opts?.stopPropagation === true) {
65
- // evt.stopImmediatePropagation()
66
- }
67
- readBuffer.append(evt.data);
68
- if (readBuffer.byteLength > maxBufferSize) {
69
- const readBufferSize = readBuffer.byteLength;
70
- readBuffer.consume(readBuffer.byteLength);
71
- hasBytes.reject(new Error(`Read buffer overflow - ${readBufferSize} > ${maxBufferSize}`));
72
- }
73
- hasBytes.resolve();
74
- };
75
- stream.addEventListener('message', byteStreamOnMessageListener);
76
- const byteStreamOnCloseListener = (evt) => {
77
- if (evt.error != null) {
78
- hasBytes.reject(evt.error);
79
- }
80
- else {
81
- hasBytes.resolve();
82
- }
83
- };
84
- stream.addEventListener('close', byteStreamOnCloseListener);
85
- const byteStreamOnRemoteCloseWrite = () => {
86
- hasBytes.resolve();
87
- };
88
- stream.addEventListener('remoteCloseWrite', byteStreamOnRemoteCloseWrite);
89
- const byteStream = {
90
- readBuffer,
91
- // @ts-expect-error options type prevents type inference
92
- async read(options) {
93
- if (unwrapped === true) {
94
- throw new UnwrappedError('Stream was unwrapped');
95
- }
96
- if (isEOF(stream)) {
97
- if (options?.bytes == null) {
98
- return null;
99
- }
100
- if (readBuffer.byteLength < options.bytes) {
101
- throw new UnexpectedEOFError(`Unexpected EOF - stream closed after reading ${readBuffer.byteLength}/${options.bytes} bytes`);
102
- }
103
- }
104
- const bytesToRead = options?.bytes ?? 1;
105
- while (true) {
106
- if (readBuffer.byteLength >= bytesToRead) {
107
- // if we are about to exit the loop this promise will not be awaited
108
- // so resolve it to prevent and unhandled promise rejections that may
109
- // occur
110
- hasBytes.resolve();
111
- break;
112
- }
113
- await raceSignal(hasBytes.promise, options?.signal);
114
- if (isEOF(stream)) {
115
- if (readBuffer.byteLength === 0 && options?.bytes == null) {
116
- return null;
117
- }
118
- break;
119
- }
120
- hasBytes = Promise.withResolvers();
121
- }
122
- const toRead = options?.bytes ?? readBuffer.byteLength;
123
- if (readBuffer.byteLength < toRead) {
124
- if (isEOF(stream)) {
125
- throw new UnexpectedEOFError(`Unexpected EOF - stream closed while reading ${readBuffer.byteLength}/${toRead} bytes`);
126
- }
127
- return byteStream.read(options);
128
- }
129
- const output = readBuffer.sublist(0, toRead);
130
- readBuffer.consume(toRead);
131
- return output;
132
- },
133
- async write(data, options) {
134
- if (unwrapped === true) {
135
- throw new UnwrappedError('Stream was unwrapped');
136
- }
137
- if (!stream.send(data)) {
138
- await pEvent(stream, 'drain', {
139
- signal: options?.signal,
140
- rejectionEvents: ['close']
141
- });
142
- }
143
- },
144
- unwrap() {
145
- // already unwrapped, just return the original stream
146
- if (unwrapped) {
147
- return stream;
148
- }
149
- // only unwrap once
150
- unwrapped = true;
151
- stream.removeEventListener('message', byteStreamOnMessageListener);
152
- stream.removeEventListener('close', byteStreamOnCloseListener);
153
- stream.removeEventListener('remoteCloseWrite', byteStreamOnRemoteCloseWrite);
154
- // emit any unread data
155
- if (readBuffer.byteLength > 0) {
156
- stream.log('stream unwrapped with %d unread bytes', readBuffer.byteLength);
157
- stream.push(readBuffer);
158
- }
159
- return stream;
160
- }
161
- };
162
- return byteStream;
163
- }
164
- export function lpStream(stream, opts = {}) {
165
- const bytes = byteStream(stream, opts);
166
- if (opts.maxDataLength != null && opts.maxLengthLength == null) {
167
- // if max data length is set but max length length is not, calculate the
168
- // max length length needed to encode max data length
169
- opts.maxLengthLength = varint.encodingLength(opts.maxDataLength);
170
- }
171
- const decodeLength = opts?.lengthDecoder ?? varint.decode;
172
- const encodeLength = opts?.lengthEncoder ?? varint.encode;
173
- const lpStream = {
174
- async read(options) {
175
- let dataLength = -1;
176
- const lengthBuffer = new Uint8ArrayList();
177
- while (true) {
178
- // read one byte at a time until we can decode a varint
179
- const buf = await bytes.read({
180
- ...options,
181
- bytes: 1
182
- });
183
- // the underlying resource closed gracefully
184
- if (buf == null) {
185
- break;
186
- }
187
- // append byte and try to decode
188
- lengthBuffer.append(buf);
189
- try {
190
- dataLength = decodeLength(lengthBuffer);
191
- }
192
- catch (err) {
193
- if (err instanceof RangeError) {
194
- continue;
195
- }
196
- throw err;
197
- }
198
- if (dataLength < 0) {
199
- throw new InvalidMessageLengthError('Invalid message length');
200
- }
201
- if (opts?.maxLengthLength != null && lengthBuffer.byteLength > opts.maxLengthLength) {
202
- throw new InvalidDataLengthLengthError(`Message length length too long - ${lengthBuffer.byteLength} > ${opts.maxLengthLength}`);
203
- }
204
- if (dataLength > -1) {
205
- break;
206
- }
207
- }
208
- if (opts?.maxDataLength != null && dataLength > opts.maxDataLength) {
209
- throw new InvalidDataLengthError(`Message length too long - ${dataLength} > ${opts.maxDataLength}`);
210
- }
211
- const buf = await bytes.read({
212
- ...options,
213
- bytes: dataLength
214
- });
215
- if (buf == null) {
216
- throw new UnexpectedEOFError(`Unexpected EOF - tried to read ${dataLength} bytes but the stream closed`);
217
- }
218
- if (buf.byteLength !== dataLength) {
219
- throw new UnexpectedEOFError(`Unexpected EOF - read ${buf.byteLength}/${dataLength} bytes before the stream closed`);
220
- }
221
- return buf;
222
- },
223
- async write(data, options) {
224
- // encode, write
225
- await bytes.write(new Uint8ArrayList(encodeLength(data.byteLength), data), options);
226
- },
227
- async writeV(data, options) {
228
- const list = new Uint8ArrayList(...data.flatMap(buf => ([encodeLength(buf.byteLength), buf])));
229
- // encode, write
230
- await bytes.write(list, options);
231
- },
232
- unwrap() {
233
- return bytes.unwrap();
234
- }
235
- };
236
- return lpStream;
237
- }
238
- export function pbStream(stream, opts) {
239
- const lp = lpStream(stream, opts);
240
- const pbStream = {
241
- read: async (proto, options) => {
242
- // readLP, decode
243
- const value = await lp.read(options);
244
- return proto.decode(value);
245
- },
246
- write: async (message, proto, options) => {
247
- // encode, writeLP
248
- await lp.write(proto.encode(message), options);
249
- },
250
- writeV: async (messages, proto, options) => {
251
- // encode, writeLP
252
- await lp.writeV(messages.map(message => proto.encode(message)), options);
253
- },
254
- pb: (proto) => {
255
- return {
256
- read: async (options) => pbStream.read(proto, options),
257
- write: async (d, options) => pbStream.write(d, proto, options),
258
- writeV: async (d, options) => pbStream.writeV(d, proto, options),
259
- unwrap: () => pbStream
260
- };
261
- },
262
- unwrap: () => {
263
- return lp.unwrap();
264
- }
265
- };
266
- return pbStream;
267
- }
268
- export async function echo(stream, options) {
269
- const log = stream.log.newScope('echo');
270
- const start = Date.now();
271
- let bytes = 0;
272
- try {
273
- for await (const buf of stream) {
274
- bytes += buf.byteLength;
275
- if (!stream.send(buf)) {
276
- stream.pause();
277
- await pEvent(stream, 'drain', {
278
- rejectionEvents: [
279
- 'close'
280
- ],
281
- ...options
282
- });
283
- stream.resume();
284
- }
285
- }
286
- log('echoed %d bytes in %dms', bytes, Date.now() - start);
287
- await stream.close(options);
288
- }
289
- catch (err) {
290
- stream.abort(err);
291
- }
292
- }
293
- function isMessageStream(obj) {
294
- return obj?.addEventListener != null;
295
- }
296
- export function messageStreamToDuplex(stream) {
297
- const source = pushable();
298
- let onError;
299
- const onMessage = (evt) => {
300
- source.push(evt.data);
301
- };
302
- const onRemoteCloseWrite = () => {
303
- source.end();
304
- stream.removeEventListener('message', onMessage);
305
- stream.removeEventListener('close', onClose);
306
- stream.removeEventListener('remoteCloseWrite', onRemoteCloseWrite);
307
- };
308
- const onClose = (evt) => {
309
- source.end(evt.error);
310
- if (evt.error != null) {
311
- onError?.reject(evt.error);
312
- }
313
- stream.removeEventListener('message', onMessage);
314
- stream.removeEventListener('close', onClose);
315
- stream.removeEventListener('remoteCloseWrite', onRemoteCloseWrite);
316
- };
317
- stream.addEventListener('message', onMessage);
318
- stream.addEventListener('close', onClose, {
319
- once: true
320
- });
321
- stream.addEventListener('remoteCloseWrite', onRemoteCloseWrite, {
322
- once: true
323
- });
324
- return {
325
- source,
326
- async sink(source) {
327
- async function* toGenerator() {
328
- yield* source;
329
- }
330
- const gen = toGenerator();
331
- while (true) {
332
- onError = Promise.withResolvers();
333
- const { done, value } = await Promise.race([
334
- gen.next(),
335
- onError.promise
336
- ]);
337
- if (stream.writeStatus === 'closing' || stream.writeStatus === 'closed') {
338
- break;
339
- }
340
- if (value != null) {
341
- if (!stream.send(value)) {
342
- await Promise.race([
343
- pEvent(stream, 'drain', {
344
- rejectionEvents: [
345
- 'close'
346
- ]
347
- })
348
- ]);
349
- }
350
- }
351
- if (done === true) {
352
- break;
353
- }
354
- }
355
- await stream.close();
356
- }
357
- };
358
- }
359
- export function pipe(...input) {
360
- const sources = input.map(source => {
361
- if (isMessageStream(source)) {
362
- return messageStreamToDuplex(source);
363
- }
364
- return source;
365
- });
366
- // @ts-expect-error it-pipe types say args cannot be spread like this
367
- return itPipe(...sources);
368
- }
369
- //# sourceMappingURL=stream-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../src/stream-utils.ts"],"names":[],"mappings":"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"}