@rr-vault/sdk 1.0.1 → 1.0.3
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/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/s3.d.ts +14 -0
- package/dist/s3.d.ts.map +1 -0
- package/dist/s3.js +74 -0
- package/dist/s3.js.map +1 -0
- package/{src/types.ts → dist/types.d.ts} +27 -30
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +11 -3
- package/src/config.ts +0 -33
- package/src/index.ts +0 -39
- package/src/s3.ts +0 -88
- package/verify_r2.ts +0 -39
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { RRVaultConfig, R2Config } from "./types.js";
|
|
2
|
+
export declare function setConfig(newConfig: RRVaultConfig): void;
|
|
3
|
+
export declare function getConfig(): R2Config;
|
|
4
|
+
/**
|
|
5
|
+
* Validates the configuration by hitting an external API.
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateConfig(): Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Ensures the configuration is valid by performing a lazy check.
|
|
10
|
+
* Throws an error if validation fails.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureValidConfig(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAcrD,wBAAgB,SAAS,CAAC,SAAS,EAAE,aAAa,QAGjD;AAED,wBAAgB,SAAS,IAAI,QAAQ,CAapC;AAMD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBvD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAWvD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
const VALIDATION_API_URL = "http://localhost:8888/api/v1/validate";
|
|
3
|
+
const R2_INTERNAL = {
|
|
4
|
+
accountId: "cc0a96d7f01e9dd678a07a57dd665897",
|
|
5
|
+
bucketName: "rr-vault",
|
|
6
|
+
publicUrl: "https://pub-52b747d8c2c34c10bc750a3beaaf1ca4.r2.dev",
|
|
7
|
+
};
|
|
8
|
+
let userConfig = null;
|
|
9
|
+
let validationPerformed = false;
|
|
10
|
+
export function setConfig(newConfig) {
|
|
11
|
+
userConfig = { ...newConfig };
|
|
12
|
+
validationPerformed = false; // Reset validation on new config
|
|
13
|
+
}
|
|
14
|
+
export function getConfig() {
|
|
15
|
+
if (!userConfig) {
|
|
16
|
+
throw new Error("RRVault: SDK not configured. Please call RRVault.config() first.");
|
|
17
|
+
}
|
|
18
|
+
// Map user-facing appId/secretKey to internal R2 credentials
|
|
19
|
+
return {
|
|
20
|
+
...R2_INTERNAL,
|
|
21
|
+
accessKeyId: userConfig.appId,
|
|
22
|
+
secretAccessKey: userConfig.secretKey,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validates the configuration by hitting an external API.
|
|
27
|
+
*/
|
|
28
|
+
export async function validateConfig() {
|
|
29
|
+
if (!userConfig) {
|
|
30
|
+
throw new Error("RRVault: SDK not configured. Please call RRVault.config() first.");
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const response = await axios.post(VALIDATION_API_URL, {
|
|
34
|
+
appId: userConfig.appId,
|
|
35
|
+
secretKey: userConfig.secretKey,
|
|
36
|
+
});
|
|
37
|
+
// Expecting response format: { valid: boolean }
|
|
38
|
+
return response.status === 200 && response.data.valid === true;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error("RRVault Validation Error:", error.message);
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Ensures the configuration is valid by performing a lazy check.
|
|
47
|
+
* Throws an error if validation fails.
|
|
48
|
+
*/
|
|
49
|
+
export async function ensureValidConfig() {
|
|
50
|
+
if (validationPerformed)
|
|
51
|
+
return;
|
|
52
|
+
const isValid = await validateConfig();
|
|
53
|
+
if (!isValid) {
|
|
54
|
+
throw new Error("RRVault: Configuration validation failed. Please check your appId and secretKey.");
|
|
55
|
+
}
|
|
56
|
+
validationPerformed = true;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAEnE,MAAM,WAAW,GAAsD;IACrE,SAAS,EAAE,kCAAkC;IAC7C,UAAU,EAAE,UAAU;IACtB,SAAS,EAAE,qDAAqD;CACjE,CAAC;AAEF,IAAI,UAAU,GAAyB,IAAI,CAAC;AAC5C,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,MAAM,UAAU,SAAS,CAAC,SAAwB;IAChD,UAAU,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9B,mBAAmB,GAAG,KAAK,CAAC,CAAC,iCAAiC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,OAAO;QACL,GAAG,WAAW;QACd,WAAW,EAAE,UAAU,CAAC,KAAK;QAC7B,eAAe,EAAE,UAAU,CAAC,SAAS;KACtC,CAAC;AACJ,CAAC;AAMD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAqB,kBAAkB,EAAE;YACxE,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,SAAS,EAAE,UAAU,CAAC,SAAS;SAChC,CAAC,CAAC;QAEH,gDAAgD;QAChD,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IACjE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,mBAAmB;QAAE,OAAO;IAEhC,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,mBAAmB,GAAG,IAAI,CAAC;AAC7B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { setConfig, validateConfig } from "./config.js";
|
|
2
|
+
import { upload as s3Upload, deleteFile as s3Delete } from "./s3.js";
|
|
3
|
+
import { RRVaultConfig, R2Config, UploadOptions, UploadResult, DeleteResult } from "./types.js";
|
|
4
|
+
export declare class RRVault {
|
|
5
|
+
static config(config: RRVaultConfig): void;
|
|
6
|
+
/**
|
|
7
|
+
* Validates the configuration with the external API.
|
|
8
|
+
*/
|
|
9
|
+
static validate(): Promise<boolean>;
|
|
10
|
+
static upload(file: any, fileName: string, options?: UploadOptions): Promise<UploadResult>;
|
|
11
|
+
static delete(key: string): Promise<DeleteResult>;
|
|
12
|
+
}
|
|
13
|
+
export { setConfig as config, validateConfig as validate, s3Upload as upload, s3Delete as deleteFile };
|
|
14
|
+
export type { RRVaultConfig, R2Config, UploadOptions, UploadResult, DeleteResult };
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,UAAU,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhG,qBAAa,OAAO;IAElB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa;IAInC;;OAEG;WACU,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;WAK5B,MAAM,CACjB,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;WAIX,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAGxD;AAGD,OAAO,EACL,SAAS,IAAI,MAAM,EACnB,cAAc,IAAI,QAAQ,EAC1B,QAAQ,IAAI,MAAM,EAClB,QAAQ,IAAI,UAAU,EACvB,CAAC;AAGF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,YAAY,EACb,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { setConfig, validateConfig } from "./config.js";
|
|
2
|
+
import { upload as s3Upload, deleteFile as s3Delete } from "./s3.js";
|
|
3
|
+
export class RRVault {
|
|
4
|
+
static config(config) {
|
|
5
|
+
setConfig(config);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Validates the configuration with the external API.
|
|
9
|
+
*/
|
|
10
|
+
static async validate() {
|
|
11
|
+
return await validateConfig();
|
|
12
|
+
}
|
|
13
|
+
static async upload(file, fileName, options = {}) {
|
|
14
|
+
return await s3Upload(file, fileName, options);
|
|
15
|
+
}
|
|
16
|
+
static async delete(key) {
|
|
17
|
+
return await s3Delete(key);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// Functional approach exports
|
|
21
|
+
export { setConfig as config, validateConfig as validate, s3Upload as upload, s3Delete as deleteFile };
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,UAAU,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGrE,MAAM,OAAO,OAAO;IAElB,MAAM,CAAC,MAAM,CAAC,MAAqB;QACjC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ;QACnB,OAAO,MAAM,cAAc,EAAE,CAAC;IAChC,CAAC;IAGD,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,IAAS,EACT,QAAgB,EAChB,UAAyB,EAAE;QAE3B,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,OAAO,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,8BAA8B;AAC9B,OAAO,EACL,SAAS,IAAI,MAAM,EACnB,cAAc,IAAI,QAAQ,EAC1B,QAAQ,IAAI,MAAM,EAClB,QAAQ,IAAI,UAAU,EACvB,CAAC"}
|
package/dist/s3.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { UploadOptions, UploadResult, DeleteResult } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Upload a file to Cloudflare R2
|
|
4
|
+
* @param file - File content (Buffer, Blob, Uint8Array)
|
|
5
|
+
* @param fileName - Original name of the file
|
|
6
|
+
* @param options - Additional upload options
|
|
7
|
+
*/
|
|
8
|
+
export declare function upload(file: any, fileName: string, options?: UploadOptions): Promise<UploadResult>;
|
|
9
|
+
/**
|
|
10
|
+
* Delete a file from Cloudflare R2
|
|
11
|
+
* @param key - The storage key (path) of the file
|
|
12
|
+
*/
|
|
13
|
+
export declare function deleteFile(key: string): Promise<DeleteResult>;
|
|
14
|
+
//# sourceMappingURL=s3.d.ts.map
|
package/dist/s3.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAoBvE;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAgCvB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAmBnE"}
|
package/dist/s3.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { S3Client, PutObjectCommand, DeleteObjectCommand } from "@aws-sdk/client-s3";
|
|
2
|
+
import { getConfig, ensureValidConfig } from "./config.js";
|
|
3
|
+
let s3Client = null;
|
|
4
|
+
function getS3Client() {
|
|
5
|
+
if (s3Client)
|
|
6
|
+
return s3Client;
|
|
7
|
+
const config = getConfig();
|
|
8
|
+
s3Client = new S3Client({
|
|
9
|
+
region: "auto",
|
|
10
|
+
endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,
|
|
11
|
+
credentials: {
|
|
12
|
+
accessKeyId: config.accessKeyId,
|
|
13
|
+
secretAccessKey: config.secretAccessKey,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
return s3Client;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Upload a file to Cloudflare R2
|
|
20
|
+
* @param file - File content (Buffer, Blob, Uint8Array)
|
|
21
|
+
* @param fileName - Original name of the file
|
|
22
|
+
* @param options - Additional upload options
|
|
23
|
+
*/
|
|
24
|
+
export async function upload(file, fileName, options = {}) {
|
|
25
|
+
await ensureValidConfig();
|
|
26
|
+
const config = getConfig();
|
|
27
|
+
const client = getS3Client();
|
|
28
|
+
// Clean folder path and construct key
|
|
29
|
+
const folder = options.folder ? `${options.folder.replace(/\/$/, "")}/` : "";
|
|
30
|
+
const key = `${folder}${Date.now()}-${fileName.replace(/\s+/g, "-")}`;
|
|
31
|
+
const command = new PutObjectCommand({
|
|
32
|
+
Bucket: config.bucketName,
|
|
33
|
+
Key: key,
|
|
34
|
+
Body: file,
|
|
35
|
+
ContentType: options.contentType || "application/octet-stream",
|
|
36
|
+
Metadata: options.metadata,
|
|
37
|
+
CacheControl: options.cacheControl,
|
|
38
|
+
});
|
|
39
|
+
const response = await client.send(command);
|
|
40
|
+
// Construct public URL
|
|
41
|
+
const baseUrl = config.publicUrl
|
|
42
|
+
? config.publicUrl.replace(/\/$/, "")
|
|
43
|
+
: `https://${config.bucketName}.${config.accountId}.r2.dev`;
|
|
44
|
+
const url = `${baseUrl}/${key}`;
|
|
45
|
+
return {
|
|
46
|
+
key,
|
|
47
|
+
url,
|
|
48
|
+
etag: response.ETag,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Delete a file from Cloudflare R2
|
|
53
|
+
* @param key - The storage key (path) of the file
|
|
54
|
+
*/
|
|
55
|
+
export async function deleteFile(key) {
|
|
56
|
+
await ensureValidConfig();
|
|
57
|
+
const config = getConfig();
|
|
58
|
+
const client = getS3Client();
|
|
59
|
+
const command = new DeleteObjectCommand({
|
|
60
|
+
Bucket: config.bucketName,
|
|
61
|
+
Key: key,
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
await client.send(command);
|
|
65
|
+
return { success: true };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
message: error.message || "Failed to delete file from R2"
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=s3.js.map
|
package/dist/s3.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +1,27 @@
|
|
|
1
|
-
export interface RRVaultConfig {
|
|
2
|
-
appId: string;
|
|
3
|
-
secretKey: string;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
success: boolean;
|
|
29
|
-
message?: string;
|
|
30
|
-
}
|
|
1
|
+
export interface RRVaultConfig {
|
|
2
|
+
appId: string;
|
|
3
|
+
secretKey: string;
|
|
4
|
+
}
|
|
5
|
+
export interface R2Config {
|
|
6
|
+
accountId: string;
|
|
7
|
+
accessKeyId: string;
|
|
8
|
+
secretAccessKey: string;
|
|
9
|
+
bucketName: string;
|
|
10
|
+
publicUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface UploadOptions {
|
|
13
|
+
folder?: string;
|
|
14
|
+
contentType?: string;
|
|
15
|
+
metadata?: Record<string, string>;
|
|
16
|
+
cacheControl?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface UploadResult {
|
|
19
|
+
key: string;
|
|
20
|
+
url: string;
|
|
21
|
+
etag?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface DeleteResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
message?: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rr-vault/sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "\"RR-Vault SDK is a developer-first cloud storage client for securely uploading, managing, and delivering files using API keys, app-based access, and scalable infrastructure.\"",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"homepage": "https://github.com/mdrezuanislamridoy/rr-vault-sdk#readme",
|
|
@@ -14,12 +14,20 @@
|
|
|
14
14
|
"license": "ISC",
|
|
15
15
|
"author": "Ridoy781 <ridoy.babu.781@gmail.com>",
|
|
16
16
|
"type": "module",
|
|
17
|
-
"main": "
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
18
22
|
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"prepublishOnly": "npm run build",
|
|
19
25
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
20
26
|
},
|
|
27
|
+
|
|
21
28
|
"devDependencies": {
|
|
22
|
-
"@types/node": "^25.5.0"
|
|
29
|
+
"@types/node": "^25.5.0",
|
|
30
|
+
"typescript": "^6.0.2"
|
|
23
31
|
},
|
|
24
32
|
"dependencies": {
|
|
25
33
|
"@aws-sdk/client-s3": "^3.1019.0",
|
package/src/config.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { RRVaultConfig, R2Config } from "./types";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Internal R2 settings.
|
|
5
|
-
* Ridoy: Replace these placeholders with your actual Cloudflare R2 values.
|
|
6
|
-
*/
|
|
7
|
-
const R2_INTERNAL: Omit<R2Config, "accessKeyId" | "secretAccessKey"> = {
|
|
8
|
-
accountId: "YOUR_ACCOUNT_ID",
|
|
9
|
-
bucketName: "YOUR_BUCKET_NAME",
|
|
10
|
-
publicUrl: "https://pub-your-id.r2.dev",
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
let userConfig: RRVaultConfig | null = null;
|
|
14
|
-
|
|
15
|
-
export function setConfig(newConfig: RRVaultConfig) {
|
|
16
|
-
userConfig = { ...newConfig };
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function getConfig(): R2Config {
|
|
20
|
-
if (!userConfig) {
|
|
21
|
-
throw new Error(
|
|
22
|
-
"RRVault: SDK not configured. Please call RRVault.config() first."
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Map user-facing appId/secretKey to internal R2 credentials
|
|
27
|
-
return {
|
|
28
|
-
...R2_INTERNAL,
|
|
29
|
-
accessKeyId: userConfig.appId,
|
|
30
|
-
secretAccessKey: userConfig.secretKey,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
package/src/index.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { setConfig } from "./config";
|
|
2
|
-
import { upload as s3Upload, deleteFile as s3Delete } from "./s3";
|
|
3
|
-
import { RRVaultConfig, R2Config, UploadOptions, UploadResult, DeleteResult } from "./types";
|
|
4
|
-
|
|
5
|
-
export class RRVault {
|
|
6
|
-
|
|
7
|
-
static config(config: RRVaultConfig) {
|
|
8
|
-
setConfig(config);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
static async upload(
|
|
13
|
-
file: any,
|
|
14
|
-
fileName: string,
|
|
15
|
-
options: UploadOptions = {}
|
|
16
|
-
): Promise<UploadResult> {
|
|
17
|
-
return await s3Upload(file, fileName, options);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
static async delete(key: string): Promise<DeleteResult> {
|
|
21
|
-
return await s3Delete(key);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Functional approach exports
|
|
26
|
-
export {
|
|
27
|
-
setConfig as config,
|
|
28
|
-
s3Upload as upload,
|
|
29
|
-
s3Delete as deleteFile
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
// Type exports
|
|
33
|
-
export type {
|
|
34
|
-
RRVaultConfig,
|
|
35
|
-
R2Config,
|
|
36
|
-
UploadOptions,
|
|
37
|
-
UploadResult,
|
|
38
|
-
DeleteResult
|
|
39
|
-
};
|
package/src/s3.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { S3Client, PutObjectCommand, DeleteObjectCommand } from "@aws-sdk/client-s3";
|
|
2
|
-
import { getConfig } from "./config";
|
|
3
|
-
import { UploadOptions, UploadResult, DeleteResult } from "./types";
|
|
4
|
-
|
|
5
|
-
let s3Client: S3Client | null = null;
|
|
6
|
-
|
|
7
|
-
function getS3Client() {
|
|
8
|
-
if (s3Client) return s3Client;
|
|
9
|
-
const config = getConfig();
|
|
10
|
-
|
|
11
|
-
s3Client = new S3Client({
|
|
12
|
-
region: "auto",
|
|
13
|
-
endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,
|
|
14
|
-
credentials: {
|
|
15
|
-
accessKeyId: config.accessKeyId,
|
|
16
|
-
secretAccessKey: config.secretAccessKey,
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
return s3Client;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Upload a file to Cloudflare R2
|
|
25
|
-
* @param file - File content (Buffer, Blob, Uint8Array)
|
|
26
|
-
* @param fileName - Original name of the file
|
|
27
|
-
* @param options - Additional upload options
|
|
28
|
-
*/
|
|
29
|
-
export async function upload(
|
|
30
|
-
file: any,
|
|
31
|
-
fileName: string,
|
|
32
|
-
options: UploadOptions = {}
|
|
33
|
-
): Promise<UploadResult> {
|
|
34
|
-
const config = getConfig();
|
|
35
|
-
const client = getS3Client();
|
|
36
|
-
|
|
37
|
-
// Clean folder path and construct key
|
|
38
|
-
const folder = options.folder ? `${options.folder.replace(/\/$/, "")}/` : "";
|
|
39
|
-
const key = `${folder}${Date.now()}-${fileName.replace(/\s+/g, "-")}`;
|
|
40
|
-
|
|
41
|
-
const command = new PutObjectCommand({
|
|
42
|
-
Bucket: config.bucketName,
|
|
43
|
-
Key: key,
|
|
44
|
-
Body: file,
|
|
45
|
-
ContentType: options.contentType || "application/octet-stream",
|
|
46
|
-
Metadata: options.metadata,
|
|
47
|
-
CacheControl: options.cacheControl,
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const response = await client.send(command);
|
|
51
|
-
|
|
52
|
-
// Construct public URL
|
|
53
|
-
const baseUrl = config.publicUrl
|
|
54
|
-
? config.publicUrl.replace(/\/$/, "")
|
|
55
|
-
: `https://${config.bucketName}.${config.accountId}.r2.dev`;
|
|
56
|
-
|
|
57
|
-
const url = `${baseUrl}/${key}`;
|
|
58
|
-
|
|
59
|
-
return {
|
|
60
|
-
key,
|
|
61
|
-
url,
|
|
62
|
-
etag: response.ETag,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Delete a file from Cloudflare R2
|
|
68
|
-
* @param key - The storage key (path) of the file
|
|
69
|
-
*/
|
|
70
|
-
export async function deleteFile(key: string): Promise<DeleteResult> {
|
|
71
|
-
const config = getConfig();
|
|
72
|
-
const client = getS3Client();
|
|
73
|
-
|
|
74
|
-
const command = new DeleteObjectCommand({
|
|
75
|
-
Bucket: config.bucketName,
|
|
76
|
-
Key: key,
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
try {
|
|
80
|
-
await client.send(command);
|
|
81
|
-
return { success: true };
|
|
82
|
-
} catch (error: any) {
|
|
83
|
-
return {
|
|
84
|
-
success: false,
|
|
85
|
-
message: error.message || "Failed to delete file from R2"
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
}
|
package/verify_r2.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { RRVault } from "./src/index";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const testConfig = {
|
|
5
|
-
appId: "YOUR_APP_ID",
|
|
6
|
-
secretKey: "YOUR_SECRET_KEY",
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
async function runTest() {
|
|
11
|
-
console.log("🚀 Starting RRVault R2 Test...");
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
// 1. Configure
|
|
15
|
-
RRVault.config(testConfig);
|
|
16
|
-
console.log("✅ Configured successfully.");
|
|
17
|
-
|
|
18
|
-
// 2. Upload
|
|
19
|
-
const fileContent = Buffer.from("Hello RRVault R2!");
|
|
20
|
-
const uploadResult = await RRVault.upload(fileContent, "test.txt", {
|
|
21
|
-
folder: "tests",
|
|
22
|
-
contentType: "text/plain",
|
|
23
|
-
});
|
|
24
|
-
console.log("✅ Upload successful:", uploadResult);
|
|
25
|
-
|
|
26
|
-
// 3. Delete
|
|
27
|
-
console.log("🕒 Waiting 2 seconds before delete...");
|
|
28
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
29
|
-
|
|
30
|
-
const deleteResult = await RRVault.delete(uploadResult.key);
|
|
31
|
-
console.log("✅ Delete result:", deleteResult);
|
|
32
|
-
|
|
33
|
-
} catch (error) {
|
|
34
|
-
console.error("❌ Test failed:", error);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// runTest();
|
|
39
|
-
console.log("Verification script ready. Update credentials and uncomment runTest() to execute.");
|