Browse Source

correct build

main
Silberengel 4 weeks ago
parent
commit
1f471189c7
  1. 586
      package-lock.json
  2. 14
      package.json
  3. 9
      src/lib/services/git/repo-manager.ts
  4. 13
      src/lib/services/nostr/nostr-client.ts
  5. 1
      src/routes/api/git/[...path]/+server.ts
  6. 2
      src/routes/api/repos/[npub]/[repo]/branch-protection/+server.ts
  7. 20
      src/routes/api/repos/[npub]/[repo]/fork/+server.ts
  8. 1
      src/routes/api/repos/[npub]/[repo]/issues/+server.ts
  9. 1
      src/routes/api/repos/[npub]/[repo]/verify/+server.ts

586
package-lock.json generated

File diff suppressed because it is too large Load Diff

14
package.json

@ -35,12 +35,18 @@ @@ -35,12 +35,18 @@
"@sveltejs/adapter-node": "^5.0.0",
"@types/markdown-it": "^14.1.2",
"@types/node": "^20.0.0",
"@typescript-eslint/eslint-plugin": "^6.0.0",
"@typescript-eslint/parser": "^6.0.0",
"eslint": "^8.0.0",
"@types/ws": "^8.18.1",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"eslint": "^8.57.1",
"prettier": "^3.0.0",
"svelte-check": "^3.0.0",
"typescript": "^5.0.0",
"vite": "^5.0.0"
"vite": "^5.4.11"
},
"overrides": {
"ajv": "^8.17.1",
"cookie": "^0.7.2",
"esbuild": "^0.24.0"
}
}

9
src/lib/services/git/repo-manager.ts

@ -109,7 +109,14 @@ export class RepoManager { @@ -109,7 +109,14 @@ export class RepoManager {
* Get git environment variables with Tor proxy if needed for .onion addresses
*/
private getGitEnvForUrl(url: string): Record<string, string> {
const env = { ...process.env };
const env: Record<string, string> = {};
// Copy process.env, filtering out undefined values
for (const [key, value] of Object.entries(process.env)) {
if (value !== undefined) {
env[key] = value;
}
}
if (shouldUseTor(url)) {
const proxy = getTorProxy();

13
src/lib/services/nostr/nostr-client.ts

@ -96,9 +96,9 @@ async function createWebSocketWithTor(url: string): Promise<WebSocket> { @@ -96,9 +96,9 @@ async function createWebSocketWithTor(url: string): Promise<WebSocket> {
proxy: {
host: proxy.host,
port: proxy.port,
type: 5 // SOCKS5
type: 5 as const // SOCKS5
},
command: 'connect',
command: 'connect' as const,
destination: {
host,
port
@ -108,11 +108,12 @@ async function createWebSocketWithTor(url: string): Promise<WebSocket> { @@ -108,11 +108,12 @@ async function createWebSocketWithTor(url: string): Promise<WebSocket> {
const info = await SocksClient.createConnection(socksOptions);
// Create WebSocket over the SOCKS connection
// socket option is supported at runtime but not in types
const ws = new WS(url, {
socket: info.socket,
// For wss://, we need to handle TLS
rejectUnauthorized: false // .onion addresses use self-signed certs
});
} as any);
return ws as any as WebSocket;
} catch (error) {
@ -218,6 +219,7 @@ export class NostrClient { @@ -218,6 +219,7 @@ export class NostrClient {
// Ensure WebSocket polyfill is initialized
await initializeWebSocketPolyfill();
const self = this;
return new Promise((resolve) => {
let ws: WebSocket | null = null;
const events: NostrEvent[] = [];
@ -299,7 +301,7 @@ export class NostrClient { @@ -299,7 +301,7 @@ export class NostrClient {
// Handle AUTH challenge
if (message[0] === 'AUTH' && message[1] && !authHandled) {
authHandled = true;
authPromise = this.handleAuthChallenge(ws!, relay, message[1]);
authPromise = self.handleAuthChallenge(ws!, relay, message[1]);
const authenticated = await authPromise;
// After authentication, send the REQ
if (ws && ws.readyState === WebSocket.OPEN) {
@ -373,6 +375,7 @@ export class NostrClient { @@ -373,6 +375,7 @@ export class NostrClient {
// Ensure WebSocket polyfill is initialized
await initializeWebSocketPolyfill();
const self = this;
return new Promise((resolve, reject) => {
let ws: WebSocket | null = null;
let resolved = false;
@ -459,7 +462,7 @@ export class NostrClient { @@ -459,7 +462,7 @@ export class NostrClient {
// Handle AUTH challenge
if (message[0] === 'AUTH' && message[1] && !authHandled) {
authHandled = true;
authPromise = this.handleAuthChallenge(ws!, relay, message[1]);
authPromise = self.handleAuthChallenge(ws!, relay, message[1]);
await authPromise;
// After authentication attempt, send the EVENT
if (ws && ws.readyState === WebSocket.OPEN) {

1
src/routes/api/git/[...path]/+server.ts

@ -123,6 +123,7 @@ export const GET: RequestHandler = async ({ params, url, request }) => { @@ -123,6 +123,7 @@ export const GET: RequestHandler = async ({ params, url, request }) => {
const requestUrl = `${protocol}://${host}${url.pathname}${url.search}`;
// Validate npub format
let pubkey: string;
try {
pubkey = requireNpubHex(npub);
} catch {

2
src/routes/api/repos/[npub]/[repo]/branch-protection/+server.ts

@ -92,7 +92,7 @@ export const POST: RequestHandler = async ({ params, request }: { params: { npub @@ -92,7 +92,7 @@ export const POST: RequestHandler = async ({ params, request }: { params: { npub
}
// Validate rules
const validatedRules: BranchProtectionRule[] = rules.map((rule: { branch: string; requirePullRequest?: boolean; requireReviewers?: string[]; allowForcePush?: boolean; requireStatusChecks?: string[] }) => ({
const validatedRules: BranchProtectionRule[] = rules.map((rule: { branch: string; requirePullRequest?: boolean; requireReviewers?: string[]; allowForcePush?: boolean; requireStatusChecks?: string[]; allowedMaintainers?: string[] }) => ({
branch: rule.branch,
requirePullRequest: rule.requirePullRequest || false,
requireReviewers: rule.requireReviewers || [],

20
src/routes/api/repos/[npub]/[repo]/fork/+server.ts

@ -250,8 +250,7 @@ export const POST: RequestHandler = async ({ params, request }) => { @@ -250,8 +250,7 @@ export const POST: RequestHandler = async ({ params, request }) => {
const truncatedOriginalNpub = npub.length > 16 ? `${npub.slice(0, 12)}...` : npub;
const context = `[${truncatedOriginalNpub}/${repo}${truncatedNpub}/${forkRepoName}]`;
const forkLogger = logger.child({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}` });
forkLogger.info({ relayCount: combinedRelays.length, relays: combinedRelays }, 'Starting fork process');
logger.info({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}`, relayCount: combinedRelays.length, relays: combinedRelays }, 'Starting fork process');
const publishResult = await publishEventWithRetry(
signedForkAnnouncement,
@ -263,7 +262,7 @@ export const POST: RequestHandler = async ({ params, request }) => { @@ -263,7 +262,7 @@ export const POST: RequestHandler = async ({ params, request }) => {
if (publishResult.success.length === 0) {
// Clean up repo if announcement failed
forkLogger.error({ failed: publishResult.failed }, 'Fork announcement failed after all retries. Cleaning up repository.');
logger.error({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}`, failed: publishResult.failed }, 'Fork announcement failed after all retries. Cleaning up repository.');
await execAsync(`rm -rf "${forkRepoPath}"`).catch(() => {});
const errorDetails = `All relays failed: ${publishResult.failed.map(f => `${f.relay}: ${f.error}`).join('; ')}`;
return json({
@ -290,11 +289,11 @@ export const POST: RequestHandler = async ({ params, request }) => { @@ -290,11 +289,11 @@ export const POST: RequestHandler = async ({ params, request }) => {
if (ownershipPublishResult.success.length === 0) {
// Clean up repo if ownership proof failed
forkLogger.error({ failed: ownershipPublishResult.failed }, 'Ownership transfer event failed after all retries. Cleaning up repository and publishing deletion request.');
logger.error({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}`, failed: ownershipPublishResult.failed }, 'Ownership transfer event failed after all retries. Cleaning up repository and publishing deletion request.');
await execAsync(`rm -rf "${forkRepoPath}"`).catch(() => {});
// Publish deletion request (NIP-09) for the announcement since it's invalid without ownership proof
forkLogger.info('Publishing deletion request for invalid fork announcement...');
logger.info({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}` }, 'Publishing deletion request for invalid fork announcement...');
const deletionRequest = {
kind: KIND.DELETION_REQUEST, // NIP-09: Event Deletion Request
pubkey: userPubkeyHex,
@ -316,9 +315,9 @@ export const POST: RequestHandler = async ({ params, request }) => { @@ -316,9 +315,9 @@ export const POST: RequestHandler = async ({ params, request }) => {
);
if (deletionResult.success.length > 0) {
forkLogger.info('Deletion request published successfully');
logger.info({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}` }, 'Deletion request published successfully');
} else {
forkLogger.error({ failed: deletionResult.failed }, 'Failed to publish deletion request');
logger.error({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}`, failed: deletionResult.failed }, 'Failed to publish deletion request');
}
const errorDetails = `Fork is invalid without ownership proof. All relays failed: ${ownershipPublishResult.failed.map(f => `${f.relay}: ${f.error}`).join('; ')}. Deletion request ${deletionResult.success.length > 0 ? 'published' : 'failed to publish'}.`;
@ -331,10 +330,13 @@ export const POST: RequestHandler = async ({ params, request }) => { @@ -331,10 +330,13 @@ export const POST: RequestHandler = async ({ params, request }) => {
}
// Provision the fork repo (this will create verification file and include self-transfer)
forkLogger.info('Provisioning fork repository...');
logger.info({ operation: 'fork', originalRepo: `${npub}/${repo}`, forkRepo: `${userNpub}/${forkRepoName}` }, 'Provisioning fork repository...');
await repoManager.provisionRepo(signedForkAnnouncement, signedOwnershipEvent, false);
forkLogger.info({
logger.info({
operation: 'fork',
originalRepo: `${npub}/${repo}`,
forkRepo: `${userNpub}/${forkRepoName}`,
announcementId: signedForkAnnouncement.id,
ownershipTransferId: signedOwnershipEvent.id,
announcementRelays: publishResult.success.length,

1
src/routes/api/repos/[npub]/[repo]/issues/+server.ts

@ -8,6 +8,7 @@ import { IssuesService } from '$lib/services/nostr/issues-service.js'; @@ -8,6 +8,7 @@ import { IssuesService } from '$lib/services/nostr/issues-service.js';
import { DEFAULT_NOSTR_RELAYS } from '$lib/config.js';
import { nip19 } from 'nostr-tools';
import logger from '$lib/services/logger.js';
import { requireNpubHex } from '$lib/utils/npub-utils.js';
export const GET: RequestHandler = async ({ params, url, request }) => {
const { npub, repo } = params;

1
src/routes/api/repos/[npub]/[repo]/verify/+server.ts

@ -15,6 +15,7 @@ import { nip19 } from 'nostr-tools'; @@ -15,6 +15,7 @@ import { nip19 } from 'nostr-tools';
import { existsSync } from 'fs';
import logger from '$lib/services/logger.js';
import { join } from 'path';
import { requireNpubHex, decodeNpubToHex } from '$lib/utils/npub-utils.js';
const repoRoot = process.env.GIT_REPO_ROOT || '/repos';
const fileManager = new FileManager(repoRoot);

Loading…
Cancel
Save