@libp2p/multistream-select 3.1.1 → 3.1.3
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/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 -3
- 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 +3 -3
- package/dist/src/select.js.map +1 -1
- package/dist/typedoc-urls.json +10 -0
- package/package.json +13 -13
- package/src/handle.ts +46 -0
- package/src/multistream.ts +7 -3
- package/src/select.ts +46 -3
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 Qt=Object.create;var me=Object.defineProperty;var Zt=Object.getOwnPropertyDescriptor;var Yt=Object.getOwnPropertyNames;var er=Object.getPrototypeOf,tr=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})},nt=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Yt(e))!tr.call(r,o)&&o!==t&&me(r,o,{get:()=>e[o],enumerable:!(n=Zt(e,o))||n.enumerable});return r};var ot=(r,e,t)=>(t=r!=null?Qt(er(r)):{},nt(e||!r||!r.__esModule?me(t,"default",{value:r,enumerable:!0}):t,r)),rr=r=>nt(me({},"__esModule",{value:!0}),r);var it=be((Xn,st)=>{var Q=1e3,Z=Q*60,Y=Z*60,G=Y*24,nr=G*7,or=G*365.25;st.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return sr(r);if(t==="number"&&isFinite(r))return e.long?ar(r):ir(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function sr(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*or;case"weeks":case"week":case"w":return t*nr;case"days":case"day":case"d":return t*G;case"hours":case"hour":case"hrs":case"hr":case"h":return t*Y;case"minutes":case"minute":case"mins":case"min":case"m":return t*Z;case"seconds":case"second":case"secs":case"sec":case"s":return t*Q;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function ir(r){var e=Math.abs(r);return e>=G?Math.round(r/G)+"d":e>=Y?Math.round(r/Y)+"h":e>=Z?Math.round(r/Z)+"m":e>=Q?Math.round(r/Q)+"s":r+"ms"}function ar(r){var e=Math.abs(r);return e>=G?ge(r,e,G,"day"):e>=Y?ge(r,e,Y,"hour"):e>=Z?ge(r,e,Z,"minute"):e>=Q?ge(r,e,Q,"second"):r+" ms"}function ge(r,e,t,n){var o=e>=t*1.5;return Math.round(r/t)+" "+n+(o?"s":"")}});var ct=be((Wn,at)=>{function cr(r){t.debug=t,t.default=t,t.coerce=l,t.disable=s,t.enable=o,t.enabled=i,t.humanize=it(),t.destroy=p,Object.keys(r).forEach(a=>{t[a]=r[a]}),t.names=[],t.skips=[],t.formatters={};function e(a){let u=0;for(let h=0;h<a.length;h++)u=(u<<5)-u+a.charCodeAt(h),u|=0;return t.colors[Math.abs(u)%t.colors.length]}t.selectColor=e;function t(a){let u,h=null,A,d;function f(...m){if(!f.enabled)return;let g=f,x=Number(new Date),F=x-(u||x);g.diff=F,g.prev=u,g.curr=x,u=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 K=m[C];T=O.call(g,K),m.splice(C,1),C--}return T}),t.formatArgs.call(g,m),(g.log||t.log).apply(g,m)}return f.namespace=a,f.useColors=t.useColors(),f.color=t.selectColor(a),f.extend=n,f.destroy=t.destroy,Object.defineProperty(f,"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(f),f}function n(a,u){let h=t(this.namespace+(typeof u>"u"?":":u)+a);return h.log=this.log,h}function o(a){t.save(a),t.namespaces=a,t.names=[],t.skips=[];let u,h=(typeof a=="string"?a:"").split(/[\s,]+/),A=h.length;for(u=0;u<A;u++)h[u]&&(a=h[u].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(u=>"-"+u)].join(",");return t.enable(""),a}function i(a){if(a[a.length-1]==="*")return!0;let u,h;for(u=0,h=t.skips.length;u<h;u++)if(t.skips[u].test(a))return!1;for(u=0,h=t.names.length;u<h;u++)if(t.names[u].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}at.exports=cr});var ut=be((v,we)=>{v.formatArgs=fr;v.save=lr;v.load=hr;v.useColors=ur;v.storage=dr();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 ur(){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 ":" ")+"+"+we.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 lr(r){try{r?v.storage.setItem("debug",r):v.storage.removeItem("debug")}catch{}}function hr(){let r;try{r=v.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function dr(){try{return localStorage}catch{}}we.exports=ct()(v);var{formatters:pr}=we.exports;pr.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var Et=be((Do,At)=>{"use strict";function Ct(r,e){for(let t in e)Object.defineProperty(r,t,{value:e[t],enumerable:!0,configurable:!0});return r}function $r(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 Ct(r,t)}catch{t.message=r.message,t.stack=r.stack;let o=function(){};return o.prototype=Object.create(Object.getPrototypeOf(r)),Ct(new o,t)}}At.exports=$r});var qn={};L(qn,{PROTOCOL_ID:()=>N,handle:()=>Kt,lazySelect:()=>Wt,select:()=>Xt});var N="/multistream/1.0.0";var R=ot(ut(),1);var De={};L(De,{base58btc:()=>D,base58flickr:()=>xr});function mr(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 u(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 f=0,m=0,g=0,x=d.length;g!==x&&d[g]===0;)g++,f++;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 K=l.repeat(f);O<F;++O)K+=r.charAt(C[O]);return K}function h(d){if(typeof d!="string")throw new TypeError("Expected String");if(d.length===0)return new Uint8Array;var f=0;if(d[f]!==" "){for(var m=0,g=0;d[f]===l;)m++,f++;for(var x=(d.length-f)*p+1>>>0,F=new Uint8Array(x);d[f];){var C=t[d.charCodeAt(f)];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,f++}if(d[f]!==" "){for(var E=x-g;E!==x&&F[E]===0;)E++;for(var O=new Uint8Array(m+(x-E)),K=m;E!==x;)O[K++]=F[E++];return O}}}function A(d){var f=h(d);if(f)return f;throw new Error(`Non-${e} character`)}return{encode:u,decodeUnsafe:h,decode:A}}var br=mr,gr=br,ft=gr;var Qn=new Uint8Array(0);var lt=(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},I=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 ht=r=>new TextEncoder().encode(r),dt=r=>new TextDecoder().decode(r);var Fe=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")}},Te=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 mt(this,e)}},Oe=class{constructor(e){this.decoders=e}or(e){return mt(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`)}},mt=(r,e)=>new Oe({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),Ne=class{constructor(e,t,n,o){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=o,this.encoder=new Fe(e,t,n),this.decoder=new Te(e,t,o)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},ee=({name:r,prefix:e,encode:t,decode:n})=>new Ne(r,e,t,n),z=({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:o}=ft(t,e);return ee({prefix:r,name:e,encode:n,decode:s=>I(o(s))})},wr=(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 u=o[r[a]];if(u===void 0)throw new SyntaxError(`Non-${n} character`);l=l<<t|u,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},yr=(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})=>ee({prefix:e,name:r,encode(o){return yr(o,n,t)},decode(o){return wr(o,n,t,r)}});var D=z({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),xr=z({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Re={};L(Re,{base32:()=>V,base32hex:()=>Lr,base32hexpad:()=>Sr,base32hexpadupper:()=>Ur,base32hexupper:()=>vr,base32pad:()=>Ar,base32padupper:()=>Er,base32upper:()=>Cr,base32z:()=>Fr});var V=b({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),Cr=b({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),Ar=b({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),Er=b({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),Lr=b({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),vr=b({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),Sr=b({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),Ur=b({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Fr=b({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Me={};L(Me,{base64:()=>ke,base64pad:()=>Tr,base64url:()=>Or,base64urlpad:()=>Nr});var ke=b({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Tr=b({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Or=b({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Nr=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":V.baseEncode(r);R.default.formatters.m=r=>r==null?"undefined":ke.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 Dr(r){let e=()=>{};return e.enabled=!1,e.color="",e.diff=0,e.log=()=>{},e.namespace=r,e.destroy=()=>!0,e.extend=()=>e,e}function te(r){let e=Dr(`${r}:trace`);return R.default.enabled(`${r}:trace`)&&R.default.names.map(t=>t.toString()).find(t=>t.includes(":trace"))!=null&&(e=(0,R.default)(`${r}:trace`)),Object.assign((0,R.default)(r),{error:(0,R.default)(`${r}:error`),trace:e})}var _=class extends Error{constructor(e,t,n){super(e),this.code=t,this.name=n?.name??"CodeError",this.props=n??{}}};function j(r){return globalThis.Buffer!=null?new Uint8Array(r.buffer,r.byteOffset,r.byteLength):r}function B(r=0){return globalThis.Buffer?.alloc!=null?j(globalThis.Buffer.alloc(r)):new Uint8Array(r)}function P(r=0){return globalThis.Buffer?.allocUnsafe!=null?j(globalThis.Buffer.allocUnsafe(r)):new Uint8Array(r)}function Ie(r,e){e==null&&(e=r.reduce((o,s)=>o+s.length,0));let t=P(e),n=0;for(let o of r)t.set(o,n),n+=o.length;return j(t)}function bt(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 wt=Symbol.for("@achingbrain/uint8arraylist");function gt(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 ye(r){return Boolean(r?.[wt])}var w=class{constructor(...e){Object.defineProperty(this,wt,{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(ye(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(ye(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=gt(this.bufs,e);return t.buf[t.index]}set(e,t){let n=gt(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(ye(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 Ie(n,o)}subarray(e,t){let{bufs:n,length:o}=this._subList(e,t);return n.length===1?n[0]:Ie(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 u=e-c;n.push(i.subarray(u,u+(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(!ye(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 u=0;u<s;u++)i[u]=-1;for(let u=0;u<o;u++)i[n[u]]=u;let c=i,l=this.byteLength-n.byteLength,p=n.byteLength-1,a;for(let u=t;u<=l;u+=a){a=0;for(let h=p;h>=0;h--){let A=this.get(u+h);if(n[h]!==A){a=Math.max(1,h-c[A]);break}}if(a===0)return u}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=P(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=P(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(!bt(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 xe(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 yt=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=xe(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>yt&&(o=0,++n>yt&&(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=xe(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 Rr=Math.pow(2,7),kr=Math.pow(2,14),Mr=Math.pow(2,21),Ir=Math.pow(2,28),Br=Math.pow(2,35),Pr=Math.pow(2,42),zr=Math.pow(2,49),Vr=Math.pow(2,56),_r=Math.pow(2,63),q={encodingLength(r){return r<Rr?1:r<kr?2:r<Mr?3:r<Ir?4:r<Br?5:r<Pr?6:r<zr?7:r<Vr?8:r<_r?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=P(q.encodingLength(r))),S.fromNumber(r).toBytes(e,t),e},decode(r,e=0){return S.fromBytes(r,e).toNumber(!0)}};function xt(r){return globalThis?.Buffer?.allocUnsafe!=null?globalThis.Buffer.allocUnsafe(r):new Uint8Array(r)}var Ce=r=>{let e=q.encodingLength(r),t=xt(e);return q.encode(r,t),Ce.bytes=e,t};Ce.bytes=0;function Ae(r){r=r??{};let e=r.lengthEncoder??Ce;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}}}Ae.single=(r,e)=>{e=e??{};let t=e.lengthEncoder??Ce;return new w(t(r.byteLength),r)};var ie=ot(Et(),1),Gr=8,jr=1024*1024*4,H;(function(r){r[r.LENGTH=0]="LENGTH",r[r.DATA=1]="DATA"})(H||(H={}));var Be=r=>{let e=q.decode(r);return Be.bytes=q.encodingLength(e),e};Be.bytes=0;function ae(r){return async function*(t){let n=new w,o=H.LENGTH,s=-1,i=r?.lengthDecoder??Be,c=r?.maxLengthLength??Gr,l=r?.maxDataLength??jr;for await(let p of t)for(n.append(p);n.byteLength>0;){if(o===H.LENGTH)try{if(s=i(n),s<0)throw(0,ie.default)(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(s>l)throw(0,ie.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=H.DATA}catch(a){if(a instanceof RangeError){if(n.byteLength>c)throw(0,ie.default)(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw a}if(o===H.DATA){if(n.byteLength<s)break;let a=n.sublist(0,s);n.consume(s),r?.onData!=null&&r.onData(a),yield a,o=H.LENGTH}}if(n.byteLength>0)throw(0,ie.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}}ae.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 ae({...e??{},onLength:s=>{t=s}})(n)};var Ee=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}},re=class{constructor(e={}){this.hwm=e.splitLimit??16,this.head=new Ee(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 Ee(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 M(r={}){return Hr(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 Hr(r,e){e=e??{};let t=e.onEnd,n=new re,o,s,i,c=async()=>n.isEmpty()?i?{done:!0}:await new Promise((f,m)=>{s=g=>{s=null,n.push(g);try{f(r(n))}catch(x){m(x)}return o}}):r(n),l=f=>s!=null?s(f):(n.push(f),o),p=f=>(n=new re,s!=null?s({error:f}):(n.push({error:f}),o)),a=f=>{if(i)return o;if(e?.objectMode!==!0&&f?.byteLength==null)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return l({done:!1,value:f})},u=f=>i?o:(i=!0,f!=null?p(f):l({done:!0})),h=()=>(n=new re,u(),{done:!0}),A=f=>(u(f),{done:!0});if(o={[Symbol.asyncIterator](){return this},next:c,return:h,throw:A,push:a,end:u,get readableLength(){return n.size}},t==null)return o;let d=o;return o={[Symbol.asyncIterator](){return this},next(){return d.next()},throw(f){return d.throw(f),t!=null&&(t(f),t=void 0),{done:!0}},return(){return d.return(),t!=null&&(t(),t=void 0),{done:!0}},push:a,end(f){return d.end(f),t!=null&&(t(f),t=void 0),o},get readableLength(){return d.readableLength}},o}async function*Pe(...r){let e=M({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 Jr=(...r)=>{let e;for(;r.length>0;)e=r.shift()(e);return e},Lt=r=>r!=null&&(typeof r[Symbol.asyncIterator]=="function"||typeof r[Symbol.iterator]=="function"||typeof r.next=="function"),ze=r=>r!=null&&typeof r.sink=="function"&&Lt(r.source),Xr=r=>e=>{let t=r.sink(e);if(t.then!=null){let n=M({objectMode:!0});return t.then(()=>{n.end()},s=>{n.end(s)}),Pe(n,async function*(){yield*r.source,n.end()}())}return r.source};function vt(r,...e){if(ze(r)){let n=r;r=()=>n.source}else if(Lt(r)){let n=r;r=()=>n}let t=[r,...e];if(t.length>1&&ze(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++)ze(t[n])&&(t[n]=Xr(t[n]));return Jr(...t)}var Ve={};L(Ve,{identity:()=>Wr});var Wr=ee({prefix:"\0",name:"identity",encode:r=>dt(r),decode:r=>ht(r)});var _e={};L(_e,{base2:()=>Kr});var Kr=b({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var $e={};L($e,{base8:()=>Qr});var Qr=b({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Ge={};L(Ge,{base10:()=>Zr});var Zr=z({prefix:"9",name:"base10",alphabet:"0123456789"});var je={};L(je,{base16:()=>Yr,base16upper:()=>en});var Yr=b({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),en=b({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var qe={};L(qe,{base36:()=>tn,base36upper:()=>rn});var tn=z({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),rn=z({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var He={};L(He,{base256emoji:()=>cn});var St=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}"),nn=St.reduce((r,e,t)=>(r[t]=e,r),[]),on=St.reduce((r,e,t)=>(r[e.codePointAt(0)]=t,r),[]);function sn(r){return r.reduce((e,t)=>(e+=nn[t],e),"")}function an(r){let e=[];for(let t of r){let n=on[t.codePointAt(0)];if(n===void 0)throw new Error(`Non-base256emoji character: ${t}`);e.push(n)}return new Uint8Array(e)}var cn=ee({prefix:"\u{1F680}",name:"base256emoji",encode:sn,decode:an});var Ke={};L(Ke,{sha256:()=>Un,sha512:()=>Fn});var un=Tt,Ut=128,fn=127,ln=~fn,hn=Math.pow(2,31);function Tt(r,e,t){e=e||[],t=t||0;for(var n=t;r>=hn;)e[t++]=r&255|Ut,r/=128;for(;r&ln;)e[t++]=r&255|Ut,r>>>=7;return e[t]=r|0,Tt.bytes=t-n+1,e}var dn=Je,pn=128,Ft=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&Ft)<<o:(i&Ft)*Math.pow(2,o),o+=7}while(i>=pn);return Je.bytes=s-n,t}var mn=Math.pow(2,7),bn=Math.pow(2,14),gn=Math.pow(2,21),wn=Math.pow(2,28),yn=Math.pow(2,35),xn=Math.pow(2,42),Cn=Math.pow(2,49),An=Math.pow(2,56),En=Math.pow(2,63),Ln=function(r){return r<mn?1:r<bn?2:r<gn?3:r<wn?4:r<yn?5:r<xn?6:r<Cn?7:r<An?8:r<En?9:10},vn={encode:un,decode:dn,encodingLength:Ln},Sn=vn,ce=Sn;var ue=(r,e=0)=>[ce.decode(r,e),ce.decode.bytes],ne=(r,e,t=0)=>(ce.encode(r,e,t),e),oe=r=>ce.encodingLength(r);var J=(r,e)=>{let t=e.byteLength,n=oe(r),o=n+oe(t),s=new Uint8Array(o+t);return ne(r,s,0),ne(t,s,n),s.set(e,o),new se(r,t,e,s)},Ot=r=>{let e=I(r),[t,n]=ue(e),[o,s]=ue(e.subarray(n)),i=e.subarray(n+s);if(i.byteLength!==o)throw new Error("Incorrect length");return new se(t,o,i,e)},Nt=(r,e)=>{if(r===e)return!0;{let t=e;return r.code===t.code&&r.size===t.size&&t.bytes instanceof Uint8Array&<(r.bytes,t.bytes)}},se=class{constructor(e,t,n,o){this.code=e,this.size=t,this.digest=n,this.bytes=o}};var We=({name:r,code:e,encode:t})=>new Xe(r,e,t),Xe=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?J(this.code,t):t.then(n=>J(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)),Un=We({name:"sha2-256",code:18,encode:Rt("SHA-256")}),Fn=We({name:"sha2-512",code:19,encode:Rt("SHA-512")});var Qe={};L(Qe,{identity:()=>Nn});var kt=0,Tn="identity",Mt=I,On=r=>J(kt,Mt(r)),Nn={code:kt,name:Tn,encode:Mt,digest:On};var is=new TextEncoder,as=new TextDecoder;var It=(r,e)=>{let{bytes:t,version:n}=r;switch(n){case 0:return Mn(t,Ze(r),e||D.encoder);default:return In(t,Ze(r),e||V.encoder)}};var Bt=new WeakMap,Ze=r=>{let e=Bt.get(r);if(e==null){let t=new Map;return Bt.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=J(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&&Nt(e.multihash,n.multihash)}toString(e){return It(this,e)}toJSON(){return{"/":It(this)}}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[Pn]===!0){let{version:n,multihash:o,code:s}=t,i=Ot(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=I(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 se(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[u,h]=ue(e.subarray(t));return t+=h,u},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);if(s.version===0&&e[0]!=="Q")throw Error("Version 0 CID string must not include multibase prefix");return Ze(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 V.prefix:{let t=e||V;return[V.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)]}}},Mn=(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},In=(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=oe(r),o=n+oe(e),s=new Uint8Array(o+t.byteLength);return ne(r,s,0),ne(e,s,n),s.set(t,o),s},Pn=Symbol.for("@ipld/js-cid/CID");var Ye={...Ve,..._e,...$e,...Ge,...je,...Re,...qe,...De,...Me,...He},gs={...Ke,...Qe};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))),et=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=P(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}),zn={utf8:zt,"utf-8":zt,hex:Ye.base16,latin1:et,ascii:et,binary:et,...Ye},ve=zn;function U(r,e="utf8"){let t=ve[e];if(t==null)throw new Error(`Unsupported encoding "${e}"`);return(e==="utf8"||e==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?j(globalThis.Buffer.from(r,"utf-8")):t.decoder.decode(`${t.prefix}${r}`)}async function tt(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:u}=n;throw new he(a,u)}let p=new Promise((a,u)=>{i=()=>{let{abortMessage:h,abortCode:A}=n;u(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 u=o.return();u instanceof Promise&&u.catch(h=>{n.onReturnError!=null&&n.onReturnError(h)})}catch(u){n.onReturnError!=null&&n.onReturnError(u)}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=ve[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 _n=te("libp2p:mss"),jt=U(`
|
|
3
|
+
`);function X(r){let e=new w(r,jt);return Ae.single(e)}function W(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 vt(o,ae({onLength:c=>{t=c},maxDataLength:1024}),async c=>await tt(c));if(i==null||i.length===0)throw new _("no buffer returned","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");if(i.get(i.byteLength-1)!==jt[0])throw _n.error("Invalid mss message - missing newline - %s",i.subarray()),new _("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 Se(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 rt(){let r={};return r.promise=new Promise((e,t)=>{r.resolve=e,r.reject=t}),r}function Ue(r){let e=M(),t=Se(r.source),n=rt(),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}}}function Gn(r){return r[Symbol.asyncIterator]!=null}function jn(...r){let e=[];for(let t of r)Gn(t)||e.push(t);return e.length===r.length?function*(){for(let t of e)yield*t}():async function*(){let t=M({objectMode:!0});Promise.resolve().then(async()=>{try{await Promise.all(r.map(async n=>{for await(let o of n)t.push(o)})),t.end()}catch(n){t.end(n)}}),yield*t}()}var Jt=jn;var de=te("libp2p:mss:select");async function Xt(r,e,t={}){e=Array.isArray(e)?[...e]:[e];let{reader:n,writer:o,rest:s,stream:i}=Ue(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 u of e){de('select: write "%s"',u),W(o,U(u),t);let h=await $(n,t);if(de('select: read "%s" for "%s"',h,u),h===u)return s(),{stream:i,protocol:u}}throw s(),new _("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}function Wt(r,e){let t=M(),n=!1;return{stream:{sink:async o=>await r.sink(async function*(){let s=!0;for await(let i of Jt(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=Se(r.source),s=await $(o);if(s===N&&(s=await $(o)),s!==e)throw new _("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL");for await(let i of o)yield*i}()},protocol:e}}var pe=te("libp2p:mss:handle");async function Kt(r,e,t){e=Array.isArray(e)?e:[e];let{writer:n,reader:o,rest:s,stream:i}=Ue(r);for(;;){let c=await $(o,t);if(pe('read "%s"',c),c===N){pe('respond with "%s" for "%s"',N,c),W(n,U(N),t);continue}if(e.includes(c))return W(n,U(c),t),pe('respond with "%s" for "%s"',c,c),s(),{stream:i,protocol:c};if(c==="ls"){W(n,new w(...e.map(l=>X(U(l)))),t),pe('respond with "%s" for %s',e,c);continue}W(n,U("na"),t),pe('respond with "na" for "%s"',c)}}return rr(qn);})();
|
|
4
|
+
return Libp2PMultistreamSelect}));
|
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
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Uint8ArrayList } from 'uint8arraylist';
|
|
2
2
|
import * as lp from 'it-length-prefixed';
|
|
3
3
|
import { pipe } from 'it-pipe';
|
|
4
|
-
import
|
|
4
|
+
import { CodeError } from '@libp2p/interfaces/errors';
|
|
5
5
|
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
9
|
import { MAX_PROTOCOL_LENGTH } from './constants.js';
|
|
10
|
+
import { logger } from '@libp2p/logger';
|
|
11
|
+
const log = logger('libp2p:mss');
|
|
10
12
|
const NewLine = uint8ArrayFromString('\n');
|
|
11
13
|
export function encode(buffer) {
|
|
12
14
|
const list = new Uint8ArrayList(buffer, NewLine);
|
|
@@ -57,10 +59,11 @@ export async function read(reader, options) {
|
|
|
57
59
|
};
|
|
58
60
|
const buf = await pipe(input, lp.decode({ onLength, maxDataLength: MAX_PROTOCOL_LENGTH }), async (source) => await first(source));
|
|
59
61
|
if (buf == null || buf.length === 0) {
|
|
60
|
-
throw
|
|
62
|
+
throw new CodeError('no buffer returned', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE');
|
|
61
63
|
}
|
|
62
64
|
if (buf.get(buf.byteLength - 1) !== NewLine[0]) {
|
|
63
|
-
|
|
65
|
+
log.error('Invalid mss message - missing newline - %s', buf.subarray());
|
|
66
|
+
throw new CodeError('missing newline', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE');
|
|
64
67
|
}
|
|
65
68
|
return buf.sublist(0, -1); // Remove newline
|
|
66
69
|
}
|
|
@@ -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,
|
|
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
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger } from '@libp2p/logger';
|
|
2
|
-
import
|
|
2
|
+
import { CodeError } from '@libp2p/interfaces/errors';
|
|
3
3
|
import * as multistream from './multistream.js';
|
|
4
4
|
import { handshake } from 'it-handshake';
|
|
5
5
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
@@ -44,7 +44,7 @@ export async function select(stream, protocols, options = {}) {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
rest();
|
|
47
|
-
throw
|
|
47
|
+
throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL');
|
|
48
48
|
}
|
|
49
49
|
export function lazySelect(stream, protocol) {
|
|
50
50
|
// This is a signal to write the multistream headers if the consumer tries to
|
|
@@ -81,7 +81,7 @@ export function lazySelect(stream, protocol) {
|
|
|
81
81
|
response = await multistream.readString(byteReader);
|
|
82
82
|
}
|
|
83
83
|
if (response !== protocol) {
|
|
84
|
-
throw
|
|
84
|
+
throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL');
|
|
85
85
|
}
|
|
86
86
|
for await (const chunk of byteReader) {
|
|
87
87
|
yield* chunk;
|
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,
|
|
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.3",
|
|
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,19 @@
|
|
|
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
|
-
"@libp2p/interfaces": "^3.0
|
|
146
|
+
"@libp2p/interfaces": "^3.2.0",
|
|
146
147
|
"@libp2p/logger": "^2.0.0",
|
|
147
148
|
"abortable-iterator": "^4.0.2",
|
|
148
|
-
"
|
|
149
|
-
"it-first": "^1.0.6",
|
|
149
|
+
"it-first": "^2.0.0",
|
|
150
150
|
"it-handshake": "^4.1.2",
|
|
151
|
-
"it-length-prefixed": "^8.0.
|
|
152
|
-
"it-merge": "^
|
|
153
|
-
"it-pipe": "^2.0.
|
|
154
|
-
"it-pushable": "^3.
|
|
151
|
+
"it-length-prefixed": "^8.0.3",
|
|
152
|
+
"it-merge": "^3.0.0",
|
|
153
|
+
"it-pipe": "^2.0.4",
|
|
154
|
+
"it-pushable": "^3.1.0",
|
|
155
155
|
"it-reader": "^6.0.1",
|
|
156
156
|
"it-stream-types": "^1.0.4",
|
|
157
157
|
"p-defer": "^4.0.0",
|
|
@@ -162,9 +162,9 @@
|
|
|
162
162
|
"@types/varint": "^6.0.0",
|
|
163
163
|
"aegir": "^37.2.0",
|
|
164
164
|
"iso-random-stream": "^2.0.2",
|
|
165
|
-
"it-all": "^
|
|
166
|
-
"it-map": "^
|
|
167
|
-
"it-pair": "^2.0.
|
|
165
|
+
"it-all": "^3.0.1",
|
|
166
|
+
"it-map": "^2.0.0",
|
|
167
|
+
"it-pair": "^2.0.3",
|
|
168
168
|
"p-timeout": "^6.0.0",
|
|
169
169
|
"timeout-abort-controller": "^3.0.0",
|
|
170
170
|
"util": "^0.12.4",
|
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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Uint8ArrayList } from 'uint8arraylist'
|
|
3
3
|
import * as lp from 'it-length-prefixed'
|
|
4
4
|
import { pipe } from 'it-pipe'
|
|
5
|
-
import
|
|
5
|
+
import { CodeError } from '@libp2p/interfaces/errors'
|
|
6
6
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
7
7
|
import first from 'it-first'
|
|
8
8
|
import { abortableSource } from 'abortable-iterator'
|
|
@@ -13,6 +13,9 @@ import type { Source } from 'it-stream-types'
|
|
|
13
13
|
import type { Reader } from 'it-reader'
|
|
14
14
|
import type { MultistreamSelectInit } from '.'
|
|
15
15
|
import { MAX_PROTOCOL_LENGTH } from './constants.js'
|
|
16
|
+
import { logger } from '@libp2p/logger'
|
|
17
|
+
|
|
18
|
+
const log = logger('libp2p:mss')
|
|
16
19
|
|
|
17
20
|
const NewLine = uint8ArrayFromString('\n')
|
|
18
21
|
|
|
@@ -79,11 +82,12 @@ export async function read (reader: Reader, options?: AbortOptions): Promise<Uin
|
|
|
79
82
|
)
|
|
80
83
|
|
|
81
84
|
if (buf == null || buf.length === 0) {
|
|
82
|
-
throw
|
|
85
|
+
throw new CodeError('no buffer returned', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE')
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
if (buf.get(buf.byteLength - 1) !== NewLine[0]) {
|
|
86
|
-
|
|
89
|
+
log.error('Invalid mss message - missing newline - %s', buf.subarray())
|
|
90
|
+
throw new CodeError('missing newline', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE')
|
|
87
91
|
}
|
|
88
92
|
|
|
89
93
|
return buf.sublist(0, -1) // Remove newline
|
package/src/select.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger } from '@libp2p/logger'
|
|
2
|
-
import
|
|
2
|
+
import { CodeError } from '@libp2p/interfaces/errors'
|
|
3
3
|
import * as multistream from './multistream.js'
|
|
4
4
|
import { handshake } from 'it-handshake'
|
|
5
5
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
@@ -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>> {
|
|
@@ -59,7 +102,7 @@ export async function select (stream: Duplex<any>, protocols: string | string[],
|
|
|
59
102
|
}
|
|
60
103
|
|
|
61
104
|
rest()
|
|
62
|
-
throw
|
|
105
|
+
throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL')
|
|
63
106
|
}
|
|
64
107
|
|
|
65
108
|
/**
|
|
@@ -104,7 +147,7 @@ export function lazySelect (stream: Duplex<any>, protocol: string): ProtocolStre
|
|
|
104
147
|
response = await multistream.readString(byteReader)
|
|
105
148
|
}
|
|
106
149
|
if (response !== protocol) {
|
|
107
|
-
throw
|
|
150
|
+
throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL')
|
|
108
151
|
}
|
|
109
152
|
for await (const chunk of byteReader) {
|
|
110
153
|
yield * chunk
|