OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet commits / 3596246

Migrate OTA: pear-runtime (Hyperdrive) → pgh content-addressed updates
pear-runtime self-updated over an append-only Hyperdrive blobs corestore that accumulated every release's bytes forever (~2.8 GB observed under ~/.config/godot-keet/pear-runtime on a long-lived install; never reclaimed). Swap it for a backgrounded `pgh app update godot-keet` subprocess — same UX, atomic content-addressed materialize, zero blob balloon. Mirrors the proven hyper-tps migration (hyper-fleeky-dev #81). index.js: - drop initPearRuntime() + the legacy isPear/pear-appdrive extractFromBundle path; add resolvePghBin() + startBackgroundUpdate() (detached, best-effort). - add getHost()/resolveBuildDir() for the by-arch/<host>/build/ layout; the binary now resolves under build/linux/godot-keet/godot-keet at the tree root. package.json: - remove pear-runtime + pear-appdrive deps and the top-level pear:// upgrade. - add a pgh block with pgh.upgrade=pgh://<registry>/godot-keet. - regenerate package-lock.json to match. .pear-git/ci.yaml: - drop patch-pear-runtime, layout-by-arch, clean-root. - replace the pear-runtime by-arch/<host>/app/<name> mirror layout (which clean-root'd index.js off the tree root — incompatible with pgh's root-entry expectation) with a stage/ fat-tree: app files at root, binaries under by-arch/<host>/build/linux/, then `pgh publish ./stage`. - keep the keet stack steps untouched (keet-core-hyperdb staleness tracked separately). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
35962469f0aa4e76f43ca5e858b6b1aac914ea53
by plankatron <fleeky@gmail.com> · 2026-06-20T18:31:32.000Z

Changed files (4) +150 -1371

.pear-git/ci.yaml +58 -88
……@@ -1,115 +1,85 @@
11steps:
22 - name: write-version
33 run: |
4 VERSION=$(git rev-list --count HEAD)
4 # CI runs in a `git archive | tar -x` extraction with no .git/ directory,
5 # so `git rev-list` returns empty — the orchestrator injects git metadata
6 # via env vars. Fall back to git only for local runs.
7 COUNT="${GIT_COMMIT_COUNT:-$(git rev-list --count HEAD 2>/dev/null || echo 0)}"
8 SHORT="${GIT_COMMIT_SHORT:-$(git rev-parse --short HEAD 2>/dev/null || echo unknown)}"
59 BUILD_TS=$(date -u +%Y%m%d-%H%M)
6 echo "v${VERSION}-${BUILD_TS}" > version.txt
7 # Bump package.json version so pear-runtime detects updates
8 sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"0.${VERSION}.0\"/" package.json
10 echo "v${COUNT}-${BUILD_TS}-${SHORT}" > version.txt
11 sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"0.${COUNT}.0\"/" package.json
912 - name: export-godot
10 # Export into subdirectory so build/linux/godot-keet is a DIRECTORY.
11 # pear-runtime OTA does fsx.swap(next/.../godot-keet, build/.../godot-keet)
12 # — both sides must be directories for the swap to work on Linux.
13 # Export into a subdirectory so build/linux/godot-keet is a DIRECTORY
14 # holding the binary + .pck + native .so files. stage-fat-tree copies this
15 # dir under by-arch/<host>/build/linux/; the launcher resolves it via
16 # resolveBuildDir() and runs build/linux/godot-keet/godot-keet.
1317 run: mkdir -p build/linux/godot-keet && godot4 --headless --export-release "Linux" build/linux/godot-keet/godot-keet; test -f build/linux/godot-keet/godot-keet
1418 timeout: 180
1519 - name: install-public-deps
1620 run: npm install --production --ignore-scripts
1721 timeout: 120
1822 - name: overlay-private-deps
19 # npm install resolves public deps (pear-runtime, bare-*, etc.) from package-lock.json.
20 # rsync --ignore-existing fills in private deps from keet-cli without overwriting npm's versions.
21 # This avoids version conflicts: npm-resolved packages always take priority.
22 # Private deps: 25 @holepunchto/* packages + ~190 unscoped transitive deps (keet-identity-key, bip39-mnemonic, autobase, etc.)
23 # npm install resolves public deps (bare-*, framed-stream, etc.) from
24 # package-lock.json. rsync --ignore-existing fills in private deps from
25 # keet-cli without overwriting npm's versions (npm-resolved wins).
26 # Private deps: 25 @holepunchto/* packages + ~190 unscoped transitive deps
27 # (keet-identity-key, bip39-mnemonic, autobase, etc.)
2328 run: rsync -a --ignore-existing /storage/projects/code/hypercore-kb/hyper-fleeky/keet-cli/node_modules/ node_modules/
2429 - name: copy-keet-daemon
2530 # Our modified keet-daemon with hyper-social routes (meta, graph, registry, topic, dm-shares).
2631 # Must overwrite keet-cli's version since rsync already copied it.
2732 run: rm -rf node_modules/keet-daemon && cp -r /storage/projects/code/hypercore-kb/hyper-fleeky/packages/keet-daemon node_modules/keet-daemon
28 - name: patch-pear-runtime
29 # Four patches to pear-runtime for large binary apps (71MB Godot binary):
30 # 1. Lazy-load bare-sidecar — native prebuilds break pear stage module traversal.
31 # 2. Don't delete staging on launch — enables incremental mirrors. Without this,
32 # _open() runs rm -rf on pear-runtime/next/ every launch, forcing a full 71MB
33 # re-mirror even when only index.js changed. With staging preserved, interrupted
34 # mirrors resume and repeated _update() calls during replication reuse existing files.
35 # 3. Move this.applied AFTER fsx.swap — if swap fails, retry on next 'updated' event
36 # actually retries instead of being a no-op.
37 # 4. Validate staging completeness before signaling update ready — prevents replication
38 # race where checkout(intermediateLength) returns an old deploy state's package.json
39 # triggering a mirror of incomplete by-arch data. Replaces the old version comparison
40 # hack with a proper file-presence check.
41 run: |
42 RT=node_modules/pear-runtime/index.js
43
44 # 1. Lazy-load bare-sidecar (prevents staging traversal failure)
45 sed -i "s/const Sidecar = require('bare-sidecar')/let Sidecar = null/" $RT
46 sed -i "/return new Sidecar/i\\ if (!Sidecar) Sidecar = require('bare-sidecar')" $RT
47 rm -rf node_modules/bare-sidecar node_modules/pear-runtime/node_modules/bare-sidecar
48
49 # 2. Don't delete staging on launch — enables incremental mirrors
50 # Lines 53-56: await fs.promises.rm(path.join(this.dir, 'pear-runtime/next'), {...})
51 sed -i '/await.*rm.*pear-runtime\/next/,+3d' $RT
52
53 # 3. Move this.applied AFTER fsx.swap (not before — prevents retry no-op on failure)
54 sed -i '/if (!this.updated || this.applied || !this.bundled) return/{n;/this.applied = true/d}' $RT
55 sed -i '/await fsx.swap/a\ this.applied = true' $RT
56
57 # 4. Fixed staging path — remove per-version id so mirror-drive diffs against
58 # previous version's files instead of always starting fresh. Each new Hypercore
59 # length created a new empty staging dir, forcing full 71MB re-download.
60 sed -i "s|path.join(this.dir, 'pear-runtime/next', id)|path.join(this.dir, 'pear-runtime/next')|" $RT
61
62 # 5. Don't delete staging after swap — fsx.swap() exchanges dirs, so after swap
63 # staging has the OLD app files. Next mirror diffs against those = incremental.
64 # Costs 71MB disk but saves minutes of P2P bandwidth per update.
65 sed -i '/fs.promises.rm(this.next/d' $RT
66
67 # 6. Version comparison — skip update only when versions match exactly.
68 # Patch #8 (staging validation) guards against replication race artifacts.
69 # Using exact equality so commit count resets (history rewrites) don't block updates.
70 sed -i 's/JSON.parse(manifest).version === this.version/JSON.parse(manifest).version === String(this.version)/' $RT
71
72 # 7. Update this.version after successful mirror — prevents double-fire.
73 # Without this, _update() sees version mismatch again (this.version is from
74 # startup, manifest has new version) and mirrors a second time redundantly.
75 sed -i '/this.next = next/a\ this.version = JSON.parse(manifest).version' $RT
76
77 # 8. Validate staging completeness before signaling update ready
78 # Belt-and-suspenders: if staging doesn't have index.js + package.json, skip.
79 sed -i '/this.updated = true/i\ const _sa = path.join(next, "by-arch", host, "app", this.name); try { fs.statSync(path.join(_sa, "index.js")); fs.statSync(path.join(_sa, "package.json")) } catch { return }' $RT
8033 - name: verify-deps
81 # Prove all critical imports resolve before staging
34 # Prove all critical imports resolve before staging.
8235 run: |
8336 FAIL=0
84 for mod in @holepunchto/keet-core-hyperdb keet-daemon framed-stream b4a hypercore-crypto pear-runtime corestore hyperdrive hyperswarm hypercore keet-identity-key bip39-mnemonic; do
37 for mod in @holepunchto/keet-core-hyperdb keet-daemon framed-stream b4a hypercore-crypto corestore hyperswarm hypercore keet-identity-key bip39-mnemonic; do
8538 if [ ! -d "node_modules/$mod" ]; then echo "MISSING: $mod"; FAIL=1; fi
8639 done
8740 test $FAIL -eq 0 && echo "All critical deps present" || exit 1
8841 - name: tune-rocksdb-memory
8942 run: sed -i 's/maxWriteBufferNumber = 2/maxWriteBufferNumber = 1/' node_modules/rocksdb-native/lib/column-family.js && sed -i 's/maxOpenFiles = -1/maxOpenFiles = 256/' node_modules/rocksdb-native/lib/state.js
90 - name: layout-by-arch
91 # pear-runtime mirrors by-arch/<host>/app/<name> and atomically swaps it with
92 # the app directory. The ENTIRE app goes here — binary, pck, index.js, daemon,
93 # node_modules — so a single swap updates everything. No custom file sync needed.
94 # Arch names must match Bare.arch (x64, arm64), NOT uname -m (x86_64, aarch64).
43 - name: stage-fat-tree
44 # Multi-arch layout for pgh content-addressed install: host-independent
45 # files (index.js, daemon, node_modules) at the stage root, platform
46 # binaries under by-arch/<host>/build/linux/godot-keet/. The rootTree
47 # references all arches; `pgh app install`'s skipPath drops foreign
48 # by-arch/<other-host>/ during materialize so each user only fetches their
49 # own host's binaries. Replaces the old pear-runtime by-arch/<host>/app/<name>
50 # mirror layout (which clean-root'd index.js off the tree root — incompatible
51 # with pgh's root-entry expectation). Arch names match Bare.arch (x64, arm64).
9552 run: |
9653 RAW=$(uname -m)
97 case "$RAW" in
98 x86_64) ARCH=x64 ;;
99 aarch64) ARCH=arm64 ;;
100 *) ARCH="$RAW" ;;
101 esac
54 case "$RAW" in x86_64) ARCH=x64 ;; aarch64) ARCH=arm64 ;; *) ARCH="$RAW" ;; esac
10255 HOST="linux-${ARCH}"
103 TARGET="by-arch/${HOST}/app/godot-keet"
104 mkdir -p "$TARGET/build/linux/godot-keet"
105 cp build/linux/godot-keet/godot-keet "$TARGET/build/linux/godot-keet/"
106 cp build/linux/godot-keet/godot-keet.pck "$TARGET/build/linux/godot-keet/" 2>/dev/null; true
107 cp build/linux/godot-keet/*.so "$TARGET/build/linux/godot-keet/" 2>/dev/null; true
108 cp index.js package.json version.txt "$TARGET/"
109 cp -r daemon "$TARGET/"
110 cp -r node_modules "$TARGET/"
111 - name: clean-root
112 # Remove root duplicates — only package.json stays at root (needed by
113 # pear-runtime for version check). pgh app install detects by-arch/ and
114 # extracts the right platform dir, so no need for root copies.
115 run: rm -rf build daemon node_modules && rm -f index.js version.txt
56 STAGE=stage
57 rm -rf "$STAGE"
58 mkdir -p "$STAGE/by-arch/${HOST}/build/linux/godot-keet"
59
60 # Host-independent at top level
61 cp index.js package.json version.txt "$STAGE/"
62 cp -r daemon "$STAGE/"
63 cp -r node_modules "$STAGE/"
64
65 # Host-specific: godot binary + pck + native GDExtension .so (deref symlinks)
66 cp -L build/linux/godot-keet/godot-keet "$STAGE/by-arch/${HOST}/build/linux/godot-keet/"
67 cp -L build/linux/godot-keet/godot-keet.pck "$STAGE/by-arch/${HOST}/build/linux/godot-keet/" 2>/dev/null; true
68 cp -L build/linux/godot-keet/*.so* "$STAGE/by-arch/${HOST}/build/linux/godot-keet/" 2>/dev/null; true
69 - name: strip-foreign-prebuilds
70 run: |
71 RAW=$(uname -m)
72 case "$RAW" in x86_64) ARCH=x64 ;; aarch64) ARCH=arm64 ;; *) ARCH="$RAW" ;; esac
73 HOST="linux-${ARCH}"
74 TARGET="stage/node_modules"
75 if [ -d "$TARGET" ]; then
76 BEFORE=$(du -sm "$TARGET" | cut -f1)
77 find "$TARGET" -path "*/prebuilds/*" -mindepth 1 -maxdepth 1 -type d ! -name "$HOST" -exec rm -rf {} +
78 AFTER=$(du -sm "$TARGET" | cut -f1)
79 echo "Stripped foreign prebuilds: ${BEFORE}MB -> ${AFTER}MB (saved $((BEFORE - AFTER))MB)"
80 fi
81 - name: pgh-publish
82 run: |
83 cd stage
84 pgh publish . --accept-conflict "automated CI publish; dep version splits + non-deterministic builds inherited from per-app lockfiles across the pgh ecosystem"
85 timeout: 300
index.js +85 -147
……@@ -1,10 +1,9 @@
11// godot-keet Launcher
22//
33// Starts keet-daemon in-process, launches Godot game binary.
4// pear-runtime provides P2P OTA updates when running from a deployed install.
4// pgh provides P2P OTA updates (content-addressed) when installed via pgh.
55//
66// Usage: bare index.js [--debug] [--no-updates] [--storage <path>]
7// pear run pear://KEY [--debug]
87
98import subprocess from 'bare-subprocess'
109import fs from 'fs'
……@@ -19,7 +18,7 @@ const rawArgs = isPear ? (Pear.config.args || []) : Bare.argv.slice(2)
1918const debugMode = rawArgs.includes('--debug')
2019const noUpdates = rawArgs.includes('--no-updates')
2120
22// --storage <path> for custom pear-runtime storage
21// --storage <path> overrides the app storage dir (game/identity state)
2322const storageIdx = rawArgs.indexOf('--storage')
2423const customStorage = storageIdx !== -1 ? rawArgs[storageIdx + 1] : null
2524
……@@ -44,6 +43,25 @@ function getPlatformDir () {
4443 return p
4544}
4645
46// Match pgh's detectHost convention (lib/commands/app.js#detectHost).
47// Used to find arch-specific binaries laid out by ci.yaml under
48// by-arch/<host>/ for multi-arch publishes. Falls back to flat layout
49// when by-arch/<host>/ is absent so single-arch installs still work.
50function getHost () {
51 let host = os.platform() + '-' + os.arch()
52 try {
53 const osr = fs.readFileSync('/etc/os-release', 'utf8')
54 if (/^ID=alpine/m.test(osr)) host += '-musl'
55 } catch {}
56 return host
57}
58
59function resolveBuildDir (appDir, platformDir) {
60 const arched = path.join(appDir, 'by-arch', getHost(), 'build', platformDir)
61 if (fs.existsSync(arched)) return arched
62 return path.join(appDir, 'build', platformDir)
63}
64
4765function exit (code) {
4866 if (isPear) Pear.exit(code)
4967 else Bare.exit(code)
……@@ -107,137 +125,68 @@ async function ensureDaemon () {
107125 }
108126}
109127
110// Initialize pear-runtime for P2P OTA updates
111async function initPearRuntime () {
128// Background OTA via pgh — content-addressed store + hyper-overlay, NO
129// Hyperdrive/blobs. `pgh app update <name>` resolves the latest release from
130// package.json's pgh.upgrade, fetches any new tree closure into the content
131// store, and ATOMICALLY materializes it into the install dir (scratch build +
132// swap). The swap preserves the running process's inodes, so it is safe to run
133// while the game is live; the next launch picks up the new tree.
134//
135// This replaces the former pear-runtime Hyperdrive updater, which kept an
136// unbounded append-only blob corestore under ~/.config/godot-keet/pear-runtime
137// (observed at ~2.8 GB on a long-lived install — every release's blocks
138// accumulated and were never reclaimed).
139function resolvePghBin () {
140 // Prefer the user launcher (~/.local/bin/pgh). Fall back to the
141 // pgh-installed bare runtime + entry inside the content store. Returns an
142 // argv prefix array, or null if pgh is not present on this machine.
143 const launcher = path.join(os.homedir(), '.local', 'bin', 'pgh')
144 if (fs.existsSync(launcher)) return [launcher]
145 const storeRoot = process.env.PGH_STORE_ROOT || path.join(os.homedir(), '.local', 'share', 'store')
146 const bare = path.join(storeRoot, 'apps', 'pgh', 'runtime', 'bare')
147 const entry = path.join(storeRoot, 'apps', 'pgh', 'bin', 'pgh.bare.js')
148 if (fs.existsSync(bare) && fs.existsSync(entry)) return [bare, entry]
149 return null
150}
151
152function startBackgroundUpdate () {
112153 if (noUpdates) {
113154 console.log('[launcher] OTA updates disabled (--no-updates)')
114 return null
155 return
115156 }
116157
117158 try {
118159 const pkg = JSON.parse(fs.readFileSync(path.join(getAppDir(), 'package.json'), 'utf-8'))
119 if (!pkg.upgrade) {
120 console.log('[launcher] No upgrade link in package.json, skipping OTA')
121 return null
160 const upgrade = pkg.pgh && pkg.pgh.upgrade
161 if (!upgrade) {
162 console.log('[launcher] No pgh.upgrade link in package.json, skipping OTA')
163 return
164 }
165 const appName = (pkg.pgh && pkg.pgh.bin) || pkg.name || 'godot-keet'
166 const argv = resolvePghBin()
167 if (!argv) {
168 console.log('[launcher] pgh CLI not found, skipping OTA')
169 return
122170 }
123171
124 // Dynamic variable import — prevents bare-pack from traversing pear-runtime
125 // (bare-sidecar native prebuilds break pear stage module traversal)
126 const mod = 'pear-' + 'runtime'
127 const { default: PearRuntime } = await import(mod)
128 const appDir = getAppDir()
129 const dir = getStorageDir()
130
131 console.log(`[launcher] OTA updates enabled (${pkg.upgrade})`)
132 console.log(`[launcher] Runtime storage: ${dir}`)
133
134 // CI bumps pkg.version to "0.{commitCount}.0" — pear-runtime compares remote
135 // package.json version vs this value to detect updates. Must use same format.
136 // version.txt ("v143") is for display only — NOT for OTA comparison.
137 const runtimeVersion = pkg.version
138
139 console.log(`[launcher] OTA version: ${runtimeVersion}`)
140
141 const runtime = new PearRuntime({
142 dir,
143 app: appDir,
144 version: runtimeVersion,
145 upgrade: pkg.upgrade
146 })
147
148 runtime.on('updating', () => {
149 console.log('[launcher] Update downloading...')
150 })
151
152 runtime.on('updating-delta', (data) => {
153 if (data.key) console.log(`[launcher] ${data.key}`)
172 console.log(`[launcher] OTA: checking for updates via ${upgrade}`)
173 // Detached + best-effort: never blocks or delays the game. pgh's atomic
174 // materialize leaves the live install intact if the process is interrupted.
175 const proc = subprocess.spawn(argv[0], [...argv.slice(1), 'app', 'update', appName], {
176 stdio: 'ignore',
177 detached: true
154178 })
155
156 runtime.on('updated', async () => {
157 if (runtime.applied) return
158
159 console.log('[launcher] Update ready — applying...')
160
161 try {
162 await runtime.applyUpdate()
163 if (runtime.applied) {
164 console.log('[launcher] Update applied — restart for new version')
165 }
166 } catch (err) {
167 console.error('[launcher] Failed to apply update:', err.message)
168 }
179 proc.on('error', (err) => {
180 console.error('[launcher] OTA check failed to spawn:', err.message)
169181 })
170
171 return runtime
182 if (proc.unref) proc.unref()
172183 } catch (err) {
173 console.error('[launcher] pear-runtime init failed:', err.message)
184 console.error('[launcher] OTA init failed:', err.message)
174185 console.error('[launcher] Continuing without OTA updates')
175 return null
176186 }
177187}
178188
179// Legacy: Extract game from Pear app bundle to local filesystem
180async function extractFromBundle (appDrive, platformDir, dstBuild) {
181 const versionPath = path.join(dstBuild, '.bundle-version')
182
183 let bundleVersion = String(Pear.config.checkpoint || 0)
184 try {
185 const versionBuf = await appDrive.get('/version.txt')
186 if (versionBuf) bundleVersion = versionBuf.toString().trim()
187 } catch {}
188
189 let cachedVersion = ''
190 try { cachedVersion = fs.readFileSync(versionPath, 'utf-8').trim() } catch {}
191
192 if (bundleVersion === cachedVersion) {
193 console.log(`[launcher] Game up to date (build ${bundleVersion})`)
194 return dstBuild
195 }
196
197 if (cachedVersion) {
198 console.log(`[launcher] Bundle updated ${cachedVersion} -> ${bundleVersion}, re-extracting...`)
199 } else {
200 console.log('[launcher] First run — extracting game to local storage...')
201 }
202
203 fs.mkdirSync(dstBuild, { recursive: true })
204
205 const prefix = '/build/' + platformDir + '/'
206 let extracted = 0
207
208 for await (const entry of appDrive.list(prefix)) {
209 const fullKey = entry.key || entry
210 const name = typeof fullKey === 'string' ? fullKey.slice(prefix.length) : null
211 if (!name) continue
212
213 const data = await appDrive.get(prefix + name)
214 if (data) {
215 const dstPath = path.join(dstBuild, name)
216 fs.mkdirSync(path.dirname(dstPath), { recursive: true })
217 const sizeMB = (data.length / 1024 / 1024).toFixed(1)
218 console.log(` Extracting ${name} (${sizeMB} MB)`)
219 fs.writeFileSync(dstPath, data)
220 extracted++
221 }
222 }
223
224 if (extracted === 0) {
225 console.error(`[launcher] No build files found in bundle at ${prefix}`)
226 console.error('[launcher] Did you export the Godot project first?')
227 exit(1)
228 return null
229 }
230
231 // Make binary executable
232 try { fs.chmodSync(path.join(dstBuild, 'godot-keet'), 0o755) } catch {}
233
234 fs.writeFileSync(versionPath, bundleVersion)
235 console.log(`[launcher] Extraction complete (${extracted} files)`)
236 return dstBuild
237}
238
239189let daemonRef = null
240let runtimeRef = null
241190
242191async function main () {
243192 const platformDir = getPlatformDir()
……@@ -248,39 +197,32 @@ async function main () {
248197 appVersion = fs.readFileSync(path.join(getAppDir(), 'version.txt'), 'utf-8').trim()
249198 } catch {}
250199
251 console.log(`[launcher] godot-keet ${appVersion} (incremental OTA v6)`)
200 console.log(`[launcher] godot-keet ${appVersion}`)
252201 console.log(`[launcher] Platform: ${platformDir}`)
253202
254203 // Start daemon in-process (or detect existing external daemon)
255204 daemonRef = await ensureDaemon()
256205
257 // Initialize P2P OTA updates (bare mode only, non-blocking)
206 // Kick off background P2P OTA via pgh (content-addressed, no blobs).
207 // Bare mode only; non-blocking.
258208 if (!isPear) {
259 runtimeRef = await initPearRuntime()
209 startBackgroundUpdate()
260210 }
261211
262 let buildDir
263
264212 if (isPear) {
265 // Legacy path: extract from Pear app bundle
266 const { default: AppDrive } = await import('pear-appdrive')
267 const appDrive = new AppDrive()
268 await appDrive.ready()
269
270 const dstBuild = path.join(Pear.config.storage, 'build', platformDir)
271 console.log(`[launcher] Storage: ${dstBuild}`)
272
273 buildDir = await extractFromBundle(appDrive, platformDir, dstBuild)
274 await appDrive.close()
275
276 if (!buildDir) return
277 } else {
278 // Primary path: build/linux/godot-keet/ is a directory containing the binary.
279 // pear-runtime OTA swaps this entire directory atomically via fsx.swap.
280 buildDir = path.join(getAppDir(), 'build', platformDir, 'godot-keet')
213 // The legacy Pear-bundle path (pear-appdrive) has been removed. The app
214 // now runs under bare and self-updates via pgh — launch via `bare index.js`.
215 console.error('[launcher] Pear runtime mode is no longer supported — run via bare')
216 exit(1)
217 return
281218 }
282219
283 const gamePath = path.join(buildDir, 'godot-keet')
220 // Prefer the multi-arch layout (by-arch/<host>/build/<platform>/) when
221 // present, falling back to a flat single-arch build/. The platform build
222 // dir contains a godot-keet/ subdir holding the binary + .pck.
223 const buildDir = resolveBuildDir(getAppDir(), platformDir)
224
225 const gamePath = path.join(buildDir, 'godot-keet', 'godot-keet')
284226
285227 if (!fs.existsSync(gamePath)) {
286228 console.error(`[launcher] Game binary not found: ${gamePath}`)
……@@ -308,10 +250,9 @@ async function main () {
308250 if (daemonRef) {
309251 try { fs.unlinkSync(DAEMON_SOCKET) } catch {}
310252 }
311 // Shut down pear-runtime
312 if (runtimeRef) {
313 runtimeRef.close().catch(() => {})
314 }
253 // OTA is applied atomically by the background `pgh app update` (it swaps
254 // the install tree in place), so the next launch automatically uses the
255 // new version — nothing to apply here.
315256 exit(code || 0)
316257 })
317258
……@@ -330,8 +271,5 @@ main().catch((err) => {
330271 if (daemonRef) {
331272 try { fs.unlinkSync(DAEMON_SOCKET) } catch {}
332273 }
333 if (runtimeRef) {
334 runtimeRef.close().catch(() => {})
335 }
336274 exit(1)
337275})
package-lock.json +1 -1112
……@@ -18,35 +18,7 @@
1818 "bare-pipe": "^4.1.3",
1919 "bare-process": "^2.0.0",
2020 "bare-subprocess": "^3.1.4",
21 "framed-stream": "^1.0.1",
22 "pear-appdrive": "^1.1.2",
23 "pear-runtime": "^0.4.2"
24 }
25 },
26 "node_modules/@hyperswarm/secret-stream": {
27 "version": "6.9.1",
28 "resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.9.1.tgz",
29 "integrity": "sha512-xb0S5y3YJwBakD77JOGBHlBxdp63mHClZoXBYoLv+9wH8e054ESKlmQptWqjJK5dv5VMUIVYOJB4MaOpB0JdGw==",
30 "license": "Apache-2.0",
31 "dependencies": {
32 "b4a": "^1.1.0",
33 "hypercore-crypto": "^3.3.1",
34 "noise-curve-ed": "^2.0.1",
35 "noise-handshake": "^4.0.0",
36 "sodium-secretstream": "^1.1.0",
37 "sodium-universal": "^5.0.0",
38 "streamx": "^2.14.0",
39 "timeout-refresh": "^2.0.0",
40 "unslab": "^1.3.0"
41 }
42 },
43 "node_modules/adaptive-timeout": {
44 "version": "1.0.1",
45 "resolved": "https://registry.npmjs.org/adaptive-timeout/-/adaptive-timeout-1.0.1.tgz",
46 "integrity": "sha512-+seGiBtHqbnyZ0Quq/ZGxxwP66153WBABawa07/QeyuPFzbduPBjiGQAyCiriiLDzt3dkbMBskSlfqtRwblK8Q==",
47 "license": "Apache-2.0",
48 "dependencies": {
49 "xache": "^1.2.1"
21 "framed-stream": "^1.0.1"
5022 }
5123 },
5224 "node_modules/b4a": {
……@@ -63,42 +35,6 @@
6335 }
6436 }
6537 },
66 "node_modules/bare-addon-resolve": {
67 "version": "1.10.0",
68 "resolved": "https://registry.npmjs.org/bare-addon-resolve/-/bare-addon-resolve-1.10.0.tgz",
69 "integrity": "sha512-sSd0jieRJlDaODOzj0oe0RjFVC1QI0ZIjGIdPkbrTXsdVVtENg14c+lHHAhHwmWCZ2nQlMhy8jA3Y5LYPc/isA==",
70 "license": "Apache-2.0",
71 "dependencies": {
72 "bare-module-resolve": "^1.10.0",
73 "bare-semver": "^1.0.0"
74 },
75 "peerDependencies": {
76 "bare-url": "*"
77 },
78 "peerDependenciesMeta": {
79 "bare-url": {
80 "optional": true
81 }
82 }
83 },
84 "node_modules/bare-bundle": {
85 "version": "1.10.0",
86 "resolved": "https://registry.npmjs.org/bare-bundle/-/bare-bundle-1.10.0.tgz",
87 "integrity": "sha512-4LVlnJAHr00Hh6Vu6ZUJS38rcEtJT3b3vChXSsBsJ2mk1TN0lQ+gzd+Dw5L0aV7uqDZv84smuwW+O02X7PfDlw==",
88 "license": "Apache-2.0",
89 "peerDependencies": {
90 "bare-buffer": "*",
91 "bare-url": "*"
92 },
93 "peerDependenciesMeta": {
94 "bare-buffer": {
95 "optional": true
96 },
97 "bare-url": {
98 "optional": true
99 }
100 }
101 },
10238 "node_modules/bare-dns": {
10339 "version": "2.1.4",
10440 "resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-2.1.4.tgz",
……@@ -197,64 +133,6 @@
197133 }
198134 }
199135 },
200 "node_modules/bare-module": {
201 "version": "6.1.3",
202 "resolved": "https://registry.npmjs.org/bare-module/-/bare-module-6.1.3.tgz",
203 "integrity": "sha512-5XWsVHsvtWMH4tK4DQWgpNTV0t/sg3ZrAaQLIxrwjrS5+u8Q9vEgc/zQ4QaDPWDse/y/5h+d+YG1Q0JfSMt0zA==",
204 "license": "Apache-2.0",
205 "dependencies": {
206 "bare-bundle": "^1.3.0",
207 "bare-module-lexer": "^1.0.0",
208 "bare-module-resolve": "^1.8.0",
209 "bare-path": "^3.0.0",
210 "bare-url": "^2.0.1"
211 },
212 "engines": {
213 "bare": ">=1.23.0"
214 },
215 "peerDependencies": {
216 "bare-buffer": "*"
217 },
218 "peerDependenciesMeta": {
219 "bare-buffer": {
220 "optional": true
221 }
222 }
223 },
224 "node_modules/bare-module-lexer": {
225 "version": "1.4.7",
226 "resolved": "https://registry.npmjs.org/bare-module-lexer/-/bare-module-lexer-1.4.7.tgz",
227 "integrity": "sha512-0klU4eMsjh/wcxi8FdHmNom2j2F4kmkXOhyJFL9qTaSFp2lE3m6BtbKgMHY8R5miqC9r8/IfA8wzXnC5Os14WA==",
228 "license": "Apache-2.0",
229 "dependencies": {
230 "require-addon": "^1.0.2"
231 },
232 "peerDependencies": {
233 "bare-buffer": "*"
234 },
235 "peerDependenciesMeta": {
236 "bare-buffer": {
237 "optional": true
238 }
239 }
240 },
241 "node_modules/bare-module-resolve": {
242 "version": "1.12.1",
243 "resolved": "https://registry.npmjs.org/bare-module-resolve/-/bare-module-resolve-1.12.1.tgz",
244 "integrity": "sha512-hbmAPyFpEq8FoZMd5sFO3u6MC5feluWoGE8YKlA8fCrl6mNtx68Wjg4DTiDJcqRJaovTvOYKfYngoBUnbaT7eg==",
245 "license": "Apache-2.0",
246 "dependencies": {
247 "bare-semver": "^1.0.0"
248 },
249 "peerDependencies": {
250 "bare-url": "*"
251 },
252 "peerDependenciesMeta": {
253 "bare-url": {
254 "optional": true
255 }
256 }
257 },
258136 "node_modules/bare-os": {
259137 "version": "3.6.2",
260138 "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
……@@ -317,62 +195,6 @@
317195 "bare-stream": "^2.0.0"
318196 }
319197 },
320 "node_modules/bare-semver": {
321 "version": "1.0.2",
322 "resolved": "https://registry.npmjs.org/bare-semver/-/bare-semver-1.0.2.tgz",
323 "integrity": "sha512-ESVaN2nzWhcI5tf3Zzcq9aqCZ676VWzqw07eEZ0qxAcEOAFYBa0pWq8sK34OQeHLY3JsfKXZS9mDyzyxGjeLzA==",
324 "license": "Apache-2.0"
325 },
326 "node_modules/bare-sidecar": {
327 "version": "0.3.0",
328 "resolved": "https://registry.npmjs.org/bare-sidecar/-/bare-sidecar-0.3.0.tgz",
329 "integrity": "sha512-NyhdUnQLnPQTGCSRGHxLQzq3OPnKTBcK065HDjwO/mnVPpZV/zIdJVIzXY5SMNob9NTHNaYxka25nv6WxcPXEg==",
330 "license": "Apache-2.0",
331 "dependencies": {
332 "bare-fs": "^4.5.1",
333 "bare-module": "^6.1.3",
334 "bare-os": "^3.6.2",
335 "bare-path": "^3.0.0",
336 "bare-pipe": "^4.1.3",
337 "bare-stream": "^2.7.0",
338 "bare-subprocess": "^5.1.5",
339 "bare-url": "^2.3.2",
340 "require-asset": "^1.1.0"
341 }
342 },
343 "node_modules/bare-sidecar/node_modules/bare-env": {
344 "version": "3.0.0",
345 "resolved": "https://registry.npmjs.org/bare-env/-/bare-env-3.0.0.tgz",
346 "integrity": "sha512-0u964P5ZLAxTi+lW4Kjp7YRJQ5gZr9ycYOtjLxsSrupgMz3sn5Z9n4SH/JIifHwvadsf1brA2JAjP+9IOWwTiw==",
347 "license": "Apache-2.0",
348 "dependencies": {
349 "bare-os": "^3.0.1"
350 }
351 },
352 "node_modules/bare-sidecar/node_modules/bare-subprocess": {
353 "version": "5.2.2",
354 "resolved": "https://registry.npmjs.org/bare-subprocess/-/bare-subprocess-5.2.2.tgz",
355 "integrity": "sha512-L6oXgQ1aWs25RtG5Ky0bDD06p3RAcVVrDDMWb1DfXpHtyEWxamcyIWUbSykxMTWrpLlmSj6ytbb6yoKehGFfmw==",
356 "license": "Apache-2.0",
357 "dependencies": {
358 "bare-env": "^3.0.0",
359 "bare-events": "^2.5.4",
360 "bare-os": "^3.0.1",
361 "bare-pipe": "^4.0.0",
362 "bare-url": "^2.2.2"
363 },
364 "engines": {
365 "bare": ">=1.7.0"
366 },
367 "peerDependencies": {
368 "bare-buffer": "*"
369 },
370 "peerDependenciesMeta": {
371 "bare-buffer": {
372 "optional": true
373 }
374 }
375 },
376198 "node_modules/bare-signals": {
377199 "version": "2.2.5",
378200 "resolved": "https://registry.npmjs.org/bare-signals/-/bare-signals-2.2.5.tgz",
……@@ -468,153 +290,10 @@
468290 "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz",
469291 "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
470292 "license": "Apache-2.0",
471 "peer": true,
472293 "dependencies": {
473294 "bare-path": "^3.0.0"
474295 }
475296 },
476 "node_modules/big-sparse-array": {
477 "version": "1.0.3",
478 "resolved": "https://registry.npmjs.org/big-sparse-array/-/big-sparse-array-1.0.3.tgz",
479 "integrity": "sha512-6RjV/3mSZORlMdpUaQ6rUSpG637cZm0//E54YYGtQg1c1O+AbZP8UTdJ/TchsDZcTVLmyWZcseBfp2HBeXUXOQ==",
480 "license": "MIT"
481 },
482 "node_modules/binary-stream-equals": {
483 "version": "1.0.0",
484 "resolved": "https://registry.npmjs.org/binary-stream-equals/-/binary-stream-equals-1.0.0.tgz",
485 "integrity": "sha512-xiUT5LGfD8JiLhbXiG+ByOnbgb9f2ssRLfZDQMl3nZdf89EotQZGZuMkDN8J3n46emabE7RnJ1q0r7Hv3INExw==",
486 "license": "MIT",
487 "dependencies": {
488 "b4a": "^1.3.1"
489 }
490 },
491 "node_modules/bits-to-bytes": {
492 "version": "1.3.0",
493 "resolved": "https://registry.npmjs.org/bits-to-bytes/-/bits-to-bytes-1.3.0.tgz",
494 "integrity": "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg==",
495 "license": "ISC",
496 "dependencies": {
497 "b4a": "^1.5.0"
498 }
499 },
500 "node_modules/blind-relay": {
501 "version": "1.4.0",
502 "resolved": "https://registry.npmjs.org/blind-relay/-/blind-relay-1.4.0.tgz",
503 "integrity": "sha512-6xt7fDfCs6eGmNNym6I9N42jmjcMQn2qwwOVnkP9ZnrkXFk6c4/tdO1xqRmDEzKzV8gigd+DVdCUG/RUYnen7Q==",
504 "license": "Apache-2.0",
505 "dependencies": {
506 "b4a": "^1.6.4",
507 "bare-events": "^2.2.0",
508 "bits-to-bytes": "^1.3.0",
509 "compact-encoding": "^2.12.0",
510 "compact-encoding-bitfield": "^1.0.0",
511 "protomux": "^3.5.1",
512 "sodium-universal": "^5.0.0",
513 "streamx": "^2.15.1"
514 }
515 },
516 "node_modules/bogon": {
517 "version": "1.2.0",
518 "resolved": "https://registry.npmjs.org/bogon/-/bogon-1.2.0.tgz",
519 "integrity": "sha512-FqOBr/1VMzCOsoJd+fzNUMarUYki2+TKt07A2+xaulsNx4r53iJ7MV5k0jbqg7W2U0CsLqxCZOrFibdG6h6HSg==",
520 "license": "MIT",
521 "dependencies": {
522 "compact-encoding": "^2.11.0",
523 "compact-encoding-net": "^1.2.0"
524 }
525 },
526 "node_modules/codecs": {
527 "version": "3.1.0",
528 "resolved": "https://registry.npmjs.org/codecs/-/codecs-3.1.0.tgz",
529 "integrity": "sha512-Dqx8NwvBvnMeuPQdVKy/XEF71igjR5apxBvCGeV0pP1tXadOiaLvDTXt7xh+/5wI1ASB195mXQGJbw3Ml4YDWQ==",
530 "license": "MIT",
531 "dependencies": {
532 "b4a": "^1.6.3"
533 }
534 },
535 "node_modules/compact-encoding": {
536 "version": "2.19.0",
537 "resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.19.0.tgz",
538 "integrity": "sha512-bPQlzwxgzsuOp0wB6G9TVoZ2tGFANJckQfM10xLKUS2fbLe+fFZG6Gi1wYehcMMTcjvtil8oOJSsToMOlCSu4g==",
539 "license": "Apache-2.0",
540 "dependencies": {
541 "b4a": "^1.3.0"
542 }
543 },
544 "node_modules/compact-encoding-bitfield": {
545 "version": "1.0.0",
546 "resolved": "https://registry.npmjs.org/compact-encoding-bitfield/-/compact-encoding-bitfield-1.0.0.tgz",
547 "integrity": "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg==",
548 "license": "ISC",
549 "dependencies": {
550 "compact-encoding": "^2.4.1"
551 }
552 },
553 "node_modules/compact-encoding-net": {
554 "version": "1.2.0",
555 "resolved": "https://registry.npmjs.org/compact-encoding-net/-/compact-encoding-net-1.2.0.tgz",
556 "integrity": "sha512-LVXpNpF7PGQeHRVVLGgYWzuVoYAaDZvKUsUxRioGfkotzvOh4AzoQF1HBH3zMNaSnx7gJXuUr3hkjnijaH/Eng==",
557 "license": "ISC",
558 "dependencies": {
559 "compact-encoding": "^2.4.1"
560 }
561 },
562 "node_modules/corestore": {
563 "version": "7.8.0",
564 "resolved": "https://registry.npmjs.org/corestore/-/corestore-7.8.0.tgz",
565 "integrity": "sha512-zC9FNHoVzPXiFetVN39QpwJkNtJkqm5jymx7wY+NB6G6cpruEpYjd0/KuDpBtgFK6/JG1l+Qr+DV9ozmz31Dkw==",
566 "license": "MIT",
567 "dependencies": {
568 "b4a": "^1.6.7",
569 "hypercore": "^11.19.0",
570 "hypercore-crypto": "^3.4.2",
571 "hypercore-errors": "^1.4.0",
572 "hypercore-id-encoding": "^1.3.0",
573 "ready-resource": "^1.1.1",
574 "sodium-universal": "^5.0.1",
575 "which-runtime": "^1.2.1"
576 }
577 },
578 "node_modules/debounceify": {
579 "version": "1.1.0",
580 "resolved": "https://registry.npmjs.org/debounceify/-/debounceify-1.1.0.tgz",
581 "integrity": "sha512-eKuHDVfJVg+u/0nPy8P+fhnLgbyuTgVxuCRrS/R7EpDSMMkBDgSes41MJtSAY1F1hcqfHz3Zy/qpqHHIp/EhdA==",
582 "license": "MIT"
583 },
584 "node_modules/device-file": {
585 "version": "2.3.1",
586 "resolved": "https://registry.npmjs.org/device-file/-/device-file-2.3.1.tgz",
587 "integrity": "sha512-bmON44lwxJPle9N2OcH4tqM44pMGZKT8G6OkzXkz0urvqQ9LKkoQdTS6w0ztYfmLdUE27R4UUmx0+y2gEz4Jug==",
588 "license": "Apache-2.0",
589 "dependencies": {
590 "b4a": "^1.6.7",
591 "bare-fs": "^4.0.1",
592 "bare-path": "^3.0.0",
593 "fd-lock": "^2.1.0",
594 "fs-native-extensions": "^1.4.0",
595 "ready-resource": "^1.2.0"
596 }
597 },
598 "node_modules/dht-rpc": {
599 "version": "6.26.2",
600 "resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-6.26.2.tgz",
601 "integrity": "sha512-54n+8km7AWNBWO4OXcZwsn8jy1TjCmnqaJLdWbsWl8hfJaqE90pSvHsmTHtvgPRKxKatAEeKE4gCUCac8TCAPA==",
602 "license": "MIT",
603 "dependencies": {
604 "adaptive-timeout": "^1.0.1",
605 "b4a": "^1.6.1",
606 "bare-events": "^2.2.0",
607 "compact-encoding": "^2.11.0",
608 "compact-encoding-net": "^1.2.0",
609 "fast-fifo": "^1.1.0",
610 "kademlia-routing-table": "^1.0.1",
611 "nat-sampler": "^1.0.1",
612 "sodium-universal": "^5.0.0",
613 "streamx": "^2.13.2",
614 "time-ordered-set": "^2.0.0",
615 "udx-native": "^1.5.3"
616 }
617 },
618297 "node_modules/events-universal": {
619298 "version": "1.0.1",
620299 "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
……@@ -630,24 +309,6 @@
630309 "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
631310 "license": "MIT"
632311 },
633 "node_modules/fd-lock": {
634 "version": "2.1.1",
635 "resolved": "https://registry.npmjs.org/fd-lock/-/fd-lock-2.1.1.tgz",
636 "integrity": "sha512-H3VkcWFl39Rk0xBokDcUyBcVs6VrYTUo/DhDWMzJOF99wXWDAvmvq/GlLTS2NTehsznZhp3fXVyrtB2ldDXhwg==",
637 "license": "Apache-2.0",
638 "dependencies": {
639 "bare-fs": "^4.5.0",
640 "fs-native-extensions": "^1.4.4",
641 "ready-resource": "^1.2.0",
642 "resource-on-exit": "^1.0.0"
643 }
644 },
645 "node_modules/flat-tree": {
646 "version": "1.13.0",
647 "resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.13.0.tgz",
648 "integrity": "sha512-fT3HIuCPwHhFgJ20QYzDHgUG0zMmFg5cHvFiFo5h+QMSJ28TihsEVY0f8HGliuO+pOzmvjMx1odToeaEWkTnyQ==",
649 "license": "MIT"
650 },
651312 "node_modules/framed-stream": {
652313 "version": "1.0.1",
653314 "resolved": "https://registry.npmjs.org/framed-stream/-/framed-stream-1.0.1.tgz",
……@@ -658,681 +319,6 @@
658319 "streamx": "^2.13.0"
659320 }
660321 },
661 "node_modules/fs-native-extensions": {
662 "version": "1.4.5",
663 "resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.4.5.tgz",
664 "integrity": "sha512-ekV0T//iDm4AvhOcuPaHpxub4DI7HvY5ucLJVDvi7T2J+NZkQ9S6MuvgP0yeQvoqNUaAGyLjVYb1905BF9bpmg==",
665 "license": "Apache-2.0",
666 "dependencies": {
667 "require-addon": "^1.1.0",
668 "which-runtime": "^1.2.0"
669 }
670 },
671 "node_modules/fs-native-lock": {
672 "version": "1.2.0",
673 "resolved": "https://registry.npmjs.org/fs-native-lock/-/fs-native-lock-1.2.0.tgz",
674 "integrity": "sha512-x2KlVzvJbNhI2vc+z9+5naq04+6XMyoeLv816sGmP4DWFonu+/N+pigIoDzFV+bdnC5BD3GLeI8eqV/dwCY57Q==",
675 "license": "Apache-2.0",
676 "dependencies": {
677 "bare-fs": "^4.0.1",
678 "bare-path": "^3.0.0",
679 "fs-native-extensions": "^1.3.4",
680 "resource-on-exit": "^1.0.0"
681 }
682 },
683 "node_modules/generate-object-property": {
684 "version": "2.0.0",
685 "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-2.0.0.tgz",
686 "integrity": "sha512-KwuURPyqn2Mz8DdV29pJwQu0Y7tcsbkULr82eeOcY/ZllFK6I9Wm8dsRByIu7CKWlFi9BdW1b3mcXMp/kQBQsw==",
687 "license": "MIT",
688 "dependencies": {
689 "is-property": "^1.0.0"
690 }
691 },
692 "node_modules/generate-string": {
693 "version": "1.0.1",
694 "resolved": "https://registry.npmjs.org/generate-string/-/generate-string-1.0.1.tgz",
695 "integrity": "sha512-IfTY0dKZM43ACyGvXkbG7De7WY7MxTS5VO6Juhe8oJKpCmrYYXoqp/cJMskkpi0k9H8wuXq0H+eI898/BCqvXg==",
696 "license": "MIT"
697 },
698 "node_modules/hyperbee": {
699 "version": "2.27.3",
700 "resolved": "https://registry.npmjs.org/hyperbee/-/hyperbee-2.27.3.tgz",
701 "integrity": "sha512-PXURH2U4juUZyJRKHTrY5z1zX851pmI1Q0jfv5F/hCIErDt/ND8jOZuxc3hfOLM9f0W3qJEDTMlV5AJBkVPy8w==",
702 "license": "MIT",
703 "dependencies": {
704 "b4a": "^1.6.0",
705 "codecs": "^3.0.0",
706 "debounceify": "^1.0.0",
707 "hypercore-errors": "^1.0.0",
708 "mutexify": "^1.4.0",
709 "protocol-buffers-encodings": "^1.2.0",
710 "rache": "^1.0.0",
711 "ready-resource": "^1.0.0",
712 "resolve-reject-promise": "^1.1.0",
713 "safety-catch": "^1.0.2",
714 "streamx": "^2.12.4",
715 "unslab": "^1.2.0"
716 }
717 },
718 "node_modules/hyperblobs": {
719 "version": "2.9.0",
720 "resolved": "https://registry.npmjs.org/hyperblobs/-/hyperblobs-2.9.0.tgz",
721 "integrity": "sha512-kbJV2+QvXIcFejqOj2UgSjeeHMjWqP1n083vcI+j4E93MhV3oVV2L8/6X+K/id/KQrUmngPTzNTHHXKlkb1CEA==",
722 "license": "Apache-2.0",
723 "dependencies": {
724 "b4a": "^1.6.1",
725 "bare-events": "^2.5.0",
726 "compact-encoding": "^2.18.0",
727 "hypercore-crypto": "^3.6.1",
728 "hypercore-errors": "^1.1.1",
729 "mutexify": "^1.4.0",
730 "speedometer": "^1.1.0",
731 "streamx": "^2.13.2"
732 }
733 },
734 "node_modules/hypercore": {
735 "version": "11.26.0",
736 "resolved": "https://registry.npmjs.org/hypercore/-/hypercore-11.26.0.tgz",
737 "integrity": "sha512-Ak3WiTl8vDaoGX9VNRuiyTQGs6AD56sKBFJtlVgt1798JfbePWaO5J4wSH74tfvSUPigi6FkOUiJSpvId7AqPA==",
738 "license": "MIT",
739 "dependencies": {
740 "@hyperswarm/secret-stream": "^6.0.0",
741 "b4a": "^1.1.0",
742 "bare-events": "^2.2.0",
743 "big-sparse-array": "^1.0.3",
744 "compact-encoding": "^2.11.0",
745 "fast-fifo": "^1.3.0",
746 "flat-tree": "^1.9.0",
747 "hypercore-crypto": "^3.2.1",
748 "hypercore-errors": "^1.5.0",
749 "hypercore-id-encoding": "^1.2.0",
750 "hypercore-storage": "^2.0.0",
751 "is-options": "^1.0.1",
752 "nanoassert": "^2.0.0",
753 "protomux": "^3.5.0",
754 "quickbit-universal": "^2.2.0",
755 "random-array-iterator": "^1.0.0",
756 "safety-catch": "^1.0.1",
757 "sodium-universal": "^5.0.1",
758 "streamx": "^2.12.4",
759 "unslab": "^1.3.0",
760 "z32": "^1.0.0"
761 }
762 },
763 "node_modules/hypercore-crypto": {
764 "version": "3.6.1",
765 "resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.6.1.tgz",
766 "integrity": "sha512-ltIz2uDwy9pO/ZGTvqcjzyBkvt6O4cVm4r/nNxh0GFs/RbQtqP/i4wCvLEdmU7ptgtnw7fI67WYD1aHPuv4OVA==",
767 "license": "MIT",
768 "dependencies": {
769 "b4a": "^1.6.6",
770 "compact-encoding": "^2.15.0",
771 "sodium-universal": "^5.0.0"
772 }
773 },
774 "node_modules/hypercore-errors": {
775 "version": "1.5.0",
776 "resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.5.0.tgz",
777 "integrity": "sha512-5KQ/SuDxsvet+7qWA35Ay6zdD9WyAHQoyWHGcPUTbmJBd300gvNIJoi3oma7kp4TTCSzii6qYumNZe/s0j/saQ==",
778 "license": "Apache-2.0",
779 "dependencies": {
780 "hypercore-id-encoding": "^1.3.0"
781 }
782 },
783 "node_modules/hypercore-id-encoding": {
784 "version": "1.3.0",
785 "resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.3.0.tgz",
786 "integrity": "sha512-W6sHdGo5h7LXEsoWfKf/KfuROZmZRQDlGqJF2EPHW+noCK66Vvr0+zE6cL0vqQi18s0kQPeN7Sq3QyR0Ytc2VQ==",
787 "license": "Apache-2.0",
788 "dependencies": {
789 "b4a": "^1.5.3",
790 "z32": "^1.0.0"
791 }
792 },
793 "node_modules/hypercore-storage": {
794 "version": "2.4.1",
795 "resolved": "https://registry.npmjs.org/hypercore-storage/-/hypercore-storage-2.4.1.tgz",
796 "integrity": "sha512-VbdkPdj7iYkGX4mufUIPqmkk87PnJ5csi1Y5WGkMHAMneK/6ogIoGrBRmAH4jpFfagOsLnSN33rHmmq6OyM77g==",
797 "license": "Apache-2.0",
798 "dependencies": {
799 "b4a": "^1.6.7",
800 "bare-fs": "^4.0.1",
801 "bare-path": "^3.0.0",
802 "compact-encoding": "^2.16.0",
803 "device-file": "^2.1.2",
804 "flat-tree": "^1.12.1",
805 "hypercore-crypto": "^3.4.2",
806 "hyperschema": "^1.7.0",
807 "index-encoder": "^3.3.2",
808 "resolve-reject-promise": "^1.0.0",
809 "rocksdb-native": "^3.11.0",
810 "scope-lock": "^1.2.4",
811 "streamx": "^2.21.1"
812 }
813 },
814 "node_modules/hyperdht": {
815 "version": "6.29.0",
816 "resolved": "https://registry.npmjs.org/hyperdht/-/hyperdht-6.29.0.tgz",
817 "integrity": "sha512-okIpelpIhRTBDCCe2CNWfLHbVSQ5DPbl1Npb1zet8SqrkCsYF27RHJ04IaYqiigHI9y0KZgjOHdZbejalbFVoQ==",
818 "license": "MIT",
819 "dependencies": {
820 "@hyperswarm/secret-stream": "^6.6.2",
821 "b4a": "^1.3.1",
822 "bare-events": "^2.2.0",
823 "blind-relay": "^1.3.0",
824 "bogon": "^1.0.0",
825 "compact-encoding": "^2.4.1",
826 "compact-encoding-net": "^1.0.1",
827 "dht-rpc": "^6.15.1",
828 "hypercore-crypto": "^3.3.0",
829 "hypercore-id-encoding": "^1.2.0",
830 "noise-curve-ed": "^2.0.0",
831 "noise-handshake": "^4.0.0",
832 "record-cache": "^1.1.1",
833 "safety-catch": "^1.0.1",
834 "signal-promise": "^1.0.3",
835 "sodium-universal": "^5.0.1",
836 "streamx": "^2.16.1",
837 "unslab": "^1.3.0",
838 "xache": "^1.1.0"
839 },
840 "bin": {
841 "hyperdht": "bin.js"
842 }
843 },
844 "node_modules/hyperdrive": {
845 "version": "13.3.0",
846 "resolved": "https://registry.npmjs.org/hyperdrive/-/hyperdrive-13.3.0.tgz",
847 "integrity": "sha512-6FQXLE4gARRdrlDck0oeAm0Rz0QRi1x2QWP/FdVCAqlAjHjvHfCMf3M+CeO6HcAyI8GuFN3C9HJm80ytR2dzSg==",
848 "license": "Apache-2.0",
849 "dependencies": {
850 "hyperbee": "^2.11.1",
851 "hyperblobs": "^2.9.0",
852 "hypercore": "^11.0.0",
853 "hypercore-errors": "^1.0.0",
854 "is-options": "^1.0.2",
855 "mirror-drive": "^1.2.0",
856 "ready-resource": "^1.0.0",
857 "safety-catch": "^1.0.2",
858 "speedometer": "^1.1.0",
859 "streamx": "^2.12.4",
860 "sub-encoder": "^2.1.1",
861 "unix-path-resolve": "^1.0.2"
862 }
863 },
864 "node_modules/hyperschema": {
865 "version": "1.20.1",
866 "resolved": "https://registry.npmjs.org/hyperschema/-/hyperschema-1.20.1.tgz",
867 "integrity": "sha512-7gnvaTNUs8FqdrU3NNE6nzhOneGyDlUlpROu9YFlHA61fE8ppKKf2gLZjZjsx/enNt+VFN4ITxy8ijypfyWBLw==",
868 "license": "Apache-2.0",
869 "dependencies": {
870 "bare-fs": "^4.0.1",
871 "compact-encoding": "^2.19.0",
872 "generate-object-property": "^2.0.0",
873 "generate-string": "^1.0.1"
874 }
875 },
876 "node_modules/hyperswarm": {
877 "version": "4.17.0",
878 "resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-4.17.0.tgz",
879 "integrity": "sha512-oe86sK961Ueg7rvDN/veFwG8xH+Iv6vObPhGDkPJcDVxk/NduW41ZhAcVDnHzRbm7S0eLU7WaDUvehOYoKSpRQ==",
880 "license": "MIT",
881 "dependencies": {
882 "b4a": "^1.3.1",
883 "bare-events": "^2.2.0",
884 "hyperdht": "^6.21.0",
885 "safety-catch": "^1.0.2",
886 "shuffled-priority-queue": "^2.1.0",
887 "streamx": "^2.22.1",
888 "unslab": "^1.3.0"
889 }
890 },
891 "node_modules/index-encoder": {
892 "version": "3.4.0",
893 "resolved": "https://registry.npmjs.org/index-encoder/-/index-encoder-3.4.0.tgz",
894 "integrity": "sha512-k3+ENtseFYI9ZPOIZzVH8LlONUvXAcd4jvCPo+Nob/T/2t5R5Rfh8XiFXBG++gHHuVby7HBDp/3YbyEmE481cg==",
895 "license": "Apache-2.0",
896 "dependencies": {
897 "b4a": "^1.6.4"
898 }
899 },
900 "node_modules/is-options": {
901 "version": "1.0.2",
902 "resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.2.tgz",
903 "integrity": "sha512-u+Ai74c8Q74aS8BuHwPdI1jptGOT1FQXgCq8/zv0xRuE+wRgSMEJLj8lVO8Zp9BeGb29BXY6AsNPinfqjkr7Fg==",
904 "license": "MIT",
905 "dependencies": {
906 "b4a": "^1.1.1"
907 }
908 },
909 "node_modules/is-property": {
910 "version": "1.0.2",
911 "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
912 "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
913 "license": "MIT"
914 },
915 "node_modules/kademlia-routing-table": {
916 "version": "1.0.6",
917 "resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.6.tgz",
918 "integrity": "sha512-Ve6jwIlUCYvUzBnXnzVRHDZCFgXURW9gmF3r7n05kZs/2rNbLHXwGdcq0qIaSwdmJCvtosgR4JensnVU65hzNQ==",
919 "license": "MIT",
920 "dependencies": {
921 "bare-events": "^2.2.0"
922 }
923 },
924 "node_modules/localdrive": {
925 "version": "2.2.0",
926 "resolved": "https://registry.npmjs.org/localdrive/-/localdrive-2.2.0.tgz",
927 "integrity": "sha512-OAjzlsk/YYbY3kmXbMHYNghGxR0EYeX8Rrbvh5h+O90e+6RqoCNlfSnrC7fjeHC1l4uT5OiISRAbTmNCBIZj7w==",
928 "license": "Apache-2.0",
929 "dependencies": {
930 "b4a": "^1.6.1",
931 "bare-fs": "^4.0.1",
932 "bare-path": "^3.0.0",
933 "mirror-drive": "^1.2.0",
934 "mutexify": "^1.4.0",
935 "streamx": "^2.12.5",
936 "unix-path-resolve": "^1.0.2"
937 }
938 },
939 "node_modules/mirror-drive": {
940 "version": "1.12.0",
941 "resolved": "https://registry.npmjs.org/mirror-drive/-/mirror-drive-1.12.0.tgz",
942 "integrity": "sha512-ASoYsRul+fzGT8rzgEEiinKCLZYd/03nclngLim6Gwm97n8jPMHbhIXgBlnkcqeASKsCnTIm3w9hxR6OBbRW4Q==",
943 "license": "Apache-2.0",
944 "dependencies": {
945 "bare-events": "^2.8.2",
946 "binary-stream-equals": "^1.0.0",
947 "same-data": "^1.0.0",
948 "speedometer": "^1.1.0",
949 "streamx": "^2.22.1",
950 "unix-path-resolve": "^1.0.2"
951 }
952 },
953 "node_modules/mutexify": {
954 "version": "1.4.0",
955 "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.4.0.tgz",
956 "integrity": "sha512-pbYSsOrSB/AKN5h/WzzLRMFgZhClWccf2XIB4RSMC8JbquiB0e0/SH5AIfdQMdyHmYtv4seU7yV/TvAwPLJ1Yg==",
957 "license": "MIT",
958 "dependencies": {
959 "queue-tick": "^1.0.0"
960 }
961 },
962 "node_modules/nanoassert": {
963 "version": "2.0.0",
964 "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
965 "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==",
966 "license": "ISC"
967 },
968 "node_modules/nat-sampler": {
969 "version": "1.0.1",
970 "resolved": "https://registry.npmjs.org/nat-sampler/-/nat-sampler-1.0.1.tgz",
971 "integrity": "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw==",
972 "license": "MIT"
973 },
974 "node_modules/noise-curve-ed": {
975 "version": "2.1.0",
976 "resolved": "https://registry.npmjs.org/noise-curve-ed/-/noise-curve-ed-2.1.0.tgz",
977 "integrity": "sha512-zAzJx+VwZM3w6EA1hTmDhJfvAnCeBQn/1FAeZ0LtGxCcCtlAK/uJXQVF/eDVUOaAZ286lHlx77WJ+qj9SmsRRg==",
978 "license": "ISC",
979 "dependencies": {
980 "b4a": "^1.1.0",
981 "nanoassert": "^2.0.0",
982 "sodium-universal": "^5.0.0"
983 }
984 },
985 "node_modules/noise-handshake": {
986 "version": "4.2.0",
987 "resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-4.2.0.tgz",
988 "integrity": "sha512-9O/VTNX/E2/AToyMTTDU0J/4WhaXMTdqc2DHs9vf+snoZ0cenSBq0dNYTVV1snYYEkmo6QeRrYMxtqtoYnY+LA==",
989 "license": "Apache-2.0",
990 "dependencies": {
991 "b4a": "^1.1.0",
992 "nanoassert": "^2.0.0",
993 "sodium-universal": "^5.0.0"
994 }
995 },
996 "node_modules/pear-aliases": {
997 "version": "1.0.7",
998 "resolved": "https://registry.npmjs.org/pear-aliases/-/pear-aliases-1.0.7.tgz",
999 "integrity": "sha512-Z85C0naSKh3XMBKm1P1L2kYbIGE+Ph0HRSjTaQz5O99JvQq/wHylu9M2df1Ysfx7LG3UJrCCwZenrud18bZytw==",
1000 "license": "Apache-2.0",
1001 "dependencies": {
1002 "hypercore-id-encoding": "^1.3.0"
1003 }
1004 },
1005 "node_modules/pear-appdrive": {
1006 "version": "1.1.2",
1007 "resolved": "https://registry.npmjs.org/pear-appdrive/-/pear-appdrive-1.1.2.tgz",
1008 "integrity": "sha512-AmCrZaNGFU/BvHR+oFP/cNEUCH1vbzezsJV9wqASoggyg8d4sSb0L6kr99ugGkAuUFlOBI2uHni71hBTaO2rDA==",
1009 "license": "Apache-2.0",
1010 "dependencies": {
1011 "pear-ipc": "^6.6.1",
1012 "pear-ref": "^1.0.1",
1013 "ready-resource": "^1.1.2"
1014 }
1015 },
1016 "node_modules/pear-errors": {
1017 "version": "1.0.1",
1018 "resolved": "https://registry.npmjs.org/pear-errors/-/pear-errors-1.0.1.tgz",
1019 "integrity": "sha512-KQyhym09QpLT4H/z3uLW0bqixgIZic2Eip2Q8Z72QmIpFzPtp6QmnzOUwB3kuHB4dqKNa+FQWHWH0NSK5lJjlw==",
1020 "license": "Apache-2.0"
1021 },
1022 "node_modules/pear-ipc": {
1023 "version": "6.10.0",
1024 "resolved": "https://registry.npmjs.org/pear-ipc/-/pear-ipc-6.10.0.tgz",
1025 "integrity": "sha512-kPcz9uQ07UtigXc/Xq6TXFFeIlaRrEKPutzQIhAJlQejr0R8iO9MzXmIImYq7FWF3vjaaKhBBm4QYcGlAfol0A==",
1026 "license": "Apache-2.0",
1027 "dependencies": {
1028 "bare-fs": "^4.0.1",
1029 "bare-os": "^3.2.0",
1030 "bare-path": "^3.0.0",
1031 "bare-pipe": "^4.0.5",
1032 "framed-stream": "^1.0.1",
1033 "fs-native-extensions": "^1.2.7",
1034 "fs-native-lock": "^1.1.0",
1035 "ready-resource": "^1.0.3",
1036 "streamx": "^2.16.1",
1037 "tiny-buffer-rpc": "^2.2.0",
1038 "which-runtime": "^1.2.0"
1039 }
1040 },
1041 "node_modules/pear-link": {
1042 "version": "4.2.1",
1043 "resolved": "https://registry.npmjs.org/pear-link/-/pear-link-4.2.1.tgz",
1044 "integrity": "sha512-Y6xSOY36EkWmaeTYqNVT2iV0xWfzCDCBtPCF898793ADk9Lbzfq7RLJ7PhqHRS+dLI7yTlLtCCfjGR3erQ0FKQ==",
1045 "license": "Apache-2.0",
1046 "dependencies": {
1047 "bare-path": "^3.0.0",
1048 "hypercore-id-encoding": "^1.2.0",
1049 "pear-aliases": "^1.0.0",
1050 "pear-errors": "^1.0.0"
1051 }
1052 },
1053 "node_modules/pear-ref": {
1054 "version": "1.0.2",
1055 "resolved": "https://registry.npmjs.org/pear-ref/-/pear-ref-1.0.2.tgz",
1056 "integrity": "sha512-IUGGSULYVF6jfdtsHY0XOokMp1v1KI89q8yPhsnqrLFf+Wq8EEOD0capny8gqXyu0eGkIh753X1cFUVL36n7FA==",
1057 "license": "Apache-2.0",
1058 "dependencies": {
1059 "bare-events": "^2.6.1"
1060 }
1061 },
1062 "node_modules/pear-runtime": {
1063 "version": "0.4.2",
1064 "resolved": "https://registry.npmjs.org/pear-runtime/-/pear-runtime-0.4.2.tgz",
1065 "integrity": "sha512-FmBJZkZ78Y2itlosoo1oWZ4K4mQd7o5qJ7hPQLJPvH7Yv0/z4EdJF+8FKg3FwFFc/Y5HobaF94j+qmx3Wr41dA==",
1066 "license": "Apache-2.0",
1067 "dependencies": {
1068 "bare-fs": "^4.5.3",
1069 "bare-path": "^3.0.0",
1070 "bare-sidecar": "^0.3.0",
1071 "corestore": "^7.8.0",
1072 "fs-native-extensions": "^1.4.5",
1073 "hypercore-id-encoding": "^1.3.0",
1074 "hyperdrive": "^13.2.1",
1075 "hyperswarm": "^4.16.0",
1076 "localdrive": "^2.2.0",
1077 "pear-link": "^4.2.1",
1078 "ready-resource": "^1.2.0",
1079 "which-runtime": "^1.3.2"
1080 }
1081 },
1082 "node_modules/protocol-buffers-encodings": {
1083 "version": "1.2.0",
1084 "resolved": "https://registry.npmjs.org/protocol-buffers-encodings/-/protocol-buffers-encodings-1.2.0.tgz",
1085 "integrity": "sha512-daeNPuKh1NlLD1uDfbLpD+xyUTc07nEtfHwmBZmt/vH0B7VOM+JOCOpDcx9ZRpqHjAiIkGqyTDi+wfGSl17R9w==",
1086 "license": "MIT",
1087 "dependencies": {
1088 "b4a": "^1.6.0",
1089 "signed-varint": "^2.0.1",
1090 "varint": "5.0.0"
1091 }
1092 },
1093 "node_modules/protomux": {
1094 "version": "3.10.1",
1095 "resolved": "https://registry.npmjs.org/protomux/-/protomux-3.10.1.tgz",
1096 "integrity": "sha512-jgBqx8ZyaBWea/DFG4eOu1scOaeBwcnagiRC1XFVrjeGt7oAb0Pk5udPpBUpJ4DJBRjra50jD6YcZiQQTRqaaA==",
1097 "license": "MIT",
1098 "dependencies": {
1099 "b4a": "^1.3.1",
1100 "compact-encoding": "^2.5.1",
1101 "queue-tick": "^1.0.0",
1102 "safety-catch": "^1.0.1",
1103 "unslab": "^1.3.0"
1104 }
1105 },
1106 "node_modules/queue-tick": {
1107 "version": "1.0.1",
1108 "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
1109 "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
1110 "license": "MIT"
1111 },
1112 "node_modules/quickbit-native": {
1113 "version": "2.4.8",
1114 "resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.4.8.tgz",
1115 "integrity": "sha512-FcCcqI+nIAWGknqhtrYT5TSD7t/N+Xd8ctM+2PrIIBuwOi5hx0SxAvuPtzLIEMfT/2h9+fhBakUe2uALOHX6yw==",
1116 "license": "Apache-2.0",
1117 "optional": true,
1118 "dependencies": {
1119 "require-addon": "^1.1.0"
1120 }
1121 },
1122 "node_modules/quickbit-universal": {
1123 "version": "2.2.0",
1124 "resolved": "https://registry.npmjs.org/quickbit-universal/-/quickbit-universal-2.2.0.tgz",
1125 "integrity": "sha512-w02i1R8n7+6pEKTud8DfF8zbFY9o7RtPlUc3jWbtCkDKvhbx/AvV7oNnz4/TcmsPGpSJS+fq5Ud6RH6+YPvSGg==",
1126 "license": "ISC",
1127 "dependencies": {
1128 "b4a": "^1.6.0",
1129 "simdle-universal": "^1.1.0"
1130 },
1131 "optionalDependencies": {
1132 "quickbit-native": "^2.2.0"
1133 }
1134 },
1135 "node_modules/rache": {
1136 "version": "1.0.0",
1137 "resolved": "https://registry.npmjs.org/rache/-/rache-1.0.0.tgz",
1138 "integrity": "sha512-e0k0g0w/8jOCB+7YqCIlOa+OJ38k0wrYS4x18pMSmqOvLKoyhmMhmQyCcvfY6VaP8D75cqkEnlakXs+RYYLqNg==",
1139 "license": "Apache-2.0"
1140 },
1141 "node_modules/random-array-iterator": {
1142 "version": "1.0.0",
1143 "resolved": "https://registry.npmjs.org/random-array-iterator/-/random-array-iterator-1.0.0.tgz",
1144 "integrity": "sha512-u7xCM93XqKEvPTP6xZp2ehttcAemKnh73oKNf1FvzuVCfpt6dILDt1Kxl1LeBjm2iNIeR49VGFhy4Iz3yOun+Q==",
1145 "license": "MIT"
1146 },
1147 "node_modules/ready-resource": {
1148 "version": "1.2.0",
1149 "resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.2.0.tgz",
1150 "integrity": "sha512-nfcco/8iAFV0M+2PYnmIc+/xY0iRb35d42HFHQ7AfjulbGEAFa+XWpByfwSyeVeiBoMLLFVMv1HixxNCqzSQ1g==",
1151 "license": "MIT",
1152 "dependencies": {
1153 "bare-events": "^2.2.0"
1154 }
1155 },
1156 "node_modules/record-cache": {
1157 "version": "1.2.0",
1158 "resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz",
1159 "integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==",
1160 "license": "MIT",
1161 "dependencies": {
1162 "b4a": "^1.3.1"
1163 }
1164 },
1165 "node_modules/refcounter": {
1166 "version": "1.0.0",
1167 "resolved": "https://registry.npmjs.org/refcounter/-/refcounter-1.0.0.tgz",
1168 "integrity": "sha512-1WosVzUy0kPUaPMEtlNDwm99UsteALIhXXR8rerELoa63WkYIXAl0hxgwPFrIYBRWZPGUyekQ04FRtPJ7dHk9w==",
1169 "license": "Apache-2.0"
1170 },
1171 "node_modules/require-addon": {
1172 "version": "1.2.0",
1173 "resolved": "https://registry.npmjs.org/require-addon/-/require-addon-1.2.0.tgz",
1174 "integrity": "sha512-VNPDZlYgIYQwWp9jMTzljx+k0ZtatKlcvOhktZ/anNPI3dQ9NXk7cq2U4iJ1wd9IrytRnYhyEocFWbkdPb+MYA==",
1175 "license": "Apache-2.0",
1176 "dependencies": {
1177 "bare-addon-resolve": "^1.3.0"
1178 },
1179 "engines": {
1180 "bare": ">=1.10.0"
1181 }
1182 },
1183 "node_modules/require-asset": {
1184 "version": "1.2.1",
1185 "resolved": "https://registry.npmjs.org/require-asset/-/require-asset-1.2.1.tgz",
1186 "integrity": "sha512-wFFxOxJHL/agpiXNDMzDBzC8hnmjJZYW0wDgolojZZkydS76talLlIH+DU3DWjBxQcu0vair30H7V3C4FcLnSg==",
1187 "license": "Apache-2.0",
1188 "dependencies": {
1189 "bare-module-resolve": "^1.6.2"
1190 },
1191 "engines": {
1192 "bare": ">=1.10.0"
1193 }
1194 },
1195 "node_modules/resolve-reject-promise": {
1196 "version": "1.1.0",
1197 "resolved": "https://registry.npmjs.org/resolve-reject-promise/-/resolve-reject-promise-1.1.0.tgz",
1198 "integrity": "sha512-LWsTOA91AqzBTjSGgX79Tc130pwcBK6xjpJEO+qRT5IKZ6bGnHKcc8QL3upUBcWuU8OTIDzKK2VNSwmmlqvAVg==",
1199 "license": "MIT"
1200 },
1201 "node_modules/resource-on-exit": {
1202 "version": "1.0.0",
1203 "resolved": "https://registry.npmjs.org/resource-on-exit/-/resource-on-exit-1.0.0.tgz",
1204 "integrity": "sha512-ViJwJAknCkLRJRPR+9SISQQ7R5eRgtdIHLJsM2hHx1MweAJbJxJ5XnMjjq0Lc7ZGv44ufzAqds1nKxiVkdy4ag==",
1205 "license": "Apache-2.0"
1206 },
1207 "node_modules/rocksdb-native": {
1208 "version": "3.13.0",
1209 "resolved": "https://registry.npmjs.org/rocksdb-native/-/rocksdb-native-3.13.0.tgz",
1210 "integrity": "sha512-KTwrhZtxk5/1quvpLzqrSMQXVctTzrwn+mYFIs1j+hOz1sy3DGv4coKxOLTFfyBeSizfkPF+FtxhTsdRqGpLpQ==",
1211 "license": "Apache-2.0",
1212 "dependencies": {
1213 "compact-encoding": "^2.15.0",
1214 "ready-resource": "^1.0.0",
1215 "refcounter": "^1.0.0",
1216 "require-addon": "^1.0.2",
1217 "resolve-reject-promise": "^1.1.0",
1218 "signal-promise": "^1.0.3",
1219 "streamx": "^2.16.1"
1220 },
1221 "engines": {
1222 "bare": ">=1.16.0"
1223 }
1224 },
1225 "node_modules/safety-catch": {
1226 "version": "1.0.2",
1227 "resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz",
1228 "integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA==",
1229 "license": "MIT"
1230 },
1231 "node_modules/same-data": {
1232 "version": "1.0.0",
1233 "resolved": "https://registry.npmjs.org/same-data/-/same-data-1.0.0.tgz",
1234 "integrity": "sha512-Eqn7N2yV+aKMlUHTRqUwYG1Iv0cJqjlvLKj/GoP5PozJn361QaOYX14+v87r7NqQUZC22noP/LfLrSQiPwAygw==",
1235 "license": "MIT"
1236 },
1237 "node_modules/scope-lock": {
1238 "version": "1.2.4",
1239 "resolved": "https://registry.npmjs.org/scope-lock/-/scope-lock-1.2.4.tgz",
1240 "integrity": "sha512-BpSd8VCuCxW9ZitcdIC/vjs3gMaP9bRBL5nkHcyfX2VrS52n13/rHuBA2xJ/S/4DPuRdAO/Bk8pWd8eD/gHCIA==",
1241 "license": "Apache-2.0"
1242 },
1243 "node_modules/shuffled-priority-queue": {
1244 "version": "2.1.0",
1245 "resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz",
1246 "integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==",
1247 "license": "MIT",
1248 "dependencies": {
1249 "unordered-set": "^2.0.1"
1250 }
1251 },
1252 "node_modules/signal-promise": {
1253 "version": "1.0.3",
1254 "resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz",
1255 "integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g==",
1256 "license": "MIT"
1257 },
1258 "node_modules/signed-varint": {
1259 "version": "2.0.1",
1260 "resolved": "https://registry.npmjs.org/signed-varint/-/signed-varint-2.0.1.tgz",
1261 "integrity": "sha512-abgDPg1106vuZZOvw7cFwdCABddfJRz5akcCcchzTbhyhYnsG31y4AlZEgp315T7W3nQq5P4xeOm186ZiPVFzw==",
1262 "license": "MIT",
1263 "dependencies": {
1264 "varint": "~5.0.0"
1265 }
1266 },
1267 "node_modules/simdle-native": {
1268 "version": "1.3.9",
1269 "resolved": "https://registry.npmjs.org/simdle-native/-/simdle-native-1.3.9.tgz",
1270 "integrity": "sha512-Isc8sP4OiiIU0mpslD4GHEnR0VQWvR/54WN7YtwEDkNdTJVWtpmvsSvsgRlw5BNGxdYXlVRegdnrSu10H/PhvA==",
1271 "license": "Apache-2.0",
1272 "optional": true,
1273 "dependencies": {
1274 "b4a": "^1.6.0",
1275 "require-addon": "^1.1.0"
1276 }
1277 },
1278 "node_modules/simdle-universal": {
1279 "version": "1.1.2",
1280 "resolved": "https://registry.npmjs.org/simdle-universal/-/simdle-universal-1.1.2.tgz",
1281 "integrity": "sha512-3n3w1bs+uwgHKQjt6arez83EywNlhZzYvNOhvAASTl/8KqNIcqr6aHyGt3JRlfuUC7iB0tomJRPlJ2cRGIpBzA==",
1282 "license": "ISC",
1283 "dependencies": {
1284 "b4a": "^1.6.0"
1285 },
1286 "optionalDependencies": {
1287 "simdle-native": "^1.1.1"
1288 }
1289 },
1290 "node_modules/sodium-native": {
1291 "version": "5.0.10",
1292 "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-5.0.10.tgz",
1293 "integrity": "sha512-UIw+0AbpCQRuTJF88JWrZomP4O+PXhlWvdopiAJOsUivTyHTf3korMyStxkZuPngSbBEtEfDdc4ewEd8/T4/lA==",
1294 "license": "MIT",
1295 "dependencies": {
1296 "require-addon": "^1.1.0",
1297 "which-runtime": "^1.2.1"
1298 },
1299 "engines": {
1300 "bare": ">=1.16.0"
1301 }
1302 },
1303 "node_modules/sodium-secretstream": {
1304 "version": "1.2.0",
1305 "resolved": "https://registry.npmjs.org/sodium-secretstream/-/sodium-secretstream-1.2.0.tgz",
1306 "integrity": "sha512-q/DbraNFXm1KfCiiZvapmz5UC3OlpirYFIvBK2MhGaOFSb3gRyk8OXTi17UI9SGfshQNCpsVvlopogbzZNyW6Q==",
1307 "license": "MIT",
1308 "dependencies": {
1309 "b4a": "^1.1.1",
1310 "sodium-universal": "^5.0.0"
1311 }
1312 },
1313 "node_modules/sodium-universal": {
1314 "version": "5.0.1",
1315 "resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-5.0.1.tgz",
1316 "integrity": "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q==",
1317 "license": "MIT",
1318 "dependencies": {
1319 "sodium-native": "^5.0.1"
1320 },
1321 "peerDependencies": {
1322 "sodium-javascript": "~0.8.0"
1323 },
1324 "peerDependenciesMeta": {
1325 "sodium-javascript": {
1326 "optional": true
1327 }
1328 }
1329 },
1330 "node_modules/speedometer": {
1331 "version": "1.1.0",
1332 "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.1.0.tgz",
1333 "integrity": "sha512-z/wAiTESw2XVPssY2XRcme4niTc4S5FkkJ4gknudtVoc33Zil8TdTxHy5torRcgqMqksJV2Yz8HQcvtbsnw0mQ==",
1334 "license": "MIT"
1335 },
1336322 "node_modules/streamx": {
1337323 "version": "2.23.0",
1338324 "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
……@@ -1344,16 +330,6 @@
1344330 "text-decoder": "^1.1.0"
1345331 }
1346332 },
1347 "node_modules/sub-encoder": {
1348 "version": "2.1.3",
1349 "resolved": "https://registry.npmjs.org/sub-encoder/-/sub-encoder-2.1.3.tgz",
1350 "integrity": "sha512-Xxx04ygZo/1J3yHvaSA6VhDmiSaBQkw/PmO3YnnYFXle+tfOGToC6FcDpIfMztWZXJzuKG14b/57HMkiL58C6A==",
1351 "license": "Apache-2.0",
1352 "dependencies": {
1353 "b4a": "^1.6.0",
1354 "codecs": "^3.1.0"
1355 }
1356 },
1357333 "node_modules/text-decoder": {
1358334 "version": "1.2.7",
1359335 "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
……@@ -1362,93 +338,6 @@
1362338 "dependencies": {
1363339 "b4a": "^1.6.4"
1364340 }
1365 },
1366 "node_modules/time-ordered-set": {
1367 "version": "2.0.1",
1368 "resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-2.0.1.tgz",
1369 "integrity": "sha512-VJEKmgSN2UiOLB8BpN8Sh2b9LGMHTP5OPrQRpnKjvOheOyzk0mufbjzjKTIG2gO4A+Y+vDJ+0TcLbpUmMLsg8A==",
1370 "license": "MIT"
1371 },
1372 "node_modules/timeout-refresh": {
1373 "version": "2.0.1",
1374 "resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-2.0.1.tgz",
1375 "integrity": "sha512-SVqEcMZBsZF9mA78rjzCrYrUs37LMJk3ShZ851ygZYW1cMeIjs9mL57KO6Iv5mmjSQnOe/29/VAfGXo+oRCiVw==",
1376 "license": "MIT"
1377 },
1378 "node_modules/tiny-buffer-rpc": {
1379 "version": "2.3.1",
1380 "resolved": "https://registry.npmjs.org/tiny-buffer-rpc/-/tiny-buffer-rpc-2.3.1.tgz",
1381 "integrity": "sha512-oJvKOwEKYAt3IwqX9TOI76DaLKebbWyf3/A723mSw1Vm2qKswV21w0Qc34sSJ1bbBQTmo9IT7ToA7diwz4sgCg==",
1382 "license": "Apache-2.0",
1383 "dependencies": {
1384 "b4a": "^1.6.3",
1385 "compact-encoding": "^2.11.0",
1386 "safety-catch": "^1.0.2",
1387 "streamx": "^2.13.2"
1388 }
1389 },
1390 "node_modules/udx-native": {
1391 "version": "1.19.2",
1392 "resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.19.2.tgz",
1393 "integrity": "sha512-RNYh+UhfryCsF5hE2ZOuIqcZ+qdipXK3UsarwxWJwsUQZFE3ybwz0mPjwb5ev1PMBcjFahWiepS/q0wwL51c2g==",
1394 "license": "Apache-2.0",
1395 "dependencies": {
1396 "b4a": "^1.5.0",
1397 "bare-events": "^2.2.0",
1398 "require-addon": "^1.1.0",
1399 "streamx": "^2.22.0"
1400 },
1401 "engines": {
1402 "bare": ">=1.17.4"
1403 }
1404 },
1405 "node_modules/unix-path-resolve": {
1406 "version": "1.0.2",
1407 "resolved": "https://registry.npmjs.org/unix-path-resolve/-/unix-path-resolve-1.0.2.tgz",
1408 "integrity": "sha512-kG4g5nobBBaMnH2XbrS4sLUXEpx4nY2J3C6KAlAUcnahG2HChxSPVKWYrqEq76iTo+cyMkLUjqxGaQR2tz097Q==",
1409 "license": "MIT"
1410 },
1411 "node_modules/unordered-set": {
1412 "version": "2.0.1",
1413 "resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz",
1414 "integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg==",
1415 "license": "MIT"
1416 },
1417 "node_modules/unslab": {
1418 "version": "1.3.0",
1419 "resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz",
1420 "integrity": "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ==",
1421 "license": "Apache-2.0",
1422 "dependencies": {
1423 "b4a": "^1.6.6"
1424 }
1425 },
1426 "node_modules/varint": {
1427 "version": "5.0.0",
1428 "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.0.tgz",
1429 "integrity": "sha512-gC13b/bWrqQoKY2EmROCZ+AR0jitc6DnDGaQ6Ls9QpKmuSgJB1eQ7H3KETtQm7qSdMWMKCmsshyCmUwMLh3OAA==",
1430 "license": "MIT"
1431 },
1432 "node_modules/which-runtime": {
1433 "version": "1.3.2",
1434 "resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.3.2.tgz",
1435 "integrity": "sha512-5kwCfWml7+b2NO7KrLMhYihjRx0teKkd3yGp1Xk5Vaf2JGdSh+rgVhEALAD9c/59dP+YwJHXoEO7e8QPy7gOkw==",
1436 "license": "Apache-2.0"
1437 },
1438 "node_modules/xache": {
1439 "version": "1.2.1",
1440 "resolved": "https://registry.npmjs.org/xache/-/xache-1.2.1.tgz",
1441 "integrity": "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA==",
1442 "license": "MIT"
1443 },
1444 "node_modules/z32": {
1445 "version": "1.1.0",
1446 "resolved": "https://registry.npmjs.org/z32/-/z32-1.1.0.tgz",
1447 "integrity": "sha512-1WUHy+VS6d0HPNspDxvLssBbeQjXMjSnpv0vH82vRAUfg847NmX3OXozp/hRP5jPhxBbrVzrgvAt+UsGNzRFQQ==",
1448 "license": "MIT",
1449 "dependencies": {
1450 "b4a": "^1.5.3"
1451 }
1452341 }
1453342 }
1454343}
package.json +6 -24
……@@ -4,28 +4,12 @@
44 "type": "module",
55 "main": "index.js",
66 "private": true,
7 "upgrade": "pear://6d5asjamxqyuxhhhojrn3m968fmc34ydx9be6yf58kufrbms14yo",
8 "pear": {
9 "name": "godot-keet",
7 "pgh": {
8 "bin": "godot-keet",
9 "entrypoint": "index.js",
1010 "type": "terminal",
11 "stage": {
12 "ignore": [
13 "addons/",
14 "autoloads/",
15 "scenes/",
16 "scripts/",
17 ".godot/",
18 ".git/",
19 "*.import",
20 "*.uid",
21 "*.md",
22 "project.godot",
23 "export_presets.cfg",
24 "tests/",
25 "test-ci-deps.sh",
26 "SYSTEMATIC_PLAN.md"
27 ]
28 }
11 "runtime": "bare",
12 "upgrade": "pgh://1dd36bdfa9cb7f7d84adbd07f017e7200f7f90a3a546cd0761fac2a1f8a13e86/godot-keet"
2913 },
3014 "scripts": {
3115 "preinstall": "mkdir -p node_modules/@holepunchto && cp -r /storage/projects/code/hypercore-kb/hyper-fleeky/keet-cli/node_modules/@holepunchto/* node_modules/@holepunchto/ 2>/dev/null; true"
……@@ -40,9 +24,7 @@
4024 "bare-pipe": "^4.1.3",
4125 "bare-process": "^2.0.0",
4226 "bare-subprocess": "^3.1.4",
43 "framed-stream": "^1.0.1",
44 "pear-appdrive": "^1.1.2",
45 "pear-runtime": "^0.4.2"
27 "framed-stream": "^1.0.1"
4628 },
4729 "imports": {
4830 "fs": {