hetzner-storage-sdk 1.0.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.
- package/LICENSE +21 -0
- package/README.md +539 -0
- package/dist/HetznerStorageClient.d.ts +103 -0
- package/dist/HetznerStorageClient.js +202 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +56 -0
- package/dist/providers/BaseStorageProvider.d.ts +73 -0
- package/dist/providers/BaseStorageProvider.js +13 -0
- package/dist/providers/ObjectStorageProvider.d.ts +114 -0
- package/dist/providers/ObjectStorageProvider.js +285 -0
- package/dist/providers/StorageBoxProvider.d.ts +96 -0
- package/dist/providers/StorageBoxProvider.js +312 -0
- package/dist/providers/StorageShareProvider.d.ts +112 -0
- package/dist/providers/StorageShareProvider.js +253 -0
- package/dist/types/index.d.ts +247 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/OcsApiClient.d.ts +41 -0
- package/dist/utils/OcsApiClient.js +144 -0
- package/dist/utils/RobotApiClient.d.ts +48 -0
- package/dist/utils/RobotApiClient.js +98 -0
- package/dist/utils/S3ApiClient.d.ts +28 -0
- package/dist/utils/S3ApiClient.js +326 -0
- package/dist/utils/env-config.d.ts +45 -0
- package/dist/utils/env-config.js +112 -0
- package/package.json +47 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ObjectStorageProvider = exports.StorageShareProvider = exports.StorageBoxProvider = exports.BaseStorageProvider = exports.HetznerStorageClient = void 0;
|
|
18
|
+
const BaseStorageProvider_1 = require("./providers/BaseStorageProvider");
|
|
19
|
+
Object.defineProperty(exports, "BaseStorageProvider", { enumerable: true, get: function () { return BaseStorageProvider_1.BaseStorageProvider; } });
|
|
20
|
+
const StorageBoxProvider_1 = require("./providers/StorageBoxProvider");
|
|
21
|
+
Object.defineProperty(exports, "StorageBoxProvider", { enumerable: true, get: function () { return StorageBoxProvider_1.StorageBoxProvider; } });
|
|
22
|
+
const StorageShareProvider_1 = require("./providers/StorageShareProvider");
|
|
23
|
+
Object.defineProperty(exports, "StorageShareProvider", { enumerable: true, get: function () { return StorageShareProvider_1.StorageShareProvider; } });
|
|
24
|
+
const ObjectStorageProvider_1 = require("./providers/ObjectStorageProvider");
|
|
25
|
+
Object.defineProperty(exports, "ObjectStorageProvider", { enumerable: true, get: function () { return ObjectStorageProvider_1.ObjectStorageProvider; } });
|
|
26
|
+
const env_config_1 = require("./utils/env-config");
|
|
27
|
+
/**
|
|
28
|
+
* Factory class for creating Hetzner Storage clients
|
|
29
|
+
*
|
|
30
|
+
* This class implements the Factory pattern to instantiate the appropriate
|
|
31
|
+
* storage provider based on the configuration.
|
|
32
|
+
*
|
|
33
|
+
* Configuration can be provided explicitly or loaded from environment variables.
|
|
34
|
+
* Explicit configuration takes precedence over environment variables.
|
|
35
|
+
*
|
|
36
|
+
* Environment Variables:
|
|
37
|
+
* - Storage Box:
|
|
38
|
+
* - HETZNER_STORAGE_BOX_USERNAME
|
|
39
|
+
* - HETZNER_STORAGE_BOX_PASSWORD
|
|
40
|
+
* - HETZNER_STORAGE_BOX_PROTOCOL (optional: webdav)
|
|
41
|
+
* - HETZNER_STORAGE_BOX_ID (optional)
|
|
42
|
+
* - HETZNER_ROBOT_USERNAME (optional)
|
|
43
|
+
* - HETZNER_ROBOT_PASSWORD (optional)
|
|
44
|
+
*
|
|
45
|
+
* - Storage Share:
|
|
46
|
+
* - HETZNER_STORAGE_SHARE_USERNAME
|
|
47
|
+
* - HETZNER_STORAGE_SHARE_PASSWORD
|
|
48
|
+
* - HETZNER_STORAGE_SHARE_INSTANCE
|
|
49
|
+
*
|
|
50
|
+
* - Object Storage:
|
|
51
|
+
* - HETZNER_OBJECT_STORAGE_ACCESS_KEY_ID
|
|
52
|
+
* - HETZNER_OBJECT_STORAGE_SECRET_ACCESS_KEY
|
|
53
|
+
* - HETZNER_OBJECT_STORAGE_REGION
|
|
54
|
+
* - HETZNER_OBJECT_STORAGE_BUCKET
|
|
55
|
+
*
|
|
56
|
+
* Usage:
|
|
57
|
+
* ```typescript
|
|
58
|
+
* // Using explicit configuration
|
|
59
|
+
* const client = HetznerStorageClient.create({
|
|
60
|
+
* type: 'box',
|
|
61
|
+
* username: 'u123456',
|
|
62
|
+
* password: 'your-password',
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* // Using environment variables (set env vars first)
|
|
66
|
+
* const client = HetznerStorageClient.create({ type: 'box' });
|
|
67
|
+
*
|
|
68
|
+
* // Mixed: override specific values while loading others from env
|
|
69
|
+
* const client = HetznerStorageClient.create({
|
|
70
|
+
* type: 'object',
|
|
71
|
+
* bucket: 'my-custom-bucket' // Other fields loaded from env
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
class HetznerStorageClient {
|
|
76
|
+
/**
|
|
77
|
+
* Create a new storage client based on the provided configuration
|
|
78
|
+
*
|
|
79
|
+
* Configuration values can be provided explicitly or loaded from environment variables.
|
|
80
|
+
* Explicitly provided values take precedence over environment variables.
|
|
81
|
+
*
|
|
82
|
+
* @param config - Storage configuration object (partial config allowed if env vars are set)
|
|
83
|
+
* @returns An instance of the appropriate storage provider
|
|
84
|
+
* @throws Error if the storage type is invalid or required configuration is missing
|
|
85
|
+
*/
|
|
86
|
+
static create(config) {
|
|
87
|
+
if (!config.type) {
|
|
88
|
+
throw new Error('Storage type is required in configuration');
|
|
89
|
+
}
|
|
90
|
+
switch (config.type) {
|
|
91
|
+
case 'box': {
|
|
92
|
+
const envConfig = (0, env_config_1.loadStorageBoxEnv)();
|
|
93
|
+
const mergedConfig = (0, env_config_1.mergeWithEnv)(config, envConfig);
|
|
94
|
+
if (!mergedConfig.username || !mergedConfig.password) {
|
|
95
|
+
throw new Error('Username and password are required for Storage Box. ' +
|
|
96
|
+
'Provide them in config or set HETZNER_STORAGE_BOX_USERNAME and HETZNER_STORAGE_BOX_PASSWORD environment variables.');
|
|
97
|
+
}
|
|
98
|
+
return new StorageBoxProvider_1.StorageBoxProvider(mergedConfig);
|
|
99
|
+
}
|
|
100
|
+
case 'share': {
|
|
101
|
+
const envConfig = (0, env_config_1.loadStorageShareEnv)();
|
|
102
|
+
const mergedConfig = (0, env_config_1.mergeWithEnv)(config, envConfig);
|
|
103
|
+
if (!mergedConfig.username || !mergedConfig.password) {
|
|
104
|
+
throw new Error('Username and password are required for Storage Share. ' +
|
|
105
|
+
'Provide them in config or set HETZNER_STORAGE_SHARE_USERNAME and HETZNER_STORAGE_SHARE_PASSWORD environment variables.');
|
|
106
|
+
}
|
|
107
|
+
if (!mergedConfig.instance) {
|
|
108
|
+
throw new Error('Instance is required for Storage Share. ' +
|
|
109
|
+
'Provide it in config or set HETZNER_STORAGE_SHARE_INSTANCE environment variable.');
|
|
110
|
+
}
|
|
111
|
+
return new StorageShareProvider_1.StorageShareProvider(mergedConfig);
|
|
112
|
+
}
|
|
113
|
+
case 'object': {
|
|
114
|
+
const envConfig = (0, env_config_1.loadObjectStorageEnv)();
|
|
115
|
+
const mergedConfig = (0, env_config_1.mergeWithEnv)(config, envConfig);
|
|
116
|
+
if (!mergedConfig.accessKeyId || !mergedConfig.secretAccessKey) {
|
|
117
|
+
throw new Error('accessKeyId and secretAccessKey are required for Object Storage. ' +
|
|
118
|
+
'Provide them in config or set HETZNER_OBJECT_STORAGE_ACCESS_KEY_ID and HETZNER_OBJECT_STORAGE_SECRET_ACCESS_KEY environment variables.');
|
|
119
|
+
}
|
|
120
|
+
if (!mergedConfig.region) {
|
|
121
|
+
throw new Error('Region is required for Object Storage. ' +
|
|
122
|
+
'Provide it in config or set HETZNER_OBJECT_STORAGE_REGION environment variable.');
|
|
123
|
+
}
|
|
124
|
+
if (!mergedConfig.bucket) {
|
|
125
|
+
throw new Error('Bucket is required for Object Storage. ' +
|
|
126
|
+
'Provide it in config or set HETZNER_OBJECT_STORAGE_BUCKET environment variable.');
|
|
127
|
+
}
|
|
128
|
+
return new ObjectStorageProvider_1.ObjectStorageProvider(mergedConfig);
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
throw new Error(`Invalid storage type: ${config.type}. Must be 'box', 'share', or 'object'.`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a Storage Box client
|
|
136
|
+
* Convenience method for creating a Storage Box provider
|
|
137
|
+
*
|
|
138
|
+
* Configuration values can be provided explicitly or loaded from environment variables.
|
|
139
|
+
*
|
|
140
|
+
* @param config - Storage Box configuration (optional if env vars are set)
|
|
141
|
+
* @returns StorageBoxProvider instance
|
|
142
|
+
*/
|
|
143
|
+
static createBoxClient(config = {}) {
|
|
144
|
+
const envConfig = (0, env_config_1.loadStorageBoxEnv)();
|
|
145
|
+
const mergedConfig = (0, env_config_1.mergeWithEnv)({ ...config, type: 'box' }, envConfig);
|
|
146
|
+
if (!mergedConfig.username || !mergedConfig.password) {
|
|
147
|
+
throw new Error('Username and password are required for Storage Box. ' +
|
|
148
|
+
'Provide them in config or set HETZNER_STORAGE_BOX_USERNAME and HETZNER_STORAGE_BOX_PASSWORD environment variables.');
|
|
149
|
+
}
|
|
150
|
+
return new StorageBoxProvider_1.StorageBoxProvider(mergedConfig);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Create a Storage Share client
|
|
154
|
+
* Convenience method for creating a Storage Share provider
|
|
155
|
+
*
|
|
156
|
+
* Configuration values can be provided explicitly or loaded from environment variables.
|
|
157
|
+
*
|
|
158
|
+
* @param config - Storage Share configuration (optional if env vars are set)
|
|
159
|
+
* @returns StorageShareProvider instance
|
|
160
|
+
*/
|
|
161
|
+
static createShareClient(config = {}) {
|
|
162
|
+
const envConfig = (0, env_config_1.loadStorageShareEnv)();
|
|
163
|
+
const mergedConfig = (0, env_config_1.mergeWithEnv)({ ...config, type: 'share' }, envConfig);
|
|
164
|
+
if (!mergedConfig.username || !mergedConfig.password) {
|
|
165
|
+
throw new Error('Username and password are required for Storage Share. ' +
|
|
166
|
+
'Provide them in config or set HETZNER_STORAGE_SHARE_USERNAME and HETZNER_STORAGE_SHARE_PASSWORD environment variables.');
|
|
167
|
+
}
|
|
168
|
+
if (!mergedConfig.instance) {
|
|
169
|
+
throw new Error('Instance is required for Storage Share. ' +
|
|
170
|
+
'Provide it in config or set HETZNER_STORAGE_SHARE_INSTANCE environment variable.');
|
|
171
|
+
}
|
|
172
|
+
return new StorageShareProvider_1.StorageShareProvider(mergedConfig);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create an Object Storage client
|
|
176
|
+
* Convenience method for creating an Object Storage provider
|
|
177
|
+
*
|
|
178
|
+
* Configuration values can be provided explicitly or loaded from environment variables.
|
|
179
|
+
*
|
|
180
|
+
* @param config - Object Storage configuration (optional if env vars are set)
|
|
181
|
+
* @returns ObjectStorageProvider instance
|
|
182
|
+
*/
|
|
183
|
+
static createObjectClient(config = {}) {
|
|
184
|
+
const envConfig = (0, env_config_1.loadObjectStorageEnv)();
|
|
185
|
+
const mergedConfig = (0, env_config_1.mergeWithEnv)({ ...config, type: 'object' }, envConfig);
|
|
186
|
+
if (!mergedConfig.accessKeyId || !mergedConfig.secretAccessKey) {
|
|
187
|
+
throw new Error('accessKeyId and secretAccessKey are required for Object Storage. ' +
|
|
188
|
+
'Provide them in config or set HETZNER_OBJECT_STORAGE_ACCESS_KEY_ID and HETZNER_OBJECT_STORAGE_SECRET_ACCESS_KEY environment variables.');
|
|
189
|
+
}
|
|
190
|
+
if (!mergedConfig.region) {
|
|
191
|
+
throw new Error('Region is required for Object Storage. ' +
|
|
192
|
+
'Provide it in config or set HETZNER_OBJECT_STORAGE_REGION environment variable.');
|
|
193
|
+
}
|
|
194
|
+
if (!mergedConfig.bucket) {
|
|
195
|
+
throw new Error('Bucket is required for Object Storage. ' +
|
|
196
|
+
'Provide it in config or set HETZNER_OBJECT_STORAGE_BUCKET environment variable.');
|
|
197
|
+
}
|
|
198
|
+
return new ObjectStorageProvider_1.ObjectStorageProvider(mergedConfig);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.HetznerStorageClient = HetznerStorageClient;
|
|
202
|
+
__exportStar(require("./types"), exports);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hetzner Storage SDK
|
|
3
|
+
*
|
|
4
|
+
* A TypeScript SDK for interacting with Hetzner Storage Box, Storage Share, and Object Storage
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { HetznerStorageClient } from './HetznerStorageClient';
|
|
9
|
+
export { BaseStorageProvider } from './providers/BaseStorageProvider';
|
|
10
|
+
export { StorageBoxProvider } from './providers/StorageBoxProvider';
|
|
11
|
+
export { StorageShareProvider } from './providers/StorageShareProvider';
|
|
12
|
+
export { ObjectStorageProvider } from './providers/ObjectStorageProvider';
|
|
13
|
+
export * from './types';
|
|
14
|
+
export { RobotApiClient } from './utils/RobotApiClient';
|
|
15
|
+
export { OcsApiClient } from './utils/OcsApiClient';
|
|
16
|
+
export { S3ApiClient } from './utils/S3ApiClient';
|
|
17
|
+
export { STORAGE_BOX_ENV, STORAGE_SHARE_ENV, OBJECT_STORAGE_ENV, loadStorageBoxEnv, loadStorageShareEnv, loadObjectStorageEnv, } from './utils/env-config';
|
|
18
|
+
/**
|
|
19
|
+
* Default export is the HetznerStorageClient factory
|
|
20
|
+
*/
|
|
21
|
+
export { HetznerStorageClient as default } from './HetznerStorageClient';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hetzner Storage SDK
|
|
4
|
+
*
|
|
5
|
+
* A TypeScript SDK for interacting with Hetzner Storage Box, Storage Share, and Object Storage
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.default = exports.loadObjectStorageEnv = exports.loadStorageShareEnv = exports.loadStorageBoxEnv = exports.OBJECT_STORAGE_ENV = exports.STORAGE_SHARE_ENV = exports.STORAGE_BOX_ENV = exports.S3ApiClient = exports.OcsApiClient = exports.RobotApiClient = exports.ObjectStorageProvider = exports.StorageShareProvider = exports.StorageBoxProvider = exports.BaseStorageProvider = exports.HetznerStorageClient = void 0;
|
|
25
|
+
var HetznerStorageClient_1 = require("./HetznerStorageClient");
|
|
26
|
+
Object.defineProperty(exports, "HetznerStorageClient", { enumerable: true, get: function () { return HetznerStorageClient_1.HetznerStorageClient; } });
|
|
27
|
+
var BaseStorageProvider_1 = require("./providers/BaseStorageProvider");
|
|
28
|
+
Object.defineProperty(exports, "BaseStorageProvider", { enumerable: true, get: function () { return BaseStorageProvider_1.BaseStorageProvider; } });
|
|
29
|
+
var StorageBoxProvider_1 = require("./providers/StorageBoxProvider");
|
|
30
|
+
Object.defineProperty(exports, "StorageBoxProvider", { enumerable: true, get: function () { return StorageBoxProvider_1.StorageBoxProvider; } });
|
|
31
|
+
var StorageShareProvider_1 = require("./providers/StorageShareProvider");
|
|
32
|
+
Object.defineProperty(exports, "StorageShareProvider", { enumerable: true, get: function () { return StorageShareProvider_1.StorageShareProvider; } });
|
|
33
|
+
var ObjectStorageProvider_1 = require("./providers/ObjectStorageProvider");
|
|
34
|
+
Object.defineProperty(exports, "ObjectStorageProvider", { enumerable: true, get: function () { return ObjectStorageProvider_1.ObjectStorageProvider; } });
|
|
35
|
+
// Export all types
|
|
36
|
+
__exportStar(require("./types"), exports);
|
|
37
|
+
// Export utility clients for advanced usage
|
|
38
|
+
var RobotApiClient_1 = require("./utils/RobotApiClient");
|
|
39
|
+
Object.defineProperty(exports, "RobotApiClient", { enumerable: true, get: function () { return RobotApiClient_1.RobotApiClient; } });
|
|
40
|
+
var OcsApiClient_1 = require("./utils/OcsApiClient");
|
|
41
|
+
Object.defineProperty(exports, "OcsApiClient", { enumerable: true, get: function () { return OcsApiClient_1.OcsApiClient; } });
|
|
42
|
+
var S3ApiClient_1 = require("./utils/S3ApiClient");
|
|
43
|
+
Object.defineProperty(exports, "S3ApiClient", { enumerable: true, get: function () { return S3ApiClient_1.S3ApiClient; } });
|
|
44
|
+
// Export environment configuration utilities
|
|
45
|
+
var env_config_1 = require("./utils/env-config");
|
|
46
|
+
Object.defineProperty(exports, "STORAGE_BOX_ENV", { enumerable: true, get: function () { return env_config_1.STORAGE_BOX_ENV; } });
|
|
47
|
+
Object.defineProperty(exports, "STORAGE_SHARE_ENV", { enumerable: true, get: function () { return env_config_1.STORAGE_SHARE_ENV; } });
|
|
48
|
+
Object.defineProperty(exports, "OBJECT_STORAGE_ENV", { enumerable: true, get: function () { return env_config_1.OBJECT_STORAGE_ENV; } });
|
|
49
|
+
Object.defineProperty(exports, "loadStorageBoxEnv", { enumerable: true, get: function () { return env_config_1.loadStorageBoxEnv; } });
|
|
50
|
+
Object.defineProperty(exports, "loadStorageShareEnv", { enumerable: true, get: function () { return env_config_1.loadStorageShareEnv; } });
|
|
51
|
+
Object.defineProperty(exports, "loadObjectStorageEnv", { enumerable: true, get: function () { return env_config_1.loadObjectStorageEnv; } });
|
|
52
|
+
/**
|
|
53
|
+
* Default export is the HetznerStorageClient factory
|
|
54
|
+
*/
|
|
55
|
+
var HetznerStorageClient_2 = require("./HetznerStorageClient");
|
|
56
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return HetznerStorageClient_2.HetznerStorageClient; } });
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import { FileMetadata, UploadOptions, DownloadOptions, StorageConfig } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base class for all storage providers
|
|
5
|
+
* Defines the common interface that both Storage Box and Storage Share must implement
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class BaseStorageProvider {
|
|
8
|
+
protected config: StorageConfig;
|
|
9
|
+
constructor(config: StorageConfig);
|
|
10
|
+
/**
|
|
11
|
+
* List files and directories at the specified path
|
|
12
|
+
* @param remotePath - The remote path to list (default: '/')
|
|
13
|
+
* @returns Array of file metadata
|
|
14
|
+
*/
|
|
15
|
+
abstract listFiles(remotePath?: string): Promise<FileMetadata[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Upload a file to the storage
|
|
18
|
+
* @param localPath - Local file path or Buffer or Readable stream
|
|
19
|
+
* @param remotePath - Remote destination path
|
|
20
|
+
* @param options - Upload options
|
|
21
|
+
*/
|
|
22
|
+
abstract uploadFile(localPath: string | Buffer | Readable, remotePath: string, options?: UploadOptions): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Download a file from the storage
|
|
25
|
+
* @param remotePath - Remote file path
|
|
26
|
+
* @param localPath - Local destination path (optional, returns Buffer if not provided)
|
|
27
|
+
* @param options - Download options
|
|
28
|
+
* @returns Buffer if localPath is not provided, void otherwise
|
|
29
|
+
*/
|
|
30
|
+
abstract downloadFile(remotePath: string, localPath?: string, options?: DownloadOptions): Promise<Buffer | void>;
|
|
31
|
+
/**
|
|
32
|
+
* Delete a file or directory from the storage
|
|
33
|
+
* @param remotePath - Remote path to delete
|
|
34
|
+
*/
|
|
35
|
+
abstract deleteFile(remotePath: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Create a directory
|
|
38
|
+
* @param remotePath - Remote directory path to create
|
|
39
|
+
*/
|
|
40
|
+
abstract createDirectory(remotePath: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Move or rename a file/directory
|
|
43
|
+
* @param fromPath - Source path
|
|
44
|
+
* @param toPath - Destination path
|
|
45
|
+
*/
|
|
46
|
+
abstract moveFile(fromPath: string, toPath: string): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Copy a file/directory
|
|
49
|
+
* @param fromPath - Source path
|
|
50
|
+
* @param toPath - Destination path
|
|
51
|
+
*/
|
|
52
|
+
abstract copyFile(fromPath: string, toPath: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a file or directory exists
|
|
55
|
+
* @param remotePath - Remote path to check
|
|
56
|
+
* @returns true if exists, false otherwise
|
|
57
|
+
*/
|
|
58
|
+
abstract exists(remotePath: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Get metadata for a specific file or directory
|
|
61
|
+
* @param remotePath - Remote path
|
|
62
|
+
* @returns File metadata
|
|
63
|
+
*/
|
|
64
|
+
abstract getMetadata(remotePath: string): Promise<FileMetadata>;
|
|
65
|
+
/**
|
|
66
|
+
* Get the provider type
|
|
67
|
+
*/
|
|
68
|
+
abstract getProviderType(): 'box' | 'share' | 'object';
|
|
69
|
+
/**
|
|
70
|
+
* Clean up resources and close connections
|
|
71
|
+
*/
|
|
72
|
+
abstract disconnect(): Promise<void>;
|
|
73
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BaseStorageProvider = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for all storage providers
|
|
6
|
+
* Defines the common interface that both Storage Box and Storage Share must implement
|
|
7
|
+
*/
|
|
8
|
+
class BaseStorageProvider {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.BaseStorageProvider = BaseStorageProvider;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Readable } from 'stream';
|
|
2
|
+
import { BaseStorageProvider } from './BaseStorageProvider';
|
|
3
|
+
import { ObjectStorageConfig, FileMetadata, UploadOptions, DownloadOptions, BucketInfo, PresignedUrlOptions, MultipartUploadInfo, CompletedPart, ListObjectsOptions, ListObjectsResult } from '../types';
|
|
4
|
+
/**
|
|
5
|
+
* Provider for Hetzner Object Storage (S3-compatible)
|
|
6
|
+
* Uses AWS SDK S3 client for all operations
|
|
7
|
+
*/
|
|
8
|
+
export declare class ObjectStorageProvider extends BaseStorageProvider {
|
|
9
|
+
private _config;
|
|
10
|
+
private s3Client;
|
|
11
|
+
private defaultBucket;
|
|
12
|
+
private initPromise;
|
|
13
|
+
constructor(config: ObjectStorageConfig);
|
|
14
|
+
/**
|
|
15
|
+
* Ensure the default bucket exists, creating it if necessary
|
|
16
|
+
*/
|
|
17
|
+
private ensureBucketExists;
|
|
18
|
+
/**
|
|
19
|
+
* Wait for initialization to complete
|
|
20
|
+
*/
|
|
21
|
+
private ensureInitialized;
|
|
22
|
+
/**
|
|
23
|
+
* Normalize a remote path to an S3 key by stripping leading slashes
|
|
24
|
+
*/
|
|
25
|
+
private normalizeKey;
|
|
26
|
+
/**
|
|
27
|
+
* List files and directories at the specified path
|
|
28
|
+
*/
|
|
29
|
+
listFiles(remotePath?: string): Promise<FileMetadata[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Upload a file to the storage
|
|
32
|
+
*/
|
|
33
|
+
uploadFile(localPath: string | Buffer | Readable, remotePath: string, options?: UploadOptions): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Download a file from the storage
|
|
36
|
+
*/
|
|
37
|
+
downloadFile(remotePath: string, localPath?: string, options?: DownloadOptions): Promise<Buffer | void>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete a file or directory from the storage
|
|
40
|
+
*/
|
|
41
|
+
deleteFile(remotePath: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Create a directory (S3 directory marker)
|
|
44
|
+
*/
|
|
45
|
+
createDirectory(remotePath: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Move or rename a file (copy + delete, since S3 has no native move)
|
|
48
|
+
*/
|
|
49
|
+
moveFile(fromPath: string, toPath: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Copy a file
|
|
52
|
+
*/
|
|
53
|
+
copyFile(fromPath: string, toPath: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a file or directory exists
|
|
56
|
+
*/
|
|
57
|
+
exists(remotePath: string): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* Get metadata for a specific file or directory
|
|
60
|
+
*/
|
|
61
|
+
getMetadata(remotePath: string): Promise<FileMetadata>;
|
|
62
|
+
/**
|
|
63
|
+
* Get the provider type
|
|
64
|
+
*/
|
|
65
|
+
getProviderType(): 'object';
|
|
66
|
+
/**
|
|
67
|
+
* Clean up resources
|
|
68
|
+
*/
|
|
69
|
+
disconnect(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* List all buckets
|
|
72
|
+
*/
|
|
73
|
+
listBuckets(): Promise<BucketInfo[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Create a new bucket
|
|
76
|
+
*/
|
|
77
|
+
createBucket(name: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Delete a bucket
|
|
80
|
+
*/
|
|
81
|
+
deleteBucket(name: string): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Check if a bucket exists
|
|
84
|
+
*/
|
|
85
|
+
bucketExists(name: string): Promise<boolean>;
|
|
86
|
+
/**
|
|
87
|
+
* Generate a presigned download URL
|
|
88
|
+
*/
|
|
89
|
+
getPresignedDownloadUrl(key: string, options?: PresignedUrlOptions): Promise<string>;
|
|
90
|
+
/**
|
|
91
|
+
* Generate a presigned upload URL
|
|
92
|
+
*/
|
|
93
|
+
getPresignedUploadUrl(key: string, options?: PresignedUrlOptions): Promise<string>;
|
|
94
|
+
/**
|
|
95
|
+
* Initiate a multipart upload
|
|
96
|
+
*/
|
|
97
|
+
createMultipartUpload(key: string, contentType?: string): Promise<MultipartUploadInfo>;
|
|
98
|
+
/**
|
|
99
|
+
* Upload a part of a multipart upload
|
|
100
|
+
*/
|
|
101
|
+
uploadPart(key: string, uploadId: string, partNumber: number, body: Buffer): Promise<CompletedPart>;
|
|
102
|
+
/**
|
|
103
|
+
* Complete a multipart upload
|
|
104
|
+
*/
|
|
105
|
+
completeMultipartUpload(key: string, uploadId: string, parts: CompletedPart[]): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Abort a multipart upload
|
|
108
|
+
*/
|
|
109
|
+
abortMultipartUpload(key: string, uploadId: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* List objects with pagination support
|
|
112
|
+
*/
|
|
113
|
+
listObjectsPaginated(options?: ListObjectsOptions): Promise<ListObjectsResult>;
|
|
114
|
+
}
|