e392f9562fcd8679cb810fbe587349d13498fbe35a6fdfe7f67836404da0105d.json raw
1 {"ast":null,"code":"import _asyncToGenerator from \"/home/mleku/src/orly.dev/next/signer/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { RelayRepositoryError, RelayErrorCode } from '../../domain/repositories/relay-repository';\nimport { IdentityId } from '../../domain/value-objects';\n/**\n * Implementation of RelayRepository using browser storage.\n */\nexport class BrowserRelayRepository {\n storage;\n encryption;\n constructor(storage, encryption) {\n this.storage = storage;\n this.encryption = encryption;\n }\n findById(id) {\n var _this = this;\n return _asyncToGenerator(function* () {\n const relays = _this.storage.getSessionRelays();\n return relays.find(r => r.id === id.value);\n })();\n }\n find(query) {\n var _this2 = this;\n return _asyncToGenerator(function* () {\n let relays = _this2.storage.getSessionRelays();\n if (query.identityId) {\n const identityIdValue = query.identityId.value;\n relays = relays.filter(r => r.identityId === identityIdValue);\n }\n if (query.url) {\n const urlLower = query.url.toLowerCase();\n relays = relays.filter(r => r.url.toLowerCase() === urlLower);\n }\n if (query.read !== undefined) {\n const read = query.read;\n relays = relays.filter(r => r.read === read);\n }\n if (query.write !== undefined) {\n const write = query.write;\n relays = relays.filter(r => r.write === write);\n }\n return relays;\n })();\n }\n findByUrl(identityId, url) {\n var _this3 = this;\n return _asyncToGenerator(function* () {\n const relays = _this3.storage.getSessionRelays();\n return relays.find(r => r.identityId === identityId.value && r.url.toLowerCase() === url.toLowerCase());\n })();\n }\n findByIdentity(identityId) {\n var _this4 = this;\n return _asyncToGenerator(function* () {\n const relays = _this4.storage.getSessionRelays();\n return relays.filter(r => r.identityId === identityId.value);\n })();\n }\n findAll() {\n var _this5 = this;\n return _asyncToGenerator(function* () {\n return _this5.storage.getSessionRelays();\n })();\n }\n save(relay) {\n var _this6 = this;\n return _asyncToGenerator(function* () {\n // Check for duplicate URL for the same identity (excluding self)\n const existing = yield _this6.findByUrl(IdentityId.from(relay.identityId), relay.url);\n if (existing && existing.id !== relay.id) {\n throw new RelayRepositoryError('A relay with the same URL already exists for this identity', RelayErrorCode.DUPLICATE_URL);\n }\n const sessionRelays = _this6.storage.getSessionRelays();\n const existingIndex = sessionRelays.findIndex(r => r.id === relay.id);\n if (existingIndex >= 0) {\n sessionRelays[existingIndex] = relay;\n } else {\n sessionRelays.push(relay);\n }\n _this6.storage.setSessionRelays(sessionRelays);\n yield _this6.storage.saveSessionData();\n // Encrypt and save to sync storage\n const encryptedRelay = yield _this6.encryptRelay(relay);\n const syncRelays = _this6.storage.getSyncRelays();\n // Find by decrypting IDs\n let syncIndex = -1;\n for (let i = 0; i < syncRelays.length; i++) {\n try {\n const decryptedId = yield _this6.encryption.decryptString(syncRelays[i].id);\n if (decryptedId === relay.id) {\n syncIndex = i;\n break;\n }\n } catch {\n // Skip corrupted entries\n }\n }\n if (syncIndex >= 0) {\n syncRelays[syncIndex] = encryptedRelay;\n } else {\n syncRelays.push(encryptedRelay);\n }\n yield _this6.storage.saveSyncRelays(syncRelays);\n })();\n }\n delete(id) {\n var _this7 = this;\n return _asyncToGenerator(function* () {\n const sessionRelays = _this7.storage.getSessionRelays();\n const initialLength = sessionRelays.length;\n const filtered = sessionRelays.filter(r => r.id !== id.value);\n if (filtered.length === initialLength) {\n return false;\n }\n _this7.storage.setSessionRelays(filtered);\n yield _this7.storage.saveSessionData();\n // Remove from sync storage\n const encryptedId = yield _this7.encryption.encryptString(id.value);\n const syncRelays = _this7.storage.getSyncRelays();\n const filteredSync = syncRelays.filter(r => r.id !== encryptedId);\n yield _this7.storage.saveSyncRelays(filteredSync);\n return true;\n })();\n }\n deleteByIdentity(identityId) {\n var _this8 = this;\n return _asyncToGenerator(function* () {\n const sessionRelays = _this8.storage.getSessionRelays();\n const initialLength = sessionRelays.length;\n const filtered = sessionRelays.filter(r => r.identityId !== identityId.value);\n const deletedCount = initialLength - filtered.length;\n if (deletedCount === 0) {\n return 0;\n }\n _this8.storage.setSessionRelays(filtered);\n yield _this8.storage.saveSessionData();\n // Remove from sync storage\n const encryptedIdentityId = yield _this8.encryption.encryptString(identityId.value);\n const syncRelays = _this8.storage.getSyncRelays();\n const filteredSync = syncRelays.filter(r => r.identityId !== encryptedIdentityId);\n yield _this8.storage.saveSyncRelays(filteredSync);\n return deletedCount;\n })();\n }\n count(query) {\n var _this9 = this;\n return _asyncToGenerator(function* () {\n if (query) {\n const results = yield _this9.find(query);\n return results.length;\n }\n return _this9.storage.getSessionRelays().length;\n })();\n }\n // ─────────────────────────────────────────────────────────────────────────\n // Private helpers\n // ─────────────────────────────────────────────────────────────────────────\n encryptRelay(relay) {\n var _this0 = this;\n return _asyncToGenerator(function* () {\n return {\n id: yield _this0.encryption.encryptString(relay.id),\n identityId: yield _this0.encryption.encryptString(relay.identityId),\n url: yield _this0.encryption.encryptString(relay.url),\n read: yield _this0.encryption.encryptBoolean(relay.read),\n write: yield _this0.encryption.encryptBoolean(relay.write)\n };\n })();\n }\n}\n/**\n * Factory function to create a BrowserRelayRepository.\n */\nexport function createRelayRepository(storage, encryption) {\n return new BrowserRelayRepository(storage, encryption);\n}","map":null,"metadata":{},"sourceType":"module","externalDependencies":[]}