@@ -182,31 +182,35 @@ export async function exportActorProfile({
182
182
/**
183
183
* Imports an ActivityPub profile from a .tar archive stream.
184
184
* @param tarStream - A ReadableStream containing the .tar archive.
185
+ * @param options - Options for the import process.
185
186
* @returns A promise that resolves to the parsed profile data.
186
187
*/
187
188
export async function importActorProfile (
188
- tarStream : Readable
189
+ tarStream : Readable ,
190
+ options : {
191
+ console ?: Pick < Console , 'log' | 'warn' | 'error' >
192
+ onError ?: ( error : Error , context : { fileName ?: string } ) => void
193
+ } = { }
189
194
) : Promise < Record < string , any > > {
190
- console . log ( '🚀 Starting to process tar stream...' )
195
+ const { console = undefined , onError = undefined } = options
191
196
const extract = tar . extract ( )
192
197
const result : Record < string , any > = { }
193
198
194
199
return await new Promise ( ( resolve , reject ) => {
195
200
extract . on ( 'entry' , ( header , stream , next ) => {
196
- // Normalize fileName to include only `activitypub/filename`
197
201
const originalFileName = header . name
198
- const fileName = `activitypub/${ path . basename ( originalFileName ) } `
202
+ const basename = path . basename ( originalFileName )
203
+ console ?. log ( '🚀 ~ extract.on ~ basename:' , basename )
204
+ const fileName = `activitypub/${ basename } `
199
205
200
206
// Skip system-generated files
201
- if (
202
- fileName . startsWith ( 'activitypub/._' ) ||
203
- fileName . endsWith ( '.DS_Store' )
204
- ) {
205
- console . warn ( `Skipping system-generated file: ${ fileName } ` )
207
+ if ( basename . startsWith ( '.' ) ) {
208
+ console ?. warn ( `Skipping system-generated file: ${ fileName } ` )
206
209
next ( )
210
+ return
207
211
}
208
212
209
- console . log ( `Processing file: ${ fileName } ` )
213
+ console ? .log ( `Processing file: ${ fileName } ` )
210
214
let content = ''
211
215
212
216
stream . on ( 'data' , ( chunk ) => {
@@ -217,40 +221,58 @@ export async function importActorProfile(
217
221
try {
218
222
if ( fileName . endsWith ( '.json' ) ) {
219
223
result [ fileName ] = JSON . parse ( content )
220
- console . log ( 'Parsed JSON file successfully:' , fileName )
224
+ console ? .log ( 'Parsed JSON file successfully:' , fileName )
221
225
} else if ( fileName . endsWith ( '.yaml' ) || fileName . endsWith ( '.yml' ) ) {
222
226
result [ fileName ] = YAML . parse ( content )
223
227
} else if ( fileName . endsWith ( '.csv' ) ) {
224
228
result [ fileName ] = content
225
229
} else {
226
- console . warn ( `Unsupported file type: ${ fileName } , skipping...` )
230
+ console ? .warn ( `Unsupported file type: ${ fileName } , skipping...` )
227
231
}
228
232
} catch ( error : any ) {
229
- console . error ( `Error processing file ${ fileName } :` , error . message )
233
+ const errorMessage = `Error processing file ${ fileName } : ${ error . message } `
234
+ if ( onError ) {
235
+ onError ( new Error ( errorMessage ) , { fileName } )
236
+ } else {
237
+ reject ( new Error ( errorMessage ) )
238
+ }
230
239
} finally {
231
240
next ( ) // Always continue
232
241
}
233
242
} )
234
243
235
244
stream . on ( 'error' , ( error : any ) => {
236
- console . error ( `Stream error on file ${ fileName } :` , error . message )
245
+ const errorMessage = `Stream error on file ${ fileName } : ${ error . message } `
246
+ if ( onError ) {
247
+ onError ( new Error ( errorMessage ) , { fileName } )
248
+ } else {
249
+ reject ( new Error ( errorMessage ) )
250
+ }
237
251
next ( ) // Continue even on stream error
238
252
} )
239
253
} )
240
254
241
255
extract . on ( 'finish' , ( ) => {
242
- console . log ( 'All files processed successfully.' )
256
+ console ? .log ( 'All files processed successfully.' )
243
257
resolve ( result )
244
258
} )
245
259
246
260
extract . on ( 'error' , ( error ) => {
247
- console . error ( 'Error during tar extraction:' , error . message )
248
- reject ( new Error ( 'Failed to extract tar file.' ) )
261
+ const errorMessage = `Error during tar extraction: ${ error . message } `
262
+ if ( onError ) {
263
+ onError ( new Error ( errorMessage ) , { } )
264
+ } else {
265
+ reject ( new Error ( errorMessage ) )
266
+ }
249
267
} )
250
268
251
269
tarStream . on ( 'error' , ( error ) => {
252
- console . error ( 'Error in tar stream:' , error . message )
253
- reject ( new Error ( 'Failed to process tar stream.' ) )
270
+ const errorMessage = `Error in tar stream: ${ error . message } `
271
+ if ( onError ) {
272
+ onError ( new Error ( errorMessage ) , { } )
273
+ } else {
274
+ reject ( new Error ( errorMessage ) )
275
+ }
254
276
} )
255
277
256
278
tarStream . pipe ( extract )
0 commit comments