@aeternity/aepp-sdk 11.0.1 → 12.0.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 (376) hide show
  1. package/LICENSE +1 -1
  2. package/dist/aepp-sdk.browser-script.js +1 -1
  3. package/dist/aepp-sdk.browser-script.js.LICENSE.txt +12 -19
  4. package/dist/aepp-sdk.browser-script.js.map +1 -1
  5. package/dist/aepp-sdk.browser.js +1 -1
  6. package/dist/aepp-sdk.browser.js.map +1 -1
  7. package/dist/aepp-sdk.js +1 -1
  8. package/dist/aepp-sdk.js.map +1 -1
  9. package/es/AeSdk.d.ts +37 -0
  10. package/es/AeSdk.mjs +81 -0
  11. package/es/AeSdk.mjs.map +1 -0
  12. package/es/AeSdkAepp.d.ts +69 -0
  13. package/es/AeSdkAepp.mjs +175 -0
  14. package/es/AeSdkAepp.mjs.map +1 -0
  15. package/es/AeSdkBase.d.ts +212 -0
  16. package/es/AeSdkBase.mjs +310 -0
  17. package/es/AeSdkBase.mjs.map +1 -0
  18. package/es/AeSdkWallet.d.ts +103 -0
  19. package/es/AeSdkWallet.mjs +322 -0
  20. package/es/AeSdkWallet.mjs.map +1 -0
  21. package/es/Node.d.ts +44 -0
  22. package/es/Node.mjs +141 -0
  23. package/es/Node.mjs.map +1 -0
  24. package/es/account/Base.d.ts +65 -0
  25. package/es/account/Base.mjs +123 -0
  26. package/es/account/Base.mjs.map +1 -0
  27. package/es/account/Memory.d.ts +25 -0
  28. package/es/account/Memory.mjs +81 -0
  29. package/es/account/Memory.mjs.map +1 -0
  30. package/es/account/Rpc.d.ts +27 -0
  31. package/es/account/Rpc.mjs +79 -0
  32. package/es/account/Rpc.mjs.map +1 -0
  33. package/es/aens.d.ts +209 -0
  34. package/es/aens.mjs +332 -0
  35. package/es/aens.mjs.map +1 -0
  36. package/es/aepp-wallet-communication/connection/Browser.d.ts +32 -0
  37. package/es/aepp-wallet-communication/connection/Browser.mjs +70 -0
  38. package/es/aepp-wallet-communication/connection/Browser.mjs.map +1 -0
  39. package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +17 -0
  40. package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs +57 -0
  41. package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs.map +1 -0
  42. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.d.ts +35 -0
  43. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs +142 -0
  44. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs.map +1 -0
  45. package/es/aepp-wallet-communication/connection-proxy.d.ts +10 -0
  46. package/{src/utils/crypto-ts.ts → es/aepp-wallet-communication/connection-proxy.mjs} +15 -11
  47. package/es/aepp-wallet-communication/connection-proxy.mjs.map +1 -0
  48. package/es/aepp-wallet-communication/rpc/RpcClient.d.ts +33 -0
  49. package/es/aepp-wallet-communication/rpc/RpcClient.mjs +169 -0
  50. package/es/aepp-wallet-communication/rpc/RpcClient.mjs.map +1 -0
  51. package/es/aepp-wallet-communication/rpc/types.d.ts +77 -0
  52. package/es/aepp-wallet-communication/rpc/types.mjs +3 -0
  53. package/es/aepp-wallet-communication/rpc/types.mjs.map +1 -0
  54. package/es/aepp-wallet-communication/schema.d.ts +90 -46
  55. package/es/aepp-wallet-communication/schema.mjs +214 -0
  56. package/es/aepp-wallet-communication/schema.mjs.map +1 -0
  57. package/es/aepp-wallet-communication/wallet-detector.d.ts +24 -0
  58. package/es/aepp-wallet-communication/wallet-detector.mjs +63 -0
  59. package/es/aepp-wallet-communication/wallet-detector.mjs.map +1 -0
  60. package/es/apis/compiler/compiler.d.ts +92 -0
  61. package/es/apis/compiler/compiler.mjs +576 -0
  62. package/es/apis/compiler/compiler.mjs.map +1 -0
  63. package/es/apis/compiler/index.d.ts +2 -0
  64. package/es/apis/compiler/index.mjs +3 -0
  65. package/es/apis/compiler/index.mjs.map +1 -0
  66. package/es/apis/compiler/models/index.d.ts +248 -0
  67. package/es/apis/compiler/models/index.mjs +48 -0
  68. package/es/apis/compiler/models/index.mjs.map +1 -0
  69. package/es/apis/compiler/models/mappers.d.ts +23 -0
  70. package/es/apis/compiler/models/mappers.mjs +585 -0
  71. package/es/apis/compiler/models/mappers.mjs.map +1 -0
  72. package/es/apis/compiler/models/parameters.d.ts +13 -0
  73. package/es/apis/compiler/models/parameters.mjs +71 -0
  74. package/es/apis/compiler/models/parameters.mjs.map +1 -0
  75. package/es/apis/node/index.d.ts +2 -0
  76. package/es/apis/node/index.mjs +3 -0
  77. package/es/apis/node/index.mjs.map +1 -0
  78. package/es/apis/node/models/index.d.ts +1061 -0
  79. package/es/apis/node/models/index.mjs +2 -0
  80. package/es/apis/node/models/index.mjs.map +1 -0
  81. package/es/apis/node/models/mappers.d.ts +95 -0
  82. package/es/apis/node/models/mappers.mjs +4164 -0
  83. package/es/apis/node/models/mappers.mjs.map +1 -0
  84. package/es/apis/node/models/parameters.d.ts +17 -0
  85. package/es/apis/node/models/parameters.mjs +165 -0
  86. package/es/apis/node/models/parameters.mjs.map +1 -0
  87. package/es/apis/node/node.d.ts +215 -0
  88. package/es/apis/node/node.mjs +1165 -0
  89. package/es/apis/node/node.mjs.map +1 -0
  90. package/es/chain.d.ts +220 -0
  91. package/es/chain.mjs +524 -0
  92. package/es/chain.mjs.map +1 -0
  93. package/es/channel/handlers.d.ts +34 -0
  94. package/es/channel/handlers.mjs +147 -112
  95. package/es/channel/handlers.mjs.map +1 -1
  96. package/es/channel/index.d.ts +634 -0
  97. package/es/channel/index.mjs +898 -900
  98. package/es/channel/index.mjs.map +1 -1
  99. package/es/channel/internal.d.ts +100 -0
  100. package/es/channel/internal.mjs +97 -51
  101. package/es/channel/internal.mjs.map +1 -1
  102. package/es/contract/Compiler.d.ts +17 -0
  103. package/es/contract/Compiler.mjs +67 -0
  104. package/es/contract/Compiler.mjs.map +1 -0
  105. package/es/contract/aci.d.ts +125 -0
  106. package/es/contract/aci.mjs +199 -180
  107. package/es/contract/aci.mjs.map +1 -1
  108. package/es/contract/ga.d.ts +68 -0
  109. package/es/contract/ga.mjs +190 -0
  110. package/es/contract/ga.mjs.map +1 -0
  111. package/es/contract/methods.d.ts +68 -0
  112. package/es/contract/methods.mjs +101 -0
  113. package/es/contract/methods.mjs.map +1 -0
  114. package/es/index.d.ts +32 -0
  115. package/es/index.mjs +32 -40
  116. package/es/index.mjs.map +1 -1
  117. package/es/oracle.d.ts +154 -0
  118. package/es/oracle.mjs +288 -0
  119. package/es/oracle.mjs.map +1 -0
  120. package/es/spend.d.ts +61 -0
  121. package/es/spend.mjs +122 -0
  122. package/es/spend.mjs.map +1 -0
  123. package/es/tx/builder/constants.d.ts +41 -0
  124. package/es/tx/builder/constants.mjs +11 -19
  125. package/es/tx/builder/constants.mjs.map +1 -1
  126. package/es/tx/builder/field-types.d.ts +62 -0
  127. package/es/tx/builder/field-types.mjs +62 -10
  128. package/es/tx/builder/field-types.mjs.map +1 -1
  129. package/es/tx/builder/helpers.d.ts +131 -0
  130. package/es/tx/builder/helpers.mjs +71 -169
  131. package/es/tx/builder/helpers.mjs.map +1 -1
  132. package/es/tx/builder/index.d.ts +75 -0
  133. package/es/tx/builder/index.mjs +141 -323
  134. package/es/tx/builder/index.mjs.map +1 -1
  135. package/es/tx/builder/schema.d.ts +350 -0
  136. package/es/tx/builder/schema.mjs +173 -510
  137. package/es/tx/builder/schema.mjs.map +1 -1
  138. package/es/tx/index.d.ts +63 -0
  139. package/es/tx/index.mjs +171 -265
  140. package/es/tx/index.mjs.map +1 -1
  141. package/es/tx/min-fee.d.ts +20 -0
  142. package/es/tx/min-fee.mjs +148 -0
  143. package/es/tx/min-fee.mjs.map +1 -0
  144. package/es/tx/validator.d.ts +19 -0
  145. package/es/tx/validator.mjs +64 -71
  146. package/es/tx/validator.mjs.map +1 -1
  147. package/es/typings/@aeternity__argon2-browser/index.d.mjs +2 -0
  148. package/es/typings/@aeternity__argon2-browser/index.d.mjs.map +1 -0
  149. package/es/typings/@aeternity__uuid/index.d.mjs +2 -0
  150. package/es/typings/@aeternity__uuid/index.d.mjs.map +1 -0
  151. package/es/typings/bip32-path/index.d.mjs +2 -0
  152. package/es/typings/bip32-path/index.d.mjs.map +1 -0
  153. package/es/typings/blakejs/index.d.mjs.map +1 -1
  154. package/es/typings/tweetnacl-auth/index.d.mjs +2 -0
  155. package/es/typings/tweetnacl-auth/index.d.mjs.map +1 -0
  156. package/es/utils/amount-formatter.d.ts +42 -0
  157. package/es/utils/amount-formatter.mjs +28 -41
  158. package/es/utils/amount-formatter.mjs.map +1 -1
  159. package/es/utils/autorest.d.ts +6 -0
  160. package/es/utils/autorest.mjs +97 -0
  161. package/es/utils/autorest.mjs.map +1 -0
  162. package/es/utils/bignumber.d.ts +13 -0
  163. package/es/utils/bignumber.mjs +10 -8
  164. package/es/utils/bignumber.mjs.map +1 -1
  165. package/es/{bytes.d.ts → utils/bytes.d.ts} +10 -13
  166. package/es/utils/bytes.mjs +10 -14
  167. package/es/utils/bytes.mjs.map +1 -1
  168. package/es/utils/crypto.d.ts +103 -0
  169. package/es/utils/crypto.mjs +60 -68
  170. package/es/utils/crypto.mjs.map +1 -1
  171. package/es/utils/encoder.d.ts +26 -0
  172. package/es/utils/encoder.mjs +47 -51
  173. package/es/utils/encoder.mjs.map +1 -1
  174. package/es/{errors.d.ts → utils/errors.d.ts} +254 -57
  175. package/es/utils/errors.mjs +318 -125
  176. package/es/utils/errors.mjs.map +1 -1
  177. package/es/utils/hd-wallet.d.ts +34 -0
  178. package/es/utils/hd-wallet.mjs +27 -16
  179. package/es/utils/hd-wallet.mjs.map +1 -1
  180. package/es/utils/json-big.d.ts +5 -0
  181. package/es/utils/json-big.mjs +10 -14
  182. package/es/utils/json-big.mjs.map +1 -1
  183. package/es/utils/keystore.d.ts +51 -0
  184. package/es/utils/keystore.mjs +98 -193
  185. package/es/utils/keystore.mjs.map +1 -1
  186. package/es/{mptree.d.ts → utils/mptree.d.ts} +5 -8
  187. package/es/utils/mptree.mjs +13 -14
  188. package/es/utils/mptree.mjs.map +1 -1
  189. package/es/utils/other.d.ts +14 -0
  190. package/es/utils/other.mjs +21 -36
  191. package/es/utils/other.mjs.map +1 -1
  192. package/es/{semver-satisfies.d.ts → utils/semver-satisfies.d.ts} +0 -0
  193. package/es/utils/semver-satisfies.mjs.map +1 -1
  194. package/es/utils/string.d.ts +24 -0
  195. package/es/utils/string.mjs +8 -10
  196. package/es/utils/string.mjs.map +1 -1
  197. package/package.json +49 -39
  198. package/src/AeSdk.ts +65 -0
  199. package/src/AeSdkAepp.ts +167 -0
  200. package/src/AeSdkBase.ts +320 -0
  201. package/src/AeSdkWallet.ts +332 -0
  202. package/src/Node.ts +167 -0
  203. package/src/account/Base.ts +114 -0
  204. package/src/account/Memory.ts +83 -0
  205. package/src/account/Rpc.ts +67 -0
  206. package/src/aens.ts +391 -0
  207. package/src/aepp-wallet-communication/connection/Browser.ts +68 -0
  208. package/src/aepp-wallet-communication/connection/BrowserRuntime.ts +58 -0
  209. package/src/aepp-wallet-communication/connection/BrowserWindowMessage.ts +111 -0
  210. package/{es/utils/crypto-ts.mjs → src/aepp-wallet-communication/connection-proxy.ts} +16 -17
  211. package/src/aepp-wallet-communication/rpc/RpcClient.ts +137 -0
  212. package/src/aepp-wallet-communication/rpc/types.ts +66 -0
  213. package/src/aepp-wallet-communication/schema.ts +181 -0
  214. package/src/aepp-wallet-communication/wallet-detector.ts +71 -0
  215. package/src/apis/compiler/code-model-v4.yaml +2649 -0
  216. package/src/apis/compiler/compiler.ts +585 -0
  217. package/src/apis/compiler/index.ts +2 -0
  218. package/src/apis/compiler/models/index.ts +301 -0
  219. package/src/apis/compiler/models/mappers.ts +583 -0
  220. package/src/apis/compiler/models/parameters.ts +93 -0
  221. package/src/apis/node/code-model-v4.yaml +10046 -0
  222. package/src/apis/node/index.ts +2 -0
  223. package/src/apis/node/models/index.ts +1253 -0
  224. package/src/apis/node/models/mappers.ts +4278 -0
  225. package/src/apis/node/models/parameters.ts +188 -0
  226. package/src/apis/node/node.ts +1299 -0
  227. package/src/chain.ts +444 -0
  228. package/src/channel/{handlers.js → handlers.ts} +220 -128
  229. package/src/channel/index.ts +991 -0
  230. package/src/channel/internal.ts +345 -0
  231. package/src/contract/Compiler.ts +66 -0
  232. package/src/contract/aci.ts +529 -0
  233. package/src/contract/ga.ts +178 -0
  234. package/src/contract/methods.ts +118 -0
  235. package/src/index.ts +51 -0
  236. package/src/oracle.ts +342 -0
  237. package/src/spend.ts +152 -0
  238. package/src/tx/builder/{constants.js → constants.ts} +12 -16
  239. package/src/tx/builder/field-types.ts +111 -0
  240. package/src/tx/builder/helpers.ts +253 -0
  241. package/src/tx/builder/index.ts +394 -0
  242. package/src/tx/builder/schema.ts +771 -0
  243. package/src/tx/index.ts +199 -0
  244. package/src/tx/min-fee.ts +136 -0
  245. package/src/tx/validator.ts +226 -0
  246. package/src/typings/@aeternity__argon2-browser/index.d.ts +3 -0
  247. package/src/typings/@aeternity__uuid/index.d.ts +3 -0
  248. package/src/typings/bip32-path/index.d.ts +33 -0
  249. package/src/typings/tweetnacl-auth/index.d.ts +14 -0
  250. package/src/utils/amount-formatter.ts +29 -42
  251. package/src/utils/autorest.ts +90 -0
  252. package/src/utils/bignumber.ts +9 -11
  253. package/src/utils/bytes.ts +12 -14
  254. package/src/utils/crypto.ts +217 -0
  255. package/src/utils/encoder.ts +52 -55
  256. package/src/utils/errors.ts +268 -134
  257. package/src/utils/hd-wallet.ts +134 -0
  258. package/src/utils/json-big.ts +26 -0
  259. package/src/utils/keystore.ts +179 -0
  260. package/src/utils/mptree.ts +14 -14
  261. package/src/utils/other.ts +28 -43
  262. package/src/utils/string.ts +8 -10
  263. package/es/account/base.mjs +0 -179
  264. package/es/account/base.mjs.map +0 -1
  265. package/es/account/memory.mjs +0 -99
  266. package/es/account/memory.mjs.map +0 -1
  267. package/es/account/multiple.mjs +0 -179
  268. package/es/account/multiple.mjs.map +0 -1
  269. package/es/ae/aens.mjs +0 -404
  270. package/es/ae/aens.mjs.map +0 -1
  271. package/es/ae/aepp.mjs +0 -45
  272. package/es/ae/aepp.mjs.map +0 -1
  273. package/es/ae/contract.mjs +0 -159
  274. package/es/ae/contract.mjs.map +0 -1
  275. package/es/ae/index.mjs +0 -207
  276. package/es/ae/index.mjs.map +0 -1
  277. package/es/ae/oracle.mjs +0 -339
  278. package/es/ae/oracle.mjs.map +0 -1
  279. package/es/ae/universal.mjs +0 -45
  280. package/es/ae/universal.mjs.map +0 -1
  281. package/es/ae/wallet.mjs +0 -50
  282. package/es/ae/wallet.mjs.map +0 -1
  283. package/es/amount-formatter.d.ts +0 -58
  284. package/es/bignumber.d.ts +0 -18
  285. package/es/chain/index.mjs +0 -272
  286. package/es/chain/index.mjs.map +0 -1
  287. package/es/chain/node.mjs +0 -442
  288. package/es/chain/node.mjs.map +0 -1
  289. package/es/contract/compiler.mjs +0 -115
  290. package/es/contract/compiler.mjs.map +0 -1
  291. package/es/contract/ga/helpers.mjs +0 -30
  292. package/es/contract/ga/helpers.mjs.map +0 -1
  293. package/es/contract/ga/index.mjs +0 -178
  294. package/es/contract/ga/index.mjs.map +0 -1
  295. package/es/crypto-ts.d.ts +0 -9
  296. package/es/encoder.d.ts +0 -26
  297. package/es/node-pool/index.mjs +0 -188
  298. package/es/node-pool/index.mjs.map +0 -1
  299. package/es/node.mjs +0 -133
  300. package/es/node.mjs.map +0 -1
  301. package/es/other.d.ts +0 -31
  302. package/es/string.d.ts +0 -26
  303. package/es/tx/tx-object.mjs +0 -283
  304. package/es/tx/tx-object.mjs.map +0 -1
  305. package/es/tx/tx.mjs +0 -938
  306. package/es/tx/tx.mjs.map +0 -1
  307. package/es/utils/aepp-wallet-communication/connection/browser-runtime.mjs +0 -132
  308. package/es/utils/aepp-wallet-communication/connection/browser-runtime.mjs.map +0 -1
  309. package/es/utils/aepp-wallet-communication/connection/browser-window-message.mjs +0 -183
  310. package/es/utils/aepp-wallet-communication/connection/browser-window-message.mjs.map +0 -1
  311. package/es/utils/aepp-wallet-communication/connection/index.mjs +0 -87
  312. package/es/utils/aepp-wallet-communication/connection/index.mjs.map +0 -1
  313. package/es/utils/aepp-wallet-communication/content-script-bridge.mjs +0 -98
  314. package/es/utils/aepp-wallet-communication/content-script-bridge.mjs.map +0 -1
  315. package/es/utils/aepp-wallet-communication/helpers.mjs +0 -92
  316. package/es/utils/aepp-wallet-communication/helpers.mjs.map +0 -1
  317. package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.mjs +0 -375
  318. package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.mjs.map +0 -1
  319. package/es/utils/aepp-wallet-communication/rpc/rpc-client.mjs +0 -275
  320. package/es/utils/aepp-wallet-communication/rpc/rpc-client.mjs.map +0 -1
  321. package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.mjs +0 -541
  322. package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.mjs.map +0 -1
  323. package/es/utils/aepp-wallet-communication/schema.mjs +0 -102
  324. package/es/utils/aepp-wallet-communication/schema.mjs.map +0 -1
  325. package/es/utils/aepp-wallet-communication/wallet-detector.mjs +0 -110
  326. package/es/utils/aepp-wallet-communication/wallet-detector.mjs.map +0 -1
  327. package/es/utils/async-init.mjs +0 -64
  328. package/es/utils/async-init.mjs.map +0 -1
  329. package/es/utils/crypto-ts.mjs.map +0 -1
  330. package/es/utils/swagger.mjs +0 -164
  331. package/es/utils/swagger.mjs.map +0 -1
  332. package/src/account/base.js +0 -153
  333. package/src/account/memory.js +0 -83
  334. package/src/account/multiple.js +0 -162
  335. package/src/ae/aens.js +0 -361
  336. package/src/ae/aepp.js +0 -45
  337. package/src/ae/contract.js +0 -148
  338. package/src/ae/index.js +0 -168
  339. package/src/ae/oracle.js +0 -311
  340. package/src/ae/universal.js +0 -47
  341. package/src/ae/wallet.js +0 -50
  342. package/src/chain/index.js +0 -269
  343. package/src/chain/node.js +0 -320
  344. package/src/channel/index.js +0 -903
  345. package/src/channel/internal.js +0 -236
  346. package/src/contract/aci.js +0 -376
  347. package/src/contract/compiler.js +0 -100
  348. package/src/contract/ga/helpers.js +0 -19
  349. package/src/contract/ga/index.js +0 -150
  350. package/src/index.js +0 -89
  351. package/src/node-pool/index.js +0 -172
  352. package/src/node.js +0 -116
  353. package/src/tx/builder/field-types.js +0 -61
  354. package/src/tx/builder/helpers.js +0 -334
  355. package/src/tx/builder/index.js +0 -465
  356. package/src/tx/builder/schema.js +0 -1100
  357. package/src/tx/index.js +0 -301
  358. package/src/tx/tx-object.js +0 -187
  359. package/src/tx/tx.js +0 -631
  360. package/src/tx/validator.js +0 -181
  361. package/src/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -119
  362. package/src/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -165
  363. package/src/utils/aepp-wallet-communication/connection/index.js +0 -85
  364. package/src/utils/aepp-wallet-communication/content-script-bridge.js +0 -86
  365. package/src/utils/aepp-wallet-communication/helpers.js +0 -60
  366. package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -294
  367. package/src/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -232
  368. package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -401
  369. package/src/utils/aepp-wallet-communication/schema.ts +0 -80
  370. package/src/utils/aepp-wallet-communication/wallet-detector.js +0 -92
  371. package/src/utils/async-init.js +0 -45
  372. package/src/utils/crypto.js +0 -219
  373. package/src/utils/hd-wallet.js +0 -100
  374. package/src/utils/json-big.js +0 -26
  375. package/src/utils/keystore.js +0 -219
  376. package/src/utils/swagger.js +0 -156
@@ -1,7 +1,3 @@
1
- import _buffer from "buffer";
2
- const {
3
- Buffer: _Buffer
4
- } = _buffer;
5
1
  import nacl from 'tweetnacl';
6
2
  import { v4 as uuid } from '@aeternity/uuid';
7
3
  import _aeternityArgon2BrowserDistArgon2BundledMinJs from '@aeternity/argon2-browser/dist/argon2-bundled.min.js';
@@ -9,232 +5,141 @@ const {
9
5
  ArgonType,
10
6
  hash
11
7
  } = _aeternityArgon2BrowserDistArgon2BundledMinJs;
12
- import { encode } from "../tx/builder/helpers.mjs";
13
- import { str2buf } from "./bytes.mjs";
14
- import { ArgumentError, InvalidKeyError, UnsupportedAlgorithmError, InvalidPasswordError } from "./errors.mjs";
15
- /**
16
- * KeyStore module
17
- * @module @aeternity/aepp-sdk/es/utils/keystore
18
- * @example import { Keystore } from '@aeternity/aepp-sdk'
19
- * @example const { Keystore } = require('@aeternity/aepp-sdk')
20
- */
21
-
22
- const DEFAULTS = {
23
- crypto: {
24
- secret_type: 'ed25519',
25
- symmetric_alg: 'xsalsa20-poly1305',
26
- kdf: 'argon2id',
27
- kdf_params: {
28
- memlimit_kib: 65536,
29
- opslimit: 3,
30
- parallelism: 1
31
- }
8
+ import { getAddressFromPriv } from "./crypto.mjs";
9
+ import { bytesToHex, hexToBytes } from "./bytes.mjs";
10
+ import { InvalidPasswordError } from "./errors.mjs";
11
+ const DERIVED_KEY_FUNCTIONS = {
12
+ async argon2id(pass, salt, params) {
13
+ const {
14
+ memlimit_kib: mem,
15
+ opslimit: time
16
+ } = params;
17
+ return (await hash({
18
+ hashLen: 32,
19
+ pass,
20
+ salt,
21
+ time,
22
+ mem,
23
+ type: ArgonType.Argon2id
24
+ })).hash;
32
25
  }
33
- }; // DERIVED KEY PART
34
26
 
35
- const DERIVED_KEY_FUNCTIONS = {
36
- argon2id: deriveKeyUsingArgon2id
37
27
  };
38
- export async function deriveKeyUsingArgon2id(pass, salt, options) {
39
- const {
40
- memlimit_kib: mem,
41
- opslimit: time
42
- } = options.kdf_params;
43
- const result = (await hash({
44
- hashLen: 32,
45
- pass,
46
- salt,
47
- time,
48
- mem,
49
- type: ArgonType.Argon2id
50
- })).hash;
51
- return _Buffer.from(result);
52
- } // CRYPTO PART
53
-
54
28
  const CRYPTO_FUNCTIONS = {
55
29
  'xsalsa20-poly1305': {
56
- encrypt: encryptXsalsa20Poly1305,
57
- decrypt: decryptXsalsa20Poly1305
58
- }
59
- };
30
+ encrypt: nacl.secretbox,
60
31
 
61
- function encryptXsalsa20Poly1305(_ref) {
62
- let {
63
- plaintext,
64
- key,
65
- nonce
66
- } = _ref;
67
- return nacl.secretbox(plaintext, nonce, key);
68
- }
32
+ decrypt() {
33
+ const res = nacl.secretbox.open(...arguments);
34
+ if (res == null) throw new InvalidPasswordError();
35
+ return res;
36
+ }
69
37
 
70
- function decryptXsalsa20Poly1305(_ref2) {
71
- let {
72
- ciphertext,
73
- key,
74
- nonce
75
- } = _ref2;
76
- const res = nacl.secretbox.open(ciphertext, nonce, key);
77
- if (!res) throw new InvalidPasswordError('Invalid password or nonce');
78
- return res;
79
- }
38
+ }
39
+ };
40
+ const CRYPTO_DEFAULTS = {
41
+ secret_type: 'ed25519',
42
+ symmetric_alg: 'xsalsa20-poly1305',
43
+ kdf: 'argon2id',
44
+ kdf_params: {
45
+ memlimit_kib: 65536,
46
+ opslimit: 3,
47
+ parallelism: 1
48
+ }
49
+ };
80
50
  /**
81
51
  * Symmetric private key encryption using secret (derived) key.
82
- * @param {Buffer|string} plaintext Data to be encrypted.
83
- * @param {Buffer|string} key Secret key.
84
- * @param {Buffer|string} nonce Randomly generated nonce.
85
- * @param {string=} algo Encryption algorithm (default: DEFAULTS.crypto.symmetric_alg).
86
- * @return {Buffer} Encrypted data.
52
+ * @param plaintext - Data to be encrypted.
53
+ * @param key - Secret key.
54
+ * @param nonce - Randomly generated nonce.
55
+ * @param algo - Encryption algorithm.
56
+ * @returns Encrypted data.
87
57
  */
88
58
 
89
-
90
59
  function encrypt(plaintext, key, nonce) {
91
- let algo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULTS.crypto.symmetric_alg;
92
- if (!CRYPTO_FUNCTIONS[algo]) throw new UnsupportedAlgorithmError(algo);
93
- return CRYPTO_FUNCTIONS[algo].encrypt({
94
- plaintext,
95
- nonce,
96
- key
97
- });
60
+ let algo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : CRYPTO_DEFAULTS.symmetric_alg;
61
+ return CRYPTO_FUNCTIONS[algo].encrypt(plaintext, nonce, key);
98
62
  }
99
63
  /**
100
64
  * Symmetric private key decryption using secret (derived) key.
101
- * @param {Buffer|Uint8Array} ciphertext Data to be decrypted.
102
- * @param {Buffer|Uint8Array} key Secret key.
103
- * @param {Buffer|Uint8Array} nonce Nonce from key-object.
104
- * @param {string=} algo Encryption algorithm.
105
- * @return {Buffer} Decrypted data.
65
+ * @param ciphertext - Data to be decrypted.
66
+ * @param key - Secret key.
67
+ * @param nonce - Nonce from key-object.
68
+ * @param algo - Encryption algorithm.
69
+ * @returns Decrypted data.
106
70
  */
107
71
 
108
72
 
109
- function decrypt(ciphertext, key, nonce, algo) {
110
- if (!CRYPTO_FUNCTIONS[algo]) throw new UnsupportedAlgorithmError(algo);
111
- return CRYPTO_FUNCTIONS[algo].decrypt({
112
- ciphertext,
113
- nonce,
114
- key
115
- });
73
+ function decrypt(ciphertext, key, nonce) {
74
+ let algo = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : CRYPTO_DEFAULTS.symmetric_alg;
75
+ return CRYPTO_FUNCTIONS[algo].decrypt(ciphertext, nonce, key);
116
76
  }
117
77
  /**
118
78
  * Derive secret key from password with key derivation function.
119
- * @param {string} password User-supplied password.
120
- * @param {Buffer|Uint8Array} nonce Randomly generated nonce.
121
- * @param {Object=} options Encryption parameters.
122
- * @param {string=} options.kdf Key derivation function (default: DEFAULTS.crypto.kdf).
123
- * @param {Object=} options.kdf_params KDF parameters (default: DEFAULTS.crypto.kdf_params).
124
- * @return {Buffer} Secret key derived from password.
79
+ * @param password - User-supplied password.
80
+ * @param nonce - Randomly generated nonce.
81
+ * @param kdf - Key derivation function.
82
+ * @param kdfParams - KDF parameters.
83
+ * @returns Secret key derived from password.
125
84
  */
126
85
 
127
86
 
128
- async function deriveKey(password, nonce) {
129
- let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
130
- kdf_params: DEFAULTS.crypto.kdf_params,
131
- kdf: DEFAULTS.crypto.kdf
132
- };
133
- if (!nonce) throw new ArgumentError('nonce', 'provided', nonce);
134
- if (password == null) throw new ArgumentError('password', 'provided', password);
87
+ async function deriveKey(password, nonce, kdf, kdfParams) {
88
+ return await DERIVED_KEY_FUNCTIONS[kdf](password, nonce, kdfParams);
89
+ }
90
+ /**
91
+ * Recover plaintext private key from secret-storage key object.
92
+ * @param password - Keystore object password.
93
+ * @param keystore - Keystore object.
94
+ * @returns Plaintext private key.
95
+ */
135
96
 
136
- if (!Object.prototype.hasOwnProperty.call(DERIVED_KEY_FUNCTIONS, options.kdf)) {
137
- throw new UnsupportedAlgorithmError(options.kdf);
138
- }
139
97
 
140
- return DERIVED_KEY_FUNCTIONS[options.kdf](password, nonce, options);
98
+ export async function recover(password, _ref) {
99
+ let {
100
+ crypto
101
+ } = _ref;
102
+ const salt = hexToBytes(crypto.kdf_params.salt);
103
+ return bytesToHex(decrypt(hexToBytes(crypto.ciphertext), await deriveKey(password, salt, crypto.kdf, crypto.kdf_params), hexToBytes(crypto.cipher_params.nonce), crypto.symmetric_alg));
141
104
  }
142
105
  /**
143
- * Assemble key data object in secret-storage format.
144
- * @param {Buffer} name Key name.
145
- * @param {Buffer} derivedKey Password-derived secret key.
146
- * @param {Buffer} privateKey Private key.
147
- * @param {Buffer} nonce Randomly generated 24byte nonce.
148
- * @param {Buffer} salt Randomly generated 16byte salt.
149
- * @param {Object=} options Encryption parameters.
150
- * @param {string=} options.kdf Key derivation function (default: argon2id).
151
- * @param {string=} options.cipher Symmetric cipher (default: constants.cipher).
152
- * @param {Object=} options.kdf_params KDF parameters (default: constants.<kdf>).
153
- * @return {Object}
106
+ * Export private key to keystore secret-storage format.
107
+ * @param name - Key name.
108
+ * @param password - User-supplied password.
109
+ * @param privateKey - Private key as hex-string or a Buffer.
110
+ * @param nonce - Randomly generated 24byte nonce.
111
+ * @param salt - Randomly generated 16byte salt.
112
+ * @param options - Encryption parameters.
113
+ * @param options.kdf - Key derivation function.
114
+ * @param options.kdf_params - KDF parameters.
154
115
  */
155
116
 
156
-
157
- function marshal(name, derivedKey, privateKey, nonce, salt) {
158
- let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
159
- const opt = Object.assign({}, DEFAULTS.crypto, options);
160
- return Object.assign({
117
+ export async function dump(name, password, privateKey) {
118
+ let nonce = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nacl.randomBytes(24);
119
+ let salt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : nacl.randomBytes(16);
120
+ let options = arguments.length > 5 ? arguments[5] : undefined;
121
+ const opt = { ...CRYPTO_DEFAULTS,
122
+ ...options
123
+ };
124
+ const derivedKey = await deriveKey(password, salt, opt.kdf, opt.kdf_params);
125
+ const payload = typeof privateKey === 'string' ? hexToBytes(privateKey) : privateKey;
126
+ return {
161
127
  name,
162
128
  version: 1,
163
- public_key: getAddressFromPriv(privateKey),
164
- id: uuid()
165
- }, {
166
- crypto: Object.assign({
129
+ public_key: getAddressFromPriv(payload),
130
+ id: uuid(),
131
+ crypto: {
167
132
  secret_type: opt.secret_type,
168
133
  symmetric_alg: opt.symmetric_alg,
169
- ciphertext: _Buffer.from(encrypt(_Buffer.from(privateKey), derivedKey, nonce, opt.symmetric_alg)).toString('hex'),
134
+ ciphertext: bytesToHex(encrypt(payload, derivedKey, nonce, opt.symmetric_alg)),
170
135
  cipher_params: {
171
- nonce: _Buffer.from(nonce).toString('hex')
172
- }
173
- }, {
136
+ nonce: bytesToHex(nonce)
137
+ },
174
138
  kdf: opt.kdf,
175
139
  kdf_params: { ...opt.kdf_params,
176
- salt: _Buffer.from(salt).toString('hex')
140
+ salt: bytesToHex(salt)
177
141
  }
178
- })
179
- });
180
- }
181
-
182
- export function getAddressFromPriv(secret) {
183
- const keys = nacl.sign.keyPair.fromSecretKey(str2buf(secret));
184
-
185
- const publicBuffer = _Buffer.from(keys.publicKey);
186
-
187
- return encode(publicBuffer, 'ak');
188
- }
189
- /**
190
- * Recover plaintext private key from secret-storage key object.
191
- * @param {String} password Keystore object password.
192
- * @param {Object} keyObject Keystore object.
193
- * @return {Buffer} Plaintext private key.
194
- */
195
-
196
- export async function recover(password, keyObject) {
197
- validateKeyObj(keyObject);
198
- const nonce = Uint8Array.from(str2buf(keyObject.crypto.cipher_params.nonce));
199
- const salt = Uint8Array.from(str2buf(keyObject.crypto.kdf_params.salt));
200
- const kdfParams = keyObject.crypto.kdf_params;
201
- const kdf = keyObject.crypto.kdf;
202
- const key = await decrypt(Uint8Array.from(str2buf(keyObject.crypto.ciphertext)), await deriveKey(password, salt, {
203
- kdf,
204
- kdf_params: kdfParams
205
- }), nonce, keyObject.crypto.symmetric_alg);
206
- if (!key) throw new InvalidPasswordError('Invalid password');
207
- if (_Buffer.from(key).length === 64) return _Buffer.from(key).toString('hex');
208
- return _Buffer.from(key).toString('utf-8');
209
- }
210
- /**
211
- * Export private key to keystore secret-storage format.
212
- * @param {String} name Key name.
213
- * @param {String} password User-supplied password.
214
- * @param {String|Buffer} privateKey Private key as hex-string or a Buffer.
215
- * @param {Buffer} nonce Randomly generated 24byte nonce.
216
- * @param {Buffer} salt Randomly generated 16byte salt.
217
- * @param {Object=} options Encryption parameters.
218
- * @param {String=} options.kdf Key derivation function (default: pbkdf2).
219
- * @param {String=} options.cipher Symmetric cipher (default: constants.cipher).
220
- * @param {Object=} options.kdfparams KDF parameters (default: constants.<kdf>).
221
- * @return {Object}
222
- */
223
-
224
- export async function dump(name, password, privateKey) {
225
- let nonce = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : nacl.randomBytes(24);
226
- let salt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : nacl.randomBytes(16);
227
- let options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
228
- const opt = Object.assign({}, DEFAULTS.crypto, options);
229
- return marshal(name, await deriveKey(password, salt, opt), typeof privateKey === 'string' ? _Buffer.from(privateKey, 'hex') : privateKey, nonce, salt, opt);
230
- }
231
- export function validateKeyObj(obj) {
232
- const root = ['crypto', 'id', 'version', 'public_key'];
233
- const cryptoKeys = ['cipher_params', 'ciphertext', 'symmetric_alg', 'kdf', 'kdf_params'];
234
- const missingRootKeys = root.filter(key => !Object.prototype.hasOwnProperty.call(obj, key));
235
- if (missingRootKeys.length) throw new InvalidKeyError(`Invalid key file format. Require properties: ${missingRootKeys}`);
236
- const missingCryptoKeys = cryptoKeys.filter(key => !Object.prototype.hasOwnProperty.call(obj.crypto, key));
237
- if (missingCryptoKeys.length) throw new InvalidKeyError(`Invalid key file format. Require properties: ${missingCryptoKeys}`);
238
- return true;
142
+ }
143
+ };
239
144
  }
240
145
  //# sourceMappingURL=keystore.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/keystore.js"],"names":["nacl","v4","uuid","encode","str2buf","ArgumentError","InvalidKeyError","UnsupportedAlgorithmError","InvalidPasswordError","DEFAULTS","crypto","secret_type","symmetric_alg","kdf","kdf_params","memlimit_kib","opslimit","parallelism","DERIVED_KEY_FUNCTIONS","argon2id","deriveKeyUsingArgon2id","pass","salt","options","mem","time","result","hash","hashLen","type","ArgonType","Argon2id","from","CRYPTO_FUNCTIONS","encrypt","encryptXsalsa20Poly1305","decrypt","decryptXsalsa20Poly1305","plaintext","key","nonce","secretbox","ciphertext","res","open","algo","deriveKey","password","Object","prototype","hasOwnProperty","call","marshal","name","derivedKey","privateKey","opt","assign","version","public_key","getAddressFromPriv","id","toString","cipher_params","secret","keys","sign","keyPair","fromSecretKey","publicBuffer","publicKey","recover","keyObject","validateKeyObj","Uint8Array","kdfParams","length","dump","randomBytes","obj","root","cryptoKeys","missingRootKeys","filter","missingCryptoKeys"],"mappings":"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","sourcesContent":["import nacl from 'tweetnacl'\nimport { v4 as uuid } from '@aeternity/uuid'\nimport { ArgonType, hash } from '@aeternity/argon2-browser/dist/argon2-bundled.min.js'\nimport { encode } from '../tx/builder/helpers'\nimport { str2buf } from './bytes'\nimport {\n ArgumentError, InvalidKeyError, UnsupportedAlgorithmError, InvalidPasswordError\n} from './errors'\n\n/**\n * KeyStore module\n * @module @aeternity/aepp-sdk/es/utils/keystore\n * @example import { Keystore } from '@aeternity/aepp-sdk'\n * @example const { Keystore } = require('@aeternity/aepp-sdk')\n */\n\nconst DEFAULTS = {\n crypto: {\n secret_type: 'ed25519',\n symmetric_alg: 'xsalsa20-poly1305',\n kdf: 'argon2id',\n kdf_params: {\n memlimit_kib: 65536,\n opslimit: 3,\n parallelism: 1\n }\n }\n}\n\n// DERIVED KEY PART\nconst DERIVED_KEY_FUNCTIONS = {\n argon2id: deriveKeyUsingArgon2id\n}\n\nexport async function deriveKeyUsingArgon2id (pass, salt, options) {\n const { memlimit_kib: mem, opslimit: time } = options.kdf_params\n\n const result = (await hash({\n hashLen: 32,\n pass,\n salt,\n time,\n mem,\n type: ArgonType.Argon2id\n })).hash\n return Buffer.from(result)\n}\n\n// CRYPTO PART\nconst CRYPTO_FUNCTIONS = {\n 'xsalsa20-poly1305': { encrypt: encryptXsalsa20Poly1305, decrypt: decryptXsalsa20Poly1305 }\n}\n\nfunction encryptXsalsa20Poly1305 ({ plaintext, key, nonce }) {\n return nacl.secretbox(plaintext, nonce, key)\n}\n\nfunction decryptXsalsa20Poly1305 ({ ciphertext, key, nonce }) {\n const res = nacl.secretbox.open(ciphertext, nonce, key)\n if (!res) throw new InvalidPasswordError('Invalid password or nonce')\n return res\n}\n\n/**\n * Symmetric private key encryption using secret (derived) key.\n * @param {Buffer|string} plaintext Data to be encrypted.\n * @param {Buffer|string} key Secret key.\n * @param {Buffer|string} nonce Randomly generated nonce.\n * @param {string=} algo Encryption algorithm (default: DEFAULTS.crypto.symmetric_alg).\n * @return {Buffer} Encrypted data.\n */\nfunction encrypt (plaintext, key, nonce, algo = DEFAULTS.crypto.symmetric_alg) {\n if (!CRYPTO_FUNCTIONS[algo]) throw new UnsupportedAlgorithmError(algo)\n return CRYPTO_FUNCTIONS[algo].encrypt({ plaintext, nonce, key })\n}\n\n/**\n * Symmetric private key decryption using secret (derived) key.\n * @param {Buffer|Uint8Array} ciphertext Data to be decrypted.\n * @param {Buffer|Uint8Array} key Secret key.\n * @param {Buffer|Uint8Array} nonce Nonce from key-object.\n * @param {string=} algo Encryption algorithm.\n * @return {Buffer} Decrypted data.\n */\nfunction decrypt (ciphertext, key, nonce, algo) {\n if (!CRYPTO_FUNCTIONS[algo]) throw new UnsupportedAlgorithmError(algo)\n return CRYPTO_FUNCTIONS[algo].decrypt({ ciphertext, nonce, key })\n}\n\n/**\n * Derive secret key from password with key derivation function.\n * @param {string} password User-supplied password.\n * @param {Buffer|Uint8Array} nonce Randomly generated nonce.\n * @param {Object=} options Encryption parameters.\n * @param {string=} options.kdf Key derivation function (default: DEFAULTS.crypto.kdf).\n * @param {Object=} options.kdf_params KDF parameters (default: DEFAULTS.crypto.kdf_params).\n * @return {Buffer} Secret key derived from password.\n */\nasync function deriveKey (password, nonce, options = {\n kdf_params: DEFAULTS.crypto.kdf_params,\n kdf: DEFAULTS.crypto.kdf\n}) {\n if (!nonce) throw new ArgumentError('nonce', 'provided', nonce)\n if (password == null) throw new ArgumentError('password', 'provided', password)\n\n if (!Object.prototype.hasOwnProperty.call(DERIVED_KEY_FUNCTIONS, options.kdf)) {\n throw new UnsupportedAlgorithmError(options.kdf)\n }\n\n return DERIVED_KEY_FUNCTIONS[options.kdf](password, nonce, options)\n}\n\n/**\n * Assemble key data object in secret-storage format.\n * @param {Buffer} name Key name.\n * @param {Buffer} derivedKey Password-derived secret key.\n * @param {Buffer} privateKey Private key.\n * @param {Buffer} nonce Randomly generated 24byte nonce.\n * @param {Buffer} salt Randomly generated 16byte salt.\n * @param {Object=} options Encryption parameters.\n * @param {string=} options.kdf Key derivation function (default: argon2id).\n * @param {string=} options.cipher Symmetric cipher (default: constants.cipher).\n * @param {Object=} options.kdf_params KDF parameters (default: constants.<kdf>).\n * @return {Object}\n */\nfunction marshal (name, derivedKey, privateKey, nonce, salt, options = {}) {\n const opt = Object.assign({}, DEFAULTS.crypto, options)\n return Object.assign(\n { name, version: 1, public_key: getAddressFromPriv(privateKey), id: uuid() },\n {\n crypto: Object.assign(\n {\n secret_type: opt.secret_type,\n symmetric_alg: opt.symmetric_alg,\n ciphertext: Buffer.from(encrypt(Buffer.from(privateKey), derivedKey, nonce, opt.symmetric_alg)).toString('hex'),\n cipher_params: { nonce: Buffer.from(nonce).toString('hex') }\n },\n { kdf: opt.kdf, kdf_params: { ...opt.kdf_params, salt: Buffer.from(salt).toString('hex') } }\n )\n }\n )\n}\n\nexport function getAddressFromPriv (secret) {\n const keys = nacl.sign.keyPair.fromSecretKey(str2buf(secret))\n const publicBuffer = Buffer.from(keys.publicKey)\n return encode(publicBuffer, 'ak')\n}\n\n/**\n * Recover plaintext private key from secret-storage key object.\n * @param {String} password Keystore object password.\n * @param {Object} keyObject Keystore object.\n * @return {Buffer} Plaintext private key.\n */\nexport async function recover (password, keyObject) {\n validateKeyObj(keyObject)\n const nonce = Uint8Array.from(str2buf(keyObject.crypto.cipher_params.nonce))\n const salt = Uint8Array.from(str2buf(keyObject.crypto.kdf_params.salt))\n const kdfParams = keyObject.crypto.kdf_params\n const kdf = keyObject.crypto.kdf\n\n const key = await decrypt(\n Uint8Array.from(str2buf(keyObject.crypto.ciphertext)),\n await deriveKey(password, salt, { kdf, kdf_params: kdfParams }),\n nonce,\n keyObject.crypto.symmetric_alg\n )\n if (!key) throw new InvalidPasswordError('Invalid password')\n\n if (Buffer.from(key).length === 64) return Buffer.from(key).toString('hex')\n return Buffer.from(key).toString('utf-8')\n}\n\n/**\n * Export private key to keystore secret-storage format.\n * @param {String} name Key name.\n * @param {String} password User-supplied password.\n * @param {String|Buffer} privateKey Private key as hex-string or a Buffer.\n * @param {Buffer} nonce Randomly generated 24byte nonce.\n * @param {Buffer} salt Randomly generated 16byte salt.\n * @param {Object=} options Encryption parameters.\n * @param {String=} options.kdf Key derivation function (default: pbkdf2).\n * @param {String=} options.cipher Symmetric cipher (default: constants.cipher).\n * @param {Object=} options.kdfparams KDF parameters (default: constants.<kdf>).\n * @return {Object}\n */\nexport async function dump (\n name,\n password,\n privateKey,\n nonce = nacl.randomBytes(24),\n salt = nacl.randomBytes(16),\n options = {}\n) {\n const opt = Object.assign({}, DEFAULTS.crypto, options)\n return marshal(\n name,\n await deriveKey(password, salt, opt),\n typeof privateKey === 'string' ? Buffer.from(privateKey, 'hex') : privateKey,\n nonce,\n salt,\n opt\n )\n}\n\nexport function validateKeyObj (obj) {\n const root = ['crypto', 'id', 'version', 'public_key']\n const cryptoKeys = ['cipher_params', 'ciphertext', 'symmetric_alg', 'kdf', 'kdf_params']\n\n const missingRootKeys = root.filter(key => !Object.prototype.hasOwnProperty.call(obj, key))\n if (missingRootKeys.length) throw new InvalidKeyError(`Invalid key file format. Require properties: ${missingRootKeys}`)\n\n const missingCryptoKeys = cryptoKeys\n .filter(key => !Object.prototype.hasOwnProperty.call(obj.crypto, key))\n if (missingCryptoKeys.length) throw new InvalidKeyError(`Invalid key file format. Require properties: ${missingCryptoKeys}`)\n\n return true\n}\n"],"file":"keystore.mjs"}
1
+ {"version":3,"file":"keystore.mjs","names":["nacl","v4","uuid","getAddressFromPriv","bytesToHex","hexToBytes","InvalidPasswordError","DERIVED_KEY_FUNCTIONS","argon2id","pass","salt","params","memlimit_kib","mem","opslimit","time","hash","hashLen","type","ArgonType","Argon2id","CRYPTO_FUNCTIONS","encrypt","secretbox","decrypt","res","open","CRYPTO_DEFAULTS","secret_type","symmetric_alg","kdf","kdf_params","parallelism","plaintext","key","nonce","algo","ciphertext","deriveKey","password","kdfParams","recover","crypto","cipher_params","dump","name","privateKey","randomBytes","options","opt","derivedKey","payload","version","public_key","id"],"sources":["../../src/utils/keystore.ts"],"sourcesContent":["import nacl from 'tweetnacl'\nimport { v4 as uuid } from '@aeternity/uuid'\nimport { ArgonType, hash } from '@aeternity/argon2-browser/dist/argon2-bundled.min.js'\nimport { getAddressFromPriv } from './crypto'\nimport { bytesToHex, hexToBytes } from './bytes'\nimport { InvalidPasswordError } from './errors'\n\nconst DERIVED_KEY_FUNCTIONS = {\n async argon2id (\n pass: string | Uint8Array,\n salt: string | Uint8Array,\n params: Partial<Keystore['crypto']['kdf_params']>\n ): Promise<Uint8Array> {\n const { memlimit_kib: mem, opslimit: time } = params\n\n return (await hash({\n hashLen: 32,\n pass,\n salt,\n time,\n mem,\n type: ArgonType.Argon2id\n })).hash\n }\n}\n\nconst CRYPTO_FUNCTIONS = {\n 'xsalsa20-poly1305': {\n encrypt: nacl.secretbox,\n decrypt (...args: Parameters<typeof nacl.secretbox.open>): Uint8Array {\n const res = nacl.secretbox.open(...args)\n if (res == null) throw new InvalidPasswordError()\n return res\n }\n }\n}\n\nexport interface Keystore {\n name: string\n version: 1\n public_key: string\n id: string\n crypto: {\n secret_type: 'ed25519'\n symmetric_alg: keyof typeof CRYPTO_FUNCTIONS\n ciphertext: string\n cipher_params: {\n nonce: string\n }\n kdf: keyof typeof DERIVED_KEY_FUNCTIONS\n kdf_params: {\n memlimit_kib: number\n opslimit: number\n parallelism: number\n salt: string\n }\n }\n}\n\nconst CRYPTO_DEFAULTS = {\n secret_type: 'ed25519',\n symmetric_alg: 'xsalsa20-poly1305',\n kdf: 'argon2id',\n kdf_params: {\n memlimit_kib: 65536,\n opslimit: 3,\n parallelism: 1\n }\n} as const\n\n/**\n * Symmetric private key encryption using secret (derived) key.\n * @param plaintext - Data to be encrypted.\n * @param key - Secret key.\n * @param nonce - Randomly generated nonce.\n * @param algo - Encryption algorithm.\n * @returns Encrypted data.\n */\nfunction encrypt (\n plaintext: Uint8Array,\n key: Uint8Array,\n nonce: Uint8Array,\n algo: keyof typeof CRYPTO_FUNCTIONS = CRYPTO_DEFAULTS.symmetric_alg\n): Uint8Array {\n return CRYPTO_FUNCTIONS[algo].encrypt(plaintext, nonce, key)\n}\n\n/**\n * Symmetric private key decryption using secret (derived) key.\n * @param ciphertext - Data to be decrypted.\n * @param key - Secret key.\n * @param nonce - Nonce from key-object.\n * @param algo - Encryption algorithm.\n * @returns Decrypted data.\n */\nfunction decrypt (\n ciphertext: Uint8Array,\n key: Uint8Array,\n nonce: Uint8Array,\n algo: keyof typeof CRYPTO_FUNCTIONS = CRYPTO_DEFAULTS.symmetric_alg\n): Uint8Array {\n return CRYPTO_FUNCTIONS[algo].decrypt(ciphertext, nonce, key)\n}\n\n/**\n * Derive secret key from password with key derivation function.\n * @param password - User-supplied password.\n * @param nonce - Randomly generated nonce.\n * @param kdf - Key derivation function.\n * @param kdfParams - KDF parameters.\n * @returns Secret key derived from password.\n */\nasync function deriveKey (\n password: string | Uint8Array,\n nonce: string | Uint8Array,\n kdf: Keystore['crypto']['kdf'],\n kdfParams: Omit<Keystore['crypto']['kdf_params'], 'salt'>\n): Promise<Uint8Array> {\n return await DERIVED_KEY_FUNCTIONS[kdf](password, nonce, kdfParams)\n}\n\n/**\n * Recover plaintext private key from secret-storage key object.\n * @param password - Keystore object password.\n * @param keystore - Keystore object.\n * @returns Plaintext private key.\n */\nexport async function recover (\n password: string | Uint8Array, { crypto }: Keystore\n): Promise<string> {\n const salt = hexToBytes(crypto.kdf_params.salt)\n return bytesToHex(decrypt(\n hexToBytes(crypto.ciphertext),\n await deriveKey(password, salt, crypto.kdf, crypto.kdf_params),\n hexToBytes(crypto.cipher_params.nonce),\n crypto.symmetric_alg\n ))\n}\n\n/**\n * Export private key to keystore secret-storage format.\n * @param name - Key name.\n * @param password - User-supplied password.\n * @param privateKey - Private key as hex-string or a Buffer.\n * @param nonce - Randomly generated 24byte nonce.\n * @param salt - Randomly generated 16byte salt.\n * @param options - Encryption parameters.\n * @param options.kdf - Key derivation function.\n * @param options.kdf_params - KDF parameters.\n */\nexport async function dump (\n name: string,\n password: string | Uint8Array,\n privateKey: string | Uint8Array,\n nonce: Uint8Array = nacl.randomBytes(24),\n salt: Uint8Array = nacl.randomBytes(16),\n options?: Partial<Keystore['crypto']>\n): Promise<Keystore> {\n const opt = { ...CRYPTO_DEFAULTS, ...options }\n const derivedKey = await deriveKey(password, salt, opt.kdf, opt.kdf_params)\n const payload = typeof privateKey === 'string' ? hexToBytes(privateKey) : privateKey\n return {\n name,\n version: 1,\n public_key: getAddressFromPriv(payload),\n id: uuid(),\n crypto: {\n secret_type: opt.secret_type,\n symmetric_alg: opt.symmetric_alg,\n ciphertext: bytesToHex(encrypt(payload, derivedKey, nonce, opt.symmetric_alg)),\n cipher_params: { nonce: bytesToHex(nonce) },\n kdf: opt.kdf,\n kdf_params: {\n ...opt.kdf_params,\n salt: bytesToHex(salt)\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -6,24 +6,21 @@ export default class MPTree {
6
6
  private static nodeHash;
7
7
  /**
8
8
  * Deserialize Merkle Patricia Tree
9
- * @rtype (binary: Array) => MPTree
10
- * @param {Array} binary - Binary
11
- * @return {MPTree} Merkle Patricia Tree
9
+ * @param binary - Binary
10
+ * @returns Merkle Patricia Tree
12
11
  */
13
12
  constructor(binary: MPTreeBinary);
14
13
  isEqual(tree: MPTree): boolean;
15
14
  private static parseNode;
16
15
  /**
17
16
  * Serialize Merkle Patricia Tree
18
- * @rtype () => Array
19
- * @return {Array} Binary
17
+ * @returns Binary
20
18
  */
21
19
  serialize(): MPTreeBinary;
22
20
  /**
23
21
  * Retrieve value from Merkle Patricia Tree
24
- * @rtype (key: String) => Buffer
25
- * @param {String} key - The key of the element to retrieve
26
- * @return {Buffer} Value associated to the specified key
22
+ * @param key - The key of the element to retrieve
23
+ * @returns Value associated to the specified key
27
24
  */
28
25
  get(key: string): Buffer | undefined;
29
26
  }
@@ -1,4 +1,5 @@
1
1
  import _buffer from "buffer";
2
+ import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
2
3
  const {
3
4
  Buffer: _Buffer
4
5
  } = _buffer;
@@ -23,7 +24,7 @@ import _rlp from 'rlp';
23
24
  const {
24
25
  encode: rlpEncode
25
26
  } = _rlp;
26
- import { hash } from "./crypto-ts.mjs";
27
+ import { hash } from "./crypto.mjs";
27
28
  import { MerkleTreeHashMismatchError, MissingNodeInTreeError, UnknownPathNibbleError, UnknownNodeLengthError } from "./errors.mjs";
28
29
  var NodeType;
29
30
 
@@ -39,9 +40,8 @@ export default class MPTree {
39
40
  }
40
41
  /**
41
42
  * Deserialize Merkle Patricia Tree
42
- * @rtype (binary: Array) => MPTree
43
- * @param {Array} binary - Binary
44
- * @return {MPTree} Merkle Patricia Tree
43
+ * @param binary - Binary
44
+ * @returns Merkle Patricia Tree
45
45
  */
46
46
 
47
47
 
@@ -90,15 +90,16 @@ export default class MPTree {
90
90
 
91
91
  case 2:
92
92
  {
93
- const path = node[0].toString('hex');
94
- const nibble = parseInt(path[0], 16);
93
+ var _context;
94
+
95
+ const nibble = node[0][0] >> 4;
95
96
  if (nibble > 3) throw new UnknownPathNibbleError(nibble);
96
97
  const type = nibble <= 1 ? NodeType.Extension : NodeType.Leaf;
97
- const slice = [0, 2].includes(nibble) ? 2 : 1;
98
+ const slice = _includesInstanceProperty(_context = [0, 2]).call(_context, nibble) ? 2 : 1;
98
99
  return {
99
100
  type,
100
101
  payload: [node[1]],
101
- path: path.slice(slice)
102
+ path: node[0].toString('hex').slice(slice)
102
103
  };
103
104
  }
104
105
 
@@ -108,8 +109,7 @@ export default class MPTree {
108
109
  }
109
110
  /**
110
111
  * Serialize Merkle Patricia Tree
111
- * @rtype () => Array
112
- * @return {Array} Binary
112
+ * @returns Binary
113
113
  */
114
114
 
115
115
 
@@ -121,9 +121,8 @@ export default class MPTree {
121
121
  }
122
122
  /**
123
123
  * Retrieve value from Merkle Patricia Tree
124
- * @rtype (key: String) => Buffer
125
- * @param {String} key - The key of the element to retrieve
126
- * @return {Buffer} Value associated to the specified key
124
+ * @param key - The key of the element to retrieve
125
+ * @returns Value associated to the specified key
127
126
  */
128
127
 
129
128
 
@@ -140,7 +139,7 @@ export default class MPTree {
140
139
  switch (type) {
141
140
  case NodeType.Branch:
142
141
  if (key.length === 0) return payload[16];
143
- searchFrom = payload[parseInt(key[0], 16)].toString('hex');
142
+ searchFrom = payload[+`0x${key[0]}`].toString('hex');
144
143
  key = key.substr(1);
145
144
  break;
146
145
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/mptree.ts"],"names":["hash","MerkleTreeHashMismatchError","MissingNodeInTreeError","UnknownPathNibbleError","UnknownNodeLengthError","NodeType","MPTree","nodeHash","node","from","rlpEncode","toString","constructor","binary","rootHash","nodes","Object","fromEntries","map","undefined","entries","forEach","key","type","payload","parseNode","Branch","slice","filter","n","length","Extension","isEqual","tree","path","nibble","parseInt","Leaf","includes","serialize","mptHash","value","get","searchFrom","substr"],"mappings":"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","sourcesContent":["/*\n * ISC License (ISC)\n * Copyright (c) 2021 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport { encode as rlpEncode } from 'rlp'\nimport type { Input } from 'rlp'\nimport { hash } from './crypto-ts'\nimport {\n MerkleTreeHashMismatchError,\n MissingNodeInTreeError,\n UnknownPathNibbleError,\n UnknownNodeLengthError\n} from './errors'\n\nenum NodeType {\n Branch,\n Extension,\n Leaf\n}\n\nexport type MPTreeBinary = [Buffer, Array<[Buffer, Buffer[]]>]\n\nexport default class MPTree {\n private readonly rootHash: string\n private readonly nodes: { [key: string]: Buffer[] }\n\n private static nodeHash (node: Input): string {\n return Buffer.from(hash(rlpEncode(node))).toString('hex')\n }\n\n /**\n * Deserialize Merkle Patricia Tree\n * @rtype (binary: Array) => MPTree\n * @param {Array} binary - Binary\n * @return {MPTree} Merkle Patricia Tree\n */\n constructor (binary: MPTreeBinary) {\n this.rootHash = binary[0].toString('hex')\n this.nodes = Object.fromEntries(\n binary[1].map((node) => [node[0].toString('hex'), node[1]])\n )\n\n if (this.nodes[this.rootHash] === undefined) throw new MissingNodeInTreeError('Can\\'t find a node by root hash')\n Object.entries(this.nodes).forEach(([key, node]) => {\n if (MPTree.nodeHash(node) !== key) throw new MerkleTreeHashMismatchError()\n const { type, payload } = MPTree.parseNode(node)\n switch (type) {\n case NodeType.Branch:\n payload\n .slice(0, 16)\n .filter(n => n.length)\n .forEach((n) => {\n if (this.nodes[n.toString('hex')] === undefined) {\n throw new MissingNodeInTreeError('Can\\'t find a node by hash in branch node')\n }\n })\n break\n case NodeType.Extension:\n if (this.nodes[payload[0].toString('hex')] === undefined) {\n throw new MissingNodeInTreeError('Can\\'t find a node by hash in extension node')\n }\n }\n })\n }\n\n isEqual (tree: MPTree): boolean {\n return this.rootHash === tree.rootHash\n }\n\n private static parseNode (node: Buffer[]): { type: NodeType, payload: Buffer[], path: string | null } {\n switch (node.length) {\n case 17:\n return { type: NodeType.Branch, payload: node, path: null }\n case 2: {\n const path = node[0].toString('hex')\n const nibble = parseInt(path[0], 16)\n if (nibble > 3) throw new UnknownPathNibbleError(nibble)\n const type = nibble <= 1 ? NodeType.Extension : NodeType.Leaf\n const slice = [0, 2].includes(nibble) ? 2 : 1\n return { type, payload: [node[1]], path: path.slice(slice) }\n }\n default:\n throw new UnknownNodeLengthError(node.length)\n }\n }\n\n /**\n * Serialize Merkle Patricia Tree\n * @rtype () => Array\n * @return {Array} Binary\n */\n serialize (): MPTreeBinary {\n return [\n Buffer.from(this.rootHash, 'hex'),\n Object.entries(this.nodes).map(([mptHash, value]) => ([\n Buffer.from(mptHash, 'hex'),\n value\n ]))\n ]\n }\n\n /**\n * Retrieve value from Merkle Patricia Tree\n * @rtype (key: String) => Buffer\n * @param {String} key - The key of the element to retrieve\n * @return {Buffer} Value associated to the specified key\n */\n get (key: string): Buffer | undefined {\n let searchFrom = this.rootHash\n while (true) {\n const { type, payload, path } = MPTree.parseNode(this.nodes[searchFrom])\n switch (type) {\n case NodeType.Branch:\n if (key.length === 0) return payload[16]\n searchFrom = payload[parseInt(key[0], 16)].toString('hex')\n key = key.substr(1)\n break\n case NodeType.Extension:\n if (key.substr(0, path?.length) !== path) return undefined\n searchFrom = payload[0].toString('hex')\n key = key.substr(path.length)\n break\n case NodeType.Leaf:\n if (path !== key) return undefined\n return payload[0]\n }\n }\n }\n}\n"],"file":"mptree.mjs"}
1
+ {"version":3,"file":"mptree.mjs","names":["hash","MerkleTreeHashMismatchError","MissingNodeInTreeError","UnknownPathNibbleError","UnknownNodeLengthError","NodeType","MPTree","nodeHash","node","from","rlpEncode","toString","constructor","binary","rootHash","nodes","Object","fromEntries","map","undefined","entries","forEach","key","type","payload","parseNode","Branch","slice","filter","n","length","Extension","isEqual","tree","path","nibble","Leaf","serialize","mptHash","value","get","searchFrom","substr"],"sources":["../../src/utils/mptree.ts"],"sourcesContent":["/*\n * ISC License (ISC)\n * Copyright (c) 2021 aeternity developers\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n * PERFORMANCE OF THIS SOFTWARE.\n */\n\nimport { encode as rlpEncode } from 'rlp'\nimport type { Input } from 'rlp'\nimport { hash } from './crypto'\nimport {\n MerkleTreeHashMismatchError,\n MissingNodeInTreeError,\n UnknownPathNibbleError,\n UnknownNodeLengthError\n} from './errors'\n\nenum NodeType {\n Branch,\n Extension,\n Leaf\n}\n\nexport type MPTreeBinary = [Buffer, Array<[Buffer, Buffer[]]>]\n\nexport default class MPTree {\n private readonly rootHash: string\n private readonly nodes: { [key: string]: Buffer[] }\n\n private static nodeHash (node: Input): string {\n return Buffer.from(hash(rlpEncode(node))).toString('hex')\n }\n\n /**\n * Deserialize Merkle Patricia Tree\n * @param binary - Binary\n * @returns Merkle Patricia Tree\n */\n constructor (binary: MPTreeBinary) {\n this.rootHash = binary[0].toString('hex')\n this.nodes = Object.fromEntries(\n binary[1].map((node) => [node[0].toString('hex'), node[1]])\n )\n\n if (this.nodes[this.rootHash] === undefined) throw new MissingNodeInTreeError('Can\\'t find a node by root hash')\n Object.entries(this.nodes).forEach(([key, node]) => {\n if (MPTree.nodeHash(node) !== key) throw new MerkleTreeHashMismatchError()\n const { type, payload } = MPTree.parseNode(node)\n switch (type) {\n case NodeType.Branch:\n payload\n .slice(0, 16)\n .filter(n => n.length)\n .forEach((n) => {\n if (this.nodes[n.toString('hex')] === undefined) {\n throw new MissingNodeInTreeError('Can\\'t find a node by hash in branch node')\n }\n })\n break\n case NodeType.Extension:\n if (this.nodes[payload[0].toString('hex')] === undefined) {\n throw new MissingNodeInTreeError('Can\\'t find a node by hash in extension node')\n }\n }\n })\n }\n\n isEqual (tree: MPTree): boolean {\n return this.rootHash === tree.rootHash\n }\n\n private static parseNode (node: Buffer[]): {\n type: NodeType\n payload: Buffer[]\n path: string | null\n } {\n switch (node.length) {\n case 17:\n return { type: NodeType.Branch, payload: node, path: null }\n case 2: {\n const nibble = node[0][0] >> 4\n if (nibble > 3) throw new UnknownPathNibbleError(nibble)\n const type = nibble <= 1 ? NodeType.Extension : NodeType.Leaf\n const slice = [0, 2].includes(nibble) ? 2 : 1\n return { type, payload: [node[1]], path: node[0].toString('hex').slice(slice) }\n }\n default:\n throw new UnknownNodeLengthError(node.length)\n }\n }\n\n /**\n * Serialize Merkle Patricia Tree\n * @returns Binary\n */\n serialize (): MPTreeBinary {\n return [\n Buffer.from(this.rootHash, 'hex'),\n Object.entries(this.nodes).map(([mptHash, value]) => ([\n Buffer.from(mptHash, 'hex'),\n value\n ]))\n ]\n }\n\n /**\n * Retrieve value from Merkle Patricia Tree\n * @param key - The key of the element to retrieve\n * @returns Value associated to the specified key\n */\n get (key: string): Buffer | undefined {\n let searchFrom = this.rootHash\n while (true) {\n const { type, payload, path } = MPTree.parseNode(this.nodes[searchFrom])\n switch (type) {\n case NodeType.Branch:\n if (key.length === 0) return payload[16]\n searchFrom = payload[+`0x${key[0]}`].toString('hex')\n key = key.substr(1)\n break\n case NodeType.Extension:\n if (key.substr(0, path?.length) !== path) return undefined\n searchFrom = payload[0].toString('hex')\n key = key.substr(path.length)\n break\n case NodeType.Leaf:\n if (path !== key) return undefined\n return payload[0]\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /// <reference types="node" />
2
+ export declare const pause: (duration: number) => Promise<void>;
3
+ export declare const mapObject: <InputV, OutputV>(object: {
4
+ [k: string]: InputV;
5
+ }, fn: (value: [string, InputV], index: number, array: [string, InputV][]) => [string | number, OutputV]) => {
6
+ [k: string]: OutputV;
7
+ };
8
+ export declare const concatBuffers: (list: readonly Uint8Array[], totalLength?: number | undefined) => Buffer;
9
+ /**
10
+ * Object key type guard
11
+ * @param key - Object key
12
+ * @param object - object
13
+ */
14
+ export declare function isKeyOfObject<T>(key: string | number | symbol, object: T): key is keyof T;
@@ -1,43 +1,28 @@
1
- import { snakeToPascal, pascalToSnake } from "./string.mjs";
1
+ import _buffer from "buffer";
2
+ const {
3
+ Buffer: _Buffer
4
+ } = _buffer;
2
5
  export const pause = async duration => await new Promise(resolve => setTimeout(resolve, duration));
3
- export const mapObject = (object, fn) => Object.fromEntries(Object.entries(object).map(fn));
4
- export const filterObject = (object, fn) => Object.fromEntries(Object.entries(object).filter(fn));
5
- /**
6
- * Key traversal metafunction
7
- * @static
8
- * @function
9
- * @rtype (fn: (s: String) => String) => (o: Object) => Object
10
- * @param {Function} fn - Key transformation function
11
- * @param {Object} object - Object to traverse
12
- * @return {Object} Transformed object
13
- */
6
+ export const mapObject = (object, fn) => Object.fromEntries(Object.entries(object).map(fn)); // remove after dropping webpack4 support
14
7
 
15
- export const traverseKeys = (fn, object) => {
16
- if (typeof object !== 'object' || object === null) return object;
17
- if (Array.isArray(object)) return object.map(i => traverseKeys(fn, i));
18
- return mapObject(object, _ref => {
19
- let [key, value] = _ref;
20
- return [fn(key), traverseKeys(fn, value)];
21
- });
22
- };
23
- /**
24
- * snake_case key traversal
25
- * @static
26
- * @rtype (o: Object) => Object
27
- * @param {Object} object - Object to traverse
28
- * @return {Object} Transformed object
29
- * @see pascalToSnake
30
- */
8
+ const isWebpack4Buffer = (() => {
9
+ try {
10
+ _Buffer.concat([Uint8Array.from([])]);
11
+
12
+ return false;
13
+ } catch (error) {
14
+ return true;
15
+ }
16
+ })();
31
17
 
32
- export const snakizeKeys = traverseKeys.bind(null, pascalToSnake);
18
+ export const concatBuffers = isWebpack4Buffer ? (list, totalLength) => _Buffer.concat(list.map(el => _Buffer.from(el)), totalLength) : _Buffer.concat;
33
19
  /**
34
- * PascalCase key traversal
35
- * @static
36
- * @rtype (o: Object) => Object
37
- * @param {Object} object - Object to traverse
38
- * @return {Object} Transformed object
39
- * @see snakeToPascal
20
+ * Object key type guard
21
+ * @param key - Object key
22
+ * @param object - object
40
23
  */
41
24
 
42
- export const pascalizeKeys = traverseKeys.bind(null, snakeToPascal);
25
+ export function isKeyOfObject(key, object) {
26
+ return key in object;
27
+ }
43
28
  //# sourceMappingURL=other.mjs.map