@bopen-io/wallet-toolbox 1.7.18

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 (390) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.template +22 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  4. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  5. package/.github/pull_request_template.md +22 -0
  6. package/.github/workflows/push.yaml +145 -0
  7. package/.prettierrc +10 -0
  8. package/CHANGELOG.md +280 -0
  9. package/CONTRIBUTING.md +89 -0
  10. package/README.md +43 -0
  11. package/docs/README.md +85 -0
  12. package/docs/client.md +19627 -0
  13. package/docs/monitor.md +953 -0
  14. package/docs/open-rpc/index.html +46 -0
  15. package/docs/services.md +6377 -0
  16. package/docs/setup.md +1268 -0
  17. package/docs/storage.md +5367 -0
  18. package/docs/wallet.md +19626 -0
  19. package/jest.config.ts +25 -0
  20. package/license.md +28 -0
  21. package/out/tsconfig.all.tsbuildinfo +1 -0
  22. package/package.json +63 -0
  23. package/src/CWIStyleWalletManager.ts +1999 -0
  24. package/src/Setup.ts +579 -0
  25. package/src/SetupClient.ts +322 -0
  26. package/src/SetupWallet.ts +108 -0
  27. package/src/SimpleWalletManager.ts +526 -0
  28. package/src/Wallet.ts +1169 -0
  29. package/src/WalletAuthenticationManager.ts +153 -0
  30. package/src/WalletLogger.ts +213 -0
  31. package/src/WalletPermissionsManager.ts +3660 -0
  32. package/src/WalletSettingsManager.ts +114 -0
  33. package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  34. package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  35. package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
  36. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  37. package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
  38. package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
  39. package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
  40. package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
  41. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  42. package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
  43. package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
  44. package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
  45. package/src/index.all.ts +27 -0
  46. package/src/index.client.ts +25 -0
  47. package/src/index.mobile.ts +21 -0
  48. package/src/index.ts +1 -0
  49. package/src/monitor/Monitor.ts +412 -0
  50. package/src/monitor/MonitorDaemon.ts +188 -0
  51. package/src/monitor/README.md +3 -0
  52. package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
  53. package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
  54. package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
  55. package/src/monitor/tasks/TaskClock.ts +33 -0
  56. package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
  57. package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
  58. package/src/monitor/tasks/TaskNewHeader.ts +93 -0
  59. package/src/monitor/tasks/TaskPurge.ts +68 -0
  60. package/src/monitor/tasks/TaskReorg.ts +89 -0
  61. package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
  62. package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
  63. package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
  64. package/src/monitor/tasks/TaskUnFail.ts +151 -0
  65. package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
  66. package/src/sdk/CertOpsWallet.ts +18 -0
  67. package/src/sdk/PrivilegedKeyManager.ts +372 -0
  68. package/src/sdk/README.md +13 -0
  69. package/src/sdk/WERR_errors.ts +234 -0
  70. package/src/sdk/WalletError.ts +170 -0
  71. package/src/sdk/WalletErrorFromJson.ts +80 -0
  72. package/src/sdk/WalletServices.interfaces.ts +700 -0
  73. package/src/sdk/WalletSigner.interfaces.ts +11 -0
  74. package/src/sdk/WalletStorage.interfaces.ts +606 -0
  75. package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
  76. package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
  77. package/src/sdk/__test/WalletError.test.ts +318 -0
  78. package/src/sdk/__test/validationHelpers.test.ts +21 -0
  79. package/src/sdk/index.ts +10 -0
  80. package/src/sdk/types.ts +226 -0
  81. package/src/services/README.md +11 -0
  82. package/src/services/ServiceCollection.ts +248 -0
  83. package/src/services/Services.ts +603 -0
  84. package/src/services/__tests/ARC.man.test.ts +123 -0
  85. package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
  86. package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
  87. package/src/services/__tests/arcServices.test.ts +8 -0
  88. package/src/services/__tests/bitrails.test.ts +56 -0
  89. package/src/services/__tests/getMerklePath.test.ts +15 -0
  90. package/src/services/__tests/getRawTx.test.ts +13 -0
  91. package/src/services/__tests/postBeef.test.ts +104 -0
  92. package/src/services/__tests/verifyBeef.test.ts +50 -0
  93. package/src/services/chaintracker/BHServiceClient.ts +212 -0
  94. package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
  95. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
  96. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
  97. package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
  98. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
  99. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
  100. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
  101. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
  102. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
  103. package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
  104. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
  105. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
  106. package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
  107. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
  108. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
  109. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
  110. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
  111. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
  112. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
  113. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
  114. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
  115. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
  116. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
  117. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
  118. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
  119. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
  120. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
  121. package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
  122. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
  123. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
  124. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
  125. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
  126. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
  127. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
  128. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
  129. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
  130. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
  131. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
  132. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
  133. package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
  134. package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
  135. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
  136. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
  137. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
  138. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
  139. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
  140. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
  141. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
  142. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
  143. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
  144. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
  145. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
  146. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
  147. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
  148. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
  149. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
  150. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
  151. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
  152. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
  153. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
  154. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
  155. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
  156. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
  157. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
  158. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
  159. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
  160. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
  161. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
  162. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
  163. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
  164. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
  165. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
  166. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
  167. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
  168. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
  169. package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
  170. package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
  171. package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
  172. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
  173. package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
  174. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
  175. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
  176. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
  177. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
  178. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
  179. package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
  180. package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
  181. package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
  182. package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
  183. package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
  184. package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
  185. package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
  186. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
  187. package/src/services/chaintracker/index.all.ts +4 -0
  188. package/src/services/chaintracker/index.client.ts +4 -0
  189. package/src/services/chaintracker/index.mobile.ts +4 -0
  190. package/src/services/createDefaultWalletServicesOptions.ts +77 -0
  191. package/src/services/index.ts +1 -0
  192. package/src/services/processingErrors/arcSuccessError.json +76 -0
  193. package/src/services/providers/ARC.ts +350 -0
  194. package/src/services/providers/Bitails.ts +256 -0
  195. package/src/services/providers/SdkWhatsOnChain.ts +83 -0
  196. package/src/services/providers/WhatsOnChain.ts +883 -0
  197. package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
  198. package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
  199. package/src/services/providers/exchangeRates.ts +265 -0
  200. package/src/services/providers/getBeefForTxid.ts +369 -0
  201. package/src/signer/README.md +5 -0
  202. package/src/signer/WalletSigner.ts +17 -0
  203. package/src/signer/methods/acquireDirectCertificate.ts +52 -0
  204. package/src/signer/methods/buildSignableTransaction.ts +183 -0
  205. package/src/signer/methods/completeSignedTransaction.ts +117 -0
  206. package/src/signer/methods/createAction.ts +172 -0
  207. package/src/signer/methods/internalizeAction.ts +106 -0
  208. package/src/signer/methods/proveCertificate.ts +43 -0
  209. package/src/signer/methods/signAction.ts +54 -0
  210. package/src/storage/README.md +14 -0
  211. package/src/storage/StorageIdb.ts +2304 -0
  212. package/src/storage/StorageKnex.ts +1425 -0
  213. package/src/storage/StorageProvider.ts +810 -0
  214. package/src/storage/StorageReader.ts +194 -0
  215. package/src/storage/StorageReaderWriter.ts +432 -0
  216. package/src/storage/StorageSyncReader.ts +34 -0
  217. package/src/storage/WalletStorageManager.ts +943 -0
  218. package/src/storage/__test/StorageIdb.test.ts +43 -0
  219. package/src/storage/__test/WalletStorageManager.test.ts +275 -0
  220. package/src/storage/__test/adminStats.man.test.ts +89 -0
  221. package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
  222. package/src/storage/index.all.ts +11 -0
  223. package/src/storage/index.client.ts +7 -0
  224. package/src/storage/index.mobile.ts +6 -0
  225. package/src/storage/methods/ListActionsSpecOp.ts +70 -0
  226. package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
  227. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
  228. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
  229. package/src/storage/methods/__test/offsetKey.test.ts +274 -0
  230. package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
  231. package/src/storage/methods/createAction.ts +947 -0
  232. package/src/storage/methods/generateChange.ts +556 -0
  233. package/src/storage/methods/getBeefForTransaction.ts +139 -0
  234. package/src/storage/methods/getSyncChunk.ts +293 -0
  235. package/src/storage/methods/internalizeAction.ts +562 -0
  236. package/src/storage/methods/listActionsIdb.ts +183 -0
  237. package/src/storage/methods/listActionsKnex.ts +226 -0
  238. package/src/storage/methods/listCertificates.ts +73 -0
  239. package/src/storage/methods/listOutputsIdb.ts +203 -0
  240. package/src/storage/methods/listOutputsKnex.ts +263 -0
  241. package/src/storage/methods/offsetKey.ts +89 -0
  242. package/src/storage/methods/processAction.ts +420 -0
  243. package/src/storage/methods/purgeData.ts +251 -0
  244. package/src/storage/methods/purgeDataIdb.ts +10 -0
  245. package/src/storage/methods/reviewStatus.ts +101 -0
  246. package/src/storage/methods/reviewStatusIdb.ts +43 -0
  247. package/src/storage/methods/utils.Buffer.ts +33 -0
  248. package/src/storage/methods/utils.ts +56 -0
  249. package/src/storage/remoting/StorageClient.ts +567 -0
  250. package/src/storage/remoting/StorageMobile.ts +544 -0
  251. package/src/storage/remoting/StorageServer.ts +291 -0
  252. package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
  253. package/src/storage/schema/KnexMigrations.ts +489 -0
  254. package/src/storage/schema/StorageIdbSchema.ts +150 -0
  255. package/src/storage/schema/entities/EntityBase.ts +210 -0
  256. package/src/storage/schema/entities/EntityCertificate.ts +188 -0
  257. package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
  258. package/src/storage/schema/entities/EntityCommission.ts +148 -0
  259. package/src/storage/schema/entities/EntityOutput.ts +290 -0
  260. package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
  261. package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
  262. package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
  263. package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
  264. package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
  265. package/src/storage/schema/entities/EntitySyncState.ts +389 -0
  266. package/src/storage/schema/entities/EntityTransaction.ts +306 -0
  267. package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
  268. package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
  269. package/src/storage/schema/entities/EntityUser.ts +112 -0
  270. package/src/storage/schema/entities/MergeEntity.ts +73 -0
  271. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
  272. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
  273. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
  274. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
  275. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
  276. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
  277. package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
  278. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
  279. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
  280. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
  281. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
  282. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
  283. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
  284. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
  285. package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
  286. package/src/storage/schema/entities/index.ts +16 -0
  287. package/src/storage/schema/tables/TableCertificate.ts +21 -0
  288. package/src/storage/schema/tables/TableCertificateField.ts +12 -0
  289. package/src/storage/schema/tables/TableCommission.ts +13 -0
  290. package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
  291. package/src/storage/schema/tables/TableOutput.ts +64 -0
  292. package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
  293. package/src/storage/schema/tables/TableOutputTag.ts +10 -0
  294. package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
  295. package/src/storage/schema/tables/TableProvenTx.ts +14 -0
  296. package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
  297. package/src/storage/schema/tables/TableSettings.ts +17 -0
  298. package/src/storage/schema/tables/TableSyncState.ts +18 -0
  299. package/src/storage/schema/tables/TableTransaction.ts +54 -0
  300. package/src/storage/schema/tables/TableTxLabel.ts +10 -0
  301. package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
  302. package/src/storage/schema/tables/TableUser.ts +16 -0
  303. package/src/storage/schema/tables/index.ts +16 -0
  304. package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
  305. package/src/storage/sync/index.ts +1 -0
  306. package/src/utility/Format.ts +133 -0
  307. package/src/utility/README.md +3 -0
  308. package/src/utility/ReaderUint8Array.ts +187 -0
  309. package/src/utility/ScriptTemplateBRC29.ts +73 -0
  310. package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
  311. package/src/utility/aggregateResults.ts +68 -0
  312. package/src/utility/identityUtils.ts +159 -0
  313. package/src/utility/index.all.ts +7 -0
  314. package/src/utility/index.client.ts +7 -0
  315. package/src/utility/parseTxScriptOffsets.ts +29 -0
  316. package/src/utility/stampLog.ts +69 -0
  317. package/src/utility/tscProofToMerklePath.ts +48 -0
  318. package/src/utility/utilityHelpers.buffer.ts +34 -0
  319. package/src/utility/utilityHelpers.noBuffer.ts +60 -0
  320. package/src/utility/utilityHelpers.ts +275 -0
  321. package/src/wab-client/WABClient.ts +94 -0
  322. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  323. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  324. package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
  325. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  326. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  327. package/syncVersions.js +71 -0
  328. package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
  329. package/test/Wallet/action/abortAction.test.ts +47 -0
  330. package/test/Wallet/action/createAction.test.ts +299 -0
  331. package/test/Wallet/action/createAction2.test.ts +1273 -0
  332. package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
  333. package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
  334. package/test/Wallet/action/internalizeAction.test.ts +682 -0
  335. package/test/Wallet/action/relinquishOutput.test.ts +37 -0
  336. package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
  337. package/test/Wallet/certificate/listCertificates.test.ts +346 -0
  338. package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
  339. package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
  340. package/test/Wallet/get/getHeight.test.ts +52 -0
  341. package/test/Wallet/get/getKnownTxids.test.ts +86 -0
  342. package/test/Wallet/get/getNetwork.test.ts +27 -0
  343. package/test/Wallet/get/getVersion.test.ts +27 -0
  344. package/test/Wallet/list/listActions.test.ts +279 -0
  345. package/test/Wallet/list/listActions2.test.ts +1381 -0
  346. package/test/Wallet/list/listCertificates.test.ts +118 -0
  347. package/test/Wallet/list/listOutputs.test.ts +447 -0
  348. package/test/Wallet/live/walletLive.man.test.ts +521 -0
  349. package/test/Wallet/local/localWallet.man.test.ts +93 -0
  350. package/test/Wallet/local/localWallet2.man.test.ts +277 -0
  351. package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
  352. package/test/Wallet/specOps/specOps.man.test.ts +220 -0
  353. package/test/Wallet/support/janitor.man.test.ts +40 -0
  354. package/test/Wallet/support/operations.man.test.ts +407 -0
  355. package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
  356. package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
  357. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
  358. package/test/Wallet/sync/setActive.test.ts +170 -0
  359. package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
  360. package/test/WalletClient/WERR.man.test.ts +35 -0
  361. package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
  362. package/test/checkDB.ts +57 -0
  363. package/test/checkdb +0 -0
  364. package/test/examples/backup.man.test.ts +59 -0
  365. package/test/examples/pushdrop.test.ts +282 -0
  366. package/test/monitor/Monitor.test.ts +620 -0
  367. package/test/services/Services.test.ts +263 -0
  368. package/test/storage/KnexMigrations.test.ts +86 -0
  369. package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
  370. package/test/storage/count.test.ts +177 -0
  371. package/test/storage/find.test.ts +195 -0
  372. package/test/storage/findLegacy.test.ts +67 -0
  373. package/test/storage/idb/allocateChange.test.ts +251 -0
  374. package/test/storage/idb/count.test.ts +158 -0
  375. package/test/storage/idb/find.test.ts +177 -0
  376. package/test/storage/idb/idbSpeed.test.ts +36 -0
  377. package/test/storage/idb/insert.test.ts +268 -0
  378. package/test/storage/idb/transactionAbort.test.ts +108 -0
  379. package/test/storage/idb/update.test.ts +999 -0
  380. package/test/storage/insert.test.ts +278 -0
  381. package/test/storage/update.test.ts +1021 -0
  382. package/test/storage/update2.test.ts +897 -0
  383. package/test/utils/TestUtilsWalletStorage.ts +2526 -0
  384. package/test/utils/localWalletMethods.ts +363 -0
  385. package/test/utils/removeFailedFromDatabase.sql +17 -0
  386. package/ts2md.json +44 -0
  387. package/tsconfig.all.json +31 -0
  388. package/tsconfig.client.json +29 -0
  389. package/tsconfig.json +17 -0
  390. package/tsconfig.mobile.json +28 -0
@@ -0,0 +1,304 @@
1
+ import { Knex, knex as makeKnex } from 'knex'
2
+ import { ChaintracksStorageKnex } from '../../Storage/ChaintracksStorageKnex'
3
+ import { deserializeBlockHeaders } from '../blockHeaderUtilities'
4
+ import { BulkFileDataManager } from '../BulkFileDataManager'
5
+ import { BulkHeaderFileInfo } from '../BulkHeaderFile'
6
+ import { ChaintracksFs } from '../ChaintracksFs'
7
+ import { LocalCdnServer } from '../../__tests/LocalCdnServer'
8
+ import { Chain } from '../../../../../sdk/types'
9
+ import { BlockHeader } from '../../../../../sdk/WalletServices.interfaces'
10
+
11
+ const runSlowTests = false
12
+
13
+ describe('BulkFileDataManager tests', () => {
14
+ jest.setTimeout(99999999)
15
+
16
+ const chain: Chain = 'main'
17
+ const fs = ChaintracksFs
18
+ const rootFolder = './src/services/chaintracker/chaintracks/__tests/data'
19
+ let headers300_399: BlockHeader[] = []
20
+ let headers400_499: BlockHeader[] = []
21
+ let server349: LocalCdnServer | undefined
22
+ let server379: LocalCdnServer | undefined
23
+ let server399: LocalCdnServer | undefined
24
+ let server402: LocalCdnServer | undefined
25
+ let server499: LocalCdnServer | undefined
26
+
27
+ beforeAll(async () => {
28
+ const data300_399 = await ChaintracksFs.readFile(fs.pathJoin(rootFolder, 'cdnTest499/mainNet_3.headers'))
29
+ const data400_499 = await ChaintracksFs.readFile(fs.pathJoin(rootFolder, 'cdnTest499/mainNet_4.headers'))
30
+ headers300_399 = deserializeBlockHeaders(300, data300_399)
31
+ headers400_499 = deserializeBlockHeaders(400, data400_499)
32
+
33
+ // Start the local CDN servers
34
+ server349 = new LocalCdnServer(8349, fs.pathJoin(rootFolder, 'cdnTest349'))
35
+ await server349.start()
36
+ server379 = new LocalCdnServer(8379, fs.pathJoin(rootFolder, 'cdnTest379'))
37
+ await server379.start()
38
+ server399 = new LocalCdnServer(8399, fs.pathJoin(rootFolder, 'cdnTest399'))
39
+ await server399.start()
40
+ server402 = new LocalCdnServer(8402, fs.pathJoin(rootFolder, 'cdnTest402'))
41
+ await server402.start()
42
+ server499 = new LocalCdnServer(8499, fs.pathJoin(rootFolder, 'cdnTest499'))
43
+ await server499.start()
44
+ })
45
+
46
+ afterAll(async () => {
47
+ if (server349) {
48
+ await server349.stop()
49
+ }
50
+ if (server379) {
51
+ await server379.stop()
52
+ }
53
+ if (server399) {
54
+ await server399.stop()
55
+ }
56
+ if (server402) {
57
+ await server402.stop()
58
+ }
59
+ if (server499) {
60
+ await server499.stop()
61
+ }
62
+ })
63
+
64
+ async function test0Body(manager: BulkFileDataManager) {
65
+ // Verify the default options and minimum expected files from default CDN
66
+ expect(manager.chain).toBe(chain)
67
+ expect(manager.maxPerFile).toBe(100000)
68
+ expect(manager.maxRetained).toBe(2)
69
+ expect(manager.fromKnownSourceUrl).toBe('https://cdn.projectbabbage.com/blockheaders')
70
+ const files = await manager.getBulkFiles()
71
+ expect(files.length).toBeGreaterThan(7)
72
+ const range = await manager.getHeightRange()
73
+ expect(range.minHeight).toBe(0)
74
+ expect(range.maxHeight).toBeGreaterThan(800000)
75
+ }
76
+
77
+ test('0 default options CDN files', async () => {
78
+ const options = BulkFileDataManager.createDefaultOptions(chain)
79
+ const manager = new BulkFileDataManager(options)
80
+
81
+ await test0Body(manager)
82
+ })
83
+
84
+ test('0a default options CDN files noDropAll', async () => {
85
+ if (!runSlowTests) return
86
+ const options = BulkFileDataManager.createDefaultOptions(chain)
87
+ const manager = new BulkFileDataManager(options)
88
+ const storage = await setupStorageKnex(manager, `BulkFileDataManager.test_0a`, false)
89
+
90
+ await test0Body(manager)
91
+
92
+ await storage.destroy()
93
+ })
94
+
95
+ test('0b default options CDN files dropAll', async () => {
96
+ if (!runSlowTests) return
97
+ const options = BulkFileDataManager.createDefaultOptions(chain)
98
+ const manager = new BulkFileDataManager(options)
99
+ const storage = await setupStorageKnex(manager, `BulkFileDataManager.test_0b`, true)
100
+
101
+ await test0Body(manager)
102
+
103
+ await storage.destroy()
104
+ })
105
+
106
+ async function test1Body(manager: BulkFileDataManager, minCount: number) {
107
+ // Verify header retrieval from different heights and data caching
108
+ expect(countDatas(manager)).toBe(minCount)
109
+ let h0 = await manager.findHeaderForHeightOrUndefined(0)
110
+ expect(h0?.hash).toBe('000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f')
111
+ expect(countDatas(manager)).toBe(minCount === 0 ? 1 : minCount)
112
+ const h101010 = await manager.findHeaderForHeightOrUndefined(101010)
113
+ expect(h101010?.hash).toBe('000000000001af33247fff33aae7c31baee4148d5a189e7353bf13bcee618202')
114
+ expect(countDatas(manager)).toBe(2)
115
+
116
+ h0 = await manager.findHeaderForHeightOrUndefined(0)
117
+ expect(h0?.hash).toBe('000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f')
118
+ expect(countDatas(manager)).toBe(2)
119
+
120
+ const h202020 = await manager.findHeaderForHeightOrUndefined(202020)
121
+ expect(h202020?.hash).toBe('00000000000003a40858736f3788edcbca3aa89ac5723a8c6b42f0227084f949')
122
+ expect(countDatas(manager)).toBe(2)
123
+ const h303030 = await manager.findHeaderForHeightOrUndefined(303030)
124
+ expect(h303030?.hash).toBe('00000000000000002f66589be500afbf212eabf7b10e12fe4639684df808c83b')
125
+ expect(countDatas(manager)).toBe(2)
126
+
127
+ h0 = await manager.findHeaderForHeightOrUndefined(0)
128
+ expect(h0?.hash).toBe('000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f')
129
+ expect(countDatas(manager)).toBe(2)
130
+
131
+ const h808080 = await manager.findHeaderForHeightOrUndefined(808080)
132
+ expect(h808080?.hash).toBe('00000000000000000a7287950fae52dac3098ba43011fd1e1315974a419b0110')
133
+ expect(countDatas(manager)).toBe(2)
134
+
135
+ // Verify a height request that is out of range returns undefined and does not affect cached data
136
+ const h909090 = await manager.findHeaderForHeightOrUndefined(909090)
137
+ expect(h909090?.hash).toBeUndefined()
138
+ expect(countDatas(manager)).toBe(2)
139
+
140
+ // Verify retrieval from cached data.
141
+ h0 = await manager.findHeaderForHeightOrUndefined(0)
142
+ expect(h0?.hash).toBe('000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f')
143
+ }
144
+
145
+ test('1 headers from heights maxRetained 2', async () => {
146
+ if (!runSlowTests) return
147
+ const options = BulkFileDataManager.createDefaultOptions(chain)
148
+ const manager = new BulkFileDataManager(options)
149
+
150
+ await test1Body(manager, 0)
151
+ })
152
+
153
+ test('1a headers from heights maxRetained 2', async () => {
154
+ if (!runSlowTests) return
155
+ const options = BulkFileDataManager.createDefaultOptions(chain)
156
+ const manager = new BulkFileDataManager(options)
157
+ const storage = await setupStorageKnex(manager, `BulkFileDataManager.test_1a`, true)
158
+
159
+ await test1Body(manager, 2)
160
+
161
+ await storage.destroy()
162
+ })
163
+
164
+ test('2 ReValidate', async () => {
165
+ if (!runSlowTests) return
166
+ const options = BulkFileDataManager.createDefaultOptions(chain)
167
+ const manager = new BulkFileDataManager(options)
168
+
169
+ // Verify full data re-validation
170
+ await manager.ReValidate()
171
+ expect(countDatas(manager)).toBe(2)
172
+ })
173
+
174
+ test('3 exportHeadersToFs', async () => {
175
+ if (!runSlowTests) return
176
+ const options = BulkFileDataManager.createDefaultOptions(chain)
177
+ const manager = new BulkFileDataManager(options)
178
+
179
+ for (const i of [349, 379, 399, 402, 499]) {
180
+ const folder = fs.pathJoin(rootFolder, `cdnTest${i}`)
181
+ await manager.exportHeadersToFs(ChaintracksFs, 100, folder, `http://localhost:8${i}/blockheaders`, i)
182
+ }
183
+ })
184
+
185
+ async function test4Body(manager: BulkFileDataManager, maxCount: number) {
186
+ expect(countDatas(manager)).toBe(2)
187
+ const range = await manager.getHeightRange()
188
+ expect(range.maxHeight).toBe(349)
189
+
190
+ await manager.mergeIncrementalBlockHeaders(headers300_399.slice(50))
191
+ await manager.ReValidate()
192
+ expect(countDatas(manager)).toBe(maxCount)
193
+ await manager.mergeIncrementalBlockHeaders(headers400_499)
194
+ await manager.ReValidate()
195
+ expect(countDatas(manager)).toBe(maxCount)
196
+
197
+ await updateFromLocalServer(manager, server379!)
198
+ await manager.ReValidate()
199
+ expect(countDatas(manager)).toBe(maxCount)
200
+ await updateFromLocalServer(manager, server399!)
201
+ await manager.ReValidate()
202
+ expect(countDatas(manager)).toBe(maxCount)
203
+ await updateFromLocalServer(manager, server402!)
204
+ await manager.ReValidate()
205
+ expect(countDatas(manager)).toBe(maxCount)
206
+ await updateFromLocalServer(manager, server499!)
207
+ await manager.ReValidate()
208
+ expect(countDatas(manager)).toBe(2)
209
+ }
210
+
211
+ test('4 add two incremental chunks overwrite by CDN', async () => {
212
+ const manager = await setupManagerOnLocalServer(server349!)
213
+
214
+ await test4Body(manager, 3)
215
+ })
216
+
217
+ test('4a add two incremental chunks overwrite by CDN', async () => {
218
+ const manager = await setupManagerOnLocalServer(server349!)
219
+ const storage = await setupStorageKnex(manager, `BulkFileDataManager.test_4a`, true)
220
+
221
+ await test4Body(manager, 2)
222
+
223
+ await storage.destroy()
224
+ })
225
+
226
+ async function test5Body(manager: BulkFileDataManager, maxCount: number) {
227
+ expect(countDatas(manager)).toBe(2)
228
+ await updateFromLocalServer(manager, server379!)
229
+ await manager.ReValidate()
230
+ expect(countDatas(manager)).toBe(2)
231
+
232
+ await manager.mergeIncrementalBlockHeaders(headers300_399.slice(50))
233
+ await manager.ReValidate()
234
+ expect(countDatas(manager)).toBe(maxCount)
235
+
236
+ await updateFromLocalServer(manager, server499!)
237
+ await manager.ReValidate()
238
+ expect(countDatas(manager)).toBe(2)
239
+
240
+ await manager.mergeIncrementalBlockHeaders(headers400_499)
241
+ await manager.ReValidate()
242
+ expect(countDatas(manager)).toBe(2)
243
+ }
244
+
245
+ test('5 add CDN incremental CDN incremental', async () => {
246
+ const manager = await setupManagerOnLocalServer(server349!)
247
+
248
+ await test5Body(manager, 3)
249
+ })
250
+
251
+ test('5a add CDN incremental CDN incremental', async () => {
252
+ const manager = await setupManagerOnLocalServer(server349!)
253
+ const storage = await setupStorageKnex(manager, `BulkFileDataManager.test_5a`, true)
254
+
255
+ await test5Body(manager, 2)
256
+
257
+ await storage.destroy()
258
+ })
259
+
260
+ async function setupStorageKnex(
261
+ manager: BulkFileDataManager,
262
+ filename: string,
263
+ deleteSqliteFile: boolean
264
+ ): Promise<ChaintracksStorageKnex> {
265
+ const path = fs.pathJoin(rootFolder, `${filename}.sqlite`)
266
+ const localSqlite: Knex.Config = {
267
+ client: 'sqlite3',
268
+ connection: { filename: path },
269
+ useNullAsDefault: true
270
+ }
271
+ if (deleteSqliteFile) {
272
+ const fs = ChaintracksFs
273
+ try {
274
+ await fs.delete(path)
275
+ } catch {}
276
+ }
277
+ const knexOptions = ChaintracksStorageKnex.createStorageKnexOptions(chain, makeKnex(localSqlite))
278
+ knexOptions.bulkFileDataManager = manager
279
+ const storage = new ChaintracksStorageKnex(knexOptions)
280
+ await storage.makeAvailable()
281
+
282
+ return storage
283
+ }
284
+
285
+ async function setupManagerOnLocalServer(server: LocalCdnServer) {
286
+ const options = BulkFileDataManager.createDefaultOptions(chain)
287
+ options.fromKnownSourceUrl = undefined
288
+ const manager = new BulkFileDataManager(options)
289
+ await updateFromLocalServer(manager, server)
290
+ return manager
291
+ }
292
+ })
293
+
294
+ async function updateFromLocalServer(manager: BulkFileDataManager, server: LocalCdnServer) {
295
+ await manager.updateFromUrl(`http://localhost:${server.port}/blockheaders`)
296
+ }
297
+
298
+ function countDatas(manager: BulkFileDataManager): number {
299
+ let count = 0
300
+ for (const file of manager['bfds'] as BulkHeaderFileInfo[]) {
301
+ if (file.data) count += 1
302
+ }
303
+ return count
304
+ }
@@ -0,0 +1,60 @@
1
+ import { Hash } from '@bsv/sdk'
2
+ import { BulkHeaderFilesInfo } from '../BulkHeaderFile'
3
+ import { ChaintracksFetch } from '../ChaintracksFetch'
4
+ import { asArray, asString } from '../../../../../utility/utilityHelpers.noBuffer'
5
+ import { validBulkHeaderFilesByFileHash } from '../validBulkHeaderFilesByFileHash'
6
+
7
+ describe('ChaintracksFetch tests', () => {
8
+ jest.setTimeout(99999999)
9
+
10
+ test('0 fetchJson', async () => {
11
+ const fetch = new ChaintracksFetch()
12
+ const cdnUrl = 'https://cdn.projectbabbage.com/blockheaders/'
13
+ //const jsonResource = `${cdnUrl}/testNetV2.json`
14
+ const jsonResource = `${cdnUrl}/testNetBlockHeaders.json`
15
+ const info: BulkHeaderFilesInfo = await fetch.fetchJson(jsonResource)
16
+ expect(info).toBeDefined()
17
+ expect(info.files.length).toBeGreaterThan(4)
18
+ })
19
+
20
+ test('1 download', async () => {
21
+ const fetch = new ChaintracksFetch()
22
+ const cdnUrl = 'https://cdn.projectbabbage.com/blockheaders/'
23
+ const url = `${cdnUrl}/testNet_0.headers`
24
+ const data = await fetch.download(url)
25
+ expect(data.length).toBe(8000000)
26
+ const fileHash = asString(Hash.sha256(asArray(data)), 'base64')
27
+ expect(validBulkHeaderFilesByFileHash()[fileHash]).toBeDefined()
28
+ })
29
+
30
+ test.skip('2 download faster crypto.subtle sha256', async () => {
31
+ const fetch = new ChaintracksFetch()
32
+ const cdnUrl = 'https://cdn.projectbabbage.com/blockheaders/'
33
+ const url = `${cdnUrl}/testNet_0.headers`
34
+ const data = await fetch.download(url)
35
+ expect(data.length).toBe(8000000)
36
+ const hash = new Uint8Array(await crypto.subtle.digest('SHA-256', Uint8Array.from(data)))
37
+ const fileHash = asString(hash, 'base64')
38
+ expect(validBulkHeaderFilesByFileHash()[fileHash]).toBeDefined()
39
+ })
40
+
41
+ test('3 download', async () => {
42
+ const fetch = new ChaintracksFetch()
43
+ const cdnUrl = 'https://cdn.projectbabbage.com/blockheaders/'
44
+ const url = `${cdnUrl}/testNet_4.headers`
45
+ const data = await fetch.download(url)
46
+ expect(data.length).toBe(80 * 100000)
47
+ const fileHash = asString(Hash.sha256(asArray(data)), 'base64')
48
+ expect(validBulkHeaderFilesByFileHash()[fileHash]).toBeDefined()
49
+ })
50
+
51
+ test('4 download', async () => {
52
+ const fetch = new ChaintracksFetch()
53
+ const cdnUrl = 'https://cdn.projectbabbage.com/blockheaders/'
54
+ const url = `${cdnUrl}/mainNet_2.headers`
55
+ const data = await fetch.download(url)
56
+ expect(data.length).toBe(80 * 100000)
57
+ const fileHash = asString(Hash.sha256(asArray(data)), 'base64')
58
+ expect(validBulkHeaderFilesByFileHash()[fileHash]).toBeDefined()
59
+ })
60
+ })
@@ -0,0 +1,67 @@
1
+ import { HeightRange } from '../HeightRange'
2
+
3
+ describe('testing HeightRange', () => {
4
+ const hr = (a: number, b: number) => new HeightRange(a, b)
5
+ test('length', () => {
6
+ expect(hr(1, 1).length).toBe(1)
7
+ expect(hr(1, 10).length).toBe(10)
8
+ expect(hr(1, 0).length).toBe(0)
9
+ expect(hr(1, -10).length).toBe(0)
10
+ })
11
+ test('copy', () => {
12
+ expect(hr(4, 8).copy()).toEqual(hr(4, 8))
13
+ })
14
+ test('intersect', () => {
15
+ expect(hr(4, 8).intersect(hr(1, 2)).isEmpty).toBe(true)
16
+ expect(hr(4, 8).intersect(hr(1, 3)).isEmpty).toBe(true)
17
+ expect(hr(4, 8).intersect(hr(1, 4))).toEqual(hr(4, 4))
18
+ expect(hr(4, 8).intersect(hr(1, 7))).toEqual(hr(4, 7))
19
+ expect(hr(4, 8).intersect(hr(1, 8))).toEqual(hr(4, 8))
20
+ expect(hr(4, 8).intersect(hr(1, 10))).toEqual(hr(4, 8))
21
+ expect(hr(4, 8).intersect(hr(4, 10))).toEqual(hr(4, 8))
22
+ expect(hr(4, 8).intersect(hr(5, 10))).toEqual(hr(5, 8))
23
+ expect(hr(4, 8).intersect(hr(6, 10))).toEqual(hr(6, 8))
24
+ expect(hr(4, 8).intersect(hr(7, 10))).toEqual(hr(7, 8))
25
+ expect(hr(4, 8).intersect(hr(8, 10))).toEqual(hr(8, 8))
26
+ expect(hr(4, 8).intersect(hr(9, 10)).isEmpty).toBe(true)
27
+ expect(hr(4, 8).intersect(hr(10, 10)).isEmpty).toBe(true)
28
+ expect(hr(4, -8).intersect(hr(4, 10)).isEmpty).toBe(true)
29
+ expect(hr(4, -8).intersect(hr(4, -10)).isEmpty).toBe(true)
30
+ expect(hr(4, 8).intersect(hr(9, -10)).isEmpty).toBe(true)
31
+ })
32
+ test('union', () => {
33
+ expect(() => hr(4, 8).union(hr(1, 2))).toThrow()
34
+ expect(hr(4, 8).union(hr(1, 3))).toEqual(hr(1, 8))
35
+ expect(hr(4, 8).union(hr(1, 4))).toEqual(hr(1, 8))
36
+ expect(hr(4, 8).union(hr(1, 7))).toEqual(hr(1, 8))
37
+ expect(hr(4, 8).union(hr(1, 8))).toEqual(hr(1, 8))
38
+ expect(hr(4, 8).union(hr(1, 10))).toEqual(hr(1, 10))
39
+ expect(hr(4, 8).union(hr(4, 10))).toEqual(hr(4, 10))
40
+ expect(hr(4, 8).union(hr(5, 10))).toEqual(hr(4, 10))
41
+ expect(hr(4, 8).union(hr(6, 10))).toEqual(hr(4, 10))
42
+ expect(hr(4, 8).union(hr(7, 10))).toEqual(hr(4, 10))
43
+ expect(hr(4, 8).union(hr(8, 10))).toEqual(hr(4, 10))
44
+ expect(hr(4, 8).union(hr(9, 10))).toEqual(hr(4, 10))
45
+ expect(() => hr(4, 8).union(hr(10, 10))).toThrow()
46
+ expect(hr(4, -8).union(hr(4, 10))).toEqual(hr(4, 10))
47
+ expect(hr(4, -8).union(hr(4, -10)).isEmpty).toBe(true)
48
+ expect(hr(4, 8).union(hr(9, -10))).toEqual(hr(4, 8))
49
+ })
50
+ test('subtract', () => {
51
+ expect(() => hr(4, 8).subtract(hr(5, 7))).toThrow()
52
+ expect(hr(4, 8).subtract(hr(1, 3))).toEqual(hr(4, 8))
53
+ expect(hr(4, 8).subtract(hr(1, 4))).toEqual(hr(5, 8))
54
+ expect(hr(4, 8).subtract(hr(1, 7))).toEqual(hr(8, 8))
55
+ expect(hr(4, 8).subtract(hr(1, 8)).isEmpty).toBe(true)
56
+ expect(hr(4, 8).subtract(hr(1, 10)).isEmpty).toBe(true)
57
+ expect(hr(4, 8).subtract(hr(4, 10)).isEmpty).toBe(true)
58
+ expect(hr(4, 8).subtract(hr(5, 10))).toEqual(hr(4, 4))
59
+ expect(hr(4, 8).subtract(hr(6, 10))).toEqual(hr(4, 5))
60
+ expect(hr(4, 8).subtract(hr(7, 10))).toEqual(hr(4, 6))
61
+ expect(hr(4, 8).subtract(hr(8, 10))).toEqual(hr(4, 7))
62
+ expect(hr(4, 8).subtract(hr(9, 10))).toEqual(hr(4, 8))
63
+ expect(hr(4, -8).subtract(hr(4, 10)).isEmpty).toBe(true)
64
+ expect(hr(4, -8).subtract(hr(4, -10)).isEmpty).toBe(true)
65
+ expect(hr(4, 8).subtract(hr(9, -10))).toEqual(hr(4, 8))
66
+ })
67
+ })
@@ -0,0 +1,49 @@
1
+ import { SingleWriterMultiReaderLock } from '../SingleWriterMultiReaderLock'
2
+
3
+ class TestLock {
4
+ private lock: SingleWriterMultiReaderLock = new SingleWriterMultiReaderLock()
5
+ private value: number = 0
6
+
7
+ async readValue(): Promise<number> {
8
+ return this.lock.withReadLock(async () => {
9
+ // Simulate some read delay
10
+ await new Promise(resolve => setTimeout(resolve, 10))
11
+ return this.value
12
+ })
13
+ }
14
+
15
+ async writeValue(newValue: number): Promise<number> {
16
+ return this.lock.withWriteLock(async () => {
17
+ // Simulate some write delay
18
+ await new Promise(resolve => setTimeout(resolve, 50))
19
+ this.value = newValue
20
+ return this.value
21
+ })
22
+ }
23
+
24
+ async test(): Promise<number[]> {
25
+ const promises: Promise<number>[] = []
26
+ const readCount = 3
27
+ for (let i = 0; i < readCount; i++) promises.push(this.readValue())
28
+ promises.push(this.writeValue(42))
29
+ promises.push(this.writeValue(43))
30
+ promises.push(this.writeValue(47))
31
+ for (let i = 0; i < readCount; i++) promises.push(this.readValue())
32
+ promises.push(this.writeValue(44))
33
+ promises.push(this.writeValue(45))
34
+ promises.push(this.writeValue(46))
35
+ for (let i = 0; i < readCount; i++) promises.push(this.readValue())
36
+ const results = await Promise.all(promises)
37
+ return results
38
+ }
39
+ }
40
+
41
+ describe('SingleWriterMultiReaderLock tests', () => {
42
+ jest.setTimeout(99999999)
43
+
44
+ test('0_', async () => {
45
+ const t = new TestLock()
46
+ const r = await t.test()
47
+ expect(r).toEqual([0, 0, 0, 42, 43, 47, 46, 46, 46, 44, 45, 46, 46, 46, 46])
48
+ })
49
+ })