@fluxpointstudios/orynq-sdk-storage-adapters 0.1.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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/arweave/arweave-adapter.d.ts +52 -0
  3. package/dist/adapters/arweave/arweave-adapter.d.ts.map +1 -0
  4. package/dist/adapters/arweave/arweave-adapter.js +200 -0
  5. package/dist/adapters/arweave/arweave-adapter.js.map +1 -0
  6. package/dist/adapters/arweave/index.d.ts +2 -0
  7. package/dist/adapters/arweave/index.d.ts.map +1 -0
  8. package/dist/adapters/arweave/index.js +2 -0
  9. package/dist/adapters/arweave/index.js.map +1 -0
  10. package/dist/adapters/ipfs/index.d.ts +3 -0
  11. package/dist/adapters/ipfs/index.d.ts.map +1 -0
  12. package/dist/adapters/ipfs/index.js +3 -0
  13. package/dist/adapters/ipfs/index.js.map +1 -0
  14. package/dist/adapters/ipfs/ipfs-adapter.d.ts +51 -0
  15. package/dist/adapters/ipfs/ipfs-adapter.d.ts.map +1 -0
  16. package/dist/adapters/ipfs/ipfs-adapter.js +186 -0
  17. package/dist/adapters/ipfs/ipfs-adapter.js.map +1 -0
  18. package/dist/adapters/ipfs/pinning-service.d.ts +68 -0
  19. package/dist/adapters/ipfs/pinning-service.d.ts.map +1 -0
  20. package/dist/adapters/ipfs/pinning-service.js +249 -0
  21. package/dist/adapters/ipfs/pinning-service.js.map +1 -0
  22. package/dist/adapters/s3/index.d.ts +2 -0
  23. package/dist/adapters/s3/index.d.ts.map +1 -0
  24. package/dist/adapters/s3/index.js +2 -0
  25. package/dist/adapters/s3/index.js.map +1 -0
  26. package/dist/adapters/s3/s3-adapter.d.ts +79 -0
  27. package/dist/adapters/s3/s3-adapter.d.ts.map +1 -0
  28. package/dist/adapters/s3/s3-adapter.js +275 -0
  29. package/dist/adapters/s3/s3-adapter.js.map +1 -0
  30. package/dist/index.d.ts +40 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +43 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/types.d.ts +182 -0
  35. package/dist/types.d.ts.map +1 -0
  36. package/dist/types.js +27 -0
  37. package/dist/types.js.map +1 -0
  38. package/dist/utils/content-addressing.d.ts +50 -0
  39. package/dist/utils/content-addressing.d.ts.map +1 -0
  40. package/dist/utils/content-addressing.js +101 -0
  41. package/dist/utils/content-addressing.js.map +1 -0
  42. package/dist/utils/index.d.ts +3 -0
  43. package/dist/utils/index.d.ts.map +1 -0
  44. package/dist/utils/index.js +3 -0
  45. package/dist/utils/index.js.map +1 -0
  46. package/dist/utils/replication.d.ts +64 -0
  47. package/dist/utils/replication.d.ts.map +1 -0
  48. package/dist/utils/replication.js +217 -0
  49. package/dist/utils/replication.js.map +1 -0
  50. package/package.json +68 -0
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Pinning service integrations for IPFS.
3
+ * Supports Pinata, Infura, and web3.storage.
4
+ */
5
+ import { StorageError, StorageException } from "../../types.js";
6
+ /**
7
+ * Pinata pinning service.
8
+ */
9
+ export class PinataPinningService {
10
+ apiKey;
11
+ apiSecret;
12
+ endpoint;
13
+ constructor(config) {
14
+ this.apiKey = config.apiKey;
15
+ this.apiSecret = config.apiSecret;
16
+ this.endpoint = config.endpoint ?? "https://api.pinata.cloud";
17
+ }
18
+ async upload(data, filename) {
19
+ try {
20
+ const formData = new FormData();
21
+ // Create a new ArrayBuffer to ensure type compatibility
22
+ const buffer = new ArrayBuffer(data.byteLength);
23
+ new Uint8Array(buffer).set(data);
24
+ const blob = new Blob([buffer]);
25
+ formData.append("file", blob, filename ?? "data.bin");
26
+ const response = await fetch(`${this.endpoint}/pinning/pinFileToIPFS`, {
27
+ method: "POST",
28
+ headers: this.getAuthHeaders(),
29
+ body: formData,
30
+ });
31
+ if (!response.ok) {
32
+ const error = await response.text();
33
+ throw new Error(`Pinata upload failed: ${response.status} - ${error}`);
34
+ }
35
+ const result = await response.json();
36
+ return result.IpfsHash;
37
+ }
38
+ catch (error) {
39
+ throw new StorageException(StorageError.STORE_FAILED, `Pinata upload failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
40
+ }
41
+ }
42
+ async pin(cid) {
43
+ try {
44
+ const response = await fetch(`${this.endpoint}/pinning/pinByHash`, {
45
+ method: "POST",
46
+ headers: {
47
+ ...this.getAuthHeaders(),
48
+ "Content-Type": "application/json",
49
+ },
50
+ body: JSON.stringify({ hashToPin: cid }),
51
+ });
52
+ if (!response.ok) {
53
+ const error = await response.text();
54
+ throw new Error(`Pinata pin failed: ${response.status} - ${error}`);
55
+ }
56
+ }
57
+ catch (error) {
58
+ throw new StorageException(StorageError.PIN_FAILED, `Pinata pin failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
59
+ }
60
+ }
61
+ async unpin(cid) {
62
+ try {
63
+ const response = await fetch(`${this.endpoint}/pinning/unpin/${cid}`, {
64
+ method: "DELETE",
65
+ headers: this.getAuthHeaders(),
66
+ });
67
+ if (!response.ok && response.status !== 404) {
68
+ throw new Error(`Pinata unpin failed: ${response.status}`);
69
+ }
70
+ }
71
+ catch (error) {
72
+ throw new StorageException(StorageError.DELETE_FAILED, `Pinata unpin failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
73
+ }
74
+ }
75
+ async isPinned(cid) {
76
+ try {
77
+ const response = await fetch(`${this.endpoint}/data/pinList?hashContains=${cid}&status=pinned`, {
78
+ headers: this.getAuthHeaders(),
79
+ });
80
+ if (!response.ok) {
81
+ return false;
82
+ }
83
+ const result = await response.json();
84
+ return result.rows.length > 0;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ getAuthHeaders() {
91
+ if (this.apiSecret) {
92
+ return {
93
+ pinata_api_key: this.apiKey,
94
+ pinata_secret_api_key: this.apiSecret,
95
+ };
96
+ }
97
+ return {
98
+ Authorization: `Bearer ${this.apiKey}`,
99
+ };
100
+ }
101
+ }
102
+ /**
103
+ * Infura IPFS pinning service.
104
+ */
105
+ export class InfuraPinningService {
106
+ projectId;
107
+ projectSecret;
108
+ endpoint;
109
+ constructor(config) {
110
+ this.projectId = config.apiKey;
111
+ this.projectSecret = config.apiSecret;
112
+ this.endpoint = config.endpoint ?? "https://ipfs.infura.io:5001";
113
+ }
114
+ async upload(data, filename) {
115
+ try {
116
+ const formData = new FormData();
117
+ // Create a new ArrayBuffer to ensure type compatibility
118
+ const buffer = new ArrayBuffer(data.byteLength);
119
+ new Uint8Array(buffer).set(data);
120
+ const blob = new Blob([buffer]);
121
+ formData.append("file", blob, filename ?? "data.bin");
122
+ const response = await fetch(`${this.endpoint}/api/v0/add?pin=true`, {
123
+ method: "POST",
124
+ headers: this.getAuthHeaders(),
125
+ body: formData,
126
+ });
127
+ if (!response.ok) {
128
+ throw new Error(`Infura upload failed: ${response.status}`);
129
+ }
130
+ const result = await response.json();
131
+ return result.Hash;
132
+ }
133
+ catch (error) {
134
+ throw new StorageException(StorageError.STORE_FAILED, `Infura upload failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
135
+ }
136
+ }
137
+ async pin(cid) {
138
+ try {
139
+ const response = await fetch(`${this.endpoint}/api/v0/pin/add?arg=${cid}`, {
140
+ method: "POST",
141
+ headers: this.getAuthHeaders(),
142
+ });
143
+ if (!response.ok) {
144
+ throw new Error(`Infura pin failed: ${response.status}`);
145
+ }
146
+ }
147
+ catch (error) {
148
+ throw new StorageException(StorageError.PIN_FAILED, `Infura pin failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
149
+ }
150
+ }
151
+ async unpin(cid) {
152
+ try {
153
+ const response = await fetch(`${this.endpoint}/api/v0/pin/rm?arg=${cid}`, {
154
+ method: "POST",
155
+ headers: this.getAuthHeaders(),
156
+ });
157
+ if (!response.ok && response.status !== 500) {
158
+ // Infura returns 500 for not pinned
159
+ throw new Error(`Infura unpin failed: ${response.status}`);
160
+ }
161
+ }
162
+ catch (error) {
163
+ throw new StorageException(StorageError.DELETE_FAILED, `Infura unpin failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
164
+ }
165
+ }
166
+ getAuthHeaders() {
167
+ if (this.projectSecret) {
168
+ const auth = Buffer.from(`${this.projectId}:${this.projectSecret}`).toString("base64");
169
+ return {
170
+ Authorization: `Basic ${auth}`,
171
+ };
172
+ }
173
+ return {};
174
+ }
175
+ }
176
+ /**
177
+ * web3.storage pinning service.
178
+ */
179
+ export class Web3StoragePinningService {
180
+ token;
181
+ endpoint;
182
+ constructor(config) {
183
+ this.token = config.apiKey;
184
+ this.endpoint = config.endpoint ?? "https://api.web3.storage";
185
+ }
186
+ async upload(data, filename) {
187
+ try {
188
+ // Create a new ArrayBuffer to ensure type compatibility
189
+ const buffer = new ArrayBuffer(data.byteLength);
190
+ new Uint8Array(buffer).set(data);
191
+ const blob = new Blob([buffer]);
192
+ const response = await fetch(`${this.endpoint}/upload`, {
193
+ method: "POST",
194
+ headers: {
195
+ Authorization: `Bearer ${this.token}`,
196
+ "X-Name": filename ?? "data.bin",
197
+ },
198
+ body: blob,
199
+ });
200
+ if (!response.ok) {
201
+ throw new Error(`web3.storage upload failed: ${response.status}`);
202
+ }
203
+ const result = await response.json();
204
+ return result.cid;
205
+ }
206
+ catch (error) {
207
+ throw new StorageException(StorageError.STORE_FAILED, `web3.storage upload failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
208
+ }
209
+ }
210
+ async pin(cid) {
211
+ // web3.storage automatically pins uploads
212
+ // For existing CIDs, we'd use the pinning API
213
+ try {
214
+ const response = await fetch(`${this.endpoint}/pins`, {
215
+ method: "POST",
216
+ headers: {
217
+ Authorization: `Bearer ${this.token}`,
218
+ "Content-Type": "application/json",
219
+ },
220
+ body: JSON.stringify({ cid }),
221
+ });
222
+ if (!response.ok && response.status !== 409) {
223
+ // 409 means already pinned
224
+ throw new Error(`web3.storage pin failed: ${response.status}`);
225
+ }
226
+ }
227
+ catch (error) {
228
+ throw new StorageException(StorageError.PIN_FAILED, `web3.storage pin failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
229
+ }
230
+ }
231
+ }
232
+ /**
233
+ * Create a pinning service based on configuration.
234
+ */
235
+ export function createPinningService(config) {
236
+ switch (config.name) {
237
+ case "pinata":
238
+ return new PinataPinningService(config);
239
+ case "infura":
240
+ return new InfuraPinningService(config);
241
+ case "web3.storage":
242
+ return new Web3StoragePinningService(config);
243
+ case "custom":
244
+ throw new StorageException(StorageError.INVALID_CONFIG, "Custom pinning service requires implementation");
245
+ default:
246
+ throw new StorageException(StorageError.INVALID_CONFIG, `Unknown pinning service: ${config.name}`);
247
+ }
248
+ }
249
+ //# sourceMappingURL=pinning-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinning-service.js","sourceRoot":"","sources":["../../../src/adapters/ipfs/pinning-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { S3Adapter, createS3Adapter, type S3Client } from "./s3-adapter.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/s3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { S3Adapter, createS3Adapter } from "./s3-adapter.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/s3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAiB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * S3 Storage Adapter.
3
+ * Stores data on AWS S3 or S3-compatible services.
4
+ */
5
+ import type { StorageAdapter, StorageRef, StorableManifest, S3AdapterConfig } from "../../types.js";
6
+ /**
7
+ * S3 client interface (minimal subset used).
8
+ * This allows using the actual AWS SDK or a compatible implementation.
9
+ */
10
+ export interface S3Client {
11
+ send(command: unknown): Promise<unknown>;
12
+ }
13
+ /**
14
+ * Storage adapter for S3 and S3-compatible services.
15
+ */
16
+ export declare class S3Adapter implements StorageAdapter {
17
+ readonly type: "s3";
18
+ private readonly bucket;
19
+ private readonly region;
20
+ private readonly prefix;
21
+ private readonly credentials;
22
+ private readonly endpoint;
23
+ private readonly serverSideEncryption;
24
+ private readonly presignedUrlExpiry;
25
+ private s3Client;
26
+ constructor(config: S3AdapterConfig);
27
+ /**
28
+ * Store data on S3.
29
+ */
30
+ store(data: Uint8Array): Promise<StorageRef>;
31
+ /**
32
+ * Store a manifest on S3.
33
+ */
34
+ storeManifest(manifest: StorableManifest): Promise<StorageRef>;
35
+ /**
36
+ * Fetch data from S3.
37
+ */
38
+ fetch(ref: StorageRef): Promise<Uint8Array>;
39
+ /**
40
+ * Fetch a manifest from S3.
41
+ */
42
+ fetchManifest(ref: StorageRef): Promise<StorableManifest>;
43
+ /**
44
+ * Verify data integrity.
45
+ */
46
+ verify(ref: StorageRef): Promise<boolean>;
47
+ /**
48
+ * Delete data from S3.
49
+ */
50
+ delete(ref: StorageRef): Promise<void>;
51
+ /**
52
+ * Generate a presigned URL for reading.
53
+ */
54
+ getPresignedUrl(ref: StorageRef): Promise<string>;
55
+ /**
56
+ * Generate a presigned URL for uploading.
57
+ */
58
+ getUploadUrl(filename: string): Promise<{
59
+ url: string;
60
+ key: string;
61
+ }>;
62
+ /**
63
+ * Check if an object exists.
64
+ */
65
+ exists(ref: StorageRef): Promise<boolean>;
66
+ private getS3Client;
67
+ private putObject;
68
+ private getObject;
69
+ private deleteObject;
70
+ private headObject;
71
+ private generatePresignedUrl;
72
+ private buildKey;
73
+ private extractKey;
74
+ }
75
+ /**
76
+ * Create an S3 storage adapter.
77
+ */
78
+ export declare function createS3Adapter(config: S3AdapterConfig): S3Adapter;
79
+ //# sourceMappingURL=s3-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/s3/s3-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAIxB;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,qBAAa,SAAU,YAAW,cAAc;IAC9C,QAAQ,CAAC,IAAI,EAAG,IAAI,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+D;IAC3F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAE5C,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,MAAM,EAAE,eAAe;IAUnC;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAclD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBpE;;OAEG;IACG,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAcjD;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAe/D;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAU/C;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5C;;OAEG;IACG,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAM3E;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;YAOjC,WAAW;YAiCX,SAAS;YAyCT,SAAS;YA8BT,YAAY;YAqBZ,UAAU;YAkBV,oBAAoB;IAuClC,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,UAAU;CAiBnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * S3 Storage Adapter.
3
+ * Stores data on AWS S3 or S3-compatible services.
4
+ */
5
+ import { StorageError, StorageException } from "../../types.js";
6
+ import { sha256 } from "../../utils/content-addressing.js";
7
+ /**
8
+ * Storage adapter for S3 and S3-compatible services.
9
+ */
10
+ export class S3Adapter {
11
+ type = "s3";
12
+ bucket;
13
+ region;
14
+ prefix;
15
+ credentials;
16
+ endpoint;
17
+ serverSideEncryption;
18
+ presignedUrlExpiry;
19
+ s3Client;
20
+ constructor(config) {
21
+ this.bucket = config.bucket;
22
+ this.region = config.region;
23
+ this.prefix = config.prefix ?? "";
24
+ this.credentials = config.credentials;
25
+ this.endpoint = config.endpoint;
26
+ this.serverSideEncryption = config.serverSideEncryption ?? false;
27
+ this.presignedUrlExpiry = config.presignedUrlExpiry ?? 3600;
28
+ }
29
+ /**
30
+ * Store data on S3.
31
+ */
32
+ async store(data) {
33
+ const hash = sha256(data, "chunk");
34
+ const key = this.buildKey(`chunks/${hash}.bin`);
35
+ await this.putObject(key, data);
36
+ return {
37
+ type: "s3",
38
+ uri: `s3://${this.bucket}/${key}`,
39
+ hash,
40
+ size: data.length,
41
+ };
42
+ }
43
+ /**
44
+ * Store a manifest on S3.
45
+ */
46
+ async storeManifest(manifest) {
47
+ const json = JSON.stringify(manifest, null, 2);
48
+ const data = new TextEncoder().encode(json);
49
+ const hash = manifest.manifestHash ?? sha256(data, "manifest");
50
+ const key = this.buildKey(`manifests/${manifest.sessionId}-${hash.slice(0, 16)}.json`);
51
+ await this.putObject(key, data, "application/json");
52
+ return {
53
+ type: "s3",
54
+ uri: `s3://${this.bucket}/${key}`,
55
+ hash,
56
+ size: data.length,
57
+ };
58
+ }
59
+ /**
60
+ * Fetch data from S3.
61
+ */
62
+ async fetch(ref) {
63
+ const key = this.extractKey(ref.uri);
64
+ try {
65
+ return await this.getObject(key);
66
+ }
67
+ catch (error) {
68
+ throw new StorageException(StorageError.FETCH_FAILED, `Failed to fetch from S3: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
69
+ }
70
+ }
71
+ /**
72
+ * Fetch a manifest from S3.
73
+ */
74
+ async fetchManifest(ref) {
75
+ const data = await this.fetch(ref);
76
+ const json = new TextDecoder().decode(data);
77
+ try {
78
+ return JSON.parse(json);
79
+ }
80
+ catch (error) {
81
+ throw new StorageException(StorageError.FETCH_FAILED, "Failed to parse manifest JSON", error instanceof Error ? error : undefined);
82
+ }
83
+ }
84
+ /**
85
+ * Verify data integrity.
86
+ */
87
+ async verify(ref) {
88
+ try {
89
+ const data = await this.fetch(ref);
90
+ const hash = sha256(data, "chunk");
91
+ return hash === ref.hash;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ /**
98
+ * Delete data from S3.
99
+ */
100
+ async delete(ref) {
101
+ const key = this.extractKey(ref.uri);
102
+ try {
103
+ await this.deleteObject(key);
104
+ }
105
+ catch (error) {
106
+ throw new StorageException(StorageError.DELETE_FAILED, `Failed to delete from S3: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
107
+ }
108
+ }
109
+ /**
110
+ * Generate a presigned URL for reading.
111
+ */
112
+ async getPresignedUrl(ref) {
113
+ const key = this.extractKey(ref.uri);
114
+ return this.generatePresignedUrl(key, "GET");
115
+ }
116
+ /**
117
+ * Generate a presigned URL for uploading.
118
+ */
119
+ async getUploadUrl(filename) {
120
+ const key = this.buildKey(`uploads/${filename}`);
121
+ const url = await this.generatePresignedUrl(key, "PUT");
122
+ return { url, key };
123
+ }
124
+ /**
125
+ * Check if an object exists.
126
+ */
127
+ async exists(ref) {
128
+ const key = this.extractKey(ref.uri);
129
+ return this.headObject(key);
130
+ }
131
+ // === Private Methods ===
132
+ async getS3Client() {
133
+ if (this.s3Client) {
134
+ return this.s3Client;
135
+ }
136
+ try {
137
+ // Dynamically import AWS SDK
138
+ const { S3Client: AwsS3Client } = await import("@aws-sdk/client-s3");
139
+ const config = {
140
+ region: this.region,
141
+ };
142
+ if (this.credentials) {
143
+ config.credentials = this.credentials;
144
+ }
145
+ if (this.endpoint) {
146
+ config.endpoint = this.endpoint;
147
+ config.forcePathStyle = true;
148
+ }
149
+ this.s3Client = new AwsS3Client(config);
150
+ return this.s3Client;
151
+ }
152
+ catch (error) {
153
+ throw new StorageException(StorageError.INVALID_CONFIG, "AWS SDK not available. Install @aws-sdk/client-s3 to use S3 adapter.", error instanceof Error ? error : undefined);
154
+ }
155
+ }
156
+ async putObject(key, data, contentType = "application/octet-stream") {
157
+ const client = await this.getS3Client();
158
+ try {
159
+ const { PutObjectCommand } = await import("@aws-sdk/client-s3");
160
+ const params = {
161
+ Bucket: this.bucket,
162
+ Key: key,
163
+ Body: data,
164
+ ContentType: contentType,
165
+ };
166
+ if (this.serverSideEncryption) {
167
+ params.ServerSideEncryption = "AES256";
168
+ }
169
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
170
+ await client.send(new PutObjectCommand(params));
171
+ }
172
+ catch (error) {
173
+ throw new StorageException(StorageError.STORE_FAILED, `S3 PutObject failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
174
+ }
175
+ }
176
+ async getObject(key) {
177
+ const client = await this.getS3Client();
178
+ try {
179
+ const { GetObjectCommand } = await import("@aws-sdk/client-s3");
180
+ const result = await client.send(new GetObjectCommand({
181
+ Bucket: this.bucket,
182
+ Key: key,
183
+ }));
184
+ if (!result.Body) {
185
+ throw new Error("No body in response");
186
+ }
187
+ return result.Body.transformToByteArray();
188
+ }
189
+ catch (error) {
190
+ const errorObj = error;
191
+ if (errorObj.name === "NoSuchKey") {
192
+ throw new StorageException(StorageError.NOT_FOUND, `Object not found: ${key}`);
193
+ }
194
+ throw error;
195
+ }
196
+ }
197
+ async deleteObject(key) {
198
+ const client = await this.getS3Client();
199
+ try {
200
+ const { DeleteObjectCommand } = await import("@aws-sdk/client-s3");
201
+ await client.send(new DeleteObjectCommand({
202
+ Bucket: this.bucket,
203
+ Key: key,
204
+ }));
205
+ }
206
+ catch (error) {
207
+ throw new StorageException(StorageError.DELETE_FAILED, `S3 DeleteObject failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
208
+ }
209
+ }
210
+ async headObject(key) {
211
+ const client = await this.getS3Client();
212
+ try {
213
+ const { HeadObjectCommand } = await import("@aws-sdk/client-s3");
214
+ await client.send(new HeadObjectCommand({
215
+ Bucket: this.bucket,
216
+ Key: key,
217
+ }));
218
+ return true;
219
+ }
220
+ catch {
221
+ return false;
222
+ }
223
+ }
224
+ async generatePresignedUrl(key, operation) {
225
+ const client = await this.getS3Client();
226
+ try {
227
+ const { getSignedUrl } = await import("@aws-sdk/s3-request-presigner");
228
+ if (operation === "GET") {
229
+ const { GetObjectCommand } = await import("@aws-sdk/client-s3");
230
+ return getSignedUrl(client, new GetObjectCommand({
231
+ Bucket: this.bucket,
232
+ Key: key,
233
+ }), { expiresIn: this.presignedUrlExpiry });
234
+ }
235
+ else {
236
+ const { PutObjectCommand } = await import("@aws-sdk/client-s3");
237
+ return getSignedUrl(client, new PutObjectCommand({
238
+ Bucket: this.bucket,
239
+ Key: key,
240
+ }), { expiresIn: this.presignedUrlExpiry });
241
+ }
242
+ }
243
+ catch (error) {
244
+ throw new StorageException(StorageError.STORE_FAILED, `Failed to generate presigned URL: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
245
+ }
246
+ }
247
+ buildKey(suffix) {
248
+ if (this.prefix) {
249
+ return `${this.prefix}/${suffix}`;
250
+ }
251
+ return suffix;
252
+ }
253
+ extractKey(uri) {
254
+ // s3://bucket/key/path
255
+ if (uri.startsWith("s3://")) {
256
+ const match = uri.match(/s3:\/\/[^\/]+\/(.+)/);
257
+ if (match?.[1]) {
258
+ return match[1];
259
+ }
260
+ }
261
+ // https://bucket.s3.region.amazonaws.com/key
262
+ const httpsMatch = uri.match(/https?:\/\/[^\/]+\/(.+)/);
263
+ if (httpsMatch?.[1]) {
264
+ return httpsMatch[1];
265
+ }
266
+ return uri;
267
+ }
268
+ }
269
+ /**
270
+ * Create an S3 storage adapter.
271
+ */
272
+ export function createS3Adapter(config) {
273
+ return new S3Adapter(config);
274
+ }
275
+ //# sourceMappingURL=s3-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-adapter.js","sourceRoot":"","sources":["../../../src/adapters/s3/s3-adapter.ts"],"names":[],"mappings":"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"}