@package-broker/core 0.2.15
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/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/memory-driver.d.ts +15 -0
- package/dist/cache/memory-driver.d.ts.map +1 -0
- package/dist/cache/memory-driver.js +56 -0
- package/dist/cache/memory-driver.js.map +1 -0
- package/dist/db/d1-driver.d.ts +3 -0
- package/dist/db/d1-driver.d.ts.map +1 -0
- package/dist/db/d1-driver.js +7 -0
- package/dist/db/d1-driver.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +696 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +99 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/factory.d.ts +34 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +121 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/index.d.ts +2 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +7 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/processor.d.ts +49 -0
- package/dist/jobs/processor.d.ts.map +1 -0
- package/dist/jobs/processor.js +118 -0
- package/dist/jobs/processor.js.map +1 -0
- package/dist/middleware/auth.d.ts +52 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +300 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/composer-version.d.ts +7 -0
- package/dist/middleware/composer-version.d.ts.map +1 -0
- package/dist/middleware/composer-version.js +18 -0
- package/dist/middleware/composer-version.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +7 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +45 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +5 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +6 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-id.d.ts +9 -0
- package/dist/middleware/request-id.d.ts.map +1 -0
- package/dist/middleware/request-id.js +36 -0
- package/dist/middleware/request-id.js.map +1 -0
- package/dist/ports.d.ts +32 -0
- package/dist/ports.d.ts.map +1 -0
- package/dist/ports.js +4 -0
- package/dist/ports.js.map +1 -0
- package/dist/queue/consumer.d.ts +18 -0
- package/dist/queue/consumer.d.ts.map +1 -0
- package/dist/queue/consumer.js +82 -0
- package/dist/queue/consumer.js.map +1 -0
- package/dist/queue/index.d.ts +2 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +2 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/memory-driver.d.ts +13 -0
- package/dist/queue/memory-driver.d.ts.map +1 -0
- package/dist/queue/memory-driver.js +22 -0
- package/dist/queue/memory-driver.js.map +1 -0
- package/dist/queue/types.d.ts +19 -0
- package/dist/queue/types.d.ts.map +1 -0
- package/dist/queue/types.js +3 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/routes/api/artifacts.d.ts +25 -0
- package/dist/routes/api/artifacts.d.ts.map +1 -0
- package/dist/routes/api/artifacts.js +57 -0
- package/dist/routes/api/artifacts.js.map +1 -0
- package/dist/routes/api/auth.d.ts +50 -0
- package/dist/routes/api/auth.d.ts.map +1 -0
- package/dist/routes/api/auth.js +268 -0
- package/dist/routes/api/auth.js.map +1 -0
- package/dist/routes/api/index.d.ts +9 -0
- package/dist/routes/api/index.d.ts.map +1 -0
- package/dist/routes/api/index.js +10 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/packages.d.ts +47 -0
- package/dist/routes/api/packages.d.ts.map +1 -0
- package/dist/routes/api/packages.js +671 -0
- package/dist/routes/api/packages.js.map +1 -0
- package/dist/routes/api/repositories.d.ts +56 -0
- package/dist/routes/api/repositories.d.ts.map +1 -0
- package/dist/routes/api/repositories.js +317 -0
- package/dist/routes/api/repositories.js.map +1 -0
- package/dist/routes/api/settings.d.ts +28 -0
- package/dist/routes/api/settings.d.ts.map +1 -0
- package/dist/routes/api/settings.js +81 -0
- package/dist/routes/api/settings.js.map +1 -0
- package/dist/routes/api/stats.d.ts +21 -0
- package/dist/routes/api/stats.d.ts.map +1 -0
- package/dist/routes/api/stats.js +52 -0
- package/dist/routes/api/stats.js.map +1 -0
- package/dist/routes/api/tokens.d.ts +39 -0
- package/dist/routes/api/tokens.d.ts.map +1 -0
- package/dist/routes/api/tokens.js +191 -0
- package/dist/routes/api/tokens.js.map +1 -0
- package/dist/routes/api/users.d.ts +5 -0
- package/dist/routes/api/users.d.ts.map +1 -0
- package/dist/routes/api/users.js +125 -0
- package/dist/routes/api/users.js.map +1 -0
- package/dist/routes/composer.d.ts +133 -0
- package/dist/routes/composer.d.ts.map +1 -0
- package/dist/routes/composer.js +1179 -0
- package/dist/routes/composer.js.map +1 -0
- package/dist/routes/dist.d.ts +32 -0
- package/dist/routes/dist.d.ts.map +1 -0
- package/dist/routes/dist.js +761 -0
- package/dist/routes/dist.js.map +1 -0
- package/dist/routes/health.d.ts +7 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +22 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +6 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/services/EmailService.d.ts +20 -0
- package/dist/services/EmailService.d.ts.map +1 -0
- package/dist/services/EmailService.js +27 -0
- package/dist/services/EmailService.js.map +1 -0
- package/dist/services/UserService.d.ts +27 -0
- package/dist/services/UserService.d.ts.map +1 -0
- package/dist/services/UserService.js +164 -0
- package/dist/services/UserService.js.map +1 -0
- package/dist/storage/driver.d.ts +65 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +59 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/r2-driver.d.ts +16 -0
- package/dist/storage/r2-driver.d.ts.map +1 -0
- package/dist/storage/r2-driver.js +28 -0
- package/dist/storage/r2-driver.js.map +1 -0
- package/dist/storage/s3-driver.d.ts +22 -0
- package/dist/storage/s3-driver.d.ts.map +1 -0
- package/dist/storage/s3-driver.js +66 -0
- package/dist/storage/s3-driver.js.map +1 -0
- package/dist/sync/github-sync.d.ts +15 -0
- package/dist/sync/github-sync.d.ts.map +1 -0
- package/dist/sync/github-sync.js +39 -0
- package/dist/sync/github-sync.js.map +1 -0
- package/dist/sync/index.d.ts +5 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +6 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/repository-sync.d.ts +18 -0
- package/dist/sync/repository-sync.d.ts.map +1 -0
- package/dist/sync/repository-sync.js +214 -0
- package/dist/sync/repository-sync.js.map +1 -0
- package/dist/sync/strategies/composer-repo.d.ts +11 -0
- package/dist/sync/strategies/composer-repo.d.ts.map +1 -0
- package/dist/sync/strategies/composer-repo.js +269 -0
- package/dist/sync/strategies/composer-repo.js.map +1 -0
- package/dist/sync/strategies/github-api.d.ts +6 -0
- package/dist/sync/strategies/github-api.d.ts.map +1 -0
- package/dist/sync/strategies/github-api.js +137 -0
- package/dist/sync/strategies/github-api.js.map +1 -0
- package/dist/sync/strategies/github-packages.d.ts +7 -0
- package/dist/sync/strategies/github-packages.d.ts.map +1 -0
- package/dist/sync/strategies/github-packages.js +66 -0
- package/dist/sync/strategies/github-packages.js.map +1 -0
- package/dist/sync/strategies/index.d.ts +4 -0
- package/dist/sync/strategies/index.d.ts.map +1 -0
- package/dist/sync/strategies/index.js +5 -0
- package/dist/sync/strategies/index.js.map +1 -0
- package/dist/sync/types.d.ts +60 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +3 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/utils/analytics.d.ts +142 -0
- package/dist/utils/analytics.d.ts.map +1 -0
- package/dist/utils/analytics.js +229 -0
- package/dist/utils/analytics.js.map +1 -0
- package/dist/utils/download.d.ts +10 -0
- package/dist/utils/download.d.ts.map +1 -0
- package/dist/utils/download.js +34 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/encryption.d.ts +20 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +76 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +78 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +134 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/upstream-fetch.d.ts +15 -0
- package/dist/utils/upstream-fetch.d.ts.map +1 -0
- package/dist/utils/upstream-fetch.js +108 -0
- package/dist/utils/upstream-fetch.js.map +1 -0
- package/dist/workflows/index.d.ts +3 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +8 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/package-storage.d.ts +47 -0
- package/dist/workflows/package-storage.d.ts.map +1 -0
- package/dist/workflows/package-storage.js +136 -0
- package/dist/workflows/package-storage.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Engine utility for tracking application events
|
|
3
|
+
*
|
|
4
|
+
* Provides type-safe event tracking to Cloudflare Analytics Engine.
|
|
5
|
+
* Analytics Engine is optional - all functions are no-ops if binding is unavailable.
|
|
6
|
+
*/
|
|
7
|
+
export type EventType = 'package_download' | 'package_metadata_request' | 'repository_sync_start' | 'repository_sync_success' | 'repository_sync_failure' | 'auth_login' | 'auth_token_used' | 'repository_created' | 'repository_updated' | 'repository_deleted' | 'token_created' | 'token_deleted';
|
|
8
|
+
export interface AnalyticsEvent {
|
|
9
|
+
eventType: EventType;
|
|
10
|
+
timestamp: number;
|
|
11
|
+
requestId?: string;
|
|
12
|
+
packageName?: string;
|
|
13
|
+
version?: string;
|
|
14
|
+
repoId?: string;
|
|
15
|
+
size?: number;
|
|
16
|
+
cacheHit?: boolean;
|
|
17
|
+
packageCount?: number;
|
|
18
|
+
strategy?: string;
|
|
19
|
+
error?: string;
|
|
20
|
+
userId?: string;
|
|
21
|
+
tokenId?: string;
|
|
22
|
+
}
|
|
23
|
+
declare class Analytics {
|
|
24
|
+
private analytics?;
|
|
25
|
+
/**
|
|
26
|
+
* Initialize analytics with optional Analytics Engine binding
|
|
27
|
+
*/
|
|
28
|
+
init(analytics?: AnalyticsEngineDataset): void;
|
|
29
|
+
/**
|
|
30
|
+
* Write a data point to Analytics Engine
|
|
31
|
+
* No-op if Analytics Engine is not configured
|
|
32
|
+
*/
|
|
33
|
+
writeDataPoint(event: AnalyticsEvent): void;
|
|
34
|
+
/**
|
|
35
|
+
* Track package download event
|
|
36
|
+
*/
|
|
37
|
+
trackPackageDownload(params: {
|
|
38
|
+
requestId?: string;
|
|
39
|
+
packageName: string;
|
|
40
|
+
version: string;
|
|
41
|
+
repoId: string;
|
|
42
|
+
size?: number;
|
|
43
|
+
cacheHit: boolean;
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Track package metadata request event
|
|
47
|
+
*/
|
|
48
|
+
trackPackageMetadataRequest(params: {
|
|
49
|
+
requestId?: string;
|
|
50
|
+
cacheHit: boolean;
|
|
51
|
+
packageCount?: number;
|
|
52
|
+
}): void;
|
|
53
|
+
/**
|
|
54
|
+
* Track repository sync start event
|
|
55
|
+
*/
|
|
56
|
+
trackRepositorySyncStart(params: {
|
|
57
|
+
requestId?: string;
|
|
58
|
+
repoId: string;
|
|
59
|
+
}): void;
|
|
60
|
+
/**
|
|
61
|
+
* Track repository sync success event
|
|
62
|
+
*/
|
|
63
|
+
trackRepositorySyncSuccess(params: {
|
|
64
|
+
requestId?: string;
|
|
65
|
+
repoId: string;
|
|
66
|
+
packageCount: number;
|
|
67
|
+
strategy: string;
|
|
68
|
+
}): void;
|
|
69
|
+
/**
|
|
70
|
+
* Track repository sync failure event
|
|
71
|
+
*/
|
|
72
|
+
trackRepositorySyncFailure(params: {
|
|
73
|
+
requestId?: string;
|
|
74
|
+
repoId: string;
|
|
75
|
+
error: string;
|
|
76
|
+
}): void;
|
|
77
|
+
/**
|
|
78
|
+
* Track authentication login event
|
|
79
|
+
*/
|
|
80
|
+
trackAuthLogin(params: {
|
|
81
|
+
requestId?: string;
|
|
82
|
+
userId: string;
|
|
83
|
+
success: boolean;
|
|
84
|
+
}): void;
|
|
85
|
+
/**
|
|
86
|
+
* Track token authentication event
|
|
87
|
+
*/
|
|
88
|
+
trackAuthTokenUsed(params: {
|
|
89
|
+
requestId?: string;
|
|
90
|
+
tokenId: string;
|
|
91
|
+
}): void;
|
|
92
|
+
/**
|
|
93
|
+
* Track repository created event
|
|
94
|
+
*/
|
|
95
|
+
trackRepositoryCreated(params: {
|
|
96
|
+
requestId?: string;
|
|
97
|
+
repoId: string;
|
|
98
|
+
userId?: string;
|
|
99
|
+
}): void;
|
|
100
|
+
/**
|
|
101
|
+
* Track repository updated event
|
|
102
|
+
*/
|
|
103
|
+
trackRepositoryUpdated(params: {
|
|
104
|
+
requestId?: string;
|
|
105
|
+
repoId: string;
|
|
106
|
+
userId?: string;
|
|
107
|
+
}): void;
|
|
108
|
+
/**
|
|
109
|
+
* Track repository deleted event
|
|
110
|
+
*/
|
|
111
|
+
trackRepositoryDeleted(params: {
|
|
112
|
+
requestId?: string;
|
|
113
|
+
repoId: string;
|
|
114
|
+
userId?: string;
|
|
115
|
+
}): void;
|
|
116
|
+
/**
|
|
117
|
+
* Track token created event
|
|
118
|
+
*/
|
|
119
|
+
trackTokenCreated(params: {
|
|
120
|
+
requestId?: string;
|
|
121
|
+
tokenId: string;
|
|
122
|
+
userId?: string;
|
|
123
|
+
}): void;
|
|
124
|
+
/**
|
|
125
|
+
* Track token deleted event
|
|
126
|
+
*/
|
|
127
|
+
trackTokenDeleted(params: {
|
|
128
|
+
requestId?: string;
|
|
129
|
+
tokenId: string;
|
|
130
|
+
userId?: string;
|
|
131
|
+
}): void;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get analytics instance
|
|
135
|
+
*/
|
|
136
|
+
export declare function getAnalytics(): Analytics;
|
|
137
|
+
/**
|
|
138
|
+
* Initialize analytics with binding (called from worker initialization)
|
|
139
|
+
*/
|
|
140
|
+
export declare function initAnalytics(analytics?: AnalyticsEngineDataset): void;
|
|
141
|
+
export {};
|
|
142
|
+
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/utils/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
class Analytics {
|
|
7
|
+
analytics;
|
|
8
|
+
/**
|
|
9
|
+
* Initialize analytics with optional Analytics Engine binding
|
|
10
|
+
*/
|
|
11
|
+
init(analytics) {
|
|
12
|
+
this.analytics = analytics;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Write a data point to Analytics Engine
|
|
16
|
+
* No-op if Analytics Engine is not configured
|
|
17
|
+
*/
|
|
18
|
+
writeDataPoint(event) {
|
|
19
|
+
if (!this.analytics) {
|
|
20
|
+
return; // No-op if Analytics Engine not configured
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
// Map event data to Analytics Engine format
|
|
24
|
+
const blobs = [event.eventType];
|
|
25
|
+
const doubles = [event.timestamp];
|
|
26
|
+
const indexes = [];
|
|
27
|
+
// Add event-specific blobs (strings for filtering/grouping)
|
|
28
|
+
if (event.packageName)
|
|
29
|
+
blobs.push(event.packageName);
|
|
30
|
+
if (event.version)
|
|
31
|
+
blobs.push(event.version);
|
|
32
|
+
if (event.repoId)
|
|
33
|
+
blobs.push(event.repoId);
|
|
34
|
+
if (event.strategy)
|
|
35
|
+
blobs.push(event.strategy);
|
|
36
|
+
if (event.error)
|
|
37
|
+
blobs.push(event.error);
|
|
38
|
+
if (event.userId)
|
|
39
|
+
blobs.push(event.userId);
|
|
40
|
+
if (event.tokenId)
|
|
41
|
+
blobs.push(event.tokenId);
|
|
42
|
+
if (event.cacheHit !== undefined)
|
|
43
|
+
blobs.push(event.cacheHit ? 'true' : 'false');
|
|
44
|
+
// Add event-specific doubles (numbers for metrics)
|
|
45
|
+
if (event.size !== undefined)
|
|
46
|
+
doubles.push(event.size);
|
|
47
|
+
if (event.packageCount !== undefined)
|
|
48
|
+
doubles.push(event.packageCount);
|
|
49
|
+
// Add request ID as index (for correlation)
|
|
50
|
+
if (event.requestId)
|
|
51
|
+
indexes.push(event.requestId);
|
|
52
|
+
// Write to Analytics Engine (non-blocking, async)
|
|
53
|
+
this.analytics.writeDataPoint({
|
|
54
|
+
blobs,
|
|
55
|
+
doubles,
|
|
56
|
+
indexes,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Silently fail - analytics should never break the application
|
|
61
|
+
// Errors are logged but don't throw
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Track package download event
|
|
66
|
+
*/
|
|
67
|
+
trackPackageDownload(params) {
|
|
68
|
+
this.writeDataPoint({
|
|
69
|
+
eventType: 'package_download',
|
|
70
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
71
|
+
requestId: params.requestId,
|
|
72
|
+
packageName: params.packageName,
|
|
73
|
+
version: params.version,
|
|
74
|
+
repoId: params.repoId,
|
|
75
|
+
size: params.size,
|
|
76
|
+
cacheHit: params.cacheHit,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Track package metadata request event
|
|
81
|
+
*/
|
|
82
|
+
trackPackageMetadataRequest(params) {
|
|
83
|
+
this.writeDataPoint({
|
|
84
|
+
eventType: 'package_metadata_request',
|
|
85
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
86
|
+
requestId: params.requestId,
|
|
87
|
+
cacheHit: params.cacheHit,
|
|
88
|
+
packageCount: params.packageCount,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Track repository sync start event
|
|
93
|
+
*/
|
|
94
|
+
trackRepositorySyncStart(params) {
|
|
95
|
+
this.writeDataPoint({
|
|
96
|
+
eventType: 'repository_sync_start',
|
|
97
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
98
|
+
requestId: params.requestId,
|
|
99
|
+
repoId: params.repoId,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Track repository sync success event
|
|
104
|
+
*/
|
|
105
|
+
trackRepositorySyncSuccess(params) {
|
|
106
|
+
this.writeDataPoint({
|
|
107
|
+
eventType: 'repository_sync_success',
|
|
108
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
109
|
+
requestId: params.requestId,
|
|
110
|
+
repoId: params.repoId,
|
|
111
|
+
packageCount: params.packageCount,
|
|
112
|
+
strategy: params.strategy,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Track repository sync failure event
|
|
117
|
+
*/
|
|
118
|
+
trackRepositorySyncFailure(params) {
|
|
119
|
+
this.writeDataPoint({
|
|
120
|
+
eventType: 'repository_sync_failure',
|
|
121
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
122
|
+
requestId: params.requestId,
|
|
123
|
+
repoId: params.repoId,
|
|
124
|
+
error: params.error,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Track authentication login event
|
|
129
|
+
*/
|
|
130
|
+
trackAuthLogin(params) {
|
|
131
|
+
this.writeDataPoint({
|
|
132
|
+
eventType: 'auth_login',
|
|
133
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
134
|
+
requestId: params.requestId,
|
|
135
|
+
userId: params.userId,
|
|
136
|
+
error: params.success ? undefined : 'login_failed',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Track token authentication event
|
|
141
|
+
*/
|
|
142
|
+
trackAuthTokenUsed(params) {
|
|
143
|
+
this.writeDataPoint({
|
|
144
|
+
eventType: 'auth_token_used',
|
|
145
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
146
|
+
requestId: params.requestId,
|
|
147
|
+
tokenId: params.tokenId,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Track repository created event
|
|
152
|
+
*/
|
|
153
|
+
trackRepositoryCreated(params) {
|
|
154
|
+
this.writeDataPoint({
|
|
155
|
+
eventType: 'repository_created',
|
|
156
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
157
|
+
requestId: params.requestId,
|
|
158
|
+
repoId: params.repoId,
|
|
159
|
+
userId: params.userId,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Track repository updated event
|
|
164
|
+
*/
|
|
165
|
+
trackRepositoryUpdated(params) {
|
|
166
|
+
this.writeDataPoint({
|
|
167
|
+
eventType: 'repository_updated',
|
|
168
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
169
|
+
requestId: params.requestId,
|
|
170
|
+
repoId: params.repoId,
|
|
171
|
+
userId: params.userId,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Track repository deleted event
|
|
176
|
+
*/
|
|
177
|
+
trackRepositoryDeleted(params) {
|
|
178
|
+
this.writeDataPoint({
|
|
179
|
+
eventType: 'repository_deleted',
|
|
180
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
181
|
+
requestId: params.requestId,
|
|
182
|
+
repoId: params.repoId,
|
|
183
|
+
userId: params.userId,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Track token created event
|
|
188
|
+
*/
|
|
189
|
+
trackTokenCreated(params) {
|
|
190
|
+
this.writeDataPoint({
|
|
191
|
+
eventType: 'token_created',
|
|
192
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
193
|
+
requestId: params.requestId,
|
|
194
|
+
tokenId: params.tokenId,
|
|
195
|
+
userId: params.userId,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Track token deleted event
|
|
200
|
+
*/
|
|
201
|
+
trackTokenDeleted(params) {
|
|
202
|
+
this.writeDataPoint({
|
|
203
|
+
eventType: 'token_deleted',
|
|
204
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
205
|
+
requestId: params.requestId,
|
|
206
|
+
tokenId: params.tokenId,
|
|
207
|
+
userId: params.userId,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Create singleton instance
|
|
212
|
+
let analyticsInstance = null;
|
|
213
|
+
/**
|
|
214
|
+
* Get analytics instance
|
|
215
|
+
*/
|
|
216
|
+
export function getAnalytics() {
|
|
217
|
+
if (!analyticsInstance) {
|
|
218
|
+
analyticsInstance = new Analytics();
|
|
219
|
+
}
|
|
220
|
+
return analyticsInstance;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Initialize analytics with binding (called from worker initialization)
|
|
224
|
+
*/
|
|
225
|
+
export function initAnalytics(analytics) {
|
|
226
|
+
const instance = getAnalytics();
|
|
227
|
+
instance.init(analytics);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/utils/analytics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,MAAM,SAAS;IACL,SAAS,CAA0B;IAE3C;;OAEG;IACH,IAAI,CAAC,SAAkC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,KAAqB;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,2CAA2C;QACrD,CAAC;QAED,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,4DAA4D;YAC5D,IAAI,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,KAAK,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,CAAC,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEhF,mDAAmD;YACnD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAEvE,4CAA4C;YAC5C,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAEnD,kDAAkD;YAClD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;gBAC5B,KAAK;gBACL,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+DAA+D;YAC/D,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,MAOpB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,kBAAkB;YAC7B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,2BAA2B,CAAC,MAI3B;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,0BAA0B;YACrC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,MAGxB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,uBAAuB;YAClC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,MAK1B;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,yBAAyB;YACpC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,0BAA0B,CAAC,MAI1B;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,yBAAyB;YACpC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAId;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,MAGlB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,iBAAiB;YAC5B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,MAItB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,oBAAoB;YAC/B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,MAItB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,oBAAoB;YAC/B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,MAItB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,oBAAoB;YAC/B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAIjB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,eAAe;YAC1B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,MAIjB;QACC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS,EAAE,eAAe;YAC1B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;CACF;AAED,4BAA4B;AAC5B,IAAI,iBAAiB,GAAqB,IAAI,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,SAAS,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAkC;IAC9D,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type CredentialType } from '@package-broker/shared';
|
|
2
|
+
/**
|
|
3
|
+
* Download artifact from source repository with authentication
|
|
4
|
+
* @param sourceUrl - Original source repository URL for the artifact
|
|
5
|
+
* @param credentialType - Type of authentication
|
|
6
|
+
* @param credentials - Authentication credentials
|
|
7
|
+
* @returns Response stream from the source repository
|
|
8
|
+
*/
|
|
9
|
+
export declare function downloadFromSource(sourceUrl: string, credentialType: CredentialType, credentials: Record<string, string>): Promise<Response>;
|
|
10
|
+
//# sourceMappingURL=download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,cAAc,EAAuB,MAAM,wBAAwB,CAAC;AAGpG;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,QAAQ,CAAC,CA0BnB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
import { buildAuthHeaders, COMPOSER_USER_AGENT } from '@package-broker/shared';
|
|
7
|
+
import pRetry from 'p-retry';
|
|
8
|
+
/**
|
|
9
|
+
* Download artifact from source repository with authentication
|
|
10
|
+
* @param sourceUrl - Original source repository URL for the artifact
|
|
11
|
+
* @param credentialType - Type of authentication
|
|
12
|
+
* @param credentials - Authentication credentials
|
|
13
|
+
* @returns Response stream from the source repository
|
|
14
|
+
*/
|
|
15
|
+
export async function downloadFromSource(sourceUrl, credentialType, credentials) {
|
|
16
|
+
// Build auth headers based on credential type
|
|
17
|
+
const authHeaders = buildAuthHeaders(credentialType, credentials);
|
|
18
|
+
// Download with retry logic
|
|
19
|
+
const response = await pRetry(() => fetch(sourceUrl, {
|
|
20
|
+
headers: {
|
|
21
|
+
...authHeaders,
|
|
22
|
+
Accept: 'application/zip, application/octet-stream, */*',
|
|
23
|
+
'User-Agent': COMPOSER_USER_AGENT,
|
|
24
|
+
},
|
|
25
|
+
}), { retries: 3 });
|
|
26
|
+
if (response.status === 401 || response.status === 403) {
|
|
27
|
+
throw new Error('Authentication failed when downloading from source repository');
|
|
28
|
+
}
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`Failed to download artifact: HTTP ${response.status}`);
|
|
31
|
+
}
|
|
32
|
+
return response;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAuB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,MAAM,MAAM,SAAS,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,cAA8B,EAC9B,WAAmC;IAEnC,8CAA8C;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAElE,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,GAAG,EAAE,CACH,KAAK,CAAC,SAAS,EAAE;QACf,OAAO,EAAE;YACP,GAAG,WAAW;YACd,MAAM,EAAE,gDAAgD;YACxD,YAAY,EAAE,mBAAmB;SAClC;KACF,CAAC,EACJ,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a new encryption key
|
|
3
|
+
* @returns Base64-encoded 32-byte key
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateEncryptionKey(): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* Encrypt credentials using AES-GCM
|
|
8
|
+
* @param data - Credential data to encrypt (JSON string)
|
|
9
|
+
* @param key - Encryption key from environment variable
|
|
10
|
+
* @returns Encrypted data as base64 string
|
|
11
|
+
*/
|
|
12
|
+
export declare function encryptCredentials(data: string, key: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Decrypt credentials using AES-GCM
|
|
15
|
+
* @param encryptedData - Base64 encoded encrypted data
|
|
16
|
+
* @param key - Encryption key from environment variable
|
|
17
|
+
* @returns Decrypted credential data as JSON string
|
|
18
|
+
*/
|
|
19
|
+
export declare function decryptCredentials(encryptedData: string, key: string): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/utils/encryption.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG7D;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAiDjB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAiDjB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Credential encryption utility using Web Crypto API
|
|
2
|
+
/**
|
|
3
|
+
* Generate a new encryption key
|
|
4
|
+
* @returns Base64-encoded 32-byte key
|
|
5
|
+
*/
|
|
6
|
+
export async function generateEncryptionKey() {
|
|
7
|
+
const key = crypto.getRandomValues(new Uint8Array(32));
|
|
8
|
+
return btoa(String.fromCharCode(...key));
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Encrypt credentials using AES-GCM
|
|
12
|
+
* @param data - Credential data to encrypt (JSON string)
|
|
13
|
+
* @param key - Encryption key from environment variable
|
|
14
|
+
* @returns Encrypted data as base64 string
|
|
15
|
+
*/
|
|
16
|
+
export async function encryptCredentials(data, key) {
|
|
17
|
+
const encoder = new TextEncoder();
|
|
18
|
+
const dataBuffer = encoder.encode(data);
|
|
19
|
+
// Import key from base64 or generate from string
|
|
20
|
+
const keyMaterial = await crypto.subtle.importKey('raw', encoder.encode(key.padEnd(32, '0').slice(0, 32)), // Ensure 32 bytes for AES-256
|
|
21
|
+
{ name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']);
|
|
22
|
+
// Generate salt and IV
|
|
23
|
+
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
24
|
+
const iv = crypto.getRandomValues(new Uint8Array(12)); // 12 bytes for GCM
|
|
25
|
+
// Derive key using PBKDF2
|
|
26
|
+
const derivedKey = await crypto.subtle.deriveKey({
|
|
27
|
+
name: 'PBKDF2',
|
|
28
|
+
salt: salt,
|
|
29
|
+
iterations: 100000,
|
|
30
|
+
hash: 'SHA-256',
|
|
31
|
+
}, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt']);
|
|
32
|
+
// Encrypt data
|
|
33
|
+
const encrypted = await crypto.subtle.encrypt({
|
|
34
|
+
name: 'AES-GCM',
|
|
35
|
+
iv: iv,
|
|
36
|
+
}, derivedKey, dataBuffer);
|
|
37
|
+
// Combine salt + iv + encrypted data
|
|
38
|
+
const combined = new Uint8Array(salt.length + iv.length + encrypted.byteLength);
|
|
39
|
+
combined.set(salt, 0);
|
|
40
|
+
combined.set(iv, salt.length);
|
|
41
|
+
combined.set(new Uint8Array(encrypted), salt.length + iv.length);
|
|
42
|
+
// Return as base64
|
|
43
|
+
return btoa(String.fromCharCode(...combined));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Decrypt credentials using AES-GCM
|
|
47
|
+
* @param encryptedData - Base64 encoded encrypted data
|
|
48
|
+
* @param key - Encryption key from environment variable
|
|
49
|
+
* @returns Decrypted credential data as JSON string
|
|
50
|
+
*/
|
|
51
|
+
export async function decryptCredentials(encryptedData, key) {
|
|
52
|
+
const decoder = new TextDecoder();
|
|
53
|
+
const encoder = new TextEncoder();
|
|
54
|
+
// Decode from base64
|
|
55
|
+
const combined = Uint8Array.from(atob(encryptedData), (c) => c.charCodeAt(0));
|
|
56
|
+
// Extract salt, IV, and encrypted data
|
|
57
|
+
const salt = combined.slice(0, 16);
|
|
58
|
+
const iv = combined.slice(16, 28);
|
|
59
|
+
const encrypted = combined.slice(28);
|
|
60
|
+
// Import key material
|
|
61
|
+
const keyMaterial = await crypto.subtle.importKey('raw', encoder.encode(key.padEnd(32, '0').slice(0, 32)), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']);
|
|
62
|
+
// Derive key using PBKDF2
|
|
63
|
+
const derivedKey = await crypto.subtle.deriveKey({
|
|
64
|
+
name: 'PBKDF2',
|
|
65
|
+
salt: salt,
|
|
66
|
+
iterations: 100000,
|
|
67
|
+
hash: 'SHA-256',
|
|
68
|
+
}, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
|
|
69
|
+
// Decrypt data
|
|
70
|
+
const decrypted = await crypto.subtle.decrypt({
|
|
71
|
+
name: 'AES-GCM',
|
|
72
|
+
iv: iv,
|
|
73
|
+
}, derivedKey, encrypted);
|
|
74
|
+
return decoder.decode(decrypted);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/utils/encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logger for Cloudflare Workers Logs
|
|
3
|
+
*
|
|
4
|
+
* Automatically emits to Workers Logs free tier (200k events/day, 3-day retention).
|
|
5
|
+
* Uses structured JSON format for better filtering and analysis in the dashboard.
|
|
6
|
+
*/
|
|
7
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
8
|
+
export interface LogContext {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface LogEntry {
|
|
12
|
+
level: LogLevel;
|
|
13
|
+
message: string;
|
|
14
|
+
timestamp: string;
|
|
15
|
+
requestId?: string;
|
|
16
|
+
context?: LogContext;
|
|
17
|
+
error?: {
|
|
18
|
+
message: string;
|
|
19
|
+
stack?: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
declare class Logger {
|
|
24
|
+
private logLevel;
|
|
25
|
+
private requestId?;
|
|
26
|
+
constructor(logLevel?: LogLevel);
|
|
27
|
+
/**
|
|
28
|
+
* Set request ID for correlation across log entries
|
|
29
|
+
*/
|
|
30
|
+
setRequestId(requestId: string): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get current request ID
|
|
33
|
+
*/
|
|
34
|
+
getRequestId(): string | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Set log level
|
|
37
|
+
*/
|
|
38
|
+
setLevel(level: LogLevel): void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if a log level should be emitted
|
|
41
|
+
*/
|
|
42
|
+
private shouldLog;
|
|
43
|
+
/**
|
|
44
|
+
* Create log entry
|
|
45
|
+
*/
|
|
46
|
+
private createLogEntry;
|
|
47
|
+
/**
|
|
48
|
+
* Emit log entry
|
|
49
|
+
*/
|
|
50
|
+
private emit;
|
|
51
|
+
/**
|
|
52
|
+
* Log debug message
|
|
53
|
+
*/
|
|
54
|
+
debug(message: string, context?: LogContext): void;
|
|
55
|
+
/**
|
|
56
|
+
* Log info message
|
|
57
|
+
*/
|
|
58
|
+
info(message: string, context?: LogContext): void;
|
|
59
|
+
/**
|
|
60
|
+
* Log warning message
|
|
61
|
+
*/
|
|
62
|
+
warn(message: string, context?: LogContext): void;
|
|
63
|
+
/**
|
|
64
|
+
* Log error message
|
|
65
|
+
*/
|
|
66
|
+
error(message: string, context?: LogContext, error?: Error): void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get logger instance
|
|
70
|
+
* Creates a new instance if one doesn't exist
|
|
71
|
+
*/
|
|
72
|
+
export declare function getLogger(logLevel?: LogLevel): Logger;
|
|
73
|
+
/**
|
|
74
|
+
* Create a new logger instance (useful for testing)
|
|
75
|
+
*/
|
|
76
|
+
export declare function createLogger(logLevel?: LogLevel): Logger;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,cAAM,MAAM;IACV,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,QAAQ,GAAE,QAAiB;IAIvC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAIlC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,OAAO,CAAC,IAAI;IAyBZ;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;CAGlE;AAKD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAQrD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAE,QAAiB,GAAG,MAAM,CAEhE"}
|