@voyantjs/utils 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +109 -0
- package/README.md +42 -0
- package/dist/accounting-countries.d.ts +12 -0
- package/dist/accounting-countries.d.ts.map +1 -0
- package/dist/accounting-countries.js +307 -0
- package/dist/accounting-countries.js.map +1 -0
- package/dist/accounting-regions.d.ts +103 -0
- package/dist/accounting-regions.d.ts.map +1 -0
- package/dist/accounting-regions.js +38 -0
- package/dist/accounting-regions.js.map +1 -0
- package/dist/airlines.d.ts +960 -0
- package/dist/airlines.d.ts.map +1 -0
- package/dist/airlines.js +989 -0
- package/dist/airlines.js.map +1 -0
- package/dist/analytics/api-key-events.d.ts +89 -0
- package/dist/analytics/api-key-events.d.ts.map +1 -0
- package/dist/analytics/api-key-events.js +99 -0
- package/dist/analytics/api-key-events.js.map +1 -0
- package/dist/api-keys-client.d.ts +40 -0
- package/dist/api-keys-client.d.ts.map +1 -0
- package/dist/api-keys-client.js +63 -0
- package/dist/api-keys-client.js.map +1 -0
- package/dist/api-keys.d.ts +48 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +108 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/cache.d.ts +123 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +182 -0
- package/dist/cache.js.map +1 -0
- package/dist/checkout-signature.d.ts +15 -0
- package/dist/checkout-signature.d.ts.map +1 -0
- package/dist/checkout-signature.js +64 -0
- package/dist/checkout-signature.js.map +1 -0
- package/dist/conditions.d.ts +36 -0
- package/dist/conditions.d.ts.map +1 -0
- package/dist/conditions.js +396 -0
- package/dist/conditions.js.map +1 -0
- package/dist/countries.d.ts +5 -0
- package/dist/countries.d.ts.map +1 -0
- package/dist/countries.js +251 -0
- package/dist/countries.js.map +1 -0
- package/dist/currencies.d.ts +1011 -0
- package/dist/currencies.d.ts.map +1 -0
- package/dist/currencies.js +1011 -0
- package/dist/currencies.js.map +1 -0
- package/dist/email/send.d.ts +20 -0
- package/dist/email/send.d.ts.map +1 -0
- package/dist/email/send.js +53 -0
- package/dist/email/send.js.map +1 -0
- package/dist/form-runtime.d.ts +38 -0
- package/dist/form-runtime.d.ts.map +1 -0
- package/dist/form-runtime.js +174 -0
- package/dist/form-runtime.js.map +1 -0
- package/dist/gcs/storage.d.ts +23 -0
- package/dist/gcs/storage.d.ts.map +1 -0
- package/dist/gcs/storage.js +25 -0
- package/dist/gcs/storage.js.map +1 -0
- package/dist/geo.d.ts +85 -0
- package/dist/geo.d.ts.map +1 -0
- package/dist/geo.js +141 -0
- package/dist/geo.js.map +1 -0
- package/dist/geographic-regions.d.ts +66 -0
- package/dist/geographic-regions.d.ts.map +1 -0
- package/dist/geographic-regions.js +326 -0
- package/dist/geographic-regions.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/kms-aws.d.ts +26 -0
- package/dist/kms-aws.d.ts.map +1 -0
- package/dist/kms-aws.js +133 -0
- package/dist/kms-aws.js.map +1 -0
- package/dist/kms-crypto.d.ts +20 -0
- package/dist/kms-crypto.d.ts.map +1 -0
- package/dist/kms-crypto.js +108 -0
- package/dist/kms-crypto.js.map +1 -0
- package/dist/kms-env.d.ts +13 -0
- package/dist/kms-env.d.ts.map +1 -0
- package/dist/kms-env.js +13 -0
- package/dist/kms-env.js.map +1 -0
- package/dist/kms-gcp.d.ts +32 -0
- package/dist/kms-gcp.d.ts.map +1 -0
- package/dist/kms-gcp.js +116 -0
- package/dist/kms-gcp.js.map +1 -0
- package/dist/kms-local.d.ts +13 -0
- package/dist/kms-local.d.ts.map +1 -0
- package/dist/kms-local.js +13 -0
- package/dist/kms-local.js.map +1 -0
- package/dist/kms-symmetric.d.ts +14 -0
- package/dist/kms-symmetric.d.ts.map +1 -0
- package/dist/kms-symmetric.js +67 -0
- package/dist/kms-symmetric.js.map +1 -0
- package/dist/kms.d.ts +66 -0
- package/dist/kms.d.ts.map +1 -0
- package/dist/kms.js +169 -0
- package/dist/kms.js.map +1 -0
- package/dist/kv-codecs.d.ts +6 -0
- package/dist/kv-codecs.d.ts.map +1 -0
- package/dist/kv-codecs.js +4 -0
- package/dist/kv-codecs.js.map +1 -0
- package/dist/kv.d.ts +10 -0
- package/dist/kv.d.ts.map +1 -0
- package/dist/kv.js +18 -0
- package/dist/kv.js.map +1 -0
- package/dist/languages.d.ts +187 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +187 -0
- package/dist/languages.js.map +1 -0
- package/dist/localized-countries-regions.d.ts +15 -0
- package/dist/localized-countries-regions.d.ts.map +1 -0
- package/dist/localized-countries-regions.js +674 -0
- package/dist/localized-countries-regions.js.map +1 -0
- package/dist/localized-regions.d.ts +33 -0
- package/dist/localized-regions.d.ts.map +1 -0
- package/dist/localized-regions.js +63 -0
- package/dist/localized-regions.js.map +1 -0
- package/dist/price/resolve.d.ts +91 -0
- package/dist/price/resolve.d.ts.map +1 -0
- package/dist/price/resolve.js +227 -0
- package/dist/price/resolve.js.map +1 -0
- package/dist/rate-limits.d.ts +39 -0
- package/dist/rate-limits.d.ts.map +1 -0
- package/dist/rate-limits.js +86 -0
- package/dist/rate-limits.js.map +1 -0
- package/dist/redis.d.ts +13 -0
- package/dist/redis.d.ts.map +1 -0
- package/dist/redis.js +16 -0
- package/dist/redis.js.map +1 -0
- package/dist/region-only.d.ts +11 -0
- package/dist/region-only.d.ts.map +1 -0
- package/dist/region-only.js +49 -0
- package/dist/region-only.js.map +1 -0
- package/dist/region.d.ts +11 -0
- package/dist/region.d.ts.map +1 -0
- package/dist/region.js +47 -0
- package/dist/region.js.map +1 -0
- package/dist/romania-bucharest-sectors.d.ts +6 -0
- package/dist/romania-bucharest-sectors.d.ts.map +1 -0
- package/dist/romania-bucharest-sectors.js +27 -0
- package/dist/romania-bucharest-sectors.js.map +1 -0
- package/dist/romania-counties.d.ts +6 -0
- package/dist/romania-counties.d.ts.map +1 -0
- package/dist/romania-counties.js +171 -0
- package/dist/romania-counties.js.map +1 -0
- package/dist/session-claims.d.ts +40 -0
- package/dist/session-claims.d.ts.map +1 -0
- package/dist/session-claims.js +184 -0
- package/dist/session-claims.js.map +1 -0
- package/dist/sms/provider.d.ts +28 -0
- package/dist/sms/provider.d.ts.map +1 -0
- package/dist/sms/provider.js +50 -0
- package/dist/sms/provider.js.map +1 -0
- package/dist/sms/segments.d.ts +3 -0
- package/dist/sms/segments.d.ts.map +1 -0
- package/dist/sms/segments.js +33 -0
- package/dist/sms/segments.js.map +1 -0
- package/dist/temporal.d.ts +2 -0
- package/dist/temporal.d.ts.map +1 -0
- package/dist/temporal.js +6 -0
- package/dist/temporal.js.map +1 -0
- package/dist/timezones.d.ts +9 -0
- package/dist/timezones.d.ts.map +1 -0
- package/dist/timezones.js +1217 -0
- package/dist/timezones.js.map +1 -0
- package/dist/twilio/client.d.ts +13 -0
- package/dist/twilio/client.d.ts.map +1 -0
- package/dist/twilio/client.js +26 -0
- package/dist/twilio/client.js.map +1 -0
- package/dist/usage/index.d.ts +34 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +18 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/policy.d.ts +27 -0
- package/dist/usage/policy.d.ts.map +1 -0
- package/dist/usage/policy.js +17 -0
- package/dist/usage/policy.js.map +1 -0
- package/dist/validation/log.d.ts +10 -0
- package/dist/validation/log.d.ts.map +1 -0
- package/dist/validation/log.js +37 -0
- package/dist/validation/log.js.map +1 -0
- package/dist/with-timeout.d.ts +2 -0
- package/dist/with-timeout.d.ts.map +1 -0
- package/dist/with-timeout.js +15 -0
- package/dist/with-timeout.js.map +1 -0
- package/dist/zod-form-builder.d.ts +45 -0
- package/dist/zod-form-builder.d.ts.map +1 -0
- package/dist/zod-form-builder.js +216 -0
- package/dist/zod-form-builder.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"airlines.js","sourceRoot":"","sources":["../src/airlines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Analytics Event Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for tracking API key lifecycle and usage events to ClickHouse
|
|
5
|
+
*/
|
|
6
|
+
export interface ApiKeyLifecycleEvent {
|
|
7
|
+
eventType: 'created' | 'updated' | 'revoked' | 'expired' | 'purged';
|
|
8
|
+
apiKeyId: string;
|
|
9
|
+
keyPrefix: string;
|
|
10
|
+
keySuffix: string;
|
|
11
|
+
eventActor: string;
|
|
12
|
+
keyName: string;
|
|
13
|
+
scopes: string[];
|
|
14
|
+
expiresAt: string | null;
|
|
15
|
+
status: 'active' | 'revoked' | 'expired' | 'purged';
|
|
16
|
+
changes?: Record<string, any>;
|
|
17
|
+
ipAddress?: string;
|
|
18
|
+
userAgent?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ApiKeyUsageEvent {
|
|
21
|
+
apiKeyId: string;
|
|
22
|
+
keyPrefix: string;
|
|
23
|
+
method: string;
|
|
24
|
+
endpoint: string;
|
|
25
|
+
endpointPattern: string;
|
|
26
|
+
statusCode: number;
|
|
27
|
+
responseTimeMs: number;
|
|
28
|
+
requiredScopes: string[];
|
|
29
|
+
scopeCheckPassed: boolean;
|
|
30
|
+
rateLimitHit: boolean;
|
|
31
|
+
ipAddress?: string;
|
|
32
|
+
userAgent?: string;
|
|
33
|
+
region?: 'us' | 'eu' | 'unknown';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format an API key lifecycle event for ClickHouse insertion
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatApiKeyLifecycleEvent(event: ApiKeyLifecycleEvent): {
|
|
39
|
+
api_key_id: string;
|
|
40
|
+
key_prefix: string;
|
|
41
|
+
key_suffix: string;
|
|
42
|
+
event_type: "created" | "updated" | "revoked" | "expired" | "purged";
|
|
43
|
+
event_actor: string;
|
|
44
|
+
key_name: string;
|
|
45
|
+
scopes: string[];
|
|
46
|
+
expires_at: string | null;
|
|
47
|
+
status: "active" | "revoked" | "expired" | "purged";
|
|
48
|
+
changes_json: string;
|
|
49
|
+
ip_address: string | null;
|
|
50
|
+
user_agent: string | null;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Format an API key usage event for ClickHouse insertion
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatApiKeyUsageEvent(event: ApiKeyUsageEvent): {
|
|
56
|
+
api_key_id: string;
|
|
57
|
+
key_prefix: string;
|
|
58
|
+
method: string;
|
|
59
|
+
endpoint: string;
|
|
60
|
+
endpoint_pattern: string;
|
|
61
|
+
status_code: number;
|
|
62
|
+
response_time_ms: number;
|
|
63
|
+
required_scopes: string[];
|
|
64
|
+
scope_check_passed: number;
|
|
65
|
+
rate_limit_hit: number;
|
|
66
|
+
ip_address: string | null;
|
|
67
|
+
user_agent: string | null;
|
|
68
|
+
region: "eu" | "us" | "unknown";
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Normalize endpoint path to a pattern for aggregation
|
|
72
|
+
* Examples:
|
|
73
|
+
* /v1/products/abc-123 -> /v1/products/:id
|
|
74
|
+
* /v1/booking/xyz-456/progress -> /v1/booking/:id/progress
|
|
75
|
+
*/
|
|
76
|
+
export declare function normalizeEndpointPattern(path: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Extract IP address from request headers (Cloudflare Workers)
|
|
79
|
+
*/
|
|
80
|
+
export declare function extractIpAddress(request: Request): string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Extract user agent from request
|
|
83
|
+
*/
|
|
84
|
+
export declare function extractUserAgent(request: Request): string | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Determine region from Cloudflare headers
|
|
87
|
+
*/
|
|
88
|
+
export declare function extractRegion(request: Request): 'us' | 'eu' | 'unknown';
|
|
89
|
+
//# sourceMappingURL=api-key-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-events.d.ts","sourceRoot":"","sources":["../../src/analytics/api-key-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACnE,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,gBAAgB,EAAE,OAAO,CAAA;IACzB,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;CACjC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,oBAAoB;;;;;;;;;;;;;EAerE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB;;;;;;;;;;;;;;EAgB7D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAc7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAErE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAqBvE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Analytics Event Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for tracking API key lifecycle and usage events to ClickHouse
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Format an API key lifecycle event for ClickHouse insertion
|
|
8
|
+
*/
|
|
9
|
+
export function formatApiKeyLifecycleEvent(event) {
|
|
10
|
+
return {
|
|
11
|
+
api_key_id: event.apiKeyId,
|
|
12
|
+
key_prefix: event.keyPrefix,
|
|
13
|
+
key_suffix: event.keySuffix,
|
|
14
|
+
event_type: event.eventType,
|
|
15
|
+
event_actor: event.eventActor,
|
|
16
|
+
key_name: event.keyName,
|
|
17
|
+
scopes: event.scopes,
|
|
18
|
+
expires_at: event.expiresAt,
|
|
19
|
+
status: event.status,
|
|
20
|
+
changes_json: event.changes ? JSON.stringify(event.changes) : '',
|
|
21
|
+
ip_address: event.ipAddress || null,
|
|
22
|
+
user_agent: event.userAgent || null,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Format an API key usage event for ClickHouse insertion
|
|
27
|
+
*/
|
|
28
|
+
export function formatApiKeyUsageEvent(event) {
|
|
29
|
+
return {
|
|
30
|
+
api_key_id: event.apiKeyId,
|
|
31
|
+
key_prefix: event.keyPrefix,
|
|
32
|
+
method: event.method,
|
|
33
|
+
endpoint: event.endpoint,
|
|
34
|
+
endpoint_pattern: event.endpointPattern,
|
|
35
|
+
status_code: event.statusCode,
|
|
36
|
+
response_time_ms: event.responseTimeMs,
|
|
37
|
+
required_scopes: event.requiredScopes,
|
|
38
|
+
scope_check_passed: event.scopeCheckPassed ? 1 : 0,
|
|
39
|
+
rate_limit_hit: event.rateLimitHit ? 1 : 0,
|
|
40
|
+
ip_address: event.ipAddress || null,
|
|
41
|
+
user_agent: event.userAgent || null,
|
|
42
|
+
region: event.region || 'unknown',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Normalize endpoint path to a pattern for aggregation
|
|
47
|
+
* Examples:
|
|
48
|
+
* /v1/products/abc-123 -> /v1/products/:id
|
|
49
|
+
* /v1/booking/xyz-456/progress -> /v1/booking/:id/progress
|
|
50
|
+
*/
|
|
51
|
+
export function normalizeEndpointPattern(path) {
|
|
52
|
+
// UUID pattern
|
|
53
|
+
const uuidRegex = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
|
|
54
|
+
let normalized = path.replace(uuidRegex, ':id');
|
|
55
|
+
// Numeric IDs
|
|
56
|
+
const numericIdRegex = /\/\d+(?=\/|$)/g;
|
|
57
|
+
normalized = normalized.replace(numericIdRegex, '/:id');
|
|
58
|
+
// Hex codes (like booking codes)
|
|
59
|
+
const hexCodeRegex = /\/[0-9A-F]{8,}(?=\/|$)/g;
|
|
60
|
+
normalized = normalized.replace(hexCodeRegex, '/:code');
|
|
61
|
+
return normalized;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract IP address from request headers (Cloudflare Workers)
|
|
65
|
+
*/
|
|
66
|
+
export function extractIpAddress(request) {
|
|
67
|
+
return (request.headers.get('cf-connecting-ip') ||
|
|
68
|
+
request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||
|
|
69
|
+
request.headers.get('x-real-ip') ||
|
|
70
|
+
undefined);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Extract user agent from request
|
|
74
|
+
*/
|
|
75
|
+
export function extractUserAgent(request) {
|
|
76
|
+
return request.headers.get('user-agent') || undefined;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determine region from Cloudflare headers
|
|
80
|
+
*/
|
|
81
|
+
export function extractRegion(request) {
|
|
82
|
+
const cfRegion = request.headers.get('cf-ipcountry');
|
|
83
|
+
// EU countries
|
|
84
|
+
const euCountries = [
|
|
85
|
+
'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR',
|
|
86
|
+
'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL',
|
|
87
|
+
'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE', 'GB', 'IS', 'LI',
|
|
88
|
+
'NO', 'CH'
|
|
89
|
+
];
|
|
90
|
+
if (cfRegion && euCountries.includes(cfRegion)) {
|
|
91
|
+
return 'eu';
|
|
92
|
+
}
|
|
93
|
+
// North American countries default to US
|
|
94
|
+
if (cfRegion && ['US', 'CA', 'MX'].includes(cfRegion)) {
|
|
95
|
+
return 'us';
|
|
96
|
+
}
|
|
97
|
+
return 'unknown';
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=api-key-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key-events.js","sourceRoot":"","sources":["../../src/analytics/api-key-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-safe API Key Utilities
|
|
3
|
+
*
|
|
4
|
+
* These functions don't use Node.js crypto and are safe to import in client components.
|
|
5
|
+
* For crypto operations (generation, hashing, verification), use api-keys.ts
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Mask an API key for display
|
|
9
|
+
* Shows: "voy_live***abc123" (first 8 + last 6 chars)
|
|
10
|
+
*
|
|
11
|
+
* @param key - Full API key or just prefix/suffix
|
|
12
|
+
* @returns Masked key for display
|
|
13
|
+
*/
|
|
14
|
+
export declare function maskApiKey(key: string): string;
|
|
15
|
+
export declare function maskApiKey(prefix: string, suffix: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Validate API key format
|
|
18
|
+
*
|
|
19
|
+
* @param key - The API key to validate
|
|
20
|
+
* @returns True if format is valid
|
|
21
|
+
*/
|
|
22
|
+
export declare function isValidApiKeyFormat(key: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Extract the environment from an API key
|
|
25
|
+
*
|
|
26
|
+
* @param key - The API key
|
|
27
|
+
* @returns The environment ("live" or "sandbox") or null if invalid
|
|
28
|
+
*/
|
|
29
|
+
export declare function getApiKeyEnvironment(key: string): "live" | "sandbox" | null;
|
|
30
|
+
/**
|
|
31
|
+
* Extract prefix and suffix from full API key
|
|
32
|
+
*
|
|
33
|
+
* @param key - The full API key
|
|
34
|
+
* @returns Object with prefix and suffix
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractApiKeyParts(key: string): {
|
|
37
|
+
prefix: string;
|
|
38
|
+
suffix: string;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=api-keys-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys-client.d.ts","sourceRoot":"","sources":["../src/api-keys-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;AAC/C,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;AAalE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAI3E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAKlF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-safe API Key Utilities
|
|
3
|
+
*
|
|
4
|
+
* These functions don't use Node.js crypto and are safe to import in client components.
|
|
5
|
+
* For crypto operations (generation, hashing, verification), use api-keys.ts
|
|
6
|
+
*/
|
|
7
|
+
const API_KEY_PREFIXES = ["voy_live", "voy_test"];
|
|
8
|
+
export function maskApiKey(keyOrPrefix, suffix) {
|
|
9
|
+
if (suffix) {
|
|
10
|
+
// Called with (prefix, suffix)
|
|
11
|
+
return `${keyOrPrefix}***${suffix}`;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
// Called with full key
|
|
15
|
+
const prefix = keyOrPrefix.slice(0, 8);
|
|
16
|
+
const keySuffix = keyOrPrefix.slice(-6);
|
|
17
|
+
return `${prefix}***${keySuffix}`;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate API key format
|
|
22
|
+
*
|
|
23
|
+
* @param key - The API key to validate
|
|
24
|
+
* @returns True if format is valid
|
|
25
|
+
*/
|
|
26
|
+
export function isValidApiKeyFormat(key) {
|
|
27
|
+
// Must start with a valid prefix (voy_live_ or voy_test_)
|
|
28
|
+
const hasValidPrefix = API_KEY_PREFIXES.some((prefix) => key.startsWith(`${prefix}_`));
|
|
29
|
+
if (!hasValidPrefix)
|
|
30
|
+
return false;
|
|
31
|
+
// Must be correct length: prefix (8) + underscore (1) + random (32) = 41
|
|
32
|
+
if (key.length !== 41)
|
|
33
|
+
return false;
|
|
34
|
+
// Random part must be base64url (alphanumeric + - and _)
|
|
35
|
+
const randomPart = key.slice(9);
|
|
36
|
+
return /^[A-Za-z0-9_-]{32}$/.test(randomPart);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract the environment from an API key
|
|
40
|
+
*
|
|
41
|
+
* @param key - The API key
|
|
42
|
+
* @returns The environment ("live" or "sandbox") or null if invalid
|
|
43
|
+
*/
|
|
44
|
+
export function getApiKeyEnvironment(key) {
|
|
45
|
+
if (key.startsWith("voy_live_"))
|
|
46
|
+
return "live";
|
|
47
|
+
if (key.startsWith("voy_test_"))
|
|
48
|
+
return "sandbox";
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract prefix and suffix from full API key
|
|
53
|
+
*
|
|
54
|
+
* @param key - The full API key
|
|
55
|
+
* @returns Object with prefix and suffix
|
|
56
|
+
*/
|
|
57
|
+
export function extractApiKeyParts(key) {
|
|
58
|
+
return {
|
|
59
|
+
prefix: key.slice(0, 8),
|
|
60
|
+
suffix: key.slice(-6),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=api-keys-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys-client.js","sourceRoot":"","sources":["../src/api-keys-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAU,CAAA;AAY1D,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAe;IAC7D,IAAI,MAAM,EAAE,CAAC;QACX,+BAA+B;QAC/B,OAAO,GAAG,WAAW,MAAM,MAAM,EAAE,CAAA;IACrC,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QACvC,OAAO,GAAG,MAAM,MAAM,SAAS,EAAE,CAAA;IACnC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,0DAA0D;IAC1D,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA;IACtF,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAA;IAEjC,yEAAyE;IACzE,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAEnC,yDAAyD;IACzD,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/B,OAAO,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,MAAM,CAAA;IAC9C,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAA;IACjD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACtB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Generation and Hashing Utilities (Server-only)
|
|
3
|
+
*
|
|
4
|
+
* This file uses Web Crypto API and should only be imported in server-side code.
|
|
5
|
+
* For client-safe utilities, import from api-keys-client.ts directly.
|
|
6
|
+
*
|
|
7
|
+
* Key format: voy_<env>_<32 random bytes in base64url>
|
|
8
|
+
* Examples:
|
|
9
|
+
* - Live: voy_live_8kNp2qX4vR9mJ7tY3wL1nC5bD6fG8hK0
|
|
10
|
+
* - Sandbox: voy_sbx_8kNp2qX4vR9mJ7tY3wL1nC5bD6fG8hK0
|
|
11
|
+
*
|
|
12
|
+
* Security:
|
|
13
|
+
* - Uses Web Crypto API for CSPRNG
|
|
14
|
+
* - SHA-256 hash for storage (irreversible)
|
|
15
|
+
* - Constant-time comparison to prevent timing attacks
|
|
16
|
+
*/
|
|
17
|
+
export { maskApiKey, isValidApiKeyFormat, extractApiKeyParts, getApiKeyEnvironment } from "./api-keys-client";
|
|
18
|
+
export type ApiKeyEnvironment = "live" | "sandbox";
|
|
19
|
+
interface GeneratedApiKey {
|
|
20
|
+
key: string;
|
|
21
|
+
hash: string;
|
|
22
|
+
prefix: string;
|
|
23
|
+
suffix: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generate a cryptographically secure API key
|
|
27
|
+
*
|
|
28
|
+
* @param environment - The organization environment type ("live" or "sandbox")
|
|
29
|
+
* @returns Object containing full key, hash, and display parts
|
|
30
|
+
*/
|
|
31
|
+
export declare function generateApiKey(environment?: ApiKeyEnvironment): Promise<GeneratedApiKey>;
|
|
32
|
+
/**
|
|
33
|
+
* Hash an API key using SHA-256
|
|
34
|
+
*
|
|
35
|
+
* @param key - The full API key to hash
|
|
36
|
+
* @returns Base64-encoded SHA-256 hash
|
|
37
|
+
*/
|
|
38
|
+
export declare function hashApiKey(key: string): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Verify an API key against a stored hash
|
|
41
|
+
* Uses constant-time comparison to prevent timing attacks
|
|
42
|
+
*
|
|
43
|
+
* @param key - The provided API key
|
|
44
|
+
* @param storedHash - The SHA-256 hash from database
|
|
45
|
+
* @returns True if key matches hash
|
|
46
|
+
*/
|
|
47
|
+
export declare function verifyApiKey(key: string, storedHash: string): Promise<boolean>;
|
|
48
|
+
//# sourceMappingURL=api-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../src/api-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAE7G,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAA;AASlD,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,WAAW,GAAE,iBAA0B,GACtC,OAAO,CAAC,eAAe,CAAC,CA0B1B;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS7D;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGpF"}
|
package/dist/api-keys.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key Generation and Hashing Utilities (Server-only)
|
|
3
|
+
*
|
|
4
|
+
* This file uses Web Crypto API and should only be imported in server-side code.
|
|
5
|
+
* For client-safe utilities, import from api-keys-client.ts directly.
|
|
6
|
+
*
|
|
7
|
+
* Key format: voy_<env>_<32 random bytes in base64url>
|
|
8
|
+
* Examples:
|
|
9
|
+
* - Live: voy_live_8kNp2qX4vR9mJ7tY3wL1nC5bD6fG8hK0
|
|
10
|
+
* - Sandbox: voy_sbx_8kNp2qX4vR9mJ7tY3wL1nC5bD6fG8hK0
|
|
11
|
+
*
|
|
12
|
+
* Security:
|
|
13
|
+
* - Uses Web Crypto API for CSPRNG
|
|
14
|
+
* - SHA-256 hash for storage (irreversible)
|
|
15
|
+
* - Constant-time comparison to prevent timing attacks
|
|
16
|
+
*/
|
|
17
|
+
// Use globalThis.crypto which is available in Workers, Node.js 20+, and browsers
|
|
18
|
+
// Re-export client-safe utilities for convenience in server code
|
|
19
|
+
export { maskApiKey, isValidApiKeyFormat, extractApiKeyParts, getApiKeyEnvironment } from "./api-keys-client";
|
|
20
|
+
const API_KEY_PREFIXES = {
|
|
21
|
+
live: "voy_live",
|
|
22
|
+
sandbox: "voy_test",
|
|
23
|
+
};
|
|
24
|
+
const RANDOM_BYTES_LENGTH = 32;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a cryptographically secure API key
|
|
27
|
+
*
|
|
28
|
+
* @param environment - The organization environment type ("live" or "sandbox")
|
|
29
|
+
* @returns Object containing full key, hash, and display parts
|
|
30
|
+
*/
|
|
31
|
+
export async function generateApiKey(environment = "live") {
|
|
32
|
+
// Generate 32 random bytes using Web Crypto API
|
|
33
|
+
const randomBytes = globalThis.crypto.getRandomValues(new Uint8Array(RANDOM_BYTES_LENGTH));
|
|
34
|
+
// Convert to base64url (URL-safe, no padding)
|
|
35
|
+
const randomPart = bufferToBase64Url(randomBytes).slice(0, 32);
|
|
36
|
+
// Get prefix based on environment
|
|
37
|
+
const keyPrefix = API_KEY_PREFIXES[environment];
|
|
38
|
+
// Construct full key
|
|
39
|
+
const key = `${keyPrefix}_${randomPart}`;
|
|
40
|
+
// Hash for storage
|
|
41
|
+
const hash = await hashApiKey(key);
|
|
42
|
+
// Extract display parts
|
|
43
|
+
const prefix = key.slice(0, 8); // "voy_live" or "voy_sbx_"
|
|
44
|
+
const suffix = key.slice(-6); // Last 6 chars
|
|
45
|
+
return {
|
|
46
|
+
key,
|
|
47
|
+
hash,
|
|
48
|
+
prefix,
|
|
49
|
+
suffix,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Hash an API key using SHA-256
|
|
54
|
+
*
|
|
55
|
+
* @param key - The full API key to hash
|
|
56
|
+
* @returns Base64-encoded SHA-256 hash
|
|
57
|
+
*/
|
|
58
|
+
export async function hashApiKey(key) {
|
|
59
|
+
const encoder = new TextEncoder();
|
|
60
|
+
const data = encoder.encode(key);
|
|
61
|
+
// SHA-256 hash
|
|
62
|
+
const hashBuffer = await globalThis.crypto.subtle.digest("SHA-256", data);
|
|
63
|
+
// Convert to base64
|
|
64
|
+
return bufferToBase64(new Uint8Array(hashBuffer));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Verify an API key against a stored hash
|
|
68
|
+
* Uses constant-time comparison to prevent timing attacks
|
|
69
|
+
*
|
|
70
|
+
* @param key - The provided API key
|
|
71
|
+
* @param storedHash - The SHA-256 hash from database
|
|
72
|
+
* @returns True if key matches hash
|
|
73
|
+
*/
|
|
74
|
+
export async function verifyApiKey(key, storedHash) {
|
|
75
|
+
const providedHash = await hashApiKey(key);
|
|
76
|
+
return constantTimeEqual(providedHash, storedHash);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Constant-time string comparison to prevent timing attacks
|
|
80
|
+
*
|
|
81
|
+
* @param a - First string
|
|
82
|
+
* @param b - Second string
|
|
83
|
+
* @returns True if strings are equal
|
|
84
|
+
*/
|
|
85
|
+
function constantTimeEqual(a, b) {
|
|
86
|
+
if (a.length !== b.length)
|
|
87
|
+
return false;
|
|
88
|
+
let result = 0;
|
|
89
|
+
for (let i = 0; i < a.length; i++) {
|
|
90
|
+
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
91
|
+
}
|
|
92
|
+
return result === 0;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Convert Uint8Array to base64 string
|
|
96
|
+
*/
|
|
97
|
+
function bufferToBase64(buffer) {
|
|
98
|
+
const bytes = Array.from(buffer);
|
|
99
|
+
const binary = String.fromCharCode(...bytes);
|
|
100
|
+
return btoa(binary);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Convert Uint8Array to base64url (URL-safe, no padding)
|
|
104
|
+
*/
|
|
105
|
+
function bufferToBase64Url(buffer) {
|
|
106
|
+
return bufferToBase64(buffer).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=api-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../src/api-keys.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Cache Utility
|
|
3
|
+
*
|
|
4
|
+
* Simple cache-aside pattern for all caching needs.
|
|
5
|
+
* Supports Cloudflare KV (primary) with graceful fallback to no-op.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const value = await cached('my-key', 300, () => fetchExpensiveData(), kv)
|
|
9
|
+
*
|
|
10
|
+
* Or with the class for more control:
|
|
11
|
+
* const cache = new Cache(kv)
|
|
12
|
+
* const value = await cache.get('key') ?? await cache.set('key', data, 300)
|
|
13
|
+
*
|
|
14
|
+
* NOTE: Upstash Redis has been removed. Use Cloudflare KV instead.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* KV-compatible interface (works with Cloudflare KV)
|
|
18
|
+
*/
|
|
19
|
+
export interface KVStore {
|
|
20
|
+
get<T = string>(key: string, options?: {
|
|
21
|
+
type?: "json" | "text";
|
|
22
|
+
}): Promise<T | null>;
|
|
23
|
+
put(key: string, value: string, options?: {
|
|
24
|
+
expirationTtl?: number;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
delete(key: string): Promise<void>;
|
|
27
|
+
list?(options?: {
|
|
28
|
+
prefix?: string;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
keys: Array<{
|
|
31
|
+
name: string;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Common TTL values (in seconds)
|
|
37
|
+
*/
|
|
38
|
+
export declare const TTL: {
|
|
39
|
+
/** 1 minute */
|
|
40
|
+
readonly SHORT: 60;
|
|
41
|
+
/** 5 minutes */
|
|
42
|
+
readonly MEDIUM: 300;
|
|
43
|
+
/** 15 minutes */
|
|
44
|
+
readonly DEFAULT: 900;
|
|
45
|
+
/** 1 hour */
|
|
46
|
+
readonly LONG: 3600;
|
|
47
|
+
/** 24 hours */
|
|
48
|
+
readonly DAY: 86400;
|
|
49
|
+
/** 7 days */
|
|
50
|
+
readonly WEEK: 604800;
|
|
51
|
+
/** 30 days */
|
|
52
|
+
readonly MONTH: 2592000;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Cache-aside helper function
|
|
56
|
+
*
|
|
57
|
+
* Tries to get value from cache, if miss, computes and caches the result.
|
|
58
|
+
* Gracefully falls back to compute on any cache failure.
|
|
59
|
+
*
|
|
60
|
+
* @param key - Cache key (will be used as-is, add your own prefix)
|
|
61
|
+
* @param ttlSeconds - Time to live in seconds
|
|
62
|
+
* @param compute - Function to compute the value on cache miss
|
|
63
|
+
* @param kv - Cloudflare KV namespace
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* const user = await cached(
|
|
67
|
+
* `user:${userId}`,
|
|
68
|
+
* TTL.MEDIUM,
|
|
69
|
+
* () => db.query.users.findFirst({ where: eq(users.id, userId) }),
|
|
70
|
+
* env.CACHE
|
|
71
|
+
* )
|
|
72
|
+
*/
|
|
73
|
+
export declare function cached<T>(key: string, ttlSeconds: number, compute: () => Promise<T>, kv?: KVStore | null): Promise<T>;
|
|
74
|
+
/**
|
|
75
|
+
* Cache class for more control over caching operations
|
|
76
|
+
*/
|
|
77
|
+
export declare class Cache {
|
|
78
|
+
private kv;
|
|
79
|
+
constructor(kv: KVStore | null);
|
|
80
|
+
/**
|
|
81
|
+
* Get a value from cache
|
|
82
|
+
*/
|
|
83
|
+
get<T>(key: string): Promise<T | null>;
|
|
84
|
+
/**
|
|
85
|
+
* Set a value in cache
|
|
86
|
+
*/
|
|
87
|
+
set<T>(key: string, value: T, ttlSeconds: number): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Delete a value from cache
|
|
90
|
+
*/
|
|
91
|
+
del(key: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Delete multiple keys by pattern
|
|
94
|
+
* Note: KV doesn't support pattern deletion natively, so we list and delete
|
|
95
|
+
*/
|
|
96
|
+
delPattern(pattern: string): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Cache-aside helper
|
|
99
|
+
*/
|
|
100
|
+
cached<T>(key: string, ttlSeconds: number, compute: () => Promise<T>): Promise<T>;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a Cache instance from KV namespace
|
|
104
|
+
*/
|
|
105
|
+
export declare function createCache(kv?: KVStore | null): Cache;
|
|
106
|
+
/**
|
|
107
|
+
* Create a Cache instance from Cloudflare Workers env
|
|
108
|
+
*/
|
|
109
|
+
export declare function createCacheFromEnv(env: {
|
|
110
|
+
CACHE?: KVStore;
|
|
111
|
+
}): Cache;
|
|
112
|
+
/**
|
|
113
|
+
* @deprecated Use KV directly instead
|
|
114
|
+
*/
|
|
115
|
+
export declare function getRedis(): null;
|
|
116
|
+
/**
|
|
117
|
+
* @deprecated Use KV directly instead
|
|
118
|
+
*/
|
|
119
|
+
export declare function getRedisFromEnv(_env: {
|
|
120
|
+
UPSTASH_REDIS_REST_URL?: string;
|
|
121
|
+
UPSTASH_REDIS_REST_TOKEN?: string;
|
|
122
|
+
}): null;
|
|
123
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACrF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CACjF;AAED;;GAEG;AACH,eAAO,MAAM,GAAG;IACd,eAAe;;IAEf,gBAAgB;;IAEhB,iBAAiB;;IAEjB,aAAa;;IAEb,eAAe;;IAEf,aAAa;;IAEb,cAAc;;CAEN,CAAA;AAEV;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,GAClB,OAAO,CAAC,CAAC,CAAC,CAyBZ;AAED;;GAEG;AACH,qBAAa,KAAK;IACJ,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,OAAO,GAAG,IAAI;IAEtC;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAY5C;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAehD;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGxF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,KAAK,CAEtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,KAAK,CAElE;AAMD;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CAG/B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAA;CAClC,GAAG,IAAI,CAGP"}
|