@cibule/storage-s3 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/dts/packages/di/src/index.d.ts +1 -0
  2. package/dist/dts/packages/di/src/index.d.ts.map +1 -1
  3. package/dist/dts/packages/di/src/lib/run-in-injection-context.d.ts +3 -0
  4. package/dist/dts/packages/di/src/lib/run-in-injection-context.d.ts.map +1 -0
  5. package/dist/dts/packages/storage/src/index.d.ts +2 -1
  6. package/dist/dts/packages/storage/src/index.d.ts.map +1 -1
  7. package/dist/dts/packages/storage/src/lib/file-storage-types.d.ts +1 -0
  8. package/dist/dts/packages/storage/src/lib/file-storage-types.d.ts.map +1 -1
  9. package/dist/dts/packages/storage/src/lib/file-storage.d.ts +3 -3
  10. package/dist/dts/packages/storage/src/lib/file-storage.d.ts.map +1 -1
  11. package/dist/dts/packages/storage/src/lib/in-memory-file-storage.d.ts +3 -3
  12. package/dist/dts/packages/storage/src/lib/in-memory-file-storage.d.ts.map +1 -1
  13. package/dist/dts/packages/storage/src/lib/local-file-storage.d.ts +3 -3
  14. package/dist/dts/packages/storage/src/lib/local-file-storage.d.ts.map +1 -1
  15. package/dist/dts/packages/storage/src/lib/provider.d.ts +4 -0
  16. package/dist/dts/packages/storage/src/lib/provider.d.ts.map +1 -0
  17. package/dist/dts/packages/storage/src/lib/to-uint8-array.d.ts +2 -1
  18. package/dist/dts/packages/storage/src/lib/to-uint8-array.d.ts.map +1 -1
  19. package/dist/dts/packages/storage-s3/src/lib/s3-file-storage.d.ts +3 -3
  20. package/dist/dts/packages/storage-s3/src/lib/s3-file-storage.d.ts.map +1 -1
  21. package/dist/dts/packages/storage-s3/src/lib/s3-multipart.d.ts +2 -2
  22. package/dist/dts/packages/storage-s3/src/lib/s3-multipart.d.ts.map +1 -1
  23. package/dist/index.cjs +56 -0
  24. package/dist/index.cjs.map +3 -3
  25. package/dist/index.js +59 -0
  26. package/dist/index.js.map +3 -3
  27. package/package.json +2 -2
@@ -3,5 +3,6 @@ export { Injectable } from './lib/injectable';
3
3
  export { InjectionToken } from './lib/injection-token';
4
4
  export { Injector } from './lib/injector';
5
5
  export type { ClassProvider, FactoryProvider, InjectOptions, Provider, SingleProvider, ValueProvider, } from './lib/provider';
6
+ export { runInInjectionContext } from './lib/run-in-injection-context';
6
7
  export type { AbstractType, Token, Type } from './lib/token';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../di/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../di/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,QAAQ,EACR,cAAc,EACd,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Injector } from './injector';
2
+ export declare function runInInjectionContext<T>(injector: Injector, fn: () => T): T;
3
+ //# sourceMappingURL=run-in-injection-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-in-injection-context.d.ts","sourceRoot":"","sources":["../../../../../../../di/src/lib/run-in-injection-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE3E"}
@@ -2,10 +2,11 @@ export { createReadableStream } from './lib/create-readable-stream';
2
2
  export { FileStorage } from './lib/file-storage';
3
3
  export type { FileStorageAccessor } from './lib/file-storage-accessor';
4
4
  export { FILE_STORAGE_ACCESSOR } from './lib/file-storage-accessor';
5
- export type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions, } from './lib/file-storage-types';
5
+ export type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions, UploadData, } from './lib/file-storage-types';
6
6
  export { InMemoryFileStorage } from './lib/in-memory-file-storage';
7
7
  export type { LocalFileStorageConfig } from './lib/local-file-storage';
8
8
  export { LocalFileStorage } from './lib/local-file-storage';
9
+ export { provideFileStorageAccessor } from './lib/provider';
9
10
  export type { StoredFile } from './lib/stored-file';
10
11
  export { toUint8Array } from './lib/to-uint8-array';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../storage/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../storage/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,UAAU,GACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
@@ -40,4 +40,5 @@ export interface CompletedPart {
40
40
  readonly partNumber: number;
41
41
  readonly etag: string;
42
42
  }
43
+ export type UploadData = ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array | Blob;
43
44
  //# sourceMappingURL=file-storage-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-storage-types.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/file-storage-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"file-storage-types.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/file-storage-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC"}
@@ -1,6 +1,6 @@
1
- import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions } from './file-storage-types';
1
+ import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions, UploadData } from './file-storage-types';
2
2
  export declare abstract class FileStorage {
3
- abstract upload(key: string, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array, options?: FileUploadOptions): Promise<void>;
3
+ abstract upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void>;
4
4
  abstract download(key: string): Promise<FileStorageObject>;
5
5
  abstract head(key: string): Promise<HeadResult | null>;
6
6
  abstract delete(key: string): Promise<void>;
@@ -12,7 +12,7 @@ export declare abstract class FileStorage {
12
12
  abstract createPresignedUploadUrl(key: string, options?: PresignOptions): Promise<PresignedUploadUrl | null>;
13
13
  abstract initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;
14
14
  abstract createPresignedPartUrls(key: string, uploadId: string, parts: number[]): Promise<PresignedPartUrl[]>;
15
- abstract uploadPart(key: string, uploadId: string, partNumber: number, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array): Promise<string>;
15
+ abstract uploadPart(key: string, uploadId: string, partNumber: number, data: UploadData): Promise<string>;
16
16
  abstract completeMultipartUpload(key: string, uploadId: string, parts: CompletedPart[]): Promise<void>;
17
17
  abstract abortMultipartUpload(key: string, uploadId: string): Promise<void>;
18
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/file-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAE9B,8BAAsB,WAAW;IAC/B,QAAQ,CAAC,MAAM,CACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,EAC3D,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAE1D,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAEtD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3C,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAErD,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAE1C,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAE7C,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAEzF,QAAQ,CAAC,eAAe,CACtB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAEtC,QAAQ,CAAC,wBAAwB,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAErC,QAAQ,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAE3E,QAAQ,CAAC,uBAAuB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAE9B,QAAQ,CAAC,UAAU,CACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAC1D,OAAO,CAAC,MAAM,CAAC;IAElB,QAAQ,CAAC,uBAAuB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAC5E"}
1
+ {"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,sBAAsB,CAAC;AAE9B,8BACsB,WAAW;IAC/B,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1F,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAE1D,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAEtD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3C,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAErD,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAE1C,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAE7C,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAEzF,QAAQ,CAAC,eAAe,CACtB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAEtC,QAAQ,CAAC,wBAAwB,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAErC,QAAQ,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAE3E,QAAQ,CAAC,uBAAuB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAE9B,QAAQ,CAAC,UAAU,CACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC;IAElB,QAAQ,CAAC,uBAAuB,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAEhB,QAAQ,CAAC,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAC5E"}
@@ -1,11 +1,11 @@
1
1
  import { FileStorage } from './file-storage';
2
- import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions } from './file-storage-types';
2
+ import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions, UploadData } from './file-storage-types';
3
3
  export declare class InMemoryFileStorage extends FileStorage {
4
4
  private readonly store;
5
5
  private readonly uploads;
6
6
  private readonly baseUrl;
7
7
  constructor(baseUrl?: string);
8
- upload(key: string, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array, options?: FileUploadOptions): Promise<void>;
8
+ upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void>;
9
9
  download(key: string): Promise<FileStorageObject>;
10
10
  head(key: string): Promise<HeadResult | null>;
11
11
  delete(key: string): Promise<void>;
@@ -17,7 +17,7 @@ export declare class InMemoryFileStorage extends FileStorage {
17
17
  createPresignedUploadUrl(_key: string, _options?: PresignOptions): Promise<PresignedUploadUrl | null>;
18
18
  initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;
19
19
  createPresignedPartUrls(_key: string, _uploadId: string, _parts: number[]): Promise<PresignedPartUrl[]>;
20
- uploadPart(_key: string, uploadId: string, partNumber: number, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array): Promise<string>;
20
+ uploadPart(_key: string, uploadId: string, partNumber: number, data: UploadData): Promise<string>;
21
21
  completeMultipartUpload(_key: string, uploadId: string, parts: CompletedPart[]): Promise<void>;
22
22
  abortMultipartUpload(_key: string, uploadId: string): Promise<void>;
23
23
  clear(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-file-storage.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/in-memory-file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAM9B,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEd,OAAO,SAAc;IAK3B,MAAM,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,EAC3D,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAYT,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgBjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAW7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIjC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIpC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAahF,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAU/B,wBAAwB,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI9B,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMlE,uBAAuB,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIjB,UAAU,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAC1D,OAAO,CAAC,MAAM,CAAC;IAOX,uBAAuB,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAkBT,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE,KAAK,IAAI,IAAI;IAKpB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;CAKzB"}
1
+ {"version":3,"file":"in-memory-file-storage.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/in-memory-file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,sBAAsB,CAAC;AAM9B,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEd,OAAO,SAAc;IAK3B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgBjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAW7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIjC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIpC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAahF,eAAe,CACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAU/B,wBAAwB,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAI9B,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMlE,uBAAuB,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIjB,UAAU,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC;IAOX,uBAAuB,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAkBT,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE,KAAK,IAAI,IAAI;IAKpB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;CAKzB"}
@@ -1,5 +1,5 @@
1
1
  import { FileStorage } from './file-storage';
2
- import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions } from './file-storage-types';
2
+ import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions, UploadData } from './file-storage-types';
3
3
  export interface LocalFileStorageConfig {
4
4
  readonly basePath: string;
5
5
  }
@@ -7,7 +7,7 @@ export declare class LocalFileStorage extends FileStorage {
7
7
  private readonly basePath;
8
8
  private readonly partsDir;
9
9
  constructor(config: LocalFileStorageConfig);
10
- upload(key: string, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array, _options?: FileUploadOptions): Promise<void>;
10
+ upload(key: string, data: UploadData, _options?: FileUploadOptions): Promise<void>;
11
11
  download(key: string): Promise<FileStorageObject>;
12
12
  head(key: string): Promise<HeadResult | null>;
13
13
  delete(key: string): Promise<void>;
@@ -19,7 +19,7 @@ export declare class LocalFileStorage extends FileStorage {
19
19
  createPresignedUploadUrl(_key: string, _options?: PresignOptions): Promise<PresignedUploadUrl | null>;
20
20
  initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;
21
21
  createPresignedPartUrls(_key: string, _uploadId: string, _parts: number[]): Promise<PresignedPartUrl[]>;
22
- uploadPart(_key: string, uploadId: string, partNumber: number, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array): Promise<string>;
22
+ uploadPart(_key: string, uploadId: string, partNumber: number, data: UploadData): Promise<string>;
23
23
  completeMultipartUpload(key: string, uploadId: string, parts: CompletedPart[]): Promise<void>;
24
24
  abortMultipartUpload(_key: string, uploadId: string): Promise<void>;
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-file-storage.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/local-file-storage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAc9B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEf,MAAM,EAAE,sBAAsB;IAMpC,MAAM,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,EAC3D,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAOH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAcjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAe7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUlD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIjC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI9B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQhF,eAAe,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAO/B,wBAAwB,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIxB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMxE,uBAAuB,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIjB,UAAU,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAC1D,OAAO,CAAC,MAAM,CAAC;IAQL,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjF"}
1
+ {"version":3,"file":"local-file-storage.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/local-file-storage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,sBAAsB,CAAC;AAc9B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEf,MAAM,EAAE,sBAAsB;IAMpC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAcjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAe7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUlD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIjC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI9B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAQhF,eAAe,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAO/B,wBAAwB,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIxB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMxE,uBAAuB,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIjB,UAAU,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC;IAQL,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjF"}
@@ -0,0 +1,4 @@
1
+ import type { Provider } from '@cibule/di';
2
+ import type { FileStorageAccessor } from './file-storage-accessor';
3
+ export declare function provideFileStorageAccessor(factory: () => FileStorageAccessor): Provider;
4
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,mBAAmB,GAAG,QAAQ,CAEvF"}
@@ -1,2 +1,3 @@
1
- export declare function toUint8Array(input: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array): Promise<Uint8Array>;
1
+ import type { UploadData } from './file-storage-types';
2
+ export declare function toUint8Array(input: UploadData): Promise<Uint8Array>;
2
3
  //# sourceMappingURL=to-uint8-array.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-uint8-array.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/to-uint8-array.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAChC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAC3D,OAAO,CAAC,UAAU,CAAC,CAmBrB"}
1
+ {"version":3,"file":"to-uint8-array.d.ts","sourceRoot":"","sources":["../../../../../../../storage/src/lib/to-uint8-array.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBzE"}
@@ -1,4 +1,4 @@
1
- import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions } from '@cibule/storage';
1
+ import type { CompletedPart, FileStorageObject, FileUploadOptions, HeadResult, MultipartUploadInit, PresignedPartUrl, PresignedUploadUrl, PresignOptions, UploadData } from '@cibule/storage';
2
2
  import { FileStorage } from '@cibule/storage';
3
3
  import type { S3FileStorageConfig } from './s3-file-storage-config';
4
4
  export declare class S3FileStorage extends FileStorage {
@@ -7,7 +7,7 @@ export declare class S3FileStorage extends FileStorage {
7
7
  private readonly publicUrlBase;
8
8
  private readonly defaultPresignExpiresIn;
9
9
  constructor(config: S3FileStorageConfig);
10
- upload(key: string, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array, options?: FileUploadOptions): Promise<void>;
10
+ upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void>;
11
11
  download(key: string): Promise<FileStorageObject>;
12
12
  head(key: string): Promise<HeadResult | null>;
13
13
  delete(key: string): Promise<void>;
@@ -19,7 +19,7 @@ export declare class S3FileStorage extends FileStorage {
19
19
  createPresignedUploadUrl(key: string, options?: PresignOptions): Promise<PresignedUploadUrl>;
20
20
  initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;
21
21
  createPresignedPartUrls(key: string, uploadId: string, parts: number[]): Promise<PresignedPartUrl[]>;
22
- uploadPart(key: string, uploadId: string, partNumber: number, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array): Promise<string>;
22
+ uploadPart(key: string, uploadId: string, partNumber: number, data: UploadData): Promise<string>;
23
23
  completeMultipartUpload(key: string, uploadId: string, parts: CompletedPart[]): Promise<void>;
24
24
  abortMultipartUpload(key: string, uploadId: string): Promise<void>;
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"s3-file-storage.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/s3-file-storage.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAWpE,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;gBAE9B,MAAM,EAAE,mBAAmB;IAUjC,MAAM,CACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,EAC3D,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAcH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAc7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2BlD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOjC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM/B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhF,eAAe,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAIzB,wBAAwB,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC;IAUjB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIlE,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAWjB,UAAU,CACrB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAC1D,OAAO,CAAC,MAAM,CAAC;IAIL,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAIH,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhF"}
1
+ {"version":3,"file":"s3-file-storage.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/s3-file-storage.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAWpE,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;gBAE9B,MAAM,EAAE,mBAAmB;IAUjC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAc7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2BlD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOjC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM/B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAIhF,eAAe,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAIzB,wBAAwB,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC;IAUjB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIlE,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAWjB,UAAU,CACrB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC;IAIL,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC;IAIH,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhF"}
@@ -1,7 +1,7 @@
1
1
  import type { S3Client } from '@aws-sdk/client-s3';
2
- import type { CompletedPart, MultipartUploadInit } from '@cibule/storage';
2
+ import type { CompletedPart, MultipartUploadInit, UploadData } from '@cibule/storage';
3
3
  export declare function initiateS3MultipartUpload(client: S3Client, bucket: string, key: string): Promise<MultipartUploadInit>;
4
- export declare function uploadS3Part(client: S3Client, bucket: string, key: string, uploadId: string, partNumber: number, data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array): Promise<string>;
4
+ export declare function uploadS3Part(client: S3Client, bucket: string, key: string, uploadId: string, partNumber: number, data: UploadData): Promise<string>;
5
5
  export declare function completeS3MultipartUpload(client: S3Client, bucket: string, key: string, uploadId: string, parts: CompletedPart[]): Promise<void>;
6
6
  export declare function abortS3MultipartUpload(client: S3Client, bucket: string, key: string, uploadId: string): Promise<void>;
7
7
  //# sourceMappingURL=s3-multipart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"s3-multipart.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/s3-multipart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,GAC1D,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
1
+ {"version":3,"file":"s3-multipart.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/s3-multipart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtF,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAIf"}
package/dist/index.cjs CHANGED
@@ -1,8 +1,15 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
8
+ var __typeError = (msg) => {
9
+ throw TypeError(msg);
10
+ };
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
13
  var __export = (target, all) => {
7
14
  for (var name in all)
8
15
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +23,44 @@ var __copyProps = (to, from, except, desc) => {
16
23
  return to;
17
24
  };
18
25
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
27
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
28
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
29
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
30
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
31
+ var __runInitializers = (array, flags, self, value) => {
32
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
33
+ return value;
34
+ };
35
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
36
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
37
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
38
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
39
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
40
+ return __privateGet(this, extra);
41
+ }, set [name](x) {
42
+ return __privateSet(this, extra, x);
43
+ } }, name));
44
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
45
+ for (var i = decorators.length - 1; i >= 0; i--) {
46
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
47
+ if (k) {
48
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
49
+ if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
50
+ if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
51
+ }
52
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
53
+ if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
54
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
55
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
56
+ }
57
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
58
+ };
59
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
60
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
61
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
62
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
63
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
19
64
 
20
65
  // src/index.ts
21
66
  var index_exports = {};
@@ -29,9 +74,20 @@ module.exports = __toCommonJS(index_exports);
29
74
  // src/lib/s3-file-storage.ts
30
75
  var import_client_s34 = require("@aws-sdk/client-s3");
31
76
 
77
+ // ../di/src/lib/injectable.ts
78
+ function Injectable() {
79
+ return () => {
80
+ };
81
+ }
82
+
32
83
  // ../storage/src/lib/file-storage.ts
84
+ var _FileStorage_decorators, _init;
85
+ _FileStorage_decorators = [Injectable()];
33
86
  var FileStorage = class {
34
87
  };
88
+ _init = __decoratorStart(null);
89
+ FileStorage = __decorateElement(_init, 0, "FileStorage", _FileStorage_decorators, FileStorage);
90
+ __runInitializers(_init, 1, FileStorage);
35
91
 
36
92
  // src/lib/is-not-found-error.ts
37
93
  function hasNotFoundMetadata(error) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/lib/s3-file-storage.ts", "../../storage/src/lib/file-storage.ts", "../src/lib/is-not-found-error.ts", "../src/lib/s3-download-range.ts", "../src/lib/s3-multipart.ts", "../src/lib/s3-presigned.ts", "../src/lib/s3-response-to-head-result.ts", "../src/lib/s3-response-to-storage-object.ts"],
4
- "sourcesContent": ["export { S3FileStorage } from './lib/s3-file-storage';\nexport type { S3FileStorageConfig } from './lib/s3-file-storage-config';\nexport { createS3PresignedGetUrl, DEFAULT_PRESIGN_EXPIRES_IN } from './lib/s3-presigned';\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n} from '@aws-sdk/client-s3';\nimport type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n} from '@cibule/storage';\nimport { FileStorage } from '@cibule/storage';\n\nimport { isNotFoundError } from './is-not-found-error';\nimport { downloadS3Partial, downloadS3Range } from './s3-download-range';\nimport type { S3FileStorageConfig } from './s3-file-storage-config';\nimport {\n abortS3MultipartUpload,\n completeS3MultipartUpload,\n initiateS3MultipartUpload,\n uploadS3Part,\n} from './s3-multipart';\nimport { createS3PresignedPartUrls, createS3PresignedPutUrl } from './s3-presigned';\nimport { s3ResponseToHeadResult } from './s3-response-to-head-result';\nimport { s3ResponseToStorageObject } from './s3-response-to-storage-object';\n\nexport class S3FileStorage extends FileStorage {\n private readonly client: S3Client;\n private readonly bucket: string;\n private readonly publicUrlBase: string | undefined;\n private readonly defaultPresignExpiresIn: number;\n\n public constructor(config: S3FileStorageConfig) {\n super();\n this.client = config.client;\n this.bucket = config.bucket;\n this.publicUrlBase = config.publicUrlBase\n ? `${config.publicUrlBase.replace(/\\/+$/, '')}/`\n : undefined;\n this.defaultPresignExpiresIn = config.defaultPresignExpiresIn ?? 3600;\n }\n\n public async upload(\n key: string,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n options?: FileUploadOptions,\n ): Promise<void> {\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: data as PutObjectCommand['input']['Body'],\n ContentType: options?.contentType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n }),\n );\n }\n\n public async download(key: string): Promise<FileStorageObject> {\n const response = await this.client.send(\n new GetObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToStorageObject(key, response);\n }\n\n public async head(key: string): Promise<HeadResult | null> {\n try {\n const response = await this.client.send(\n new HeadObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToHeadResult(response);\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n public async delete(key: string): Promise<void> {\n await this.client.send(new DeleteObjectCommand({ Bucket: this.bucket, Key: key }));\n }\n\n public async listKeys(prefix?: string): Promise<string[]> {\n const keys: string[] = [];\n let continuationToken: string | undefined;\n\n do {\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: prefix,\n ContinuationToken: continuationToken,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key) {\n keys.push(obj.Key);\n }\n }\n }\n\n continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;\n } while (continuationToken);\n\n return keys;\n }\n\n public getPublicUrl(key: string): string {\n if (!this.publicUrlBase) {\n throw new Error('publicUrlBase is required for getPublicUrl');\n }\n return `${this.publicUrlBase}${key}`;\n }\n\n public getProtectedUrl(_key: string): string {\n throw new Error(\n 'Use createPresignedUploadUrl() or createS3PresignedGetUrl() for presigned URLs',\n );\n }\n\n public async downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer> {\n return downloadS3Range(this.client, this.bucket, key, offset, length);\n }\n\n public async downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>> {\n return downloadS3Partial(this.client, this.bucket, key, start, end);\n }\n\n public async createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl> {\n return createS3PresignedPutUrl(\n this.client,\n this.bucket,\n key,\n options,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async initiateMultipartUpload(key: string): Promise<MultipartUploadInit> {\n return initiateS3MultipartUpload(this.client, this.bucket, key);\n }\n\n public async createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]> {\n return createS3PresignedPartUrls(\n this.client,\n this.bucket,\n key,\n uploadId,\n parts,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n ): Promise<string> {\n return uploadS3Part(this.client, this.bucket, key, uploadId, partNumber, data);\n }\n\n public async completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void> {\n return completeS3MultipartUpload(this.client, this.bucket, key, uploadId, parts);\n }\n\n public async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n return abortS3MultipartUpload(this.client, this.bucket, key, uploadId);\n }\n}\n", "import type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n} from './file-storage-types';\n\nexport abstract class FileStorage {\n abstract upload(\n key: string,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n options?: FileUploadOptions,\n ): Promise<void>;\n\n abstract download(key: string): Promise<FileStorageObject>;\n\n abstract head(key: string): Promise<HeadResult | null>;\n\n abstract delete(key: string): Promise<void>;\n\n abstract listKeys(prefix?: string): Promise<string[]>;\n\n abstract getPublicUrl(key: string): string;\n\n abstract getProtectedUrl(key: string): string;\n\n abstract downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer>;\n\n abstract downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>>;\n\n abstract createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl | null>;\n\n abstract initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;\n\n abstract createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]>;\n\n abstract uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n ): Promise<string>;\n\n abstract completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void>;\n\n abstract abortMultipartUpload(key: string, uploadId: string): Promise<void>;\n}\n", "interface S3ErrorMetadata {\n readonly httpStatusCode?: number;\n}\n\nfunction hasNotFoundMetadata(error: Error): boolean {\n if (!('$metadata' in error)) return false;\n\n const metadata = error.$metadata;\n if (typeof metadata !== 'object' || metadata === null) return false;\n\n return (metadata as S3ErrorMetadata).httpStatusCode === 404;\n}\n\nexport function isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const { name } = error;\n if (name === 'NotFound' || name === 'NoSuchKey' || name === '404') return true;\n\n return hasNotFoundMetadata(error);\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\n\nexport async function downloadS3Range(\n client: S3Client,\n bucket: string,\n key: string,\n offset: number,\n length: number,\n): Promise<ArrayBuffer> {\n if (offset < 0) {\n throw new Error('offset must be non-negative');\n }\n if (length <= 0) {\n throw new Error('length must be positive');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(offset)}-${String(offset + length - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n const bytes = await response.Body.transformToByteArray();\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n}\n\nexport async function downloadS3Partial(\n client: S3Client,\n bucket: string,\n key: string,\n start: number,\n end: number,\n): Promise<ReadableStream<Uint8Array>> {\n if (start >= end) {\n throw new Error('start must be less than end');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(start)}-${String(end - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return response.Body.transformToWebStream() as ReadableStream<Uint8Array>;\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CreateMultipartUploadCommand,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport type { CompletedPart, MultipartUploadInit } from '@cibule/storage';\n\nexport async function initiateS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n): Promise<MultipartUploadInit> {\n const response = await client.send(\n new CreateMultipartUploadCommand({ Bucket: bucket, Key: key }),\n );\n\n if (!response.UploadId) {\n throw new Error(`Failed to initiate multipart upload for key: ${key}`);\n }\n\n return { uploadId: response.UploadId, key };\n}\n\nexport async function uploadS3Part(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n partNumber: number,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n): Promise<string> {\n const response = await client.send(\n new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n Body: data as UploadPartCommand['input']['Body'],\n }),\n );\n\n if (!response.ETag) {\n throw new Error(\n `Missing ETag in upload part response for key: ${key}, part: ${String(partNumber)}`,\n );\n }\n\n return response.ETag;\n}\n\nexport async function completeS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n): Promise<void> {\n await client.send(\n new CompleteMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: parts.map(p => ({ PartNumber: p.partNumber, ETag: p.etag })),\n },\n }),\n );\n}\n\nexport async function abortS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n): Promise<void> {\n await client.send(\n new AbortMultipartUploadCommand({ Bucket: bucket, Key: key, UploadId: uploadId }),\n );\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand, PutObjectCommand, UploadPartCommand } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { PresignedPartUrl, PresignedUploadUrl, PresignOptions } from '@cibule/storage';\n\nexport const DEFAULT_PRESIGN_EXPIRES_IN = 3600;\n\nexport async function createS3PresignedGetUrl(\n client: S3Client,\n bucket: string,\n key: string,\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<string> {\n return getSignedUrl(client, new GetObjectCommand({ Bucket: bucket, Key: key }), { expiresIn });\n}\n\nexport async function createS3PresignedPutUrl(\n client: S3Client,\n bucket: string,\n key: string,\n options?: PresignOptions,\n defaultExpiresIn?: number,\n): Promise<PresignedUploadUrl> {\n const expiresIn = options?.expiresInSeconds ?? defaultExpiresIn ?? DEFAULT_PRESIGN_EXPIRES_IN;\n const command = new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ContentType: options?.contentType,\n });\n\n const url = await getSignedUrl(client, command, { expiresIn });\n const headers = options?.contentType ? { 'Content-Type': options.contentType } : undefined;\n\n return { url, headers };\n}\n\nexport async function createS3PresignedPartUrls(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: number[],\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<PresignedPartUrl[]> {\n return Promise.all(\n parts.map(async partNumber => {\n const command = new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n });\n const url = await getSignedUrl(client, command, { expiresIn });\n return { partNumber, url };\n }),\n );\n}\n", "import type { HeadObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { HeadResult } from '@cibule/storage';\n\nexport function s3ResponseToHeadResult(response: HeadObjectCommandOutput): HeadResult {\n return {\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n", "import type { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { FileStorageObject } from '@cibule/storage';\n\nexport function s3ResponseToStorageObject(\n key: string,\n response: GetObjectCommandOutput,\n): FileStorageObject {\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return {\n key,\n body: response.Body.transformToWebStream() as ReadableStream<Uint8Array>,\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/index.ts", "../src/lib/s3-file-storage.ts", "../../di/src/lib/injectable.ts", "../../storage/src/lib/file-storage.ts", "../src/lib/is-not-found-error.ts", "../src/lib/s3-download-range.ts", "../src/lib/s3-multipart.ts", "../src/lib/s3-presigned.ts", "../src/lib/s3-response-to-head-result.ts", "../src/lib/s3-response-to-storage-object.ts"],
4
+ "sourcesContent": ["export { S3FileStorage } from './lib/s3-file-storage';\nexport type { S3FileStorageConfig } from './lib/s3-file-storage-config';\nexport { createS3PresignedGetUrl, DEFAULT_PRESIGN_EXPIRES_IN } from './lib/s3-presigned';\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n} from '@aws-sdk/client-s3';\nimport type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n UploadData,\n} from '@cibule/storage';\nimport { FileStorage } from '@cibule/storage';\n\nimport { isNotFoundError } from './is-not-found-error';\nimport { downloadS3Partial, downloadS3Range } from './s3-download-range';\nimport type { S3FileStorageConfig } from './s3-file-storage-config';\nimport {\n abortS3MultipartUpload,\n completeS3MultipartUpload,\n initiateS3MultipartUpload,\n uploadS3Part,\n} from './s3-multipart';\nimport { createS3PresignedPartUrls, createS3PresignedPutUrl } from './s3-presigned';\nimport { s3ResponseToHeadResult } from './s3-response-to-head-result';\nimport { s3ResponseToStorageObject } from './s3-response-to-storage-object';\n\nexport class S3FileStorage extends FileStorage {\n private readonly client: S3Client;\n private readonly bucket: string;\n private readonly publicUrlBase: string | undefined;\n private readonly defaultPresignExpiresIn: number;\n\n public constructor(config: S3FileStorageConfig) {\n super();\n this.client = config.client;\n this.bucket = config.bucket;\n this.publicUrlBase = config.publicUrlBase\n ? `${config.publicUrlBase.replace(/\\/+$/, '')}/`\n : undefined;\n this.defaultPresignExpiresIn = config.defaultPresignExpiresIn ?? 3600;\n }\n\n public async upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void> {\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: data as PutObjectCommand['input']['Body'],\n ContentType: options?.contentType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n }),\n );\n }\n\n public async download(key: string): Promise<FileStorageObject> {\n const response = await this.client.send(\n new GetObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToStorageObject(key, response);\n }\n\n public async head(key: string): Promise<HeadResult | null> {\n try {\n const response = await this.client.send(\n new HeadObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToHeadResult(response);\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n public async delete(key: string): Promise<void> {\n await this.client.send(new DeleteObjectCommand({ Bucket: this.bucket, Key: key }));\n }\n\n public async listKeys(prefix?: string): Promise<string[]> {\n const keys: string[] = [];\n let continuationToken: string | undefined;\n\n do {\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: prefix,\n ContinuationToken: continuationToken,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key) {\n keys.push(obj.Key);\n }\n }\n }\n\n continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;\n } while (continuationToken);\n\n return keys;\n }\n\n public getPublicUrl(key: string): string {\n if (!this.publicUrlBase) {\n throw new Error('publicUrlBase is required for getPublicUrl');\n }\n return `${this.publicUrlBase}${key}`;\n }\n\n public getProtectedUrl(_key: string): string {\n throw new Error(\n 'Use createPresignedUploadUrl() or createS3PresignedGetUrl() for presigned URLs',\n );\n }\n\n public async downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer> {\n return downloadS3Range(this.client, this.bucket, key, offset, length);\n }\n\n public async downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>> {\n return downloadS3Partial(this.client, this.bucket, key, start, end);\n }\n\n public async createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl> {\n return createS3PresignedPutUrl(\n this.client,\n this.bucket,\n key,\n options,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async initiateMultipartUpload(key: string): Promise<MultipartUploadInit> {\n return initiateS3MultipartUpload(this.client, this.bucket, key);\n }\n\n public async createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]> {\n return createS3PresignedPartUrls(\n this.client,\n this.bucket,\n key,\n uploadId,\n parts,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: UploadData,\n ): Promise<string> {\n return uploadS3Part(this.client, this.bucket, key, uploadId, partNumber, data);\n }\n\n public async completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void> {\n return completeS3MultipartUpload(this.client, this.bucket, key, uploadId, parts);\n }\n\n public async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n return abortS3MultipartUpload(this.client, this.bucket, key, uploadId);\n }\n}\n", "import type { AbstractType, Type } from './token';\n\nexport function Injectable(): (target: Type<unknown> | AbstractType<unknown>) => void {\n return (): void => {};\n}\n", "import { Injectable } from '@cibule/di';\n\nimport type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n UploadData,\n} from './file-storage-types';\n\n@Injectable()\nexport abstract class FileStorage {\n abstract upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void>;\n\n abstract download(key: string): Promise<FileStorageObject>;\n\n abstract head(key: string): Promise<HeadResult | null>;\n\n abstract delete(key: string): Promise<void>;\n\n abstract listKeys(prefix?: string): Promise<string[]>;\n\n abstract getPublicUrl(key: string): string;\n\n abstract getProtectedUrl(key: string): string;\n\n abstract downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer>;\n\n abstract downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>>;\n\n abstract createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl | null>;\n\n abstract initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;\n\n abstract createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]>;\n\n abstract uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: UploadData,\n ): Promise<string>;\n\n abstract completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void>;\n\n abstract abortMultipartUpload(key: string, uploadId: string): Promise<void>;\n}\n", "interface S3ErrorMetadata {\n readonly httpStatusCode?: number;\n}\n\nfunction hasNotFoundMetadata(error: Error): boolean {\n if (!('$metadata' in error)) return false;\n\n const metadata = error.$metadata;\n if (typeof metadata !== 'object' || metadata === null) return false;\n\n return (metadata as S3ErrorMetadata).httpStatusCode === 404;\n}\n\nexport function isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const { name } = error;\n if (name === 'NotFound' || name === 'NoSuchKey' || name === '404') return true;\n\n return hasNotFoundMetadata(error);\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\n\nexport async function downloadS3Range(\n client: S3Client,\n bucket: string,\n key: string,\n offset: number,\n length: number,\n): Promise<ArrayBuffer> {\n if (offset < 0) {\n throw new Error('offset must be non-negative');\n }\n if (length <= 0) {\n throw new Error('length must be positive');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(offset)}-${String(offset + length - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n const bytes = await response.Body.transformToByteArray();\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n}\n\nexport async function downloadS3Partial(\n client: S3Client,\n bucket: string,\n key: string,\n start: number,\n end: number,\n): Promise<ReadableStream<Uint8Array>> {\n if (start >= end) {\n throw new Error('start must be less than end');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(start)}-${String(end - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return response.Body.transformToWebStream() as ReadableStream<Uint8Array>;\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CreateMultipartUploadCommand,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport type { CompletedPart, MultipartUploadInit, UploadData } from '@cibule/storage';\n\nexport async function initiateS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n): Promise<MultipartUploadInit> {\n const response = await client.send(\n new CreateMultipartUploadCommand({ Bucket: bucket, Key: key }),\n );\n\n if (!response.UploadId) {\n throw new Error(`Failed to initiate multipart upload for key: ${key}`);\n }\n\n return { uploadId: response.UploadId, key };\n}\n\nexport async function uploadS3Part(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n partNumber: number,\n data: UploadData,\n): Promise<string> {\n const response = await client.send(\n new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n Body: data as UploadPartCommand['input']['Body'],\n }),\n );\n\n if (!response.ETag) {\n throw new Error(\n `Missing ETag in upload part response for key: ${key}, part: ${String(partNumber)}`,\n );\n }\n\n return response.ETag;\n}\n\nexport async function completeS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n): Promise<void> {\n await client.send(\n new CompleteMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: parts.map(p => ({ PartNumber: p.partNumber, ETag: p.etag })),\n },\n }),\n );\n}\n\nexport async function abortS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n): Promise<void> {\n await client.send(\n new AbortMultipartUploadCommand({ Bucket: bucket, Key: key, UploadId: uploadId }),\n );\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand, PutObjectCommand, UploadPartCommand } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { PresignedPartUrl, PresignedUploadUrl, PresignOptions } from '@cibule/storage';\n\nexport const DEFAULT_PRESIGN_EXPIRES_IN = 3600;\n\nexport async function createS3PresignedGetUrl(\n client: S3Client,\n bucket: string,\n key: string,\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<string> {\n return getSignedUrl(client, new GetObjectCommand({ Bucket: bucket, Key: key }), { expiresIn });\n}\n\nexport async function createS3PresignedPutUrl(\n client: S3Client,\n bucket: string,\n key: string,\n options?: PresignOptions,\n defaultExpiresIn?: number,\n): Promise<PresignedUploadUrl> {\n const expiresIn = options?.expiresInSeconds ?? defaultExpiresIn ?? DEFAULT_PRESIGN_EXPIRES_IN;\n const command = new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ContentType: options?.contentType,\n });\n\n const url = await getSignedUrl(client, command, { expiresIn });\n const headers = options?.contentType ? { 'Content-Type': options.contentType } : undefined;\n\n return { url, headers };\n}\n\nexport async function createS3PresignedPartUrls(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: number[],\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<PresignedPartUrl[]> {\n return Promise.all(\n parts.map(async partNumber => {\n const command = new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n });\n const url = await getSignedUrl(client, command, { expiresIn });\n return { partNumber, url };\n }),\n );\n}\n", "import type { HeadObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { HeadResult } from '@cibule/storage';\n\nexport function s3ResponseToHeadResult(response: HeadObjectCommandOutput): HeadResult {\n return {\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n", "import type { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { FileStorageObject } from '@cibule/storage';\n\nexport function s3ResponseToStorageObject(\n key: string,\n response: GetObjectCommandOutput,\n): FileStorageObject {\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return {\n key,\n body: response.Body.transformToWebStream() as ReadableStream<Uint8Array>,\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_client_s3", "import_client_s3", "import_client_s3"]
7
7
  }
package/dist/index.js CHANGED
@@ -1,3 +1,51 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
5
+ var __typeError = (msg) => {
6
+ throw TypeError(msg);
7
+ };
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
11
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
12
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
13
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
14
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
15
+ var __runInitializers = (array, flags, self, value) => {
16
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
17
+ return value;
18
+ };
19
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
20
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
21
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
22
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
23
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : { get [name]() {
24
+ return __privateGet(this, extra);
25
+ }, set [name](x) {
26
+ return __privateSet(this, extra, x);
27
+ } }, name));
28
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
29
+ for (var i = decorators.length - 1; i >= 0; i--) {
30
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
31
+ if (k) {
32
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => name in x };
33
+ if (k ^ 3) access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
34
+ if (k > 2) access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
35
+ }
36
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? void 0 : { get: desc.get, set: desc.set } : target, ctx), done._ = 1;
37
+ if (k ^ 4 || it === void 0) __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
38
+ else if (typeof it !== "object" || it === null) __typeError("Object expected");
39
+ else __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
40
+ }
41
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
42
+ };
43
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
44
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
45
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
46
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
47
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
48
+
1
49
  // src/lib/s3-file-storage.ts
2
50
  import {
3
51
  DeleteObjectCommand,
@@ -7,9 +55,20 @@ import {
7
55
  PutObjectCommand as PutObjectCommand2
8
56
  } from "@aws-sdk/client-s3";
9
57
 
58
+ // ../di/src/lib/injectable.ts
59
+ function Injectable() {
60
+ return () => {
61
+ };
62
+ }
63
+
10
64
  // ../storage/src/lib/file-storage.ts
65
+ var _FileStorage_decorators, _init;
66
+ _FileStorage_decorators = [Injectable()];
11
67
  var FileStorage = class {
12
68
  };
69
+ _init = __decoratorStart(null);
70
+ FileStorage = __decorateElement(_init, 0, "FileStorage", _FileStorage_decorators, FileStorage);
71
+ __runInitializers(_init, 1, FileStorage);
13
72
 
14
73
  // src/lib/is-not-found-error.ts
15
74
  function hasNotFoundMetadata(error) {
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/lib/s3-file-storage.ts", "../../storage/src/lib/file-storage.ts", "../src/lib/is-not-found-error.ts", "../src/lib/s3-download-range.ts", "../src/lib/s3-multipart.ts", "../src/lib/s3-presigned.ts", "../src/lib/s3-response-to-head-result.ts", "../src/lib/s3-response-to-storage-object.ts"],
4
- "sourcesContent": ["import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n} from '@aws-sdk/client-s3';\nimport type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n} from '@cibule/storage';\nimport { FileStorage } from '@cibule/storage';\n\nimport { isNotFoundError } from './is-not-found-error';\nimport { downloadS3Partial, downloadS3Range } from './s3-download-range';\nimport type { S3FileStorageConfig } from './s3-file-storage-config';\nimport {\n abortS3MultipartUpload,\n completeS3MultipartUpload,\n initiateS3MultipartUpload,\n uploadS3Part,\n} from './s3-multipart';\nimport { createS3PresignedPartUrls, createS3PresignedPutUrl } from './s3-presigned';\nimport { s3ResponseToHeadResult } from './s3-response-to-head-result';\nimport { s3ResponseToStorageObject } from './s3-response-to-storage-object';\n\nexport class S3FileStorage extends FileStorage {\n private readonly client: S3Client;\n private readonly bucket: string;\n private readonly publicUrlBase: string | undefined;\n private readonly defaultPresignExpiresIn: number;\n\n public constructor(config: S3FileStorageConfig) {\n super();\n this.client = config.client;\n this.bucket = config.bucket;\n this.publicUrlBase = config.publicUrlBase\n ? `${config.publicUrlBase.replace(/\\/+$/, '')}/`\n : undefined;\n this.defaultPresignExpiresIn = config.defaultPresignExpiresIn ?? 3600;\n }\n\n public async upload(\n key: string,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n options?: FileUploadOptions,\n ): Promise<void> {\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: data as PutObjectCommand['input']['Body'],\n ContentType: options?.contentType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n }),\n );\n }\n\n public async download(key: string): Promise<FileStorageObject> {\n const response = await this.client.send(\n new GetObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToStorageObject(key, response);\n }\n\n public async head(key: string): Promise<HeadResult | null> {\n try {\n const response = await this.client.send(\n new HeadObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToHeadResult(response);\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n public async delete(key: string): Promise<void> {\n await this.client.send(new DeleteObjectCommand({ Bucket: this.bucket, Key: key }));\n }\n\n public async listKeys(prefix?: string): Promise<string[]> {\n const keys: string[] = [];\n let continuationToken: string | undefined;\n\n do {\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: prefix,\n ContinuationToken: continuationToken,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key) {\n keys.push(obj.Key);\n }\n }\n }\n\n continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;\n } while (continuationToken);\n\n return keys;\n }\n\n public getPublicUrl(key: string): string {\n if (!this.publicUrlBase) {\n throw new Error('publicUrlBase is required for getPublicUrl');\n }\n return `${this.publicUrlBase}${key}`;\n }\n\n public getProtectedUrl(_key: string): string {\n throw new Error(\n 'Use createPresignedUploadUrl() or createS3PresignedGetUrl() for presigned URLs',\n );\n }\n\n public async downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer> {\n return downloadS3Range(this.client, this.bucket, key, offset, length);\n }\n\n public async downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>> {\n return downloadS3Partial(this.client, this.bucket, key, start, end);\n }\n\n public async createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl> {\n return createS3PresignedPutUrl(\n this.client,\n this.bucket,\n key,\n options,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async initiateMultipartUpload(key: string): Promise<MultipartUploadInit> {\n return initiateS3MultipartUpload(this.client, this.bucket, key);\n }\n\n public async createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]> {\n return createS3PresignedPartUrls(\n this.client,\n this.bucket,\n key,\n uploadId,\n parts,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n ): Promise<string> {\n return uploadS3Part(this.client, this.bucket, key, uploadId, partNumber, data);\n }\n\n public async completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void> {\n return completeS3MultipartUpload(this.client, this.bucket, key, uploadId, parts);\n }\n\n public async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n return abortS3MultipartUpload(this.client, this.bucket, key, uploadId);\n }\n}\n", "import type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n} from './file-storage-types';\n\nexport abstract class FileStorage {\n abstract upload(\n key: string,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n options?: FileUploadOptions,\n ): Promise<void>;\n\n abstract download(key: string): Promise<FileStorageObject>;\n\n abstract head(key: string): Promise<HeadResult | null>;\n\n abstract delete(key: string): Promise<void>;\n\n abstract listKeys(prefix?: string): Promise<string[]>;\n\n abstract getPublicUrl(key: string): string;\n\n abstract getProtectedUrl(key: string): string;\n\n abstract downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer>;\n\n abstract downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>>;\n\n abstract createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl | null>;\n\n abstract initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;\n\n abstract createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]>;\n\n abstract uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n ): Promise<string>;\n\n abstract completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void>;\n\n abstract abortMultipartUpload(key: string, uploadId: string): Promise<void>;\n}\n", "interface S3ErrorMetadata {\n readonly httpStatusCode?: number;\n}\n\nfunction hasNotFoundMetadata(error: Error): boolean {\n if (!('$metadata' in error)) return false;\n\n const metadata = error.$metadata;\n if (typeof metadata !== 'object' || metadata === null) return false;\n\n return (metadata as S3ErrorMetadata).httpStatusCode === 404;\n}\n\nexport function isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const { name } = error;\n if (name === 'NotFound' || name === 'NoSuchKey' || name === '404') return true;\n\n return hasNotFoundMetadata(error);\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\n\nexport async function downloadS3Range(\n client: S3Client,\n bucket: string,\n key: string,\n offset: number,\n length: number,\n): Promise<ArrayBuffer> {\n if (offset < 0) {\n throw new Error('offset must be non-negative');\n }\n if (length <= 0) {\n throw new Error('length must be positive');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(offset)}-${String(offset + length - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n const bytes = await response.Body.transformToByteArray();\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n}\n\nexport async function downloadS3Partial(\n client: S3Client,\n bucket: string,\n key: string,\n start: number,\n end: number,\n): Promise<ReadableStream<Uint8Array>> {\n if (start >= end) {\n throw new Error('start must be less than end');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(start)}-${String(end - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return response.Body.transformToWebStream() as ReadableStream<Uint8Array>;\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CreateMultipartUploadCommand,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport type { CompletedPart, MultipartUploadInit } from '@cibule/storage';\n\nexport async function initiateS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n): Promise<MultipartUploadInit> {\n const response = await client.send(\n new CreateMultipartUploadCommand({ Bucket: bucket, Key: key }),\n );\n\n if (!response.UploadId) {\n throw new Error(`Failed to initiate multipart upload for key: ${key}`);\n }\n\n return { uploadId: response.UploadId, key };\n}\n\nexport async function uploadS3Part(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n partNumber: number,\n data: ReadableStream<Uint8Array> | ArrayBuffer | Uint8Array,\n): Promise<string> {\n const response = await client.send(\n new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n Body: data as UploadPartCommand['input']['Body'],\n }),\n );\n\n if (!response.ETag) {\n throw new Error(\n `Missing ETag in upload part response for key: ${key}, part: ${String(partNumber)}`,\n );\n }\n\n return response.ETag;\n}\n\nexport async function completeS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n): Promise<void> {\n await client.send(\n new CompleteMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: parts.map(p => ({ PartNumber: p.partNumber, ETag: p.etag })),\n },\n }),\n );\n}\n\nexport async function abortS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n): Promise<void> {\n await client.send(\n new AbortMultipartUploadCommand({ Bucket: bucket, Key: key, UploadId: uploadId }),\n );\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand, PutObjectCommand, UploadPartCommand } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { PresignedPartUrl, PresignedUploadUrl, PresignOptions } from '@cibule/storage';\n\nexport const DEFAULT_PRESIGN_EXPIRES_IN = 3600;\n\nexport async function createS3PresignedGetUrl(\n client: S3Client,\n bucket: string,\n key: string,\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<string> {\n return getSignedUrl(client, new GetObjectCommand({ Bucket: bucket, Key: key }), { expiresIn });\n}\n\nexport async function createS3PresignedPutUrl(\n client: S3Client,\n bucket: string,\n key: string,\n options?: PresignOptions,\n defaultExpiresIn?: number,\n): Promise<PresignedUploadUrl> {\n const expiresIn = options?.expiresInSeconds ?? defaultExpiresIn ?? DEFAULT_PRESIGN_EXPIRES_IN;\n const command = new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ContentType: options?.contentType,\n });\n\n const url = await getSignedUrl(client, command, { expiresIn });\n const headers = options?.contentType ? { 'Content-Type': options.contentType } : undefined;\n\n return { url, headers };\n}\n\nexport async function createS3PresignedPartUrls(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: number[],\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<PresignedPartUrl[]> {\n return Promise.all(\n parts.map(async partNumber => {\n const command = new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n });\n const url = await getSignedUrl(client, command, { expiresIn });\n return { partNumber, url };\n }),\n );\n}\n", "import type { HeadObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { HeadResult } from '@cibule/storage';\n\nexport function s3ResponseToHeadResult(response: HeadObjectCommandOutput): HeadResult {\n return {\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n", "import type { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { FileStorageObject } from '@cibule/storage';\n\nexport function s3ResponseToStorageObject(\n key: string,\n response: GetObjectCommandOutput,\n): FileStorageObject {\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return {\n key,\n body: response.Body.transformToWebStream() as ReadableStream<Uint8Array>,\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/lib/s3-file-storage.ts", "../../di/src/lib/injectable.ts", "../../storage/src/lib/file-storage.ts", "../src/lib/is-not-found-error.ts", "../src/lib/s3-download-range.ts", "../src/lib/s3-multipart.ts", "../src/lib/s3-presigned.ts", "../src/lib/s3-response-to-head-result.ts", "../src/lib/s3-response-to-storage-object.ts"],
4
+ "sourcesContent": ["import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand,\n} from '@aws-sdk/client-s3';\nimport type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n UploadData,\n} from '@cibule/storage';\nimport { FileStorage } from '@cibule/storage';\n\nimport { isNotFoundError } from './is-not-found-error';\nimport { downloadS3Partial, downloadS3Range } from './s3-download-range';\nimport type { S3FileStorageConfig } from './s3-file-storage-config';\nimport {\n abortS3MultipartUpload,\n completeS3MultipartUpload,\n initiateS3MultipartUpload,\n uploadS3Part,\n} from './s3-multipart';\nimport { createS3PresignedPartUrls, createS3PresignedPutUrl } from './s3-presigned';\nimport { s3ResponseToHeadResult } from './s3-response-to-head-result';\nimport { s3ResponseToStorageObject } from './s3-response-to-storage-object';\n\nexport class S3FileStorage extends FileStorage {\n private readonly client: S3Client;\n private readonly bucket: string;\n private readonly publicUrlBase: string | undefined;\n private readonly defaultPresignExpiresIn: number;\n\n public constructor(config: S3FileStorageConfig) {\n super();\n this.client = config.client;\n this.bucket = config.bucket;\n this.publicUrlBase = config.publicUrlBase\n ? `${config.publicUrlBase.replace(/\\/+$/, '')}/`\n : undefined;\n this.defaultPresignExpiresIn = config.defaultPresignExpiresIn ?? 3600;\n }\n\n public async upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void> {\n await this.client.send(\n new PutObjectCommand({\n Bucket: this.bucket,\n Key: key,\n Body: data as PutObjectCommand['input']['Body'],\n ContentType: options?.contentType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n }),\n );\n }\n\n public async download(key: string): Promise<FileStorageObject> {\n const response = await this.client.send(\n new GetObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToStorageObject(key, response);\n }\n\n public async head(key: string): Promise<HeadResult | null> {\n try {\n const response = await this.client.send(\n new HeadObjectCommand({ Bucket: this.bucket, Key: key }),\n );\n return s3ResponseToHeadResult(response);\n } catch (error: unknown) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n }\n\n public async delete(key: string): Promise<void> {\n await this.client.send(new DeleteObjectCommand({ Bucket: this.bucket, Key: key }));\n }\n\n public async listKeys(prefix?: string): Promise<string[]> {\n const keys: string[] = [];\n let continuationToken: string | undefined;\n\n do {\n const response = await this.client.send(\n new ListObjectsV2Command({\n Bucket: this.bucket,\n Prefix: prefix,\n ContinuationToken: continuationToken,\n }),\n );\n\n if (response.Contents) {\n for (const obj of response.Contents) {\n if (obj.Key) {\n keys.push(obj.Key);\n }\n }\n }\n\n continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;\n } while (continuationToken);\n\n return keys;\n }\n\n public getPublicUrl(key: string): string {\n if (!this.publicUrlBase) {\n throw new Error('publicUrlBase is required for getPublicUrl');\n }\n return `${this.publicUrlBase}${key}`;\n }\n\n public getProtectedUrl(_key: string): string {\n throw new Error(\n 'Use createPresignedUploadUrl() or createS3PresignedGetUrl() for presigned URLs',\n );\n }\n\n public async downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer> {\n return downloadS3Range(this.client, this.bucket, key, offset, length);\n }\n\n public async downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>> {\n return downloadS3Partial(this.client, this.bucket, key, start, end);\n }\n\n public async createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl> {\n return createS3PresignedPutUrl(\n this.client,\n this.bucket,\n key,\n options,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async initiateMultipartUpload(key: string): Promise<MultipartUploadInit> {\n return initiateS3MultipartUpload(this.client, this.bucket, key);\n }\n\n public async createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]> {\n return createS3PresignedPartUrls(\n this.client,\n this.bucket,\n key,\n uploadId,\n parts,\n this.defaultPresignExpiresIn,\n );\n }\n\n public async uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: UploadData,\n ): Promise<string> {\n return uploadS3Part(this.client, this.bucket, key, uploadId, partNumber, data);\n }\n\n public async completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void> {\n return completeS3MultipartUpload(this.client, this.bucket, key, uploadId, parts);\n }\n\n public async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n return abortS3MultipartUpload(this.client, this.bucket, key, uploadId);\n }\n}\n", "import type { AbstractType, Type } from './token';\n\nexport function Injectable(): (target: Type<unknown> | AbstractType<unknown>) => void {\n return (): void => {};\n}\n", "import { Injectable } from '@cibule/di';\n\nimport type {\n CompletedPart,\n FileStorageObject,\n FileUploadOptions,\n HeadResult,\n MultipartUploadInit,\n PresignedPartUrl,\n PresignedUploadUrl,\n PresignOptions,\n UploadData,\n} from './file-storage-types';\n\n@Injectable()\nexport abstract class FileStorage {\n abstract upload(key: string, data: UploadData, options?: FileUploadOptions): Promise<void>;\n\n abstract download(key: string): Promise<FileStorageObject>;\n\n abstract head(key: string): Promise<HeadResult | null>;\n\n abstract delete(key: string): Promise<void>;\n\n abstract listKeys(prefix?: string): Promise<string[]>;\n\n abstract getPublicUrl(key: string): string;\n\n abstract getProtectedUrl(key: string): string;\n\n abstract downloadRange(key: string, offset: number, length: number): Promise<ArrayBuffer>;\n\n abstract downloadPartial(\n key: string,\n start: number,\n end: number,\n ): Promise<ReadableStream<Uint8Array>>;\n\n abstract createPresignedUploadUrl(\n key: string,\n options?: PresignOptions,\n ): Promise<PresignedUploadUrl | null>;\n\n abstract initiateMultipartUpload(key: string): Promise<MultipartUploadInit>;\n\n abstract createPresignedPartUrls(\n key: string,\n uploadId: string,\n parts: number[],\n ): Promise<PresignedPartUrl[]>;\n\n abstract uploadPart(\n key: string,\n uploadId: string,\n partNumber: number,\n data: UploadData,\n ): Promise<string>;\n\n abstract completeMultipartUpload(\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n ): Promise<void>;\n\n abstract abortMultipartUpload(key: string, uploadId: string): Promise<void>;\n}\n", "interface S3ErrorMetadata {\n readonly httpStatusCode?: number;\n}\n\nfunction hasNotFoundMetadata(error: Error): boolean {\n if (!('$metadata' in error)) return false;\n\n const metadata = error.$metadata;\n if (typeof metadata !== 'object' || metadata === null) return false;\n\n return (metadata as S3ErrorMetadata).httpStatusCode === 404;\n}\n\nexport function isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const { name } = error;\n if (name === 'NotFound' || name === 'NoSuchKey' || name === '404') return true;\n\n return hasNotFoundMetadata(error);\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand } from '@aws-sdk/client-s3';\n\nexport async function downloadS3Range(\n client: S3Client,\n bucket: string,\n key: string,\n offset: number,\n length: number,\n): Promise<ArrayBuffer> {\n if (offset < 0) {\n throw new Error('offset must be non-negative');\n }\n if (length <= 0) {\n throw new Error('length must be positive');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(offset)}-${String(offset + length - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n const bytes = await response.Body.transformToByteArray();\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n}\n\nexport async function downloadS3Partial(\n client: S3Client,\n bucket: string,\n key: string,\n start: number,\n end: number,\n): Promise<ReadableStream<Uint8Array>> {\n if (start >= end) {\n throw new Error('start must be less than end');\n }\n\n const response = await client.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n Range: `bytes=${String(start)}-${String(end - 1)}`,\n }),\n );\n\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return response.Body.transformToWebStream() as ReadableStream<Uint8Array>;\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport {\n AbortMultipartUploadCommand,\n CompleteMultipartUploadCommand,\n CreateMultipartUploadCommand,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport type { CompletedPart, MultipartUploadInit, UploadData } from '@cibule/storage';\n\nexport async function initiateS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n): Promise<MultipartUploadInit> {\n const response = await client.send(\n new CreateMultipartUploadCommand({ Bucket: bucket, Key: key }),\n );\n\n if (!response.UploadId) {\n throw new Error(`Failed to initiate multipart upload for key: ${key}`);\n }\n\n return { uploadId: response.UploadId, key };\n}\n\nexport async function uploadS3Part(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n partNumber: number,\n data: UploadData,\n): Promise<string> {\n const response = await client.send(\n new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n Body: data as UploadPartCommand['input']['Body'],\n }),\n );\n\n if (!response.ETag) {\n throw new Error(\n `Missing ETag in upload part response for key: ${key}, part: ${String(partNumber)}`,\n );\n }\n\n return response.ETag;\n}\n\nexport async function completeS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: CompletedPart[],\n): Promise<void> {\n await client.send(\n new CompleteMultipartUploadCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: parts.map(p => ({ PartNumber: p.partNumber, ETag: p.etag })),\n },\n }),\n );\n}\n\nexport async function abortS3MultipartUpload(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n): Promise<void> {\n await client.send(\n new AbortMultipartUploadCommand({ Bucket: bucket, Key: key, UploadId: uploadId }),\n );\n}\n", "import type { S3Client } from '@aws-sdk/client-s3';\nimport { GetObjectCommand, PutObjectCommand, UploadPartCommand } from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { PresignedPartUrl, PresignedUploadUrl, PresignOptions } from '@cibule/storage';\n\nexport const DEFAULT_PRESIGN_EXPIRES_IN = 3600;\n\nexport async function createS3PresignedGetUrl(\n client: S3Client,\n bucket: string,\n key: string,\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<string> {\n return getSignedUrl(client, new GetObjectCommand({ Bucket: bucket, Key: key }), { expiresIn });\n}\n\nexport async function createS3PresignedPutUrl(\n client: S3Client,\n bucket: string,\n key: string,\n options?: PresignOptions,\n defaultExpiresIn?: number,\n): Promise<PresignedUploadUrl> {\n const expiresIn = options?.expiresInSeconds ?? defaultExpiresIn ?? DEFAULT_PRESIGN_EXPIRES_IN;\n const command = new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n ContentType: options?.contentType,\n });\n\n const url = await getSignedUrl(client, command, { expiresIn });\n const headers = options?.contentType ? { 'Content-Type': options.contentType } : undefined;\n\n return { url, headers };\n}\n\nexport async function createS3PresignedPartUrls(\n client: S3Client,\n bucket: string,\n key: string,\n uploadId: string,\n parts: number[],\n expiresIn: number = DEFAULT_PRESIGN_EXPIRES_IN,\n): Promise<PresignedPartUrl[]> {\n return Promise.all(\n parts.map(async partNumber => {\n const command = new UploadPartCommand({\n Bucket: bucket,\n Key: key,\n UploadId: uploadId,\n PartNumber: partNumber,\n });\n const url = await getSignedUrl(client, command, { expiresIn });\n return { partNumber, url };\n }),\n );\n}\n", "import type { HeadObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { HeadResult } from '@cibule/storage';\n\nexport function s3ResponseToHeadResult(response: HeadObjectCommandOutput): HeadResult {\n return {\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n", "import type { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport type { FileStorageObject } from '@cibule/storage';\n\nexport function s3ResponseToStorageObject(\n key: string,\n response: GetObjectCommandOutput,\n): FileStorageObject {\n if (!response.Body) {\n throw new Error(`File not found: ${key}`);\n }\n\n return {\n key,\n body: response.Body.transformToWebStream() as ReadableStream<Uint8Array>,\n size: response.ContentLength ?? 0,\n contentType: response.ContentType,\n etag: response.ETag,\n lastModified: response.LastModified,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["GetObjectCommand", "PutObjectCommand", "GetObjectCommand", "UploadPartCommand", "PutObjectCommand", "GetObjectCommand"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cibule/storage-s3",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -33,6 +33,6 @@
33
33
  "dependencies": {
34
34
  "@aws-sdk/client-s3": "^3.1004.0",
35
35
  "@aws-sdk/s3-request-presigner": "^3.1004.0",
36
- "@cibule/storage": "^0.2.0"
36
+ "@cibule/storage": "^0.4.0"
37
37
  }
38
38
  }