Browse Source

bug-fixes

Nostr-Signature: 5726811907af73d3b478f3938cdc6421200040542cb1a586b3497c56a24c33cb 573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc 3833d05ba5a34cad78caacbc8382fcd7a85c60b56dd3b18f9a5c68c890d7a611fa6b885ef02be465f541629b0afaeec0e9d57d3b00db332c5c8ae42fd72fc83d
main
Silberengel 3 weeks ago
parent
commit
4a94245a22
  1. 1
      nostr/commit-signatures.jsonl
  2. 28
      src/lib/services/nostr/event-cache.ts
  3. 30
      src/lib/services/nostr/maintainer-service.ts
  4. 1554
      src/lib/services/nostr/persistent-event-cache.ts
  5. 13
      src/lib/utils/repo-privacy.ts

1
nostr/commit-signatures.jsonl

@ -33,3 +33,4 @@
{"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771623058,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fixes"]],"content":"Signed commit: bug-fixes","id":"29ded44ac53cd8c924310728e3bac34070a2daa62418f3d79a386fdc84d93afe","sig":"a60a145c2f234e4bad593423ebc2a39ab12ec7a78c343b46348e6dbeac809be9b61e42219c9d569cc0902788bb59af3c36ffd0de1aa56d9d52611575d2ac797f"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771623058,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fixes"]],"content":"Signed commit: bug-fixes","id":"29ded44ac53cd8c924310728e3bac34070a2daa62418f3d79a386fdc84d93afe","sig":"a60a145c2f234e4bad593423ebc2a39ab12ec7a78c343b46348e6dbeac809be9b61e42219c9d569cc0902788bb59af3c36ffd0de1aa56d9d52611575d2ac797f"}
{"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771624450,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fixes and doc updates"]],"content":"Signed commit: bug-fixes and doc updates","id":"d089915a2d9a9d46ba25d2d3c1cb4608a2b658ecc4260f17e73efa4ccc63a28d","sig":"3d447f05a55704d45ed843b7cc5fa16e49f3da0e452b1523392aefbb7a2ae3e79400a763df5705db8e38abc89e9a89480ab2c529890b531b171c4e980520d9b8"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771624450,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fixes and doc updates"]],"content":"Signed commit: bug-fixes and doc updates","id":"d089915a2d9a9d46ba25d2d3c1cb4608a2b658ecc4260f17e73efa4ccc63a28d","sig":"3d447f05a55704d45ed843b7cc5fa16e49f3da0e452b1523392aefbb7a2ae3e79400a763df5705db8e38abc89e9a89480ab2c529890b531b171c4e980520d9b8"}
{"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771625218,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fix"]],"content":"Signed commit: bug-fix","id":"1cc16c438c4b1cc5170a90a7e4b540afa24d0c698538dc332fa4753437b21dfe","sig":"3caddc0d00e29995f4920bd4035ea61b4fd2d17e366bdd18889ede38a5ea960cd9f83a9f524b777b8de7bf7e4cdf59ab55c8fb4e46932655985ba8c6f3d7e7da"} {"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771625218,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fix"]],"content":"Signed commit: bug-fix","id":"1cc16c438c4b1cc5170a90a7e4b540afa24d0c698538dc332fa4753437b21dfe","sig":"3caddc0d00e29995f4920bd4035ea61b4fd2d17e366bdd18889ede38a5ea960cd9f83a9f524b777b8de7bf7e4cdf59ab55c8fb4e46932655985ba8c6f3d7e7da"}
{"kind":1640,"pubkey":"573634b648634cbad10f2451776089ea21090d9407f715e83c577b4611ae6edc","created_at":1771626015,"tags":[["author","Silberengel","silberengel7@protonmail.com"],["message","bug-fixes"]],"content":"Signed commit: bug-fixes","id":"f5bde3d9199d8cbacca481959663f1e14c43e143ef2b5686502559408e1c526b","sig":"3ed47cd283746d290d8609cbfdefbcee31a19d8e43e1a6ebf5a2829904000d79b83d3235296af4b5f7b555051214fbf2fa5c7a6d7986dca853112bb4e122a6d5"}

28
src/lib/services/nostr/event-cache.ts

@ -9,12 +9,32 @@ import { KIND } from '../../types/nostr.js';
import type { Logger } from '../../types/logger.js'; import type { Logger } from '../../types/logger.js';
let loggerCache: Logger | null = null; let loggerCache: Logger | null = null;
let loggerPromise: Promise<Logger> | null = null;
const getLogger = async (): Promise<Logger> => { const getLogger = async (): Promise<Logger> => {
if (!loggerCache) { if (loggerCache) {
const loggerModule = await import('../logger.js'); return loggerCache;
loggerCache = loggerModule.default;
} }
return loggerCache;
if (!loggerPromise) {
loggerPromise = import('../logger.js').then(module => {
loggerCache = module.default;
return loggerCache!;
}).catch(err => {
// Fallback to console logger if import fails
loggerCache = {
info: (...args: unknown[]) => console.log('[INFO]', ...args),
error: (...args: unknown[]) => console.error('[ERROR]', ...args),
warn: (...args: unknown[]) => console.warn('[WARN]', ...args),
debug: (...args: unknown[]) => console.debug('[DEBUG]', ...args),
trace: (...args: unknown[]) => console.trace('[TRACE]', ...args),
fatal: (...args: unknown[]) => console.error('[FATAL]', ...args)
} as Logger;
return loggerCache!;
});
}
return loggerPromise;
}; };
interface CacheEntry { interface CacheEntry {

30
src/lib/services/nostr/maintainer-service.ts

@ -8,9 +8,35 @@ import { KIND } from '../../types/nostr.js';
import type { NostrEvent } from '../../types/nostr.js'; import type { NostrEvent } from '../../types/nostr.js';
import { nip19 } from 'nostr-tools'; import { nip19 } from 'nostr-tools';
import { OwnershipTransferService } from './ownership-transfer-service.js'; import { OwnershipTransferService } from './ownership-transfer-service.js';
import logger from '../logger.js'; import type { Logger } from '../../types/logger.js';
import { isPrivateRepo as checkIsPrivateRepo } from '../../utils/repo-privacy.js'; import { isPrivateRepo as checkIsPrivateRepo } from '../../utils/repo-privacy.js';
// Lazy logger import to avoid initialization order issues
let loggerCache: Logger | null = null;
let loggerPromise: Promise<Logger> | null = null;
const getLogger = async (): Promise<Logger> => {
if (loggerCache) return loggerCache;
if (!loggerPromise) {
loggerPromise = import('../logger.js').then(m => {
loggerCache = m.default;
return loggerCache!;
}).catch(() => {
// Fallback console logger
loggerCache = {
info: (...args: unknown[]) => console.log('[INFO]', ...args),
error: (...args: unknown[]) => console.error('[ERROR]', ...args),
warn: (...args: unknown[]) => console.warn('[WARN]', ...args),
debug: (...args: unknown[]) => console.debug('[DEBUG]', ...args),
trace: (...args: unknown[]) => console.trace('[TRACE]', ...args),
fatal: (...args: unknown[]) => console.error('[FATAL]', ...args)
} as Logger;
return loggerCache!;
});
}
return loggerPromise;
};
export interface RepoPrivacyInfo { export interface RepoPrivacyInfo {
isPrivate: boolean; isPrivate: boolean;
owner: string; owner: string;
@ -115,6 +141,7 @@ export class MaintainerService {
this.cache.set(cacheKey, { ...result, timestamp: Date.now() }); this.cache.set(cacheKey, { ...result, timestamp: Date.now() });
return result; return result;
} catch (error) { } catch (error) {
const logger = await getLogger();
logger.error({ error, repoOwnerPubkey, repoId }, 'Error fetching maintainers'); logger.error({ error, repoOwnerPubkey, repoId }, 'Error fetching maintainers');
// Fallback: only owner is maintainer, repo is public by default // Fallback: only owner is maintainer, repo is public by default
const result = { owner: repoOwnerPubkey, maintainers: [repoOwnerPubkey], isPrivate: false }; const result = { owner: repoOwnerPubkey, maintainers: [repoOwnerPubkey], isPrivate: false };
@ -138,6 +165,7 @@ export class MaintainerService {
*/ */
async canView(userPubkey: string | null, repoOwnerPubkey: string, repoId: string): Promise<boolean> { async canView(userPubkey: string | null, repoOwnerPubkey: string, repoId: string): Promise<boolean> {
const { isPrivate, maintainers, owner } = await this.getMaintainers(repoOwnerPubkey, repoId); const { isPrivate, maintainers, owner } = await this.getMaintainers(repoOwnerPubkey, repoId);
const logger = await getLogger();
logger.debug({ logger.debug({
isPrivate, isPrivate,

1554
src/lib/services/nostr/persistent-event-cache.ts

File diff suppressed because it is too large Load Diff

13
src/lib/utils/repo-privacy.ts

@ -3,11 +3,19 @@
*/ */
import { nip19 } from 'nostr-tools'; import { nip19 } from 'nostr-tools';
import { MaintainerService } from '../services/nostr/maintainer-service.js';
import { DEFAULT_NOSTR_RELAYS } from '../config.js'; import { DEFAULT_NOSTR_RELAYS } from '../config.js';
import type { NostrEvent } from '../types/nostr.js'; import type { NostrEvent } from '../types/nostr.js';
const maintainerService = new MaintainerService(DEFAULT_NOSTR_RELAYS); // Lazy initialization to avoid initialization order issues
let maintainerServiceInstance: import('../services/nostr/maintainer-service.js').MaintainerService | null = null;
const getMaintainerService = async (): Promise<import('../services/nostr/maintainer-service.js').MaintainerService> => {
if (!maintainerServiceInstance) {
const { MaintainerService } = await import('../services/nostr/maintainer-service.js');
maintainerServiceInstance = new MaintainerService(DEFAULT_NOSTR_RELAYS);
}
return maintainerServiceInstance;
};
/** /**
* Check if a repository is private based on announcement event * Check if a repository is private based on announcement event
@ -55,6 +63,7 @@ export async function checkRepoAccess(
} }
// Check if user can view // Check if user can view
const maintainerService = await getMaintainerService();
const canView = await maintainerService.canView(userPubkey, repoOwnerPubkey, repo); const canView = await maintainerService.canView(userPubkey, repoOwnerPubkey, repo);
return { return {

Loading…
Cancel
Save