@thewhateverapp/platform 0.13.9 → 0.13.11
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/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +12 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/mock-provider.d.ts +16 -0
- package/dist/ai/mock-provider.d.ts.map +1 -0
- package/dist/ai/mock-provider.js +50 -0
- package/dist/ai/mock-provider.js.map +1 -0
- package/dist/ai/providers/http-proxy-ai.d.ts +29 -0
- package/dist/ai/providers/http-proxy-ai.d.ts.map +1 -0
- package/dist/ai/providers/http-proxy-ai.js +81 -0
- package/dist/ai/providers/http-proxy-ai.js.map +1 -0
- package/dist/ai/providers/index.d.ts +10 -0
- package/dist/ai/providers/index.d.ts.map +1 -0
- package/dist/ai/providers/index.js +15 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/three-tier-ai.d.ts +35 -0
- package/dist/ai/providers/three-tier-ai.d.ts.map +1 -0
- package/dist/ai/providers/three-tier-ai.js +43 -0
- package/dist/ai/providers/three-tier-ai.js.map +1 -0
- package/dist/ai/providers.d.ts +2 -0
- package/dist/ai/providers.d.ts.map +1 -1
- package/dist/ai/providers.js +4 -0
- package/dist/ai/providers.js.map +1 -1
- package/dist/ai/types.d.ts +5 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +11 -23
- package/dist/database/index.js.map +1 -1
- package/dist/database/mock-provider.d.ts +10 -0
- package/dist/database/mock-provider.d.ts.map +1 -0
- package/dist/database/mock-provider.js +145 -0
- package/dist/database/mock-provider.js.map +1 -0
- package/dist/database/providers/http-proxy-db.d.ts +24 -0
- package/dist/database/providers/http-proxy-db.d.ts.map +1 -0
- package/dist/database/providers/http-proxy-db.js +122 -0
- package/dist/database/providers/http-proxy-db.js.map +1 -0
- package/dist/database/providers/index.d.ts +2 -0
- package/dist/database/providers/index.d.ts.map +1 -1
- package/dist/database/providers/index.js +2 -0
- package/dist/database/providers/index.js.map +1 -1
- package/dist/database/providers/three-tier-db.d.ts +33 -0
- package/dist/database/providers/three-tier-db.d.ts.map +1 -0
- package/dist/database/providers/three-tier-db.js +105 -0
- package/dist/database/providers/three-tier-db.js.map +1 -0
- package/dist/database/types.d.ts +6 -1
- package/dist/database/types.d.ts.map +1 -1
- package/dist/env.d.ts +16 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js.map +1 -1
- package/dist/keyspace/index.d.ts.map +1 -1
- package/dist/keyspace/index.js +12 -0
- package/dist/keyspace/index.js.map +1 -1
- package/dist/keyspace/mock-provider.d.ts +31 -0
- package/dist/keyspace/mock-provider.d.ts.map +1 -0
- package/dist/keyspace/mock-provider.js +328 -0
- package/dist/keyspace/mock-provider.js.map +1 -0
- package/dist/keyspace/providers/http-proxy-keyspace.d.ts +36 -0
- package/dist/keyspace/providers/http-proxy-keyspace.d.ts.map +1 -0
- package/dist/keyspace/providers/http-proxy-keyspace.js +210 -0
- package/dist/keyspace/providers/http-proxy-keyspace.js.map +1 -0
- package/dist/keyspace/providers/index.d.ts +8 -0
- package/dist/keyspace/providers/index.d.ts.map +1 -0
- package/dist/keyspace/providers/index.js +10 -0
- package/dist/keyspace/providers/index.js.map +1 -0
- package/dist/keyspace/providers/three-tier-keyspace.d.ts +42 -0
- package/dist/keyspace/providers/three-tier-keyspace.d.ts.map +1 -0
- package/dist/keyspace/providers/three-tier-keyspace.js +106 -0
- package/dist/keyspace/providers/three-tier-keyspace.js.map +1 -0
- package/dist/keyspace/types.d.ts +5 -0
- package/dist/keyspace/types.d.ts.map +1 -1
- package/dist/kv/index.js +10 -10
- package/dist/kv/index.js.map +1 -1
- package/dist/kv/providers/index.d.ts +1 -0
- package/dist/kv/providers/index.d.ts.map +1 -1
- package/dist/kv/providers/index.js +1 -0
- package/dist/kv/providers/index.js.map +1 -1
- package/dist/kv/providers/three-tier-kv.d.ts +44 -0
- package/dist/kv/providers/three-tier-kv.d.ts.map +1 -0
- package/dist/kv/providers/three-tier-kv.js +69 -0
- package/dist/kv/providers/three-tier-kv.js.map +1 -0
- package/dist/providers/three-tier-provider.d.ts +77 -0
- package/dist/providers/three-tier-provider.d.ts.map +1 -0
- package/dist/providers/three-tier-provider.js +165 -0
- package/dist/providers/three-tier-provider.js.map +1 -0
- package/dist/r2/index.d.ts.map +1 -1
- package/dist/r2/index.js +11 -18
- package/dist/r2/index.js.map +1 -1
- package/dist/r2/mock-provider.d.ts +23 -0
- package/dist/r2/mock-provider.d.ts.map +1 -0
- package/dist/r2/mock-provider.js +161 -0
- package/dist/r2/mock-provider.js.map +1 -0
- package/dist/r2/providers/http-proxy-r2.d.ts +40 -0
- package/dist/r2/providers/http-proxy-r2.d.ts.map +1 -0
- package/dist/r2/providers/http-proxy-r2.js +195 -0
- package/dist/r2/providers/http-proxy-r2.js.map +1 -0
- package/dist/r2/providers/index.d.ts +2 -0
- package/dist/r2/providers/index.d.ts.map +1 -1
- package/dist/r2/providers/index.js +2 -0
- package/dist/r2/providers/index.js.map +1 -1
- package/dist/r2/providers/three-tier-r2.d.ts +43 -0
- package/dist/r2/providers/three-tier-r2.d.ts.map +1 -0
- package/dist/r2/providers/three-tier-r2.js +82 -0
- package/dist/r2/providers/three-tier-r2.js.map +1 -0
- package/dist/r2/types.d.ts +6 -1
- package/dist/r2/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three-Tier KV Provider
|
|
3
|
+
*
|
|
4
|
+
* Implements the three-tier fallback system:
|
|
5
|
+
* 1. Production - Real Cloudflare KV binding
|
|
6
|
+
* 2. Preview via Proxy - HTTP proxy to skeleton worker
|
|
7
|
+
* 3. Mock/In-Memory - Fallback when skeleton not ready
|
|
8
|
+
*/
|
|
9
|
+
import { CloudflareKV } from './cloudflare-kv';
|
|
10
|
+
import { HTTPProxyKV } from './http-proxy-kv';
|
|
11
|
+
import { MockKV } from '../mock';
|
|
12
|
+
import { ThreeTierProvider } from '../../providers/three-tier-provider';
|
|
13
|
+
/**
|
|
14
|
+
* Three-Tier KV Provider
|
|
15
|
+
*
|
|
16
|
+
* Automatically selects between production, preview proxy, and mock based on availability
|
|
17
|
+
* and skeleton deployment readiness.
|
|
18
|
+
*/
|
|
19
|
+
export class ThreeTierKV {
|
|
20
|
+
provider;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
const production = config.production ? new CloudflareKV(config.production) : undefined;
|
|
23
|
+
const previewProxy = config.previewProxy ? new HTTPProxyKV(config.previewProxy) : undefined;
|
|
24
|
+
const mock = new MockKV({ debug: config.debug });
|
|
25
|
+
this.provider = new ThreeTierProvider({
|
|
26
|
+
production,
|
|
27
|
+
previewProxy,
|
|
28
|
+
mock,
|
|
29
|
+
debug: config.debug,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async get(key) {
|
|
33
|
+
return this.provider.execute('GET', (kv) => kv.get(key));
|
|
34
|
+
}
|
|
35
|
+
async put(key, value, options) {
|
|
36
|
+
return this.provider.execute('PUT', (kv) => kv.put(key, value, options));
|
|
37
|
+
}
|
|
38
|
+
async getJson(key) {
|
|
39
|
+
return this.provider.execute('GET_JSON', (kv) => kv.getJson(key));
|
|
40
|
+
}
|
|
41
|
+
async putJson(key, value, options) {
|
|
42
|
+
return this.provider.execute('PUT_JSON', (kv) => kv.putJson(key, value, options));
|
|
43
|
+
}
|
|
44
|
+
async set(key, value, options) {
|
|
45
|
+
return this.put(key, value, options);
|
|
46
|
+
}
|
|
47
|
+
async delete(key) {
|
|
48
|
+
return this.provider.execute('DELETE', (kv) => kv.delete(key));
|
|
49
|
+
}
|
|
50
|
+
async deleteMany(keys) {
|
|
51
|
+
return this.provider.execute('DELETE_MANY', (kv) => kv.deleteMany(keys));
|
|
52
|
+
}
|
|
53
|
+
async has(key) {
|
|
54
|
+
return this.provider.execute('HAS', (kv) => kv.has(key));
|
|
55
|
+
}
|
|
56
|
+
async list(prefix) {
|
|
57
|
+
return this.provider.execute('LIST', (kv) => kv.list(prefix));
|
|
58
|
+
}
|
|
59
|
+
async getMetadata(key) {
|
|
60
|
+
return this.provider.execute('GET_METADATA', (kv) => kv.getMetadata(key));
|
|
61
|
+
}
|
|
62
|
+
async increment(key, amount = 1) {
|
|
63
|
+
return this.provider.execute('INCREMENT', (kv) => kv.increment(key, amount));
|
|
64
|
+
}
|
|
65
|
+
async decrement(key, amount = 1) {
|
|
66
|
+
return this.provider.execute('DECREMENT', (kv) => kv.decrement(key, amount));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=three-tier-kv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-tier-kv.js","sourceRoot":"","sources":["../../../src/kv/providers/three-tier-kv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three-Tier Provider System
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified fallback chain for platform services:
|
|
5
|
+
* 1. Production - Real Cloudflare bindings (KV, D1, R2)
|
|
6
|
+
* 2. Preview via Proxy - HTTP proxy to skeleton worker
|
|
7
|
+
* 3. Mock/In-Memory - Fallback when skeleton not ready
|
|
8
|
+
*
|
|
9
|
+
* This ensures graceful degradation during the first ~60 seconds of tile generation
|
|
10
|
+
* when the skeleton deployment might return 530 errors or not be ready yet.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Provider mode enum
|
|
14
|
+
*/
|
|
15
|
+
export declare enum ProviderMode {
|
|
16
|
+
Production = "production",
|
|
17
|
+
PreviewProxy = "preview-proxy",
|
|
18
|
+
Mock = "mock"
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if an error indicates the skeleton deployment isn't ready
|
|
22
|
+
*/
|
|
23
|
+
export declare function isSkeletonNotReadyError(error: unknown): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Three-tier provider configuration
|
|
26
|
+
*/
|
|
27
|
+
export interface ThreeTierConfig<TProduction, TProxy, TMock> {
|
|
28
|
+
/** Production provider (real Cloudflare bindings) */
|
|
29
|
+
production?: TProduction;
|
|
30
|
+
/** Preview proxy provider (HTTP to skeleton worker) */
|
|
31
|
+
previewProxy?: TProxy;
|
|
32
|
+
/** Mock provider (in-memory fallback) */
|
|
33
|
+
mock: TMock;
|
|
34
|
+
/** Debug logging */
|
|
35
|
+
debug?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Three-tier provider base class
|
|
39
|
+
*
|
|
40
|
+
* Implements the three-tier fallback logic:
|
|
41
|
+
* 1. Use production if available
|
|
42
|
+
* 2. Use preview proxy if available, fall back to mock on skeleton errors
|
|
43
|
+
* 3. Use mock as final fallback
|
|
44
|
+
*/
|
|
45
|
+
export declare class ThreeTierProvider<TProvider> {
|
|
46
|
+
private production?;
|
|
47
|
+
private previewProxy?;
|
|
48
|
+
private mock;
|
|
49
|
+
private debug;
|
|
50
|
+
private currentMode;
|
|
51
|
+
private skeletonFailed;
|
|
52
|
+
private failureCount;
|
|
53
|
+
private readonly maxFailures;
|
|
54
|
+
constructor(config: ThreeTierConfig<TProvider, TProvider, TProvider>);
|
|
55
|
+
private log;
|
|
56
|
+
/**
|
|
57
|
+
* Get the appropriate provider based on current mode and fallback logic
|
|
58
|
+
*/
|
|
59
|
+
private getProvider;
|
|
60
|
+
/**
|
|
61
|
+
* Execute an operation with automatic fallback
|
|
62
|
+
*/
|
|
63
|
+
execute<T>(operation: string, fn: (provider: TProvider) => Promise<T>): Promise<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the current provider mode
|
|
66
|
+
*/
|
|
67
|
+
getMode(): ProviderMode;
|
|
68
|
+
/**
|
|
69
|
+
* Check if skeleton has failed
|
|
70
|
+
*/
|
|
71
|
+
isSkeletonFailed(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Reset skeleton failure state (for testing)
|
|
74
|
+
*/
|
|
75
|
+
resetSkeletonState(): void;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=three-tier-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-tier-provider.d.ts","sourceRoot":"","sources":["../../src/providers/three-tier-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,oBAAY,YAAY;IACtB,UAAU,eAAe;IACzB,YAAY,kBAAkB;IAC9B,IAAI,SAAS;CACd;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAkB/D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK;IACzD,qDAAqD;IACrD,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,IAAI,EAAE,KAAK,CAAC;IACZ,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,iBAAiB,CAAC,SAAS;IACtC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,KAAK,CAAU;IAEvB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAK;gBAErB,MAAM,EAAE,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAmBpE,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC;IA2Cb;;OAEG;IACH,OAAO,IAAI,YAAY;IAUvB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACH,kBAAkB,IAAI,IAAI;CAI3B"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three-Tier Provider System
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified fallback chain for platform services:
|
|
5
|
+
* 1. Production - Real Cloudflare bindings (KV, D1, R2)
|
|
6
|
+
* 2. Preview via Proxy - HTTP proxy to skeleton worker
|
|
7
|
+
* 3. Mock/In-Memory - Fallback when skeleton not ready
|
|
8
|
+
*
|
|
9
|
+
* This ensures graceful degradation during the first ~60 seconds of tile generation
|
|
10
|
+
* when the skeleton deployment might return 530 errors or not be ready yet.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Provider mode enum
|
|
14
|
+
*/
|
|
15
|
+
export var ProviderMode;
|
|
16
|
+
(function (ProviderMode) {
|
|
17
|
+
ProviderMode["Production"] = "production";
|
|
18
|
+
ProviderMode["PreviewProxy"] = "preview-proxy";
|
|
19
|
+
ProviderMode["Mock"] = "mock";
|
|
20
|
+
})(ProviderMode || (ProviderMode = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Check if an error indicates the skeleton deployment isn't ready
|
|
23
|
+
*/
|
|
24
|
+
export function isSkeletonNotReadyError(error) {
|
|
25
|
+
if (!(error instanceof Error))
|
|
26
|
+
return false;
|
|
27
|
+
const message = error.message.toLowerCase();
|
|
28
|
+
// 530 errors indicate the Worker isn't ready yet
|
|
29
|
+
if (message.includes('530'))
|
|
30
|
+
return true;
|
|
31
|
+
// Network errors during initial deployment
|
|
32
|
+
if (message.includes('fetch failed') || message.includes('network error'))
|
|
33
|
+
return true;
|
|
34
|
+
// Connection refused during deployment
|
|
35
|
+
if (message.includes('econnrefused') || message.includes('connection refused'))
|
|
36
|
+
return true;
|
|
37
|
+
// Timeout errors
|
|
38
|
+
if (message.includes('timeout'))
|
|
39
|
+
return true;
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Three-tier provider base class
|
|
44
|
+
*
|
|
45
|
+
* Implements the three-tier fallback logic:
|
|
46
|
+
* 1. Use production if available
|
|
47
|
+
* 2. Use preview proxy if available, fall back to mock on skeleton errors
|
|
48
|
+
* 3. Use mock as final fallback
|
|
49
|
+
*/
|
|
50
|
+
export class ThreeTierProvider {
|
|
51
|
+
production;
|
|
52
|
+
previewProxy;
|
|
53
|
+
mock;
|
|
54
|
+
debug;
|
|
55
|
+
currentMode;
|
|
56
|
+
skeletonFailed = false;
|
|
57
|
+
failureCount = 0;
|
|
58
|
+
maxFailures = 3;
|
|
59
|
+
constructor(config) {
|
|
60
|
+
this.production = config.production;
|
|
61
|
+
this.previewProxy = config.previewProxy;
|
|
62
|
+
this.mock = config.mock;
|
|
63
|
+
this.debug = config.debug ?? false;
|
|
64
|
+
// Determine initial mode
|
|
65
|
+
if (this.production) {
|
|
66
|
+
this.currentMode = ProviderMode.Production;
|
|
67
|
+
this.log('Initialized in PRODUCTION mode');
|
|
68
|
+
}
|
|
69
|
+
else if (this.previewProxy) {
|
|
70
|
+
this.currentMode = ProviderMode.PreviewProxy;
|
|
71
|
+
this.log('Initialized in PREVIEW PROXY mode with mock fallback');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.currentMode = ProviderMode.Mock;
|
|
75
|
+
this.log('Initialized in MOCK mode');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
log(message, ...args) {
|
|
79
|
+
if (this.debug) {
|
|
80
|
+
console.log(`[ThreeTierProvider:${this.currentMode}] ${message}`, ...args);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the appropriate provider based on current mode and fallback logic
|
|
85
|
+
*/
|
|
86
|
+
getProvider() {
|
|
87
|
+
// If in production mode, always use production
|
|
88
|
+
if (this.currentMode === ProviderMode.Production) {
|
|
89
|
+
return this.production;
|
|
90
|
+
}
|
|
91
|
+
// If in preview proxy mode and skeleton has failed, use mock
|
|
92
|
+
if (this.currentMode === ProviderMode.PreviewProxy && this.skeletonFailed) {
|
|
93
|
+
this.log('Using MOCK (skeleton previously failed)');
|
|
94
|
+
return this.mock;
|
|
95
|
+
}
|
|
96
|
+
// If in preview proxy mode, use proxy
|
|
97
|
+
if (this.currentMode === ProviderMode.PreviewProxy && this.previewProxy) {
|
|
98
|
+
return this.previewProxy;
|
|
99
|
+
}
|
|
100
|
+
// Default to mock
|
|
101
|
+
return this.mock;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Execute an operation with automatic fallback
|
|
105
|
+
*/
|
|
106
|
+
async execute(operation, fn) {
|
|
107
|
+
// If in production mode, no fallback needed
|
|
108
|
+
if (this.currentMode === ProviderMode.Production) {
|
|
109
|
+
return fn(this.production);
|
|
110
|
+
}
|
|
111
|
+
// If skeleton already failed or in mock mode, use mock directly
|
|
112
|
+
if (this.skeletonFailed || this.currentMode === ProviderMode.Mock) {
|
|
113
|
+
this.log(`${operation}: Using mock`);
|
|
114
|
+
return fn(this.mock);
|
|
115
|
+
}
|
|
116
|
+
// Try preview proxy with fallback to mock
|
|
117
|
+
try {
|
|
118
|
+
this.log(`${operation}: Trying preview proxy`);
|
|
119
|
+
return await fn(this.previewProxy);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
// Check if this is a skeleton-not-ready error
|
|
123
|
+
if (isSkeletonNotReadyError(error)) {
|
|
124
|
+
this.failureCount++;
|
|
125
|
+
console.warn(`[ThreeTierProvider] ${operation}: Skeleton not ready (attempt ${this.failureCount}/${this.maxFailures}), falling back to mock:`, error instanceof Error ? error.message : error);
|
|
126
|
+
// After max failures, mark skeleton as failed
|
|
127
|
+
if (this.failureCount >= this.maxFailures) {
|
|
128
|
+
this.skeletonFailed = true;
|
|
129
|
+
console.warn(`[ThreeTierProvider] Skeleton marked as unavailable after ${this.maxFailures} failures`);
|
|
130
|
+
}
|
|
131
|
+
// Fall back to mock
|
|
132
|
+
this.log(`${operation}: Using mock fallback`);
|
|
133
|
+
return fn(this.mock);
|
|
134
|
+
}
|
|
135
|
+
// For other errors, re-throw (don't mask genuine errors)
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the current provider mode
|
|
141
|
+
*/
|
|
142
|
+
getMode() {
|
|
143
|
+
if (this.currentMode === ProviderMode.Production) {
|
|
144
|
+
return ProviderMode.Production;
|
|
145
|
+
}
|
|
146
|
+
if (this.skeletonFailed) {
|
|
147
|
+
return ProviderMode.Mock;
|
|
148
|
+
}
|
|
149
|
+
return this.currentMode;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if skeleton has failed
|
|
153
|
+
*/
|
|
154
|
+
isSkeletonFailed() {
|
|
155
|
+
return this.skeletonFailed;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Reset skeleton failure state (for testing)
|
|
159
|
+
*/
|
|
160
|
+
resetSkeletonState() {
|
|
161
|
+
this.skeletonFailed = false;
|
|
162
|
+
this.failureCount = 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=three-tier-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-tier-provider.js","sourceRoot":"","sources":["../../src/providers/three-tier-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/r2/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/r2/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKrF,mBAAmB,SAAS,CAAC;AAE7B;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,GAAG,CAAC,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,oBAAoB,CAAA;CAAE,GAAG,oBAAoB,GAC1E,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/r2/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKrF,mBAAmB,SAAS,CAAC;AAE7B;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACxB,GAAG,CAAC,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,oBAAoB,CAAA;CAAE,GAAG,oBAAoB,GAC1E,eAAe,CAyCjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,eAAe,CAexE"}
|
package/dist/r2/index.js
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* }
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
import { CloudflareR2 } from './providers';
|
|
28
|
+
import { CloudflareR2, ThreeTierR2 } from './providers';
|
|
29
29
|
import { getPlatformEnv, isPlatformEnvConfigured } from '../env';
|
|
30
30
|
/**
|
|
31
31
|
* Get a storage instance for the current request
|
|
@@ -62,25 +62,18 @@ export function getStorage(req) {
|
|
|
62
62
|
if (!env) {
|
|
63
63
|
throw new Error('No environment found in request. Ensure you are running in edge runtime.');
|
|
64
64
|
}
|
|
65
|
-
//
|
|
66
|
-
|
|
65
|
+
// Use three-tier provider system
|
|
66
|
+
const config = {
|
|
67
|
+
production: env.STORAGE,
|
|
68
|
+
publicUrl: env.STORAGE_PUBLIC_URL,
|
|
69
|
+
previewProxy: env.__STORAGE_HTTP_PROXY__,
|
|
70
|
+
debug: true,
|
|
71
|
+
};
|
|
72
|
+
// If no production binding and no preview proxy, throw error
|
|
73
|
+
if (!config.production && !config.previewProxy) {
|
|
67
74
|
throw new Error('No R2 bucket binding found. Add an R2 bucket binding named "STORAGE" to your wrangler.jsonc');
|
|
68
75
|
}
|
|
69
|
-
|
|
70
|
-
const provider = env.STORAGE_PROVIDER || 'r2';
|
|
71
|
-
switch (provider) {
|
|
72
|
-
case 'r2':
|
|
73
|
-
return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
|
|
74
|
-
case 's3':
|
|
75
|
-
// Future: AWS S3 implementation
|
|
76
|
-
throw new Error('AWS S3 provider not yet implemented. Use STORAGE_PROVIDER=r2 or remove STORAGE_PROVIDER.');
|
|
77
|
-
case 'backblaze':
|
|
78
|
-
// Future: Backblaze B2 implementation
|
|
79
|
-
throw new Error('Backblaze B2 provider not yet implemented. Use STORAGE_PROVIDER=r2 or remove STORAGE_PROVIDER.');
|
|
80
|
-
default:
|
|
81
|
-
console.warn(`Unknown STORAGE_PROVIDER: ${provider}. Falling back to Cloudflare R2.`);
|
|
82
|
-
return new CloudflareR2(env.STORAGE, env.STORAGE_PUBLIC_URL);
|
|
83
|
-
}
|
|
76
|
+
return new ThreeTierR2(config);
|
|
84
77
|
}
|
|
85
78
|
/**
|
|
86
79
|
* Create a storage instance directly (for advanced usage)
|
package/dist/r2/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/r2/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/r2/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAmD,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAKjE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACxB,GAA2E;IAE3E,IAAI,GAAqC,CAAC;IAE1C,2DAA2D;IAC3D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,6EAA6E;gBAC3E,qHAAqH,CACxH,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,cAAc,EAA0B,CAAC;IACjD,CAAC;SAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAChB,CAAC;SAAM,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QAC5B,oBAAoB;QACpB,GAAG,GAAG,GAA2B,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,GAAG,GAAI,GAAW,CAAC,GAAG,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAsB;QAChC,UAAU,EAAE,GAAG,CAAC,OAAO;QACvB,SAAS,EAAE,GAAG,CAAC,kBAAkB;QACjC,YAAY,EAAE,GAAG,CAAC,sBAAwD;QAC1E,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,6DAA6D;IAC7D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AACjC,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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory mock R2 storage provider
|
|
3
|
+
* Implements StorageProvider interface for preview/testing
|
|
4
|
+
*/
|
|
5
|
+
import type { StorageProvider, StorageObject, StorageMetadata, ListOptions, ListResult, PutOptions, PutResult, GetOptions } from './types';
|
|
6
|
+
export declare class MockR2Provider implements StorageProvider {
|
|
7
|
+
private objects;
|
|
8
|
+
private debug;
|
|
9
|
+
constructor(config?: {
|
|
10
|
+
debug?: boolean;
|
|
11
|
+
});
|
|
12
|
+
private log;
|
|
13
|
+
put(key: string, value: ArrayBuffer | ReadableStream | Blob | string, options?: PutOptions): Promise<PutResult>;
|
|
14
|
+
get(key: string, options?: GetOptions): Promise<StorageObject | null>;
|
|
15
|
+
delete(key: string): Promise<void>;
|
|
16
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
17
|
+
head(key: string): Promise<StorageMetadata | null>;
|
|
18
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
19
|
+
exists(key: string): Promise<boolean>;
|
|
20
|
+
copy(sourceKey: string, destinationKey: string): Promise<void>;
|
|
21
|
+
getPublicUrl(key: string): string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=mock-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-provider.d.ts","sourceRoot":"","sources":["../../src/r2/mock-provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACX,MAAM,SAAS,CAAC;AAWjB,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,OAAO,CAA6C;IAC5D,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;IAI5C,OAAO,CAAC,GAAG;IAML,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAiD/G,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAwBrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkBlD,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAmChD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAepE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAKlC"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory mock R2 storage provider
|
|
3
|
+
* Implements StorageProvider interface for preview/testing
|
|
4
|
+
*/
|
|
5
|
+
export class MockR2Provider {
|
|
6
|
+
objects = new Map();
|
|
7
|
+
debug;
|
|
8
|
+
constructor(config = {}) {
|
|
9
|
+
this.debug = config.debug ?? false;
|
|
10
|
+
}
|
|
11
|
+
log(message, ...args) {
|
|
12
|
+
if (this.debug) {
|
|
13
|
+
console.log(`[MockR2] ${message}`, ...args);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async put(key, value, options) {
|
|
17
|
+
this.log('PUT', key, options);
|
|
18
|
+
// Convert value to ArrayBuffer
|
|
19
|
+
let buffer;
|
|
20
|
+
if (typeof value === 'string') {
|
|
21
|
+
buffer = new TextEncoder().encode(value).buffer;
|
|
22
|
+
}
|
|
23
|
+
else if (value instanceof Blob) {
|
|
24
|
+
buffer = await value.arrayBuffer();
|
|
25
|
+
}
|
|
26
|
+
else if (value instanceof ReadableStream) {
|
|
27
|
+
// Read stream to buffer
|
|
28
|
+
const reader = value.getReader();
|
|
29
|
+
const chunks = [];
|
|
30
|
+
while (true) {
|
|
31
|
+
const { done, value: chunk } = await reader.read();
|
|
32
|
+
if (done)
|
|
33
|
+
break;
|
|
34
|
+
chunks.push(chunk);
|
|
35
|
+
}
|
|
36
|
+
const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
|
|
37
|
+
const combined = new Uint8Array(totalLength);
|
|
38
|
+
let offset = 0;
|
|
39
|
+
for (const chunk of chunks) {
|
|
40
|
+
combined.set(chunk, offset);
|
|
41
|
+
offset += chunk.length;
|
|
42
|
+
}
|
|
43
|
+
buffer = combined.buffer;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
buffer = value;
|
|
47
|
+
}
|
|
48
|
+
const obj = {
|
|
49
|
+
key,
|
|
50
|
+
value: buffer,
|
|
51
|
+
metadata: options?.customMetadata,
|
|
52
|
+
contentType: options?.metadata?.contentType,
|
|
53
|
+
uploaded: new Date(),
|
|
54
|
+
size: buffer.byteLength,
|
|
55
|
+
};
|
|
56
|
+
this.objects.set(key, obj);
|
|
57
|
+
return {
|
|
58
|
+
key,
|
|
59
|
+
etag: `mock-etag-${Date.now()}`,
|
|
60
|
+
size: buffer.byteLength,
|
|
61
|
+
versionId: `mock-version-${Date.now()}`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async get(key, options) {
|
|
65
|
+
this.log('GET', key, options);
|
|
66
|
+
const obj = this.objects.get(key);
|
|
67
|
+
if (!obj) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
key: obj.key,
|
|
72
|
+
body: new ReadableStream({
|
|
73
|
+
start(controller) {
|
|
74
|
+
controller.enqueue(new Uint8Array(obj.value));
|
|
75
|
+
controller.close();
|
|
76
|
+
},
|
|
77
|
+
}),
|
|
78
|
+
size: obj.size,
|
|
79
|
+
etag: `mock-etag-${obj.uploaded.getTime()}`,
|
|
80
|
+
uploaded: obj.uploaded,
|
|
81
|
+
httpMetadata: obj.contentType ? { contentType: obj.contentType } : {},
|
|
82
|
+
metadata: obj.metadata,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async delete(key) {
|
|
86
|
+
this.log('DELETE', key);
|
|
87
|
+
this.objects.delete(key);
|
|
88
|
+
}
|
|
89
|
+
async deleteMany(keys) {
|
|
90
|
+
this.log('DELETE_MANY', keys);
|
|
91
|
+
for (const key of keys) {
|
|
92
|
+
this.objects.delete(key);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async head(key) {
|
|
96
|
+
this.log('HEAD', key);
|
|
97
|
+
const obj = this.objects.get(key);
|
|
98
|
+
if (!obj) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
key: obj.key,
|
|
103
|
+
size: obj.size,
|
|
104
|
+
etag: `mock-etag-${obj.uploaded.getTime()}`,
|
|
105
|
+
uploaded: obj.uploaded,
|
|
106
|
+
httpMetadata: obj.contentType ? { contentType: obj.contentType } : {},
|
|
107
|
+
metadata: obj.metadata,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async list(options) {
|
|
111
|
+
this.log('LIST', options);
|
|
112
|
+
let keys = Array.from(this.objects.keys());
|
|
113
|
+
// Filter by prefix
|
|
114
|
+
if (options?.prefix) {
|
|
115
|
+
keys = keys.filter((key) => key.startsWith(options.prefix));
|
|
116
|
+
}
|
|
117
|
+
// Apply limit
|
|
118
|
+
const limit = options?.limit || 1000;
|
|
119
|
+
const truncated = keys.length > limit;
|
|
120
|
+
keys = keys.slice(0, limit);
|
|
121
|
+
// Get metadata for each key
|
|
122
|
+
const objects = keys.map((key) => {
|
|
123
|
+
const obj = this.objects.get(key);
|
|
124
|
+
return {
|
|
125
|
+
key: obj.key,
|
|
126
|
+
size: obj.size,
|
|
127
|
+
etag: `mock-etag-${obj.uploaded.getTime()}`,
|
|
128
|
+
uploaded: obj.uploaded,
|
|
129
|
+
httpMetadata: obj.contentType ? { contentType: obj.contentType } : undefined,
|
|
130
|
+
metadata: obj.metadata,
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
objects,
|
|
135
|
+
truncated,
|
|
136
|
+
cursor: truncated ? keys[keys.length - 1] : undefined,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async exists(key) {
|
|
140
|
+
this.log('EXISTS', key);
|
|
141
|
+
return this.objects.has(key);
|
|
142
|
+
}
|
|
143
|
+
async copy(sourceKey, destinationKey) {
|
|
144
|
+
this.log('COPY', sourceKey, '->', destinationKey);
|
|
145
|
+
const obj = this.objects.get(sourceKey);
|
|
146
|
+
if (!obj) {
|
|
147
|
+
throw new Error(`Source key not found: ${sourceKey}`);
|
|
148
|
+
}
|
|
149
|
+
this.objects.set(destinationKey, {
|
|
150
|
+
...obj,
|
|
151
|
+
key: destinationKey,
|
|
152
|
+
uploaded: new Date(),
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
getPublicUrl(key) {
|
|
156
|
+
this.log('GET_PUBLIC_URL', key);
|
|
157
|
+
// Return a mock public URL
|
|
158
|
+
return `https://mock-r2.storage/${key}`;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=mock-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-provider.js","sourceRoot":"","sources":["../../src/r2/mock-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Proxy R2 provider for preview mode
|
|
3
|
+
*
|
|
4
|
+
* Proxies all R2 storage operations to a deployed tile's /proxy/storage/op endpoint.
|
|
5
|
+
* Used in browser previews to access real Cloudflare R2 via the deployed skeleton tile.
|
|
6
|
+
*/
|
|
7
|
+
import type { StorageProvider, StorageValue, PutOptions, PutResult, GetOptions, StorageObject, StorageMetadata, ListOptions, ListResult, PublicUrlOptions, SignedUrlOptions } from '../types';
|
|
8
|
+
export interface HTTPProxyR2Options {
|
|
9
|
+
/** Base URL of the deployed tile (e.g., https://tile-id.whatever.tube) */
|
|
10
|
+
deploymentUrl: string;
|
|
11
|
+
/** Optional auth token for authenticated requests */
|
|
12
|
+
authToken?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* HTTP Proxy R2 implementation
|
|
16
|
+
*
|
|
17
|
+
* All operations are proxied to the deployed tile's /proxy/storage/op endpoint.
|
|
18
|
+
*/
|
|
19
|
+
export declare class HTTPProxyR2 implements StorageProvider {
|
|
20
|
+
private deploymentUrl;
|
|
21
|
+
private authToken?;
|
|
22
|
+
private prefix;
|
|
23
|
+
constructor(options: HTTPProxyR2Options);
|
|
24
|
+
private proxyRequest;
|
|
25
|
+
/**
|
|
26
|
+
* Encode data to base64 for transmission
|
|
27
|
+
*/
|
|
28
|
+
private encodeData;
|
|
29
|
+
put(key: string, data: StorageValue, options?: PutOptions): Promise<PutResult>;
|
|
30
|
+
get(key: string, options?: GetOptions): Promise<StorageObject | null>;
|
|
31
|
+
delete(key: string): Promise<void>;
|
|
32
|
+
deleteMany(keys: string[]): Promise<void>;
|
|
33
|
+
exists(key: string): Promise<boolean>;
|
|
34
|
+
list(options?: ListOptions): Promise<ListResult>;
|
|
35
|
+
head(key: string): Promise<StorageMetadata | null>;
|
|
36
|
+
getPublicUrl(key: string, options?: PublicUrlOptions): string;
|
|
37
|
+
getSignedUrl(key: string, options?: SignedUrlOptions): Promise<string>;
|
|
38
|
+
copy(sourceKey: string, destinationKey: string): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=http-proxy-r2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-proxy-r2.d.ts","sourceRoot":"","sources":["../../../src/r2/providers/http-proxy-r2.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAmB;gBAErB,OAAO,EAAE,kBAAkB;YAMzB,YAAY;IAiC1B;;OAEG;YACW,UAAU;IA8ClB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAU9E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAkDrE,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;IAKhD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAexD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM;IAQvD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAItE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQrE"}
|