@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 @@
1
+ {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/queue/consumer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './memory-driver';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './memory-driver';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AACA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { QueuePort } from '../ports';
2
+ /**
3
+ * In-memory queue driver
4
+ * Drains immediately or stores in array (simple implementation)
5
+ * For this implementation, we'll just log and maybe process if we had a processor interface,
6
+ * but since the Port only defines `send`, we effectively just "ack" it.
7
+ */
8
+ export declare class MemoryQueueDriver implements QueuePort {
9
+ private messages;
10
+ send(message: any): Promise<void>;
11
+ sendBatch(messages: any[]): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=memory-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-driver.d.ts","sourceRoot":"","sources":["../../src/queue/memory-driver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;;GAKG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAa;IAEvB,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAKlD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * In-memory queue driver
3
+ * Drains immediately or stores in array (simple implementation)
4
+ * For this implementation, we'll just log and maybe process if we had a processor interface,
5
+ * but since the Port only defines `send`, we effectively just "ack" it.
6
+ */
7
+ export class MemoryQueueDriver {
8
+ messages = [];
9
+ async send(message) {
10
+ // In a real local setup, you might want to process this immediately
11
+ // or have a background loop. For now, we store it.
12
+ this.messages.push({ message, timestamp: Date.now() });
13
+ // Simulate processing logging
14
+ console.log('[MemoryQueue] Message received:', message);
15
+ }
16
+ async sendBatch(messages) {
17
+ for (const msg of messages) {
18
+ await this.send(msg);
19
+ }
20
+ }
21
+ }
22
+ //# sourceMappingURL=memory-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-driver.js","sourceRoot":"","sources":["../../src/queue/memory-driver.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IAClB,QAAQ,GAAU,EAAE,CAAC;IAE7B,KAAK,CAAC,IAAI,CAAC,OAAY;QACnB,qEAAqE;QACrE,mDAAmD;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvD,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAe;QAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Queue message types for async database updates
3
+ */
4
+ export type QueueMessage = {
5
+ type: 'update_token_last_used';
6
+ tokenId: string;
7
+ timestamp: number;
8
+ } | {
9
+ type: 'update_artifact_download';
10
+ artifactId: string;
11
+ timestamp: number;
12
+ } | {
13
+ type: 'update_repository_sync';
14
+ repoId: string;
15
+ status: 'active' | 'error';
16
+ errorMessage?: string;
17
+ timestamp: number;
18
+ };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/queue/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,0BAA0B,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,wBAAwB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Queue message types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/queue/types.ts"],"names":[],"mappings":"AAAA,sBAAsB"}
@@ -0,0 +1,25 @@
1
+ import type { Context } from 'hono';
2
+ import type { DatabasePort } from '../../ports';
3
+ import type { StorageDriver } from '../../storage/driver';
4
+ export interface ArtifactsRouteEnv {
5
+ Bindings: {
6
+ DB: D1Database;
7
+ STORAGE: StorageDriver;
8
+ };
9
+ Variables: {
10
+ database: DatabasePort;
11
+ storage: StorageDriver;
12
+ };
13
+ }
14
+ /**
15
+ * DELETE /api/artifacts/:id
16
+ * Delete an artifact (from storage and database)
17
+ */
18
+ export declare function deleteArtifact(c: Context<ArtifactsRouteEnv>): Promise<Response>;
19
+ /**
20
+ * POST /api/artifacts/cleanup
21
+ * Clean up old artifacts (on-demand cleanup)
22
+ * Deletes artifacts where last_downloaded_at is older than retention_days
23
+ */
24
+ export declare function cleanupArtifacts(c: Context<ArtifactsRouteEnv>): Promise<Response>;
25
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../src/routes/api/artifacts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;QACf,OAAO,EAAE,aAAa,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;QACvB,OAAO,EAAE,aAAa,CAAC;KACxB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAmBrF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgCvF"}
@@ -0,0 +1,57 @@
1
+ // Artifacts API routes
2
+ import { artifacts } from '../../db/schema';
3
+ import { eq, lt } from 'drizzle-orm';
4
+ import { buildStorageKey } from '../../storage/driver';
5
+ /**
6
+ * DELETE /api/artifacts/:id
7
+ * Delete an artifact (from storage and database)
8
+ */
9
+ export async function deleteArtifact(c) {
10
+ const id = c.req.param('id');
11
+ const db = c.get('database');
12
+ // Get artifact to find storage key
13
+ const [artifact] = await db.select().from(artifacts).where(eq(artifacts.id, id)).limit(1);
14
+ if (!artifact) {
15
+ return c.json({ error: 'Not Found', message: 'Artifact not found' }, 404);
16
+ }
17
+ // Delete from storage
18
+ const storageKey = buildStorageKey('private', artifact.repo_id, artifact.package_name, artifact.version);
19
+ await c.env.STORAGE.delete(storageKey);
20
+ // Delete from database
21
+ await db.delete(artifacts).where(eq(artifacts.id, id));
22
+ return c.json({ message: 'Artifact deleted' });
23
+ }
24
+ /**
25
+ * POST /api/artifacts/cleanup
26
+ * Clean up old artifacts (on-demand cleanup)
27
+ * Deletes artifacts where last_downloaded_at is older than retention_days
28
+ */
29
+ export async function cleanupArtifacts(c) {
30
+ const body = await c.req.json();
31
+ const retentionDays = body.retention_days ?? 90; // Default 90 days
32
+ const cutoffTimestamp = Math.floor(Date.now() / 1000) - retentionDays * 24 * 60 * 60;
33
+ const db = c.get('database');
34
+ // Find old artifacts
35
+ const oldArtifacts = await db
36
+ .select()
37
+ .from(artifacts)
38
+ .where(lt(artifacts.last_downloaded_at, cutoffTimestamp));
39
+ let deletedCount = 0;
40
+ // Delete each artifact from storage and database
41
+ for (const artifact of oldArtifacts) {
42
+ const storageKey = buildStorageKey('private', artifact.repo_id, artifact.package_name, artifact.version);
43
+ try {
44
+ await c.env.STORAGE.delete(storageKey);
45
+ await db.delete(artifacts).where(eq(artifacts.id, artifact.id));
46
+ deletedCount++;
47
+ }
48
+ catch (error) {
49
+ console.error(`Error deleting artifact ${artifact.id}:`, error);
50
+ }
51
+ }
52
+ return c.json({
53
+ message: 'Cleanup completed',
54
+ deleted_count: deletedCount,
55
+ });
56
+ }
57
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/routes/api/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { Context } from 'hono';
2
+ /**
3
+ * POST /api/auth/login
4
+ * Authenticate admin user and return session token
5
+ */
6
+ export declare function loginRoute(c: Context): Promise<Response>;
7
+ /**
8
+ * POST /api/auth/logout
9
+ * Invalidate session token
10
+ */
11
+ export declare function logoutRoute(c: Context): Promise<Response>;
12
+ /**
13
+ * GET /api/auth/me
14
+ * Get current authenticated user
15
+ */
16
+ export declare function meRoute(c: Context): Promise<Response>;
17
+ /**
18
+ * POST /api/setup
19
+ * Create initial admin user
20
+ */
21
+ export declare function setupRoute(c: Context): Promise<Response>;
22
+ /**
23
+ * POST /api/auth/2fa/setup
24
+ * Start 2FA setup flow
25
+ */
26
+ export declare function setup2FARoute(c: Context): Promise<Response>;
27
+ /**
28
+ * POST /api/auth/2fa/enable
29
+ * Confirm 2FA setup with code
30
+ */
31
+ export declare function enable2FARoute(c: Context): Promise<Response>;
32
+ /**
33
+ * POST /api/auth/2fa/disable
34
+ * Disable 2FA
35
+ */
36
+ export declare function disable2FARoute(c: Context): Promise<Response>;
37
+ /**
38
+ * POST /api/auth/invite/accept
39
+ * Accept invite and set password
40
+ */
41
+ export declare function acceptInviteRoute(c: Context): Promise<Response>;
42
+ /**
43
+ * Middleware to verify session token
44
+ */
45
+ export declare function sessionMiddleware(c: Context, next: () => Promise<void>): Promise<Response | void>;
46
+ /**
47
+ * Check if auth is required / setup is needed
48
+ */
49
+ export declare function checkAuthRequired(c: Context): Promise<Response>;
50
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/routes/api/auth.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAapC;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4E9D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAO/D;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuB3D;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqC9D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAUjE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwBlE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAOnE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuBrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoBvG;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAUrE"}
@@ -0,0 +1,268 @@
1
+ /*
2
+ * PACKAGE.broker
3
+ * Copyright (C) 2025 Łukasz Bajsarowicz
4
+ * Licensed under AGPL-3.0
5
+ */
6
+ import { UserService } from '../../services/UserService';
7
+ import { getAnalytics } from '../../utils/analytics';
8
+ // Generate a session token
9
+ function generateSessionToken() {
10
+ const bytes = crypto.getRandomValues(new Uint8Array(32));
11
+ return btoa(String.fromCharCode(...bytes))
12
+ .replace(/\+/g, '-')
13
+ .replace(/\//g, '_')
14
+ .replace(/=/g, '');
15
+ }
16
+ /**
17
+ * POST /api/auth/login
18
+ * Authenticate admin user and return session token
19
+ */
20
+ export async function loginRoute(c) {
21
+ const db = c.get('database');
22
+ const userService = new UserService(db);
23
+ let body;
24
+ try {
25
+ body = await c.req.json();
26
+ }
27
+ catch {
28
+ return c.json({ error: 'Invalid JSON' }, 400);
29
+ }
30
+ const { email, password } = body;
31
+ if (!email || !password) {
32
+ return c.json({ error: 'Email and password required' }, 400);
33
+ }
34
+ const user = await userService.verifyCredentials(email, password);
35
+ const requestId = c.get('requestId');
36
+ const analytics = getAnalytics();
37
+ if (!user) {
38
+ analytics.trackAuthLogin({
39
+ requestId,
40
+ userId: 'unknown',
41
+ success: false,
42
+ });
43
+ return c.json({ error: 'Invalid credentials' }, 401);
44
+ }
45
+ // Check 2FA
46
+ if (user.two_factor_enabled) {
47
+ const { code } = body;
48
+ if (!code) {
49
+ return c.json({ error: '2FA required', code: '2fa_required' }, 403);
50
+ }
51
+ const isValid = await userService.validateTwoFactorLogin(user.id, code);
52
+ if (!isValid) {
53
+ analytics.trackAuthLogin({
54
+ requestId,
55
+ userId: user.id,
56
+ success: false,
57
+ });
58
+ return c.json({ error: 'Invalid 2FA code' }, 401);
59
+ }
60
+ }
61
+ // Generate session token
62
+ const sessionToken = generateSessionToken();
63
+ analytics.trackAuthLogin({
64
+ requestId,
65
+ userId: user.id,
66
+ success: true,
67
+ });
68
+ // Store session in KV (expires in 24 hours)
69
+ await c.env.KV.put(`session:${sessionToken}`, JSON.stringify({
70
+ userId: user.id,
71
+ email: user.email,
72
+ role: user.role,
73
+ createdAt: Date.now(),
74
+ }), {
75
+ expirationTtl: 86400, // 24 hours
76
+ });
77
+ return c.json({
78
+ token: sessionToken,
79
+ user: {
80
+ id: user.id,
81
+ email: user.email,
82
+ role: user.role,
83
+ two_factor_enabled: user.two_factor_enabled,
84
+ },
85
+ });
86
+ }
87
+ /**
88
+ * POST /api/auth/logout
89
+ * Invalidate session token
90
+ */
91
+ export async function logoutRoute(c) {
92
+ const authHeader = c.req.header('Authorization');
93
+ if (authHeader?.startsWith('Bearer ')) {
94
+ const token = authHeader.slice(7);
95
+ await c.env.KV.delete(`session:${token}`);
96
+ }
97
+ return c.json({ message: 'Logged out' });
98
+ }
99
+ /**
100
+ * GET /api/auth/me
101
+ * Get current authenticated user
102
+ */
103
+ export async function meRoute(c) {
104
+ const session = c.get('session');
105
+ if (!session) {
106
+ return c.json({ error: 'Not authenticated' }, 401);
107
+ }
108
+ // Refresh user data from DB to get latest status
109
+ const db = c.get('database');
110
+ const userService = new UserService(db);
111
+ const user = await userService.findById(session.userId);
112
+ if (!user) {
113
+ return c.json({ error: 'User not found' }, 404);
114
+ }
115
+ return c.json({
116
+ user: {
117
+ id: user.id,
118
+ email: user.email,
119
+ role: user.role,
120
+ two_factor_enabled: user.two_factor_enabled
121
+ }
122
+ });
123
+ }
124
+ /**
125
+ * POST /api/setup
126
+ * Create initial admin user
127
+ */
128
+ export async function setupRoute(c) {
129
+ const db = c.get('database');
130
+ const userService = new UserService(db);
131
+ // Check if any user exists
132
+ const count = await userService.count();
133
+ if (count > 0) {
134
+ return c.json({ error: 'Setup already completed' }, 403);
135
+ }
136
+ let body;
137
+ try {
138
+ body = await c.req.json();
139
+ }
140
+ catch {
141
+ return c.json({ error: 'Invalid JSON' }, 400);
142
+ }
143
+ const { email, password } = body;
144
+ if (!email || !password) {
145
+ return c.json({ error: 'Email and password required' }, 400);
146
+ }
147
+ // Create first admin
148
+ const user = await userService.create({
149
+ email,
150
+ password,
151
+ role: 'admin'
152
+ });
153
+ return c.json({
154
+ message: 'Setup complete',
155
+ user: {
156
+ id: user?.id,
157
+ email: user?.email
158
+ }
159
+ });
160
+ }
161
+ /**
162
+ * POST /api/auth/2fa/setup
163
+ * Start 2FA setup flow
164
+ */
165
+ export async function setup2FARoute(c) {
166
+ const db = c.get('database');
167
+ const userService = new UserService(db);
168
+ const session = c.get('session');
169
+ // Generate new secret
170
+ const secret = await userService.setupTwoFactor(session.userId);
171
+ const qrCode = await userService.generateTwoFactorQrCode(session.email, secret);
172
+ return c.json({ secret, qrCode });
173
+ }
174
+ /**
175
+ * POST /api/auth/2fa/enable
176
+ * Confirm 2FA setup with code
177
+ */
178
+ export async function enable2FARoute(c) {
179
+ const db = c.get('database');
180
+ const userService = new UserService(db);
181
+ const session = c.get('session');
182
+ let body;
183
+ try {
184
+ body = await c.req.json();
185
+ }
186
+ catch {
187
+ return c.json({ error: 'Invalid JSON' }, 400);
188
+ }
189
+ const { secret, code } = body;
190
+ if (!secret || !code) {
191
+ return c.json({ error: 'Secret and code required' }, 400);
192
+ }
193
+ try {
194
+ const recoveryCodes = await userService.enableTwoFactor(session.userId, secret, code);
195
+ return c.json({ recoveryCodes });
196
+ }
197
+ catch (err) {
198
+ return c.json({ error: err.message }, 400);
199
+ }
200
+ }
201
+ /**
202
+ * POST /api/auth/2fa/disable
203
+ * Disable 2FA
204
+ */
205
+ export async function disable2FARoute(c) {
206
+ const db = c.get('database');
207
+ const userService = new UserService(db);
208
+ const session = c.get('session');
209
+ await userService.disableTwoFactor(session.userId);
210
+ return c.json({ message: '2FA disabled' });
211
+ }
212
+ /**
213
+ * POST /api/auth/invite/accept
214
+ * Accept invite and set password
215
+ */
216
+ export async function acceptInviteRoute(c) {
217
+ const db = c.get('database');
218
+ const userService = new UserService(db);
219
+ let body;
220
+ try {
221
+ body = await c.req.json();
222
+ }
223
+ catch {
224
+ return c.json({ error: 'Invalid JSON' }, 400);
225
+ }
226
+ const { token, password } = body;
227
+ if (!token || !password) {
228
+ return c.json({ error: 'Token and password required' }, 400);
229
+ }
230
+ try {
231
+ const user = await userService.acceptInvite(token, password);
232
+ return c.json({ message: 'Invite accepted', user: { email: user.email } });
233
+ }
234
+ catch (err) {
235
+ return c.json({ error: err.message }, 400);
236
+ }
237
+ }
238
+ /**
239
+ * Middleware to verify session token
240
+ */
241
+ export async function sessionMiddleware(c, next) {
242
+ const authHeader = c.req.header('Authorization');
243
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
244
+ return c.json({ error: 'Unauthorized', message: 'Session token required' }, 401);
245
+ }
246
+ const token = authHeader.slice(7);
247
+ // Check KV for session
248
+ const sessionData = await c.env.KV.get(`session:${token}`, 'json');
249
+ if (!sessionData) {
250
+ return c.json({ error: 'Unauthorized', message: 'Invalid or expired session' }, 401);
251
+ }
252
+ // Attach session to context
253
+ c.set('session', sessionData);
254
+ return await next();
255
+ }
256
+ /**
257
+ * Check if auth is required / setup is needed
258
+ */
259
+ export async function checkAuthRequired(c) {
260
+ const db = c.get('database');
261
+ const userService = new UserService(db);
262
+ const count = await userService.count();
263
+ return c.json({
264
+ authRequired: true,
265
+ setupRequired: count === 0
266
+ });
267
+ }
268
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/routes/api/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export * from './repositories';
2
+ export * from './tokens';
3
+ export * from './packages';
4
+ export * from './stats';
5
+ export * from './artifacts';
6
+ export * from './auth';
7
+ export * from './users';
8
+ export * from './settings';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/api/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ // API routes exports
2
+ export * from './repositories';
3
+ export * from './tokens';
4
+ export * from './packages';
5
+ export * from './stats';
6
+ export * from './artifacts';
7
+ export * from './auth';
8
+ export * from './users';
9
+ export * from './settings';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/api/index.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Context } from 'hono';
2
+ import type { DatabasePort } from '../../ports';
3
+ import type { StorageDriver } from '../../storage/driver';
4
+ export interface PackagesRouteEnv {
5
+ Bindings: {
6
+ DB: D1Database;
7
+ KV: KVNamespace;
8
+ ENCRYPTION_KEY: string;
9
+ };
10
+ Variables: {
11
+ database: DatabasePort;
12
+ storage: StorageDriver;
13
+ };
14
+ }
15
+ /**
16
+ * GET /api/packages
17
+ * List all packages (with optional search)
18
+ */
19
+ export declare function listPackages(c: Context<PackagesRouteEnv>): Promise<Response>;
20
+ /**
21
+ * GET /api/packages/:name
22
+ * Get a single package with all versions
23
+ */
24
+ export declare function getPackage(c: Context<PackagesRouteEnv>): Promise<Response>;
25
+ /**
26
+ * GET /api/packages/:name/:version/readme
27
+ * Get README.md content for a specific package version
28
+ * Uses R2/S3 storage instead of KV for better scalability
29
+ */
30
+ export declare function getPackageReadme(c: Context<PackagesRouteEnv>): Promise<Response>;
31
+ /**
32
+ * GET /api/packages/:name/:version/changelog
33
+ * Get CHANGELOG.md content for a specific package version
34
+ * Uses R2/S3 storage instead of KV for better scalability
35
+ */
36
+ export declare function getPackageChangelog(c: Context<PackagesRouteEnv>): Promise<Response>;
37
+ /**
38
+ * POST /api/packages/add-from-mirror
39
+ * Manually fetch and store packages from a selected mirror repository
40
+ */
41
+ export declare function addPackagesFromMirror(c: Context<PackagesRouteEnv>): Promise<Response>;
42
+ /**
43
+ * POST /packages/cleanup-numeric-versions
44
+ * Temporary utility to fix versioning issues
45
+ */
46
+ export declare function cleanupNumericVersions(c: Context<PackagesRouteEnv>): Promise<Response>;
47
+ //# sourceMappingURL=packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../../src/routes/api/packages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;QACf,EAAE,EAAE,WAAW,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,QAAQ,EAAE,YAAY,CAAC;QACvB,OAAO,EAAE,aAAa,CAAC;KACxB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgBlF;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoBhF;AA4ED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsRtF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqRzF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsF3F;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAI5F"}