├── .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 |
--------------------------------------------------------------------------------