@@ -10,21 +10,25 @@ import assert from 'assert'
1010import { Readable } from 'stream'
1111import Upath from 'upath'
1212import { Fs } from './interface'
13+ import { EventEmitter } from 'events'
1314
1415
1516export interface S3FsOptions {
1617 root : string
1718 client : S3Client
19+ eventEmitter ?: EventEmitter
1820}
1921
2022
2123export class S3Fs implements Fs {
2224 public readonly client : S3Client
2325 private root : string
26+ private eventEmitter ?: EventEmitter
2427
2528 constructor ( options : S3FsOptions ) {
2629 this . client = options . client
2730 this . root = Upath . normalizeTrim ( options . root )
31+ this . eventEmitter = options . eventEmitter
2832 splitPath ( this . root )
2933 }
3034
@@ -52,7 +56,8 @@ export class S3Fs implements Fs {
5256 cd ( ...path : string [ ] ) : S3Fs {
5357 return new S3Fs ( {
5458 client : this . client ,
55- root : this . resolve ( path )
59+ root : this . resolve ( path ) ,
60+ eventEmitter : this . eventEmitter
5661 } )
5762 }
5863
@@ -74,6 +79,7 @@ export class S3Fs implements Fs {
7479 ContinuationToken
7580 } )
7681 )
82+ this . eventEmitter ?. emit ( 'S3FsOperation' , 'ListObjectsV2' )
7783
7884 // process folder names
7985 if ( res . CommonPrefixes ) {
@@ -116,6 +122,7 @@ export class S3Fs implements Fs {
116122 Key,
117123 Body : content
118124 } ) )
125+ this . eventEmitter ?. emit ( 'S3FsOperation' , 'PutObject' )
119126 }
120127
121128 async delete ( path : string ) : Promise < void > {
@@ -129,6 +136,7 @@ export class S3Fs implements Fs {
129136 ContinuationToken
130137 } )
131138 )
139+ this . eventEmitter ?. emit ( 'S3FsOperation' , 'ListObjectsV2' )
132140
133141 if ( list . Contents ) {
134142 let Objects : ObjectIdentifier [ ] = [ ]
@@ -144,6 +152,7 @@ export class S3Fs implements Fs {
144152 Objects
145153 }
146154 } ) )
155+ this . eventEmitter ?. emit ( 'S3FsOperation' , 'DeleteObjects' )
147156 }
148157
149158 if ( list . IsTruncated ) {
@@ -160,6 +169,7 @@ export class S3Fs implements Fs {
160169 Bucket,
161170 Key
162171 } ) )
172+ this . eventEmitter ?. emit ( 'S3FsOperation' , 'GetObject' )
163173 assert ( res . Body instanceof Readable )
164174 return res . Body
165175 }
0 commit comments