@fengsoft/storage-core 0.1.0 → 0.1.1

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.
@@ -0,0 +1,72 @@
1
+ export type StorageMetadata = Record<string, string>;
2
+ export type StorageBody = Buffer | Uint8Array | string;
3
+ export type PutObjectInput = {
4
+ key: string;
5
+ body: StorageBody;
6
+ contentType?: string;
7
+ cacheControl?: string;
8
+ metadata?: StorageMetadata;
9
+ };
10
+ export type DeleteObjectInput = {
11
+ key: string;
12
+ };
13
+ export type HeadObjectResult = {
14
+ key: string;
15
+ contentLength: number | null;
16
+ contentType: string | null;
17
+ cacheControl: string | null;
18
+ etag: string | null;
19
+ lastModified: Date | null;
20
+ metadata: StorageMetadata;
21
+ };
22
+ export type GetObjectResult = HeadObjectResult & {
23
+ body: Buffer;
24
+ };
25
+ export type ListedObject = {
26
+ key: string;
27
+ contentLength: number;
28
+ lastModified: Date | null;
29
+ etag: string | null;
30
+ };
31
+ export type ListObjectsInput = {
32
+ prefix?: string;
33
+ cursor?: string | null;
34
+ limit?: number;
35
+ };
36
+ export type ListObjectsResult = {
37
+ items: ListedObject[];
38
+ nextCursor: string | null;
39
+ };
40
+ export type CreatePresignedUploadInput = {
41
+ key: string;
42
+ contentType?: string;
43
+ cacheControl?: string;
44
+ metadata?: StorageMetadata;
45
+ expiresInSeconds?: number;
46
+ };
47
+ export type PresignedUpload = {
48
+ key: string;
49
+ method: "PUT";
50
+ url: string;
51
+ headers: Record<string, string>;
52
+ expiresAt: Date;
53
+ };
54
+ export interface StorageDriver {
55
+ putObject(input: PutObjectInput): Promise<HeadObjectResult>;
56
+ deleteObject(input: DeleteObjectInput): Promise<void>;
57
+ headObject(input: DeleteObjectInput): Promise<HeadObjectResult>;
58
+ getObject(input: DeleteObjectInput): Promise<GetObjectResult>;
59
+ listObjects(input?: ListObjectsInput): Promise<ListObjectsResult>;
60
+ createPresignedUpload(input: CreatePresignedUploadInput): Promise<PresignedUpload>;
61
+ resolvePublicUrl(key: string): string | null;
62
+ }
63
+ export declare class StorageObjectNotFoundError extends Error {
64
+ readonly key: string;
65
+ constructor(key: string);
66
+ }
67
+ export declare function toBuffer(body: StorageBody): Buffer;
68
+ export declare function encodeStorageKey(key: string): string;
69
+ export declare function buildPublicUrl(publicBaseUrl: string | null | undefined, key: string): string | null;
70
+ export declare function decodeCursor(cursor: string | null | undefined): number;
71
+ export declare function toCursor(index: number, total: number): string | null;
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ export class StorageObjectNotFoundError extends Error {
2
+ key;
3
+ constructor(key) {
4
+ super(`Storage object not found: ${key}`);
5
+ this.name = "StorageObjectNotFoundError";
6
+ this.key = key;
7
+ }
8
+ }
9
+ export function toBuffer(body) {
10
+ if (Buffer.isBuffer(body)) {
11
+ return body;
12
+ }
13
+ if (body instanceof Uint8Array) {
14
+ return Buffer.from(body);
15
+ }
16
+ return Buffer.from(body);
17
+ }
18
+ export function encodeStorageKey(key) {
19
+ return key
20
+ .split("/")
21
+ .map((segment) => encodeURIComponent(segment))
22
+ .join("/");
23
+ }
24
+ export function buildPublicUrl(publicBaseUrl, key) {
25
+ if (!publicBaseUrl) {
26
+ return null;
27
+ }
28
+ const normalizedBase = publicBaseUrl.endsWith("/")
29
+ ? publicBaseUrl.slice(0, -1)
30
+ : publicBaseUrl;
31
+ return `${normalizedBase}/${encodeStorageKey(key)}`;
32
+ }
33
+ export function decodeCursor(cursor) {
34
+ if (!cursor) {
35
+ return 0;
36
+ }
37
+ const parsed = Number.parseInt(cursor, 10);
38
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;
39
+ }
40
+ export function toCursor(index, total) {
41
+ return index < total ? String(index) : null;
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4EA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC3C,GAAG,CAAS;IAErB,YAAY,GAAW;QACtB,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;CACD;AAED,MAAM,UAAU,QAAQ,CAAC,IAAiB;IACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC3C,OAAO,GAAG;SACR,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;SAC7C,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAC7B,aAAwC,EACxC,GAAW;IAEX,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;QACjD,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,aAAa,CAAC;IACjB,OAAO,GAAG,cAAc,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiC;IAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACV,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,KAAa;IACpD,OAAO,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fengsoft/storage-core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",