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":[]}