@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,99 @@
|
|
|
1
|
+
import { sqliteTable, text, integer, index, unique } from 'drizzle-orm/sqlite-core';
|
|
2
|
+
// Repositories table
|
|
3
|
+
export const repositories = sqliteTable('repositories', {
|
|
4
|
+
id: text('id').primaryKey(),
|
|
5
|
+
url: text('url').notNull(),
|
|
6
|
+
vcs_type: text('vcs_type').notNull(), // 'git', 'composer', 'artifact' - determines sync strategy
|
|
7
|
+
credential_type: text('credential_type').notNull(), // 'http_basic', 'github_token', 'gitlab_token', etc.
|
|
8
|
+
auth_credentials: text('auth_credentials').notNull(), // Encrypted JSON with credential-specific fields
|
|
9
|
+
composer_json_path: text('composer_json_path'), // Supports glob patterns like '{lib,src}/**/composer.json'
|
|
10
|
+
package_filter: text('package_filter'), // Comma-separated list of packages to sync (for repos with provider-includes)
|
|
11
|
+
status: text('status').default('pending'), // 'active', 'error', 'pending', 'syncing'
|
|
12
|
+
error_message: text('error_message'),
|
|
13
|
+
last_synced_at: integer('last_synced_at'),
|
|
14
|
+
created_at: integer('created_at').notNull(),
|
|
15
|
+
}, (table) => ({
|
|
16
|
+
statusIdx: index('idx_repositories_status').on(table.status),
|
|
17
|
+
lastSyncedIdx: index('idx_repositories_last_synced').on(table.last_synced_at),
|
|
18
|
+
credentialTypeIdx: index('idx_repositories_credential_type').on(table.credential_type),
|
|
19
|
+
vcsTypeIdx: index('idx_repositories_vcs_type').on(table.vcs_type),
|
|
20
|
+
}));
|
|
21
|
+
// Tokens table
|
|
22
|
+
export const tokens = sqliteTable('tokens', {
|
|
23
|
+
id: text('id').primaryKey(),
|
|
24
|
+
description: text('description').notNull(),
|
|
25
|
+
token_hash: text('token_hash').notNull(), // SHA-256 hash for high-entropy tokens
|
|
26
|
+
permissions: text('permissions').notNull().default('readonly'), // 'readonly' | 'write'
|
|
27
|
+
rate_limit_max: integer('rate_limit_max').default(1000), // requests per hour
|
|
28
|
+
created_at: integer('created_at').notNull(),
|
|
29
|
+
expires_at: integer('expires_at'),
|
|
30
|
+
last_used_at: integer('last_used_at'),
|
|
31
|
+
}, (table) => ({
|
|
32
|
+
tokenHashIdx: index('idx_tokens_token_hash').on(table.token_hash),
|
|
33
|
+
}));
|
|
34
|
+
// Artifacts table
|
|
35
|
+
export const artifacts = sqliteTable('artifacts', {
|
|
36
|
+
id: text('id').primaryKey(),
|
|
37
|
+
repo_id: text('repo_id')
|
|
38
|
+
.notNull()
|
|
39
|
+
.references(() => repositories.id, { onDelete: 'cascade' }),
|
|
40
|
+
package_name: text('package_name').notNull(),
|
|
41
|
+
version: text('version').notNull(),
|
|
42
|
+
file_key: text('file_key').notNull(), // R2/S3 key
|
|
43
|
+
size: integer('size'), // bytes
|
|
44
|
+
download_count: integer('download_count').default(0), // Number of downloads
|
|
45
|
+
created_at: integer('created_at').notNull(),
|
|
46
|
+
last_downloaded_at: integer('last_downloaded_at'),
|
|
47
|
+
}, (table) => ({
|
|
48
|
+
repoIdIdx: index('idx_artifacts_repo_id').on(table.repo_id),
|
|
49
|
+
packageNameIdx: index('idx_artifacts_package_name').on(table.package_name),
|
|
50
|
+
lastDownloadedIdx: index('idx_artifacts_last_downloaded').on(table.last_downloaded_at),
|
|
51
|
+
// Composite unique index for fast lookup in dist route
|
|
52
|
+
uniqueArtifactIdx: unique('artifacts_repo_package_version').on(table.repo_id, table.package_name, table.version),
|
|
53
|
+
}));
|
|
54
|
+
// Package metadata table (for UI queries)
|
|
55
|
+
export const packages = sqliteTable('packages', {
|
|
56
|
+
id: text('id').primaryKey(),
|
|
57
|
+
repo_id: text('repo_id')
|
|
58
|
+
.notNull()
|
|
59
|
+
.references(() => repositories.id, { onDelete: 'cascade' }),
|
|
60
|
+
name: text('name').notNull(),
|
|
61
|
+
version: text('version').notNull(),
|
|
62
|
+
dist_url: text('dist_url').notNull(),
|
|
63
|
+
source_dist_url: text('source_dist_url'), // Original source repository URL for on-demand mirroring
|
|
64
|
+
dist_reference: text('dist_reference'), // Reference/hash for mirror URL substitution (commit hash for git, generated hash for others)
|
|
65
|
+
description: text('description'),
|
|
66
|
+
license: text('license'), // JSON string for array support
|
|
67
|
+
package_type: text('package_type'), // "library", "magento2-module", etc.
|
|
68
|
+
homepage: text('homepage'),
|
|
69
|
+
released_at: integer('released_at'),
|
|
70
|
+
readme_content: text('readme_content'),
|
|
71
|
+
metadata: text('metadata'), // Complete upstream package metadata as JSON
|
|
72
|
+
created_at: integer('created_at').notNull(),
|
|
73
|
+
}, (table) => ({
|
|
74
|
+
repoIdIdx: index('idx_packages_repo_id').on(table.repo_id),
|
|
75
|
+
nameIdx: index('idx_packages_name').on(table.name),
|
|
76
|
+
// Unique constraint to prevent duplicate package+version entries
|
|
77
|
+
uniquePackageVersionIdx: unique('packages_name_version_unique').on(table.name, table.version),
|
|
78
|
+
}));
|
|
79
|
+
// Users table (formerly admin_users)
|
|
80
|
+
export const users = sqliteTable('users', {
|
|
81
|
+
id: text('id').primaryKey(),
|
|
82
|
+
email: text('email').notNull().unique(),
|
|
83
|
+
password_hash: text('password_hash').notNull(), // bcrypt or argon2 hash
|
|
84
|
+
role: text('role').default('admin').notNull(), // 'admin' | 'viewer'
|
|
85
|
+
status: text('status').default('active').notNull(), // 'active' | 'invited' | 'blocked'
|
|
86
|
+
two_factor_secret: text('two_factor_secret'),
|
|
87
|
+
two_factor_enabled: integer('two_factor_enabled', { mode: 'boolean' }).default(false),
|
|
88
|
+
recovery_codes: text('recovery_codes'), // Encrypted JSON array of recovery codes
|
|
89
|
+
invite_token: text('invite_token'), // Token for setting initial password
|
|
90
|
+
invite_expires_at: integer('invite_expires_at'), // Expiration timestamp for invite
|
|
91
|
+
created_at: integer('created_at').notNull(),
|
|
92
|
+
last_login_at: integer('last_login_at'),
|
|
93
|
+
}, (table) => ({
|
|
94
|
+
emailIdx: index('idx_users_email').on(table.email),
|
|
95
|
+
inviteTokenIdx: index('idx_users_invite_token').on(table.invite_token),
|
|
96
|
+
}));
|
|
97
|
+
// NO activity_log table - use Cloudflare Workers logs for debugging
|
|
98
|
+
// Workers logs are limited to last X entries and don't require database storage
|
|
99
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEpF,qBAAqB;AACrB,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CACrC,cAAc,EACd;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,2DAA2D;IACjG,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE,qDAAqD;IACzG,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,iDAAiD;IACvG,kBAAkB,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,2DAA2D;IAC3G,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,8EAA8E;IACtH,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,0CAA0C;IACrF,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC;IACzC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC5C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC5D,aAAa,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IAC7E,iBAAiB,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC;IACtF,UAAU,EAAE,KAAK,CAAC,2BAA2B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;CAClE,CAAC,CACH,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAC/B,QAAQ,EACR;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAC1C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,uCAAuC;IACjF,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,uBAAuB;IACvF,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,oBAAoB;IAC7E,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC;CACtC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,YAAY,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;CAClE,CAAC,CACH,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAClC,WAAW,EACX;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;SACrB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,YAAY;IAClD,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;IAC/B,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,sBAAsB;IAC5E,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC3C,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,CAAC;CAClD,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IAC3D,cAAc,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;IAC1E,iBAAiB,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;IACtF,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,CAAC,gCAAgC,CAAC,CAAC,EAAE,CAC5D,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,OAAO,CACd;CACF,CAAC,CACH,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CACjC,UAAU,EACV;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;SACrB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACpC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,yDAAyD;IACnG,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,8FAA8F;IACtI,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;IAChC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,gCAAgC;IAC1D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,qCAAqC;IACzE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC;IACnC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACtC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,6CAA6C;IACzE,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CAC5C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IAC1D,OAAO,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;IAClD,iEAAiE;IACjE,uBAAuB,EAAE,MAAM,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;CAC9F,CAAC,CACH,CAAC;AAEF,qCAAqC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,WAAW,CAC9B,OAAO,EACP;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IACvC,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,wBAAwB;IACxE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,qBAAqB;IACpE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,mCAAmC;IACvF,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAC5C,kBAAkB,EAAE,OAAO,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACrF,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,yCAAyC;IACjF,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,qCAAqC;IACzE,iBAAiB,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAAE,kCAAkC;IACnF,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC3C,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC;CACxC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IAClD,cAAc,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;CACvE,CAAC,CACH,CAAC;AAEF,oEAAoE;AACpE,gFAAgF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { type StorageDriver, type DatabasePort } from './index';
|
|
3
|
+
export interface AppBindings {
|
|
4
|
+
DB?: any;
|
|
5
|
+
KV?: any;
|
|
6
|
+
QUEUE?: any;
|
|
7
|
+
ANALYTICS?: any;
|
|
8
|
+
LOG_LEVEL?: 'debug' | 'info' | 'warn' | 'error';
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
export interface AppVariables {
|
|
12
|
+
storage: StorageDriver;
|
|
13
|
+
database: DatabasePort;
|
|
14
|
+
requestId?: string;
|
|
15
|
+
session?: {
|
|
16
|
+
userId: string;
|
|
17
|
+
email: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export type AppInstance = Hono<{
|
|
21
|
+
Bindings: AppBindings;
|
|
22
|
+
Variables: AppVariables;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Create the generic Hono application
|
|
26
|
+
* This factory function expects drivers to be injected via middleware or arguments,
|
|
27
|
+
* or it sets up the structure for them to be set.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createApp(options?: {
|
|
30
|
+
storage?: StorageDriver;
|
|
31
|
+
database?: DatabasePort;
|
|
32
|
+
onInit?: (app: AppInstance) => void;
|
|
33
|
+
}): AppInstance;
|
|
34
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAiDH,KAAK,aAAa,EAClB,KAAK,YAAY,EACpB,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,WAAW;IAExB,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAEnF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE;IAChC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC,GAAG,WAAW,CA0Id"}
|
package/dist/factory.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { cors } from 'hono/cors';
|
|
3
|
+
import { composerVersionMiddleware, authMiddleware, distAuthMiddleware, requestIdMiddleware, packagesJsonRoute, p2PackageRoute, distRoute, distMirrorRoute, distLockfileRoute, healthRoute, listRepositories, createRepository, getRepository, updateRepository, deleteRepository, verifyRepository, syncRepositoryNow, listTokens, createToken, updateToken, deleteToken, listPackages, getPackage, getPackageReadme, getPackageChangelog, getPackageStats, addPackagesFromMirror, getStats, getSettings, updatePackagistMirroring, deleteArtifact, cleanupArtifacts, cleanupNumericVersions, loginRoute, logoutRoute, meRoute, setupRoute, setup2FARoute, enable2FARoute, disable2FARoute, listUsers, createUser, deleteUser, sessionMiddleware, checkAuthRequired, acceptInviteRoute, getLogger, } from './index';
|
|
4
|
+
/**
|
|
5
|
+
* Create the generic Hono application
|
|
6
|
+
* This factory function expects drivers to be injected via middleware or arguments,
|
|
7
|
+
* or it sets up the structure for them to be set.
|
|
8
|
+
*/
|
|
9
|
+
export function createApp(options) {
|
|
10
|
+
const app = new Hono();
|
|
11
|
+
const logger = getLogger('info'); // Default logger, can vary per request if needed
|
|
12
|
+
// Global middleware
|
|
13
|
+
app.use('*', cors());
|
|
14
|
+
app.use('*', requestIdMiddleware);
|
|
15
|
+
app.onError(async (err, c) => {
|
|
16
|
+
const requestId = c.get('requestId');
|
|
17
|
+
logger.error('Unhandled error', {
|
|
18
|
+
url: c.req.url,
|
|
19
|
+
method: c.req.method,
|
|
20
|
+
path: new URL(c.req.url).pathname,
|
|
21
|
+
}, err instanceof Error ? err : new Error(String(err)));
|
|
22
|
+
return c.json({
|
|
23
|
+
error: 'Internal Server Error',
|
|
24
|
+
message: err.message,
|
|
25
|
+
...(requestId && { requestId }),
|
|
26
|
+
}, 500);
|
|
27
|
+
});
|
|
28
|
+
// Custom Init hook (for setting generic drivers from outer scope)
|
|
29
|
+
if (options?.onInit) {
|
|
30
|
+
options.onInit(app);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// If drivers provided directly, inject them
|
|
34
|
+
if (options?.database) {
|
|
35
|
+
app.use('*', async (c, next) => {
|
|
36
|
+
c.set('database', options.database);
|
|
37
|
+
await next();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (options?.storage) {
|
|
41
|
+
app.use('*', async (c, next) => {
|
|
42
|
+
c.set('storage', options.storage);
|
|
43
|
+
await next();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Health check (no auth required)
|
|
48
|
+
app.get('/health', healthRoute);
|
|
49
|
+
// API routes
|
|
50
|
+
const apiRoutes = new Hono();
|
|
51
|
+
// Auth routes (no session required)
|
|
52
|
+
apiRoutes.post('/auth/login', loginRoute);
|
|
53
|
+
apiRoutes.get('/auth/check', checkAuthRequired);
|
|
54
|
+
apiRoutes.post('/setup', setupRoute); /* Fresh install flow */
|
|
55
|
+
apiRoutes.post('/auth/invite/accept', acceptInviteRoute);
|
|
56
|
+
// Protected routes - require session
|
|
57
|
+
const protectedRoutes = new Hono();
|
|
58
|
+
// ** SESSION MIDDLEWARE **
|
|
59
|
+
protectedRoutes.use('*', async (c, next) => {
|
|
60
|
+
return sessionMiddleware(c, next);
|
|
61
|
+
});
|
|
62
|
+
// Auth routes (session required)
|
|
63
|
+
protectedRoutes.post('/auth/logout', logoutRoute);
|
|
64
|
+
protectedRoutes.get('/auth/me', meRoute);
|
|
65
|
+
protectedRoutes.post('/auth/2fa/setup', setup2FARoute);
|
|
66
|
+
protectedRoutes.post('/auth/2fa/enable', enable2FARoute);
|
|
67
|
+
protectedRoutes.post('/auth/2fa/disable', disable2FARoute);
|
|
68
|
+
// User Management
|
|
69
|
+
protectedRoutes.get('/users', listUsers);
|
|
70
|
+
protectedRoutes.post('/users', createUser);
|
|
71
|
+
protectedRoutes.delete('/users/:id', deleteUser);
|
|
72
|
+
// Repository routes
|
|
73
|
+
protectedRoutes.get('/repositories', listRepositories);
|
|
74
|
+
protectedRoutes.post('/repositories', createRepository);
|
|
75
|
+
protectedRoutes.get('/repositories/:id', getRepository);
|
|
76
|
+
protectedRoutes.put('/repositories/:id', updateRepository);
|
|
77
|
+
protectedRoutes.delete('/repositories/:id', deleteRepository);
|
|
78
|
+
protectedRoutes.get('/repositories/:id/verify', verifyRepository);
|
|
79
|
+
protectedRoutes.post('/repositories/:id/sync', syncRepositoryNow);
|
|
80
|
+
// Token routes
|
|
81
|
+
protectedRoutes.get('/tokens', listTokens);
|
|
82
|
+
protectedRoutes.post('/tokens', createToken);
|
|
83
|
+
protectedRoutes.patch('/tokens/:id', updateToken);
|
|
84
|
+
protectedRoutes.delete('/tokens/:id', deleteToken);
|
|
85
|
+
// Package routes
|
|
86
|
+
protectedRoutes.get('/packages', listPackages);
|
|
87
|
+
protectedRoutes.get('/packages/:name', getPackage);
|
|
88
|
+
protectedRoutes.get('/packages/:name/:version/readme', getPackageReadme);
|
|
89
|
+
protectedRoutes.get('/packages/:name/:version/changelog', getPackageChangelog);
|
|
90
|
+
protectedRoutes.get('/packages/:name/:version/stats', getPackageStats);
|
|
91
|
+
protectedRoutes.post('/packages/add-from-mirror', addPackagesFromMirror);
|
|
92
|
+
// Stats
|
|
93
|
+
protectedRoutes.get('/stats', getStats);
|
|
94
|
+
// Settings
|
|
95
|
+
protectedRoutes.get('/settings', getSettings);
|
|
96
|
+
protectedRoutes.put('/settings/packagist-mirroring', updatePackagistMirroring);
|
|
97
|
+
// Artifacts
|
|
98
|
+
protectedRoutes.delete('/artifacts/:id', deleteArtifact);
|
|
99
|
+
protectedRoutes.post('/artifacts/cleanup', cleanupArtifacts);
|
|
100
|
+
protectedRoutes.post('/packages/cleanup-numeric-versions', cleanupNumericVersions);
|
|
101
|
+
// Mount protected routes under /api
|
|
102
|
+
apiRoutes.route('/', protectedRoutes);
|
|
103
|
+
app.route('/api', apiRoutes);
|
|
104
|
+
// Composer routes
|
|
105
|
+
const composerAuth = async (c, next) => {
|
|
106
|
+
await composerVersionMiddleware(c, next);
|
|
107
|
+
};
|
|
108
|
+
const composerTokenAuth = async (c, next) => {
|
|
109
|
+
return authMiddleware(c, next);
|
|
110
|
+
};
|
|
111
|
+
app.get('/packages.json', composerAuth, composerTokenAuth, packagesJsonRoute);
|
|
112
|
+
app.get('/p2/:vendor/:package', composerAuth, composerTokenAuth, p2PackageRoute);
|
|
113
|
+
const distAuth = async (c, next) => {
|
|
114
|
+
return distAuthMiddleware(c, next);
|
|
115
|
+
};
|
|
116
|
+
app.get('/dist/m/:vendor/:package/:version', composerAuth, distAuth, distMirrorRoute);
|
|
117
|
+
app.get('/dist/:vendor/:package/:version/:reference', composerAuth, distAuth, distLockfileRoute);
|
|
118
|
+
app.get('/dist/:repo_id/:vendor/:package/:version', composerAuth, distAuth, distRoute);
|
|
119
|
+
return app;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './db';
|
|
2
|
+
export * from './middleware';
|
|
3
|
+
export * from './routes';
|
|
4
|
+
export * from './storage/index';
|
|
5
|
+
export * from './cache/index';
|
|
6
|
+
export * from './queue/index';
|
|
7
|
+
export * from './sync';
|
|
8
|
+
export * from './queue';
|
|
9
|
+
export * from './jobs';
|
|
10
|
+
export * from './utils';
|
|
11
|
+
export * from './workflows';
|
|
12
|
+
export * from './services/UserService';
|
|
13
|
+
export * from './services/EmailService';
|
|
14
|
+
export * from './ports';
|
|
15
|
+
export * from './factory';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Core package exports
|
|
2
|
+
export * from './db';
|
|
3
|
+
export * from './middleware';
|
|
4
|
+
export * from './routes';
|
|
5
|
+
export * from './storage/index';
|
|
6
|
+
export * from './cache/index';
|
|
7
|
+
export * from './queue/index';
|
|
8
|
+
export * from './sync';
|
|
9
|
+
export * from './queue';
|
|
10
|
+
export * from './jobs';
|
|
11
|
+
export * from './utils';
|
|
12
|
+
export * from './workflows';
|
|
13
|
+
export * from './services/UserService';
|
|
14
|
+
export * from './services/EmailService';
|
|
15
|
+
export * from './ports';
|
|
16
|
+
export * from './factory';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,uBAAuB;AAEvB,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAMA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type SyncOptions } from '../sync/repository-sync';
|
|
2
|
+
/**
|
|
3
|
+
* Job types that can be processed
|
|
4
|
+
*/
|
|
5
|
+
export type Job = {
|
|
6
|
+
type: 'update_token_last_used';
|
|
7
|
+
tokenId: string;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'update_artifact_download';
|
|
11
|
+
artifactId: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'sync_repository';
|
|
15
|
+
repoId: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Environment bindings required for job processing
|
|
19
|
+
*/
|
|
20
|
+
export interface JobEnv {
|
|
21
|
+
DB: D1Database;
|
|
22
|
+
KV?: KVNamespace;
|
|
23
|
+
QUEUE?: Queue;
|
|
24
|
+
ENCRYPTION_KEY: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Job Processor interface - can be implemented for Queue or Sync execution
|
|
28
|
+
*/
|
|
29
|
+
export interface JobProcessor {
|
|
30
|
+
/**
|
|
31
|
+
* Enqueue a job for processing
|
|
32
|
+
* May execute immediately (sync) or queue for later (async)
|
|
33
|
+
*/
|
|
34
|
+
enqueue(job: Job): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Enqueue multiple jobs for processing
|
|
37
|
+
* May execute in parallel (sync) or queue for later (async)
|
|
38
|
+
*/
|
|
39
|
+
enqueueAll(jobs: Job[]): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create the appropriate job processor based on environment
|
|
43
|
+
* If QUEUE is available, uses QueueJobProcessor (async)
|
|
44
|
+
* Otherwise, uses SyncJobProcessor (immediate execution)
|
|
45
|
+
*/
|
|
46
|
+
export declare function createJobProcessor(env: JobEnv, options?: {
|
|
47
|
+
syncOptions?: SyncOptions;
|
|
48
|
+
}): JobProcessor;
|
|
49
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/jobs/processor.ts"],"names":[],"mappings":"AAYA,OAAO,EAAgC,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGzF;;GAEG;AACH,MAAM,MAAM,GAAG,GACX;IACA,IAAI,EAAE,wBAAwB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,GACC;IACA,IAAI,EAAE,0BAA0B,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GACC;IACA,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEJ;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,UAAU,CAAC;IACf,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjC;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,WAAW,CAAA;CAAE,GACtC,YAAY,CAKd"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* PACKAGE.broker
|
|
3
|
+
* Copyright (C) 2025 Łukasz Bajsarowicz
|
|
4
|
+
* Licensed under AGPL-3.0
|
|
5
|
+
*/
|
|
6
|
+
// Job Processor - abstraction for sync/async job execution
|
|
7
|
+
// Automatically falls back to synchronous execution when Queues are unavailable
|
|
8
|
+
import { createD1Database as createDatabase } from '../db';
|
|
9
|
+
import { tokens, artifacts } from '../db/schema';
|
|
10
|
+
import { eq } from 'drizzle-orm';
|
|
11
|
+
import { syncRepository } from '../sync/repository-sync';
|
|
12
|
+
import { getLogger } from '../utils/logger';
|
|
13
|
+
/**
|
|
14
|
+
* Create the appropriate job processor based on environment
|
|
15
|
+
* If QUEUE is available, uses QueueJobProcessor (async)
|
|
16
|
+
* Otherwise, uses SyncJobProcessor (immediate execution)
|
|
17
|
+
*/
|
|
18
|
+
export function createJobProcessor(env, options) {
|
|
19
|
+
if (env.QUEUE && typeof env.QUEUE.send === 'function') {
|
|
20
|
+
return new QueueJobProcessor(env.QUEUE);
|
|
21
|
+
}
|
|
22
|
+
return new SyncJobProcessor(env, options?.syncOptions);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Queue-based job processor - sends jobs to Cloudflare Queue
|
|
26
|
+
* Jobs are processed asynchronously by queue consumers
|
|
27
|
+
*/
|
|
28
|
+
class QueueJobProcessor {
|
|
29
|
+
queue;
|
|
30
|
+
constructor(queue) {
|
|
31
|
+
this.queue = queue;
|
|
32
|
+
}
|
|
33
|
+
async enqueue(job) {
|
|
34
|
+
await this.queue.send(job);
|
|
35
|
+
}
|
|
36
|
+
async enqueueAll(jobs) {
|
|
37
|
+
// Queue supports batch sending
|
|
38
|
+
for (const job of jobs) {
|
|
39
|
+
await this.queue.send(job);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Synchronous job processor - executes jobs immediately
|
|
45
|
+
* Used when Queues are not available (free tier / local dev)
|
|
46
|
+
*/
|
|
47
|
+
class SyncJobProcessor {
|
|
48
|
+
env;
|
|
49
|
+
syncOptions;
|
|
50
|
+
constructor(env, syncOptions) {
|
|
51
|
+
this.env = env;
|
|
52
|
+
this.syncOptions = syncOptions;
|
|
53
|
+
}
|
|
54
|
+
async enqueue(job) {
|
|
55
|
+
await this.processJob(job);
|
|
56
|
+
}
|
|
57
|
+
async enqueueAll(jobs) {
|
|
58
|
+
// Process jobs in parallel for better performance
|
|
59
|
+
await Promise.all(jobs.map((job) => this.processJob(job)));
|
|
60
|
+
}
|
|
61
|
+
async processJob(job) {
|
|
62
|
+
const db = createDatabase(this.env.DB);
|
|
63
|
+
const logger = getLogger();
|
|
64
|
+
try {
|
|
65
|
+
switch (job.type) {
|
|
66
|
+
case 'update_token_last_used':
|
|
67
|
+
await db
|
|
68
|
+
.update(tokens)
|
|
69
|
+
.set({ last_used_at: job.timestamp })
|
|
70
|
+
.where(eq(tokens.id, job.tokenId));
|
|
71
|
+
break;
|
|
72
|
+
case 'update_artifact_download':
|
|
73
|
+
// Increment download count and update last_downloaded_at
|
|
74
|
+
const [artifact] = await db
|
|
75
|
+
.select()
|
|
76
|
+
.from(artifacts)
|
|
77
|
+
.where(eq(artifacts.id, job.artifactId))
|
|
78
|
+
.limit(1);
|
|
79
|
+
if (artifact) {
|
|
80
|
+
await db
|
|
81
|
+
.update(artifacts)
|
|
82
|
+
.set({
|
|
83
|
+
download_count: (artifact.download_count || 0) + 1,
|
|
84
|
+
last_downloaded_at: job.timestamp,
|
|
85
|
+
})
|
|
86
|
+
.where(eq(artifacts.id, job.artifactId));
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case 'sync_repository':
|
|
90
|
+
if (!this.syncOptions) {
|
|
91
|
+
logger.warn('SyncJobProcessor: syncOptions not provided, skipping sync', { repoId: job.repoId });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const syncEnv = {
|
|
95
|
+
DB: this.env.DB,
|
|
96
|
+
KV: this.env.KV,
|
|
97
|
+
QUEUE: this.env.QUEUE,
|
|
98
|
+
ENCRYPTION_KEY: this.env.ENCRYPTION_KEY,
|
|
99
|
+
};
|
|
100
|
+
const result = await syncRepository(job.repoId, syncEnv, this.syncOptions);
|
|
101
|
+
if (!result.success) {
|
|
102
|
+
logger.error('Sync failed for repo', { repoId: job.repoId, error: result.error });
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
logger.info('Sync successful for repo', { repoId: job.repoId, packageCount: result.packages.length });
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
default:
|
|
109
|
+
logger.warn('Unknown job type', { jobType: job.type });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger.error('Job processing error', { jobType: job.type }, error instanceof Error ? error : new Error(String(error)));
|
|
114
|
+
// Don't throw - we want to continue processing other jobs
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/jobs/processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
import type { DatabasePort } from '../ports';
|
|
3
|
+
export interface AuthContext {
|
|
4
|
+
tokenId: string;
|
|
5
|
+
tokenDescription: string;
|
|
6
|
+
tokenPermissions: 'readonly' | 'write';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Dual authentication middleware for dist route
|
|
10
|
+
* Accepts either Composer token (Basic Auth) OR admin session (Bearer token)
|
|
11
|
+
*/
|
|
12
|
+
export declare function distAuthMiddleware(c: Context<{
|
|
13
|
+
Bindings: {
|
|
14
|
+
DB: D1Database;
|
|
15
|
+
KV?: KVNamespace;
|
|
16
|
+
QUEUE?: Queue;
|
|
17
|
+
};
|
|
18
|
+
Variables: {
|
|
19
|
+
auth?: AuthContext;
|
|
20
|
+
session?: {
|
|
21
|
+
userId: string;
|
|
22
|
+
email: string;
|
|
23
|
+
};
|
|
24
|
+
database: DatabasePort;
|
|
25
|
+
};
|
|
26
|
+
}>, next: () => Promise<Response>): Promise<Response>;
|
|
27
|
+
/**
|
|
28
|
+
* Authentication middleware
|
|
29
|
+
* Validates Basic Auth -> D1 Token -> KV Rate Limit
|
|
30
|
+
*/
|
|
31
|
+
export declare function authMiddleware(c: Context<{
|
|
32
|
+
Bindings: {
|
|
33
|
+
DB: D1Database;
|
|
34
|
+
KV?: KVNamespace;
|
|
35
|
+
QUEUE?: Queue;
|
|
36
|
+
};
|
|
37
|
+
Variables: {
|
|
38
|
+
auth: AuthContext;
|
|
39
|
+
database: DatabasePort;
|
|
40
|
+
requestId?: string;
|
|
41
|
+
};
|
|
42
|
+
}>, next: () => Promise<Response>): Promise<Response>;
|
|
43
|
+
/**
|
|
44
|
+
* Middleware to check token permissions
|
|
45
|
+
* Requires write permission for certain operations
|
|
46
|
+
*/
|
|
47
|
+
export declare function checkTokenPermissions(requiredPermission: 'readonly' | 'write'): (c: Context<{
|
|
48
|
+
Variables: {
|
|
49
|
+
auth: AuthContext;
|
|
50
|
+
};
|
|
51
|
+
}>, next: () => Promise<Response>) => Promise<Response>;
|
|
52
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,MAAM,CAAC;AAG1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI7C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,UAAU,GAAG,OAAO,CAAC;CACxC;AA+FD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,CAAC,EAAE,OAAO,CAAC;IACT,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;QACf,EAAE,CAAC,EAAE,WAAW,CAAC;QACjB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,CAAC;IACF,SAAS,EAAE;QACT,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,OAAO,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5C,QAAQ,EAAE,YAAY,CAAC;KACxB,CAAC;CACH,CAAC,EACF,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CA6GnB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,CAAC,EAAE,OAAO,CAAC;IACT,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU,CAAC;QACf,EAAE,CAAC,EAAE,WAAW,CAAC;QACjB,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,CAAC;IACF,SAAS,EAAE;QACT,IAAI,EAAE,WAAW,CAAC;QAClB,QAAQ,EAAE,YAAY,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC,EACF,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAC5B,OAAO,CAAC,QAAQ,CAAC,CA0HnB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,kBAAkB,EAAE,UAAU,GAAG,OAAO,IAE1E,GAAG,OAAO,CAAC;IACT,SAAS,EAAE;QACT,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC;CACH,CAAC,EACF,MAAM,MAAM,OAAO,CAAC,QAAQ,CAAC,KAC5B,OAAO,CAAC,QAAQ,CAAC,CAqBrB"}
|