├── .assets ├── dynamic-content-diagram.png └── dynamic-ipfs.png ├── .gitignore ├── ARTICLE.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── create-helia.ts ├── dynamic-content.ts ├── globals.ts ├── index.ts └── interactive.ts └── tsconfig.json /.assets/dynamic-content-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tabcat/dynamic-content/a86eed7c73319294afdd19788e10358f875c74ac/.assets/dynamic-content-diagram.png -------------------------------------------------------------------------------- /.assets/dynamic-ipfs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tabcat/dynamic-content/a86eed7c73319294afdd19788e10358f875c74ac/.assets/dynamic-ipfs.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | -------------------------------------------------------------------------------- /ARTICLE.md: -------------------------------------------------------------------------------- 1 | # Hosting Dynamic Content on IPFS 2 | 3 | The InterPlanetary File System (IPFS) is a distributed, peer-to-peer file system designed to make the web faster, safer, and more resilient. Although IPFS excels at hosting static content, hosting dynamic content remains a challenge. This article presents a design for hosting dynamic content on IPFS using InterPlanetary Linked Data (IPLD), InterPlanetary Name Service (IPNS), and DHT Provider Records. 4 | 5 | --- 6 | ## Table of Contents 7 | 8 | 9 | - [Understanding Key Components](#understanding-key-components) 10 | * [IPLD](#ipld) 11 | * [IPNS](#ipns) 12 | * [PeerID](#peerid) 13 | * [Provider Records](#provider-records) 14 | - [Defining the Problem](#defining-the-problem) 15 | - [Achieving Dynamicity](#achieving-dynamicity) 16 | * [Read and Write Steps](#read-and-write-steps) 17 | + [Writing](#writing) 18 | + [Reading](#reading) 19 | * [Dynamic-Content IDs](#dynamic-content-ids) 20 | * [Manifest Document](#manifest-document) 21 | - [Use-case: Edge-computed Applications](#use-case-edge-computed-applications) 22 | * [Edge Devices](#edge-devices) 23 | * [Pinning Servers](#pinning-servers) 24 | * [Replication](#replication) 25 | - [Roadblocks and Workarounds](#roadblocks-and-workarounds) 26 | * [No 3rd Party Publishing to DHT](#no-3rd-party-publishing-to-dht) 27 | * [No Delegated Refreshing of IPNS OR Provider Records](#no-delegated-refreshing-of-ipns-or-provider-records) 28 | - [Example](#example) 29 | * [Usage](#usage) 30 | + [Clone the Repo](#clone-the-repo) 31 | + [Install Packages](#install-packages) 32 | + [Run Examples](#run-examples) 33 | * [What's Happening?](#whats-happening) 34 | * [Sample Outputs](#sample-outputs) 35 | - [Credits](#credits) 36 | - [Get Involved](#get-involved) 37 | - [FAQ](#faq) 38 | 39 | 40 | --- 41 | 42 |
43 | 44 | ## Understanding Key Components 45 | 46 | ### IPLD 47 | 48 | [IPLD](https://ipld.io/) is a data model for linking and addressing data across distributed systems. In IPFS, IPLD stores immutable data, providing [content-addressed storage](https://en.wikipedia.org/wiki/Content-addressable_storage). Data stored in IPLD has a unique [Content Identifier](https://docs.ipfs.tech/concepts/content-addressing/) (CID) derived from its content, ensuring data integrity. 49 | 50 | ### IPNS 51 | 52 | [IPNS](https://docs.ipfs.tech/concepts/ipns/) is a decentralized naming system that allows you to create a mutable reference to an immutable CID. With IPNS, you can create a persistent address that always points to the latest version of your content, even as it changes over time. 53 | 54 | ### PeerID 55 | 56 | A [Libp2p PeerID](https://docs.libp2p.io/concepts/fundamentals/peers/#peer-id) is a unique identifier for each node in the network, derived from a [public key](https://en.wikipedia.org/wiki/Public-key_cryptography). PeerIDs help find, identify, and communicate with other nodes. 57 | 58 | ### Provider Records 59 | 60 | [Provider Records](https://docs.ipfs.tech/concepts/dht/) are a fundamental part of IPFS's Distributed Hash Table (DHT). When requesting IPFS content, a node queries the DHT for Provider Records associated with the requested CID. These records contain the PeerID of peers with the content, enabling the user to establish a connection and retrieve the data. 61 | 62 | --- 63 | > **It's important to note that IPNS names and PeerIDs use the same [key structures](https://specs.ipfs.tech/ipns/ipns-record/#ipns-keys).** 64 | --- 65 | 66 |
67 | 68 | ## Defining the Problem 69 | 70 | Databases on IPFS have been gaining more attention recently. In essence, these database protocols use IPLD to store replica data. 71 | And they commonly use a real-time protocol like [Gossipsub](https://docs.libp2p.io/concepts/pubsub/overview/) with IPLD to sync database changes peer-to-peer. 72 | Using this design to create [local-first](https://www.inkandswitch.com/local-first/) databases looks quite promising. 73 | However, local-first databases are often highly [sharded](https://en.wikipedia.org/wiki/Partition_(database)) and run on end-user devices. 74 | 75 | This presents the problem of peers being few and unreliable to sync with. 76 | One solution is to add reliable database peers to the mix, either self-hosted or hosted by a service. 77 | There are two disadvantages to this approach: 78 | 79 | - Each project must build infra tooling 80 | - Users need a live instance of each database protocol used 81 | 82 | It would benefit all related protocols to have a general solution for asynchronous replication of dynamic content.
83 | *Think pinning layer for dynamic content.* 84 | 85 | This standardized layer would complement the app-specific protocols used for real-time replication. 86 | 87 |
88 | 89 | ## Achieving Dynamicity 90 | 91 | Let's look at a replication algorithm for one of the first databases on IPFS, [OrbitDB](https://github.com/orbitdb). The algorithm is roughly as follows: 92 | 93 | 1. Join a shared pubsub channel for the database. 94 | 2. On seeing a new pubsub peer in the shared channel, attempt to join a direct pubsub channel ([ipfs-pubsub-1on1](https://github.com/ipfs-shipyard/ipfs-pubsub-1on1)). 95 | 3. On committing an update to the local replica, advertise replica root CIDs on each direct pubsub channel. 96 | 4. On receiving a replica root CIDs advertisement on a direct pubsub, traverse the remote replica for changes to merge. 97 | 98 | The design presented in this article works similarly but replaces pubsub with Provider Records and IPNS. Essentially, all parts of replication get encoded into ~persistent IPFS components. 99 | 100 | - Provider Records to find collaborators 101 | - IPNS to point to the latest version of a device's replica 102 | 103 | --- 104 | > **Swapping pubsub for ~persistent components makes building on history without any collaborators online possible.** 105 | --- 106 | 107 | The main contribution is the novel use of Provider Records. 108 | Instead of tying a CID to PeerIDs of nodes hosting that content, the records tie a "Dynamic-Content ID" to IPNS names. 109 | Each IPNS name resolves to the latest CID of a device's local replica. 110 | 111 | *Collaborating on dynamic content is possible without knowing any previous collaborators or needing them to be online as long as their replica data is kept available via a pinner.* 112 | 113 | If you are familiar with publishing Provider Records to the DHT, *you may have spotted a problem here*. 114 | The source of the problem is a check DHT servers do when receiving an `ADD_PROVIDER` query, addressed in [Roadblocks and Workarounds](#roadblocks-and-workarounds). 115 | 116 | 117 | 118 | --- 119 | > **The Merkle-DAGs built with IPLD provide a persistent and efficient layer for collaborators to sync.** 120 | --- 121 | 122 |
123 | 124 | ### Read and Write Steps 125 | 126 | Describes the process of reading/writing dynamic content to IPFS: 127 | 128 | #### Writing 129 | 130 | 1. Make changes to the local replica 131 | 2. Push replica data to the IPLD pinner 132 | 3. Republish IPNS to point to new CID root 133 | 4. Add IPNS key as a provider of the Dynamic Content's ID 134 | 135 | #### Reading 136 | 137 | 1. Query the DHT for Providers of the Dynamic Content's ID 138 | 2. Resolve providers' IPNS keys to CIDs 139 | 3. Resolve CIDs to IPLD data 140 | 4. Merge changes with the local replica 141 | 142 | --- 143 | > **Titling this article 'Replication on IPFS' might have been more accurate, but 'Hosting Dynamic Content on IPFS' sounded waaay better.** 144 | --- 145 | 146 |
147 | 148 | ### Dynamic-Content IDs 149 | 150 | A Dynamic-Content ID (DCID) looks like a CID. Also, both DCIDs and CIDs reference and identify content on the DHT. 151 | 152 | *Where the two IDs differ is in their creation.* 153 | 154 | While CIDs come from the hash of some static content, DCIDs are a permutation of the CID of a manifest document. 155 | This immutable manifest document "describes" the dynamic content. 156 | 157 | As stated in the previous section, DCIDs identify unique dynamic content. 158 | They point to IPNS names by using Provider Records on the DHT. 159 | 160 | --- 161 | > **Disclaimer: Dynamic-Content IDs, or DCIDs, only exist for the purpose of this article. It is not an official spec or part of IPFS. (expect a name change because I also hate "DCIDs" 🤢🤮)** 162 | --- 163 | 164 |
165 | 166 | ### Manifest Document 167 | 168 | Manifest documents, a term from OrbitDB, describe some unique dynamic content. 169 | Manifests are immutable and contain information like the protocol and parameter used. 170 | 171 | This document format is not formally specified, but included below is a specification for this article: 172 | 173 | **dag-cbor** 174 | ```js 175 | // cbor type reference: https://www.rfc-editor.org/rfc/rfc8949.html#section-3.1 176 | { 177 | protocol: type 3 178 | param: type 5 179 | } 180 | ``` 181 | 182 | `protocol`: a text string field containing a protocol id 183 | 184 | `param`: a key value map for exclusive use by the `protocol` 185 | 186 | https://github.com/tabcat/dynamic-content/blob/e4df337d4f806ba530efa94b01e7bda2432ffa8d/src/dynamic-content.ts#L7-L30 187 | 188 | Above is a code block from the example attached to this article. 189 | It shows a manifest document "describing" the dynamic content using the `protocol` and `param` properties. 190 | It also shows the DCID derived from the manifest's CID. 191 | 192 |
193 | 194 | ## Use-case: Edge-computed Applications 195 | 196 | This design is particularly useful when paired with local-first databases. 197 | These databases are partitioned (a.k.a. sharded) to only the interested parties. 198 | It's common for only a few collaborators to be a part of a database, and there may be long periods without any of them online. 199 | This context makes it challenging to build upon the history of collaborators, a challenge this design can potentially solve. 200 | 201 | ### Edge Devices 202 | 203 | - Handle application logic and merging of replicas from other collaborators. 204 | - Consist of a network of potentially unreliable peers that may come online and go offline at various times. 205 | - Ensure the application history is available by commanding pinning servers. 206 | 207 | ### Pinning Servers 208 | 209 | - Reliable storage servers that keep content available on IPFS. 210 | - Pin IPLD replicas, and refresh IPNS and Provider Records for clients. 211 | - Execute no app-specific code 212 | 213 | ### Replication 214 | 215 | The design presented in this article is a replication protocol. 216 | However, it is not a real-time replication protocol. 217 | Applications with real-time features should include an app-specific replication protocol for use with other online collaborators. 218 | Combining two replication protocols with these properties results in preserved and real-time P2P applications. 219 | 220 | --- 221 | > **Pinning servers, in this context, provide a general and reliable replication layer to fall back on when no other collaborators are online.** 222 | --- 223 | 224 |
225 | 226 | ## Roadblocks and Workarounds 227 | 228 | It should be clear now that using Provider Records this way was not intended. 229 | This brings us to the roadblock... 230 | 231 | ### No 3rd Party Publishing to DHT 232 | 233 | [DHT servers validate that the PeerIDs inside received Provider Records match the PeerID of the node adding them.](https://github.com/libp2p/specs/tree/master/kad-dht#rpc-messages) 234 | 235 | This check makes adding Provider Records for multiple PeerIDs to the DHT difficult. 236 | Not great if you want to participate in multiple pieces of dynamic content as each will require its own IPNS name. 237 | A Libp2p node may only add its own PeerId as a provider. This PeerId is also known as the "self" key. 238 | 239 | There are two workarounds for now: 240 | 241 | 1. Use the "self" key for IPNS, and have it point to a CID for a map(DCID -> root replica CID) for all relevant dynamic content. 242 | 2. Spin up *ephemeral* libp2p nodes to refresh each IPNS name as a provider every [22hours](https://github.com/libp2p/specs/tree/master/kad-dht#content-provider-advertisement-and-discovery). 243 | 244 | ### No Delegated Refreshing of IPNS OR Provider Records 245 | 246 | Delegated publishing of IPNS and Provider Records is necessary to realize the edge-computed applications use case. 247 | Unfortunately, there are no official plans to add this feature. 248 | 249 |
250 | 251 | ## Example 252 | 253 | --- 254 | > **USES HELIA 😲🤩 !!!! DHT IN 😵‍💫 JAVASCRIPT 😵‍💫 😵 !! DYNAMIC CONTENT ON IPFS!?🧐!?** 255 | --- 256 | 257 | This example shows dynamic-content replication using IPLD, IPNS, and Provider Records. 258 | There are 3 [helia](https://github.com/ipfs/helia) (IPFS) nodes running in a single script, named `client1`, `client2`, and `server`. 259 | `client1` and `client2` dial `server` and use the `/ipfs/kad/1.0.0` protocol. 260 | After dialing, clients can add IPNS and Provider records to the DHT server. 261 | Clients also add IPLD data to `server` programmatically. 262 | 263 | ```mermaid 264 | flowchart LR 265 | A[client1] & B[client2] ---->|tcp\n/ipfs/kad/1.0.0| C[server] 266 | ``` 267 | 268 | --- 269 | > **`client1`, `client2`, and `server ` are all in memory Helia nodes created by a single script.** 270 | 271 | > **IPLD data is added to the server by clients by accessing `server.blockstore.put` from within the script (programmatically). As opposed to using an HTTP API like in any real use-case.** 272 | --- 273 | 274 | ### Usage 275 | 276 | - Requires [npm and Node v18](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 277 | 278 | #### Clone the Repo 279 | 280 | `git clone https://github.com/tabcat/dynamic-content.git` 281 | 282 | #### Install Packages 283 | 284 | `npm install` 285 | 286 | #### Run Examples 287 | 288 | There are two example scripts. One is interactive, meaning after the example runs, a REPL starts with global variables available to operate the replication manually. 289 | 290 | The scripts are `npm run example` and `npm run interactive`. 291 | 292 | **If something is broken please open an [issue](https://github.com/tabcat/dynamic-content/issues)!** 293 | 294 |
295 | 296 | ### What's Happening? 297 | 298 | The example consists of 3 [Helia](https://github.com/ipfs/helia) nodes, named `client1`, `client2`, and `server`. 299 | The `server` represents a reliable machine used as a 300 | 301 | 1. IPLD pinning server 302 | 2. DHT server 303 | 304 | --- 305 | > **IPNS and Provider records are both stored in the DHT.** 306 | --- 307 | 308 | The clients are unreliable machines used to read and write dynamic content. 309 | In the example, `client1` does all the writing, and `client2` does all the reading. 310 | 311 | ```mermaid 312 | sequenceDiagram 313 | client1->>client1: update replica 314 | client1->>server: push replica data 315 | client1->>server: IPNS publish replica CID 316 | client1->>server: add IPNS as a provider of DCID 317 | 318 | client2->>server: find providers for DCID 319 | server-->>client2: client1 is provider 320 | client2->>server: resolve client1 IPNS 321 | server-->>client2: resolves to CID 322 | client2->>server: resolve CID to data 323 | server-->>client2: data 324 | client2->>client2: merge replica 325 | ``` 326 | 327 |
328 | 329 | This is a very high overview of what's going on. 330 | Remember, this design uses only IPLD/IPNS/Provider Records. 331 | It may be helpful to read [index.ts](./src/index.ts) (~200 LOC) for clarity. 332 | 333 | ### Sample Outputs 334 | 335 | In case you are unable to run the example, below shows all the output that would occur: 336 | 337 |
338 | `npm run example` 339 | 340 | ```sh 341 | $ npm run example 342 | 343 | > dynamic-content@1.0.0 example 344 | > npm run build && node dist/index.js 345 | 346 | 347 | > dynamic-content@1.0.0 build 348 | > tsc 349 | 350 | server is pinning ipld and serving dht ipns and provider records 351 | client1: online 352 | client1: added new values to set { nerf this } 353 | client1: set state: { nerf this } 354 | client1: encoded to raw data 355 | client1: pushed data to pinner 356 | client1: published ipns:12D3KooWRzE1FNCRXuz1C8Z3G8Q5oBg3C5nhKANSsFq377P1mWVn with value cid:bafyreihypffwyzhujryetatiy5imqq3p4mokuz36xmgp7wfegnhnjhwrsq 357 | client1: advertised ipns:12D3KooWRzE1FNCRXuz1C8Z3G8Q5oBg3C5nhKANSsFq377P1mWVn as set provider 358 | client1: offline 359 | 360 | --- no peers online, Zzzzz --- 361 | 362 | client2: online 363 | dht query returned empty response 364 | client2: found ipns:12D3KooWRzE1FNCRXuz1C8Z3G8Q5oBg3C5nhKANSsFq377P1mWVn as set provider 365 | client2: resolved ipns:12D3KooWRzE1FNCRXuz1C8Z3G8Q5oBg3C5nhKANSsFq377P1mWVn to bafyreihypffwyzhujryetatiy5imqq3p4mokuz36xmgp7wfegnhnjhwrsq 366 | client2: resolved ipfs:bafyreihypffwyzhujryetatiy5imqq3p4mokuz36xmgp7wfegnhnjhwrsq to raw data 367 | client2: decoded raw data 368 | client2: added new values to set { nerf this } 369 | client2: set state: { nerf this } 370 | client2: offline 371 | ``` 372 |
373 | 374 |
375 | `npm run interactive` 376 |
377 | 378 | The interactive example starts a REPL after the example has run. 379 | 380 | ```sh 381 | $ npm run interactive 382 | 383 | > dynamic-content@1.0.0 interactive 384 | > npm run build && node dist/interactive.js 385 | 386 | 387 | > dynamic-content@1.0.0 build 388 | > tsc 389 | 390 | server is pinning ipld and serving dht ipns and provider records 391 | client1: online 392 | client1: added new values to set { nerf this } 393 | client1: set state: { nerf this } 394 | client1: encoded to raw data 395 | client1: pushed data to pinner 396 | client1: published ipns:12D3KooWQXCo6Wzw7NmJRLC2peAX7fU6gHSydEKNAJfyfXCEwHFL with value cid:bafyreihypffwyzhujryetatiy5imqq3p4mokuz36xmgp7wfegnhnjhwrsq 397 | client1: advertised ipns:12D3KooWQXCo6Wzw7NmJRLC2peAX7fU6gHSydEKNAJfyfXCEwHFL as set provider 398 | client1: offline 399 | 400 | --- no peers online, Zzzzz --- 401 | 402 | client2: online 403 | dht query returned empty response 404 | client2: found ipns:12D3KooWQXCo6Wzw7NmJRLC2peAX7fU6gHSydEKNAJfyfXCEwHFL as set provider 405 | client2: resolved ipns:12D3KooWQXCo6Wzw7NmJRLC2peAX7fU6gHSydEKNAJfyfXCEwHFL to bafyreihypffwyzhujryetatiy5imqq3p4mokuz36xmgp7wfegnhnjhwrsq 406 | client2: resolved ipfs:bafyreihypffwyzhujryetatiy5imqq3p4mokuz36xmgp7wfegnhnjhwrsq to raw data 407 | client2: decoded raw data 408 | client2: added new values to set { nerf this } 409 | client2: set state: { nerf this } 410 | client2: offline 411 | 412 | --- interactive example --- 413 | 414 | client1: online 415 | client2: online 416 | 417 | Usage: 418 | 419 | globals 420 | 421 | help: this message 422 | 423 | client1: helia client node (sender) 424 | client2: helia client node (receiver) 425 | server: helia ipld/ipns pinner and dht server 426 | 427 | // compare the 2 clients sets 428 | set1: client1's set variable 429 | set2: client2's set variable 430 | 431 | await connect() // connects client to server 432 | await disconnect() // disconnects client from server 433 | 434 | await update(...) // create and publish changes from client1 - requires client1 to be connected 435 | await sync() // syncs changes to client2 - requires client2 to be connected 436 | 437 | > 438 | ``` 439 |
440 | 441 | --- 442 | > **Note: in practice, the DHT queries related to the Dynamic Content's ID only need to be run initially. Afterward, a protocol meant for real-time replication with online collaborators can be used.** 443 | --- 444 | 445 |
446 | 447 | ## Credits 448 | 449 | Big thanks to [@autonome](https://github.com/autonome), [@SgtPooki](https://github.com/sgtpooki), and [@lidel](https://github.com/lidel) for help writing this article! 450 | 451 | Also thanks to [@willscott](https://github.com/willscott) for answering all my DHT questions in [#libp2p-implementers](https://app.element.io/#/room/#libp2p-implementers:ipfs.io)! 452 | 453 |
454 | 455 | ## Get Involved 456 | 457 | Sound interesting? Get involved! Come [chat](https://matrix.to/#/#hldb:matrix.org) 458 | 459 | Have a question? Create an [issue](https://github.com/tabcat/dynamic-content/issues) 460 | 461 | [I](https://github.com/tabcat)'m implementing this in [tabcat/zzzync](https://github.com/tabcat/zzzync) 462 | 463 |
464 | 465 | ## FAQ 466 | 467 | **Q**: Why not just share an IPNS name between devices to update? 468 | 469 | **A**: IPNS names are not built to handle concurrent writes and should not be extended to do so. They are signed, versioned documents that one device should be able to update. As shown here, they are essential for creating a system that can handle concurrent writes. 470 | 471 |
472 | 473 | **Q**: Isn't this going to be slow? 474 | 475 | **A**: This design complements real-time replication by providing a general and reliable layer to fall back to. It adds two steps on top of resolving a CID: 1) the DHT provider query and 2) the IPNS name resolutions. 476 | Developers must reason how to design replicas for efficient storage and replication over IPLD. 477 | 478 |
479 | 480 | **Q**: Provider Records do not support this use case. Could this affect DHT measurements? 481 | 482 | **A**: If this use case became prevalent, it could affect DHT measurements. Using Provider Records this way would make it look like the content providers are offline because the PeerIDs are used only for IPNS. 483 | 484 |
485 | 486 | **Q**: Could IPNS and Provider Records be swapped out for alternatives and achieve the same goal? 487 | 488 | **A**: Absolutely. The goal is to provide a general and reliable replication layer. Additionally, the more widespread the building blocks used, the more existing infrastructure can be leveraged. 489 | 490 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Hosting Dynamic Content on IPFS 2 | 3 | Dynamic content on IPFS using IPLD, IPNS, and Provider Records. 4 | 5 | 6 | 7 | Read the [article](./ARTICLE.md) 8 | 9 | Try out the [example](./ARTICLE.md#example) 10 | 11 |
12 | 13 | ### Questions? Create an [Issue](https://github.com/tabcat/dynamic-content/issues)! 14 | 15 | --- 16 | 17 | ### Publications: 18 | 19 | [IPFS Blog: How to Host Dynamic Content on IPFS](https://blog.ipfs.tech/2023-how-to-host-dynamic-content-on-ipfs/) 20 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dynamic-content", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "dynamic-content", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@chainsafe/libp2p-noise": "^11.0.4", 13 | "@chainsafe/libp2p-yamux": "^3.0.7", 14 | "@helia/ipns": "^1.1.0", 15 | "@ipld/dag-cbor": "^9.0.0", 16 | "@libp2p/kad-dht": "^8.0.6", 17 | "@libp2p/tcp": "^6.1.5", 18 | "helia": "^1.0.3", 19 | "libp2p": "^0.44.0", 20 | "typescript": "^5.0.4" 21 | } 22 | }, 23 | "node_modules/@achingbrain/ip-address": { 24 | "version": "8.1.0", 25 | "resolved": "https://registry.npmjs.org/@achingbrain/ip-address/-/ip-address-8.1.0.tgz", 26 | "integrity": "sha512-Zus4vMKVRDm+R1o0QJNhD0PD/8qRGO3Zx8YPsFG5lANt5utVtGg3iHVGBSAF80TfQmhi8rP+Kg/OigdxY0BXHw==", 27 | "dependencies": { 28 | "jsbn": "1.1.0", 29 | "sprintf-js": "1.1.2" 30 | }, 31 | "engines": { 32 | "node": ">= 12" 33 | } 34 | }, 35 | "node_modules/@achingbrain/nat-port-mapper": { 36 | "version": "1.0.7", 37 | "resolved": "https://registry.npmjs.org/@achingbrain/nat-port-mapper/-/nat-port-mapper-1.0.7.tgz", 38 | "integrity": "sha512-P8Z8iMZBQCsN7q3XoVoJAX3CGPUTbGTh1XBU8JytCW3hBmSk594l8YvdrtY5NVexVHSwLeiXnDsP4d10NJHaeg==", 39 | "dependencies": { 40 | "@achingbrain/ssdp": "^4.0.1", 41 | "@libp2p/logger": "^2.0.0", 42 | "default-gateway": "^6.0.2", 43 | "err-code": "^3.0.1", 44 | "it-first": "^1.0.7", 45 | "p-defer": "^4.0.0", 46 | "p-timeout": "^5.0.2", 47 | "xml2js": "^0.4.23" 48 | }, 49 | "engines": { 50 | "node": ">=16.0.0", 51 | "npm": ">=7.0.0" 52 | } 53 | }, 54 | "node_modules/@achingbrain/nat-port-mapper/node_modules/it-first": { 55 | "version": "1.0.7", 56 | "resolved": "https://registry.npmjs.org/it-first/-/it-first-1.0.7.tgz", 57 | "integrity": "sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g==" 58 | }, 59 | "node_modules/@achingbrain/ssdp": { 60 | "version": "4.0.1", 61 | "resolved": "https://registry.npmjs.org/@achingbrain/ssdp/-/ssdp-4.0.1.tgz", 62 | "integrity": "sha512-z/CkfFI0Ksrpo8E+lu2rKahlE1KJHUn8X8ihQj2Jg6CEL+oHYGCNfttOES0+VnV7htuog70c8bYNHYhlmmqxBQ==", 63 | "dependencies": { 64 | "event-iterator": "^2.0.0", 65 | "freeport-promise": "^2.0.0", 66 | "merge-options": "^3.0.4", 67 | "uuid": "^8.3.2", 68 | "xml2js": "^0.4.23" 69 | }, 70 | "engines": { 71 | "node": ">=16.0.0", 72 | "npm": ">=7.0.0" 73 | } 74 | }, 75 | "node_modules/@chainsafe/is-ip": { 76 | "version": "2.0.1", 77 | "resolved": "https://registry.npmjs.org/@chainsafe/is-ip/-/is-ip-2.0.1.tgz", 78 | "integrity": "sha512-nqSJ8u2a1Rv9FYbyI8qpDhTYujaKEyLknNrTejLYoSWmdeg+2WB7R6BZqPZYfrJzDxVi3rl6ZQuoaEvpKRZWgQ==" 79 | }, 80 | "node_modules/@chainsafe/libp2p-noise": { 81 | "version": "11.0.4", 82 | "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-noise/-/libp2p-noise-11.0.4.tgz", 83 | "integrity": "sha512-X7kA6a3/QPFxNFwgUJ8vubDu5qBDcDT0nhD+jL7g60IFKZu//HFH7oqsNCZa12yx0oR1fEYOR62iHDt2GHyWBQ==", 84 | "dependencies": { 85 | "@libp2p/crypto": "^1.0.11", 86 | "@libp2p/interface-connection-encrypter": "^3.0.5", 87 | "@libp2p/interface-keys": "^1.0.6", 88 | "@libp2p/interface-metrics": "^4.0.4", 89 | "@libp2p/interface-peer-id": "^2.0.0", 90 | "@libp2p/logger": "^2.0.5", 91 | "@libp2p/peer-id": "^2.0.0", 92 | "@stablelib/chacha20poly1305": "^1.0.1", 93 | "@stablelib/hkdf": "^1.0.1", 94 | "@stablelib/sha256": "^1.0.1", 95 | "@stablelib/x25519": "^1.0.3", 96 | "it-length-prefixed": "^8.0.2", 97 | "it-pair": "^2.0.2", 98 | "it-pb-stream": "^3.2.0", 99 | "it-pipe": "^2.0.3", 100 | "it-stream-types": "^1.0.4", 101 | "protons-runtime": "^5.0.0", 102 | "uint8arraylist": "^2.3.2", 103 | "uint8arrays": "^4.0.2" 104 | }, 105 | "engines": { 106 | "node": ">=16.0.0", 107 | "npm": ">=7.0.0" 108 | } 109 | }, 110 | "node_modules/@chainsafe/libp2p-yamux": { 111 | "version": "3.0.10", 112 | "resolved": "https://registry.npmjs.org/@chainsafe/libp2p-yamux/-/libp2p-yamux-3.0.10.tgz", 113 | "integrity": "sha512-JToeook11AWD2pnRiIm0VnY1jDVDKfyoM3JD7U1z+OXaV9hekYw808r76w+m3oGUX4M4LZZBQBa0UQmArHNP+A==", 114 | "dependencies": { 115 | "@libp2p/interface-connection": "^4.0.0", 116 | "@libp2p/interface-stream-muxer": "^3.0.0", 117 | "@libp2p/interfaces": "^3.2.0", 118 | "@libp2p/logger": "^2.0.1", 119 | "abortable-iterator": "^4.0.2", 120 | "any-signal": "^4.1.1", 121 | "it-pipe": "^3.0.1", 122 | "it-pushable": "^3.1.0", 123 | "uint8arraylist": "^2.3.2" 124 | }, 125 | "engines": { 126 | "node": ">=16.0.0", 127 | "npm": ">=7.0.0" 128 | } 129 | }, 130 | "node_modules/@chainsafe/libp2p-yamux/node_modules/it-pipe": { 131 | "version": "3.0.1", 132 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", 133 | "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", 134 | "dependencies": { 135 | "it-merge": "^3.0.0", 136 | "it-pushable": "^3.1.2", 137 | "it-stream-types": "^2.0.1" 138 | }, 139 | "engines": { 140 | "node": ">=16.0.0", 141 | "npm": ">=7.0.0" 142 | } 143 | }, 144 | "node_modules/@chainsafe/libp2p-yamux/node_modules/it-stream-types": { 145 | "version": "2.0.1", 146 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", 147 | "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", 148 | "engines": { 149 | "node": ">=16.0.0", 150 | "npm": ">=7.0.0" 151 | } 152 | }, 153 | "node_modules/@chainsafe/netmask": { 154 | "version": "2.0.0", 155 | "resolved": "https://registry.npmjs.org/@chainsafe/netmask/-/netmask-2.0.0.tgz", 156 | "integrity": "sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==", 157 | "dependencies": { 158 | "@chainsafe/is-ip": "^2.0.1" 159 | } 160 | }, 161 | "node_modules/@helia/interface": { 162 | "version": "1.0.0", 163 | "resolved": "https://registry.npmjs.org/@helia/interface/-/interface-1.0.0.tgz", 164 | "integrity": "sha512-Sk1vJNU6UmHBzabFWx5KOG3X4AcXHvd1ZizPGdEUNaRL/Nrjja+f3iz8YH+/ujyWZeYOzs8s6h8TzZ6fWO6IUQ==", 165 | "dependencies": { 166 | "@libp2p/interface-libp2p": "^1.1.0", 167 | "@libp2p/interface-peer-id": "^2.0.1", 168 | "@libp2p/interfaces": "^3.3.1", 169 | "interface-blockstore": "^5.0.0", 170 | "interface-datastore": "^8.0.0", 171 | "interface-store": "^5.0.1", 172 | "ipfs-bitswap": "^17.0.0", 173 | "multiformats": "^11.0.1", 174 | "progress-events": "^1.0.0" 175 | }, 176 | "engines": { 177 | "node": ">=16.0.0", 178 | "npm": ">=7.0.0" 179 | } 180 | }, 181 | "node_modules/@helia/ipns": { 182 | "version": "1.1.0", 183 | "resolved": "https://registry.npmjs.org/@helia/ipns/-/ipns-1.1.0.tgz", 184 | "integrity": "sha512-YsFdB2DYk5jT3g2pFxW6oVVnMhF4bn5ret1H5iMZL1TYxkSfoniwVxWDgqLfXZbWTpwN5t8xdJfudxErcN9Nsg==", 185 | "dependencies": { 186 | "@libp2p/interface-dht": "^2.0.1", 187 | "@libp2p/interface-peer-id": "^2.0.1", 188 | "@libp2p/interface-pubsub": "^3.0.6", 189 | "@libp2p/interfaces": "^3.3.1", 190 | "@libp2p/logger": "^2.0.6", 191 | "@libp2p/peer-id": "^2.0.1", 192 | "@libp2p/record": "^3.0.0", 193 | "hashlru": "^2.3.0", 194 | "interface-datastore": "^8.0.0", 195 | "ipns": "^6.0.0", 196 | "is-ipfs": "^8.0.1", 197 | "multiformats": "^11.0.1", 198 | "p-queue": "^7.3.0", 199 | "progress-events": "^1.0.0", 200 | "uint8arrays": "^4.0.3" 201 | }, 202 | "engines": { 203 | "node": ">=16.0.0", 204 | "npm": ">=7.0.0" 205 | } 206 | }, 207 | "node_modules/@ipld/dag-cbor": { 208 | "version": "9.0.0", 209 | "resolved": "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-9.0.0.tgz", 210 | "integrity": "sha512-zdsiSiYDEOIDW7mmWOYWC9gukjXO+F8wqxz/LfN7iSwTfIyipC8+UQrCbPupFMRb/33XQTZk8yl3My8vUQBRoA==", 211 | "dependencies": { 212 | "cborg": "^1.10.0", 213 | "multiformats": "^11.0.0" 214 | }, 215 | "engines": { 216 | "node": ">=16.0.0", 217 | "npm": ">=7.0.0" 218 | } 219 | }, 220 | "node_modules/@ipld/dag-pb": { 221 | "version": "4.0.2", 222 | "resolved": "https://registry.npmjs.org/@ipld/dag-pb/-/dag-pb-4.0.2.tgz", 223 | "integrity": "sha512-me9oEPb7UNPWSplUFCXyxnQE3/WlsjOljqO2RZN44XOmGkBY0/WVklbXorVE1eiv0Rt3p6dBS2x36Rq8A0Am8A==", 224 | "dependencies": { 225 | "multiformats": "^11.0.0" 226 | }, 227 | "engines": { 228 | "node": ">=16.0.0", 229 | "npm": ">=7.0.0" 230 | } 231 | }, 232 | "node_modules/@libp2p/crypto": { 233 | "version": "1.0.15", 234 | "resolved": "https://registry.npmjs.org/@libp2p/crypto/-/crypto-1.0.15.tgz", 235 | "integrity": "sha512-5X7K0eXmq1wJJqjYn6bJnGeanQHrkOnJawoRgCRfzgbQS5h+BK1lVSpJEBHoe/IU6aqsnDNrkPSE5cOffgz6+A==", 236 | "dependencies": { 237 | "@libp2p/interface-keys": "^1.0.2", 238 | "@libp2p/interfaces": "^3.2.0", 239 | "@noble/ed25519": "^1.6.0", 240 | "@noble/secp256k1": "^1.5.4", 241 | "multiformats": "^11.0.0", 242 | "node-forge": "^1.1.0", 243 | "protons-runtime": "^5.0.0", 244 | "uint8arraylist": "^2.4.3", 245 | "uint8arrays": "^4.0.2" 246 | }, 247 | "engines": { 248 | "node": ">=16.0.0", 249 | "npm": ">=7.0.0" 250 | } 251 | }, 252 | "node_modules/@libp2p/interface-address-manager": { 253 | "version": "2.0.5", 254 | "resolved": "https://registry.npmjs.org/@libp2p/interface-address-manager/-/interface-address-manager-2.0.5.tgz", 255 | "integrity": "sha512-e2vLstKkYlAG2PZe6SEBpnnP2Y/ej6URue+zAiyjJPuXoOGNzHyLaqcv7MKye171OEf9dg5wv1gFphWcUJJbSA==", 256 | "dependencies": { 257 | "@libp2p/interfaces": "^3.0.0", 258 | "@multiformats/multiaddr": "^12.0.0" 259 | }, 260 | "engines": { 261 | "node": ">=16.0.0", 262 | "npm": ">=7.0.0" 263 | } 264 | }, 265 | "node_modules/@libp2p/interface-connection": { 266 | "version": "4.0.0", 267 | "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-4.0.0.tgz", 268 | "integrity": "sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==", 269 | "dependencies": { 270 | "@libp2p/interface-peer-id": "^2.0.0", 271 | "@libp2p/interfaces": "^3.0.0", 272 | "@multiformats/multiaddr": "^12.0.0", 273 | "it-stream-types": "^1.0.4", 274 | "uint8arraylist": "^2.1.2" 275 | }, 276 | "engines": { 277 | "node": ">=16.0.0", 278 | "npm": ">=7.0.0" 279 | } 280 | }, 281 | "node_modules/@libp2p/interface-connection-encrypter": { 282 | "version": "3.0.6", 283 | "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-encrypter/-/interface-connection-encrypter-3.0.6.tgz", 284 | "integrity": "sha512-LwyYBN/aSa3IPCe7gBxffx/vaC0rFxAXlCbx4QGaWGtg6qK80Ouj89LEDWb3HkMbecNVWaV4TEqJIM5WnAAx1Q==", 285 | "dependencies": { 286 | "@libp2p/interface-peer-id": "^2.0.0", 287 | "it-stream-types": "^1.0.4", 288 | "uint8arraylist": "^2.1.2" 289 | }, 290 | "engines": { 291 | "node": ">=16.0.0", 292 | "npm": ">=7.0.0" 293 | } 294 | }, 295 | "node_modules/@libp2p/interface-connection-gater": { 296 | "version": "2.0.1", 297 | "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-gater/-/interface-connection-gater-2.0.1.tgz", 298 | "integrity": "sha512-GaH0UCknN4epQq6JfKNO2iD77iukorU0t7KfD1dweVTjEQxq/GiX8vxrJvfoavkmpVVHT5Nlt651p/HksNG6HQ==", 299 | "dependencies": { 300 | "@libp2p/interface-connection": "^4.0.0", 301 | "@libp2p/interface-peer-id": "^2.0.0", 302 | "@libp2p/interfaces": "^3.0.0", 303 | "@multiformats/multiaddr": "^12.0.0", 304 | "it-stream-types": "^1.0.4", 305 | "uint8arraylist": "^2.1.2" 306 | }, 307 | "engines": { 308 | "node": ">=16.0.0", 309 | "npm": ">=7.0.0" 310 | } 311 | }, 312 | "node_modules/@libp2p/interface-content-routing": { 313 | "version": "2.0.2", 314 | "resolved": "https://registry.npmjs.org/@libp2p/interface-content-routing/-/interface-content-routing-2.0.2.tgz", 315 | "integrity": "sha512-SlyZnBk+IpTKdT/4RMNTHcl18PRWUXfb3qhkBPP8xBNGm57DxApKQjLjoklSRNwJ3VDmXyPqTpiR/K/pLPow6A==", 316 | "dependencies": { 317 | "@libp2p/interface-peer-info": "^1.0.0", 318 | "@libp2p/interfaces": "^3.0.0", 319 | "multiformats": "^11.0.0" 320 | }, 321 | "engines": { 322 | "node": ">=16.0.0", 323 | "npm": ">=7.0.0" 324 | } 325 | }, 326 | "node_modules/@libp2p/interface-dht": { 327 | "version": "2.0.1", 328 | "resolved": "https://registry.npmjs.org/@libp2p/interface-dht/-/interface-dht-2.0.1.tgz", 329 | "integrity": "sha512-+yEbt+1hMTR1bITzYyE771jEujimPXqDyFm8T1a8slMpeOD9z5wmLfuCWif8oGZJzXX5YqldWwSwytJQgWXL9g==", 330 | "dependencies": { 331 | "@libp2p/interface-peer-discovery": "^1.0.0", 332 | "@libp2p/interface-peer-id": "^2.0.0", 333 | "@libp2p/interface-peer-info": "^1.0.0", 334 | "@libp2p/interfaces": "^3.0.0", 335 | "multiformats": "^11.0.0" 336 | }, 337 | "engines": { 338 | "node": ">=16.0.0", 339 | "npm": ">=7.0.0" 340 | } 341 | }, 342 | "node_modules/@libp2p/interface-keychain": { 343 | "version": "2.0.4", 344 | "resolved": "https://registry.npmjs.org/@libp2p/interface-keychain/-/interface-keychain-2.0.4.tgz", 345 | "integrity": "sha512-RCH0PL9um/ejsPiWIOzxFzjPzL2nT2tRUtCDo1aBQqoBi7eYp4I4ya1KbzgWDPTmNuuFtCReRMQsZ7/KVirKPA==", 346 | "dependencies": { 347 | "@libp2p/interface-peer-id": "^2.0.0", 348 | "multiformats": "^11.0.0" 349 | }, 350 | "engines": { 351 | "node": ">=16.0.0", 352 | "npm": ">=7.0.0" 353 | } 354 | }, 355 | "node_modules/@libp2p/interface-keys": { 356 | "version": "1.0.7", 357 | "resolved": "https://registry.npmjs.org/@libp2p/interface-keys/-/interface-keys-1.0.7.tgz", 358 | "integrity": "sha512-DRMPY9LfcnGJKrjaqIkY62U3fW2dya3VLy4x986ExtMrGn4kxIHeQ1IKk8/Vs9CJHTKmXEMID4of1Cjnw4aJpA==", 359 | "engines": { 360 | "node": ">=16.0.0", 361 | "npm": ">=7.0.0" 362 | } 363 | }, 364 | "node_modules/@libp2p/interface-libp2p": { 365 | "version": "1.2.0", 366 | "resolved": "https://registry.npmjs.org/@libp2p/interface-libp2p/-/interface-libp2p-1.2.0.tgz", 367 | "integrity": "sha512-eRAfqSkxbwNThX2mY+wMECMWvTDCYhmRjrgbSwjosgdblC/BDKwTVKfESYjFzBSxa4m0rEZNe4BCGoVyKzHsyg==", 368 | "dependencies": { 369 | "@libp2p/interface-connection": "^4.0.0", 370 | "@libp2p/interface-content-routing": "^2.0.0", 371 | "@libp2p/interface-dht": "^2.0.0", 372 | "@libp2p/interface-keychain": "^2.0.0", 373 | "@libp2p/interface-metrics": "^4.0.0", 374 | "@libp2p/interface-peer-id": "^2.0.0", 375 | "@libp2p/interface-peer-info": "^1.0.0", 376 | "@libp2p/interface-peer-routing": "^1.0.0", 377 | "@libp2p/interface-peer-store": "^1.0.0", 378 | "@libp2p/interface-pubsub": "^3.0.0", 379 | "@libp2p/interface-registrar": "^2.0.0", 380 | "@libp2p/interfaces": "^3.0.0", 381 | "@multiformats/multiaddr": "^12.0.0" 382 | }, 383 | "engines": { 384 | "node": ">=16.0.0", 385 | "npm": ">=7.0.0" 386 | } 387 | }, 388 | "node_modules/@libp2p/interface-metrics": { 389 | "version": "4.0.6", 390 | "resolved": "https://registry.npmjs.org/@libp2p/interface-metrics/-/interface-metrics-4.0.6.tgz", 391 | "integrity": "sha512-FWRrjvvoWlFHEKsaOvJFPylM8/ZAo0AXsqqnF0FpOwMZseVNXyU0KRNDn4Q9bdbn/j+y/+uog99bNT96/g0dew==", 392 | "dependencies": { 393 | "@libp2p/interface-connection": "^4.0.0" 394 | }, 395 | "engines": { 396 | "node": ">=16.0.0", 397 | "npm": ">=7.0.0" 398 | } 399 | }, 400 | "node_modules/@libp2p/interface-peer-discovery": { 401 | "version": "1.0.5", 402 | "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-discovery/-/interface-peer-discovery-1.0.5.tgz", 403 | "integrity": "sha512-R0TN/vDaCJLvRhop0y4qoPqapHxX4AEQDEtqmpayAA1BuPgbBq4fS4mepR3FAMcNva/szeqVCDuI4gDejtCaVg==", 404 | "dependencies": { 405 | "@libp2p/interface-peer-info": "^1.0.0", 406 | "@libp2p/interfaces": "^3.0.0" 407 | }, 408 | "engines": { 409 | "node": ">=16.0.0", 410 | "npm": ">=7.0.0" 411 | } 412 | }, 413 | "node_modules/@libp2p/interface-peer-id": { 414 | "version": "2.0.1", 415 | "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-id/-/interface-peer-id-2.0.1.tgz", 416 | "integrity": "sha512-k01hKHTAZWMOiBC+yyFsmBguEMvhPkXnQtqLtFqga2fVZu8Zve7zFAtQYLhQjeJ4/apeFtO6ddTS8mCE6hl4OA==", 417 | "dependencies": { 418 | "multiformats": "^11.0.0" 419 | }, 420 | "engines": { 421 | "node": ">=16.0.0", 422 | "npm": ">=7.0.0" 423 | } 424 | }, 425 | "node_modules/@libp2p/interface-peer-info": { 426 | "version": "1.0.9", 427 | "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-info/-/interface-peer-info-1.0.9.tgz", 428 | "integrity": "sha512-XewuwXMVYMcwaxhH9PFVfsFNEXi2OEe9TgkBwvZbbtwTI2Cz6zvKS1tT4f+ATCXjQbN840Nhe6ETPQ4TfhThOQ==", 429 | "dependencies": { 430 | "@libp2p/interface-peer-id": "^2.0.0", 431 | "@multiformats/multiaddr": "^12.0.0" 432 | }, 433 | "engines": { 434 | "node": ">=16.0.0", 435 | "npm": ">=7.0.0" 436 | } 437 | }, 438 | "node_modules/@libp2p/interface-peer-routing": { 439 | "version": "1.0.8", 440 | "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-routing/-/interface-peer-routing-1.0.8.tgz", 441 | "integrity": "sha512-ArJWymWvHqVNyHSZ+7T9av2A4r0f1zTPMKe3+7BOX3n2mB8hP2nNMz/Kiun41TH0t80zMiXE73ZD29is27yt9g==", 442 | "dependencies": { 443 | "@libp2p/interface-peer-id": "^2.0.0", 444 | "@libp2p/interface-peer-info": "^1.0.0", 445 | "@libp2p/interfaces": "^3.0.0" 446 | }, 447 | "engines": { 448 | "node": ">=16.0.0", 449 | "npm": ">=7.0.0" 450 | } 451 | }, 452 | "node_modules/@libp2p/interface-peer-store": { 453 | "version": "1.2.9", 454 | "resolved": "https://registry.npmjs.org/@libp2p/interface-peer-store/-/interface-peer-store-1.2.9.tgz", 455 | "integrity": "sha512-jAAlbP1NXpEJOG6Dbr0QdP71TBYjHBc/65Ulwdn4J4f04PW1bI4JIMQeq6+/sLfaGVryvvUT/a52io8UUtB21Q==", 456 | "dependencies": { 457 | "@libp2p/interface-peer-id": "^2.0.0", 458 | "@libp2p/interface-peer-info": "^1.0.0", 459 | "@libp2p/interface-record": "^2.0.0", 460 | "@libp2p/interfaces": "^3.0.0", 461 | "@multiformats/multiaddr": "^12.0.0" 462 | }, 463 | "engines": { 464 | "node": ">=16.0.0", 465 | "npm": ">=7.0.0" 466 | } 467 | }, 468 | "node_modules/@libp2p/interface-pubsub": { 469 | "version": "3.0.7", 470 | "resolved": "https://registry.npmjs.org/@libp2p/interface-pubsub/-/interface-pubsub-3.0.7.tgz", 471 | "integrity": "sha512-+c74EVUBTfw2sx1GE/z/IjsYO6dhur+ukF0knAppeZsRQ1Kgg6K5R3eECtT28fC6dBWLjFpAvW/7QGfiDAL4RA==", 472 | "dependencies": { 473 | "@libp2p/interface-connection": "^4.0.0", 474 | "@libp2p/interface-peer-id": "^2.0.0", 475 | "@libp2p/interfaces": "^3.0.0", 476 | "it-pushable": "^3.0.0", 477 | "uint8arraylist": "^2.1.2" 478 | }, 479 | "engines": { 480 | "node": ">=16.0.0", 481 | "npm": ">=7.0.0" 482 | } 483 | }, 484 | "node_modules/@libp2p/interface-record": { 485 | "version": "2.0.6", 486 | "resolved": "https://registry.npmjs.org/@libp2p/interface-record/-/interface-record-2.0.6.tgz", 487 | "integrity": "sha512-4EtDkY3sbYapWM8++gVHlv31HZXoLmj9I7CRXUKXzFkVE0GLK/A8jYWl7K0lmf2juPjeYm2eHITeA9/wAtIS3w==", 488 | "dependencies": { 489 | "@libp2p/interface-peer-id": "^2.0.0", 490 | "uint8arraylist": "^2.1.2" 491 | }, 492 | "engines": { 493 | "node": ">=16.0.0", 494 | "npm": ">=7.0.0" 495 | } 496 | }, 497 | "node_modules/@libp2p/interface-registrar": { 498 | "version": "2.0.10", 499 | "resolved": "https://registry.npmjs.org/@libp2p/interface-registrar/-/interface-registrar-2.0.10.tgz", 500 | "integrity": "sha512-niuU/ksbvnYyXnjstKCpPdFuRbJQQ6ISGF0rQVk5P9jhk4e1FvLHF197+rXloQkCFF+UxPKz5kmO8QmICM2xhg==", 501 | "dependencies": { 502 | "@libp2p/interface-connection": "^4.0.0", 503 | "@libp2p/interface-peer-id": "^2.0.0" 504 | }, 505 | "engines": { 506 | "node": ">=16.0.0", 507 | "npm": ">=7.0.0" 508 | } 509 | }, 510 | "node_modules/@libp2p/interface-stream-muxer": { 511 | "version": "3.0.6", 512 | "resolved": "https://registry.npmjs.org/@libp2p/interface-stream-muxer/-/interface-stream-muxer-3.0.6.tgz", 513 | "integrity": "sha512-wbLrH/bdF8qe0CpPd3BFMSmUs085vc3/8zx5uhXJySD672enAc8Jw9gmAYd1pIqELdqJqBDg9EI0y1XMRxvVkw==", 514 | "dependencies": { 515 | "@libp2p/interface-connection": "^4.0.0", 516 | "@libp2p/interfaces": "^3.0.0", 517 | "it-stream-types": "^1.0.4" 518 | }, 519 | "engines": { 520 | "node": ">=16.0.0", 521 | "npm": ">=7.0.0" 522 | } 523 | }, 524 | "node_modules/@libp2p/interface-transport": { 525 | "version": "2.1.3", 526 | "resolved": "https://registry.npmjs.org/@libp2p/interface-transport/-/interface-transport-2.1.3.tgz", 527 | "integrity": "sha512-ez+0X+w2Wyw3nJY6mP0DHFgrRnln/miAH4TJLcRfUSJHjGXH5ZfpuK1TnRxXpEUiqOezSbwke06/znI27KpRiQ==", 528 | "dependencies": { 529 | "@libp2p/interface-connection": "^4.0.0", 530 | "@libp2p/interface-stream-muxer": "^3.0.0", 531 | "@libp2p/interfaces": "^3.0.0", 532 | "@multiformats/multiaddr": "^12.0.0", 533 | "it-stream-types": "^1.0.4" 534 | }, 535 | "engines": { 536 | "node": ">=16.0.0", 537 | "npm": ">=7.0.0" 538 | } 539 | }, 540 | "node_modules/@libp2p/interfaces": { 541 | "version": "3.3.1", 542 | "resolved": "https://registry.npmjs.org/@libp2p/interfaces/-/interfaces-3.3.1.tgz", 543 | "integrity": "sha512-3N+goQt74SmaVOjwpwMPKLNgh1uDQGw8GD12c40Kc86WOq0qvpm3NfACW+H8Su2X6KmWjCSMzk9JWs9+8FtUfg==", 544 | "engines": { 545 | "node": ">=16.0.0", 546 | "npm": ">=7.0.0" 547 | } 548 | }, 549 | "node_modules/@libp2p/kad-dht": { 550 | "version": "8.0.9", 551 | "resolved": "https://registry.npmjs.org/@libp2p/kad-dht/-/kad-dht-8.0.9.tgz", 552 | "integrity": "sha512-/MAm/3AFdw2omkKTRJlrfmoACeFRNykcuSZ499MxmOg73QyVDirgVuSMorhNDRTEs9fScHh25TpJzBXPpe1QFw==", 553 | "dependencies": { 554 | "@libp2p/crypto": "^1.0.4", 555 | "@libp2p/interface-address-manager": "^2.0.0", 556 | "@libp2p/interface-connection": "^4.0.0", 557 | "@libp2p/interface-connection-manager": "^2.0.0", 558 | "@libp2p/interface-dht": "^2.0.0", 559 | "@libp2p/interface-metrics": "^4.0.0", 560 | "@libp2p/interface-peer-discovery": "^1.0.1", 561 | "@libp2p/interface-peer-id": "^2.0.0", 562 | "@libp2p/interface-peer-info": "^1.0.3", 563 | "@libp2p/interface-peer-store": "^1.2.2", 564 | "@libp2p/interface-registrar": "^2.0.3", 565 | "@libp2p/interfaces": "^3.2.0", 566 | "@libp2p/logger": "^2.0.1", 567 | "@libp2p/peer-collections": "^3.0.0", 568 | "@libp2p/peer-id": "^2.0.0", 569 | "@libp2p/record": "^3.0.0", 570 | "@libp2p/topology": "^4.0.0", 571 | "@multiformats/multiaddr": "^12.0.0", 572 | "abortable-iterator": "^4.0.2", 573 | "any-signal": "^4.1.1", 574 | "datastore-core": "^9.0.1", 575 | "hashlru": "^2.3.0", 576 | "interface-datastore": "^8.0.0", 577 | "it-all": "^3.0.1", 578 | "it-drain": "^3.0.1", 579 | "it-first": "^3.0.1", 580 | "it-length": "^3.0.1", 581 | "it-length-prefixed": "^9.0.0", 582 | "it-map": "^3.0.1", 583 | "it-merge": "^3.0.0", 584 | "it-parallel": "^3.0.0", 585 | "it-pipe": "^3.0.0", 586 | "it-stream-types": "^1.0.4", 587 | "it-take": "^3.0.1", 588 | "k-bucket": "^5.1.0", 589 | "multiformats": "^11.0.0", 590 | "p-defer": "^4.0.0", 591 | "p-queue": "^7.3.4", 592 | "private-ip": "^3.0.0", 593 | "protons-runtime": "^5.0.0", 594 | "timeout-abort-controller": "^3.0.0", 595 | "uint8arraylist": "^2.0.0", 596 | "uint8arrays": "^4.0.2", 597 | "varint": "^6.0.0" 598 | }, 599 | "engines": { 600 | "node": ">=16.0.0", 601 | "npm": ">=7.0.0" 602 | } 603 | }, 604 | "node_modules/@libp2p/kad-dht/node_modules/@libp2p/interface-connection-manager": { 605 | "version": "2.1.0", 606 | "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-manager/-/interface-connection-manager-2.1.0.tgz", 607 | "integrity": "sha512-bBJ+GTTDrQvWlmU7aSH5waAs3F3N3LPwiU3KgrTq6/ODK/K1c4El7WQuLnzreUUYXT2XFExyNRnXEURPGOYdVg==", 608 | "dependencies": { 609 | "@libp2p/interface-connection": "^4.0.0", 610 | "@libp2p/interface-peer-id": "^2.0.0", 611 | "@libp2p/interfaces": "^3.0.0", 612 | "@libp2p/peer-collections": "^3.0.1", 613 | "@multiformats/multiaddr": "^12.0.0" 614 | }, 615 | "engines": { 616 | "node": ">=16.0.0", 617 | "npm": ">=7.0.0" 618 | } 619 | }, 620 | "node_modules/@libp2p/kad-dht/node_modules/it-length-prefixed": { 621 | "version": "9.0.0", 622 | "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.0.tgz", 623 | "integrity": "sha512-LCne3R3wxxLv94GTA8ywIeopdyA+2oKXiWWo7g58sQHiD7d1A6WMuWCrwP+xv4i7CmSuR3aeHo66SJUgArLOyA==", 624 | "dependencies": { 625 | "err-code": "^3.0.1", 626 | "it-stream-types": "^1.0.5", 627 | "uint8-varint": "^1.0.1", 628 | "uint8arraylist": "^2.0.0", 629 | "uint8arrays": "^4.0.2" 630 | }, 631 | "engines": { 632 | "node": ">=16.0.0", 633 | "npm": ">=7.0.0" 634 | } 635 | }, 636 | "node_modules/@libp2p/kad-dht/node_modules/it-pipe": { 637 | "version": "3.0.1", 638 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", 639 | "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", 640 | "dependencies": { 641 | "it-merge": "^3.0.0", 642 | "it-pushable": "^3.1.2", 643 | "it-stream-types": "^2.0.1" 644 | }, 645 | "engines": { 646 | "node": ">=16.0.0", 647 | "npm": ">=7.0.0" 648 | } 649 | }, 650 | "node_modules/@libp2p/kad-dht/node_modules/it-pipe/node_modules/it-stream-types": { 651 | "version": "2.0.1", 652 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", 653 | "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", 654 | "engines": { 655 | "node": ">=16.0.0", 656 | "npm": ">=7.0.0" 657 | } 658 | }, 659 | "node_modules/@libp2p/keychain": { 660 | "version": "2.0.0", 661 | "resolved": "https://registry.npmjs.org/@libp2p/keychain/-/keychain-2.0.0.tgz", 662 | "integrity": "sha512-BJMqZCR6Bt3snxOeszKr/3+Y35pb3hZkuiaVP7vXfC5ID9RuFRGqAHdGzz+FVqow1XZSuUTNrL/NydF1TvJHRw==", 663 | "dependencies": { 664 | "@libp2p/crypto": "^1.0.11", 665 | "@libp2p/interface-keychain": "^2.0.3", 666 | "@libp2p/interface-peer-id": "^2.0.1", 667 | "@libp2p/interfaces": "^3.3.1", 668 | "@libp2p/logger": "^2.0.5", 669 | "@libp2p/peer-id": "^2.0.1", 670 | "interface-datastore": "^8.0.0", 671 | "merge-options": "^3.0.4", 672 | "sanitize-filename": "^1.6.3", 673 | "uint8arrays": "^4.0.3" 674 | }, 675 | "engines": { 676 | "node": ">=16.0.0", 677 | "npm": ">=7.0.0" 678 | } 679 | }, 680 | "node_modules/@libp2p/logger": { 681 | "version": "2.0.7", 682 | "resolved": "https://registry.npmjs.org/@libp2p/logger/-/logger-2.0.7.tgz", 683 | "integrity": "sha512-Zp9C9lMNGfVFTMVc7NvxuxMvIE6gyxDapQc/TqZH02IuIDl1JpZyCgNILr0APd8wcUxwvwRXYNf3kQ0Lmz7tuQ==", 684 | "dependencies": { 685 | "@libp2p/interface-peer-id": "^2.0.0", 686 | "debug": "^4.3.3", 687 | "interface-datastore": "^8.0.0", 688 | "multiformats": "^11.0.0" 689 | }, 690 | "engines": { 691 | "node": ">=16.0.0", 692 | "npm": ">=7.0.0" 693 | } 694 | }, 695 | "node_modules/@libp2p/multistream-select": { 696 | "version": "3.1.4", 697 | "resolved": "https://registry.npmjs.org/@libp2p/multistream-select/-/multistream-select-3.1.4.tgz", 698 | "integrity": "sha512-9J4o4VDYxBeH8P/FReO0MzqWjcR26jdjdj0MjHaNF73gFAMn+ucX8+HMOJyP6LbTANJMGdCcertKyqXFphfsiQ==", 699 | "dependencies": { 700 | "@libp2p/interfaces": "^3.2.0", 701 | "@libp2p/logger": "^2.0.0", 702 | "abortable-iterator": "^4.0.2", 703 | "it-first": "^3.0.1", 704 | "it-handshake": "^4.1.2", 705 | "it-length-prefixed": "^9.0.0", 706 | "it-merge": "^3.0.0", 707 | "it-pipe": "^3.0.0", 708 | "it-pushable": "^3.1.0", 709 | "it-reader": "^6.0.1", 710 | "it-stream-types": "^1.0.4", 711 | "p-defer": "^4.0.0", 712 | "uint8arraylist": "^2.3.1", 713 | "uint8arrays": "^4.0.2" 714 | }, 715 | "engines": { 716 | "node": ">=16.0.0", 717 | "npm": ">=7.0.0" 718 | } 719 | }, 720 | "node_modules/@libp2p/multistream-select/node_modules/it-length-prefixed": { 721 | "version": "9.0.0", 722 | "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.0.tgz", 723 | "integrity": "sha512-LCne3R3wxxLv94GTA8ywIeopdyA+2oKXiWWo7g58sQHiD7d1A6WMuWCrwP+xv4i7CmSuR3aeHo66SJUgArLOyA==", 724 | "dependencies": { 725 | "err-code": "^3.0.1", 726 | "it-stream-types": "^1.0.5", 727 | "uint8-varint": "^1.0.1", 728 | "uint8arraylist": "^2.0.0", 729 | "uint8arrays": "^4.0.2" 730 | }, 731 | "engines": { 732 | "node": ">=16.0.0", 733 | "npm": ">=7.0.0" 734 | } 735 | }, 736 | "node_modules/@libp2p/multistream-select/node_modules/it-pipe": { 737 | "version": "3.0.1", 738 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", 739 | "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", 740 | "dependencies": { 741 | "it-merge": "^3.0.0", 742 | "it-pushable": "^3.1.2", 743 | "it-stream-types": "^2.0.1" 744 | }, 745 | "engines": { 746 | "node": ">=16.0.0", 747 | "npm": ">=7.0.0" 748 | } 749 | }, 750 | "node_modules/@libp2p/multistream-select/node_modules/it-pipe/node_modules/it-stream-types": { 751 | "version": "2.0.1", 752 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", 753 | "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", 754 | "engines": { 755 | "node": ">=16.0.0", 756 | "npm": ">=7.0.0" 757 | } 758 | }, 759 | "node_modules/@libp2p/peer-collections": { 760 | "version": "3.0.1", 761 | "resolved": "https://registry.npmjs.org/@libp2p/peer-collections/-/peer-collections-3.0.1.tgz", 762 | "integrity": "sha512-tJvCjFSKX76VacThVnN0XC4jnUeufYD2u9TxWJllSYnmmos/Lwhl4kdtEyZkKNlJKam+cBoUmODXzasdoPZgVg==", 763 | "dependencies": { 764 | "@libp2p/interface-peer-id": "^2.0.0", 765 | "@libp2p/peer-id": "^2.0.0" 766 | }, 767 | "engines": { 768 | "node": ">=16.0.0", 769 | "npm": ">=7.0.0" 770 | } 771 | }, 772 | "node_modules/@libp2p/peer-id": { 773 | "version": "2.0.3", 774 | "resolved": "https://registry.npmjs.org/@libp2p/peer-id/-/peer-id-2.0.3.tgz", 775 | "integrity": "sha512-eZX+5ByUAzh8DrfjCan0spZGpvF7SxEBz4tOPoBMBCuKJJLr+8EokBO/5E3ceIw04f5+lAcD3CO3bccuKomp3Q==", 776 | "dependencies": { 777 | "@libp2p/interface-peer-id": "^2.0.0", 778 | "@libp2p/interfaces": "^3.2.0", 779 | "multiformats": "^11.0.0", 780 | "uint8arrays": "^4.0.2" 781 | }, 782 | "engines": { 783 | "node": ">=16.0.0", 784 | "npm": ">=7.0.0" 785 | } 786 | }, 787 | "node_modules/@libp2p/peer-id-factory": { 788 | "version": "2.0.3", 789 | "resolved": "https://registry.npmjs.org/@libp2p/peer-id-factory/-/peer-id-factory-2.0.3.tgz", 790 | "integrity": "sha512-9pwVbfghiKuiC76Pue/+tI4PD7gnw1jGVcxYD+nhcRs8ABE7NLaB7nCm99cCtvmMNRnl2JqaGgZJXt8mnvAEuQ==", 791 | "dependencies": { 792 | "@libp2p/crypto": "^1.0.0", 793 | "@libp2p/interface-keys": "^1.0.2", 794 | "@libp2p/interface-peer-id": "^2.0.0", 795 | "@libp2p/peer-id": "^2.0.0", 796 | "multiformats": "^11.0.0", 797 | "protons-runtime": "^5.0.0", 798 | "uint8arraylist": "^2.0.0", 799 | "uint8arrays": "^4.0.2" 800 | }, 801 | "engines": { 802 | "node": ">=16.0.0", 803 | "npm": ">=7.0.0" 804 | } 805 | }, 806 | "node_modules/@libp2p/peer-record": { 807 | "version": "5.0.3", 808 | "resolved": "https://registry.npmjs.org/@libp2p/peer-record/-/peer-record-5.0.3.tgz", 809 | "integrity": "sha512-KnQR/NteL0xGKXd9rZo/W3ZT9kajmNy98/BOOlnMktkAL7jCfHy2z/laDU+rSttTy1TYZ15zPzXtnm3813ECmg==", 810 | "dependencies": { 811 | "@libp2p/crypto": "^1.0.11", 812 | "@libp2p/interface-peer-id": "^2.0.0", 813 | "@libp2p/interface-record": "^2.0.1", 814 | "@libp2p/interfaces": "^3.2.0", 815 | "@libp2p/peer-id": "^2.0.0", 816 | "@libp2p/utils": "^3.0.0", 817 | "@multiformats/multiaddr": "^12.0.0", 818 | "protons-runtime": "^5.0.0", 819 | "uint8-varint": "^1.0.2", 820 | "uint8arraylist": "^2.1.0", 821 | "uint8arrays": "^4.0.2" 822 | }, 823 | "engines": { 824 | "node": ">=16.0.0", 825 | "npm": ">=7.0.0" 826 | } 827 | }, 828 | "node_modules/@libp2p/peer-store": { 829 | "version": "7.0.2", 830 | "resolved": "https://registry.npmjs.org/@libp2p/peer-store/-/peer-store-7.0.2.tgz", 831 | "integrity": "sha512-8rwJvBnBCzrUytbA+8m2xzGE/zTE32EplMCpKHI1Fu0fwfboft9/g2mxzO5Bfg5wZEULWFkJtFljneLLOr9JRQ==", 832 | "dependencies": { 833 | "@libp2p/interface-peer-id": "^2.0.0", 834 | "@libp2p/interface-peer-info": "^1.0.3", 835 | "@libp2p/interface-peer-store": "^1.2.2", 836 | "@libp2p/interface-record": "^2.0.1", 837 | "@libp2p/interfaces": "^3.2.0", 838 | "@libp2p/logger": "^2.0.0", 839 | "@libp2p/peer-id": "^2.0.0", 840 | "@libp2p/peer-record": "^5.0.0", 841 | "@multiformats/multiaddr": "^12.0.0", 842 | "interface-datastore": "^8.0.0", 843 | "mortice": "^3.0.0", 844 | "multiformats": "^11.0.0", 845 | "protons-runtime": "^5.0.0", 846 | "uint8arraylist": "^2.1.1", 847 | "uint8arrays": "^4.0.2" 848 | }, 849 | "engines": { 850 | "node": ">=16.0.0", 851 | "npm": ">=7.0.0" 852 | } 853 | }, 854 | "node_modules/@libp2p/record": { 855 | "version": "3.0.3", 856 | "resolved": "https://registry.npmjs.org/@libp2p/record/-/record-3.0.3.tgz", 857 | "integrity": "sha512-YVVOu5Zk7oq3/7ItWJYhOuByi6uFUn7KqftlJP4WcW2UKm9ATNyhi6oZq/s3HE7zLmGthNGgtLSW1sUBoiXNsg==", 858 | "dependencies": { 859 | "@libp2p/interface-dht": "^2.0.0", 860 | "@libp2p/interfaces": "^3.2.0", 861 | "multiformats": "^11.0.0", 862 | "protons-runtime": "^5.0.0", 863 | "uint8arraylist": "^2.1.1", 864 | "uint8arrays": "^4.0.2" 865 | }, 866 | "engines": { 867 | "node": ">=16.0.0", 868 | "npm": ">=7.0.0" 869 | } 870 | }, 871 | "node_modules/@libp2p/tcp": { 872 | "version": "6.2.1", 873 | "resolved": "https://registry.npmjs.org/@libp2p/tcp/-/tcp-6.2.1.tgz", 874 | "integrity": "sha512-XHephji2C2lCUWd8ZSjap6PxHvbWibH6t6j6h7XjaPoL+9IfB2V7N4y1BSldH0yrFJYjNORwPbyveqYzBc9pQw==", 875 | "dependencies": { 876 | "@libp2p/interface-connection": "^4.0.0", 877 | "@libp2p/interface-metrics": "^4.0.0", 878 | "@libp2p/interface-transport": "^2.0.0", 879 | "@libp2p/interfaces": "^3.2.0", 880 | "@libp2p/logger": "^2.0.0", 881 | "@libp2p/utils": "^3.0.2", 882 | "@multiformats/mafmt": "^12.0.0", 883 | "@multiformats/multiaddr": "^12.0.0", 884 | "stream-to-it": "^0.2.2" 885 | }, 886 | "engines": { 887 | "node": ">=16.0.0", 888 | "npm": ">=7.0.0" 889 | } 890 | }, 891 | "node_modules/@libp2p/topology": { 892 | "version": "4.0.1", 893 | "resolved": "https://registry.npmjs.org/@libp2p/topology/-/topology-4.0.1.tgz", 894 | "integrity": "sha512-wcToZU3o55nTPuN+yEpAublGzomGfxEAu8snaGeZS0f6ObzaQXqPgZvD5qpiQ8yOOVjR+IiNEjZJiuqNShHnaA==", 895 | "dependencies": { 896 | "@libp2p/interface-peer-id": "^2.0.0", 897 | "@libp2p/interface-registrar": "^2.0.3", 898 | "@libp2p/logger": "^2.0.1", 899 | "it-all": "^2.0.0" 900 | }, 901 | "engines": { 902 | "node": ">=16.0.0", 903 | "npm": ">=7.0.0" 904 | } 905 | }, 906 | "node_modules/@libp2p/topology/node_modules/it-all": { 907 | "version": "2.0.1", 908 | "resolved": "https://registry.npmjs.org/it-all/-/it-all-2.0.1.tgz", 909 | "integrity": "sha512-9UuJcCRZsboz+HBQTNOau80Dw+ryGaHYFP/cPYzFBJBFcfDathMYnhHk4t52en9+fcyDGPTdLB+lFc1wzQIroA==", 910 | "engines": { 911 | "node": ">=16.0.0", 912 | "npm": ">=7.0.0" 913 | } 914 | }, 915 | "node_modules/@libp2p/tracked-map": { 916 | "version": "3.0.2", 917 | "resolved": "https://registry.npmjs.org/@libp2p/tracked-map/-/tracked-map-3.0.2.tgz", 918 | "integrity": "sha512-mtsZWf2ntttuCrmEIro2p1ceCAaKde2TzT/99DZlkGdJN/Mo1jZgXq7ltZjWc8G3DAlgs+0ygjMzNKcZzAveuQ==", 919 | "dependencies": { 920 | "@libp2p/interface-metrics": "^4.0.0" 921 | }, 922 | "engines": { 923 | "node": ">=16.0.0", 924 | "npm": ">=7.0.0" 925 | } 926 | }, 927 | "node_modules/@libp2p/utils": { 928 | "version": "3.0.8", 929 | "resolved": "https://registry.npmjs.org/@libp2p/utils/-/utils-3.0.8.tgz", 930 | "integrity": "sha512-Fok2RJyzmKx2YNNvhl81N6SEBKrRZVS2B0lY7pgZclv4E1AfeVka3YcOl1zEUo44ftCx0pSX3WWOkHzvWcjjEA==", 931 | "dependencies": { 932 | "@achingbrain/ip-address": "^8.1.0", 933 | "@libp2p/interface-connection": "^4.0.0", 934 | "@libp2p/interface-peer-store": "^1.2.1", 935 | "@libp2p/interfaces": "^3.2.0", 936 | "@libp2p/logger": "^2.0.0", 937 | "@multiformats/multiaddr": "^12.0.0", 938 | "abortable-iterator": "^4.0.2", 939 | "is-loopback-addr": "^2.0.1", 940 | "it-stream-types": "^1.0.4", 941 | "private-ip": "^3.0.0", 942 | "uint8arraylist": "^2.3.2" 943 | }, 944 | "engines": { 945 | "node": ">=16.0.0", 946 | "npm": ">=7.0.0" 947 | } 948 | }, 949 | "node_modules/@multiformats/mafmt": { 950 | "version": "12.1.0", 951 | "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-12.1.0.tgz", 952 | "integrity": "sha512-P3+cKi0EqqYGoF8IMK7dd8PFlanbvzzhem+tkcjrjGAPV5sVam2VfFAFNyzLTOP8dS/5Rf5pQ6LC0k6cO8WF5w==", 953 | "dependencies": { 954 | "@multiformats/multiaddr": "^12.0.0" 955 | }, 956 | "engines": { 957 | "node": ">=16.0.0", 958 | "npm": ">=7.0.0" 959 | } 960 | }, 961 | "node_modules/@multiformats/multiaddr": { 962 | "version": "12.1.2", 963 | "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.2.tgz", 964 | "integrity": "sha512-EYYUEAddjWoyig5Dcu+JGq2JdpEpT2tW/K4sefdDWVSQW+rfnABfz1rx/KnrituB20jC8aPBcT62kISTZ3oL5A==", 965 | "dependencies": { 966 | "@chainsafe/is-ip": "^2.0.1", 967 | "@chainsafe/netmask": "^2.0.0", 968 | "@libp2p/interfaces": "^3.3.1", 969 | "dns-over-http-resolver": "^2.1.0", 970 | "multiformats": "^11.0.0", 971 | "uint8arrays": "^4.0.2", 972 | "varint": "^6.0.0" 973 | }, 974 | "engines": { 975 | "node": ">=16.0.0", 976 | "npm": ">=7.0.0" 977 | } 978 | }, 979 | "node_modules/@noble/ed25519": { 980 | "version": "1.7.3", 981 | "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", 982 | "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==", 983 | "funding": [ 984 | { 985 | "type": "individual", 986 | "url": "https://paulmillr.com/funding/" 987 | } 988 | ] 989 | }, 990 | "node_modules/@noble/secp256k1": { 991 | "version": "1.7.1", 992 | "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", 993 | "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", 994 | "funding": [ 995 | { 996 | "type": "individual", 997 | "url": "https://paulmillr.com/funding/" 998 | } 999 | ] 1000 | }, 1001 | "node_modules/@protobufjs/aspromise": { 1002 | "version": "1.1.2", 1003 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 1004 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 1005 | }, 1006 | "node_modules/@protobufjs/base64": { 1007 | "version": "1.1.2", 1008 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 1009 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 1010 | }, 1011 | "node_modules/@protobufjs/codegen": { 1012 | "version": "2.0.4", 1013 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 1014 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 1015 | }, 1016 | "node_modules/@protobufjs/eventemitter": { 1017 | "version": "1.1.0", 1018 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 1019 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 1020 | }, 1021 | "node_modules/@protobufjs/fetch": { 1022 | "version": "1.1.0", 1023 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 1024 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 1025 | "dependencies": { 1026 | "@protobufjs/aspromise": "^1.1.1", 1027 | "@protobufjs/inquire": "^1.1.0" 1028 | } 1029 | }, 1030 | "node_modules/@protobufjs/float": { 1031 | "version": "1.0.2", 1032 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 1033 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 1034 | }, 1035 | "node_modules/@protobufjs/inquire": { 1036 | "version": "1.1.0", 1037 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 1038 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 1039 | }, 1040 | "node_modules/@protobufjs/path": { 1041 | "version": "1.1.2", 1042 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 1043 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 1044 | }, 1045 | "node_modules/@protobufjs/pool": { 1046 | "version": "1.1.0", 1047 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 1048 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 1049 | }, 1050 | "node_modules/@protobufjs/utf8": { 1051 | "version": "1.1.0", 1052 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 1053 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 1054 | }, 1055 | "node_modules/@stablelib/aead": { 1056 | "version": "1.0.1", 1057 | "resolved": "https://registry.npmjs.org/@stablelib/aead/-/aead-1.0.1.tgz", 1058 | "integrity": "sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==" 1059 | }, 1060 | "node_modules/@stablelib/binary": { 1061 | "version": "1.0.1", 1062 | "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", 1063 | "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", 1064 | "dependencies": { 1065 | "@stablelib/int": "^1.0.1" 1066 | } 1067 | }, 1068 | "node_modules/@stablelib/bytes": { 1069 | "version": "1.0.1", 1070 | "resolved": "https://registry.npmjs.org/@stablelib/bytes/-/bytes-1.0.1.tgz", 1071 | "integrity": "sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==" 1072 | }, 1073 | "node_modules/@stablelib/chacha": { 1074 | "version": "1.0.1", 1075 | "resolved": "https://registry.npmjs.org/@stablelib/chacha/-/chacha-1.0.1.tgz", 1076 | "integrity": "sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==", 1077 | "dependencies": { 1078 | "@stablelib/binary": "^1.0.1", 1079 | "@stablelib/wipe": "^1.0.1" 1080 | } 1081 | }, 1082 | "node_modules/@stablelib/chacha20poly1305": { 1083 | "version": "1.0.1", 1084 | "resolved": "https://registry.npmjs.org/@stablelib/chacha20poly1305/-/chacha20poly1305-1.0.1.tgz", 1085 | "integrity": "sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==", 1086 | "dependencies": { 1087 | "@stablelib/aead": "^1.0.1", 1088 | "@stablelib/binary": "^1.0.1", 1089 | "@stablelib/chacha": "^1.0.1", 1090 | "@stablelib/constant-time": "^1.0.1", 1091 | "@stablelib/poly1305": "^1.0.1", 1092 | "@stablelib/wipe": "^1.0.1" 1093 | } 1094 | }, 1095 | "node_modules/@stablelib/constant-time": { 1096 | "version": "1.0.1", 1097 | "resolved": "https://registry.npmjs.org/@stablelib/constant-time/-/constant-time-1.0.1.tgz", 1098 | "integrity": "sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==" 1099 | }, 1100 | "node_modules/@stablelib/hash": { 1101 | "version": "1.0.1", 1102 | "resolved": "https://registry.npmjs.org/@stablelib/hash/-/hash-1.0.1.tgz", 1103 | "integrity": "sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==" 1104 | }, 1105 | "node_modules/@stablelib/hkdf": { 1106 | "version": "1.0.1", 1107 | "resolved": "https://registry.npmjs.org/@stablelib/hkdf/-/hkdf-1.0.1.tgz", 1108 | "integrity": "sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==", 1109 | "dependencies": { 1110 | "@stablelib/hash": "^1.0.1", 1111 | "@stablelib/hmac": "^1.0.1", 1112 | "@stablelib/wipe": "^1.0.1" 1113 | } 1114 | }, 1115 | "node_modules/@stablelib/hmac": { 1116 | "version": "1.0.1", 1117 | "resolved": "https://registry.npmjs.org/@stablelib/hmac/-/hmac-1.0.1.tgz", 1118 | "integrity": "sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==", 1119 | "dependencies": { 1120 | "@stablelib/constant-time": "^1.0.1", 1121 | "@stablelib/hash": "^1.0.1", 1122 | "@stablelib/wipe": "^1.0.1" 1123 | } 1124 | }, 1125 | "node_modules/@stablelib/int": { 1126 | "version": "1.0.1", 1127 | "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", 1128 | "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==" 1129 | }, 1130 | "node_modules/@stablelib/keyagreement": { 1131 | "version": "1.0.1", 1132 | "resolved": "https://registry.npmjs.org/@stablelib/keyagreement/-/keyagreement-1.0.1.tgz", 1133 | "integrity": "sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==", 1134 | "dependencies": { 1135 | "@stablelib/bytes": "^1.0.1" 1136 | } 1137 | }, 1138 | "node_modules/@stablelib/poly1305": { 1139 | "version": "1.0.1", 1140 | "resolved": "https://registry.npmjs.org/@stablelib/poly1305/-/poly1305-1.0.1.tgz", 1141 | "integrity": "sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==", 1142 | "dependencies": { 1143 | "@stablelib/constant-time": "^1.0.1", 1144 | "@stablelib/wipe": "^1.0.1" 1145 | } 1146 | }, 1147 | "node_modules/@stablelib/random": { 1148 | "version": "1.0.2", 1149 | "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.2.tgz", 1150 | "integrity": "sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==", 1151 | "dependencies": { 1152 | "@stablelib/binary": "^1.0.1", 1153 | "@stablelib/wipe": "^1.0.1" 1154 | } 1155 | }, 1156 | "node_modules/@stablelib/sha256": { 1157 | "version": "1.0.1", 1158 | "resolved": "https://registry.npmjs.org/@stablelib/sha256/-/sha256-1.0.1.tgz", 1159 | "integrity": "sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==", 1160 | "dependencies": { 1161 | "@stablelib/binary": "^1.0.1", 1162 | "@stablelib/hash": "^1.0.1", 1163 | "@stablelib/wipe": "^1.0.1" 1164 | } 1165 | }, 1166 | "node_modules/@stablelib/wipe": { 1167 | "version": "1.0.1", 1168 | "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", 1169 | "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==" 1170 | }, 1171 | "node_modules/@stablelib/x25519": { 1172 | "version": "1.0.3", 1173 | "resolved": "https://registry.npmjs.org/@stablelib/x25519/-/x25519-1.0.3.tgz", 1174 | "integrity": "sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==", 1175 | "dependencies": { 1176 | "@stablelib/keyagreement": "^1.0.1", 1177 | "@stablelib/random": "^1.0.2", 1178 | "@stablelib/wipe": "^1.0.1" 1179 | } 1180 | }, 1181 | "node_modules/@types/node": { 1182 | "version": "18.15.11", 1183 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", 1184 | "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" 1185 | }, 1186 | "node_modules/@types/retry": { 1187 | "version": "0.12.1", 1188 | "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", 1189 | "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" 1190 | }, 1191 | "node_modules/@vascosantos/moving-average": { 1192 | "version": "1.1.0", 1193 | "resolved": "https://registry.npmjs.org/@vascosantos/moving-average/-/moving-average-1.1.0.tgz", 1194 | "integrity": "sha512-MVEJ4vWAPNbrGLjz7ITnHYg+YXZ6ijAqtH5/cHwSoCpbvuJ98aLXwFfPKAUfZpJMQR5uXB58UJajbY130IRF/w==" 1195 | }, 1196 | "node_modules/abortable-iterator": { 1197 | "version": "4.0.2", 1198 | "resolved": "https://registry.npmjs.org/abortable-iterator/-/abortable-iterator-4.0.2.tgz", 1199 | "integrity": "sha512-SJGELER5yXr9v3kiL6mT5RZ1qlyJ9hV4nm34+vfsdIM1lp3zENQvpsqKgykpFLgRMUn3lzlizLTpiOASW05/+g==", 1200 | "dependencies": { 1201 | "get-iterator": "^2.0.0", 1202 | "it-stream-types": "^1.0.3" 1203 | } 1204 | }, 1205 | "node_modules/any-signal": { 1206 | "version": "4.1.1", 1207 | "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-4.1.1.tgz", 1208 | "integrity": "sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==", 1209 | "engines": { 1210 | "node": ">=16.0.0", 1211 | "npm": ">=7.0.0" 1212 | } 1213 | }, 1214 | "node_modules/blockstore-core": { 1215 | "version": "4.1.0", 1216 | "resolved": "https://registry.npmjs.org/blockstore-core/-/blockstore-core-4.1.0.tgz", 1217 | "integrity": "sha512-CxlavQ6Yri8Se/l7F6ug8AK9StcJK42UdnJQua3XlwoQUVGSuIRnY+q2wqFzuCAuv4m4a5pp/JH29GliV4EEgQ==", 1218 | "dependencies": { 1219 | "err-code": "^3.0.1", 1220 | "interface-blockstore": "^5.0.0", 1221 | "interface-store": "^5.0.0", 1222 | "multiformats": "^11.0.2" 1223 | }, 1224 | "engines": { 1225 | "node": ">=16.0.0", 1226 | "npm": ">=7.0.0" 1227 | } 1228 | }, 1229 | "node_modules/busboy": { 1230 | "version": "1.6.0", 1231 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 1232 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 1233 | "dependencies": { 1234 | "streamsearch": "^1.1.0" 1235 | }, 1236 | "engines": { 1237 | "node": ">=10.16.0" 1238 | } 1239 | }, 1240 | "node_modules/byte-access": { 1241 | "version": "1.0.1", 1242 | "resolved": "https://registry.npmjs.org/byte-access/-/byte-access-1.0.1.tgz", 1243 | "integrity": "sha512-GKYa+lvxnzhgHWj9X+LCsQ4s2/C5uvib573eAOiQKywXMkzFFErY2+yQdzmdE5iWVpmqecsRx3bOtOY4/1eINw==", 1244 | "dependencies": { 1245 | "uint8arraylist": "^2.0.0" 1246 | }, 1247 | "engines": { 1248 | "node": ">=16.0.0", 1249 | "npm": ">=7.0.0" 1250 | } 1251 | }, 1252 | "node_modules/cborg": { 1253 | "version": "1.10.1", 1254 | "resolved": "https://registry.npmjs.org/cborg/-/cborg-1.10.1.tgz", 1255 | "integrity": "sha512-et6Qm8MOUY2kCWa5GKk2MlBVoPjHv0hQBmlzI/Z7+5V3VJCeIkGehIB3vWknNsm2kOkAIs6wEKJFJo8luWQQ/w==", 1256 | "bin": { 1257 | "cborg": "cli.js" 1258 | } 1259 | }, 1260 | "node_modules/cross-spawn": { 1261 | "version": "7.0.3", 1262 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1263 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1264 | "dependencies": { 1265 | "path-key": "^3.1.0", 1266 | "shebang-command": "^2.0.0", 1267 | "which": "^2.0.1" 1268 | }, 1269 | "engines": { 1270 | "node": ">= 8" 1271 | } 1272 | }, 1273 | "node_modules/datastore-core": { 1274 | "version": "9.1.1", 1275 | "resolved": "https://registry.npmjs.org/datastore-core/-/datastore-core-9.1.1.tgz", 1276 | "integrity": "sha512-Way+QZdrlAjLOHm7hc3r5mEIfmdkZCtb/bAWv+Mhp9FGQKSyaf8yL5oOcmp3pv+WrqdFYB7qYx7xe/FX3+zcjw==", 1277 | "dependencies": { 1278 | "@libp2p/logger": "^2.0.0", 1279 | "err-code": "^3.0.1", 1280 | "interface-store": "^5.0.0", 1281 | "it-all": "^3.0.1", 1282 | "it-drain": "^3.0.1", 1283 | "it-filter": "^3.0.0", 1284 | "it-map": "^3.0.1", 1285 | "it-merge": "^3.0.0", 1286 | "it-pipe": "^3.0.0", 1287 | "it-pushable": "^3.0.0", 1288 | "it-sort": "^3.0.1", 1289 | "it-take": "^3.0.1", 1290 | "uint8arrays": "^4.0.2" 1291 | }, 1292 | "engines": { 1293 | "node": ">=16.0.0", 1294 | "npm": ">=7.0.0" 1295 | } 1296 | }, 1297 | "node_modules/datastore-core/node_modules/it-pipe": { 1298 | "version": "3.0.1", 1299 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", 1300 | "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", 1301 | "dependencies": { 1302 | "it-merge": "^3.0.0", 1303 | "it-pushable": "^3.1.2", 1304 | "it-stream-types": "^2.0.1" 1305 | }, 1306 | "engines": { 1307 | "node": ">=16.0.0", 1308 | "npm": ">=7.0.0" 1309 | } 1310 | }, 1311 | "node_modules/datastore-core/node_modules/it-stream-types": { 1312 | "version": "2.0.1", 1313 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", 1314 | "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", 1315 | "engines": { 1316 | "node": ">=16.0.0", 1317 | "npm": ">=7.0.0" 1318 | } 1319 | }, 1320 | "node_modules/debug": { 1321 | "version": "4.3.4", 1322 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1323 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1324 | "dependencies": { 1325 | "ms": "2.1.2" 1326 | }, 1327 | "engines": { 1328 | "node": ">=6.0" 1329 | }, 1330 | "peerDependenciesMeta": { 1331 | "supports-color": { 1332 | "optional": true 1333 | } 1334 | } 1335 | }, 1336 | "node_modules/default-gateway": { 1337 | "version": "6.0.3", 1338 | "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", 1339 | "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", 1340 | "dependencies": { 1341 | "execa": "^5.0.0" 1342 | }, 1343 | "engines": { 1344 | "node": ">= 10" 1345 | } 1346 | }, 1347 | "node_modules/dns-over-http-resolver": { 1348 | "version": "2.1.1", 1349 | "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-2.1.1.tgz", 1350 | "integrity": "sha512-Lm/eXB7yAQLJ5WxlBGwYfBY7utduXPZykcSmcG6K7ozM0wrZFvxZavhT6PqI0kd/5CUTfev/RrEFQqyU4CGPew==", 1351 | "dependencies": { 1352 | "debug": "^4.3.1", 1353 | "native-fetch": "^4.0.2", 1354 | "receptacle": "^1.3.2", 1355 | "undici": "^5.12.0" 1356 | }, 1357 | "engines": { 1358 | "node": ">=16.0.0", 1359 | "npm": ">=7.0.0" 1360 | } 1361 | }, 1362 | "node_modules/err-code": { 1363 | "version": "3.0.1", 1364 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", 1365 | "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" 1366 | }, 1367 | "node_modules/event-iterator": { 1368 | "version": "2.0.0", 1369 | "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", 1370 | "integrity": "sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==" 1371 | }, 1372 | "node_modules/eventemitter3": { 1373 | "version": "4.0.7", 1374 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 1375 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 1376 | }, 1377 | "node_modules/events": { 1378 | "version": "3.3.0", 1379 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1380 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1381 | "engines": { 1382 | "node": ">=0.8.x" 1383 | } 1384 | }, 1385 | "node_modules/execa": { 1386 | "version": "5.1.1", 1387 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1388 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1389 | "dependencies": { 1390 | "cross-spawn": "^7.0.3", 1391 | "get-stream": "^6.0.0", 1392 | "human-signals": "^2.1.0", 1393 | "is-stream": "^2.0.0", 1394 | "merge-stream": "^2.0.0", 1395 | "npm-run-path": "^4.0.1", 1396 | "onetime": "^5.1.2", 1397 | "signal-exit": "^3.0.3", 1398 | "strip-final-newline": "^2.0.0" 1399 | }, 1400 | "engines": { 1401 | "node": ">=10" 1402 | }, 1403 | "funding": { 1404 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1405 | } 1406 | }, 1407 | "node_modules/fast-fifo": { 1408 | "version": "1.2.0", 1409 | "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.2.0.tgz", 1410 | "integrity": "sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg==" 1411 | }, 1412 | "node_modules/freeport-promise": { 1413 | "version": "2.0.0", 1414 | "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", 1415 | "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", 1416 | "engines": { 1417 | "node": ">=16.0.0", 1418 | "npm": ">=7.0.0" 1419 | } 1420 | }, 1421 | "node_modules/get-iterator": { 1422 | "version": "2.0.0", 1423 | "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-2.0.0.tgz", 1424 | "integrity": "sha512-BDJawD5PU2gZv6Vlp8O28H4GnZcsr3h9gZUvnAP5xXP3WOy/QAoOsyMepSkw21jur+4t5Vppde72ChjhTIzxzg==" 1425 | }, 1426 | "node_modules/get-stream": { 1427 | "version": "6.0.1", 1428 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1429 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1430 | "engines": { 1431 | "node": ">=10" 1432 | }, 1433 | "funding": { 1434 | "url": "https://github.com/sponsors/sindresorhus" 1435 | } 1436 | }, 1437 | "node_modules/hashlru": { 1438 | "version": "2.3.0", 1439 | "resolved": "https://registry.npmjs.org/hashlru/-/hashlru-2.3.0.tgz", 1440 | "integrity": "sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==" 1441 | }, 1442 | "node_modules/helia": { 1443 | "version": "1.0.3", 1444 | "resolved": "https://registry.npmjs.org/helia/-/helia-1.0.3.tgz", 1445 | "integrity": "sha512-+sTFIVRvlgMaOE1CZ9nFGIiT6bWQmVZFBnlbM3oB/yBollS58foKNG5llMngKK/oEHzgYIgThmKrEYvkAhbMWQ==", 1446 | "dependencies": { 1447 | "@helia/interface": "^1.0.0", 1448 | "@ipld/dag-pb": "^4.0.2", 1449 | "@libp2p/interface-libp2p": "^1.1.0", 1450 | "@libp2p/interfaces": "^3.3.1", 1451 | "@libp2p/logger": "^2.0.5", 1452 | "blockstore-core": "^4.0.0", 1453 | "cborg": "^1.10.0", 1454 | "datastore-core": "^9.0.0", 1455 | "interface-blockstore": "^5.0.0", 1456 | "interface-datastore": "^8.0.0", 1457 | "interface-store": "^5.0.1", 1458 | "ipfs-bitswap": "^17.0.0", 1459 | "it-all": "^3.0.1", 1460 | "it-drain": "^3.0.1", 1461 | "it-filter": "^3.0.1", 1462 | "it-foreach": "^2.0.2", 1463 | "mortice": "^3.0.1", 1464 | "multiformats": "^11.0.1", 1465 | "p-defer": "^4.0.0", 1466 | "p-queue": "^7.3.4", 1467 | "progress-events": "^1.0.0", 1468 | "uint8arrays": "^4.0.3" 1469 | }, 1470 | "engines": { 1471 | "node": ">=16.0.0", 1472 | "npm": ">=7.0.0" 1473 | } 1474 | }, 1475 | "node_modules/human-signals": { 1476 | "version": "2.1.0", 1477 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1478 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1479 | "engines": { 1480 | "node": ">=10.17.0" 1481 | } 1482 | }, 1483 | "node_modules/interface-blockstore": { 1484 | "version": "5.2.0", 1485 | "resolved": "https://registry.npmjs.org/interface-blockstore/-/interface-blockstore-5.2.0.tgz", 1486 | "integrity": "sha512-lLW6fNP3PkBKghK9BsLuV8VMquL/o2lInomrTUizY/p4n7vxzVn3YT7qGTHywZzCcMIBeGMneDApGe21TNkg+g==", 1487 | "dependencies": { 1488 | "interface-store": "^5.0.0", 1489 | "multiformats": "^11.0.2" 1490 | }, 1491 | "engines": { 1492 | "node": ">=16.0.0", 1493 | "npm": ">=7.0.0" 1494 | } 1495 | }, 1496 | "node_modules/interface-datastore": { 1497 | "version": "8.2.0", 1498 | "resolved": "https://registry.npmjs.org/interface-datastore/-/interface-datastore-8.2.0.tgz", 1499 | "integrity": "sha512-rDMAcpCGxWMubRk2YQuSEHl11bc0xcZeBZzfLvqhoZJdByUWeo7YDJUdgyRKgD6liGXVYirtDkFU9nyn9xl2hg==", 1500 | "dependencies": { 1501 | "interface-store": "^5.0.0", 1502 | "nanoid": "^4.0.0", 1503 | "uint8arrays": "^4.0.2" 1504 | }, 1505 | "engines": { 1506 | "node": ">=16.0.0", 1507 | "npm": ">=7.0.0" 1508 | } 1509 | }, 1510 | "node_modules/interface-store": { 1511 | "version": "5.1.0", 1512 | "resolved": "https://registry.npmjs.org/interface-store/-/interface-store-5.1.0.tgz", 1513 | "integrity": "sha512-mjUwX3XSoreoxCS3sXS3pSRsGnUjl9T06KBqt/T7AgE9Sgp4diH64ZyURJKnj2T5WmCvTbC0Dm+mwQV5hfLSBQ==", 1514 | "engines": { 1515 | "node": ">=16.0.0", 1516 | "npm": ">=7.0.0" 1517 | } 1518 | }, 1519 | "node_modules/ip-regex": { 1520 | "version": "5.0.0", 1521 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", 1522 | "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", 1523 | "engines": { 1524 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1525 | }, 1526 | "funding": { 1527 | "url": "https://github.com/sponsors/sindresorhus" 1528 | } 1529 | }, 1530 | "node_modules/ipaddr.js": { 1531 | "version": "2.0.1", 1532 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", 1533 | "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", 1534 | "engines": { 1535 | "node": ">= 10" 1536 | } 1537 | }, 1538 | "node_modules/ipfs-bitswap": { 1539 | "version": "17.0.2", 1540 | "resolved": "https://registry.npmjs.org/ipfs-bitswap/-/ipfs-bitswap-17.0.2.tgz", 1541 | "integrity": "sha512-bRTO/I2raqA5apz3XkW5uuzooncrjHDVeeWLHk41LibmUUJaM7ZfP6Yzk+y/zSWvvf3/3kqwjM+rLIxIdyYH2w==", 1542 | "dependencies": { 1543 | "@libp2p/interface-connection": "^3.0.1", 1544 | "@libp2p/interface-libp2p": "^1.1.1", 1545 | "@libp2p/interface-peer-id": "^2.0.0", 1546 | "@libp2p/interface-peer-info": "^1.0.8", 1547 | "@libp2p/interface-registrar": "^2.0.8", 1548 | "@libp2p/interfaces": "^3.2.0", 1549 | "@libp2p/logger": "^2.0.5", 1550 | "@libp2p/topology": "^4.0.0", 1551 | "@libp2p/tracked-map": "^3.0.0", 1552 | "@multiformats/multiaddr": "^12.1.0", 1553 | "@vascosantos/moving-average": "^1.1.0", 1554 | "abortable-iterator": "^4.0.2", 1555 | "any-signal": "^3.0.0", 1556 | "blockstore-core": "^4.0.0", 1557 | "events": "^3.3.0", 1558 | "interface-blockstore": "^5.0.0", 1559 | "interface-store": "^5.1.0", 1560 | "it-foreach": "^2.0.2", 1561 | "it-length-prefixed": "^9.0.0", 1562 | "it-map": "^3.0.2", 1563 | "it-pipe": "^3.0.1", 1564 | "it-take": "^3.0.1", 1565 | "just-debounce-it": "^3.0.1", 1566 | "multiformats": "^11.0.0", 1567 | "progress-events": "^1.0.0", 1568 | "protons-runtime": "^5.0.0", 1569 | "timeout-abort-controller": "^3.0.0", 1570 | "uint8arraylist": "^2.4.3", 1571 | "uint8arrays": "^4.0.2", 1572 | "varint": "^6.0.0", 1573 | "varint-decoder": "^1.0.0" 1574 | }, 1575 | "engines": { 1576 | "node": ">=16.0.0", 1577 | "npm": ">=7.0.0" 1578 | } 1579 | }, 1580 | "node_modules/ipfs-bitswap/node_modules/@libp2p/interface-connection": { 1581 | "version": "3.1.1", 1582 | "resolved": "https://registry.npmjs.org/@libp2p/interface-connection/-/interface-connection-3.1.1.tgz", 1583 | "integrity": "sha512-+hxfYLv4jf+MruQEJiJeIyo/wI33/53wRL0XJTkxwQQPAkLHfZWCUY4kY9sXALd3+ASjXAENvJj9VvzZTlkRDQ==", 1584 | "dependencies": { 1585 | "@libp2p/interface-peer-id": "^2.0.0", 1586 | "@libp2p/interfaces": "^3.0.0", 1587 | "@multiformats/multiaddr": "^12.0.0", 1588 | "it-stream-types": "^1.0.4", 1589 | "uint8arraylist": "^2.1.2" 1590 | }, 1591 | "engines": { 1592 | "node": ">=16.0.0", 1593 | "npm": ">=7.0.0" 1594 | } 1595 | }, 1596 | "node_modules/ipfs-bitswap/node_modules/any-signal": { 1597 | "version": "3.0.1", 1598 | "resolved": "https://registry.npmjs.org/any-signal/-/any-signal-3.0.1.tgz", 1599 | "integrity": "sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==" 1600 | }, 1601 | "node_modules/ipfs-bitswap/node_modules/it-length-prefixed": { 1602 | "version": "9.0.0", 1603 | "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.0.tgz", 1604 | "integrity": "sha512-LCne3R3wxxLv94GTA8ywIeopdyA+2oKXiWWo7g58sQHiD7d1A6WMuWCrwP+xv4i7CmSuR3aeHo66SJUgArLOyA==", 1605 | "dependencies": { 1606 | "err-code": "^3.0.1", 1607 | "it-stream-types": "^1.0.5", 1608 | "uint8-varint": "^1.0.1", 1609 | "uint8arraylist": "^2.0.0", 1610 | "uint8arrays": "^4.0.2" 1611 | }, 1612 | "engines": { 1613 | "node": ">=16.0.0", 1614 | "npm": ">=7.0.0" 1615 | } 1616 | }, 1617 | "node_modules/ipfs-bitswap/node_modules/it-pipe": { 1618 | "version": "3.0.1", 1619 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", 1620 | "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", 1621 | "dependencies": { 1622 | "it-merge": "^3.0.0", 1623 | "it-pushable": "^3.1.2", 1624 | "it-stream-types": "^2.0.1" 1625 | }, 1626 | "engines": { 1627 | "node": ">=16.0.0", 1628 | "npm": ">=7.0.0" 1629 | } 1630 | }, 1631 | "node_modules/ipfs-bitswap/node_modules/it-pipe/node_modules/it-stream-types": { 1632 | "version": "2.0.1", 1633 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", 1634 | "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", 1635 | "engines": { 1636 | "node": ">=16.0.0", 1637 | "npm": ">=7.0.0" 1638 | } 1639 | }, 1640 | "node_modules/ipns": { 1641 | "version": "6.0.0", 1642 | "resolved": "https://registry.npmjs.org/ipns/-/ipns-6.0.0.tgz", 1643 | "integrity": "sha512-ITWDdNcyNMRZTFrPrXnSUIdvLGSyJqYRVUEsHoU/KdiOMREXISDC5WbonbApfJiOH5M32r+ghC2MHFxfAXalig==", 1644 | "dependencies": { 1645 | "@libp2p/crypto": "^1.0.0", 1646 | "@libp2p/interface-dht": "^2.0.0", 1647 | "@libp2p/interface-keys": "^1.0.3", 1648 | "@libp2p/interface-peer-id": "^2.0.0", 1649 | "@libp2p/logger": "^2.0.0", 1650 | "@libp2p/peer-id": "^2.0.0", 1651 | "cborg": "^1.3.3", 1652 | "err-code": "^3.0.1", 1653 | "interface-datastore": "^8.1.0", 1654 | "multiformats": "^11.0.0", 1655 | "protons-runtime": "^5.0.0", 1656 | "timestamp-nano": "^1.0.0", 1657 | "uint8arraylist": "^2.4.3", 1658 | "uint8arrays": "^4.0.2" 1659 | }, 1660 | "engines": { 1661 | "node": ">=16.0.0", 1662 | "npm": ">=7.0.0" 1663 | } 1664 | }, 1665 | "node_modules/is-electron": { 1666 | "version": "2.2.2", 1667 | "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", 1668 | "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" 1669 | }, 1670 | "node_modules/is-ipfs": { 1671 | "version": "8.0.1", 1672 | "resolved": "https://registry.npmjs.org/is-ipfs/-/is-ipfs-8.0.1.tgz", 1673 | "integrity": "sha512-hoBSElmPath3aDdtaOpVZsuCh2SXTqvLML+H75S7iDgKdqNmENJ6tsRucP1HLfpqEyZ/uIlj/+ZBxIC/F8B5Eg==", 1674 | "dependencies": { 1675 | "@multiformats/mafmt": "^11.0.3", 1676 | "@multiformats/multiaddr": "^11.0.0", 1677 | "iso-url": "^1.1.3", 1678 | "multiformats": "^11.0.0", 1679 | "uint8arrays": "^4.0.2" 1680 | }, 1681 | "engines": { 1682 | "node": ">=16.0.0", 1683 | "npm": ">=7.0.0" 1684 | } 1685 | }, 1686 | "node_modules/is-ipfs/node_modules/@multiformats/mafmt": { 1687 | "version": "11.1.2", 1688 | "resolved": "https://registry.npmjs.org/@multiformats/mafmt/-/mafmt-11.1.2.tgz", 1689 | "integrity": "sha512-3n1o5eLU7WzTAPLuz3AodV7Iql6NWf7Ws8fqVaGT7o5nDDabUPYGBm2cZuh3OrqmwyCY61LrNUIsjzivU6UdpQ==", 1690 | "dependencies": { 1691 | "@multiformats/multiaddr": "^12.0.0" 1692 | }, 1693 | "engines": { 1694 | "node": ">=16.0.0", 1695 | "npm": ">=7.0.0" 1696 | } 1697 | }, 1698 | "node_modules/is-ipfs/node_modules/@multiformats/mafmt/node_modules/@multiformats/multiaddr": { 1699 | "version": "12.1.2", 1700 | "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-12.1.2.tgz", 1701 | "integrity": "sha512-EYYUEAddjWoyig5Dcu+JGq2JdpEpT2tW/K4sefdDWVSQW+rfnABfz1rx/KnrituB20jC8aPBcT62kISTZ3oL5A==", 1702 | "dependencies": { 1703 | "@chainsafe/is-ip": "^2.0.1", 1704 | "@chainsafe/netmask": "^2.0.0", 1705 | "@libp2p/interfaces": "^3.3.1", 1706 | "dns-over-http-resolver": "^2.1.0", 1707 | "multiformats": "^11.0.0", 1708 | "uint8arrays": "^4.0.2", 1709 | "varint": "^6.0.0" 1710 | }, 1711 | "engines": { 1712 | "node": ">=16.0.0", 1713 | "npm": ">=7.0.0" 1714 | } 1715 | }, 1716 | "node_modules/is-ipfs/node_modules/@multiformats/multiaddr": { 1717 | "version": "11.6.1", 1718 | "resolved": "https://registry.npmjs.org/@multiformats/multiaddr/-/multiaddr-11.6.1.tgz", 1719 | "integrity": "sha512-doST0+aB7/3dGK9+U5y3mtF3jq85KGbke1QiH0KE1F5mGQ9y56mFebTeu2D9FNOm+OT6UHb8Ss8vbSnpGjeLNw==", 1720 | "dependencies": { 1721 | "@chainsafe/is-ip": "^2.0.1", 1722 | "dns-over-http-resolver": "^2.1.0", 1723 | "err-code": "^3.0.1", 1724 | "multiformats": "^11.0.0", 1725 | "uint8arrays": "^4.0.2", 1726 | "varint": "^6.0.0" 1727 | }, 1728 | "engines": { 1729 | "node": ">=16.0.0", 1730 | "npm": ">=7.0.0" 1731 | } 1732 | }, 1733 | "node_modules/is-loopback-addr": { 1734 | "version": "2.0.1", 1735 | "resolved": "https://registry.npmjs.org/is-loopback-addr/-/is-loopback-addr-2.0.1.tgz", 1736 | "integrity": "sha512-SEsepLbdWFb13B6U0tt6dYcUM0iK/U7XOC43N70Z4Qb88WpNtp+ospyNI9ddpqncs7Z7brAEsVBTQpaqSNntIw==" 1737 | }, 1738 | "node_modules/is-plain-obj": { 1739 | "version": "2.1.0", 1740 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1741 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1742 | "engines": { 1743 | "node": ">=8" 1744 | } 1745 | }, 1746 | "node_modules/is-stream": { 1747 | "version": "2.0.1", 1748 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1749 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1750 | "engines": { 1751 | "node": ">=8" 1752 | }, 1753 | "funding": { 1754 | "url": "https://github.com/sponsors/sindresorhus" 1755 | } 1756 | }, 1757 | "node_modules/isexe": { 1758 | "version": "2.0.0", 1759 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1760 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1761 | }, 1762 | "node_modules/iso-url": { 1763 | "version": "1.2.1", 1764 | "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-1.2.1.tgz", 1765 | "integrity": "sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==", 1766 | "engines": { 1767 | "node": ">=12" 1768 | } 1769 | }, 1770 | "node_modules/it-all": { 1771 | "version": "3.0.1", 1772 | "resolved": "https://registry.npmjs.org/it-all/-/it-all-3.0.1.tgz", 1773 | "integrity": "sha512-C2xYrr8KbNek9+x5V68LkKn27ehuZ+lSCWLLQQVAWf0hzADf+QM+Xw3yEFwn8yDLNInsSonCXeM7D05h1H/43g==", 1774 | "engines": { 1775 | "node": ">=16.0.0", 1776 | "npm": ">=7.0.0" 1777 | } 1778 | }, 1779 | "node_modules/it-drain": { 1780 | "version": "3.0.1", 1781 | "resolved": "https://registry.npmjs.org/it-drain/-/it-drain-3.0.1.tgz", 1782 | "integrity": "sha512-a3L7V5RQ+GwJmsGMuHoIpivnAWneaZ11CXsvyd7J4oVNhD5SSYacAH3kImRsziUlKHHBtWNt8QcbIhdtq988oA==", 1783 | "engines": { 1784 | "node": ">=16.0.0", 1785 | "npm": ">=7.0.0" 1786 | } 1787 | }, 1788 | "node_modules/it-filter": { 1789 | "version": "3.0.1", 1790 | "resolved": "https://registry.npmjs.org/it-filter/-/it-filter-3.0.1.tgz", 1791 | "integrity": "sha512-AU9WeyLtZA8vNTi9aIwiNtnq7L7tv2VL3ISReSBTQNQWkpKoDZ0kf5zoMm8CsTPJqhwIl68ww6aHgYxp0aDgaw==", 1792 | "dependencies": { 1793 | "it-peekable": "^3.0.0" 1794 | }, 1795 | "engines": { 1796 | "node": ">=16.0.0", 1797 | "npm": ">=7.0.0" 1798 | } 1799 | }, 1800 | "node_modules/it-first": { 1801 | "version": "3.0.1", 1802 | "resolved": "https://registry.npmjs.org/it-first/-/it-first-3.0.1.tgz", 1803 | "integrity": "sha512-gEKSelg0HdApXCQ93m/vlJ1eqOXMlZ02kk/vOeDDOJcaSovo3enYbelUMKoDXljt4NUkeaqI4/WGtslF9nZEng==", 1804 | "engines": { 1805 | "node": ">=16.0.0", 1806 | "npm": ">=7.0.0" 1807 | } 1808 | }, 1809 | "node_modules/it-foreach": { 1810 | "version": "2.0.2", 1811 | "resolved": "https://registry.npmjs.org/it-foreach/-/it-foreach-2.0.2.tgz", 1812 | "integrity": "sha512-2oalsxv61Wy1Vi7CU4j5BPsAQfWD0ZtpDMwB/ttYg+vjNPFkjS9rMsdcDtGJ7hXpujO8k7HW42Ep/uoG5oeCDQ==", 1813 | "dependencies": { 1814 | "it-peekable": "^3.0.0" 1815 | }, 1816 | "engines": { 1817 | "node": ">=16.0.0", 1818 | "npm": ">=7.0.0" 1819 | } 1820 | }, 1821 | "node_modules/it-handshake": { 1822 | "version": "4.1.2", 1823 | "resolved": "https://registry.npmjs.org/it-handshake/-/it-handshake-4.1.2.tgz", 1824 | "integrity": "sha512-Q/EvrB4KWIX5+/wO7edBK3l79Vh28+iWPGZvZSSqwAtOJnHZIvywC+JUbiXPRJVXfICBJRqFETtIJcvrqWL2Zw==", 1825 | "dependencies": { 1826 | "it-pushable": "^3.1.0", 1827 | "it-reader": "^6.0.1", 1828 | "it-stream-types": "^1.0.4", 1829 | "p-defer": "^4.0.0", 1830 | "uint8arraylist": "^2.0.0" 1831 | }, 1832 | "engines": { 1833 | "node": ">=16.0.0", 1834 | "npm": ">=7.0.0" 1835 | } 1836 | }, 1837 | "node_modules/it-length": { 1838 | "version": "3.0.1", 1839 | "resolved": "https://registry.npmjs.org/it-length/-/it-length-3.0.1.tgz", 1840 | "integrity": "sha512-zvEBzglP5uUXrr8bsWjjfsNGFdBQSdUxrU3lGTbpZRMJu2Ij6QFLVSkbzTN28dk10FnrV5D6Kp/chCpfEaBX9Q==", 1841 | "engines": { 1842 | "node": ">=16.0.0", 1843 | "npm": ">=7.0.0" 1844 | } 1845 | }, 1846 | "node_modules/it-length-prefixed": { 1847 | "version": "8.0.4", 1848 | "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-8.0.4.tgz", 1849 | "integrity": "sha512-5OJ1lxH+IaqJB7lxe8IAIwt9UfSfsmjKJoAI/RO9djYoBDt1Jfy9PeVHUmOfqhqyu/4kJvWBFAJUaG1HhLQ12A==", 1850 | "dependencies": { 1851 | "err-code": "^3.0.1", 1852 | "it-stream-types": "^1.0.4", 1853 | "uint8-varint": "^1.0.1", 1854 | "uint8arraylist": "^2.0.0", 1855 | "uint8arrays": "^4.0.2" 1856 | }, 1857 | "engines": { 1858 | "node": ">=16.0.0", 1859 | "npm": ">=7.0.0" 1860 | } 1861 | }, 1862 | "node_modules/it-map": { 1863 | "version": "3.0.2", 1864 | "resolved": "https://registry.npmjs.org/it-map/-/it-map-3.0.2.tgz", 1865 | "integrity": "sha512-5tHgm1wO0BtGvcNSrMkl7XPMW7oQdXqfljes3afrqTJEGWz3rJPiZSmS+GNPv5syVC4LZDDZboTWoueBAPNpBA==", 1866 | "dependencies": { 1867 | "it-peekable": "^3.0.0" 1868 | }, 1869 | "engines": { 1870 | "node": ">=16.0.0", 1871 | "npm": ">=7.0.0" 1872 | } 1873 | }, 1874 | "node_modules/it-merge": { 1875 | "version": "3.0.0", 1876 | "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-3.0.0.tgz", 1877 | "integrity": "sha512-sM7t9wPDvCJnAlnvTvzvx82j89GR4mmYs1F8e4tSZ6yChlrnymb1v3b8tXZ6lhZpTye2Nm5nN7zmlhfU5bv4qA==", 1878 | "dependencies": { 1879 | "it-pushable": "^3.1.0" 1880 | }, 1881 | "engines": { 1882 | "node": ">=16.0.0", 1883 | "npm": ">=7.0.0" 1884 | } 1885 | }, 1886 | "node_modules/it-pair": { 1887 | "version": "2.0.4", 1888 | "resolved": "https://registry.npmjs.org/it-pair/-/it-pair-2.0.4.tgz", 1889 | "integrity": "sha512-S3y3mTJ3muuxcHBGcIzNONofAN+G3iAgmSjS78qARkRWI2ImJXybjj0h52uSW+isgrJqIx2iFB/T8ZEBc8kDSw==", 1890 | "dependencies": { 1891 | "it-stream-types": "^1.0.3", 1892 | "p-defer": "^4.0.0" 1893 | }, 1894 | "engines": { 1895 | "node": ">=16.0.0", 1896 | "npm": ">=7.0.0" 1897 | } 1898 | }, 1899 | "node_modules/it-parallel": { 1900 | "version": "3.0.2", 1901 | "resolved": "https://registry.npmjs.org/it-parallel/-/it-parallel-3.0.2.tgz", 1902 | "integrity": "sha512-uPVVv0Ir/yq9p3jOSWusEY7IEBZh1TNT8M6xSxxlJ5kKaPl2ulN6PzSQOC+lZXGKGWU3rneQ3hN/cO06aM04zw==", 1903 | "dependencies": { 1904 | "p-defer": "^4.0.0" 1905 | }, 1906 | "engines": { 1907 | "node": ">=16.0.0", 1908 | "npm": ">=7.0.0" 1909 | } 1910 | }, 1911 | "node_modules/it-pb-stream": { 1912 | "version": "3.2.1", 1913 | "resolved": "https://registry.npmjs.org/it-pb-stream/-/it-pb-stream-3.2.1.tgz", 1914 | "integrity": "sha512-vKE04Zv5MUcwxPNE9bIEfYK3rd/Klj5ORGD1D8Bn5f0mbCLGfouSrqZP1Jntg2osqQg4BN5dKKS2BbfwyGUI3Q==", 1915 | "dependencies": { 1916 | "err-code": "^3.0.1", 1917 | "it-length-prefixed": "^9.0.0", 1918 | "it-pushable": "^3.1.2", 1919 | "it-stream-types": "^1.0.4", 1920 | "protons-runtime": "^5.0.0", 1921 | "uint8-varint": "^1.0.6", 1922 | "uint8arraylist": "^2.0.0" 1923 | }, 1924 | "engines": { 1925 | "node": ">=16.0.0", 1926 | "npm": ">=7.0.0" 1927 | } 1928 | }, 1929 | "node_modules/it-pb-stream/node_modules/it-length-prefixed": { 1930 | "version": "9.0.0", 1931 | "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.0.tgz", 1932 | "integrity": "sha512-LCne3R3wxxLv94GTA8ywIeopdyA+2oKXiWWo7g58sQHiD7d1A6WMuWCrwP+xv4i7CmSuR3aeHo66SJUgArLOyA==", 1933 | "dependencies": { 1934 | "err-code": "^3.0.1", 1935 | "it-stream-types": "^1.0.5", 1936 | "uint8-varint": "^1.0.1", 1937 | "uint8arraylist": "^2.0.0", 1938 | "uint8arrays": "^4.0.2" 1939 | }, 1940 | "engines": { 1941 | "node": ">=16.0.0", 1942 | "npm": ">=7.0.0" 1943 | } 1944 | }, 1945 | "node_modules/it-peekable": { 1946 | "version": "3.0.0", 1947 | "resolved": "https://registry.npmjs.org/it-peekable/-/it-peekable-3.0.0.tgz", 1948 | "integrity": "sha512-Ct9xuQjFbt3cmTHhR6WbtBFI/6/cS+CcoQENQoWc7Y5Ld+nqD2zJ4dKvxhNcLFneCr0IS+cLQqer6GwjVpPRBA==", 1949 | "engines": { 1950 | "node": ">=16.0.0", 1951 | "npm": ">=7.0.0" 1952 | } 1953 | }, 1954 | "node_modules/it-pipe": { 1955 | "version": "2.0.5", 1956 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-2.0.5.tgz", 1957 | "integrity": "sha512-y85nW1N6zoiTnkidr2EAyC+ZVzc7Mwt2p+xt2a2ooG1ThFakSpNw1Kxm+7F13Aivru96brJhjQVRQNU+w0yozw==", 1958 | "dependencies": { 1959 | "it-merge": "^2.0.0", 1960 | "it-pushable": "^3.1.0", 1961 | "it-stream-types": "^1.0.3" 1962 | }, 1963 | "engines": { 1964 | "node": ">=16.0.0", 1965 | "npm": ">=7.0.0" 1966 | } 1967 | }, 1968 | "node_modules/it-pipe/node_modules/it-merge": { 1969 | "version": "2.0.1", 1970 | "resolved": "https://registry.npmjs.org/it-merge/-/it-merge-2.0.1.tgz", 1971 | "integrity": "sha512-ItoBy3dPlNKnhjHR8e7nfabfZzH4Jy2OMPvayYH3XHy4YNqSVKmWTIxhz7KX4UMBsLChlIJZ+5j6csJgrYGQtw==", 1972 | "dependencies": { 1973 | "it-pushable": "^3.1.0" 1974 | }, 1975 | "engines": { 1976 | "node": ">=16.0.0", 1977 | "npm": ">=7.0.0" 1978 | } 1979 | }, 1980 | "node_modules/it-pushable": { 1981 | "version": "3.1.2", 1982 | "resolved": "https://registry.npmjs.org/it-pushable/-/it-pushable-3.1.2.tgz", 1983 | "integrity": "sha512-zU9FbeoGT0f+yobwm8agol2OTMXbq4ZSWLEi7hug6TEZx4qVhGhGyp31cayH04aBYsIoO2Nr5kgMjH/oWj2BJQ==", 1984 | "engines": { 1985 | "node": ">=16.0.0", 1986 | "npm": ">=7.0.0" 1987 | } 1988 | }, 1989 | "node_modules/it-reader": { 1990 | "version": "6.0.2", 1991 | "resolved": "https://registry.npmjs.org/it-reader/-/it-reader-6.0.2.tgz", 1992 | "integrity": "sha512-rQdVyml+r/2v8PQsPfJgf626tAkbA7NW1EF6zuucT2Ryy1U6YJtSuCJL8fKuDOyiR/mLzbfP0QQJlSeeoLph2A==", 1993 | "dependencies": { 1994 | "it-stream-types": "^1.0.4", 1995 | "uint8arraylist": "^2.0.0" 1996 | }, 1997 | "engines": { 1998 | "node": ">=16.0.0", 1999 | "npm": ">=7.0.0" 2000 | } 2001 | }, 2002 | "node_modules/it-sort": { 2003 | "version": "3.0.1", 2004 | "resolved": "https://registry.npmjs.org/it-sort/-/it-sort-3.0.1.tgz", 2005 | "integrity": "sha512-QuA+yC4GoWZ9iP823pX4PrgRCulg8f4uFbHl5qfeuH1p/l7EKSJOQ/Q/XOVc6YtkGm91THqvv064boZEyD8QKg==", 2006 | "dependencies": { 2007 | "it-all": "^3.0.0" 2008 | }, 2009 | "engines": { 2010 | "node": ">=16.0.0", 2011 | "npm": ">=7.0.0" 2012 | } 2013 | }, 2014 | "node_modules/it-stream-types": { 2015 | "version": "1.0.5", 2016 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-1.0.5.tgz", 2017 | "integrity": "sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==", 2018 | "engines": { 2019 | "node": ">=16.0.0", 2020 | "npm": ">=7.0.0" 2021 | } 2022 | }, 2023 | "node_modules/it-take": { 2024 | "version": "3.0.1", 2025 | "resolved": "https://registry.npmjs.org/it-take/-/it-take-3.0.1.tgz", 2026 | "integrity": "sha512-y92geQxh23+SgEIm6n+krY/Erpx9/MahzjqXuReNvsXHR/VPDuyXMfYqG5mXBwowj8t4qW23kL8BF49fYv5+cg==", 2027 | "engines": { 2028 | "node": ">=16.0.0", 2029 | "npm": ">=7.0.0" 2030 | } 2031 | }, 2032 | "node_modules/jsbn": { 2033 | "version": "1.1.0", 2034 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 2035 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 2036 | }, 2037 | "node_modules/just-debounce-it": { 2038 | "version": "3.2.0", 2039 | "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.2.0.tgz", 2040 | "integrity": "sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ==" 2041 | }, 2042 | "node_modules/k-bucket": { 2043 | "version": "5.1.0", 2044 | "resolved": "https://registry.npmjs.org/k-bucket/-/k-bucket-5.1.0.tgz", 2045 | "integrity": "sha512-Fac7iINEovXIWU20GPnOMLUbjctiS+cnmyjC4zAUgvs3XPf1vo9akfCHkigftSic/jiKqKl+KA3a/vFcJbHyCg==", 2046 | "dependencies": { 2047 | "randombytes": "^2.1.0" 2048 | } 2049 | }, 2050 | "node_modules/libp2p": { 2051 | "version": "0.44.0", 2052 | "resolved": "https://registry.npmjs.org/libp2p/-/libp2p-0.44.0.tgz", 2053 | "integrity": "sha512-lDUjzt9uN+fADowW/BEIfQntcru2DwTeHhvoDKT0yxXypxT4SfhlPejmDNrbfCxBF4Rx4eYDeAqEUG7A83KMYw==", 2054 | "dependencies": { 2055 | "@achingbrain/nat-port-mapper": "^1.0.3", 2056 | "@libp2p/crypto": "^1.0.4", 2057 | "@libp2p/interface-address-manager": "^2.0.0", 2058 | "@libp2p/interface-connection": "^4.0.0", 2059 | "@libp2p/interface-connection-encrypter": "^3.0.1", 2060 | "@libp2p/interface-connection-gater": "^2.0.1", 2061 | "@libp2p/interface-connection-manager": "^2.1.0", 2062 | "@libp2p/interface-content-routing": "^2.0.0", 2063 | "@libp2p/interface-dht": "^2.0.0", 2064 | "@libp2p/interface-keychain": "^2.0.4", 2065 | "@libp2p/interface-libp2p": "^1.0.0", 2066 | "@libp2p/interface-metrics": "^4.0.0", 2067 | "@libp2p/interface-peer-discovery": "^1.0.1", 2068 | "@libp2p/interface-peer-id": "^2.0.1", 2069 | "@libp2p/interface-peer-info": "^1.0.3", 2070 | "@libp2p/interface-peer-routing": "^1.0.1", 2071 | "@libp2p/interface-peer-store": "^1.2.2", 2072 | "@libp2p/interface-pubsub": "^3.0.0", 2073 | "@libp2p/interface-record": "^2.0.6", 2074 | "@libp2p/interface-registrar": "^2.0.3", 2075 | "@libp2p/interface-stream-muxer": "^3.0.0", 2076 | "@libp2p/interface-transport": "^2.1.0", 2077 | "@libp2p/interfaces": "^3.2.0", 2078 | "@libp2p/keychain": "^2.0.0", 2079 | "@libp2p/logger": "^2.0.1", 2080 | "@libp2p/multistream-select": "^3.0.0", 2081 | "@libp2p/peer-collections": "^3.0.0", 2082 | "@libp2p/peer-id": "^2.0.0", 2083 | "@libp2p/peer-id-factory": "^2.0.0", 2084 | "@libp2p/peer-record": "^5.0.0", 2085 | "@libp2p/peer-store": "^7.0.0", 2086 | "@libp2p/topology": "^4.0.1", 2087 | "@libp2p/tracked-map": "^3.0.0", 2088 | "@libp2p/utils": "^3.0.2", 2089 | "@multiformats/mafmt": "^12.0.0", 2090 | "@multiformats/multiaddr": "^12.0.0", 2091 | "abortable-iterator": "^4.0.2", 2092 | "any-signal": "^4.1.1", 2093 | "datastore-core": "^9.0.0", 2094 | "interface-datastore": "^8.0.0", 2095 | "it-all": "^3.0.1", 2096 | "it-drain": "^3.0.1", 2097 | "it-filter": "^3.0.1", 2098 | "it-first": "^3.0.1", 2099 | "it-handshake": "^4.1.2", 2100 | "it-length-prefixed": "^9.0.0", 2101 | "it-map": "^3.0.2", 2102 | "it-merge": "^3.0.0", 2103 | "it-pair": "^2.0.2", 2104 | "it-parallel": "^3.0.0", 2105 | "it-pb-stream": "^3.2.0", 2106 | "it-pipe": "^3.0.1", 2107 | "it-stream-types": "^1.0.4", 2108 | "merge-options": "^3.0.4", 2109 | "multiformats": "^11.0.0", 2110 | "p-defer": "^4.0.0", 2111 | "p-fifo": "^1.0.0", 2112 | "p-queue": "^7.3.4", 2113 | "p-retry": "^5.0.0", 2114 | "private-ip": "^3.0.0", 2115 | "protons-runtime": "^5.0.0", 2116 | "rate-limiter-flexible": "^2.3.11", 2117 | "retimer": "^3.0.0", 2118 | "set-delayed-interval": "^1.0.0", 2119 | "timeout-abort-controller": "^3.0.0", 2120 | "uint8arraylist": "^2.3.2", 2121 | "uint8arrays": "^4.0.2", 2122 | "wherearewe": "^2.0.0", 2123 | "xsalsa20": "^1.1.0" 2124 | }, 2125 | "engines": { 2126 | "node": ">=16.0.0", 2127 | "npm": ">=7.0.0" 2128 | } 2129 | }, 2130 | "node_modules/libp2p/node_modules/@libp2p/interface-connection-manager": { 2131 | "version": "2.1.0", 2132 | "resolved": "https://registry.npmjs.org/@libp2p/interface-connection-manager/-/interface-connection-manager-2.1.0.tgz", 2133 | "integrity": "sha512-bBJ+GTTDrQvWlmU7aSH5waAs3F3N3LPwiU3KgrTq6/ODK/K1c4El7WQuLnzreUUYXT2XFExyNRnXEURPGOYdVg==", 2134 | "dependencies": { 2135 | "@libp2p/interface-connection": "^4.0.0", 2136 | "@libp2p/interface-peer-id": "^2.0.0", 2137 | "@libp2p/interfaces": "^3.0.0", 2138 | "@libp2p/peer-collections": "^3.0.1", 2139 | "@multiformats/multiaddr": "^12.0.0" 2140 | }, 2141 | "engines": { 2142 | "node": ">=16.0.0", 2143 | "npm": ">=7.0.0" 2144 | } 2145 | }, 2146 | "node_modules/libp2p/node_modules/it-length-prefixed": { 2147 | "version": "9.0.0", 2148 | "resolved": "https://registry.npmjs.org/it-length-prefixed/-/it-length-prefixed-9.0.0.tgz", 2149 | "integrity": "sha512-LCne3R3wxxLv94GTA8ywIeopdyA+2oKXiWWo7g58sQHiD7d1A6WMuWCrwP+xv4i7CmSuR3aeHo66SJUgArLOyA==", 2150 | "dependencies": { 2151 | "err-code": "^3.0.1", 2152 | "it-stream-types": "^1.0.5", 2153 | "uint8-varint": "^1.0.1", 2154 | "uint8arraylist": "^2.0.0", 2155 | "uint8arrays": "^4.0.2" 2156 | }, 2157 | "engines": { 2158 | "node": ">=16.0.0", 2159 | "npm": ">=7.0.0" 2160 | } 2161 | }, 2162 | "node_modules/libp2p/node_modules/it-pipe": { 2163 | "version": "3.0.1", 2164 | "resolved": "https://registry.npmjs.org/it-pipe/-/it-pipe-3.0.1.tgz", 2165 | "integrity": "sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==", 2166 | "dependencies": { 2167 | "it-merge": "^3.0.0", 2168 | "it-pushable": "^3.1.2", 2169 | "it-stream-types": "^2.0.1" 2170 | }, 2171 | "engines": { 2172 | "node": ">=16.0.0", 2173 | "npm": ">=7.0.0" 2174 | } 2175 | }, 2176 | "node_modules/libp2p/node_modules/it-pipe/node_modules/it-stream-types": { 2177 | "version": "2.0.1", 2178 | "resolved": "https://registry.npmjs.org/it-stream-types/-/it-stream-types-2.0.1.tgz", 2179 | "integrity": "sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==", 2180 | "engines": { 2181 | "node": ">=16.0.0", 2182 | "npm": ">=7.0.0" 2183 | } 2184 | }, 2185 | "node_modules/longbits": { 2186 | "version": "1.1.0", 2187 | "resolved": "https://registry.npmjs.org/longbits/-/longbits-1.1.0.tgz", 2188 | "integrity": "sha512-22U2exkkYy7sr7nuQJYx2NEZ2kEMsC69+BxM5h8auLvkVIJa+LwAB5mFIExnuW2dFuYXFOWsFMKXjaWiq/htYQ==", 2189 | "dependencies": { 2190 | "byte-access": "^1.0.1", 2191 | "uint8arraylist": "^2.0.0" 2192 | }, 2193 | "engines": { 2194 | "node": ">=16.0.0", 2195 | "npm": ">=7.0.0" 2196 | } 2197 | }, 2198 | "node_modules/merge-options": { 2199 | "version": "3.0.4", 2200 | "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", 2201 | "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", 2202 | "dependencies": { 2203 | "is-plain-obj": "^2.1.0" 2204 | }, 2205 | "engines": { 2206 | "node": ">=10" 2207 | } 2208 | }, 2209 | "node_modules/merge-stream": { 2210 | "version": "2.0.0", 2211 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2212 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 2213 | }, 2214 | "node_modules/mimic-fn": { 2215 | "version": "2.1.0", 2216 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2217 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2218 | "engines": { 2219 | "node": ">=6" 2220 | } 2221 | }, 2222 | "node_modules/mortice": { 2223 | "version": "3.0.1", 2224 | "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.1.tgz", 2225 | "integrity": "sha512-eyDUsl1nCR9+JtNksKnaESLP9MgAXCA4w1LTtsmOSQNsThnv++f36rrBu5fC/fdGIwTJZmbiaR/QewptH93pYA==", 2226 | "dependencies": { 2227 | "nanoid": "^4.0.0", 2228 | "observable-webworkers": "^2.0.1", 2229 | "p-queue": "^7.2.0", 2230 | "p-timeout": "^6.0.0" 2231 | }, 2232 | "engines": { 2233 | "node": ">=16.0.0", 2234 | "npm": ">=7.0.0" 2235 | } 2236 | }, 2237 | "node_modules/mortice/node_modules/p-timeout": { 2238 | "version": "6.1.1", 2239 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.1.tgz", 2240 | "integrity": "sha512-yqz2Wi4fiFRpMmK0L2pGAU49naSUaP23fFIQL2Y6YT+qDGPoFwpvgQM/wzc6F8JoenUkIlAFa4Ql7NguXBxI7w==", 2241 | "engines": { 2242 | "node": ">=14.16" 2243 | }, 2244 | "funding": { 2245 | "url": "https://github.com/sponsors/sindresorhus" 2246 | } 2247 | }, 2248 | "node_modules/ms": { 2249 | "version": "2.1.2", 2250 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2251 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2252 | }, 2253 | "node_modules/multiformats": { 2254 | "version": "11.0.2", 2255 | "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz", 2256 | "integrity": "sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==", 2257 | "engines": { 2258 | "node": ">=16.0.0", 2259 | "npm": ">=7.0.0" 2260 | } 2261 | }, 2262 | "node_modules/nanoid": { 2263 | "version": "4.0.2", 2264 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", 2265 | "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", 2266 | "funding": [ 2267 | { 2268 | "type": "github", 2269 | "url": "https://github.com/sponsors/ai" 2270 | } 2271 | ], 2272 | "bin": { 2273 | "nanoid": "bin/nanoid.js" 2274 | }, 2275 | "engines": { 2276 | "node": "^14 || ^16 || >=18" 2277 | } 2278 | }, 2279 | "node_modules/native-fetch": { 2280 | "version": "4.0.2", 2281 | "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", 2282 | "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", 2283 | "peerDependencies": { 2284 | "undici": "*" 2285 | } 2286 | }, 2287 | "node_modules/netmask": { 2288 | "version": "2.0.2", 2289 | "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", 2290 | "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", 2291 | "engines": { 2292 | "node": ">= 0.4.0" 2293 | } 2294 | }, 2295 | "node_modules/node-forge": { 2296 | "version": "1.3.1", 2297 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", 2298 | "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", 2299 | "engines": { 2300 | "node": ">= 6.13.0" 2301 | } 2302 | }, 2303 | "node_modules/npm-run-path": { 2304 | "version": "4.0.1", 2305 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2306 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2307 | "dependencies": { 2308 | "path-key": "^3.0.0" 2309 | }, 2310 | "engines": { 2311 | "node": ">=8" 2312 | } 2313 | }, 2314 | "node_modules/observable-webworkers": { 2315 | "version": "2.0.1", 2316 | "resolved": "https://registry.npmjs.org/observable-webworkers/-/observable-webworkers-2.0.1.tgz", 2317 | "integrity": "sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==", 2318 | "engines": { 2319 | "node": ">=16.0.0", 2320 | "npm": ">=7.0.0" 2321 | } 2322 | }, 2323 | "node_modules/onetime": { 2324 | "version": "5.1.2", 2325 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2326 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2327 | "dependencies": { 2328 | "mimic-fn": "^2.1.0" 2329 | }, 2330 | "engines": { 2331 | "node": ">=6" 2332 | }, 2333 | "funding": { 2334 | "url": "https://github.com/sponsors/sindresorhus" 2335 | } 2336 | }, 2337 | "node_modules/p-defer": { 2338 | "version": "4.0.0", 2339 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-4.0.0.tgz", 2340 | "integrity": "sha512-Vb3QRvQ0Y5XnF40ZUWW7JfLogicVh/EnA5gBIvKDJoYpeI82+1E3AlB9yOcKFS0AhHrWVnAQO39fbR0G99IVEQ==", 2341 | "engines": { 2342 | "node": ">=12" 2343 | }, 2344 | "funding": { 2345 | "url": "https://github.com/sponsors/sindresorhus" 2346 | } 2347 | }, 2348 | "node_modules/p-fifo": { 2349 | "version": "1.0.0", 2350 | "resolved": "https://registry.npmjs.org/p-fifo/-/p-fifo-1.0.0.tgz", 2351 | "integrity": "sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A==", 2352 | "dependencies": { 2353 | "fast-fifo": "^1.0.0", 2354 | "p-defer": "^3.0.0" 2355 | } 2356 | }, 2357 | "node_modules/p-fifo/node_modules/p-defer": { 2358 | "version": "3.0.0", 2359 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", 2360 | "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", 2361 | "engines": { 2362 | "node": ">=8" 2363 | } 2364 | }, 2365 | "node_modules/p-queue": { 2366 | "version": "7.3.4", 2367 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.3.4.tgz", 2368 | "integrity": "sha512-esox8CWt0j9EZECFvkFl2WNPat8LN4t7WWeXq73D9ha0V96qPRufApZi4ZhPwXAln1uVVal429HVVKPa2X0yQg==", 2369 | "dependencies": { 2370 | "eventemitter3": "^4.0.7", 2371 | "p-timeout": "^5.0.2" 2372 | }, 2373 | "engines": { 2374 | "node": ">=12" 2375 | }, 2376 | "funding": { 2377 | "url": "https://github.com/sponsors/sindresorhus" 2378 | } 2379 | }, 2380 | "node_modules/p-retry": { 2381 | "version": "5.1.2", 2382 | "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-5.1.2.tgz", 2383 | "integrity": "sha512-couX95waDu98NfNZV+i/iLt+fdVxmI7CbrrdC2uDWfPdUAApyxT4wmDlyOtR5KtTDmkDO0zDScDjDou9YHhd9g==", 2384 | "dependencies": { 2385 | "@types/retry": "0.12.1", 2386 | "retry": "^0.13.1" 2387 | }, 2388 | "engines": { 2389 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 2390 | }, 2391 | "funding": { 2392 | "url": "https://github.com/sponsors/sindresorhus" 2393 | } 2394 | }, 2395 | "node_modules/p-timeout": { 2396 | "version": "5.1.0", 2397 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", 2398 | "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", 2399 | "engines": { 2400 | "node": ">=12" 2401 | }, 2402 | "funding": { 2403 | "url": "https://github.com/sponsors/sindresorhus" 2404 | } 2405 | }, 2406 | "node_modules/path-key": { 2407 | "version": "3.1.1", 2408 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2409 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2410 | "engines": { 2411 | "node": ">=8" 2412 | } 2413 | }, 2414 | "node_modules/private-ip": { 2415 | "version": "3.0.0", 2416 | "resolved": "https://registry.npmjs.org/private-ip/-/private-ip-3.0.0.tgz", 2417 | "integrity": "sha512-HkMBs4nMtrP+cvcw0bDi2BAZIGgiKI4Zq8Oc+dMqNBpHS8iGL4+WO/pRtc8Bwnv9rjnV0QwMDwEBymFtqv7Kww==", 2418 | "dependencies": { 2419 | "@chainsafe/is-ip": "^2.0.1", 2420 | "ip-regex": "^5.0.0", 2421 | "ipaddr.js": "^2.0.1", 2422 | "netmask": "^2.0.2" 2423 | }, 2424 | "engines": { 2425 | "node": ">=14.16" 2426 | } 2427 | }, 2428 | "node_modules/progress-events": { 2429 | "version": "1.0.0", 2430 | "resolved": "https://registry.npmjs.org/progress-events/-/progress-events-1.0.0.tgz", 2431 | "integrity": "sha512-zIB6QDrSbPfRg+33FZalluFIowkbV5Xh1xSuetjG+rlC5he6u2dc6VQJ0TbMdlN3R1RHdpOqxEFMKTnQ+itUwA==", 2432 | "engines": { 2433 | "node": ">=16.0.0", 2434 | "npm": ">=7.0.0" 2435 | } 2436 | }, 2437 | "node_modules/protons-runtime": { 2438 | "version": "5.0.0", 2439 | "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.0.0.tgz", 2440 | "integrity": "sha512-QqjGnPGkpvbzq0dITzhG9DVK10rRIHf7nePcU2QQVVpFGuYbwrOWnvGSvei1GcceAzB9syTz6vHzvTPmGRR0PA==", 2441 | "dependencies": { 2442 | "protobufjs": "^7.0.0", 2443 | "uint8arraylist": "^2.4.3" 2444 | }, 2445 | "engines": { 2446 | "node": ">=16.0.0", 2447 | "npm": ">=7.0.0" 2448 | }, 2449 | "peerDependencies": { 2450 | "uint8arraylist": "^2.3.2" 2451 | } 2452 | }, 2453 | "node_modules/protons-runtime/node_modules/long": { 2454 | "version": "5.2.3", 2455 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", 2456 | "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" 2457 | }, 2458 | "node_modules/protons-runtime/node_modules/protobufjs": { 2459 | "version": "7.2.3", 2460 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", 2461 | "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", 2462 | "hasInstallScript": true, 2463 | "dependencies": { 2464 | "@protobufjs/aspromise": "^1.1.2", 2465 | "@protobufjs/base64": "^1.1.2", 2466 | "@protobufjs/codegen": "^2.0.4", 2467 | "@protobufjs/eventemitter": "^1.1.0", 2468 | "@protobufjs/fetch": "^1.1.0", 2469 | "@protobufjs/float": "^1.0.2", 2470 | "@protobufjs/inquire": "^1.1.0", 2471 | "@protobufjs/path": "^1.1.2", 2472 | "@protobufjs/pool": "^1.1.0", 2473 | "@protobufjs/utf8": "^1.1.0", 2474 | "@types/node": ">=13.7.0", 2475 | "long": "^5.0.0" 2476 | }, 2477 | "engines": { 2478 | "node": ">=12.0.0" 2479 | } 2480 | }, 2481 | "node_modules/randombytes": { 2482 | "version": "2.1.0", 2483 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2484 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2485 | "dependencies": { 2486 | "safe-buffer": "^5.1.0" 2487 | } 2488 | }, 2489 | "node_modules/rate-limiter-flexible": { 2490 | "version": "2.4.1", 2491 | "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.1.tgz", 2492 | "integrity": "sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g==" 2493 | }, 2494 | "node_modules/receptacle": { 2495 | "version": "1.3.2", 2496 | "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", 2497 | "integrity": "sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A==", 2498 | "dependencies": { 2499 | "ms": "^2.1.1" 2500 | } 2501 | }, 2502 | "node_modules/retimer": { 2503 | "version": "3.0.0", 2504 | "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz", 2505 | "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==" 2506 | }, 2507 | "node_modules/retry": { 2508 | "version": "0.13.1", 2509 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", 2510 | "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", 2511 | "engines": { 2512 | "node": ">= 4" 2513 | } 2514 | }, 2515 | "node_modules/safe-buffer": { 2516 | "version": "5.2.1", 2517 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2518 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2519 | "funding": [ 2520 | { 2521 | "type": "github", 2522 | "url": "https://github.com/sponsors/feross" 2523 | }, 2524 | { 2525 | "type": "patreon", 2526 | "url": "https://www.patreon.com/feross" 2527 | }, 2528 | { 2529 | "type": "consulting", 2530 | "url": "https://feross.org/support" 2531 | } 2532 | ] 2533 | }, 2534 | "node_modules/sanitize-filename": { 2535 | "version": "1.6.3", 2536 | "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", 2537 | "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", 2538 | "dependencies": { 2539 | "truncate-utf8-bytes": "^1.0.0" 2540 | } 2541 | }, 2542 | "node_modules/sax": { 2543 | "version": "1.2.4", 2544 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 2545 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 2546 | }, 2547 | "node_modules/set-delayed-interval": { 2548 | "version": "1.0.0", 2549 | "resolved": "https://registry.npmjs.org/set-delayed-interval/-/set-delayed-interval-1.0.0.tgz", 2550 | "integrity": "sha512-29fhAwuZlLcuBnW/EwxvLcg2D3ELX+VBDNhnavs3YYkab72qmrcSeQNVdzl8EcPPahGQXhBM6MKdPLCQGMDakw==" 2551 | }, 2552 | "node_modules/shebang-command": { 2553 | "version": "2.0.0", 2554 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2555 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2556 | "dependencies": { 2557 | "shebang-regex": "^3.0.0" 2558 | }, 2559 | "engines": { 2560 | "node": ">=8" 2561 | } 2562 | }, 2563 | "node_modules/shebang-regex": { 2564 | "version": "3.0.0", 2565 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2566 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2567 | "engines": { 2568 | "node": ">=8" 2569 | } 2570 | }, 2571 | "node_modules/signal-exit": { 2572 | "version": "3.0.7", 2573 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2574 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 2575 | }, 2576 | "node_modules/sprintf-js": { 2577 | "version": "1.1.2", 2578 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 2579 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" 2580 | }, 2581 | "node_modules/stream-to-it": { 2582 | "version": "0.2.4", 2583 | "resolved": "https://registry.npmjs.org/stream-to-it/-/stream-to-it-0.2.4.tgz", 2584 | "integrity": "sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ==", 2585 | "dependencies": { 2586 | "get-iterator": "^1.0.2" 2587 | } 2588 | }, 2589 | "node_modules/stream-to-it/node_modules/get-iterator": { 2590 | "version": "1.0.2", 2591 | "resolved": "https://registry.npmjs.org/get-iterator/-/get-iterator-1.0.2.tgz", 2592 | "integrity": "sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==" 2593 | }, 2594 | "node_modules/streamsearch": { 2595 | "version": "1.1.0", 2596 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 2597 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 2598 | "engines": { 2599 | "node": ">=10.0.0" 2600 | } 2601 | }, 2602 | "node_modules/strip-final-newline": { 2603 | "version": "2.0.0", 2604 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2605 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2606 | "engines": { 2607 | "node": ">=6" 2608 | } 2609 | }, 2610 | "node_modules/timeout-abort-controller": { 2611 | "version": "3.0.0", 2612 | "resolved": "https://registry.npmjs.org/timeout-abort-controller/-/timeout-abort-controller-3.0.0.tgz", 2613 | "integrity": "sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==", 2614 | "dependencies": { 2615 | "retimer": "^3.0.0" 2616 | } 2617 | }, 2618 | "node_modules/timestamp-nano": { 2619 | "version": "1.0.1", 2620 | "resolved": "https://registry.npmjs.org/timestamp-nano/-/timestamp-nano-1.0.1.tgz", 2621 | "integrity": "sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA==", 2622 | "engines": { 2623 | "node": ">= 4.5.0" 2624 | } 2625 | }, 2626 | "node_modules/truncate-utf8-bytes": { 2627 | "version": "1.0.2", 2628 | "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", 2629 | "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", 2630 | "dependencies": { 2631 | "utf8-byte-length": "^1.0.1" 2632 | } 2633 | }, 2634 | "node_modules/typescript": { 2635 | "version": "5.0.4", 2636 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", 2637 | "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", 2638 | "bin": { 2639 | "tsc": "bin/tsc", 2640 | "tsserver": "bin/tsserver" 2641 | }, 2642 | "engines": { 2643 | "node": ">=12.20" 2644 | } 2645 | }, 2646 | "node_modules/uint8-varint": { 2647 | "version": "1.0.6", 2648 | "resolved": "https://registry.npmjs.org/uint8-varint/-/uint8-varint-1.0.6.tgz", 2649 | "integrity": "sha512-Z0ujO4rxPwxTdLsSI5ke+bdl9hjJ1xiOakBPZeWUI/u6YBGCEGTW6b90SMlhxSGButKVPkL9fMFUDnqThQYTGg==", 2650 | "dependencies": { 2651 | "byte-access": "^1.0.0", 2652 | "longbits": "^1.1.0", 2653 | "uint8arraylist": "^2.0.0", 2654 | "uint8arrays": "^4.0.2" 2655 | }, 2656 | "engines": { 2657 | "node": ">=16.0.0", 2658 | "npm": ">=7.0.0" 2659 | } 2660 | }, 2661 | "node_modules/uint8arraylist": { 2662 | "version": "2.4.3", 2663 | "resolved": "https://registry.npmjs.org/uint8arraylist/-/uint8arraylist-2.4.3.tgz", 2664 | "integrity": "sha512-oEVZr4/GrH87K0kjNce6z8pSCzLEPqHNLNR5sj8cJOySrTP8Vb/pMIbZKLJGhQKxm1TiZ31atNrpn820Pyqpow==", 2665 | "dependencies": { 2666 | "uint8arrays": "^4.0.2" 2667 | }, 2668 | "engines": { 2669 | "node": ">=16.0.0", 2670 | "npm": ">=7.0.0" 2671 | } 2672 | }, 2673 | "node_modules/uint8arrays": { 2674 | "version": "4.0.3", 2675 | "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.3.tgz", 2676 | "integrity": "sha512-b+aKlI2oTnxnfeSQWV1sMacqSNxqhtXySaH6bflvONGxF8V/fT3ZlYH7z2qgGfydsvpVo4JUgM/Ylyfl2YouCg==", 2677 | "dependencies": { 2678 | "multiformats": "^11.0.0" 2679 | }, 2680 | "engines": { 2681 | "node": ">=16.0.0", 2682 | "npm": ">=7.0.0" 2683 | } 2684 | }, 2685 | "node_modules/undici": { 2686 | "version": "5.21.2", 2687 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", 2688 | "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==", 2689 | "dependencies": { 2690 | "busboy": "^1.6.0" 2691 | }, 2692 | "engines": { 2693 | "node": ">=12.18" 2694 | } 2695 | }, 2696 | "node_modules/utf8-byte-length": { 2697 | "version": "1.0.4", 2698 | "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", 2699 | "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==" 2700 | }, 2701 | "node_modules/uuid": { 2702 | "version": "8.3.2", 2703 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2704 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 2705 | "bin": { 2706 | "uuid": "dist/bin/uuid" 2707 | } 2708 | }, 2709 | "node_modules/varint": { 2710 | "version": "6.0.0", 2711 | "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", 2712 | "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" 2713 | }, 2714 | "node_modules/varint-decoder": { 2715 | "version": "1.0.0", 2716 | "resolved": "https://registry.npmjs.org/varint-decoder/-/varint-decoder-1.0.0.tgz", 2717 | "integrity": "sha512-JkOvdztASWGUAsXshCFHrB9f6AgR2Q8W08CEyJ+43b1qtFocmI8Sp1R/M0E/hDOY2FzVIqk63tOYLgDYWuJ7IQ==", 2718 | "dependencies": { 2719 | "varint": "^5.0.0" 2720 | }, 2721 | "engines": { 2722 | "node": ">=4.0.0", 2723 | "npm": ">=3.0.0" 2724 | } 2725 | }, 2726 | "node_modules/varint-decoder/node_modules/varint": { 2727 | "version": "5.0.2", 2728 | "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", 2729 | "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" 2730 | }, 2731 | "node_modules/wherearewe": { 2732 | "version": "2.0.1", 2733 | "resolved": "https://registry.npmjs.org/wherearewe/-/wherearewe-2.0.1.tgz", 2734 | "integrity": "sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==", 2735 | "dependencies": { 2736 | "is-electron": "^2.2.0" 2737 | }, 2738 | "engines": { 2739 | "node": ">=16.0.0", 2740 | "npm": ">=7.0.0" 2741 | } 2742 | }, 2743 | "node_modules/which": { 2744 | "version": "2.0.2", 2745 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2746 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2747 | "dependencies": { 2748 | "isexe": "^2.0.0" 2749 | }, 2750 | "bin": { 2751 | "node-which": "bin/node-which" 2752 | }, 2753 | "engines": { 2754 | "node": ">= 8" 2755 | } 2756 | }, 2757 | "node_modules/xml2js": { 2758 | "version": "0.4.23", 2759 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 2760 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 2761 | "dependencies": { 2762 | "sax": ">=0.6.0", 2763 | "xmlbuilder": "~11.0.0" 2764 | }, 2765 | "engines": { 2766 | "node": ">=4.0.0" 2767 | } 2768 | }, 2769 | "node_modules/xmlbuilder": { 2770 | "version": "11.0.1", 2771 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 2772 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 2773 | "engines": { 2774 | "node": ">=4.0" 2775 | } 2776 | }, 2777 | "node_modules/xsalsa20": { 2778 | "version": "1.2.0", 2779 | "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", 2780 | "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" 2781 | } 2782 | } 2783 | } 2784 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dynamic-content", 3 | "version": "1.0.0", 4 | "type": "module", 5 | "description": "concept of how to address and sync dynamic content using a pinning layer", 6 | "scripts": { 7 | "build": "tsc", 8 | "example": "npm run build && node dist/index.js", 9 | "interactive": "npm run build && node dist/interactive.js" 10 | }, 11 | "author": "tabcat ", 12 | "license": "MIT", 13 | "dependencies": { 14 | "@chainsafe/libp2p-noise": "^11.0.4", 15 | "@chainsafe/libp2p-yamux": "^3.0.7", 16 | "@helia/ipns": "^1.1.0", 17 | "@ipld/dag-cbor": "^9.0.0", 18 | "@libp2p/kad-dht": "^8.0.6", 19 | "@libp2p/tcp": "^6.1.5", 20 | "helia": "^1.0.3", 21 | "libp2p": "^0.44.0", 22 | "typescript": "^5.0.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/create-helia.ts: -------------------------------------------------------------------------------- 1 | import { createHelia } from 'helia' 2 | import { createLibp2p, Libp2pOptions } from 'libp2p' 3 | import { tcp } from '@libp2p/tcp' 4 | import { noise } from '@chainsafe/libp2p-noise' 5 | import { yamux } from '@chainsafe/libp2p-yamux' 6 | import { MemoryBlockstore } from 'blockstore-core' 7 | import { MemoryDatastore } from 'datastore-core' 8 | import type { Helia } from '@helia/interface' 9 | 10 | export async function createHeliaNode (config: Libp2pOptions = {}): Promise { 11 | const blockstore = new MemoryBlockstore() 12 | const datastore = new MemoryDatastore() 13 | 14 | const libp2p = await createLibp2p({ 15 | addresses: { 16 | listen: [ 17 | '/ip4/127.0.0.1/tcp/0' 18 | ] 19 | }, 20 | transports: [ 21 | tcp() 22 | ], 23 | connectionEncryption: [ 24 | noise() 25 | ], 26 | streamMuxers: [ 27 | yamux() 28 | ], 29 | datastore, 30 | nat: { 31 | enabled: false 32 | }, 33 | ...config 34 | }) 35 | 36 | const helia = await createHelia({ 37 | libp2p, 38 | blockstore, 39 | datastore 40 | }) 41 | 42 | return helia 43 | } -------------------------------------------------------------------------------- /src/dynamic-content.ts: -------------------------------------------------------------------------------- 1 | import { CID } from 'multiformats/cid' 2 | import * as Block from 'multiformats/block' 3 | import * as codec from '@ipld/dag-cbor' 4 | import { sha256 as hasher } from 'multiformats/hashes/sha2' 5 | import type { BlockView } from 'multiformats/block/interface' 6 | 7 | // takes description of the dynamic content (protocol + params) 8 | // returns manifest (Block) and dynamic-content id (CID) 9 | export async function DynamicContent ( 10 | { protocol, param }: { protocol: string, param: any } 11 | ): 12 | Promise<{ id: CID, manifest: BlockView }> 13 | { 14 | 15 | // create manifest 16 | const manifest = await Block.encode({ value: { protocol, param }, codec, hasher }) 17 | 18 | // create dcid 19 | const dynamic = new TextEncoder().encode('dynamic') 20 | const bytes = new Uint8Array(dynamic.length + manifest.cid.multihash.digest.length) 21 | bytes.set(dynamic) 22 | bytes.set(manifest.cid.multihash.digest, dynamic.length) 23 | const dcid = CID.create( 24 | manifest.cid.version, 25 | manifest.cid.code, 26 | await hasher.digest(bytes) 27 | ) 28 | 29 | return { id: dcid, manifest } 30 | } 31 | 32 | -------------------------------------------------------------------------------- /src/globals.ts: -------------------------------------------------------------------------------- 1 | import type { Helia } from '@helia/interface' 2 | import type { IPNS } from '@helia/ipns' 3 | 4 | import { DynamicContent } from './dynamic-content.js' 5 | 6 | declare global { 7 | var client1: Helia 8 | var client2: Helia 9 | var server: Helia 10 | var name1: IPNS 11 | var name2: IPNS 12 | var dynamicContent: Awaited> 13 | var set1: Set 14 | var set2: Set 15 | var update: (value: string) => Promise 16 | var sync: () => Promise 17 | var connect: (client: Helia) => Promise 18 | var disconnect: (client: Helia) => Promise 19 | var help: string 20 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { kadDHT } from '@libp2p/kad-dht' 2 | import { ipns, IPNS } from '@helia/ipns' 3 | import { dht } from '@helia/ipns/routing' 4 | import { ipnsValidator } from 'ipns/validator' 5 | import { ipnsSelector } from 'ipns/selector' 6 | import { CID } from 'multiformats/cid' 7 | import * as Block from 'multiformats/block' 8 | import * as codec from '@ipld/dag-cbor' 9 | import { sha256 as hasher } from 'multiformats/hashes/sha2' 10 | import all from 'it-all' 11 | import type { Helia } from '@helia/interface' 12 | import type { ProviderEvent } from '@libp2p/interface-dht' 13 | import type { PeerId } from '@libp2p/interface-peer-id' 14 | import type { BlockView } from 'multiformats/interface' 15 | 16 | import './globals.js' 17 | import { createHeliaNode } from './create-helia.js' 18 | import { DynamicContent } from './dynamic-content.js' 19 | 20 | const createKadDht = (clientMode: boolean) => 21 | kadDHT({ 22 | validators: { ipns: ipnsValidator }, 23 | selectors: { ipns: ipnsSelector }, 24 | clientMode 25 | }) 26 | 27 | const createLibp2pConfig = (clientMode: boolean) => ({ 28 | dht: createKadDht(clientMode), // kademlia dht instance 29 | connectionManager: { minConnections: 0 } // disable autodial 30 | }) 31 | 32 | const client1 = await createHeliaNode(createLibp2pConfig(true)) 33 | const client2 = await createHeliaNode(createLibp2pConfig(true)) 34 | const server = await createHeliaNode(createLibp2pConfig(false)) 35 | console.log('server is pinning ipld and serving dht ipns and provider records') 36 | 37 | const name1 = ipns(client1, [dht(client1)]) 38 | const name2 = ipns(client2, [dht(client2)]) 39 | 40 | // manifest document describes the dynamic content 41 | const dynamicContent = await DynamicContent({ 42 | protocol: '/dynamic-content-example/set/1.0.0', 43 | param: { network: 1 } 44 | }) 45 | // dynamic-content id is permutation of the manifest document's cid 46 | const dcid = dynamicContent.id 47 | 48 | // (dcid -> ipns) 49 | // add ipns key as provider for dcid 50 | const advertise = (client: Helia) => async () => await all(client.libp2p.dht.provide(dcid)) 51 | // find providers of dcid to get ipns of collaborators 52 | const query = (client: Helia) => async () => { 53 | let i = 0 54 | let providers: ProviderEvent[] = [] 55 | while (providers.length === 0 && i <3 /* u */) { 56 | const responses = await all(client.libp2p.dht.findProviders(dcid)) 57 | providers = responses.filter(r => r.name === 'PROVIDER') as ProviderEvent[] 58 | i++ 59 | } 60 | 61 | if (i > 0) { 62 | // the first query after dialing the protocol often returns an empty response 63 | console.log('dht query returned empty response') 64 | } 65 | if (i === 3) { 66 | throw new Error('cannot find providers') 67 | } 68 | 69 | return providers[0].providers[0].id 70 | } 71 | 72 | // (ipns -> cid) 73 | // update ipns record 74 | const publish = (client: Helia, name: IPNS) => async (cid: CID) => await name.publish(client.libp2p.peerId, cid) 75 | // resolve ipns record 76 | const resolve = (name: IPNS) => async (peerId: PeerId) => await name.resolve(peerId) 77 | 78 | // (cid -> data) 79 | // push data to reliable host 80 | const push = async (b: BlockView) => await server.blockstore.put(b.cid, b.bytes) 81 | // pull data over ipfs 82 | const pull = (client: Helia) => async (cid: CID) => await client.blockstore.get(cid) 83 | 84 | // (data -> set) 85 | // encode set to ipld 86 | const encode = async (s: Set) => 87 | await Block.encode({ value: Array.from(set1), codec, hasher }) 88 | // decode set from ipld 89 | const decode = async (bytes: Uint8Array) => 90 | new Set((await Block.decode({ bytes, codec, hasher })).value) 91 | 92 | // (set + set) 93 | // add value to set 94 | const add = (s: Set) => (v: string) => s.add(v) 95 | // merge local and remote replicas 96 | const merge = (l: Set, r: Set) => r.forEach(l.add.bind(l)) 97 | 98 | const set1: Set = new Set() 99 | const set2: Set = new Set() 100 | 101 | // write to client1 102 | const update = async (...values: string[]) => { 103 | const diff = Array.from(values).filter(value => !set1.has(value)) 104 | for (const value of values) { add(set1)(value) } 105 | console.log(`client1: added new values to set { ${diff.join(', ')} }`) 106 | console.log(`client1: set state: { ${Array.from(set1).join(', ')} }`) 107 | const block = await encode(set1) 108 | console.log(`client1: encoded to raw data`) 109 | await push(block) 110 | console.log(`client1: pushed data to pinner`) 111 | await publish(client1, name1)(block.cid) 112 | console.log(`client1: published ipns:${client1.libp2p.peerId} with value cid:${block.cid}`) 113 | await advertise(client1)() 114 | console.log(`client1: advertised ipns:${client1.libp2p.peerId} as set provider`) 115 | } 116 | // sync to client2 117 | const sync = async () => { 118 | const peerId = await query(client2)() 119 | console.log(`client2: found ipns:${peerId} as set provider`) 120 | const cid = await resolve(name2)(peerId) 121 | console.log(`client2: resolved ipns:${peerId} to ${cid}`) 122 | const bytes = await pull(client2)(cid) 123 | console.log(`client2: resolved ipfs:${cid} to raw data`) 124 | const set1 = await decode(bytes) 125 | console.log(`client2: decoded raw data`) 126 | const diff = Array.from(set1).filter(value => !set2.has(value)) 127 | merge(set2, set1) 128 | console.log(`client2: added new values to set { ${diff.join(', ')} }`) 129 | console.log(`client2: set state: { ${Array.from(set2).join(', ')} }`) 130 | } 131 | 132 | const getClientName = (client: Helia) => client === client1 ? 'client1' : 'client2' 133 | const connect = async (client: Helia) => { 134 | await client.libp2p.dialProtocol((server.libp2p.getMultiaddrs())[0], '/ipfs/lan/kad/1.0.0') 135 | console.log('%s: online', getClientName(client)) 136 | } 137 | const disconnect = async (client: Helia) => { 138 | await client.libp2p.getConnections().forEach(connection => connection.close()) 139 | console.log('%s: offline', getClientName(client)) 140 | } 141 | 142 | // client1 comes online, makes changes, and goes offline 143 | { 144 | await connect(client1) 145 | await update('nerf this') 146 | await disconnect(client1) 147 | } 148 | 149 | console.log(` 150 | --- no peers online, Zzzzz --- 151 | `) 152 | 153 | await new Promise(resolve => setTimeout(resolve, 3000)) 154 | 155 | // client2 comes online, merges changes, and goes offline 156 | { 157 | await connect(client2) 158 | await sync() 159 | await disconnect(client2) 160 | } 161 | 162 | // non-interactive example 163 | if (process.argv[1].endsWith('dynamic-content/dist/index.js')) { 164 | await Promise.all([ 165 | client1.stop(), 166 | client2.stop(), 167 | server.stop() 168 | ]) 169 | await process.exit(0) 170 | } 171 | 172 | global.client1 = client1 173 | global.client2 = client2 174 | global.server = server 175 | global.name1 = name1 176 | global.name2 = name2 177 | global.set1 = set1 178 | global.set2 = set2 179 | global.dynamicContent = dynamicContent 180 | global.update = update 181 | global.sync = sync 182 | global.connect = connect 183 | global.disconnect = disconnect 184 | -------------------------------------------------------------------------------- /src/interactive.ts: -------------------------------------------------------------------------------- 1 | import repl from 'repl' 2 | await import('./index.js') 3 | 4 | console.log(` 5 | --- interactive example --- 6 | `) 7 | 8 | await connect(client1) 9 | await connect(client2) 10 | 11 | global.help = 12 | ` 13 | Usage: 14 | 15 | globals 16 | 17 | help: this message 18 | 19 | client1: helia client node (sender) 20 | client2: helia client node (receiver) 21 | server: helia ipld/ipns pinner and dht server 22 | 23 | // compare the 2 clients sets 24 | set1: client1's set variable 25 | set2: client2's set variable 26 | 27 | await connect() // connects client to server 28 | await disconnect() // disconnects client from server 29 | 30 | await update(...) // create and publish changes from client1 - requires client1 to be connected 31 | await sync() // syncs changes to client2 - requires client2 to be connected 32 | ` 33 | console.log(help) 34 | 35 | repl.start('> ').on('exit', async () => { 36 | await Promise.all([ 37 | client1.stop(), 38 | client2.stop(), 39 | server.stop() 40 | ]) 41 | process.exit(0) 42 | }) 43 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "ES2022", /* Specify what module code is generated. */ 29 | "rootDir": "./src", /* Specify the root folder within your source files. */ 30 | "moduleResolution": "nodenext", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | } 109 | } 110 | --------------------------------------------------------------------------------