@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.
Files changed (217) hide show
  1. package/dist/cache/index.d.ts +2 -0
  2. package/dist/cache/index.d.ts.map +1 -0
  3. package/dist/cache/index.js +2 -0
  4. package/dist/cache/index.js.map +1 -0
  5. package/dist/cache/memory-driver.d.ts +15 -0
  6. package/dist/cache/memory-driver.d.ts.map +1 -0
  7. package/dist/cache/memory-driver.js +56 -0
  8. package/dist/cache/memory-driver.js.map +1 -0
  9. package/dist/db/d1-driver.d.ts +3 -0
  10. package/dist/db/d1-driver.d.ts.map +1 -0
  11. package/dist/db/d1-driver.js +7 -0
  12. package/dist/db/d1-driver.js.map +1 -0
  13. package/dist/db/index.d.ts +5 -0
  14. package/dist/db/index.d.ts.map +1 -0
  15. package/dist/db/index.js +4 -0
  16. package/dist/db/index.js.map +1 -0
  17. package/dist/db/schema.d.ts +696 -0
  18. package/dist/db/schema.d.ts.map +1 -0
  19. package/dist/db/schema.js +99 -0
  20. package/dist/db/schema.js.map +1 -0
  21. package/dist/factory.d.ts +34 -0
  22. package/dist/factory.d.ts.map +1 -0
  23. package/dist/factory.js +121 -0
  24. package/dist/factory.js.map +1 -0
  25. package/dist/index.d.ts +16 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +17 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/jobs/index.d.ts +2 -0
  30. package/dist/jobs/index.d.ts.map +1 -0
  31. package/dist/jobs/index.js +7 -0
  32. package/dist/jobs/index.js.map +1 -0
  33. package/dist/jobs/processor.d.ts +49 -0
  34. package/dist/jobs/processor.d.ts.map +1 -0
  35. package/dist/jobs/processor.js +118 -0
  36. package/dist/jobs/processor.js.map +1 -0
  37. package/dist/middleware/auth.d.ts +52 -0
  38. package/dist/middleware/auth.d.ts.map +1 -0
  39. package/dist/middleware/auth.js +300 -0
  40. package/dist/middleware/auth.js.map +1 -0
  41. package/dist/middleware/composer-version.d.ts +7 -0
  42. package/dist/middleware/composer-version.d.ts.map +1 -0
  43. package/dist/middleware/composer-version.js +18 -0
  44. package/dist/middleware/composer-version.js.map +1 -0
  45. package/dist/middleware/error-handler.d.ts +7 -0
  46. package/dist/middleware/error-handler.d.ts.map +1 -0
  47. package/dist/middleware/error-handler.js +45 -0
  48. package/dist/middleware/error-handler.js.map +1 -0
  49. package/dist/middleware/index.d.ts +5 -0
  50. package/dist/middleware/index.d.ts.map +1 -0
  51. package/dist/middleware/index.js +6 -0
  52. package/dist/middleware/index.js.map +1 -0
  53. package/dist/middleware/request-id.d.ts +9 -0
  54. package/dist/middleware/request-id.d.ts.map +1 -0
  55. package/dist/middleware/request-id.js +36 -0
  56. package/dist/middleware/request-id.js.map +1 -0
  57. package/dist/ports.d.ts +32 -0
  58. package/dist/ports.d.ts.map +1 -0
  59. package/dist/ports.js +4 -0
  60. package/dist/ports.js.map +1 -0
  61. package/dist/queue/consumer.d.ts +18 -0
  62. package/dist/queue/consumer.d.ts.map +1 -0
  63. package/dist/queue/consumer.js +82 -0
  64. package/dist/queue/consumer.js.map +1 -0
  65. package/dist/queue/index.d.ts +2 -0
  66. package/dist/queue/index.d.ts.map +1 -0
  67. package/dist/queue/index.js +2 -0
  68. package/dist/queue/index.js.map +1 -0
  69. package/dist/queue/memory-driver.d.ts +13 -0
  70. package/dist/queue/memory-driver.d.ts.map +1 -0
  71. package/dist/queue/memory-driver.js +22 -0
  72. package/dist/queue/memory-driver.js.map +1 -0
  73. package/dist/queue/types.d.ts +19 -0
  74. package/dist/queue/types.d.ts.map +1 -0
  75. package/dist/queue/types.js +3 -0
  76. package/dist/queue/types.js.map +1 -0
  77. package/dist/routes/api/artifacts.d.ts +25 -0
  78. package/dist/routes/api/artifacts.d.ts.map +1 -0
  79. package/dist/routes/api/artifacts.js +57 -0
  80. package/dist/routes/api/artifacts.js.map +1 -0
  81. package/dist/routes/api/auth.d.ts +50 -0
  82. package/dist/routes/api/auth.d.ts.map +1 -0
  83. package/dist/routes/api/auth.js +268 -0
  84. package/dist/routes/api/auth.js.map +1 -0
  85. package/dist/routes/api/index.d.ts +9 -0
  86. package/dist/routes/api/index.d.ts.map +1 -0
  87. package/dist/routes/api/index.js +10 -0
  88. package/dist/routes/api/index.js.map +1 -0
  89. package/dist/routes/api/packages.d.ts +47 -0
  90. package/dist/routes/api/packages.d.ts.map +1 -0
  91. package/dist/routes/api/packages.js +671 -0
  92. package/dist/routes/api/packages.js.map +1 -0
  93. package/dist/routes/api/repositories.d.ts +56 -0
  94. package/dist/routes/api/repositories.d.ts.map +1 -0
  95. package/dist/routes/api/repositories.js +317 -0
  96. package/dist/routes/api/repositories.js.map +1 -0
  97. package/dist/routes/api/settings.d.ts +28 -0
  98. package/dist/routes/api/settings.d.ts.map +1 -0
  99. package/dist/routes/api/settings.js +81 -0
  100. package/dist/routes/api/settings.js.map +1 -0
  101. package/dist/routes/api/stats.d.ts +21 -0
  102. package/dist/routes/api/stats.d.ts.map +1 -0
  103. package/dist/routes/api/stats.js +52 -0
  104. package/dist/routes/api/stats.js.map +1 -0
  105. package/dist/routes/api/tokens.d.ts +39 -0
  106. package/dist/routes/api/tokens.d.ts.map +1 -0
  107. package/dist/routes/api/tokens.js +191 -0
  108. package/dist/routes/api/tokens.js.map +1 -0
  109. package/dist/routes/api/users.d.ts +5 -0
  110. package/dist/routes/api/users.d.ts.map +1 -0
  111. package/dist/routes/api/users.js +125 -0
  112. package/dist/routes/api/users.js.map +1 -0
  113. package/dist/routes/composer.d.ts +133 -0
  114. package/dist/routes/composer.d.ts.map +1 -0
  115. package/dist/routes/composer.js +1179 -0
  116. package/dist/routes/composer.js.map +1 -0
  117. package/dist/routes/dist.d.ts +32 -0
  118. package/dist/routes/dist.d.ts.map +1 -0
  119. package/dist/routes/dist.js +761 -0
  120. package/dist/routes/dist.js.map +1 -0
  121. package/dist/routes/health.d.ts +7 -0
  122. package/dist/routes/health.d.ts.map +1 -0
  123. package/dist/routes/health.js +22 -0
  124. package/dist/routes/health.js.map +1 -0
  125. package/dist/routes/index.d.ts +5 -0
  126. package/dist/routes/index.d.ts.map +1 -0
  127. package/dist/routes/index.js +6 -0
  128. package/dist/routes/index.js.map +1 -0
  129. package/dist/services/EmailService.d.ts +20 -0
  130. package/dist/services/EmailService.d.ts.map +1 -0
  131. package/dist/services/EmailService.js +27 -0
  132. package/dist/services/EmailService.js.map +1 -0
  133. package/dist/services/UserService.d.ts +27 -0
  134. package/dist/services/UserService.d.ts.map +1 -0
  135. package/dist/services/UserService.js +164 -0
  136. package/dist/services/UserService.js.map +1 -0
  137. package/dist/storage/driver.d.ts +65 -0
  138. package/dist/storage/driver.d.ts.map +1 -0
  139. package/dist/storage/driver.js +59 -0
  140. package/dist/storage/driver.js.map +1 -0
  141. package/dist/storage/index.d.ts +4 -0
  142. package/dist/storage/index.d.ts.map +1 -0
  143. package/dist/storage/index.js +5 -0
  144. package/dist/storage/index.js.map +1 -0
  145. package/dist/storage/r2-driver.d.ts +16 -0
  146. package/dist/storage/r2-driver.d.ts.map +1 -0
  147. package/dist/storage/r2-driver.js +28 -0
  148. package/dist/storage/r2-driver.js.map +1 -0
  149. package/dist/storage/s3-driver.d.ts +22 -0
  150. package/dist/storage/s3-driver.d.ts.map +1 -0
  151. package/dist/storage/s3-driver.js +66 -0
  152. package/dist/storage/s3-driver.js.map +1 -0
  153. package/dist/sync/github-sync.d.ts +15 -0
  154. package/dist/sync/github-sync.d.ts.map +1 -0
  155. package/dist/sync/github-sync.js +39 -0
  156. package/dist/sync/github-sync.js.map +1 -0
  157. package/dist/sync/index.d.ts +5 -0
  158. package/dist/sync/index.d.ts.map +1 -0
  159. package/dist/sync/index.js +6 -0
  160. package/dist/sync/index.js.map +1 -0
  161. package/dist/sync/repository-sync.d.ts +18 -0
  162. package/dist/sync/repository-sync.d.ts.map +1 -0
  163. package/dist/sync/repository-sync.js +214 -0
  164. package/dist/sync/repository-sync.js.map +1 -0
  165. package/dist/sync/strategies/composer-repo.d.ts +11 -0
  166. package/dist/sync/strategies/composer-repo.d.ts.map +1 -0
  167. package/dist/sync/strategies/composer-repo.js +269 -0
  168. package/dist/sync/strategies/composer-repo.js.map +1 -0
  169. package/dist/sync/strategies/github-api.d.ts +6 -0
  170. package/dist/sync/strategies/github-api.d.ts.map +1 -0
  171. package/dist/sync/strategies/github-api.js +137 -0
  172. package/dist/sync/strategies/github-api.js.map +1 -0
  173. package/dist/sync/strategies/github-packages.d.ts +7 -0
  174. package/dist/sync/strategies/github-packages.d.ts.map +1 -0
  175. package/dist/sync/strategies/github-packages.js +66 -0
  176. package/dist/sync/strategies/github-packages.js.map +1 -0
  177. package/dist/sync/strategies/index.d.ts +4 -0
  178. package/dist/sync/strategies/index.d.ts.map +1 -0
  179. package/dist/sync/strategies/index.js +5 -0
  180. package/dist/sync/strategies/index.js.map +1 -0
  181. package/dist/sync/types.d.ts +60 -0
  182. package/dist/sync/types.d.ts.map +1 -0
  183. package/dist/sync/types.js +3 -0
  184. package/dist/sync/types.js.map +1 -0
  185. package/dist/utils/analytics.d.ts +142 -0
  186. package/dist/utils/analytics.d.ts.map +1 -0
  187. package/dist/utils/analytics.js +229 -0
  188. package/dist/utils/analytics.js.map +1 -0
  189. package/dist/utils/download.d.ts +10 -0
  190. package/dist/utils/download.d.ts.map +1 -0
  191. package/dist/utils/download.js +34 -0
  192. package/dist/utils/download.js.map +1 -0
  193. package/dist/utils/encryption.d.ts +20 -0
  194. package/dist/utils/encryption.d.ts.map +1 -0
  195. package/dist/utils/encryption.js +76 -0
  196. package/dist/utils/encryption.js.map +1 -0
  197. package/dist/utils/index.d.ts +5 -0
  198. package/dist/utils/index.d.ts.map +1 -0
  199. package/dist/utils/index.js +6 -0
  200. package/dist/utils/index.js.map +1 -0
  201. package/dist/utils/logger.d.ts +78 -0
  202. package/dist/utils/logger.d.ts.map +1 -0
  203. package/dist/utils/logger.js +134 -0
  204. package/dist/utils/logger.js.map +1 -0
  205. package/dist/utils/upstream-fetch.d.ts +15 -0
  206. package/dist/utils/upstream-fetch.d.ts.map +1 -0
  207. package/dist/utils/upstream-fetch.js +108 -0
  208. package/dist/utils/upstream-fetch.js.map +1 -0
  209. package/dist/workflows/index.d.ts +3 -0
  210. package/dist/workflows/index.d.ts.map +1 -0
  211. package/dist/workflows/index.js +8 -0
  212. package/dist/workflows/index.js.map +1 -0
  213. package/dist/workflows/package-storage.d.ts +47 -0
  214. package/dist/workflows/package-storage.d.ts.map +1 -0
  215. package/dist/workflows/package-storage.js +136 -0
  216. package/dist/workflows/package-storage.js.map +1 -0
  217. 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,5 @@
1
+ export * from './encryption';
2
+ export * from './download';
3
+ export * from './logger';
4
+ export * from './analytics';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ // Utility exports
2
+ export * from './encryption';
3
+ export * from './download';
4
+ export * from './logger';
5
+ export * from './analytics';
6
+ //# sourceMappingURL=index.js.map
@@ -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"}