feat: add export/import streaming to the pluggable backends
Add backend-agnostic data export/import over an NDJSON wire format, plus an
inspect utility, exposed via three new CLIs and an HTTP export endpoint.
- ExportImport types + filter helpers (kind/record scoping, hard-intersection
of filters) in src/db/{types/ExportImport,export/filter}.ts
- SqliteInterface implements Exportable + Importable: signal-checked async
generator export (one query per table, per-record yield, trailing error
sentinel on mid-stream failure) and a manually-driven import transaction
that rolls back on any error/abort and never commits partial data
- ApiInterface implements Exportable via its own fetch({signal})
- computeForcedExportFilter enforces non-global-admin scope (resided-in abodes
+ co-resident users, intersected with apikey restrict_*); GET /export
intersects it with the caller's filter and wires an AbortController to the
response socket
- inspectExportStream reports kinds/counts from any stream without a db
- abode-export / abode-import / abode-inspect CLIs (import is sqlite-only)
- Secrets are not exported: imported users default to '#unset' passwords and
apikeys are re-minted a token (ClientApikey view round-trips exactly)
- test/tools/export-import.test.ts: round-trip, filter narrowing, forced-scope,
export/import cancellation, in-process Koa endpoint, inspect
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+7
-1
@@ -9,7 +9,10 @@
|
||||
"abode-migrate": "dist/bin/abode-migrate.cjs",
|
||||
"abode-repl": "dist/bin/abode-repl.cjs",
|
||||
"abode-web": "dist/bin/abode-web.cjs",
|
||||
"abode-tui": "dist/bin/abode-tui.cjs"
|
||||
"abode-tui": "dist/bin/abode-tui.cjs",
|
||||
"abode-export": "dist/bin/abode-export.cjs",
|
||||
"abode-import": "dist/bin/abode-import.cjs",
|
||||
"abode-inspect": "dist/bin/abode-inspect.cjs"
|
||||
},
|
||||
"scripts": {
|
||||
"repl": "tsx --import ./src/meta/dev/register.ts",
|
||||
@@ -18,6 +21,9 @@
|
||||
"abode-web": "tsx --import ./src/meta/dev/register.ts --import ./src/meta/dev/webhot.ts src/bin/abode-web.ts",
|
||||
"abode-tui": "tsx --import ./src/meta/dev/register.ts --import ./src/meta/dev/silenthot.ts src/bin/abode-tui.ts",
|
||||
"abode-sources": "tsx --import ./src/meta/dev/register.ts src/bin/abode-sources.ts",
|
||||
"abode-export": "tsx --import ./src/meta/dev/register.ts src/bin/abode-export.ts",
|
||||
"abode-import": "tsx --import ./src/meta/dev/register.ts src/bin/abode-import.ts",
|
||||
"abode-inspect": "tsx --import ./src/meta/dev/register.ts src/bin/abode-inspect.ts",
|
||||
"build": "NODE_ENV=production npm run build:impl",
|
||||
"build:impl": "rm -rf dist && tsx node_modules/.bin/webpack && chmod +x dist/bin/* && chmod -x dist/bin/*.*",
|
||||
"test": "node --import tsx/esm --import ./src/meta/dev/register.ts --test $(find test -name '*.test.ts' | sort)",
|
||||
|
||||
Reference in New Issue
Block a user