@helia/delegated-routing-client 0.0.0-9114743f
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 +72 -0
- package/dist/index.min.js +4 -0
- package/dist/index.min.js.map +7 -0
- package/dist/src/delegated-routing-router.d.ts +18 -0
- package/dist/src/delegated-routing-router.d.ts.map +1 -0
- package/dist/src/delegated-routing-router.js +78 -0
- package/dist/src/delegated-routing-router.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/utils/delegated-http-routing-defaults.browser.d.ts +3 -0
- package/dist/src/utils/delegated-http-routing-defaults.browser.d.ts.map +1 -0
- package/dist/src/utils/delegated-http-routing-defaults.browser.js +8 -0
- package/dist/src/utils/delegated-http-routing-defaults.browser.js.map +1 -0
- package/dist/src/utils/delegated-http-routing-defaults.d.ts +3 -0
- package/dist/src/utils/delegated-http-routing-defaults.d.ts.map +1 -0
- package/dist/src/utils/delegated-http-routing-defaults.js +9 -0
- package/dist/src/utils/delegated-http-routing-defaults.js.map +1 -0
- package/package.json +70 -0
- package/src/delegated-routing-router.ts +98 -0
- package/src/index.ts +14 -0
- package/src/utils/delegated-http-routing-defaults.browser.ts +9 -0
- package/src/utils/delegated-http-routing-defaults.ts +10 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../../../node_modules/@libp2p/interface/src/errors.ts", "../../../node_modules/main-event/src/index.ts", "../../../node_modules/uint8arrays/src/alloc.ts", "../../../node_modules/uint8arrays/src/util/as-uint8array.ts", "../../../node_modules/uint8arrays/src/concat.ts", "../../../node_modules/uint8arrays/src/equals.ts", "../../../node_modules/uint8arraylist/src/index.ts", "../../../node_modules/multiformats/src/bases/base10.ts", "../../../node_modules/multiformats/src/bytes.ts", "../../../node_modules/multiformats/src/vendor/base-x.js", "../../../node_modules/multiformats/src/bases/base.ts", "../../../node_modules/multiformats/src/bases/base16.ts", "../../../node_modules/multiformats/src/bases/base2.ts", "../../../node_modules/multiformats/src/bases/base256emoji.ts", "../../../node_modules/multiformats/src/bases/base32.ts", "../../../node_modules/multiformats/src/bases/base36.ts", "../../../node_modules/multiformats/src/bases/base58.ts", "../../../node_modules/multiformats/src/bases/base64.ts", "../../../node_modules/multiformats/src/bases/base8.ts", "../../../node_modules/multiformats/src/bases/identity.ts", "../../../node_modules/multiformats/src/codecs/json.ts", "../../../node_modules/multiformats/src/hashes/identity.ts", "../../../node_modules/multiformats/src/vendor/varint.js", "../../../node_modules/multiformats/src/varint.ts", "../../../node_modules/multiformats/src/hashes/digest.ts", "../../../node_modules/multiformats/src/hashes/sha2-browser.ts", "../../../node_modules/multiformats/src/hashes/hasher.ts", "../../../node_modules/multiformats/src/cid.ts", "../../../node_modules/multiformats/src/basics.ts", "../../../node_modules/uint8arrays/src/util/bases.ts", "../../../node_modules/uint8arrays/src/from-string.ts", "../../../node_modules/@chainsafe/is-ip/src/parser.ts", "../../../node_modules/@chainsafe/is-ip/src/parse.ts", "../../../node_modules/@chainsafe/is-ip/src/is-ip.ts", "../../../node_modules/uint8-varint/src/index.ts", "../../../node_modules/uint8arrays/src/with-array-buffer.ts", "../../../node_modules/uint8arrays/src/to-string.ts", "../../../node_modules/@multiformats/multiaddr/src/errors.ts", "../../../node_modules/@multiformats/multiaddr/src/utils.ts", "../../../node_modules/@multiformats/multiaddr/src/validation.ts", "../../../node_modules/@multiformats/multiaddr/src/registry.ts", "../../../node_modules/@multiformats/multiaddr/src/components.ts", "../../../node_modules/@multiformats/multiaddr/src/multiaddr.ts", "../../../node_modules/@multiformats/multiaddr/src/index.ts", "../../../node_modules/p-defer/index.js", "../../../node_modules/it-pushable/src/fifo.ts", "../../../node_modules/it-pushable/src/index.ts", "../../../node_modules/p-timeout/index.js", "../../../node_modules/@libp2p/utils/node_modules/p-event/index.js", "../../../node_modules/@libp2p/utils/src/debounce.ts", "../../../node_modules/@libp2p/utils/src/errors.ts", "../../../node_modules/race-signal/src/index.ts", "../../../node_modules/@libp2p/utils/src/queue/recipient.ts", "../../../node_modules/@libp2p/utils/src/queue/job.ts", "../../../node_modules/@libp2p/utils/src/queue/index.ts", "../../../node_modules/any-signal/src/index.ts", "../../../node_modules/browser-readablestream-to-it/src/index.ts", "../../../node_modules/it-ndjson/src/errors.ts", "../../../node_modules/it-ndjson/src/parse.ts", "../../../node_modules/@helia/delegated-routing-v1-http-api-client/src/errors.ts", "../../../node_modules/@helia/delegated-routing-v1-http-api-client/src/client.ts", "../../../node_modules/it-first/src/index.ts", "../../../node_modules/it-peekable/src/index.ts", "../../../node_modules/it-map/src/index.ts", "../../../node_modules/@helia/delegated-routing-v1-http-api-client/src/index.ts", "../src/delegated-routing-router.ts", "../src/utils/delegated-http-routing-defaults.browser.ts"],
|
|
4
|
+
"sourcesContent": ["import { DelegatedHTTPRouter } from './delegated-routing-router.ts'\nimport { delegatedHTTPRoutingDefaults } from './utils/delegated-http-routing-defaults.ts'\nimport type { DelegatedRoutingV1HttpApiClientInit } from '@helia/delegated-routing-v1-http-api-client'\nimport type { Router } from '@helia/interface'\n\nexport { delegatedHTTPRoutingDefaults }\nexport type { DelegatedRoutingV1HttpApiClientInit }\n\n/**\n * Creates a Helia Router that connects to an endpoint that supports the [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) spec.\n */\nexport function delegatedHTTPRouter (init: DelegatedRoutingV1HttpApiClientInit): (components: any) => Router {\n return (components: any) => new DelegatedHTTPRouter(components, delegatedHTTPRoutingDefaults(init))\n}\n", "/**\n * When this error is thrown it means an operation was aborted,\n * usually in response to the `abort` event being emitted by an\n * AbortSignal.\n */\nexport class AbortError extends Error {\n static name = 'AbortError'\n\n constructor (message: string = 'The operation was aborted') {\n super(message)\n this.name = 'AbortError'\n }\n}\n\n/**\n * Thrown when a remote Peer ID does not match the expected one\n */\nexport class UnexpectedPeerError extends Error {\n static name = 'UnexpectedPeerError'\n\n constructor (message = 'Unexpected Peer') {\n super(message)\n this.name = 'UnexpectedPeerError'\n }\n}\n\n/**\n * Thrown when a crypto exchange fails\n */\nexport class InvalidCryptoExchangeError extends Error {\n static name = 'InvalidCryptoExchangeError'\n\n constructor (message = 'Invalid crypto exchange') {\n super(message)\n this.name = 'InvalidCryptoExchangeError'\n }\n}\n\n/**\n * Thrown when invalid parameters are passed to a function or method call\n */\nexport class InvalidParametersError extends Error {\n static name = 'InvalidParametersError'\n\n constructor (message = 'Invalid parameters') {\n super(message)\n this.name = 'InvalidParametersError'\n }\n}\n\n/**\n * Thrown when a public key is invalid\n */\nexport class InvalidPublicKeyError extends Error {\n static name = 'InvalidPublicKeyError'\n\n constructor (message = 'Invalid public key') {\n super(message)\n this.name = 'InvalidPublicKeyError'\n }\n}\n\n/**\n * Thrown when a private key is invalid\n */\nexport class InvalidPrivateKeyError extends Error {\n static name = 'InvalidPrivateKeyError'\n\n constructor (message = 'Invalid private key') {\n super(message)\n this.name = 'InvalidPrivateKeyError'\n }\n}\n\n/**\n * Thrown when a operation is unsupported\n */\nexport class UnsupportedOperationError extends Error {\n static name = 'UnsupportedOperationError'\n\n constructor (message = 'Unsupported operation') {\n super(message)\n this.name = 'UnsupportedOperationError'\n }\n}\n\n/**\n * Thrown when a connection is closing\n */\nexport class ConnectionClosingError extends Error {\n static name = 'ConnectionClosingError'\n\n constructor (message = 'The connection is closing') {\n super(message)\n this.name = 'ConnectionClosingError'\n }\n}\n\n/**\n * Thrown when a connection is closed\n */\nexport class ConnectionClosedError extends Error {\n static name = 'ConnectionClosedError'\n\n constructor (message = 'The connection is closed') {\n super(message)\n this.name = 'ConnectionClosedError'\n }\n}\n\n/**\n * Thrown when a connection fails\n */\nexport class ConnectionFailedError extends Error {\n static name = 'ConnectionFailedError'\n\n constructor (message = 'Connection failed') {\n super(message)\n this.name = 'ConnectionFailedError'\n }\n}\n\n/**\n * Thrown when the muxer is closed and an attempt to open a stream occurs\n */\nexport class MuxerClosedError extends Error {\n static name = 'MuxerClosedError'\n\n constructor (message = 'The muxer is closed') {\n super(message)\n this.name = 'MuxerClosedError'\n }\n}\n\n/**\n * Thrown when a protocol stream is reset by the remote muxer\n */\nexport class StreamResetError extends Error {\n static name = 'StreamResetError'\n\n constructor (message = 'The stream has been reset') {\n super(message)\n this.name = 'StreamResetError'\n }\n}\n\n/**\n * Thrown when a protocol stream is aborted locally\n */\nexport class StreamAbortedError extends Error {\n static name = 'StreamAbortedError'\n\n constructor (message = 'The stream has been aborted') {\n super(message)\n this.name = 'StreamAbortedError'\n }\n}\n\n/**\n * Thrown when a stream is in an invalid state\n */\nexport class StreamStateError extends Error {\n static name = 'StreamStateError'\n\n constructor (message = 'The stream is in an invalid state') {\n super(message)\n this.name = 'StreamStateError'\n }\n}\n\n/**\n * Thrown when a stream buffer is full\n */\nexport class StreamBufferError extends Error {\n static name = 'StreamBufferError'\n\n constructor (message = 'The stream buffer was full') {\n super(message)\n this.name = 'StreamBufferError'\n }\n}\n\n/**\n * Thrown when a value could not be found\n */\nexport class NotFoundError extends Error {\n static name = 'NotFoundError'\n\n constructor (message = 'Not found') {\n super(message)\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Thrown when an invalid peer ID is encountered\n */\nexport class InvalidPeerIdError extends Error {\n static name = 'InvalidPeerIdError'\n\n constructor (message = 'Invalid PeerID') {\n super(message)\n this.name = 'InvalidPeerIdError'\n }\n}\n\n/**\n * Thrown when an invalid multiaddr is encountered\n */\nexport class InvalidMultiaddrError extends Error {\n static name = 'InvalidMultiaddrError'\n\n constructor (message = 'Invalid multiaddr') {\n super(message)\n this.name = 'InvalidMultiaddrError'\n }\n}\n\n/**\n * Thrown when an invalid CID is encountered\n */\nexport class InvalidCIDError extends Error {\n static name = 'InvalidCIDError'\n\n constructor (message = 'Invalid CID') {\n super(message)\n this.name = 'InvalidCIDError'\n }\n}\n\n/**\n * Thrown when an invalid multihash is encountered\n */\nexport class InvalidMultihashError extends Error {\n static name = 'InvalidMultihashError'\n\n constructor (message = 'Invalid Multihash') {\n super(message)\n this.name = 'InvalidMultihashError'\n }\n}\n\n/**\n * Thrown when a protocol is not supported\n */\nexport class UnsupportedProtocolError extends Error {\n static name = 'UnsupportedProtocolError'\n\n constructor (message = 'Unsupported protocol error') {\n super(message)\n this.name = 'UnsupportedProtocolError'\n }\n}\n\n/**\n * An invalid or malformed message was encountered during a protocol exchange\n */\nexport class InvalidMessageError extends Error {\n static name = 'InvalidMessageError'\n\n constructor (message = 'Invalid message') {\n super(message)\n this.name = 'InvalidMessageError'\n }\n}\n\n/**\n * Thrown when a remote peer sends a structurally valid message that does not\n * comply with the protocol\n */\nexport class ProtocolError extends Error {\n static name = 'ProtocolError'\n\n constructor (message = 'Protocol error') {\n super(message)\n this.name = 'ProtocolError'\n }\n}\n\n/**\n * Throw when an operation times out\n */\nexport class TimeoutError extends Error {\n static name = 'TimeoutError'\n\n constructor (message = 'Timed out') {\n super(message)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a startable component is interacted with but it has not been\n * started yet\n */\nexport class NotStartedError extends Error {\n static name = 'NotStartedError'\n\n constructor (message = 'Not started') {\n super(message)\n this.name = 'NotStartedError'\n }\n}\n\n/**\n * Thrown when a component is started that has already been started\n */\nexport class AlreadyStartedError extends Error {\n static name = 'AlreadyStartedError'\n\n constructor (message = 'Already started') {\n super(message)\n this.name = 'AlreadyStartedError'\n }\n}\n\n/**\n * Thrown when dialing an address failed\n */\nexport class DialError extends Error {\n static name = 'DialError'\n\n constructor (message = 'Dial error') {\n super(message)\n this.name = 'DialError'\n }\n}\n\n/**\n * Thrown when listening on an address failed\n */\nexport class ListenError extends Error {\n static name = 'ListenError'\n\n constructor (message = 'Listen error') {\n super(message)\n this.name = 'ListenError'\n }\n}\n\n/**\n * This error is thrown when a limited connection is encountered, i.e. if the\n * user tried to open a stream on a connection for a protocol that is not\n * configured to run over limited connections.\n */\nexport class LimitedConnectionError extends Error {\n static name = 'LimitedConnectionError'\n\n constructor (message = 'Limited connection') {\n super(message)\n this.name = 'LimitedConnectionError'\n }\n}\n\n/**\n * This error is thrown where there are too many inbound protocols streams open\n */\nexport class TooManyInboundProtocolStreamsError extends Error {\n static name = 'TooManyInboundProtocolStreamsError'\n\n constructor (message = 'Too many inbound protocol streams') {\n super(message)\n this.name = 'TooManyInboundProtocolStreamsError'\n }\n}\n\n/**\n * This error is thrown where there are too many outbound protocols streams open\n */\nexport class TooManyOutboundProtocolStreamsError extends Error {\n static name = 'TooManyOutboundProtocolStreamsError'\n\n constructor (message = 'Too many outbound protocol streams') {\n super(message)\n this.name = 'TooManyOutboundProtocolStreamsError'\n }\n}\n\n/**\n * Thrown when an attempt to operate on an unsupported key was made\n */\nexport class UnsupportedKeyTypeError extends Error {\n static name = 'UnsupportedKeyTypeError'\n\n constructor (message = 'Unsupported key type') {\n super(message)\n this.name = 'UnsupportedKeyTypeError'\n }\n}\n\n/**\n * Thrown when an operation has not been implemented\n */\nexport class NotImplementedError extends Error {\n static name = 'NotImplementedError'\n\n constructor (message = 'Not implemented') {\n super(message)\n this.name = 'NotImplementedError'\n }\n}\n", "/**\n * @packageDocumentation\n *\n * Adds types to the EventTarget class.\n *\n * Hopefully this won't be necessary\n * forever:\n *\n * - https://github.com/microsoft/TypeScript/issues/28357\n * - https://github.com/microsoft/TypeScript/issues/43477\n * - https://github.com/microsoft/TypeScript/issues/299\n * - https://www.npmjs.com/package/typed-events\n * - https://www.npmjs.com/package/typed-event-emitter\n * - https://www.npmjs.com/package/typed-event-target\n * - etc\n *\n * In addition to types, a `safeDispatchEvent` method is available which\n * prevents dispatching events that aren't in the event map, and a\n * `listenerCount` method which reports the number of listeners that are\n * currently registered for a given event.\n *\n * @example\n *\n * ```ts\n * import { TypedEventEmitter } from 'main-event'\n * import type { TypedEventTarget } from 'main-event'\n *\n * interface EventTypes {\n * 'test': CustomEvent<string>\n * }\n *\n * const target = new TypedEventEmitter<EventTypes>()\n *\n * // it's a regular EventTarget\n * console.info(target instanceof EventTarget) // true\n *\n * // register listeners normally\n * target.addEventListener('test', (evt) => {\n * // evt is CustomEvent<string>\n * })\n *\n * // @ts-expect-error 'derp' is not in the event map\n * target.addEventListener('derp', () => {})\n *\n * // use normal dispatchEvent method\n * target.dispatchEvent(new CustomEvent('test', {\n * detail: 'hello'\n * }))\n *\n * // use type safe dispatch method\n * target.safeDispatchEvent('test', {\n * detail: 'world'\n * })\n *\n * // report listener count\n * console.info(target.listenerCount('test')) // 0\n *\n * // event emitters can be used purely as interfaces too\n * function acceptTarget (target: TypedEventTarget<EventTypes>) {\n * // ...\n * }\n * ```\n */\n\nimport { setMaxListeners } from './events.ts'\n\nexport interface EventCallback<EventType> { (evt: EventType): void }\nexport interface EventObject<EventType> { handleEvent: EventCallback<EventType> }\nexport type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>\n\ninterface Listener {\n once: boolean\n callback: any\n}\n\n/**\n *\n */\nexport interface TypedEventTarget <EventMap extends Record<string, any>> extends EventTarget {\n addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void\n\n listenerCount (type: string): number\n\n removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void\n\n removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void\n\n safeDispatchEvent<Detail>(type: keyof EventMap, detail?: CustomEventInit<Detail>): boolean\n}\n\nfunction isEventObject <EventType> (obj?: any): obj is EventObject<EventType> {\n return typeof obj?.handleEvent === 'function'\n}\n\nfunction isOnce (options?: boolean | AddEventListenerOptions): boolean {\n return (options !== true && options !== false && options?.once) ?? false\n}\n\n/**\n * An implementation of a typed event target\n */\nexport class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {\n readonly #listeners = new Map<any, Listener[]>()\n\n constructor () {\n super()\n\n // silence MaxListenersExceededWarning warning on Node.js, this is a red\n // herring almost all of the time\n setMaxListeners(Infinity, this)\n }\n\n listenerCount (type: string): number {\n const listeners = this.#listeners.get(type)\n\n if (listeners == null) {\n return 0\n }\n\n return listeners.length\n }\n\n addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void\n addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void {\n const once = isOnce(options)\n\n super.addEventListener(type, (evt) => {\n if (once) {\n let list = this.#listeners.get(evt.type)\n\n if (list != null) {\n list = list.filter(({ callback }) => callback !== listener)\n this.#listeners.set(evt.type, list)\n }\n }\n\n if (isEventObject<Event>(listener)) {\n listener.handleEvent(evt)\n } else {\n listener(evt)\n }\n }, options)\n\n let list = this.#listeners.get(type)\n\n if (list == null) {\n list = []\n this.#listeners.set(type, list)\n }\n\n list.push({\n callback: listener,\n once\n })\n }\n\n removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void\n removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void {\n super.removeEventListener(type.toString(), listener ?? null, options)\n\n let list = this.#listeners.get(type)\n\n if (list == null) {\n return\n }\n\n list = list.filter(({ callback }) => callback !== listener)\n this.#listeners.set(type, list)\n }\n\n safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail> = {}): boolean {\n return this.dispatchEvent(new CustomEvent<Detail>(type as string, detail))\n }\n}\n\nexport { setMaxListeners }\n", "/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n", "function isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * To guarantee Uint8Array semantics, convert nodejs Buffers\n * into vanilla Uint8Arrays\n */\nexport function asUint8Array (buf: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(buf)) {\n return buf\n }\n\n const b = buf.slice()\n\n return new Uint8Array(b.buffer, 0, b.byteLength)\n}\n", "import { allocUnsafe } from '#alloc'\nimport { asUint8Array } from '#util/as-uint8array'\n\n/**\n * Returns a new Uint8Array created by concatenating the passed Uint8Arrays\n */\nexport function concat (arrays: Uint8Array[], length?: number): Uint8Array<ArrayBuffer> {\n if (length == null) {\n length = arrays.reduce((acc, curr) => acc + curr.length, 0)\n }\n\n const output = allocUnsafe(length)\n let offset = 0\n\n for (const arr of arrays) {\n output.set(arr, offset)\n offset += arr.length\n }\n\n return asUint8Array(output)\n}\n", "/**\n * Returns true if the two passed Uint8Arrays have the same content\n */\nexport function equals (a: Uint8Array, b: Uint8Array): boolean {\n if (a === b) {\n return true\n }\n\n if (a.byteLength !== b.byteLength) {\n return false\n }\n\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n", "/**\n * @packageDocumentation\n *\n * A class that lets you do operations over a list of Uint8Arrays without\n * copying them.\n *\n * ```js\n * import { Uint8ArrayList } from 'uint8arraylist'\n *\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray()\n * // -> Uint8Array([0, 1, 2, 3, 4, 5])\n *\n * list.consume(3)\n * list.subarray()\n * // -> Uint8Array([3, 4, 5])\n *\n * // you can also iterate over the list\n * for (const buf of list) {\n * // ..do something with `buf`\n * }\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ## Converting Uint8ArrayLists to Uint8Arrays\n *\n * There are two ways to turn a `Uint8ArrayList` into a `Uint8Array` - `.slice` and `.subarray` and one way to turn a `Uint8ArrayList` into a `Uint8ArrayList` with different contents - `.sublist`.\n *\n * ### slice\n *\n * Slice follows the same semantics as [Uint8Array.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) in that it creates a new `Uint8Array` and copies bytes into it using an optional offset & length.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.slice(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ### subarray\n *\n * Subarray attempts to follow the same semantics as [Uint8Array.subarray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray) with one important different - this is a no-copy operation, unless the requested bytes span two internal buffers in which case it is a copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0]) - no-copy\n *\n * list.subarray(2, 5)\n * // -> Uint8Array([2, 3, 4]) - copy\n * ```\n *\n * ### sublist\n *\n * Sublist creates and returns a new `Uint8ArrayList` that shares the underlying buffers with the original so is always a no-copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.sublist(0, 1)\n * // -> Uint8ArrayList([0]) - no-copy\n *\n * list.sublist(2, 5)\n * // -> Uint8ArrayList([2], [3, 4]) - no-copy\n * ```\n *\n * ## Inspiration\n *\n * Borrows liberally from [bl](https://www.npmjs.com/package/bl) but only uses native JS types.\n */\nimport { allocUnsafe, alloc } from 'uint8arrays/alloc'\nimport { concat } from 'uint8arrays/concat'\nimport { equals } from 'uint8arrays/equals'\n\nconst symbol = Symbol.for('@achingbrain/uint8arraylist')\n\nexport type Appendable<T extends ArrayBufferLike = ArrayBuffer> = Uint8ArrayList<T> | Uint8Array<T>\n\nfunction findBufAndOffset (bufs: Uint8Array[], index: number): { buf: Uint8Array, index: number } {\n if (index == null || index < 0) {\n throw new RangeError('index is out of bounds')\n }\n\n let offset = 0\n\n for (const buf of bufs) {\n const bufEnd = offset + buf.byteLength\n\n if (index < bufEnd) {\n return {\n buf,\n index: index - offset\n }\n }\n\n offset = bufEnd\n }\n\n throw new RangeError('index is out of bounds')\n}\n\n/**\n * Check if object is a CID instance\n *\n * @example\n *\n * ```js\n * import { isUint8ArrayList, Uint8ArrayList } from 'uint8arraylist'\n *\n * isUint8ArrayList(true) // false\n * isUint8ArrayList([]) // false\n * isUint8ArrayList(new Uint8ArrayList()) // true\n * ```\n */\nexport function isUint8ArrayList (value: any): value is Uint8ArrayList {\n return Boolean(value?.[symbol])\n}\n\nexport class Uint8ArrayList <T extends ArrayBufferLike = ArrayBufferLike> implements Iterable<Uint8Array<T>> {\n private bufs: Uint8Array<T>[]\n public length: number\n public readonly [symbol] = true\n\n constructor (...data: Appendable<T>[]) {\n this.bufs = []\n this.length = 0\n\n if (data.length > 0) {\n this.appendAll(data)\n }\n }\n\n * [Symbol.iterator] (): Iterator<Uint8Array<T>> {\n yield * this.bufs\n }\n\n get byteLength (): number {\n return this.length\n }\n\n /**\n * Add one or more `bufs` to the end of this Uint8ArrayList\n */\n append (...bufs: Appendable<T>[]): void {\n this.appendAll(bufs)\n }\n\n /**\n * Add all `bufs` to the end of this Uint8ArrayList\n */\n appendAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.push(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n for (const chunk of buf.bufs) {\n this.bufs.push(chunk)\n }\n } else {\n throw new Error('Could not append value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Add one or more `bufs` to the start of this Uint8ArrayList\n */\n prepend (...bufs: Appendable<T>[]): void {\n this.prependAll(bufs)\n }\n\n /**\n * Add all `bufs` to the start of this Uint8ArrayList\n */\n prependAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs.reverse()) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.unshift(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n this.bufs.unshift(...buf.bufs)\n } else {\n throw new Error('Could not prepend value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Read the value at `index`\n */\n get (index: number): number {\n const res = findBufAndOffset(this.bufs, index)\n\n return res.buf[res.index]\n }\n\n /**\n * Set the value at `index` to `value`\n */\n set (index: number, value: number): void {\n const res = findBufAndOffset(this.bufs, index)\n\n res.buf[res.index] = value\n }\n\n /**\n * Copy bytes from `buf` to the index specified by `offset`\n */\n write (buf: Appendable<T | ArrayBuffer>, offset: number = 0): void {\n if (buf instanceof Uint8Array) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf[i])\n }\n } else if (isUint8ArrayList(buf)) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf.get(i))\n }\n } else {\n throw new Error('Could not write value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n /**\n * Remove bytes from the front of the pool\n */\n consume (bytes: number): void {\n // first, normalize the argument, in accordance with how Buffer does it\n bytes = Math.trunc(bytes)\n\n // do nothing if not a positive number\n if (Number.isNaN(bytes) || bytes <= 0) {\n return\n }\n\n // if consuming all bytes, skip iterating\n if (bytes === this.byteLength) {\n this.bufs = []\n this.length = 0\n return\n }\n\n while (this.bufs.length > 0) {\n if (bytes >= this.bufs[0].byteLength) {\n bytes -= this.bufs[0].byteLength\n this.length -= this.bufs[0].byteLength\n this.bufs.shift()\n } else {\n this.bufs[0] = this.bufs[0].subarray(bytes)\n this.length -= bytes\n break\n }\n }\n }\n\n /**\n * Extracts a section of an array and returns a new array.\n *\n * This is a copy operation as it is with Uint8Arrays and Arrays\n * - note this is different to the behaviour of Node Buffers.\n */\n slice (beginInclusive?: number, endExclusive?: number): Uint8Array<ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a section of the array from the given start and end element index.\n *\n * This is a no-copy operation where the data extracted data comes from a\n * single Uint8Array internally, otherwise it is a copy operation.\n */\n subarray (beginInclusive?: number, endExclusive?: number): Uint8Array<T | ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n if (bufs.length === 1) {\n return bufs[0]\n }\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a new Uint8ArrayList from the given start and end element index.\n *\n * This is a no-copy operation.\n */\n sublist (beginInclusive?: number, endExclusive?: number): Uint8ArrayList<T> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n const list = new Uint8ArrayList<T>()\n list.length = length\n // don't loop, just set the bufs\n list.bufs = bufs\n\n return list\n }\n\n private _subList (beginInclusive?: number, endExclusive?: number): { bufs: Uint8Array<T>[], length: number } {\n beginInclusive = beginInclusive ?? 0\n endExclusive = endExclusive ?? this.length\n\n if (beginInclusive < 0) {\n beginInclusive = this.length + beginInclusive\n }\n\n if (endExclusive < 0) {\n endExclusive = this.length + endExclusive\n }\n\n if (beginInclusive < 0 || endExclusive > this.length) {\n throw new RangeError('index is out of bounds')\n }\n\n if (beginInclusive === endExclusive) {\n return { bufs: [], length: 0 }\n }\n\n if (beginInclusive === 0 && endExclusive === this.length) {\n return { bufs: [...this.bufs], length: this.length }\n }\n\n const bufs: Uint8Array<T>[] = []\n let offset = 0\n\n for (let i = 0; i < this.bufs.length; i++) {\n const buf = this.bufs[i]\n const bufStart = offset\n const bufEnd = bufStart + buf.byteLength\n\n // for next loop\n offset = bufEnd\n\n if (beginInclusive >= bufEnd) {\n // start after this buf\n continue\n }\n\n const sliceStartInBuf = beginInclusive >= bufStart && beginInclusive < bufEnd\n const sliceEndsInBuf = endExclusive > bufStart && endExclusive <= bufEnd\n\n if (sliceStartInBuf && sliceEndsInBuf) {\n // slice is wholly contained within this buffer\n if (beginInclusive === bufStart && endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n const start = beginInclusive - bufStart\n bufs.push(buf.subarray(start, start + (endExclusive - beginInclusive)))\n break\n }\n\n if (sliceStartInBuf) {\n // slice starts in this buffer\n if (beginInclusive === 0) {\n // requested whole buffer\n bufs.push(buf)\n continue\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(beginInclusive - bufStart))\n continue\n }\n\n if (sliceEndsInBuf) {\n if (endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(0, endExclusive - bufStart))\n break\n }\n\n // slice started before this buffer and ends after it\n bufs.push(buf)\n }\n\n return { bufs, length: endExclusive - beginInclusive }\n }\n\n indexOf (search: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (!isUint8ArrayList(search) && !(search instanceof Uint8Array)) {\n throw new TypeError('The \"value\" argument must be a Uint8ArrayList or Uint8Array')\n }\n\n const needle = search instanceof Uint8Array ? search : search.subarray()\n\n offset = Number(offset ?? 0)\n\n if (isNaN(offset)) {\n offset = 0\n }\n\n if (offset < 0) {\n offset = this.length + offset\n }\n\n if (offset < 0) {\n offset = 0\n }\n\n if (search.length === 0) {\n return offset > this.length ? this.length : offset\n }\n\n // https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm\n const M: number = needle.byteLength\n\n if (M === 0) {\n throw new TypeError('search must be at least 1 byte long')\n }\n\n // radix\n const radix: number = 256\n const rightmostPositions: Int32Array = new Int32Array(radix)\n\n // position of the rightmost occurrence of the byte c in the pattern\n for (let c: number = 0; c < radix; c++) {\n // -1 for bytes not in pattern\n rightmostPositions[c] = -1\n }\n\n for (let j = 0; j < M; j++) {\n // rightmost position for bytes in pattern\n rightmostPositions[needle[j]] = j\n }\n\n // Return offset of first match, -1 if no match\n const right = rightmostPositions\n const lastIndex = this.byteLength - needle.byteLength\n const lastPatIndex = needle.byteLength - 1\n let skip: number\n\n for (let i = offset; i <= lastIndex; i += skip) {\n skip = 0\n\n for (let j = lastPatIndex; j >= 0; j--) {\n const char: number = this.get(i + j)\n\n if (needle[j] !== char) {\n skip = Math.max(1, j - right[char])\n break\n }\n }\n\n if (skip === 0) {\n return i\n }\n }\n\n return -1\n }\n\n getInt8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt8(0)\n }\n\n setInt8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getInt16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt16(0, littleEndian)\n }\n\n setInt16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getInt32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt32(0, littleEndian)\n }\n\n setInt32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigInt64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigInt64(0, littleEndian)\n }\n\n setBigInt64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigInt64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint8(0)\n }\n\n setUint8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getUint16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint16(0, littleEndian)\n }\n\n setUint16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint32(0, littleEndian)\n }\n\n setUint32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigUint64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigUint64(0, littleEndian)\n }\n\n setBigUint64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigUint64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat32(0, littleEndian)\n }\n\n setFloat32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat64 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat64(0, littleEndian)\n }\n\n setFloat64 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n equals (other: any): other is Uint8ArrayList {\n if (other == null) {\n return false\n }\n\n if (!(other instanceof Uint8ArrayList)) {\n return false\n }\n\n if (other.bufs.length !== this.bufs.length) {\n return false\n }\n\n for (let i = 0; i < this.bufs.length; i++) {\n if (!equals(this.bufs[i], other.bufs[i])) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Create a Uint8ArrayList from a pre-existing list of Uint8Arrays. Use this\n * method if you know the total size of all the Uint8Arrays ahead of time.\n */\n static fromUint8Arrays <T extends ArrayBufferLike> (bufs: Uint8Array<T>[], length?: number): Uint8ArrayList<T> {\n const list = new Uint8ArrayList<T>()\n list.bufs = bufs\n\n if (length == null) {\n length = bufs.reduce((acc, curr) => acc + curr.byteLength, 0)\n }\n\n list.length = length\n\n return list\n }\n}\n\n/*\nfunction indexOf (needle: Uint8Array, haystack: Uint8Array, offset = 0) {\n for (let i = offset; i < haystack.byteLength; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) {\n break\n }\n\n if (j === needle.byteLength -1) {\n return i\n }\n }\n\n if (haystack.byteLength - i < needle.byteLength) {\n break\n }\n }\n\n return -1\n}\n*/\n", "import { baseX } from './base.ts'\n\nexport const base10 = baseX({\n prefix: '9',\n name: 'base10',\n alphabet: '0123456789'\n})\n", "export const empty = new Uint8Array(0)\n\nexport function toHex (d: Uint8Array): string {\n return d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '')\n}\n\nexport function fromHex (hex: string): Uint8Array<ArrayBuffer> {\n const hexes = hex.match(/../g)\n return hexes != null ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty\n}\n\nexport function equals (aa: Uint8Array, bb: Uint8Array): boolean {\n if (aa === bb) { return true }\n if (aa.byteLength !== bb.byteLength) {\n return false\n }\n\n for (let ii = 0; ii < aa.byteLength; ii++) {\n if (aa[ii] !== bb[ii]) {\n return false\n }\n }\n\n return true\n}\n\n/**\r\n * Normalize binary input to a plain `Uint8Array` backed by an `ArrayBuffer`.\r\n *\r\n * Returns the input itself when it is already a plain `Uint8Array` over an\r\n * `ArrayBuffer`, otherwise a fresh view (or, for `SharedArrayBuffer`-backed\r\n * input, a copy) over the same bytes.\r\n *\r\n * Throws if input is not a recognised binary type.\r\n */\r\nexport function coerce (o: ArrayBufferView | ArrayBuffer | Uint8Array): Uint8Array<ArrayBuffer> {\r\n if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') {\n return toArrayBufferBackedArray(o)\n }\n if (o instanceof ArrayBuffer) {\n return new Uint8Array(o)\n }\n if (ArrayBuffer.isView(o)) {\n return toArrayBufferBackedArray(new Uint8Array(o.buffer, o.byteOffset, o.byteLength))\n }\n throw new Error('Unknown type, must be binary type')\n}\n\nexport function isBinary (o: unknown): o is ArrayBuffer | ArrayBufferView {\n return o instanceof ArrayBuffer || ArrayBuffer.isView(o)\n}\n\nexport function fromString (str: string): Uint8Array<ArrayBuffer> {\n return new TextEncoder().encode(str)\n}\n\nexport function toString (b: Uint8Array): string {\n return new TextDecoder().decode(b)\n}\n\nfunction isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * Ensures `b` is backed by an ArrayBuffer - if not a new Uint8Array will be\n * created and the contents of `b` copied into it.\n */\nexport function toArrayBufferBackedArray (b: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(b)) {\n return b\n }\n\n return b.slice()\n}\n", "/* eslint-disable */\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n/**\n * @param {string} ALPHABET\n * @param {any} name\n */\nfunction base (ALPHABET, name) {\n if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n var BASE_MAP = new Uint8Array(256);\n for (var j = 0; j < BASE_MAP.length; j++) {\n BASE_MAP[j] = 255;\n }\n for (var i = 0; i < ALPHABET.length; i++) {\n var x = ALPHABET.charAt(i);\n var xc = x.charCodeAt(0);\n if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n BASE_MAP[xc] = i;\n }\n var BASE = ALPHABET.length;\n var LEADER = ALPHABET.charAt(0);\n var FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up\n var iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up\n /**\n * @param {any[] | Iterable<number>} source\n */\n function encode (source) {\n // @ts-ignore\n if (source instanceof Uint8Array) ; else if (ArrayBuffer.isView(source)) {\n source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n } else if (Array.isArray(source)) {\n source = Uint8Array.from(source);\n }\n if (!(source instanceof Uint8Array)) { throw new TypeError('Expected Uint8Array') }\n if (source.length === 0) { return '' }\n // Skip & count leading zeroes.\n var zeroes = 0;\n var length = 0;\n var pbegin = 0;\n var pend = source.length;\n while (pbegin !== pend && source[pbegin] === 0) {\n pbegin++;\n zeroes++;\n }\n // Allocate enough space in big-endian base58 representation.\n var size = ((pend - pbegin) * iFACTOR + 1) >>> 0;\n var b58 = new Uint8Array(size);\n // Process the bytes.\n while (pbegin !== pend) {\n var carry = source[pbegin];\n // Apply \"b58 = b58 * 256 + ch\".\n var i = 0;\n for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n carry += (256 * b58[it1]) >>> 0;\n b58[it1] = (carry % BASE) >>> 0;\n carry = (carry / BASE) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n pbegin++;\n }\n // Skip leading zeroes in base58 result.\n var it2 = size - length;\n while (it2 !== size && b58[it2] === 0) {\n it2++;\n }\n // Translate the result into a string.\n var str = LEADER.repeat(zeroes);\n for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]); }\n return str\n }\n /**\n * @param {string | string[]} source\n */\n function decodeUnsafe (source) {\n if (typeof source !== 'string') { throw new TypeError('Expected String') }\n if (source.length === 0) { return new Uint8Array() }\n var psz = 0;\n // Skip leading spaces.\n if (source[psz] === ' ') { return }\n // Skip and count leading '1's.\n var zeroes = 0;\n var length = 0;\n while (source[psz] === LEADER) {\n zeroes++;\n psz++;\n }\n // Allocate enough space in big-endian base256 representation.\n var size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.\n var b256 = new Uint8Array(size);\n // Process the characters.\n while (source[psz]) {\n // Decode character\n var carry = BASE_MAP[source.charCodeAt(psz)];\n // Invalid character\n if (carry === 255) { return }\n var i = 0;\n for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n carry += (BASE * b256[it3]) >>> 0;\n b256[it3] = (carry % 256) >>> 0;\n carry = (carry / 256) >>> 0;\n }\n if (carry !== 0) { throw new Error('Non-zero carry') }\n length = i;\n psz++;\n }\n // Skip trailing spaces.\n if (source[psz] === ' ') { return }\n // Skip leading zeroes in b256.\n var it4 = size - length;\n while (it4 !== size && b256[it4] === 0) {\n it4++;\n }\n var vch = new Uint8Array(zeroes + (size - it4));\n var j = zeroes;\n while (it4 !== size) {\n vch[j++] = b256[it4++];\n }\n return vch\n }\n /**\n * @param {string | string[]} string\n */\n function decode (string) {\n var buffer = decodeUnsafe(string);\n if (buffer) { return buffer }\n throw new Error(`Non-${name} character`)\n }\n return {\n encode: encode,\n decodeUnsafe: decodeUnsafe,\n decode: decode\n }\n}\nvar src = base;\n\nvar _brrp__multiformats_scope_baseX = src;\n\nexport default _brrp__multiformats_scope_baseX;\n", "import { coerce } from '../bytes.ts'\nimport basex from '../vendor/base-x.js'\nimport type { BaseCodec, BaseDecoder, BaseEncoder, CombobaseDecoder, Multibase, MultibaseCodec, MultibaseDecoder, MultibaseEncoder, UnibaseDecoder } from './interface.ts'\n\ninterface EncodeFn { (bytes: Uint8Array): string }\ninterface DecodeFn { (text: string): Uint8Array<ArrayBuffer> }\n\n/**\n * Class represents both BaseEncoder and MultibaseEncoder meaning it\n * can be used to encode to multibase or base encode without multibase\n * prefix.\n */\nclass Encoder<Base extends string, Prefix extends string> implements MultibaseEncoder<Prefix>, BaseEncoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n }\n\n encode (bytes: Uint8Array): Multibase<Prefix> {\n if (bytes instanceof Uint8Array) {\n return `${this.prefix}${this.baseEncode(bytes)}`\n } else {\n throw Error('Unknown type, must be binary type')\n }\n }\n}\n\n/**\n * Class represents both BaseDecoder and MultibaseDecoder so it could be used\n * to decode multibases (with matching prefix) or just base decode strings\n * with corresponding base encoding.\n */\nclass Decoder<Base extends string, Prefix extends string> implements MultibaseDecoder<Prefix>, UnibaseDecoder<Prefix>, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseDecode: DecodeFn\n private readonly prefixCodePoint: number\n\n constructor (name: Base, prefix: Prefix, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n const prefixCodePoint = prefix.codePointAt(0)\n /* c8 ignore next 3 */\n if (prefixCodePoint === undefined) {\n throw new Error('Invalid prefix character')\n }\n this.prefixCodePoint = prefixCodePoint\n this.baseDecode = baseDecode\n }\n\n decode (text: string): Uint8Array<ArrayBuffer> {\n if (typeof text === 'string') {\n if (text.codePointAt(0) !== this.prefixCodePoint) {\n throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`)\n }\n return this.baseDecode(text.slice(this.prefix.length))\n } else {\n throw Error('Can only multibase decode strings')\n }\n }\n\n or<OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n}\n\ntype Decoders<Prefix extends string> = Record<Prefix, UnibaseDecoder<Prefix>>\n\nclass ComposedDecoder<Prefix extends string> implements MultibaseDecoder<Prefix>, CombobaseDecoder<Prefix> {\n readonly decoders: Decoders<Prefix>\n\n constructor (decoders: Decoders<Prefix>) {\n this.decoders = decoders\n }\n\n or <OtherPrefix extends string> (decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix> {\n return or(this, decoder)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n const prefix = input[0] as Prefix\n const decoder = this.decoders[prefix]\n if (decoder != null) {\n return decoder.decode(input)\n } else {\n throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)\n }\n }\n}\n\nexport function or <L extends string, R extends string> (left: UnibaseDecoder<L> | CombobaseDecoder<L>, right: UnibaseDecoder<R> | CombobaseDecoder<R>): ComposedDecoder<L | R> {\n return new ComposedDecoder({\n ...(left.decoders ?? { [(left as UnibaseDecoder<L>).prefix]: left }),\n ...(right.decoders ?? { [(right as UnibaseDecoder<R>).prefix]: right })\n } as Decoders<L | R>)\n}\n\nexport class Codec<Base extends string, Prefix extends string> implements MultibaseCodec<Prefix>, MultibaseEncoder<Prefix>, MultibaseDecoder<Prefix>, BaseCodec, BaseEncoder, BaseDecoder {\n readonly name: Base\n readonly prefix: Prefix\n readonly baseEncode: EncodeFn\n readonly baseDecode: DecodeFn\n readonly encoder: Encoder<Base, Prefix>\n readonly decoder: Decoder<Base, Prefix>\n\n constructor (name: Base, prefix: Prefix, baseEncode: EncodeFn, baseDecode: DecodeFn) {\n this.name = name\n this.prefix = prefix\n this.baseEncode = baseEncode\n this.baseDecode = baseDecode\n this.encoder = new Encoder(name, prefix, baseEncode)\n this.decoder = new Decoder(name, prefix, baseDecode)\n }\n\n encode (input: Uint8Array): string {\n return this.encoder.encode(input)\n }\n\n decode (input: string): Uint8Array<ArrayBuffer> {\n return this.decoder.decode(input)\n }\n}\n\nexport function from <Base extends string, Prefix extends string> ({ name, prefix, encode, decode }: { name: Base, prefix: Prefix, encode: EncodeFn, decode: DecodeFn }): Codec<Base, Prefix> {\n return new Codec(name, prefix, encode, decode)\n}\n\nexport function baseX <Base extends string, Prefix extends string> ({ name, prefix, alphabet }: { name: Base, prefix: Prefix, alphabet: string }): Codec<Base, Prefix> {\n const { encode, decode } = basex(alphabet, name)\n return from({\n prefix,\n name,\n encode,\n decode: (text: string): Uint8Array<ArrayBuffer> => coerce(decode(text))\n })\n}\n\nfunction decode (string: string, alphabetIdx: Record<string, number>, bitsPerChar: number, name: string): Uint8Array<ArrayBuffer> {\n // Count the padding bytes:\n let end = string.length\n while (string[end - 1] === '=') {\n --end\n }\n\n // Allocate the output:\n const out = new Uint8Array((end * bitsPerChar / 8) | 0)\n\n // Parse the data:\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n let written = 0 // Next byte to write\n for (let i = 0; i < end; ++i) {\n // Read one character from the string:\n const value = alphabetIdx[string[i]]\n if (value === undefined) {\n throw new SyntaxError(`Non-${name} character`)\n }\n\n // Append the bits to the buffer:\n buffer = (buffer << bitsPerChar) | value\n bits += bitsPerChar\n\n // Write out some bits if the buffer has a byte's worth:\n if (bits >= 8) {\n bits -= 8\n out[written++] = 0xff & (buffer >> bits)\n }\n }\n\n // Verify that we have received just enough bits:\n if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {\n throw new SyntaxError('Unexpected end of data')\n }\n\n return out\n}\n\nfunction encode (data: Uint8Array, alphabet: string, bitsPerChar: number): string {\n const pad = alphabet[alphabet.length - 1] === '='\n const mask = (1 << bitsPerChar) - 1\n let out = ''\n\n let bits = 0 // Number of bits currently in the buffer\n let buffer = 0 // Bits waiting to be written out, MSB first\n for (let i = 0; i < data.length; ++i) {\n // Slurp data into the buffer:\n buffer = (buffer << 8) | data[i]\n bits += 8\n\n // Write out as much as we can:\n while (bits > bitsPerChar) {\n bits -= bitsPerChar\n out += alphabet[mask & (buffer >> bits)]\n }\n }\n\n // Partial character:\n if (bits !== 0) {\n out += alphabet[mask & (buffer << (bitsPerChar - bits))]\n }\n\n // Add padding characters until we hit a byte boundary:\n if (pad) {\n while (((out.length * bitsPerChar) & 7) !== 0) {\n out += '='\n }\n }\n\n return out\n}\n\nfunction createAlphabetIdx (alphabet: string): Record<string, number> {\n // Build the character lookup table:\n const alphabetIdx: Record<string, number> = {}\n for (let i = 0; i < alphabet.length; ++i) {\n alphabetIdx[alphabet[i]] = i\n }\n return alphabetIdx\n}\n\n/**\n * RFC4648 Factory\n */\nexport function rfc4648 <Base extends string, Prefix extends string> ({ name, prefix, bitsPerChar, alphabet }: { name: Base, prefix: Prefix, bitsPerChar: number, alphabet: string }): Codec<Base, Prefix> {\n const alphabetIdx = createAlphabetIdx(alphabet)\n return from({\n prefix,\n name,\n encode (input: Uint8Array): string {\n return encode(input, alphabet, bitsPerChar)\n },\n decode (input: string): Uint8Array<ArrayBuffer> {\n return decode(input, alphabetIdx, bitsPerChar, name)\n }\n })\n}\n", "import { rfc4648 } from './base.ts'\n\nexport const base16 = rfc4648({\n prefix: 'f',\n name: 'base16',\n alphabet: '0123456789abcdef',\n bitsPerChar: 4\n})\n\nexport const base16upper = rfc4648({\n prefix: 'F',\n name: 'base16upper',\n alphabet: '0123456789ABCDEF',\n bitsPerChar: 4\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base2 = rfc4648({\n prefix: '0',\n name: 'base2',\n alphabet: '01',\n bitsPerChar: 1\n})\n", "import { from } from './base.ts'\n\nconst alphabet = Array.from('\uD83D\uDE80\uD83E\uDE90\u2604\uD83D\uDEF0\uD83C\uDF0C\uD83C\uDF11\uD83C\uDF12\uD83C\uDF13\uD83C\uDF14\uD83C\uDF15\uD83C\uDF16\uD83C\uDF17\uD83C\uDF18\uD83C\uDF0D\uD83C\uDF0F\uD83C\uDF0E\uD83D\uDC09\u2600\uD83D\uDCBB\uD83D\uDDA5\uD83D\uDCBE\uD83D\uDCBF\uD83D\uDE02\u2764\uD83D\uDE0D\uD83E\uDD23\uD83D\uDE0A\uD83D\uDE4F\uD83D\uDC95\uD83D\uDE2D\uD83D\uDE18\uD83D\uDC4D\uD83D\uDE05\uD83D\uDC4F\uD83D\uDE01\uD83D\uDD25\uD83E\uDD70\uD83D\uDC94\uD83D\uDC96\uD83D\uDC99\uD83D\uDE22\uD83E\uDD14\uD83D\uDE06\uD83D\uDE44\uD83D\uDCAA\uD83D\uDE09\u263A\uD83D\uDC4C\uD83E\uDD17\uD83D\uDC9C\uD83D\uDE14\uD83D\uDE0E\uD83D\uDE07\uD83C\uDF39\uD83E\uDD26\uD83C\uDF89\uD83D\uDC9E\u270C\u2728\uD83E\uDD37\uD83D\uDE31\uD83D\uDE0C\uD83C\uDF38\uD83D\uDE4C\uD83D\uDE0B\uD83D\uDC97\uD83D\uDC9A\uD83D\uDE0F\uD83D\uDC9B\uD83D\uDE42\uD83D\uDC93\uD83E\uDD29\uD83D\uDE04\uD83D\uDE00\uD83D\uDDA4\uD83D\uDE03\uD83D\uDCAF\uD83D\uDE48\uD83D\uDC47\uD83C\uDFB6\uD83D\uDE12\uD83E\uDD2D\u2763\uD83D\uDE1C\uD83D\uDC8B\uD83D\uDC40\uD83D\uDE2A\uD83D\uDE11\uD83D\uDCA5\uD83D\uDE4B\uD83D\uDE1E\uD83D\uDE29\uD83D\uDE21\uD83E\uDD2A\uD83D\uDC4A\uD83E\uDD73\uD83D\uDE25\uD83E\uDD24\uD83D\uDC49\uD83D\uDC83\uD83D\uDE33\u270B\uD83D\uDE1A\uD83D\uDE1D\uD83D\uDE34\uD83C\uDF1F\uD83D\uDE2C\uD83D\uDE43\uD83C\uDF40\uD83C\uDF37\uD83D\uDE3B\uD83D\uDE13\u2B50\u2705\uD83E\uDD7A\uD83C\uDF08\uD83D\uDE08\uD83E\uDD18\uD83D\uDCA6\u2714\uD83D\uDE23\uD83C\uDFC3\uD83D\uDC90\u2639\uD83C\uDF8A\uD83D\uDC98\uD83D\uDE20\u261D\uD83D\uDE15\uD83C\uDF3A\uD83C\uDF82\uD83C\uDF3B\uD83D\uDE10\uD83D\uDD95\uD83D\uDC9D\uD83D\uDE4A\uD83D\uDE39\uD83D\uDDE3\uD83D\uDCAB\uD83D\uDC80\uD83D\uDC51\uD83C\uDFB5\uD83E\uDD1E\uD83D\uDE1B\uD83D\uDD34\uD83D\uDE24\uD83C\uDF3C\uD83D\uDE2B\u26BD\uD83E\uDD19\u2615\uD83C\uDFC6\uD83E\uDD2B\uD83D\uDC48\uD83D\uDE2E\uD83D\uDE46\uD83C\uDF7B\uD83C\uDF43\uD83D\uDC36\uD83D\uDC81\uD83D\uDE32\uD83C\uDF3F\uD83E\uDDE1\uD83C\uDF81\u26A1\uD83C\uDF1E\uD83C\uDF88\u274C\u270A\uD83D\uDC4B\uD83D\uDE30\uD83E\uDD28\uD83D\uDE36\uD83E\uDD1D\uD83D\uDEB6\uD83D\uDCB0\uD83C\uDF53\uD83D\uDCA2\uD83E\uDD1F\uD83D\uDE41\uD83D\uDEA8\uD83D\uDCA8\uD83E\uDD2C\u2708\uD83C\uDF80\uD83C\uDF7A\uD83E\uDD13\uD83D\uDE19\uD83D\uDC9F\uD83C\uDF31\uD83D\uDE16\uD83D\uDC76\uD83E\uDD74\u25B6\u27A1\u2753\uD83D\uDC8E\uD83D\uDCB8\u2B07\uD83D\uDE28\uD83C\uDF1A\uD83E\uDD8B\uD83D\uDE37\uD83D\uDD7A\u26A0\uD83D\uDE45\uD83D\uDE1F\uD83D\uDE35\uD83D\uDC4E\uD83E\uDD32\uD83E\uDD20\uD83E\uDD27\uD83D\uDCCC\uD83D\uDD35\uD83D\uDC85\uD83E\uDDD0\uD83D\uDC3E\uD83C\uDF52\uD83D\uDE17\uD83E\uDD11\uD83C\uDF0A\uD83E\uDD2F\uD83D\uDC37\u260E\uD83D\uDCA7\uD83D\uDE2F\uD83D\uDC86\uD83D\uDC46\uD83C\uDFA4\uD83D\uDE47\uD83C\uDF51\u2744\uD83C\uDF34\uD83D\uDCA3\uD83D\uDC38\uD83D\uDC8C\uD83D\uDCCD\uD83E\uDD40\uD83E\uDD22\uD83D\uDC45\uD83D\uDCA1\uD83D\uDCA9\uD83D\uDC50\uD83D\uDCF8\uD83D\uDC7B\uD83E\uDD10\uD83E\uDD2E\uD83C\uDFBC\uD83E\uDD75\uD83D\uDEA9\uD83C\uDF4E\uD83C\uDF4A\uD83D\uDC7C\uD83D\uDC8D\uD83D\uDCE3\uD83E\uDD42')\nconst alphabetBytesToChars: string[] = (alphabet.reduce<string[]>((p, c, i) => { p[i] = c; return p }, ([])))\nconst alphabetCharsToBytes: number[] = (alphabet.reduce<number[]>((p, c, i) => {\n const codePoint = c.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${c}`)\n }\n p[codePoint] = i\n return p\n}, ([])))\n\nfunction encode (data: Uint8Array): string {\n return data.reduce((p, c) => {\n p += alphabetBytesToChars[c]\n return p\n }, '')\n}\n\nfunction decode (str: string): Uint8Array<ArrayBuffer> {\n const byts = []\n for (const char of str) {\n const codePoint = char.codePointAt(0)\n if (codePoint == null) {\n throw new Error(`Invalid character: ${char}`)\n }\n const byt = alphabetCharsToBytes[codePoint]\n if (byt == null) {\n throw new Error(`Non-base256emoji character: ${char}`)\n }\n byts.push(byt)\n }\n return new Uint8Array(byts)\n}\n\nexport const base256emoji = from({\n prefix: '\uD83D\uDE80',\n name: 'base256emoji',\n encode,\n decode\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base32 = rfc4648({\n prefix: 'b',\n name: 'base32',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567',\n bitsPerChar: 5\n})\n\nexport const base32upper = rfc4648({\n prefix: 'B',\n name: 'base32upper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',\n bitsPerChar: 5\n})\n\nexport const base32pad = rfc4648({\n prefix: 'c',\n name: 'base32pad',\n alphabet: 'abcdefghijklmnopqrstuvwxyz234567=',\n bitsPerChar: 5\n})\n\nexport const base32padupper = rfc4648({\n prefix: 'C',\n name: 'base32padupper',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',\n bitsPerChar: 5\n})\n\nexport const base32hex = rfc4648({\n prefix: 'v',\n name: 'base32hex',\n alphabet: '0123456789abcdefghijklmnopqrstuv',\n bitsPerChar: 5\n})\n\nexport const base32hexupper = rfc4648({\n prefix: 'V',\n name: 'base32hexupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV',\n bitsPerChar: 5\n})\n\nexport const base32hexpad = rfc4648({\n prefix: 't',\n name: 'base32hexpad',\n alphabet: '0123456789abcdefghijklmnopqrstuv=',\n bitsPerChar: 5\n})\n\nexport const base32hexpadupper = rfc4648({\n prefix: 'T',\n name: 'base32hexpadupper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV=',\n bitsPerChar: 5\n})\n\nexport const base32z = rfc4648({\n prefix: 'h',\n name: 'base32z',\n alphabet: 'ybndrfg8ejkmcpqxot1uwisza345h769',\n bitsPerChar: 5\n})\n", "import { baseX } from './base.ts'\n\nexport const base36 = baseX({\n prefix: 'k',\n name: 'base36',\n alphabet: '0123456789abcdefghijklmnopqrstuvwxyz'\n})\n\nexport const base36upper = baseX({\n prefix: 'K',\n name: 'base36upper',\n alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n})\n", "import { baseX } from './base.ts'\n\nexport const base58btc = baseX({\n name: 'base58btc',\n prefix: 'z',\n alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n})\n\nexport const base58flickr = baseX({\n name: 'base58flickr',\n prefix: 'Z',\n alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base64 = rfc4648({\n prefix: 'm',\n name: 'base64',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n bitsPerChar: 6\n})\n\nexport const base64pad = rfc4648({\n prefix: 'M',\n name: 'base64pad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n bitsPerChar: 6\n})\n\nexport const base64url = rfc4648({\n prefix: 'u',\n name: 'base64url',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',\n bitsPerChar: 6\n})\n\nexport const base64urlpad = rfc4648({\n prefix: 'U',\n name: 'base64urlpad',\n alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',\n bitsPerChar: 6\n})\n", "import { rfc4648 } from './base.ts'\n\nexport const base8 = rfc4648({\n prefix: '7',\n name: 'base8',\n alphabet: '01234567',\n bitsPerChar: 3\n})\n", "import { fromString, toString } from '../bytes.ts'\nimport { from } from './base.ts'\n\nexport const identity = from({\n prefix: '\\x00',\n name: 'identity',\n encode: (buf) => toString(buf),\n decode: (str) => fromString(str)\n})\n", "import type { ArrayBufferView, ByteView } from './interface.ts'\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport const name = 'json'\nexport const code = 0x0200\n\nexport function encode <T> (node: T): ByteView<T> {\n return textEncoder.encode(JSON.stringify(node))\n}\n\nexport function decode <T> (data: ByteView<T> | ArrayBufferView<T>): T {\n return JSON.parse(textDecoder.decode(data))\n}\n", "import { coerce } from '../bytes.ts'\nimport * as Digest from './digest.ts'\nimport type { DigestOptions } from './hasher.ts'\nimport type { SyncMultihashHasher } from './interface.ts'\n\nconst code: 0x0 = 0x0\nconst name = 'identity'\n\nconst encode: (input: Uint8Array) => Uint8Array<ArrayBuffer> = coerce\n\nfunction digest (input: Uint8Array, options?: DigestOptions): Digest.Digest<typeof code, number> {\n if (options?.truncate != null && options.truncate !== input.byteLength) {\n if (options.truncate < 0 || options.truncate > input.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${input.byteLength}`)\n }\n\n input = input.subarray(0, options.truncate)\n }\n\n return Digest.create(code, encode(input))\n}\n\nexport const identity: SyncMultihashHasher<0x00> = { code, name, encode, digest }\n", "/* eslint-disable */\nvar encode_1 = encode;\n\nvar MSB = 0x80\n , REST = 0x7F\n , MSBALL = ~REST\n , INT = Math.pow(2, 31);\n\n/**\n * @param {number} num\n * @param {number[]} out\n * @param {number} offset\n */\nfunction encode(num, out, offset) {\n out = out || [];\n offset = offset || 0;\n var oldOffset = offset;\n\n while(num >= INT) {\n out[offset++] = (num & 0xFF) | MSB;\n num /= 128;\n }\n while(num & MSBALL) {\n out[offset++] = (num & 0xFF) | MSB;\n num >>>= 7;\n }\n out[offset] = num | 0;\n \n // @ts-ignore\n encode.bytes = offset - oldOffset + 1;\n \n return out\n}\n\nvar decode = read;\n\nvar MSB$1 = 0x80\n , REST$1 = 0x7F;\n\n/**\n * @param {string | any[]} buf\n * @param {number} offset\n */\nfunction read(buf, offset) {\n var res = 0\n , offset = offset || 0\n , shift = 0\n , counter = offset\n , b\n , l = buf.length;\n\n do {\n if (counter >= l) {\n // @ts-ignore\n read.bytes = 0;\n throw new RangeError('Could not decode varint')\n }\n b = buf[counter++];\n res += shift < 28\n ? (b & REST$1) << shift\n : (b & REST$1) * Math.pow(2, shift);\n shift += 7;\n } while (b >= MSB$1)\n\n // @ts-ignore\n read.bytes = counter - offset;\n\n return res\n}\n\nvar N1 = Math.pow(2, 7);\nvar N2 = Math.pow(2, 14);\nvar N3 = Math.pow(2, 21);\nvar N4 = Math.pow(2, 28);\nvar N5 = Math.pow(2, 35);\nvar N6 = Math.pow(2, 42);\nvar N7 = Math.pow(2, 49);\nvar N8 = Math.pow(2, 56);\nvar N9 = Math.pow(2, 63);\n\nvar length = function (/** @type {number} */ value) {\n return (\n value < N1 ? 1\n : value < N2 ? 2\n : value < N3 ? 3\n : value < N4 ? 4\n : value < N5 ? 5\n : value < N6 ? 6\n : value < N7 ? 7\n : value < N8 ? 8\n : value < N9 ? 9\n : 10\n )\n};\n\nvar varint = {\n encode: encode_1\n , decode: decode\n , encodingLength: length\n};\n\nvar _brrp_varint = varint;\n\nexport default _brrp_varint;\n", "import varint from './vendor/varint.js'\n\nexport function decode (data: Uint8Array, offset = 0): [number, number] {\n const code = varint.decode(data, offset)\n return [code, varint.decode.bytes]\n}\n\nexport function encodeTo (int: number, target: Uint8Array, offset = 0): Uint8Array {\n varint.encode(int, target, offset)\n return target\n}\n\nexport function encodingLength (int: number): number {\n return varint.encodingLength(int)\n}\n", "import { coerce, equals as equalBytes, toArrayBufferBackedArray } from '../bytes.ts'\nimport * as varint from '../varint.ts'\nimport type { MultihashDigest } from './interface.ts'\n\n/**\n * Creates a multihash digest.\n */\nexport function create <Code extends number> (code: Code, digest: Uint8Array): Digest<Code, number> {\n const size = digest.byteLength\n const sizeOffset = varint.encodingLength(code)\n const digestOffset = sizeOffset + varint.encodingLength(size)\n\n const bytes = new Uint8Array(digestOffset + size)\n varint.encodeTo(code, bytes, 0)\n varint.encodeTo(size, bytes, sizeOffset)\n bytes.set(digest, digestOffset)\n\n return new Digest(code, size, digest, bytes)\n}\n\n/**\n * Turns bytes representation of multihash digest into an instance.\n */\nexport function decode (multihash: Uint8Array): MultihashDigest {\n const bytes = coerce(multihash)\n const [code, sizeOffset] = varint.decode(bytes)\n const [size, digestOffset] = varint.decode(bytes.subarray(sizeOffset))\n const digest = bytes.subarray(sizeOffset + digestOffset)\n\n if (digest.byteLength !== size) {\n throw new Error('Incorrect length')\n }\n\n return new Digest(code, size, digest, bytes)\n}\n\nexport function equals (a: MultihashDigest, b: unknown): b is MultihashDigest {\n if (a === b) {\n return true\n } else {\n const data = b as { code?: unknown, size?: unknown, bytes?: unknown }\n\n return (\n a.code === data.code &&\n a.size === data.size &&\n data.bytes instanceof Uint8Array &&\n equalBytes(a.bytes, data.bytes)\n )\n }\n}\n\n/**\n * Represents a multihash digest which carries information about the\n * hashing algorithm and an actual hash digest.\n */\nexport class Digest<Code extends number, Size extends number> implements MultihashDigest {\n readonly code: Code\n readonly size: Size\n readonly digest: Uint8Array<ArrayBuffer>\n readonly bytes: Uint8Array<ArrayBuffer>\n\n /**\n * Creates a multihash digest.\n */\n constructor (code: Code, size: Size, digest: Uint8Array, bytes: Uint8Array) {\n this.code = code\n this.size = size\n this.digest = toArrayBufferBackedArray(digest)\n this.bytes = toArrayBufferBackedArray(bytes)\n }\n}\n\n/**\n * Used to check that the passed multihash has the passed code\n */\nexport function hasCode <T extends number> (digest: MultihashDigest, code: T): digest is MultihashDigest<T> {\n return digest.code === code\n}\n", "import { from } from './hasher.ts'\n\nfunction sha (name: AlgorithmIdentifier): (data: Uint8Array<ArrayBuffer>) => Promise<Uint8Array<ArrayBuffer>> {\n return async data => new Uint8Array(await crypto.subtle.digest(name, data))\n}\n\nexport const sha256 = from({\n name: 'sha2-256',\n code: 0x12,\n encode: sha('SHA-256')\n})\n\nexport const sha512 = from({\n name: 'sha2-512',\n code: 0x13,\n encode: sha('SHA-512')\n})\n", "import * as Digest from './digest.ts'\nimport type { MultihashHasher } from './interface.ts'\n\ntype Await<T> = Promise<T> | T\n\nconst DEFAULT_MIN_DIGEST_LENGTH = 20\n\nexport interface HasherInit <Name extends string, Code extends number> {\n name: Name\n code: Code\n encode(input: Uint8Array): Await<Uint8Array<ArrayBuffer>>\n\n /**\n * The minimum length a hash is allowed to be truncated to in bytes\n *\n * @default 20\n */\n minDigestLength?: number\n\n /**\n * The maximum length a hash is allowed to be truncated to in bytes. If not\n * specified it will be inferred from the length of the digest.\n */\n maxDigestLength?: number\n}\n\nexport function from <Name extends string, Code extends number> ({ name, code, encode, minDigestLength, maxDigestLength }: HasherInit<Name, Code>): MultihashHasher<Code> {\n return new Hasher(name, code, encode, minDigestLength, maxDigestLength)\n}\n\nexport interface DigestOptions {\n /**\n * Truncate the returned digest to this number of bytes.\n *\n * This may cause the digest method to throw/reject if the passed value is\n * greater than the digest length or below a threshold under which the risk of\n * hash collisions is significant.\n *\n * The actual value of this threshold can depend on the hashing algorithm in\n * use.\n */\n truncate?: number\n}\n\n/**\n * Hasher represents a hashing algorithm implementation that produces as\n * `MultihashDigest`.\n */\nexport class Hasher<Name extends string, Code extends number> implements MultihashHasher<Code> {\n readonly name: Name\n readonly code: Code\n readonly encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>\n readonly minDigestLength: number\n readonly maxDigestLength?: number\n\n constructor (name: Name, code: Code, encode: (input: Uint8Array) => Await<Uint8Array<ArrayBuffer>>, minDigestLength?: number, maxDigestLength?: number) {\n this.name = name\n this.code = code\n this.encode = encode\n this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH\n this.maxDigestLength = maxDigestLength\n }\n\n digest (input: Uint8Array, options?: DigestOptions): Await<Digest.Digest<Code, number>> {\n if (options?.truncate != null) {\n if (options.truncate < this.minDigestLength) {\n throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`)\n }\n\n if (this.maxDigestLength != null && options.truncate > this.maxDigestLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`)\n }\n }\n\n if (input instanceof Uint8Array) {\n const result = this.encode(input)\n\n if (result instanceof Uint8Array) {\n return createDigest(result, this.code, options?.truncate)\n }\n\n return result.then(digest => createDigest(digest, this.code, options?.truncate))\n } else {\n throw Error('Unknown type, must be binary type')\n /* c8 ignore next 1 */\n }\n }\n}\n\n/**\n * Create a Digest from the passed uint8array and code, optionally truncating it\n * first.\n */\nfunction createDigest <Code extends number> (digest: Uint8Array, code: Code, truncate?: number): Digest.Digest<Code, number> {\n if (truncate != null && truncate !== digest.byteLength) {\n if (truncate > digest.byteLength) {\n throw new Error(`Invalid truncate option, must be less than or equal to ${digest.byteLength}`)\n }\n\n digest = digest.subarray(0, truncate)\n }\n\n return Digest.create(code, digest)\n}\n", "import { base32 } from './bases/base32.ts'\nimport { base36 } from './bases/base36.ts'\nimport { base58btc } from './bases/base58.ts'\nimport { coerce, toArrayBufferBackedArray } from './bytes.ts'\nimport * as Digest from './hashes/digest.ts'\nimport * as varint from './varint.ts'\nimport type * as API from './link/interface.ts'\n\n// This way TS will also expose all the types from module\nexport * from './link/interface.ts'\n\nexport function format <T extends API.Link<unknown, number, number, API.Version>, Prefix extends string> (link: T, base?: API.MultibaseEncoder<Prefix>): API.ToString<T, Prefix> {\n const { bytes, version } = link\n switch (version) {\n case 0:\n return toStringV0(\n bytes,\n baseCache(link),\n base as API.MultibaseEncoder<'z'> ?? base58btc.encoder\n )\n default:\n return toStringV1(\n bytes,\n baseCache(link),\n (base ?? base32.encoder) as API.MultibaseEncoder<Prefix>\n )\n }\n}\n\nexport function toJSON <Link extends API.UnknownLink> (link: Link): API.LinkJSON<Link> {\n return {\n '/': format(link)\n }\n}\n\nexport function fromJSON <Link extends API.UnknownLink> (json: API.LinkJSON<Link>): CID<unknown, number, number, API.Version> {\n return CID.parse(json['/'])\n}\n\nconst cache = new WeakMap<API.UnknownLink, Map<string, string>>()\n\nfunction baseCache (cid: API.UnknownLink): Map<string, string> {\n const baseCache = cache.get(cid)\n if (baseCache == null) {\n const baseCache = new Map()\n cache.set(cid, baseCache)\n return baseCache\n }\n return baseCache\n}\n\nexport class CID<Data = unknown, Format extends number = number, Alg extends number = number, Version extends API.Version = API.Version> implements API.Link<Data, Format, Alg, Version> {\n readonly code: Format\n readonly version: Version\n readonly multihash: API.MultihashDigest<Alg>\n readonly bytes: Uint8Array<ArrayBuffer>\n readonly '/': Uint8Array<ArrayBuffer>\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param multihash - (Multi)hash of the of the content.\n */\n constructor (version: Version, code: Format, multihash: API.MultihashDigest<Alg>, bytes: Uint8Array) {\n this.code = code\n this.version = version\n this.multihash = multihash\n this.bytes = toArrayBufferBackedArray(bytes)\n\n // flag to serializers that this is a CID and\n // should be treated specially\n this['/'] = this.bytes\n }\n\n /**\n * Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`\n * please either use `CID.asCID(cid)` or switch to new signalling mechanism\n *\n * @deprecated\n */\n get asCID (): this {\n return this\n }\n\n // ArrayBufferView\n get byteOffset (): number {\n return this.bytes.byteOffset\n }\n\n // ArrayBufferView\n get byteLength (): number {\n return this.bytes.byteLength\n }\n\n toV0 (): CID<Data, API.DAG_PB, API.SHA_256, 0> {\n switch (this.version) {\n case 0: {\n return this as CID<Data, API.DAG_PB, API.SHA_256, 0>\n }\n case 1: {\n const { code, multihash } = this\n\n if (code !== DAG_PB_CODE) {\n throw new Error('Cannot convert a non dag-pb CID to CIDv0')\n }\n\n // sha2-256\n if (multihash.code !== SHA_256_CODE) {\n throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0')\n }\n\n return (\n CID.createV0(\n multihash as API.MultihashDigest<API.SHA_256>\n )\n )\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 0. This is a bug please report`\n )\n }\n }\n }\n\n toV1 (): CID<Data, Format, Alg, 1> {\n switch (this.version) {\n case 0: {\n const { code, digest } = this.multihash\n const multihash = Digest.create(code, digest)\n return (\n CID.createV1(this.code, multihash)\n )\n }\n case 1: {\n return this as CID<Data, Format, Alg, 1>\n }\n default: {\n throw Error(\n `Can not convert CID version ${this.version} to version 1. This is a bug please report`\n )\n }\n }\n }\n\n equals (other: unknown): other is CID<Data, Format, Alg, Version> {\n return CID.equals(this, other)\n }\n\n static equals <Data, Format extends number, Alg extends number, Version extends API.Version>(self: API.Link<Data, Format, Alg, Version>, other: unknown): other is CID {\n const unknown = other as { code?: unknown, version?: unknown, multihash?: unknown }\n return (\n unknown != null &&\n self.code === unknown.code &&\n self.version === unknown.version &&\n Digest.equals(self.multihash, unknown.multihash)\n )\n }\n\n toString (base?: API.MultibaseEncoder<string>): string {\n return format(this, base)\n }\n\n toJSON (): API.LinkJSON<this> {\n return { '/': format(this) }\n }\n\n link (): this {\n return this\n }\n\n readonly [Symbol.toStringTag] = 'CID';\n\n // Legacy\n\n [Symbol.for('nodejs.util.inspect.custom')] (): string {\n return `CID(${this.toString()})`\n }\n\n /**\n * Takes any input `value` and returns a `CID` instance if it was\n * a `CID` otherwise returns `null`. If `value` is instanceof `CID`\n * it will return value back. If `value` is not instance of this CID\n * class, but is compatible CID it will return new instance of this\n * `CID` class. Otherwise returns null.\n *\n * This allows two different incompatible versions of CID library to\n * co-exist and interop as long as binary interface is compatible.\n */\n static asCID <Data, Format extends number, Alg extends number, Version extends API.Version, U>(input: API.Link<Data, Format, Alg, Version> | U): CID<Data, Format, Alg, Version> | null {\n if (input == null) {\n return null\n }\n\n const value = input as any\n if (value instanceof CID) {\n // If value is instance of CID then we're all set.\n return value\n } else if ((value['/'] != null && value['/'] === value.bytes) || value.asCID === value) {\n // If value isn't instance of this CID class but `this.asCID === this` or\n // `value['/'] === value.bytes` is true it is CID instance coming from a\n // different implementation (diff version or duplicate). In that case we\n // rebase it to this `CID` implementation so caller is guaranteed to get\n // instance with expected API.\n const { version, code, multihash, bytes } = value\n return new CID(\n version,\n code,\n multihash as API.MultihashDigest<Alg>,\n bytes ?? encodeCID(version, code, multihash.bytes)\n )\n } else if (value[cidSymbol] === true) {\n // If value is a CID from older implementation that used to be tagged via\n // symbol we still rebase it to the this `CID` implementation by\n // delegating that to a constructor.\n const { version, multihash, code } = value\n const digest = Digest.decode(multihash) as API.MultihashDigest<Alg>\n return CID.create(version, code, digest)\n } else {\n // Otherwise value is not a CID (or an incompatible version of it) in\n // which case we return `null`.\n return null\n }\n }\n\n /**\n * @param version - Version of the CID\n * @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv\n * @param digest - (Multi)hash of the of the content.\n */\n static create <Data, Format extends number, Alg extends number, Version extends API.Version>(version: Version, code: Format, digest: API.MultihashDigest<Alg>): CID<Data, Format, Alg, Version> {\n if (typeof code !== 'number') {\n throw new Error('String codecs are no longer supported')\n }\n\n if (!(digest.bytes instanceof Uint8Array)) {\n throw new Error('Invalid digest')\n }\n\n switch (version) {\n case 0: {\n if (code !== DAG_PB_CODE) {\n throw new Error(\n `Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`\n )\n } else {\n return new CID(version, code, digest, digest.bytes)\n }\n }\n case 1: {\n const bytes = encodeCID(version, code, digest.bytes)\n return new CID(version, code, digest, bytes)\n }\n default: {\n throw new Error('Invalid version')\n }\n }\n }\n\n /**\n * Simplified version of `create` for CIDv0.\n */\n static createV0 <T = unknown>(digest: API.MultihashDigest<typeof SHA_256_CODE>): CID<T, typeof DAG_PB_CODE, typeof SHA_256_CODE, 0> {\n return CID.create(0, DAG_PB_CODE, digest)\n }\n\n /**\n * Simplified version of `create` for CIDv1.\n *\n * @param code - Content encoding format code.\n * @param digest - Multihash of the content.\n */\n static createV1 <Data, Code extends number, Alg extends number>(code: Code, digest: API.MultihashDigest<Alg>): CID<Data, Code, Alg, 1> {\n return CID.create(1, code, digest)\n }\n\n /**\n * Decoded a CID from its binary representation. The byte array must contain\n * only the CID with no additional bytes.\n *\n * An error will be thrown if the bytes provided do not contain a valid\n * binary representation of a CID.\n */\n static decode <Data, Code extends number, Alg extends number, Version extends API.Version>(bytes: API.ByteView<API.Link<Data, Code, Alg, Version>>): CID<Data, Code, Alg, Version> {\n const [cid, remainder] = CID.decodeFirst(bytes)\n if (remainder.length !== 0) {\n throw new Error('Incorrect length')\n }\n return cid\n }\n\n /**\n * Decoded a CID from its binary representation at the beginning of a byte\n * array.\n *\n * Returns an array with the first element containing the CID and the second\n * element containing the remainder of the original byte array. The remainder\n * will be a zero-length byte array if the provided bytes only contained a\n * binary CID representation.\n */\n static decodeFirst <T, C extends number, A extends number, V extends API.Version>(bytes: API.ByteView<API.Link<T, C, A, V>>): [CID<T, C, A, V>, Uint8Array] {\n const specs = CID.inspectBytes(bytes)\n const prefixSize = specs.size - specs.multihashSize\n const multihashBytes = coerce(\n bytes.subarray(prefixSize, prefixSize + specs.multihashSize)\n )\n if (multihashBytes.byteLength !== specs.multihashSize) {\n throw new Error('Incorrect length')\n }\n const digestBytes = multihashBytes.subarray(\n specs.multihashSize - specs.digestSize\n )\n const digest = new Digest.Digest(\n specs.multihashCode,\n specs.digestSize,\n digestBytes,\n multihashBytes\n )\n const cid =\n specs.version === 0\n ? CID.createV0(digest as API.MultihashDigest<API.SHA_256>)\n : CID.createV1(specs.codec, digest)\n return [cid as CID<T, C, A, V>, bytes.subarray(specs.size)]\n }\n\n /**\n * Inspect the initial bytes of a CID to determine its properties.\n *\n * Involves decoding up to 4 varints. Typically this will require only 4 to 6\n * bytes but for larger multicodec code values and larger multihash digest\n * lengths these varints can be quite large. It is recommended that at least\n * 10 bytes be made available in the `initialBytes` argument for a complete\n * inspection.\n */\n static inspectBytes <T, C extends number, A extends number, V extends API.Version>(initialBytes: API.ByteView<API.Link<T, C, A, V>>): { version: V, codec: C, multihashCode: A, digestSize: number, multihashSize: number, size: number } {\n let offset = 0\n const next = (): number => {\n const [i, length] = varint.decode(initialBytes.subarray(offset))\n offset += length\n return i\n }\n\n let version = next() as V\n let codec = DAG_PB_CODE as C\n if (version as number === 18) {\n // CIDv0\n version = 0 as V\n offset = 0\n } else {\n codec = next() as C\n }\n\n if (version !== 0 && version !== 1) {\n throw new RangeError(`Invalid CID version ${version}`)\n }\n\n const prefixSize = offset\n const multihashCode = next() as A // multihash code\n const digestSize = next() // multihash length\n const size = offset + digestSize\n const multihashSize = size - prefixSize\n\n return { version, codec, multihashCode, digestSize, multihashSize, size }\n }\n\n /**\n * Takes cid in a string representation and creates an instance. If `base`\n * decoder is not provided will use a default from the configuration. It will\n * throw an error if encoding of the CID is not compatible with supplied (or\n * a default decoder).\n */\n static parse <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version>(source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): CID<Data, Code, Alg, Version> {\n const [prefix, bytes] = parseCIDtoBytes(source, base)\n\n const cid = CID.decode(bytes)\n\n if (cid.version === 0 && source[0] !== 'Q') {\n throw Error('Version 0 CID string must not include multibase prefix')\n }\n\n // Cache string representation to avoid computing it on `this.toString()`\n baseCache(cid).set(prefix, source)\n\n return cid\n }\n}\n\nfunction parseCIDtoBytes <Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version> (source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): [Prefix, API.ByteView<API.Link<Data, Code, Alg, Version>>] {\n switch (source[0]) {\n // CIDv0 is parsed differently\n case 'Q': {\n const decoder = base ?? base58btc\n return [\n base58btc.prefix as Prefix,\n decoder.decode(`${base58btc.prefix}${source}`)\n ]\n }\n case base58btc.prefix: {\n const decoder = base ?? base58btc\n return [base58btc.prefix as Prefix, decoder.decode(source)]\n }\n case base32.prefix: {\n const decoder = base ?? base32\n return [base32.prefix as Prefix, decoder.decode(source)]\n }\n case base36.prefix: {\n const decoder = base ?? base36\n return [base36.prefix as Prefix, decoder.decode(source)]\n }\n default: {\n if (base == null) {\n throw Error(\n 'To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided'\n )\n }\n return [source[0] as Prefix, base.decode(source)]\n }\n }\n}\n\nfunction toStringV0 (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<'z'>): string {\n const { prefix } = base\n if (prefix !== base58btc.prefix) {\n throw Error(`Cannot string encode V0 in ${base.name} encoding`)\n }\n\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes).slice(1)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nfunction toStringV1 <Prefix extends string> (bytes: Uint8Array, cache: Map<string, string>, base: API.MultibaseEncoder<Prefix>): string {\n const { prefix } = base\n const cid = cache.get(prefix)\n if (cid == null) {\n const cid = base.encode(bytes)\n cache.set(prefix, cid)\n return cid\n } else {\n return cid\n }\n}\n\nconst DAG_PB_CODE = 0x70\nconst SHA_256_CODE = 0x12\n\nfunction encodeCID (version: API.Version, code: number, multihash: Uint8Array): Uint8Array {\n const codeOffset = varint.encodingLength(version)\n const hashOffset = codeOffset + varint.encodingLength(code)\n const bytes = new Uint8Array(hashOffset + multihash.byteLength)\n varint.encodeTo(version, bytes, 0)\n varint.encodeTo(code, bytes, codeOffset)\n bytes.set(multihash, hashOffset)\n return bytes\n}\n\nconst cidSymbol = Symbol.for('@ipld/js-cid/CID')\n", "import * as base10 from './bases/base10.ts'\nimport * as base16 from './bases/base16.ts'\nimport * as base2 from './bases/base2.ts'\nimport * as base256emoji from './bases/base256emoji.ts'\nimport * as base32 from './bases/base32.ts'\nimport * as base36 from './bases/base36.ts'\nimport * as base58 from './bases/base58.ts'\nimport * as base64 from './bases/base64.ts'\nimport * as base8 from './bases/base8.ts'\nimport * as identityBase from './bases/identity.ts'\nimport * as json from './codecs/json.ts'\nimport * as raw from './codecs/raw.ts'\nimport * as identity from './hashes/identity.ts'\nimport * as sha2 from './hashes/sha2.ts'\nimport { CID, hasher, digest, varint, bytes } from './index.ts'\n\nexport const bases = { ...identityBase, ...base2, ...base8, ...base10, ...base16, ...base32, ...base36, ...base58, ...base64, ...base256emoji }\nexport const hashes = { ...sha2, ...identity }\nexport const codecs = { raw, json }\n\nexport { CID, hasher, digest, varint, bytes }\n", "import { bases } from 'multiformats/basics'\nimport type { MultibaseCodec } from 'multiformats'\nimport { allocUnsafe } from '#alloc'\n\nfunction createCodec (name: string, prefix: string, encode: (buf: Uint8Array) => string, decode: (str: string) => Uint8Array<ArrayBuffer>): MultibaseCodec<any> {\n return {\n name,\n prefix,\n encoder: {\n name,\n prefix,\n encode\n },\n decoder: {\n decode\n }\n }\n}\n\nconst string = createCodec('utf8', 'u', (buf) => {\n const decoder = new TextDecoder('utf8')\n return 'u' + decoder.decode(buf)\n}, (str) => {\n const encoder = new TextEncoder()\n return encoder.encode(str.substring(1))\n})\n\nconst ascii = createCodec('ascii', 'a', (buf) => {\n let string = 'a'\n\n for (let i = 0; i < buf.length; i++) {\n string += String.fromCharCode(buf[i])\n }\n return string\n}, (str) => {\n str = str.substring(1)\n const buf = allocUnsafe(str.length)\n\n for (let i = 0; i < str.length; i++) {\n buf[i] = str.charCodeAt(i)\n }\n\n return buf\n})\n\nexport type SupportedEncodings = 'utf8' | 'utf-8' | 'hex' | 'latin1' | 'ascii' | 'binary' | keyof typeof bases\n\nconst BASES: Record<SupportedEncodings, MultibaseCodec<any>> = {\n utf8: string,\n 'utf-8': string,\n hex: bases.base16,\n latin1: ascii,\n ascii,\n binary: ascii,\n\n ...bases\n}\n\nexport default BASES\n", "import bases from './util/bases.ts'\nimport type { SupportedEncodings } from './util/bases.ts'\n\nexport type { SupportedEncodings }\n\n/**\n * Create a `Uint8Array` from the passed string\n *\n * Supports `utf8`, `utf-8`, `hex`, and any encoding supported by the multiformats module.\n *\n * Also `ascii` which is similar to node's 'binary' encoding.\n */\nexport function fromString (string: string, encoding: SupportedEncodings = 'utf8'): Uint8Array<ArrayBuffer> {\n const base = bases[encoding]\n\n if (base == null) {\n throw new Error(`Unsupported encoding \"${encoding}\"`)\n }\n\n // add multibase prefix\n return base.decoder.decode(`${base.prefix}${string}`)\n}\n", "/* eslint-disable @typescript-eslint/no-unsafe-return */\n\n// Heavily inspired by https://doc.rust-lang.org/src/std/net/parser.rs.html\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn = (...foo: any) => any;\n\nexport class Parser {\n private index = 0;\n private input = \"\";\n\n new(input: string): this {\n this.index = 0;\n this.input = input;\n return this;\n }\n\n /** Run a parser, and restore the pre-parse state if it fails. */\n readAtomically<T extends Fn>(fn: T): ReturnType<T> {\n const index = this.index;\n const result = fn();\n if (result === undefined) {\n this.index = index;\n }\n return result;\n }\n\n /** Run a parser, but fail if the entire input wasn't consumed. Doesn't run atomically. */\n parseWith<T extends Fn>(fn: T): ReturnType<T> | undefined {\n const result = fn();\n if (this.index !== this.input.length) {\n return undefined;\n }\n return result;\n }\n\n /** Peek the next character from the input */\n peekChar(): string | undefined {\n if (this.index >= this.input.length) {\n return undefined;\n }\n return this.input[this.index];\n }\n\n /** Read the next character from the input */\n readChar(): string | undefined {\n if (this.index >= this.input.length) {\n return undefined;\n }\n return this.input[this.index++];\n }\n\n /** Read the next character from the input if it matches the target. */\n readGivenChar(target: string): string | undefined {\n return this.readAtomically(() => {\n const char = this.readChar();\n if (char !== target) {\n return undefined;\n }\n return char;\n });\n }\n\n /**\n * Helper for reading separators in an indexed loop. Reads the separator\n * character iff index > 0, then runs the parser. When used in a loop,\n * the separator character will only be read on index > 0 (see\n * readIPv4Addr for an example)\n */\n readSeparator<T extends Fn>(sep: string, index: number, inner: T): ReturnType<T> {\n return this.readAtomically(() => {\n if (index > 0) {\n if (this.readGivenChar(sep) === undefined) {\n return undefined;\n }\n }\n return inner();\n });\n }\n\n /**\n * Read a number off the front of the input in the given radix, stopping\n * at the first non-digit character or eof. Fails if the number has more\n * digits than max_digits or if there is no number.\n */\n readNumber(\n radix: number,\n maxDigits: number | undefined,\n allowZeroPrefix: boolean,\n maxBytes: number\n ): number | undefined {\n return this.readAtomically(() => {\n let result = 0;\n let digitCount = 0;\n\n const leadingChar = this.peekChar();\n if (leadingChar === undefined) {\n return undefined;\n }\n const hasLeadingZero = leadingChar === \"0\";\n const maxValue = 2 ** (8 * maxBytes) - 1;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const digit = this.readAtomically(() => {\n const char = this.readChar();\n if (char === undefined) {\n return undefined;\n }\n const num = Number.parseInt(char, radix);\n if (Number.isNaN(num)) {\n return undefined;\n }\n return num;\n });\n if (digit === undefined) {\n break;\n }\n result *= radix;\n result += digit;\n if (result > maxValue) {\n return undefined;\n }\n digitCount += 1;\n if (maxDigits !== undefined) {\n if (digitCount > maxDigits) {\n return undefined;\n }\n }\n }\n\n if (digitCount === 0) {\n return undefined;\n } else if (!allowZeroPrefix && hasLeadingZero && digitCount > 1) {\n return undefined;\n } else {\n return result;\n }\n });\n }\n\n /** Read an IPv4 address. */\n readIPv4Addr(): Uint8Array | undefined {\n return this.readAtomically(() => {\n const out = new Uint8Array(4);\n\n for (let i = 0; i < out.length; i++) {\n const ix = this.readSeparator(\".\", i, () => this.readNumber(10, 3, false, 1));\n if (ix === undefined) {\n return undefined;\n }\n out[i] = ix;\n }\n\n return out;\n });\n }\n\n /** Read an IPv6 Address. */\n readIPv6Addr(): Uint8Array | undefined {\n /**\n * Read a chunk of an IPv6 address into `groups`. Returns the number\n * of groups read, along with a bool indicating if an embedded\n * trailing IPv4 address was read. Specifically, read a series of\n * colon-separated IPv6 groups (0x0000 - 0xFFFF), with an optional\n * trailing embedded IPv4 address.\n */\n const readGroups = (groups: Uint8Array): [number, boolean] => {\n for (let i = 0; i < groups.length / 2; i++) {\n const ix = i * 2;\n // Try to read a trailing embedded IPv4 address. There must be at least 4 groups left.\n if (i < groups.length - 3) {\n const ipv4 = this.readSeparator(\":\", i, () => this.readIPv4Addr());\n if (ipv4 !== undefined) {\n groups[ix] = ipv4[0];\n groups[ix + 1] = ipv4[1];\n groups[ix + 2] = ipv4[2];\n groups[ix + 3] = ipv4[3];\n\n return [ix + 4, true];\n }\n }\n\n const group = this.readSeparator(\":\", i, () => this.readNumber(16, 4, true, 2));\n if (group === undefined) {\n return [ix, false];\n }\n groups[ix] = group >> 8;\n groups[ix + 1] = group & 255;\n }\n return [groups.length, false];\n };\n\n return this.readAtomically(() => {\n // Read the front part of the address; either the whole thing, or up to the first ::\n const head = new Uint8Array(16);\n const [headSize, headIp4] = readGroups(head);\n\n if (headSize === 16) {\n return head;\n }\n\n // IPv4 part is not allowed before `::`\n if (headIp4) {\n return undefined;\n }\n\n // Read `::` if previous code parsed less than 8 groups.\n // `::` indicates one or more groups of 16 bits of zeros.\n if (this.readGivenChar(\":\") === undefined) {\n return undefined;\n }\n if (this.readGivenChar(\":\") === undefined) {\n return undefined;\n }\n\n // Read the back part of the address. The :: must contain at least one\n // set of zeroes, so our max length is 7.\n const tail = new Uint8Array(14);\n const limit = 16 - (headSize + 2);\n const [tailSize] = readGroups(tail.subarray(0, limit));\n\n // Concat the head and tail of the IP address\n head.set(tail.subarray(0, tailSize), 16 - tailSize);\n\n return head;\n });\n }\n\n /** Read an IP Address, either IPv4 or IPv6. */\n readIPAddr(): Uint8Array | undefined {\n return this.readIPv4Addr() ?? this.readIPv6Addr();\n }\n}\n", "import { Parser } from \"./parser.js\";\n\n// See https://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address\nconst MAX_IPV6_LENGTH = 45;\nconst MAX_IPV4_LENGTH = 15;\n\nconst parser = new Parser();\n\n/** Parse `input` into IPv4 bytes. */\nexport function parseIPv4(input: string): Uint8Array | undefined {\n if (input.length > MAX_IPV4_LENGTH) {\n return undefined;\n }\n return parser.new(input).parseWith(() => parser.readIPv4Addr());\n}\n\n/** Parse IPv4 `input` into IPv6 with IPv4-mapped bytes, eg ::ffff:1.2.3.4 */\nexport function parseIPv4Mapped(input: string): Uint8Array | undefined {\n if (input.length > MAX_IPV4_LENGTH) {\n return undefined;\n }\n\n const ipv4 = parser.new(input).parseWith(() => parser.readIPv4Addr());\n if (ipv4 === undefined) {\n return undefined;\n }\n\n return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, ipv4[0], ipv4[1], ipv4[2], ipv4[3]]);\n}\n\n/** Parse `input` into IPv6 bytes. */\nexport function parseIPv6(input: string): Uint8Array | undefined {\n // strip zone index if it is present\n if (input.includes(\"%\")) {\n input = input.split(\"%\")[0];\n }\n if (input.length > MAX_IPV6_LENGTH) {\n return undefined;\n }\n return parser.new(input).parseWith(() => parser.readIPv6Addr());\n}\n\n/** Parse `input` into IPv4 or IPv6 bytes. */\nexport function parseIP(input: string, mapIPv4ToIPv6 = false): Uint8Array | undefined {\n // strip zone index if it is present\n if (input.includes(\"%\")) {\n input = input.split(\"%\")[0];\n }\n\n if (input.length > MAX_IPV6_LENGTH) {\n return undefined;\n }\n\n const addr = parser.new(input).parseWith(() => parser.readIPAddr());\n if (!addr) {\n return undefined;\n }\n\n if (mapIPv4ToIPv6 && addr.length === 4) {\n return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, addr[0], addr[1], addr[2], addr[3]]);\n }\n\n return addr;\n}\n", "import { parseIP, parseIPv4, parseIPv6 } from \"./parse.js\";\n\n/** Check if `input` is IPv4. */\nexport function isIPv4(input: string): boolean {\n return Boolean(parseIPv4(input));\n}\n\n/** Check if `input` is IPv6. */\nexport function isIPv6(input: string): boolean {\n return Boolean(parseIPv6(input));\n}\n\n/** Check if `input` is IPv4 or IPv6. */\nexport function isIP(input: string): boolean {\n return Boolean(parseIP(input));\n}\n\n/**\n * @returns `6` if `input` is IPv6, `4` if `input` is IPv4, or `undefined` if `input` is neither.\n */\nexport function ipVersion(input: string): 4 | 6 | undefined {\n if (isIPv4(input)) {\n return 4;\n } else if (isIPv6(input)) {\n return 6;\n } else {\n return undefined;\n }\n}\n", "/* eslint-disable no-fallthrough */\nimport { allocUnsafe } from 'uint8arrays/alloc'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nconst N1 = Math.pow(2, 7)\nconst N2 = Math.pow(2, 14)\nconst N3 = Math.pow(2, 21)\nconst N4 = Math.pow(2, 28)\nconst N5 = Math.pow(2, 35)\nconst N6 = Math.pow(2, 42)\nconst N7 = Math.pow(2, 49)\n\n/** Most significant bit of a byte */\nconst MSB = 0x80\n/** Rest of the bits in a byte */\nconst REST = 0x7f\n\nexport function encodingLength (value: number): number {\n if (value < N1) {\n return 1\n }\n\n if (value < N2) {\n return 2\n }\n\n if (value < N3) {\n return 3\n }\n\n if (value < N4) {\n return 4\n }\n\n if (value < N5) {\n return 5\n }\n\n if (value < N6) {\n return 6\n }\n\n if (value < N7) {\n return 7\n }\n\n if (Number.MAX_SAFE_INTEGER != null && value > Number.MAX_SAFE_INTEGER) {\n throw new RangeError('Could not encode varint')\n }\n\n return 8\n}\n\nexport function encodeUint8Array <T extends ArrayBufferLike> (value: number, buf: Uint8Array<T>, offset: number = 0): Uint8Array<T> {\n switch (encodingLength(value)) {\n case 8: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 7: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 6: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 5: {\n buf[offset++] = (value & 0xFF) | MSB\n value /= 128\n }\n case 4: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 3: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 2: {\n buf[offset++] = (value & 0xFF) | MSB\n value >>>= 7\n }\n case 1: {\n buf[offset++] = (value & 0xFF)\n value >>>= 7\n break\n }\n default: throw new Error('unreachable')\n }\n return buf\n}\n\nexport function encodeUint8ArrayList <T extends ArrayBufferLike> (value: number, buf: Uint8ArrayList<T>, offset: number = 0): Uint8ArrayList<T> {\n switch (encodingLength(value)) {\n case 8: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 7: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 6: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 5: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value /= 128\n }\n case 4: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 3: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 2: {\n buf.set(offset++, (value & 0xFF) | MSB)\n value >>>= 7\n }\n case 1: {\n buf.set(offset++, (value & 0xFF))\n value >>>= 7\n break\n }\n default: throw new Error('unreachable')\n }\n return buf\n}\n\nexport function decodeUint8Array (buf: Uint8Array, offset: number): number {\n let b = buf[offset]\n let res = 0\n\n res += b & REST\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 1]\n res += (b & REST) << 7\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 2]\n res += (b & REST) << 14\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 3]\n res += (b & REST) << 21\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 4]\n res += (b & REST) * N4\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 5]\n res += (b & REST) * N5\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 6]\n res += (b & REST) * N6\n if (b < MSB) {\n return res\n }\n\n b = buf[offset + 7]\n res += (b & REST) * N7\n if (b < MSB) {\n return res\n }\n\n throw new RangeError('Could not decode varint')\n}\n\nexport function decodeUint8ArrayList (buf: Uint8ArrayList, offset: number): number {\n let b = buf.get(offset)\n let res = 0\n\n res += b & REST\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 1)\n res += (b & REST) << 7\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 2)\n res += (b & REST) << 14\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 3)\n res += (b & REST) << 21\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 4)\n res += (b & REST) * N4\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 5)\n res += (b & REST) * N5\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 6)\n res += (b & REST) * N6\n if (b < MSB) {\n return res\n }\n\n b = buf.get(offset + 7)\n res += (b & REST) * N7\n if (b < MSB) {\n return res\n }\n\n throw new RangeError('Could not decode varint')\n}\n\nexport function encode (value: number): Uint8Array<ArrayBuffer>\nexport function encode <T extends ArrayBufferLike> (value: number, buf: Uint8Array<T>, offset?: number): Uint8Array<T>\nexport function encode <T extends ArrayBufferLike> (value: number, buf: Uint8ArrayList<T>, offset?: number): Uint8ArrayList<T>\nexport function encode <B extends ArrayBufferLike, T extends Uint8Array<B> | Uint8ArrayList<B> = Uint8Array<B>> (value: number, buf?: T, offset: number = 0): T {\n if (buf == null) {\n buf = allocUnsafe(encodingLength(value)) as T\n }\n if (buf instanceof Uint8Array) {\n return encodeUint8Array(value, buf, offset) as T\n } else {\n return encodeUint8ArrayList(value, buf, offset) as T\n }\n}\n\nexport function decode (buf: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (buf instanceof Uint8Array) {\n return decodeUint8Array(buf, offset)\n } else {\n return decodeUint8ArrayList(buf, offset)\n }\n}\n", "function isArrayBufferBacked (arr: Uint8Array): arr is Uint8Array<ArrayBuffer> {\n return arr.buffer instanceof ArrayBuffer\n}\n\n/**\n * If the passed `arr` is of type `Uint8Array<ArrayBuffer>`, it is returned\n * unchanged, otherwise a new `Uint8Array<ArrayBuffer>` is created with the\n * data being a copy of the data in the passed `arr`.\n */\nexport function withArrayBuffer (arr: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isArrayBufferBacked(arr)) {\n return arr\n }\n\n return arr.slice()\n}\n", "import bases from './util/bases.ts'\nimport type { SupportedEncodings } from './util/bases.ts'\n\nexport type { SupportedEncodings }\n\n/**\n * Turns a `Uint8Array` into a string.\n *\n * Supports `utf8`, `utf-8` and any encoding supported by the multibase module.\n *\n * Also `ascii` which is similar to node's 'binary' encoding.\n */\nexport function toString (array: Uint8Array, encoding: SupportedEncodings = 'utf8'): string {\n const base = bases[encoding]\n\n if (base == null) {\n throw new Error(`Unsupported encoding \"${encoding}\"`)\n }\n\n // strip multibase prefix\n return base.encoder.encode(array).substring(1)\n}\n", "/**\n * Thrown when an invalid multiaddr is encountered\n */\nexport class InvalidMultiaddrError extends Error {\n static name = 'InvalidMultiaddrError'\n name = 'InvalidMultiaddrError'\n}\n\nexport class ValidationError extends Error {\n static name = 'ValidationError'\n name = 'ValidationError'\n}\n\nexport class InvalidParametersError extends Error {\n static name = 'InvalidParametersError'\n name = 'InvalidParametersError'\n}\n\nexport class UnknownProtocolError extends Error {\n static name = 'UnknownProtocolError'\n name = 'UnknownProtocolError'\n}\n", "import { isIPv4 } from '@chainsafe/is-ip'\nimport { base32 } from 'multiformats/bases/base32'\nimport { bases } from 'multiformats/basics'\nimport { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { InvalidMultiaddrError } from './errors.ts'\nimport type { MultibaseCodec } from 'multiformats'\nimport type { SupportedEncodings } from 'uint8arrays/to-string'\n\nexport function bytesToString (base: SupportedEncodings): (buf: Uint8Array) => string {\n return (buf) => {\n return uint8ArrayToString(buf, base)\n }\n}\n\nexport function stringToBytes (base: SupportedEncodings): (value: string) => Uint8Array<ArrayBuffer> {\n return (buf) => {\n return uint8ArrayFromString(buf, base)\n }\n}\n\nexport function bytes2port (buf: Uint8Array): string {\n const view = new DataView(buf.buffer)\n return view.getUint16(buf.byteOffset).toString()\n}\n\nexport function port2bytes (port: string | number): Uint8Array<ArrayBuffer> {\n const buf = new ArrayBuffer(2)\n const view = new DataView(buf)\n view.setUint16(0, typeof port === 'string' ? parseInt(port) : port)\n\n return new Uint8Array(buf)\n}\n\nexport function onion2bytes (str: string): Uint8Array<ArrayBuffer> {\n const addr = str.split(':')\n\n if (addr.length !== 2) {\n throw new Error(`failed to parse onion addr: [\"'${addr.join('\", \"')}'\"]' does not contain a port number`)\n }\n\n if (addr[0].length !== 16) {\n throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion address.`)\n }\n\n // onion addresses do not include the multibase prefix, add it before decoding\n const buf = uint8ArrayFromString(addr[0], 'base32')\n\n // onion port number\n const port = parseInt(addr[1], 10)\n\n if (port < 1 || port > 65536) {\n throw new Error('Port number is not in range(1, 65536)')\n }\n\n const portBuf = port2bytes(port)\n\n return uint8ArrayConcat([buf, portBuf], buf.length + portBuf.length)\n}\n\nexport function onion32bytes (str: string): Uint8Array<ArrayBuffer> {\n const addr = str.split(':')\n\n if (addr.length !== 2) {\n throw new Error(`failed to parse onion addr: [\"'${addr.join('\", \"')}'\"]' does not contain a port number`)\n }\n\n if (addr[0].length !== 56) {\n throw new Error(`failed to parse onion addr: ${addr[0]} not a Tor onion3 address.`)\n }\n\n // onion addresses do not include the multibase prefix, add it before decoding\n const buf = base32.decode(`b${addr[0]}`)\n\n // onion port number\n const port = parseInt(addr[1], 10)\n\n if (port < 1 || port > 65536) {\n throw new Error('Port number is not in range(1, 65536)')\n }\n\n const portBuf = port2bytes(port)\n\n return uint8ArrayConcat([buf, portBuf], buf.length + portBuf.length)\n}\n\nexport function bytes2onion (buf: Uint8Array): string {\n const addrBytes = buf.subarray(0, buf.length - 2)\n const portBytes = buf.subarray(buf.length - 2)\n const addr = uint8ArrayToString(addrBytes, 'base32')\n const port = bytes2port(portBytes)\n return `${addr}:${port}`\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7\n// but with buf/offset args removed because we don't use them\nexport const ip4ToBytes = function (ip: string): Uint8Array<ArrayBuffer> {\n ip = ip.toString().trim()\n\n const bytes = new Uint8Array(4)\n\n ip.split(/\\./g).forEach((byte, index) => {\n const value = parseInt(byte, 10)\n\n if (isNaN(value) || value < 0 || value > 0xff) {\n throw new InvalidMultiaddrError('Invalid byte value in IP address')\n }\n\n bytes[index] = value\n })\n\n return bytes\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7\n// but with buf/offset args removed because we don't use them\nexport const ip6ToBytes = function (ip: string): Uint8Array<ArrayBuffer> {\n let offset = 0\n ip = ip.toString().trim()\n\n const sections = ip.split(':', 8)\n\n let i\n for (i = 0; i < sections.length; i++) {\n const isv4 = isIPv4(sections[i])\n let v4Buffer: Uint8Array | undefined\n\n if (isv4) {\n v4Buffer = ip4ToBytes(sections[i])\n sections[i] = uint8ArrayToString(v4Buffer.subarray(0, 2), 'base16')\n }\n\n if (v4Buffer != null && ++i < 8) {\n sections.splice(i, 0, uint8ArrayToString(v4Buffer.subarray(2, 4), 'base16'))\n }\n }\n\n if (sections[0] === '') {\n while (sections.length < 8) { sections.unshift('0') }\n } else if (sections[sections.length - 1] === '') {\n while (sections.length < 8) { sections.push('0') }\n } else if (sections.length < 8) {\n for (i = 0; i < sections.length && sections[i] !== ''; i++) { }\n const argv: [number, number, ...string[]] = [i, 1]\n for (i = 9 - sections.length; i > 0; i--) {\n argv.push('0')\n }\n sections.splice.apply(sections, argv)\n }\n\n const bytes = new Uint8Array(offset + 16)\n\n for (i = 0; i < sections.length; i++) {\n if (sections[i] === '') {\n sections[i] = '0'\n }\n\n const word = parseInt(sections[i], 16)\n\n if (isNaN(word) || word < 0 || word > 0xffff) {\n throw new InvalidMultiaddrError('Invalid byte value in IP address')\n }\n\n bytes[offset++] = (word >> 8) & 0xff\n bytes[offset++] = word & 0xff\n }\n\n return bytes\n}\n\n// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L63\nexport const ip4ToString = function (buf: Uint8Array): string {\n if (buf.byteLength !== 4) {\n throw new InvalidMultiaddrError('IPv4 address was incorrect length')\n }\n\n const result = []\n\n for (let i = 0; i < buf.byteLength; i++) {\n result.push(buf[i])\n }\n\n return result.join('.')\n}\n\nexport const ip6ToString = function (buf: Uint8Array): string {\n if (buf.byteLength !== 16) {\n throw new InvalidMultiaddrError('IPv6 address was incorrect length')\n }\n\n const result: string[] = []\n\n for (let i = 0; i < buf.byteLength; i += 2) {\n const byte1 = buf[i]\n const byte2 = buf[i + 1]\n\n const tuple = `${byte1.toString(16).padStart(2, '0')}${byte2.toString(16).padStart(2, '0')}`\n\n result.push(tuple)\n }\n\n const ip = result.join(':')\n\n try {\n const url = new URL(`http://[${ip}]`)\n\n return url.hostname.substring(1, url.hostname.length - 1)\n } catch {\n throw new InvalidMultiaddrError(`Invalid IPv6 address \"${ip}\"`)\n }\n}\n\nexport function ip6StringToValue (str: string): string {\n try {\n const url = new URL(`http://[${str}]`)\n\n return url.hostname.substring(1, url.hostname.length - 1)\n } catch {\n throw new InvalidMultiaddrError(`Invalid IPv6 address \"${str}\"`)\n }\n}\n\nconst decoders = Object.values(bases).map((c) => c.decoder)\nconst anybaseDecoder = (function () {\n let acc = decoders[0].or(decoders[1])\n decoders.slice(2).forEach((d) => (acc = acc.or(d)))\n return acc\n})()\n\nexport function mb2bytes (mbstr: string): Uint8Array<ArrayBuffer> {\n return anybaseDecoder.decode(mbstr)\n}\n\nexport function bytes2mb (base: MultibaseCodec<any>): (buf: Uint8Array) => string {\n return (buf) => {\n return base.encoder.encode(buf)\n }\n}\n", "import { ValidationError } from './errors.ts'\n\nexport function integer (value: string): void {\n const int = parseInt(value)\n\n if (int.toString() !== value) {\n throw new ValidationError('Value must be an integer')\n }\n}\n\nexport function positive (value: any): void {\n if (value < 0) {\n throw new ValidationError('Value must be a positive integer, or zero')\n }\n}\n\nexport function maxValue (max: number): (value: any) => void {\n return (value) => {\n if (value > max) {\n throw new ValidationError(`Value must be smaller than or equal to ${max}`)\n }\n }\n}\n\nexport function validate (...funcs: Array<(value: string) => void>): (value: string) => void {\n return (value) => {\n for (const fn of funcs) {\n fn(value)\n }\n }\n}\n\nexport const validatePort = validate(\n integer,\n positive,\n maxValue(65_535)\n)\n", "import { isIPv4, isIPv6 } from '@chainsafe/is-ip'\nimport { CID } from 'multiformats'\nimport { base64url } from 'multiformats/bases/base64'\nimport { CODE_CERTHASH, CODE_DCCP, CODE_DNS, CODE_DNS4, CODE_DNS6, CODE_DNSADDR, CODE_GARLIC32, CODE_GARLIC64, CODE_HTTP, CODE_HTTP_PATH, CODE_HTTPS, CODE_IP4, CODE_IP6, CODE_IP6ZONE, CODE_IPCIDR, CODE_MEMORY, CODE_NOISE, CODE_ONION, CODE_ONION3, CODE_P2P, CODE_P2P_CIRCUIT, CODE_P2P_STARDUST, CODE_P2P_WEBRTC_DIRECT, CODE_P2P_WEBRTC_STAR, CODE_P2P_WEBSOCKET_STAR, CODE_QUIC, CODE_QUIC_V1, CODE_SCTP, CODE_SNI, CODE_TCP, CODE_TLS, CODE_UDP, CODE_UDT, CODE_UNIX, CODE_UTP, CODE_WEBRTC, CODE_WEBRTC_DIRECT, CODE_WEBTRANSPORT, CODE_WS, CODE_WSS } from './constants.ts'\nimport { UnknownProtocolError, ValidationError } from './errors.ts'\nimport { bytes2mb, bytes2onion, bytes2port, bytesToString, ip4ToBytes, ip4ToString, ip6StringToValue, ip6ToBytes, ip6ToString, mb2bytes, onion2bytes, onion32bytes, port2bytes, stringToBytes } from './utils.ts'\nimport { validatePort } from './validation.ts'\nimport type { Registry as RegistryInterface } from './index.ts'\n\nexport const V = -1\n\nexport interface ProtocolCodec {\n /**\n * A numeric code that will be used in the binary representation of the tuple.\n */\n code: number\n\n /**\n * A string name that will be used in the string representation of the addr.\n */\n name: string\n\n /**\n * Size defines the expected length of the address part of the tuple - valid\n * values are `-1` (or the `V` constant) for variable length (this will be\n * varint encoded in the binary representation), `0` for no address part or a\n * number that represents a fixed-length address.\n */\n size?: number\n\n /**\n * If specified this protocol codec will also be used to decode tuples with\n * these names from string multiaddrs.\n */\n aliases?: string[]\n\n /**\n * Where the multiaddr has been encoded as a string, decode the value if\n * necessary, unescaping any escaped values\n */\n stringToValue?(value: string): string\n\n /**\n * To encode the multiaddr as a string, escape any necessary values\n */\n valueToString?(value: string): string\n\n /**\n * To encode the multiaddr as bytes, convert the value to bytes\n */\n valueToBytes?(value: string): Uint8Array<ArrayBuffer>\n\n /**\n * To decode bytes to a multiaddr, convert the value bytes to a string\n */\n bytesToValue?(bytes: Uint8Array): string\n\n /**\n * Perform any necessary validation on the string value\n */\n validate?(value: string): void\n}\n\nclass Registry implements RegistryInterface {\n private protocolsByCode = new Map<number, ProtocolCodec>()\n private protocolsByName = new Map<string, ProtocolCodec>()\n\n getProtocol (key: string | number): ProtocolCodec {\n let codec: ProtocolCodec | undefined\n\n if (typeof key === 'string') {\n codec = this.protocolsByName.get(key)\n } else {\n codec = this.protocolsByCode.get(key)\n }\n\n if (codec == null) {\n throw new UnknownProtocolError(`Protocol ${key} was unknown`)\n }\n\n return codec\n }\n\n addProtocol (codec: ProtocolCodec): void {\n this.protocolsByCode.set(codec.code, codec)\n this.protocolsByName.set(codec.name, codec)\n\n codec.aliases?.forEach(alias => {\n this.protocolsByName.set(alias, codec)\n })\n }\n\n removeProtocol (code: number): void {\n const codec = this.protocolsByCode.get(code)\n\n if (codec == null) {\n return\n }\n\n this.protocolsByCode.delete(codec.code)\n this.protocolsByName.delete(codec.name)\n\n codec.aliases?.forEach(alias => {\n this.protocolsByName.delete(alias)\n })\n }\n}\n\nexport const registry: RegistryInterface = new Registry()\n\nconst codecs: ProtocolCodec[] = [{\n code: CODE_IP4,\n name: 'ip4',\n size: 32,\n valueToBytes: ip4ToBytes,\n bytesToValue: ip4ToString,\n validate: (value) => {\n if (!isIPv4(value)) {\n throw new ValidationError(`Invalid IPv4 address \"${value}\"`)\n }\n }\n}, {\n code: CODE_TCP,\n name: 'tcp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_UDP,\n name: 'udp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_DCCP,\n name: 'dccp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_IP6,\n name: 'ip6',\n size: 128,\n valueToBytes: ip6ToBytes,\n bytesToValue: ip6ToString,\n stringToValue: ip6StringToValue,\n validate: (value) => {\n if (!isIPv6(value)) {\n throw new ValidationError(`Invalid IPv6 address \"${value}\"`)\n }\n }\n}, {\n code: CODE_IP6ZONE,\n name: 'ip6zone',\n size: V\n}, {\n code: CODE_IPCIDR,\n name: 'ipcidr',\n size: 8,\n bytesToValue: bytesToString('base10'),\n valueToBytes: stringToBytes('base10')\n}, {\n code: CODE_DNS,\n name: 'dns',\n size: V\n}, {\n code: CODE_DNS4,\n name: 'dns4',\n size: V\n}, {\n code: CODE_DNS6,\n name: 'dns6',\n size: V\n}, {\n code: CODE_DNSADDR,\n name: 'dnsaddr',\n size: V\n}, {\n code: CODE_SCTP,\n name: 'sctp',\n size: 16,\n valueToBytes: port2bytes,\n bytesToValue: bytes2port,\n validate: validatePort\n}, {\n code: CODE_UDT,\n name: 'udt'\n}, {\n code: CODE_UTP,\n name: 'utp'\n}, {\n code: CODE_UNIX,\n name: 'unix',\n size: V,\n stringToValue: (str) => decodeURIComponent(str),\n valueToString: (val) => encodeURIComponent(val)\n}, {\n code: CODE_P2P,\n name: 'p2p',\n aliases: ['ipfs'],\n size: V,\n bytesToValue: bytesToString('base58btc'),\n valueToBytes: (val) => {\n if (val.startsWith('Q') || val.startsWith('1')) {\n return stringToBytes('base58btc')(val)\n }\n\n return CID.parse(val).multihash.bytes\n }\n}, {\n code: CODE_ONION,\n name: 'onion',\n size: 96,\n bytesToValue: bytes2onion,\n valueToBytes: onion2bytes\n}, {\n code: CODE_ONION3,\n name: 'onion3',\n size: 296,\n bytesToValue: bytes2onion,\n valueToBytes: onion32bytes\n}, {\n code: CODE_GARLIC64,\n name: 'garlic64',\n size: V\n}, {\n code: CODE_GARLIC32,\n name: 'garlic32',\n size: V\n}, {\n code: CODE_TLS,\n name: 'tls'\n}, {\n code: CODE_SNI,\n name: 'sni',\n size: V\n}, {\n code: CODE_NOISE,\n name: 'noise'\n}, {\n code: CODE_QUIC,\n name: 'quic'\n}, {\n code: CODE_QUIC_V1,\n name: 'quic-v1'\n}, {\n code: CODE_WEBTRANSPORT,\n name: 'webtransport'\n}, {\n code: CODE_CERTHASH,\n name: 'certhash',\n size: V,\n bytesToValue: bytes2mb(base64url),\n valueToBytes: mb2bytes\n}, {\n code: CODE_HTTP,\n name: 'http'\n}, {\n code: CODE_HTTP_PATH,\n name: 'http-path',\n size: V,\n stringToValue: (str) => `/${decodeURIComponent(str)}`,\n valueToString: (val) => encodeURIComponent(val.substring(1))\n}, {\n code: CODE_HTTPS,\n name: 'https'\n}, {\n code: CODE_WS,\n name: 'ws'\n}, {\n code: CODE_WSS,\n name: 'wss'\n}, {\n code: CODE_P2P_WEBSOCKET_STAR,\n name: 'p2p-websocket-star'\n}, {\n code: CODE_P2P_STARDUST,\n name: 'p2p-stardust'\n}, {\n code: CODE_P2P_WEBRTC_STAR,\n name: 'p2p-webrtc-star'\n}, {\n code: CODE_P2P_WEBRTC_DIRECT,\n name: 'p2p-webrtc-direct'\n}, {\n code: CODE_WEBRTC_DIRECT,\n name: 'webrtc-direct'\n}, {\n code: CODE_WEBRTC,\n name: 'webrtc'\n}, {\n code: CODE_P2P_CIRCUIT,\n name: 'p2p-circuit'\n}, {\n code: CODE_MEMORY,\n name: 'memory',\n size: V\n}]\n\ncodecs.forEach(codec => {\n registry.addProtocol(codec)\n})\n", "import * as varint from 'uint8-varint'\nimport { withArrayBuffer } from 'uint8arrays'\nimport { concat as uint8ArrayConcat } from 'uint8arrays/concat'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport { toString as uint8ArrayToString } from 'uint8arrays/to-string'\nimport { InvalidMultiaddrError } from './errors.ts'\nimport { registry, V } from './registry.ts'\nimport type { Component } from './index.js'\nimport type { ProtocolCodec } from './registry.ts'\n\nexport function bytesToComponents (bytes: Uint8Array): Component[] {\n const components: Component[] = []\n\n let i = 0\n while (i < bytes.length) {\n const code = varint.decode(bytes, i)\n const codec = registry.getProtocol(code)\n const codeLength = varint.encodingLength(code)\n const size = sizeForAddr(codec, bytes, i + codeLength)\n let sizeLength = 0\n\n if (size > 0 && codec.size === V) {\n sizeLength = varint.encodingLength(size)\n }\n\n const componentLength = codeLength + sizeLength + size\n\n const component: Component = {\n code,\n name: codec.name,\n bytes: withArrayBuffer(bytes.subarray(i, i + componentLength))\n }\n\n if (size > 0) {\n const valueOffset = i + codeLength + sizeLength\n const valueBytes = bytes.subarray(valueOffset, valueOffset + size)\n\n component.value = codec.bytesToValue?.(valueBytes) ?? uint8ArrayToString(valueBytes)\n }\n\n components.push(component)\n\n i += componentLength\n }\n\n return components\n}\n\nexport function componentsToBytes (components: Component[]): Uint8Array<ArrayBuffer> {\n let length = 0\n const bytes: Uint8Array[] = []\n\n for (const component of components) {\n if (component.bytes == null) {\n const codec = registry.getProtocol(component.code)\n const codecLength = varint.encodingLength(component.code)\n let valueBytes: Uint8Array | undefined\n let valueLength = 0\n let valueLengthLength = 0\n\n if (component.value != null) {\n valueBytes = codec.valueToBytes?.(component.value) ?? uint8ArrayFromString(component.value)\n valueLength = valueBytes.byteLength\n\n if (codec.size === V) {\n valueLengthLength = varint.encodingLength(valueLength)\n }\n }\n\n const bytes = new Uint8Array(codecLength + valueLengthLength + valueLength)\n\n // encode the protocol code\n let offset = 0\n varint.encodeUint8Array(component.code, bytes, offset)\n offset += codecLength\n\n // if there is a value\n if (valueBytes != null) {\n // if the value has variable length, encode the length\n if (codec.size === V) {\n varint.encodeUint8Array(valueLength, bytes, offset)\n offset += valueLengthLength\n }\n\n // finally encode the value\n bytes.set(valueBytes, offset)\n }\n\n component.bytes = bytes\n }\n\n bytes.push(component.bytes)\n length += component.bytes.byteLength\n }\n\n return uint8ArrayConcat(bytes, length)\n}\n\nexport function stringToComponents (string: string): Component[] {\n if (string.charAt(0) !== '/') {\n throw new InvalidMultiaddrError('String multiaddr must start with \"/\"')\n }\n\n const components: Component[] = []\n let collecting: 'protocol' | 'value' = 'protocol'\n let value = ''\n let protocol = ''\n\n for (let i = 1; i < string.length; i++) {\n const char = string.charAt(i)\n\n if (char !== '/') {\n if (collecting === 'protocol') {\n protocol += string.charAt(i)\n } else {\n value += string.charAt(i)\n }\n }\n\n const ended = i === string.length - 1\n\n if (char === '/' || ended) {\n const codec = registry.getProtocol(protocol)\n\n if (collecting === 'protocol') {\n if (codec.size == null || codec.size === 0) {\n // a protocol without an address, eg. `/tls`\n components.push({\n code: codec.code,\n name: codec.name\n })\n\n value = ''\n protocol = ''\n collecting = 'protocol'\n\n continue\n } else if (ended) {\n throw new InvalidMultiaddrError(`Component ${protocol} was missing value`)\n }\n\n // continue collecting value\n collecting = 'value'\n } else if (collecting === 'value') {\n const component: Component = {\n code: codec.code,\n name: codec.name\n }\n\n if (codec.size != null && codec.size !== 0) {\n if (value === '') {\n throw new InvalidMultiaddrError(`Component ${protocol} was missing value`)\n }\n\n component.value = codec.stringToValue?.(value) ?? value\n }\n\n components.push(component)\n\n value = ''\n protocol = ''\n collecting = 'protocol'\n }\n }\n }\n\n if (protocol !== '' && value !== '') {\n throw new InvalidMultiaddrError('Incomplete multiaddr')\n }\n\n return components\n}\n\nexport function componentsToString (components: Component[]): string {\n return `/${components.flatMap(component => {\n if (component.value == null) {\n return component.name\n }\n\n const codec = registry.getProtocol(component.code)\n\n if (codec == null) {\n throw new InvalidMultiaddrError(`Unknown protocol code ${component.code}`)\n }\n\n return [\n component.name,\n codec.valueToString?.(component.value) ?? component.value\n ]\n }).join('/')}`\n}\n\n/**\n * For the passed address, return the serialized size\n */\nfunction sizeForAddr (codec: ProtocolCodec, bytes: Uint8Array, offset: number): number {\n if (codec.size == null || codec.size === 0) {\n return 0\n }\n\n if (codec.size > 0) {\n return codec.size / 8\n }\n\n return varint.decode(bytes, offset)\n}\n", "import { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { bytesToComponents, componentsToBytes, componentsToString, stringToComponents } from './components.ts'\nimport { InvalidMultiaddrError, InvalidParametersError } from './errors.ts'\nimport { isMultiaddr } from './index.ts'\nimport { registry } from './registry.ts'\nimport type { MultiaddrInput, Multiaddr as MultiaddrInterface, Component } from './index.ts'\n\nconst inspect = Symbol.for('nodejs.util.inspect.custom')\nexport const symbol = Symbol.for('@multiformats/multiaddr')\n\nfunction toComponents (addr: MultiaddrInput): Component[] {\n if (addr == null) {\n addr = '/'\n }\n\n if (isMultiaddr(addr)) {\n return addr.getComponents()\n }\n\n if (addr instanceof Uint8Array) {\n return bytesToComponents(addr)\n }\n\n if (typeof addr === 'string') {\n addr = addr\n .replace(/\\/(\\/)+/, '/')\n .replace(/(\\/)+$/, '')\n\n if (addr === '') {\n addr = '/'\n }\n\n return stringToComponents(addr)\n }\n\n if (Array.isArray(addr)) {\n return addr\n }\n\n throw new InvalidMultiaddrError('Must be a string, Uint8Array, Component[], or another Multiaddr')\n}\n\ninterface MultiaddrOptions {\n validate?: boolean\n}\n\n/**\n * Creates a {@link Multiaddr} from a {@link MultiaddrInput}\n */\nexport class Multiaddr implements MultiaddrInterface {\n [symbol]: boolean = true\n readonly #components: Component[]\n\n // cache string representation\n #string: string | undefined\n // cache byte representation\n #bytes: Uint8Array<ArrayBuffer> | undefined\n\n constructor (addr: MultiaddrInput | Component[] = '/', options: MultiaddrOptions = {}) {\n this.#components = toComponents(addr)\n\n if (options.validate !== false) {\n validate(this)\n }\n }\n\n get bytes (): Uint8Array<ArrayBuffer> {\n if (this.#bytes == null) {\n this.#bytes = componentsToBytes(this.#components)\n }\n\n return this.#bytes\n }\n\n toString (): string {\n if (this.#string == null) {\n this.#string = componentsToString(this.#components)\n }\n\n return this.#string\n }\n\n toJSON (): string {\n return this.toString()\n }\n\n getComponents (): Component[] {\n return [\n ...this.#components.map(c => ({ ...c }))\n ]\n }\n\n encapsulate (addr: MultiaddrInput): MultiaddrInterface {\n const ma = new Multiaddr(addr)\n\n return new Multiaddr([\n ...this.#components,\n ...ma.getComponents()\n ], {\n validate: false\n })\n }\n\n decapsulate (addr: Multiaddr | string): MultiaddrInterface {\n const addrString = addr.toString()\n const s = this.toString()\n const i = s.lastIndexOf(addrString)\n\n if (i < 0) {\n throw new InvalidParametersError(`Address ${this.toString()} does not contain subaddress: ${addrString}`)\n }\n\n return new Multiaddr(s.slice(0, i), {\n validate: false\n })\n }\n\n decapsulateCode (code: number): Multiaddr {\n let index\n\n for (let i = this.#components.length - 1; i > -1; i--) {\n if (this.#components[i].code === code) {\n index = i\n break\n }\n }\n\n return new Multiaddr(this.#components.slice(0, index), {\n validate: false\n })\n }\n\n equals (addr: { bytes: Uint8Array }): boolean {\n return uint8ArrayEquals(this.bytes, addr.bytes)\n }\n\n /**\n * Returns Multiaddr as a human-readable string\n * https://nodejs.org/api/util.html#utilinspectcustom\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * console.info(multiaddr('/ip4/127.0.0.1/tcp/4001'))\n * // 'Multiaddr(/ip4/127.0.0.1/tcp/4001)'\n * ```\n */\n [inspect] (): string {\n return `Multiaddr(${this.toString()})`\n }\n}\n\n/**\n * Ensures all multiaddr tuples are correct. Throws if any invalid protocols or\n * values are encountered.\n */\nexport function validate (addr: Multiaddr): void {\n addr.getComponents()\n .forEach(component => {\n const codec = registry.getProtocol(component.code)\n\n if (component.value == null) {\n return\n }\n\n codec.validate?.(component.value)\n })\n}\n", "/**\n * @packageDocumentation\n *\n * A standard way to represent addresses that\n *\n * - support any standard network protocol\n * - have a binary packed format\n * - have a nice string representation\n * - encapsulate well\n *\n * @example\n *\n * ```TypeScript\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const addr = multiaddr('/ip4/127.0.0.1/udp/1234')\n * // Multiaddr(/ip4/127.0.0.1/udp/1234)\n *\n * addr.bytes\n * // <Uint8Array 04 7f 00 00 01 11 04 d2>\n *\n * addr.toString()\n * // '/ip4/127.0.0.1/udp/1234'\n *\n * addr.getComponents()\n * // [\n * // { code: 4, name: 'ip4', value: '127.0.0.1' },\n * // { code: 273, name: 'udp', value: '1234' }\n * // ]\n *\n * addr.encapsulate('/sctp/5678')\n * // Multiaddr(/ip4/127.0.0.1/udp/1234/sctp/5678)\n * ```\n *\n * @example Adding custom protocols\n *\n * To add application-specific or experimental protocols, add a protocol codec\n * to the protocol registry:\n *\n * ```ts\n * import { registry, V, multiaddr } from '@multiformats/multiaddr'\n * import type { ProtocolCodec } from '@multiformats/multiaddr'\n *\n * const maWithCustomTuple = '/custom-protocol/hello'\n *\n * // throws UnknownProtocolError\n * multiaddr(maWithCustomTuple)\n *\n * const protocol: ProtocolCodec = {\n * code: 2059,\n * name: 'custom-protocol',\n * size: V\n * // V means variable length, can also be 0, a positive integer (e.g. a fixed\n * // length or omitted\n * }\n *\n * registry.addProtocol(protocol)\n *\n * // does not throw UnknownProtocolError\n * multiaddr(maWithCustomTuple)\n *\n * // protocols can also be removed\n * registry.removeProtocol(protocol.code)\n * ```\n */\n\nimport { Multiaddr as MultiaddrClass, symbol } from './multiaddr.ts'\nimport { registry, V } from './registry.ts'\nimport type { ProtocolCodec } from './registry.ts'\n\n/**\n * The protocol registry stores protocol codecs that allow transformation of\n * multiaddr tuples from bytes to string and back again, and also validation of\n * the address values.\n */\nexport interface Registry {\n /**\n * Retrieve a protocol definition by it's code or name\n */\n getProtocol (key: string | number): ProtocolCodec\n\n /**\n * Add a new protocol definition\n */\n addProtocol (codec: ProtocolCodec): void\n\n /**\n * Remove a protocol definition by it's code\n */\n removeProtocol (code: number): void\n}\n\n/**\n * These types can be parsed into a {@link Multiaddr} object\n */\nexport type MultiaddrInput = string | Multiaddr | Uint8Array | null | Component[]\n\n/**\n * A Component is a section of a multiaddr with a name/code, possibly with a\n * value.\n *\n * Component names/codes are defined in the protocol table.\n *\n * @see https://github.com/multiformats/multiaddr/blob/master/protocols.csv\n */\nexport interface Component {\n /**\n * The code of the component as defined in the protocol table\n */\n code: number\n\n /**\n * The name of the component as defined in the protocol table\n */\n name: string\n\n /**\n * The component value, if one is present\n */\n value?: string\n\n /**\n * The bytes that make up the component. This will be set if the multiaddr\n * was parsed from a `Uint8Array`, or if `.bytes` has been accessed on it.\n */\n bytes?: Uint8Array<ArrayBuffer>\n}\n\nexport interface Multiaddr {\n bytes: Uint8Array<ArrayBuffer>\n\n /**\n * Returns Multiaddr as a String\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001').toString()\n * // '/ip4/127.0.0.1/tcp/4001'\n * ```\n */\n toString(): string\n\n /**\n * Returns Multiaddr as a JSON encoded object\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * JSON.stringify(multiaddr('/ip4/127.0.0.1/tcp/4001'))\n * // '/ip4/127.0.0.1/tcp/4001'\n * ```\n */\n toJSON(): string\n\n /**\n * Returns the components that make up this Multiaddr\n *\n * @example\n * ```ts\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001').getComponents()\n * // [{ name: 'ip4', code: 4, value: '127.0.0.1' }, { name: 'tcp', code: 6, value: '4001' }]\n * ```\n */\n getComponents(): Component[]\n\n /**\n * Encapsulates a Multiaddr in another Multiaddr\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * const mh3 = mh1.encapsulate(mh2)\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001)\n *\n * mh3.toString()\n * // '/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001'\n * ```\n *\n * @param {MultiaddrInput} addr - Multiaddr to add into this Multiaddr\n */\n encapsulate(addr: MultiaddrInput): Multiaddr\n\n /**\n * Decapsulates a Multiaddr from another Multiaddr\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * const mh3 = mh1.encapsulate(mh2)\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080/ip4/127.0.0.1/tcp/4001)\n *\n * mh3.decapsulate(mh2).toString()\n * // '/ip4/8.8.8.8/tcp/1080'\n * ```\n *\n * @param {Multiaddr | string} addr - Multiaddr to remove from this Multiaddr\n */\n decapsulate(addr: Multiaddr | string): Multiaddr\n\n /**\n * A more reliable version of `decapsulate` if you are targeting a specific\n * code, such as 421 (the `p2p` protocol code). The last index of the code\n * will be removed from the `Multiaddr`, and a new instance will be returned.\n * If the code is not present, the original `Multiaddr` is returned.\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const addr = multiaddr('/ip4/0.0.0.0/tcp/8080/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC')\n * // Multiaddr(/ip4/0.0.0.0/tcp/8080/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC)\n *\n * addr.decapsulateCode(421).toString()\n * // '/ip4/0.0.0.0/tcp/8080'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/8080').decapsulateCode(421).toString()\n * // '/ip4/127.0.0.1/tcp/8080'\n * ```\n */\n decapsulateCode(code: number): Multiaddr\n\n /**\n * Checks if two Multiaddrs are the same\n *\n * @example\n * ```js\n * import { multiaddr } from '@multiformats/multiaddr'\n *\n * const mh1 = multiaddr('/ip4/8.8.8.8/tcp/1080')\n * // Multiaddr(/ip4/8.8.8.8/tcp/1080)\n *\n * const mh2 = multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n *\n * mh1.equals(mh1)\n * // true\n *\n * mh1.equals(mh2)\n * // false\n * ```\n */\n equals(addr?: any): boolean\n}\n\n/**\n * Check if object is a {@link Multiaddr} instance\n *\n * @example\n *\n * ```js\n * import { isMultiaddr, multiaddr } from '@multiformats/multiaddr'\n *\n * isMultiaddr(5)\n * // false\n * isMultiaddr(multiaddr('/ip4/127.0.0.1'))\n * // true\n * ```\n */\nexport function isMultiaddr (value: any): value is Multiaddr {\n return Boolean(value?.[symbol])\n}\n\n/**\n * A function that takes a {@link MultiaddrInput} and returns a {@link Multiaddr}\n *\n * @example\n * ```js\n * import { multiaddr } from '@libp2p/multiaddr'\n *\n * multiaddr('/ip4/127.0.0.1/tcp/4001')\n * // Multiaddr(/ip4/127.0.0.1/tcp/4001)\n * ```\n *\n * @param {MultiaddrInput} [addr] - If String or Uint8Array, needs to adhere to the address format of a [multiaddr](https://github.com/multiformats/multiaddr#string-format)\n */\nexport function multiaddr (addr?: MultiaddrInput): Multiaddr {\n return new MultiaddrClass(addr)\n}\n\n/**\n * Export all table.csv codes. These are all named exports so can be tree-shaken\n * out by bundlers.\n */\nexport * from './constants.ts'\nexport { registry, V }\nexport type { ProtocolCodec }\n", "export default function pDefer() {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n}\n", "// ported from https://www.npmjs.com/package/fast-fifo\n\nexport interface Next<T> {\n done?: boolean\n error?: Error\n value?: T\n}\n\nclass FixedFIFO<T> {\n public buffer: Array<Next<T> | undefined>\n private readonly mask: number\n private top: number\n private btm: number\n public next: FixedFIFO<T> | null\n\n constructor (hwm: number) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) {\n throw new Error('Max size for a FixedFIFO should be a power of two')\n }\n\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n push (data: Next<T>): boolean {\n if (this.buffer[this.top] !== undefined) {\n return false\n }\n\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n\n return true\n }\n\n shift (): Next<T> | undefined {\n const last = this.buffer[this.btm]\n\n if (last === undefined) {\n return undefined\n }\n\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n isEmpty (): boolean {\n return this.buffer[this.btm] === undefined\n }\n}\n\nexport interface FIFOOptions {\n /**\n * When the queue reaches this size, it will be split into head/tail parts\n */\n splitLimit?: number\n}\n\nexport class FIFO<T> {\n public size: number\n private readonly hwm: number\n private head: FixedFIFO<T>\n private tail: FixedFIFO<T>\n\n constructor (options: FIFOOptions = {}) {\n this.hwm = options.splitLimit ?? 16\n this.head = new FixedFIFO<T>(this.hwm)\n this.tail = this.head\n this.size = 0\n }\n\n calculateSize (obj: any): number {\n if (obj?.byteLength != null) {\n return obj.byteLength\n }\n\n return 1\n }\n\n push (val: Next<T>): void {\n if (val?.value != null) {\n this.size += this.calculateSize(val.value)\n }\n\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO<T>(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift (): Next<T> | undefined {\n let val = this.tail.shift()\n\n if (val === undefined && (this.tail.next != null)) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n val = this.tail.shift()\n }\n\n if (val?.value != null) {\n this.size -= this.calculateSize(val.value)\n }\n\n return val\n }\n\n isEmpty (): boolean {\n return this.head.isEmpty()\n }\n}\n", "/**\n * @packageDocumentation\n *\n * An iterable that you can push values into.\n *\n * @example\n *\n * ```js\n * import { pushable } from 'it-pushable'\n *\n * const source = pushable()\n *\n * setTimeout(() => source.push('hello'), 100)\n * setTimeout(() => source.push('world'), 200)\n * setTimeout(() => source.end(), 300)\n *\n * const start = Date.now()\n *\n * for await (const value of source) {\n * console.log(`got \"${value}\" after ${Date.now() - start}ms`)\n * }\n * console.log(`done after ${Date.now() - start}ms`)\n *\n * // Output:\n * // got \"hello\" after 105ms\n * // got \"world\" after 207ms\n * // done after 309ms\n * ```\n *\n * @example\n *\n * ```js\n * import { pushableV } from 'it-pushable'\n * import all from 'it-all'\n *\n * const source = pushableV()\n *\n * source.push(1)\n * source.push(2)\n * source.push(3)\n * source.end()\n *\n * console.info(await all(source))\n *\n * // Output:\n * // [ [1, 2, 3] ]\n * ```\n */\n\nimport deferred from 'p-defer'\nimport { FIFO } from './fifo.ts'\nimport type { Next } from './fifo.ts'\n\nexport class AbortError extends Error {\n type: string\n code: string\n\n constructor (message?: string, code?: string) {\n super(message ?? 'The operation was aborted')\n this.type = 'aborted'\n this.code = code ?? 'ABORT_ERR'\n }\n}\n\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\ninterface BasePushable<T> {\n /**\n * End the iterable after all values in the buffer (if any) have been yielded. If an\n * error is passed the buffer is cleared immediately and the next iteration will\n * throw the passed error\n */\n end(err?: Error): this\n\n /**\n * Push a value into the iterable. Values are yielded from the iterable in the order\n * they are pushed. Values not yet consumed from the iterable are buffered.\n */\n push(value: T): this\n\n /**\n * Returns a promise that resolves when the underlying queue becomes empty (e.g.\n * this.readableLength === 0).\n *\n * If an AbortSignal is passed as an option and that signal aborts, it only\n * causes the returned promise to reject - it does not end the pushable.\n */\n onEmpty(options?: AbortOptions): Promise<void>\n\n /**\n * This property contains the number of bytes (or objects) in the queue ready to be read.\n *\n * If `objectMode` is true, this is the number of objects in the queue, if false it's the\n * total number of bytes in the queue.\n */\n readableLength: number\n}\n\n/**\n * An iterable that you can push values into.\n */\nexport interface Pushable<T, R = void, N = unknown> extends AsyncGenerator<T, R, N>, BasePushable<T> {}\n\n/**\n * Similar to `pushable`, except it yields multiple buffered chunks at a time. All values yielded from the iterable will be arrays.\n */\nexport interface PushableV<T, R = void, N = unknown> extends AsyncGenerator<T[], R, N>, BasePushable<T> {}\n\nexport interface Options {\n /**\n * A boolean value that means non-`Uint8Array`s will be passed to `.push`, default: `false`\n */\n objectMode?: boolean\n\n /**\n * A function called after *all* values have been yielded from the iterator (including\n * buffered values). In the case when the iterator is ended with an error it will be\n * passed the error as a parameter.\n */\n onEnd?(err?: Error): void\n}\n\nexport interface DoneResult { done: true }\nexport interface ValueResult<T> { done: false, value: T }\nexport type NextResult<T> = ValueResult<T> | DoneResult\n\ninterface getNext<T, V = T> { (buffer: FIFO<T>): NextResult<V> }\n\nexport interface ObjectPushableOptions extends Options {\n objectMode: true\n}\n\nexport interface BytePushableOptions extends Options {\n objectMode?: false\n}\n\n/**\n * Create a new async iterable. The values yielded from calls to `.next()`\n * or when used in a `for await of`loop are \"pushed\" into the iterable.\n * Returns an async iterable object with additional methods.\n */\nexport function pushable<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): Pushable<T>\nexport function pushable<T> (options: ObjectPushableOptions): Pushable<T>\nexport function pushable<T> (options: Options = {}): Pushable<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T> => {\n const next: Next<T> | undefined = buffer.shift()\n\n if (next == null) {\n return { done: true }\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n return {\n done: next.done === true,\n // @ts-expect-error if done is false, value will be present\n value: next.value\n }\n }\n\n return _pushable<T, T, Pushable<T>>(getNext, options)\n}\n\nexport function pushableV<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): PushableV<T>\nexport function pushableV<T> (options: ObjectPushableOptions): PushableV<T>\nexport function pushableV<T> (options: Options = {}): PushableV<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T[]> => {\n let next: Next<T> | undefined\n const values: T[] = []\n\n while (!buffer.isEmpty()) {\n next = buffer.shift()\n\n if (next == null) {\n break\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n if (next.done === false) {\n // @ts-expect-error if done is false value should be pushed\n values.push(next.value)\n }\n }\n\n if (next == null) {\n return { done: true }\n }\n\n return {\n done: next.done === true,\n value: values\n }\n }\n\n return _pushable<T, T[], PushableV<T>>(getNext, options)\n}\n\nfunction _pushable<PushType, ValueType, ReturnType> (getNext: getNext<PushType, ValueType>, options?: Options): ReturnType {\n options = options ?? {}\n let onEnd = options.onEnd\n let buffer = new FIFO<PushType>()\n let pushable: any\n let onNext: ((next: Next<PushType>) => ReturnType) | null\n let ended: boolean\n let drain = deferred()\n\n const waitNext = async (): Promise<NextResult<ValueType>> => {\n try {\n if (!buffer.isEmpty()) {\n return getNext(buffer)\n }\n\n if (ended) {\n return { done: true }\n }\n\n return await new Promise<NextResult<ValueType>>((resolve, reject) => {\n onNext = (next: Next<PushType>) => {\n onNext = null\n buffer.push(next)\n\n try {\n resolve(getNext(buffer))\n } catch (err) {\n reject(err)\n }\n\n return pushable\n }\n })\n } finally {\n if (buffer.isEmpty()) {\n // settle promise in the microtask queue to give consumers a chance to\n // await after calling .push\n queueMicrotask(() => {\n drain.resolve()\n drain = deferred()\n })\n }\n }\n }\n\n const bufferNext = (next: Next<PushType>): ReturnType => {\n if (onNext != null) {\n return onNext(next)\n }\n\n buffer.push(next)\n return pushable\n }\n\n const bufferError = (err: Error): ReturnType => {\n buffer = new FIFO()\n\n if (onNext != null) {\n return onNext({ error: err })\n }\n\n buffer.push({ error: err })\n return pushable\n }\n\n const push = (value: PushType): ReturnType => {\n if (ended) {\n return pushable\n }\n\n // @ts-expect-error `byteLength` is not declared on PushType\n if (options?.objectMode !== true && value?.byteLength == null) {\n throw new Error('objectMode was not true but tried to push non-Uint8Array value')\n }\n\n return bufferNext({ done: false, value })\n }\n const end = (err?: Error): ReturnType => {\n if (ended) { return pushable }\n ended = true\n\n return (err != null) ? bufferError(err) : bufferNext({ done: true })\n }\n const _return = (): DoneResult => {\n buffer = new FIFO()\n end()\n\n return { done: true }\n }\n const _throw = (err: Error): DoneResult => {\n end(err)\n\n return { done: true }\n }\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next: waitNext,\n return: _return,\n throw: _throw,\n push,\n end,\n get readableLength (): number {\n return buffer.size\n },\n onEmpty: async (options?: AbortOptions) => {\n const signal = options?.signal\n signal?.throwIfAborted()\n\n if (buffer.isEmpty()) {\n return\n }\n\n let cancel: Promise<void> | undefined\n let listener: (() => void) | undefined\n\n if (signal != null) {\n cancel = new Promise((resolve, reject) => {\n listener = () => {\n reject(new AbortError())\n }\n\n signal.addEventListener('abort', listener)\n })\n }\n\n try {\n await Promise.race([\n drain.promise,\n cancel\n ])\n } finally {\n if (listener != null && signal != null) {\n signal?.removeEventListener('abort', listener)\n }\n }\n }\n }\n\n if (onEnd == null) {\n return pushable\n }\n\n const _pushable = pushable\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next () {\n return _pushable.next()\n },\n throw (err: Error) {\n _pushable.throw(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return { done: true }\n },\n return () {\n _pushable.return()\n\n if (onEnd != null) {\n onEnd()\n onEnd = undefined\n }\n\n return { done: true }\n },\n push,\n end (err: Error) {\n _pushable.end(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return pushable\n },\n get readableLength () {\n return _pushable.readableLength\n },\n onEmpty: (opts?: AbortOptions) => {\n return _pushable.onEmpty(opts)\n }\n }\n\n return pushable\n}\n", "export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n", "import pTimeout from 'p-timeout';\n\nconst normalizeEmitter = emitter => {\n\tconst addListener = emitter.addEventListener || emitter.on || emitter.addListener;\n\tconst removeListener = emitter.removeEventListener || emitter.off || emitter.removeListener;\n\n\tif (!addListener || !removeListener) {\n\t\tthrow new TypeError('Emitter is not compatible');\n\t}\n\n\treturn {\n\t\taddListener: addListener.bind(emitter),\n\t\tremoveListener: removeListener.bind(emitter),\n\t};\n};\n\nexport function pEventMultiple(emitter, event, options) {\n\tlet cancel;\n\tconst returnValue = new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\trejectionEvents: ['error'],\n\t\t\tmultiArgs: false,\n\t\t\trejectionMultiArgs: false,\n\t\t\tresolveImmediately: false,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!(options.count >= 0 && (options.count === Number.POSITIVE_INFINITY || Number.isInteger(options.count)))) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\n\t\t// Allow multiple events\n\t\tconst events = [event].flat();\n\n\t\tconst items = [];\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\tconst onItem = async (...arguments_) => {\n\t\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\t\tif (options.filter) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titems.push(value);\n\n\t\t\tif (options.count === items.length) {\n\t\t\t\tcancel();\n\t\t\t\tresolve(items);\n\t\t\t}\n\t\t};\n\n\t\tconst rejectHandler = (...arguments_) => {\n\t\t\tcancel();\n\t\t\treject(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tfor (const event of events) {\n\t\t\t\tremoveListener(event, onItem);\n\t\t\t}\n\n\t\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t\t// Only remove rejection handler if we actually registered it\n\t\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const event of events) {\n\t\t\taddListener(event, onItem);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t// Skip registering rejection handler if we're already listening to this event\n\t\t\t// as the main event takes priority (as documented)\n\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\taddListener(rejectionEvent, rejectHandler);\n\t\t\t}\n\t\t}\n\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener('abort', () => {\n\t\t\t\trejectHandler(options.signal.reason);\n\t\t\t}, {once: true});\n\t\t}\n\n\t\tif (options.resolveImmediately) {\n\t\t\tresolve(items);\n\t\t}\n\t});\n\n\treturnValue.cancel = cancel;\n\n\tif (typeof options.timeout === 'number') {\n\t\tconst timeout = pTimeout(returnValue, {milliseconds: options.timeout});\n\t\t// When cancelling, also clear the timeout timer\n\t\ttimeout.cancel = () => {\n\t\t\tcancel();\n\t\t\ttimeout.clear();\n\t\t};\n\n\t\treturn timeout;\n\t}\n\n\treturn returnValue;\n}\n\nexport function pEvent(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tcount: 1,\n\t\tresolveImmediately: false,\n\t};\n\n\tconst arrayPromise = pEventMultiple(emitter, event, options);\n\tconst promise = arrayPromise.then(array => array[0]); // eslint-disable-line promise/prefer-await-to-then\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n}\n\nexport function pEventIterator(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\t// Allow multiple events\n\tconst events = [event].flat();\n\n\toptions = {\n\t\trejectionEvents: ['error'],\n\t\tresolutionEvents: [],\n\t\tlimit: Number.POSITIVE_INFINITY,\n\t\tmultiArgs: false,\n\t\trejectionMultiArgs: false,\n\t\t...options,\n\t};\n\n\tconst {limit} = options;\n\tconst isValidLimit = limit >= 0 && (limit === Number.POSITIVE_INFINITY || Number.isInteger(limit));\n\tif (!isValidLimit) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tif (limit === 0) {\n\t\t// Return an empty async iterator to avoid any further cost\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tasync next() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\tlet error;\n\tlet hasPendingError = false;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\tlet isLimitReached = false;\n\n\tconst valueHandler = (...arguments_) => {\n\t\teventCount++;\n\t\tisLimitReached = eventCount === limit;\n\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\n\t\t\tresolve({done: false, value});\n\n\t\t\tif (isLimitReached) {\n\t\t\t\tcancel();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueQueue.push(value);\n\n\t\tif (isLimitReached) {\n\t\t\tcancel();\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tisDone = true;\n\n\t\tfor (const event of events) {\n\t\t\tremoveListener(event, valueHandler);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\t\tremoveListener(resolutionEvent, resolveHandler);\n\t\t}\n\n\t\twhile (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value: undefined});\n\t\t}\n\t};\n\n\tconst rejectHandler = (...arguments_) => {\n\t\terror = options.rejectionMultiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {reject} = nextQueue.shift();\n\t\t\treject(error);\n\t\t} else {\n\t\t\thasPendingError = true;\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst resolveHandler = async (...arguments_) => {\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (options.filter) {\n\t\t\ttry {\n\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (filterError) {\n\t\t\t\tcancel();\n\t\t\t\tif (nextQueue.length > 0) {\n\t\t\t\t\tconst {reject} = nextQueue.shift();\n\t\t\t\t\treject(filterError);\n\t\t\t\t} else {\n\t\t\t\t\t// Store error for next iterator call\n\t\t\t\t\thasPendingError = true;\n\t\t\t\t\terror = filterError;\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tfor (const event of events) {\n\t\taddListener(event, valueHandler);\n\t}\n\n\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\taddListener(rejectionEvent, rejectHandler);\n\t}\n\n\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\taddListener(resolutionEvent, resolveHandler);\n\t}\n\n\tif (options.signal) {\n\t\toptions.signal.addEventListener('abort', () => {\n\t\t\trejectHandler(options.signal.reason);\n\t\t}, {once: true});\n\t}\n\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\tconst value = valueQueue.shift();\n\t\t\t\treturn {\n\t\t\t\t\tdone: isDone && valueQueue.length === 0 && !isLimitReached,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (hasPendingError) {\n\t\t\t\thasPendingError = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnextQueue.push({resolve, reject});\n\t\t\t});\n\t\t},\n\t\tasync return(value) {\n\t\t\tcancel();\n\t\t\treturn {\n\t\t\t\tdone: isDone,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport {TimeoutError} from 'p-timeout';\n", "import type { Startable } from '@libp2p/interface'\n\nexport interface DebouncedFunction extends Startable {\n (): void\n}\n\n/**\n * Returns a function wrapper that will only call the passed function once\n *\n * Important - the passed function should not throw or reject\n */\nexport function debounce (func: () => void | Promise<void>, wait: number): DebouncedFunction {\n let timeout: ReturnType<typeof setTimeout> | undefined\n\n const output = function (): void {\n const later = function (): void {\n timeout = undefined\n void func()\n }\n\n clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n }\n output.start = (): void => {}\n output.stop = (): void => {\n clearTimeout(timeout)\n }\n\n return output\n}\n", "import type { RateLimiterResult } from './rate-limiter.ts'\n\n/**\n * A rate limit was hit\n */\nexport class RateLimitError extends Error {\n remainingPoints: number\n msBeforeNext: number\n consumedPoints: number\n isFirstInDuration: boolean\n\n constructor (message = 'Rate limit exceeded', props: RateLimiterResult) {\n super(message)\n this.name = 'RateLimitError'\n this.remainingPoints = props.remainingPoints\n this.msBeforeNext = props.msBeforeNext\n this.consumedPoints = props.consumedPoints\n this.isFirstInDuration = props.isFirstInDuration\n }\n}\n\nexport class QueueFullError extends Error {\n static name = 'QueueFullError'\n\n constructor (message: string = 'The queue was full') {\n super(message)\n this.name = 'QueueFullError'\n }\n}\n\nexport class UnexpectedEOFError extends Error {\n static name = 'UnexpectedEOFError'\n name = 'UnexpectedEOFError'\n}\n\nexport class MaxEarlyStreamsError extends Error {\n static name = 'MaxEarlyStreamsError'\n name = 'MaxEarlyStreamsError'\n}\n\nexport class StreamClosedError extends Error {\n static name = 'StreamClosedError'\n name = 'StreamClosedError'\n}\n", "/**\n * @packageDocumentation\n *\n * Pass a promise and an abort signal and await the result.\n *\n * @example Basic usage\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws an AbortError\n * const resolve = await raceSignal(promise, controller.signal)\n * ```\n *\n * @example Overriding errors\n *\n * By default the thrown error is the `.reason` property of the signal but it's\n * possible to override this behaviour with the `translateError` option:\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws `Error('Oh no!')`\n * const resolve = await raceSignal(promise, controller.signal, {\n * translateError: (signal) => {\n * // use `signal`, or don't\n * return new Error('Oh no!')\n * }\n * })\n * ```\n */\n\nexport interface RaceSignalOptions {\n /**\n * By default the rejection reason will be taken from the `.reason` field of\n * the aborted signal.\n *\n * Passing a function here allows overriding the default error.\n */\n translateError?(signal: AbortSignal): Error\n}\n\nfunction defaultTranslate (signal: AbortSignal): Error {\n return signal.reason\n}\n\n/**\n * Race a promise against an abort signal\n */\nexport async function raceSignal <T> (promise: Promise<T>, signal?: AbortSignal, opts?: RaceSignalOptions): Promise<T> {\n if (signal == null) {\n return promise\n }\n\n const translateError = opts?.translateError ?? defaultTranslate\n\n if (signal.aborted) {\n // the passed promise may yet resolve or reject but the use has signalled\n // they are no longer interested so smother the error\n promise.catch(() => {})\n return Promise.reject(translateError(signal))\n }\n\n let listener\n\n try {\n return await Promise.race([\n promise,\n new Promise<T>((resolve, reject) => {\n listener = () => {\n reject(translateError(signal))\n }\n signal.addEventListener('abort', listener)\n })\n ])\n } finally {\n if (listener != null) {\n signal.removeEventListener('abort', listener)\n }\n }\n}\n", "import { AbortError } from '@libp2p/interface'\nimport pDefer from 'p-defer'\nimport type { AbortOptions } from '@libp2p/interface'\nimport type { DeferredPromise } from 'p-defer'\nimport type { ProgressOptions, ProgressEventListener } from 'progress-events'\n\nexport class JobRecipient<JobReturnType, JobOptions extends AbortOptions & ProgressOptions = any> {\n public deferred: DeferredPromise<JobReturnType>\n public signal?: AbortSignal\n public onProgress?: ProgressEventListener\n\n constructor (options?: Partial<Pick<JobOptions, 'signal' | 'onProgress'>>) {\n this.signal = options?.signal\n this.onProgress = options?.onProgress\n this.deferred = pDefer()\n\n this.onAbort = this.onAbort.bind(this)\n this.signal?.addEventListener('abort', this.onAbort)\n }\n\n onAbort (): void {\n this.deferred.reject(this.signal?.reason ?? new AbortError())\n }\n\n cleanup (): void {\n this.signal?.removeEventListener('abort', this.onAbort)\n }\n}\n", "import { AbortError } from '@libp2p/interface'\nimport { setMaxListeners } from 'main-event'\nimport { raceSignal } from 'race-signal'\nimport { JobRecipient } from './recipient.ts'\nimport type { JobStatus } from './index.ts'\nimport type { AbortOptions } from '@libp2p/interface'\nimport type { ProgressOptions } from 'progress-events'\n\n/**\n * Returns a random string\n */\nfunction randomId (): string {\n return `${(parseInt(String(Math.random() * 1e9), 10)).toString()}${Date.now()}`\n}\n\nexport interface JobTimeline {\n created: number\n started?: number\n finished?: number\n}\n\nexport class Job <JobOptions extends AbortOptions & ProgressOptions = AbortOptions, JobReturnType = unknown> {\n public id: string\n public fn: (options: JobOptions) => Promise<JobReturnType>\n public options: JobOptions\n public recipients: Array<JobRecipient<JobReturnType>>\n public status: JobStatus\n public readonly timeline: JobTimeline\n private readonly controller: AbortController\n private dispatchingProgress: boolean\n\n constructor (fn: (options: JobOptions) => Promise<JobReturnType>, options: any) {\n this.id = randomId()\n this.status = 'queued'\n this.fn = fn\n this.options = options\n this.recipients = []\n this.timeline = {\n created: Date.now()\n }\n\n this.controller = new AbortController()\n setMaxListeners(Infinity, this.controller.signal)\n\n this.dispatchingProgress = false\n\n this.onAbort = this.onAbort.bind(this)\n }\n\n abort (err: Error): void {\n this.controller.abort(err)\n }\n\n onAbort (): void {\n const allAborted = this.recipients.reduce((acc, curr) => {\n return acc && (curr.signal?.aborted === true)\n }, true)\n\n // if all recipients have aborted the job, actually abort the job\n if (allAborted) {\n this.controller.abort(new AbortError())\n this.cleanup()\n }\n }\n\n async join (options?: Partial<Pick<JobOptions, 'signal' | 'onProgress'>>): Promise<JobReturnType> {\n const recipient = new JobRecipient<JobReturnType>(options)\n this.recipients.push(recipient)\n\n options?.signal?.addEventListener('abort', this.onAbort)\n\n return recipient.deferred.promise\n }\n\n async run (): Promise<void> {\n this.status = 'running'\n this.timeline.started = Date.now()\n\n try {\n this.controller.signal.throwIfAborted()\n\n const result = await raceSignal(this.fn({\n ...(this.options ?? {}),\n signal: this.controller.signal,\n onProgress: (evt: any): void => {\n // Recipients can transitively re-enter this dispatcher; without\n // this guard a single event recurses until the stack overflows.\n if (this.dispatchingProgress) {\n return\n }\n\n this.dispatchingProgress = true\n\n try {\n this.recipients.forEach(recipient => {\n recipient.onProgress?.(evt)\n })\n } finally {\n this.dispatchingProgress = false\n }\n }\n }), this.controller.signal)\n\n this.recipients.forEach(recipient => {\n recipient.deferred.resolve(result)\n })\n\n this.status = 'complete'\n } catch (err) {\n this.recipients.forEach(recipient => {\n recipient.deferred.reject(err)\n })\n\n this.status = 'errored'\n } finally {\n this.timeline.finished = Date.now()\n this.cleanup()\n }\n }\n\n cleanup (): void {\n this.recipients.forEach(recipient => {\n recipient.cleanup()\n recipient.signal?.removeEventListener('abort', this.onAbort)\n })\n }\n}\n", "import { AbortError } from '@libp2p/interface'\nimport { pushable } from 'it-pushable'\nimport { TypedEventEmitter } from 'main-event'\nimport { pEvent } from 'p-event'\nimport { debounce } from '../debounce.ts'\nimport { QueueFullError } from '../errors.ts'\nimport { Job } from './job.ts'\nimport type { AbortOptions, Metrics } from '@libp2p/interface'\nimport type { ProgressOptions } from 'progress-events'\n\nexport type { Job, JobTimeline } from './job.ts'\nexport type { JobRecipient } from './recipient.ts'\n\nexport interface Comparator<T> {\n (a: T, b: T): -1 | 0 | 1\n}\n\nexport interface QueueInit<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n /**\n * Concurrency limit.\n *\n * Minimum: `1`.\n *\n * @default Infinity\n */\n concurrency?: number\n\n /**\n * If the queue size grows to larger than this number the promise returned\n * from the add function will reject\n *\n * @default Infinity\n */\n maxSize?: number\n\n /**\n * The name of the metric for the queue length\n */\n metricName?: string\n\n /**\n * An implementation of the libp2p Metrics interface\n */\n metrics?: Metrics\n\n /**\n * An optional function that will sort the queue after a job has been added\n */\n sort?: Comparator<Job<JobOptions, JobReturnType>>\n}\n\nexport type JobStatus = 'queued' | 'running' | 'errored' | 'complete'\n\nexport interface RunFunction<Options extends AbortOptions = AbortOptions, ReturnType = void> {\n (options: Options): Promise<ReturnType>\n}\n\nexport interface JobMatcher<JobOptions extends AbortOptions = AbortOptions> {\n (options?: Partial<JobOptions>): boolean\n}\n\nexport interface QueueJobSuccess<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n job: Job<JobOptions, JobReturnType>\n result: JobReturnType\n}\n\nexport interface QueueJobFailure<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n job: Job<JobOptions, JobReturnType>\n error: Error\n}\n\nexport interface QueueEvents<JobReturnType, JobOptions extends AbortOptions = AbortOptions> {\n /**\n * A job is about to start running\n */\n active: CustomEvent\n\n /**\n * All jobs have finished and the queue is empty\n */\n idle: CustomEvent\n\n /**\n * The queue is empty, jobs may be running\n */\n empty: CustomEvent\n\n /**\n * A job was added to the queue\n */\n add: CustomEvent\n\n /**\n * A job has finished or failed\n */\n next: CustomEvent\n\n /**\n * A job has finished successfully\n */\n completed: CustomEvent<JobReturnType>\n\n /**\n * Emitted just after `\"completed\", a job has finished successfully - this\n * event gives access to the job and it's result\n */\n success: CustomEvent<QueueJobSuccess<JobReturnType, JobOptions>>\n\n /**\n * Emitted just after `\"error\", a job has failed - this event gives access to\n * the job and the thrown error\n */\n failure: CustomEvent<QueueJobFailure<JobReturnType, JobOptions>>\n}\n\n/**\n * Heavily influence by `p-queue` with the following differences:\n *\n * 1. Items remain at the head of the queue while they are running so `queue.size` includes `queue.pending` items - this is so interested parties can join the results of a queue item while it is running\n * 2. The options for a job are stored separately to the job in order for them to be modified while they are still in the queue\n */\nexport class Queue<JobReturnType = unknown, JobOptions extends AbortOptions & ProgressOptions = AbortOptions> extends TypedEventEmitter<QueueEvents<JobReturnType, JobOptions>> {\n public concurrency: number\n public maxSize: number\n public queue: Array<Job<JobOptions, JobReturnType>>\n private pending: number\n private readonly sort?: Comparator<Job<JobOptions, JobReturnType>>\n private paused: boolean\n\n constructor (init: QueueInit<JobReturnType, JobOptions> = {}) {\n super()\n\n this.concurrency = init.concurrency ?? Number.POSITIVE_INFINITY\n this.maxSize = init.maxSize ?? Number.POSITIVE_INFINITY\n this.pending = 0\n this.paused = false\n\n if (init.metricName != null) {\n init.metrics?.registerMetricGroup(init.metricName, {\n calculate: () => {\n return {\n size: this.queue.length,\n running: this.pending,\n queued: this.queue.length - this.pending\n }\n }\n })\n }\n\n this.sort = init.sort\n this.queue = []\n\n this.emitEmpty = debounce(this.emitEmpty.bind(this), 1)\n this.emitIdle = debounce(this.emitIdle.bind(this), 1)\n }\n\n emitEmpty (): void {\n if (this.size !== 0) {\n return\n }\n\n this.safeDispatchEvent('empty')\n }\n\n emitIdle (): void {\n if (this.running !== 0) {\n return\n }\n\n this.safeDispatchEvent('idle')\n }\n\n pause (): void {\n this.paused = true\n }\n\n resume (): void {\n if (!this.paused) {\n return\n }\n\n this.paused = false\n this.tryToStartAnother()\n }\n\n private tryToStartAnother (): boolean {\n if (this.paused) {\n return false\n }\n\n if (this.size === 0) {\n this.emitEmpty()\n\n if (this.running === 0) {\n this.emitIdle()\n }\n\n return false\n }\n\n if (this.pending < this.concurrency) {\n let job: Job<JobOptions, JobReturnType> | undefined\n\n for (const j of this.queue) {\n if (j.status === 'queued') {\n job = j\n break\n }\n }\n\n if (job == null) {\n return false\n }\n\n this.safeDispatchEvent('active')\n\n this.pending++\n\n void job.run()\n .finally(() => {\n // remove the job from the queue\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i] === job) {\n this.queue.splice(i, 1)\n break\n }\n }\n\n this.pending--\n this.tryToStartAnother()\n this.safeDispatchEvent('next')\n })\n\n return true\n }\n\n return false\n }\n\n private enqueue (job: Job<JobOptions, JobReturnType>): void {\n this.queue.push(job)\n\n if (this.sort != null) {\n this.queue.sort(this.sort)\n }\n }\n\n /**\n * Adds a sync or async task to the queue. Always returns a promise.\n */\n async add (fn: RunFunction<JobOptions, JobReturnType>, options?: JobOptions): Promise<JobReturnType> {\n options?.signal?.throwIfAborted()\n\n if (this.size === this.maxSize) {\n throw new QueueFullError()\n }\n\n const job = new Job<JobOptions, JobReturnType>(fn, options)\n this.enqueue(job)\n this.safeDispatchEvent('add')\n\n const result = job.join(options)\n .then(result => {\n this.safeDispatchEvent('completed', { detail: result })\n this.safeDispatchEvent('success', { detail: { job, result } })\n\n return result\n })\n .catch(err => {\n if (job.status === 'queued') {\n // job was aborted before it started - remove the job from the queue\n for (let i = 0; i < this.queue.length; i++) {\n if (this.queue[i] === job) {\n this.queue.splice(i, 1)\n break\n }\n }\n }\n\n this.safeDispatchEvent('failure', { detail: { job, error: err } })\n\n throw err\n })\n\n this.tryToStartAnother()\n\n return result\n }\n\n /**\n * Clear the queue\n */\n clear (): void {\n this.queue.splice(0, this.queue.length)\n }\n\n /**\n * Abort all jobs in the queue and clear it\n */\n abort (): void {\n this.queue.forEach(job => {\n job.abort(new AbortError())\n })\n\n this.clear()\n }\n\n /**\n * Can be called multiple times. Useful if you for example add additional items at a later time.\n *\n * @returns A promise that settles when the queue becomes empty.\n */\n async onEmpty (options?: AbortOptions): Promise<void> {\n // Instantly resolve if the queue is empty\n if (this.size === 0) {\n return\n }\n\n await pEvent(this, 'empty', options)\n }\n\n /**\n * @returns A promise that settles when the queue size is less than the given\n * limit: `queue.size < limit`.\n *\n * If you want to avoid having the queue grow beyond a certain size you can\n * `await queue.onSizeLessThan()` before adding a new item.\n *\n * Note that this only limits the number of items waiting to start. There\n * could still be up to `concurrency` jobs already running that this call does\n * not include in its calculation.\n */\n async onSizeLessThan (limit: number, options?: AbortOptions): Promise<void> {\n // Instantly resolve if the queue is empty.\n if (this.size < limit) {\n return\n }\n\n await pEvent(this, 'next', {\n ...options,\n filter: () => this.size < limit\n })\n }\n\n /**\n * The difference with `.onEmpty` is that `.onIdle` guarantees that all work\n * from the queue has finished. `.onEmpty` merely signals that the queue is\n * empty, but it could mean that some promises haven't completed yet.\n *\n * @returns A promise that settles when the queue becomes empty, and all\n * promises have completed; `queue.size === 0 && queue.pending === 0`.\n */\n async onIdle (options?: AbortOptions): Promise<void> {\n // Instantly resolve if none pending and if nothing else is queued\n if (this.pending === 0 && this.size === 0) {\n return\n }\n\n await pEvent(this, 'idle', options)\n }\n\n /**\n * Size of the queue including running items\n */\n get size (): number {\n return this.queue.length\n }\n\n /**\n * The number of queued items waiting to run.\n */\n get queued (): number {\n return this.queue.length - this.pending\n }\n\n /**\n * The number of items currently running.\n */\n get running (): number {\n return this.pending\n }\n\n /**\n * Returns an async generator that makes it easy to iterate over the results\n * of jobs added to the queue.\n *\n * The generator will end when the queue becomes idle, that is there are no\n * jobs running and no jobs that have yet to run.\n *\n * If you need to keep the queue open indefinitely, consider using it-pushable\n * instead.\n */\n async * toGenerator (options?: AbortOptions): AsyncGenerator<JobReturnType, void, unknown> {\n options?.signal?.throwIfAborted()\n\n const stream = pushable<JobReturnType>({\n objectMode: true\n })\n\n const cleanup = (err?: Error): void => {\n if (err != null) {\n this.abort()\n } else {\n this.clear()\n }\n\n stream.end(err)\n }\n\n const onQueueJobComplete = (evt: CustomEvent<JobReturnType>): void => {\n if (evt.detail != null) {\n stream.push(evt.detail)\n }\n }\n\n const onQueueFailure = (evt: CustomEvent<QueueJobFailure<JobReturnType, JobOptions>>): void => {\n cleanup(evt.detail.error)\n }\n\n const onQueueIdle = (): void => {\n cleanup()\n }\n\n // clear the queue and throw if the query is aborted\n const onSignalAbort = (): void => {\n cleanup(new AbortError('Queue aborted'))\n }\n\n // add listeners\n this.addEventListener('completed', onQueueJobComplete)\n this.addEventListener('failure', onQueueFailure)\n this.addEventListener('idle', onQueueIdle)\n options?.signal?.addEventListener('abort', onSignalAbort)\n\n try {\n yield * stream\n } finally {\n // remove listeners\n this.removeEventListener('completed', onQueueJobComplete)\n this.removeEventListener('failure', onQueueFailure)\n this.removeEventListener('idle', onQueueIdle)\n options?.signal?.removeEventListener('abort', onSignalAbort)\n\n // empty the queue for when the user has broken out of a loop early\n cleanup()\n }\n }\n}\n", "/**\n * @packageDocumentation\n *\n * Similar to [AbortSignal.any](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static)\n * except the returned promise has a `.clear` method that removes all event\n * listeners added to passed signals preventing memory leaks.\n *\n * At the time of writing at least, `AbortSignal.any` leaks memory in Node.js\n * and Deno environments:\n *\n * - https://github.com/nodejs/node/issues/54614\n * - https://github.com/denoland/deno/issues/24842\n *\n * @example\n *\n * ```js\n * import { anySignal } from 'any-signal'\n *\n * const userController = new AbortController()\n *\n * // Abort after 1 second\n * const timeoutSignal = AbortSignal.timeout(1000)\n *\n * const combinedSignal = anySignal([userController.signal, timeoutSignal])\n * combinedSignal.addEventListener('abort', () => console.log('Abort!'))\n *\n * try {\n * // The user or the timeout can now abort the action\n * await performSomeAction({ signal: combinedSignal })\n * } finally {\n * // Clear will clean up internal event handlers\n * combinedSignal.clear()\n * }\n * ```\n */\n\nexport interface ClearableSignal extends AbortSignal {\n clear(): void\n}\n\n/**\n * Takes an array of AbortSignals and returns a single signal.\n * If any signals are aborted, the returned signal will be aborted.\n */\nexport function anySignal (signals: Array<AbortSignal | undefined | null>): ClearableSignal {\n const controller = new globalThis.AbortController()\n\n function onAbort (): void {\n const reason = signals\n .filter(s => s?.aborted === true)\n .map(s => s?.reason)\n .pop()\n\n controller.abort(reason)\n\n for (const signal of signals) {\n if (signal?.removeEventListener != null) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n }\n\n for (const signal of signals) {\n if (signal?.aborted === true) {\n onAbort()\n break\n }\n\n if (signal?.addEventListener != null) {\n signal.addEventListener('abort', onAbort)\n }\n }\n\n function clear (): void {\n for (const signal of signals) {\n if (signal?.removeEventListener != null) {\n signal.removeEventListener('abort', onAbort)\n }\n }\n }\n\n const signal = controller.signal as ClearableSignal\n signal.clear = clear\n\n return signal\n}\n", "/**\n * @packageDocumentation\n *\n * Allows treating a browser readable stream as an async iterator.\n *\n * @example\n *\n * ```javascript\n * import toIt from 'browser-readablestream-to-it'\n * import all from 'it-all'\n *\n * const content = [0, 1, 2, 3, 4]\n *\n * const stream = new ReadableStream({\n * start(controller) {\n * for (let i = 0; i < content.length; i++) {\n * controller.enqueue(content[i])\n * }\n *\n * controller.close()\n * }\n * })\n *\n * const arr = await all(toIt(stream))\n *\n * console.info(arr) // 0, 1, 2, 3, 4\n * ```\n *\n * ## preventCancel\n *\n * By default a readable stream will have [.cancel](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/cancel) called on it once it has ended or\n * reading has stopped prematurely.\n *\n * To prevent this behaviour, pass `preventCancel: true` as an option:\n *\n * ```javascript\n * const arr = await all(toIt(stream, { preventCancel: true }))\n *\n * console.info(arr) // 0, 1, 2, 3, 4\n * ```\n */\n\nexport interface BrowserReadableStreamToItOptions {\n preventCancel?: boolean\n}\n\n/**\n * Turns a browser readable stream into an async iterable. Async iteration over\n * returned iterable will lock give stream, preventing any other consumer from\n * acquiring a reader. The lock will be released if iteration loop is broken. To\n * prevent stream cancelling optional `{ preventCancel: true }` could be passed\n * as a second argument.\n */\nexport default async function * browserReadableStreamToIt <T> (stream: ReadableStream<T>, options: BrowserReadableStreamToItOptions = {}): AsyncGenerator<T, void, undefined> {\n const reader = stream.getReader()\n\n try {\n while (true) {\n const result = await reader.read()\n\n if (result.done) {\n return\n }\n\n yield result.value\n }\n } finally {\n if (options.preventCancel !== true) {\n await reader.cancel()\n }\n\n reader.releaseLock()\n }\n}\n", "/**\n * A serialized message was received that was too large\n */\nexport class InvalidMessageLengthError extends Error {\n name = 'InvalidMessageLengthError'\n code = 'ERR_INVALID_MESSAGE_LENGTH'\n}\n", "import { isUint8ArrayList } from 'uint8arraylist'\nimport { InvalidMessageLengthError } from './errors.ts'\nimport type { Uint8ArrayList } from 'uint8arraylist'\n\nexport interface ParseOptions {\n /**\n * Limit the possible size of incoming serialized messages in bytes\n */\n maxMessageLength?: number\n}\n\nexport default async function * parse <T> (source: AsyncIterable<Uint8Array | Uint8ArrayList | string> | Iterable<Uint8Array | Uint8ArrayList | string>, opts: ParseOptions = {}): AsyncGenerator<T, void, undefined> {\n const matcher = /\\r?\\n/\n const decoder = new TextDecoder('utf8')\n let buffer = ''\n\n for await (let chunk of source) {\n if (typeof chunk === 'string') {\n chunk = new TextEncoder().encode(chunk)\n }\n\n if (isUint8ArrayList(chunk)) {\n chunk = chunk.subarray()\n }\n\n buffer += decoder.decode(chunk, { stream: true })\n\n if (buffer.length > (opts?.maxMessageLength ?? buffer.length)) {\n throw new InvalidMessageLengthError('Incoming message too long')\n }\n\n const parts = buffer.split(matcher)\n buffer = parts.pop() ?? ''\n\n for (let i = 0; i < parts.length; i++) {\n yield JSON.parse(parts[i])\n }\n }\n\n buffer += decoder.decode()\n\n if (buffer !== '') {\n yield JSON.parse(buffer)\n }\n}\n", "export class InvalidRequestError extends Error {\n static name = 'InvalidRequestError'\n\n constructor (message = 'Invalid request') {\n super(message)\n this.name = 'InvalidRequestError'\n }\n}\n\nexport class BadResponseError extends Error {\n static name = 'BadResponseError'\n\n constructor (message = 'Bad response') {\n super(message)\n this.name = 'BadResponseError'\n }\n}\n", "import { InvalidParametersError, NotFoundError, setMaxListeners } from '@libp2p/interface'\nimport { Queue } from '@libp2p/utils'\nimport { multiaddr } from '@multiformats/multiaddr'\nimport { anySignal } from 'any-signal'\nimport toIt from 'browser-readablestream-to-it'\nimport { parse as ndjson } from 'it-ndjson'\nimport { base58btc } from 'multiformats/bases/base58'\nimport { CID } from 'multiformats/cid'\nimport * as Digest from 'multiformats/hashes/digest'\nimport { withArrayBuffer } from 'uint8arrays/with-array-buffer'\nimport { CODE_LIBP2P_KEY } from './constants.ts'\nimport { BadResponseError, InvalidRequestError } from './errors.ts'\nimport type { DelegatedRoutingV1HttpApiClient as DelegatedRoutingV1HttpApiClientInterface, DelegatedRoutingV1HttpApiClientInit, GetProvidersOptions, GetPeersOptions, GetIPNSOptions, PeerRecord, DelegatedRoutingV1HttpApiClientComponents, GetClosestPeersOptions } from './index.ts'\nimport type { AbortOptions, Logger } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { MultihashDigest } from 'multiformats/cid'\n\nconst defaultValues = {\n concurrentRequests: 4,\n timeout: 30e3,\n cacheTTL: 5 * 60 * 1000, // 5 minutes default as per https://specs.ipfs.tech/routing/http-routing-v1/#response-headers\n cacheName: 'delegated-routing-v1-cache'\n}\n\nexport class DelegatedRoutingV1HttpApiClient implements DelegatedRoutingV1HttpApiClientInterface {\n public readonly url: URL\n private started: boolean\n private readonly httpQueue: Queue\n private readonly shutDownController: AbortController\n private readonly timeout: number\n private readonly filterAddrs?: string[]\n private readonly filterProtocols?: string[]\n private readonly inFlightRequests: Map<string, Promise<Response>>\n private readonly cacheName: string\n private cache?: Cache\n private readonly cacheTTL: number\n private log: Logger\n\n /**\n * Create a new DelegatedContentRouting instance\n */\n constructor (components: DelegatedRoutingV1HttpApiClientComponents, init: DelegatedRoutingV1HttpApiClientInit & { url: string | URL }) {\n this.log = components.logger.forComponent('delegated-routing-v1-http-api-client')\n this.started = false\n this.shutDownController = new AbortController()\n setMaxListeners(Infinity, this.shutDownController.signal)\n this.httpQueue = new Queue({\n concurrency: init.concurrentRequests ?? defaultValues.concurrentRequests\n })\n this.inFlightRequests = new Map() // Tracks in-flight requests to avoid duplicate requests\n this.url = init.url instanceof URL ? init.url : new URL(init.url)\n this.timeout = init.timeout ?? defaultValues.timeout\n this.filterAddrs = init.filterAddrs\n this.filterProtocols = init.filterProtocols\n\n this.cacheName = init.cacheName ?? defaultValues.cacheName\n this.cacheTTL = init.cacheTTL ?? defaultValues.cacheTTL\n }\n\n isStarted (): boolean {\n return this.started\n }\n\n async start (): Promise<void> {\n if (this.started) {\n return\n }\n\n this.started = true\n\n if (this.cacheTTL > 0) {\n this.cache = await globalThis.caches?.open(this.cacheName)\n\n if (this.cache != null) {\n this.log('cache enabled with ttl %d', this.cacheTTL)\n }\n }\n }\n\n async stop (): Promise<void> {\n this.httpQueue.clear()\n this.shutDownController.abort()\n\n // Clear the cache when stopping\n await globalThis.caches?.delete(this.cacheName)\n\n this.started = false\n }\n\n async * getProviders (cid: CID, options: GetProvidersOptions = {}): AsyncGenerator<PeerRecord> {\n this.log('getProviders starts: %c', cid)\n\n const timeoutSignal = AbortSignal.timeout(this.timeout)\n const signal = anySignal([this.shutDownController.signal, timeoutSignal, options.signal])\n setMaxListeners(Infinity, timeoutSignal, signal)\n const onStart = Promise.withResolvers<void>()\n const onFinish = Promise.withResolvers<void>()\n let found = 0\n\n void this.httpQueue.add(async () => {\n onStart.resolve()\n return onFinish.promise\n })\n\n try {\n await onStart.promise\n\n // https://specs.ipfs.tech/routing/http-routing-v1/\n const url = new URL(`${this.url}routing/v1/providers/${cid}`)\n this.#addFilterParams(url, options.filterAddrs, options.filterProtocols)\n\n const res = await this.#makeRequest(url.toString(), {\n headers: {\n accept: 'application/x-ndjson, application/json;q=0.8'\n },\n signal\n })\n\n if (!res.ok) {\n // Per IPIP-0513: Handle 404 as empty results (not an error)\n // Old servers return 404, new servers return 200 with empty array\n // Both should result in an empty iterator, not an error\n if (res.status === 404) {\n // Return empty iterator\n return\n }\n\n if (res.status === 422) {\n // https://specs.ipfs.tech/routing/http-routing-v1/#response-status-codes\n // 422 (Unprocessable Entity): request does not conform to schema or semantic constraints\n throw new InvalidRequestError('Request does not conform to schema or semantic constraints')\n }\n\n throw new BadResponseError(`Unexpected status code: ${res.status}`)\n }\n\n const contentType = res.headers.get('Content-Type')\n\n if (contentType == null) {\n throw new BadResponseError('No Content-Type header received')\n }\n\n if (res.body == null) {\n if (contentType !== 'application/x-ndjson') {\n throw new BadResponseError('Routing response had no body')\n }\n\n // cached ndjson responses have no body property if the gateway returned\n // no results\n return\n }\n\n if (contentType.startsWith('application/json')) {\n const body = await res.json()\n // Handle null/undefined Providers from servers (both old and new may return empty arrays)\n const providers = body.Providers ?? []\n\n for (const provider of providers) {\n const record = this.#conformToPeerSchema(provider)\n if (record != null) {\n found++\n yield record\n }\n }\n } else if (contentType.includes('application/x-ndjson')) {\n for await (const provider of ndjson(toIt(res.body))) {\n const record = this.#conformToPeerSchema(provider)\n if (record != null) {\n found++\n yield record\n }\n }\n } else {\n throw new BadResponseError(`Unsupported Content-Type: ${contentType}`)\n }\n } finally {\n signal.clear()\n onFinish.resolve()\n this.log('getProviders finished found %d providers for %c', found, cid)\n }\n }\n\n async * getPeers (cid: CID, options: GetPeersOptions = {}): AsyncGenerator<PeerRecord> {\n this.log('getPeers starts: %c', cid)\n\n const timeoutSignal = AbortSignal.timeout(this.timeout)\n const signal = anySignal([this.shutDownController.signal, timeoutSignal, options.signal])\n setMaxListeners(Infinity, timeoutSignal, signal)\n const onStart = Promise.withResolvers<void>()\n const onFinish = Promise.withResolvers<void>()\n\n void this.httpQueue.add(async () => {\n onStart.resolve()\n return onFinish.promise\n })\n\n try {\n await onStart.promise\n\n // https://specs.ipfs.tech/routing/http-routing-v1/\n const url = new URL(`${this.url}routing/v1/peers/${cid}`)\n this.#addFilterParams(url, options.filterAddrs, options.filterProtocols)\n\n const res = await this.#makeRequest(url.toString(), {\n headers: {\n Accept: 'application/x-ndjson'\n },\n signal\n })\n\n // Per IPIP-0513: Handle 404 as empty results (not an error)\n // Old servers return 404, new servers return 200 with empty array\n // Both should result in an empty iterator, not an error\n if (res.status === 404) {\n return // Return empty iterator\n }\n\n if (res.status === 422) {\n // https://specs.ipfs.tech/routing/http-routing-v1/#response-status-codes\n // 422 (Unprocessable Entity): request does not conform to schema or semantic constraints\n throw new InvalidRequestError('Request does not conform to schema or semantic constraints')\n }\n\n if (res.body == null) {\n throw new BadResponseError('Routing response had no body')\n }\n\n const contentType = res.headers.get('Content-Type')\n if (contentType?.startsWith('application/json')) {\n const body = await res.json()\n // Handle null/undefined Peers from servers (both old and new may return empty arrays)\n const peers = body.Peers ?? []\n\n for (const peer of peers) {\n const record = this.#conformToPeerSchema(peer)\n if (record != null) {\n yield record\n }\n }\n } else {\n for await (const peer of ndjson(toIt(res.body))) {\n const record = this.#conformToPeerSchema(peer)\n if (record != null) {\n yield record\n }\n }\n }\n } catch (err) {\n this.log.error('getPeers errored - %e', err)\n } finally {\n signal.clear()\n onFinish.resolve()\n this.log('getPeers finished: %c', cid)\n }\n }\n\n async * getClosestPeers (key: CID, options: GetClosestPeersOptions = {}): AsyncGenerator<PeerRecord> {\n let target: string\n\n if (CID.asCID(key) === key || key instanceof CID) {\n target = key.toV1().toString()\n } else {\n throw new InvalidParametersError('Key must be CID')\n }\n\n this.log('getClosestPeers starts: %s', target)\n\n const timeoutSignal = AbortSignal.timeout(this.timeout)\n const signal = anySignal([this.shutDownController.signal, timeoutSignal, options.signal])\n setMaxListeners(Infinity, timeoutSignal, signal)\n const onStart = Promise.withResolvers<void>()\n const onFinish = Promise.withResolvers<void>()\n\n void this.httpQueue.add(async () => {\n onStart.resolve()\n return onFinish.promise\n })\n\n try {\n await onStart.promise\n\n // https://specs.ipfs.tech/routing/http-routing-v1/\n const url = new URL(`${this.url}routing/v1/dht/closest/peers/${target}`)\n this.#addFilterParams(url, options.filterAddrs, options.filterProtocols)\n\n const res = await this.#makeRequest(url.toString(), {\n headers: {\n Accept: 'application/x-ndjson'\n },\n signal\n })\n\n // Per IPIP-0513: Handle 404 as empty results (not an error)\n // Old servers return 404, new servers return 200 with empty array\n // Both should result in an empty iterator, not an error\n if (res.status === 404) {\n return // Return empty iterator\n }\n\n if (res.status === 422) {\n // https://specs.ipfs.tech/routing/http-routing-v1/#response-status-codes\n // 422 (Unprocessable Entity): request does not conform to schema or semantic constraints\n throw new InvalidRequestError('Request does not conform to schema or semantic constraints')\n }\n\n if (res.body == null) {\n throw new BadResponseError('Routing response had no body')\n }\n\n const contentType = res.headers.get('Content-Type')\n if (contentType?.startsWith('application/json')) {\n const body = await res.json()\n // Handle null/undefined Peers from servers (both old and new may return empty arrays)\n const peers = body.Peers ?? []\n\n for (const peer of peers) {\n const record = this.#conformToPeerSchema(peer)\n if (record != null) {\n yield record\n }\n }\n } else {\n for await (const peer of ndjson(toIt(res.body))) {\n const record = this.#conformToPeerSchema(peer)\n if (record != null) {\n yield record\n }\n }\n }\n } catch (err) {\n this.log.error('getClosestPeers errored - %e', err)\n } finally {\n signal.clear()\n onFinish.resolve()\n this.log('getClosestPeers finished: %s', target)\n }\n }\n\n async getIPNS (cid: CID, options: GetIPNSOptions = {}): Promise<Uint8Array<ArrayBuffer>> {\n this.log('getIPNS starts: %c', cid)\n\n const timeoutSignal = AbortSignal.timeout(this.timeout)\n const signal = anySignal([this.shutDownController.signal, timeoutSignal, options.signal])\n setMaxListeners(Infinity, timeoutSignal, signal)\n const onStart = Promise.withResolvers<void>()\n const onFinish = Promise.withResolvers<void>()\n\n void this.httpQueue.add(async () => {\n onStart.resolve()\n return onFinish.promise\n })\n\n // https://specs.ipfs.tech/routing/http-routing-v1/\n const resource = `${this.url}routing/v1/ipns/${cid}`\n\n try {\n await onStart.promise\n\n const res = await this.#makeRequest(resource, {\n headers: {\n Accept: 'application/vnd.ipfs.ipns-record'\n },\n signal\n })\n\n this.log('getIPNS GET %s %d', resource, res.status)\n\n // Per IPIP-0513: Handle 404 as \"no record found\" for backward compatibility\n // IPNS is different - we still throw NotFoundError for 404 (backward compat)\n // and also for 200 with non-IPNS content type (new behavior)\n if (res.status === 404) {\n throw new NotFoundError('No matching records found')\n }\n\n if (res.status === 422) {\n // https://specs.ipfs.tech/routing/http-routing-v1/#response-status-codes\n // 422 (Unprocessable Entity): request does not conform to schema or semantic constraints\n throw new InvalidRequestError('Request does not conform to schema or semantic constraints')\n }\n\n if (!res.ok) {\n throw new BadResponseError(`Unexpected status code: ${res.status}`)\n }\n\n // Per IPIP-0513: Only Content-Type: application/vnd.ipfs.ipns-record indicates a valid record\n // ANY other content type (or missing content-type) means no record found\n const contentType = res.headers.get('Content-Type')\n if (contentType == null || !contentType.includes('application/vnd.ipfs.ipns-record')) {\n throw new NotFoundError('No matching records found')\n }\n\n if (res.body == null) {\n throw new BadResponseError('GET ipns response had no body')\n }\n\n const buf = await res.arrayBuffer()\n\n return new Uint8Array(buf, 0, buf.byteLength)\n } catch (err: any) {\n this.log.error('getIPNS GET %s error - %e', resource, err)\n\n throw err\n } finally {\n signal.clear()\n onFinish.resolve()\n this.log('getIPNS finished: %c', cid)\n }\n }\n\n async putIPNS (libp2pKey: CID, record: Uint8Array, options: AbortOptions = {}): Promise<void> {\n this.log('putIPNS starts: %c', libp2pKey)\n\n const timeoutSignal = AbortSignal.timeout(this.timeout)\n const signal = anySignal([this.shutDownController.signal, timeoutSignal, options.signal])\n setMaxListeners(Infinity, timeoutSignal, signal)\n const onStart = Promise.withResolvers<void>()\n const onFinish = Promise.withResolvers<void>()\n\n void this.httpQueue.add(async () => {\n onStart.resolve()\n return onFinish.promise\n })\n\n // https://specs.ipfs.tech/routing/http-routing-v1/\n const resource = `${this.url}routing/v1/ipns/${libp2pKey}`\n\n try {\n await onStart.promise\n\n const res = await this.#makeRequest(resource, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/vnd.ipfs.ipns-record'\n },\n body: withArrayBuffer(record),\n signal\n })\n\n this.log('putIPNS PUT %s %d', resource, res.status)\n\n if (res.status !== 200) {\n throw new BadResponseError('PUT ipns response had status other than 200')\n }\n } catch (err: any) {\n this.log.error('putIPNS PUT %s error - %e', resource, err.stack)\n\n throw err\n } finally {\n signal.clear()\n onFinish.resolve()\n this.log('putIPNS finished: %c', libp2pKey)\n }\n }\n\n #conformToPeerSchema (record: any): PeerRecord | undefined {\n try {\n const protocols: string[] = []\n const multiaddrs: Multiaddr[] = record.Addrs?.map(multiaddr) ?? []\n\n if (record.Protocols != null) {\n protocols.push(...record.Protocols)\n }\n\n if (record.Protocol != null) {\n protocols.push(record.Protocol)\n delete record.Protocol\n }\n\n return {\n ...record,\n Schema: 'peer',\n ID: CID.createV1(CODE_LIBP2P_KEY, parseMultihash(record.ID)),\n Addrs: multiaddrs,\n Protocols: protocols\n }\n } catch (err) {\n this.log.error('could not conform record to peer schema - %e', err)\n }\n }\n\n #addFilterParams (url: URL, filterAddrs?: string[], filterProtocols?: string[]): void {\n // IPIP-484 filtering. local options filter precedence over global filter\n if (filterAddrs != null || this.filterAddrs != null) {\n const adressFilter = filterAddrs?.join(',') ?? this.filterAddrs?.join(',') ?? ''\n if (adressFilter !== '') {\n url.searchParams.set('filter-addrs', adressFilter)\n }\n }\n if (filterProtocols != null || this.filterProtocols != null) {\n const protocolFilter = filterProtocols?.join(',') ?? this.filterProtocols?.join(',') ?? ''\n if (protocolFilter !== '') {\n url.searchParams.set('filter-protocols', protocolFilter)\n }\n }\n }\n\n /**\n * makeRequest has two features:\n * - Ensures only one concurrent request is made for the same URL\n * - Caches GET requests if the Cache API is available\n */\n async #makeRequest (url: string, options: RequestInit): Promise<Response> {\n const requestMethod = options.method ?? 'GET'\n const key = `${requestMethod}-${url}`\n\n // Only try to use cache for GET requests\n if (requestMethod === 'GET') {\n const cachedResponse = await this.cache?.match(url)\n\n if (cachedResponse != null) {\n // Check if the cached response has expired\n const expires = parseInt(cachedResponse.headers.get('x-cache-expires') ?? '0', 10)\n if (expires > Date.now()) {\n this.log('returning cached response for %s', key)\n this.logResponse(cachedResponse)\n\n return cachedResponse\n } else {\n this.log('evicting cached response for %s', key)\n // Remove expired response from cache\n await this.cache?.delete(url)\n }\n } else if (this.cache != null) {\n this.log('cache miss for %s', key)\n }\n }\n\n // Check if there's already an in-flight request for this URL\n const existingRequest = this.inFlightRequests.get(key)\n if (existingRequest != null) {\n const response = await existingRequest\n this.log('deduplicating outgoing request for %s', key)\n return response.clone()\n }\n\n this.log('outgoing request:')\n this.logRequest(url, options)\n\n // Create new request and track it\n const requestPromise = fetch(url, options).then(async response => {\n this.log('incoming response:')\n this.logResponse(response)\n\n // Only cache successful GET requests\n if (this.cache != null && response.ok && requestMethod === 'GET') {\n const expires = Date.now() + this.cacheTTL\n const headers = new Headers(response.headers)\n headers.set('x-cache-expires', expires.toString())\n\n // Create a new response with expiration header\n const cachedResponse = new Response(response.clone().body, {\n status: response.status,\n statusText: response.statusText,\n headers\n })\n\n await this.cache.put(url, cachedResponse)\n }\n return response\n }).finally(() => {\n // Clean up the tracked request when it completes\n this.inFlightRequests.delete(key)\n })\n\n this.inFlightRequests.set(key, requestPromise)\n const response = await requestPromise\n return response\n }\n\n toString (): string {\n return `DefaultDelegatedRoutingV1HttpApiClient(${this.url})`\n }\n\n private logRequest (url: string, init: RequestInit): void {\n const headers = new Headers(init.headers)\n this.log('%s %s HTTP/1.1', init.method ?? 'GET', url)\n\n for (const [key, value] of headers.entries()) {\n this.log('%s: %s', key, value)\n }\n }\n\n private logResponse (response: Response): void {\n this.log('HTTP/1.1 %d %s', response.status, response.statusText)\n\n for (const [key, value] of response.headers.entries()) {\n this.log('%s: %s', key, value)\n }\n }\n}\n\nfunction parseMultihash (str: string): MultihashDigest {\n const buf = base58btc.baseDecode(str)\n\n return Digest.decode(buf)\n}\n", "/**\n * @packageDocumentation\n *\n * Return the first value in an (async)iterable\n *\n * @example\n *\n * ```javascript\n * import first from 'it-first'\n *\n * // This can also be an iterator, generator, etc\n * const values = [0, 1, 2, 3, 4]\n *\n * const res = first(values)\n *\n * console.info(res) // 0\n * ```\n *\n * Async sources must be awaited:\n *\n * ```javascript\n * import first from 'it-first'\n *\n * const values = async function * () {\n * yield * [0, 1, 2, 3, 4]\n * }\n *\n * const res = await first(values())\n *\n * console.info(res) // 0\n * ```\n */\n\nfunction isAsyncIterable <T> (thing: any): thing is AsyncIterable<T> {\n return thing[Symbol.asyncIterator] != null\n}\n\n/**\n * Returns the first result from an (async) iterable, unless empty, in which\n * case returns `undefined`\n */\nfunction first <T> (source: Iterable<T>): T | undefined\nfunction first <T> (source: Iterable<T> | AsyncIterable<T>): Promise<T | undefined>\nfunction first <T> (source: Iterable<T> | AsyncIterable<T>): Promise<T | undefined> | T | undefined {\n if (isAsyncIterable(source)) {\n return (async () => {\n for await (const entry of source) { // eslint-disable-line no-unreachable-loop\n return entry\n }\n\n return undefined\n })()\n }\n\n for (const entry of source) { // eslint-disable-line no-unreachable-loop\n return entry\n }\n\n return undefined\n}\n\nexport default first\n", "/**\n * @packageDocumentation\n *\n * Lets you look at the contents of an async iterator and decide what to do\n *\n * @example\n *\n * ```javascript\n * import peekable from 'it-peekable'\n *\n * // This can also be an iterator, generator, etc\n * const values = [0, 1, 2, 3, 4]\n *\n * const it = peekable(value)\n *\n * const first = it.peek()\n *\n * console.info(first) // 0\n *\n * it.push(first)\n *\n * console.info([...it])\n * // [ 0, 1, 2, 3, 4 ]\n * ```\n *\n * Async sources must be awaited:\n *\n * ```javascript\n * import peekable from 'it-peekable'\n *\n * const values = async function * () {\n * yield * [0, 1, 2, 3, 4]\n * }\n *\n * const it = peekable(values())\n *\n * const first = await it.peek()\n *\n * console.info(first) // 0\n *\n * it.push(first)\n *\n * console.info(await all(it))\n * // [ 0, 1, 2, 3, 4 ]\n * ```\n */\n\nexport interface Peek <T> {\n peek(): IteratorResult<T, undefined>\n}\n\nexport interface AsyncPeek <T> {\n peek(): Promise<IteratorResult<T, undefined>>\n}\n\nexport interface Push <T> {\n push(value: T): void\n}\n\nexport type Peekable <T> = Iterable<T> & Peek<T> & Push<T> & Iterator<T>\n\nexport type AsyncPeekable <T> = AsyncIterable<T> & AsyncPeek<T> & Push<T> & AsyncIterator<T>\n\nfunction peekable <T> (iterable: Iterable<T>): Peekable<T>\nfunction peekable <T> (iterable: AsyncIterable<T>): AsyncPeekable<T>\nfunction peekable <T> (iterable: Iterable<T> | AsyncIterable<T>): Peekable<T> | AsyncPeekable<T> {\n // @ts-expect-error can't use Symbol.asyncIterator to index iterable since it might be Iterable\n const [iterator, symbol] = iterable[Symbol.asyncIterator] != null\n // @ts-expect-error can't use Symbol.asyncIterator to index iterable since it might be Iterable\n ? [iterable[Symbol.asyncIterator](), Symbol.asyncIterator]\n // @ts-expect-error can't use Symbol.iterator to index iterable since it might be AsyncIterable\n : [iterable[Symbol.iterator](), Symbol.iterator]\n\n const queue: any[] = []\n\n // @ts-expect-error can't use symbol to index peekable\n return {\n peek: () => {\n return iterator.next()\n },\n push: (value: any) => {\n queue.push(value)\n },\n next: () => {\n if (queue.length > 0) {\n return {\n done: false,\n value: queue.shift()\n }\n }\n\n return iterator.next()\n },\n [symbol] () {\n return this\n }\n }\n}\n\nexport default peekable\n", "/**\n * @packageDocumentation\n *\n * Convert one value from an (async)iterator into another.\n *\n * @example\n *\n * ```javascript\n * import map from 'it-map'\n *\n * // This can also be an iterator, generator, etc\n * const values = [0, 1, 2, 3, 4]\n *\n * const result = map(values, (val, index) => val++)\n *\n * console.info(result) // [1, 2, 3, 4, 5]\n * ```\n *\n * Async sources and transforms must be awaited:\n *\n * ```javascript\n * import map from 'it-map'\n *\n * const values = async function * () {\n * yield * [0, 1, 2, 3, 4]\n * }\n *\n * const result = await map(values(), async (val, index) => val++)\n *\n * console.info(result) // [1, 2, 3, 4, 5]\n * ```\n */\n\nimport peek from 'it-peekable'\n\nfunction isAsyncIterable <T> (thing: any): thing is AsyncIterable<T> {\n return thing[Symbol.asyncIterator] != null\n}\n\n/**\n * Takes an (async) iterable and returns one with each item mapped by the passed\n * function\n */\nfunction map <I, O> (source: Iterable<I>, func: (val: I, index: number) => Promise<O>): AsyncGenerator<O, void, undefined>\nfunction map <I, O> (source: Iterable<I>, func: (val: I, index: number) => O): Generator<O, void, undefined>\nfunction map <I, O> (source: AsyncIterable<I> | Iterable<I>, func: (val: I, index: number) => O | Promise<O>): AsyncGenerator<O, void, undefined>\nfunction map <I, O> (source: AsyncIterable<I> | Iterable<I>, func: (val: I, index: number) => O | Promise<O>): AsyncGenerator<O, void, undefined> | Generator<O, void, undefined> {\n let index = 0\n\n if (isAsyncIterable(source)) {\n return (async function * () {\n for await (const val of source) {\n yield func(val, index++)\n }\n })()\n }\n\n // if mapping function returns a promise we have to return an async generator\n const peekable = peek(source)\n const { value, done } = peekable.next()\n\n if (done === true) {\n return (function * () {}())\n }\n\n const res = func(value, index++)\n\n // @ts-expect-error .then is not present on O\n if (typeof res.then === 'function') {\n return (async function * () {\n yield await res\n\n for (const val of peekable) {\n yield func(val, index++)\n }\n })()\n }\n\n const fn = func as (val: I, index: number) => O\n\n return (function * () {\n yield res as O\n\n for (const val of peekable) {\n yield fn(val, index++)\n }\n })()\n}\n\nexport default map\n", "/**\n * @packageDocumentation\n *\n * A client implementation of the IPFS [Delegated Routing V1 HTTP API](https://specs.ipfs.tech/routing/http-routing-v1/) that can be used to interact with any compliant server implementation.\n *\n * @example\n *\n * ```typescript\n * import { delegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'\n * import { CID } from 'multiformats/cid'\n * import { defaultLogger } from '@libp2p/logger'\n *\n * const client = delegatedRoutingV1HttpApiClient({\n * url: 'https://example.org'\n * })({\n * logger: defaultLogger()\n * })\n *\n * for await (const prov of client.getProviders(CID.parse('QmFoo'))) {\n * // ...\n * }\n * ```\n *\n * ### How to use with libp2p\n *\n * The client can be configured as a libp2p service, this will enable it as both a {@link https://libp2p.github.io/js-libp2p/interfaces/_libp2p_interface.content_routing.ContentRouting.html | ContentRouting} and a {@link https://libp2p.github.io/js-libp2p/interfaces/_libp2p_interface.peer_routing.PeerRouting.html | PeerRouting} implementation\n *\n * @example\n *\n * ```typescript\n * import { delegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'\n * import { createLibp2p } from 'libp2p'\n * import { peerIdFromString } from '@libp2p/peer-id'\n *\n * const libp2p = await createLibp2p({\n * // other config here\n * services: {\n * delegatedRouting: delegatedRoutingV1HttpApiClient({\n * url: 'https://example.org'\n * })\n * }\n * })\n *\n * // later this will use the configured HTTP gateway\n * await libp2p.peerRouting.findPeer(peerIdFromString('QmFoo'))\n * ```\n *\n * ### Caching\n *\n * By default, the client caches successful (200) delegated routing responses in browser environments (that support the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache)) for a duration of 5 minutes. The client does this by adding an `x-cache-expires` header to the response object.\n *\n * If caching is enabled, the client will cache responses for the duration of `cacheTTL` milliseconds.\n * If `cacheTTL` is 0, caching is disabled:\n *\n * @example\n *\n * ```typescript\n * // disable caching\n * const client = delegatedRoutingV1HttpApiClient({\n * url: 'https://example.org'\n * cacheTTL: 0\n * })({\n * logger: defaultLogger()\n * })\n * ```\n *\n * ### Filtering with IPIP-484\n *\n * The client can be configured to pass filter options to the delegated routing server as defined in IPIP-484.\n * The filter options be set globally, by passing them to the client constructor, or on a per-request basis.\n *\n * @see https://github.com/ipfs/specs/pull/484\n *\n * @example\n *\n * ```typescript\n * import { delegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'\n * import { createLibp2p } from 'libp2p'\n * import { peerIdFromString } from '@libp2p/peer-id'\n * import { defaultLogger } from '@libp2p/logger'\n *\n * // globally set filter options\n * const client = delegatedRoutingV1HttpApiClient({\n * url: 'https://delegated-ipfs.dev',\n * filterProtocols: ['transport-bitswap', 'unknown', 'transport-ipfs-gateway-http'],\n * filterAddrs: ['webtransport', 'webrtc-direct', 'wss']\n * })({\n * logger: defaultLogger()\n * })\n *\n * // per-request filter options\n * for await (const prov of client.getProviders(CID.parse('bafy'), {\n * filterProtocols: ['transport-ipfs-gateway-http'],\n * filterAddrs: ['!p2p-circuit']\n * })) {\n * // ...\n * }\n * ```\n */\n\nimport { DelegatedRoutingV1HttpApiClient as DelegatedRoutingV1HttpApiClientClass } from './client.ts'\nimport { DelegatedRoutingV1HttpApiClientContentRouting, DelegatedRoutingV1HttpApiClientPeerRouting } from './routings.ts'\nimport type { AbortOptions, ComponentLogger, ContentRouting, PeerRouting } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\nimport type { CID } from 'multiformats/cid'\n\n/**\n * A peer that conforms to the [Peer Schema](https://specs.ipfs.tech/routing/http-routing-v1/#peer-schema).\n *\n * Note that legacy schemas may be reformatted internally by this module.\n *\n * If `Addrs` is empty, a caller may wish to perform a `findPeer` operation to\n * ascertain the peer's multiaddrs.\n *\n * If `Protocols` is empty, a caller may wish to dial the peer and peform a\n * libp2p identify operation to ascertain the peer's supported protocols.\n */\nexport interface PeerRecord {\n Schema: 'peer'\n ID: CID\n Addrs: Multiaddr[]\n Protocols: string[]\n}\n\nexport interface FilterOptions {\n /**\n * List of protocols to filter in the PeerRecords as defined in IPIP-484\n * If undefined, PeerRecords are not filtered by protocol\n *\n * @see https://github.com/ipfs/specs/pull/484\n * @default undefined\n */\n filterProtocols?: string[]\n\n /**\n * Array of address filters to filter PeerRecords's addresses as defined in IPIP-484\n * If undefined, PeerRecords are not filtered by address\n *\n * @see https://github.com/ipfs/specs/pull/484\n * @default undefined\n */\n filterAddrs?: string[]\n}\nexport interface DelegatedRoutingV1HttpApiClientInit extends FilterOptions {\n /**\n * The endpoint to which requests will be sent\n */\n url: string | URL\n\n /**\n * A concurrency limit to avoid request flood in web browser (default: 4)\n *\n * @see https://github.com/libp2p/js-libp2p-delegated-content-routing/issues/12\n */\n concurrentRequests?: number\n\n /**\n * How long a request is allowed to take in ms (default: 30 seconds)\n */\n timeout?: number\n\n /**\n * How long to cache responses for in ms (default: 5 minutes)\n * If 0, caching is disabled\n */\n cacheTTL?: number\n\n /**\n * Where a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) is\n * available in the global scope, we will store request/responses to avoid\n * making duplicate requests.\n *\n * @default 'delegated-routing-v1-cache'\n */\n cacheName?: string\n}\n\nexport interface DelegatedRoutingV1HttpApiClientComponents {\n logger: ComponentLogger\n}\n\nexport type GetIPNSOptions = AbortOptions\nexport type GetProvidersOptions = FilterOptions & AbortOptions\nexport type GetPeersOptions = FilterOptions & AbortOptions\nexport type GetClosestPeersOptions = FilterOptions & AbortOptions\n\nexport interface DelegatedRoutingV1HttpApiClient {\n /**\n * The URL that requests are sent to\n */\n url: URL\n\n /**\n * Returns an async generator of {@link PeerRecord}s that can provide the\n * content for the passed {@link CID}\n */\n getProviders(cid: CID, options?: GetProvidersOptions): AsyncGenerator<PeerRecord>\n\n /**\n * Returns an async generator of {@link PeerRecord}s for the provided\n * {@link CID}\n */\n getPeers(cid: CID, options?: GetPeersOptions): AsyncGenerator<PeerRecord>\n\n /**\n * Returns an async generator of {@link PeerRecord}s of the closest peers to\n * the supplied key\n */\n getClosestPeers (cid: CID, options?: GetClosestPeersOptions): AsyncGenerator<PeerRecord>\n\n /**\n * Returns a promise of a serialized IPNS record for passed CID\n */\n getIPNS(cid: CID, options?: GetIPNSOptions): Promise<Uint8Array<ArrayBuffer>>\n\n /**\n * Publishes a serialized IPNS record for the passed CID\n */\n putIPNS(cid: CID, record: Uint8Array, options?: AbortOptions): Promise<void>\n\n /**\n * Create the request/response cache used to ensure duplicate requests aren't\n * made for the same data\n */\n start(): Promise<void>\n\n /**\n * Shut down any currently running HTTP requests and clear up any resources\n * that are in use\n */\n stop(): Promise<void>\n}\n\n/**\n * Create and return a client to use with a Routing V1 HTTP API server\n */\nexport function delegatedRoutingV1HttpApiClient (init: DelegatedRoutingV1HttpApiClientInit): (components: DelegatedRoutingV1HttpApiClientComponents) => DelegatedRoutingV1HttpApiClient {\n return (components) => new DelegatedRoutingV1HttpApiClientClass(components, init)\n}\n\nexport function delegatedRoutingV1HttpApiClientContentRouting (init: DelegatedRoutingV1HttpApiClientInit): (components: DelegatedRoutingV1HttpApiClientComponents) => ContentRouting {\n return (components) => new DelegatedRoutingV1HttpApiClientContentRouting(delegatedRoutingV1HttpApiClient(init)(components))\n}\n\nexport function delegatedRoutingV1HttpApiClientPeerRouting (init: DelegatedRoutingV1HttpApiClientInit): (components: DelegatedRoutingV1HttpApiClientComponents) => PeerRouting {\n return (components) => new DelegatedRoutingV1HttpApiClientPeerRouting(delegatedRoutingV1HttpApiClient(init)(components))\n}\n", "import { delegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'\nimport { NotFoundError } from '@libp2p/interface'\nimport first from 'it-first'\nimport map from 'it-map'\nimport { CID } from 'multiformats/cid'\nimport * as Digest from 'multiformats/hashes/digest'\nimport { equals as uint8ArrayEquals } from 'uint8arrays/equals'\nimport { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'\nimport type { DelegatedRoutingV1HttpApiClient, DelegatedRoutingV1HttpApiClientComponents, DelegatedRoutingV1HttpApiClientInit } from '@helia/delegated-routing-v1-http-api-client'\nimport type { Peer, Provider, Router, RoutingOptions } from '@helia/interface'\nimport type { Version } from 'multiformats'\n\nconst IPNS_PREFIX = uint8ArrayFromString('/ipns/')\n\nfunction isIPNSKey (key: Uint8Array): boolean {\n return uint8ArrayEquals(key.subarray(0, IPNS_PREFIX.byteLength), IPNS_PREFIX)\n}\n\nexport class DelegatedHTTPRouter implements Router {\n public readonly name = 'delegated-http-router'\n private readonly client: DelegatedRoutingV1HttpApiClient\n\n constructor (components: DelegatedRoutingV1HttpApiClientComponents, init: DelegatedRoutingV1HttpApiClientInit) {\n this.client = delegatedRoutingV1HttpApiClient(init)(components)\n }\n\n async provide (cid: CID, options?: RoutingOptions): Promise<void> {\n // noop\n }\n\n async cancelReprovide (cid?: CID, options?: RoutingOptions): Promise<void> {\n // noop\n }\n\n async * findProviders (cid: CID<unknown, number, number, Version>, options?: RoutingOptions): AsyncIterable<Provider> {\n yield * map(this.client.getProviders(cid, options), (record) => {\n return {\n id: record.ID,\n multiaddrs: record.Addrs,\n protocols: record.Protocols,\n routing: 'delegated-http-routing'\n }\n })\n }\n\n async put (key: Uint8Array, value: Uint8Array, options?: RoutingOptions): Promise<void> {\n if (!isIPNSKey(key)) {\n return\n }\n\n const digest = Digest.decode(key.slice(IPNS_PREFIX.length))\n const cid = CID.createV1(0x72, digest)\n\n await this.client.putIPNS(cid, value, options)\n }\n\n async get (key: Uint8Array, options?: RoutingOptions): Promise<Uint8Array> {\n if (!isIPNSKey(key)) {\n throw new NotFoundError('Not found')\n }\n\n const digest = Digest.decode(key.slice(IPNS_PREFIX.length))\n const cid = CID.createV1(0x72, digest)\n\n try {\n return await this.client.getIPNS(cid, options)\n } catch (err: any) {\n // BadResponseError is thrown when the response had no body, which means\n // the record couldn't be found\n if (err.name === 'BadResponseError') {\n throw new NotFoundError('Not found')\n }\n\n throw err\n }\n }\n\n async findPeer (peerId: CID, options?: RoutingOptions): Promise<Peer> {\n const peer = await first(this.client.getPeers(peerId, options))\n\n if (peer != null) {\n return {\n id: peer.ID,\n multiaddrs: peer.Addrs ?? []\n }\n }\n\n throw new NotFoundError('Not found')\n }\n\n async * getClosestPeers (key: Uint8Array, options?: RoutingOptions): AsyncIterable<Peer> {\n // noop\n }\n\n toString (): string {\n return `DelegatedHTTPRouter(${this.client.url})`\n }\n}\n", "import type { DelegatedRoutingV1HttpApiClientInit } from '@helia/delegated-routing-v1-http-api-client'\n\nexport function delegatedHTTPRoutingDefaults (init?: DelegatedRoutingV1HttpApiClientInit): DelegatedRoutingV1HttpApiClientInit {\n return {\n url: 'https://delegated-ipfs.dev',\n filterProtocols: ['unknown', 'transport-bitswap', 'transport-ipfs-gateway-http'],\n filterAddrs: ['https', 'webtransport', 'webrtc', 'webrtc-direct', 'wss', 'tls']\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["index_exports", "__export", "delegatedHTTPRouter", "delegatedHTTPRoutingDefaults", "AbortError", "message", "InvalidParametersError", "message", "NotFoundError", "message", "isEventObject", "obj", "isOnce", "options", "TypedEventEmitter", "#listeners", "type", "listeners", "listener", "once", "evt", "list", "callback", "detail", "alloc", "size", "allocUnsafe", "isByteArrayWithArrayBuffer", "b", "asUint8Array", "buf", "concat", "arrays", "length", "acc", "curr", "output", "allocUnsafe", "offset", "arr", "asUint8Array", "equals", "a", "b", "i", "symbol", "findBufAndOffset", "bufs", "index", "offset", "buf", "bufEnd", "isUint8ArrayList", "value", "Uint8ArrayList", "_Uint8ArrayList", "data", "length", "chunk", "res", "i", "bytes", "beginInclusive", "endExclusive", "concat", "list", "bufStart", "sliceStartInBuf", "sliceEndsInBuf", "start", "search", "needle", "M", "radix", "rightmostPositions", "c", "j", "right", "lastIndex", "lastPatIndex", "skip", "char", "byteOffset", "allocUnsafe", "littleEndian", "alloc", "other", "equals", "acc", "curr", "base10_exports", "__export", "base10", "empty", "equals", "aa", "bb", "ii", "coerce", "o", "toArrayBufferBackedArray", "fromString", "str", "toString", "b", "isByteArrayWithArrayBuffer", "toArrayBufferBackedArray", "base", "ALPHABET", "name", "BASE_MAP", "j", "i", "x", "xc", "BASE", "LEADER", "FACTOR", "iFACTOR", "encode", "source", "zeroes", "length", "pbegin", "pend", "size", "b58", "carry", "it1", "it2", "str", "decodeUnsafe", "psz", "b256", "it3", "it4", "vch", "decode", "string", "buffer", "src", "_brrp__multiformats_scope_baseX", "base_x_default", "Encoder", "name", "prefix", "baseEncode", "bytes", "Decoder", "baseDecode", "prefixCodePoint", "text", "decoder", "or", "ComposedDecoder", "decoders", "input", "left", "right", "Codec", "from", "encode", "decode", "baseX", "alphabet", "base_x_default", "coerce", "string", "alphabetIdx", "bitsPerChar", "end", "out", "bits", "buffer", "written", "i", "value", "data", "pad", "mask", "createAlphabetIdx", "rfc4648", "base10", "baseX", "base16_exports", "__export", "base16", "base16upper", "base16", "rfc4648", "base16upper", "base2_exports", "__export", "base2", "base2", "rfc4648", "base256emoji_exports", "__export", "base256emoji", "alphabet", "alphabetBytesToChars", "p", "c", "i", "alphabetCharsToBytes", "codePoint", "encode", "data", "decode", "str", "byts", "char", "byt", "base256emoji", "from", "base32_exports", "__export", "base32", "base32hex", "base32hexpad", "base32hexpadupper", "base32hexupper", "base32pad", "base32padupper", "base32upper", "base32z", "base32", "rfc4648", "base32upper", "base32pad", "base32padupper", "base32hex", "base32hexupper", "base32hexpad", "base32hexpadupper", "base32z", "base36_exports", "__export", "base36", "base36upper", "base36", "baseX", "base36upper", "base58_exports", "__export", "base58btc", "base58flickr", "base58btc", "baseX", "base58flickr", "base64_exports", "__export", "base64", "base64pad", "base64url", "base64urlpad", "base64", "rfc4648", "base64pad", "base64url", "base64urlpad", "base8_exports", "__export", "base8", "base8", "rfc4648", "identity_exports", "__export", "identity", "identity", "from", "buf", "toString", "str", "fromString", "textEncoder", "textDecoder", "identity_exports", "__export", "identity", "encode_1", "encode", "MSB", "REST", "MSBALL", "INT", "num", "out", "offset", "oldOffset", "decode", "read", "MSB$1", "REST$1", "buf", "res", "shift", "counter", "b", "l", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "N8", "N9", "length", "value", "varint", "_brrp_varint", "varint_default", "decode", "data", "offset", "varint_default", "encodeTo", "int", "target", "encodingLength", "create", "code", "digest", "size", "sizeOffset", "encodingLength", "digestOffset", "bytes", "encodeTo", "Digest", "decode", "multihash", "coerce", "equals", "a", "b", "data", "toArrayBufferBackedArray", "code", "name", "encode", "coerce", "digest", "input", "options", "create", "identity", "sha2_browser_exports", "__export", "sha256", "sha512", "DEFAULT_MIN_DIGEST_LENGTH", "from", "name", "code", "encode", "minDigestLength", "maxDigestLength", "Hasher", "input", "options", "result", "createDigest", "digest", "truncate", "create", "sha", "name", "data", "sha256", "from", "sha512", "format", "link", "base", "bytes", "version", "toStringV0", "baseCache", "base58btc", "toStringV1", "base32", "cache", "baseCache", "cid", "CID", "_CID", "version", "code", "multihash", "bytes", "toArrayBufferBackedArray", "DAG_PB_CODE", "SHA_256_CODE", "digest", "create", "other", "self", "unknown", "equals", "base", "format", "input", "value", "encodeCID", "cidSymbol", "decode", "remainder", "specs", "prefixSize", "multihashBytes", "coerce", "digestBytes", "Digest", "initialBytes", "offset", "next", "i", "length", "codec", "multihashCode", "digestSize", "size", "multihashSize", "source", "prefix", "parseCIDtoBytes", "decoder", "base58btc", "base32", "base36", "toStringV0", "toStringV1", "codeOffset", "encodingLength", "hashOffset", "encodeTo", "bases", "identity_exports", "base2_exports", "base8_exports", "base10_exports", "base16_exports", "base32_exports", "base36_exports", "base58_exports", "base64_exports", "base256emoji_exports", "hashes", "sha2_browser_exports", "createCodec", "name", "prefix", "encode", "decode", "string", "buf", "str", "ascii", "i", "allocUnsafe", "BASES", "bases", "bases_default", "fromString", "string", "encoding", "base", "bases_default", "Parser", "input", "fn", "index", "result", "target", "char", "sep", "inner", "radix", "maxDigits", "allowZeroPrefix", "maxBytes", "digitCount", "leadingChar", "hasLeadingZero", "maxValue", "digit", "num", "out", "i", "ix", "readGroups", "groups", "ipv4", "group", "head", "headSize", "headIp4", "tail", "limit", "tailSize", "MAX_IPV6_LENGTH", "MAX_IPV4_LENGTH", "parser", "Parser", "parseIPv4", "input", "parseIPv6", "input", "MAX_IPV6_LENGTH", "parser", "isIPv4", "input", "parseIPv4", "isIPv6", "parseIPv6", "N1", "N2", "N3", "N4", "N5", "N6", "N7", "MSB", "REST", "encodingLength", "value", "encodeUint8Array", "buf", "offset", "decodeUint8Array", "buf", "offset", "b", "res", "REST", "MSB", "N4", "N5", "N6", "N7", "decodeUint8ArrayList", "decode", "buf", "offset", "decodeUint8Array", "decodeUint8ArrayList", "isArrayBufferBacked", "arr", "withArrayBuffer", "toString", "array", "encoding", "base", "bases_default", "InvalidMultiaddrError", "ValidationError", "InvalidParametersError", "UnknownProtocolError", "bytesToString", "base", "buf", "toString", "stringToBytes", "fromString", "bytes2port", "port2bytes", "port", "onion2bytes", "str", "addr", "portBuf", "concat", "onion32bytes", "base32", "bytes2onion", "addrBytes", "portBytes", "ip4ToBytes", "ip", "bytes", "byte", "index", "value", "InvalidMultiaddrError", "ip6ToBytes", "offset", "sections", "i", "isv4", "isIPv4", "v4Buffer", "argv", "word", "ip4ToString", "result", "ip6ToString", "byte1", "byte2", "tuple", "url", "ip6StringToValue", "decoders", "bases", "c", "anybaseDecoder", "acc", "d", "mb2bytes", "mbstr", "bytes2mb", "integer", "value", "ValidationError", "positive", "maxValue", "max", "validate", "funcs", "fn", "validatePort", "V", "Registry", "key", "codec", "UnknownProtocolError", "alias", "code", "registry", "codecs", "ip4ToBytes", "ip4ToString", "value", "isIPv4", "ValidationError", "port2bytes", "bytes2port", "validatePort", "ip6ToBytes", "ip6ToString", "ip6StringToValue", "isIPv6", "bytesToString", "stringToBytes", "str", "val", "CID", "bytes2onion", "onion2bytes", "onion32bytes", "bytes2mb", "base64url", "mb2bytes", "bytesToComponents", "bytes", "components", "i", "code", "decode", "codec", "registry", "codeLength", "encodingLength", "size", "sizeForAddr", "sizeLength", "V", "componentLength", "component", "withArrayBuffer", "valueOffset", "valueBytes", "toString", "componentsToBytes", "length", "codecLength", "valueLength", "valueLengthLength", "fromString", "offset", "encodeUint8Array", "concat", "stringToComponents", "string", "InvalidMultiaddrError", "collecting", "value", "protocol", "char", "ended", "componentsToString", "inspect", "symbol", "toComponents", "addr", "isMultiaddr", "bytesToComponents", "stringToComponents", "InvalidMultiaddrError", "Multiaddr", "_Multiaddr", "#components", "#string", "#bytes", "options", "validate", "componentsToBytes", "componentsToString", "c", "ma", "addrString", "s", "i", "InvalidParametersError", "code", "index", "equals", "component", "codec", "registry", "isMultiaddr", "value", "symbol", "multiaddr", "addr", "Multiaddr", "pDefer", "deferred", "resolve", "reject", "FixedFIFO", "hwm", "data", "last", "FIFO", "options", "obj", "val", "prev", "next", "AbortError", "message", "code", "pushable", "options", "_pushable", "buffer", "next", "_pushable", "getNext", "options", "onEnd", "buffer", "FIFO", "pushable", "onNext", "ended", "drain", "pDefer", "waitNext", "resolve", "reject", "next", "err", "bufferNext", "bufferError", "push", "value", "end", "_return", "_throw", "signal", "cancel", "listener", "AbortError", "opts", "TimeoutError", "_TimeoutError", "message", "options", "getAbortedReason", "signal", "pTimeout", "promise", "milliseconds", "fallback", "customTimers", "timer", "abortHandler", "cancelablePromise", "resolve", "reject", "timeoutError", "error", "normalizeEmitter", "emitter", "addListener", "removeListener", "pEventMultiple", "event", "options", "cancel", "returnValue", "resolve", "reject", "events", "items", "onItem", "arguments_", "value", "error", "rejectHandler", "rejectionEvent", "timeout", "pTimeout", "pEvent", "arrayPromise", "promise", "array", "debounce", "func", "wait", "timeout", "output", "later", "QueueFullError", "message", "defaultTranslate", "signal", "raceSignal", "promise", "opts", "translateError", "listener", "resolve", "reject", "JobRecipient", "options", "pDefer", "AbortError", "randomId", "Job", "fn", "options", "err", "acc", "curr", "AbortError", "recipient", "JobRecipient", "result", "raceSignal", "evt", "Queue", "TypedEventEmitter", "init", "debounce", "job", "j", "i", "fn", "options", "QueueFullError", "Job", "result", "err", "AbortError", "pEvent", "limit", "stream", "pushable", "cleanup", "onQueueJobComplete", "evt", "onQueueFailure", "onQueueIdle", "onSignalAbort", "anySignal", "signals", "controller", "onAbort", "reason", "s", "signal", "clear", "browserReadableStreamToIt", "stream", "options", "reader", "result", "InvalidMessageLengthError", "parse", "source", "opts", "matcher", "decoder", "buffer", "chunk", "isUint8ArrayList", "InvalidMessageLengthError", "parts", "i", "InvalidRequestError", "message", "BadResponseError", "defaultValues", "DelegatedRoutingV1HttpApiClient", "components", "init", "Queue", "cid", "options", "timeoutSignal", "signal", "anySignal", "onStart", "onFinish", "found", "url", "#addFilterParams", "res", "#makeRequest", "InvalidRequestError", "BadResponseError", "contentType", "providers", "provider", "record", "#conformToPeerSchema", "parse", "browserReadableStreamToIt", "peers", "peer", "err", "key", "target", "CID", "InvalidParametersError", "resource", "NotFoundError", "buf", "libp2pKey", "withArrayBuffer", "protocols", "multiaddrs", "multiaddr", "parseMultihash", "filterAddrs", "filterProtocols", "adressFilter", "protocolFilter", "requestMethod", "cachedResponse", "existingRequest", "response", "requestPromise", "expires", "headers", "value", "str", "base58btc", "decode", "isAsyncIterable", "thing", "first", "source", "entry", "src_default", "peekable", "iterable", "iterator", "symbol", "queue", "value", "src_default", "isAsyncIterable", "thing", "map", "source", "func", "index", "val", "peekable", "src_default", "value", "done", "res", "fn", "delegatedRoutingV1HttpApiClient", "init", "components", "DelegatedRoutingV1HttpApiClient", "IPNS_PREFIX", "fromString", "isIPNSKey", "key", "equals", "DelegatedHTTPRouter", "components", "init", "delegatedRoutingV1HttpApiClient", "cid", "options", "src_default", "record", "value", "digest", "decode", "CID", "NotFoundError", "err", "peerId", "peer", "delegatedHTTPRoutingDefaults", "init", "delegatedHTTPRouter", "init", "components", "DelegatedHTTPRouter", "delegatedHTTPRoutingDefaults"]
|
|
7
|
+
}
|