dop-wallet-v6 1.2.3 → 1.2.5

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.
Files changed (222) hide show
  1. package/dist/services/artifacts/__tests__/artifact-downloader.test.js.map +1 -1
  2. package/dist/services/artifacts/artifact-downloader.d.ts +1 -1
  3. package/dist/services/artifacts/artifact-downloader.js +1 -1
  4. package/dist/services/artifacts/artifact-downloader.js.map +1 -1
  5. package/dist/services/artifacts/artifact-hash.d.ts +1 -1
  6. package/dist/services/artifacts/artifact-hash.js +2 -2
  7. package/dist/services/artifacts/artifact-hash.js.map +1 -1
  8. package/dist/services/artifacts/artifact-util.d.ts +1 -1
  9. package/dist/services/artifacts/artifact-util.js +1 -1
  10. package/dist/services/artifacts/artifact-util.js.map +1 -1
  11. package/dist/services/dop/core/__tests__/providers.test.js +4 -4
  12. package/dist/services/dop/core/__tests__/providers.test.js.map +1 -1
  13. package/dist/services/dop/core/artifacts.d.ts +2 -2
  14. package/dist/services/dop/core/artifacts.js +1 -1
  15. package/dist/services/dop/core/artifacts.js.map +1 -1
  16. package/dist/services/dop/core/encrypts.d.ts +1 -1
  17. package/dist/services/dop/core/encrypts.js +2 -2
  18. package/dist/services/dop/core/encrypts.js.map +1 -1
  19. package/dist/services/dop/core/engine.d.ts +1 -1
  20. package/dist/services/dop/core/engine.js +1 -1
  21. package/dist/services/dop/core/engine.js.map +1 -1
  22. package/dist/services/dop/core/init.d.ts +2 -2
  23. package/dist/services/dop/core/init.js +2 -2
  24. package/dist/services/dop/core/init.js.map +1 -1
  25. package/dist/services/dop/core/load-provider.d.ts +1 -1
  26. package/dist/services/dop/core/load-provider.js +2 -2
  27. package/dist/services/dop/core/load-provider.js.map +1 -1
  28. package/dist/services/dop/core/merkletree.d.ts +3 -3
  29. package/dist/services/dop/core/merkletree.js +2 -2
  30. package/dist/services/dop/core/merkletree.js.map +1 -1
  31. package/dist/services/dop/core/prover.d.ts +1 -1
  32. package/dist/services/dop/core/prover.js +1 -1
  33. package/dist/services/dop/core/prover.js.map +1 -1
  34. package/dist/services/dop/core/providers.d.ts +2 -2
  35. package/dist/services/dop/core/providers.js +1 -1
  36. package/dist/services/dop/core/providers.js.map +1 -1
  37. package/dist/services/dop/dop-txids/__tests__/dop-txid-sync-graph-v2.test.js +1 -1
  38. package/dist/services/dop/dop-txids/__tests__/dop-txid-sync-graph-v2.test.js.map +1 -1
  39. package/dist/services/dop/dop-txids/blinded-commitments.d.ts +1 -1
  40. package/dist/services/dop/dop-txids/blinded-commitments.js +1 -1
  41. package/dist/services/dop/dop-txids/blinded-commitments.js.map +1 -1
  42. package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.d.ts +1 -1
  43. package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.js +1 -1
  44. package/dist/services/dop/dop-txids/dop-txid-graph-type-formatters.js.map +1 -1
  45. package/dist/services/dop/dop-txids/dop-txid-merkletrees.d.ts +1 -1
  46. package/dist/services/dop/dop-txids/dop-txid-merkletrees.js +1 -1
  47. package/dist/services/dop/dop-txids/dop-txid-merkletrees.js.map +1 -1
  48. package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.d.ts +1 -1
  49. package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.js +2 -2
  50. package/dist/services/dop/dop-txids/dop-txid-sync-graph-v2.js.map +1 -1
  51. package/dist/services/dop/dop-txids/graphql/index.js +1 -1
  52. package/dist/services/dop/dop-txids/graphql/index.js.map +1 -1
  53. package/dist/services/dop/history/transaction-history.d.ts +2 -2
  54. package/dist/services/dop/history/transaction-history.js +2 -2
  55. package/dist/services/dop/history/transaction-history.js.map +1 -1
  56. package/dist/services/dop/index.d.ts +1 -0
  57. package/dist/services/dop/index.js +1 -0
  58. package/dist/services/dop/index.js.map +1 -1
  59. package/dist/services/dop/process/extract-transaction-data.d.ts +1 -1
  60. package/dist/services/dop/process/extract-transaction-data.js +1 -1
  61. package/dist/services/dop/process/extract-transaction-data.js.map +1 -1
  62. package/dist/services/dop/profile/__tests__/profile-manager.test.d.ts +1 -0
  63. package/dist/services/dop/profile/__tests__/profile-manager.test.js +170 -0
  64. package/dist/services/dop/profile/__tests__/profile-manager.test.js.map +1 -0
  65. package/dist/services/dop/profile/__tests__/selective-transparency.test.d.ts +1 -0
  66. package/dist/services/dop/profile/__tests__/selective-transparency.test.js +256 -0
  67. package/dist/services/dop/profile/__tests__/selective-transparency.test.js.map +1 -0
  68. package/dist/services/dop/profile/__tests__/storage.test.d.ts +1 -0
  69. package/dist/services/dop/profile/__tests__/storage.test.js +174 -0
  70. package/dist/services/dop/profile/__tests__/storage.test.js.map +1 -0
  71. package/dist/services/dop/profile/index.d.ts +3 -0
  72. package/dist/services/dop/profile/index.js +20 -0
  73. package/dist/services/dop/profile/index.js.map +1 -0
  74. package/dist/services/dop/profile/profile-manager.d.ts +32 -0
  75. package/dist/services/dop/profile/profile-manager.js +235 -0
  76. package/dist/services/dop/profile/profile-manager.js.map +1 -0
  77. package/dist/services/dop/profile/selective-transparency.d.ts +82 -0
  78. package/dist/services/dop/profile/selective-transparency.js +447 -0
  79. package/dist/services/dop/profile/selective-transparency.js.map +1 -0
  80. package/dist/services/dop/profile/storage.d.ts +27 -0
  81. package/dist/services/dop/profile/storage.js +648 -0
  82. package/dist/services/dop/profile/storage.js.map +1 -0
  83. package/dist/services/dop/profile/types.d.ts +106 -0
  84. package/dist/services/dop/profile/types.js +3 -0
  85. package/dist/services/dop/profile/types.js.map +1 -0
  86. package/dist/services/dop/profile/usage-example.d.ts +11 -0
  87. package/dist/services/dop/profile/usage-example.js +143 -0
  88. package/dist/services/dop/profile/usage-example.js.map +1 -0
  89. package/dist/services/dop/quick-sync/V2/__tests__/quick-sync-events-graph-v2.test.js +2 -2
  90. package/dist/services/dop/quick-sync/V2/__tests__/quick-sync-events-graph-v2.test.js.map +1 -1
  91. package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.d.ts +1 -1
  92. package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.js +2 -2
  93. package/dist/services/dop/quick-sync/V2/graph-type-formatters-v2.js.map +1 -1
  94. package/dist/services/dop/quick-sync/V2/graphql/index.js +1 -1
  95. package/dist/services/dop/quick-sync/V2/graphql/index.js.map +1 -1
  96. package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.d.ts +1 -1
  97. package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.js +1 -1
  98. package/dist/services/dop/quick-sync/V2/quick-sync-events-graph-v2.js.map +1 -1
  99. package/dist/services/dop/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js +2 -2
  100. package/dist/services/dop/quick-sync/V3/__tests__/quick-sync-events-graph-v3.test.js.map +1 -1
  101. package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.d.ts +2 -2
  102. package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.js +1 -1
  103. package/dist/services/dop/quick-sync/V3/graph-type-formatters-v3.js.map +1 -1
  104. package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.d.ts +1 -1
  105. package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.js +2 -2
  106. package/dist/services/dop/quick-sync/V3/quick-sync-events-graph-v3.js.map +1 -1
  107. package/dist/services/dop/quick-sync/graph-query.d.ts +1 -1
  108. package/dist/services/dop/quick-sync/graph-query.js +1 -1
  109. package/dist/services/dop/quick-sync/graph-query.js.map +1 -1
  110. package/dist/services/dop/quick-sync/quick-sync-events.d.ts +2 -2
  111. package/dist/services/dop/quick-sync/quick-sync-events.js.map +1 -1
  112. package/dist/services/dop/quick-sync/shared-formatters.d.ts +1 -1
  113. package/dist/services/dop/quick-sync/shared-formatters.js +1 -1
  114. package/dist/services/dop/quick-sync/shared-formatters.js.map +1 -1
  115. package/dist/services/dop/util/__tests__/bytes-util.test.js +1 -1
  116. package/dist/services/dop/util/__tests__/bytes-util.test.js.map +1 -1
  117. package/dist/services/dop/util/bytes.d.ts +1 -1
  118. package/dist/services/dop/util/bytes.js +1 -1
  119. package/dist/services/dop/util/bytes.js.map +1 -1
  120. package/dist/services/dop/util/crypto.d.ts +2 -2
  121. package/dist/services/dop/util/crypto.js +1 -1
  122. package/dist/services/dop/util/crypto.js.map +1 -1
  123. package/dist/services/dop/wallets/__tests__/balances-live.test.js +1 -1
  124. package/dist/services/dop/wallets/__tests__/balances-live.test.js.map +1 -1
  125. package/dist/services/dop/wallets/__tests__/balances-update.test.js +2 -2
  126. package/dist/services/dop/wallets/__tests__/balances-update.test.js.map +1 -1
  127. package/dist/services/dop/wallets/__tests__/balances.test.js +2 -2
  128. package/dist/services/dop/wallets/__tests__/balances.test.js.map +1 -1
  129. package/dist/services/dop/wallets/__tests__/wallets.test.js +1 -1
  130. package/dist/services/dop/wallets/__tests__/wallets.test.js.map +1 -1
  131. package/dist/services/dop/wallets/balance-update.d.ts +2 -2
  132. package/dist/services/dop/wallets/balance-update.js +2 -2
  133. package/dist/services/dop/wallets/balance-update.js.map +1 -1
  134. package/dist/services/dop/wallets/balances.d.ts +1 -1
  135. package/dist/services/dop/wallets/balances.js.map +1 -1
  136. package/dist/services/dop/wallets/wallets.d.ts +2 -2
  137. package/dist/services/dop/wallets/wallets.js +2 -2
  138. package/dist/services/dop/wallets/wallets.js.map +1 -1
  139. package/dist/services/ethers/ethers-util.js +1 -1
  140. package/dist/services/ethers/ethers-util.js.map +1 -1
  141. package/dist/services/transactions/__tests__/proof-cache.test.js +1 -1
  142. package/dist/services/transactions/__tests__/proof-cache.test.js.map +1 -1
  143. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js +8 -8
  144. package/dist/services/transactions/__tests__/tx-cross-contract-calls.test.js.map +1 -1
  145. package/dist/services/transactions/__tests__/tx-encrypt-base-token.test.js +2 -2
  146. package/dist/services/transactions/__tests__/tx-encrypt-base-token.test.js.map +1 -1
  147. package/dist/services/transactions/__tests__/tx-gas-details.test.js +1 -1
  148. package/dist/services/transactions/__tests__/tx-gas-details.test.js.map +1 -1
  149. package/dist/services/transactions/__tests__/tx-notes.test.js +1 -1
  150. package/dist/services/transactions/__tests__/tx-notes.test.js.map +1 -1
  151. package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.d.ts +1 -0
  152. package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.js +93 -0
  153. package/dist/services/transactions/__tests__/tx-proof-transfer-with-data.test.js.map +1 -0
  154. package/dist/services/transactions/__tests__/tx-transfer.test.js +13 -13
  155. package/dist/services/transactions/__tests__/tx-transfer.test.js.map +1 -1
  156. package/dist/services/transactions/index.d.ts +1 -0
  157. package/dist/services/transactions/index.js +1 -0
  158. package/dist/services/transactions/index.js.map +1 -1
  159. package/dist/services/transactions/proof-cache.d.ts +1 -1
  160. package/dist/services/transactions/proof-cache.js +1 -1
  161. package/dist/services/transactions/proof-cache.js.map +1 -1
  162. package/dist/services/transactions/tx-cross-contract-calls.d.ts +2 -2
  163. package/dist/services/transactions/tx-cross-contract-calls.js +2 -2
  164. package/dist/services/transactions/tx-cross-contract-calls.js.map +1 -1
  165. package/dist/services/transactions/tx-decrypt.d.ts +1 -1
  166. package/dist/services/transactions/tx-decrypt.js +2 -2
  167. package/dist/services/transactions/tx-decrypt.js.map +1 -1
  168. package/dist/services/transactions/tx-encrypt-base-token.d.ts +1 -1
  169. package/dist/services/transactions/tx-encrypt-base-token.js +2 -2
  170. package/dist/services/transactions/tx-encrypt-base-token.js.map +1 -1
  171. package/dist/services/transactions/tx-encrypt.d.ts +1 -1
  172. package/dist/services/transactions/tx-encrypt.js +2 -2
  173. package/dist/services/transactions/tx-encrypt.js.map +1 -1
  174. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.d.ts +2 -2
  175. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js +2 -2
  176. package/dist/services/transactions/tx-gas-broadcaster-fee-estimator.js.map +1 -1
  177. package/dist/services/transactions/tx-gas-details.d.ts +1 -1
  178. package/dist/services/transactions/tx-gas-details.js +2 -2
  179. package/dist/services/transactions/tx-gas-details.js.map +1 -1
  180. package/dist/services/transactions/tx-generator.d.ts +2 -2
  181. package/dist/services/transactions/tx-generator.js +2 -2
  182. package/dist/services/transactions/tx-generator.js.map +1 -1
  183. package/dist/services/transactions/tx-notes.d.ts +2 -2
  184. package/dist/services/transactions/tx-notes.js +2 -2
  185. package/dist/services/transactions/tx-notes.js.map +1 -1
  186. package/dist/services/transactions/tx-nullifiers.d.ts +1 -1
  187. package/dist/services/transactions/tx-nullifiers.js.map +1 -1
  188. package/dist/services/transactions/tx-proof-decrypt.d.ts +1 -1
  189. package/dist/services/transactions/tx-proof-decrypt.js +2 -2
  190. package/dist/services/transactions/tx-proof-decrypt.js.map +1 -1
  191. package/dist/services/transactions/tx-proof-transfer-with-data.d.ts +36 -0
  192. package/dist/services/transactions/tx-proof-transfer-with-data.js +104 -0
  193. package/dist/services/transactions/tx-proof-transfer-with-data.js.map +1 -0
  194. package/dist/services/transactions/tx-proof-transfer.d.ts +2 -2
  195. package/dist/services/transactions/tx-proof-transfer.js +5 -5
  196. package/dist/services/transactions/tx-proof-transfer.js.map +1 -1
  197. package/dist/services/transactions/tx-transfer.d.ts +1 -1
  198. package/dist/services/transactions/tx-transfer.js +1 -1
  199. package/dist/services/transactions/tx-transfer.js.map +1 -1
  200. package/dist/tests/helper.test.d.ts +1 -1
  201. package/dist/tests/helper.test.js +1 -1
  202. package/dist/tests/helper.test.js.map +1 -1
  203. package/dist/tests/mocks.test.d.ts +2 -2
  204. package/dist/tests/mocks.test.js +1 -1
  205. package/dist/tests/mocks.test.js.map +1 -1
  206. package/dist/tests/poi/test-wallet-poi-requester.test.d.ts +2 -2
  207. package/dist/tests/poi/test-wallet-poi-requester.test.js.map +1 -1
  208. package/dist/tests/setup.test.d.ts +2 -2
  209. package/dist/tests/setup.test.js +1 -1
  210. package/dist/tests/setup.test.js.map +1 -1
  211. package/dist/tests/stubs/engine-stubs.test.d.ts +1 -1
  212. package/dist/tests/stubs/engine-stubs.test.js +1 -1
  213. package/dist/tests/stubs/engine-stubs.test.js.map +1 -1
  214. package/dist/utils/blocked-address.js +1 -1
  215. package/dist/utils/blocked-address.js.map +1 -1
  216. package/dist/utils/error.js +1 -1
  217. package/dist/utils/error.js.map +1 -1
  218. package/dist/utils/gas-price.d.ts +1 -1
  219. package/dist/utils/gas-price.js +1 -1
  220. package/dist/utils/gas-price.js.map +1 -1
  221. package/package.json +13 -3
  222. package/postinstall.js +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selective-transparency.test.js","sourceRoot":"","sources":["../../../../../src/services/dop/profile/__tests__/selective-transparency.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport Sinon from 'sinon';\nimport LevelDOWN from 'leveldown';\nimport { SelectiveTransparencyManager } from '../selective-transparency';\nimport * as wallets from '../../wallets/wallets';\nimport { ProfileStorage } from '../storage';\nimport { rmSync } from 'fs';\nimport type { AbstractLevelDOWN } from 'abstract-leveldown';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\ndescribe('SelectiveTransparencyManager', () => {\n let transparencyManager: SelectiveTransparencyManager;\n let testStorage: ProfileStorage;\n let db: AbstractLevelDOWN;\n const testDbPath = 'test-selective-transparency-db';\n const mockWalletId = 'test-wallet-id';\n const mockRequesterId = 'test-requester-id';\n\n beforeEach(async () => {\n db = new LevelDOWN(testDbPath);\n await new Promise<void>((resolve, reject) => {\n db.open((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n \n testStorage = new ProfileStorage(db);\n transparencyManager = new SelectiveTransparencyManager();\n transparencyManager.setStorage(testStorage);\n Sinon.stub(wallets, 'walletForID').returns({} as any);\n });\n\n afterEach(async () => {\n Sinon.restore();\n await new Promise<void>((resolve, reject) => {\n db.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n \n try {\n rmSync(testDbPath, { recursive: true });\n } catch (error) {\n // Ignore cleanup errors\n }\n });\n\n describe('settings management', () => {\n it('should create default settings', async () => {\n const result = await transparencyManager.createDefaultSettings(mockWalletId);\n expect(result.id).to.equal(mockWalletId);\n expect(result.walletId).to.equal(mockWalletId);\n expect(result.assetVisibility.showTokenBalances).to.be.true;\n expect(result.assetVisibility.showNFTs).to.be.true;\n expect(result.assetVisibility.showTransactionHistory).to.be.false;\n });\n\n it('should get settings', async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n const result = await transparencyManager.getSettings(mockWalletId);\n expect(result).to.not.be.undefined;\n if (result) {\n expect(result.walletId).to.equal(mockWalletId);\n }\n });\n\n it('should update settings', async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n const updates = {\n assetVisibility: {\n showTokenBalances: false,\n showNFTs: true,\n showTransactionHistory: true,\n showAddresses: true,\n },\n };\n\n const result = await transparencyManager.updateSettings(mockWalletId, updates);\n expect(result.assetVisibility.showTokenBalances).to.be.false;\n expect(result.assetVisibility.showTransactionHistory).to.be.true;\n });\n });\n\n describe('token visibility management', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should set token visibility', async () => {\n const tokenAddress = '0x1234567890123456789012345678901234567890';\n const visibility = {\n isVisible: true,\n showBalance: true,\n showTransactions: false,\n };\n\n await transparencyManager.setTokenVisibility(mockWalletId, tokenAddress, visibility);\n const result = await transparencyManager.getTokenVisibility(mockWalletId, tokenAddress);\n expect(result).to.deep.equal(visibility);\n });\n\n it('should return default visibility for unknown token', async () => {\n const tokenAddress = '0x1234567890123456789012345678901234567890';\n const result = await transparencyManager.getTokenVisibility(mockWalletId, tokenAddress);\n expect(result.isVisible).to.be.true; // default from settings\n expect(result.showBalance).to.be.true;\n expect(result.showTransactions).to.be.false;\n });\n });\n\n describe('NFT visibility management', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should set NFT visibility', async () => {\n const nftAddress = '0x1234567890123456789012345678901234567890';\n const visibility = {\n isVisible: true,\n showCollection: true,\n showTransactions: false,\n };\n\n await transparencyManager.setNFTVisibility(mockWalletId, nftAddress, visibility);\n const result = await transparencyManager.getNFTVisibility(mockWalletId, nftAddress);\n expect(result).to.deep.equal(visibility);\n });\n\n it('should return default visibility for unknown NFT', async () => {\n const nftAddress = '0x1234567890123456789012345678901234567890';\n const result = await transparencyManager.getNFTVisibility(mockWalletId, nftAddress);\n expect(result.isVisible).to.be.true; // default from settings\n expect(result.showCollection).to.be.true;\n expect(result.showTransactions).to.be.false;\n });\n });\n\n describe('whitelist management', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should add address to whitelist', async () => {\n const address = '0x1234567890123456789012345678901234567890';\n const permissions = {\n viewBalances: true,\n viewNFTs: true,\n viewTransactions: false,\n viewProfile: true,\n };\n\n await transparencyManager.addToWhitelist(mockWalletId, address, permissions);\n \n const canViewBalances = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewBalances'\n );\n expect(canViewBalances).to.be.true;\n\n const canViewTransactions = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewTransactions'\n );\n expect(canViewTransactions).to.be.false;\n });\n\n it('should remove address from whitelist', async () => {\n const address = '0x1234567890123456789012345678901234567890';\n const permissions = {\n viewBalances: true,\n viewNFTs: true,\n viewTransactions: false,\n viewProfile: true,\n };\n\n await transparencyManager.addToWhitelist(mockWalletId, address, permissions);\n await transparencyManager.removeFromWhitelist(mockWalletId, address);\n \n const canViewBalances = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewBalances'\n );\n expect(canViewBalances).to.be.false;\n });\n\n it('should return false for non-whitelisted address', async () => {\n const address = '0x1234567890123456789012345678901234567890';\n const canViewBalances = await transparencyManager.checkWhitelistPermission(\n mockWalletId,\n address,\n 'viewBalances'\n );\n expect(canViewBalances).to.be.false;\n });\n });\n\n describe('viewing requests', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n });\n\n it('should create viewing request', async () => {\n const result = await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance',\n undefined,\n 'Can I see your balance?'\n );\n\n expect(result.requesterId).to.equal(mockRequesterId);\n expect(result.walletId).to.equal(mockWalletId);\n expect(result.requestType).to.equal('balance');\n expect(result.message).to.equal('Can I see your balance?');\n expect(result.status).to.equal('pending');\n });\n\n it('should approve viewing request', async () => {\n const request = await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance'\n );\n\n const result = await transparencyManager.respondToViewingRequest(request.id, 'approved');\n expect(result.status).to.equal('approved');\n });\n\n it('should reject viewing request', async () => {\n const request = await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance'\n );\n\n const result = await transparencyManager.respondToViewingRequest(request.id, 'rejected');\n expect(result.status).to.equal('rejected');\n });\n\n it('should get viewing requests for wallet', async () => {\n await transparencyManager.createViewingRequest(\n mockRequesterId,\n mockWalletId,\n 'balance'\n );\n\n const results = await transparencyManager.getViewingRequests(mockWalletId);\n expect(results.length).to.equal(1);\n expect(results[0].walletId).to.equal(mockWalletId);\n });\n });\n\n describe('visibility proofs', () => {\n beforeEach(async () => {\n await transparencyManager.createDefaultSettings(mockWalletId);\n // Add requester to whitelist\n await transparencyManager.addToWhitelist(mockWalletId, mockRequesterId, {\n viewBalances: true,\n viewNFTs: true,\n viewTransactions: true,\n viewProfile: true,\n });\n });\n\n it('should generate visibility proof for authorized requester', async () => {\n const result = await transparencyManager.generateVisibilityProof(\n mockWalletId,\n mockRequesterId,\n 'balance'\n );\n\n expect(result.walletId).to.equal(mockWalletId);\n expect(result.requesterId).to.equal(mockRequesterId);\n expect(result.proofType).to.equal('balance');\n expect(result.isValid).to.be.true;\n expect(result.proof).to.be.a('string');\n });\n\n it('should throw error for unauthorized requester', async () => {\n const unauthorizedRequester = 'unauthorized-requester';\n \n await expect(\n transparencyManager.generateVisibilityProof(\n mockWalletId,\n unauthorizedRequester,\n 'balance'\n )\n ).to.be.rejectedWith('Insufficient permissions');\n });\n\n it('should verify valid proof', async () => {\n const proof = await transparencyManager.generateVisibilityProof(\n mockWalletId,\n mockRequesterId,\n 'balance'\n );\n\n const isValid = await transparencyManager.verifyVisibilityProof(proof.id);\n expect(isValid).to.be.true;\n });\n\n it('should return false for non-existent proof', async () => {\n const isValid = await transparencyManager.verifyVisibilityProof('non-existent-proof');\n expect(isValid).to.be.false;\n });\n });\n});\n"]}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chai_1 = __importDefault(require("chai"));
7
+ const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
8
+ const storage_1 = require("../storage");
9
+ const leveldown_1 = __importDefault(require("leveldown"));
10
+ const fs_1 = require("fs");
11
+ chai_1.default.use(chai_as_promised_1.default);
12
+ const { expect } = chai_1.default;
13
+ describe('ProfileStorage', () => {
14
+ let storage;
15
+ let db;
16
+ const testDbPath = 'test-profile-db';
17
+ beforeEach(async () => {
18
+ db = new leveldown_1.default(testDbPath);
19
+ await new Promise((resolve, reject) => {
20
+ db.open((err) => {
21
+ if (err)
22
+ reject(err);
23
+ else
24
+ resolve();
25
+ });
26
+ });
27
+ storage = new storage_1.ProfileStorage(db);
28
+ });
29
+ afterEach(async () => {
30
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
31
+ if (db && typeof db.close === 'function') {
32
+ await new Promise((resolve, reject) => {
33
+ db.close((err) => {
34
+ if (err)
35
+ reject(err);
36
+ else
37
+ resolve();
38
+ });
39
+ });
40
+ }
41
+ try {
42
+ (0, fs_1.rmSync)(testDbPath, { recursive: true, force: true });
43
+ }
44
+ catch (error) {
45
+ // Ignore cleanup errors
46
+ }
47
+ });
48
+ describe('Profile operations', () => {
49
+ it('should store and retrieve a profile', async () => {
50
+ const walletId = 'test-wallet-1';
51
+ const profile = {
52
+ id: walletId,
53
+ username: 'testuser',
54
+ profilePicture: 'https://example.com/avatar.jpg',
55
+ bio: 'Test bio',
56
+ socialLinks: {
57
+ twitter: '@testuser',
58
+ discord: 'testuser#1234',
59
+ },
60
+ createdAt: new Date(),
61
+ updatedAt: new Date(),
62
+ };
63
+ await storage.setProfile(walletId, profile);
64
+ const retrievedProfile = await storage.getProfile(walletId);
65
+ expect(retrievedProfile).to.not.be.undefined;
66
+ expect(retrievedProfile?.id).to.equal(walletId);
67
+ expect(retrievedProfile?.username).to.equal('testuser');
68
+ expect(retrievedProfile?.bio).to.equal('Test bio');
69
+ });
70
+ it('should return undefined for non-existent profile', async () => {
71
+ const retrievedProfile = await storage.getProfile('non-existent-wallet');
72
+ expect(retrievedProfile).to.be.undefined;
73
+ });
74
+ it('should delete a profile', async () => {
75
+ const walletId = 'test-wallet-2';
76
+ const profile = {
77
+ id: walletId,
78
+ username: 'testuser2',
79
+ createdAt: new Date(),
80
+ updatedAt: new Date(),
81
+ };
82
+ await storage.setProfile(walletId, profile);
83
+ await storage.deleteProfile(walletId);
84
+ const retrievedProfile = await storage.getProfile(walletId);
85
+ expect(retrievedProfile).to.be.undefined;
86
+ });
87
+ });
88
+ describe('Settings operations', () => {
89
+ it('should store and retrieve selective transparency settings', async () => {
90
+ const walletId = 'test-wallet-3';
91
+ const settings = {
92
+ id: walletId,
93
+ walletId,
94
+ assetVisibility: {
95
+ showTokenBalances: true,
96
+ showNFTs: false,
97
+ showTransactionHistory: false,
98
+ showAddresses: false,
99
+ },
100
+ tokenVisibilityRules: [],
101
+ nftVisibilityRules: [],
102
+ transactionVisibility: {
103
+ showSenderAddress: false,
104
+ showReceiverAddress: false,
105
+ showAmount: false,
106
+ showMemo: false,
107
+ showTimestamp: true,
108
+ },
109
+ profileVisibility: {
110
+ showUsername: true,
111
+ showProfilePicture: true,
112
+ showBio: true,
113
+ showSocialLinks: true,
114
+ },
115
+ viewingWhitelist: [],
116
+ createdAt: new Date(),
117
+ updatedAt: new Date(),
118
+ };
119
+ await storage.setSettings(walletId, settings);
120
+ const retrievedSettings = await storage.getSettings(walletId);
121
+ expect(retrievedSettings).to.not.be.undefined;
122
+ expect(retrievedSettings?.walletId).to.equal(walletId);
123
+ expect(retrievedSettings?.assetVisibility.showTokenBalances).to.be.true;
124
+ expect(retrievedSettings?.assetVisibility.showNFTs).to.be.false;
125
+ });
126
+ });
127
+ describe('Proof operations', () => {
128
+ it('should store and retrieve visibility proofs', async () => {
129
+ const proofId = 'test-proof-1';
130
+ const proof = {
131
+ id: proofId,
132
+ walletId: 'test-wallet-4',
133
+ requesterId: 'requester-wallet',
134
+ proofType: 'balance',
135
+ assetId: 'ETH',
136
+ proof: 'test-proof-hash',
137
+ isValid: true,
138
+ createdAt: new Date(),
139
+ expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
140
+ };
141
+ await storage.setProof(proofId, proof);
142
+ const retrievedProof = await storage.getProof(proofId);
143
+ expect(retrievedProof).to.not.be.undefined;
144
+ expect(retrievedProof?.id).to.equal(proofId);
145
+ expect(retrievedProof?.walletId).to.equal('test-wallet-4');
146
+ expect(retrievedProof?.proofType).to.equal('balance');
147
+ expect(retrievedProof?.isValid).to.be.true;
148
+ });
149
+ });
150
+ describe('Viewing request operations', () => {
151
+ it('should store and retrieve viewing requests', async () => {
152
+ const requestId = 'test-request-1';
153
+ const request = {
154
+ id: requestId,
155
+ requesterId: 'requester-wallet',
156
+ walletId: 'target-wallet',
157
+ requestType: 'balance',
158
+ message: 'Please share your balance',
159
+ status: 'pending',
160
+ createdAt: new Date(),
161
+ expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
162
+ };
163
+ await storage.setViewingRequest(requestId, request);
164
+ const retrievedRequest = await storage.getViewingRequest(requestId);
165
+ expect(retrievedRequest).to.not.be.undefined;
166
+ expect(retrievedRequest?.id).to.equal(requestId);
167
+ expect(retrievedRequest?.requesterId).to.equal('requester-wallet');
168
+ expect(retrievedRequest?.walletId).to.equal('target-wallet');
169
+ expect(retrievedRequest?.requestType).to.equal('balance');
170
+ expect(retrievedRequest?.status).to.equal('pending');
171
+ });
172
+ });
173
+ });
174
+ //# sourceMappingURL=storage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../../../../src/services/dop/profile/__tests__/storage.test.ts"],"names":[],"mappings":"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","sourcesContent":["import chai from 'chai';\nimport chaiAsPromised from 'chai-as-promised';\nimport { ProfileStorage } from '../storage';\nimport { UserProfile, SelectiveTransparencySettings, VisibilityProof, ViewingRequest } from '../types';\nimport LevelDOWN from 'leveldown';\nimport { rmSync } from 'fs';\nimport type { AbstractLevelDOWN } from 'abstract-leveldown';\n\nchai.use(chaiAsPromised);\nconst { expect } = chai;\n\ndescribe('ProfileStorage', () => {\n let storage: ProfileStorage;\n let db: AbstractLevelDOWN;\n const testDbPath = 'test-profile-db';\n\n beforeEach(async () => {\n db = new LevelDOWN(testDbPath);\n await new Promise<void>((resolve, reject) => {\n db.open((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n storage = new ProfileStorage(db);\n });\n\n afterEach(async () => {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (db && typeof db.close === 'function') {\n await new Promise<void>((resolve, reject) => {\n db.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n }\n try {\n rmSync(testDbPath, { recursive: true, force: true });\n } catch (error) {\n // Ignore cleanup errors\n }\n });\n\n describe('Profile operations', () => {\n it('should store and retrieve a profile', async () => {\n const walletId = 'test-wallet-1';\n const profile: UserProfile = {\n id: walletId,\n username: 'testuser',\n profilePicture: 'https://example.com/avatar.jpg',\n bio: 'Test bio',\n socialLinks: {\n twitter: '@testuser',\n discord: 'testuser#1234',\n },\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await storage.setProfile(walletId, profile);\n const retrievedProfile = await storage.getProfile(walletId);\n\n expect(retrievedProfile).to.not.be.undefined;\n expect(retrievedProfile?.id).to.equal(walletId);\n expect(retrievedProfile?.username).to.equal('testuser');\n expect(retrievedProfile?.bio).to.equal('Test bio');\n });\n\n it('should return undefined for non-existent profile', async () => {\n const retrievedProfile = await storage.getProfile('non-existent-wallet');\n expect(retrievedProfile).to.be.undefined;\n });\n\n it('should delete a profile', async () => {\n const walletId = 'test-wallet-2';\n const profile: UserProfile = {\n id: walletId,\n username: 'testuser2',\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await storage.setProfile(walletId, profile);\n await storage.deleteProfile(walletId);\n \n const retrievedProfile = await storage.getProfile(walletId);\n expect(retrievedProfile).to.be.undefined;\n });\n });\n\n describe('Settings operations', () => {\n it('should store and retrieve selective transparency settings', async () => {\n const walletId = 'test-wallet-3';\n const settings: SelectiveTransparencySettings = {\n id: walletId,\n walletId,\n assetVisibility: {\n showTokenBalances: true,\n showNFTs: false,\n showTransactionHistory: false,\n showAddresses: false,\n },\n tokenVisibilityRules: [],\n nftVisibilityRules: [],\n transactionVisibility: {\n showSenderAddress: false,\n showReceiverAddress: false,\n showAmount: false,\n showMemo: false,\n showTimestamp: true,\n },\n profileVisibility: {\n showUsername: true,\n showProfilePicture: true,\n showBio: true,\n showSocialLinks: true,\n },\n viewingWhitelist: [],\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await storage.setSettings(walletId, settings);\n const retrievedSettings = await storage.getSettings(walletId);\n\n expect(retrievedSettings).to.not.be.undefined;\n expect(retrievedSettings?.walletId).to.equal(walletId);\n expect(retrievedSettings?.assetVisibility.showTokenBalances).to.be.true;\n expect(retrievedSettings?.assetVisibility.showNFTs).to.be.false;\n });\n });\n\n describe('Proof operations', () => {\n it('should store and retrieve visibility proofs', async () => {\n const proofId = 'test-proof-1';\n const proof: VisibilityProof = {\n id: proofId,\n walletId: 'test-wallet-4',\n requesterId: 'requester-wallet',\n proofType: 'balance',\n assetId: 'ETH',\n proof: 'test-proof-hash',\n isValid: true,\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),\n };\n\n await storage.setProof(proofId, proof);\n const retrievedProof = await storage.getProof(proofId);\n\n expect(retrievedProof).to.not.be.undefined;\n expect(retrievedProof?.id).to.equal(proofId);\n expect(retrievedProof?.walletId).to.equal('test-wallet-4');\n expect(retrievedProof?.proofType).to.equal('balance');\n expect(retrievedProof?.isValid).to.be.true;\n });\n });\n\n describe('Viewing request operations', () => {\n it('should store and retrieve viewing requests', async () => {\n const requestId = 'test-request-1';\n const request: ViewingRequest = {\n id: requestId,\n requesterId: 'requester-wallet',\n walletId: 'target-wallet',\n requestType: 'balance',\n message: 'Please share your balance',\n status: 'pending',\n createdAt: new Date(),\n expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),\n };\n\n await storage.setViewingRequest(requestId, request);\n const retrievedRequest = await storage.getViewingRequest(requestId);\n\n expect(retrievedRequest).to.not.be.undefined;\n expect(retrievedRequest?.id).to.equal(requestId);\n expect(retrievedRequest?.requesterId).to.equal('requester-wallet');\n expect(retrievedRequest?.walletId).to.equal('target-wallet');\n expect(retrievedRequest?.requestType).to.equal('balance');\n expect(retrievedRequest?.status).to.equal('pending');\n });\n });\n});\n"]}
@@ -0,0 +1,3 @@
1
+ export * from './profile-manager';
2
+ export * from './selective-transparency';
3
+ export * from './types';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./profile-manager"), exports);
18
+ __exportStar(require("./selective-transparency"), exports);
19
+ __exportStar(require("./types"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/dop/profile/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC;AACzC,0CAAwB","sourcesContent":["export * from './profile-manager';\nexport * from './selective-transparency';\nexport * from './types';\n"]}
@@ -0,0 +1,32 @@
1
+ import { UserProfile, ProfileCustomization, SelectiveTransparencyCallback } from './types';
2
+ import { ProfileStorage } from './storage';
3
+ export declare const setSelectiveTransparencyCallback: (callback?: SelectiveTransparencyCallback) => void;
4
+ declare class ProfileManager {
5
+ private profileStorage;
6
+ private get storage();
7
+ setStorage(storage: ProfileStorage): void;
8
+ createProfile(walletId: string, profileData: Partial<UserProfile>): Promise<UserProfile>;
9
+ updateProfile(walletId: string, updates: Partial<UserProfile>): Promise<UserProfile>;
10
+ getProfile(walletId: string): Promise<Optional<UserProfile>>;
11
+ deleteProfile(walletId: string): Promise<void>;
12
+ setCustomization(walletId: string, customization: ProfileCustomization): Promise<void>;
13
+ getCustomization(walletId: string): Promise<Optional<ProfileCustomization>>;
14
+ static validateUsername(username: string): boolean;
15
+ static validateProfilePicture(profilePicture: string): boolean;
16
+ searchProfiles(_query: string): Promise<UserProfile[]>;
17
+ exportProfile(walletId: string): Promise<string>;
18
+ importProfile(walletId: string, data: string): Promise<UserProfile>;
19
+ }
20
+ declare const profileManager: ProfileManager;
21
+ export { profileManager, ProfileManager, };
22
+ export declare const createProfile: (walletId: string, profileData: Partial<UserProfile>) => Promise<UserProfile>;
23
+ export declare const updateProfile: (walletId: string, updates: Partial<UserProfile>) => Promise<UserProfile>;
24
+ export declare const getProfile: (walletId: string) => Promise<Optional<UserProfile>>;
25
+ export declare const deleteProfile: (walletId: string) => Promise<void>;
26
+ export declare const setCustomization: (walletId: string, customization: ProfileCustomization) => Promise<void>;
27
+ export declare const getCustomization: (walletId: string) => Promise<Optional<ProfileCustomization>>;
28
+ export declare const validateUsername: (username: string) => boolean;
29
+ export declare const validateProfilePicture: (profilePicture: string) => boolean;
30
+ export declare const searchProfiles: (query: string) => Promise<UserProfile[]>;
31
+ export declare const exportProfile: (walletId: string) => Promise<string>;
32
+ export declare const importProfile: (walletId: string, data: string) => Promise<UserProfile>;
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importProfile = exports.exportProfile = exports.searchProfiles = exports.validateProfilePicture = exports.validateUsername = exports.getCustomization = exports.setCustomization = exports.deleteProfile = exports.getProfile = exports.updateProfile = exports.createProfile = exports.ProfileManager = exports.profileManager = exports.setSelectiveTransparencyCallback = void 0;
4
+ const error_1 = require("../../../utils/error");
5
+ const storage_1 = require("./storage");
6
+ let eventCallback;
7
+ const setSelectiveTransparencyCallback = (callback) => {
8
+ eventCallback = callback;
9
+ };
10
+ exports.setSelectiveTransparencyCallback = setSelectiveTransparencyCallback;
11
+ const emitEvent = (event) => {
12
+ if (eventCallback) {
13
+ eventCallback(event);
14
+ }
15
+ };
16
+ class ProfileManager {
17
+ profileStorage;
18
+ get storage() {
19
+ if (!this.profileStorage) {
20
+ this.profileStorage = (0, storage_1.getProfileStorage)();
21
+ }
22
+ return this.profileStorage;
23
+ }
24
+ // For testing: allow injection of storage
25
+ setStorage(storage) {
26
+ this.profileStorage = storage;
27
+ }
28
+ // Profile management
29
+ async createProfile(walletId, profileData) {
30
+ try {
31
+ // Validate profile data
32
+ if (profileData.username !== undefined && profileData.username !== null && !ProfileManager.validateUsername(profileData.username)) {
33
+ throw new Error('Invalid username');
34
+ }
35
+ if (profileData.bio !== undefined && profileData.bio !== null && profileData.bio.length > 500) {
36
+ throw new Error('Bio too long');
37
+ }
38
+ if (profileData.profilePicture !== undefined && profileData.profilePicture !== null && !ProfileManager.validateProfilePicture(profileData.profilePicture)) {
39
+ throw new Error('Invalid profile picture URL');
40
+ }
41
+ const profile = {
42
+ id: walletId,
43
+ username: profileData.username,
44
+ profilePicture: profileData.profilePicture,
45
+ bio: profileData.bio,
46
+ socialLinks: profileData.socialLinks,
47
+ createdAt: new Date(),
48
+ updatedAt: new Date(),
49
+ };
50
+ await this.storage.setProfile(walletId, profile);
51
+ emitEvent({
52
+ type: 'profile_updated',
53
+ data: { walletId, profile }
54
+ });
55
+ return profile;
56
+ }
57
+ catch (err) {
58
+ throw (0, error_1.reportAndSanitizeError)('createProfile', err);
59
+ }
60
+ }
61
+ async updateProfile(walletId, updates) {
62
+ try {
63
+ const existingProfile = await this.storage.getProfile(walletId);
64
+ if (!existingProfile) {
65
+ throw new Error('Profile not found');
66
+ }
67
+ const updatedProfile = {
68
+ ...existingProfile,
69
+ ...updates,
70
+ updatedAt: new Date(),
71
+ };
72
+ await this.storage.setProfile(walletId, updatedProfile);
73
+ emitEvent({
74
+ type: 'profile_updated',
75
+ data: { walletId, profile: updatedProfile }
76
+ });
77
+ return updatedProfile;
78
+ }
79
+ catch (err) {
80
+ throw (0, error_1.reportAndSanitizeError)('updateProfile', err);
81
+ }
82
+ }
83
+ async getProfile(walletId) {
84
+ try {
85
+ return await this.storage.getProfile(walletId);
86
+ }
87
+ catch (err) {
88
+ throw (0, error_1.reportAndSanitizeError)('getProfile', err);
89
+ }
90
+ }
91
+ async deleteProfile(walletId) {
92
+ try {
93
+ const existingProfile = await this.storage.getProfile(walletId);
94
+ if (!existingProfile) {
95
+ throw new Error('Profile not found');
96
+ }
97
+ await this.storage.deleteProfile(walletId);
98
+ emitEvent({
99
+ type: 'profile_updated',
100
+ data: { walletId, deleted: true }
101
+ });
102
+ }
103
+ catch (err) {
104
+ throw (0, error_1.reportAndSanitizeError)('deleteProfile', err);
105
+ }
106
+ }
107
+ // Profile customization
108
+ async setCustomization(walletId, customization) {
109
+ try {
110
+ // For now, store customization as part of profile
111
+ const profile = await this.storage.getProfile(walletId);
112
+ if (!profile) {
113
+ throw new Error('Profile not found');
114
+ }
115
+ const updatedProfile = {
116
+ ...profile,
117
+ customization,
118
+ updatedAt: new Date(),
119
+ };
120
+ await this.storage.setProfile(walletId, updatedProfile);
121
+ emitEvent({
122
+ type: 'settings_changed',
123
+ data: { walletId, customization }
124
+ });
125
+ }
126
+ catch (err) {
127
+ throw (0, error_1.reportAndSanitizeError)('setCustomization', err);
128
+ }
129
+ }
130
+ async getCustomization(walletId) {
131
+ try {
132
+ const profile = await this.storage.getProfile(walletId);
133
+ return profile?.customization;
134
+ }
135
+ catch (err) {
136
+ throw (0, error_1.reportAndSanitizeError)('getCustomization', err);
137
+ }
138
+ }
139
+ // Profile validation
140
+ static validateUsername(username) {
141
+ if (!username || username.length < 3 || username.length > 32) {
142
+ return false;
143
+ }
144
+ // Allow alphanumeric characters, underscores, and hyphens
145
+ const usernameRegex = /^[a-zA-Z0-9_-]+$/;
146
+ return usernameRegex.test(username);
147
+ }
148
+ static validateProfilePicture(profilePicture) {
149
+ if (!profilePicture) {
150
+ return true; // Optional field
151
+ }
152
+ // Basic URL validation
153
+ try {
154
+ // eslint-disable-next-line no-new
155
+ new URL(profilePicture);
156
+ return true;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ // Search profiles - simplified for now
163
+ async searchProfiles(_query) {
164
+ try {
165
+ // For now, return empty array
166
+ // In a full implementation, you'd iterate through all profiles in the database
167
+ return [];
168
+ }
169
+ catch (err) {
170
+ throw (0, error_1.reportAndSanitizeError)('searchProfiles', err);
171
+ }
172
+ }
173
+ // Export/import profiles - simplified for now
174
+ async exportProfile(walletId) {
175
+ try {
176
+ const profile = await this.storage.getProfile(walletId);
177
+ if (!profile) {
178
+ throw new Error('Profile not found');
179
+ }
180
+ return JSON.stringify({ profile });
181
+ }
182
+ catch (err) {
183
+ throw (0, error_1.reportAndSanitizeError)('exportProfile', err);
184
+ }
185
+ }
186
+ async importProfile(walletId, data) {
187
+ try {
188
+ const parsed = JSON.parse(data);
189
+ const { profile } = parsed;
190
+ if (profile === undefined || profile === null || typeof profile !== 'object' || !('id' in profile)) {
191
+ throw new Error('Invalid profile data');
192
+ }
193
+ // Update IDs to match current wallet
194
+ profile.id = walletId;
195
+ profile.updatedAt = new Date();
196
+ await this.storage.setProfile(walletId, profile);
197
+ emitEvent({
198
+ type: 'profile_updated',
199
+ data: { walletId, profile }
200
+ });
201
+ return profile;
202
+ }
203
+ catch (err) {
204
+ throw (0, error_1.reportAndSanitizeError)('importProfile', err);
205
+ }
206
+ }
207
+ }
208
+ exports.ProfileManager = ProfileManager;
209
+ // Singleton instance
210
+ const profileManager = new ProfileManager();
211
+ exports.profileManager = profileManager;
212
+ // Export convenience functions
213
+ const createProfile = (walletId, profileData) => profileManager.createProfile(walletId, profileData);
214
+ exports.createProfile = createProfile;
215
+ const updateProfile = (walletId, updates) => profileManager.updateProfile(walletId, updates);
216
+ exports.updateProfile = updateProfile;
217
+ const getProfile = (walletId) => profileManager.getProfile(walletId);
218
+ exports.getProfile = getProfile;
219
+ const deleteProfile = (walletId) => profileManager.deleteProfile(walletId);
220
+ exports.deleteProfile = deleteProfile;
221
+ const setCustomization = (walletId, customization) => profileManager.setCustomization(walletId, customization);
222
+ exports.setCustomization = setCustomization;
223
+ const getCustomization = (walletId) => profileManager.getCustomization(walletId);
224
+ exports.getCustomization = getCustomization;
225
+ const validateUsername = (username) => ProfileManager.validateUsername(username);
226
+ exports.validateUsername = validateUsername;
227
+ const validateProfilePicture = (profilePicture) => ProfileManager.validateProfilePicture(profilePicture);
228
+ exports.validateProfilePicture = validateProfilePicture;
229
+ const searchProfiles = (query) => profileManager.searchProfiles(query);
230
+ exports.searchProfiles = searchProfiles;
231
+ const exportProfile = (walletId) => profileManager.exportProfile(walletId);
232
+ exports.exportProfile = exportProfile;
233
+ const importProfile = (walletId, data) => profileManager.importProfile(walletId, data);
234
+ exports.importProfile = importProfile;
235
+ //# sourceMappingURL=profile-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-manager.js","sourceRoot":"","sources":["../../../../src/services/dop/profile/profile-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\nimport { \n UserProfile,\n ProfileCustomization,\n SelectiveTransparencyEvent,\n SelectiveTransparencyCallback\n} from './types';\nimport { reportAndSanitizeError } from '../../../utils/error';\nimport { getProfileStorage, ProfileStorage } from './storage';\n\nlet eventCallback: Optional<SelectiveTransparencyCallback>;\n\nexport const setSelectiveTransparencyCallback = (\n callback?: SelectiveTransparencyCallback,\n) => {\n eventCallback = callback;\n};\n\nconst emitEvent = (event: SelectiveTransparencyEvent) => {\n if (eventCallback) {\n eventCallback(event);\n }\n};\n\nclass ProfileManager {\n private profileStorage: Optional<ProfileStorage>;\n \n private get storage(): ProfileStorage {\n if (!this.profileStorage) {\n this.profileStorage = getProfileStorage();\n }\n return this.profileStorage;\n }\n\n // For testing: allow injection of storage\n setStorage(storage: ProfileStorage) {\n this.profileStorage = storage;\n }\n\n // Profile management\n async createProfile(\n walletId: string,\n profileData: Partial<UserProfile>\n ): Promise<UserProfile> {\n try {\n // Validate profile data\n if (profileData.username !== undefined && profileData.username !== null && !ProfileManager.validateUsername(profileData.username)) {\n throw new Error('Invalid username');\n }\n\n if (profileData.bio !== undefined && profileData.bio !== null && profileData.bio.length > 500) {\n throw new Error('Bio too long');\n }\n\n if (profileData.profilePicture !== undefined && profileData.profilePicture !== null && !ProfileManager.validateProfilePicture(profileData.profilePicture)) {\n throw new Error('Invalid profile picture URL');\n }\n\n const profile: UserProfile = {\n id: walletId,\n username: profileData.username,\n profilePicture: profileData.profilePicture,\n bio: profileData.bio,\n socialLinks: profileData.socialLinks,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n await this.storage.setProfile(walletId, profile);\n \n emitEvent({\n type: 'profile_updated',\n data: { walletId, profile }\n });\n\n return profile;\n } catch (err) {\n throw reportAndSanitizeError('createProfile', err);\n }\n }\n\n async updateProfile(\n walletId: string,\n updates: Partial<UserProfile>\n ): Promise<UserProfile> {\n try {\n const existingProfile = await this.storage.getProfile(walletId);\n if (!existingProfile) {\n throw new Error('Profile not found');\n }\n\n const updatedProfile: UserProfile = {\n ...existingProfile,\n ...updates,\n updatedAt: new Date(),\n };\n\n await this.storage.setProfile(walletId, updatedProfile);\n \n emitEvent({\n type: 'profile_updated',\n data: { walletId, profile: updatedProfile }\n });\n\n return updatedProfile;\n } catch (err) {\n throw reportAndSanitizeError('updateProfile', err);\n }\n }\n\n async getProfile(walletId: string): Promise<Optional<UserProfile>> {\n try {\n return await this.storage.getProfile(walletId);\n } catch (err) {\n throw reportAndSanitizeError('getProfile', err);\n }\n }\n\n async deleteProfile(walletId: string): Promise<void> {\n try {\n const existingProfile = await this.storage.getProfile(walletId);\n if (!existingProfile) {\n throw new Error('Profile not found');\n }\n\n await this.storage.deleteProfile(walletId);\n\n emitEvent({\n type: 'profile_updated',\n data: { walletId, deleted: true }\n });\n } catch (err) {\n throw reportAndSanitizeError('deleteProfile', err);\n }\n }\n\n // Profile customization\n async setCustomization(\n walletId: string,\n customization: ProfileCustomization\n ): Promise<void> {\n try {\n // For now, store customization as part of profile\n const profile = await this.storage.getProfile(walletId);\n if (!profile) {\n throw new Error('Profile not found');\n }\n\n const updatedProfile = {\n ...profile,\n customization,\n updatedAt: new Date(),\n };\n\n await this.storage.setProfile(walletId, updatedProfile);\n \n emitEvent({\n type: 'settings_changed',\n data: { walletId, customization }\n });\n } catch (err) {\n throw reportAndSanitizeError('setCustomization', err);\n }\n }\n\n async getCustomization(walletId: string): Promise<Optional<ProfileCustomization>> {\n try {\n const profile = await this.storage.getProfile(walletId);\n return profile?.customization;\n } catch (err) {\n throw reportAndSanitizeError('getCustomization', err);\n }\n }\n\n // Profile validation\n public static validateUsername(username: string): boolean {\n if (!username || username.length < 3 || username.length > 32) {\n return false;\n }\n \n // Allow alphanumeric characters, underscores, and hyphens\n const usernameRegex = /^[a-zA-Z0-9_-]+$/;\n return usernameRegex.test(username);\n }\n\n public static validateProfilePicture(profilePicture: string): boolean {\n if (!profilePicture) {\n return true; // Optional field\n }\n \n // Basic URL validation\n try {\n // eslint-disable-next-line no-new\n new URL(profilePicture);\n return true;\n } catch {\n return false;\n }\n }\n\n // Search profiles - simplified for now\n async searchProfiles(_query: string): Promise<UserProfile[]> {\n try {\n // For now, return empty array\n // In a full implementation, you'd iterate through all profiles in the database\n return [];\n } catch (err) {\n throw reportAndSanitizeError('searchProfiles', err);\n }\n }\n\n // Export/import profiles - simplified for now\n async exportProfile(walletId: string): Promise<string> {\n try {\n const profile = await this.storage.getProfile(walletId);\n \n if (!profile) {\n throw new Error('Profile not found');\n }\n\n return JSON.stringify({ profile });\n } catch (err) {\n throw reportAndSanitizeError('exportProfile', err);\n }\n }\n\n async importProfile(walletId: string, data: string): Promise<UserProfile> {\n try {\n const parsed = JSON.parse(data);\n const { profile } = parsed;\n\n if (profile === undefined || profile === null || typeof profile !== 'object' || !('id' in profile)) {\n throw new Error('Invalid profile data');\n }\n\n // Update IDs to match current wallet\n profile.id = walletId;\n profile.updatedAt = new Date();\n\n await this.storage.setProfile(walletId, profile as UserProfile);\n\n emitEvent({\n type: 'profile_updated',\n data: { walletId, profile }\n });\n\n return profile;\n } catch (err) {\n throw reportAndSanitizeError('importProfile', err);\n }\n }\n}\n\n// Singleton instance\nconst profileManager = new ProfileManager();\n\nexport {\n profileManager,\n ProfileManager,\n};\n\n// Export convenience functions\nexport const createProfile = (walletId: string, profileData: Partial<UserProfile>) =>\n profileManager.createProfile(walletId, profileData);\n\nexport const updateProfile = (walletId: string, updates: Partial<UserProfile>) =>\n profileManager.updateProfile(walletId, updates);\n\nexport const getProfile = (walletId: string) =>\n profileManager.getProfile(walletId);\n\nexport const deleteProfile = (walletId: string) =>\n profileManager.deleteProfile(walletId);\n\nexport const setCustomization = (walletId: string, customization: ProfileCustomization) =>\n profileManager.setCustomization(walletId, customization);\n\nexport const getCustomization = (walletId: string) =>\n profileManager.getCustomization(walletId);\n\nexport const validateUsername = (username: string) =>\n ProfileManager.validateUsername(username);\n\nexport const validateProfilePicture = (profilePicture: string) =>\n ProfileManager.validateProfilePicture(profilePicture);\n\nexport const searchProfiles = (query: string) =>\n profileManager.searchProfiles(query);\n\nexport const exportProfile = (walletId: string) =>\n profileManager.exportProfile(walletId);\n\nexport const importProfile = (walletId: string, data: string) =>\n profileManager.importProfile(walletId, data);\n"]}