From 40b05c636435fde18ba70aac78af8d3c5a70feb4 Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Wed, 29 Jan 2025 23:54:26 +0200 Subject: [PATCH 1/7] Add CLI support for wallet-export with validation command and output options --- package.json | 7 +++++-- src/cli.ts | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/cli.ts diff --git a/package.json b/package.json index 95bbea2..27e43f5 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,12 @@ "name": "@interop/wallet-export-ts", "description": "A Javascript/Typescript library for exporting Universal Wallet Backup Containers.", "version": "0.1.6", + "bin": { + "wallet-export": "./dist/cli.js" + }, "scripts": { "build": "npm run clear && tsc -p tsconfig.json && ./build-dist.sh", - "clear": "rimraf dist/*", + "clear": "npx rimraf dist/*", "lint": "eslint .", "lint:fix": "eslint --fix .", "prepare": "npm run build", @@ -63,7 +66,7 @@ "mocha": "^10.2.0", "nyc": "^15.1.0", "prettier": "^3.1.0", - "rimraf": "^5.0.5", + "rimraf": "^5.0.10", "ts-node": "^10.9.1", "typescript": "^5.2.2" }, diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..4fb4896 --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,56 @@ +#!/usr/bin/env node + +import { parseArgs } from 'node:util' +import fs from 'node:fs' +import { type Readable } from 'node:stream' +import { validateExportStream } from './verify.js' + +// Parse command-line arguments +const { values, positionals } = parseArgs({ + options: { + output: { + type: 'string', + short: 'o' + } + }, + allowPositionals: true +}) + +const [command, filePath] = positionals + +if (command !== 'validate') { + console.error('Usage: wallet-export validate ') + process.exit(1) +} + +// Handle stdin (e.g., `cat file.tar | wallet-export validate /dev/stdin`) +const inputStream: Readable = + filePath === '/dev/stdin' ? process.stdin : fs.createReadStream(filePath) + +// Validate the archive +validateExportStream(inputStream) + .then(({ valid, errors }) => { + if (values.output === 'json') { + // Output errors as JSON + console.log(JSON.stringify({ valid, errors }, null, 2)) + } else { + // Output errors to stdio + if (valid) { + console.log('✅ Export is valid.') + } else { + console.error('❌ Export is invalid:') + errors.forEach((error) => { + console.error(`- ${error}`) + }) + } + } + + // Exit with appropriate code + if (!valid) { + process.exit(1) + } + }) + .catch((error) => { + console.error('An error occurred:', error) + process.exit(1) + }) From 163c9c41cd740b86900b4b8fa03c45dec5a1efc8 Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Thu, 30 Jan 2025 01:16:00 +0200 Subject: [PATCH 2/7] Refactor importActorProfile and validateExportStream functions to improve error handling, normalize file names, and skip system-generated files --- src/index.ts | 60 +++++++++++++++++++++++++++++++++++---------------- src/verify.ts | 16 +++++++++++++- 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3cf7a7a..072c8aa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -182,31 +182,35 @@ export async function exportActorProfile({ /** * Imports an ActivityPub profile from a .tar archive stream. * @param tarStream - A ReadableStream containing the .tar archive. + * @param options - Options for the import process. * @returns A promise that resolves to the parsed profile data. */ export async function importActorProfile( - tarStream: Readable + tarStream: Readable, + options: { + console?: Pick + onError?: (error: Error, context: { fileName?: string }) => void + } = {} ): Promise> { - console.log('🚀 Starting to process tar stream...') + const { console = undefined, onError = undefined } = options const extract = tar.extract() const result: Record = {} return await new Promise((resolve, reject) => { extract.on('entry', (header, stream, next) => { - // Normalize fileName to include only `activitypub/filename` const originalFileName = header.name - const fileName = `activitypub/${path.basename(originalFileName)}` + const basename = path.basename(originalFileName) + console?.log('🚀 ~ extract.on ~ basename:', basename) + const fileName = `activitypub/${basename}` // Skip system-generated files - if ( - fileName.startsWith('activitypub/._') || - fileName.endsWith('.DS_Store') - ) { - console.warn(`Skipping system-generated file: ${fileName}`) + if (basename.startsWith('.')) { + console?.warn(`Skipping system-generated file: ${fileName}`) next() + return } - console.log(`Processing file: ${fileName}`) + console?.log(`Processing file: ${fileName}`) let content = '' stream.on('data', (chunk) => { @@ -217,40 +221,58 @@ export async function importActorProfile( try { if (fileName.endsWith('.json')) { result[fileName] = JSON.parse(content) - console.log('Parsed JSON file successfully:', fileName) + console?.log('Parsed JSON file successfully:', fileName) } else if (fileName.endsWith('.yaml') || fileName.endsWith('.yml')) { result[fileName] = YAML.parse(content) } else if (fileName.endsWith('.csv')) { result[fileName] = content } else { - console.warn(`Unsupported file type: ${fileName}, skipping...`) + console?.warn(`Unsupported file type: ${fileName}, skipping...`) } } catch (error: any) { - console.error(`Error processing file ${fileName}:`, error.message) + const errorMessage = `Error processing file ${fileName}: ${error.message}` + if (onError) { + onError(new Error(errorMessage), { fileName }) + } else { + reject(new Error(errorMessage)) + } } finally { next() // Always continue } }) stream.on('error', (error: any) => { - console.error(`Stream error on file ${fileName}:`, error.message) + const errorMessage = `Stream error on file ${fileName}: ${error.message}` + if (onError) { + onError(new Error(errorMessage), { fileName }) + } else { + reject(new Error(errorMessage)) + } next() // Continue even on stream error }) }) extract.on('finish', () => { - console.log('All files processed successfully.') + console?.log('All files processed successfully.') resolve(result) }) extract.on('error', (error) => { - console.error('Error during tar extraction:', error.message) - reject(new Error('Failed to extract tar file.')) + const errorMessage = `Error during tar extraction: ${error.message}` + if (onError) { + onError(new Error(errorMessage), {}) + } else { + reject(new Error(errorMessage)) + } }) tarStream.on('error', (error) => { - console.error('Error in tar stream:', error.message) - reject(new Error('Failed to process tar stream.')) + const errorMessage = `Error in tar stream: ${error.message}` + if (onError) { + onError(new Error(errorMessage), {}) + } else { + reject(new Error(errorMessage)) + } }) tarStream.pipe(extract) diff --git a/src/verify.ts b/src/verify.ts index f47e943..77d03e5 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -1,6 +1,7 @@ import * as tar from 'tar-stream' import { type Readable } from 'stream' import YAML from 'yaml' +import path from 'path' /** * Validates the structure and content of an exported ActivityPub tarball. @@ -22,7 +23,20 @@ export async function validateExportStream( return await new Promise((resolve) => { extract.on('entry', (header, stream, next) => { - const fileName = header.name.toLowerCase() // Normalize file name + const originalFileName = header.name + const basename = path.basename(originalFileName) + console?.log('🚀 ~ extract.on ~ basename:', basename) + const fileName = + basename === 'manifest.yaml' + ? 'manifest.yaml' + : `activitypub/${basename}` + + // Skip system-generated files + if (basename.startsWith('.')) { + console?.warn(`Skipping system-generated file: ${fileName}`) + next() + return + } foundFiles.add(fileName) let content = '' From ad75e6d18c9b860735074db12172b433f83057b7 Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Thu, 30 Jan 2025 01:19:02 +0200 Subject: [PATCH 3/7] fix test-node action --- out/test-export-2024-01-01.tar | Bin 5120 -> 5120 bytes test/index.spec.ts | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/out/test-export-2024-01-01.tar b/out/test-export-2024-01-01.tar index 46bc8660163cf0d763e0cec1f31236717bc90773..a9557eef3dec5a0b4a393acaddeedf2c5ef77ff8 100644 GIT binary patch delta 146 zcmZqBXwaC@Eo5S5YHVz3Vx(YTXlQC=s=#16Igv4CGb3XcBeI-#S)Yl4p#fZu6IIU8+!&#c_dgo|WZfW> delta 146 zcmZqBXwaC@Eo5vC1SVz%3I>LTrp9Ip45pJ48B;bhGIlW{%NZD%8o}k5QRR%y49yi7 e3?TYgyO@#nnHU%u!sR$o { packStream.pipe(tarball) // Ensure the tarball finishes writing - await new Promise((resolve, reject) => { - tarball.on('finish', resolve) - tarball.on('error', reject) - }) + // await new Promise((resolve, reject) => { + // // tarball.on('finish', resolve) + // // tarball.on('error', reject) + // }) }) }) From c2417d3bcdce738187e438557a20158facfaf305 Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Thu, 30 Jan 2025 01:21:57 +0200 Subject: [PATCH 4/7] Remove debug log from validateExportStream function --- src/verify.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/verify.ts b/src/verify.ts index 77d03e5..85127c3 100644 --- a/src/verify.ts +++ b/src/verify.ts @@ -25,7 +25,6 @@ export async function validateExportStream( extract.on('entry', (header, stream, next) => { const originalFileName = header.name const basename = path.basename(originalFileName) - console?.log('🚀 ~ extract.on ~ basename:', basename) const fileName = basename === 'manifest.yaml' ? 'manifest.yaml' From 1666668a666e32a63346f1c82b9e0c2593d75ba0 Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Tue, 11 Feb 2025 18:24:21 +0200 Subject: [PATCH 5/7] Refactor importActorProfile function to improve error handling and remove unused options --- out/test-export-2024-01-01.tar | Bin 5120 -> 5120 bytes src/index.ts | 27 +++++++-------------------- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/out/test-export-2024-01-01.tar b/out/test-export-2024-01-01.tar index a9557eef3dec5a0b4a393acaddeedf2c5ef77ff8..790a729246534034f2049aa926a5d251bd9e607b 100644 GIT binary patch delta 146 zcmZqBXwaC@Eo5qBW^Qb1V5neVXlQC=q`+W0Igv4CGb3XcBeI-#S)Yl4fhk;$6IIU8+!&#c_dgo|U?L!c delta 146 zcmZqBXwaC@Eo5S5YHVz3Vx(YTXlQC=s=#16Igv4CGb3XcBeI-#S)Yl4p#fZu6IIU8+!&#c_dgo|WZfW> diff --git a/src/index.ts b/src/index.ts index 072c8aa..2eb7482 100644 --- a/src/index.ts +++ b/src/index.ts @@ -192,7 +192,7 @@ export async function importActorProfile( onError?: (error: Error, context: { fileName?: string }) => void } = {} ): Promise> { - const { console = undefined, onError = undefined } = options + const { console = undefined } = options const extract = tar.extract() const result: Record = {} @@ -242,13 +242,8 @@ export async function importActorProfile( }) stream.on('error', (error: any) => { - const errorMessage = `Stream error on file ${fileName}: ${error.message}` - if (onError) { - onError(new Error(errorMessage), { fileName }) - } else { - reject(new Error(errorMessage)) - } - next() // Continue even on stream error + console?.error(`Stream error on file ${fileName}:`, error.message) + next(error) // Continue even on stream error }) }) @@ -258,21 +253,13 @@ export async function importActorProfile( }) extract.on('error', (error) => { - const errorMessage = `Error during tar extraction: ${error.message}` - if (onError) { - onError(new Error(errorMessage), {}) - } else { - reject(new Error(errorMessage)) - } + console?.error('Error during tar extraction:', error.message) + reject(new Error('Failed to extract tar file.')) }) tarStream.on('error', (error) => { - const errorMessage = `Error in tar stream: ${error.message}` - if (onError) { - onError(new Error(errorMessage), {}) - } else { - reject(new Error(errorMessage)) - } + console?.error('Error in tar stream:', error.message) + reject(new Error('Failed to process tar stream.')) }) tarStream.pipe(extract) From 89f761e0c1446af1e50a98c971dd750b7fcbad6e Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Mon, 17 Feb 2025 19:27:16 +0200 Subject: [PATCH 6/7] Refactor importActorProfile function to streamline error handling and remove redundant console logs --- src/index.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2eb7482..181a036 100644 --- a/src/index.ts +++ b/src/index.ts @@ -230,12 +230,7 @@ export async function importActorProfile( console?.warn(`Unsupported file type: ${fileName}, skipping...`) } } catch (error: any) { - const errorMessage = `Error processing file ${fileName}: ${error.message}` - if (onError) { - onError(new Error(errorMessage), { fileName }) - } else { - reject(new Error(errorMessage)) - } + next(error) } finally { next() // Always continue } From 53446a376cbe61a42a06f55f6479cce37b7878b5 Mon Sep 17 00:00:00 2001 From: Omar Salah Date: Tue, 18 Feb 2025 13:26:36 +0200 Subject: [PATCH 7/7] Add CLI support and improve importActorProfile function with enhanced options and error handling --- dist/cli.d.ts | 3 +++ dist/cli.d.ts.map | 1 + dist/cli.js | 55 ++++++++++++++++++++++++++++++++++++++++++++ dist/cli.js.map | 1 + dist/index.d.ts | 8 ++++++- dist/index.d.ts.map | 2 +- dist/index.js | 34 ++++++++++++++------------- dist/index.js.map | 2 +- dist/verify.d.ts.map | 2 +- dist/verify.js | 13 ++++++++++- dist/verify.js.map | 2 +- 11 files changed, 101 insertions(+), 22 deletions(-) create mode 100644 dist/cli.d.ts create mode 100644 dist/cli.d.ts.map create mode 100644 dist/cli.js create mode 100644 dist/cli.js.map diff --git a/dist/cli.d.ts b/dist/cli.d.ts new file mode 100644 index 0000000..faaadd5 --- /dev/null +++ b/dist/cli.d.ts @@ -0,0 +1,3 @@ +#!/usr/bin/env node +export {}; +//# sourceMappingURL=cli.d.ts.map \ No newline at end of file diff --git a/dist/cli.d.ts.map b/dist/cli.d.ts.map new file mode 100644 index 0000000..f022439 --- /dev/null +++ b/dist/cli.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/cli.js b/dist/cli.js new file mode 100644 index 0000000..901a612 --- /dev/null +++ b/dist/cli.js @@ -0,0 +1,55 @@ +#!/usr/bin/env node +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_util_1 = require("node:util"); +const node_fs_1 = __importDefault(require("node:fs")); +const verify_js_1 = require("./verify.js"); +// Parse command-line arguments +const { values, positionals } = (0, node_util_1.parseArgs)({ + options: { + output: { + type: 'string', + short: 'o' + } + }, + allowPositionals: true +}); +const [command, filePath] = positionals; +if (command !== 'validate') { + console.error('Usage: wallet-export validate '); + process.exit(1); +} +// Handle stdin (e.g., `cat file.tar | wallet-export validate /dev/stdin`) +const inputStream = filePath === '/dev/stdin' ? process.stdin : node_fs_1.default.createReadStream(filePath); +// Validate the archive +(0, verify_js_1.validateExportStream)(inputStream) + .then(({ valid, errors }) => { + if (values.output === 'json') { + // Output errors as JSON + console.log(JSON.stringify({ valid, errors }, null, 2)); + } + else { + // Output errors to stdio + if (valid) { + console.log('✅ Export is valid.'); + } + else { + console.error('❌ Export is invalid:'); + errors.forEach((error) => { + console.error(`- ${error}`); + }); + } + } + // Exit with appropriate code + if (!valid) { + process.exit(1); + } +}) + .catch((error) => { + console.error('An error occurred:', error); + process.exit(1); +}); +//# sourceMappingURL=cli.js.map \ No newline at end of file diff --git a/dist/cli.js.map b/dist/cli.js.map new file mode 100644 index 0000000..70bd21a --- /dev/null +++ b/dist/cli.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAqC;AACrC,sDAAwB;AAExB,2CAAkD;AAElD,+BAA+B;AAC/B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,qBAAS,EAAC;IACxC,OAAO,EAAE;QACP,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,GAAG;SACX;KACF;IACD,gBAAgB,EAAE,IAAI;CACvB,CAAC,CAAA;AAEF,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAA;AAEvC,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAA;IACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,0EAA0E;AAC1E,MAAM,WAAW,GACf,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;AAE3E,uBAAuB;AACvB,IAAA,gCAAoB,EAAC,WAAW,CAAC;KAC9B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,wBAAwB;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACvB,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAA;YAC7B,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index e55c530..85c327e 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -24,8 +24,14 @@ export declare function exportActorProfile({ actorProfile, outbox, followers, fo /** * Imports an ActivityPub profile from a .tar archive stream. * @param tarStream - A ReadableStream containing the .tar archive. + * @param options - Options for the import process. * @returns A promise that resolves to the parsed profile data. */ -export declare function importActorProfile(tarStream: Readable): Promise>; +export declare function importActorProfile(tarStream: Readable, options?: { + console?: Pick; + onError?: (error: Error, context: { + fileName?: string; + }) => void; +}): Promise>; export * from './verify'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index b7feeff..d5bdb42 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AAGjC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,iBAAiB,CAAC,EAAE,GAAG,CAAA;IACvB,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,eAAe,CAAC,EAAE,GAAG,CAAA;IACrB,cAAc,CAAC,EAAE,GAAG,CAAA;IACpB,aAAa,CAAC,EAAE,GAAG,CAAA;CACpB;AAED,wBAAsB,kBAAkB,CAAC,EACvC,YAAY,EACZ,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,KAAK,EACL,SAAS,EACT,KAAK,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACd,EAAE,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC;IACpD,YAAY,EAAE,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAA;IACT,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,CAAA;CACzB,CAAC,CA2ID;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,QAAQ,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAqE9B;AAyBD,cAAc,UAAU,CAAA"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AAGjC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,MAAM,CAAC,EAAE,GAAG,CAAA;IACZ,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,iBAAiB,CAAC,EAAE,GAAG,CAAA;IACvB,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,eAAe,CAAC,EAAE,GAAG,CAAA;IACrB,cAAc,CAAC,EAAE,GAAG,CAAA;IACpB,aAAa,CAAC,EAAE,GAAG,CAAA;CACpB;AAED,wBAAsB,kBAAkB,CAAC,EACvC,YAAY,EACZ,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,KAAK,EACL,SAAS,EACT,KAAK,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACd,EAAE,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC;IACpD,YAAY,EAAE,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAA;IACT,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,CAAA;CACzB,CAAC,CA2ID;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,QAAQ,EACnB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAC5D,GACL,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAoE9B;AAyBD,cAAc,UAAU,CAAA"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 38603c0..b0ae6a1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -146,24 +146,26 @@ async function exportActorProfile({ actorProfile, outbox, followers, followingAc /** * Imports an ActivityPub profile from a .tar archive stream. * @param tarStream - A ReadableStream containing the .tar archive. + * @param options - Options for the import process. * @returns A promise that resolves to the parsed profile data. */ -async function importActorProfile(tarStream) { - console.log('🚀 Starting to process tar stream...'); +async function importActorProfile(tarStream, options = {}) { + const { console = undefined } = options; const extract = tar.extract(); const result = {}; return await new Promise((resolve, reject) => { extract.on('entry', (header, stream, next) => { - // Normalize fileName to include only `activitypub/filename` const originalFileName = header.name; - const fileName = `activitypub/${path_1.default.basename(originalFileName)}`; + const basename = path_1.default.basename(originalFileName); + console?.log('🚀 ~ extract.on ~ basename:', basename); + const fileName = `activitypub/${basename}`; // Skip system-generated files - if (fileName.startsWith('activitypub/._') || - fileName.endsWith('.DS_Store')) { - console.warn(`Skipping system-generated file: ${fileName}`); + if (basename.startsWith('.')) { + console?.warn(`Skipping system-generated file: ${fileName}`); next(); + return; } - console.log(`Processing file: ${fileName}`); + console?.log(`Processing file: ${fileName}`); let content = ''; stream.on('data', (chunk) => { content += chunk.toString(); @@ -172,7 +174,7 @@ async function importActorProfile(tarStream) { try { if (fileName.endsWith('.json')) { result[fileName] = JSON.parse(content); - console.log('Parsed JSON file successfully:', fileName); + console?.log('Parsed JSON file successfully:', fileName); } else if (fileName.endsWith('.yaml') || fileName.endsWith('.yml')) { result[fileName] = yaml_1.default.parse(content); @@ -181,31 +183,31 @@ async function importActorProfile(tarStream) { result[fileName] = content; } else { - console.warn(`Unsupported file type: ${fileName}, skipping...`); + console?.warn(`Unsupported file type: ${fileName}, skipping...`); } } catch (error) { - console.error(`Error processing file ${fileName}:`, error.message); + next(error); } finally { next(); // Always continue } }); stream.on('error', (error) => { - console.error(`Stream error on file ${fileName}:`, error.message); - next(); // Continue even on stream error + console?.error(`Stream error on file ${fileName}:`, error.message); + next(error); // Continue even on stream error }); }); extract.on('finish', () => { - console.log('All files processed successfully.'); + console?.log('All files processed successfully.'); resolve(result); }); extract.on('error', (error) => { - console.error('Error during tar extraction:', error.message); + console?.error('Error during tar extraction:', error.message); reject(new Error('Failed to extract tar file.')); }); tarStream.on('error', (error) => { - console.error('Error in tar stream:', error.message); + console?.error('Error in tar stream:', error.message); reject(new Error('Failed to process tar stream.')); }); tarStream.pipe(extract); diff --git a/dist/index.js.map b/dist/index.js.map index 765ed7b..d7e55d2 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/verify.d.ts.map b/dist/verify.d.ts.map index 09f8a58..e593b60 100644 --- a/dist/verify.d.ts.map +++ b/dist/verify.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAGtC;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,QAAQ,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA6E/C"} \ No newline at end of file +{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAItC;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,QAAQ,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAyF/C"} \ No newline at end of file diff --git a/dist/verify.js b/dist/verify.js index acee0ee..ea774ff 100644 --- a/dist/verify.js +++ b/dist/verify.js @@ -39,6 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.validateExportStream = validateExportStream; const tar = __importStar(require("tar-stream")); const yaml_1 = __importDefault(require("yaml")); +const path_1 = __importDefault(require("path")); /** * Validates the structure and content of an exported ActivityPub tarball. * @param tarStream - A ReadableStream containing the .tar archive. @@ -56,7 +57,17 @@ async function validateExportStream(tarStream) { const foundFiles = new Set(); return await new Promise((resolve) => { extract.on('entry', (header, stream, next) => { - const fileName = header.name.toLowerCase(); // Normalize file name + const originalFileName = header.name; + const basename = path_1.default.basename(originalFileName); + const fileName = basename === 'manifest.yaml' + ? 'manifest.yaml' + : `activitypub/${basename}`; + // Skip system-generated files + if (basename.startsWith('.')) { + console?.warn(`Skipping system-generated file: ${fileName}`); + next(); + return; + } foundFiles.add(fileName); let content = ''; stream.on('data', (chunk) => { diff --git a/dist/verify.js.map b/dist/verify.js.map index 5a711c7..81fe6c6 100644 --- a/dist/verify.js.map +++ b/dist/verify.js.map @@ -1 +1 @@ -{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"} \ No newline at end of file