OverviewFilesCommitsIssuesDocsReleasesPeers

git-remote-punch commits / c2cbcdf

Initial commit — git-remote-punch (extracted from pear-git v1)
P2P git transport for punch:// URLs. Extracted from pear-git v1's in-tree bin/git-remote-punch so it can be maintained as a first-class project, survive v1 decommissioning, and be shared with other consumers (pear-git-v3 daemon peers, standalone users). Scope kept minimal — client-only. Server-side git-over-Hyperswarm (topic announcement, git-upload-pack/git-receive-pack handlers) stays in the daemon that advertises the repos. Layout: bin/git-remote-punch executable — git auto-discovers via PATH lib/derive-topic.js deriveTopicFromKey(key, repo) → 32B topic lib/petnames.js PetnameManager (unchanged from v1) lib/topic-connector.js Client-side Hyperswarm connect (TopicConnector extracted from v1 topic-manager.js; server-side TopicManager deliberately NOT included — that's the daemon's job) lib/git-p2p-client.js Opening service header writer Preserves pear-git-specific features that upstream holepunchto/git-remote-punch-transport doesn't have: - Petname resolution (punch://tabertron/repo) - HTTPS fallback (?https=... query param) - Bare-runtime (bare-subprocess, bare-fs, bare-path, bare-os) - Persistent Noise keypair at ~/.config/pear-git/peer-identity.json so servers recognize the same client across invocations - Backpressure + manual bidirectional forwarding (not .pipe()) to avoid SecretStream _final() closing the stream before push status can be sent back - 10s safety timeout after stdin end to prevent io_uring spin on SecretStream teardown races Verified locally: `echo capabilities | bare bin/git-remote-punch ...` returns "connect" as expected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c2cbcdf72332efc293309efbdf337bcdfdb46c6c
by fleeky <fleeky@localhost> · 2026-04-16T16:57:46.000Z

Changed files (9) +2459 -0

.gitignore +4 -0
……@@ -0,0 +1,4 @@
1node_modules/
2.DS_Store
3*.log
4.env
README.md +95 -0
……@@ -0,0 +1,95 @@
1# git-remote-punch
2
3Git remote helper for `punch://` URLs. P2P git transport over
4Hyperswarm — no server, just peers.
5
6**Why this fork exists.** The upstream Holepunch project has moved its
7Git-over-P2P work to `gip-transport` (uses `git+pear://` URLs and a
8HyperDB-backed object store). This repo preserves the original
9`punch://` transport as a standalone tool with pear-git-specific
10extensions:
11
12- **Petname support** — `git clone punch://tabertron/repo` resolves via
13 a local `~/.pear-git/remotes.json` file
14- **HTTPS fallback** — `git clone punch://KEY/repo?https=https://...`
15 transparently falls back to standard HTTPS git transport if the P2P
16 path fails
17- **Bare runtime** — uses `bare-subprocess`, `bare-fs`, `bare-path`,
18 `bare-os` for compatibility with the Pear ecosystem
19
20## Install
21
22```bash
23# From the repo's root:
24npm install
25
26# Install the launcher on $PATH:
27cp bin/git-remote-punch ~/.local/bin/
28# OR create a wrapper that execs this bin under Bare:
29cat > ~/.local/bin/git-remote-punch << EOF
30#!/bin/sh
31exec bare /path/to/git-remote-punch/bin/git-remote-punch "\$@"
32EOF
33chmod +x ~/.local/bin/git-remote-punch
34```
35
36Git auto-discovers any executable on `$PATH` named
37`git-remote-<scheme>`, so no additional wiring is needed once the
38binary is installed.
39
40## Usage
41
42```bash
43# Canonical form — server pubkey (64 hex chars)
44git clone punch://3f9b09e0831b13e755d4b0af079a5b56f38efed122d561af5069e1e35cf2a1c2/my-repo
45
46# Petname form (after `pear-git remote add tabertron 3f9b09e0...`)
47git clone punch://tabertron/my-repo
48
49# With HTTPS fallback
50git clone 'punch://TABERTRON_KEY/my-repo?https=https://tabertron.example/my-repo.git'
51```
52
53## Protocol
54
551. Parse `punch://serverkey/repo` URL
562. Derive deterministic topic: `hash(serverKey + repoName).subarray(0, 32)`
573. Join the Hyperswarm topic as a client, wait for the server peer
584. On connect: write `git-upload-pack\0<repo>\0` (or
59 `git-receive-pack\0<repo>\0`) as opening header
605. Bidirectional proxy between stdin/stdout (git) and the encrypted
61 Hyperswarm connection (server)
62
63Server-side: pear-git-v3's `hyper-sync` (or pear-git v1's
64`GitP2PHandler`) accepts the topic, reads the header, spawns the
65corresponding git process, and proxies.
66
67## Dependencies
68
69- `hyperswarm` — DHT + peer discovery + Noise-encrypted connections
70- `hypercore-crypto` — topic derivation (SHA-256 of pubkey + repo name)
71- `bare-subprocess`, `bare-fs`, `bare-path`, `bare-os` — runtime
72- `bare-node-runtime` (loaded dynamically) — Node globals in Bare
73
74## Layout
75
76```
77bin/git-remote-punch Executable — git invokes this directly
78lib/derive-topic.js deriveTopicFromKey(serverKey, repoName) → 32B topic
79lib/petnames.js PetnameManager — local name ↔ pubkey resolution
80lib/topic-connector.js TopicConnector — Hyperswarm client-side connect
81lib/git-p2p-client.js GitP2PClient — writes the opening service header
82```
83
84## Relationship to upstream Holepunch
85
86Originally adapted from `holepunchto/git-remote-punch-transport`.
87Holepunch has since moved toward `gip-transport` (git+pear://). This
88repo maintains the punch:// transport for the pear-git ecosystem. If
89you're starting fresh, consider `gip-transport` for new work. This
90tool exists because pear-git's production infrastructure (tabertron,
91stortron, user machines) runs on punch:// today.
92
93## License
94
95MIT
bin/git-remote-punch +281 -0
……@@ -0,0 +1,281 @@
1#!/usr/bin/env bare
2/**
3 * git-remote-punch — Git remote helper for punch:// URLs.
4 *
5 * Primary P2P git transport. Provides clone/fetch/push over Hyperswarm
6 * between a git client and a server that advertises repository topics
7 * (e.g., pear-git-v3's hyper-sync, or pear-git v1's P2P handler).
8 *
9 * Usage:
10 * git clone punch://serverkey/repo
11 * git clone punch://petname/repo # if petname configured
12 * git clone punch://serverkey/repo?https=https://fallback.url/repo.git # HTTPS fallback
13 *
14 * Git invokes this with two arguments:
15 * $1 = remote name (usually "origin" or the URL itself)
16 * $2 = remote URL (punch://...)
17 *
18 * Protocol:
19 * 1. Parse punch:// URL to get server key and repo name
20 * 2. Derive topic: hash(serverKey + repoName)
21 * 3. Connect to topic via Hyperswarm (P2P)
22 * 4. If P2P fails, fall back to HTTPS URL if provided
23 * 5. Proxy stdin/stdout to connection
24 */
25
26// Bring Node globals into Bare.
27await import('bare-node-runtime/global')
28
29import { spawn } from 'bare-subprocess'
30import fs from 'bare-fs'
31import path from 'bare-path'
32import os from 'bare-os'
33import { fileURLToPath } from 'bare-url'
34
35// Resolve sibling lib/ from this script's own location, not cwd.
36const __dirname = path.dirname(fileURLToPath(import.meta.url))
37const libDir = path.resolve(__dirname, '..', 'lib')
38
39const { PetnameManager } = await import(path.join(libDir, 'petnames.js'))
40const { TopicConnector } = await import(path.join(libDir, 'topic-connector.js'))
41const { GitP2PClient } = await import(path.join(libDir, 'git-p2p-client.js'))
42
43function loadConfig () {
44 try {
45 const configPath = path.join(os.homedir(), '.config', 'pear-git', 'config.json')
46 const data = fs.readFileSync(configPath, 'utf-8')
47 return JSON.parse(data)
48 } catch {
49 return {}
50 }
51}
52
53const args = process.argv.slice(2)
54const remoteName = args[0]
55const remoteUrl = args[1] || remoteName
56
57async function main () {
58 const config = loadConfig()
59 const petnames = new PetnameManager()
60 await petnames.init()
61
62 let parsed
63 let httpsUrl = null
64
65 try {
66 const urlObj = new URL(remoteUrl)
67 httpsUrl = urlObj.searchParams.get('https')
68
69 // Remove query params for petname parsing
70 const cleanUrl = urlObj.protocol + '//' + urlObj.host + urlObj.pathname
71 parsed = petnames.parseUrl(cleanUrl)
72
73 if (!httpsUrl && config.defaultGateway) {
74 httpsUrl = config.defaultGateway + '/' + parsed.repo + '.git'
75 }
76 } catch (err) {
77 console.error('error: ' + err.message)
78 process.exit(128)
79 }
80
81 const { key, repo, isPetname, petname } = parsed
82
83 if (isPetname) {
84 console.error('[punch] Resolved ' + petname + ' -> ' + key.slice(0, 8) + '...')
85 }
86 if (httpsUrl) {
87 console.error('[punch] HTTPS fallback: ' + httpsUrl)
88 }
89
90 const stdin = process.stdin
91 const stdout = process.stdout
92 const stderr = process.stderr
93
94 let buffer = Buffer.alloc(0)
95
96 const commandHandler = async (chunk) => {
97 const chunkBuf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)
98 buffer = Buffer.concat([buffer, chunkBuf])
99
100 let newlineIdx
101 while ((newlineIdx = buffer.indexOf(0x0a)) !== -1) {
102 const line = buffer.slice(0, newlineIdx).toString('utf-8').trim()
103 buffer = buffer.slice(newlineIdx + 1)
104
105 if (line === '') continue
106
107 const shouldPipe = await handleCommand(line, key, repo, httpsUrl, stdout, stderr)
108 if (shouldPipe) {
109 // CRITICAL: Remove this listener before piping starts.
110 // In streamx, .on('data') and .pipe() compete for data. If both
111 // are active, the data handler consumes chunks that should flow
112 // through the pipe, breaking push.
113 stdin.removeListener('data', commandHandler)
114 return
115 }
116 }
117 }
118
119 stdin.on('data', commandHandler)
120
121 stdin.on('end', () => {
122 process.exit(0)
123 })
124}
125
126async function handleCommand (command, serverKey, repoName, httpsUrl, stdout, stderr) {
127 const [cmd, ...args] = command.split(' ')
128
129 switch (cmd) {
130 case 'capabilities':
131 stdout.write('connect\n')
132 stdout.write('\n')
133 return false
134
135 case 'connect': {
136 const service = args[0]
137 await handleConnect(service, serverKey, repoName, httpsUrl, stdout, stderr)
138 return true
139 }
140
141 case 'list':
142 stderr.write('[punch] list not implemented, use connect\n')
143 stdout.write('\n')
144 return false
145
146 default:
147 stderr.write('[punch] Unknown command: ' + cmd + '\n')
148 process.exit(1)
149 return false
150 }
151}
152
153async function handleConnect (service, serverKey, repoName, httpsUrl, stdout, stderr) {
154 stderr.write('[punch] Connecting to ' + serverKey.slice(0, 8) + '.../' + repoName + '\n')
155
156 const connector = new TopicConnector({ timeout: 15000 })
157 await connector.init()
158
159 try {
160 stderr.write('[punch] Searching for peers...\n')
161 const conn = await connector.connect(serverKey, repoName)
162 stderr.write('[punch] Connected via P2P!\n')
163
164 const client = new GitP2PClient()
165 await client.initiate(conn, service, repoName)
166
167 // Remove ALL listeners from stdin before forwarding
168 process.stdin.removeAllListeners('data')
169 process.stdin.removeAllListeners('end')
170
171 // No connection timeout — large repos (1+ GB) can transfer for minutes.
172 // Backpressure keeps data flowing; stale connections are detected by
173 // the stream's error/close events.
174
175 // Tell git we're ready FIRST (before any data forwarding) so the blank
176 // line precedes the server's ref advertisement on stdout.
177 stdout.write('\n')
178
179 let cleaningUp = false
180 function cleanup (code) {
181 if (cleaningUp) return
182 cleaningUp = true
183 // Graceful teardown — destroy swarm properly.
184 // Requires udx-native >= 1.20.3 (libudx 0420f62) which fixes
185 // use-after-free and double-free bugs in stream teardown.
186 connector.destroy().catch(() => {}).then(() => process.exit(code))
187 }
188
189 // Manual bidirectional forwarding — NOT pipe()!
190 // streamx pipe() unconditionally calls dest.end() when source ends,
191 // and SecretStream._final() closes both directions of the noise stream.
192 // This kills push (server can't send status after client sends pack).
193 //
194 // Backpressure: when write() returns false, pause the source. Resume
195 // on 'drain'. Without this, large repos overflow the send buffer and
196 // cause "unexpected disconnect" / "bad pack header".
197 let stdinEnded = false
198 process.stdin.on('data', (chunk) => {
199 if (!conn.write(chunk)) {
200 process.stdin.pause()
201 }
202 })
203 conn.on('drain', () => {
204 if (!stdinEnded) process.stdin.resume()
205 })
206
207 process.stdin.on('end', () => {
208 stdinEnded = true
209 conn.end()
210 // Safety: if conn.close doesn't fire within 10s after stdin ends, force
211 // exit. Prevents io_uring spin when SecretStream teardown races.
212 setTimeout(() => cleanup(0), 10000).unref()
213 })
214
215 conn.on('data', (chunk) => {
216 if (!stdout.write(chunk)) {
217 conn.pause()
218 }
219 })
220 stdout.on('drain', () => conn.resume())
221
222 conn.on('close', () => cleanup(0))
223
224 conn.on('error', (err) => {
225 stderr.write('[punch] Connection error: ' + err.message + '\n')
226 cleanup(128)
227 })
228 } catch (err) {
229 stderr.write('[punch] P2P connection failed: ' + err.message + '\n')
230
231 // Destroy swarm before HTTPS fallback. Hard kill timeout as fallback —
232 // connector.destroy() can trigger libudx double-free races.
233 const hardKill = setTimeout(() => process.exit(128), 5000)
234 hardKill.unref()
235 try { await connector.destroy() } catch {}
236 clearTimeout(hardKill)
237
238 if (httpsUrl) {
239 stderr.write('[punch] Falling back to HTTPS: ' + httpsUrl + '\n')
240 await handleHttpsFallback(service, httpsUrl, stdout, stderr)
241 } else {
242 stderr.write('[punch] No HTTPS fallback available\n')
243 process.exit(128)
244 }
245 }
246}
247
248async function handleHttpsFallback (service, httpsUrl, stdout, stderr) {
249 const proc = spawn('git-remote-https', ['origin', httpsUrl], {
250 stdio: ['pipe', 'pipe', 'pipe']
251 })
252
253 proc.stdin.write('connect ' + service + '\n')
254
255 process.stdin.pipe(proc.stdin)
256 proc.stdout.pipe(stdout)
257
258 proc.stderr.on('data', (data) => {
259 const msg = data.toString()
260 if (msg.includes('error') || msg.includes('fatal')) {
261 stderr.write(data)
262 }
263 })
264
265 proc.on('close', (code) => {
266 if (code !== 0) {
267 stderr.write('[punch] HTTPS fallback exited with code ' + code + '\n')
268 }
269 process.exit(code || 0)
270 })
271
272 proc.on('error', (err) => {
273 stderr.write('[punch] HTTPS fallback error: ' + err.message + '\n')
274 process.exit(128)
275 })
276}
277
278main().catch(err => {
279 console.error('[punch] Fatal error: ' + err.message)
280 process.exit(1)
281})
lib/derive-topic.js +25 -0
……@@ -0,0 +1,25 @@
1import crypto from 'hypercore-crypto'
2
3/**
4 * Derive a 32-byte Hyperswarm topic from a server's public key and a
5 * repo name.
6 *
7 * topic = hash(serverKey + repoName).subarray(0, 32)
8 *
9 * Deterministic and reproducible — clients and servers must compute the
10 * same topic without any shared state beyond the key + name.
11 *
12 * @param {string|Buffer} serverKey - Server's public key (hex string or bytes)
13 * @param {string} repoName - Repository name
14 * @returns {Buffer} - 32-byte topic hash
15 */
16export function deriveTopicFromKey (serverKey, repoName) {
17 const keyBuffer = typeof serverKey === 'string'
18 ? Buffer.from(serverKey, 'hex')
19 : serverKey
20
21 return crypto.hash(Buffer.concat([
22 keyBuffer,
23 Buffer.from(repoName, 'utf-8')
24 ])).subarray(0, 32)
25}
lib/git-p2p-client.js +38 -0
……@@ -0,0 +1,38 @@
1/**
2 * Client-side git P2P helper. Sends the opening service header on a
3 * P2P connection, then returns it for bidirectional proxying.
4 *
5 * Protocol: service\0repoName\0
6 * e.g., "git-upload-pack\0myrepo\0" for clone/fetch
7 * "git-receive-pack\0myrepo\0" for push
8 *
9 * The server side (pear-git-v3's hyper-sync, or pear-git v1's P2P
10 * handler) reads this header and spawns the corresponding git process,
11 * then proxies its stdin/stdout over the connection.
12 */
13export class GitP2PClient {
14 constructor (options = {}) {
15 this.petnames = options.petnames
16 }
17
18 /**
19 * Initiate a git operation over P2P.
20 * @param {Stream} conn - Hyperswarm connection stream
21 * @param {string} service - 'git-upload-pack' or 'git-receive-pack'
22 * @param {string} repoName - Repository name
23 * @returns {Stream} - The same connection, for caller-managed proxying
24 */
25 async initiate (conn, service, repoName) {
26 const header = Buffer.concat([
27 Buffer.from(service, 'utf-8'),
28 Buffer.from([0]),
29 Buffer.from(repoName, 'utf-8'),
30 Buffer.from([0])
31 ])
32
33 conn.write(header)
34 return conn
35 }
36}
37
38export default GitP2PClient
lib/petnames.js +195 -0
……@@ -0,0 +1,195 @@
1/**
2 * Petname Manager for Pear-Git P2P URLs
3 *
4 * Provides local resolution of human-memorable names to server public keys.
5 * Petnames are NOT globally portable - they are local mappings that users
6 * create after receiving canonical key-based URLs.
7 *
8 * Example:
9 * Canonical: pear://zupx3qzpwj61hdt1bxanabctcyxqqu3arogctwim4qt3wfbzn4bo/wirecore
10 * Local: pear://tabertron/wirecore (after adding petname)
11 */
12
13import fs from 'bare-fs'
14import path from 'bare-path'
15import os from 'bare-os'
16
17export class PetnameManager {
18 constructor(options = {}) {
19 const homeDir = os.homedir()
20 this.configDir = options.configDir || path.join(homeDir, '.pear-git')
21 this.remotesFile = path.join(this.configDir, 'remotes.json')
22 this.remotes = {}
23 }
24
25 /**
26 * Initialize the petname manager
27 * Creates config directory and loads existing petnames
28 */
29 async init() {
30 // Ensure config directory exists
31 try {
32 await fs.promises.mkdir(this.configDir, { recursive: true })
33 } catch (err) {
34 if (err.code !== 'EEXIST') throw err
35 }
36
37 // Load existing remotes
38 try {
39 const data = await fs.promises.readFile(this.remotesFile, 'utf-8')
40 this.remotes = JSON.parse(data)
41 } catch (err) {
42 if (err.code !== 'ENOENT') throw err
43 this.remotes = {}
44 }
45 }
46
47 /**
48 * Add a petname for a server public key
49 * @param {string} name - Human-memorable name (e.g., "tabertron")
50 * @param {string} key - Server public key (64 char hex)
51 * @param {Object} metadata - Optional metadata (description, etc.)
52 */
53 async add(name, key, metadata = {}) {
54 if (!this._isValidPetname(name)) {
55 throw new Error(`Invalid petname: "${name}". Use lowercase letters, numbers, and hyphens.`)
56 }
57
58 if (!this._isValidKey(key)) {
59 throw new Error(`Invalid key: "${key}". Must be 64 character hex string.`)
60 }
61
62 this.remotes[name] = {
63 key: key.toLowerCase(),
64 addedAt: Date.now(),
65 ...metadata
66 }
67
68 await this._save()
69 return { name, key: this.remotes[name].key }
70 }
71
72 /**
73 * Remove a petname
74 * @param {string} name - Petname to remove
75 */
76 async remove(name) {
77 if (!this.remotes[name]) {
78 throw new Error(`Petname "${name}" not found`)
79 }
80
81 delete this.remotes[name]
82 await this._save()
83 }
84
85 /**
86 * Resolve a petname to its public key
87 * @param {string} name - Petname to resolve
88 * @returns {string|null} - Public key or null if not found
89 */
90 resolve(name) {
91 const entry = this.remotes[name]
92 return entry ? entry.key : null
93 }
94
95 /**
96 * List all petnames
97 * @returns {Array} - Array of { name, key, addedAt, ... }
98 */
99 list() {
100 return Object.entries(this.remotes).map(([name, data]) => ({
101 name,
102 ...data
103 }))
104 }
105
106 /**
107 * Parse a pear:// or punch:// URL and resolve petnames
108 * @param {string} url - punch://key/repo, pear://key/repo, or with petnames
109 * @returns {Object} - { key, repo, isPetname }
110 */
111 parseUrl(url) {
112 // Accept both punch:// and pear:// protocols
113 let withoutProtocol
114 if (url.startsWith('punch://')) {
115 withoutProtocol = url.slice(8) // Remove "punch://"
116 } else if (url.startsWith('pear://')) {
117 withoutProtocol = url.slice(7) // Remove "pear://"
118 } else {
119 throw new Error(`Invalid URL: "${url}". Must start with punch:// or pear://`)
120 }
121
122 const slashIndex = withoutProtocol.indexOf('/')
123
124 if (slashIndex === -1) {
125 throw new Error(`Invalid URL: "${url}". Must include repo name (punch://key/repo)`)
126 }
127
128 const keyOrPetname = withoutProtocol.slice(0, slashIndex)
129 const repo = withoutProtocol.slice(slashIndex + 1)
130
131 if (!repo) {
132 throw new Error(`Invalid URL: "${url}". Missing repo name`)
133 }
134
135 // Check if it's a full key (64 hex chars) or a petname
136 if (this._isValidKey(keyOrPetname)) {
137 return {
138 key: keyOrPetname.toLowerCase(),
139 repo,
140 isPetname: false
141 }
142 }
143
144 // Try to resolve as petname
145 const resolvedKey = this.resolve(keyOrPetname)
146 if (!resolvedKey) {
147 throw new Error(`Unknown petname: "${keyOrPetname}". Add it with: pear-git remote add ${keyOrPetname} <key>`)
148 }
149
150 return {
151 key: resolvedKey,
152 repo,
153 isPetname: true,
154 petname: keyOrPetname
155 }
156 }
157
158 /**
159 * Format a canonical pear URL from key and repo
160 * @param {string} key - Server public key
161 * @param {string} repo - Repository name
162 * @returns {string} - pear://key/repo
163 */
164 formatUrl(key, repo) {
165 return `pear://${key}/${repo}`
166 }
167
168 /**
169 * Format a short display URL (truncated key)
170 * @param {string} key - Server public key
171 * @param {string} repo - Repository name
172 * @returns {string} - pear://abc123.../repo
173 */
174 formatShortUrl(key, repo) {
175 const shortKey = key.slice(0, 8) + '...'
176 return `pear://${shortKey}/${repo}`
177 }
178
179 // === Private Methods ===
180
181 _isValidPetname(name) {
182 return /^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$/.test(name) || /^[a-z0-9]$/.test(name)
183 }
184
185 _isValidKey(key) {
186 return /^[a-f0-9]{64}$/i.test(key)
187 }
188
189 async _save() {
190 const data = JSON.stringify(this.remotes, null, 2)
191 await fs.promises.writeFile(this.remotesFile, data, 'utf-8')
192 }
193}
194
195export default PetnameManager
lib/topic-connector.js +115 -0
……@@ -0,0 +1,115 @@
1import fs from 'bare-fs'
2import path from 'bare-path'
3import os from 'bare-os'
4import crypto from 'hypercore-crypto'
5import Hyperswarm from 'hyperswarm'
6
7import { deriveTopicFromKey } from './derive-topic.js'
8
9/**
10 * Client-side P2P connector for punch:// URLs.
11 *
12 * Joins the Hyperswarm topic derived from a server's public key + repo
13 * name, waits for the first connection (the server), and returns the
14 * encrypted stream to the caller.
15 *
16 * Uses a persistent Noise keypair at ~/.config/pear-git/peer-identity.json
17 * so the peer's identity is stable across invocations (servers can then
18 * recognize returning clients by pubkey).
19 */
20export class TopicConnector {
21 constructor (options = {}) {
22 this.swarm = null
23 this.publicKey = null
24 this.options = options
25 }
26
27 /**
28 * Initialize the swarm with a persistent keypair.
29 */
30 async init () {
31 const keyPair = await this._loadOrCreateKeyPair()
32 this.publicKey = keyPair.publicKey
33 this.swarm = new Hyperswarm({ keyPair })
34 }
35
36 /**
37 * Return this peer's public key as hex.
38 */
39 getPublicKeyHex () {
40 return this.publicKey ? this.publicKey.toString('hex') : null
41 }
42
43 /**
44 * Connect to a server-advertised repository topic.
45 * @param {string|Buffer} serverKey - Server public key
46 * @param {string} repoName - Repository name
47 * @returns {Promise<Stream>} - Encrypted Noise connection
48 */
49 async connect (serverKey, repoName) {
50 const topic = deriveTopicFromKey(serverKey, repoName)
51
52 return new Promise((resolve, reject) => {
53 const timeout = setTimeout(() => {
54 reject(new Error('Connection timeout for ' + repoName))
55 }, this.options.timeout || 30000)
56
57 this.swarm.join(topic, { server: false, client: true })
58
59 this.swarm.once('connection', (conn) => {
60 clearTimeout(timeout)
61 resolve(conn)
62 })
63
64 this.swarm.once('error', (err) => {
65 clearTimeout(timeout)
66 reject(err)
67 })
68 })
69 }
70
71 /**
72 * Tear down the swarm. Safe to call multiple times.
73 */
74 async destroy () {
75 if (this.swarm) {
76 await this.swarm.destroy()
77 this.swarm = null
78 }
79 }
80
81 /**
82 * Load or create a persistent Noise keypair for this peer.
83 * Stored in ~/.config/pear-git/peer-identity.json (0600).
84 */
85 async _loadOrCreateKeyPair () {
86 const configDir = path.join(os.homedir(), '.config', 'pear-git')
87 const keyFile = path.join(configDir, 'peer-identity.json')
88
89 try {
90 const data = await fs.promises.readFile(keyFile, 'utf-8')
91 const saved = JSON.parse(data)
92 return {
93 publicKey: Buffer.from(saved.publicKey, 'hex'),
94 secretKey: Buffer.from(saved.secretKey, 'hex')
95 }
96 } catch {
97 // Generate new persistent identity
98 const keyPair = crypto.keyPair()
99
100 try {
101 await fs.promises.mkdir(configDir, { recursive: true })
102 } catch {}
103
104 await fs.promises.writeFile(keyFile, JSON.stringify({
105 publicKey: keyPair.publicKey.toString('hex'),
106 secretKey: keyPair.secretKey.toString('hex'),
107 createdAt: Date.now()
108 }, null, 2), { encoding: 'utf-8', mode: 0o600 })
109
110 return keyPair
111 }
112 }
113}
114
115export default TopicConnector
package-lock.json +1663 -0
……@@ -0,0 +1,1663 @@
1{
2 "name": "git-remote-punch",
3 "version": "0.1.0",
4 "lockfileVersion": 3,
5 "requires": true,
6 "packages": {
7 "": {
8 "name": "git-remote-punch",
9 "version": "0.1.0",
10 "dependencies": {
11 "bare-fs": "^4.5.3",
12 "bare-node-runtime": "^1.1.4",
13 "bare-os": "^3.6.2",
14 "bare-path": "^3.0.0",
15 "bare-subprocess": "^5.2.2",
16 "bare-url": "^2.3.2",
17 "hypercore-crypto": "^3.4.1",
18 "hyperswarm": "^4.8.2"
19 },
20 "bin": {
21 "git-remote-punch": "bin/git-remote-punch"
22 },
23 "devDependencies": {
24 "brittle": "^3.0.0"
25 },
26 "engines": {
27 "bare": ">=1.12.0"
28 }
29 },
30 "node_modules/@hyperswarm/secret-stream": {
31 "version": "6.9.1",
32 "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.9.1.tgz",
33 "integrity": "sha512-xb0S5y3YJwBakD77JOGBHlBxdp63mHClZoXBYoLv+9wH8e054ESKlmQptWqjJK5dv5VMUIVYOJB4MaOpB0JdGw==",
34 "license": "Apache-2.0",
35 "dependencies": {
36 "b4a": "^1.1.0",
37 "hypercore-crypto": "^3.3.1",
38 "noise-curve-ed": "^2.0.1",
39 "noise-handshake": "^4.0.0",
40 "sodium-secretstream": "^1.1.0",
41 "sodium-universal": "^5.0.0",
42 "streamx": "^2.14.0",
43 "timeout-refresh": "^2.0.0",
44 "unslab": "^1.3.0"
45 }
46 },
47 "node_modules/@jridgewell/resolve-uri": {
48 "version": "3.1.2",
49 "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
50 "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
51 "dev": true,
52 "license": "MIT",
53 "engines": {
54 "node": ">=6.0.0"
55 }
56 },
57 "node_modules/@jridgewell/sourcemap-codec": {
58 "version": "1.5.5",
59 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
60 "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
61 "dev": true,
62 "license": "MIT"
63 },
64 "node_modules/@jridgewell/trace-mapping": {
65 "version": "0.3.31",
66 "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
67 "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
68 "dev": true,
69 "license": "MIT",
70 "dependencies": {
71 "@jridgewell/resolve-uri": "^3.1.0",
72 "@jridgewell/sourcemap-codec": "^1.4.14"
73 }
74 },
75 "node_modules/@types/istanbul-lib-coverage": {
76 "version": "2.0.6",
77 "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
78 "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
79 "dev": true,
80 "license": "MIT"
81 },
82 "node_modules/adaptive-timeout": {
83 "version": "1.0.1",
84 "resolved": "https://registry.npmjs.org/adaptive-timeout/-/adaptive-timeout-1.0.1.tgz",
85 "integrity": "sha512-+seGiBtHqbnyZ0Quq/ZGxxwP66153WBABawa07/QeyuPFzbduPBjiGQAyCiriiLDzt3dkbMBskSlfqtRwblK8Q==",
86 "license": "Apache-2.0",
87 "dependencies": {
88 "xache": "^1.2.1"
89 }
90 },
91 "node_modules/b4a": {
92 "version": "1.8.0",
93 "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
94 "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
95 "license": "Apache-2.0",
96 "peerDependencies": {
97 "react-native-b4a": "*"
98 },
99 "peerDependenciesMeta": {
100 "react-native-b4a": {
101 "optional": true
102 }
103 }
104 },
105 "node_modules/bare-abort": {
106 "version": "2.0.13",
107 "resolved": "https://registry.npmjs.org/bare-abort/-/bare-abort-2.0.13.tgz",
108 "integrity": "sha512-zdc8l88eB11Jsz5rDd6sCAgv2kUFXgdrZWoMlgU6JMkfAi1/uuGFC3IEHswKbIRQTk5H3T5CMuechsXYxiaHlQ==",
109 "license": "Apache-2.0"
110 },
111 "node_modules/bare-abort-controller": {
112 "version": "1.1.1",
113 "resolved": "https://registry.npmjs.org/bare-abort-controller/-/bare-abort-controller-1.1.1.tgz",
114 "integrity": "sha512-A/3w+PHaGnjlrRcmBeuCk8v23SP35db1X6a5GOkTVSloVmMEWdVhhnlrJWzIvnLJh79ljhAFS1lvLRev09LCGg==",
115 "license": "Apache-2.0",
116 "peer": true,
117 "dependencies": {
118 "bare-events": "^2.7.0"
119 }
120 },
121 "node_modules/bare-addon-resolve": {
122 "version": "1.10.0",
123 "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.10.0.tgz",
124 "integrity": "sha512-sSd0jieRJlDaODOzj0oe0RjFVC1QI0ZIjGIdPkbrTXsdVVtENg14c+lHHAhHwmWCZ2nQlMhy8jA3Y5LYPc/isA==",
125 "license": "Apache-2.0",
126 "dependencies": {
127 "bare-module-resolve": "^1.10.0",
128 "bare-semver": "^1.0.0"
129 },
130 "peerDependencies": {
131 "bare-url": "*"
132 },
133 "peerDependenciesMeta": {
134 "bare-url": {
135 "optional": true
136 }
137 }
138 },
139 "node_modules/bare-ansi-escapes": {
140 "version": "2.2.3",
141 "resolved": "https://registry.npmjs.org/bare-ansi-escapes/-/bare-ansi-escapes-2.2.3.tgz",
142 "integrity": "sha512-02ES4/E2RbrtZSnHJ9LntBhYkLA6lPpSEeP8iqS3MccBIVhVBlEmruF1I7HZqx5Q8aiTeYfQVeqmrU9YO2yYoQ==",
143 "license": "Apache-2.0",
144 "dependencies": {
145 "bare-stream": "^2.6.5"
146 },
147 "peerDependencies": {
148 "bare-buffer": "*"
149 },
150 "peerDependenciesMeta": {
151 "bare-buffer": {
152 "optional": true
153 }
154 }
155 },
156 "node_modules/bare-assert": {
157 "version": "1.2.0",
158 "resolved": "https://registry.npmjs.org/bare-assert/-/bare-assert-1.2.0.tgz",
159 "integrity": "sha512-c6uvgvTJBspTDxtVnPgrBKmLgcpW3Fp72NVKDLg6oT4QjQbhGtvrkHMhGYMK1sh4vjBHOBmuUalyt9hSzV37fQ==",
160 "license": "Apache-2.0",
161 "dependencies": {
162 "bare-inspect": "^3.1.2"
163 }
164 },
165 "node_modules/bare-async-hooks": {
166 "version": "0.0.0",
167 "resolved": "https://registry.npmjs.org/bare-async-hooks/-/bare-async-hooks-0.0.0.tgz",
168 "integrity": "sha512-xNfGwUobaomCGMGAqohAekS3uMCj+4tvI4AoOaJnO7NfpN+dvFdkC5xkeQtmZzs2vxf2TR5J6i5FDd1ImCZERw==",
169 "license": "Apache-2.0"
170 },
171 "node_modules/bare-buffer": {
172 "version": "3.6.0",
173 "resolved": "https://registry.npmjs.org/bare-buffer/-/bare-buffer-3.6.0.tgz",
174 "integrity": "sha512-/maRWEQ2eBkVNMbNFVsq1pHXJYVj4Y3AixwruB24eKZDs5Gtu0fixzvjYmBIuTsBMtVH5Yb27pQO9BhFa+IlIQ==",
175 "license": "Apache-2.0",
176 "engines": {
177 "bare": ">=1.20.0"
178 }
179 },
180 "node_modules/bare-bundle": {
181 "version": "1.10.0",
182 "resolved": "https://registry.npmjs.org/bare-bundle/-/bare-bundle-1.10.0.tgz",
183 "integrity": "sha512-4LVlnJAHr00Hh6Vu6ZUJS38rcEtJT3b3vChXSsBsJ2mk1TN0lQ+gzd+Dw5L0aV7uqDZv84smuwW+O02X7PfDlw==",
184 "license": "Apache-2.0",
185 "peerDependencies": {
186 "bare-buffer": "*",
187 "bare-url": "*"
188 },
189 "peerDependenciesMeta": {
190 "bare-buffer": {
191 "optional": true
192 },
193 "bare-url": {
194 "optional": true
195 }
196 }
197 },
198 "node_modules/bare-channel": {
199 "version": "5.2.3",
200 "resolved": "https://registry.npmjs.org/bare-channel/-/bare-channel-5.2.3.tgz",
201 "integrity": "sha512-2cRErqS4fzzr3ZUSd5W67ka70dZKJ1VWrCsvxPVC8vr3rWvd4aaCG5iCDas9+MFVaUIWvfw04+NH4+FHQDddMQ==",
202 "license": "Apache-2.0",
203 "dependencies": {
204 "bare-events": "^2.0.0",
205 "bare-stream": "^2.7.0",
206 "bare-structured-clone": "^1.4.0"
207 },
208 "engines": {
209 "bare": ">=1.7.0"
210 }
211 },
212 "node_modules/bare-console": {
213 "version": "6.1.0",
214 "resolved": "https://registry.npmjs.org/bare-console/-/bare-console-6.1.0.tgz",
215 "integrity": "sha512-BziGTEIyVh0zn78842mmpOLGTEFE7/S4A5Tb0d2iIu7bryVdoiF0przraYMetJckHxm0P5ITTZrYfRuYRr9n/Q==",
216 "license": "Apache-2.0",
217 "dependencies": {
218 "bare-hrtime": "^2.0.0",
219 "bare-logger": "^2.0.0",
220 "bare-system-logger": "^1.0.2"
221 }
222 },
223 "node_modules/bare-cov": {
224 "version": "1.2.1",
225 "resolved": "https://registry.npmjs.org/bare-cov/-/bare-cov-1.2.1.tgz",
226 "integrity": "sha512-SHNqb/WG9udUEj8m5qGSehoUQ9o0Xzv8nrf4HIdmG+KNU/XdhPLhTP5VPrHnSAMAXhAzEB4Q+2IYZ0x9qPzN1g==",
227 "dev": true,
228 "license": "Apache-2.0",
229 "dependencies": {
230 "bare-fs": "^4.1.2",
231 "bare-inspector": "^4.0.1",
232 "bare-path": "^3.0.0",
233 "bare-process": "^4.2.1",
234 "bare-url": "^2.1.5",
235 "bare-v8-to-istanbul": "^1.0.2",
236 "picomatch": "^4.0.2",
237 "which-runtime": "^1.2.1"
238 }
239 },
240 "node_modules/bare-crypto": {
241 "version": "1.13.4",
242 "resolved": "https://registry.npmjs.org/bare-crypto/-/bare-crypto-1.13.4.tgz",
243 "integrity": "sha512-JiCZ5l2YOG1y8J7yy1BCAKTCZrPnHLb7pDRIdurBTOn5oIwBQDIv8iH5Pl2V85vzjl1NZXRfNY4HZLsE942jJA==",
244 "license": "Apache-2.0",
245 "dependencies": {
246 "bare-assert": "^1.2.0",
247 "bare-stream": "^2.6.3"
248 },
249 "peerDependencies": {
250 "bare-buffer": "*"
251 },
252 "peerDependenciesMeta": {
253 "bare-buffer": {
254 "optional": true
255 }
256 }
257 },
258 "node_modules/bare-debug-log": {
259 "version": "2.0.0",
260 "resolved": "https://registry.npmjs.org/bare-debug-log/-/bare-debug-log-2.0.0.tgz",
261 "integrity": "sha512-Vi42PkMQsNV9PUpx2Gl1hikshx5O9FzMJ6o9Nnopseg7qLBBK7Nl31d0RHcfwLEAfmcPApytpc0ZFfq68u22FQ==",
262 "license": "Apache-2.0",
263 "dependencies": {
264 "bare-os": "^3.0.1"
265 }
266 },
267 "node_modules/bare-dgram": {
268 "version": "1.0.1",
269 "resolved": "https://registry.npmjs.org/bare-dgram/-/bare-dgram-1.0.1.tgz",
270 "integrity": "sha512-EdsyRErrkWgN8fENdrDdXFEE9HAuJ/m6ehXz13fVj9JhdCaLWIA+L8o5aYNRLt66x08RlyG2vbrRAZoxGfcdlg==",
271 "license": "Apache-2.0",
272 "dependencies": {
273 "bare-events": "^2.5.0",
274 "udx-native": "^1.11.2"
275 }
276 },
277 "node_modules/bare-diagnostics-channel": {
278 "version": "1.1.0",
279 "resolved": "https://registry.npmjs.org/bare-diagnostics-channel/-/bare-diagnostics-channel-1.1.0.tgz",
280 "integrity": "sha512-Reu+EQo+eLpB+a5p8UykFEdXndFaRaSgKV38uAMh/qhE2eTeJcdwAwo74hKYyeN8GD3DIFqC9ZlM4bnDc03CIg==",
281 "license": "Apache-2.0"
282 },
283 "node_modules/bare-dns": {
284 "version": "2.1.4",
285 "resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-2.1.4.tgz",
286 "integrity": "sha512-abwjHmpWqSRNB7V5615QxPH92L71AVzFm/kKTs8VYiNTAi2xVdonpv0BjJ0hwXLwomoW+xsSOPjW6PZPO14asg==",
287 "license": "Apache-2.0",
288 "engines": {
289 "bare": ">=1.7.0"
290 }
291 },
292 "node_modules/bare-encoding": {
293 "version": "1.0.3",
294 "resolved": "https://registry.npmjs.org/bare-encoding/-/bare-encoding-1.0.3.tgz",
295 "integrity": "sha512-Kqf+t/azs13lUeyK4Tb7ha4wdLRXKWCXQ8w1rVmt7KtoPCPdHD/Xwt7LBIsCSwwGglrcmblo5VOLa5avkJqULA==",
296 "license": "Apache-2.0",
297 "peerDependencies": {
298 "bare-buffer": "*"
299 },
300 "peerDependenciesMeta": {
301 "bare-buffer": {
302 "optional": true
303 }
304 }
305 },
306 "node_modules/bare-env": {
307 "version": "3.0.0",
308 "resolved": "https://registry.npmjs.org/bare-env/-/bare-env-3.0.0.tgz",
309 "integrity": "sha512-0u964P5ZLAxTi+lW4Kjp7YRJQ5gZr9ycYOtjLxsSrupgMz3sn5Z9n4SH/JIifHwvadsf1brA2JAjP+9IOWwTiw==",
310 "license": "Apache-2.0",
311 "dependencies": {
312 "bare-os": "^3.0.1"
313 }
314 },
315 "node_modules/bare-events": {
316 "version": "2.8.2",
317 "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
318 "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
319 "license": "Apache-2.0",
320 "peerDependencies": {
321 "bare-abort-controller": "*"
322 },
323 "peerDependenciesMeta": {
324 "bare-abort-controller": {
325 "optional": true
326 }
327 }
328 },
329 "node_modules/bare-fetch": {
330 "version": "2.8.2",
331 "resolved": "https://registry.npmjs.org/bare-fetch/-/bare-fetch-2.8.2.tgz",
332 "integrity": "sha512-N0gZH8iuuC36Ygd4Kjfeo90aOKZ19cycbuZWVpm9W+f5v2ks/2qvgVIKp9hRDZSo5imqO097ynJcn4w24F8c/A==",
333 "license": "Apache-2.0",
334 "dependencies": {
335 "bare-form-data": "^1.2.0",
336 "bare-http1": "^4.5.2",
337 "bare-https": "^2.0.0",
338 "bare-stream": "^2.9.1",
339 "bare-url": "^2.4.0",
340 "bare-zlib": "^1.3.0"
341 },
342 "peerDependencies": {
343 "bare-abort-controller": "*",
344 "bare-buffer": "*"
345 },
346 "peerDependenciesMeta": {
347 "bare-abort-controller": {
348 "optional": true
349 },
350 "bare-buffer": {
351 "optional": true
352 }
353 }
354 },
355 "node_modules/bare-form-data": {
356 "version": "1.2.1",
357 "resolved": "https://registry.npmjs.org/bare-form-data/-/bare-form-data-1.2.1.tgz",
358 "integrity": "sha512-DFZhp5Tn0S7TjII/xhgLl2BNU6f7l5QbIW/YH7TjzQVnxLa8SaMSbl77jpy0ZR1oUnAo0a7NHJ9QAOU6PPr0Jg==",
359 "license": "Apache-2.0",
360 "dependencies": {
361 "bare-buffer": "^3.6.0",
362 "bare-stream": "^2.6.5"
363 }
364 },
365 "node_modules/bare-format": {
366 "version": "1.0.2",
367 "resolved": "https://registry.npmjs.org/bare-format/-/bare-format-1.0.2.tgz",
368 "integrity": "sha512-GswdhnOnP9QtwRbrf4wLApw5widkaLMsLe2XOs35fQD2YfEN1ApoGka+cZ7PfvzxMgfYXmMhj/2OGlVn5/Dxgw==",
369 "license": "Apache-2.0",
370 "dependencies": {
371 "bare-inspect": "^3.0.0"
372 }
373 },
374 "node_modules/bare-fs": {
375 "version": "4.7.1",
376 "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz",
377 "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==",
378 "license": "Apache-2.0",
379 "dependencies": {
380 "bare-events": "^2.5.4",
381 "bare-path": "^3.0.0",
382 "bare-stream": "^2.6.4",
383 "bare-url": "^2.2.2",
384 "fast-fifo": "^1.3.2"
385 },
386 "engines": {
387 "bare": ">=1.16.0"
388 },
389 "peerDependencies": {
390 "bare-buffer": "*"
391 },
392 "peerDependenciesMeta": {
393 "bare-buffer": {
394 "optional": true
395 }
396 }
397 },
398 "node_modules/bare-hrtime": {
399 "version": "2.1.1",
400 "resolved": "https://registry.npmjs.org/bare-hrtime/-/bare-hrtime-2.1.1.tgz",
401 "integrity": "sha512-VMb3tHo05gsnbu3OXTmkDiwTjMlOsbQmKoysKqKEyR09m77TuDrYFbj3Q5GGk10dAKsUHrnXmwCaeJqzVpB5ZA==",
402 "license": "Apache-2.0"
403 },
404 "node_modules/bare-http-parser": {
405 "version": "1.1.3",
406 "resolved": "https://registry.npmjs.org/bare-http-parser/-/bare-http-parser-1.1.3.tgz",
407 "integrity": "sha512-+dhVvQi6brHq14L/XHNRQ+TLuVE76VjRmMt61wVEtS+Od8xUslfMHWJN/ZjIIt3RtTG6vPuA+x9cOh7KrkBJsA==",
408 "license": "Apache-2.0"
409 },
410 "node_modules/bare-http1": {
411 "version": "4.5.6",
412 "resolved": "https://registry.npmjs.org/bare-http1/-/bare-http1-4.5.6.tgz",
413 "integrity": "sha512-31OAwMkSU+z1VuUOCk65hx3aWQgzCfH/zQ6LGxbJtmiy2Czsw0+uvOBM9YkqaL6zUSTSYG2pLbL0v/TjME3Buw==",
414 "license": "Apache-2.0",
415 "dependencies": {
416 "bare-events": "^2.6.0",
417 "bare-http-parser": "^1.1.1",
418 "bare-stream": "^2.10.0",
419 "bare-tcp": "^2.2.0"
420 },
421 "peerDependencies": {
422 "bare-buffer": "*",
423 "bare-url": "*"
424 },
425 "peerDependenciesMeta": {
426 "bare-buffer": {
427 "optional": true
428 },
429 "bare-url": {
430 "optional": true
431 }
432 }
433 },
434 "node_modules/bare-https": {
435 "version": "2.1.3",
436 "resolved": "https://registry.npmjs.org/bare-https/-/bare-https-2.1.3.tgz",
437 "integrity": "sha512-0TI/mJXQGYXmG7UUyWEG+KCJusayIAQLywUjFAskDoKuxfqVnGF+M/mTMrEV8J64DaIdU+5x761FvgmT7M68tA==",
438 "license": "Apache-2.0",
439 "dependencies": {
440 "bare-http1": "^4.4.0",
441 "bare-tcp": "^2.2.0",
442 "bare-tls": "^2.0.0"
443 }
444 },
445 "node_modules/bare-inspect": {
446 "version": "3.1.4",
447 "resolved": "https://registry.npmjs.org/bare-inspect/-/bare-inspect-3.1.4.tgz",
448 "integrity": "sha512-jfW5KRA84o3REpI6Vr4nbvMn+hqVAw8GU1mMdRwUsY5yJovQamxYeKGVKGqdzs+8ZbG4jRzGUXP/3Ji/DnqfPg==",
449 "license": "Apache-2.0",
450 "dependencies": {
451 "bare-ansi-escapes": "^2.1.0",
452 "bare-type": "^1.0.0"
453 },
454 "engines": {
455 "bare": ">=1.18.0"
456 }
457 },
458 "node_modules/bare-inspector": {
459 "version": "4.0.3",
460 "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-4.0.3.tgz",
461 "integrity": "sha512-yYk6+7tTVKJKHOja5+QBn989ETv8oVsmwoH0nCM+QYC6w5MC03GC4aQNK+lipAZSz1EaAj42WZ8Wewjpy0L9TA==",
462 "dev": true,
463 "license": "Apache-2.0",
464 "dependencies": {
465 "bare-events": "^2.1.0",
466 "bare-http1": "^4.0.0",
467 "bare-stream": "^2.0.0",
468 "bare-url": "^2.0.0",
469 "bare-ws": "^2.0.0"
470 },
471 "engines": {
472 "bare": ">=1.2.0"
473 },
474 "peerDependencies": {
475 "bare-tcp": "*"
476 },
477 "peerDependenciesMeta": {
478 "bare-tcp": {
479 "optional": true
480 }
481 }
482 },
483 "node_modules/bare-logger": {
484 "version": "2.0.3",
485 "resolved": "https://registry.npmjs.org/bare-logger/-/bare-logger-2.0.3.tgz",
486 "integrity": "sha512-U6K7NxHdeAHxEgHFDV8zXvgjgDZKQO6LlCrxQvUvlrZEVTnoezSImMWizi85rbZpVsbeI1ZWcLCRGnoIf5EV8Q==",
487 "license": "Apache-2.0",
488 "dependencies": {
489 "bare-format": "^1.0.0"
490 }
491 },
492 "node_modules/bare-module": {
493 "version": "6.2.0",
494 "resolved": "https://registry.npmjs.org/bare-module/-/bare-module-6.2.0.tgz",
495 "integrity": "sha512-CoCTG8y8HKPnNW317OW1hynl28DasVPtbX033ZEAXk0Q3SYCUXi3OOnNAr6wTrDgMgpOsW0kl7Nifcom5GGH8Q==",
496 "license": "Apache-2.0",
497 "dependencies": {
498 "bare-bundle": "^1.3.0",
499 "bare-module-lexer": "^1.0.0",
500 "bare-module-resolve": "^1.8.0",
501 "bare-path": "^3.0.0",
502 "bare-url": "^2.0.1"
503 },
504 "engines": {
505 "bare": ">=1.23.0"
506 },
507 "peerDependencies": {
508 "bare-buffer": "*"
509 },
510 "peerDependenciesMeta": {
511 "bare-buffer": {
512 "optional": true
513 }
514 }
515 },
516 "node_modules/bare-module-lexer": {
517 "version": "1.4.7",
518 "resolved": "https://registry.npmjs.org/bare-module-lexer/-/bare-module-lexer-1.4.7.tgz",
519 "integrity": "sha512-0klU4eMsjh/wcxi8FdHmNom2j2F4kmkXOhyJFL9qTaSFp2lE3m6BtbKgMHY8R5miqC9r8/IfA8wzXnC5Os14WA==",
520 "license": "Apache-2.0",
521 "dependencies": {
522 "require-addon": "^1.0.2"
523 },
524 "peerDependencies": {
525 "bare-buffer": "*"
526 },
527 "peerDependenciesMeta": {
528 "bare-buffer": {
529 "optional": true
530 }
531 }
532 },
533 "node_modules/bare-module-resolve": {
534 "version": "1.12.1",
535 "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.1.tgz",
536 "integrity": "sha512-hbmAPyFpEq8FoZMd5sFO3u6MC5feluWoGE8YKlA8fCrl6mNtx68Wjg4DTiDJcqRJaovTvOYKfYngoBUnbaT7eg==",
537 "license": "Apache-2.0",
538 "dependencies": {
539 "bare-semver": "^1.0.0"
540 },
541 "peerDependencies": {
542 "bare-url": "*"
543 },
544 "peerDependenciesMeta": {
545 "bare-url": {
546 "optional": true
547 }
548 }
549 },
550 "node_modules/bare-module-traverse": {
551 "version": "2.0.1",
552 "resolved": "https://registry.npmjs.org/bare-module-traverse/-/bare-module-traverse-2.0.1.tgz",
553 "integrity": "sha512-1au+Og5p97T9b6Y7xmHZ7KtpW8vEYtz2jC2whmm+YJp46EaHfk26j91MmQhufdkR/8sdK1Q5p+P9A/Y5GrJg7Q==",
554 "license": "Apache-2.0",
555 "dependencies": {
556 "bare-addon-resolve": "^1.5.0",
557 "bare-module-lexer": "^1.4.0",
558 "bare-module-resolve": "^1.7.0"
559 },
560 "peerDependencies": {
561 "bare-buffer": "*",
562 "bare-url": "*"
563 },
564 "peerDependenciesMeta": {
565 "bare-buffer": {
566 "optional": true
567 },
568 "bare-url": {
569 "optional": true
570 }
571 }
572 },
573 "node_modules/bare-net": {
574 "version": "2.3.1",
575 "resolved": "https://registry.npmjs.org/bare-net/-/bare-net-2.3.1.tgz",
576 "integrity": "sha512-MypSqDKpDU2Xt7FIfazn5yGvRnV09gFcIPHGWstW0gxuzA4tucTcwJSZeos97C4F89vtU5oGwXDN/HrGN6Y4Jw==",
577 "license": "Apache-2.0",
578 "dependencies": {
579 "bare-events": "^2.2.2",
580 "bare-pipe": "^4.0.0",
581 "bare-stream": "^2.0.0",
582 "bare-tcp": "^2.0.0"
583 }
584 },
585 "node_modules/bare-node-runtime": {
586 "version": "1.2.0",
587 "resolved": "https://registry.npmjs.org/bare-node-runtime/-/bare-node-runtime-1.2.0.tgz",
588 "integrity": "sha512-oCpkcKBLDuzhtga0Q/63Ds3Gj03I0jIf+VX4mDhSClpoBfz/wnDtl2d1NKQDAVNCoP4I617GrJkS3vwNO4dd7w==",
589 "license": "Apache-2.0",
590 "dependencies": {
591 "bare-abort-controller": "^1.0.0",
592 "bare-assert": "^1.1.0",
593 "bare-async-hooks": "^0.0.0",
594 "bare-buffer": "^3.3.1",
595 "bare-console": "^6.0.1",
596 "bare-crypto": "^1.11.2",
597 "bare-dgram": "^1.0.1",
598 "bare-diagnostics-channel": "^1.1.0",
599 "bare-dns": "^2.1.4",
600 "bare-events": "^2.7.0",
601 "bare-fetch": "^2.5.0",
602 "bare-fs": "^4.2.3",
603 "bare-http1": "^4.0.4",
604 "bare-https": "^2.0.0",
605 "bare-inspector": "^5.0.0",
606 "bare-module": "^6.1.2",
607 "bare-net": "^2.0.2",
608 "bare-os": "^3.6.2",
609 "bare-path": "^3.0.0",
610 "bare-performance": "^1.1.0",
611 "bare-process": "^4.2.1",
612 "bare-punycode": "^0.0.0",
613 "bare-querystring": "^1.0.0",
614 "bare-readline": "^1.1.0",
615 "bare-repl": "^6.0.1",
616 "bare-stream": "^2.7.0",
617 "bare-string-decoder": "^1.0.0",
618 "bare-subprocess": "^5.1.1",
619 "bare-timers": "^3.0.3",
620 "bare-tls": "^2.1.3",
621 "bare-tty": "^5.0.3",
622 "bare-url": "^2.2.2",
623 "bare-utils": "^1.5.1",
624 "bare-v8": "^1.0.1",
625 "bare-vm": "^1.0.0",
626 "bare-worker": "^4.0.0",
627 "bare-ws": "^2.1.0",
628 "bare-zlib": "^1.3.1"
629 }
630 },
631 "node_modules/bare-node-runtime/node_modules/bare-inspector": {
632 "version": "5.0.0",
633 "resolved": "https://registry.npmjs.org/bare-inspector/-/bare-inspector-5.0.0.tgz",
634 "integrity": "sha512-blObRFPBK6yn0/wZbrRgkGcOuLUQUYVvkKbsEp5p3bWJB+uNrAh+qUqOijQHS6mZjGvyGCE86VERp3EiUR2TyA==",
635 "license": "Apache-2.0",
636 "dependencies": {
637 "bare-events": "^2.1.0",
638 "bare-http1": "^4.0.0",
639 "bare-stream": "^2.0.0",
640 "bare-url": "^2.0.0",
641 "bare-ws": "^2.0.0"
642 },
643 "engines": {
644 "bare": ">=1.2.0"
645 },
646 "peerDependencies": {
647 "bare-tcp": "*"
648 },
649 "peerDependenciesMeta": {
650 "bare-tcp": {
651 "optional": true
652 }
653 }
654 },
655 "node_modules/bare-os": {
656 "version": "3.8.7",
657 "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz",
658 "integrity": "sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==",
659 "license": "Apache-2.0",
660 "engines": {
661 "bare": ">=1.14.0"
662 }
663 },
664 "node_modules/bare-path": {
665 "version": "3.0.0",
666 "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
667 "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
668 "license": "Apache-2.0",
669 "dependencies": {
670 "bare-os": "^3.0.1"
671 }
672 },
673 "node_modules/bare-performance": {
674 "version": "1.3.0",
675 "resolved": "https://registry.npmjs.org/bare-performance/-/bare-performance-1.3.0.tgz",
676 "integrity": "sha512-ITlHSQwsnJSPjpagTtPo043LRkFgcrl9SgPsVUBXZvTeGWuNLUfMRwmwAS+35i8qnIEinySoLxwhVoJNZAIF2g==",
677 "license": "Apache-2.0"
678 },
679 "node_modules/bare-pipe": {
680 "version": "4.1.5",
681 "resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-4.1.5.tgz",
682 "integrity": "sha512-6OfxaG8JSkRh3Gc4hzHRsxNt+yu2PpN7lrv1V+T78GdknWQkVGwiEvu4m+1nbfk8cMVQ0TGxRvQ90XA4rhnTuw==",
683 "license": "Apache-2.0",
684 "dependencies": {
685 "bare-events": "^2.0.0",
686 "bare-stream": "^2.0.0"
687 },
688 "engines": {
689 "bare": ">=1.16.0"
690 }
691 },
692 "node_modules/bare-process": {
693 "version": "4.4.1",
694 "resolved": "https://registry.npmjs.org/bare-process/-/bare-process-4.4.1.tgz",
695 "integrity": "sha512-JfcTtymq6akqM2bdyTsP4A4GYJceBzb91k/ECmFps75uFf6uO33SM1bOZsRAqyRXExabsQJLn5S41NBl8HTM4A==",
696 "license": "Apache-2.0",
697 "dependencies": {
698 "bare-abort": "^2.0.13",
699 "bare-env": "^3.0.0",
700 "bare-events": "^2.3.1",
701 "bare-hrtime": "^2.0.0",
702 "bare-os": "^3.7.1",
703 "bare-signals": "^4.0.0",
704 "bare-stdio": "^1.0.1"
705 }
706 },
707 "node_modules/bare-punycode": {
708 "version": "0.0.0",
709 "resolved": "https://registry.npmjs.org/bare-punycode/-/bare-punycode-0.0.0.tgz",
710 "integrity": "sha512-PC2Y6mGLytZPJCB9M7CvO5Zb6uWYVUZ+5t3L6vePFuFM6tdC6SsQ+sIsuf0Sa6LHBoWURX7I9yMMbPXMv7TIdQ==",
711 "license": "Apache-2.0",
712 "dependencies": {
713 "punycode": "^2.3.1"
714 }
715 },
716 "node_modules/bare-querystring": {
717 "version": "1.0.0",
718 "resolved": "https://registry.npmjs.org/bare-querystring/-/bare-querystring-1.0.0.tgz",
719 "integrity": "sha512-Kbqdjd4f1MxMtutXzraEKIXqXRfq9uWLwzUT5bLUh9TCiPznY9l6vHc4BUPNIa13DyH1VAlPy3iOxHzhqV2quQ==",
720 "license": "Apache-2.0"
721 },
722 "node_modules/bare-readline": {
723 "version": "1.3.1",
724 "resolved": "https://registry.npmjs.org/bare-readline/-/bare-readline-1.3.1.tgz",
725 "integrity": "sha512-QtSU4ZfgQcDI6AQssjDFqTiRe4rCiciMn+Yqx6siMJZBIftAIFrNSOK0sa5SBrmNv/a7CD9Dm0onUDCRyn5Fdg==",
726 "license": "Apache-2.0",
727 "dependencies": {
728 "bare-ansi-escapes": "^2.0.0",
729 "bare-stream": "^2.0.0"
730 }
731 },
732 "node_modules/bare-realm": {
733 "version": "2.0.1",
734 "resolved": "https://registry.npmjs.org/bare-realm/-/bare-realm-2.0.1.tgz",
735 "integrity": "sha512-kQbYU6AAQu4XBTQesuz2+PpjBx7MJzf5Qw3nSLzQCzbVglx7Ml85MtWEjUe1AeslXqrd+nFPHMEbL55ouISscA==",
736 "license": "Apache-2.0",
737 "engines": {
738 "bare": ">=1.5.0"
739 }
740 },
741 "node_modules/bare-repl": {
742 "version": "6.0.2",
743 "resolved": "https://registry.npmjs.org/bare-repl/-/bare-repl-6.0.2.tgz",
744 "integrity": "sha512-w2R+5LOrMl9UH/gcFjvdIpsB+SgyLr8cW4uJo5bAEzRbRpVA+ZTm8pMHYdj0uqIUBClP/6fkyW0MnB1XkxakmQ==",
745 "license": "Apache-2.0",
746 "dependencies": {
747 "bare-inspect": "^3.0.0",
748 "bare-module": "^6.0.1",
749 "bare-os": "^3.0.1",
750 "bare-path": "^3.0.0",
751 "bare-pipe": "^4.0.0",
752 "bare-readline": "^1.0.0",
753 "bare-stream": "^2.0.0",
754 "bare-tty": "^5.0.0"
755 }
756 },
757 "node_modules/bare-semver": {
758 "version": "1.0.3",
759 "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.3.tgz",
760 "integrity": "sha512-HS/A30bi2+PiRJfU6R4+Kp+6KeLSCSByjYM2iiobOKzLAvtu1CT+S8xWfiU7wz0erknjkUoC+yXy108tzIuP5Q==",
761 "license": "Apache-2.0"
762 },
763 "node_modules/bare-signals": {
764 "version": "4.2.0",
765 "resolved": "https://registry.npmjs.org/bare-signals/-/bare-signals-4.2.0.tgz",
766 "integrity": "sha512-fNHMOdQIlYuTvMB3Oh9Apk99hLKn351+Ir8vz+khiPTcOqIyGG4uWWjdLTzxWdYGsA0eT+We3y0K74hjj2nq7A==",
767 "license": "Apache-2.0",
768 "dependencies": {
769 "bare-events": "^2.5.3",
770 "bare-os": "^3.3.1"
771 },
772 "engines": {
773 "bare": ">=1.7.0"
774 }
775 },
776 "node_modules/bare-stdio": {
777 "version": "1.0.2",
778 "resolved": "https://registry.npmjs.org/bare-stdio/-/bare-stdio-1.0.2.tgz",
779 "integrity": "sha512-3WJDqtvVGP4f+j68kyEC05umOYNwKJ1xG+YAXL8yZ605WgNqiRhVaFq+mVIhBt2eKNp7pa5vCQdhOt1pNh79SA==",
780 "license": "Apache-2.0",
781 "dependencies": {
782 "bare-fs": "^4.5.2",
783 "bare-pipe": "^4.1.5",
784 "bare-tty": "^5.0.3"
785 }
786 },
787 "node_modules/bare-stream": {
788 "version": "2.13.0",
789 "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz",
790 "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==",
791 "license": "Apache-2.0",
792 "dependencies": {
793 "streamx": "^2.25.0",
794 "teex": "^1.0.1"
795 },
796 "peerDependencies": {
797 "bare-abort-controller": "*",
798 "bare-buffer": "*",
799 "bare-events": "*"
800 },
801 "peerDependenciesMeta": {
802 "bare-abort-controller": {
803 "optional": true
804 },
805 "bare-buffer": {
806 "optional": true
807 },
808 "bare-events": {
809 "optional": true
810 }
811 }
812 },
813 "node_modules/bare-string-decoder": {
814 "version": "1.0.0",
815 "resolved": "https://registry.npmjs.org/bare-string-decoder/-/bare-string-decoder-1.0.0.tgz",
816 "integrity": "sha512-FjFvfHo88U7borNQSj9ijP2JTb1asqY6K28OZrix4dF9iZf5D2wi1+99CgLlHT3HtYqdwxRhDAiKu8rVstt5rQ==",
817 "license": "Apache-2.0",
818 "dependencies": {
819 "text-decoder": "^1.2.3"
820 },
821 "peerDependencies": {
822 "bare-buffer": "*"
823 },
824 "peerDependenciesMeta": {
825 "bare-buffer": {
826 "optional": true
827 }
828 }
829 },
830 "node_modules/bare-structured-clone": {
831 "version": "1.5.3",
832 "resolved": "https://registry.npmjs.org/bare-structured-clone/-/bare-structured-clone-1.5.3.tgz",
833 "integrity": "sha512-vC/YqGsp67ZeFnpyAskwaEIXtNscnCwFVKlSk0Oh2X3AqWT6H+7DC9vVI080FohUJeuUuB9UNx4UFdDcyQgZaw==",
834 "license": "Apache-2.0",
835 "dependencies": {
836 "bare-type": "^1.1.0",
837 "compact-encoding": "^2.15.0"
838 },
839 "engines": {
840 "bare": ">=1.2.0"
841 },
842 "peerDependencies": {
843 "bare-buffer": "*",
844 "bare-url": "*"
845 },
846 "peerDependenciesMeta": {
847 "bare-buffer": {
848 "optional": true
849 },
850 "bare-url": {
851 "optional": true
852 }
853 }
854 },
855 "node_modules/bare-stylize": {
856 "version": "0.0.1",
857 "resolved": "https://registry.npmjs.org/bare-stylize/-/bare-stylize-0.0.1.tgz",
858 "integrity": "sha512-l3MjmIl476bWijYWf3RbE+osl4iuXSOMudzp0vAqzIK7gPgn/+G3oAxp8Oin9CFF911KBP0LO9kts8Ci8mGZaQ==",
859 "license": "Apache-2.0",
860 "dependencies": {
861 "bare-ansi-escapes": "^2.2.3",
862 "bare-process": "^4.2.1"
863 }
864 },
865 "node_modules/bare-subprocess": {
866 "version": "5.2.3",
867 "resolved": "https://registry.npmjs.org/bare-subprocess/-/bare-subprocess-5.2.3.tgz",
868 "integrity": "sha512-07wwswlV7M3sC9IykbZRZ/jHAkrXFWVLqdBWGv1y0ojCimtRD9hGwxdHmR5FUFmDUZLNsBmTYJNQqgio5+A85Q==",
869 "license": "Apache-2.0",
870 "dependencies": {
871 "bare-env": "^3.0.0",
872 "bare-events": "^2.5.4",
873 "bare-os": "^3.0.1",
874 "bare-pipe": "^4.0.0",
875 "bare-url": "^2.2.2"
876 },
877 "engines": {
878 "bare": ">=1.7.0"
879 },
880 "peerDependencies": {
881 "bare-buffer": "*"
882 },
883 "peerDependenciesMeta": {
884 "bare-buffer": {
885 "optional": true
886 }
887 }
888 },
889 "node_modules/bare-system-logger": {
890 "version": "1.0.3",
891 "resolved": "https://registry.npmjs.org/bare-system-logger/-/bare-system-logger-1.0.3.tgz",
892 "integrity": "sha512-HXTXZyhIIS4ZDYun4J9zKNQZDfLgEkkK8wy9nrTFJE5xq8APsOhDxuEsxP0YcNwC23DW1jaNpqD51zDeXPzIdg==",
893 "license": "Apache-2.0",
894 "dependencies": {
895 "bare-logger": "^2.0.0"
896 }
897 },
898 "node_modules/bare-tcp": {
899 "version": "2.2.7",
900 "resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-2.2.7.tgz",
901 "integrity": "sha512-rjpqNQ2cOCkNo3NeYA/W4GTK3DRkl8sDHO3uos+AEswUjLC8XXMQF8WrJCSjlIowCbS6NUVxKE92X5RGXjyefg==",
902 "license": "Apache-2.0",
903 "peer": true,
904 "dependencies": {
905 "bare-dns": "^2.0.4",
906 "bare-events": "^2.5.4",
907 "bare-stream": "^2.6.4"
908 },
909 "engines": {
910 "bare": ">=1.16.0"
911 }
912 },
913 "node_modules/bare-thread": {
914 "version": "1.2.0",
915 "resolved": "https://registry.npmjs.org/bare-thread/-/bare-thread-1.2.0.tgz",
916 "integrity": "sha512-evYpeDqaTROp2JIdVgWrIBc5rVCV64tFMwZdeL13ahYt/lno2RLvTbYrcf1p6NA2p1SxybbSbGQ2F9/gHudrTg==",
917 "license": "Apache-2.0",
918 "dependencies": {
919 "bare-bundle": "^1.9.0",
920 "bare-module-resolve": "^1.11.2",
921 "bare-module-traverse": "^2.0.0"
922 }
923 },
924 "node_modules/bare-timers": {
925 "version": "3.2.1",
926 "resolved": "https://registry.npmjs.org/bare-timers/-/bare-timers-3.2.1.tgz",
927 "integrity": "sha512-O+9e6Jol/BoYsQUzAFXG0gWUW1GWryFMblGcNBfi3smPrD3rJIKQwpw2FJARl2j/1VHne4a8YaHPK1cxDKfiYQ==",
928 "license": "Apache-2.0",
929 "engines": {
930 "bare": ">=1.7.0"
931 },
932 "peerDependencies": {
933 "bare-abort-controller": "*"
934 },
935 "peerDependenciesMeta": {
936 "bare-abort-controller": {
937 "optional": true
938 }
939 }
940 },
941 "node_modules/bare-tls": {
942 "version": "2.2.3",
943 "resolved": "https://registry.npmjs.org/bare-tls/-/bare-tls-2.2.3.tgz",
944 "integrity": "sha512-dPYBGEXtgLceRFMfGaF2/rqR86/xMxMyrM9ootO/gaRKL/z2uNHJs7aP7IOBtnJF8eUCt5qwMzbKfrKgDIxPLg==",
945 "license": "Apache-2.0",
946 "dependencies": {
947 "bare-net": "^2.0.1",
948 "bare-stream": "^2.6.4"
949 },
950 "engines": {
951 "bare": ">=1.7.0"
952 }
953 },
954 "node_modules/bare-tty": {
955 "version": "5.1.0",
956 "resolved": "https://registry.npmjs.org/bare-tty/-/bare-tty-5.1.0.tgz",
957 "integrity": "sha512-EZLvW4A+XiJgI3TW+e1pMME9PIJsfEXe/DA/WSKzIkq/v7Yarpv/rvG6Z5pGnpo4V/Bd+qopwnCLSR71hMMBYA==",
958 "license": "Apache-2.0",
959 "dependencies": {
960 "bare-events": "^2.2.0",
961 "bare-signals": "^4.0.0",
962 "bare-stream": "^2.0.0"
963 },
964 "engines": {
965 "bare": ">=1.16.0"
966 }
967 },
968 "node_modules/bare-type": {
969 "version": "1.1.0",
970 "resolved": "https://registry.npmjs.org/bare-type/-/bare-type-1.1.0.tgz",
971 "integrity": "sha512-LdtnnEEYldOc87Dr4GpsKnStStZk3zfgoEMXy8yvEZkXrcCv9RtYDrUYWFsBQHtaB0s1EUWmcvS6XmEZYIj3Bw==",
972 "license": "Apache-2.0",
973 "engines": {
974 "bare": ">=1.2.0"
975 }
976 },
977 "node_modules/bare-url": {
978 "version": "2.4.0",
979 "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz",
980 "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==",
981 "license": "Apache-2.0",
982 "dependencies": {
983 "bare-path": "^3.0.0"
984 }
985 },
986 "node_modules/bare-utils": {
987 "version": "1.6.0",
988 "resolved": "https://registry.npmjs.org/bare-utils/-/bare-utils-1.6.0.tgz",
989 "integrity": "sha512-WhQEIkkAxkSnW7u1QgrI0AfNm5JpMruETXeYsb5qnkBJ0TTfNKygZmsh6rkoHBANaV+C/7Jed7bJP9OmEHG7rQ==",
990 "license": "Apache-2.0",
991 "dependencies": {
992 "bare-debug-log": "^2.0.0",
993 "bare-encoding": "^1.0.0",
994 "bare-format": "^1.0.0",
995 "bare-inspect": "^3.0.0",
996 "bare-stylize": "^0.0.1",
997 "bare-type": "^1.0.6"
998 }
999 },
1000 "node_modules/bare-v8": {
1001 "version": "1.0.1",
1002 "resolved": "https://registry.npmjs.org/bare-v8/-/bare-v8-1.0.1.tgz",
1003 "integrity": "sha512-/cR5ZvFWQRdtTZ4tx0j7TKvTWce8UnnLqm88fwHtJmfM7HODIBVjQGDT7KkDLeD2d/eHP2pzB71Y8/QyiMMKrQ==",
1004 "license": "Apache-2.0"
1005 },
1006 "node_modules/bare-v8-to-istanbul": {
1007 "version": "1.0.2",
1008 "resolved": "https://registry.npmjs.org/bare-v8-to-istanbul/-/bare-v8-to-istanbul-1.0.2.tgz",
1009 "integrity": "sha512-CM0wPgyQtXTQ7h4q8NjbTZ/FH5he0Jkiwgpq0lFZZA5tkVZzmQ/9ul4R7E+cNlGZJIZlQZ9v4CwbgVaFG3zOAA==",
1010 "dev": true,
1011 "license": "Apache-2.0",
1012 "dependencies": {
1013 "bare-assert": "^1.0.2",
1014 "bare-fs": "^4.1.2",
1015 "bare-module": "^6.1.2",
1016 "bare-path": "^3.0.0",
1017 "bare-process": "^4.2.0",
1018 "bare-url": "^2.1.5",
1019 "bare-utils": "^1.2.0",
1020 "v8-to-istanbul": "^9.3.0",
1021 "which-runtime": "^1.2.1"
1022 }
1023 },
1024 "node_modules/bare-vm": {
1025 "version": "1.0.1",
1026 "resolved": "https://registry.npmjs.org/bare-vm/-/bare-vm-1.0.1.tgz",
1027 "integrity": "sha512-yLnbRvKt3AhRTmtfTIrYfdTHqGEfIJc+Fgb2DcHejE0HJ+p5adGxxPMvd3893Z7iXVYnalxukNARn4oJSZELHQ==",
1028 "license": "Apache-2.0",
1029 "dependencies": {
1030 "bare-realm": "^2.0.0"
1031 }
1032 },
1033 "node_modules/bare-worker": {
1034 "version": "4.1.6",
1035 "resolved": "https://registry.npmjs.org/bare-worker/-/bare-worker-4.1.6.tgz",
1036 "integrity": "sha512-yvsektF7xNqlAyjJV+YYeBx+sGZ8Fhbo5Cjc/lpIdkM8Gd/e3MlaxTFg8NknkyvJ4oDJXqvp38Q+ZOn5Gyr+nQ==",
1037 "license": "Apache-2.0",
1038 "dependencies": {
1039 "bare-channel": "^5.1.5",
1040 "bare-events": "^2.2.1",
1041 "bare-module": "^6.0.1",
1042 "bare-thread": "^1.1.3"
1043 }
1044 },
1045 "node_modules/bare-ws": {
1046 "version": "2.1.0",
1047 "resolved": "https://registry.npmjs.org/bare-ws/-/bare-ws-2.1.0.tgz",
1048 "integrity": "sha512-2gEWlPK9iyBchACdIY6oQXgmDz3KLrChdwrPgmU3IVXOFTnxTqSUT27WE/+izd4QojHj/SsqDkQiD2HDvuTdAA==",
1049 "license": "Apache-2.0",
1050 "dependencies": {
1051 "bare-crypto": "^1.2.0",
1052 "bare-events": "^2.3.1",
1053 "bare-http1": "^4.0.0",
1054 "bare-https": "^2.0.0",
1055 "bare-stream": "^2.1.2"
1056 },
1057 "peerDependencies": {
1058 "bare-buffer": "*",
1059 "bare-url": "*"
1060 },
1061 "peerDependenciesMeta": {
1062 "bare-buffer": {
1063 "optional": true
1064 },
1065 "bare-url": {
1066 "optional": true
1067 }
1068 }
1069 },
1070 "node_modules/bare-zlib": {
1071 "version": "1.3.3",
1072 "resolved": "https://registry.npmjs.org/bare-zlib/-/bare-zlib-1.3.3.tgz",
1073 "integrity": "sha512-rXNczo+SQg6cn20olmh/mUiGeJK9maipFH/zI/QwYgwhEmOns1R7fl1GV5apNO+aAp4x2d4uUa7HLhO4mhOnBQ==",
1074 "license": "Apache-2.0",
1075 "dependencies": {
1076 "bare-stream": "^2.0.0"
1077 }
1078 },
1079 "node_modules/bits-to-bytes": {
1080 "version": "1.3.0",
1081 "resolved": "https://registry.npmjs.org/bits-to-bytes/-/bits-to-bytes-1.3.0.tgz",
1082 "integrity": "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg==",
1083 "license": "ISC",
1084 "dependencies": {
1085 "b4a": "^1.5.0"
1086 }
1087 },
1088 "node_modules/blind-relay": {
1089 "version": "1.4.0",
1090 "resolved": "https://registry.npmjs.org/blind-relay/-/blind-relay-1.4.0.tgz",
1091 "integrity": "sha512-6xt7fDfCs6eGmNNym6I9N42jmjcMQn2qwwOVnkP9ZnrkXFk6c4/tdO1xqRmDEzKzV8gigd+DVdCUG/RUYnen7Q==",
1092 "license": "Apache-2.0",
1093 "dependencies": {
1094 "b4a": "^1.6.4",
1095 "bare-events": "^2.2.0",
1096 "bits-to-bytes": "^1.3.0",
1097 "compact-encoding": "^2.12.0",
1098 "compact-encoding-bitfield": "^1.0.0",
1099 "protomux": "^3.5.1",
1100 "sodium-universal": "^5.0.0",
1101 "streamx": "^2.15.1"
1102 }
1103 },
1104 "node_modules/bogon": {
1105 "version": "1.2.0",
1106 "resolved": "https://registry.npmjs.org/bogon/-/bogon-1.2.0.tgz",
1107 "integrity": "sha512-FqOBr/1VMzCOsoJd+fzNUMarUYki2+TKt07A2+xaulsNx4r53iJ7MV5k0jbqg7W2U0CsLqxCZOrFibdG6h6HSg==",
1108 "license": "MIT",
1109 "dependencies": {
1110 "compact-encoding": "^2.11.0",
1111 "compact-encoding-net": "^1.2.0"
1112 }
1113 },
1114 "node_modules/brittle": {
1115 "version": "3.19.1",
1116 "resolved": "https://registry.npmjs.org/brittle/-/brittle-3.19.1.tgz",
1117 "integrity": "sha512-4Ted1Mt9o9B6oIA6ImJJCtB/Fv++ZO3IDNQgRcHOXWSYGRUidgxchaGrUBaRn+4mlneXrgInPkCPzi0jO8qKbA==",
1118 "dev": true,
1119 "license": "Apache-2.0",
1120 "dependencies": {
1121 "b4a": "^1.6.0",
1122 "bare-assert": "^1.0.2",
1123 "bare-cov": "^1.1.0",
1124 "bare-fs": "^4.1.6",
1125 "bare-os": "^3.6.1",
1126 "bare-path": "^3.0.0",
1127 "bare-process": "^4.2.1",
1128 "bare-subprocess": "^5.0.0",
1129 "bare-url": "^2.1.6",
1130 "error-stack-parser": "^2.1.4",
1131 "globbie": "^1.0.2",
1132 "paparam": "^1.6.2",
1133 "same-object": "^1.0.2",
1134 "test-tmp": "^1.4.0",
1135 "tmatch": "^5.0.0"
1136 },
1137 "bin": {
1138 "brittle": "bin/node.js",
1139 "brittle-bare": "bin/bare.js",
1140 "brittle-node": "bin/node.js",
1141 "brittle-pear": "bin/pear.js"
1142 }
1143 },
1144 "node_modules/compact-encoding": {
1145 "version": "2.19.2",
1146 "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.19.2.tgz",
1147 "integrity": "sha512-/YjhHQE/5L4F7l5Bht69dRbP9RV6zoJPeowi8bMKQxNKe3Nh6hOY8pBGoVE9fz5GaWfEd8fWJ2aU9sB4KZuMYg==",
1148 "license": "Apache-2.0",
1149 "dependencies": {
1150 "b4a": "^1.3.0"
1151 }
1152 },
1153 "node_modules/compact-encoding-bitfield": {
1154 "version": "1.0.0",
1155 "resolved": "https://registry.npmjs.org/compact-encoding-bitfield/-/compact-encoding-bitfield-1.0.0.tgz",
1156 "integrity": "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg==",
1157 "license": "ISC",
1158 "dependencies": {
1159 "compact-encoding": "^2.4.1"
1160 }
1161 },
1162 "node_modules/compact-encoding-net": {
1163 "version": "1.2.0",
1164 "resolved": "https://registry.npmjs.org/compact-encoding-net/-/compact-encoding-net-1.2.0.tgz",
1165 "integrity": "sha512-LVXpNpF7PGQeHRVVLGgYWzuVoYAaDZvKUsUxRioGfkotzvOh4AzoQF1HBH3zMNaSnx7gJXuUr3hkjnijaH/Eng==",
1166 "license": "ISC",
1167 "dependencies": {
1168 "compact-encoding": "^2.4.1"
1169 }
1170 },
1171 "node_modules/convert-source-map": {
1172 "version": "2.0.0",
1173 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1174 "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1175 "dev": true,
1176 "license": "MIT"
1177 },
1178 "node_modules/dht-rpc": {
1179 "version": "6.26.4",
1180 "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-6.26.4.tgz",
1181 "integrity": "sha512-bMI625c13DXaiYN8vHEFmcM4CIauwK1SJgOMWAAqsXhsKXO8WCdp0fgYwTHH40cBB6J9MkDXPa2f79Vj5Ah1iA==",
1182 "license": "MIT",
1183 "dependencies": {
1184 "adaptive-timeout": "^1.0.1",
1185 "b4a": "^1.6.1",
1186 "bare-events": "^2.2.0",
1187 "compact-encoding": "^2.11.0",
1188 "compact-encoding-net": "^1.2.0",
1189 "fast-fifo": "^1.1.0",
1190 "kademlia-routing-table": "^1.0.1",
1191 "nat-sampler": "^1.0.1",
1192 "sodium-universal": "^5.0.0",
1193 "streamx": "^2.13.2",
1194 "time-ordered-set": "^2.0.0",
1195 "udx-native": "^1.5.3"
1196 }
1197 },
1198 "node_modules/error-stack-parser": {
1199 "version": "2.1.4",
1200 "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
1201 "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
1202 "dev": true,
1203 "license": "MIT",
1204 "dependencies": {
1205 "stackframe": "^1.3.4"
1206 }
1207 },
1208 "node_modules/events-universal": {
1209 "version": "1.0.1",
1210 "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
1211 "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
1212 "license": "Apache-2.0",
1213 "dependencies": {
1214 "bare-events": "^2.7.0"
1215 }
1216 },
1217 "node_modules/fast-fifo": {
1218 "version": "1.3.2",
1219 "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
1220 "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
1221 "license": "MIT"
1222 },
1223 "node_modules/generate-object-property": {
1224 "version": "2.0.0",
1225 "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-2.0.0.tgz",
1226 "integrity": "sha512-KwuURPyqn2Mz8DdV29pJwQu0Y7tcsbkULr82eeOcY/ZllFK6I9Wm8dsRByIu7CKWlFi9BdW1b3mcXMp/kQBQsw==",
1227 "license": "MIT",
1228 "dependencies": {
1229 "is-property": "^1.0.0"
1230 }
1231 },
1232 "node_modules/generate-string": {
1233 "version": "1.0.1",
1234 "resolved": "https://registry.npmjs.org/generate-string/-/generate-string-1.0.1.tgz",
1235 "integrity": "sha512-IfTY0dKZM43ACyGvXkbG7De7WY7MxTS5VO6Juhe8oJKpCmrYYXoqp/cJMskkpi0k9H8wuXq0H+eI898/BCqvXg==",
1236 "license": "MIT"
1237 },
1238 "node_modules/globbie": {
1239 "version": "1.0.3",
1240 "resolved": "https://registry.npmjs.org/globbie/-/globbie-1.0.3.tgz",
1241 "integrity": "sha512-hcryJmKcftf82xfBWTWxuUITWIIoYO3ec104V17SMHGFl6VLbm1d1Ju9LX9L+jyJTwICpemX/dmPI/HGYoKr1A==",
1242 "dev": true,
1243 "license": "Apache-2.0",
1244 "dependencies": {
1245 "bare-fs": "^4.1.2",
1246 "bare-path": "^3.0.0",
1247 "bare-process": "^4.2.1",
1248 "picomatch": "^4.0.2"
1249 }
1250 },
1251 "node_modules/hypercore-crypto": {
1252 "version": "3.6.1",
1253 "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.6.1.tgz",
1254 "integrity": "sha512-ltIz2uDwy9pO/ZGTvqcjzyBkvt6O4cVm4r/nNxh0GFs/RbQtqP/i4wCvLEdmU7ptgtnw7fI67WYD1aHPuv4OVA==",
1255 "license": "MIT",
1256 "dependencies": {
1257 "b4a": "^1.6.6",
1258 "compact-encoding": "^2.15.0",
1259 "sodium-universal": "^5.0.0"
1260 }
1261 },
1262 "node_modules/hypercore-id-encoding": {
1263 "version": "1.3.0",
1264 "resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.3.0.tgz",
1265 "integrity": "sha512-W6sHdGo5h7LXEsoWfKf/KfuROZmZRQDlGqJF2EPHW+noCK66Vvr0+zE6cL0vqQi18s0kQPeN7Sq3QyR0Ytc2VQ==",
1266 "license": "Apache-2.0",
1267 "dependencies": {
1268 "b4a": "^1.5.3",
1269 "z32": "^1.0.0"
1270 }
1271 },
1272 "node_modules/hyperdht": {
1273 "version": "6.30.0",
1274 "resolved": "https://registry.npmjs.org/hyperdht/-/hyperdht-6.30.0.tgz",
1275 "integrity": "sha512-LkfeAFVnOIvOpr2ILtJ38CzPgXmye7jXDS12xndVKfNoxzIrM0GonY+Bz5lHutoc08ZbT3Olr/w2NSeq5Pj0Ng==",
1276 "license": "MIT",
1277 "dependencies": {
1278 "@hyperswarm/secret-stream": "^6.6.2",
1279 "b4a": "^1.3.1",
1280 "bare-events": "^2.2.0",
1281 "blind-relay": "^1.3.0",
1282 "bogon": "^1.0.0",
1283 "compact-encoding": "^2.4.1",
1284 "dht-rpc": "^6.15.1",
1285 "hypercore-crypto": "^3.3.0",
1286 "hypercore-id-encoding": "^1.2.0",
1287 "hyperdht-address": "^1.0.1",
1288 "noise-curve-ed": "^2.0.0",
1289 "noise-handshake": "^4.0.0",
1290 "record-cache": "^1.1.1",
1291 "safety-catch": "^1.0.1",
1292 "signal-promise": "^1.0.3",
1293 "sodium-universal": "^5.0.1",
1294 "streamx": "^2.16.1",
1295 "unslab": "^1.3.0",
1296 "xache": "^1.1.0"
1297 },
1298 "bin": {
1299 "hyperdht": "bin.js"
1300 }
1301 },
1302 "node_modules/hyperdht-address": {
1303 "version": "1.0.1",
1304 "resolved": "https://registry.npmjs.org/hyperdht-address/-/hyperdht-address-1.0.1.tgz",
1305 "integrity": "sha512-v817eJkhryWNtMGQHLxVo6jtfEeIV9k429fRUWUKkp1bm+3/rzH8r5BFef9VT7Jq4Tvgt0Gw11FV32CacsqMZA==",
1306 "license": "Apache-2.0",
1307 "dependencies": {
1308 "compact-encoding": "^2.19.0",
1309 "hyperschema": "^1.20.1"
1310 }
1311 },
1312 "node_modules/hyperschema": {
1313 "version": "1.20.1",
1314 "resolved": "https://registry.npmjs.org/hyperschema/-/hyperschema-1.20.1.tgz",
1315 "integrity": "sha512-7gnvaTNUs8FqdrU3NNE6nzhOneGyDlUlpROu9YFlHA61fE8ppKKf2gLZjZjsx/enNt+VFN4ITxy8ijypfyWBLw==",
1316 "license": "Apache-2.0",
1317 "dependencies": {
1318 "bare-fs": "^4.0.1",
1319 "compact-encoding": "^2.19.0",
1320 "generate-object-property": "^2.0.0",
1321 "generate-string": "^1.0.1"
1322 }
1323 },
1324 "node_modules/hyperswarm": {
1325 "version": "4.17.0",
1326 "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-4.17.0.tgz",
1327 "integrity": "sha512-oe86sK961Ueg7rvDN/veFwG8xH+Iv6vObPhGDkPJcDVxk/NduW41ZhAcVDnHzRbm7S0eLU7WaDUvehOYoKSpRQ==",
1328 "license": "MIT",
1329 "dependencies": {
1330 "b4a": "^1.3.1",
1331 "bare-events": "^2.2.0",
1332 "hyperdht": "^6.21.0",
1333 "safety-catch": "^1.0.2",
1334 "shuffled-priority-queue": "^2.1.0",
1335 "streamx": "^2.22.1",
1336 "unslab": "^1.3.0"
1337 }
1338 },
1339 "node_modules/is-property": {
1340 "version": "1.0.2",
1341 "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
1342 "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
1343 "license": "MIT"
1344 },
1345 "node_modules/kademlia-routing-table": {
1346 "version": "1.0.6",
1347 "resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.6.tgz",
1348 "integrity": "sha512-Ve6jwIlUCYvUzBnXnzVRHDZCFgXURW9gmF3r7n05kZs/2rNbLHXwGdcq0qIaSwdmJCvtosgR4JensnVU65hzNQ==",
1349 "license": "MIT",
1350 "dependencies": {
1351 "bare-events": "^2.2.0"
1352 }
1353 },
1354 "node_modules/nanoassert": {
1355 "version": "2.0.0",
1356 "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
1357 "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==",
1358 "license": "ISC"
1359 },
1360 "node_modules/nat-sampler": {
1361 "version": "1.0.1",
1362 "resolved": "https://registry.npmjs.org/nat-sampler/-/nat-sampler-1.0.1.tgz",
1363 "integrity": "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw==",
1364 "license": "MIT"
1365 },
1366 "node_modules/noise-curve-ed": {
1367 "version": "2.1.0",
1368 "resolved": "https://registry.npmjs.org/noise-curve-ed/-/noise-curve-ed-2.1.0.tgz",
1369 "integrity": "sha512-zAzJx+VwZM3w6EA1hTmDhJfvAnCeBQn/1FAeZ0LtGxCcCtlAK/uJXQVF/eDVUOaAZ286lHlx77WJ+qj9SmsRRg==",
1370 "license": "ISC",
1371 "dependencies": {
1372 "b4a": "^1.1.0",
1373 "nanoassert": "^2.0.0",
1374 "sodium-universal": "^5.0.0"
1375 }
1376 },
1377 "node_modules/noise-handshake": {
1378 "version": "4.2.0",
1379 "resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-4.2.0.tgz",
1380 "integrity": "sha512-9O/VTNX/E2/AToyMTTDU0J/4WhaXMTdqc2DHs9vf+snoZ0cenSBq0dNYTVV1snYYEkmo6QeRrYMxtqtoYnY+LA==",
1381 "license": "Apache-2.0",
1382 "dependencies": {
1383 "b4a": "^1.1.0",
1384 "nanoassert": "^2.0.0",
1385 "sodium-universal": "^5.0.0"
1386 }
1387 },
1388 "node_modules/paparam": {
1389 "version": "1.10.1",
1390 "resolved": "https://registry.npmjs.org/paparam/-/paparam-1.10.1.tgz",
1391 "integrity": "sha512-viyQI64VIja0Za3njIzhoEP8ZVkgPowhZPuG0E96NwBfYJ6ZIyrrlhWGtFPkdN7eYLl2L8CTWL+wla0evm1KKQ==",
1392 "dev": true,
1393 "license": "Apache-2.0"
1394 },
1395 "node_modules/picomatch": {
1396 "version": "4.0.4",
1397 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
1398 "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
1399 "dev": true,
1400 "license": "MIT",
1401 "engines": {
1402 "node": ">=12"
1403 },
1404 "funding": {
1405 "url": "https://github.com/sponsors/jonschlinkert"
1406 }
1407 },
1408 "node_modules/protomux": {
1409 "version": "3.10.1",
1410 "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.10.1.tgz",
1411 "integrity": "sha512-jgBqx8ZyaBWea/DFG4eOu1scOaeBwcnagiRC1XFVrjeGt7oAb0Pk5udPpBUpJ4DJBRjra50jD6YcZiQQTRqaaA==",
1412 "license": "MIT",
1413 "dependencies": {
1414 "b4a": "^1.3.1",
1415 "compact-encoding": "^2.5.1",
1416 "queue-tick": "^1.0.0",
1417 "safety-catch": "^1.0.1",
1418 "unslab": "^1.3.0"
1419 }
1420 },
1421 "node_modules/punycode": {
1422 "version": "2.3.1",
1423 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1424 "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1425 "license": "MIT",
1426 "engines": {
1427 "node": ">=6"
1428 }
1429 },
1430 "node_modules/queue-tick": {
1431 "version": "1.0.1",
1432 "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
1433 "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
1434 "license": "MIT"
1435 },
1436 "node_modules/record-cache": {
1437 "version": "1.2.0",
1438 "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz",
1439 "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==",
1440 "license": "MIT",
1441 "dependencies": {
1442 "b4a": "^1.3.1"
1443 }
1444 },
1445 "node_modules/require-addon": {
1446 "version": "1.2.0",
1447 "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz",
1448 "integrity": "sha512-VNPDZlYgIYQwWp9jMTzljx+k0ZtatKlcvOhktZ/anNPI3dQ9NXk7cq2U4iJ1wd9IrytRnYhyEocFWbkdPb+MYA==",
1449 "license": "Apache-2.0",
1450 "dependencies": {
1451 "bare-addon-resolve": "^1.3.0"
1452 },
1453 "engines": {
1454 "bare": ">=1.10.0"
1455 }
1456 },
1457 "node_modules/safety-catch": {
1458 "version": "1.0.3",
1459 "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.3.tgz",
1460 "integrity": "sha512-Zq+J1TefpoEq/HTUabo0YXX5MNvttjWYODGohgPBO2jfko8Wqx3JYMgE823szDFVamdH5PlpByvfiWScTdSYDA==",
1461 "license": "MIT"
1462 },
1463 "node_modules/same-object": {
1464 "version": "1.0.2",
1465 "resolved": "https://registry.npmjs.org/same-object/-/same-object-1.0.2.tgz",
1466 "integrity": "sha512-csHWhvUsLbIOHDM/nP+KHWM+BLPsIzWkFa8HbzaI0G7BqKXgx+7FJpKTGgLXyz5amfdY2OVBcmXTqYOMEk04og==",
1467 "dev": true,
1468 "license": "MIT"
1469 },
1470 "node_modules/shuffled-priority-queue": {
1471 "version": "2.1.0",
1472 "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz",
1473 "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==",
1474 "license": "MIT",
1475 "dependencies": {
1476 "unordered-set": "^2.0.1"
1477 }
1478 },
1479 "node_modules/signal-promise": {
1480 "version": "1.0.3",
1481 "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz",
1482 "integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g==",
1483 "license": "MIT"
1484 },
1485 "node_modules/sodium-native": {
1486 "version": "5.1.0",
1487 "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-5.1.0.tgz",
1488 "integrity": "sha512-3RxgyWyJlhTsABPnJVpCI5CoTDANZTqqFrEPqr+kjfnRaBihpVtMUE3yTF40ukdoB1APXeoBNKF3MzZAIHg39g==",
1489 "license": "MIT",
1490 "dependencies": {
1491 "bare-assert": "^1.2.0",
1492 "require-addon": "^1.1.0",
1493 "which-runtime": "^1.2.1"
1494 },
1495 "engines": {
1496 "bare": ">=1.16.0"
1497 }
1498 },
1499 "node_modules/sodium-secretstream": {
1500 "version": "1.2.0",
1501 "resolved": "https://registry.npmjs.org/sodium-secretstream/-/sodium-secretstream-1.2.0.tgz",
1502 "integrity": "sha512-q/DbraNFXm1KfCiiZvapmz5UC3OlpirYFIvBK2MhGaOFSb3gRyk8OXTi17UI9SGfshQNCpsVvlopogbzZNyW6Q==",
1503 "license": "MIT",
1504 "dependencies": {
1505 "b4a": "^1.1.1",
1506 "sodium-universal": "^5.0.0"
1507 }
1508 },
1509 "node_modules/sodium-universal": {
1510 "version": "5.0.1",
1511 "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-5.0.1.tgz",
1512 "integrity": "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q==",
1513 "license": "MIT",
1514 "dependencies": {
1515 "sodium-native": "^5.0.1"
1516 },
1517 "peerDependencies": {
1518 "sodium-javascript": "~0.8.0"
1519 },
1520 "peerDependenciesMeta": {
1521 "sodium-javascript": {
1522 "optional": true
1523 }
1524 }
1525 },
1526 "node_modules/stackframe": {
1527 "version": "1.3.4",
1528 "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
1529 "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
1530 "dev": true,
1531 "license": "MIT"
1532 },
1533 "node_modules/streamx": {
1534 "version": "2.25.0",
1535 "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz",
1536 "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==",
1537 "license": "MIT",
1538 "dependencies": {
1539 "events-universal": "^1.0.0",
1540 "fast-fifo": "^1.3.2",
1541 "text-decoder": "^1.1.0"
1542 }
1543 },
1544 "node_modules/teex": {
1545 "version": "1.0.1",
1546 "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
1547 "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
1548 "license": "MIT",
1549 "dependencies": {
1550 "streamx": "^2.12.5"
1551 }
1552 },
1553 "node_modules/test-tmp": {
1554 "version": "1.4.0",
1555 "resolved": "https://registry.npmjs.org/test-tmp/-/test-tmp-1.4.0.tgz",
1556 "integrity": "sha512-GVggxGg+jXqP2Wbju50JVLo+9E+nIOPPyWqgr63EbOnNItIKu1cEbJpTWAJeflnyGqXOtcMI7ijHRp88GUkfDA==",
1557 "dev": true,
1558 "license": "MIT",
1559 "dependencies": {
1560 "bare-fs": "^4.0.1",
1561 "bare-os": "^3.3.0",
1562 "bare-path": "^3.0.0"
1563 }
1564 },
1565 "node_modules/text-decoder": {
1566 "version": "1.2.7",
1567 "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
1568 "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
1569 "license": "Apache-2.0",
1570 "dependencies": {
1571 "b4a": "^1.6.4"
1572 }
1573 },
1574 "node_modules/time-ordered-set": {
1575 "version": "2.0.1",
1576 "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-2.0.1.tgz",
1577 "integrity": "sha512-VJEKmgSN2UiOLB8BpN8Sh2b9LGMHTP5OPrQRpnKjvOheOyzk0mufbjzjKTIG2gO4A+Y+vDJ+0TcLbpUmMLsg8A==",
1578 "license": "MIT"
1579 },
1580 "node_modules/timeout-refresh": {
1581 "version": "2.0.1",
1582 "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-2.0.1.tgz",
1583 "integrity": "sha512-SVqEcMZBsZF9mA78rjzCrYrUs37LMJk3ShZ851ygZYW1cMeIjs9mL57KO6Iv5mmjSQnOe/29/VAfGXo+oRCiVw==",
1584 "license": "MIT"
1585 },
1586 "node_modules/tmatch": {
1587 "version": "5.0.0",
1588 "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-5.0.0.tgz",
1589 "integrity": "sha512-Ib9OtBkpHn07tXP04SlN1SYRxFgTk6wSM2EBmjjxug4u5RXPRVLkdFJSS1PmrQidaSB8Lru9nRtViQBsbxzE5Q==",
1590 "dev": true,
1591 "license": "ISC",
1592 "engines": {
1593 "node": ">=8"
1594 }
1595 },
1596 "node_modules/udx-native": {
1597 "version": "1.19.2",
1598 "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.19.2.tgz",
1599 "integrity": "sha512-RNYh+UhfryCsF5hE2ZOuIqcZ+qdipXK3UsarwxWJwsUQZFE3ybwz0mPjwb5ev1PMBcjFahWiepS/q0wwL51c2g==",
1600 "license": "Apache-2.0",
1601 "dependencies": {
1602 "b4a": "^1.5.0",
1603 "bare-events": "^2.2.0",
1604 "require-addon": "^1.1.0",
1605 "streamx": "^2.22.0"
1606 },
1607 "engines": {
1608 "bare": ">=1.17.4"
1609 }
1610 },
1611 "node_modules/unordered-set": {
1612 "version": "2.0.1",
1613 "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz",
1614 "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==",
1615 "license": "MIT"
1616 },
1617 "node_modules/unslab": {
1618 "version": "1.3.0",
1619 "resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz",
1620 "integrity": "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ==",
1621 "license": "Apache-2.0",
1622 "dependencies": {
1623 "b4a": "^1.6.6"
1624 }
1625 },
1626 "node_modules/v8-to-istanbul": {
1627 "version": "9.3.0",
1628 "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
1629 "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
1630 "dev": true,
1631 "license": "ISC",
1632 "dependencies": {
1633 "@jridgewell/trace-mapping": "^0.3.12",
1634 "@types/istanbul-lib-coverage": "^2.0.1",
1635 "convert-source-map": "^2.0.0"
1636 },
1637 "engines": {
1638 "node": ">=10.12.0"
1639 }
1640 },
1641 "node_modules/which-runtime": {
1642 "version": "1.3.2",
1643 "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.3.2.tgz",
1644 "integrity": "sha512-5kwCfWml7+b2NO7KrLMhYihjRx0teKkd3yGp1Xk5Vaf2JGdSh+rgVhEALAD9c/59dP+YwJHXoEO7e8QPy7gOkw==",
1645 "license": "Apache-2.0"
1646 },
1647 "node_modules/xache": {
1648 "version": "1.2.1",
1649 "resolved": "https://registry.npmjs.org/xache/-/xache-1.2.1.tgz",
1650 "integrity": "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA==",
1651 "license": "MIT"
1652 },
1653 "node_modules/z32": {
1654 "version": "1.1.0",
1655 "resolved": "https://registry.npmjs.org/z32/-/z32-1.1.0.tgz",
1656 "integrity": "sha512-1WUHy+VS6d0HPNspDxvLssBbeQjXMjSnpv0vH82vRAUfg847NmX3OXozp/hRP5jPhxBbrVzrgvAt+UsGNzRFQQ==",
1657 "license": "MIT",
1658 "dependencies": {
1659 "b4a": "^1.5.3"
1660 }
1661 }
1662 }
1663}
package.json +43 -0
……@@ -0,0 +1,43 @@
1{
2 "name": "git-remote-punch",
3 "version": "0.1.0",
4 "description": "Git remote helper for punch:// URLs — P2P git transport over Hyperswarm",
5 "type": "module",
6 "bin": {
7 "git-remote-punch": "./bin/git-remote-punch"
8 },
9 "scripts": {
10 "test": "brittle test/*.test.js"
11 },
12 "files": [
13 "bin/",
14 "lib/",
15 "README.md",
16 "LICENSE"
17 ],
18 "keywords": [
19 "git",
20 "git-remote",
21 "p2p",
22 "hyperswarm",
23 "pear",
24 "holepunch",
25 "punch"
26 ],
27 "dependencies": {
28 "bare-fs": "^4.5.3",
29 "bare-node-runtime": "^1.1.4",
30 "bare-os": "^3.6.2",
31 "bare-path": "^3.0.0",
32 "bare-subprocess": "^5.2.2",
33 "bare-url": "^2.3.2",
34 "hypercore-crypto": "^3.4.1",
35 "hyperswarm": "^4.8.2"
36 },
37 "devDependencies": {
38 "brittle": "^3.0.0"
39 },
40 "engines": {
41 "bare": ">=1.12.0"
42 }
43}