tool-db 2.2.0 → 2.5.0

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 (507) hide show
  1. package/README.md +1 -201
  2. package/lib/adapters-base/networkAdapter.ts +215 -0
  3. package/lib/adapters-base/storageAdapter.ts +35 -0
  4. package/lib/adapters-base/userAdapter.ts +49 -0
  5. package/lib/crdt/baseCrdt.ts +21 -0
  6. package/lib/crdt/counterCrdt.ts +111 -0
  7. package/lib/crdt/listCrdt.ts +190 -0
  8. package/lib/crdt/mapCrdt.ts +119 -0
  9. package/{dist/index.d.ts → lib/index.ts} +16 -16
  10. package/lib/logger.ts +30 -0
  11. package/lib/messageHandlers/handleCrdtGet.ts +29 -0
  12. package/lib/messageHandlers/handleCrdtPut.ts +118 -0
  13. package/lib/messageHandlers/handleGet.ts +29 -0
  14. package/lib/messageHandlers/handlePing.ts +40 -0
  15. package/lib/messageHandlers/handlePong.ts +30 -0
  16. package/lib/messageHandlers/handlePut.ts +54 -0
  17. package/lib/messageHandlers/handleQuery.ts +25 -0
  18. package/lib/messageHandlers/handleSubscribe.ts +46 -0
  19. package/lib/server.ts +7 -0
  20. package/lib/shared.ts +5 -0
  21. package/lib/toolDbAnonSignIn.ts +5 -0
  22. package/lib/toolDbClientOnMessage.ts +75 -0
  23. package/lib/toolDbCrdtGet.ts +82 -0
  24. package/lib/toolDbCrdtPut.ts +77 -0
  25. package/lib/toolDbGet.ts +80 -0
  26. package/lib/toolDbKeysSignIn.ts +16 -0
  27. package/lib/toolDbPut.ts +83 -0
  28. package/lib/toolDbQueryKeys.ts +64 -0
  29. package/lib/toolDbSignIn.ts +31 -0
  30. package/lib/toolDbSignUp.ts +71 -0
  31. package/lib/toolDbSubscribe.ts +53 -0
  32. package/lib/toolDbVerificationWrapper.ts +55 -0
  33. package/lib/tooldb.ts +314 -0
  34. package/lib/types/message.ts +133 -0
  35. package/lib/types/tooldb.ts +89 -0
  36. package/lib/utils/catchReturn.ts +4 -0
  37. package/lib/utils/encoding/arrayBufferToHex.ts +18 -0
  38. package/lib/utils/encoding/arrayBufferToString.ts +8 -0
  39. package/lib/utils/encoding/hexToArrayBuffer.ts +13 -0
  40. package/lib/utils/encoding/hexToString.ts +8 -0
  41. package/lib/utils/encoding/hexToUint8.ts +5 -0
  42. package/lib/utils/encoding/stringToArrayBuffer.ts +8 -0
  43. package/lib/utils/getPeerSignature.ts +12 -0
  44. package/lib/utils/getTimestamp.ts +3 -0
  45. package/lib/utils/proofOfWork.ts +16 -0
  46. package/lib/utils/randomAnimal.ts +77 -0
  47. package/lib/utils/sha1.ts +7 -0
  48. package/lib/utils/sha256.ts +7 -0
  49. package/lib/utils/textRandom.ts +11 -0
  50. package/lib/utils/uniq.ts +3 -0
  51. package/lib/utils/verifyMessage.ts +88 -0
  52. package/lib/utils/verifyPeer.ts +15 -0
  53. package/package.json +31 -69
  54. package/tsconfig.json +10 -72
  55. package/.eslintrc.json +0 -74
  56. package/.github/workflows/main.yml +0 -29
  57. package/babel.config.js +0 -6
  58. package/bundle.js +0 -1
  59. package/custom-test-env.js +0 -28
  60. package/dist/__tests__ copy/base64.d.ts +0 -1
  61. package/dist/__tests__ copy/base64.js +0 -61
  62. package/dist/__tests__ copy/base64.js.map +0 -1
  63. package/dist/__tests__ copy/encryption.d.ts +0 -1
  64. package/dist/__tests__ copy/encryption.js +0 -68
  65. package/dist/__tests__ copy/encryption.js.map +0 -1
  66. package/dist/__tests__ copy/keys.d.ts +0 -1
  67. package/dist/__tests__ copy/keys.js +0 -238
  68. package/dist/__tests__ copy/keys.js.map +0 -1
  69. package/dist/__tests__ copy/network.d.ts +0 -1
  70. package/dist/__tests__ copy/network.js +0 -206
  71. package/dist/__tests__ copy/network.js.map +0 -1
  72. package/dist/__tests__ copy/pow.d.ts +0 -1
  73. package/dist/__tests__ copy/pow.js +0 -25
  74. package/dist/__tests__ copy/pow.js.map +0 -1
  75. package/dist/__tests__ copy/sha1.d.ts +0 -1
  76. package/dist/__tests__ copy/sha1.js +0 -16
  77. package/dist/__tests__ copy/sha1.js.map +0 -1
  78. package/dist/__tests__ copy/sha256.d.ts +0 -1
  79. package/dist/__tests__ copy/sha256.js +0 -16
  80. package/dist/__tests__ copy/sha256.js.map +0 -1
  81. package/dist/__tests__ copy/textRandom.d.ts +0 -1
  82. package/dist/__tests__ copy/textRandom.js +0 -17
  83. package/dist/__tests__ copy/textRandom.js.map +0 -1
  84. package/dist/bundle.js +0 -69086
  85. package/dist/chain/Block.d.ts +0 -29
  86. package/dist/chain/Block.js +0 -142
  87. package/dist/chain/Block.js.map +0 -1
  88. package/dist/chain/ToolChain.d.ts +0 -27
  89. package/dist/chain/ToolChain.js +0 -253
  90. package/dist/chain/ToolChain.js.map +0 -1
  91. package/dist/chain/Tx.d.ts +0 -50
  92. package/dist/chain/Tx.js +0 -54
  93. package/dist/chain/Tx.js.map +0 -1
  94. package/dist/chain/Wallet.d.ts +0 -9
  95. package/dist/chain/Wallet.js +0 -37
  96. package/dist/chain/Wallet.js.map +0 -1
  97. package/dist/chain/isValidChain.d.ts +0 -1
  98. package/dist/chain/isValidChain.js +0 -37
  99. package/dist/chain/isValidChain.js.map +0 -1
  100. package/dist/chain/mempool.d.ts +0 -0
  101. package/dist/chain/mempool.js +0 -2
  102. package/dist/chain/mempool.js.map +0 -1
  103. package/dist/crdt/baseCrdt.d.ts +0 -9
  104. package/dist/crdt/baseCrdt.js +0 -27
  105. package/dist/crdt/baseCrdt.js.map +0 -1
  106. package/dist/crdt/counterCrdt.d.ts +0 -30
  107. package/dist/crdt/counterCrdt.js +0 -124
  108. package/dist/crdt/counterCrdt.js.map +0 -1
  109. package/dist/crdt/listCrdt.d.ts +0 -42
  110. package/dist/crdt/listCrdt.js +0 -177
  111. package/dist/crdt/listCrdt.js.map +0 -1
  112. package/dist/crdt/mapCrdt.d.ts +0 -32
  113. package/dist/crdt/mapCrdt.js +0 -136
  114. package/dist/crdt/mapCrdt.js.map +0 -1
  115. package/dist/getCrypto.d.ts +0 -1
  116. package/dist/getCrypto.js +0 -10
  117. package/dist/getCrypto.js.map +0 -1
  118. package/dist/index.js +0 -99
  119. package/dist/index.js.map +0 -1
  120. package/dist/infuraFilecoin.d.ts +0 -0
  121. package/dist/infuraFilecoin.js +0 -2
  122. package/dist/infuraFilecoin.js.map +0 -1
  123. package/dist/loadCrdtDocument.d.ts +0 -3
  124. package/dist/loadCrdtDocument.js +0 -38
  125. package/dist/loadCrdtDocument.js.map +0 -1
  126. package/dist/makeTx.d.ts +0 -1
  127. package/dist/makeTx.js +0 -27
  128. package/dist/makeTx.js.map +0 -1
  129. package/dist/messageHandlers/handleCrdt.d.ts +0 -3
  130. package/dist/messageHandlers/handleCrdt.js +0 -11
  131. package/dist/messageHandlers/handleCrdt.js.map +0 -1
  132. package/dist/messageHandlers/handleCrdtGet.d.ts +0 -3
  133. package/dist/messageHandlers/handleCrdtGet.js +0 -32
  134. package/dist/messageHandlers/handleCrdtGet.js.map +0 -1
  135. package/dist/messageHandlers/handleCrdtPut.d.ts +0 -3
  136. package/dist/messageHandlers/handleCrdtPut.js +0 -88
  137. package/dist/messageHandlers/handleCrdtPut.js.map +0 -1
  138. package/dist/messageHandlers/handleGet.d.ts +0 -3
  139. package/dist/messageHandlers/handleGet.js +0 -31
  140. package/dist/messageHandlers/handleGet.js.map +0 -1
  141. package/dist/messageHandlers/handleJoin.d.ts +0 -3
  142. package/dist/messageHandlers/handleJoin.js +0 -36
  143. package/dist/messageHandlers/handleJoin.js.map +0 -1
  144. package/dist/messageHandlers/handlePing.d.ts +0 -3
  145. package/dist/messageHandlers/handlePing.js +0 -27
  146. package/dist/messageHandlers/handlePing.js.map +0 -1
  147. package/dist/messageHandlers/handlePong.d.ts +0 -3
  148. package/dist/messageHandlers/handlePong.js +0 -34
  149. package/dist/messageHandlers/handlePong.js.map +0 -1
  150. package/dist/messageHandlers/handlePut.d.ts +0 -3
  151. package/dist/messageHandlers/handlePut.js +0 -53
  152. package/dist/messageHandlers/handlePut.js.map +0 -1
  153. package/dist/messageHandlers/handleQuery.d.ts +0 -3
  154. package/dist/messageHandlers/handleQuery.js +0 -18
  155. package/dist/messageHandlers/handleQuery.js.map +0 -1
  156. package/dist/messageHandlers/handleServers.d.ts +0 -3
  157. package/dist/messageHandlers/handleServers.js +0 -23
  158. package/dist/messageHandlers/handleServers.js.map +0 -1
  159. package/dist/messageHandlers/handleSubscribe.d.ts +0 -3
  160. package/dist/messageHandlers/handleSubscribe.js +0 -43
  161. package/dist/messageHandlers/handleSubscribe.js.map +0 -1
  162. package/dist/server.d.ts +0 -1
  163. package/dist/server.js +0 -12
  164. package/dist/server.js.map +0 -1
  165. package/dist/shared.d.ts +0 -2
  166. package/dist/shared.js +0 -7
  167. package/dist/shared.js.map +0 -1
  168. package/dist/test.d.ts +0 -1
  169. package/dist/test.js +0 -17
  170. package/dist/test.js.map +0 -1
  171. package/dist/toolChainServer.d.ts +0 -8
  172. package/dist/toolChainServer.js +0 -60
  173. package/dist/toolChainServer.js.map +0 -1
  174. package/dist/toolDbAnonSignIn.d.ts +0 -2
  175. package/dist/toolDbAnonSignIn.js +0 -7
  176. package/dist/toolDbAnonSignIn.js.map +0 -1
  177. package/dist/toolDbClientOnMessage.d.ts +0 -3
  178. package/dist/toolDbClientOnMessage.js +0 -62
  179. package/dist/toolDbClientOnMessage.js.map +0 -1
  180. package/dist/toolDbCrdtGet.d.ts +0 -11
  181. package/dist/toolDbCrdtGet.js +0 -80
  182. package/dist/toolDbCrdtGet.js.map +0 -1
  183. package/dist/toolDbCrdtPut.d.ts +0 -11
  184. package/dist/toolDbCrdtPut.js +0 -68
  185. package/dist/toolDbCrdtPut.js.map +0 -1
  186. package/dist/toolDbGet.d.ts +0 -9
  187. package/dist/toolDbGet.js +0 -78
  188. package/dist/toolDbGet.js.map +0 -1
  189. package/dist/toolDbGetPubKey.d.ts +0 -2
  190. package/dist/toolDbGetPubKey.js +0 -18
  191. package/dist/toolDbGetPubKey.js.map +0 -1
  192. package/dist/toolDbKeysSignIn.d.ts +0 -2
  193. package/dist/toolDbKeysSignIn.js +0 -12
  194. package/dist/toolDbKeysSignIn.js.map +0 -1
  195. package/dist/toolDbNetwork.d.ts +0 -20
  196. package/dist/toolDbNetwork.js +0 -193
  197. package/dist/toolDbNetwork.js.map +0 -1
  198. package/dist/toolDbNetworkAdapter.d.ts +0 -57
  199. package/dist/toolDbNetworkAdapter.js +0 -192
  200. package/dist/toolDbNetworkAdapter.js.map +0 -1
  201. package/dist/toolDbPut.d.ts +0 -10
  202. package/dist/toolDbPut.js +0 -70
  203. package/dist/toolDbPut.js.map +0 -1
  204. package/dist/toolDbQueryKeys.d.ts +0 -8
  205. package/dist/toolDbQueryKeys.js +0 -69
  206. package/dist/toolDbQueryKeys.js.map +0 -1
  207. package/dist/toolDbSignIn.d.ts +0 -2
  208. package/dist/toolDbSignIn.js +0 -28
  209. package/dist/toolDbSignIn.js.map +0 -1
  210. package/dist/toolDbSignUp.d.ts +0 -3
  211. package/dist/toolDbSignUp.js +0 -97
  212. package/dist/toolDbSignUp.js.map +0 -1
  213. package/dist/toolDbSubscribe.d.ts +0 -8
  214. package/dist/toolDbSubscribe.js +0 -46
  215. package/dist/toolDbSubscribe.js.map +0 -1
  216. package/dist/toolDbVerificationWrapper.d.ts +0 -2
  217. package/dist/toolDbVerificationWrapper.js +0 -93
  218. package/dist/toolDbVerificationWrapper.js.map +0 -1
  219. package/dist/toolDbWeb3User.d.ts +0 -20
  220. package/dist/toolDbWeb3User.js +0 -75
  221. package/dist/toolDbWeb3User.js.map +0 -1
  222. package/dist/toolDbWebrtc.d.ts +0 -65
  223. package/dist/toolDbWebrtc.js +0 -489
  224. package/dist/toolDbWebrtc.js.map +0 -1
  225. package/dist/toolDbWebsocket.d.ts +0 -19
  226. package/dist/toolDbWebsocket.js +0 -193
  227. package/dist/toolDbWebsocket.js.map +0 -1
  228. package/dist/toolchain.d.ts +0 -1
  229. package/dist/toolchain.js +0 -8
  230. package/dist/toolchain.js.map +0 -1
  231. package/dist/tooldb.d.ts +0 -107
  232. package/dist/tooldb.js +0 -261
  233. package/dist/tooldb.js.map +0 -1
  234. package/dist/types/graph.d.ts +0 -0
  235. package/dist/types/graph.js +0 -2
  236. package/dist/types/graph.js.map +0 -1
  237. package/dist/types/message.d.ts +0 -106
  238. package/dist/types/message.js +0 -17
  239. package/dist/types/message.js.map +0 -1
  240. package/dist/types/tooldb.d.ts +0 -102
  241. package/dist/types/tooldb.js +0 -36
  242. package/dist/types/tooldb.js.map +0 -1
  243. package/dist/utils/arrayBufferToBase64.d.ts +0 -1
  244. package/dist/utils/arrayBufferToBase64.js +0 -12
  245. package/dist/utils/arrayBufferToBase64.js.map +0 -1
  246. package/dist/utils/arrayBufferToHex.d.ts +0 -1
  247. package/dist/utils/arrayBufferToHex.js +0 -19
  248. package/dist/utils/arrayBufferToHex.js.map +0 -1
  249. package/dist/utils/arrayBufferToString.d.ts +0 -1
  250. package/dist/utils/arrayBufferToString.js +0 -12
  251. package/dist/utils/arrayBufferToString.js.map +0 -1
  252. package/dist/utils/base64ToArrayBuffer.d.ts +0 -1
  253. package/dist/utils/base64ToArrayBuffer.js +0 -12
  254. package/dist/utils/base64ToArrayBuffer.js.map +0 -1
  255. package/dist/utils/base64ToBinaryChange.d.ts +0 -2
  256. package/dist/utils/base64ToBinaryChange.js +0 -18
  257. package/dist/utils/base64ToBinaryChange.js.map +0 -1
  258. package/dist/utils/base64ToBinaryDocument.d.ts +0 -2
  259. package/dist/utils/base64ToBinaryDocument.js +0 -18
  260. package/dist/utils/base64ToBinaryDocument.js.map +0 -1
  261. package/dist/utils/base64ToHex.d.ts +0 -1
  262. package/dist/utils/base64ToHex.js +0 -13
  263. package/dist/utils/base64ToHex.js.map +0 -1
  264. package/dist/utils/base64ToUint8.d.ts +0 -1
  265. package/dist/utils/base64ToUint8.js +0 -17
  266. package/dist/utils/base64ToUint8.js.map +0 -1
  267. package/dist/utils/catchReturn.d.ts +0 -1
  268. package/dist/utils/catchReturn.js +0 -8
  269. package/dist/utils/catchReturn.js.map +0 -1
  270. package/dist/utils/crypto/base64KeyToHex.d.ts +0 -1
  271. package/dist/utils/crypto/base64KeyToHex.js +0 -24
  272. package/dist/utils/crypto/base64KeyToHex.js.map +0 -1
  273. package/dist/utils/crypto/base64PublicKeyToHex.d.ts +0 -1
  274. package/dist/utils/crypto/base64PublicKeyToHex.js +0 -22
  275. package/dist/utils/crypto/base64PublicKeyToHex.js.map +0 -1
  276. package/dist/utils/crypto/decodeKeyString.d.ts +0 -1
  277. package/dist/utils/crypto/decodeKeyString.js +0 -12
  278. package/dist/utils/crypto/decodeKeyString.js.map +0 -1
  279. package/dist/utils/crypto/decryptData.d.ts +0 -1
  280. package/dist/utils/crypto/decryptData.js +0 -28
  281. package/dist/utils/crypto/decryptData.js.map +0 -1
  282. package/dist/utils/crypto/decryptWithPass.d.ts +0 -1
  283. package/dist/utils/crypto/decryptWithPass.js +0 -22
  284. package/dist/utils/crypto/decryptWithPass.js.map +0 -1
  285. package/dist/utils/crypto/deriveSecret.d.ts +0 -1
  286. package/dist/utils/crypto/deriveSecret.js +0 -18
  287. package/dist/utils/crypto/deriveSecret.js.map +0 -1
  288. package/dist/utils/crypto/encodeKeyString.d.ts +0 -1
  289. package/dist/utils/crypto/encodeKeyString.js +0 -12
  290. package/dist/utils/crypto/encodeKeyString.js.map +0 -1
  291. package/dist/utils/crypto/encryptData.d.ts +0 -1
  292. package/dist/utils/crypto/encryptData.js +0 -25
  293. package/dist/utils/crypto/encryptData.js.map +0 -1
  294. package/dist/utils/crypto/encryptWithPass.d.ts +0 -1
  295. package/dist/utils/crypto/encryptWithPass.js +0 -22
  296. package/dist/utils/crypto/encryptWithPass.js.map +0 -1
  297. package/dist/utils/crypto/exportKey.d.ts +0 -1
  298. package/dist/utils/crypto/exportKey.js +0 -14
  299. package/dist/utils/crypto/exportKey.js.map +0 -1
  300. package/dist/utils/crypto/exportKeyAsHex.d.ts +0 -1
  301. package/dist/utils/crypto/exportKeyAsHex.js +0 -18
  302. package/dist/utils/crypto/exportKeyAsHex.js.map +0 -1
  303. package/dist/utils/crypto/generateKeyFromPassword.d.ts +0 -1
  304. package/dist/utils/crypto/generateKeyFromPassword.js +0 -25
  305. package/dist/utils/crypto/generateKeyFromPassword.js.map +0 -1
  306. package/dist/utils/crypto/generateKeyPair.d.ts +0 -1
  307. package/dist/utils/crypto/generateKeyPair.js +0 -17
  308. package/dist/utils/crypto/generateKeyPair.js.map +0 -1
  309. package/dist/utils/crypto/generateKeysComb.d.ts +0 -4
  310. package/dist/utils/crypto/generateKeysComb.js +0 -60
  311. package/dist/utils/crypto/generateKeysComb.js.map +0 -1
  312. package/dist/utils/crypto/importKey.d.ts +0 -1
  313. package/dist/utils/crypto/importKey.js +0 -23
  314. package/dist/utils/crypto/importKey.js.map +0 -1
  315. package/dist/utils/crypto/loadKeysComb.d.ts +0 -5
  316. package/dist/utils/crypto/loadKeysComb.js +0 -90
  317. package/dist/utils/crypto/loadKeysComb.js.map +0 -1
  318. package/dist/utils/crypto/loadSignKeys.d.ts +0 -2
  319. package/dist/utils/crypto/loadSignKeys.js +0 -78
  320. package/dist/utils/crypto/loadSignKeys.js.map +0 -1
  321. package/dist/utils/crypto/recoverPubKey.d.ts +0 -1
  322. package/dist/utils/crypto/recoverPubKey.js +0 -33
  323. package/dist/utils/crypto/recoverPubKey.js.map +0 -1
  324. package/dist/utils/crypto/recoverPubKeyFromPrivate.d.ts +0 -1
  325. package/dist/utils/crypto/recoverPubKeyFromPrivate.js +0 -16
  326. package/dist/utils/crypto/recoverPubKeyFromPrivate.js.map +0 -1
  327. package/dist/utils/crypto/saveKeysComb.d.ts +0 -2
  328. package/dist/utils/crypto/saveKeysComb.js +0 -75
  329. package/dist/utils/crypto/saveKeysComb.js.map +0 -1
  330. package/dist/utils/crypto/saveSignKeys.d.ts +0 -2
  331. package/dist/utils/crypto/saveSignKeys.js +0 -67
  332. package/dist/utils/crypto/saveSignKeys.js.map +0 -1
  333. package/dist/utils/crypto/verifyData.d.ts +0 -1
  334. package/dist/utils/crypto/verifyData.js +0 -20
  335. package/dist/utils/crypto/verifyData.js.map +0 -1
  336. package/dist/utils/encoding/arrayBufferToBase64.d.ts +0 -1
  337. package/dist/utils/encoding/arrayBufferToBase64.js +0 -12
  338. package/dist/utils/encoding/arrayBufferToBase64.js.map +0 -1
  339. package/dist/utils/encoding/arrayBufferToHex.d.ts +0 -1
  340. package/dist/utils/encoding/arrayBufferToHex.js +0 -19
  341. package/dist/utils/encoding/arrayBufferToHex.js.map +0 -1
  342. package/dist/utils/encoding/arrayBufferToString.d.ts +0 -1
  343. package/dist/utils/encoding/arrayBufferToString.js +0 -12
  344. package/dist/utils/encoding/arrayBufferToString.js.map +0 -1
  345. package/dist/utils/encoding/base64ToArrayBuffer.d.ts +0 -1
  346. package/dist/utils/encoding/base64ToArrayBuffer.js +0 -12
  347. package/dist/utils/encoding/base64ToArrayBuffer.js.map +0 -1
  348. package/dist/utils/encoding/base64ToBinaryChange.d.ts +0 -2
  349. package/dist/utils/encoding/base64ToBinaryChange.js +0 -18
  350. package/dist/utils/encoding/base64ToBinaryChange.js.map +0 -1
  351. package/dist/utils/encoding/base64ToBinaryDocument.d.ts +0 -2
  352. package/dist/utils/encoding/base64ToBinaryDocument.js +0 -18
  353. package/dist/utils/encoding/base64ToBinaryDocument.js.map +0 -1
  354. package/dist/utils/encoding/base64ToHex.d.ts +0 -1
  355. package/dist/utils/encoding/base64ToHex.js +0 -13
  356. package/dist/utils/encoding/base64ToHex.js.map +0 -1
  357. package/dist/utils/encoding/base64ToUint8.d.ts +0 -1
  358. package/dist/utils/encoding/base64ToUint8.js +0 -17
  359. package/dist/utils/encoding/base64ToUint8.js.map +0 -1
  360. package/dist/utils/encoding/fromBase64.d.ts +0 -1
  361. package/dist/utils/encoding/fromBase64.js +0 -7
  362. package/dist/utils/encoding/fromBase64.js.map +0 -1
  363. package/dist/utils/encoding/hexToArrayBuffer.d.ts +0 -1
  364. package/dist/utils/encoding/hexToArrayBuffer.js +0 -15
  365. package/dist/utils/encoding/hexToArrayBuffer.js.map +0 -1
  366. package/dist/utils/encoding/hexToBase64.d.ts +0 -1
  367. package/dist/utils/encoding/hexToBase64.js +0 -12
  368. package/dist/utils/encoding/hexToBase64.js.map +0 -1
  369. package/dist/utils/encoding/hexToString.d.ts +0 -1
  370. package/dist/utils/encoding/hexToString.js +0 -12
  371. package/dist/utils/encoding/hexToString.js.map +0 -1
  372. package/dist/utils/encoding/hexToUint8.d.ts +0 -1
  373. package/dist/utils/encoding/hexToUint8.js +0 -11
  374. package/dist/utils/encoding/hexToUint8.js.map +0 -1
  375. package/dist/utils/encoding/stringToArrayBuffer.d.ts +0 -1
  376. package/dist/utils/encoding/stringToArrayBuffer.js +0 -12
  377. package/dist/utils/encoding/stringToArrayBuffer.js.map +0 -1
  378. package/dist/utils/encoding/toBase64.d.ts +0 -1
  379. package/dist/utils/encoding/toBase64.js +0 -7
  380. package/dist/utils/encoding/toBase64.js.map +0 -1
  381. package/dist/utils/encoding/uint8ArrayToHex.d.ts +0 -1
  382. package/dist/utils/encoding/uint8ArrayToHex.js +0 -7
  383. package/dist/utils/encoding/uint8ArrayToHex.js.map +0 -1
  384. package/dist/utils/encoding/uint8ToBase64.d.ts +0 -1
  385. package/dist/utils/encoding/uint8ToBase64.js +0 -15
  386. package/dist/utils/encoding/uint8ToBase64.js.map +0 -1
  387. package/dist/utils/fromBase64.d.ts +0 -1
  388. package/dist/utils/fromBase64.js +0 -7
  389. package/dist/utils/fromBase64.js.map +0 -1
  390. package/dist/utils/generateIv.d.ts +0 -1
  391. package/dist/utils/generateIv.js +0 -12
  392. package/dist/utils/generateIv.js.map +0 -1
  393. package/dist/utils/getPeerSignature.d.ts +0 -2
  394. package/dist/utils/getPeerSignature.js +0 -12
  395. package/dist/utils/getPeerSignature.js.map +0 -1
  396. package/dist/utils/getTimestamp.d.ts +0 -1
  397. package/dist/utils/getTimestamp.js +0 -7
  398. package/dist/utils/getTimestamp.js.map +0 -1
  399. package/dist/utils/hexToArrayBuffer.d.ts +0 -1
  400. package/dist/utils/hexToArrayBuffer.js +0 -15
  401. package/dist/utils/hexToArrayBuffer.js.map +0 -1
  402. package/dist/utils/hexToBase64.d.ts +0 -1
  403. package/dist/utils/hexToBase64.js +0 -12
  404. package/dist/utils/hexToBase64.js.map +0 -1
  405. package/dist/utils/hexToString.d.ts +0 -1
  406. package/dist/utils/hexToString.js +0 -12
  407. package/dist/utils/hexToString.js.map +0 -1
  408. package/dist/utils/hexToUint8.d.ts +0 -1
  409. package/dist/utils/hexToUint8.js +0 -8
  410. package/dist/utils/hexToUint8.js.map +0 -1
  411. package/dist/utils/indexedb.d.ts +0 -2
  412. package/dist/utils/indexedb.js +0 -116
  413. package/dist/utils/indexedb.js.map +0 -1
  414. package/dist/utils/leveldb.d.ts +0 -2
  415. package/dist/utils/leveldb.js +0 -85
  416. package/dist/utils/leveldb.js.map +0 -1
  417. package/dist/utils/proofOfWork.d.ts +0 -4
  418. package/dist/utils/proofOfWork.js +0 -19
  419. package/dist/utils/proofOfWork.js.map +0 -1
  420. package/dist/utils/randomAnimal.d.ts +0 -1
  421. package/dist/utils/randomAnimal.js +0 -77
  422. package/dist/utils/randomAnimal.js.map +0 -1
  423. package/dist/utils/sha1.d.ts +0 -1
  424. package/dist/utils/sha1.js +0 -13
  425. package/dist/utils/sha1.js.map +0 -1
  426. package/dist/utils/sha256.d.ts +0 -3
  427. package/dist/utils/sha256.js +0 -13
  428. package/dist/utils/sha256.js.map +0 -1
  429. package/dist/utils/signData.d.ts +0 -1
  430. package/dist/utils/signData.js +0 -19
  431. package/dist/utils/signData.js.map +0 -1
  432. package/dist/utils/stringToArrayBuffer.d.ts +0 -1
  433. package/dist/utils/stringToArrayBuffer.js +0 -12
  434. package/dist/utils/stringToArrayBuffer.js.map +0 -1
  435. package/dist/utils/textRandom.d.ts +0 -1
  436. package/dist/utils/textRandom.js +0 -15
  437. package/dist/utils/textRandom.js.map +0 -1
  438. package/dist/utils/toBase64.d.ts +0 -1
  439. package/dist/utils/toBase64.js +0 -7
  440. package/dist/utils/toBase64.js.map +0 -1
  441. package/dist/utils/uint8ArrayToHex.d.ts +0 -2
  442. package/dist/utils/uint8ArrayToHex.js +0 -7
  443. package/dist/utils/uint8ArrayToHex.js.map +0 -1
  444. package/dist/utils/uint8ToBase64.d.ts +0 -2
  445. package/dist/utils/uint8ToBase64.js +0 -15
  446. package/dist/utils/uint8ToBase64.js.map +0 -1
  447. package/dist/utils/verifyMessage.d.ts +0 -9
  448. package/dist/utils/verifyMessage.js +0 -129
  449. package/dist/utils/verifyMessage.js.map +0 -1
  450. package/dist/utils/verifyPeer.d.ts +0 -3
  451. package/dist/utils/verifyPeer.js +0 -18
  452. package/dist/utils/verifyPeer.js.map +0 -1
  453. package/jest.config.ts +0 -195
  454. package/jest.setup.js +0 -0
  455. package/test-alice/000663.ldb +0 -0
  456. package/test-alice/000665.ldb +0 -0
  457. package/test-alice/000668.ldb +0 -0
  458. package/test-alice/000669.log +0 -0
  459. package/test-alice/CURRENT +0 -1
  460. package/test-alice/LOCK +0 -0
  461. package/test-alice/LOG +0 -5
  462. package/test-alice/LOG.old +0 -5
  463. package/test-alice/MANIFEST-000667 +0 -0
  464. package/test-alice-speed/000035.log +0 -0
  465. package/test-alice-speed/000036.ldb +0 -0
  466. package/test-alice-speed/CURRENT +0 -1
  467. package/test-alice-speed/LOCK +0 -0
  468. package/test-alice-speed/LOG +0 -13
  469. package/test-alice-speed/LOG.old +0 -5
  470. package/test-alice-speed/MANIFEST-000033 +0 -0
  471. package/test-bob/000665.ldb +0 -0
  472. package/test-bob/000667.ldb +0 -0
  473. package/test-bob/000668.log +0 -0
  474. package/test-bob/CURRENT +0 -1
  475. package/test-bob/LOCK +0 -0
  476. package/test-bob/LOG +0 -5
  477. package/test-bob/LOG.old +0 -14
  478. package/test-bob/MANIFEST-000666 +0 -0
  479. package/test-node-a/000663.ldb +0 -0
  480. package/test-node-a/000665.ldb +0 -0
  481. package/test-node-a/000668.ldb +0 -0
  482. package/test-node-a/000669.log +0 -0
  483. package/test-node-a/CURRENT +0 -1
  484. package/test-node-a/LOCK +0 -0
  485. package/test-node-a/LOG +0 -5
  486. package/test-node-a/LOG.old +0 -5
  487. package/test-node-a/MANIFEST-000667 +0 -0
  488. package/test-node-b/000663.ldb +0 -0
  489. package/test-node-b/000665.ldb +0 -0
  490. package/test-node-b/000668.ldb +0 -0
  491. package/test-node-b/000669.log +0 -0
  492. package/test-node-b/CURRENT +0 -1
  493. package/test-node-b/LOCK +0 -0
  494. package/test-node-b/LOG +0 -5
  495. package/test-node-b/LOG.old +0 -5
  496. package/test-node-b/MANIFEST-000667 +0 -0
  497. package/test-verify-a/000026.ldb +0 -0
  498. package/test-verify-a/000029.ldb +0 -0
  499. package/test-verify-a/000031.ldb +0 -0
  500. package/test-verify-a/000033.ldb +0 -0
  501. package/test-verify-a/000250.log +0 -0
  502. package/test-verify-a/CURRENT +0 -1
  503. package/test-verify-a/LOCK +0 -0
  504. package/test-verify-a/LOG +0 -3
  505. package/test-verify-a/LOG.old +0 -3
  506. package/test-verify-a/MANIFEST-000249 +0 -0
  507. package/toolDbLibP2p.ts +0 -206
package/README.md CHANGED
@@ -1,201 +1 @@
1
- # Tool Db
2
-
3
- ToolDb is a peer-to-peer model for a decentralized database, inspired by Gun (Mark Nadal): https://gun.eco/
4
-
5
-
6
- It is the mix of a lot of cool concepts into one;
7
- - Cryptographically secure.
8
- - Offline first.
9
- - Fully decentralized.
10
- - Capable of providing realtime updates.
11
- - Key-value/document storage.
12
- - Works in the Browser and Nodejs seamlessly.
13
-
14
- For a more detailed documentation head here;
15
-
16
- [https://github.com/Manwe-777/tool-db-docs](https://github.com/Manwe-777/tool-db-docs)
17
-
18
- _(No live version just yet!, until the protocol is more finalized)_
19
-
20
- We push towards of the concept of federated servers, where we set up a p2p mesh network between any servers who want to join the swarm, and have those servers manage the connection and data sharing between them, while allowing client peers to connect to them to push updates to the database.
21
- This setup IS NOT a requirement! It is just what I think is the best and most reliable way of creating a p2p network for dApps using both desktop and web compatible technologies. Any peer has the capability of connecting to any other peer trough websockets, and modifiying the code to allow webRtc connections between web peers is absolutely possible.
22
-
23
- Since anyone can join a federated server swarm to help growing the network we use cryptography (basic public and private key authenthication and signature validation) to ensure all messages are coming from the real authors of the data that they intend to modify; this way by joining a swarm all peers in it can help validate without even having full data; even a new server peer can help, because all information is stored on each message and we dont rely on any centralized database to fetch users data.
24
-
25
- Please check the [chain-swarm](https://github.com/Manwe-777/chain-swarm) repository to see how a federated server swarm would look like, Tool Db only handles the connection and messaging between peers, but it does not have any logic for peer discovery.
26
- We do that using [discovery-channel](https://www.npmjs.com/package/discovery-channel), but you can use any DHT/networking solution you want! even WebRTC between browsers works using the `toolDbWebrtc` transport.
27
-
28
- # Future work
29
-
30
- While the database is currently functioning as expected, there are many things that could be added or improved to make it even better!
31
-
32
- - Use a common web3 format for users identity, or a more standarized key pair.
33
- - Allow messages encryption, add methods for Elliptic Curves, shared keys, etc.
34
- - Allow adding Noise/encryption to connections (probably based on the ECC?)
35
-
36
- # Install
37
-
38
- You can install ToolDb via npm or yarn;
39
-
40
- ```
41
- npm install tool-db
42
- ```
43
-
44
- or use it via script in your html;
45
-
46
- ```
47
- <script src="https://unpkg.com/tool-db/bundle.js"></script>
48
- ```
49
-
50
- That will include all of ToolDb exports in `tooldb`, then you can use it like;
51
-
52
- ```
53
- const { ToolDb, sha256 } = tooldb;
54
- ```
55
-
56
- ## Base usage
57
- Connect to the selected toolDb peers;
58
- ```
59
- const client = new ToolDb(options);
60
- ```
61
-
62
- These are the options you can pass to the constructor:
63
-
64
- ```
65
- {
66
- // Database name to use (default "tooldb")
67
- db: string;
68
-
69
- // Show debug console logs (default false)
70
- debug: boolean;
71
-
72
- // Array of peers to connect to, each one in the form of { host: "127.0.0.1", port: 9000 }
73
- peers: { host: "127.0.0.1", port: 9000 }[];
74
-
75
- // Max number of tries when a connection fails (default 5)
76
- maxRetries: number;
77
-
78
- // How long to wait (max) for a debounced key listener recv (default 100)
79
- triggerDebouce: number;
80
-
81
- // How long to wait between retries (default 2000)
82
- wait: number;
83
-
84
- // If you want to force a Proof of Work on all messages, set how much (zero is no POW, default 0)
85
- pow: number;
86
-
87
- // Whether we are a server or not (default false)
88
- server: boolean;
89
-
90
- // Our hostname (server only)
91
- host: string
92
-
93
- // Port to listen incoming connections (server only, default is 8080)
94
- port: number;
95
-
96
- // A server instance like Express (server only)
97
- httpServer: HTTPServer | HTTPSServer | undefined;
98
-
99
- // Our storage namespace (default is "tooldb")
100
- storageName: string;
101
-
102
- // A custom network adapter class
103
- networkAdapter: typeof ToolDbNetworkAdapter;
104
-
105
- // A custom storage adapter function
106
- storageAdapter: ToolDbStorageAdapter;
107
-
108
- // The namespace/topic of our app (default is "tool-db-default")
109
- topic: string;
110
- }
111
- ```
112
- Notice you can use your own network and storage modules if you would like to implement custom solutions for peers discovery, connections, storage, etc, the default adapters will work both on nodejs and the browser.
113
-
114
-
115
- You can create a user, sign in or create a random set of keys for anonymous usage;
116
- ```
117
- client.signUp(user, pass).then();
118
- client.signIn(user, pass).then(keys);
119
- client.anonSignIn().then();
120
- ```
121
-
122
- To retrieve your address; (only if logged in)
123
- ```
124
- client.getAddress();
125
- ```
126
-
127
- You can check if you are correctly logged in by checking if the user field exists or not;
128
- ```
129
- if (client.user) {
130
- // Ok!
131
- }
132
- ```
133
-
134
- ## Putting and getting data
135
-
136
- Core methods are very straighforward:
137
- ```
138
- client.getData("key", userNamespaced?, timeout?).then();
139
- client.putData("key", value, userNamespaced?).then();
140
- client.putCrdt("key", documentChanges, userNamespaced?).then();
141
- ```
142
- UserNamespaced will check for the user namespace, so it will transform the key used to ":user.key", This way all peers reading this entry will understand the key belongs to this user and will enforce the verifications required to namespaced entries.
143
-
144
- You can use `client.getUserNamespacedKey(key)` to convert any key to a private namespaced key of the current logged in user.
145
-
146
- Note the third function (putCrdt); For p2p networks some times you want to have conflict resolution on certain documents, to do this we use [automerge](https://github.com/automerge/automerge). Please take a look at it to know how it works in detail! The only thing you need to know on Tool Db is that you have to send an `Automerge.BinaryChange[]` (you get it using `Automerge.change()`). The recieving peer will process the changes, compare it to its stored documents and generate a new document with JSON CRDT applied to it, then relay the final document back to you.
147
-
148
- To listen for a value changes you can set up a listener on a key. Beware the listener will check for all keys *starting with* the supplied key, so for example, if you use "value." as your listener if will execute on every key that starts with "value.". This is useful for checking against an address or namespace.
149
- ```
150
- const listenerId = client.addKeyListener("value", console.log);
151
- client.removeKeyListener(listenerId);
152
- ```
153
-
154
- Similarly, for using a custom verification on a key (or subset of keys) you can create a new function that returns a Promise boolean;
155
- ```
156
- const validateFn = (msg) => {
157
- return new Promise((resolve) => {
158
- console.log("Custom verification: ", msg);
159
- if (typeof msg.value === "string") resolve(true);
160
- else resolve(false);
161
- });
162
- }
163
-
164
- const validatorId = client.addCustomVerification("value", validateFn);
165
-
166
- client.removeCustomVerification(validatorId);
167
- ```
168
-
169
- Keep in mind custom validators should run on all client and server nodes, and even though the nodes not running your validator will be able to store and relay invalid messages its up to each peer to check these messages on arrival. ToolDb does this automatically when using the custom validation, but its important to make sure every peer runs the same code to avoid tampered messages flowing in the network.
170
-
171
- ## Query
172
-
173
- To make queries or just create indexes you can make a query, it simply asks all server or peers connected a list of all keys starting with a prefix. You can later use these keys to get the data itself.
174
-
175
- ```
176
- client.queryKeys(keyPrefix, userNamespaced?, timeout?).then()
177
- ```
178
-
179
- Just like previous methods you can configure the namespace and timeout and returns a promise, but in this case the value is always an array with the found keys.
180
- Using for example ":" + address as our prefix would return all keys stored for that specific user namespace; you can also create keys for very specific use cases like "post-1" and query again "post-" to get a list of all available posts.
181
-
182
- Keep in mind this can be an intensive thing to do if your indexes are too big, and not recommended to be used very frequently.
183
-
184
-
185
- ## Listen for changes
186
-
187
- Some times you want to subscribe to the changes made on a certain key, this is possible via subscribeData;
188
- ```
189
- client.subscribeData("key", userNamespaced?);
190
- ```
191
-
192
- This will relay back to you all Put and CrdtPut messages on that key.
193
-
194
- ## Events
195
-
196
- If you need to check when you are connected to a server peer or not you can use the following method replacements;
197
-
198
- ```
199
- client.onConnect = (remotePeerId: string) => { /* Your code here */ };
200
- client.onDisconnect = () => { /* Your code here */ };
201
- ```
1
+ # `tool-db`
@@ -0,0 +1,215 @@
1
+ import {
2
+ ToolDb,
3
+ PingMessage,
4
+ ToolDbMessage,
5
+ Peer,
6
+ getPeerSignature,
7
+ textRandom,
8
+ uniq,
9
+ } from "..";
10
+
11
+ export default class ToolDbNetworkAdapter {
12
+ private _clientToSend: Record<string, (message: string) => void> = {};
13
+
14
+ private _isClientConnected: Record<string, () => boolean> = {};
15
+
16
+ private _clientIsServer: Record<string, boolean> = {};
17
+
18
+ private _tooldb: ToolDb;
19
+
20
+ constructor(db: ToolDb) {
21
+ this._tooldb = db;
22
+
23
+ if (this.tooldb.options.server) {
24
+ this.getMeAsPeer().then((meAsPeer) => {
25
+ this.tooldb.serverPeers.push(meAsPeer);
26
+ });
27
+ }
28
+ }
29
+
30
+ get clientToSend() {
31
+ return this._clientToSend;
32
+ }
33
+
34
+ get isClientConnected() {
35
+ return this._isClientConnected;
36
+ }
37
+
38
+ get tooldb() {
39
+ return this._tooldb;
40
+ }
41
+
42
+ public getMeAsPeer() {
43
+ const timestamp = new Date().getTime();
44
+ return getPeerSignature(
45
+ this.tooldb.peerAccount,
46
+ this.tooldb.options.topic,
47
+ timestamp,
48
+ this.tooldb.options.host,
49
+ this.tooldb.options.port
50
+ ).then((signature) => {
51
+ return {
52
+ topic: this.tooldb.options.topic,
53
+ timestamp: timestamp,
54
+ host: this.tooldb.options.host,
55
+ port: this.tooldb.options.port,
56
+ address: this.tooldb.peerAccount.getAddress() || "",
57
+ sig: signature,
58
+ } as Peer;
59
+ });
60
+ }
61
+
62
+ /**
63
+ * Check if the specified client is connected or not
64
+ * @param clientId Client ID
65
+ * @returns boolean
66
+ */
67
+ public isConnected(clientId: string) {
68
+ return this._isClientConnected[clientId]
69
+ ? this._isClientConnected[clientId]()
70
+ : false;
71
+ }
72
+
73
+ /**
74
+ * Check if the specified client is a server/relay
75
+ * @param clientId Client ID
76
+ * @returns boolean
77
+ */
78
+ public isServer(clientId: string) {
79
+ return this._clientIsServer[clientId] || false;
80
+ }
81
+
82
+ public craftPingMessage() {
83
+ return this.getMeAsPeer().then((meAsPeer) => {
84
+ return JSON.stringify({
85
+ type: "ping",
86
+ clientId: this.getClientAddress(),
87
+ to: [this.getClientAddress()],
88
+ isServer: this.tooldb.options.server,
89
+ id: textRandom(10),
90
+ peer: meAsPeer,
91
+ } as PingMessage);
92
+ });
93
+ }
94
+
95
+ /**
96
+ * Execute the function to send a message to the specified client ID
97
+ * @param clientId Client ID
98
+ * @param message Message
99
+ */
100
+ private executeSendToClient(clientId: string, message: string) {
101
+ if (this._clientToSend[clientId]) {
102
+ this._clientToSend[clientId](message);
103
+ }
104
+ }
105
+
106
+ public getClientAddress() {
107
+ // This is not a good idea to use on all adapters, so it should be replaced
108
+ // if its causing issues. The only reason we use the last 20 chars is to
109
+ // muse the same peer address as the webrtc adapter.
110
+ return (this.tooldb.peerAccount.getAddress() || "").slice(-20);
111
+ }
112
+
113
+ public onClientDisconnect(clientId: string) {
114
+ delete this._clientToSend[clientId];
115
+ delete this._clientIsServer[clientId];
116
+ }
117
+
118
+ /**
119
+ * Should be called as a message payload handler
120
+ * This function will take care of processing the messages and also making sure
121
+ * we use the correct response methods troughout the adapter.
122
+ * @param message message payload
123
+ * @param clientId Client ID (can be null for ping/pong)
124
+ * @param setClientId Callback to set the client id on the parent class
125
+ */
126
+ public onClientMessage(
127
+ message: string,
128
+ clientId: string | null,
129
+ setClientId: (clientId: string) => void
130
+ ) {
131
+ // this.tooldb.logger("onClientMessage", clientId);
132
+
133
+ if (clientId && !this.tooldb.processedOutHashes[clientId]) {
134
+ this.tooldb.processedOutHashes[clientId] = [];
135
+ }
136
+
137
+ try {
138
+ const parsedMessage = JSON.parse(message) as ToolDbMessage;
139
+ // We assume the first messages to arrive will always be ping or pong.
140
+ // Only after that we can get the client id for this socket.
141
+ if (parsedMessage.type === "ping" || parsedMessage.type === "pong") {
142
+ const cid = parsedMessage.clientId;
143
+ setClientId(cid);
144
+ this.tooldb.onPeerConnect(cid);
145
+ this._clientIsServer[cid] = parsedMessage.isServer;
146
+ this.tooldb.processedOutHashes[cid] = [];
147
+ this.tooldb.clientOnMessage(parsedMessage, cid);
148
+ } else if (clientId) {
149
+ this.tooldb.clientOnMessage(parsedMessage, clientId);
150
+ }
151
+ } catch (e) {
152
+ this.tooldb.logger("Got message ERR", message);
153
+ this.tooldb.logger(e);
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Sends a message to all peers connected to us
159
+ * This function takes care of the message deduplication, making sure we dont send
160
+ * the same message twice to the same peer.
161
+ * @param msg message data
162
+ * @param crossServerOnly If this message should be send to server peers only
163
+ * @param isRelay if we should relay this message
164
+ */
165
+ public sendToAll(msg: ToolDbMessage, crossServerOnly = false) {
166
+ const to = uniq([...msg.to, this.getClientAddress()]);
167
+
168
+ const finalMessage = JSON.stringify({ ...msg, to });
169
+
170
+ const filteredConns = Object.keys(this.clientToSend)
171
+ .filter((id) => !to.includes(id))
172
+ .filter((clientId) => this.isConnected(clientId));
173
+
174
+ filteredConns.forEach((clientId) => {
175
+ if ((crossServerOnly && this.isServer(clientId)) || !crossServerOnly) {
176
+ this.tooldb.logger(to, "Sent out to:", clientId);
177
+
178
+ if (msg.type === "put" || msg.type === "crdtPut") {
179
+ if (!this.tooldb.processedOutHashes[clientId].includes(msg.data.h)) {
180
+ this.executeSendToClient(clientId, finalMessage);
181
+ this.tooldb.processedOutHashes[clientId].push(msg.data.h);
182
+ }
183
+ } else {
184
+ this.executeSendToClient(clientId, finalMessage);
185
+ }
186
+ }
187
+ // } else {
188
+ // this.tooldb.logger("Fitlered out;", clientId);
189
+ // }
190
+ });
191
+ }
192
+
193
+ /**
194
+ * Sends a message to a single peer.
195
+ * This function also takes care of the message deduplication.
196
+ * @param clientId Peer/Client id we want to send to.
197
+ * @param msg message data
198
+ */
199
+ public sendToClientId(clientId: string, msg: ToolDbMessage) {
200
+ const to = uniq([...msg.to, this.getClientAddress()]);
201
+ const finalMessage = JSON.stringify({ ...msg, to });
202
+
203
+ if (msg.type === "put" || msg.type === "crdtPut") {
204
+ if (
205
+ clientId &&
206
+ !this.tooldb.processedOutHashes[clientId].includes(msg.data.h)
207
+ ) {
208
+ this.executeSendToClient(clientId, finalMessage);
209
+ this.tooldb.processedOutHashes[clientId].push(msg.data.h);
210
+ }
211
+ } else {
212
+ this.executeSendToClient(clientId, finalMessage);
213
+ }
214
+ }
215
+ }
@@ -0,0 +1,35 @@
1
+ import { ToolDb } from "..";
2
+
3
+ export default class ToolDbStorageAdapter {
4
+ private _tooldb: ToolDb;
5
+
6
+ private _forceStorageName: string | undefined;
7
+
8
+ get tooldb() {
9
+ return this._tooldb;
10
+ }
11
+
12
+ get storageName() {
13
+ return this._forceStorageName || this._tooldb.options.storageName;
14
+ }
15
+
16
+ constructor(db: ToolDb, forceStorageName?: string) {
17
+ this._tooldb = db;
18
+
19
+ if (forceStorageName) {
20
+ this._forceStorageName = forceStorageName;
21
+ }
22
+ }
23
+
24
+ put(key: string, data: string): Promise<unknown> {
25
+ return Promise.resolve();
26
+ }
27
+
28
+ get(key: string): Promise<string> {
29
+ return Promise.resolve("");
30
+ }
31
+
32
+ query(key: string): Promise<string[]> {
33
+ return Promise.resolve([]);
34
+ }
35
+ }
@@ -0,0 +1,49 @@
1
+ import { ToolDb, VerificationData } from "..";
2
+
3
+ export default class ToolDbUserAdapter {
4
+ private _tooldb: ToolDb;
5
+
6
+ get tooldb() {
7
+ return this._tooldb;
8
+ }
9
+
10
+ constructor(db: ToolDb) {
11
+ this._tooldb = db;
12
+ }
13
+
14
+ public anonUser() {
15
+ return;
16
+ }
17
+
18
+ public setUser(account: unknown | undefined, name: string): void {}
19
+
20
+ public signData(data: string): Promise<string> {
21
+ return Promise.resolve("");
22
+ }
23
+
24
+ public verifySignature(
25
+ message: Partial<VerificationData<any>>
26
+ ): Promise<boolean> {
27
+ return Promise.resolve(false);
28
+ }
29
+
30
+ public getAccountFromPrivate(privateKey: string): Promise<unknown> {
31
+ return Promise.resolve(undefined);
32
+ }
33
+
34
+ public encryptAccount(password: string): Promise<unknown> {
35
+ return Promise.resolve(undefined);
36
+ }
37
+
38
+ public decryptAccount(acc: unknown, password: string): Promise<any> {
39
+ return Promise.resolve(undefined);
40
+ }
41
+
42
+ public getAddress(): string | undefined {
43
+ return "";
44
+ }
45
+
46
+ public getUsername(): string | undefined {
47
+ return "";
48
+ }
49
+ }
@@ -0,0 +1,21 @@
1
+ export const CRDT_MAP = "MAP";
2
+
3
+ export const CRDT_LIST = "LIST";
4
+
5
+ export const CRDT_COUNTER = "COUNTER";
6
+
7
+ export class BaseCrdt<T = any, Changes = any, Value = any> {
8
+ public type: string = "";
9
+
10
+ public mergeChanges(changes: Changes[]) {
11
+ //
12
+ }
13
+
14
+ public getChanges(): Changes[] {
15
+ return [];
16
+ }
17
+
18
+ get value(): Value {
19
+ return "" as any;
20
+ }
21
+ }
@@ -0,0 +1,111 @@
1
+ import { BaseCrdt, CRDT_LIST } from "..";
2
+
3
+ export type CounterOperations = "ADD" | "SUB";
4
+
5
+ export interface ChangeCounterBase {
6
+ t: CounterOperations; // Operation type
7
+ v: number; // Value
8
+ a: string;
9
+ i: number;
10
+ }
11
+
12
+ export interface AddCounterChange extends ChangeCounterBase {
13
+ t: "ADD";
14
+ }
15
+
16
+ export interface SubCounterChange extends ChangeCounterBase {
17
+ t: "SUB";
18
+ }
19
+
20
+ export type CounterChanges = AddCounterChange | SubCounterChange;
21
+
22
+ export class CounterCrdt<T> extends BaseCrdt<number, CounterChanges, number> {
23
+ public type = CRDT_LIST;
24
+
25
+ public _changes: CounterChanges[] = [];
26
+
27
+ private _author = "";
28
+
29
+ private _value: number = 0;
30
+
31
+ private _lastUpdateSize: number = 0;
32
+
33
+ constructor(author: string, changes?: CounterChanges[]) {
34
+ super();
35
+ this._author = author;
36
+ if (changes) {
37
+ this.mergeChanges(changes);
38
+ }
39
+
40
+ this.calculate();
41
+ }
42
+
43
+ changesSort(a: CounterChanges, b: CounterChanges) {
44
+ if (a.i > b.i) return 1;
45
+ if (a.i < b.i) return -1;
46
+ return 0; // Should never be equal!
47
+ }
48
+
49
+ calculate() {
50
+ let temp: number = 0;
51
+ // Only update if we have new changes
52
+ if (Object.values(this._changes).length !== this._lastUpdateSize) {
53
+ this._changes.sort(this.changesSort).forEach((change) => {
54
+ if (change.t === "ADD") {
55
+ temp += change.v;
56
+ } else if (change.t === "SUB") {
57
+ temp -= change.v;
58
+ }
59
+ });
60
+
61
+ this._value = temp;
62
+ }
63
+ }
64
+
65
+ get value(): number {
66
+ this.calculate();
67
+ return this._value;
68
+ }
69
+
70
+ public mergeChanges(newChanges: CounterChanges[]) {
71
+ newChanges.forEach((change) => {
72
+ // Filter by author and index
73
+ const filtered = this._changes.filter(
74
+ (c) => c.i === change.i && c.a === change.a && c.t === change.t
75
+ );
76
+ // Only add if there are not matches
77
+ if (filtered.length === 0) {
78
+ this._changes.push(change);
79
+ }
80
+ });
81
+ this.calculate();
82
+ }
83
+
84
+ public getChanges(): CounterChanges[] {
85
+ return this._changes;
86
+ }
87
+
88
+ public ADD(value: number) {
89
+ const ourChanges = this._changes.filter((c) => c.a === this._author);
90
+
91
+ this._changes.push({
92
+ t: "ADD",
93
+ v: value,
94
+ a: this._author,
95
+ i: ourChanges.length,
96
+ });
97
+ this.calculate();
98
+ }
99
+
100
+ public SUB(value: number) {
101
+ const ourChanges = this._changes.filter((c) => c.a === this._author);
102
+
103
+ this._changes.push({
104
+ t: "SUB",
105
+ v: value,
106
+ a: this._author,
107
+ i: ourChanges.length,
108
+ });
109
+ this.calculate();
110
+ }
111
+ }