wowok 2.1.10 → 2.1.13

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 (896) hide show
  1. package/dist/cjs/bcs/bcs.d.ts +199 -199
  2. package/dist/cjs/bcs/bcs.js +273 -318
  3. package/dist/cjs/bcs/bcs.js.map +1 -0
  4. package/dist/cjs/bcs/effects.d.ts +109 -109
  5. package/dist/cjs/bcs/effects.js +205 -230
  6. package/dist/cjs/bcs/effects.js.map +1 -0
  7. package/dist/cjs/bcs/index.d.ts +1 -2584
  8. package/dist/cjs/bcs/index.js +61 -76
  9. package/dist/cjs/bcs/index.js.map +1 -0
  10. package/dist/cjs/bcs/pure.js +38 -58
  11. package/dist/cjs/bcs/pure.js.map +1 -0
  12. package/dist/cjs/bcs/type-tag-serializer.js +102 -114
  13. package/dist/cjs/bcs/type-tag-serializer.js.map +1 -0
  14. package/dist/cjs/bcs/types.js +6 -23
  15. package/dist/cjs/bcs/types.js.map +1 -0
  16. package/dist/cjs/client/index.js +17 -33
  17. package/dist/cjs/client/index.js.map +1 -0
  18. package/dist/cjs/client/network.js +25 -40
  19. package/dist/cjs/client/network.js.map +1 -0
  20. package/dist/cjs/cryptography/index.js +29 -45
  21. package/dist/cjs/cryptography/index.js.map +1 -0
  22. package/dist/cjs/cryptography/intent.d.ts +1 -1
  23. package/dist/cjs/cryptography/intent.js +20 -31
  24. package/dist/cjs/cryptography/intent.js.map +1 -0
  25. package/dist/cjs/cryptography/keypair.js +102 -116
  26. package/dist/cjs/cryptography/keypair.js.map +1 -0
  27. package/dist/cjs/cryptography/mnemonics.js +43 -41
  28. package/dist/cjs/cryptography/mnemonics.js.map +1 -0
  29. package/dist/cjs/cryptography/publickey.js +112 -134
  30. package/dist/cjs/cryptography/publickey.js.map +1 -0
  31. package/dist/cjs/cryptography/signature-scheme.js +24 -43
  32. package/dist/cjs/cryptography/signature-scheme.js.map +1 -0
  33. package/dist/cjs/cryptography/signature.d.ts +2 -24
  34. package/dist/cjs/cryptography/signature.js +50 -67
  35. package/dist/cjs/cryptography/signature.js.map +1 -0
  36. package/dist/cjs/experimental/cache.js +65 -0
  37. package/dist/cjs/experimental/cache.js.map +1 -0
  38. package/dist/cjs/experimental/client.js +27 -0
  39. package/dist/cjs/experimental/client.js.map +1 -0
  40. package/dist/cjs/experimental/core.js +89 -0
  41. package/dist/cjs/experimental/core.js.map +1 -0
  42. package/dist/cjs/experimental/errors.js +32 -0
  43. package/dist/cjs/experimental/errors.js.map +1 -0
  44. package/dist/cjs/experimental/index.js +15 -0
  45. package/dist/cjs/experimental/index.js.map +1 -0
  46. package/dist/cjs/experimental/persistent-storage.js +343 -0
  47. package/dist/cjs/experimental/persistent-storage.js.map +1 -0
  48. package/dist/cjs/experimental/persistent-storage.test.js +200 -0
  49. package/dist/cjs/experimental/persistent-storage.test.js.map +1 -0
  50. package/dist/cjs/experimental/transports/utils.js +104 -0
  51. package/dist/cjs/experimental/transports/utils.js.map +1 -0
  52. package/dist/cjs/experimental/types.js +6 -0
  53. package/dist/cjs/experimental/types.js.map +1 -0
  54. package/dist/cjs/faucet/faucet.js +106 -124
  55. package/dist/cjs/faucet/faucet.js.map +1 -0
  56. package/dist/cjs/faucet/index.js +12 -28
  57. package/dist/cjs/faucet/index.js.map +1 -0
  58. package/dist/cjs/grpc/client.js +47 -62
  59. package/dist/cjs/grpc/client.js.map +1 -0
  60. package/dist/cjs/grpc/core.js +580 -617
  61. package/dist/cjs/grpc/core.js.map +1 -0
  62. package/dist/cjs/grpc/index.js +9 -25
  63. package/dist/cjs/grpc/index.js.map +1 -0
  64. package/dist/cjs/grpc/proto/google/protobuf/any.js +168 -135
  65. package/dist/cjs/grpc/proto/google/protobuf/any.js.map +1 -0
  66. package/dist/cjs/grpc/proto/google/protobuf/duration.js +105 -90
  67. package/dist/cjs/grpc/proto/google/protobuf/duration.js.map +1 -0
  68. package/dist/cjs/grpc/proto/google/protobuf/empty.js +50 -28
  69. package/dist/cjs/grpc/proto/google/protobuf/empty.js.map +1 -0
  70. package/dist/cjs/grpc/proto/google/protobuf/field_mask.js +96 -75
  71. package/dist/cjs/grpc/proto/google/protobuf/field_mask.js.map +1 -0
  72. package/dist/cjs/grpc/proto/google/protobuf/struct.js +266 -215
  73. package/dist/cjs/grpc/proto/google/protobuf/struct.js.map +1 -0
  74. package/dist/cjs/grpc/proto/google/protobuf/timestamp.js +150 -131
  75. package/dist/cjs/grpc/proto/google/protobuf/timestamp.js.map +1 -0
  76. package/dist/cjs/grpc/proto/google/rpc/error_details.js +331 -302
  77. package/dist/cjs/grpc/proto/google/rpc/error_details.js.map +1 -0
  78. package/dist/cjs/grpc/proto/google/rpc/status.js +50 -50
  79. package/dist/cjs/grpc/proto/google/rpc/status.js.map +1 -0
  80. package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js +84 -68
  81. package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
  82. package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js +45 -50
  83. package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
  84. package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js +38 -43
  85. package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
  86. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js +70 -75
  87. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
  88. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js +79 -81
  89. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
  90. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js +183 -166
  91. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
  92. package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js +369 -296
  93. package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
  94. package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js +80 -85
  95. package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
  96. package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js +31 -28
  97. package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
  98. package/dist/cjs/grpc/proto/sui/rpc/v2/event.js +81 -83
  99. package/dist/cjs/grpc/proto/sui/rpc/v2/event.js.map +1 -0
  100. package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js +80 -85
  101. package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
  102. package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js +876 -506
  103. package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
  104. package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js +56 -61
  105. package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
  106. package/dist/cjs/grpc/proto/sui/rpc/v2/input.js +103 -83
  107. package/dist/cjs/grpc/proto/sui/rpc/v2/input.js.map +1 -0
  108. package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js +76 -78
  109. package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
  110. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js +69 -119
  111. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
  112. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js +392 -350
  113. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
  114. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js +599 -473
  115. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
  116. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js +46 -78
  117. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
  118. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js +242 -224
  119. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
  120. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js +32 -52
  121. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
  122. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js +139 -134
  123. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
  124. package/dist/cjs/grpc/proto/sui/rpc/v2/object.js +109 -111
  125. package/dist/cjs/grpc/proto/sui/rpc/v2/object.js.map +1 -0
  126. package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js +46 -51
  127. package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
  128. package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js +76 -61
  129. package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
  130. package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js +46 -59
  131. package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
  132. package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js +568 -522
  133. package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
  134. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js +54 -32
  135. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
  136. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +27 -47
  137. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
  138. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js +83 -86
  139. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
  140. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js +53 -85
  141. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
  142. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js +645 -529
  143. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
  144. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js +37 -51
  145. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
  146. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js +58 -61
  147. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
  148. package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js +749 -730
  149. package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
  150. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js +1218 -975
  151. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
  152. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +32 -46
  153. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
  154. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js +186 -167
  155. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
  156. package/dist/cjs/index.js +96 -91
  157. package/dist/cjs/index.js.map +1 -0
  158. package/dist/cjs/jsonRpc/client.js +654 -743
  159. package/dist/cjs/jsonRpc/client.js.map +1 -0
  160. package/dist/cjs/jsonRpc/core.d.ts +7 -7
  161. package/dist/cjs/jsonRpc/core.js +562 -606
  162. package/dist/cjs/jsonRpc/core.js.map +1 -0
  163. package/dist/cjs/jsonRpc/errors.js +38 -56
  164. package/dist/cjs/jsonRpc/errors.js.map +1 -0
  165. package/dist/cjs/jsonRpc/http-transport.js +70 -114
  166. package/dist/cjs/jsonRpc/http-transport.js.map +1 -0
  167. package/dist/cjs/jsonRpc/index.js +14 -30
  168. package/dist/cjs/jsonRpc/index.js.map +1 -0
  169. package/dist/cjs/jsonRpc/json-rpc-resolver.js +286 -290
  170. package/dist/cjs/jsonRpc/json-rpc-resolver.js.map +1 -0
  171. package/dist/cjs/jsonRpc/rpc-websocket-client.js +150 -207
  172. package/dist/cjs/jsonRpc/rpc-websocket-client.js.map +1 -0
  173. package/dist/cjs/jsonRpc/types/chain.js +4 -15
  174. package/dist/cjs/jsonRpc/types/chain.js.map +1 -0
  175. package/dist/cjs/jsonRpc/types/changes.js +4 -15
  176. package/dist/cjs/jsonRpc/types/changes.js.map +1 -0
  177. package/dist/cjs/jsonRpc/types/coins.js +4 -15
  178. package/dist/cjs/jsonRpc/types/coins.js.map +1 -0
  179. package/dist/cjs/jsonRpc/types/common.js +4 -15
  180. package/dist/cjs/jsonRpc/types/common.js.map +1 -0
  181. package/dist/cjs/jsonRpc/types/generated.d.ts +1 -1
  182. package/dist/cjs/jsonRpc/types/generated.js +4 -15
  183. package/dist/cjs/jsonRpc/types/generated.js.map +1 -0
  184. package/dist/cjs/jsonRpc/types/index.js +4 -15
  185. package/dist/cjs/jsonRpc/types/index.js.map +1 -0
  186. package/dist/cjs/jsonRpc/types/params.js +4 -15
  187. package/dist/cjs/jsonRpc/types/params.js.map +1 -0
  188. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +54 -69
  189. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
  190. package/dist/cjs/keypairs/ed25519/index.js +10 -26
  191. package/dist/cjs/keypairs/ed25519/index.js.map +1 -0
  192. package/dist/cjs/keypairs/ed25519/keypair.js +134 -159
  193. package/dist/cjs/keypairs/ed25519/keypair.js.map +1 -0
  194. package/dist/cjs/keypairs/ed25519/publickey.js +70 -84
  195. package/dist/cjs/keypairs/ed25519/publickey.js.map +1 -0
  196. package/dist/cjs/keypairs/index.js +21 -19
  197. package/dist/cjs/keypairs/index.js.map +1 -0
  198. package/dist/cjs/keypairs/passkey/index.js +11 -27
  199. package/dist/cjs/keypairs/passkey/index.js.map +1 -0
  200. package/dist/cjs/keypairs/passkey/keypair.js +245 -256
  201. package/dist/cjs/keypairs/passkey/keypair.js.map +1 -0
  202. package/dist/cjs/keypairs/passkey/publickey.js +163 -162
  203. package/dist/cjs/keypairs/passkey/publickey.js.map +1 -0
  204. package/dist/cjs/keypairs/passkey/types.js +4 -15
  205. package/dist/cjs/keypairs/passkey/types.js.map +1 -0
  206. package/dist/cjs/keypairs/secp256k1/index.js +10 -26
  207. package/dist/cjs/keypairs/secp256k1/index.js.map +1 -0
  208. package/dist/cjs/keypairs/secp256k1/keypair.js +129 -151
  209. package/dist/cjs/keypairs/secp256k1/keypair.js.map +1 -0
  210. package/dist/cjs/keypairs/secp256k1/publickey.js +71 -89
  211. package/dist/cjs/keypairs/secp256k1/publickey.js.map +1 -0
  212. package/dist/cjs/keypairs/secp256r1/index.js +10 -26
  213. package/dist/cjs/keypairs/secp256r1/index.js.map +1 -0
  214. package/dist/cjs/keypairs/secp256r1/keypair.js +127 -148
  215. package/dist/cjs/keypairs/secp256r1/keypair.js.map +1 -0
  216. package/dist/cjs/keypairs/secp256r1/publickey.js +72 -90
  217. package/dist/cjs/keypairs/secp256r1/publickey.js.map +1 -0
  218. package/dist/cjs/multisig/index.js +10 -26
  219. package/dist/cjs/multisig/index.js.map +1 -0
  220. package/dist/cjs/multisig/publickey.d.ts +1 -1
  221. package/dist/cjs/multisig/publickey.js +228 -276
  222. package/dist/cjs/multisig/publickey.js.map +1 -0
  223. package/dist/cjs/multisig/signer.js +62 -110
  224. package/dist/cjs/multisig/signer.js.map +1 -0
  225. package/dist/cjs/transactions/Arguments.d.ts +4 -4
  226. package/dist/cjs/transactions/Arguments.js +13 -34
  227. package/dist/cjs/transactions/Arguments.js.map +1 -0
  228. package/dist/cjs/transactions/Commands.js +111 -141
  229. package/dist/cjs/transactions/Commands.js.map +1 -0
  230. package/dist/cjs/transactions/Inputs.js +53 -82
  231. package/dist/cjs/transactions/Inputs.js.map +1 -0
  232. package/dist/cjs/transactions/ObjectCache.d.ts +8 -8
  233. package/dist/cjs/transactions/ObjectCache.js +204 -241
  234. package/dist/cjs/transactions/ObjectCache.js.map +1 -0
  235. package/dist/cjs/transactions/Transaction.d.ts +31 -31
  236. package/dist/cjs/transactions/Transaction.js +628 -719
  237. package/dist/cjs/transactions/Transaction.js.map +1 -0
  238. package/dist/cjs/transactions/TransactionData.d.ts +9 -9
  239. package/dist/cjs/transactions/TransactionData.js +396 -440
  240. package/dist/cjs/transactions/TransactionData.js.map +1 -0
  241. package/dist/cjs/transactions/__tests__/Transaction.test.js +169 -0
  242. package/dist/cjs/transactions/__tests__/Transaction.test.js.map +1 -0
  243. package/dist/cjs/transactions/__tests__/bcs.test.js +202 -0
  244. package/dist/cjs/transactions/__tests__/bcs.test.js.map +1 -0
  245. package/dist/cjs/transactions/data/internal.js +166 -207
  246. package/dist/cjs/transactions/data/internal.js.map +1 -0
  247. package/dist/cjs/transactions/data/v1.js +436 -495
  248. package/dist/cjs/transactions/data/v1.js.map +1 -0
  249. package/dist/cjs/transactions/data/v2.d.ts +5 -5
  250. package/dist/cjs/transactions/data/v2.js +94 -107
  251. package/dist/cjs/transactions/data/v2.js.map +1 -0
  252. package/dist/cjs/transactions/executor/caching.js +71 -113
  253. package/dist/cjs/transactions/executor/caching.js.map +1 -0
  254. package/dist/cjs/transactions/executor/parallel.js +339 -378
  255. package/dist/cjs/transactions/executor/parallel.js.map +1 -0
  256. package/dist/cjs/transactions/executor/queue.js +60 -80
  257. package/dist/cjs/transactions/executor/queue.js.map +1 -0
  258. package/dist/cjs/transactions/executor/serial.d.ts +4 -4
  259. package/dist/cjs/transactions/executor/serial.js +102 -131
  260. package/dist/cjs/transactions/executor/serial.js.map +1 -0
  261. package/dist/cjs/transactions/hash.js +17 -28
  262. package/dist/cjs/transactions/hash.js.map +1 -0
  263. package/dist/cjs/transactions/index.js +33 -49
  264. package/dist/cjs/transactions/index.js.map +1 -0
  265. package/dist/cjs/transactions/intents/CoinWithBalance.js +137 -191
  266. package/dist/cjs/transactions/intents/CoinWithBalance.js.map +1 -0
  267. package/dist/cjs/transactions/object.js +88 -111
  268. package/dist/cjs/transactions/object.js.map +1 -0
  269. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js +20 -32
  270. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
  271. package/dist/cjs/transactions/pure.js +38 -60
  272. package/dist/cjs/transactions/pure.js.map +1 -0
  273. package/dist/cjs/transactions/resolve.js +62 -88
  274. package/dist/cjs/transactions/resolve.js.map +1 -0
  275. package/dist/cjs/transactions/serializer.js +150 -163
  276. package/dist/cjs/transactions/serializer.js.map +1 -0
  277. package/dist/cjs/transactions/utils.d.ts +1 -1
  278. package/dist/cjs/transactions/utils.js +114 -125
  279. package/dist/cjs/transactions/utils.js.map +1 -0
  280. package/dist/cjs/utils/constants.js +29 -56
  281. package/dist/cjs/utils/constants.js.map +1 -0
  282. package/dist/cjs/utils/derived-objects.js +14 -30
  283. package/dist/cjs/utils/derived-objects.js.map +1 -0
  284. package/dist/cjs/utils/dynamic-fields.js +20 -37
  285. package/dist/cjs/utils/dynamic-fields.js.map +1 -0
  286. package/dist/cjs/utils/format.js +14 -30
  287. package/dist/cjs/utils/format.js.map +1 -0
  288. package/dist/cjs/utils/index.js +50 -64
  289. package/dist/cjs/utils/index.js.map +1 -0
  290. package/dist/cjs/utils/move-registry.js +37 -35
  291. package/dist/cjs/utils/move-registry.js.map +1 -0
  292. package/dist/cjs/utils/sui-types.js +74 -68
  293. package/dist/cjs/utils/sui-types.js.map +1 -0
  294. package/dist/cjs/utils/suins.js +30 -46
  295. package/dist/cjs/utils/suins.js.map +1 -0
  296. package/dist/cjs/verify/index.js +12 -27
  297. package/dist/cjs/verify/index.js.map +1 -0
  298. package/dist/cjs/verify/verify.js +83 -110
  299. package/dist/cjs/verify/verify.js.map +1 -0
  300. package/dist/cjs/version.js +8 -25
  301. package/dist/cjs/version.js.map +1 -0
  302. package/dist/cjs/w/call/allocation.js +323 -413
  303. package/dist/cjs/w/call/allocation.js.map +1 -0
  304. package/dist/cjs/w/call/arb.js +105 -136
  305. package/dist/cjs/w/call/arb.js.map +1 -0
  306. package/dist/cjs/w/call/arbitration.js +1206 -1581
  307. package/dist/cjs/w/call/arbitration.js.map +1 -0
  308. package/dist/cjs/w/call/base.js +303 -333
  309. package/dist/cjs/w/call/base.js.map +1 -0
  310. package/dist/cjs/w/call/contact.js +335 -452
  311. package/dist/cjs/w/call/contact.js.map +1 -0
  312. package/dist/cjs/w/call/demand.js +690 -844
  313. package/dist/cjs/w/call/demand.js.map +1 -0
  314. package/dist/cjs/w/call/entity.js +167 -201
  315. package/dist/cjs/w/call/entity.js.map +1 -0
  316. package/dist/cjs/w/call/guard-ins.js +4376 -4389
  317. package/dist/cjs/w/call/guard-ins.js.map +1 -0
  318. package/dist/cjs/w/call/guard.js +1078 -1112
  319. package/dist/cjs/w/call/guard.js.map +1 -0
  320. package/dist/cjs/w/call/index.js +69 -70
  321. package/dist/cjs/w/call/index.js.map +1 -0
  322. package/dist/cjs/w/call/machine.js +1105 -1419
  323. package/dist/cjs/w/call/machine.js.map +1 -0
  324. package/dist/cjs/w/call/order.js +314 -454
  325. package/dist/cjs/w/call/order.js.map +1 -0
  326. package/dist/cjs/w/call/passport.js +214 -253
  327. package/dist/cjs/w/call/passport.js.map +1 -0
  328. package/dist/cjs/w/call/payment.js +187 -224
  329. package/dist/cjs/w/call/payment.js.map +1 -0
  330. package/dist/cjs/w/call/permission.js +1183 -1294
  331. package/dist/cjs/w/call/permission.js.map +1 -0
  332. package/dist/cjs/w/call/personal.js +132 -170
  333. package/dist/cjs/w/call/personal.js.map +1 -0
  334. package/dist/cjs/w/call/progress.js +634 -794
  335. package/dist/cjs/w/call/progress.js.map +1 -0
  336. package/dist/cjs/w/call/proof.js +67 -116
  337. package/dist/cjs/w/call/proof.js.map +1 -0
  338. package/dist/cjs/w/call/repository.js +1037 -1251
  339. package/dist/cjs/w/call/repository.js.map +1 -0
  340. package/dist/cjs/w/call/resource.js +111 -131
  341. package/dist/cjs/w/call/resource.js.map +1 -0
  342. package/dist/cjs/w/call/reward.js +675 -853
  343. package/dist/cjs/w/call/reward.js.map +1 -0
  344. package/dist/cjs/w/call/service.js +1879 -2385
  345. package/dist/cjs/w/call/service.js.map +1 -0
  346. package/dist/cjs/w/call/treasury.js +841 -1138
  347. package/dist/cjs/w/call/treasury.js.map +1 -0
  348. package/dist/cjs/w/call/util.js +593 -624
  349. package/dist/cjs/w/call/util.js.map +1 -0
  350. package/dist/cjs/w/common.d.ts +1 -1
  351. package/dist/cjs/w/common.js +548 -518
  352. package/dist/cjs/w/common.js.map +1 -0
  353. package/dist/cjs/w/exception.js +574 -584
  354. package/dist/cjs/w/exception.js.map +1 -0
  355. package/dist/cjs/w/index.js +26 -23
  356. package/dist/cjs/w/index.js.map +1 -0
  357. package/dist/cjs/w/local/account.js +664 -741
  358. package/dist/cjs/w/local/account.js.map +1 -0
  359. package/dist/cjs/w/local/cache.js +180 -166
  360. package/dist/cjs/w/local/cache.js.map +1 -0
  361. package/dist/cjs/w/local/config.js +51 -80
  362. package/dist/cjs/w/local/config.js.map +1 -0
  363. package/dist/cjs/w/local/index.js +225 -290
  364. package/dist/cjs/w/local/index.js.map +1 -0
  365. package/dist/cjs/w/local/local.d.ts +2 -2
  366. package/dist/cjs/w/local/local.js +638 -646
  367. package/dist/cjs/w/local/local.js.map +1 -0
  368. package/dist/cjs/w/local/storage.js +210 -164
  369. package/dist/cjs/w/local/storage.js.map +1 -0
  370. package/dist/cjs/w/local/token.js +158 -175
  371. package/dist/cjs/w/local/token.js.map +1 -0
  372. package/dist/cjs/w/local/util.js +80 -51
  373. package/dist/cjs/w/local/util.js.map +1 -0
  374. package/dist/cjs/w/local/wip.js +1078 -802
  375. package/dist/cjs/w/local/wip.js.map +1 -0
  376. package/dist/cjs/w/messenger/crypto.js +496 -389
  377. package/dist/cjs/w/messenger/crypto.js.map +1 -0
  378. package/dist/cjs/w/messenger/index.js +53 -35
  379. package/dist/cjs/w/messenger/index.js.map +1 -0
  380. package/dist/cjs/w/messenger/messenger-api.js +1159 -1035
  381. package/dist/cjs/w/messenger/messenger-api.js.map +1 -0
  382. package/dist/cjs/w/messenger/messenger-manager.js +954 -1083
  383. package/dist/cjs/w/messenger/messenger-manager.js.map +1 -0
  384. package/dist/cjs/w/messenger/messenger.d.ts +1 -1
  385. package/dist/cjs/w/messenger/messenger.js +1304 -1450
  386. package/dist/cjs/w/messenger/messenger.js.map +1 -0
  387. package/dist/cjs/w/messenger/server.js +390 -512
  388. package/dist/cjs/w/messenger/server.js.map +1 -0
  389. package/dist/cjs/w/messenger/session.js +399 -403
  390. package/dist/cjs/w/messenger/session.js.map +1 -0
  391. package/dist/cjs/w/messenger/storage.js +881 -777
  392. package/dist/cjs/w/messenger/storage.js.map +1 -0
  393. package/dist/cjs/w/messenger/types.d.ts +2 -2
  394. package/dist/cjs/w/messenger/types.js +83 -103
  395. package/dist/cjs/w/messenger/types.js.map +1 -0
  396. package/dist/cjs/w/messenger/utils.js +29 -34
  397. package/dist/cjs/w/messenger/utils.js.map +1 -0
  398. package/dist/cjs/w/query/bult-in.js +101 -110
  399. package/dist/cjs/w/query/bult-in.js.map +1 -0
  400. package/dist/cjs/w/query/event.js +134 -146
  401. package/dist/cjs/w/query/event.js.map +1 -0
  402. package/dist/cjs/w/query/index.js +22 -20
  403. package/dist/cjs/w/query/index.js.map +1 -0
  404. package/dist/cjs/w/query/object.js +1576 -1576
  405. package/dist/cjs/w/query/object.js.map +1 -0
  406. package/dist/cjs/w/query/received.js +66 -88
  407. package/dist/cjs/w/query/received.js.map +1 -0
  408. package/dist/cjs/w/query/util.js +53 -77
  409. package/dist/cjs/w/query/util.js.map +1 -0
  410. package/dist/cjs/w/util.js +589 -675
  411. package/dist/cjs/w/util.js.map +1 -0
  412. package/dist/esm/bcs/bcs.d.ts +199 -199
  413. package/dist/esm/bcs/bcs.js +269 -310
  414. package/dist/esm/bcs/bcs.js.map +1 -0
  415. package/dist/esm/bcs/effects.d.ts +109 -109
  416. package/dist/esm/bcs/effects.js +171 -179
  417. package/dist/esm/bcs/effects.js.map +1 -0
  418. package/dist/esm/bcs/index.d.ts +1 -2584
  419. package/dist/esm/bcs/index.js +51 -94
  420. package/dist/esm/bcs/index.js.map +1 -0
  421. package/dist/esm/bcs/pure.js +35 -38
  422. package/dist/esm/bcs/pure.js.map +1 -0
  423. package/dist/esm/bcs/type-tag-serializer.js +98 -95
  424. package/dist/esm/bcs/type-tag-serializer.js.map +1 -0
  425. package/dist/esm/bcs/types.js +5 -5
  426. package/dist/esm/bcs/types.js.map +1 -0
  427. package/dist/esm/client/index.js +7 -23
  428. package/dist/esm/client/index.js.map +1 -0
  429. package/dist/esm/client/network.js +23 -22
  430. package/dist/esm/client/network.js.map +1 -0
  431. package/dist/esm/cryptography/index.js +9 -46
  432. package/dist/esm/cryptography/index.js.map +1 -0
  433. package/dist/esm/cryptography/intent.d.ts +1 -1
  434. package/dist/esm/cryptography/intent.js +18 -12
  435. package/dist/esm/cryptography/intent.js.map +1 -0
  436. package/dist/esm/cryptography/keypair.js +95 -99
  437. package/dist/esm/cryptography/keypair.js.map +1 -0
  438. package/dist/esm/cryptography/mnemonics.js +40 -24
  439. package/dist/esm/cryptography/mnemonics.js.map +1 -0
  440. package/dist/esm/cryptography/publickey.js +104 -115
  441. package/dist/esm/cryptography/publickey.js.map +1 -0
  442. package/dist/esm/cryptography/signature-scheme.js +22 -24
  443. package/dist/esm/cryptography/signature-scheme.js.map +1 -0
  444. package/dist/esm/cryptography/signature.d.ts +2 -24
  445. package/dist/esm/cryptography/signature.js +44 -48
  446. package/dist/esm/cryptography/signature.js.map +1 -0
  447. package/dist/esm/experimental/cache.js +61 -0
  448. package/dist/esm/experimental/cache.js.map +1 -0
  449. package/dist/esm/experimental/client.js +23 -0
  450. package/dist/esm/experimental/client.js.map +1 -0
  451. package/dist/esm/experimental/core.js +85 -0
  452. package/dist/esm/experimental/core.js.map +1 -0
  453. package/dist/esm/experimental/errors.js +27 -0
  454. package/dist/esm/experimental/errors.js.map +1 -0
  455. package/dist/esm/experimental/index.js +8 -0
  456. package/dist/esm/experimental/index.js.map +1 -0
  457. package/dist/esm/experimental/persistent-storage.js +337 -0
  458. package/dist/esm/experimental/persistent-storage.js.map +1 -0
  459. package/dist/esm/experimental/persistent-storage.test.js +198 -0
  460. package/dist/esm/experimental/persistent-storage.test.js.map +1 -0
  461. package/dist/esm/experimental/transports/utils.js +100 -0
  462. package/dist/esm/experimental/transports/utils.js.map +1 -0
  463. package/dist/esm/experimental/types.js +5 -0
  464. package/dist/esm/experimental/types.js.map +1 -0
  465. package/dist/esm/faucet/faucet.js +104 -111
  466. package/dist/esm/faucet/faucet.js.map +1 -0
  467. package/dist/esm/faucet/index.js +4 -16
  468. package/dist/esm/faucet/index.js.map +1 -0
  469. package/dist/esm/grpc/client.js +34 -34
  470. package/dist/esm/grpc/client.js.map +1 -0
  471. package/dist/esm/grpc/core.js +570 -601
  472. package/dist/esm/grpc/core.js.map +1 -0
  473. package/dist/esm/grpc/index.js +5 -6
  474. package/dist/esm/grpc/index.js.map +1 -0
  475. package/dist/esm/grpc/proto/google/protobuf/any.js +161 -111
  476. package/dist/esm/grpc/proto/google/protobuf/any.js.map +1 -0
  477. package/dist/esm/grpc/proto/google/protobuf/duration.js +99 -67
  478. package/dist/esm/grpc/proto/google/protobuf/duration.js.map +1 -0
  479. package/dist/esm/grpc/proto/google/protobuf/empty.js +46 -7
  480. package/dist/esm/grpc/proto/google/protobuf/empty.js.map +1 -0
  481. package/dist/esm/grpc/proto/google/protobuf/field_mask.js +90 -52
  482. package/dist/esm/grpc/proto/google/protobuf/field_mask.js.map +1 -0
  483. package/dist/esm/grpc/proto/google/protobuf/struct.js +258 -190
  484. package/dist/esm/grpc/proto/google/protobuf/struct.js.map +1 -0
  485. package/dist/esm/grpc/proto/google/protobuf/timestamp.js +144 -108
  486. package/dist/esm/grpc/proto/google/protobuf/timestamp.js.map +1 -0
  487. package/dist/esm/grpc/proto/google/rpc/error_details.js +313 -267
  488. package/dist/esm/grpc/proto/google/rpc/error_details.js.map +1 -0
  489. package/dist/esm/grpc/proto/google/rpc/status.js +45 -28
  490. package/dist/esm/grpc/proto/google/rpc/status.js.map +1 -0
  491. package/dist/esm/grpc/proto/sui/rpc/v2/argument.js +80 -47
  492. package/dist/esm/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
  493. package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js +41 -29
  494. package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
  495. package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js +34 -22
  496. package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
  497. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js +61 -49
  498. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
  499. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js +72 -57
  500. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
  501. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js +173 -139
  502. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
  503. package/dist/esm/grpc/proto/sui/rpc/v2/effects.js +358 -268
  504. package/dist/esm/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
  505. package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js +72 -60
  506. package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
  507. package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js +29 -9
  508. package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
  509. package/dist/esm/grpc/proto/sui/rpc/v2/event.js +74 -59
  510. package/dist/esm/grpc/proto/sui/rpc/v2/event.js.map +1 -0
  511. package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js +69 -57
  512. package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
  513. package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js +861 -474
  514. package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
  515. package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js +52 -40
  516. package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
  517. package/dist/esm/grpc/proto/sui/rpc/v2/input.js +98 -61
  518. package/dist/esm/grpc/proto/sui/rpc/v2/input.js.map +1 -0
  519. package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js +71 -56
  520. package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
  521. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js +65 -100
  522. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
  523. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js +365 -306
  524. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
  525. package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js +585 -442
  526. package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
  527. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js +42 -59
  528. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
  529. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js +226 -191
  530. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
  531. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js +28 -33
  532. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
  533. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js +129 -107
  534. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
  535. package/dist/esm/grpc/proto/sui/rpc/v2/object.js +100 -85
  536. package/dist/esm/grpc/proto/sui/rpc/v2/object.js.map +1 -0
  537. package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js +42 -30
  538. package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
  539. package/dist/esm/grpc/proto/sui/rpc/v2/owner.js +72 -40
  540. package/dist/esm/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
  541. package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js +42 -38
  542. package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
  543. package/dist/esm/grpc/proto/sui/rpc/v2/signature.js +544 -481
  544. package/dist/esm/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
  545. package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js +52 -13
  546. package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
  547. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +23 -28
  548. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
  549. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js +74 -60
  550. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
  551. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js +49 -66
  552. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
  553. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js +623 -490
  554. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
  555. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js +33 -32
  556. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
  557. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js +50 -36
  558. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
  559. package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js +737 -701
  560. package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
  561. package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js +1177 -917
  562. package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
  563. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +28 -27
  564. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
  565. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js +169 -133
  566. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
  567. package/dist/esm/index.js +21 -107
  568. package/dist/esm/index.js.map +1 -0
  569. package/dist/esm/jsonRpc/client.js +646 -727
  570. package/dist/esm/jsonRpc/client.js.map +1 -0
  571. package/dist/esm/jsonRpc/core.d.ts +7 -7
  572. package/dist/esm/jsonRpc/core.js +550 -581
  573. package/dist/esm/jsonRpc/core.js.map +1 -0
  574. package/dist/esm/jsonRpc/errors.js +36 -41
  575. package/dist/esm/jsonRpc/errors.js.map +1 -0
  576. package/dist/esm/jsonRpc/http-transport.js +65 -93
  577. package/dist/esm/jsonRpc/http-transport.js.map +1 -0
  578. package/dist/esm/jsonRpc/index.js +6 -20
  579. package/dist/esm/jsonRpc/index.js.map +1 -0
  580. package/dist/esm/jsonRpc/json-rpc-resolver.js +281 -276
  581. package/dist/esm/jsonRpc/json-rpc-resolver.js.map +1 -0
  582. package/dist/esm/jsonRpc/rpc-websocket-client.js +147 -189
  583. package/dist/esm/jsonRpc/rpc-websocket-client.js.map +1 -0
  584. package/dist/esm/jsonRpc/types/chain.js +4 -0
  585. package/dist/esm/jsonRpc/types/chain.js.map +1 -0
  586. package/dist/esm/jsonRpc/types/changes.js +4 -0
  587. package/dist/esm/jsonRpc/types/changes.js.map +1 -0
  588. package/dist/esm/jsonRpc/types/coins.js +4 -0
  589. package/dist/esm/jsonRpc/types/coins.js.map +1 -0
  590. package/dist/esm/jsonRpc/types/common.js +4 -0
  591. package/dist/esm/jsonRpc/types/common.js.map +1 -0
  592. package/dist/esm/jsonRpc/types/generated.d.ts +1 -1
  593. package/dist/esm/jsonRpc/types/generated.js +4 -0
  594. package/dist/esm/jsonRpc/types/generated.js.map +1 -0
  595. package/dist/esm/jsonRpc/types/index.js +4 -0
  596. package/dist/esm/jsonRpc/types/index.js.map +1 -0
  597. package/dist/esm/jsonRpc/types/params.js +4 -0
  598. package/dist/esm/jsonRpc/types/params.js.map +1 -0
  599. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +49 -48
  600. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
  601. package/dist/esm/keypairs/ed25519/index.js +5 -10
  602. package/dist/esm/keypairs/ed25519/index.js.map +1 -0
  603. package/dist/esm/keypairs/ed25519/keypair.js +128 -146
  604. package/dist/esm/keypairs/ed25519/keypair.js.map +1 -0
  605. package/dist/esm/keypairs/ed25519/publickey.js +64 -67
  606. package/dist/esm/keypairs/ed25519/publickey.js.map +1 -0
  607. package/dist/esm/keypairs/index.js +3 -0
  608. package/dist/esm/keypairs/index.js.map +1 -0
  609. package/dist/esm/keypairs/passkey/index.js +5 -12
  610. package/dist/esm/keypairs/passkey/index.js.map +1 -0
  611. package/dist/esm/keypairs/passkey/keypair.js +236 -243
  612. package/dist/esm/keypairs/passkey/keypair.js.map +1 -0
  613. package/dist/esm/keypairs/passkey/publickey.js +154 -140
  614. package/dist/esm/keypairs/passkey/publickey.js.map +1 -0
  615. package/dist/esm/keypairs/passkey/types.js +4 -0
  616. package/dist/esm/keypairs/passkey/types.js.map +1 -0
  617. package/dist/esm/keypairs/secp256k1/index.js +5 -10
  618. package/dist/esm/keypairs/secp256k1/index.js.map +1 -0
  619. package/dist/esm/keypairs/secp256k1/keypair.js +120 -134
  620. package/dist/esm/keypairs/secp256k1/keypair.js.map +1 -0
  621. package/dist/esm/keypairs/secp256k1/publickey.js +64 -71
  622. package/dist/esm/keypairs/secp256k1/publickey.js.map +1 -0
  623. package/dist/esm/keypairs/secp256r1/index.js +5 -10
  624. package/dist/esm/keypairs/secp256r1/index.js.map +1 -0
  625. package/dist/esm/keypairs/secp256r1/keypair.js +118 -131
  626. package/dist/esm/keypairs/secp256r1/keypair.js.map +1 -0
  627. package/dist/esm/keypairs/secp256r1/publickey.js +63 -66
  628. package/dist/esm/keypairs/secp256r1/publickey.js.map +1 -0
  629. package/dist/esm/multisig/index.js +5 -10
  630. package/dist/esm/multisig/index.js.map +1 -0
  631. package/dist/esm/multisig/publickey.d.ts +1 -1
  632. package/dist/esm/multisig/publickey.js +216 -253
  633. package/dist/esm/multisig/publickey.js.map +1 -0
  634. package/dist/esm/multisig/signer.js +57 -89
  635. package/dist/esm/multisig/signer.js.map +1 -0
  636. package/dist/esm/transactions/Arguments.d.ts +4 -4
  637. package/dist/esm/transactions/Arguments.js +9 -13
  638. package/dist/esm/transactions/Arguments.js.map +1 -0
  639. package/dist/esm/transactions/Commands.js +105 -118
  640. package/dist/esm/transactions/Commands.js.map +1 -0
  641. package/dist/esm/transactions/Inputs.js +49 -61
  642. package/dist/esm/transactions/Inputs.js.map +1 -0
  643. package/dist/esm/transactions/ObjectCache.d.ts +8 -8
  644. package/dist/esm/transactions/ObjectCache.js +200 -223
  645. package/dist/esm/transactions/ObjectCache.js.map +1 -0
  646. package/dist/esm/transactions/Transaction.d.ts +32 -32
  647. package/dist/esm/transactions/Transaction.js +611 -696
  648. package/dist/esm/transactions/Transaction.js.map +1 -0
  649. package/dist/esm/transactions/TransactionData.d.ts +9 -9
  650. package/dist/esm/transactions/TransactionData.js +386 -415
  651. package/dist/esm/transactions/TransactionData.js.map +1 -0
  652. package/dist/esm/transactions/__tests__/Transaction.test.js +167 -0
  653. package/dist/esm/transactions/__tests__/Transaction.test.js.map +1 -0
  654. package/dist/esm/transactions/__tests__/bcs.test.js +200 -0
  655. package/dist/esm/transactions/__tests__/bcs.test.js.map +1 -0
  656. package/dist/esm/transactions/data/internal.js +158 -205
  657. package/dist/esm/transactions/data/internal.js.map +1 -0
  658. package/dist/esm/transactions/data/v1.js +419 -487
  659. package/dist/esm/transactions/data/v1.js.map +1 -0
  660. package/dist/esm/transactions/data/v2.d.ts +5 -5
  661. package/dist/esm/transactions/data/v2.js +89 -107
  662. package/dist/esm/transactions/data/v2.js.map +1 -0
  663. package/dist/esm/transactions/executor/caching.d.ts +2 -2
  664. package/dist/esm/transactions/executor/caching.js +66 -93
  665. package/dist/esm/transactions/executor/caching.js.map +1 -0
  666. package/dist/esm/transactions/executor/parallel.js +329 -352
  667. package/dist/esm/transactions/executor/parallel.js.map +1 -0
  668. package/dist/esm/transactions/executor/queue.js +58 -64
  669. package/dist/esm/transactions/executor/queue.js.map +1 -0
  670. package/dist/esm/transactions/executor/serial.d.ts +5 -5
  671. package/dist/esm/transactions/executor/serial.js +96 -110
  672. package/dist/esm/transactions/executor/serial.js.map +1 -0
  673. package/dist/esm/transactions/hash.js +15 -9
  674. package/dist/esm/transactions/hash.js.map +1 -0
  675. package/dist/esm/transactions/index.js +15 -41
  676. package/dist/esm/transactions/index.js.map +1 -0
  677. package/dist/esm/transactions/intents/CoinWithBalance.js +127 -165
  678. package/dist/esm/transactions/intents/CoinWithBalance.js.map +1 -0
  679. package/dist/esm/transactions/object.js +86 -92
  680. package/dist/esm/transactions/object.js.map +1 -0
  681. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js +18 -15
  682. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
  683. package/dist/esm/transactions/pure.js +34 -39
  684. package/dist/esm/transactions/pure.js.map +1 -0
  685. package/dist/esm/transactions/resolve.js +58 -69
  686. package/dist/esm/transactions/resolve.js.map +1 -0
  687. package/dist/esm/transactions/serializer.js +145 -144
  688. package/dist/esm/transactions/serializer.js.map +1 -0
  689. package/dist/esm/transactions/utils.d.ts +1 -1
  690. package/dist/esm/transactions/utils.js +110 -109
  691. package/dist/esm/transactions/utils.js.map +1 -0
  692. package/dist/esm/utils/constants.js +26 -36
  693. package/dist/esm/utils/constants.js.map +1 -0
  694. package/dist/esm/utils/derived-objects.js +11 -10
  695. package/dist/esm/utils/derived-objects.js.map +1 -0
  696. package/dist/esm/utils/dynamic-fields.js +16 -16
  697. package/dist/esm/utils/dynamic-fields.js.map +1 -0
  698. package/dist/esm/utils/format.js +13 -13
  699. package/dist/esm/utils/format.js.map +1 -0
  700. package/dist/esm/utils/index.js +15 -76
  701. package/dist/esm/utils/index.js.map +1 -0
  702. package/dist/esm/utils/move-registry.js +34 -17
  703. package/dist/esm/utils/move-registry.js.map +1 -0
  704. package/dist/esm/utils/sui-types.js +70 -54
  705. package/dist/esm/utils/sui-types.js.map +1 -0
  706. package/dist/esm/utils/suins.js +29 -29
  707. package/dist/esm/utils/suins.js.map +1 -0
  708. package/dist/esm/verify/index.js +5 -14
  709. package/dist/esm/verify/index.js.map +1 -0
  710. package/dist/esm/verify/verify.js +76 -93
  711. package/dist/esm/verify/verify.js.map +1 -0
  712. package/dist/esm/version.js +6 -6
  713. package/dist/esm/version.js.map +1 -0
  714. package/dist/esm/w/call/allocation.js +307 -402
  715. package/dist/esm/w/call/allocation.js.map +1 -0
  716. package/dist/esm/w/call/arb.js +100 -129
  717. package/dist/esm/w/call/arb.js.map +1 -0
  718. package/dist/esm/w/call/arbitration.js +1170 -1568
  719. package/dist/esm/w/call/arbitration.js.map +1 -0
  720. package/dist/esm/w/call/base.js +288 -315
  721. package/dist/esm/w/call/base.js.map +1 -0
  722. package/dist/esm/w/call/contact.js +318 -442
  723. package/dist/esm/w/call/contact.js.map +1 -0
  724. package/dist/esm/w/call/demand.js +673 -841
  725. package/dist/esm/w/call/demand.js.map +1 -0
  726. package/dist/esm/w/call/entity.js +162 -203
  727. package/dist/esm/w/call/entity.js.map +1 -0
  728. package/dist/esm/w/call/guard-ins.js +4373 -4371
  729. package/dist/esm/w/call/guard-ins.js.map +1 -0
  730. package/dist/esm/w/call/guard.js +1061 -1108
  731. package/dist/esm/w/call/guard.js.map +1 -0
  732. package/dist/esm/w/call/index.js +24 -56
  733. package/dist/esm/w/call/index.js.map +1 -0
  734. package/dist/esm/w/call/machine.js +1086 -1433
  735. package/dist/esm/w/call/machine.js.map +1 -0
  736. package/dist/esm/w/call/order.js +301 -448
  737. package/dist/esm/w/call/order.js.map +1 -0
  738. package/dist/esm/w/call/passport.js +204 -240
  739. package/dist/esm/w/call/passport.js.map +1 -0
  740. package/dist/esm/w/call/payment.js +177 -215
  741. package/dist/esm/w/call/payment.js.map +1 -0
  742. package/dist/esm/w/call/permission.js +1172 -1320
  743. package/dist/esm/w/call/permission.js.map +1 -0
  744. package/dist/esm/w/call/personal.js +121 -156
  745. package/dist/esm/w/call/personal.js.map +1 -0
  746. package/dist/esm/w/call/progress.js +625 -797
  747. package/dist/esm/w/call/progress.js.map +1 -0
  748. package/dist/esm/w/call/proof.js +61 -103
  749. package/dist/esm/w/call/proof.js.map +1 -0
  750. package/dist/esm/w/call/repository.js +1017 -1251
  751. package/dist/esm/w/call/repository.js.map +1 -0
  752. package/dist/esm/w/call/resource.js +108 -124
  753. package/dist/esm/w/call/resource.js.map +1 -0
  754. package/dist/esm/w/call/reward.js +660 -847
  755. package/dist/esm/w/call/reward.js.map +1 -0
  756. package/dist/esm/w/call/service.js +1849 -2400
  757. package/dist/esm/w/call/service.js.map +1 -0
  758. package/dist/esm/w/call/treasury.js +815 -1125
  759. package/dist/esm/w/call/treasury.js.map +1 -0
  760. package/dist/esm/w/call/util.js +553 -576
  761. package/dist/esm/w/call/util.js.map +1 -0
  762. package/dist/esm/w/common.d.ts +1 -1
  763. package/dist/esm/w/common.js +579 -580
  764. package/dist/esm/w/common.js.map +1 -0
  765. package/dist/esm/w/exception.js +570 -573
  766. package/dist/esm/w/exception.js.map +1 -0
  767. package/dist/esm/w/index.js +4 -0
  768. package/dist/esm/w/index.js.map +1 -0
  769. package/dist/esm/w/local/account.js +652 -709
  770. package/dist/esm/w/local/account.js.map +1 -0
  771. package/dist/esm/w/local/cache.js +176 -147
  772. package/dist/esm/w/local/cache.js.map +1 -0
  773. package/dist/esm/w/local/config.js +46 -60
  774. package/dist/esm/w/local/config.js.map +1 -0
  775. package/dist/esm/w/local/index.js +196 -273
  776. package/dist/esm/w/local/index.js.map +1 -0
  777. package/dist/esm/w/local/local.d.ts +2 -2
  778. package/dist/esm/w/local/local.js +631 -626
  779. package/dist/esm/w/local/local.js.map +1 -0
  780. package/dist/esm/w/local/storage.js +168 -136
  781. package/dist/esm/w/local/storage.js.map +1 -0
  782. package/dist/esm/w/local/token.js +149 -151
  783. package/dist/esm/w/local/token.js.map +1 -0
  784. package/dist/esm/w/local/util.js +45 -22
  785. package/dist/esm/w/local/util.js.map +1 -0
  786. package/dist/esm/w/local/wip.js +1038 -781
  787. package/dist/esm/w/local/wip.js.map +1 -0
  788. package/dist/esm/w/messenger/crypto.js +491 -387
  789. package/dist/esm/w/messenger/crypto.js.map +1 -0
  790. package/dist/esm/w/messenger/index.js +27 -24
  791. package/dist/esm/w/messenger/index.js.map +1 -0
  792. package/dist/esm/w/messenger/messenger-api.js +1111 -1017
  793. package/dist/esm/w/messenger/messenger-api.js.map +1 -0
  794. package/dist/esm/w/messenger/messenger-manager.js +944 -1052
  795. package/dist/esm/w/messenger/messenger-manager.js.map +1 -0
  796. package/dist/esm/w/messenger/messenger.d.ts +1 -1
  797. package/dist/esm/w/messenger/messenger.js +1258 -1421
  798. package/dist/esm/w/messenger/messenger.js.map +1 -0
  799. package/dist/esm/w/messenger/server.js +388 -499
  800. package/dist/esm/w/messenger/server.js.map +1 -0
  801. package/dist/esm/w/messenger/session.js +394 -399
  802. package/dist/esm/w/messenger/session.js.map +1 -0
  803. package/dist/esm/w/messenger/storage.js +840 -751
  804. package/dist/esm/w/messenger/storage.js.map +1 -0
  805. package/dist/esm/w/messenger/types.d.ts +2 -2
  806. package/dist/esm/w/messenger/types.js +80 -85
  807. package/dist/esm/w/messenger/types.js.map +1 -0
  808. package/dist/esm/w/messenger/utils.js +28 -16
  809. package/dist/esm/w/messenger/utils.js.map +1 -0
  810. package/dist/esm/w/query/bult-in.js +95 -100
  811. package/dist/esm/w/query/bult-in.js.map +1 -0
  812. package/dist/esm/w/query/event.js +128 -125
  813. package/dist/esm/w/query/event.js.map +1 -0
  814. package/dist/esm/w/query/index.js +3 -0
  815. package/dist/esm/w/query/index.js.map +1 -0
  816. package/dist/esm/w/query/object.js +1560 -1574
  817. package/dist/esm/w/query/object.js.map +1 -0
  818. package/dist/esm/w/query/received.js +57 -63
  819. package/dist/esm/w/query/received.js.map +1 -0
  820. package/dist/esm/w/query/util.js +48 -56
  821. package/dist/esm/w/query/util.js.map +1 -0
  822. package/dist/esm/w/util.js +578 -673
  823. package/dist/esm/w/util.js.map +1 -0
  824. package/package.json +13 -7
  825. package/prebuilds/better-sqlite3-v12.9.0-node-v115-darwin-arm64.node +0 -0
  826. package/prebuilds/better-sqlite3-v12.9.0-node-v115-darwin-x64.node +0 -0
  827. package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-arm.node +0 -0
  828. package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-arm64.node +0 -0
  829. package/prebuilds/better-sqlite3-v12.9.0-node-v115-linux-x64.node +0 -0
  830. package/prebuilds/better-sqlite3-v12.9.0-node-v115-win32-arm64.node +0 -0
  831. package/prebuilds/better-sqlite3-v12.9.0-node-v115-win32-x64.node +0 -0
  832. package/prebuilds/better-sqlite3-v12.9.0-node-v127-darwin-arm64.node +0 -0
  833. package/prebuilds/better-sqlite3-v12.9.0-node-v127-darwin-x64.node +0 -0
  834. package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-arm.node +0 -0
  835. package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-arm64.node +0 -0
  836. package/prebuilds/better-sqlite3-v12.9.0-node-v127-linux-x64.node +0 -0
  837. package/prebuilds/better-sqlite3-v12.9.0-node-v127-win32-arm64.node +0 -0
  838. package/prebuilds/better-sqlite3-v12.9.0-node-v127-win32-x64.node +0 -0
  839. package/scripts/download-prebuilds.js +234 -0
  840. package/scripts/install-better-sqlite3.js +377 -0
  841. package/dist/cjs/graphql/client.js +0 -98
  842. package/dist/cjs/graphql/core.js +0 -506
  843. package/dist/cjs/graphql/generated/2024.1/tada-env.js +0 -13141
  844. package/dist/cjs/graphql/generated/2024.1/tsconfig.tada.js +0 -11
  845. package/dist/cjs/graphql/generated/2024.4/tada-env.js +0 -13287
  846. package/dist/cjs/graphql/generated/2024.4/tsconfig.tada.js +0 -11
  847. package/dist/cjs/graphql/generated/latest/tada-env.js +0 -12925
  848. package/dist/cjs/graphql/generated/latest/tsconfig.tada.js +0 -11
  849. package/dist/cjs/graphql/generated/queries.js +0 -807
  850. package/dist/cjs/graphql/index.js +0 -25
  851. package/dist/cjs/graphql/schemas/2024.1/index.js +0 -28
  852. package/dist/cjs/graphql/schemas/2024.4/index.js +0 -28
  853. package/dist/cjs/graphql/schemas/latest/index.js +0 -28
  854. package/dist/cjs/graphql/types.js +0 -16
  855. package/dist/cjs/package.json +0 -5
  856. package/dist/cjs/w/local/.eslintrc.js +0 -15
  857. package/dist/cjs/w/messenger/.eslintrc.js +0 -15
  858. package/dist/cjs/zklogin/address.js +0 -93
  859. package/dist/cjs/zklogin/bcs.js +0 -41
  860. package/dist/cjs/zklogin/index.js +0 -45
  861. package/dist/cjs/zklogin/jwt-decode.js +0 -88
  862. package/dist/cjs/zklogin/jwt-utils.js +0 -128
  863. package/dist/cjs/zklogin/nonce.js +0 -60
  864. package/dist/cjs/zklogin/poseidon.js +0 -64
  865. package/dist/cjs/zklogin/publickey.js +0 -281
  866. package/dist/cjs/zklogin/signature.js +0 -57
  867. package/dist/cjs/zklogin/utils.js +0 -98
  868. package/dist/esm/graphql/client.js +0 -79
  869. package/dist/esm/graphql/core.js +0 -505
  870. package/dist/esm/graphql/generated/2024.1/tada-env.js +0 -13121
  871. package/dist/esm/graphql/generated/2024.1/tsconfig.tada.js +0 -16
  872. package/dist/esm/graphql/generated/2024.4/tada-env.js +0 -13267
  873. package/dist/esm/graphql/generated/2024.4/tsconfig.tada.js +0 -16
  874. package/dist/esm/graphql/generated/latest/tada-env.js +0 -12905
  875. package/dist/esm/graphql/generated/latest/tsconfig.tada.js +0 -16
  876. package/dist/esm/graphql/generated/queries.js +0 -788
  877. package/dist/esm/graphql/index.js +0 -8
  878. package/dist/esm/graphql/schemas/2024.1/index.js +0 -8
  879. package/dist/esm/graphql/schemas/2024.4/index.js +0 -8
  880. package/dist/esm/graphql/schemas/latest/index.js +0 -8
  881. package/dist/esm/graphql/types.js +0 -0
  882. package/dist/esm/package.json +0 -5
  883. package/dist/esm/w/local/.eslintrc.js +0 -23
  884. package/dist/esm/w/messenger/.eslintrc.js +0 -23
  885. package/dist/esm/zklogin/address.js +0 -78
  886. package/dist/esm/zklogin/bcs.js +0 -21
  887. package/dist/esm/zklogin/index.js +0 -38
  888. package/dist/esm/zklogin/jwt-decode.js +0 -68
  889. package/dist/esm/zklogin/jwt-utils.js +0 -108
  890. package/dist/esm/zklogin/nonce.js +0 -40
  891. package/dist/esm/zklogin/poseidon.js +0 -61
  892. package/dist/esm/zklogin/publickey.js +0 -265
  893. package/dist/esm/zklogin/signature.js +0 -37
  894. package/dist/esm/zklogin/utils.js +0 -78
  895. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  896. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,6 +1,19 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
+ // Copyright (c) Wowok.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Messenger 核心模块
5
+ *
6
+ * 提供完整的端到端加密消息功能:
7
+ * 1. 发送加密消息(集成 Merkle Tree 时序证明)
8
+ * 2. 接收并解密消息
9
+ * 3. 链上证明提交(使用 proof.ts)
10
+ * 4. 会话状态同步
11
+ *
12
+ * 三重信任模型:
13
+ * - 身份信任:wowok 账户 Ed25519 签名
14
+ * - 加密信任:Signal Protocol 双棘轮
15
+ * - 时序信任:Merkle Tree + 服务器签名 + 链上证明
16
+ */
4
17
  import { createHash } from "crypto";
5
18
  import * as fs from "fs";
6
19
  import * as path from "path";
@@ -10,1483 +23,1307 @@ import { MessengerServerClient } from "./server.js";
10
23
  import { MessageStorage, SessionStateStorage } from "./storage.js";
11
24
  import { hashPlaintext, verifyMessage, bytesToBase64 } from "./crypto.js";
12
25
  import { canonicalizeJson } from "./utils.js";
13
- import {
14
- DEFAULT_MESSENGER_CONFIG,
15
- MessengerError,
16
- MessengerErrorCode,
17
- MessageDirection,
18
- MessageStatus,
19
- WTS_FILE_BYTES_LIMIT,
20
- NORMAL_MESSAGE_BYTES_LIMIT,
21
- CHAIN_PROOF_TYPE
22
- } from "./types.js";
26
+ import { DEFAULT_MESSENGER_CONFIG, MessengerError, MessengerErrorCode, MessageDirection, MessageStatus, WTS_FILE_BYTES_LIMIT, NORMAL_MESSAGE_BYTES_LIMIT, CHAIN_PROOF_TYPE, } from "./types.js";
23
27
  import { isValidWowAddress } from "../../utils/sui-types.js";
24
28
  import { Account } from "../local/account.js";
25
- if (typeof window === "undefined" && typeof EventSource === "undefined") {
26
- try {
27
- const eventsource = require("eventsource");
28
- const EventSourcePolyfill = eventsource.EventSource || eventsource.default || eventsource;
29
+ import { EventSource as EventSourcePolyfill } from "eventsource";
30
+ // Polyfill EventSource for Node.js environment
31
+ if (typeof window === "undefined" &&
32
+ typeof globalThis.EventSource === "undefined") {
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
34
  globalThis.EventSource = EventSourcePolyfill;
30
- } catch (error) {
31
- console.warn(
32
- "EventSource polyfill not found. SSE functionality will be disabled in Node.js environment."
33
- );
34
- }
35
+ console.log("[EventSource] Successfully polyfilled EventSource");
35
36
  }
36
- class Messenger {
37
- constructor(userAddress, config) {
38
- __publicField(this, "session");
39
- __publicField(this, "serverClient");
40
- __publicField(this, "config");
41
- __publicField(this, "userAddress", null);
42
- __publicField(this, "eventSource", null);
43
- __publicField(this, "onMessageCallback", null);
44
- __publicField(this, "prekeyCheckTimer", null);
45
- __publicField(this, "messageStorage");
46
- __publicField(this, "sessionStateStorage");
47
- this.userAddress = userAddress;
48
- this.config = { ...DEFAULT_MESSENGER_CONFIG, ...config };
49
- this.session = new MessengerSession(userAddress, this.config);
50
- this.serverClient = new MessengerServerClient(this.config);
51
- this.messageStorage = new MessageStorage(userAddress);
52
- this.sessionStateStorage = new SessionStateStorage(userAddress);
53
- }
54
- /**
55
- * 获取用户地址
56
- * @returns 用户地址
57
- */
58
- getUserAddress() {
59
- if (!this.userAddress) {
60
- throw new MessengerError(
61
- MessengerErrorCode.IDENTITY_NOT_FOUND,
62
- "User address not set"
63
- );
37
+ export class Messenger {
38
+ session;
39
+ serverClient;
40
+ config;
41
+ userAddress = null;
42
+ eventSource = null;
43
+ onMessageCallback = null;
44
+ prekeyCheckTimer = null;
45
+ messageStorage;
46
+ sessionStateStorage;
47
+ constructor(userAddress, config) {
48
+ this.userAddress = userAddress;
49
+ this.config = { ...DEFAULT_MESSENGER_CONFIG, ...config };
50
+ this.session = new MessengerSession(userAddress, this.config);
51
+ this.serverClient = new MessengerServerClient(this.config);
52
+ this.messageStorage = new MessageStorage(userAddress);
53
+ this.sessionStateStorage = new SessionStateStorage(userAddress);
64
54
  }
65
- return this.userAddress;
66
- }
67
- /**
68
- * 获取用户公钥
69
- * @returns 公钥(带标志位)
70
- */
71
- async getPublicKey() {
72
- if (!this.userAddress) {
73
- throw new MessengerError(
74
- MessengerErrorCode.IDENTITY_NOT_FOUND,
75
- "User address not set"
76
- );
77
- }
78
- const account = await Account.Instance().get(this.userAddress, false);
79
- return account?.pubkey || "";
80
- }
81
- /**
82
- * 验证Guard消息格式
83
- * @param guardAddress Guard地址
84
- * @param passportAddress Passport地址
85
- * @returns 是否为有效的Guard消息
86
- */
87
- isValidGuardMessage(guardAddress, passportAddress) {
88
- return Boolean(
89
- guardAddress && passportAddress && isValidWowAddress(guardAddress) && isValidWowAddress(passportAddress)
90
- );
91
- }
92
- /**
93
- * 生成签名参数
94
- * 用于需要签名验证的 API 调用
95
- */
96
- async generateSignatureParams(operation) {
97
- if (!this.userAddress) {
98
- throw new MessengerError(
99
- MessengerErrorCode.IDENTITY_NOT_FOUND,
100
- "User address not set"
101
- );
102
- }
103
- const account = await Account.Instance().get(this.userAddress, false);
104
- if (!account?.secret) {
105
- throw new MessengerError(
106
- MessengerErrorCode.IDENTITY_NOT_FOUND,
107
- `Account not found or no secret key for ${this.userAddress}`
108
- );
55
+ /**
56
+ * 获取用户地址
57
+ * @returns 用户地址
58
+ */
59
+ getUserAddress() {
60
+ if (!this.userAddress) {
61
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
62
+ }
63
+ return this.userAddress;
109
64
  }
110
- const { Ed25519Keypair } = await import("../../keypairs/ed25519/index.js");
111
- const keypair = Ed25519Keypair.fromSecretKey(account.secret);
112
- const publicKey = keypair.getPublicKey();
113
- const publicKeyWithFlag = publicKey.toWPublicKey();
114
- const timestamp = Date.now();
115
- const nonce = this.generateNonce();
116
- const message = `${operation}:${publicKeyWithFlag}:${timestamp}:${nonce}`;
117
- const signature = await keypair.sign(new TextEncoder().encode(message));
118
- return {
119
- signatureScheme: "ED25519",
120
- signature: Buffer.from(signature).toString("base64"),
121
- timestamp,
122
- nonce
123
- };
124
- }
125
- /**
126
- * 生成随机 nonce
127
- */
128
- generateNonce() {
129
- const array = new Uint8Array(16);
130
- crypto.getRandomValues(array);
131
- return Array.from(array, (b) => b.toString(16).padStart(2, "0")).join(
132
- ""
133
- );
134
- }
135
- /**
136
- * 初始化 Messenger
137
- * 1. 确保本地身份
138
- * 2. 注册设备到服务器
139
- * 3. 上传预密钥
140
- * 4. 检查预密钥状态(如低于阈值则补充)
141
- * 5. 启动定期预密钥检查
142
- */
143
- async initialize() {
144
- if (!this.userAddress) {
145
- throw new MessengerError(
146
- MessengerErrorCode.IDENTITY_NOT_FOUND,
147
- "User address not set"
148
- );
65
+ /**
66
+ * 获取用户公钥
67
+ * @returns 公钥(带标志位)
68
+ */
69
+ async getPublicKey() {
70
+ if (!this.userAddress) {
71
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
72
+ }
73
+ const account = await Account.Instance().get(this.userAddress, false);
74
+ return account?.pubkey || "";
149
75
  }
150
- await this.session.ensureIdentity(this.userAddress);
151
- await this.session.registerDevice(this.userAddress);
152
- await this.session.ensurePreKeys(this.userAddress);
153
- await this.checkAndRefillPrekeys();
154
- this.startPrekeyCheckTimer();
155
- }
156
- /**
157
- * 检查并补充预密钥
158
- *
159
- * 逻辑:如果服务器预密钥未满,自动补充到最大容量
160
- */
161
- async checkAndRefillPrekeys() {
162
- if (!this.userAddress) return;
163
- await this.session.ensurePreKeys(this.userAddress, false);
164
- }
165
- /**
166
- * 启动预密钥定期检查定时器
167
- */
168
- startPrekeyCheckTimer() {
169
- if (this.prekeyCheckTimer) {
170
- clearInterval(this.prekeyCheckTimer);
76
+ /**
77
+ * 验证Guard消息格式
78
+ * @param guardAddress Guard地址
79
+ * @param passportAddress Passport地址
80
+ * @returns 是否为有效的Guard消息
81
+ */
82
+ isValidGuardMessage(guardAddress, passportAddress) {
83
+ return Boolean(guardAddress &&
84
+ passportAddress &&
85
+ isValidWowAddress(guardAddress) &&
86
+ isValidWowAddress(passportAddress));
171
87
  }
172
- const interval = this.config.prekeyCheckIntervalMs ?? 24 * 60 * 60 * 1e3;
173
- this.prekeyCheckTimer = setInterval(() => {
174
- this.checkAndRefillPrekeys();
175
- }, interval);
176
- }
177
- /**
178
- * 停止预密钥定期检查定时器
179
- */
180
- stopPrekeyCheckTimer() {
181
- if (this.prekeyCheckTimer) {
182
- clearInterval(this.prekeyCheckTimer);
183
- this.prekeyCheckTimer = null;
88
+ /**
89
+ * 生成签名参数
90
+ * 用于需要签名验证的 API 调用
91
+ */
92
+ async generateSignatureParams(operation) {
93
+ if (!this.userAddress) {
94
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
95
+ }
96
+ const account = await Account.Instance().get(this.userAddress, false);
97
+ if (!account?.secret) {
98
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, `Account not found or no secret key for ${this.userAddress}`);
99
+ }
100
+ const { Ed25519Keypair } = await import("../../keypairs/ed25519/index.js");
101
+ const keypair = Ed25519Keypair.fromSecretKey(account.secret);
102
+ const publicKey = keypair.getPublicKey();
103
+ const publicKeyWithFlag = publicKey.toWPublicKey();
104
+ const timestamp = Date.now(); //@ 使用ms时间戳
105
+ const nonce = this.generateNonce();
106
+ const message = `${operation}:${publicKeyWithFlag}:${timestamp}:${nonce}`;
107
+ const signature = await keypair.sign(new TextEncoder().encode(message));
108
+ return {
109
+ signatureScheme: "ED25519",
110
+ signature: Buffer.from(signature).toString("base64"),
111
+ timestamp,
112
+ nonce,
113
+ };
184
114
  }
185
- }
186
- /**
187
- * 发送加密消息
188
- *
189
- * 流程:
190
- * 1. 使用 Signal Protocol 加密消息
191
- * 2. 发送到服务器
192
- * 3. 接收服务器返回的 Merkle 证明数据
193
- * 4. 本地存储消息
194
- */
195
- async sendMessage(recipientAddress, plaintext, options) {
196
- if (!this.userAddress) {
197
- throw new MessengerError(
198
- MessengerErrorCode.IDENTITY_NOT_FOUND,
199
- "User address not set"
200
- );
115
+ /**
116
+ * 生成随机 nonce
117
+ */
118
+ generateNonce() {
119
+ const array = new Uint8Array(16);
120
+ crypto.getRandomValues(array);
121
+ return Array.from(array, (b) => b.toString(16).padStart(2, "0")).join("");
201
122
  }
202
- const createdAt = Date.now();
203
- const timestamp = Date.now();
204
- const nonce = this.generateNonce();
205
- const plaintextBytes = new TextEncoder().encode(plaintext).length;
206
- if (plaintextBytes > NORMAL_MESSAGE_BYTES_LIMIT) {
207
- throw new MessengerError(
208
- MessengerErrorCode.INVALID_INPUT,
209
- `Message size (${plaintextBytes} bytes) exceeds maximum allowed size (${NORMAL_MESSAGE_BYTES_LIMIT} bytes). Consider using sendZipFile for large content.`
210
- );
123
+ /**
124
+ * 初始化 Messenger
125
+ * 1. 确保本地身份
126
+ * 2. 注册设备到服务器
127
+ * 3. 上传预密钥
128
+ * 4. 检查预密钥状态(如低于阈值则补充)
129
+ * 5. 启动定期预密钥检查
130
+ */
131
+ async initialize() {
132
+ if (!this.userAddress) {
133
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
134
+ }
135
+ // 确保身份并注册设备
136
+ await this.session.ensureIdentity(this.userAddress);
137
+ await this.session.registerDevice(this.userAddress);
138
+ await this.session.ensurePreKeys(this.userAddress);
139
+ // 初始化时检查预密钥状态
140
+ await this.checkAndRefillPrekeys();
141
+ // 启动定期预密钥检查
142
+ this.startPrekeyCheckTimer();
211
143
  }
212
- const lastReceivedLeafIndex = this.messageStorage.getLastReceivedLeafIndex(
213
- this.userAddress,
214
- recipientAddress
215
- );
216
- const encrypted = await this.session.encryptMessage(
217
- this.userAddress,
218
- recipientAddress,
219
- plaintext
220
- );
221
- const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString(
222
- "base64"
223
- );
224
- const plaintextHash = hashPlaintext(
225
- plaintext,
226
- createdAt,
227
- options?.guardAddress,
228
- options?.passportAddress,
229
- lastReceivedLeafIndex
230
- );
231
- const account = await Account.Instance().get(this.userAddress, false);
232
- if (!account) {
233
- throw new MessengerError(
234
- MessengerErrorCode.IDENTITY_NOT_FOUND,
235
- "User account not found"
236
- );
144
+ /**
145
+ * 检查并补充预密钥
146
+ *
147
+ * 逻辑:如果服务器预密钥未满,自动补充到最大容量
148
+ */
149
+ async checkAndRefillPrekeys() {
150
+ if (!this.userAddress)
151
+ return;
152
+ // 直接调用 ensurePreKeys,它会查询服务器状态并按需补充
153
+ await this.session.ensurePreKeys(this.userAddress, false);
237
154
  }
238
- const publicKey = account.pubkey;
239
- const guardAddr = options?.guardAddress || "";
240
- const passportAddr = options?.passportAddress || "";
241
- const lastReceivedStr = lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex.toString() : "";
242
- const forceStr = options?.force ? "true" : "false";
243
- const signMessage = `send_message:${this.userAddress}:${recipientAddress}:${guardAddr}:${passportAddr}:${plaintextHash}:${lastReceivedStr}:${publicKey}:${timestamp}:${nonce}:${forceStr}`;
244
- const signResult = await Account.Instance().signData(
245
- this.userAddress,
246
- signMessage
247
- );
248
- const signatureBuffer = Buffer.from(
249
- signResult.signature.slice(2),
250
- "hex"
251
- );
252
- const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
253
- const response = await this.serverClient.sendMessage({
254
- sender: signResult.publicKey,
255
- recipient: recipientAddress,
256
- ciphertext,
257
- plaintextHash,
258
- clientTimestamp: createdAt,
259
- msgType: encrypted.type,
260
- signatureScheme: "ED25519",
261
- signature: signatureBase64,
262
- timestamp,
263
- nonce,
264
- guardAddress: options?.guardAddress,
265
- passportAddress: options?.passportAddress,
266
- force: options?.force,
267
- // 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
268
- lastReceivedLeafIndex: lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex : void 0
269
- });
270
- const message = {
271
- messageId: response.messageId,
272
- fromAddress: this.userAddress,
273
- toAddress: recipientAddress,
274
- plaintextHash,
275
- plaintext,
276
- guardAddress: options?.guardAddress,
277
- passportAddress: options?.passportAddress,
278
- lastReceivedLeafIndex,
279
- // 【新增】保存消息确认字段
280
- direction: MessageDirection.SENT,
281
- status: response.status === "confirmed" ? MessageStatus.CONFIRMED : MessageStatus.PENDING,
282
- msgType: encrypted.type,
283
- createdAt
284
- };
285
- if (response.merkleData) {
286
- message.leafIndex = response.merkleData.leafIndex;
287
- message.prevRoot = response.merkleData.prevRoot;
288
- message.newRoot = response.merkleData.newRoot;
289
- message.serverSignature = response.merkleData.serverSignature;
290
- message.serverTimestamp = response.merkleData.serverTimestamp;
291
- message.serverPublicKey = response.merkleData.serverPublicKey;
292
- this.sessionStateStorage.updateSessionState(
293
- this.userAddress,
294
- recipientAddress,
295
- {
296
- currentRoot: response.merkleData.newRoot,
297
- prevRoot: response.merkleData.prevRoot,
298
- lastLeafIndex: response.merkleData.leafIndex,
299
- lastSyncAt: Date.now()
155
+ /**
156
+ * 启动预密钥定期检查定时器
157
+ */
158
+ startPrekeyCheckTimer() {
159
+ if (this.prekeyCheckTimer) {
160
+ clearInterval(this.prekeyCheckTimer);
300
161
  }
301
- );
162
+ const interval = this.config.prekeyCheckIntervalMs ?? 24 * 60 * 60 * 1000; // 默认1天
163
+ this.prekeyCheckTimer = setInterval(() => {
164
+ this.checkAndRefillPrekeys();
165
+ }, interval);
166
+ //console.log(`Prekey check timer started (interval: ${interval}ms)`);
302
167
  }
303
- this.messageStorage.saveMessage(message);
304
- if (response.pendingMerkleData) {
305
- for (const [msgId, merkleData] of Object.entries(
306
- response.pendingMerkleData
307
- )) {
308
- const existingMsg = this.messageStorage.getMessage(msgId);
309
- if (existingMsg && existingMsg.status === MessageStatus.PENDING) {
310
- this.messageStorage.updateMessageStatus(
311
- msgId,
312
- MessageStatus.CONFIRMED,
313
- {
314
- leafIndex: merkleData.leafIndex,
315
- newRoot: merkleData.newRoot,
316
- serverSignature: merkleData.serverSignature,
317
- serverTimestamp: merkleData.serverTimestamp,
318
- serverPublicKey: merkleData.serverPublicKey
319
- }
320
- );
168
+ /**
169
+ * 停止预密钥定期检查定时器
170
+ */
171
+ stopPrekeyCheckTimer() {
172
+ if (this.prekeyCheckTimer) {
173
+ clearInterval(this.prekeyCheckTimer);
174
+ this.prekeyCheckTimer = null;
175
+ //console.log("Prekey check timer stopped");
321
176
  }
322
- }
323
- }
324
- return {
325
- messageId: response.messageId,
326
- status: message.status,
327
- merkleData: response.merkleData,
328
- guardList: response.guard_list
329
- };
330
- }
331
- /**
332
- * 拉取消息
333
- *
334
- * 流程:
335
- * 1. 从服务器拉取消息
336
- * 2. 解密消息(Signal Protocol)
337
- * 3. 验证 Merkle 证明
338
- * 4. 本地存储并确认消息
339
- */
340
- async pullMessages(limit) {
341
- if (!this.userAddress) {
342
- throw new MessengerError(
343
- MessengerErrorCode.IDENTITY_NOT_FOUND,
344
- "User address not set"
345
- );
346
- }
347
- const timestamp = Date.now();
348
- const nonce = this.generateNonce();
349
- const message = `fetch_messages:${this.userAddress}:${limit || 100}:${timestamp}:${nonce}`;
350
- const account = await Account.Instance().get(this.userAddress, false);
351
- const publicKey = account?.pubkey || "";
352
- const signResult = await Account.Instance().signData(
353
- this.userAddress,
354
- message
355
- );
356
- const signature = Buffer.from(signResult.signature.slice(2), "hex");
357
- const signatureParams = {
358
- signatureScheme: "ED25519",
359
- signature: bytesToBase64(signature),
360
- timestamp,
361
- nonce
362
- };
363
- const response = await this.serverClient.pullMessages(
364
- this.userAddress,
365
- publicKey,
366
- signatureParams,
367
- limit
368
- );
369
- if (response.messages.length === 0) {
370
- return [];
371
177
  }
372
- const decryptedMessages = [];
373
- const acknowledgedIds = [];
374
- for (const serverMsg of response.messages) {
375
- try {
376
- const existingMessage = this.messageStorage.getMessage(
377
- serverMsg.id
378
- );
379
- if (existingMessage) {
380
- acknowledgedIds.push(serverMsg.id);
381
- continue;
178
+ /**
179
+ * 发送加密消息
180
+ *
181
+ * 流程:
182
+ * 1. 使用 Signal Protocol 加密消息
183
+ * 2. 发送到服务器
184
+ * 3. 接收服务器返回的 Merkle 证明数据
185
+ * 4. 本地存储消息
186
+ */
187
+ async sendMessage(recipientAddress, plaintext, options) {
188
+ if (!this.userAddress) {
189
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
382
190
  }
383
- const ciphertext = Uint8Array.from(
384
- Buffer.from(serverMsg.bodyB64, "base64")
385
- );
386
- const decryptedData = await this.session.decryptMessage(
387
- this.userAddress,
388
- serverMsg.from,
389
- ciphertext.buffer,
390
- serverMsg.msgType
391
- );
392
- const plaintext = decryptedData;
393
- const senderLastReceivedIndex = serverMsg.lastReceivedLeafIndex ?? -1;
394
- if (senderLastReceivedIndex >= 0) {
395
- const myLastSent = this.getLastSentLeafIndex(
396
- serverMsg.from
397
- );
398
- if (senderLastReceivedIndex < myLastSent) {
399
- }
191
+ const createdAt = Date.now();
192
+ const timestamp = Date.now();
193
+ const nonce = this.generateNonce();
194
+ // 检查普通消息大小限制(10KB)
195
+ const plaintextBytes = new TextEncoder().encode(plaintext).length;
196
+ if (plaintextBytes > NORMAL_MESSAGE_BYTES_LIMIT) {
197
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `Message size (${plaintextBytes} bytes) exceeds maximum allowed size (${NORMAL_MESSAGE_BYTES_LIMIT} bytes). Consider using sendZipFile for large content.`);
400
198
  }
401
- if (!serverMsg.clientTimestamp) {
402
- throw new Error(
403
- `Missing clientTimestamp for message ${serverMsg.id}`
404
- );
199
+ // 【新增】获取最后收到的消息序号(用于消息确认)
200
+ const lastReceivedLeafIndex = this.messageStorage.getLastReceivedLeafIndex(this.userAddress, recipientAddress);
201
+ // 1. 加密消息(明文就是原始消息内容)
202
+ const encrypted = await this.session.encryptMessage(this.userAddress, recipientAddress, plaintext);
203
+ const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString("base64");
204
+ // 2. 计算明文哈希(用于 Merkle Tree 证明)
205
+ // 【更新】包含 lastReceivedLeafIndex 在哈希计算中
206
+ const plaintextHash = hashPlaintext(plaintext, createdAt, options?.guardAddress, options?.passportAddress, lastReceivedLeafIndex);
207
+ // 3. 签名消息
208
+ // 注意: guard_address 和 passport_address 始终包含在签名中(可能为空字符串),防止参数篡改
209
+ const account = await Account.Instance().get(this.userAddress, false);
210
+ if (!account) {
211
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User account not found");
405
212
  }
406
- if (!serverMsg.plaintextHash) {
407
- throw new Error(
408
- `Missing plaintextHash for message ${serverMsg.id}`
409
- );
410
- }
411
- if (serverMsg.merkleMetadata) {
412
- if (!serverMsg.merkleMetadata.prevRoot) {
413
- throw new Error(
414
- `Message ${serverMsg.id} missing prevRoot in merkleMetadata`
415
- );
416
- }
417
- if (!serverMsg.merkleMetadata.newRoot) {
418
- throw new Error(
419
- `Message ${serverMsg.id} missing newRoot in merkleMetadata`
420
- );
421
- }
422
- }
423
- const verificationResult = verifyMessage({
424
- messageId: serverMsg.id,
425
- plaintext,
426
- plaintextHash: serverMsg.plaintextHash,
427
- createdAt: serverMsg.clientTimestamp,
428
- guardAddress: serverMsg.guardAddress,
429
- passportAddress: serverMsg.passportAddress,
430
- lastReceivedLeafIndex: serverMsg.lastReceivedLeafIndex,
431
- // 【新增】传入消息确认字段
432
- serverSignature: serverMsg.merkleMetadata?.serverSignature,
433
- serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
434
- merkleMetadata: serverMsg.merkleMetadata ? {
435
- prevRoot: serverMsg.merkleMetadata.prevRoot,
436
- newRoot: serverMsg.merkleMetadata.newRoot,
437
- serverTimestamp: serverMsg.merkleMetadata.serverTimestamp,
438
- leafIndex: serverMsg.merkleMetadata.leafIndex,
439
- proofSiblings: serverMsg.merkleMetadata.proofSiblings,
440
- proofIndices: serverMsg.merkleMetadata.proofIndices
441
- } : void 0
213
+ const publicKey = account.pubkey;
214
+ const guardAddr = options?.guardAddress || "";
215
+ const passportAddr = options?.passportAddress || "";
216
+ // 统一发送模式(合并 send 和 send_force)
217
+ // 统一签名格式: send_message:{sender}:{recipient}:{guard_address}:{passport_address}:{plaintext_hash}:{last_received_leaf_index}:{public_key}:{timestamp}:{nonce}:{force}
218
+ const lastReceivedStr = lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex.toString() : "";
219
+ const forceStr = options?.force ? "true" : "false";
220
+ const signMessage = `send_message:${this.userAddress}:${recipientAddress}:${guardAddr}:${passportAddr}:${plaintextHash}:${lastReceivedStr}:${publicKey}:${timestamp}:${nonce}:${forceStr}`;
221
+ const signResult = await Account.Instance().signData(this.userAddress, signMessage);
222
+ const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
223
+ const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
224
+ // 使用统一的 sendMessage API
225
+ const response = await this.serverClient.sendMessage({
226
+ sender: signResult.publicKey,
227
+ recipient: recipientAddress,
228
+ ciphertext,
229
+ plaintextHash,
230
+ clientTimestamp: createdAt,
231
+ msgType: encrypted.type,
232
+ signatureScheme: "ED25519",
233
+ signature: signatureBase64,
234
+ timestamp,
235
+ nonce,
236
+ guardAddress: options?.guardAddress,
237
+ passportAddress: options?.passportAddress,
238
+ force: options?.force,
239
+ // 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
240
+ lastReceivedLeafIndex: lastReceivedLeafIndex >= 0
241
+ ? lastReceivedLeafIndex
242
+ : undefined,
442
243
  });
443
- if (!verificationResult.valid) {
444
- throw new Error(verificationResult.error);
445
- }
446
- const message2 = {
447
- messageId: serverMsg.id,
448
- fromAddress: serverMsg.from,
449
- toAddress: this.userAddress,
450
- plaintextHash: serverMsg.plaintextHash,
451
- plaintext,
452
- guardAddress: serverMsg.guardAddress,
453
- passportAddress: serverMsg.passportAddress,
454
- lastReceivedLeafIndex: serverMsg.lastReceivedLeafIndex,
455
- // 【新增】保存消息确认字段
456
- direction: MessageDirection.RECEIVED,
457
- status: MessageStatus.CONFIRMED,
458
- msgType: serverMsg.msgType,
459
- leafIndex: serverMsg.merkleMetadata?.leafIndex,
460
- prevRoot: serverMsg.merkleMetadata?.prevRoot,
461
- newRoot: serverMsg.merkleMetadata?.newRoot,
462
- serverSignature: serverMsg.merkleMetadata?.serverSignature,
463
- serverTimestamp: serverMsg.merkleMetadata?.serverTimestamp,
464
- serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
465
- createdAt: serverMsg.clientTimestamp,
466
- // 保存 ZIP 元数据(如果是 ZIP 消息)
467
- zipMetadata: serverMsg.zipMetadata
244
+ // 4. 保存到本地存储
245
+ const message = {
246
+ messageId: response.messageId,
247
+ fromAddress: this.userAddress,
248
+ toAddress: recipientAddress,
249
+ plaintextHash,
250
+ plaintext,
251
+ guardAddress: options?.guardAddress,
252
+ passportAddress: options?.passportAddress,
253
+ lastReceivedLeafIndex, // 【新增】保存消息确认字段
254
+ direction: MessageDirection.SENT,
255
+ status: response.status === "confirmed"
256
+ ? MessageStatus.CONFIRMED
257
+ : MessageStatus.PENDING,
258
+ msgType: encrypted.type,
259
+ createdAt,
468
260
  };
469
- this.messageStorage.saveMessage(message2);
470
- if (serverMsg.merkleMetadata) {
471
- this.sessionStateStorage.updateSessionState(
472
- this.userAddress,
473
- serverMsg.from,
474
- {
475
- currentRoot: serverMsg.merkleMetadata.newRoot,
476
- prevRoot: serverMsg.merkleMetadata.prevRoot,
477
- lastLeafIndex: serverMsg.merkleMetadata.leafIndex,
478
- lastSyncAt: Date.now()
261
+ if (response.merkleData) {
262
+ message.leafIndex = response.merkleData.leafIndex;
263
+ message.prevRoot = response.merkleData.prevRoot;
264
+ message.newRoot = response.merkleData.newRoot;
265
+ message.serverSignature = response.merkleData.serverSignature;
266
+ message.serverTimestamp = response.merkleData.serverTimestamp;
267
+ message.serverPublicKey = response.merkleData.serverPublicKey;
268
+ // 更新会话状态
269
+ this.sessionStateStorage.updateSessionState(this.userAddress, recipientAddress, {
270
+ currentRoot: response.merkleData.newRoot,
271
+ prevRoot: response.merkleData.prevRoot,
272
+ lastLeafIndex: response.merkleData.leafIndex,
273
+ lastSyncAt: Date.now(),
274
+ });
275
+ }
276
+ this.messageStorage.saveMessage(message);
277
+ // 方案B:处理服务器返回的其他已验证消息的 Merkle 数据
278
+ // 这些消息可能之前因为发送方离线而没有收到 Merkle 数据
279
+ if (response.pendingMerkleData) {
280
+ for (const [msgId, merkleData] of Object.entries(response.pendingMerkleData)) {
281
+ // 检查本地是否已有该消息
282
+ const existingMsg = this.messageStorage.getMessage(msgId);
283
+ if (existingMsg &&
284
+ existingMsg.status === MessageStatus.PENDING) {
285
+ // 更新消息的 Merkle 数据
286
+ this.messageStorage.updateMessageStatus(msgId, MessageStatus.CONFIRMED, {
287
+ leafIndex: merkleData.leafIndex,
288
+ newRoot: merkleData.newRoot,
289
+ serverSignature: merkleData.serverSignature,
290
+ serverTimestamp: merkleData.serverTimestamp,
291
+ serverPublicKey: merkleData.serverPublicKey,
292
+ });
293
+ /*console.log(
294
+ `Updated pending message ${msgId} with merkle data from pendingMerkleData`,
295
+ );*/
296
+ }
479
297
  }
480
- );
481
298
  }
482
- const timestamp2 = serverMsg.merkleMetadata?.serverTimestamp || serverMsg.clientTimestamp || Date.now();
483
- decryptedMessages.push({
484
- id: serverMsg.id,
485
- from: serverMsg.from,
486
- plaintext,
487
- // 【更新】明文直接是消息内容
488
- timestamp: timestamp2,
489
- merkleVerified: !!serverMsg.merkleMetadata,
490
- merkleData: serverMsg.merkleMetadata ? {
491
- leafIndex: serverMsg.merkleMetadata.leafIndex,
492
- rootHash: serverMsg.merkleMetadata.newRoot
493
- } : void 0
494
- });
495
- acknowledgedIds.push(serverMsg.id);
496
- } catch (error) {
497
- throw new Error(
498
- `Failed to decrypt message ${serverMsg.id}: ${error instanceof Error ? error.message : String(error)}`
499
- );
500
- }
299
+ return {
300
+ messageId: response.messageId,
301
+ status: message.status,
302
+ merkleData: response.merkleData,
303
+ guardList: response.guard_list,
304
+ };
501
305
  }
502
- if (acknowledgedIds.length > 0 && this.userAddress) {
503
- const ackTimestamp = Date.now();
504
- const ackNonce = this.generateNonce();
505
- const account2 = await Account.Instance().get(
506
- this.userAddress,
507
- false
508
- );
509
- if (account2?.pubkey) {
510
- const ackMessage = `ack_messages:${this.userAddress}:${acknowledgedIds.join(",")}:${account2.pubkey}:${ackTimestamp}:${ackNonce}`;
511
- const signResult2 = await Account.Instance().signData(
512
- this.userAddress,
513
- ackMessage
514
- );
515
- const signatureBuffer = Buffer.from(
516
- signResult2.signature.slice(2),
517
- "hex"
518
- );
519
- const signatureBase64 = bytesToBase64(
520
- new Uint8Array(signatureBuffer)
521
- );
522
- await this.serverClient.acknowledgeMessages(
523
- acknowledgedIds,
524
- signResult2.publicKey,
525
- {
526
- publicKey: signResult2.publicKey,
306
+ /**
307
+ * 拉取消息
308
+ *
309
+ * 流程:
310
+ * 1. 从服务器拉取消息
311
+ * 2. 解密消息(Signal Protocol)
312
+ * 3. 验证 Merkle 证明
313
+ * 4. 本地存储并确认消息
314
+ */
315
+ async pullMessages(limit) {
316
+ if (!this.userAddress) {
317
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
318
+ }
319
+ // 1. 生成签名参数
320
+ // 签名格式: fetch_messages:{address}:{limit}:{timestamp}:{nonce}
321
+ const timestamp = Date.now(); //@ 使用ms时间戳
322
+ const nonce = this.generateNonce();
323
+ const message = `fetch_messages:${this.userAddress}:${limit || 100}:${timestamp}:${nonce}`;
324
+ const account = await Account.Instance().get(this.userAddress, false);
325
+ const publicKey = account?.pubkey || "";
326
+ const signResult = await Account.Instance().signData(this.userAddress, message);
327
+ const signature = Buffer.from(signResult.signature.slice(2), "hex");
328
+ const signatureParams = {
527
329
  signatureScheme: "ED25519",
528
- signature: signatureBase64,
529
- timestamp: ackTimestamp,
530
- nonce: ackNonce
531
- }
532
- );
533
- }
534
- }
535
- await this.session.ensurePreKeys(this.userAddress);
536
- return decryptedMessages;
537
- }
538
- /**
539
- * 获取最后发送的消息序号
540
- * @param peerAddress 对方地址
541
- * @returns 最后发送的消息 leafIndex,如果没有发送过返回 -1
542
- */
543
- getLastSentLeafIndex(peerAddress) {
544
- if (!this.userAddress) return -1;
545
- const messages = this.messageStorage.getMessagesBySession(
546
- this.userAddress,
547
- peerAddress
548
- );
549
- const sentMessages = messages.filter(
550
- (m) => m.direction === MessageDirection.SENT && m.leafIndex !== void 0
551
- );
552
- if (sentMessages.length === 0) return -1;
553
- return Math.max(...sentMessages.map((m) => m.leafIndex));
554
- }
555
- /**
556
- * 获取会话历史消息
557
- */
558
- getSessionMessages(peerAddress) {
559
- if (!this.userAddress) {
560
- return [];
561
- }
562
- return this.messageStorage.getMessagesBySession(
563
- this.userAddress,
564
- peerAddress
565
- );
566
- }
567
- /**
568
- * 获取会话当前状态
569
- */
570
- getSessionState(peerAddress) {
571
- if (!this.userAddress) {
572
- return void 0;
573
- }
574
- return this.sessionStateStorage.getSessionState(
575
- this.userAddress,
576
- peerAddress
577
- );
578
- }
579
- /**
580
- * 提交链上证明
581
- *
582
- * 使用 proof.ts 将 Merkle Root 提交到链上,获得时间证明
583
- *
584
- * @param env CallEnv 环境
585
- * @param peerAddress 对方地址
586
- * @param description 证明描述
587
- */
588
- async submitChainProof(env, peerAddress, description) {
589
- if (!this.userAddress) {
590
- throw new MessengerError(
591
- MessengerErrorCode.IDENTITY_NOT_FOUND,
592
- "User address not set"
593
- );
594
- }
595
- const sessionState = this.sessionStateStorage.getSessionState(
596
- this.userAddress,
597
- peerAddress
598
- );
599
- if (!sessionState || !sessionState.currentRoot) {
600
- throw new MessengerError(
601
- MessengerErrorCode.SESSION_NOT_ESTABLISHED,
602
- "No session state found"
603
- );
604
- }
605
- const messages = this.messageStorage.getMessagesBySession(
606
- this.userAddress,
607
- peerAddress
608
- );
609
- const lastMessage = messages[messages.length - 1];
610
- if (!lastMessage || !lastMessage.serverPublicKey || !lastMessage.serverSignature) {
611
- throw new MessengerError(
612
- MessengerErrorCode.INVALID_PROOF,
613
- "No temporal proof (missing server public key or signature), cannot submit Proof to WoWok blockchain"
614
- );
615
- }
616
- const serverPubKey = lastMessage.serverPublicKey;
617
- const serverSignature = lastMessage.serverSignature;
618
- const proofData = {
619
- sessionId: sessionState.sessionId,
620
- merkleRoot: sessionState.currentRoot,
621
- messageCount: sessionState.messageCount,
622
- timestamp: Date.now()
623
- };
624
- const callProof = new CallProof({
625
- proof: JSON.stringify(proofData),
626
- server_pubkey: serverPubKey,
627
- server_signature: serverSignature,
628
- proof_type: CHAIN_PROOF_TYPE,
629
- // 1 = Messenger Session Proof
630
- description: description || `Messenger session proof for ${this.userAddress} <-> ${peerAddress}`,
631
- item_count: sessionState.messageCount,
632
- about_address: sessionState.sessionId
633
- });
634
- const result = await callProof.call(env);
635
- const responseData = result?.objectChanges;
636
- const proofAddress = responseData?.find(
637
- (change) => change.objectType?.includes("Proof")
638
- )?.objectId;
639
- return {
640
- proofAddress: proofAddress || "",
641
- txHash: result?.digest || ""
642
- };
643
- }
644
- /**
645
- * 建立 SSE 连接并监听服务器事件
646
- *
647
- * 安全要求:必须提供签名验证,防止未授权监听他人事件
648
- * @param onMessage 新消息回调
649
- * @param signatureParams 签名参数(可选,不提供时自动生成)
650
- */
651
- async connectEventSource(onMessage, signatureParams) {
652
- if (!this.userAddress) {
653
- throw new MessengerError(
654
- MessengerErrorCode.IDENTITY_NOT_FOUND,
655
- "User address not set"
656
- );
657
- }
658
- this.disconnectEventSource();
659
- if (onMessage) {
660
- this.onMessageCallback = onMessage;
661
- }
662
- const account = await Account.Instance().get(this.userAddress, false);
663
- const publicKey = account?.pubkey || "";
664
- let params = signatureParams;
665
- if (!params) {
666
- const timestamp = Date.now();
667
- const nonce = this.generateNonce();
668
- const message = `event_stream:${this.userAddress}:${timestamp}:${nonce}`;
669
- const signResult = await Account.Instance().signData(
670
- this.userAddress,
671
- message
672
- );
673
- const signatureBuffer = Buffer.from(
674
- signResult.signature.slice(2),
675
- "hex"
676
- );
677
- const signatureBase64 = bytesToBase64(
678
- new Uint8Array(signatureBuffer)
679
- );
680
- params = {
681
- signatureScheme: "ED25519",
682
- signature: signatureBase64,
683
- timestamp,
684
- nonce
685
- };
686
- }
687
- const queryParams = new URLSearchParams({
688
- publicKey,
689
- signatureScheme: params.signatureScheme,
690
- signature: params.signature,
691
- timestamp: params.timestamp.toString(),
692
- nonce: params.nonce
693
- });
694
- const url = `${this.config.serverUrl}/v1/events/${this.userAddress}?${queryParams}`;
695
- if (typeof EventSource === "undefined") {
696
- throw new ReferenceError("EventSource is not defined");
697
- }
698
- this.eventSource = new EventSource(url);
699
- this.eventSource.onmessage = async (event) => {
700
- try {
701
- const sseEvent = JSON.parse(event.data);
702
- switch (sseEvent.type) {
703
- case "NewMessage":
704
- if (this.onMessageCallback) {
705
- const messages = await this.pullMessages();
706
- if (messages.length > 0) {
707
- this.onMessageCallback(messages);
708
- }
709
- }
710
- break;
711
- case "ark_confirmed": {
712
- const {
713
- message_ids,
714
- recipient,
715
- recipient_public_key,
716
- signature,
717
- timestamp
718
- } = sseEvent.data;
719
- const verifyMessage2 = `ack_messages:${recipient}:${message_ids.join(",")}:${recipient_public_key}:${timestamp}`;
330
+ signature: bytesToBase64(signature),
331
+ timestamp,
332
+ nonce,
333
+ };
334
+ // 2. 拉取消息(带签名验证)
335
+ const response = await this.serverClient.pullMessages(this.userAddress, publicKey, signatureParams, limit);
336
+ /*console.log(`[Messenger] 服务器返回 ${response.messages.length} 条消息`);
337
+ if (response.messages.length > 0) {
338
+ console.log(`[Messenger] 消息 IDs: ${response.messages.map(m => m.id).join(', ')}`);
339
+ }*/
340
+ if (response.messages.length === 0) {
341
+ return [];
342
+ }
343
+ const decryptedMessages = [];
344
+ const acknowledgedIds = [];
345
+ for (const serverMsg of response.messages) {
720
346
  try {
721
- const { Ed25519PublicKey } = await import("../../keypairs/ed25519/publickey.js");
722
- const publicKey2 = new Ed25519PublicKey(
723
- recipient_public_key
724
- );
725
- const signatureBytes = Uint8Array.from(
726
- Buffer.from(signature, "base64")
727
- );
728
- const isValid = await publicKey2.verify(
729
- new TextEncoder().encode(verifyMessage2),
730
- signatureBytes
731
- );
732
- if (isValid) {
733
- for (const msgId of message_ids) {
734
- const existingMsg = this.messageStorage.getMessage(msgId);
735
- if (existingMsg) {
736
- existingMsg.arkConfirmed = {
737
- recipient,
738
- recipientPublicKey: recipient_public_key,
739
- signature,
740
- timestamp
741
- };
742
- this.messageStorage.saveMessage(
743
- existingMsg
744
- );
745
- }
347
+ //console.log(`[Messenger] 处理消息 ${serverMsg.id}, from=${serverMsg.from}, msgType=${serverMsg.msgType}`);
348
+ // 检查消息是否已经在本地存储
349
+ // 注意:由于每个用户有自己的数据库文件,消息 ID 不会冲突
350
+ const existingMessage = this.messageStorage.getMessage(serverMsg.id);
351
+ if (existingMessage) {
352
+ // 消息已存在,直接确认
353
+ //console.log(`[Messenger] 消息 ${serverMsg.id} 已存在于本地存储,跳过`);
354
+ acknowledgedIds.push(serverMsg.id);
355
+ continue;
746
356
  }
747
- } else {
748
- console.error(
749
- "ARK signature verification failed - possible server tampering"
750
- );
751
- }
752
- } catch (error) {
753
- console.error(
754
- "Failed to verify ARK signature:",
755
- error
756
- );
757
- }
758
- break;
759
- }
760
- case "PreKeyLow":
761
- await this.checkAndRefillPrekeys();
762
- break;
763
- case "Custom":
764
- break;
765
- case "guard_confirmed": {
766
- const {
767
- message_id,
768
- merkle_data,
769
- timestamp: _timestamp
770
- } = sseEvent.data;
771
- const existingMsg = this.messageStorage.getMessage(message_id);
772
- if (!existingMsg) {
773
- console.warn(
774
- `Guard confirmed event received but message ${message_id} not found in local storage`
775
- );
776
- break;
777
- }
778
- if (!merkle_data.prevRoot) {
779
- console.error(
780
- `Guard message ${message_id} missing prevRoot in merkle_data`
781
- );
782
- break;
783
- }
784
- if (!merkle_data.newRoot) {
785
- console.error(
786
- `Guard message ${message_id} missing newRoot in merkle_data`
787
- );
788
- break;
789
- }
790
- if (!merkle_data.serverTimestamp) {
791
- console.error(
792
- `Guard message ${message_id} missing serverTimestamp in merkle_data`
793
- );
794
- break;
795
- }
796
- if (!merkle_data.serverSignature) {
797
- console.error(
798
- `Guard message ${message_id} missing serverSignature in merkle_data`
799
- );
800
- break;
801
- }
802
- if (!merkle_data.serverPublicKey) {
803
- console.error(
804
- `Guard message ${message_id} missing serverPublicKey in merkle_data`
805
- );
806
- break;
807
- }
808
- const { verifySingleMerkleRoot } = await import("./crypto.js");
809
- const rootValid = verifySingleMerkleRoot(
810
- merkle_data.prevRoot,
811
- merkle_data.newRoot,
812
- existingMsg.plaintextHash,
813
- merkle_data.serverTimestamp,
814
- merkle_data.leafIndex
815
- );
816
- if (!rootValid.valid) {
817
- console.error(
818
- `Guard message ${message_id} Merkle root verification failed: ${rootValid.error}`
819
- );
820
- break;
821
- }
822
- const { verifyEd25519Signature } = await import("./crypto.js");
823
- const signData = `${merkle_data.prevRoot}:${merkle_data.newRoot}:${merkle_data.serverTimestamp}:${merkle_data.serverPublicKey}`;
824
- const signatureValid = verifyEd25519Signature(
825
- merkle_data.serverPublicKey,
826
- signData,
827
- merkle_data.serverSignature
828
- );
829
- if (!signatureValid) {
830
- console.error(
831
- `Guard message ${message_id} server signature verification failed`
832
- );
833
- break;
834
- }
835
- this.messageStorage.updateMessageStatus(
836
- message_id,
837
- MessageStatus.CONFIRMED,
838
- {
839
- leafIndex: merkle_data.leafIndex,
840
- newRoot: merkle_data.newRoot,
841
- serverSignature: merkle_data.serverSignature,
842
- serverTimestamp: merkle_data.serverTimestamp,
843
- serverPublicKey: merkle_data.serverPublicKey
844
- }
845
- );
846
- const updated = true;
847
- if (updated) {
848
- if (existingMsg.toAddress === null) {
849
- throw new Error(
850
- `Guard message ${message_id} has null toAddress`
851
- );
852
- }
853
- const toAddr = existingMsg.toAddress;
854
- if (toAddr === null) {
855
- throw new Error(
856
- `Guard message ${message_id} has null toAddress`
857
- );
858
- }
859
- this.sessionStateStorage.updateSessionState(
860
- this.userAddress,
861
- toAddr,
862
- {
863
- currentRoot: merkle_data.newRoot,
864
- prevRoot: merkle_data.prevRoot,
865
- lastLeafIndex: merkle_data.leafIndex,
866
- lastSyncAt: Date.now()
357
+ // 2. 解密消息
358
+ //console.log(`[Messenger] 解密消息 ${serverMsg.id}...`);
359
+ const ciphertext = Uint8Array.from(Buffer.from(serverMsg.bodyB64, "base64"));
360
+ //console.log(`[Messenger] 密文长度: ${ciphertext.length} bytes`);
361
+ const decryptedData = await this.session.decryptMessage(this.userAddress, serverMsg.from, ciphertext.buffer, serverMsg.msgType);
362
+ //console.log(`[Messenger] 消息 ${serverMsg.id} 解密成功`);
363
+ // 【更新】明文直接就是消息内容(不再是 JSON 格式)
364
+ const plaintext = decryptedData;
365
+ // 【新增】从服务器返回的字段获取 lastReceivedLeafIndex
366
+ const senderLastReceivedIndex = serverMsg.lastReceivedLeafIndex ?? -1;
367
+ // 【新增】处理消息确认信息
368
+ if (senderLastReceivedIndex >= 0) {
369
+ const myLastSent = this.getLastSentLeafIndex(serverMsg.from);
370
+ if (senderLastReceivedIndex < myLastSent) {
371
+ /*console.warn(
372
+ `[Messenger] ${serverMsg.from} 可能丢失了消息,` +
373
+ `对方确认: ${senderLastReceivedIndex}, ` +
374
+ `我已发送: ${myLastSent}`,
375
+ );*/
376
+ }
377
+ }
378
+ // 3. 使用通用验证函数验证消息
379
+ // 检查必需字段
380
+ if (!serverMsg.clientTimestamp) {
381
+ throw new Error(`Missing clientTimestamp for message ${serverMsg.id}`);
382
+ }
383
+ if (!serverMsg.plaintextHash) {
384
+ throw new Error(`Missing plaintextHash for message ${serverMsg.id}`);
867
385
  }
868
- );
869
- } else {
870
- console.warn(
871
- `Failed to update Guard message ${message_id}`
872
- );
386
+ // 验证 Merkle 元数据完整性
387
+ if (serverMsg.merkleMetadata) {
388
+ if (!serverMsg.merkleMetadata.prevRoot) {
389
+ throw new Error(`Message ${serverMsg.id} missing prevRoot in merkleMetadata`);
390
+ }
391
+ if (!serverMsg.merkleMetadata.newRoot) {
392
+ throw new Error(`Message ${serverMsg.id} missing newRoot in merkleMetadata`);
393
+ }
394
+ }
395
+ const verificationResult = verifyMessage({
396
+ messageId: serverMsg.id,
397
+ plaintext,
398
+ plaintextHash: serverMsg.plaintextHash,
399
+ createdAt: serverMsg.clientTimestamp,
400
+ guardAddress: serverMsg.guardAddress,
401
+ passportAddress: serverMsg.passportAddress,
402
+ lastReceivedLeafIndex: serverMsg.lastReceivedLeafIndex, // 【新增】传入消息确认字段
403
+ serverSignature: serverMsg.merkleMetadata?.serverSignature,
404
+ serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
405
+ merkleMetadata: serverMsg.merkleMetadata
406
+ ? {
407
+ prevRoot: serverMsg.merkleMetadata.prevRoot,
408
+ newRoot: serverMsg.merkleMetadata.newRoot,
409
+ serverTimestamp: serverMsg.merkleMetadata.serverTimestamp,
410
+ leafIndex: serverMsg.merkleMetadata.leafIndex,
411
+ proofSiblings: serverMsg.merkleMetadata.proofSiblings,
412
+ proofIndices: serverMsg.merkleMetadata.proofIndices,
413
+ }
414
+ : undefined,
415
+ });
416
+ if (!verificationResult.valid) {
417
+ throw new Error(verificationResult.error);
418
+ }
419
+ // 5. 保存到本地存储
420
+ // 经过 verifyMessage 验证,这些字段一定存在
421
+ const message = {
422
+ messageId: serverMsg.id,
423
+ fromAddress: serverMsg.from,
424
+ toAddress: this.userAddress,
425
+ plaintextHash: serverMsg.plaintextHash,
426
+ plaintext,
427
+ guardAddress: serverMsg.guardAddress,
428
+ passportAddress: serverMsg.passportAddress,
429
+ lastReceivedLeafIndex: serverMsg.lastReceivedLeafIndex, // 【新增】保存消息确认字段
430
+ direction: MessageDirection.RECEIVED,
431
+ status: MessageStatus.CONFIRMED,
432
+ msgType: serverMsg.msgType,
433
+ leafIndex: serverMsg.merkleMetadata?.leafIndex,
434
+ prevRoot: serverMsg.merkleMetadata?.prevRoot,
435
+ newRoot: serverMsg.merkleMetadata?.newRoot,
436
+ serverSignature: serverMsg.merkleMetadata?.serverSignature,
437
+ serverTimestamp: serverMsg.merkleMetadata?.serverTimestamp,
438
+ serverPublicKey: serverMsg.merkleMetadata?.serverPublicKey,
439
+ createdAt: serverMsg.clientTimestamp,
440
+ // 保存 ZIP 元数据(如果是 ZIP 消息)
441
+ zipMetadata: serverMsg.zipMetadata,
442
+ };
443
+ this.messageStorage.saveMessage(message);
444
+ // 更新会话状态
445
+ if (serverMsg.merkleMetadata) {
446
+ this.sessionStateStorage.updateSessionState(this.userAddress, serverMsg.from, {
447
+ currentRoot: serverMsg.merkleMetadata.newRoot,
448
+ prevRoot: serverMsg.merkleMetadata.prevRoot,
449
+ lastLeafIndex: serverMsg.merkleMetadata.leafIndex,
450
+ lastSyncAt: Date.now(),
451
+ });
452
+ }
453
+ const timestamp = serverMsg.merkleMetadata?.serverTimestamp ||
454
+ serverMsg.clientTimestamp ||
455
+ Date.now();
456
+ decryptedMessages.push({
457
+ id: serverMsg.id,
458
+ from: serverMsg.from,
459
+ plaintext, // 【更新】明文直接是消息内容
460
+ timestamp,
461
+ merkleVerified: !!serverMsg.merkleMetadata,
462
+ merkleData: serverMsg.merkleMetadata
463
+ ? {
464
+ leafIndex: serverMsg.merkleMetadata.leafIndex,
465
+ rootHash: serverMsg.merkleMetadata.newRoot,
466
+ }
467
+ : undefined,
468
+ });
469
+ acknowledgedIds.push(serverMsg.id);
873
470
  }
874
- break;
875
- }
876
- case "guard_rejected": {
877
- const {
878
- message_id,
879
- reason: _reason,
880
- timestamp: _timestamp
881
- } = sseEvent.data;
882
- const existingMsg = this.messageStorage.getMessage(message_id);
883
- if (existingMsg) {
884
- existingMsg.status = MessageStatus.REJECTED;
885
- this.messageStorage.saveMessage(existingMsg);
886
- } else {
471
+ catch (error) {
472
+ throw new Error(`Failed to decrypt message ${serverMsg.id}: ${error instanceof Error ? error.message : String(error)}`);
887
473
  }
888
- break;
889
- }
890
474
  }
891
- } catch (error) {
892
- console.error("Failed to handle SSE event:", error);
893
- }
894
- };
895
- this.eventSource.onopen = () => {
896
- };
897
- this.eventSource.onerror = (error) => {
898
- console.error("SSE connection error:", error);
899
- this.disconnectEventSource();
900
- };
901
- }
902
- /**
903
- * 检查 SSE 是否已连接
904
- */
905
- isEventSourceConnected() {
906
- return this.eventSource !== null;
907
- }
908
- /**
909
- * 断开 SSE 连接
910
- */
911
- disconnectEventSource() {
912
- if (this.eventSource) {
913
- this.eventSource.close();
914
- this.eventSource = null;
915
- }
916
- }
917
- /**
918
- * 销毁 Messenger 实例
919
- * 清理所有资源(定时器、SSE 连接等)
920
- */
921
- destroy() {
922
- this.stopPrekeyCheckTimer();
923
- this.disconnectEventSource();
924
- }
925
- /**
926
- * 断开连接(destroy 的别名)
927
- * 用于清理资源
928
- */
929
- disconnect() {
930
- this.destroy();
931
- }
932
- /**
933
- * 发送 ZIP 压缩文件
934
- *
935
- * 支持发送本地或网络 WTS/WIP 文件,经过 ZIP 压缩后发送给对方
936
- * 支持 Guard 验证,如果提供 guardAddress 和 passportAddress,消息将进入 Guard 验证流程
937
- *
938
- * @param recipientAddress 接收方地址
939
- * @param source 文件源(本地路径或网络 URL)
940
- * @param options 可选参数
941
- * @returns 发送结果
942
- */
943
- async sendZipFile(recipientAddress, source, options) {
944
- if (!this.userAddress) {
945
- throw new MessengerError(
946
- MessengerErrorCode.IDENTITY_NOT_FOUND,
947
- "User address not set"
948
- );
949
- }
950
- const fileData = await this.loadFileData(source);
951
- const JSZip = (await import("jszip")).default;
952
- const zip = new JSZip();
953
- const fileName = options?.fileName || path.basename(source) || "file.zip";
954
- const contentType = options?.contentType || this.detectContentType(fileName);
955
- zip.file(fileName, fileData);
956
- const zipBlob = await zip.generateAsync({ type: "uint8array" });
957
- if (zipBlob.length > WTS_FILE_BYTES_LIMIT) {
958
- throw new MessengerError(
959
- MessengerErrorCode.INVALID_INPUT,
960
- `ZIP file size (${zipBlob.length} bytes) exceeds local maximum allowed size (${WTS_FILE_BYTES_LIMIT} bytes)`
961
- );
475
+ // 5. 确认已处理的消息(带签名)
476
+ if (acknowledgedIds.length > 0 && this.userAddress) {
477
+ const ackTimestamp = Date.now(); //@ 使用ms时间戳
478
+ const ackNonce = this.generateNonce();
479
+ // 签名消息格式: ack_messages:{user}:{message_ids}:{public_key}:{timestamp}:{nonce}
480
+ const account = await Account.Instance().get(this.userAddress, false);
481
+ if (account?.pubkey) {
482
+ const ackMessage = `ack_messages:${this.userAddress}:${acknowledgedIds.join(",")}:${account.pubkey}:${ackTimestamp}:${ackNonce}`;
483
+ const signResult = await Account.Instance().signData(this.userAddress, ackMessage);
484
+ const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
485
+ const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
486
+ await this.serverClient.acknowledgeMessages(acknowledgedIds, signResult.publicKey, {
487
+ publicKey: signResult.publicKey,
488
+ signatureScheme: "ED25519",
489
+ signature: signatureBase64,
490
+ timestamp: ackTimestamp,
491
+ nonce: ackNonce,
492
+ });
493
+ }
494
+ }
495
+ // 6. 补充预密钥
496
+ await this.session.ensurePreKeys(this.userAddress);
497
+ return decryptedMessages;
962
498
  }
963
- const zipFileHash = "0x" + createHash("sha256").update(zipBlob).digest("hex");
964
- const zipBase64 = Buffer.from(zipBlob).toString("base64");
965
- const zipMetadata = {
966
- fileName: `${fileName}.zip`,
967
- fileSize: zipBlob.length,
968
- fileHash: zipFileHash,
969
- contentType
970
- };
971
- const lastReceivedLeafIndex = this.messageStorage.getLastReceivedLeafIndex(
972
- this.userAddress,
973
- recipientAddress
974
- );
975
- const createdAt = Date.now();
976
- const encrypted = await this.session.encryptMessage(
977
- this.userAddress,
978
- recipientAddress,
979
- zipBase64
980
- // 直接加密 ZIP 的 base64 内容
981
- );
982
- const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString(
983
- "base64"
984
- );
985
- const guardAddr = options?.guardAddress || "";
986
- const passportAddr = options?.passportAddress || "";
987
- const plaintextHash = hashPlaintext(
988
- zipBase64,
989
- createdAt,
990
- guardAddr,
991
- passportAddr,
992
- lastReceivedLeafIndex
993
- );
994
- const timestamp = Date.now();
995
- const nonce = this.generateNonce();
996
- const account = await Account.Instance().get(this.userAddress, false);
997
- if (!account) {
998
- throw new MessengerError(
999
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1000
- "User account not found"
1001
- );
499
+ /**
500
+ * 获取最后发送的消息序号
501
+ * @param peerAddress 对方地址
502
+ * @returns 最后发送的消息 leafIndex,如果没有发送过返回 -1
503
+ */
504
+ getLastSentLeafIndex(peerAddress) {
505
+ if (!this.userAddress)
506
+ return -1;
507
+ const messages = this.messageStorage.getMessagesBySession(this.userAddress, peerAddress);
508
+ const sentMessages = messages.filter((m) => m.direction === MessageDirection.SENT &&
509
+ m.leafIndex !== undefined);
510
+ if (sentMessages.length === 0)
511
+ return -1;
512
+ return Math.max(...sentMessages.map((m) => m.leafIndex));
1002
513
  }
1003
- const publicKey = account.pubkey;
1004
- const lastReceivedStr = lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex.toString() : "";
1005
- const forceStr = options?.force ? "true" : "false";
1006
- const signMessage = `send_message:${this.userAddress}:${recipientAddress}:${guardAddr}:${passportAddr}:${plaintextHash}:${lastReceivedStr}:${publicKey}:${timestamp}:${nonce}:${forceStr}`;
1007
- const signResult = await Account.Instance().signData(
1008
- this.userAddress,
1009
- signMessage
1010
- );
1011
- const signatureBuffer = Buffer.from(
1012
- signResult.signature.slice(2),
1013
- "hex"
1014
- );
1015
- const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
1016
- const response = await this.serverClient.sendMessage({
1017
- sender: signResult.publicKey,
1018
- recipient: recipientAddress,
1019
- ciphertext,
1020
- plaintextHash,
1021
- clientTimestamp: createdAt,
1022
- msgType: encrypted.type,
1023
- // 使用底层 Signal Protocol 消息类型(1 或 3)
1024
- zipMetadata,
1025
- guardAddress: options?.guardAddress,
1026
- passportAddress: options?.passportAddress,
1027
- force: options?.force,
1028
- // 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
1029
- lastReceivedLeafIndex: lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex : void 0,
1030
- signatureScheme: "ED25519",
1031
- signature: signatureBase64,
1032
- timestamp,
1033
- nonce
1034
- });
1035
- const message = {
1036
- messageId: response.messageId,
1037
- fromAddress: this.userAddress,
1038
- toAddress: recipientAddress,
1039
- plaintextHash,
1040
- plaintext: zipBase64,
1041
- // 保存 ZIP 数据的 base64 编码,方便本地查看
1042
- guardAddress: options?.guardAddress,
1043
- passportAddress: options?.passportAddress,
1044
- lastReceivedLeafIndex,
1045
- // 【新增】保存消息确认字段
1046
- direction: MessageDirection.SENT,
1047
- status: response.status === "confirmed" ? MessageStatus.CONFIRMED : MessageStatus.PENDING,
1048
- msgType: encrypted.type,
1049
- // 使用底层 Signal Protocol 消息类型(1 或 3)
1050
- zipMetadata,
1051
- createdAt
1052
- };
1053
- if (response.merkleData) {
1054
- message.leafIndex = response.merkleData.leafIndex;
1055
- message.prevRoot = response.merkleData.prevRoot;
1056
- message.newRoot = response.merkleData.newRoot;
1057
- message.serverSignature = response.merkleData.serverSignature;
1058
- message.serverTimestamp = response.merkleData.serverTimestamp;
1059
- message.serverPublicKey = response.merkleData.serverPublicKey;
1060
- this.sessionStateStorage.updateSessionState(
1061
- this.userAddress,
1062
- recipientAddress,
1063
- {
1064
- currentRoot: response.merkleData.newRoot,
1065
- prevRoot: response.merkleData.prevRoot,
1066
- lastLeafIndex: response.merkleData.leafIndex,
1067
- lastSyncAt: Date.now()
514
+ /**
515
+ * 获取会话历史消息
516
+ */
517
+ getSessionMessages(peerAddress) {
518
+ if (!this.userAddress) {
519
+ return [];
1068
520
  }
1069
- );
521
+ return this.messageStorage.getMessagesBySession(this.userAddress, peerAddress);
1070
522
  }
1071
- this.messageStorage.saveMessage(message);
1072
- if (response.pendingMerkleData) {
1073
- for (const [msgId, merkleData] of Object.entries(
1074
- response.pendingMerkleData
1075
- )) {
1076
- const existingMsg = this.messageStorage.getMessage(msgId);
1077
- if (existingMsg && existingMsg.status === MessageStatus.PENDING) {
1078
- this.messageStorage.updateMessageStatus(
1079
- msgId,
1080
- MessageStatus.CONFIRMED,
1081
- {
1082
- leafIndex: merkleData.leafIndex,
1083
- newRoot: merkleData.newRoot,
1084
- serverSignature: merkleData.serverSignature,
1085
- serverTimestamp: merkleData.serverTimestamp,
1086
- serverPublicKey: merkleData.serverPublicKey
1087
- }
1088
- );
523
+ /**
524
+ * 获取会话当前状态
525
+ */
526
+ getSessionState(peerAddress) {
527
+ if (!this.userAddress) {
528
+ return undefined;
1089
529
  }
1090
- }
530
+ return this.sessionStateStorage.getSessionState(this.userAddress, peerAddress);
1091
531
  }
1092
- return {
1093
- messageId: response.messageId,
1094
- status: message.status,
1095
- merkleData: response.merkleData,
1096
- guardList: response.guard_list
1097
- };
1098
- }
1099
- /**
1100
- * 加载文件数据(支持本地路径和网络 URL)
1101
- */
1102
- async loadFileData(source) {
1103
- if (source.startsWith("http://") || source.startsWith("https://")) {
1104
- const response = await fetch(source);
1105
- if (!response.ok) {
1106
- throw new MessengerError(
1107
- MessengerErrorCode.NETWORK_ERROR,
1108
- `Failed to fetch file from ${source}: ${response.statusText}`
1109
- );
1110
- }
1111
- const arrayBuffer = await response.arrayBuffer();
1112
- return new Uint8Array(arrayBuffer);
1113
- }
1114
- const resolvedPath = path.resolve(source);
1115
- if (!fs.existsSync(resolvedPath)) {
1116
- throw new MessengerError(
1117
- MessengerErrorCode.FILE_NOT_FOUND,
1118
- `File not found: ${resolvedPath}`
1119
- );
1120
- }
1121
- const buffer = fs.readFileSync(resolvedPath);
1122
- return new Uint8Array(buffer);
1123
- }
1124
- /**
1125
- * 检测内容类型
1126
- */
1127
- detectContentType(fileName) {
1128
- const ext = path.extname(fileName).toLowerCase();
1129
- switch (ext) {
1130
- case ".wts":
1131
- return "wts";
1132
- case ".wip":
1133
- return "wip";
1134
- default:
1135
- return "zip";
532
+ /**
533
+ * 提交链上证明
534
+ *
535
+ * 使用 proof.ts 将 Merkle Root 提交到链上,获得时间证明
536
+ *
537
+ * @param env CallEnv 环境
538
+ * @param peerAddress 对方地址
539
+ * @param description 证明描述
540
+ */
541
+ async submitChainProof(env, peerAddress, description) {
542
+ if (!this.userAddress) {
543
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
544
+ }
545
+ // 获取当前会话状态
546
+ const sessionState = this.sessionStateStorage.getSessionState(this.userAddress, peerAddress);
547
+ if (!sessionState || !sessionState.currentRoot) {
548
+ throw new MessengerError(MessengerErrorCode.SESSION_NOT_ESTABLISHED, "No session state found");
549
+ }
550
+ // 从会话消息中获取服务器公钥和签名
551
+ const messages = this.messageStorage.getMessagesBySession(this.userAddress, peerAddress);
552
+ const lastMessage = messages[messages.length - 1];
553
+ if (!lastMessage ||
554
+ !lastMessage.serverPublicKey ||
555
+ !lastMessage.serverSignature) {
556
+ throw new MessengerError(MessengerErrorCode.INVALID_PROOF, "No temporal proof (missing server public key or signature), cannot submit Proof to WoWok blockchain");
557
+ }
558
+ const serverPubKey = lastMessage.serverPublicKey;
559
+ const serverSignature = lastMessage.serverSignature;
560
+ // 构造证明数据
561
+ const proofData = {
562
+ sessionId: sessionState.sessionId,
563
+ merkleRoot: sessionState.currentRoot,
564
+ messageCount: sessionState.messageCount,
565
+ timestamp: Date.now(),
566
+ };
567
+ // 使用 CallProof 提交到链上
568
+ const callProof = new CallProof({
569
+ proof: JSON.stringify(proofData),
570
+ server_pubkey: serverPubKey,
571
+ server_signature: serverSignature,
572
+ proof_type: CHAIN_PROOF_TYPE, // 1 = Messenger Session Proof
573
+ description: description ||
574
+ `Messenger session proof for ${this.userAddress} <-> ${peerAddress}`,
575
+ item_count: sessionState.messageCount,
576
+ about_address: sessionState.sessionId,
577
+ });
578
+ const result = await callProof.call(env);
579
+ // 从结果中提取 proof 对象地址
580
+ // 这里需要根据实际的 CallProof 返回格式调整
581
+ const responseData = result?.objectChanges;
582
+ const proofAddress = responseData?.find((change) => change.objectType?.includes("Proof"))?.objectId;
583
+ return {
584
+ proofAddress: proofAddress || "",
585
+ txHash: result?.digest || "",
586
+ };
1136
587
  }
1137
- }
1138
- /**
1139
- * 生成签名的请求
1140
- */
1141
- async _createSignedRequest(data) {
1142
- if (!this.userAddress) {
1143
- throw new MessengerError(
1144
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1145
- "User address not set"
1146
- );
588
+ /**
589
+ * 建立 SSE 连接并监听服务器事件
590
+ *
591
+ * 安全要求:必须提供签名验证,防止未授权监听他人事件
592
+ * @param onMessage 新消息回调
593
+ * @param signatureParams 签名参数(可选,不提供时自动生成)
594
+ */
595
+ async connectEventSource(onMessage, signatureParams) {
596
+ if (!this.userAddress) {
597
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
598
+ }
599
+ // 关闭已有连接
600
+ this.disconnectEventSource();
601
+ if (onMessage) {
602
+ this.onMessageCallback = onMessage;
603
+ }
604
+ // 如果没有提供签名参数,自动生成
605
+ // 签名格式: event_stream:{address}:{timestamp}:{nonce}
606
+ const account = await Account.Instance().get(this.userAddress, false);
607
+ const publicKey = account?.pubkey || "";
608
+ let params = signatureParams;
609
+ if (!params) {
610
+ const timestamp = Date.now(); //@ 使用ms时间戳
611
+ const nonce = this.generateNonce();
612
+ const message = `event_stream:${this.userAddress}:${timestamp}:${nonce}`;
613
+ const signResult = await Account.Instance().signData(this.userAddress, message);
614
+ const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
615
+ const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
616
+ params = {
617
+ signatureScheme: "ED25519",
618
+ signature: signatureBase64,
619
+ timestamp,
620
+ nonce,
621
+ };
622
+ }
623
+ // 构建带签名的 URL
624
+ const queryParams = new URLSearchParams({
625
+ publicKey: publicKey,
626
+ signatureScheme: params.signatureScheme,
627
+ signature: params.signature,
628
+ timestamp: params.timestamp.toString(),
629
+ nonce: params.nonce,
630
+ });
631
+ const url = `${this.config.serverUrl}/v1/events/${this.userAddress}?${queryParams}`;
632
+ //console.log(`Connecting to SSE: ${url}`);
633
+ // 检查是否有 EventSource 可用
634
+ if (typeof EventSource === "undefined") {
635
+ console.warn("EventSource is not available in this environment. SSE functionality disabled, falling back to polling.");
636
+ return;
637
+ }
638
+ try {
639
+ this.eventSource = new EventSource(url);
640
+ }
641
+ catch (error) {
642
+ console.warn("Failed to create EventSource connection, falling back to polling.", error);
643
+ return;
644
+ }
645
+ // 监听消息事件
646
+ this.eventSource.onmessage = async (event) => {
647
+ try {
648
+ const sseEvent = JSON.parse(event.data);
649
+ //console.log("SSE event received:", sseEvent.type);
650
+ switch (sseEvent.type) {
651
+ case "NewMessage":
652
+ // 收到新消息通知,拉取并解密消息
653
+ if (this.onMessageCallback) {
654
+ const messages = await this.pullMessages();
655
+ if (messages.length > 0) {
656
+ this.onMessageCallback(messages);
657
+ }
658
+ }
659
+ break;
660
+ case "ark_confirmed": {
661
+ // 发送方收到 ARK 确认,验证接收方签名后更新本地状态
662
+ const { message_ids, recipient, recipient_public_key, signature, timestamp, } = sseEvent.data;
663
+ /*console.log(
664
+ `SSE ark_confirmed: messages ${message_ids} confirmed by ${recipient}`,
665
+ );*/
666
+ // 验证接收方签名(防止服务器作恶)
667
+ // 签名消息格式: ack_messages:{recipient}:{message_ids}:{public_key}:{timestamp}:{nonce}
668
+ // 注意: SSE事件中不包含nonce,因为nonce是在ARK请求时由接收方生成的,服务器只是转发
669
+ const verifyMessage = `ack_messages:${recipient}:${message_ids.join(",")}:${recipient_public_key}:${timestamp}`;
670
+ try {
671
+ // 使用事件中携带的接收方公钥验证签名
672
+ const { Ed25519PublicKey } = await import("../../keypairs/ed25519/publickey.js");
673
+ const publicKey = new Ed25519PublicKey(recipient_public_key);
674
+ const signatureBytes = Uint8Array.from(Buffer.from(signature, "base64"));
675
+ const isValid = await publicKey.verify(new TextEncoder().encode(verifyMessage), signatureBytes);
676
+ if (isValid) {
677
+ // 签名验证成功,保存 ARK 确认(不可更改字段)
678
+ for (const msgId of message_ids) {
679
+ // 获取现有消息并更新 ARK 确认
680
+ const existingMsg = this.messageStorage.getMessage(msgId);
681
+ if (existingMsg) {
682
+ existingMsg.arkConfirmed = {
683
+ recipient,
684
+ recipientPublicKey: recipient_public_key,
685
+ signature,
686
+ timestamp,
687
+ };
688
+ this.messageStorage.saveMessage(existingMsg);
689
+ }
690
+ }
691
+ /*console.log(
692
+ `ARK verified, stored ${message_ids.length} ARK confirmations`,
693
+ );*/
694
+ }
695
+ else {
696
+ console.error("ARK signature verification failed - possible server tampering");
697
+ }
698
+ }
699
+ catch (error) {
700
+ console.error("Failed to verify ARK signature:", error);
701
+ }
702
+ break;
703
+ }
704
+ case "PreKeyLow":
705
+ // 收到预密钥低库存通知,立即补充
706
+ /*console.log(
707
+ `SSE PreKeyLow event: ${sseEvent.data.current}/${sseEvent.data.max_allowed}, auto-refilling...`,
708
+ );*/
709
+ await this.checkAndRefillPrekeys();
710
+ break;
711
+ case "Custom":
712
+ // 自定义事件(如 Guard 确认/拒绝),暂不处理
713
+ //console.log("SSE Custom event received");
714
+ break;
715
+ case "guard_confirmed": {
716
+ // Guard 消息验证通过,更新消息的 merkleData
717
+ const { message_id, merkle_data, timestamp: _timestamp, } = sseEvent.data;
718
+ /*console.log(
719
+ `SSE guard_confirmed: message ${message_id} confirmed`,
720
+ );*/
721
+ // 更新本地消息状态
722
+ // 获取原始消息数据用于验证
723
+ const existingMsg = this.messageStorage.getMessage(message_id);
724
+ if (!existingMsg) {
725
+ console.warn(`Guard confirmed event received but message ${message_id} not found in local storage`);
726
+ break;
727
+ }
728
+ // 验证 Merkle 数据完整性
729
+ if (!merkle_data.prevRoot) {
730
+ console.error(`Guard message ${message_id} missing prevRoot in merkle_data`);
731
+ break;
732
+ }
733
+ if (!merkle_data.newRoot) {
734
+ console.error(`Guard message ${message_id} missing newRoot in merkle_data`);
735
+ break;
736
+ }
737
+ if (!merkle_data.serverTimestamp) {
738
+ console.error(`Guard message ${message_id} missing serverTimestamp in merkle_data`);
739
+ break;
740
+ }
741
+ if (!merkle_data.serverSignature) {
742
+ console.error(`Guard message ${message_id} missing serverSignature in merkle_data`);
743
+ break;
744
+ }
745
+ if (!merkle_data.serverPublicKey) {
746
+ console.error(`Guard message ${message_id} missing serverPublicKey in merkle_data`);
747
+ break;
748
+ }
749
+ // 验证消息的 Merkle Root 计算
750
+ const { verifySingleMerkleRoot } = await import("./crypto.js");
751
+ const rootValid = verifySingleMerkleRoot(merkle_data.prevRoot, merkle_data.newRoot, existingMsg.plaintextHash, merkle_data.serverTimestamp, merkle_data.leafIndex);
752
+ if (!rootValid.valid) {
753
+ console.error(`Guard message ${message_id} Merkle root verification failed: ${rootValid.error}`);
754
+ break;
755
+ }
756
+ // 验证服务器签名
757
+ const { verifyEd25519Signature } = await import("./crypto.js");
758
+ const signData = `${merkle_data.prevRoot}:${merkle_data.newRoot}:${merkle_data.serverTimestamp}:${merkle_data.serverPublicKey}`;
759
+ const signatureValid = verifyEd25519Signature(merkle_data.serverPublicKey, signData, merkle_data.serverSignature);
760
+ if (!signatureValid) {
761
+ console.error(`Guard message ${message_id} server signature verification failed`);
762
+ break;
763
+ }
764
+ /*console.log(
765
+ `Guard message ${message_id} verification passed, updating...`,
766
+ );*/
767
+ // 直接使用 updateMessageStatus 更新消息的 Merkle 数据
768
+ // 因为 message_id 已经包含 nonce,不需要再更新消息 ID
769
+ this.messageStorage.updateMessageStatus(message_id, MessageStatus.CONFIRMED, {
770
+ leafIndex: merkle_data.leafIndex,
771
+ newRoot: merkle_data.newRoot,
772
+ serverSignature: merkle_data.serverSignature,
773
+ serverTimestamp: merkle_data.serverTimestamp,
774
+ serverPublicKey: merkle_data.serverPublicKey,
775
+ });
776
+ const updated = true;
777
+ if (updated) {
778
+ /*console.log(
779
+ `Guard message ${message_id} updated with merkle data`,
780
+ );*/
781
+ // 更新会话状态
782
+ if (existingMsg.toAddress === null) {
783
+ throw new Error(`Guard message ${message_id} has null toAddress`);
784
+ }
785
+ const toAddr = existingMsg.toAddress;
786
+ if (toAddr === null) {
787
+ throw new Error(`Guard message ${message_id} has null toAddress`);
788
+ }
789
+ this.sessionStateStorage.updateSessionState(this.userAddress, toAddr, {
790
+ currentRoot: merkle_data.newRoot,
791
+ prevRoot: merkle_data.prevRoot,
792
+ lastLeafIndex: merkle_data.leafIndex,
793
+ lastSyncAt: Date.now(),
794
+ });
795
+ }
796
+ else {
797
+ console.warn(`Failed to update Guard message ${message_id}`);
798
+ }
799
+ break;
800
+ }
801
+ case "guard_rejected": {
802
+ // Guard 消息验证被拒绝
803
+ const { message_id, reason: _reason, timestamp: _timestamp, } = sseEvent.data;
804
+ /*console.log(
805
+ `SSE guard_rejected: message ${message_id} rejected: ${reason}`,
806
+ );*/
807
+ // 更新本地消息状态
808
+ // 首先尝试通过 message_id 查找消息
809
+ const existingMsg = this.messageStorage.getMessage(message_id);
810
+ if (existingMsg) {
811
+ existingMsg.status = MessageStatus.REJECTED;
812
+ this.messageStorage.saveMessage(existingMsg);
813
+ /*console.log(
814
+ `Guard message ${message_id} marked as rejected`,
815
+ );*/
816
+ }
817
+ else {
818
+ /*console.warn(
819
+ `Guard rejected event received but message ${message_id} not found in local storage`,
820
+ );*/
821
+ }
822
+ break;
823
+ }
824
+ }
825
+ }
826
+ catch (error) {
827
+ console.error("Failed to handle SSE event:", error);
828
+ }
829
+ };
830
+ // 连接打开
831
+ this.eventSource.onopen = () => {
832
+ //console.log("SSE connection opened");
833
+ };
834
+ // 连接错误
835
+ this.eventSource.onerror = (error) => {
836
+ console.error("SSE connection error:", error);
837
+ this.disconnectEventSource();
838
+ };
1147
839
  }
1148
- const timestamp = Date.now();
1149
- const nonce = this.generateNonce();
1150
- const dataJson = canonicalizeJson(data);
1151
- const signMessage = `${timestamp}:${nonce}:${dataJson}`;
1152
- const signResult = await Account.Instance().signData(
1153
- this.userAddress,
1154
- signMessage
1155
- );
1156
- const signatureBuffer = Buffer.from(
1157
- signResult.signature.slice(2),
1158
- "hex"
1159
- );
1160
- const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
1161
- const account = await Account.Instance().get(this.userAddress, false);
1162
- if (!account || !account.pubkey) {
1163
- throw new MessengerError(
1164
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1165
- "Account public key not found"
1166
- );
840
+ /**
841
+ * 检查 SSE 是否已连接
842
+ */
843
+ isEventSourceConnected() {
844
+ return this.eventSource !== null;
1167
845
  }
1168
- return {
1169
- userAddress: this.userAddress,
1170
- publicKey: account.pubkey,
1171
- signatureScheme: "ED25519",
1172
- signature: signatureBase64,
1173
- timestamp,
1174
- nonce,
1175
- data
1176
- };
1177
- }
1178
- /**
1179
- * 验证地址列表
1180
- */
1181
- _validateAddresses(addresses) {
1182
- const valid = [];
1183
- const invalid = [];
1184
- for (const addr of addresses) {
1185
- if (isValidWowAddress(addr)) {
1186
- valid.push(addr);
1187
- } else {
1188
- invalid.push(addr);
1189
- }
846
+ /**
847
+ * 断开 SSE 连接
848
+ */
849
+ disconnectEventSource() {
850
+ if (this.eventSource) {
851
+ this.eventSource.close();
852
+ this.eventSource = null;
853
+ //console.log("SSE connection closed");
854
+ }
1190
855
  }
1191
- return { valid, invalid };
1192
- }
1193
- /**
1194
- * 黑名单 - 添加地址
1195
- */
1196
- async addToBlacklist(addresses) {
1197
- if (!this.userAddress) {
1198
- throw new MessengerError(
1199
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1200
- "User address not set"
1201
- );
856
+ /**
857
+ * 销毁 Messenger 实例
858
+ * 清理所有资源(定时器、SSE 连接等)
859
+ */
860
+ destroy() {
861
+ this.stopPrekeyCheckTimer();
862
+ this.disconnectEventSource();
863
+ //console.log("Messenger instance destroyed");
1202
864
  }
1203
- const { valid, invalid } = this._validateAddresses(addresses);
1204
- if (invalid.length > 0) {
1205
- return {
1206
- success: false,
1207
- operation: "add",
1208
- modifiedCount: 0,
1209
- currentCount: 0,
1210
- maxCount: 0,
1211
- invalidAddresses: invalid,
1212
- message: `Invalid addresses: ${invalid.join(", ")}`
1213
- };
865
+ /**
866
+ * 断开连接(destroy 的别名)
867
+ * 用于清理资源
868
+ */
869
+ disconnect() {
870
+ this.destroy();
1214
871
  }
1215
- const data = { addresses: valid };
1216
- const signedRequest = await this._createSignedRequest(data);
1217
- return this.serverClient.addToBlacklist(
1218
- this.userAddress,
1219
- signedRequest
1220
- );
1221
- }
1222
- /**
1223
- * 黑名单 - 移除地址
1224
- */
1225
- async removeFromBlacklist(addresses) {
1226
- if (!this.userAddress) {
1227
- throw new MessengerError(
1228
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1229
- "User address not set"
1230
- );
872
+ /**
873
+ * 发送 ZIP 压缩文件
874
+ *
875
+ * 支持发送本地或网络 WTS/WIP 文件,经过 ZIP 压缩后发送给对方
876
+ * 支持 Guard 验证,如果提供 guardAddress 和 passportAddress,消息将进入 Guard 验证流程
877
+ *
878
+ * @param recipientAddress 接收方地址
879
+ * @param source 文件源(本地路径或网络 URL)
880
+ * @param options 可选参数
881
+ * @returns 发送结果
882
+ */
883
+ async sendZipFile(recipientAddress, source, options) {
884
+ if (!this.userAddress) {
885
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
886
+ }
887
+ // 1. 加载文件内容
888
+ const fileData = await this.loadFileData(source);
889
+ // 2. 创建 ZIP 压缩
890
+ const JSZip = (await import("jszip")).default;
891
+ const zip = new JSZip();
892
+ const fileName = options?.fileName || path.basename(source) || "file.zip";
893
+ const contentType = options?.contentType || this.detectContentType(fileName);
894
+ zip.file(fileName, fileData);
895
+ const zipBlob = await zip.generateAsync({ type: "uint8array" });
896
+ // 3. 本地文件大小限制检查(默认 5MB)
897
+ if (zipBlob.length > WTS_FILE_BYTES_LIMIT) {
898
+ throw new MessengerError(MessengerErrorCode.INVALID_INPUT, `ZIP file size (${zipBlob.length} bytes) exceeds local maximum allowed size (${WTS_FILE_BYTES_LIMIT} bytes)`);
899
+ }
900
+ // 4. 计算 ZIP 文件哈希(用于 zipMetadata)
901
+ const zipFileHash = "0x" + createHash("sha256").update(zipBlob).digest("hex");
902
+ // 4. 将 ZIP 数据转为 base64
903
+ const zipBase64 = Buffer.from(zipBlob).toString("base64");
904
+ // 5. 构造 ZIP 元数据
905
+ const zipMetadata = {
906
+ fileName: `${fileName}.zip`,
907
+ fileSize: zipBlob.length,
908
+ fileHash: zipFileHash,
909
+ contentType: contentType,
910
+ };
911
+ // 【新增】获取最后收到的消息序号
912
+ const lastReceivedLeafIndex = this.messageStorage.getLastReceivedLeafIndex(this.userAddress, recipientAddress);
913
+ // 6. 加密 ZIP 数据(作为普通消息发送,明文就是 ZIP 的 base64)
914
+ const createdAt = Date.now();
915
+ const encrypted = await this.session.encryptMessage(this.userAddress, recipientAddress, zipBase64);
916
+ const ciphertext = Buffer.from(new Uint8Array(encrypted.body)).toString("base64");
917
+ // 7. 计算 plaintextHash(使用与服务器一致的格式)
918
+ // 【更新】包含 lastReceivedLeafIndex 在哈希计算中
919
+ const guardAddr = options?.guardAddress || "";
920
+ const passportAddr = options?.passportAddress || "";
921
+ const plaintextHash = hashPlaintext(zipBase64, createdAt, guardAddr, passportAddr, lastReceivedLeafIndex);
922
+ // 8. 发送到服务器(带 ZIP 元数据)
923
+ const timestamp = Date.now();
924
+ const nonce = this.generateNonce();
925
+ const account = await Account.Instance().get(this.userAddress, false);
926
+ if (!account) {
927
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User account not found");
928
+ }
929
+ const publicKey = account.pubkey;
930
+ // 统一发送模式(合并 send 和 send_force)
931
+ // 统一签名格式: send_message:{sender}:{recipient}:{guard_address}:{passport_address}:{plaintext_hash}:{last_received_leaf_index}:{public_key}:{timestamp}:{nonce}:{force}
932
+ const lastReceivedStr = lastReceivedLeafIndex >= 0 ? lastReceivedLeafIndex.toString() : "";
933
+ const forceStr = options?.force ? "true" : "false";
934
+ const signMessage = `send_message:${this.userAddress}:${recipientAddress}:${guardAddr}:${passportAddr}:${plaintextHash}:${lastReceivedStr}:${publicKey}:${timestamp}:${nonce}:${forceStr}`;
935
+ const signResult = await Account.Instance().signData(this.userAddress, signMessage);
936
+ const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
937
+ const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
938
+ // 使用统一的 sendMessage API
939
+ const response = await this.serverClient.sendMessage({
940
+ sender: signResult.publicKey,
941
+ recipient: recipientAddress,
942
+ ciphertext,
943
+ plaintextHash,
944
+ clientTimestamp: createdAt,
945
+ msgType: encrypted.type, // 使用底层 Signal Protocol 消息类型(1 或 3)
946
+ zipMetadata,
947
+ guardAddress: options?.guardAddress,
948
+ passportAddress: options?.passportAddress,
949
+ force: options?.force,
950
+ // 【修复】只有当 lastReceivedLeafIndex >= 0 时才发送,否则发送 undefined
951
+ lastReceivedLeafIndex: lastReceivedLeafIndex >= 0
952
+ ? lastReceivedLeafIndex
953
+ : undefined,
954
+ signatureScheme: "ED25519",
955
+ signature: signatureBase64,
956
+ timestamp,
957
+ nonce,
958
+ });
959
+ // 9. 保存到本地存储
960
+ // 使用底层 Signal Protocol 消息类型(1 或 3),通过 zipMetadata 标识这是 ZIP 文件
961
+ const message = {
962
+ messageId: response.messageId,
963
+ fromAddress: this.userAddress,
964
+ toAddress: recipientAddress,
965
+ plaintextHash,
966
+ plaintext: zipBase64, // 保存 ZIP 数据的 base64 编码,方便本地查看
967
+ guardAddress: options?.guardAddress,
968
+ passportAddress: options?.passportAddress,
969
+ lastReceivedLeafIndex, // 【新增】保存消息确认字段
970
+ direction: MessageDirection.SENT,
971
+ status: response.status === "confirmed"
972
+ ? MessageStatus.CONFIRMED
973
+ : MessageStatus.PENDING,
974
+ msgType: encrypted.type, // 使用底层 Signal Protocol 消息类型(1 或 3)
975
+ zipMetadata,
976
+ createdAt,
977
+ };
978
+ if (response.merkleData) {
979
+ message.leafIndex = response.merkleData.leafIndex;
980
+ message.prevRoot = response.merkleData.prevRoot;
981
+ message.newRoot = response.merkleData.newRoot;
982
+ message.serverSignature = response.merkleData.serverSignature;
983
+ message.serverTimestamp = response.merkleData.serverTimestamp;
984
+ message.serverPublicKey = response.merkleData.serverPublicKey;
985
+ // 更新会话状态
986
+ this.sessionStateStorage.updateSessionState(this.userAddress, recipientAddress, {
987
+ currentRoot: response.merkleData.newRoot,
988
+ prevRoot: response.merkleData.prevRoot,
989
+ lastLeafIndex: response.merkleData.leafIndex,
990
+ lastSyncAt: Date.now(),
991
+ });
992
+ }
993
+ this.messageStorage.saveMessage(message);
994
+ // 方案B:处理服务器返回的其他已验证消息的 Merkle 数据
995
+ // 这些消息可能之前因为发送方离线而没有收到 Merkle 数据
996
+ if (response.pendingMerkleData) {
997
+ for (const [msgId, merkleData] of Object.entries(response.pendingMerkleData)) {
998
+ // 检查本地是否已有该消息
999
+ const existingMsg = this.messageStorage.getMessage(msgId);
1000
+ if (existingMsg &&
1001
+ existingMsg.status === MessageStatus.PENDING) {
1002
+ // 更新消息的 Merkle 数据
1003
+ this.messageStorage.updateMessageStatus(msgId, MessageStatus.CONFIRMED, {
1004
+ leafIndex: merkleData.leafIndex,
1005
+ newRoot: merkleData.newRoot,
1006
+ serverSignature: merkleData.serverSignature,
1007
+ serverTimestamp: merkleData.serverTimestamp,
1008
+ serverPublicKey: merkleData.serverPublicKey,
1009
+ });
1010
+ /*console.log(
1011
+ `[ForceSend] Updated pending message ${msgId} with merkle data from pendingMerkleData`,
1012
+ );*/
1013
+ }
1014
+ }
1015
+ }
1016
+ return {
1017
+ messageId: response.messageId,
1018
+ status: message.status,
1019
+ merkleData: response.merkleData,
1020
+ guardList: response.guard_list,
1021
+ };
1231
1022
  }
1232
- const { valid, invalid } = this._validateAddresses(addresses);
1233
- if (invalid.length > 0) {
1234
- return {
1235
- success: false,
1236
- operation: "remove",
1237
- modifiedCount: 0,
1238
- currentCount: 0,
1239
- maxCount: 0,
1240
- invalidAddresses: invalid,
1241
- message: `Invalid addresses: ${invalid.join(", ")}`
1242
- };
1023
+ /**
1024
+ * 加载文件数据(支持本地路径和网络 URL)
1025
+ */
1026
+ async loadFileData(source) {
1027
+ // 判断是否为网络 URL
1028
+ if (source.startsWith("http://") || source.startsWith("https://")) {
1029
+ // 从网络加载
1030
+ const response = await fetch(source);
1031
+ if (!response.ok) {
1032
+ throw new MessengerError(MessengerErrorCode.NETWORK_ERROR, `Failed to fetch file from ${source}: ${response.statusText}`);
1033
+ }
1034
+ const arrayBuffer = await response.arrayBuffer();
1035
+ return new Uint8Array(arrayBuffer);
1036
+ }
1037
+ // 从本地文件加载
1038
+ const resolvedPath = path.resolve(source);
1039
+ if (!fs.existsSync(resolvedPath)) {
1040
+ throw new MessengerError(MessengerErrorCode.FILE_NOT_FOUND, `File not found: ${resolvedPath}`);
1041
+ }
1042
+ const buffer = fs.readFileSync(resolvedPath);
1043
+ return new Uint8Array(buffer);
1243
1044
  }
1244
- const data = { addresses: valid };
1245
- const signedRequest = await this._createSignedRequest(data);
1246
- return this.serverClient.removeFromBlacklist(
1247
- this.userAddress,
1248
- signedRequest
1249
- );
1250
- }
1251
- /**
1252
- * 黑名单 - 清空
1253
- */
1254
- async clearBlacklist() {
1255
- if (!this.userAddress) {
1256
- throw new MessengerError(
1257
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1258
- "User address not set"
1259
- );
1045
+ /**
1046
+ * 检测内容类型
1047
+ */
1048
+ detectContentType(fileName) {
1049
+ const ext = path.extname(fileName).toLowerCase();
1050
+ switch (ext) {
1051
+ case ".wts":
1052
+ return "wts";
1053
+ case ".wip":
1054
+ return "wip";
1055
+ default:
1056
+ return "zip";
1057
+ }
1260
1058
  }
1261
- const data = {};
1262
- const signedRequest = await this._createSignedRequest(data);
1263
- return this.serverClient.clearBlacklist(
1264
- this.userAddress,
1265
- signedRequest
1266
- );
1267
- }
1268
- /**
1269
- * 黑名单 - 获取列表
1270
- */
1271
- async getBlacklist() {
1272
- if (!this.userAddress) {
1273
- throw new MessengerError(
1274
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1275
- "User address not set"
1276
- );
1059
+ /**
1060
+ * 生成签名的请求
1061
+ */
1062
+ async _createSignedRequest(data) {
1063
+ if (!this.userAddress) {
1064
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1065
+ }
1066
+ const timestamp = Date.now();
1067
+ const nonce = this.generateNonce();
1068
+ const dataJson = canonicalizeJson(data);
1069
+ const signMessage = `${timestamp}:${nonce}:${dataJson}`;
1070
+ const signResult = await Account.Instance().signData(this.userAddress, signMessage);
1071
+ const signatureBuffer = Buffer.from(signResult.signature.slice(2), "hex");
1072
+ const signatureBase64 = bytesToBase64(new Uint8Array(signatureBuffer));
1073
+ // 获取公钥(带标志位)用于服务器验证
1074
+ const account = await Account.Instance().get(this.userAddress, false);
1075
+ if (!account || !account.pubkey) {
1076
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "Account public key not found");
1077
+ }
1078
+ return {
1079
+ userAddress: this.userAddress,
1080
+ publicKey: account.pubkey,
1081
+ signatureScheme: "ED25519",
1082
+ signature: signatureBase64,
1083
+ timestamp,
1084
+ nonce,
1085
+ data,
1086
+ };
1277
1087
  }
1278
- const signedRequest = await this._createSignedRequest({});
1279
- return this.serverClient.getBlacklist(this.userAddress, signedRequest);
1280
- }
1281
- /**
1282
- * 黑名单 - 检查存在
1283
- */
1284
- async existInBlacklist(addresses) {
1285
- if (!this.userAddress) {
1286
- throw new MessengerError(
1287
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1288
- "User address not set"
1289
- );
1088
+ /**
1089
+ * 验证地址列表
1090
+ */
1091
+ _validateAddresses(addresses) {
1092
+ const valid = [];
1093
+ const invalid = [];
1094
+ for (const addr of addresses) {
1095
+ if (isValidWowAddress(addr)) {
1096
+ valid.push(addr);
1097
+ }
1098
+ else {
1099
+ invalid.push(addr);
1100
+ }
1101
+ }
1102
+ return { valid, invalid };
1290
1103
  }
1291
- const { valid, invalid } = this._validateAddresses(addresses);
1292
- if (invalid.length > 0) {
1293
- return {
1294
- success: false,
1295
- operation: "exist",
1296
- modifiedCount: 0,
1297
- currentCount: 0,
1298
- maxCount: 0,
1299
- invalidAddresses: invalid,
1300
- message: `Invalid addresses: ${invalid.join(", ")}`
1301
- };
1104
+ /**
1105
+ * 黑名单 - 添加地址
1106
+ */
1107
+ async addToBlacklist(addresses) {
1108
+ if (!this.userAddress) {
1109
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1110
+ }
1111
+ const { valid, invalid } = this._validateAddresses(addresses);
1112
+ if (invalid.length > 0) {
1113
+ return {
1114
+ success: false,
1115
+ operation: "add",
1116
+ modifiedCount: 0,
1117
+ currentCount: 0,
1118
+ maxCount: 0,
1119
+ invalidAddresses: invalid,
1120
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1121
+ };
1122
+ }
1123
+ const data = { addresses: valid };
1124
+ const signedRequest = await this._createSignedRequest(data);
1125
+ return this.serverClient.addToBlacklist(this.userAddress, signedRequest);
1302
1126
  }
1303
- const data = { addresses: valid };
1304
- const signedRequest = await this._createSignedRequest(data);
1305
- return this.serverClient.existInBlacklist(
1306
- this.userAddress,
1307
- signedRequest
1308
- );
1309
- }
1310
- /**
1311
- * 好友列表 - 添加地址
1312
- */
1313
- async addToFriendsList(addresses) {
1314
- if (!this.userAddress) {
1315
- throw new MessengerError(
1316
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1317
- "User address not set"
1318
- );
1127
+ /**
1128
+ * 黑名单 - 移除地址
1129
+ */
1130
+ async removeFromBlacklist(addresses) {
1131
+ if (!this.userAddress) {
1132
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1133
+ }
1134
+ const { valid, invalid } = this._validateAddresses(addresses);
1135
+ if (invalid.length > 0) {
1136
+ return {
1137
+ success: false,
1138
+ operation: "remove",
1139
+ modifiedCount: 0,
1140
+ currentCount: 0,
1141
+ maxCount: 0,
1142
+ invalidAddresses: invalid,
1143
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1144
+ };
1145
+ }
1146
+ const data = { addresses: valid };
1147
+ const signedRequest = await this._createSignedRequest(data);
1148
+ return this.serverClient.removeFromBlacklist(this.userAddress, signedRequest);
1319
1149
  }
1320
- const { valid, invalid } = this._validateAddresses(addresses);
1321
- if (invalid.length > 0) {
1322
- return {
1323
- success: false,
1324
- operation: "add",
1325
- modifiedCount: 0,
1326
- currentCount: 0,
1327
- maxCount: 0,
1328
- invalidAddresses: invalid,
1329
- message: `Invalid addresses: ${invalid.join(", ")}`
1330
- };
1150
+ /**
1151
+ * 黑名单 - 清空
1152
+ */
1153
+ async clearBlacklist() {
1154
+ if (!this.userAddress) {
1155
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1156
+ }
1157
+ const data = {};
1158
+ const signedRequest = await this._createSignedRequest(data);
1159
+ return this.serverClient.clearBlacklist(this.userAddress, signedRequest);
1331
1160
  }
1332
- const data = { addresses: valid };
1333
- const signedRequest = await this._createSignedRequest(data);
1334
- return this.serverClient.addToFriendsList(
1335
- this.userAddress,
1336
- signedRequest
1337
- );
1338
- }
1339
- /**
1340
- * 好友列表 - 移除地址
1341
- */
1342
- async removeFromFriendsList(addresses) {
1343
- if (!this.userAddress) {
1344
- throw new MessengerError(
1345
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1346
- "User address not set"
1347
- );
1161
+ /**
1162
+ * 黑名单 - 获取列表
1163
+ */
1164
+ async getBlacklist() {
1165
+ if (!this.userAddress) {
1166
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1167
+ }
1168
+ const signedRequest = await this._createSignedRequest({});
1169
+ return this.serverClient.getBlacklist(this.userAddress, signedRequest);
1348
1170
  }
1349
- const { valid, invalid } = this._validateAddresses(addresses);
1350
- if (invalid.length > 0) {
1351
- return {
1352
- success: false,
1353
- operation: "remove",
1354
- modifiedCount: 0,
1355
- currentCount: 0,
1356
- maxCount: 0,
1357
- invalidAddresses: invalid,
1358
- message: `Invalid addresses: ${invalid.join(", ")}`
1359
- };
1171
+ /**
1172
+ * 黑名单 - 检查存在
1173
+ */
1174
+ async existInBlacklist(addresses) {
1175
+ if (!this.userAddress) {
1176
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1177
+ }
1178
+ const { valid, invalid } = this._validateAddresses(addresses);
1179
+ if (invalid.length > 0) {
1180
+ return {
1181
+ success: false,
1182
+ operation: "exist",
1183
+ modifiedCount: 0,
1184
+ currentCount: 0,
1185
+ maxCount: 0,
1186
+ invalidAddresses: invalid,
1187
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1188
+ };
1189
+ }
1190
+ const data = { addresses: valid };
1191
+ const signedRequest = await this._createSignedRequest(data);
1192
+ return this.serverClient.existInBlacklist(this.userAddress, signedRequest);
1360
1193
  }
1361
- const data = { addresses: valid };
1362
- const signedRequest = await this._createSignedRequest(data);
1363
- return this.serverClient.removeFromFriendsList(
1364
- this.userAddress,
1365
- signedRequest
1366
- );
1367
- }
1368
- /**
1369
- * 好友列表 - 清空
1370
- */
1371
- async clearFriendsList() {
1372
- if (!this.userAddress) {
1373
- throw new MessengerError(
1374
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1375
- "User address not set"
1376
- );
1194
+ /**
1195
+ * 好友列表 - 添加地址
1196
+ */
1197
+ async addToFriendsList(addresses) {
1198
+ if (!this.userAddress) {
1199
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1200
+ }
1201
+ const { valid, invalid } = this._validateAddresses(addresses);
1202
+ if (invalid.length > 0) {
1203
+ return {
1204
+ success: false,
1205
+ operation: "add",
1206
+ modifiedCount: 0,
1207
+ currentCount: 0,
1208
+ maxCount: 0,
1209
+ invalidAddresses: invalid,
1210
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1211
+ };
1212
+ }
1213
+ const data = { addresses: valid };
1214
+ const signedRequest = await this._createSignedRequest(data);
1215
+ return this.serverClient.addToFriendsList(this.userAddress, signedRequest);
1377
1216
  }
1378
- const data = {};
1379
- const signedRequest = await this._createSignedRequest(data);
1380
- return this.serverClient.clearFriendsList(
1381
- this.userAddress,
1382
- signedRequest
1383
- );
1384
- }
1385
- /**
1386
- * 好友列表 - 获取列表
1387
- */
1388
- async getFriendsList() {
1389
- if (!this.userAddress) {
1390
- throw new MessengerError(
1391
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1392
- "User address not set"
1393
- );
1217
+ /**
1218
+ * 好友列表 - 移除地址
1219
+ */
1220
+ async removeFromFriendsList(addresses) {
1221
+ if (!this.userAddress) {
1222
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1223
+ }
1224
+ const { valid, invalid } = this._validateAddresses(addresses);
1225
+ if (invalid.length > 0) {
1226
+ return {
1227
+ success: false,
1228
+ operation: "remove",
1229
+ modifiedCount: 0,
1230
+ currentCount: 0,
1231
+ maxCount: 0,
1232
+ invalidAddresses: invalid,
1233
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1234
+ };
1235
+ }
1236
+ const data = { addresses: valid };
1237
+ const signedRequest = await this._createSignedRequest(data);
1238
+ return this.serverClient.removeFromFriendsList(this.userAddress, signedRequest);
1394
1239
  }
1395
- const signedRequest = await this._createSignedRequest({});
1396
- return this.serverClient.getFriendsList(
1397
- this.userAddress,
1398
- signedRequest
1399
- );
1400
- }
1401
- /**
1402
- * 好友列表 - 检查存在
1403
- */
1404
- async existInFriendsList(addresses) {
1405
- if (!this.userAddress) {
1406
- throw new MessengerError(
1407
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1408
- "User address not set"
1409
- );
1240
+ /**
1241
+ * 好友列表 - 清空
1242
+ */
1243
+ async clearFriendsList() {
1244
+ if (!this.userAddress) {
1245
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1246
+ }
1247
+ const data = {};
1248
+ const signedRequest = await this._createSignedRequest(data);
1249
+ return this.serverClient.clearFriendsList(this.userAddress, signedRequest);
1410
1250
  }
1411
- const { valid, invalid } = this._validateAddresses(addresses);
1412
- if (invalid.length > 0) {
1413
- return {
1414
- success: false,
1415
- operation: "exist",
1416
- modifiedCount: 0,
1417
- currentCount: 0,
1418
- maxCount: 0,
1419
- invalidAddresses: invalid,
1420
- message: `Invalid addresses: ${invalid.join(", ")}`
1421
- };
1251
+ /**
1252
+ * 好友列表 - 获取列表
1253
+ */
1254
+ async getFriendsList() {
1255
+ if (!this.userAddress) {
1256
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1257
+ }
1258
+ const signedRequest = await this._createSignedRequest({});
1259
+ return this.serverClient.getFriendsList(this.userAddress, signedRequest);
1422
1260
  }
1423
- const data = { addresses: valid };
1424
- const signedRequest = await this._createSignedRequest(data);
1425
- return this.serverClient.existInFriendsList(
1426
- this.userAddress,
1427
- signedRequest
1428
- );
1429
- }
1430
- /**
1431
- * Guard 列表 - 添加
1432
- */
1433
- async addToGuardList(guards) {
1434
- if (!this.userAddress) {
1435
- throw new MessengerError(
1436
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1437
- "User address not set"
1438
- );
1261
+ /**
1262
+ * 好友列表 - 检查存在
1263
+ */
1264
+ async existInFriendsList(addresses) {
1265
+ if (!this.userAddress) {
1266
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1267
+ }
1268
+ const { valid, invalid } = this._validateAddresses(addresses);
1269
+ if (invalid.length > 0) {
1270
+ return {
1271
+ success: false,
1272
+ operation: "exist",
1273
+ modifiedCount: 0,
1274
+ currentCount: 0,
1275
+ maxCount: 0,
1276
+ invalidAddresses: invalid,
1277
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1278
+ };
1279
+ }
1280
+ const data = { addresses: valid };
1281
+ const signedRequest = await this._createSignedRequest(data);
1282
+ return this.serverClient.existInFriendsList(this.userAddress, signedRequest);
1439
1283
  }
1440
- const data = { guards };
1441
- const signedRequest = await this._createSignedRequest(data);
1442
- return this.serverClient.addToGuardList(
1443
- this.userAddress,
1444
- signedRequest
1445
- );
1446
- }
1447
- /**
1448
- * Guard 列表 - 移除
1449
- */
1450
- async removeFromGuardList(addresses) {
1451
- if (!this.userAddress) {
1452
- throw new MessengerError(
1453
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1454
- "User address not set"
1455
- );
1284
+ /**
1285
+ * Guard 列表 - 添加
1286
+ */
1287
+ async addToGuardList(guards) {
1288
+ if (!this.userAddress) {
1289
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1290
+ }
1291
+ const data = { guards };
1292
+ const signedRequest = await this._createSignedRequest(data);
1293
+ return this.serverClient.addToGuardList(this.userAddress, signedRequest);
1456
1294
  }
1457
- const { valid, invalid } = this._validateAddresses(addresses);
1458
- if (invalid.length > 0) {
1459
- return {
1460
- success: false,
1461
- operation: "remove",
1462
- modifiedCount: 0,
1463
- currentCount: 0,
1464
- maxCount: 0,
1465
- invalidAddresses: invalid,
1466
- message: `Invalid addresses: ${invalid.join(", ")}`
1467
- };
1295
+ /**
1296
+ * Guard 列表 - 移除
1297
+ */
1298
+ async removeFromGuardList(addresses) {
1299
+ if (!this.userAddress) {
1300
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1301
+ }
1302
+ const { valid, invalid } = this._validateAddresses(addresses);
1303
+ if (invalid.length > 0) {
1304
+ return {
1305
+ success: false,
1306
+ operation: "remove",
1307
+ modifiedCount: 0,
1308
+ currentCount: 0,
1309
+ maxCount: 0,
1310
+ invalidAddresses: invalid,
1311
+ message: `Invalid addresses: ${invalid.join(", ")}`,
1312
+ };
1313
+ }
1314
+ const data = { addresses: valid };
1315
+ const signedRequest = await this._createSignedRequest(data);
1316
+ return this.serverClient.removeFromGuardList(this.userAddress, signedRequest);
1468
1317
  }
1469
- const data = { addresses: valid };
1470
- const signedRequest = await this._createSignedRequest(data);
1471
- return this.serverClient.removeFromGuardList(
1472
- this.userAddress,
1473
- signedRequest
1474
- );
1475
- }
1476
- /**
1477
- * Guard 列表 - 获取列表
1478
- */
1479
- async getGuardList() {
1480
- if (!this.userAddress) {
1481
- throw new MessengerError(
1482
- MessengerErrorCode.IDENTITY_NOT_FOUND,
1483
- "User address not set"
1484
- );
1318
+ /**
1319
+ * Guard 列表 - 获取列表
1320
+ */
1321
+ async getGuardList() {
1322
+ if (!this.userAddress) {
1323
+ throw new MessengerError(MessengerErrorCode.IDENTITY_NOT_FOUND, "User address not set");
1324
+ }
1325
+ const signedRequest = await this._createSignedRequest({});
1326
+ return this.serverClient.getGuardList(this.userAddress, signedRequest);
1485
1327
  }
1486
- const signedRequest = await this._createSignedRequest({});
1487
- return this.serverClient.getGuardList(this.userAddress, signedRequest);
1488
- }
1489
1328
  }
1490
- export {
1491
- Messenger
1492
- };
1329
+ //# sourceMappingURL=messenger.js.map