mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-09-01 16:27:07 +00:00
- Update trystero to v0.23.0
- Add dockerfile for CLI - Change relay image for testing on arm64
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
# Git history
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# Dependencies — re-installed inside Docker
|
||||||
|
node_modules/
|
||||||
|
src/apps/cli/node_modules/
|
||||||
|
|
||||||
|
# Pre-built CLI output — rebuilt inside Docker
|
||||||
|
src/apps/cli/dist/
|
||||||
|
|
||||||
|
# Obsidian plugin build outputs
|
||||||
|
main.js
|
||||||
|
main_org.js
|
||||||
|
pouchdb-browser.js
|
||||||
|
production/
|
||||||
|
|
||||||
|
# Test coverage and reports
|
||||||
|
coverage/
|
||||||
|
|
||||||
|
# Local environment / secrets
|
||||||
|
.env
|
||||||
|
*.env
|
||||||
|
.test.env
|
||||||
|
|
||||||
|
# local config files
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# OS artefacts
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
Generated
+575
-3078
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -132,17 +132,17 @@
|
|||||||
"@smithy/middleware-apply-body-checksum": "^4.3.9",
|
"@smithy/middleware-apply-body-checksum": "^4.3.9",
|
||||||
"@smithy/protocol-http": "^5.3.9",
|
"@smithy/protocol-http": "^5.3.9",
|
||||||
"@smithy/querystring-builder": "^4.2.9",
|
"@smithy/querystring-builder": "^4.2.9",
|
||||||
|
"@trystero-p2p/nostr": "^0.23.0",
|
||||||
"commander": "^14.0.3",
|
"commander": "^14.0.3",
|
||||||
"diff-match-patch": "^1.0.5",
|
"diff-match-patch": "^1.0.5",
|
||||||
"fflate": "^0.8.2",
|
"fflate": "^0.8.2",
|
||||||
"idb": "^8.0.3",
|
"idb": "^8.0.3",
|
||||||
"markdown-it": "^14.1.1",
|
"markdown-it": "^14.1.1",
|
||||||
"minimatch": "^10.2.2",
|
"minimatch": "^10.2.2",
|
||||||
"node-datachannel": "^0.32.1",
|
|
||||||
"octagonal-wheels": "^0.1.45",
|
"octagonal-wheels": "^0.1.45",
|
||||||
"pouchdb-adapter-leveldb": "^9.0.0",
|
"pouchdb-adapter-leveldb": "^9.0.0",
|
||||||
"qrcode-generator": "^1.4.4",
|
"qrcode-generator": "^1.4.4",
|
||||||
"trystero": "^0.22.0",
|
"werift": "^0.22.9",
|
||||||
"xxhash-wasm-102": "npm:xxhash-wasm@^1.0.2"
|
"xxhash-wasm-102": "npm:xxhash-wasm@^1.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
.livesync
|
.livesync
|
||||||
test/*
|
test/*
|
||||||
!test/*.sh
|
!test/*.sh
|
||||||
|
test/test-init.local.sh
|
||||||
node_modules
|
node_modules
|
||||||
.*.json
|
.*.json
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
#
|
||||||
|
# Self-hosted LiveSync CLI — Docker image
|
||||||
|
#
|
||||||
|
# Build (from the repository root):
|
||||||
|
# docker build -f src/apps/cli/Dockerfile -t livesync-cli .
|
||||||
|
#
|
||||||
|
# Run:
|
||||||
|
# docker run --rm -v /path/to/your/vault:/data livesync-cli sync
|
||||||
|
# docker run --rm -v /path/to/your/vault:/data livesync-cli ls
|
||||||
|
# docker run --rm -v /path/to/your/vault:/data livesync-cli init-settings
|
||||||
|
# docker run --rm -v /path/to/your/vault:/data livesync-cli --help
|
||||||
|
#
|
||||||
|
# The first positional argument (database-path) is automatically set to /data.
|
||||||
|
# Mount your vault at /data, or override with: -e LIVESYNC_DB_PATH=/other/path
|
||||||
|
#
|
||||||
|
# P2P (WebRTC) networking — important notes
|
||||||
|
# -----------------------------------------
|
||||||
|
# The P2P replicator (p2p-host / p2p-sync / p2p-peers) uses WebRTC, which
|
||||||
|
# generates ICE candidates of three kinds:
|
||||||
|
#
|
||||||
|
# host — the container's bridge IP (172.17.x.x). Unreachable from outside
|
||||||
|
# the Docker bridge, so LAN peers cannot connect via this candidate.
|
||||||
|
# srflx — the host's public IP, obtained via STUN reflection. Works fine
|
||||||
|
# over the internet even with the default bridge network.
|
||||||
|
# relay — traffic relayed through a TURN server. Always reachable regardless
|
||||||
|
# of network mode.
|
||||||
|
#
|
||||||
|
# Recommended network modes per use-case:
|
||||||
|
#
|
||||||
|
# LAN P2P (Linux only)
|
||||||
|
# docker run --network host ...
|
||||||
|
# This exposes the real host IP as the 'host' candidate so LAN peers can
|
||||||
|
# connect directly. --network host is not available on Docker Desktop for
|
||||||
|
# macOS or Windows.
|
||||||
|
#
|
||||||
|
# LAN P2P (macOS / Windows Docker Desktop)
|
||||||
|
# Configure a TURN server in settings (P2P_turnServers / P2P_turnUsername /
|
||||||
|
# P2P_turnCredential). All data is then relayed through the TURN server,
|
||||||
|
# bypassing the bridge-network limitation.
|
||||||
|
#
|
||||||
|
# Internet P2P
|
||||||
|
# Default bridge network is sufficient; the srflx candidate carries the
|
||||||
|
# host's public IP and peers can connect normally.
|
||||||
|
#
|
||||||
|
# CouchDB sync only (no P2P)
|
||||||
|
# Default bridge network. No special configuration required.
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
# Stage 1 — builder
|
||||||
|
# Full Node.js environment to compile native modules and bundle the CLI.
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
FROM node:22-slim AS builder
|
||||||
|
|
||||||
|
# Build tools required by native Node.js addons (mainly leveldown)
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends python3 make g++ \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
# Install workspace dependencies first (layer-cache friendly)
|
||||||
|
COPY package.json ./
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
# Copy the full source tree and build the CLI bundle
|
||||||
|
COPY . .
|
||||||
|
RUN cd src/apps/cli && npm run build
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
# Stage 2 — runtime-deps
|
||||||
|
# Install only the external (unbundled) packages that the CLI requires at
|
||||||
|
# runtime. Native addons are compiled here against the same base image that
|
||||||
|
# the final runtime stage uses.
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
FROM node:22-slim AS runtime-deps
|
||||||
|
|
||||||
|
# Build tools required to compile native addons
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends python3 make g++ \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /deps
|
||||||
|
|
||||||
|
# runtime-package.json lists only the packages that Vite leaves external
|
||||||
|
COPY src/apps/cli/runtime-package.json ./package.json
|
||||||
|
RUN npm install --omit=dev
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
# Stage 3 — runtime
|
||||||
|
# Minimal image: pre-compiled native modules + CLI bundle only.
|
||||||
|
# No build tools are included, keeping the image small.
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
FROM node:22-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy pre-compiled external node_modules from runtime-deps stage
|
||||||
|
COPY --from=runtime-deps /deps/node_modules ./node_modules
|
||||||
|
|
||||||
|
# Copy the built CLI bundle from builder stage
|
||||||
|
COPY --from=builder /build/src/apps/cli/dist ./dist
|
||||||
|
|
||||||
|
# Install entrypoint wrapper
|
||||||
|
COPY src/apps/cli/docker-entrypoint.sh /usr/local/bin/livesync-cli
|
||||||
|
RUN chmod +x /usr/local/bin/livesync-cli
|
||||||
|
|
||||||
|
# Mount your vault / local database directory here
|
||||||
|
VOLUME ["/data"]
|
||||||
|
|
||||||
|
ENTRYPOINT ["livesync-cli"]
|
||||||
@@ -45,6 +45,60 @@ CLI Main
|
|||||||
- Settings management (JSON file)
|
- Settings management (JSON file)
|
||||||
- Graceful shutdown handling
|
- Graceful shutdown handling
|
||||||
|
|
||||||
|
## Docker
|
||||||
|
|
||||||
|
A Docker image is provided for headless / server deployments. Build from the repository root:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build -f src/apps/cli/Dockerfile -t livesync-cli .
|
||||||
|
```
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Sync with CouchDB
|
||||||
|
docker run --rm -v /path/to/your/vault:/data livesync-cli sync
|
||||||
|
|
||||||
|
# List files in the local database
|
||||||
|
docker run --rm -v /path/to/your/vault:/data livesync-cli ls
|
||||||
|
|
||||||
|
# Generate a default settings file
|
||||||
|
docker run --rm -v /path/to/your/vault:/data livesync-cli init-settings
|
||||||
|
```
|
||||||
|
|
||||||
|
The vault directory is mounted at `/data` by default. Override with `-e LIVESYNC_DB_PATH=/other/path`.
|
||||||
|
|
||||||
|
### P2P (WebRTC) and Docker networking
|
||||||
|
|
||||||
|
The P2P replicator (`p2p-host`, `p2p-sync`, `p2p-peers`) uses WebRTC and generates
|
||||||
|
three kinds of ICE candidates. The default Docker bridge network affects which
|
||||||
|
candidates are usable:
|
||||||
|
|
||||||
|
| Candidate type | Description | Bridge network |
|
||||||
|
|---|---|---|
|
||||||
|
| `host` | Container bridge IP (`172.17.x.x`) | Unreachable from LAN peers |
|
||||||
|
| `srflx` | Host public IP via STUN reflection | Works over the internet |
|
||||||
|
| `relay` | Traffic relayed via TURN server | Always reachable |
|
||||||
|
|
||||||
|
**LAN P2P on Linux** — use `--network host` so that the real host IP is
|
||||||
|
advertised as the `host` candidate:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run --rm --network host -v /path/to/your/vault:/data livesync-cli p2p-host
|
||||||
|
```
|
||||||
|
|
||||||
|
> `--network host` is not available on Docker Desktop for macOS or Windows.
|
||||||
|
|
||||||
|
**LAN P2P on macOS / Windows Docker Desktop** — configure a TURN server in the
|
||||||
|
settings file (`P2P_turnServers`, `P2P_turnUsername`, `P2P_turnCredential`).
|
||||||
|
All P2P traffic will then be relayed through the TURN server, bypassing the
|
||||||
|
bridge-network limitation.
|
||||||
|
|
||||||
|
**Internet P2P** — the default bridge network is sufficient. The `srflx`
|
||||||
|
candidate carries the host's public IP and peers can connect normally.
|
||||||
|
|
||||||
|
**CouchDB sync only (no P2P)** — no special network configuration is required.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Entrypoint wrapper for the Self-hosted LiveSync CLI Docker image.
|
||||||
|
#
|
||||||
|
# By default, /data is used as the database-path (the vault mount point).
|
||||||
|
# Override this via the LIVESYNC_DB_PATH environment variable.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# docker run -v /path/to/vault:/data livesync-cli sync
|
||||||
|
# docker run -v /path/to/vault:/data livesync-cli --settings /data/.livesync/settings.json sync
|
||||||
|
# docker run -v /path/to/vault:/data livesync-cli init-settings
|
||||||
|
# docker run -e LIVESYNC_DB_PATH=/vault -v /path/to/vault:/vault livesync-cli sync
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "${1:-}" in
|
||||||
|
init-settings | --help | -h | "")
|
||||||
|
# Commands that do not require a leading database-path argument
|
||||||
|
exec node /app/dist/index.cjs "$@"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# All other commands: prepend the database-path so users only need
|
||||||
|
# to supply the command and its options.
|
||||||
|
exec node /app/dist/index.cjs "${LIVESYNC_DB_PATH:-/data}" "$@"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
import polyfill from "node-datachannel/polyfill";
|
import * as polyfill from "werift";
|
||||||
import { main } from "./main";
|
import { main } from "./main";
|
||||||
|
|
||||||
for (const prop in polyfill) {
|
const rtcPolyfillCtor = (polyfill as any).RTCPeerConnection;
|
||||||
// @ts-ignore Applying polyfill to globalThis
|
if (typeof (globalThis as any).RTCPeerConnection === "undefined" && typeof rtcPolyfillCtor === "function") {
|
||||||
globalThis[prop] = (polyfill as any)[prop];
|
// Fill only the standard WebRTC global in Node CLI runtime.
|
||||||
|
(globalThis as any).RTCPeerConnection = rtcPolyfillCtor;
|
||||||
}
|
}
|
||||||
|
|
||||||
main().catch((error) => {
|
main().catch((error) => {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"cli": "node dist/index.cjs",
|
"cli": "node dist/index.cjs",
|
||||||
"buildRun": "npm run build && npm run cli --",
|
"buildRun": "npm run build && npm run cli --",
|
||||||
|
"build:docker": "docker build -f Dockerfile -t livesync-cli ../../..",
|
||||||
"check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json",
|
"check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json",
|
||||||
"test:unit": "cd ../../.. && npx vitest run --config vitest.config.unit.ts src/apps/cli/main.unit.spec.ts src/apps/cli/commands/utils.unit.spec.ts src/apps/cli/commands/runCommand.unit.spec.ts src/apps/cli/commands/p2p.unit.spec.ts",
|
"test:unit": "cd ../../.. && npx vitest run --config vitest.config.unit.ts src/apps/cli/main.unit.spec.ts src/apps/cli/commands/utils.unit.spec.ts src/apps/cli/commands/runCommand.unit.spec.ts src/apps/cli/commands/p2p.unit.spec.ts",
|
||||||
"test:e2e:two-vaults": "bash test/test-e2e-two-vaults-with-docker-linux.sh",
|
"test:e2e:two-vaults": "bash test/test-e2e-two-vaults-with-docker-linux.sh",
|
||||||
@@ -24,7 +25,15 @@
|
|||||||
"test:e2e:p2p-sync": "bash test/test-p2p-sync-linux.sh",
|
"test:e2e:p2p-sync": "bash test/test-p2p-sync-linux.sh",
|
||||||
"test:e2e:mirror": "bash test/test-mirror-linux.sh",
|
"test:e2e:mirror": "bash test/test-mirror-linux.sh",
|
||||||
"pretest:e2e:all": "npm run build",
|
"pretest:e2e:all": "npm run build",
|
||||||
"test:e2e:all": " export RUN_BUILD=0 && npm run test:e2e:setup-put-cat && npm run test:e2e:push-pull && npm run test:e2e:sync-two-local && npm run test:e2e:p2p && npm run test:e2e:mirror && npm run test:e2e:two-vaults && npm run test:e2e:p2p"
|
"test:e2e:all": " export RUN_BUILD=0 && npm run test:e2e:setup-put-cat && npm run test:e2e:push-pull && npm run test:e2e:sync-two-local && npm run test:e2e:p2p && npm run test:e2e:mirror && npm run test:e2e:two-vaults && npm run test:e2e:p2p",
|
||||||
|
"pretest:e2e:docker:all": "npm run build:docker",
|
||||||
|
"test:e2e:docker:push-pull": "RUN_BUILD=0 LIVESYNC_TEST_DOCKER=1 bash test/test-push-pull-linux.sh",
|
||||||
|
"test:e2e:docker:setup-put-cat": "RUN_BUILD=0 LIVESYNC_TEST_DOCKER=1 bash test/test-setup-put-cat-linux.sh",
|
||||||
|
"test:e2e:docker:mirror": "RUN_BUILD=0 LIVESYNC_TEST_DOCKER=1 bash test/test-mirror-linux.sh",
|
||||||
|
"test:e2e:docker:sync-two-local": "RUN_BUILD=0 LIVESYNC_TEST_DOCKER=1 bash test/test-sync-two-local-databases-linux.sh",
|
||||||
|
"test:e2e:docker:p2p": "RUN_BUILD=0 LIVESYNC_TEST_DOCKER=1 bash test/test-p2p-three-nodes-conflict-linux.sh",
|
||||||
|
"test:e2e:docker:p2p-sync": "RUN_BUILD=0 LIVESYNC_TEST_DOCKER=1 bash test/test-p2p-sync-linux.sh",
|
||||||
|
"test:e2e:docker:all": "export RUN_BUILD=0 && npm run test:e2e:docker:setup-put-cat && npm run test:e2e:docker:push-pull && npm run test:e2e:docker:sync-two-local && npm run test:e2e:docker:mirror"
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
"dependencies": {},
|
||||||
"devDependencies": {}
|
"devDependencies": {}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "livesync-cli-runtime",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "Runtime dependencies for Self-hosted LiveSync CLI Docker image",
|
||||||
|
"dependencies": {
|
||||||
|
"commander": "^14.0.3",
|
||||||
|
"werift": "^0.22.9",
|
||||||
|
"pouchdb-adapter-http": "^9.0.0",
|
||||||
|
"pouchdb-adapter-idb": "^9.0.0",
|
||||||
|
"pouchdb-adapter-indexeddb": "^9.0.0",
|
||||||
|
"pouchdb-adapter-leveldb": "^9.0.0",
|
||||||
|
"pouchdb-adapter-memory": "^9.0.0",
|
||||||
|
"pouchdb-core": "^9.0.0",
|
||||||
|
"pouchdb-errors": "^9.0.0",
|
||||||
|
"pouchdb-find": "^9.0.0",
|
||||||
|
"pouchdb-mapreduce": "^9.0.0",
|
||||||
|
"pouchdb-merge": "^9.0.0",
|
||||||
|
"pouchdb-replication": "^9.0.0",
|
||||||
|
"pouchdb-utils": "^9.0.0",
|
||||||
|
"pouchdb-wrappers": "*",
|
||||||
|
"transform-pouch": "^2.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
Executable → Regular
Executable → Regular
Executable → Regular
@@ -0,0 +1,150 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# test-helpers-docker.sh
|
||||||
|
#
|
||||||
|
# Docker-mode overrides for test-helpers.sh.
|
||||||
|
# Sourced automatically at the end of test-helpers.sh when
|
||||||
|
# LIVESYNC_TEST_DOCKER=1 is set, replacing run_cli (and related helpers)
|
||||||
|
# with a Docker-based implementation.
|
||||||
|
#
|
||||||
|
# The Docker container and the host share a common directory layout:
|
||||||
|
# $WORK_DIR (host) <-> /workdir (container)
|
||||||
|
# $CLI_DIR (host) <-> /clidir (container)
|
||||||
|
#
|
||||||
|
# Usage (run an existing test against the Docker image):
|
||||||
|
# LIVESYNC_TEST_DOCKER=1 bash test/test-push-pull-linux.sh
|
||||||
|
# LIVESYNC_TEST_DOCKER=1 bash test/test-mirror-linux.sh
|
||||||
|
# LIVESYNC_TEST_DOCKER=1 bash test/test-sync-two-local-databases-linux.sh
|
||||||
|
# LIVESYNC_TEST_DOCKER=1 bash test/test-setup-put-cat-linux.sh
|
||||||
|
#
|
||||||
|
# Optional environment variables:
|
||||||
|
# DOCKER_IMAGE Image name/tag to use (default: livesync-cli)
|
||||||
|
# RUN_BUILD Set to 1 to rebuild the Docker image before the test
|
||||||
|
# (default: 0 — assumes the image is already built)
|
||||||
|
# Build command: npm run build:docker (from src/apps/cli/)
|
||||||
|
#
|
||||||
|
# Notes:
|
||||||
|
# - The container is started with --network host so that it can reach
|
||||||
|
# CouchDB / P2P relay containers that are also using the host network.
|
||||||
|
# - On macOS / Windows Docker Desktop --network host behaves differently
|
||||||
|
# (it is not a true host-network bridge); tests that rely on localhost
|
||||||
|
# connectivity to other containers may fail on those platforms.
|
||||||
|
|
||||||
|
# Ensure Docker-mode tests do not trigger host-side `npm run build` unless
|
||||||
|
# explicitly requested by the caller.
|
||||||
|
RUN_BUILD="${RUN_BUILD:-0}"
|
||||||
|
|
||||||
|
# Override the standard implementation.
|
||||||
|
# In Docker mode the CLI_CMD array is a no-op sentinel; run_cli is overridden
|
||||||
|
# directly.
|
||||||
|
cli_test_init_cli_cmd() {
|
||||||
|
DOCKER_IMAGE="${DOCKER_IMAGE:-livesync-cli}"
|
||||||
|
# CLI_CMD is unused in Docker mode; set a sentinel so existing code
|
||||||
|
# that references it will not error.
|
||||||
|
CLI_CMD=(__docker__)
|
||||||
|
}
|
||||||
|
|
||||||
|
# ─── display_test_info ────────────────────────────────────────────────────────
|
||||||
|
display_test_info() {
|
||||||
|
local image="${DOCKER_IMAGE:-livesync-cli}"
|
||||||
|
local image_id
|
||||||
|
image_id="$(docker inspect --format='{{slice .Id 7 19}}' "$image" 2>/dev/null || echo "N/A")"
|
||||||
|
echo "======================"
|
||||||
|
echo "Script: ${BASH_SOURCE[1]:-$0}"
|
||||||
|
echo "Date: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||||||
|
echo "Commit: $(git -C "${SCRIPT_DIR:-.}" rev-parse --short HEAD 2>/dev/null || echo "N/A")"
|
||||||
|
echo "Mode: Docker image=${image} id=${image_id}"
|
||||||
|
echo "======================"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ─── _docker_translate_arg ───────────────────────────────────────────────────
|
||||||
|
# Translate a single host filesystem path to its in-container equivalent.
|
||||||
|
# Paths under WORK_DIR → /workdir/...
|
||||||
|
# Paths under CLI_DIR → /clidir/...
|
||||||
|
# Everything else is returned unchanged (relative paths, URIs, plain names).
|
||||||
|
_docker_translate_arg() {
|
||||||
|
local arg="$1"
|
||||||
|
if [[ -n "${WORK_DIR:-}" && "$arg" == "$WORK_DIR"* ]]; then
|
||||||
|
printf '%s' "/workdir${arg#$WORK_DIR}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if [[ -n "${CLI_DIR:-}" && "$arg" == "$CLI_DIR"* ]]; then
|
||||||
|
printf '%s' "/clidir${arg#$CLI_DIR}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
printf '%s' "$arg"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ─── run_cli ─────────────────────────────────────────────────────────────────
|
||||||
|
# Drop-in replacement for run_cli that executes the CLI inside a Docker
|
||||||
|
# container, translating host paths to container paths automatically.
|
||||||
|
#
|
||||||
|
# Calling convention is identical to the native run_cli:
|
||||||
|
# run_cli <vault-path> [options] <command> [command-args]
|
||||||
|
# run_cli init-settings [options] <settings-file>
|
||||||
|
#
|
||||||
|
# The vault path (first positional argument for regular commands) is forwarded
|
||||||
|
# via the LIVESYNC_DB_PATH environment variable so that docker-entrypoint.sh
|
||||||
|
# can inject it before the remaining CLI arguments.
|
||||||
|
run_cli() {
|
||||||
|
local args=("$@")
|
||||||
|
|
||||||
|
# ── 1. Translate all host paths to container paths ────────────────────
|
||||||
|
local translated=()
|
||||||
|
for arg in "${args[@]}"; do
|
||||||
|
translated+=("$(_docker_translate_arg "$arg")")
|
||||||
|
done
|
||||||
|
|
||||||
|
# ── 2. Split vault path from the rest of the arguments ───────────────
|
||||||
|
local first="${translated[0]:-}"
|
||||||
|
local env_args=()
|
||||||
|
local cli_args=()
|
||||||
|
|
||||||
|
# These tokens are commands or flags that appear before any vault path.
|
||||||
|
case "$first" in
|
||||||
|
"" | --help | -h \
|
||||||
|
| init-settings \
|
||||||
|
| -v | --verbose | -d | --debug | -f | --force | -s | --settings)
|
||||||
|
# No leading vault path — pass all translated args as-is.
|
||||||
|
cli_args=("${translated[@]}")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# First arg is the vault path; hand it to docker-entrypoint.sh
|
||||||
|
# via LIVESYNC_DB_PATH so the entrypoint prepends it correctly.
|
||||||
|
env_args+=(-e "LIVESYNC_DB_PATH=$first")
|
||||||
|
cli_args=("${translated[@]:1}")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# ── 3. Inject verbose / debug flags ──────────────────────────────────
|
||||||
|
if [[ "${VERBOSE_TEST_LOGGING:-0}" == "1" ]]; then
|
||||||
|
cli_args=(-v "${cli_args[@]}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── 4. Volume mounts ──────────────────────────────────────────────────
|
||||||
|
local vol_args=()
|
||||||
|
if [[ -n "${WORK_DIR:-}" ]]; then
|
||||||
|
vol_args+=(-v "${WORK_DIR}:/workdir")
|
||||||
|
fi
|
||||||
|
# Mount CLI_DIR (src/apps/cli) for two-vault tests that store vault data
|
||||||
|
# under $CLI_DIR/.livesync/.
|
||||||
|
if [[ -n "${CLI_DIR:-}" ]]; then
|
||||||
|
vol_args+=(-v "${CLI_DIR}:/clidir")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ── 5. stdin forwarding ───────────────────────────────────────────────
|
||||||
|
# Attach stdin only when it is a pipe (the 'put' command reads from stdin).
|
||||||
|
# Without -i the pipe data would never reach the container process.
|
||||||
|
local stdin_flags=()
|
||||||
|
if [[ ! -t 0 ]]; then
|
||||||
|
stdin_flags=(-i)
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker run --rm \
|
||||||
|
"${stdin_flags[@]}" \
|
||||||
|
--network host \
|
||||||
|
--user "$(id -u):$(id -g)" \
|
||||||
|
"${vol_args[@]}" \
|
||||||
|
"${env_args[@]}" \
|
||||||
|
"${DOCKER_IMAGE:-livesync-cli}" \
|
||||||
|
"${cli_args[@]}"
|
||||||
|
}
|
||||||
@@ -1,5 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# ─── local init hook ────────────────────────────────────────────────────────
|
||||||
|
# If test-init.local.sh exists alongside this file, source it before anything
|
||||||
|
# else. Use it to set up your local environment (e.g. activate nvm, set
|
||||||
|
# DOCKER_IMAGE, ...). The file is git-ignored so it is safe to put personal
|
||||||
|
# or machine-specific configuration there.
|
||||||
|
_TEST_HELPERS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
[[ -f "$_TEST_HELPERS_DIR/test-init.local.sh" ]] && source "$_TEST_HELPERS_DIR/test-init.local.sh"
|
||||||
|
unset _TEST_HELPERS_DIR
|
||||||
|
|
||||||
cli_test_init_cli_cmd() {
|
cli_test_init_cli_cmd() {
|
||||||
if [[ "${VERBOSE_TEST_LOGGING:-0}" == "1" ]]; then
|
if [[ "${VERBOSE_TEST_LOGGING:-0}" == "1" ]]; then
|
||||||
CLI_CMD=(npm --silent run cli -- -v)
|
CLI_CMD=(npm --silent run cli -- -v)
|
||||||
@@ -344,3 +354,9 @@ display_test_info(){
|
|||||||
echo "Git commit: $(git -C "$SCRIPT_DIR/.." rev-parse --short HEAD 2>/dev/null || echo "N/A")"
|
echo "Git commit: $(git -C "$SCRIPT_DIR/.." rev-parse --short HEAD 2>/dev/null || echo "N/A")"
|
||||||
echo "======================"
|
echo "======================"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Docker-mode hook — source overrides when LIVESYNC_TEST_DOCKER=1.
|
||||||
|
if [[ "${LIVESYNC_TEST_DOCKER:-0}" == "1" ]]; then
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/test-helpers-docker.sh"
|
||||||
|
fi
|
||||||
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
Executable → Regular
@@ -1,2 +1,30 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
docker run -d --name relay-test -p 4000:8080 scsibug/nostr-rs-relay:latest
|
set -e
|
||||||
|
|
||||||
|
docker run -d --name relay-test -p 4000:7777 \
|
||||||
|
--tmpfs /app/strfry-db:rw,size=256m \
|
||||||
|
--entrypoint sh \
|
||||||
|
ghcr.io/hoytech/strfry:latest \
|
||||||
|
-lc 'cat > /tmp/strfry.conf <<"EOF"
|
||||||
|
db = "./strfry-db/"
|
||||||
|
|
||||||
|
relay {
|
||||||
|
bind = "0.0.0.0"
|
||||||
|
port = 7777
|
||||||
|
nofiles = 100000
|
||||||
|
|
||||||
|
info {
|
||||||
|
name = "livesync test relay"
|
||||||
|
description = "local relay for livesync p2p tests"
|
||||||
|
}
|
||||||
|
|
||||||
|
maxWebsocketPayloadSize = 131072
|
||||||
|
autoPingSeconds = 55
|
||||||
|
|
||||||
|
writePolicy {
|
||||||
|
plugin = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
exec /app/strfry --config /tmp/strfry.conf relay'
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,7 @@ const defaultExternal = [
|
|||||||
"pouchdb-adapter-leveldb",
|
"pouchdb-adapter-leveldb",
|
||||||
"commander",
|
"commander",
|
||||||
"punycode",
|
"punycode",
|
||||||
"node-datachannel",
|
"werift",
|
||||||
"node-datachannel/polyfill",
|
|
||||||
];
|
];
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [svelte()],
|
plugins: [svelte()],
|
||||||
@@ -52,7 +51,7 @@ export default defineConfig({
|
|||||||
if (id === "fs" || id === "fs/promises" || id === "path" || id === "crypto" || id === "worker_threads")
|
if (id === "fs" || id === "fs/promises" || id === "path" || id === "crypto" || id === "worker_threads")
|
||||||
return true;
|
return true;
|
||||||
if (id.startsWith("pouchdb-")) return true;
|
if (id.startsWith("pouchdb-")) return true;
|
||||||
if (id.startsWith("node-datachannel")) return true;
|
if (id.startsWith("werift")) return true;
|
||||||
if (id.startsWith("node:")) return true;
|
if (id.startsWith("node:")) return true;
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-1
Submodule src/lib updated: 3d6d9603bf...bed8afd2dc
+26
-1
@@ -3,6 +3,31 @@ set -e
|
|||||||
script_dir=$(dirname "$0")
|
script_dir=$(dirname "$0")
|
||||||
webpeer_dir=$script_dir/../../src/apps/webpeer
|
webpeer_dir=$script_dir/../../src/apps/webpeer
|
||||||
|
|
||||||
docker run -d --name relay-test -p 4000:8080 scsibug/nostr-rs-relay:latest
|
docker run -d --name relay-test -p 4000:7777 \
|
||||||
|
--tmpfs /app/strfry-db:rw,size=256m \
|
||||||
|
--entrypoint sh \
|
||||||
|
ghcr.io/hoytech/strfry:latest \
|
||||||
|
-lc 'cat > /tmp/strfry.conf <<"EOF"
|
||||||
|
db = "./strfry-db/"
|
||||||
|
|
||||||
|
relay {
|
||||||
|
bind = "0.0.0.0"
|
||||||
|
port = 7777
|
||||||
|
nofiles = 100000
|
||||||
|
|
||||||
|
info {
|
||||||
|
name = "livesync test relay"
|
||||||
|
description = "local relay for livesync p2p tests"
|
||||||
|
}
|
||||||
|
|
||||||
|
maxWebsocketPayloadSize = 131072
|
||||||
|
autoPingSeconds = 55
|
||||||
|
|
||||||
|
writePolicy {
|
||||||
|
plugin = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
exec /app/strfry --config /tmp/strfry.conf relay'
|
||||||
npm run --prefix $webpeer_dir build
|
npm run --prefix $webpeer_dir build
|
||||||
docker run -d --name webpeer-test -p 8081:8043 -v $webpeer_dir/dist:/srv/http pierrezemb/gostatic
|
docker run -d --name webpeer-test -p 8081:8043 -v $webpeer_dir/dist:/srv/http pierrezemb/gostatic
|
||||||
Reference in New Issue
Block a user