@thewhateverapp/platform 0.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/README.md +223 -0
- package/dist/ai/mock.d.ts +14 -0
- package/dist/ai/mock.d.ts.map +1 -0
- package/dist/ai/mock.js +38 -0
- package/dist/ai/mock.js.map +1 -0
- package/dist/ai/production.d.ts +17 -0
- package/dist/ai/production.d.ts.map +1 -0
- package/dist/ai/production.js +41 -0
- package/dist/ai/production.js.map +1 -0
- package/dist/analytics/client.d.ts +21 -0
- package/dist/analytics/client.d.ts.map +1 -0
- package/dist/analytics/client.js +60 -0
- package/dist/analytics/client.js.map +1 -0
- package/dist/assets/client.d.ts +23 -0
- package/dist/assets/client.d.ts.map +1 -0
- package/dist/assets/client.js +105 -0
- package/dist/assets/client.js.map +1 -0
- package/dist/auth/client.d.ts +20 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +53 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/types.d.ts +50 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +5 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/db/mock.d.ts +43 -0
- package/dist/db/mock.d.ts.map +1 -0
- package/dist/db/mock.js +343 -0
- package/dist/db/mock.js.map +1 -0
- package/dist/db/production.d.ts +16 -0
- package/dist/db/production.d.ts.map +1 -0
- package/dist/db/production.js +77 -0
- package/dist/db/production.js.map +1 -0
- package/dist/edge/database/index.d.ts +46 -0
- package/dist/edge/database/index.d.ts.map +1 -0
- package/dist/edge/database/index.js +82 -0
- package/dist/edge/database/index.js.map +1 -0
- package/dist/edge/database/providers/flex-db.d.ts +22 -0
- package/dist/edge/database/providers/flex-db.d.ts.map +1 -0
- package/dist/edge/database/providers/flex-db.js +351 -0
- package/dist/edge/database/providers/flex-db.js.map +1 -0
- package/dist/edge/database/providers/index.d.ts +7 -0
- package/dist/edge/database/providers/index.d.ts.map +1 -0
- package/dist/edge/database/providers/index.js +11 -0
- package/dist/edge/database/providers/index.js.map +1 -0
- package/dist/edge/database/types.d.ts +148 -0
- package/dist/edge/database/types.d.ts.map +1 -0
- package/dist/edge/database/types.js +8 -0
- package/dist/edge/database/types.js.map +1 -0
- package/dist/edge/index.d.ts +12 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +12 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/kv/index.d.ts +50 -0
- package/dist/edge/kv/index.d.ts.map +1 -0
- package/dist/edge/kv/index.js +83 -0
- package/dist/edge/kv/index.js.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts +31 -0
- package/dist/edge/kv/providers/cloudflare-kv.d.ts.map +1 -0
- package/dist/edge/kv/providers/cloudflare-kv.js +115 -0
- package/dist/edge/kv/providers/cloudflare-kv.js.map +1 -0
- package/dist/edge/kv/providers/index.d.ts +7 -0
- package/dist/edge/kv/providers/index.d.ts.map +1 -0
- package/dist/edge/kv/providers/index.js +10 -0
- package/dist/edge/kv/providers/index.js.map +1 -0
- package/dist/edge/kv/types.d.ts +155 -0
- package/dist/edge/kv/types.d.ts.map +1 -0
- package/dist/edge/kv/types.js +8 -0
- package/dist/edge/kv/types.js.map +1 -0
- package/dist/edge/storage/index.d.ts +50 -0
- package/dist/edge/storage/index.d.ts.map +1 -0
- package/dist/edge/storage/index.js +83 -0
- package/dist/edge/storage/index.js.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts +28 -0
- package/dist/edge/storage/providers/cloudflare-r2.d.ts.map +1 -0
- package/dist/edge/storage/providers/cloudflare-r2.js +178 -0
- package/dist/edge/storage/providers/cloudflare-r2.js.map +1 -0
- package/dist/edge/storage/providers/index.d.ts +7 -0
- package/dist/edge/storage/providers/index.d.ts.map +1 -0
- package/dist/edge/storage/providers/index.js +10 -0
- package/dist/edge/storage/providers/index.js.map +1 -0
- package/dist/edge/storage/types.d.ts +305 -0
- package/dist/edge/storage/types.d.ts.map +1 -0
- package/dist/edge/storage/types.js +8 -0
- package/dist/edge/storage/types.js.map +1 -0
- package/dist/identity/client.d.ts +20 -0
- package/dist/identity/client.d.ts.map +1 -0
- package/dist/identity/client.js +40 -0
- package/dist/identity/client.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/client.d.ts +20 -0
- package/dist/notifications/client.d.ts.map +1 -0
- package/dist/notifications/client.js +38 -0
- package/dist/notifications/client.js.map +1 -0
- package/dist/payments/client.d.ts +21 -0
- package/dist/payments/client.d.ts.map +1 -0
- package/dist/payments/client.js +52 -0
- package/dist/payments/client.js.map +1 -0
- package/dist/platform.d.ts +65 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +254 -0
- package/dist/platform.js.map +1 -0
- package/dist/social/client.d.ts +29 -0
- package/dist/social/client.d.ts.map +1 -0
- package/dist/social/client.js +83 -0
- package/dist/social/client.js.map +1 -0
- package/dist/storage/mock.d.ts +27 -0
- package/dist/storage/mock.d.ts.map +1 -0
- package/dist/storage/mock.js +102 -0
- package/dist/storage/mock.js.map +1 -0
- package/dist/storage/production.d.ts +28 -0
- package/dist/storage/production.d.ts.map +1 -0
- package/dist/storage/production.js +75 -0
- package/dist/storage/production.js.map +1 -0
- package/dist/types.d.ts +399 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge Object Storage API
|
|
3
|
+
*
|
|
4
|
+
* Provides an S3-like object storage interface for user-generated apps.
|
|
5
|
+
* Automatically selects the appropriate provider based on environment configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { getStorage } from '@thewhateverapp/platform/edge';
|
|
10
|
+
*
|
|
11
|
+
* export async function POST(req: NextRequest) {
|
|
12
|
+
* const storage = await getStorage(req);
|
|
13
|
+
*
|
|
14
|
+
* // Upload a file
|
|
15
|
+
* const file = await req.formData().get('file') as File;
|
|
16
|
+
* const result = await storage.put(`uploads/${file.name}`, file, {
|
|
17
|
+
* contentType: file.type
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* return NextResponse.json({ url: result.url });
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import { CloudflareR2 } from './providers';
|
|
25
|
+
/**
|
|
26
|
+
* Get a storage instance for the current request
|
|
27
|
+
*
|
|
28
|
+
* Automatically selects the appropriate provider based on environment:
|
|
29
|
+
* - 'r2' (default): Cloudflare R2
|
|
30
|
+
* - 's3': AWS S3
|
|
31
|
+
* - 'backblaze': Backblaze B2
|
|
32
|
+
*
|
|
33
|
+
* @param req - NextRequest or object with env property
|
|
34
|
+
* @returns Storage provider instance
|
|
35
|
+
*/
|
|
36
|
+
export async function getStorage(req) {
|
|
37
|
+
const env = 'env' in req ? req.env : req.env;
|
|
38
|
+
if (!env) {
|
|
39
|
+
throw new Error('No environment found in request. Ensure you are running in edge runtime.');
|
|
40
|
+
}
|
|
41
|
+
// Check for R2 binding
|
|
42
|
+
if (!env.STORAGE) {
|
|
43
|
+
throw new Error('No R2 bucket binding found. Add an R2 bucket binding named "STORAGE" to your wrangler.jsonc');
|
|
44
|
+
}
|
|
45
|
+
// Get provider from environment (defaults to 'r2')
|
|
46
|
+
const provider = env.STORAGE_PROVIDER || 'r2';
|
|
47
|
+
switch (provider) {
|
|
48
|
+
case 'r2':
|
|
49
|
+
return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
|
|
50
|
+
case 's3':
|
|
51
|
+
// Future: AWS S3 implementation
|
|
52
|
+
throw new Error('AWS S3 provider not yet implemented. Use STORAGE_PROVIDER=r2 or remove STORAGE_PROVIDER.');
|
|
53
|
+
case 'backblaze':
|
|
54
|
+
// Future: Backblaze B2 implementation
|
|
55
|
+
throw new Error('Backblaze B2 provider not yet implemented. Use STORAGE_PROVIDER=r2 or remove STORAGE_PROVIDER.');
|
|
56
|
+
default:
|
|
57
|
+
console.warn(`Unknown STORAGE_PROVIDER: ${provider}. Falling back to Cloudflare R2.`);
|
|
58
|
+
return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a storage instance directly (for advanced usage)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const storage = createStorage({ STORAGE: env.STORAGE });
|
|
67
|
+
* await storage.put('file.txt', 'Hello World');
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export function createStorage(env) {
|
|
71
|
+
if (!env.STORAGE) {
|
|
72
|
+
throw new Error('No R2 bucket binding found.');
|
|
73
|
+
}
|
|
74
|
+
const provider = env.STORAGE_PROVIDER || 'r2';
|
|
75
|
+
switch (provider) {
|
|
76
|
+
case 'r2':
|
|
77
|
+
return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
|
|
78
|
+
default:
|
|
79
|
+
console.warn(`Unknown STORAGE_PROVIDER: ${provider}. Falling back to Cloudflare R2.`);
|
|
80
|
+
return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/edge/storage/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAmD;IAEnD,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,GAAW,CAAC,GAAG,CAAC;IAEtD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAE9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAE/D,KAAK,IAAI;YACP,gCAAgC;YAChC,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;QAEJ,KAAK,WAAW;YACd,sCAAsC;YACtC,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;QAEJ;YACE,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,kCAAkC,CAAC,CAAC;YACtF,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,GAAyB;IACrD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAE9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAE/D;YACE,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,kCAAkC,CAAC,CAAC;YACtF,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare R2 provider implementation
|
|
3
|
+
*
|
|
4
|
+
* Direct wrapper around Cloudflare R2 with consistent API
|
|
5
|
+
*/
|
|
6
|
+
import type { StorageProvider, StorageValue, PutOptions, PutResult, GetOptions, StorageObject, StorageMetadata, ListOptions, ListResult, PublicUrlOptions } from '../types';
|
|
7
|
+
/**
|
|
8
|
+
* Cloudflare R2 implementation
|
|
9
|
+
*/
|
|
10
|
+
export declare class CloudflareR2 implements StorageProvider {
|
|
11
|
+
private r2;
|
|
12
|
+
private publicUrl?;
|
|
13
|
+
constructor(r2: R2Bucket, publicUrl?: string | undefined);
|
|
14
|
+
put(key: string, data: StorageValue, options?: PutOptions): Promise<PutResult>;
|
|
15
|
+
get(key: string, options?: GetOptions): Promise<StorageObject | null>;
|
|
16
|
+
delete(key: string): Promise<void>;
|
|
17
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
18
|
+
exists(key: string): Promise<boolean>;
|
|
19
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
20
|
+
head(key: string): Promise<StorageMetadata | null>;
|
|
21
|
+
getPublicUrl(key: string, options?: PublicUrlOptions): string;
|
|
22
|
+
copy(sourceKey: string, destinationKey: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Parse range string to R2Range object
|
|
25
|
+
*/
|
|
26
|
+
private parseRange;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cloudflare-r2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-r2.d.ts","sourceRoot":"","sources":["../../../../src/edge/storage/providers/cloudflare-r2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,qBAAa,YAAa,YAAW,eAAe;IAEhD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,SAAS,CAAC;gBADV,EAAE,EAAE,QAAQ,EACZ,SAAS,CAAC,EAAE,MAAM,YAAA;IAGtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA2B9E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgDrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAuChD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkBxD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAgBvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE;;OAEG;IACH,OAAO,CAAC,UAAU;CAoBnB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare R2 provider implementation
|
|
3
|
+
*
|
|
4
|
+
* Direct wrapper around Cloudflare R2 with consistent API
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Cloudflare R2 implementation
|
|
8
|
+
*/
|
|
9
|
+
export class CloudflareR2 {
|
|
10
|
+
r2;
|
|
11
|
+
publicUrl;
|
|
12
|
+
constructor(r2, publicUrl) {
|
|
13
|
+
this.r2 = r2;
|
|
14
|
+
this.publicUrl = publicUrl;
|
|
15
|
+
}
|
|
16
|
+
async put(key, data, options) {
|
|
17
|
+
const r2Options = {};
|
|
18
|
+
if (options?.contentType || options?.cacheControl || options?.contentDisposition || options?.contentEncoding) {
|
|
19
|
+
r2Options.httpMetadata = {
|
|
20
|
+
...(options?.contentType && { contentType: options.contentType }),
|
|
21
|
+
...(options?.cacheControl && { cacheControl: options.cacheControl }),
|
|
22
|
+
...(options?.contentDisposition && { contentDisposition: options.contentDisposition }),
|
|
23
|
+
...(options?.contentEncoding && { contentEncoding: options.contentEncoding }),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
if (options?.metadata) {
|
|
27
|
+
r2Options.customMetadata = options.metadata;
|
|
28
|
+
}
|
|
29
|
+
const result = await this.r2.put(key, data, r2Options);
|
|
30
|
+
return {
|
|
31
|
+
key,
|
|
32
|
+
url: this.getPublicUrl(key),
|
|
33
|
+
size: result ? 0 : 0, // R2 doesn't return size on put
|
|
34
|
+
etag: result?.etag,
|
|
35
|
+
versionId: result?.version,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async get(key, options) {
|
|
39
|
+
const r2Options = {};
|
|
40
|
+
if (options?.range) {
|
|
41
|
+
r2Options.range = this.parseRange(options.range);
|
|
42
|
+
}
|
|
43
|
+
const object = await this.r2.get(key, r2Options);
|
|
44
|
+
if (!object) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
let body = object.body;
|
|
48
|
+
// Convert body based on requested type
|
|
49
|
+
if (options?.type) {
|
|
50
|
+
switch (options.type) {
|
|
51
|
+
case 'text':
|
|
52
|
+
body = await object.text();
|
|
53
|
+
break;
|
|
54
|
+
case 'json':
|
|
55
|
+
body = await object.json();
|
|
56
|
+
break;
|
|
57
|
+
case 'arrayBuffer':
|
|
58
|
+
body = await object.arrayBuffer();
|
|
59
|
+
break;
|
|
60
|
+
case 'blob':
|
|
61
|
+
body = await object.blob();
|
|
62
|
+
break;
|
|
63
|
+
case 'stream':
|
|
64
|
+
body = object.body;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
key: object.key,
|
|
70
|
+
body,
|
|
71
|
+
size: object.size,
|
|
72
|
+
contentType: object.httpMetadata?.contentType,
|
|
73
|
+
etag: object.etag,
|
|
74
|
+
uploaded: object.uploaded,
|
|
75
|
+
metadata: object.customMetadata,
|
|
76
|
+
httpMetadata: object.httpMetadata,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async delete(key) {
|
|
80
|
+
await this.r2.delete(key);
|
|
81
|
+
}
|
|
82
|
+
async deleteMany(keys) {
|
|
83
|
+
await this.r2.delete(keys);
|
|
84
|
+
}
|
|
85
|
+
async exists(key) {
|
|
86
|
+
const object = await this.r2.head(key);
|
|
87
|
+
return object !== null;
|
|
88
|
+
}
|
|
89
|
+
async list(options) {
|
|
90
|
+
const r2Options = {};
|
|
91
|
+
if (options?.prefix) {
|
|
92
|
+
r2Options.prefix = options.prefix;
|
|
93
|
+
}
|
|
94
|
+
if (options?.limit) {
|
|
95
|
+
r2Options.limit = options.limit;
|
|
96
|
+
}
|
|
97
|
+
if (options?.cursor) {
|
|
98
|
+
r2Options.cursor = options.cursor;
|
|
99
|
+
}
|
|
100
|
+
if (options?.delimiter) {
|
|
101
|
+
r2Options.delimiter = options.delimiter;
|
|
102
|
+
}
|
|
103
|
+
// Note: R2 list doesn't support include parameter in current types
|
|
104
|
+
// Include metadata is always returned if available
|
|
105
|
+
const result = await this.r2.list(r2Options);
|
|
106
|
+
return {
|
|
107
|
+
objects: result.objects.map((obj) => ({
|
|
108
|
+
key: obj.key,
|
|
109
|
+
size: obj.size,
|
|
110
|
+
uploaded: obj.uploaded,
|
|
111
|
+
etag: obj.etag,
|
|
112
|
+
httpMetadata: obj.httpMetadata,
|
|
113
|
+
customMetadata: obj.customMetadata,
|
|
114
|
+
})),
|
|
115
|
+
delimitedPrefixes: result.delimitedPrefixes,
|
|
116
|
+
truncated: result.truncated,
|
|
117
|
+
cursor: !result.truncated ? undefined : undefined, // R2 uses different pagination
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async head(key) {
|
|
121
|
+
const object = await this.r2.head(key);
|
|
122
|
+
if (!object) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
key: object.key,
|
|
127
|
+
size: object.size,
|
|
128
|
+
contentType: object.httpMetadata?.contentType,
|
|
129
|
+
etag: object.etag,
|
|
130
|
+
uploaded: object.uploaded,
|
|
131
|
+
metadata: object.customMetadata,
|
|
132
|
+
httpMetadata: object.httpMetadata,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
getPublicUrl(key, options) {
|
|
136
|
+
const baseUrl = options?.publicUrl || this.publicUrl;
|
|
137
|
+
if (!baseUrl) {
|
|
138
|
+
// Return a placeholder URL if no public URL is configured
|
|
139
|
+
return `r2://${key}`;
|
|
140
|
+
}
|
|
141
|
+
// Ensure baseUrl doesn't end with /
|
|
142
|
+
const cleanBaseUrl = baseUrl.replace(/\/$/, '');
|
|
143
|
+
// Ensure key doesn't start with /
|
|
144
|
+
const cleanKey = key.replace(/^\//, '');
|
|
145
|
+
return `${cleanBaseUrl}/${cleanKey}`;
|
|
146
|
+
}
|
|
147
|
+
async copy(sourceKey, destinationKey) {
|
|
148
|
+
// R2 doesn't have native copy, so we need to get and put
|
|
149
|
+
const source = await this.r2.get(sourceKey);
|
|
150
|
+
if (!source) {
|
|
151
|
+
throw new Error(`Source object not found: ${sourceKey}`);
|
|
152
|
+
}
|
|
153
|
+
await this.r2.put(destinationKey, source.body, {
|
|
154
|
+
httpMetadata: source.httpMetadata,
|
|
155
|
+
customMetadata: source.customMetadata,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Parse range string to R2Range object
|
|
160
|
+
*/
|
|
161
|
+
parseRange(range) {
|
|
162
|
+
// Parse "bytes=start-end" format
|
|
163
|
+
const match = range.match(/bytes=(\d+)-(\d*)/);
|
|
164
|
+
if (!match) {
|
|
165
|
+
throw new Error(`Invalid range format: ${range}`);
|
|
166
|
+
}
|
|
167
|
+
const offset = parseInt(match[1], 10);
|
|
168
|
+
const end = match[2] ? parseInt(match[2], 10) : undefined;
|
|
169
|
+
if (end !== undefined) {
|
|
170
|
+
return {
|
|
171
|
+
offset,
|
|
172
|
+
length: end - offset + 1,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return { offset };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=cloudflare-r2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-r2.js","sourceRoot":"","sources":["../../../../src/edge/storage/providers/cloudflare-r2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/edge/storage/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage provider registry
|
|
3
|
+
*
|
|
4
|
+
* Export all available storage providers
|
|
5
|
+
*/
|
|
6
|
+
export { CloudflareR2 } from './cloudflare-r2';
|
|
7
|
+
// Future providers:
|
|
8
|
+
// export { AWSS3 } from './aws-s3';
|
|
9
|
+
// export { BackblazeB2 } from './backblaze-b2';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/edge/storage/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,oBAAoB;AACpB,oCAAoC;AACpC,gDAAgD"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object Storage abstraction types for edge runtime
|
|
3
|
+
*
|
|
4
|
+
* Provides an S3-like object storage interface that can be implemented by various providers
|
|
5
|
+
* (Cloudflare R2, AWS S3, Backblaze B2, etc.) allowing seamless upgrades as apps scale.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Main storage provider interface
|
|
9
|
+
*/
|
|
10
|
+
export interface StorageProvider {
|
|
11
|
+
/**
|
|
12
|
+
* Upload an object
|
|
13
|
+
* @param key - The object key (path)
|
|
14
|
+
* @param data - The data to upload
|
|
15
|
+
* @param options - Upload options
|
|
16
|
+
*/
|
|
17
|
+
put(key: string, data: StorageValue, options?: PutOptions): Promise<PutResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Get an object
|
|
20
|
+
* @param key - The object key (path)
|
|
21
|
+
* @param options - Get options
|
|
22
|
+
*/
|
|
23
|
+
get(key: string, options?: GetOptions): Promise<StorageObject | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Delete an object
|
|
26
|
+
* @param key - The object key (path)
|
|
27
|
+
*/
|
|
28
|
+
delete(key: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Delete multiple objects
|
|
31
|
+
* @param keys - Array of object keys to delete
|
|
32
|
+
*/
|
|
33
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Check if an object exists
|
|
36
|
+
* @param key - The object key (path)
|
|
37
|
+
*/
|
|
38
|
+
exists(key: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* List objects
|
|
41
|
+
* @param options - List options (prefix, limit, cursor)
|
|
42
|
+
*/
|
|
43
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Get object metadata without retrieving the object body
|
|
46
|
+
* @param key - The object key (path)
|
|
47
|
+
*/
|
|
48
|
+
head(key: string): Promise<StorageMetadata | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Get a public URL for an object
|
|
51
|
+
* @param key - The object key (path)
|
|
52
|
+
* @param options - URL options (expiration, etc.)
|
|
53
|
+
*/
|
|
54
|
+
getPublicUrl(key: string, options?: PublicUrlOptions): string;
|
|
55
|
+
/**
|
|
56
|
+
* Get a signed URL for temporary access
|
|
57
|
+
* @param key - The object key (path)
|
|
58
|
+
* @param options - Signed URL options
|
|
59
|
+
*/
|
|
60
|
+
getSignedUrl?(key: string, options?: SignedUrlOptions): Promise<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Copy an object
|
|
63
|
+
* @param sourceKey - Source object key
|
|
64
|
+
* @param destinationKey - Destination object key
|
|
65
|
+
*/
|
|
66
|
+
copy?(sourceKey: string, destinationKey: string): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Values that can be stored
|
|
70
|
+
*/
|
|
71
|
+
export type StorageValue = string | ReadableStream | ArrayBuffer | Blob | Uint8Array;
|
|
72
|
+
/**
|
|
73
|
+
* Options for putting objects
|
|
74
|
+
*/
|
|
75
|
+
export interface PutOptions {
|
|
76
|
+
/**
|
|
77
|
+
* Content type (MIME type)
|
|
78
|
+
*/
|
|
79
|
+
contentType?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Cache control header
|
|
82
|
+
*/
|
|
83
|
+
cacheControl?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Content disposition header
|
|
86
|
+
*/
|
|
87
|
+
contentDisposition?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Content encoding header
|
|
90
|
+
*/
|
|
91
|
+
contentEncoding?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Custom metadata
|
|
94
|
+
*/
|
|
95
|
+
metadata?: Record<string, string>;
|
|
96
|
+
/**
|
|
97
|
+
* HTTP headers to set
|
|
98
|
+
*/
|
|
99
|
+
customMetadata?: Record<string, string>;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Result from putting an object
|
|
103
|
+
*/
|
|
104
|
+
export interface PutResult {
|
|
105
|
+
/**
|
|
106
|
+
* The object key
|
|
107
|
+
*/
|
|
108
|
+
key: string;
|
|
109
|
+
/**
|
|
110
|
+
* Public URL (if available)
|
|
111
|
+
*/
|
|
112
|
+
url?: string;
|
|
113
|
+
/**
|
|
114
|
+
* Size in bytes
|
|
115
|
+
*/
|
|
116
|
+
size: number;
|
|
117
|
+
/**
|
|
118
|
+
* ETag
|
|
119
|
+
*/
|
|
120
|
+
etag?: string;
|
|
121
|
+
/**
|
|
122
|
+
* Version ID (if versioning enabled)
|
|
123
|
+
*/
|
|
124
|
+
versionId?: string;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Options for getting objects
|
|
128
|
+
*/
|
|
129
|
+
export interface GetOptions {
|
|
130
|
+
/**
|
|
131
|
+
* Get object as specific type
|
|
132
|
+
*/
|
|
133
|
+
type?: 'text' | 'json' | 'arrayBuffer' | 'blob' | 'stream';
|
|
134
|
+
/**
|
|
135
|
+
* Byte range to retrieve (e.g., "bytes=0-1023")
|
|
136
|
+
*/
|
|
137
|
+
range?: string;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Object retrieved from storage
|
|
141
|
+
*/
|
|
142
|
+
export interface StorageObject {
|
|
143
|
+
/**
|
|
144
|
+
* The object key
|
|
145
|
+
*/
|
|
146
|
+
key: string;
|
|
147
|
+
/**
|
|
148
|
+
* The object body
|
|
149
|
+
*/
|
|
150
|
+
body: ReadableStream | string | ArrayBuffer | Blob | any;
|
|
151
|
+
/**
|
|
152
|
+
* Size in bytes
|
|
153
|
+
*/
|
|
154
|
+
size: number;
|
|
155
|
+
/**
|
|
156
|
+
* Content type
|
|
157
|
+
*/
|
|
158
|
+
contentType?: string;
|
|
159
|
+
/**
|
|
160
|
+
* ETag
|
|
161
|
+
*/
|
|
162
|
+
etag?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Last modified timestamp
|
|
165
|
+
*/
|
|
166
|
+
uploaded: Date;
|
|
167
|
+
/**
|
|
168
|
+
* Custom metadata
|
|
169
|
+
*/
|
|
170
|
+
metadata?: Record<string, string>;
|
|
171
|
+
/**
|
|
172
|
+
* HTTP headers
|
|
173
|
+
*/
|
|
174
|
+
httpMetadata?: Record<string, string>;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Object metadata (from HEAD request)
|
|
178
|
+
*/
|
|
179
|
+
export interface StorageMetadata {
|
|
180
|
+
/**
|
|
181
|
+
* The object key
|
|
182
|
+
*/
|
|
183
|
+
key: string;
|
|
184
|
+
/**
|
|
185
|
+
* Size in bytes
|
|
186
|
+
*/
|
|
187
|
+
size: number;
|
|
188
|
+
/**
|
|
189
|
+
* Content type
|
|
190
|
+
*/
|
|
191
|
+
contentType?: string;
|
|
192
|
+
/**
|
|
193
|
+
* ETag
|
|
194
|
+
*/
|
|
195
|
+
etag?: string;
|
|
196
|
+
/**
|
|
197
|
+
* Last modified timestamp
|
|
198
|
+
*/
|
|
199
|
+
uploaded: Date;
|
|
200
|
+
/**
|
|
201
|
+
* Custom metadata
|
|
202
|
+
*/
|
|
203
|
+
metadata?: Record<string, string>;
|
|
204
|
+
/**
|
|
205
|
+
* HTTP headers
|
|
206
|
+
*/
|
|
207
|
+
httpMetadata?: Record<string, string>;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Options for listing objects
|
|
211
|
+
*/
|
|
212
|
+
export interface ListOptions {
|
|
213
|
+
/**
|
|
214
|
+
* Filter objects by prefix
|
|
215
|
+
*/
|
|
216
|
+
prefix?: string;
|
|
217
|
+
/**
|
|
218
|
+
* Maximum number of objects to return
|
|
219
|
+
*/
|
|
220
|
+
limit?: number;
|
|
221
|
+
/**
|
|
222
|
+
* Cursor for pagination
|
|
223
|
+
*/
|
|
224
|
+
cursor?: string;
|
|
225
|
+
/**
|
|
226
|
+
* Delimiter for grouping (e.g., '/')
|
|
227
|
+
*/
|
|
228
|
+
delimiter?: string;
|
|
229
|
+
/**
|
|
230
|
+
* Include metadata in results
|
|
231
|
+
*/
|
|
232
|
+
include?: Array<'httpMetadata' | 'customMetadata'>;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Result from listing objects
|
|
236
|
+
*/
|
|
237
|
+
export interface ListResult {
|
|
238
|
+
/**
|
|
239
|
+
* Array of objects
|
|
240
|
+
*/
|
|
241
|
+
objects: Array<{
|
|
242
|
+
key: string;
|
|
243
|
+
size: number;
|
|
244
|
+
uploaded: Date;
|
|
245
|
+
etag?: string;
|
|
246
|
+
httpMetadata?: Record<string, string>;
|
|
247
|
+
customMetadata?: Record<string, string>;
|
|
248
|
+
}>;
|
|
249
|
+
/**
|
|
250
|
+
* Common prefixes (if delimiter used)
|
|
251
|
+
*/
|
|
252
|
+
delimitedPrefixes?: string[];
|
|
253
|
+
/**
|
|
254
|
+
* Whether the list is truncated
|
|
255
|
+
*/
|
|
256
|
+
truncated: boolean;
|
|
257
|
+
/**
|
|
258
|
+
* Cursor for next page
|
|
259
|
+
*/
|
|
260
|
+
cursor?: string;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Options for generating public URLs
|
|
264
|
+
*/
|
|
265
|
+
export interface PublicUrlOptions {
|
|
266
|
+
/**
|
|
267
|
+
* Public bucket URL (if using custom domain)
|
|
268
|
+
*/
|
|
269
|
+
publicUrl?: string;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Options for generating signed URLs
|
|
273
|
+
*/
|
|
274
|
+
export interface SignedUrlOptions {
|
|
275
|
+
/**
|
|
276
|
+
* Expiration time in seconds
|
|
277
|
+
*/
|
|
278
|
+
expiresIn: number;
|
|
279
|
+
/**
|
|
280
|
+
* HTTP method (default: 'GET')
|
|
281
|
+
*/
|
|
282
|
+
method?: 'GET' | 'PUT' | 'DELETE';
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Cloudflare environment interface for R2
|
|
286
|
+
*/
|
|
287
|
+
export interface CloudflareStorageEnv {
|
|
288
|
+
STORAGE: R2Bucket;
|
|
289
|
+
STORAGE_PROVIDER?: 'r2' | 's3' | 'backblaze';
|
|
290
|
+
STORAGE_PUBLIC_URL?: string;
|
|
291
|
+
AWS_S3_BUCKET?: string;
|
|
292
|
+
AWS_ACCESS_KEY_ID?: string;
|
|
293
|
+
AWS_SECRET_ACCESS_KEY?: string;
|
|
294
|
+
AWS_REGION?: string;
|
|
295
|
+
BACKBLAZE_BUCKET?: string;
|
|
296
|
+
BACKBLAZE_KEY_ID?: string;
|
|
297
|
+
BACKBLAZE_APPLICATION_KEY?: string;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Request wrapper for NextRequest compatibility
|
|
301
|
+
*/
|
|
302
|
+
export interface StorageRequest {
|
|
303
|
+
env: CloudflareStorageEnv;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/edge/storage/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Object Storage abstraction types for edge runtime
|
|
3
|
+
*
|
|
4
|
+
* Provides an S3-like object storage interface that can be implemented by various providers
|
|
5
|
+
* (Cloudflare R2, AWS S3, Backblaze B2, etc.) allowing seamless upgrades as apps scale.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/edge/storage/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity service client
|
|
3
|
+
*/
|
|
4
|
+
import type { IdentityService, ResolveIdentityRequest, ResolveIdentityResponse, IdentityLink, UserInfo, LookupResult } from '../types';
|
|
5
|
+
interface IdentityConfig {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class IdentityAPI implements IdentityService {
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: IdentityConfig);
|
|
12
|
+
private request;
|
|
13
|
+
resolve(request: ResolveIdentityRequest): Promise<ResolveIdentityResponse>;
|
|
14
|
+
link(userId: string, identity: IdentityLink): Promise<void>;
|
|
15
|
+
unlink(userId: string, provider: string): Promise<void>;
|
|
16
|
+
getUser(userId: string): Promise<UserInfo | null>;
|
|
17
|
+
lookup(identity: IdentityLink): Promise<LookupResult>;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=client.d.ts.map
|