@umituz/web-cloudflare 1.4.4 → 1.4.6
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/package.json +3 -2
- package/src/config/patterns.ts +43 -24
- package/src/domain/entities/analytics.entity.ts +30 -0
- package/src/domain/entities/d1.entity.ts +27 -0
- package/src/domain/entities/image.entity.ts +48 -0
- package/src/domain/entities/kv.entity.ts +37 -0
- package/src/domain/entities/r2.entity.ts +49 -0
- package/src/domain/entities/worker.entity.ts +35 -0
- package/src/domains/analytics/entities/index.ts +2 -2
- package/src/domains/middleware/entities/index.ts +106 -0
- package/src/domains/middleware/index.ts +14 -0
- package/src/domains/middleware/services/auth.service.ts +110 -0
- package/src/domains/middleware/services/cache.service.ts +93 -0
- package/src/domains/middleware/services/cors.service.ts +87 -0
- package/src/domains/middleware/services/index.ts +9 -0
- package/src/domains/middleware/services/rate-limit.service.ts +93 -0
- package/src/domains/middleware/types/index.ts +5 -0
- package/src/domains/middleware/types/service.interface.ts +122 -0
- package/src/domains/workers/entities/index.ts +1 -1
- package/src/domains/workflows/entities/index.ts +60 -0
- package/src/domains/wrangler/entities/index.ts +2 -2
- package/src/domains/wrangler/services/wrangler.service.ts +16 -8
- package/src/domains/wrangler/types/service.interface.ts +2 -2
- package/src/index.ts +2 -2
- package/src/infrastructure/middleware/index.ts +23 -8
- package/src/infrastructure/router/index.ts +26 -4
- package/src/infrastructure/utils/helpers.ts +25 -11
- package/src/infrastructure/utils/utils.util.ts +3 -2
|
@@ -5,6 +5,23 @@
|
|
|
5
5
|
|
|
6
6
|
import { json, notFound, badRequest } from '../utils/helpers';
|
|
7
7
|
|
|
8
|
+
// ============================================================
|
|
9
|
+
// Environment Types
|
|
10
|
+
// ============================================================
|
|
11
|
+
|
|
12
|
+
export interface CloudflareEnv {
|
|
13
|
+
KV?: KVNamespace;
|
|
14
|
+
R2?: R2Bucket;
|
|
15
|
+
D1?: D1Database;
|
|
16
|
+
DO?: Record<string, DurableObjectNamespace>;
|
|
17
|
+
QUEUE?: Record<string, Queue>;
|
|
18
|
+
AI?: any;
|
|
19
|
+
vars?: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Type alias for backwards compatibility
|
|
23
|
+
export type Env = CloudflareEnv;
|
|
24
|
+
|
|
8
25
|
// ============================================================
|
|
9
26
|
// Route Handler Types
|
|
10
27
|
// ============================================================
|
|
@@ -12,13 +29,13 @@ import { json, notFound, badRequest } from '../utils/helpers';
|
|
|
12
29
|
export type RouteHandler = (
|
|
13
30
|
request: Request,
|
|
14
31
|
params?: Record<string, string>,
|
|
15
|
-
env?:
|
|
32
|
+
env?: CloudflareEnv,
|
|
16
33
|
ctx?: ExecutionContext
|
|
17
34
|
) => Promise<Response> | Response;
|
|
18
35
|
|
|
19
36
|
export type Middleware = (
|
|
20
37
|
request: Request,
|
|
21
|
-
env?:
|
|
38
|
+
env?: CloudflareEnv,
|
|
22
39
|
ctx?: ExecutionContext
|
|
23
40
|
) => Promise<Response | null> | Response | null;
|
|
24
41
|
|
|
@@ -147,7 +164,7 @@ export class Router {
|
|
|
147
164
|
*/
|
|
148
165
|
async handle(
|
|
149
166
|
request: Request,
|
|
150
|
-
env?:
|
|
167
|
+
env?: CloudflareEnv,
|
|
151
168
|
ctx?: ExecutionContext
|
|
152
169
|
): Promise<Response> {
|
|
153
170
|
const url = new URL(request.url);
|
|
@@ -499,7 +516,12 @@ export async function body<T = unknown>(request: Request): Promise<T> {
|
|
|
499
516
|
*/
|
|
500
517
|
export function query(request: Request): Record<string, string> {
|
|
501
518
|
const url = new URL(request.url);
|
|
502
|
-
|
|
519
|
+
const result: Record<string, string> = {};
|
|
520
|
+
// URLSearchParams.keys() is not available in Workers runtime
|
|
521
|
+
url.searchParams.forEach((value, key) => {
|
|
522
|
+
result[key] = value;
|
|
523
|
+
});
|
|
524
|
+
return result;
|
|
503
525
|
}
|
|
504
526
|
|
|
505
527
|
/**
|
|
@@ -19,7 +19,17 @@ export async function parseBody<T = unknown>(request: Request): Promise<T> {
|
|
|
19
19
|
|
|
20
20
|
if (contentType.includes('application/x-www-form-urlencoded')) {
|
|
21
21
|
const formData = await request.formData();
|
|
22
|
-
|
|
22
|
+
const result: Record<string, unknown> = {};
|
|
23
|
+
// FormData.keys() is not available in Workers runtime
|
|
24
|
+
// Use alternative approach with for...of
|
|
25
|
+
const keys: string[] = [];
|
|
26
|
+
formData.forEach((value, key) => {
|
|
27
|
+
if (!keys.includes(key)) {
|
|
28
|
+
keys.push(key);
|
|
29
|
+
}
|
|
30
|
+
result[key] = value;
|
|
31
|
+
});
|
|
32
|
+
return result as T;
|
|
23
33
|
}
|
|
24
34
|
|
|
25
35
|
if (contentType.includes('text/')) {
|
|
@@ -297,16 +307,15 @@ export function generateCacheKey(request: Request, prefix?: string): string {
|
|
|
297
307
|
const parts = [prefix || 'cache', url.pathname];
|
|
298
308
|
|
|
299
309
|
// Add query params (sorted for consistency)
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
)
|
|
310
|
+
const params: string[] = [];
|
|
311
|
+
// URLSearchParams.keys() is not available in Workers runtime
|
|
312
|
+
url.searchParams.forEach((value, key) => {
|
|
313
|
+
params.push(`${key}=${value}`);
|
|
314
|
+
});
|
|
315
|
+
params.sort();
|
|
303
316
|
|
|
304
|
-
if (
|
|
305
|
-
parts.push(
|
|
306
|
-
sortedParams
|
|
307
|
-
.map(([key, value]) => `${key}=${value}`)
|
|
308
|
-
.join('&')
|
|
309
|
-
);
|
|
317
|
+
if (params.length > 0) {
|
|
318
|
+
parts.push(params.join('&'));
|
|
310
319
|
}
|
|
311
320
|
|
|
312
321
|
// Add auth header if present (for user-specific caching)
|
|
@@ -479,7 +488,12 @@ export function buildURL(base: string, params: Record<string, string | number |
|
|
|
479
488
|
*/
|
|
480
489
|
export function parseQueryParams(url: string): Record<string, string> {
|
|
481
490
|
const params = new URL(url).searchParams;
|
|
482
|
-
|
|
491
|
+
const result: Record<string, string> = {};
|
|
492
|
+
// URLSearchParams.keys() is not available in Workers runtime
|
|
493
|
+
params.forEach((value, key) => {
|
|
494
|
+
result[key] = value;
|
|
495
|
+
});
|
|
496
|
+
return result;
|
|
483
497
|
}
|
|
484
498
|
|
|
485
499
|
/**
|
|
@@ -115,12 +115,13 @@ export const transformUtils = {
|
|
|
115
115
|
*/
|
|
116
116
|
async streamToBlob(stream: ReadableStream): Promise<Blob> {
|
|
117
117
|
const reader = stream.getReader();
|
|
118
|
-
const chunks:
|
|
118
|
+
const chunks: BlobPart[] = [];
|
|
119
119
|
|
|
120
120
|
while (true) {
|
|
121
121
|
const { done, value } = await reader.read();
|
|
122
122
|
if (done) break;
|
|
123
|
-
|
|
123
|
+
// Convert Uint8Array to BlobPart
|
|
124
|
+
chunks.push(value as BlobPart);
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
return new Blob(chunks);
|