@@ -5,8 +5,10 @@ import { XMLParser } from 'fast-xml-parser';
55export const USER_METADATA_PREFIX = 'x-amz-meta-' ;
66
77
8- export const extendCommandWithExtraParametersMiddleware = ( query : string ) =>
9- ( next : any ) => async ( args : any ) => {
8+ export function extendCommandWithExtraParametersMiddleware ( query : string ) {
9+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10+ return ( next : any ) => async ( args : any ) => {
11+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1012 const request = args . request as any ;
1113 if ( request . query ) {
1214 request . query . search = query ;
@@ -15,86 +17,71 @@ export const extendCommandWithExtraParametersMiddleware = (query: string) =>
1517 }
1618 return next ( args ) ;
1719 } ;
20+ }
1821
1922
20- export const overrideObjectAttributesHeaderMiddleware =
21- ( headerName : string , attributes : string [ ] ) => ( next : any ) => async ( args : any ) => {
23+ export function overrideObjectAttributesHeaderMiddleware ( headerName : string , attributes : string [ ] ) {
24+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25+ return ( next : any ) => async ( args : any ) => {
2226 const request = args . request ;
2327 request . headers [ headerName ] = attributes . join ( ',' ) ;
2428 return next ( args ) ;
2529 } ;
30+ }
2631
27- // eslint-disable-next-line @typescript-eslint/no-explicit-any
28- export const captureResponseBodyMiddleware = ( captured : { xml : string } ) => ( next : any ) => async ( args : any ) => {
29- const { response } = await next ( args ) ;
32+ export function captureResponseBodyMiddleware ( captured : { xml : string } ) {
33+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34+ return ( next : any ) => async ( args : any ) => {
35+ const { response } = await next ( args ) ;
3036
31- if ( response ?. body ) {
32- const collected = await streamCollector ( response . body ) ;
33- const buffer = Buffer . from ( collected ) ;
34- // eslint-disable-next-line no-param-reassign
35- captured . xml = buffer . toString ( 'utf-8' ) ;
36- response . body = Readable . from ( [ buffer ] ) ;
37- }
37+ if ( response ?. body ) {
38+ const collected = await streamCollector ( response . body ) ;
39+ const buffer = Buffer . from ( collected ) ;
40+ // eslint-disable-next-line no-param-reassign
41+ captured . xml = buffer . toString ( 'utf-8' ) ;
42+ // Re-create the body stream so the SDK deserializer can still consume it
43+ response . body = Readable . from ( [ buffer ] ) ;
44+ }
3845
39- return { response } ;
40- } ;
46+ return { response } ;
47+ } ;
48+ }
4149
4250// eslint-disable-next-line @typescript-eslint/no-explicit-any
43- export function extractUserMetadata ( obj : Record < string , any > ) : Record < string , string > {
44- const metadata : Record < string , string > = { } ;
45- for ( const [ key , value ] of Object . entries ( obj ) ) {
51+ export function extractUserMetadata ( source : Record < string , any > , target : Record < string , string > ) : void {
52+ for ( const [ key , value ] of Object . entries ( source ) ) {
4653 if ( key . startsWith ( USER_METADATA_PREFIX ) ) {
47- metadata [ key ] = String ( value ) ;
54+ // eslint-disable-next-line no-param-reassign
55+ target [ key ] = String ( value ) ;
4856 }
4957 }
50- return metadata ;
51- }
52-
53- export function parseGetObjectAttributesUserMetadata ( xml : string ) : Record < string , string > {
54- const parsed = new XMLParser ( ) . parse ( xml ) ;
55- const response = parsed ?. GetObjectAttributesResponse ;
56- if ( ! response ) {
57- return { } ;
58- }
59- return extractUserMetadata ( response ) ;
6058}
6159
62- export function parseListObjectsUserMetadata ( xml : string ) : Map < string , Record < string , string > > {
63- const parsed = new XMLParser ( ) . parse ( xml ) ;
64- const result = parsed ?. ListBucketResult ;
65- if ( ! result ?. Contents ) {
66- return new Map ( ) ;
67- }
68- const contents = Array . isArray ( result . Contents ) ? result . Contents : [ result . Contents ] ;
69- const metadataByKey = new Map < string , Record < string , string > > ( ) ;
70- for ( const entry of contents ) {
71- const metadata = extractUserMetadata ( entry ) ;
72- if ( Object . keys ( metadata ) . length > 0 && entry . Key ) {
73- metadataByKey . set ( String ( entry . Key ) , metadata ) ;
60+ export function parseUserMetadataMiddleware ( captured : { xml : string } ) {
61+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62+ return ( next : any ) => async ( args : any ) => {
63+ const result = await next ( args ) ;
64+ const parsed = new XMLParser ( ) . parse ( captured . xml ) ;
65+ const response = parsed ?. GetObjectAttributesResponse ;
66+ if ( response ) {
67+ extractUserMetadata ( response , result . output ) ;
7468 }
75- }
76- return metadataByKey ;
69+ return result ;
70+ } ;
7771}
7872
79- // eslint-disable-next-line @typescript-eslint/no-explicit-any
80- export const parseUserMetadataMiddleware = ( captured : { xml : string } ) => ( next : any ) => async ( args : any ) => {
81- const result = await next ( args ) ;
82- Object . assign ( result . output , parseGetObjectAttributesUserMetadata ( captured . xml ) ) ;
83- return result ;
84- } ;
85-
8673
87- export const parseListObjectsUserMetadataMiddleware =
88- ( captured : { xml : string } ) => ( next : any ) => async ( args : any ) => {
74+ export function parseListObjectsUserMetadataMiddleware ( captured : { xml : string } ) {
75+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76+ return ( next : any ) => async ( args : any ) => {
8977 const result = await next ( args ) ;
90- const metadataByKey = parseListObjectsUserMetadata ( captured . xml ) ;
91- if ( result . output . Contents && metadataByKey . size > 0 ) {
92- for ( const content of result . output . Contents ) {
93- const metadata = metadataByKey . get ( content . Key ) ;
94- if ( metadata ) {
95- Object . assign ( content , metadata ) ;
96- }
78+ const parsed = new XMLParser ( ) . parse ( captured . xml ) ;
79+ const xmlContents = parsed ?. ListBucketResult ?. Contents ;
80+ if ( result . output . Contents && xmlContents ) {
81+ for ( let i = 0 ; i < result . output . Contents . length ; i ++ ) {
82+ extractUserMetadata ( xmlContents [ i ] , result . output . Contents [ i ] ) ;
9783 }
9884 }
9985 return result ;
10086 } ;
87+ }
0 commit comments