@libp2p/multistream-select 3.1.0 → 3.1.2
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.
- package/README.md +16 -152
- package/dist/index.min.js +4 -0
- package/dist/src/constants.d.ts +1 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +3 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/handle.d.ts +46 -0
- package/dist/src/handle.d.ts.map +1 -1
- package/dist/src/handle.js.map +1 -1
- package/dist/src/multistream.d.ts.map +1 -1
- package/dist/src/multistream.js +6 -2
- package/dist/src/multistream.js.map +1 -1
- package/dist/src/select.d.ts +43 -0
- package/dist/src/select.d.ts.map +1 -1
- package/dist/src/select.js.map +1 -1
- package/dist/typedoc-urls.json +10 -0
- package/package.json +13 -12
- package/src/constants.ts +4 -0
- package/src/handle.ts +46 -0
- package/src/multistream.ts +7 -2
- package/src/select.ts +43 -0
package/README.md
CHANGED
|
@@ -1,31 +1,20 @@
|
|
|
1
1
|
# @libp2p/multistream-select <!-- omit in toc -->
|
|
2
2
|
|
|
3
3
|
[](http://libp2p.io/)
|
|
4
|
-
[](http://webchat.freenode.net/?channels=%23libp2p)
|
|
5
4
|
[](https://discuss.libp2p.io)
|
|
6
5
|
[](https://codecov.io/gh/libp2p/js-libp2p-multistream-select)
|
|
7
|
-
[](https://github.com/libp2p/js-libp2p-multistream-select/actions/workflows/js-test-and-release.yml?query=branch%3Amaster)
|
|
8
7
|
|
|
9
8
|
> JavaScript implementation of multistream-select
|
|
10
9
|
|
|
11
10
|
## Table of contents <!-- omit in toc -->
|
|
12
11
|
|
|
13
12
|
- [Install](#install)
|
|
13
|
+
- [Browser `<script>` tag](#browser-script-tag)
|
|
14
14
|
- [Background](#background)
|
|
15
15
|
- [What is `multistream-select`?](#what-is-multistream-select)
|
|
16
|
-
|
|
17
|
-
- [
|
|
18
|
-
- [Dialer](#dialer)
|
|
19
|
-
- [Listener](#listener)
|
|
20
|
-
- [API](#api)
|
|
21
|
-
- [`mss.select(dulpex, protocols, [options])`](#mssselectdulpex-protocols-options)
|
|
22
|
-
- [Parameters](#parameters)
|
|
23
|
-
- [Returns](#returns)
|
|
24
|
-
- [Examples](#examples)
|
|
25
|
-
- [`mss.handle(duplex, protocols, [options])`](#msshandleduplex-protocols-options)
|
|
26
|
-
- [Parameters](#parameters-1)
|
|
27
|
-
- [Returns](#returns-1)
|
|
28
|
-
- [Examples](#examples-1)
|
|
16
|
+
- [Select a protocol flow](#select-a-protocol-flow)
|
|
17
|
+
- [API Docs](#api-docs)
|
|
29
18
|
- [License](#license)
|
|
30
19
|
- [Contribution](#contribution)
|
|
31
20
|
|
|
@@ -35,17 +24,25 @@
|
|
|
35
24
|
$ npm i @libp2p/multistream-select
|
|
36
25
|
```
|
|
37
26
|
|
|
27
|
+
### Browser `<script>` tag
|
|
28
|
+
|
|
29
|
+
Loading this module through a script tag will make it's exports available as `Libp2pMultistreamSelect` in the global namespace.
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<script src="https://unpkg.com/@libp2p/multistream-select/dist/index.min.js"></script>
|
|
33
|
+
```
|
|
34
|
+
|
|
38
35
|
## Background
|
|
39
36
|
|
|
40
37
|
### What is `multistream-select`?
|
|
41
38
|
|
|
42
39
|
TLDR; multistream-select is protocol multiplexing per connection/stream. [Full spec here](https://github.com/multiformats/multistream-select)
|
|
43
40
|
|
|
44
|
-
|
|
41
|
+
### Select a protocol flow
|
|
45
42
|
|
|
46
43
|
The caller will send "interactive" messages, expecting for some acknowledgement from the callee, which will "select" the handler for the desired and supported protocol:
|
|
47
44
|
|
|
48
|
-
```
|
|
45
|
+
```
|
|
49
46
|
< /multistream-select/0.3.0 # i speak multistream-select/0.3.0
|
|
50
47
|
> /multistream-select/0.3.0 # ok, let's speak multistream-select/0.3.0
|
|
51
48
|
> /ipfs-dht/0.2.3 # i want to speak ipfs-dht/0.2.3
|
|
@@ -57,142 +54,9 @@ The caller will send "interactive" messages, expecting for some acknowledgement
|
|
|
57
54
|
> <dht-message>
|
|
58
55
|
```
|
|
59
56
|
|
|
60
|
-
##
|
|
61
|
-
|
|
62
|
-
```js
|
|
63
|
-
import { select, handle } from '@libp2p/multistream-select'
|
|
64
|
-
// You can now use
|
|
65
|
-
// select - actively select a protocol with a remote
|
|
66
|
-
// handle - handle a protocol with a remote
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Dialer
|
|
70
|
-
|
|
71
|
-
```js
|
|
72
|
-
import { pipe } from 'it-pipe'
|
|
73
|
-
import * as mss from '@libp2p/multistream-select'
|
|
74
|
-
import { Mplex } from '@libp2p/mplex'
|
|
75
|
-
|
|
76
|
-
const muxer = new Mplex()
|
|
77
|
-
const muxedStream = muxer.newStream()
|
|
78
|
-
|
|
79
|
-
// mss.select(protocol(s))
|
|
80
|
-
// Select from one of the passed protocols (in priority order)
|
|
81
|
-
// Returns selected stream and protocol
|
|
82
|
-
const { stream: dhtStream, protocol } = await mss.select(muxedStream, [
|
|
83
|
-
// This might just be different versions of DHT, but could be different impls
|
|
84
|
-
'/ipfs-dht/2.0.0', // Most of the time this will probably just be one item.
|
|
85
|
-
'/ipfs-dht/1.0.0'
|
|
86
|
-
])
|
|
87
|
-
|
|
88
|
-
// Typically this stream will be passed back to the caller of libp2p.dialProtocol
|
|
89
|
-
//
|
|
90
|
-
// ...it might then do something like this:
|
|
91
|
-
// try {
|
|
92
|
-
// await pipe(
|
|
93
|
-
// [uint8ArrayFromString('Some DHT data')]
|
|
94
|
-
// dhtStream,
|
|
95
|
-
// async source => {
|
|
96
|
-
// for await (const chunk of source)
|
|
97
|
-
// // DHT response data
|
|
98
|
-
// }
|
|
99
|
-
// )
|
|
100
|
-
// } catch (err) {
|
|
101
|
-
// // Error in stream
|
|
102
|
-
// }
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Listener
|
|
106
|
-
|
|
107
|
-
```js
|
|
108
|
-
import { pipe } from 'it-pipe'
|
|
109
|
-
import * as mss from '@libp2p/multistream-select'
|
|
110
|
-
import { Mplex } from '@libp2p/mplex'
|
|
111
|
-
|
|
112
|
-
const muxer = new Mplex({
|
|
113
|
-
async onStream (muxedStream) {
|
|
114
|
-
// mss.handle(handledProtocols)
|
|
115
|
-
// Returns selected stream and protocol
|
|
116
|
-
const { stream, protocol } = await mss.handle(muxedStream, [
|
|
117
|
-
'/ipfs-dht/1.0.0',
|
|
118
|
-
'/ipfs-bitswap/1.0.0'
|
|
119
|
-
])
|
|
120
|
-
|
|
121
|
-
// Typically here we'd call the handler function that was registered in
|
|
122
|
-
// libp2p for the given protocol:
|
|
123
|
-
// e.g. handlers[protocol].handler(stream)
|
|
124
|
-
//
|
|
125
|
-
// If protocol was /ipfs-dht/1.0.0 it might do something like this:
|
|
126
|
-
// try {
|
|
127
|
-
// await pipe(
|
|
128
|
-
// dhtStream,
|
|
129
|
-
// source => (async function * () {
|
|
130
|
-
// for await (const chunk of source)
|
|
131
|
-
// // Incoming DHT data -> process and yield to respond
|
|
132
|
-
// })(),
|
|
133
|
-
// dhtStream
|
|
134
|
-
// )
|
|
135
|
-
// } catch (err) {
|
|
136
|
-
// // Error in stream
|
|
137
|
-
// }
|
|
138
|
-
}
|
|
139
|
-
})
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## API
|
|
143
|
-
|
|
144
|
-
### `mss.select(dulpex, protocols, [options])`
|
|
145
|
-
|
|
146
|
-
Negotiate a protocol to use from a list of protocols.
|
|
147
|
-
|
|
148
|
-
#### Parameters
|
|
149
|
-
|
|
150
|
-
- `duplex` (`Duplex`) - A [duplex iterable stream](https://gist.github.com/alanshaw/591dc7dd54e4f99338a347ef568d6ee9#duplex-it) to dial on.
|
|
151
|
-
- `protocols` (`string[]`/`string`) - A list of protocols (or single protocol) to negotiate with. Protocols are attempted in order until a match is made.
|
|
152
|
-
- `options` (`{ signal: AbortSignal, writeBytes?: boolean }`) - an options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
|
|
153
|
-
|
|
154
|
-
#### Returns
|
|
155
|
-
|
|
156
|
-
`Promise<{ stream<Duplex>, protocol<string> }>` - A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`.
|
|
157
|
-
|
|
158
|
-
Note that after a protocol is selected `dialer` can no longer be used.
|
|
159
|
-
|
|
160
|
-
#### Examples
|
|
161
|
-
|
|
162
|
-
```js
|
|
163
|
-
const { stream, protocol } = await dialer.select([
|
|
164
|
-
// This might just be different versions of DHT, but could be different impls
|
|
165
|
-
'/ipfs-dht/2.0.0', // Most of the time this will probably just be one item.
|
|
166
|
-
'/ipfs-dht/1.0.0'
|
|
167
|
-
])
|
|
168
|
-
// Now talk `protocol` on `stream`
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### `mss.handle(duplex, protocols, [options])`
|
|
57
|
+
## API Docs
|
|
172
58
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
#### Parameters
|
|
176
|
-
|
|
177
|
-
- `duplex` (`Duplex`) - A [duplex iterable stream](https://gist.github.com/alanshaw/591dc7dd54e4f99338a347ef568d6ee9#duplex-it) to listen on.
|
|
178
|
-
- `protocols` (`String[]`/`String`) - A list of protocols (or single protocol) that this listener is able to speak.
|
|
179
|
-
- `options` (`{ signal: AbortSignal, writeBytes?: boolean }`) - an options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
|
|
180
|
-
|
|
181
|
-
#### Returns
|
|
182
|
-
|
|
183
|
-
`Promise<{ stream<Duplex>, protocol<string> }>` - A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`.
|
|
184
|
-
|
|
185
|
-
Note that after a protocol is handled `listener` can no longer be used.
|
|
186
|
-
|
|
187
|
-
#### Examples
|
|
188
|
-
|
|
189
|
-
```js
|
|
190
|
-
const { stream, protocol } = await mss.handle(duplex, [
|
|
191
|
-
'/ipfs-dht/1.0.0',
|
|
192
|
-
'/ipfs-bitswap/1.0.0'
|
|
193
|
-
])
|
|
194
|
-
// Remote wants to speak `protocol`
|
|
195
|
-
```
|
|
59
|
+
- <https://libp2p.github.io/js-libp2p-multistream-select>
|
|
196
60
|
|
|
197
61
|
## License
|
|
198
62
|
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.Libp2PMultistreamSelect = factory()}(typeof self !== 'undefined' ? self : this, function () {
|
|
2
|
+
"use strict";var Libp2PMultistreamSelect=(()=>{var Kt=Object.create;var me=Object.defineProperty;var Qt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Yt=Object.getPrototypeOf,er=Object.prototype.hasOwnProperty;var be=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),L=(r,e)=>{for(var t in e)me(r,t,{get:e[t],enumerable:!0})},it=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Zt(e))!er.call(r,o)&&o!==t&&me(r,o,{get:()=>e[o],enumerable:!(n=Qt(e,o))||n.enumerable});return r};var ge=(r,e,t)=>(t=r!=null?Kt(Yt(r)):{},it(e||!r||!r.__esModule?me(t,"default",{value:r,enumerable:!0}):t,r)),tr=r=>it(me({},"__esModule",{value:!0}),r);var ct=be((qn,at)=>{var K=1e3,Q=K*60,Z=Q*60,$=Z*24,rr=$*7,nr=$*365.25;at.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return or(r);if(t==="number"&&isFinite(r))return e.long?ir(r):sr(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function or(r){if(r=String(r),!(r.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(r);if(e){var t=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return t*nr;case"weeks":case"week":case"w":return t*rr;case"days":case"day":case"d":return t*$;case"hours":case"hour":case"hrs":case"hr":case"h":return t*Z;case"minutes":case"minute":case"mins":case"min":case"m":return t*Q;case"seconds":case"second":case"secs":case"sec":case"s":return t*K;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function sr(r){var e=Math.abs(r);return e>=$?Math.round(r/$)+"d":e>=Z?Math.round(r/Z)+"h":e>=Q?Math.round(r/Q)+"m":e>=K?Math.round(r/K)+"s":r+"ms"}function ir(r){var e=Math.abs(r);return e>=$?we(r,e,$,"day"):e>=Z?we(r,e,Z,"hour"):e>=Q?we(r,e,Q,"minute"):e>=K?we(r,e,K,"second"):r+" ms"}function we(r,e,t,n){var o=e>=t*1.5;return Math.round(r/t)+" "+n+(o?"s":"")}});var ut=be((Hn,ft)=>{function ar(r){t.debug=t,t.default=t,t.coerce=l,t.disable=s,t.enable=o,t.enabled=i,t.humanize=ct(),t.destroy=p,Object.keys(r).forEach(a=>{t[a]=r[a]}),t.names=[],t.skips=[],t.formatters={};function e(a){let f=0;for(let h=0;h<a.length;h++)f=(f<<5)-f+a.charCodeAt(h),f|=0;return t.colors[Math.abs(f)%t.colors.length]}t.selectColor=e;function t(a){let f,h=null,A,d;function u(...m){if(!u.enabled)return;let g=u,x=Number(new Date),F=x-(f||x);g.diff=F,g.prev=f,g.curr=x,f=x,m[0]=t.coerce(m[0]),typeof m[0]!="string"&&m.unshift("%O");let C=0;m[0]=m[0].replace(/%([a-zA-Z%])/g,(T,E)=>{if(T==="%%")return"%";C++;let O=t.formatters[E];if(typeof O=="function"){let W=m[C];T=O.call(g,W),m.splice(C,1),C--}return T}),t.formatArgs.call(g,m),(g.log||t.log).apply(g,m)}return u.namespace=a,u.useColors=t.useColors(),u.color=t.selectColor(a),u.extend=n,u.destroy=t.destroy,Object.defineProperty(u,"enabled",{enumerable:!0,configurable:!1,get:()=>h!==null?h:(A!==t.namespaces&&(A=t.namespaces,d=t.enabled(a)),d),set:m=>{h=m}}),typeof t.init=="function"&&t.init(u),u}function n(a,f){let h=t(this.namespace+(typeof f>"u"?":":f)+a);return h.log=this.log,h}function o(a){t.save(a),t.namespaces=a,t.names=[],t.skips=[];let f,h=(typeof a=="string"?a:"").split(/[\s,]+/),A=h.length;for(f=0;f<A;f++)h[f]&&(a=h[f].replace(/\*/g,".*?"),a[0]==="-"?t.skips.push(new RegExp("^"+a.slice(1)+"$")):t.names.push(new RegExp("^"+a+"$")))}function s(){let a=[...t.names.map(c),...t.skips.map(c).map(f=>"-"+f)].join(",");return t.enable(""),a}function i(a){if(a[a.length-1]==="*")return!0;let f,h;for(f=0,h=t.skips.length;f<h;f++)if(t.skips[f].test(a))return!1;for(f=0,h=t.names.length;f<h;f++)if(t.names[f].test(a))return!0;return!1}function c(a){return a.toString().substring(2,a.toString().length-2).replace(/\.\*\?$/,"*")}function l(a){return a instanceof Error?a.stack||a.message:a}function p(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return t.enable(t.load()),t}ft.exports=ar});var lt=be((v,ye)=>{v.formatArgs=fr;v.save=ur;v.load=lr;v.useColors=cr;v.storage=hr();v.destroy=(()=>{let r=!1;return()=>{r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();v.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function cr(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function fr(r){if(r[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+r[0]+(this.useColors?"%c ":" ")+"+"+ye.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;r.splice(1,0,e,"color: inherit");let t=0,n=0;r[0].replace(/%[a-zA-Z%]/g,o=>{o!=="%%"&&(t++,o==="%c"&&(n=t))}),r.splice(n,0,e)}v.log=console.debug||console.log||(()=>{});function ur(r){try{r?v.storage.setItem("debug",r):v.storage.removeItem("debug")}catch{}}function lr(){let r;try{r=v.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function hr(){try{return localStorage}catch{}}ye.exports=ut()(v);var{formatters:dr}=ye.exports;dr.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var xe=be((so,yt)=>{"use strict";function wt(r,e){for(let t in e)Object.defineProperty(r,t,{value:e[t],enumerable:!0,configurable:!0});return r}function Nr(r,e,t){if(!r||typeof r=="string")throw new TypeError("Please pass an Error to err-code");t||(t={}),typeof e=="object"&&(t=e,e=""),e&&(t.code=e);try{return wt(r,t)}catch{t.message=r.message,t.stack=r.stack;let o=function(){};return o.prototype=Object.create(Object.getPrototypeOf(r)),wt(new o,t)}}yt.exports=Nr});var $n={};L($n,{PROTOCOL_ID:()=>N,handle:()=>Wt,lazySelect:()=>Jt,select:()=>Xt});var N="/multistream/1.0.0";var R=ge(lt(),1);var Re={};L(Re,{base58btc:()=>D,base58flickr:()=>yr});function pr(r,e){if(r.length>=255)throw new TypeError("Alphabet too long");for(var t=new Uint8Array(256),n=0;n<t.length;n++)t[n]=255;for(var o=0;o<r.length;o++){var s=r.charAt(o),i=s.charCodeAt(0);if(t[i]!==255)throw new TypeError(s+" is ambiguous");t[i]=o}var c=r.length,l=r.charAt(0),p=Math.log(c)/Math.log(256),a=Math.log(256)/Math.log(c);function f(d){if(d instanceof Uint8Array||(ArrayBuffer.isView(d)?d=new Uint8Array(d.buffer,d.byteOffset,d.byteLength):Array.isArray(d)&&(d=Uint8Array.from(d))),!(d instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(d.length===0)return"";for(var u=0,m=0,g=0,x=d.length;g!==x&&d[g]===0;)g++,u++;for(var F=(x-g)*a+1>>>0,C=new Uint8Array(F);g!==x;){for(var k=d[g],T=0,E=F-1;(k!==0||T<m)&&E!==-1;E--,T++)k+=256*C[E]>>>0,C[E]=k%c>>>0,k=k/c>>>0;if(k!==0)throw new Error("Non-zero carry");m=T,g++}for(var O=F-m;O!==F&&C[O]===0;)O++;for(var W=l.repeat(u);O<F;++O)W+=r.charAt(C[O]);return W}function h(d){if(typeof d!="string")throw new TypeError("Expected String");if(d.length===0)return new Uint8Array;var u=0;if(d[u]!==" "){for(var m=0,g=0;d[u]===l;)m++,u++;for(var x=(d.length-u)*p+1>>>0,F=new Uint8Array(x);d[u];){var C=t[d.charCodeAt(u)];if(C===255)return;for(var k=0,T=x-1;(C!==0||k<g)&&T!==-1;T--,k++)C+=c*F[T]>>>0,F[T]=C%256>>>0,C=C/256>>>0;if(C!==0)throw new Error("Non-zero carry");g=k,u++}if(d[u]!==" "){for(var E=x-g;E!==x&&F[E]===0;)E++;for(var O=new Uint8Array(m+(x-E)),W=m;E!==x;)O[W++]=F[E++];return O}}}function A(d){var u=h(d);if(u)return u;throw new Error(`Non-${e} character`)}return{encode:f,decodeUnsafe:h,decode:A}}var mr=pr,br=mr,ht=br;var Jn=new Uint8Array(0);var dt=(r,e)=>{if(r===e)return!0;if(r.byteLength!==e.byteLength)return!1;for(let t=0;t<r.byteLength;t++)if(r[t]!==e[t])return!1;return!0},M=r=>{if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Unknown type, must be binary type")};var pt=r=>new TextEncoder().encode(r),mt=r=>new TextDecoder().decode(r);var Oe=class{constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}},Ne=class{constructor(e,t,n){if(this.name=e,this.prefix=t,t.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if(typeof e=="string"){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(e){return gt(this,e)}},De=class{constructor(e){this.decoders=e}or(e){return gt(this,e)}decode(e){let t=e[0],n=this.decoders[t];if(n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}},gt=(r,e)=>new De({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),ke=class{constructor(e,t,n,o){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=o,this.encoder=new Oe(e,t,n),this.decoder=new Ne(e,t,o)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},Y=({name:r,prefix:e,encode:t,decode:n})=>new ke(r,e,t,n),P=({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:o}=ht(t,e);return Y({prefix:r,name:e,encode:n,decode:s=>M(o(s))})},gr=(r,e,t,n)=>{let o={};for(let a=0;a<e.length;++a)o[e[a]]=a;let s=r.length;for(;r[s-1]==="=";)--s;let i=new Uint8Array(s*t/8|0),c=0,l=0,p=0;for(let a=0;a<s;++a){let f=o[r[a]];if(f===void 0)throw new SyntaxError(`Non-${n} character`);l=l<<t|f,c+=t,c>=8&&(c-=8,i[p++]=255&l>>c)}if(c>=t||255&l<<8-c)throw new SyntaxError("Unexpected end of data");return i},wr=(r,e,t)=>{let n=e[e.length-1]==="=",o=(1<<t)-1,s="",i=0,c=0;for(let l=0;l<r.length;++l)for(c=c<<8|r[l],i+=8;i>t;)i-=t,s+=e[o&c>>i];if(i&&(s+=e[o&c<<t-i]),n)for(;s.length*t&7;)s+="=";return s},b=({name:r,prefix:e,bitsPerChar:t,alphabet:n})=>Y({prefix:e,name:r,encode(o){return wr(o,n,t)},decode(o){return gr(o,n,t,r)}});var D=P({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),yr=P({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Me={};L(Me,{base32:()=>z,base32hex:()=>Er,base32hexpad:()=>vr,base32hexpadupper:()=>Sr,base32hexupper:()=>Lr,base32pad:()=>Cr,base32padupper:()=>Ar,base32upper:()=>xr,base32z:()=>Ur});var z=b({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),xr=b({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),Cr=b({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),Ar=b({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Er=b({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),Lr=b({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),vr=b({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),Sr=b({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Ur=b({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Ie={};L(Ie,{base64:()=>Be,base64pad:()=>Fr,base64url:()=>Tr,base64urlpad:()=>Or});var Be=b({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Fr=b({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Tr=b({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Or=b({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});R.default.formatters.b=r=>r==null?"undefined":D.baseEncode(r);R.default.formatters.t=r=>r==null?"undefined":z.baseEncode(r);R.default.formatters.m=r=>r==null?"undefined":Be.baseEncode(r);R.default.formatters.p=r=>r==null?"undefined":r.toString();R.default.formatters.c=r=>r==null?"undefined":r.toString();R.default.formatters.k=r=>r==null?"undefined":r.toString();function ee(r){return Object.assign((0,R.default)(r),{error:(0,R.default)(`${r}:error`),trace:(0,R.default)(`${r}:trace`)})}var st=ge(xe(),1);function G(r){return globalThis.Buffer!=null?new Uint8Array(r.buffer,r.byteOffset,r.byteLength):r}function B(r=0){return globalThis.Buffer?.alloc!=null?G(globalThis.Buffer.alloc(r)):new Uint8Array(r)}function I(r=0){return globalThis.Buffer?.allocUnsafe!=null?G(globalThis.Buffer.allocUnsafe(r)):new Uint8Array(r)}function Pe(r,e){e==null&&(e=r.reduce((o,s)=>o+s.length,0));let t=I(e),n=0;for(let o of r)t.set(o,n),n+=o.length;return G(t)}function xt(r,e){if(r===e)return!0;if(r.byteLength!==e.byteLength)return!1;for(let t=0;t<r.byteLength;t++)if(r[t]!==e[t])return!1;return!0}var At=Symbol.for("@achingbrain/uint8arraylist");function Ct(r,e){if(e==null||e<0)throw new RangeError("index is out of bounds");let t=0;for(let n of r){let o=t+n.byteLength;if(e<o)return{buf:n,index:e-t};t=o}throw new RangeError("index is out of bounds")}function Ce(r){return Boolean(r?.[At])}var w=class{constructor(...e){Object.defineProperty(this,At,{value:!0}),this.bufs=[],this.length=0,e.length>0&&this.appendAll(e)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...e){this.appendAll(e)}appendAll(e){let t=0;for(let n of e)if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.push(n);else if(Ce(n))t+=n.byteLength,this.bufs.push(...n.bufs);else throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");this.length+=t}prepend(...e){this.prependAll(e)}prependAll(e){let t=0;for(let n of e.reverse())if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.unshift(n);else if(Ce(n))t+=n.byteLength,this.bufs.unshift(...n.bufs);else throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");this.length+=t}get(e){let t=Ct(this.bufs,e);return t.buf[t.index]}set(e,t){let n=Ct(this.bufs,e);n.buf[n.index]=t}write(e,t=0){if(e instanceof Uint8Array)for(let n=0;n<e.length;n++)this.set(t+n,e[n]);else if(Ce(e))for(let n=0;n<e.length;n++)this.set(t+n,e.get(n));else throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList")}consume(e){if(e=Math.trunc(e),!(Number.isNaN(e)||e<=0)){if(e===this.byteLength){this.bufs=[],this.length=0;return}for(;this.bufs.length>0;)if(e>=this.bufs[0].byteLength)e-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift();else{this.bufs[0]=this.bufs[0].subarray(e),this.length-=e;break}}}slice(e,t){let{bufs:n,length:o}=this._subList(e,t);return Pe(n,o)}subarray(e,t){let{bufs:n,length:o}=this._subList(e,t);return n.length===1?n[0]:Pe(n,o)}sublist(e,t){let{bufs:n,length:o}=this._subList(e,t),s=new w;return s.length=o,s.bufs=n,s}_subList(e,t){if(e=e??0,t=t??this.length,e<0&&(e=this.length+e),t<0&&(t=this.length+t),e<0||t>this.length)throw new RangeError("index is out of bounds");if(e===t)return{bufs:[],length:0};if(e===0&&t===this.length)return{bufs:[...this.bufs],length:this.length};let n=[],o=0;for(let s=0;s<this.bufs.length;s++){let i=this.bufs[s],c=o,l=c+i.byteLength;if(o=l,e>=l)continue;let p=e>=c&&e<l,a=t>c&&t<=l;if(p&&a){if(e===c&&t===l){n.push(i);break}let f=e-c;n.push(i.subarray(f,f+(t-e)));break}if(p){if(e===0){n.push(i);continue}n.push(i.subarray(e-c));continue}if(a){if(t===l){n.push(i);break}n.push(i.subarray(0,t-c));break}n.push(i)}return{bufs:n,length:t-e}}indexOf(e,t=0){if(!Ce(e)&&!(e instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');let n=e instanceof Uint8Array?e:e.subarray();if(t=Number(t??0),isNaN(t)&&(t=0),t<0&&(t=this.length+t),t<0&&(t=0),e.length===0)return t>this.length?this.length:t;let o=n.byteLength;if(o===0)throw new TypeError("search must be at least 1 byte long");let s=256,i=new Int32Array(s);for(let f=0;f<s;f++)i[f]=-1;for(let f=0;f<o;f++)i[n[f]]=f;let c=i,l=this.byteLength-n.byteLength,p=n.byteLength-1,a;for(let f=t;f<=l;f+=a){a=0;for(let h=p;h>=0;h--){let A=this.get(f+h);if(n[h]!==A){a=Math.max(1,h-c[A]);break}}if(a===0)return f}return-1}getInt8(e){let t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt8(0)}setInt8(e,t){let n=I(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,t),this.write(n,e)}getInt16(e,t){let n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,t)}setInt16(e,t,n){let o=B(2);new DataView(o.buffer,o.byteOffset,o.byteLength).setInt16(0,t,n),this.write(o,e)}getInt32(e,t){let n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,t)}setInt32(e,t,n){let o=B(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setInt32(0,t,n),this.write(o,e)}getBigInt64(e,t){let n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,t)}setBigInt64(e,t,n){let o=B(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setBigInt64(0,t,n),this.write(o,e)}getUint8(e){let t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getUint8(0)}setUint8(e,t){let n=I(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,t),this.write(n,e)}getUint16(e,t){let n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,t)}setUint16(e,t,n){let o=B(2);new DataView(o.buffer,o.byteOffset,o.byteLength).setUint16(0,t,n),this.write(o,e)}getUint32(e,t){let n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,t)}setUint32(e,t,n){let o=B(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setUint32(0,t,n),this.write(o,e)}getBigUint64(e,t){let n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,t)}setBigUint64(e,t,n){let o=B(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setBigUint64(0,t,n),this.write(o,e)}getFloat32(e,t){let n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,t)}setFloat32(e,t,n){let o=B(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setFloat32(0,t,n),this.write(o,e)}getFloat64(e,t){let n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,t)}setFloat64(e,t,n){let o=B(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setFloat64(0,t,n),this.write(o,e)}equals(e){if(e==null||!(e instanceof w)||e.bufs.length!==this.bufs.length)return!1;for(let t=0;t<this.bufs.length;t++)if(!xt(this.bufs[t],e.bufs[t]))return!1;return!0}static fromUint8Arrays(e,t){let n=new w;return n.bufs=e,t==null&&(t=e.reduce((o,s)=>o+s.byteLength,0)),n.length=t,n}};function Ae(r){return r instanceof Uint8Array?{get(e){return r[e]},set(e,t){r[e]=t}}:{get(e){return r.get(e)},set(e,t){r.set(e,t)}}}var Et=4294967296,S=class{constructor(e=0,t=0){this.hi=e,this.lo=t}toBigInt(e){if(e===!0)return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n);if(this.hi>>>31){let t=~this.lo+1>>>0,n=~this.hi>>>0;return t===0&&(n=n+1>>>0),-(BigInt(t)+(BigInt(n)<<32n))}return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n)}toNumber(e){return Number(this.toBigInt(e))}zzDecode(){let e=-(this.lo&1),t=((this.lo>>>1|this.hi<<31)^e)>>>0,n=(this.hi>>>1^e)>>>0;return new S(n,t)}zzEncode(){let e=this.hi>>31,t=((this.hi<<1|this.lo>>>31)^e)>>>0,n=(this.lo<<1^e)>>>0;return new S(t,n)}toBytes(e,t=0){let n=Ae(e);for(;this.hi>0;)n.set(t++,this.lo&127|128),this.lo=(this.lo>>>7|this.hi<<25)>>>0,this.hi>>>=7;for(;this.lo>127;)n.set(t++,this.lo&127|128),this.lo=this.lo>>>7;n.set(t++,this.lo)}static fromBigInt(e){if(e===0n)return new S;let t=e<0;t&&(e=-e);let n=Number(e>>32n)|0,o=Number(e-(BigInt(n)<<32n))|0;return t&&(n=~n>>>0,o=~o>>>0,++o>Et&&(o=0,++n>Et&&(n=0))),new S(n,o)}static fromNumber(e){if(e===0)return new S;let t=e<0;t&&(e=-e);let n=e>>>0,o=(e-n)/4294967296>>>0;return t&&(o=~o>>>0,n=~n>>>0,++n>4294967295&&(n=0,++o>4294967295&&(o=0))),new S(o,n)}static fromBytes(e,t=0){let n=Ae(e),o=new S,s=0;if(e.length-t>4){for(;s<4;++s)if(o.lo=(o.lo|(n.get(t)&127)<<s*7)>>>0,n.get(t++)<128)return o;if(o.lo=(o.lo|(n.get(t)&127)<<28)>>>0,o.hi=(o.hi|(n.get(t)&127)>>4)>>>0,n.get(t++)<128)return o;s=0}else for(;s<4;++s){if(t>=e.length)throw RangeError(`index out of range: ${t} > ${e.length}`);if(o.lo=(o.lo|(n.get(t)&127)<<s*7)>>>0,n.get(t++)<128)return o}if(e.length-t>4){for(;s<5;++s)if(o.hi=(o.hi|(n.get(t)&127)<<s*7+3)>>>0,n.get(t++)<128)return o}else if(t<e.byteLength)for(;s<5;++s){if(t>=e.length)throw RangeError(`index out of range: ${t} > ${e.length}`);if(o.hi=(o.hi|(n.get(t)&127)<<s*7+3)>>>0,n.get(t++)<128)return o}throw RangeError("invalid varint encoding")}};var Dr=Math.pow(2,7),kr=Math.pow(2,14),Rr=Math.pow(2,21),Mr=Math.pow(2,28),Br=Math.pow(2,35),Ir=Math.pow(2,42),Pr=Math.pow(2,49),zr=Math.pow(2,56),Vr=Math.pow(2,63),j={encodingLength(r){return r<Dr?1:r<kr?2:r<Rr?3:r<Mr?4:r<Br?5:r<Ir?6:r<Pr?7:r<zr?8:r<Vr?9:10},encode(r,e,t=0){if(Number.MAX_SAFE_INTEGER!=null&&r>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return e==null&&(e=I(j.encodingLength(r))),S.fromNumber(r).toBytes(e,t),e},decode(r,e=0){return S.fromBytes(r,e).toNumber(!0)}};function Lt(r){return globalThis?.Buffer?.allocUnsafe!=null?globalThis.Buffer.allocUnsafe(r):new Uint8Array(r)}var Ee=r=>{let e=j.encodingLength(r),t=Lt(e);return j.encode(r,t),Ee.bytes=e,t};Ee.bytes=0;function Le(r){r=r??{};let e=r.lengthEncoder??Ee;return async function*(n){for await(let o of n){let s=e(o.byteLength);s instanceof Uint8Array?yield s:yield*s,o instanceof Uint8Array?yield o:yield*o}}}Le.single=(r,e)=>{e=e??{};let t=e.lengthEncoder??Ee;return new w(t(r.byteLength),r)};var se=ge(xe(),1),_r=8,$r=1024*1024*4,q;(function(r){r[r.LENGTH=0]="LENGTH",r[r.DATA=1]="DATA"})(q||(q={}));var ze=r=>{let e=j.decode(r);return ze.bytes=j.encodingLength(e),e};ze.bytes=0;function ie(r){return async function*(t){let n=new w,o=q.LENGTH,s=-1,i=r?.lengthDecoder??ze,c=r?.maxLengthLength??_r,l=r?.maxDataLength??$r;for await(let p of t)for(n.append(p);n.byteLength>0;){if(o===q.LENGTH)try{if(s=i(n),s<0)throw(0,se.default)(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(s>l)throw(0,se.default)(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");let a=i.bytes;n.consume(a),r?.onLength!=null&&r.onLength(s),o=q.DATA}catch(a){if(a instanceof RangeError){if(n.byteLength>c)throw(0,se.default)(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw a}if(o===q.DATA){if(n.byteLength<s)break;let a=n.sublist(0,s);n.consume(s),r?.onData!=null&&r.onData(a),yield a,o=q.LENGTH}}if(n.byteLength>0)throw(0,se.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}}ie.fromReader=(r,e)=>{let t=1,n=async function*(){for(;;)try{let{done:s,value:i}=await r.next(t);if(s===!0)return;i!=null&&(yield i)}catch(s){if(s.code==="ERR_UNDER_READ")return{done:!0,value:null};throw s}finally{t=1}}();return ie({...e??{},onLength:s=>{t=s}})(n)};var ve=class{constructor(e){if(!(e>0)||e-1&e)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(e),this.mask=e-1,this.top=0,this.btm=0,this.next=null}push(e){return this.buffer[this.top]!==void 0?!1:(this.buffer[this.top]=e,this.top=this.top+1&this.mask,!0)}shift(){let e=this.buffer[this.btm];if(e!==void 0)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,e}isEmpty(){return this.buffer[this.btm]===void 0}},te=class{constructor(e={}){this.hwm=e.splitLimit??16,this.head=new ve(this.hwm),this.tail=this.head,this.size=0}calculateSize(e){return e?.byteLength!=null?e.byteLength:1}push(e){if(e?.value!=null&&(this.size+=this.calculateSize(e.value)),!this.head.push(e)){let t=this.head;this.head=t.next=new ve(2*this.head.buffer.length),this.head.push(e)}}shift(){let e=this.tail.shift();if(e===void 0&&this.tail.next!=null){let t=this.tail.next;this.tail.next=null,this.tail=t,e=this.tail.shift()}return e?.value!=null&&(this.size-=this.calculateSize(e.value)),e}isEmpty(){return this.head.isEmpty()}};function V(r={}){return jr(t=>{let n=t.shift();if(n==null)return{done:!0};if(n.error!=null)throw n.error;return{done:n.done===!0,value:n.value}},r)}function jr(r,e){e=e??{};let t=e.onEnd,n=new te,o,s,i,c=async()=>n.isEmpty()?i?{done:!0}:await new Promise((u,m)=>{s=g=>{s=null,n.push(g);try{u(r(n))}catch(x){m(x)}return o}}):r(n),l=u=>s!=null?s(u):(n.push(u),o),p=u=>(n=new te,s!=null?s({error:u}):(n.push({error:u}),o)),a=u=>{if(i)return o;if(e?.objectMode!==!0&&u?.byteLength==null)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return l({done:!1,value:u})},f=u=>i?o:(i=!0,u!=null?p(u):l({done:!0})),h=()=>(n=new te,f(),{done:!0}),A=u=>(f(u),{done:!0});if(o={[Symbol.asyncIterator](){return this},next:c,return:h,throw:A,push:a,end:f,get readableLength(){return n.size}},t==null)return o;let d=o;return o={[Symbol.asyncIterator](){return this},next(){return d.next()},throw(u){return d.throw(u),t!=null&&(t(u),t=void 0),{done:!0}},return(){return d.return(),t!=null&&(t(),t=void 0),{done:!0}},push:a,end(u){return d.end(u),t!=null&&(t(u),t=void 0),o},get readableLength(){return d.readableLength}},o}async function*ae(...r){let e=V({objectMode:!0});Promise.resolve().then(async()=>{try{await Promise.all(r.map(async t=>{for await(let n of t)e.push(n)})),e.end()}catch(t){e.end(t)}}),yield*e}var qr=(...r)=>{let e;for(;r.length>0;)e=r.shift()(e);return e},vt=r=>r!=null&&(typeof r[Symbol.asyncIterator]=="function"||typeof r[Symbol.iterator]=="function"||typeof r.next=="function"),Ve=r=>r!=null&&typeof r.sink=="function"&&vt(r.source),Hr=r=>e=>{let t=r.sink(e);if(t.then!=null){let n=V({objectMode:!0});return t.then(()=>{n.end()},s=>{n.end(s)}),ae(n,async function*(){yield*r.source,n.end()}())}return r.source};function St(r,...e){if(Ve(r)){let n=r;r=()=>n.source}else if(vt(r)){let n=r;r=()=>n}let t=[r,...e];if(t.length>1&&Ve(t[t.length-1])&&(t[t.length-1]=t[t.length-1].sink),t.length>2)for(let n=1;n<t.length-1;n++)Ve(t[n])&&(t[n]=Hr(t[n]));return qr(...t)}var nt=ge(xe(),1);var _e={};L(_e,{identity:()=>Xr});var Xr=Y({prefix:"\0",name:"identity",encode:r=>mt(r),decode:r=>pt(r)});var $e={};L($e,{base2:()=>Jr});var Jr=b({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var Ge={};L(Ge,{base8:()=>Wr});var Wr=b({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var je={};L(je,{base10:()=>Kr});var Kr=P({prefix:"9",name:"base10",alphabet:"0123456789"});var qe={};L(qe,{base16:()=>Qr,base16upper:()=>Zr});var Qr=b({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),Zr=b({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var He={};L(He,{base36:()=>Yr,base36upper:()=>en});var Yr=P({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),en=P({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var Xe={};L(Xe,{base256emoji:()=>sn});var Ut=Array.from("\u{1F680}\u{1FA90}\u2604\u{1F6F0}\u{1F30C}\u{1F311}\u{1F312}\u{1F313}\u{1F314}\u{1F315}\u{1F316}\u{1F317}\u{1F318}\u{1F30D}\u{1F30F}\u{1F30E}\u{1F409}\u2600\u{1F4BB}\u{1F5A5}\u{1F4BE}\u{1F4BF}\u{1F602}\u2764\u{1F60D}\u{1F923}\u{1F60A}\u{1F64F}\u{1F495}\u{1F62D}\u{1F618}\u{1F44D}\u{1F605}\u{1F44F}\u{1F601}\u{1F525}\u{1F970}\u{1F494}\u{1F496}\u{1F499}\u{1F622}\u{1F914}\u{1F606}\u{1F644}\u{1F4AA}\u{1F609}\u263A\u{1F44C}\u{1F917}\u{1F49C}\u{1F614}\u{1F60E}\u{1F607}\u{1F339}\u{1F926}\u{1F389}\u{1F49E}\u270C\u2728\u{1F937}\u{1F631}\u{1F60C}\u{1F338}\u{1F64C}\u{1F60B}\u{1F497}\u{1F49A}\u{1F60F}\u{1F49B}\u{1F642}\u{1F493}\u{1F929}\u{1F604}\u{1F600}\u{1F5A4}\u{1F603}\u{1F4AF}\u{1F648}\u{1F447}\u{1F3B6}\u{1F612}\u{1F92D}\u2763\u{1F61C}\u{1F48B}\u{1F440}\u{1F62A}\u{1F611}\u{1F4A5}\u{1F64B}\u{1F61E}\u{1F629}\u{1F621}\u{1F92A}\u{1F44A}\u{1F973}\u{1F625}\u{1F924}\u{1F449}\u{1F483}\u{1F633}\u270B\u{1F61A}\u{1F61D}\u{1F634}\u{1F31F}\u{1F62C}\u{1F643}\u{1F340}\u{1F337}\u{1F63B}\u{1F613}\u2B50\u2705\u{1F97A}\u{1F308}\u{1F608}\u{1F918}\u{1F4A6}\u2714\u{1F623}\u{1F3C3}\u{1F490}\u2639\u{1F38A}\u{1F498}\u{1F620}\u261D\u{1F615}\u{1F33A}\u{1F382}\u{1F33B}\u{1F610}\u{1F595}\u{1F49D}\u{1F64A}\u{1F639}\u{1F5E3}\u{1F4AB}\u{1F480}\u{1F451}\u{1F3B5}\u{1F91E}\u{1F61B}\u{1F534}\u{1F624}\u{1F33C}\u{1F62B}\u26BD\u{1F919}\u2615\u{1F3C6}\u{1F92B}\u{1F448}\u{1F62E}\u{1F646}\u{1F37B}\u{1F343}\u{1F436}\u{1F481}\u{1F632}\u{1F33F}\u{1F9E1}\u{1F381}\u26A1\u{1F31E}\u{1F388}\u274C\u270A\u{1F44B}\u{1F630}\u{1F928}\u{1F636}\u{1F91D}\u{1F6B6}\u{1F4B0}\u{1F353}\u{1F4A2}\u{1F91F}\u{1F641}\u{1F6A8}\u{1F4A8}\u{1F92C}\u2708\u{1F380}\u{1F37A}\u{1F913}\u{1F619}\u{1F49F}\u{1F331}\u{1F616}\u{1F476}\u{1F974}\u25B6\u27A1\u2753\u{1F48E}\u{1F4B8}\u2B07\u{1F628}\u{1F31A}\u{1F98B}\u{1F637}\u{1F57A}\u26A0\u{1F645}\u{1F61F}\u{1F635}\u{1F44E}\u{1F932}\u{1F920}\u{1F927}\u{1F4CC}\u{1F535}\u{1F485}\u{1F9D0}\u{1F43E}\u{1F352}\u{1F617}\u{1F911}\u{1F30A}\u{1F92F}\u{1F437}\u260E\u{1F4A7}\u{1F62F}\u{1F486}\u{1F446}\u{1F3A4}\u{1F647}\u{1F351}\u2744\u{1F334}\u{1F4A3}\u{1F438}\u{1F48C}\u{1F4CD}\u{1F940}\u{1F922}\u{1F445}\u{1F4A1}\u{1F4A9}\u{1F450}\u{1F4F8}\u{1F47B}\u{1F910}\u{1F92E}\u{1F3BC}\u{1F975}\u{1F6A9}\u{1F34E}\u{1F34A}\u{1F47C}\u{1F48D}\u{1F4E3}\u{1F942}"),tn=Ut.reduce((r,e,t)=>(r[t]=e,r),[]),rn=Ut.reduce((r,e,t)=>(r[e.codePointAt(0)]=t,r),[]);function nn(r){return r.reduce((e,t)=>(e+=tn[t],e),"")}function on(r){let e=[];for(let t of r){let n=rn[t.codePointAt(0)];if(n===void 0)throw new Error(`Non-base256emoji character: ${t}`);e.push(n)}return new Uint8Array(e)}var sn=Y({prefix:"\u{1F680}",name:"base256emoji",encode:nn,decode:on});var Qe={};L(Qe,{sha256:()=>vn,sha512:()=>Sn});var an=Ot,Ft=128,cn=127,fn=~cn,un=Math.pow(2,31);function Ot(r,e,t){e=e||[],t=t||0;for(var n=t;r>=un;)e[t++]=r&255|Ft,r/=128;for(;r&fn;)e[t++]=r&255|Ft,r>>>=7;return e[t]=r|0,Ot.bytes=t-n+1,e}var ln=Je,hn=128,Tt=127;function Je(r,n){var t=0,n=n||0,o=0,s=n,i,c=r.length;do{if(s>=c)throw Je.bytes=0,new RangeError("Could not decode varint");i=r[s++],t+=o<28?(i&Tt)<<o:(i&Tt)*Math.pow(2,o),o+=7}while(i>=hn);return Je.bytes=s-n,t}var dn=Math.pow(2,7),pn=Math.pow(2,14),mn=Math.pow(2,21),bn=Math.pow(2,28),gn=Math.pow(2,35),wn=Math.pow(2,42),yn=Math.pow(2,49),xn=Math.pow(2,56),Cn=Math.pow(2,63),An=function(r){return r<dn?1:r<pn?2:r<mn?3:r<bn?4:r<gn?5:r<wn?6:r<yn?7:r<xn?8:r<Cn?9:10},En={encode:an,decode:ln,encodingLength:An},Ln=En,ce=Ln;var fe=(r,e=0)=>[ce.decode(r,e),ce.decode.bytes],re=(r,e,t=0)=>(ce.encode(r,e,t),e),ne=r=>ce.encodingLength(r);var H=(r,e)=>{let t=e.byteLength,n=ne(r),o=n+ne(t),s=new Uint8Array(o+t);return re(r,s,0),re(t,s,n),s.set(e,o),new oe(r,t,e,s)},Nt=r=>{let e=M(r),[t,n]=fe(e),[o,s]=fe(e.subarray(n)),i=e.subarray(n+s);if(i.byteLength!==o)throw new Error("Incorrect length");return new oe(t,o,i,e)},Dt=(r,e)=>{if(r===e)return!0;{let t=e;return r.code===t.code&&r.size===t.size&&t.bytes instanceof Uint8Array&&dt(r.bytes,t.bytes)}},oe=class{constructor(e,t,n,o){this.code=e,this.size=t,this.digest=n,this.bytes=o}};var Ke=({name:r,code:e,encode:t})=>new We(r,e,t),We=class{constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){let t=this.encode(e);return t instanceof Uint8Array?H(this.code,t):t.then(n=>H(this.code,n))}else throw Error("Unknown type, must be binary type")}};var Rt=r=>async e=>new Uint8Array(await crypto.subtle.digest(r,e)),vn=Ke({name:"sha2-256",code:18,encode:Rt("SHA-256")}),Sn=Ke({name:"sha2-512",code:19,encode:Rt("SHA-512")});var Ze={};L(Ze,{identity:()=>Tn});var Mt=0,Un="identity",Bt=M,Fn=r=>H(Mt,Bt(r)),Tn={code:Mt,name:Un,encode:Bt,digest:Fn};var rs=new TextEncoder,ns=new TextDecoder;var Dn=(r,e)=>{let{bytes:t,version:n}=r;switch(n){case 0:return Rn(t,Ye(r),e||D.encoder);default:return Mn(t,Ye(r),e||z.encoder)}},It=new WeakMap,Ye=r=>{let e=It.get(r);if(e==null){let t=new Map;return It.set(r,t),t}return e},y=class{constructor(e,t,n,o){this.code=t,this.version=e,this.multihash=n,this.bytes=o,this["/"]=o}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{let{code:e,multihash:t}=this;if(e!==le)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==Bn)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return y.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{let{code:e,digest:t}=this.multihash,n=H(e,t);return y.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return y.equals(this,e)}static equals(e,t){let n=t;return n&&e.code===n.code&&e.version===n.version&&Dt(e.multihash,n.multihash)}toString(e){return Dn(this,e)}toJSON(){return{code:this.code,version:this.version,hash:this.multihash.bytes}}link(){return this}get[Symbol.toStringTag](){return"CID"}[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(e==null)return null;let t=e;if(t instanceof y)return t;if(t["/"]!=null&&t["/"]===t.bytes||t.asCID===t){let{version:n,code:o,multihash:s,bytes:i}=t;return new y(n,o,s,i||Pt(n,o,s.bytes))}else if(t[In]===!0){let{version:n,multihash:o,code:s}=t,i=Nt(o);return y.create(n,s,i)}else return null}static create(e,t,n){if(typeof t!="number")throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:{if(t!==le)throw new Error(`Version 0 CID must use dag-pb (code: ${le}) block encoding`);return new y(e,t,n,n.bytes)}case 1:{let o=Pt(e,t,n.bytes);return new y(e,t,n,o)}default:throw new Error("Invalid version")}}static createV0(e){return y.create(0,le,e)}static createV1(e,t){return y.create(1,e,t)}static decode(e){let[t,n]=y.decodeFirst(e);if(n.length)throw new Error("Incorrect length");return t}static decodeFirst(e){let t=y.inspectBytes(e),n=t.size-t.multihashSize,o=M(e.subarray(n,n+t.multihashSize));if(o.byteLength!==t.multihashSize)throw new Error("Incorrect length");let s=o.subarray(t.multihashSize-t.digestSize),i=new oe(t.multihashCode,t.digestSize,s,o);return[t.version===0?y.createV0(i):y.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0,n=()=>{let[f,h]=fe(e.subarray(t));return t+=h,f},o=n(),s=le;if(o===18?(o=0,t=0):s=n(),o!==0&&o!==1)throw new RangeError(`Invalid CID version ${o}`);let i=t,c=n(),l=n(),p=t+l,a=p-i;return{version:o,codec:s,multihashCode:c,digestSize:l,multihashSize:a,size:p}}static parse(e,t){let[n,o]=kn(e,t),s=y.decode(o);return Ye(s).set(n,e),s}},kn=(r,e)=>{switch(r[0]){case"Q":{let t=e||D;return[D.prefix,t.decode(`${D.prefix}${r}`)]}case D.prefix:{let t=e||D;return[D.prefix,t.decode(r)]}case z.prefix:{let t=e||z;return[z.prefix,t.decode(r)]}default:{if(e==null)throw Error("To parse non base32 or base58btc encoded CID multibase decoder must be provided");return[r[0],e.decode(r)]}}},Rn=(r,e,t)=>{let{prefix:n}=t;if(n!==D.prefix)throw Error(`Cannot string encode V0 in ${t.name} encoding`);let o=e.get(n);if(o==null){let s=t.encode(r).slice(1);return e.set(n,s),s}else return o},Mn=(r,e,t)=>{let{prefix:n}=t,o=e.get(n);if(o==null){let s=t.encode(r);return e.set(n,s),s}else return o},le=112,Bn=18,Pt=(r,e,t)=>{let n=ne(r),o=n+ne(e),s=new Uint8Array(o+t.byteLength);return re(r,s,0),re(e,s,n),s.set(t,o),s},In=Symbol.for("@ipld/js-cid/CID");var et={..._e,...$e,...Ge,...je,...qe,...Me,...He,...Re,...Ie,...Xe},ds={...Qe,...Ze};function Vt(r,e,t,n){return{name:r,prefix:e,encoder:{name:r,prefix:e,encode:t},decoder:{decode:n}}}var zt=Vt("utf8","u",r=>"u"+new TextDecoder("utf8").decode(r),r=>new TextEncoder().encode(r.substring(1))),tt=Vt("ascii","a",r=>{let e="a";for(let t=0;t<r.length;t++)e+=String.fromCharCode(r[t]);return e},r=>{r=r.substring(1);let e=I(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}),Pn={utf8:zt,"utf-8":zt,hex:et.base16,latin1:tt,ascii:tt,binary:tt,...et},Ue=Pn;function U(r,e="utf8"){let t=Ue[e];if(t==null)throw new Error(`Unsupported encoding "${e}"`);return(e==="utf8"||e==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?G(globalThis.Buffer.from(r,"utf-8")):t.decoder.decode(`${t.prefix}${r}`)}async function rt(r){for await(let e of r)return e}var he=class extends Error{constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function _t(r){if(r!=null){if(typeof r[Symbol.iterator]=="function")return r[Symbol.iterator]();if(typeof r[Symbol.asyncIterator]=="function")return r[Symbol.asyncIterator]();if(typeof r.next=="function")return r}throw new Error("argument is not an iterator or iterable")}function $t(r,e,t){let n=t??{},o=_t(r);async function*s(){let i,c=()=>{i?.()};for(e.addEventListener("abort",c);;){let l;try{if(e.aborted){let{abortMessage:a,abortCode:f}=n;throw new he(a,f)}let p=new Promise((a,f)=>{i=()=>{let{abortMessage:h,abortCode:A}=n;f(new he(h,A))}});l=await Promise.race([p,o.next()]),i=null}catch(p){e.removeEventListener("abort",c);let a=p.type==="aborted"&&e.aborted;if(a&&n.onAbort!=null&&await n.onAbort(r),typeof o.return=="function")try{let f=o.return();f instanceof Promise&&f.catch(h=>{n.onReturnError!=null&&n.onReturnError(h)})}catch(f){n.onReturnError!=null&&n.onReturnError(f)}if(a&&n.returnOnAbort===!0)return;throw p}if(l.done===!0)break;yield l.value}e.removeEventListener("abort",c)}return s()}function Gt(r,e="utf8"){let t=Ue[e];if(t==null)throw new Error(`Unsupported encoding "${e}"`);return(e==="utf8"||e==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?globalThis.Buffer.from(r.buffer,r.byteOffset,r.byteLength).toString("utf8"):t.encoder.encode(r).substring(1)}var Vn=ee("libp2p:mss"),jt=U(`
|
|
3
|
+
`);function X(r){let e=new w(r,jt);return Le.single(e)}function J(r,e,t={}){let n=X(e);t.writeBytes===!0?r.push(n.subarray()):r.push(n)}function qt(r,e,t={}){let n=new w;for(let o of e)n.append(X(o));t.writeBytes===!0?r.push(n.subarray()):r.push(n)}async function _n(r,e){let t=1,n={[Symbol.asyncIterator]:()=>n,next:async()=>await r.next(t)},o=n;e?.signal!=null&&(o=$t(n,e.signal));let i=await St(o,ie({onLength:c=>{t=c},maxDataLength:1024}),async c=>await rt(c));if(i==null||i.length===0)throw(0,nt.default)(new Error("no buffer returned"),"ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");if(i.get(i.byteLength-1)!==jt[0])throw Vn.error("Invalid mss message - missing newline - %s",i.subarray()),(0,nt.default)(new Error("missing newline"),"ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return i.sublist(0,-1)}async function _(r,e){let t=await _n(r,e);return Gt(t.subarray())}function Fe(r){let e=async function*(){let t=yield,n=new w;for await(let o of r){if(t==null){n.append(o),t=yield n,n=new w;continue}for(n.append(o);n.length>=t;){let s=n.sublist(0,t);if(n.consume(t),t=yield s,t==null){n.length>0&&(t=yield n,n=new w);break}}}if(t!=null)throw Object.assign(new Error(`stream ended before ${t} bytes became available`),{code:"ERR_UNDER_READ",buffer:n})}();return e.next(),e}function ot(){let r={};return r.promise=new Promise((e,t)=>{r.resolve=e,r.reject=t}),r}function Te(r){let e=V(),t=Fe(r.source),n=ot(),o,s=r.sink(async function*(){yield*e,yield*await n.promise}());return s.catch(c=>{o=c}),{reader:t,writer:e,stream:{sink:async c=>o!=null?await Promise.reject(o):(n.resolve(c),await s),source:t},rest:()=>e.end(),write:e.push,read:async()=>{let c=await t.next();if(c.value!=null)return c.value}}}var de=ee("libp2p:mss:select");async function Xt(r,e,t={}){e=Array.isArray(e)?[...e]:[e];let{reader:n,writer:o,rest:s,stream:i}=Te(r),c=e.shift();if(c==null)throw new Error("At least one protocol must be specified");de('select: write ["%s", "%s"]',N,c);let l=U(N),p=U(c);qt(o,[l,p],t);let a=await _(n,t);if(de('select: read "%s"',a),a===N&&(a=await _(n,t),de('select: read "%s"',a)),a===c)return s(),{stream:i,protocol:c};for(let f of e){de('select: write "%s"',f),J(o,U(f),t);let h=await _(n,t);if(de('select: read "%s" for "%s"',h,f),h===f)return s(),{stream:i,protocol:f}}throw s(),(0,st.default)(new Error("protocol selection failed"),"ERR_UNSUPPORTED_PROTOCOL")}function Jt(r,e){let t=V(),n=!1;return{stream:{sink:async o=>await r.sink(async function*(){let s=!0;for await(let i of ae(o,t))if(s){s=!1,n=!0,t.end();let c=U(N),l=U(e),p=new w(X(c),X(l));i.length>0&&p.append(i),yield*p}else yield i}()),source:async function*(){n||t.push(new Uint8Array);let o=Fe(r.source),s=await _(o);if(s===N&&(s=await _(o)),s!==e)throw(0,st.default)(new Error("protocol selection failed"),"ERR_UNSUPPORTED_PROTOCOL");for await(let i of o)yield*i}()},protocol:e}}var pe=ee("libp2p:mss:handle");async function Wt(r,e,t){e=Array.isArray(e)?e:[e];let{writer:n,reader:o,rest:s,stream:i}=Te(r);for(;;){let c=await _(o,t);if(pe('read "%s"',c),c===N){pe('respond with "%s" for "%s"',N,c),J(n,U(N),t);continue}if(e.includes(c))return J(n,U(c),t),pe('respond with "%s" for "%s"',c,c),s(),{stream:i,protocol:c};if(c==="ls"){J(n,new w(...e.map(l=>X(U(l)))),t),pe('respond with "%s" for %s',e,c);continue}J(n,U("na"),t),pe('respond with "na" for "%s"',c)}}return tr($n);})();
|
|
4
|
+
return Libp2PMultistreamSelect}));
|
package/dist/src/constants.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,WAAW,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,WAAW,uBAAuB,CAAA;AAI/C,eAAO,MAAM,mBAAmB,OAAO,CAAA"}
|
package/dist/src/constants.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAA;AAE/C,0BAA0B;AAC1B,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA"}
|
package/dist/src/handle.d.ts
CHANGED
|
@@ -1,6 +1,52 @@
|
|
|
1
1
|
import { Uint8ArrayList } from 'uint8arraylist';
|
|
2
2
|
import type { Duplex } from 'it-stream-types';
|
|
3
3
|
import type { ByteArrayInit, ByteListInit, ProtocolStream } from './index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Handle multistream protocol selections for the given list of protocols.
|
|
6
|
+
*
|
|
7
|
+
* Note that after a protocol is handled `listener` can no longer be used.
|
|
8
|
+
*
|
|
9
|
+
* @param stream - A duplex iterable stream to listen on
|
|
10
|
+
* @param protocols - A list of protocols (or single protocol) that this listener is able to speak.
|
|
11
|
+
* @param options - an options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
|
|
12
|
+
* @returns A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`
|
|
13
|
+
* @example
|
|
14
|
+
*
|
|
15
|
+
* ```js
|
|
16
|
+
* import { pipe } from 'it-pipe'
|
|
17
|
+
* import * as mss from '@libp2p/multistream-select'
|
|
18
|
+
* import { Mplex } from '@libp2p/mplex'
|
|
19
|
+
*
|
|
20
|
+
* const muxer = new Mplex({
|
|
21
|
+
* async onStream (muxedStream) {
|
|
22
|
+
* // mss.handle(handledProtocols)
|
|
23
|
+
* // Returns selected stream and protocol
|
|
24
|
+
* const { stream, protocol } = await mss.handle(muxedStream, [
|
|
25
|
+
* '/ipfs-dht/1.0.0',
|
|
26
|
+
* '/ipfs-bitswap/1.0.0'
|
|
27
|
+
* ])
|
|
28
|
+
*
|
|
29
|
+
* // Typically here we'd call the handler function that was registered in
|
|
30
|
+
* // libp2p for the given protocol:
|
|
31
|
+
* // e.g. handlers[protocol].handler(stream)
|
|
32
|
+
* //
|
|
33
|
+
* // If protocol was /ipfs-dht/1.0.0 it might do something like this:
|
|
34
|
+
* // try {
|
|
35
|
+
* // await pipe(
|
|
36
|
+
* // dhtStream,
|
|
37
|
+
* // source => (async function * () {
|
|
38
|
+
* // for await (const chunk of source)
|
|
39
|
+
* // // Incoming DHT data -> process and yield to respond
|
|
40
|
+
* // })(),
|
|
41
|
+
* // dhtStream
|
|
42
|
+
* // )
|
|
43
|
+
* // } catch (err) {
|
|
44
|
+
* // // Error in stream
|
|
45
|
+
* // }
|
|
46
|
+
* }
|
|
47
|
+
* })
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
4
50
|
export declare function handle(stream: Duplex<Uint8Array>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>;
|
|
5
51
|
export declare function handle(stream: Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>;
|
|
6
52
|
//# sourceMappingURL=handle.d.ts.map
|
package/dist/src/handle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAyB,cAAc,EAAE,MAAM,YAAY,CAAA;AAIpG,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;AACpJ,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAyB,cAAc,EAAE,MAAM,YAAY,CAAA;AAIpG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;AACpJ,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAA"}
|
package/dist/src/handle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAA;AAkDvC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAE,MAAmB,EAAE,SAA4B,EAAE,OAA+B;IAC9G,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvE,OAAO,IAAI,EAAE;QACX,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9D,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAE1B,IAAI,QAAQ,KAAK,WAAW,EAAE;YAC5B,GAAG,CAAC,4BAA4B,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;YACxD,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;YACrE,SAAQ;SACT;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAChC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;YAClE,GAAG,CAAC,4BAA4B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACrD,IAAI,EAAE,CAAA;YACN,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;SACzC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,+FAA+F;YAC/F,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,cAAc,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC1H,4EAA4E;YAC5E,GAAG,CAAC,0BAA0B,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YACpD,SAAQ;SACT;QAED,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QAC9D,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;KAC5C;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multistream.d.ts","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAQ/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAA;
|
|
1
|
+
{"version":3,"file":"multistream.d.ts","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAQ/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAA;AAQ9C,wBAAgB,MAAM,CAAE,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,cAAc,CAI3E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,cAAc,EAAE,OAAO,GAAE,qBAA0B,QAQrH;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,GAAE,qBAA0B,QAY1G;AAED,wBAAsB,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC3F;AAED,wBAAsB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,mBAIvE"}
|
package/dist/src/multistream.js
CHANGED
|
@@ -6,6 +6,9 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
|
6
6
|
import first from 'it-first';
|
|
7
7
|
import { abortableSource } from 'abortable-iterator';
|
|
8
8
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
9
|
+
import { MAX_PROTOCOL_LENGTH } from './constants.js';
|
|
10
|
+
import { logger } from '@libp2p/logger';
|
|
11
|
+
const log = logger('libp2p:mss');
|
|
9
12
|
const NewLine = uint8ArrayFromString('\n');
|
|
10
13
|
export function encode(buffer) {
|
|
11
14
|
const list = new Uint8ArrayList(buffer, NewLine);
|
|
@@ -54,11 +57,12 @@ export async function read(reader, options) {
|
|
|
54
57
|
const onLength = (l) => {
|
|
55
58
|
byteLength = l;
|
|
56
59
|
};
|
|
57
|
-
const buf = await pipe(input, lp.decode({ onLength }), async (source) => await first(source));
|
|
58
|
-
if (buf == null) {
|
|
60
|
+
const buf = await pipe(input, lp.decode({ onLength, maxDataLength: MAX_PROTOCOL_LENGTH }), async (source) => await first(source));
|
|
61
|
+
if (buf == null || buf.length === 0) {
|
|
59
62
|
throw errCode(new Error('no buffer returned'), 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE');
|
|
60
63
|
}
|
|
61
64
|
if (buf.get(buf.byteLength - 1) !== NewLine[0]) {
|
|
65
|
+
log.error('Invalid mss message - missing newline - %s', buf.subarray());
|
|
62
66
|
throw errCode(new Error('missing newline'), 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE');
|
|
63
67
|
}
|
|
64
68
|
return buf.sublist(0, -1); // Remove newline
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multistream.js","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"multistream.js","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"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"}
|
package/dist/src/select.d.ts
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
import type { Duplex } from 'it-stream-types';
|
|
2
2
|
import { Uint8ArrayList } from 'uint8arraylist';
|
|
3
3
|
import type { ByteArrayInit, ByteListInit, ProtocolStream } from './index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Negotiate a protocol to use from a list of protocols.
|
|
6
|
+
*
|
|
7
|
+
* @param stream - A duplex iterable stream to dial on
|
|
8
|
+
* @param protocols - A list of protocols (or single protocol) to negotiate with. Protocols are attempted in order until a match is made.
|
|
9
|
+
* @param options - An options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
|
|
10
|
+
* @returns A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`.
|
|
11
|
+
* @example
|
|
12
|
+
*
|
|
13
|
+
* ```js
|
|
14
|
+
* import { pipe } from 'it-pipe'
|
|
15
|
+
* import * as mss from '@libp2p/multistream-select'
|
|
16
|
+
* import { Mplex } from '@libp2p/mplex'
|
|
17
|
+
*
|
|
18
|
+
* const muxer = new Mplex()
|
|
19
|
+
* const muxedStream = muxer.newStream()
|
|
20
|
+
*
|
|
21
|
+
* // mss.select(protocol(s))
|
|
22
|
+
* // Select from one of the passed protocols (in priority order)
|
|
23
|
+
* // Returns selected stream and protocol
|
|
24
|
+
* const { stream: dhtStream, protocol } = await mss.select(muxedStream, [
|
|
25
|
+
* // This might just be different versions of DHT, but could be different impls
|
|
26
|
+
* '/ipfs-dht/2.0.0', // Most of the time this will probably just be one item.
|
|
27
|
+
* '/ipfs-dht/1.0.0'
|
|
28
|
+
* ])
|
|
29
|
+
*
|
|
30
|
+
* // Typically this stream will be passed back to the caller of libp2p.dialProtocol
|
|
31
|
+
* //
|
|
32
|
+
* // ...it might then do something like this:
|
|
33
|
+
* // try {
|
|
34
|
+
* // await pipe(
|
|
35
|
+
* // [uint8ArrayFromString('Some DHT data')]
|
|
36
|
+
* // dhtStream,
|
|
37
|
+
* // async source => {
|
|
38
|
+
* // for await (const chunk of source)
|
|
39
|
+
* // // DHT response data
|
|
40
|
+
* // }
|
|
41
|
+
* // )
|
|
42
|
+
* // } catch (err) {
|
|
43
|
+
* // // Error in stream
|
|
44
|
+
* // }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
4
47
|
export declare function select(stream: Duplex<Uint8Array>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>;
|
|
5
48
|
export declare function select(stream: Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>;
|
|
6
49
|
/**
|
package/dist/src/select.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAyB,cAAc,EAAE,MAAM,YAAY,CAAA;AAIpG,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;AACpJ,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAA;AAgDtN;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AACrG,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAyB,cAAc,EAAE,MAAM,YAAY,CAAA;AAIpG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;AACpJ,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAA;AAgDtN;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AACrG,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAA"}
|
package/dist/src/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAGlC,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"ByteArrayInit": "https://libp2p.github.io/js-libp2p-multistream-select/interfaces/ByteArrayInit.html",
|
|
3
|
+
"ByteListInit": "https://libp2p.github.io/js-libp2p-multistream-select/interfaces/ByteListInit.html",
|
|
4
|
+
"MultistreamSelectInit": "https://libp2p.github.io/js-libp2p-multistream-select/interfaces/MultistreamSelectInit.html",
|
|
5
|
+
"ProtocolStream": "https://libp2p.github.io/js-libp2p-multistream-select/interfaces/ProtocolStream.html",
|
|
6
|
+
"PROTOCOL_ID": "https://libp2p.github.io/js-libp2p-multistream-select/variables/PROTOCOL_ID.html",
|
|
7
|
+
"handle": "https://libp2p.github.io/js-libp2p-multistream-select/functions/handle.html",
|
|
8
|
+
"lazySelect": "https://libp2p.github.io/js-libp2p-multistream-select/functions/lazySelect.html",
|
|
9
|
+
"select": "https://libp2p.github.io/js-libp2p-multistream-select/functions/select.html"
|
|
10
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/multistream-select",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.2",
|
|
4
4
|
"description": "JavaScript implementation of multistream-select",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p-multistream-select#readme",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"types": "./dist/src/index.d.ts",
|
|
27
27
|
"files": [
|
|
28
28
|
"src",
|
|
29
|
-
"dist
|
|
29
|
+
"dist",
|
|
30
30
|
"!dist/test",
|
|
31
31
|
"!**/*.tsbuildinfo"
|
|
32
32
|
],
|
|
@@ -139,19 +139,20 @@
|
|
|
139
139
|
"test:firefox-webworker": "aegir test -t webworker -- --browser firefox",
|
|
140
140
|
"test:node": "aegir test -t node --cov",
|
|
141
141
|
"test:electron-main": "aegir test -t electron-main",
|
|
142
|
-
"release": "aegir release"
|
|
142
|
+
"release": "aegir release",
|
|
143
|
+
"docs": "aegir docs"
|
|
143
144
|
},
|
|
144
145
|
"dependencies": {
|
|
145
146
|
"@libp2p/interfaces": "^3.0.2",
|
|
146
147
|
"@libp2p/logger": "^2.0.0",
|
|
147
148
|
"abortable-iterator": "^4.0.2",
|
|
148
149
|
"err-code": "^3.0.1",
|
|
149
|
-
"it-first": "^
|
|
150
|
-
"it-handshake": "^4.
|
|
151
|
-
"it-length-prefixed": "^8.0.
|
|
152
|
-
"it-merge": "^
|
|
153
|
-
"it-pipe": "^2.0.
|
|
154
|
-
"it-pushable": "^3.
|
|
150
|
+
"it-first": "^2.0.0",
|
|
151
|
+
"it-handshake": "^4.1.2",
|
|
152
|
+
"it-length-prefixed": "^8.0.3",
|
|
153
|
+
"it-merge": "^2.0.0",
|
|
154
|
+
"it-pipe": "^2.0.4",
|
|
155
|
+
"it-pushable": "^3.1.0",
|
|
155
156
|
"it-reader": "^6.0.1",
|
|
156
157
|
"it-stream-types": "^1.0.4",
|
|
157
158
|
"p-defer": "^4.0.0",
|
|
@@ -162,9 +163,9 @@
|
|
|
162
163
|
"@types/varint": "^6.0.0",
|
|
163
164
|
"aegir": "^37.2.0",
|
|
164
165
|
"iso-random-stream": "^2.0.2",
|
|
165
|
-
"it-all": "^
|
|
166
|
-
"it-map": "^
|
|
167
|
-
"it-pair": "^2.0.
|
|
166
|
+
"it-all": "^2.0.0",
|
|
167
|
+
"it-map": "^2.0.0",
|
|
168
|
+
"it-pair": "^2.0.3",
|
|
168
169
|
"p-timeout": "^6.0.0",
|
|
169
170
|
"timeout-abort-controller": "^3.0.0",
|
|
170
171
|
"util": "^0.12.4",
|
package/src/constants.ts
CHANGED
package/src/handle.ts
CHANGED
|
@@ -9,6 +9,52 @@ import type { ByteArrayInit, ByteListInit, MultistreamSelectInit, ProtocolStream
|
|
|
9
9
|
|
|
10
10
|
const log = logger('libp2p:mss:handle')
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Handle multistream protocol selections for the given list of protocols.
|
|
14
|
+
*
|
|
15
|
+
* Note that after a protocol is handled `listener` can no longer be used.
|
|
16
|
+
*
|
|
17
|
+
* @param stream - A duplex iterable stream to listen on
|
|
18
|
+
* @param protocols - A list of protocols (or single protocol) that this listener is able to speak.
|
|
19
|
+
* @param options - an options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
|
|
20
|
+
* @returns A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`
|
|
21
|
+
* @example
|
|
22
|
+
*
|
|
23
|
+
* ```js
|
|
24
|
+
* import { pipe } from 'it-pipe'
|
|
25
|
+
* import * as mss from '@libp2p/multistream-select'
|
|
26
|
+
* import { Mplex } from '@libp2p/mplex'
|
|
27
|
+
*
|
|
28
|
+
* const muxer = new Mplex({
|
|
29
|
+
* async onStream (muxedStream) {
|
|
30
|
+
* // mss.handle(handledProtocols)
|
|
31
|
+
* // Returns selected stream and protocol
|
|
32
|
+
* const { stream, protocol } = await mss.handle(muxedStream, [
|
|
33
|
+
* '/ipfs-dht/1.0.0',
|
|
34
|
+
* '/ipfs-bitswap/1.0.0'
|
|
35
|
+
* ])
|
|
36
|
+
*
|
|
37
|
+
* // Typically here we'd call the handler function that was registered in
|
|
38
|
+
* // libp2p for the given protocol:
|
|
39
|
+
* // e.g. handlers[protocol].handler(stream)
|
|
40
|
+
* //
|
|
41
|
+
* // If protocol was /ipfs-dht/1.0.0 it might do something like this:
|
|
42
|
+
* // try {
|
|
43
|
+
* // await pipe(
|
|
44
|
+
* // dhtStream,
|
|
45
|
+
* // source => (async function * () {
|
|
46
|
+
* // for await (const chunk of source)
|
|
47
|
+
* // // Incoming DHT data -> process and yield to respond
|
|
48
|
+
* // })(),
|
|
49
|
+
* // dhtStream
|
|
50
|
+
* // )
|
|
51
|
+
* // } catch (err) {
|
|
52
|
+
* // // Error in stream
|
|
53
|
+
* // }
|
|
54
|
+
* }
|
|
55
|
+
* })
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
12
58
|
export async function handle (stream: Duplex<Uint8Array>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>
|
|
13
59
|
export async function handle (stream: Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>
|
|
14
60
|
export async function handle (stream: Duplex<any>, protocols: string | string[], options?: MultistreamSelectInit): Promise<ProtocolStream<any>> {
|
package/src/multistream.ts
CHANGED
|
@@ -12,6 +12,10 @@ import type { AbortOptions } from '@libp2p/interfaces'
|
|
|
12
12
|
import type { Source } from 'it-stream-types'
|
|
13
13
|
import type { Reader } from 'it-reader'
|
|
14
14
|
import type { MultistreamSelectInit } from '.'
|
|
15
|
+
import { MAX_PROTOCOL_LENGTH } from './constants.js'
|
|
16
|
+
import { logger } from '@libp2p/logger'
|
|
17
|
+
|
|
18
|
+
const log = logger('libp2p:mss')
|
|
15
19
|
|
|
16
20
|
const NewLine = uint8ArrayFromString('\n')
|
|
17
21
|
|
|
@@ -73,15 +77,16 @@ export async function read (reader: Reader, options?: AbortOptions): Promise<Uin
|
|
|
73
77
|
|
|
74
78
|
const buf = await pipe(
|
|
75
79
|
input,
|
|
76
|
-
lp.decode({ onLength }),
|
|
80
|
+
lp.decode({ onLength, maxDataLength: MAX_PROTOCOL_LENGTH }),
|
|
77
81
|
async (source) => await first(source)
|
|
78
82
|
)
|
|
79
83
|
|
|
80
|
-
if (buf == null) {
|
|
84
|
+
if (buf == null || buf.length === 0) {
|
|
81
85
|
throw errCode(new Error('no buffer returned'), 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE')
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
if (buf.get(buf.byteLength - 1) !== NewLine[0]) {
|
|
89
|
+
log.error('Invalid mss message - missing newline - %s', buf.subarray())
|
|
85
90
|
throw errCode(new Error('missing newline'), 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE')
|
|
86
91
|
}
|
|
87
92
|
|
package/src/select.ts
CHANGED
|
@@ -13,6 +13,49 @@ import type { ByteArrayInit, ByteListInit, MultistreamSelectInit, ProtocolStream
|
|
|
13
13
|
|
|
14
14
|
const log = logger('libp2p:mss:select')
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Negotiate a protocol to use from a list of protocols.
|
|
18
|
+
*
|
|
19
|
+
* @param stream - A duplex iterable stream to dial on
|
|
20
|
+
* @param protocols - A list of protocols (or single protocol) to negotiate with. Protocols are attempted in order until a match is made.
|
|
21
|
+
* @param options - An options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
|
|
22
|
+
* @returns A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`.
|
|
23
|
+
* @example
|
|
24
|
+
*
|
|
25
|
+
* ```js
|
|
26
|
+
* import { pipe } from 'it-pipe'
|
|
27
|
+
* import * as mss from '@libp2p/multistream-select'
|
|
28
|
+
* import { Mplex } from '@libp2p/mplex'
|
|
29
|
+
*
|
|
30
|
+
* const muxer = new Mplex()
|
|
31
|
+
* const muxedStream = muxer.newStream()
|
|
32
|
+
*
|
|
33
|
+
* // mss.select(protocol(s))
|
|
34
|
+
* // Select from one of the passed protocols (in priority order)
|
|
35
|
+
* // Returns selected stream and protocol
|
|
36
|
+
* const { stream: dhtStream, protocol } = await mss.select(muxedStream, [
|
|
37
|
+
* // This might just be different versions of DHT, but could be different impls
|
|
38
|
+
* '/ipfs-dht/2.0.0', // Most of the time this will probably just be one item.
|
|
39
|
+
* '/ipfs-dht/1.0.0'
|
|
40
|
+
* ])
|
|
41
|
+
*
|
|
42
|
+
* // Typically this stream will be passed back to the caller of libp2p.dialProtocol
|
|
43
|
+
* //
|
|
44
|
+
* // ...it might then do something like this:
|
|
45
|
+
* // try {
|
|
46
|
+
* // await pipe(
|
|
47
|
+
* // [uint8ArrayFromString('Some DHT data')]
|
|
48
|
+
* // dhtStream,
|
|
49
|
+
* // async source => {
|
|
50
|
+
* // for await (const chunk of source)
|
|
51
|
+
* // // DHT response data
|
|
52
|
+
* // }
|
|
53
|
+
* // )
|
|
54
|
+
* // } catch (err) {
|
|
55
|
+
* // // Error in stream
|
|
56
|
+
* // }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
16
59
|
export async function select (stream: Duplex<Uint8Array>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>
|
|
17
60
|
export async function select (stream: Duplex<Uint8ArrayList, Uint8ArrayList | Uint8Array>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>
|
|
18
61
|
export async function select (stream: Duplex<any>, protocols: string | string[], options: MultistreamSelectInit = {}): Promise<ProtocolStream<any>> {
|