wowok 2.1.9 → 2.1.12

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 (887) hide show
  1. package/NOTICE +46 -0
  2. package/dist/cjs/bcs/bcs.d.ts +199 -199
  3. package/dist/cjs/bcs/bcs.js +273 -318
  4. package/dist/cjs/bcs/bcs.js.map +1 -0
  5. package/dist/cjs/bcs/effects.d.ts +109 -109
  6. package/dist/cjs/bcs/effects.js +205 -230
  7. package/dist/cjs/bcs/effects.js.map +1 -0
  8. package/dist/cjs/bcs/index.d.ts +1 -2584
  9. package/dist/cjs/bcs/index.js +61 -76
  10. package/dist/cjs/bcs/index.js.map +1 -0
  11. package/dist/cjs/bcs/pure.js +38 -58
  12. package/dist/cjs/bcs/pure.js.map +1 -0
  13. package/dist/cjs/bcs/type-tag-serializer.js +102 -114
  14. package/dist/cjs/bcs/type-tag-serializer.js.map +1 -0
  15. package/dist/cjs/bcs/types.js +6 -23
  16. package/dist/cjs/bcs/types.js.map +1 -0
  17. package/dist/cjs/client/index.js +17 -33
  18. package/dist/cjs/client/index.js.map +1 -0
  19. package/dist/cjs/client/network.js +25 -40
  20. package/dist/cjs/client/network.js.map +1 -0
  21. package/dist/cjs/cryptography/index.js +29 -45
  22. package/dist/cjs/cryptography/index.js.map +1 -0
  23. package/dist/cjs/cryptography/intent.d.ts +1 -1
  24. package/dist/cjs/cryptography/intent.js +20 -31
  25. package/dist/cjs/cryptography/intent.js.map +1 -0
  26. package/dist/cjs/cryptography/keypair.js +102 -116
  27. package/dist/cjs/cryptography/keypair.js.map +1 -0
  28. package/dist/cjs/cryptography/mnemonics.js +43 -41
  29. package/dist/cjs/cryptography/mnemonics.js.map +1 -0
  30. package/dist/cjs/cryptography/publickey.js +112 -134
  31. package/dist/cjs/cryptography/publickey.js.map +1 -0
  32. package/dist/cjs/cryptography/signature-scheme.js +24 -43
  33. package/dist/cjs/cryptography/signature-scheme.js.map +1 -0
  34. package/dist/cjs/cryptography/signature.d.ts +2 -24
  35. package/dist/cjs/cryptography/signature.js +50 -67
  36. package/dist/cjs/cryptography/signature.js.map +1 -0
  37. package/dist/cjs/experimental/cache.js +65 -0
  38. package/dist/cjs/experimental/cache.js.map +1 -0
  39. package/dist/cjs/experimental/client.js +27 -0
  40. package/dist/cjs/experimental/client.js.map +1 -0
  41. package/dist/cjs/experimental/core.js +89 -0
  42. package/dist/cjs/experimental/core.js.map +1 -0
  43. package/dist/cjs/experimental/errors.js +32 -0
  44. package/dist/cjs/experimental/errors.js.map +1 -0
  45. package/dist/cjs/experimental/index.js +15 -0
  46. package/dist/cjs/experimental/index.js.map +1 -0
  47. package/dist/cjs/experimental/persistent-storage.js +343 -0
  48. package/dist/cjs/experimental/persistent-storage.js.map +1 -0
  49. package/dist/cjs/experimental/persistent-storage.test.js +200 -0
  50. package/dist/cjs/experimental/persistent-storage.test.js.map +1 -0
  51. package/dist/cjs/experimental/transports/utils.js +104 -0
  52. package/dist/cjs/experimental/transports/utils.js.map +1 -0
  53. package/dist/cjs/experimental/types.js +6 -0
  54. package/dist/cjs/experimental/types.js.map +1 -0
  55. package/dist/cjs/faucet/faucet.js +106 -124
  56. package/dist/cjs/faucet/faucet.js.map +1 -0
  57. package/dist/cjs/faucet/index.js +12 -28
  58. package/dist/cjs/faucet/index.js.map +1 -0
  59. package/dist/cjs/grpc/client.js +47 -62
  60. package/dist/cjs/grpc/client.js.map +1 -0
  61. package/dist/cjs/grpc/core.js +580 -617
  62. package/dist/cjs/grpc/core.js.map +1 -0
  63. package/dist/cjs/grpc/index.js +9 -25
  64. package/dist/cjs/grpc/index.js.map +1 -0
  65. package/dist/cjs/grpc/proto/google/protobuf/any.js +168 -135
  66. package/dist/cjs/grpc/proto/google/protobuf/any.js.map +1 -0
  67. package/dist/cjs/grpc/proto/google/protobuf/duration.js +105 -90
  68. package/dist/cjs/grpc/proto/google/protobuf/duration.js.map +1 -0
  69. package/dist/cjs/grpc/proto/google/protobuf/empty.js +50 -28
  70. package/dist/cjs/grpc/proto/google/protobuf/empty.js.map +1 -0
  71. package/dist/cjs/grpc/proto/google/protobuf/field_mask.js +96 -75
  72. package/dist/cjs/grpc/proto/google/protobuf/field_mask.js.map +1 -0
  73. package/dist/cjs/grpc/proto/google/protobuf/struct.js +266 -215
  74. package/dist/cjs/grpc/proto/google/protobuf/struct.js.map +1 -0
  75. package/dist/cjs/grpc/proto/google/protobuf/timestamp.js +150 -131
  76. package/dist/cjs/grpc/proto/google/protobuf/timestamp.js.map +1 -0
  77. package/dist/cjs/grpc/proto/google/rpc/error_details.js +331 -302
  78. package/dist/cjs/grpc/proto/google/rpc/error_details.js.map +1 -0
  79. package/dist/cjs/grpc/proto/google/rpc/status.js +50 -50
  80. package/dist/cjs/grpc/proto/google/rpc/status.js.map +1 -0
  81. package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js +84 -68
  82. package/dist/cjs/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
  83. package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js +45 -50
  84. package/dist/cjs/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
  85. package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js +38 -43
  86. package/dist/cjs/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
  87. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js +70 -75
  88. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
  89. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js +79 -81
  90. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
  91. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js +183 -166
  92. package/dist/cjs/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
  93. package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js +369 -296
  94. package/dist/cjs/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
  95. package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js +80 -85
  96. package/dist/cjs/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
  97. package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js +31 -28
  98. package/dist/cjs/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
  99. package/dist/cjs/grpc/proto/sui/rpc/v2/event.js +81 -83
  100. package/dist/cjs/grpc/proto/sui/rpc/v2/event.js.map +1 -0
  101. package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js +80 -85
  102. package/dist/cjs/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
  103. package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js +876 -506
  104. package/dist/cjs/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
  105. package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js +56 -61
  106. package/dist/cjs/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
  107. package/dist/cjs/grpc/proto/sui/rpc/v2/input.js +103 -83
  108. package/dist/cjs/grpc/proto/sui/rpc/v2/input.js.map +1 -0
  109. package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js +76 -78
  110. package/dist/cjs/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
  111. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js +69 -119
  112. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
  113. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js +392 -350
  114. package/dist/cjs/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
  115. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js +599 -473
  116. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
  117. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js +46 -78
  118. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
  119. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js +242 -224
  120. package/dist/cjs/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
  121. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js +32 -52
  122. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
  123. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js +139 -134
  124. package/dist/cjs/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
  125. package/dist/cjs/grpc/proto/sui/rpc/v2/object.js +109 -111
  126. package/dist/cjs/grpc/proto/sui/rpc/v2/object.js.map +1 -0
  127. package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js +46 -51
  128. package/dist/cjs/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
  129. package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js +76 -61
  130. package/dist/cjs/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
  131. package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js +46 -59
  132. package/dist/cjs/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
  133. package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js +568 -522
  134. package/dist/cjs/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
  135. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js +54 -32
  136. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
  137. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +27 -47
  138. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
  139. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js +83 -86
  140. package/dist/cjs/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
  141. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js +53 -85
  142. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
  143. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js +645 -529
  144. package/dist/cjs/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
  145. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js +37 -51
  146. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
  147. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js +58 -61
  148. package/dist/cjs/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
  149. package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js +749 -730
  150. package/dist/cjs/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
  151. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js +1218 -975
  152. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
  153. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +32 -46
  154. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
  155. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js +186 -167
  156. package/dist/cjs/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
  157. package/dist/cjs/index.js +96 -91
  158. package/dist/cjs/index.js.map +1 -0
  159. package/dist/cjs/jsonRpc/client.js +654 -743
  160. package/dist/cjs/jsonRpc/client.js.map +1 -0
  161. package/dist/cjs/jsonRpc/core.d.ts +7 -7
  162. package/dist/cjs/jsonRpc/core.js +562 -606
  163. package/dist/cjs/jsonRpc/core.js.map +1 -0
  164. package/dist/cjs/jsonRpc/errors.js +38 -56
  165. package/dist/cjs/jsonRpc/errors.js.map +1 -0
  166. package/dist/cjs/jsonRpc/http-transport.js +70 -114
  167. package/dist/cjs/jsonRpc/http-transport.js.map +1 -0
  168. package/dist/cjs/jsonRpc/index.js +14 -30
  169. package/dist/cjs/jsonRpc/index.js.map +1 -0
  170. package/dist/cjs/jsonRpc/json-rpc-resolver.js +286 -290
  171. package/dist/cjs/jsonRpc/json-rpc-resolver.js.map +1 -0
  172. package/dist/cjs/jsonRpc/rpc-websocket-client.js +150 -207
  173. package/dist/cjs/jsonRpc/rpc-websocket-client.js.map +1 -0
  174. package/dist/cjs/jsonRpc/types/chain.js +4 -15
  175. package/dist/cjs/jsonRpc/types/chain.js.map +1 -0
  176. package/dist/cjs/jsonRpc/types/changes.js +4 -15
  177. package/dist/cjs/jsonRpc/types/changes.js.map +1 -0
  178. package/dist/cjs/jsonRpc/types/coins.js +4 -15
  179. package/dist/cjs/jsonRpc/types/coins.js.map +1 -0
  180. package/dist/cjs/jsonRpc/types/common.js +4 -15
  181. package/dist/cjs/jsonRpc/types/common.js.map +1 -0
  182. package/dist/cjs/jsonRpc/types/generated.d.ts +1 -1
  183. package/dist/cjs/jsonRpc/types/generated.js +4 -15
  184. package/dist/cjs/jsonRpc/types/generated.js.map +1 -0
  185. package/dist/cjs/jsonRpc/types/index.js +4 -15
  186. package/dist/cjs/jsonRpc/types/index.js.map +1 -0
  187. package/dist/cjs/jsonRpc/types/params.js +4 -15
  188. package/dist/cjs/jsonRpc/types/params.js.map +1 -0
  189. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +54 -69
  190. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
  191. package/dist/cjs/keypairs/ed25519/index.js +10 -26
  192. package/dist/cjs/keypairs/ed25519/index.js.map +1 -0
  193. package/dist/cjs/keypairs/ed25519/keypair.js +134 -159
  194. package/dist/cjs/keypairs/ed25519/keypair.js.map +1 -0
  195. package/dist/cjs/keypairs/ed25519/publickey.js +70 -84
  196. package/dist/cjs/keypairs/ed25519/publickey.js.map +1 -0
  197. package/dist/cjs/keypairs/index.js +21 -19
  198. package/dist/cjs/keypairs/index.js.map +1 -0
  199. package/dist/cjs/keypairs/passkey/index.js +11 -27
  200. package/dist/cjs/keypairs/passkey/index.js.map +1 -0
  201. package/dist/cjs/keypairs/passkey/keypair.js +245 -256
  202. package/dist/cjs/keypairs/passkey/keypair.js.map +1 -0
  203. package/dist/cjs/keypairs/passkey/publickey.js +163 -162
  204. package/dist/cjs/keypairs/passkey/publickey.js.map +1 -0
  205. package/dist/cjs/keypairs/passkey/types.js +4 -15
  206. package/dist/cjs/keypairs/passkey/types.js.map +1 -0
  207. package/dist/cjs/keypairs/secp256k1/index.js +10 -26
  208. package/dist/cjs/keypairs/secp256k1/index.js.map +1 -0
  209. package/dist/cjs/keypairs/secp256k1/keypair.js +129 -151
  210. package/dist/cjs/keypairs/secp256k1/keypair.js.map +1 -0
  211. package/dist/cjs/keypairs/secp256k1/publickey.js +71 -89
  212. package/dist/cjs/keypairs/secp256k1/publickey.js.map +1 -0
  213. package/dist/cjs/keypairs/secp256r1/index.js +10 -26
  214. package/dist/cjs/keypairs/secp256r1/index.js.map +1 -0
  215. package/dist/cjs/keypairs/secp256r1/keypair.js +127 -148
  216. package/dist/cjs/keypairs/secp256r1/keypair.js.map +1 -0
  217. package/dist/cjs/keypairs/secp256r1/publickey.js +72 -90
  218. package/dist/cjs/keypairs/secp256r1/publickey.js.map +1 -0
  219. package/dist/cjs/multisig/index.js +10 -26
  220. package/dist/cjs/multisig/index.js.map +1 -0
  221. package/dist/cjs/multisig/publickey.d.ts +1 -1
  222. package/dist/cjs/multisig/publickey.js +228 -276
  223. package/dist/cjs/multisig/publickey.js.map +1 -0
  224. package/dist/cjs/multisig/signer.js +62 -110
  225. package/dist/cjs/multisig/signer.js.map +1 -0
  226. package/dist/cjs/transactions/Arguments.d.ts +4 -4
  227. package/dist/cjs/transactions/Arguments.js +13 -34
  228. package/dist/cjs/transactions/Arguments.js.map +1 -0
  229. package/dist/cjs/transactions/Commands.js +111 -141
  230. package/dist/cjs/transactions/Commands.js.map +1 -0
  231. package/dist/cjs/transactions/Inputs.js +53 -82
  232. package/dist/cjs/transactions/Inputs.js.map +1 -0
  233. package/dist/cjs/transactions/ObjectCache.d.ts +8 -8
  234. package/dist/cjs/transactions/ObjectCache.js +204 -241
  235. package/dist/cjs/transactions/ObjectCache.js.map +1 -0
  236. package/dist/cjs/transactions/Transaction.d.ts +31 -31
  237. package/dist/cjs/transactions/Transaction.js +628 -719
  238. package/dist/cjs/transactions/Transaction.js.map +1 -0
  239. package/dist/cjs/transactions/TransactionData.d.ts +9 -9
  240. package/dist/cjs/transactions/TransactionData.js +396 -440
  241. package/dist/cjs/transactions/TransactionData.js.map +1 -0
  242. package/dist/cjs/transactions/__tests__/Transaction.test.js +169 -0
  243. package/dist/cjs/transactions/__tests__/Transaction.test.js.map +1 -0
  244. package/dist/cjs/transactions/__tests__/bcs.test.js +202 -0
  245. package/dist/cjs/transactions/__tests__/bcs.test.js.map +1 -0
  246. package/dist/cjs/transactions/data/internal.js +166 -207
  247. package/dist/cjs/transactions/data/internal.js.map +1 -0
  248. package/dist/cjs/transactions/data/v1.js +436 -495
  249. package/dist/cjs/transactions/data/v1.js.map +1 -0
  250. package/dist/cjs/transactions/data/v2.d.ts +5 -5
  251. package/dist/cjs/transactions/data/v2.js +94 -107
  252. package/dist/cjs/transactions/data/v2.js.map +1 -0
  253. package/dist/cjs/transactions/executor/caching.js +71 -113
  254. package/dist/cjs/transactions/executor/caching.js.map +1 -0
  255. package/dist/cjs/transactions/executor/parallel.js +339 -378
  256. package/dist/cjs/transactions/executor/parallel.js.map +1 -0
  257. package/dist/cjs/transactions/executor/queue.js +60 -80
  258. package/dist/cjs/transactions/executor/queue.js.map +1 -0
  259. package/dist/cjs/transactions/executor/serial.d.ts +4 -4
  260. package/dist/cjs/transactions/executor/serial.js +102 -131
  261. package/dist/cjs/transactions/executor/serial.js.map +1 -0
  262. package/dist/cjs/transactions/hash.js +17 -28
  263. package/dist/cjs/transactions/hash.js.map +1 -0
  264. package/dist/cjs/transactions/index.js +33 -49
  265. package/dist/cjs/transactions/index.js.map +1 -0
  266. package/dist/cjs/transactions/intents/CoinWithBalance.js +137 -191
  267. package/dist/cjs/transactions/intents/CoinWithBalance.js.map +1 -0
  268. package/dist/cjs/transactions/object.js +88 -111
  269. package/dist/cjs/transactions/object.js.map +1 -0
  270. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js +20 -32
  271. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
  272. package/dist/cjs/transactions/pure.js +38 -60
  273. package/dist/cjs/transactions/pure.js.map +1 -0
  274. package/dist/cjs/transactions/resolve.js +62 -88
  275. package/dist/cjs/transactions/resolve.js.map +1 -0
  276. package/dist/cjs/transactions/serializer.js +150 -163
  277. package/dist/cjs/transactions/serializer.js.map +1 -0
  278. package/dist/cjs/transactions/utils.d.ts +1 -1
  279. package/dist/cjs/transactions/utils.js +114 -125
  280. package/dist/cjs/transactions/utils.js.map +1 -0
  281. package/dist/cjs/utils/constants.js +29 -56
  282. package/dist/cjs/utils/constants.js.map +1 -0
  283. package/dist/cjs/utils/derived-objects.js +14 -30
  284. package/dist/cjs/utils/derived-objects.js.map +1 -0
  285. package/dist/cjs/utils/dynamic-fields.js +20 -37
  286. package/dist/cjs/utils/dynamic-fields.js.map +1 -0
  287. package/dist/cjs/utils/format.js +14 -30
  288. package/dist/cjs/utils/format.js.map +1 -0
  289. package/dist/cjs/utils/index.js +50 -64
  290. package/dist/cjs/utils/index.js.map +1 -0
  291. package/dist/cjs/utils/move-registry.js +37 -35
  292. package/dist/cjs/utils/move-registry.js.map +1 -0
  293. package/dist/cjs/utils/sui-types.js +74 -68
  294. package/dist/cjs/utils/sui-types.js.map +1 -0
  295. package/dist/cjs/utils/suins.js +30 -46
  296. package/dist/cjs/utils/suins.js.map +1 -0
  297. package/dist/cjs/verify/index.js +12 -27
  298. package/dist/cjs/verify/index.js.map +1 -0
  299. package/dist/cjs/verify/verify.js +83 -110
  300. package/dist/cjs/verify/verify.js.map +1 -0
  301. package/dist/cjs/version.js +8 -25
  302. package/dist/cjs/version.js.map +1 -0
  303. package/dist/cjs/w/call/allocation.js +323 -413
  304. package/dist/cjs/w/call/allocation.js.map +1 -0
  305. package/dist/cjs/w/call/arb.js +105 -136
  306. package/dist/cjs/w/call/arb.js.map +1 -0
  307. package/dist/cjs/w/call/arbitration.js +1206 -1581
  308. package/dist/cjs/w/call/arbitration.js.map +1 -0
  309. package/dist/cjs/w/call/base.js +303 -333
  310. package/dist/cjs/w/call/base.js.map +1 -0
  311. package/dist/cjs/w/call/contact.js +335 -452
  312. package/dist/cjs/w/call/contact.js.map +1 -0
  313. package/dist/cjs/w/call/demand.js +690 -844
  314. package/dist/cjs/w/call/demand.js.map +1 -0
  315. package/dist/cjs/w/call/entity.js +167 -201
  316. package/dist/cjs/w/call/entity.js.map +1 -0
  317. package/dist/cjs/w/call/guard-ins.d.ts +1 -0
  318. package/dist/cjs/w/call/guard-ins.js +4376 -4384
  319. package/dist/cjs/w/call/guard-ins.js.map +1 -0
  320. package/dist/cjs/w/call/guard.d.ts +10 -0
  321. package/dist/cjs/w/call/guard.js +1078 -1119
  322. package/dist/cjs/w/call/guard.js.map +1 -0
  323. package/dist/cjs/w/call/index.d.ts +1 -1
  324. package/dist/cjs/w/call/index.js +69 -69
  325. package/dist/cjs/w/call/index.js.map +1 -0
  326. package/dist/cjs/w/call/machine.js +1105 -1419
  327. package/dist/cjs/w/call/machine.js.map +1 -0
  328. package/dist/cjs/w/call/order.js +314 -454
  329. package/dist/cjs/w/call/order.js.map +1 -0
  330. package/dist/cjs/w/call/passport.js +214 -253
  331. package/dist/cjs/w/call/passport.js.map +1 -0
  332. package/dist/cjs/w/call/payment.js +187 -224
  333. package/dist/cjs/w/call/payment.js.map +1 -0
  334. package/dist/cjs/w/call/permission.js +1183 -1294
  335. package/dist/cjs/w/call/permission.js.map +1 -0
  336. package/dist/cjs/w/call/personal.js +132 -170
  337. package/dist/cjs/w/call/personal.js.map +1 -0
  338. package/dist/cjs/w/call/progress.js +634 -794
  339. package/dist/cjs/w/call/progress.js.map +1 -0
  340. package/dist/cjs/w/call/proof.js +67 -116
  341. package/dist/cjs/w/call/proof.js.map +1 -0
  342. package/dist/cjs/w/call/repository.js +1037 -1251
  343. package/dist/cjs/w/call/repository.js.map +1 -0
  344. package/dist/cjs/w/call/resource.js +111 -131
  345. package/dist/cjs/w/call/resource.js.map +1 -0
  346. package/dist/cjs/w/call/reward.js +675 -853
  347. package/dist/cjs/w/call/reward.js.map +1 -0
  348. package/dist/cjs/w/call/service.js +1879 -2385
  349. package/dist/cjs/w/call/service.js.map +1 -0
  350. package/dist/cjs/w/call/treasury.js +841 -1138
  351. package/dist/cjs/w/call/treasury.js.map +1 -0
  352. package/dist/cjs/w/call/util.js +593 -624
  353. package/dist/cjs/w/call/util.js.map +1 -0
  354. package/dist/cjs/w/common.d.ts +1 -1
  355. package/dist/cjs/w/common.js +548 -518
  356. package/dist/cjs/w/common.js.map +1 -0
  357. package/dist/cjs/w/exception.js +574 -584
  358. package/dist/cjs/w/exception.js.map +1 -0
  359. package/dist/cjs/w/index.js +26 -23
  360. package/dist/cjs/w/index.js.map +1 -0
  361. package/dist/cjs/w/local/account.js +664 -741
  362. package/dist/cjs/w/local/account.js.map +1 -0
  363. package/dist/cjs/w/local/cache.js +180 -166
  364. package/dist/cjs/w/local/cache.js.map +1 -0
  365. package/dist/cjs/w/local/config.js +51 -80
  366. package/dist/cjs/w/local/config.js.map +1 -0
  367. package/dist/cjs/w/local/index.js +225 -290
  368. package/dist/cjs/w/local/index.js.map +1 -0
  369. package/dist/cjs/w/local/local.d.ts +2 -2
  370. package/dist/cjs/w/local/local.js +638 -646
  371. package/dist/cjs/w/local/local.js.map +1 -0
  372. package/dist/cjs/w/local/storage.js +210 -164
  373. package/dist/cjs/w/local/storage.js.map +1 -0
  374. package/dist/cjs/w/local/token.js +158 -175
  375. package/dist/cjs/w/local/token.js.map +1 -0
  376. package/dist/cjs/w/local/util.js +80 -51
  377. package/dist/cjs/w/local/util.js.map +1 -0
  378. package/dist/cjs/w/local/wip.js +1078 -802
  379. package/dist/cjs/w/local/wip.js.map +1 -0
  380. package/dist/cjs/w/messenger/crypto.js +496 -389
  381. package/dist/cjs/w/messenger/crypto.js.map +1 -0
  382. package/dist/cjs/w/messenger/index.js +53 -35
  383. package/dist/cjs/w/messenger/index.js.map +1 -0
  384. package/dist/cjs/w/messenger/messenger-api.js +1159 -1035
  385. package/dist/cjs/w/messenger/messenger-api.js.map +1 -0
  386. package/dist/cjs/w/messenger/messenger-manager.js +954 -1083
  387. package/dist/cjs/w/messenger/messenger-manager.js.map +1 -0
  388. package/dist/cjs/w/messenger/messenger.d.ts +1 -1
  389. package/dist/cjs/w/messenger/messenger.js +1304 -1450
  390. package/dist/cjs/w/messenger/messenger.js.map +1 -0
  391. package/dist/cjs/w/messenger/server.js +390 -512
  392. package/dist/cjs/w/messenger/server.js.map +1 -0
  393. package/dist/cjs/w/messenger/session.js +399 -403
  394. package/dist/cjs/w/messenger/session.js.map +1 -0
  395. package/dist/cjs/w/messenger/storage.js +881 -777
  396. package/dist/cjs/w/messenger/storage.js.map +1 -0
  397. package/dist/cjs/w/messenger/types.d.ts +2 -2
  398. package/dist/cjs/w/messenger/types.js +83 -103
  399. package/dist/cjs/w/messenger/types.js.map +1 -0
  400. package/dist/cjs/w/messenger/utils.js +29 -34
  401. package/dist/cjs/w/messenger/utils.js.map +1 -0
  402. package/dist/cjs/w/query/bult-in.js +101 -110
  403. package/dist/cjs/w/query/bult-in.js.map +1 -0
  404. package/dist/cjs/w/query/event.js +134 -146
  405. package/dist/cjs/w/query/event.js.map +1 -0
  406. package/dist/cjs/w/query/index.js +22 -20
  407. package/dist/cjs/w/query/index.js.map +1 -0
  408. package/dist/cjs/w/query/object.js +1576 -1576
  409. package/dist/cjs/w/query/object.js.map +1 -0
  410. package/dist/cjs/w/query/received.js +66 -88
  411. package/dist/cjs/w/query/received.js.map +1 -0
  412. package/dist/cjs/w/query/util.js +53 -77
  413. package/dist/cjs/w/query/util.js.map +1 -0
  414. package/dist/cjs/w/util.js +589 -675
  415. package/dist/cjs/w/util.js.map +1 -0
  416. package/dist/esm/bcs/bcs.d.ts +199 -199
  417. package/dist/esm/bcs/bcs.js +269 -310
  418. package/dist/esm/bcs/bcs.js.map +1 -0
  419. package/dist/esm/bcs/effects.d.ts +109 -109
  420. package/dist/esm/bcs/effects.js +171 -179
  421. package/dist/esm/bcs/effects.js.map +1 -0
  422. package/dist/esm/bcs/index.d.ts +1 -2584
  423. package/dist/esm/bcs/index.js +51 -94
  424. package/dist/esm/bcs/index.js.map +1 -0
  425. package/dist/esm/bcs/pure.js +35 -38
  426. package/dist/esm/bcs/pure.js.map +1 -0
  427. package/dist/esm/bcs/type-tag-serializer.js +98 -95
  428. package/dist/esm/bcs/type-tag-serializer.js.map +1 -0
  429. package/dist/esm/bcs/types.js +5 -5
  430. package/dist/esm/bcs/types.js.map +1 -0
  431. package/dist/esm/client/index.js +7 -23
  432. package/dist/esm/client/index.js.map +1 -0
  433. package/dist/esm/client/network.js +23 -22
  434. package/dist/esm/client/network.js.map +1 -0
  435. package/dist/esm/cryptography/index.js +9 -46
  436. package/dist/esm/cryptography/index.js.map +1 -0
  437. package/dist/esm/cryptography/intent.d.ts +1 -1
  438. package/dist/esm/cryptography/intent.js +18 -12
  439. package/dist/esm/cryptography/intent.js.map +1 -0
  440. package/dist/esm/cryptography/keypair.js +95 -99
  441. package/dist/esm/cryptography/keypair.js.map +1 -0
  442. package/dist/esm/cryptography/mnemonics.js +40 -24
  443. package/dist/esm/cryptography/mnemonics.js.map +1 -0
  444. package/dist/esm/cryptography/publickey.js +104 -115
  445. package/dist/esm/cryptography/publickey.js.map +1 -0
  446. package/dist/esm/cryptography/signature-scheme.js +22 -24
  447. package/dist/esm/cryptography/signature-scheme.js.map +1 -0
  448. package/dist/esm/cryptography/signature.d.ts +2 -24
  449. package/dist/esm/cryptography/signature.js +44 -48
  450. package/dist/esm/cryptography/signature.js.map +1 -0
  451. package/dist/esm/experimental/cache.js +61 -0
  452. package/dist/esm/experimental/cache.js.map +1 -0
  453. package/dist/esm/experimental/client.js +23 -0
  454. package/dist/esm/experimental/client.js.map +1 -0
  455. package/dist/esm/experimental/core.js +85 -0
  456. package/dist/esm/experimental/core.js.map +1 -0
  457. package/dist/esm/experimental/errors.js +27 -0
  458. package/dist/esm/experimental/errors.js.map +1 -0
  459. package/dist/esm/experimental/index.js +8 -0
  460. package/dist/esm/experimental/index.js.map +1 -0
  461. package/dist/esm/experimental/persistent-storage.js +337 -0
  462. package/dist/esm/experimental/persistent-storage.js.map +1 -0
  463. package/dist/esm/experimental/persistent-storage.test.js +198 -0
  464. package/dist/esm/experimental/persistent-storage.test.js.map +1 -0
  465. package/dist/esm/experimental/transports/utils.js +100 -0
  466. package/dist/esm/experimental/transports/utils.js.map +1 -0
  467. package/dist/esm/experimental/types.js +5 -0
  468. package/dist/esm/experimental/types.js.map +1 -0
  469. package/dist/esm/faucet/faucet.js +104 -111
  470. package/dist/esm/faucet/faucet.js.map +1 -0
  471. package/dist/esm/faucet/index.js +4 -16
  472. package/dist/esm/faucet/index.js.map +1 -0
  473. package/dist/esm/grpc/client.js +34 -34
  474. package/dist/esm/grpc/client.js.map +1 -0
  475. package/dist/esm/grpc/core.js +570 -601
  476. package/dist/esm/grpc/core.js.map +1 -0
  477. package/dist/esm/grpc/index.js +5 -6
  478. package/dist/esm/grpc/index.js.map +1 -0
  479. package/dist/esm/grpc/proto/google/protobuf/any.js +161 -111
  480. package/dist/esm/grpc/proto/google/protobuf/any.js.map +1 -0
  481. package/dist/esm/grpc/proto/google/protobuf/duration.js +99 -67
  482. package/dist/esm/grpc/proto/google/protobuf/duration.js.map +1 -0
  483. package/dist/esm/grpc/proto/google/protobuf/empty.js +46 -7
  484. package/dist/esm/grpc/proto/google/protobuf/empty.js.map +1 -0
  485. package/dist/esm/grpc/proto/google/protobuf/field_mask.js +90 -52
  486. package/dist/esm/grpc/proto/google/protobuf/field_mask.js.map +1 -0
  487. package/dist/esm/grpc/proto/google/protobuf/struct.js +258 -190
  488. package/dist/esm/grpc/proto/google/protobuf/struct.js.map +1 -0
  489. package/dist/esm/grpc/proto/google/protobuf/timestamp.js +144 -108
  490. package/dist/esm/grpc/proto/google/protobuf/timestamp.js.map +1 -0
  491. package/dist/esm/grpc/proto/google/rpc/error_details.js +313 -267
  492. package/dist/esm/grpc/proto/google/rpc/error_details.js.map +1 -0
  493. package/dist/esm/grpc/proto/google/rpc/status.js +45 -28
  494. package/dist/esm/grpc/proto/google/rpc/status.js.map +1 -0
  495. package/dist/esm/grpc/proto/sui/rpc/v2/argument.js +80 -47
  496. package/dist/esm/grpc/proto/sui/rpc/v2/argument.js.map +1 -0
  497. package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js +41 -29
  498. package/dist/esm/grpc/proto/sui/rpc/v2/balance_change.js.map +1 -0
  499. package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js +34 -22
  500. package/dist/esm/grpc/proto/sui/rpc/v2/bcs.js.map +1 -0
  501. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js +61 -49
  502. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint.js.map +1 -0
  503. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js +72 -57
  504. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_contents.js.map +1 -0
  505. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js +173 -139
  506. package/dist/esm/grpc/proto/sui/rpc/v2/checkpoint_summary.js.map +1 -0
  507. package/dist/esm/grpc/proto/sui/rpc/v2/effects.js +358 -268
  508. package/dist/esm/grpc/proto/sui/rpc/v2/effects.js.map +1 -0
  509. package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js +72 -60
  510. package/dist/esm/grpc/proto/sui/rpc/v2/epoch.js.map +1 -0
  511. package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js +29 -9
  512. package/dist/esm/grpc/proto/sui/rpc/v2/error_reason.js.map +1 -0
  513. package/dist/esm/grpc/proto/sui/rpc/v2/event.js +74 -59
  514. package/dist/esm/grpc/proto/sui/rpc/v2/event.js.map +1 -0
  515. package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js +69 -57
  516. package/dist/esm/grpc/proto/sui/rpc/v2/executed_transaction.js.map +1 -0
  517. package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js +861 -474
  518. package/dist/esm/grpc/proto/sui/rpc/v2/execution_status.js.map +1 -0
  519. package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js +52 -40
  520. package/dist/esm/grpc/proto/sui/rpc/v2/gas_cost_summary.js.map +1 -0
  521. package/dist/esm/grpc/proto/sui/rpc/v2/input.js +98 -61
  522. package/dist/esm/grpc/proto/sui/rpc/v2/input.js.map +1 -0
  523. package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js +71 -56
  524. package/dist/esm/grpc/proto/sui/rpc/v2/jwk.js.map +1 -0
  525. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js +65 -100
  526. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.client.js.map +1 -0
  527. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js +365 -306
  528. package/dist/esm/grpc/proto/sui/rpc/v2/ledger_service.js.map +1 -0
  529. package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js +585 -442
  530. package/dist/esm/grpc/proto/sui/rpc/v2/move_package.js.map +1 -0
  531. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js +42 -59
  532. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.client.js.map +1 -0
  533. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js +226 -191
  534. package/dist/esm/grpc/proto/sui/rpc/v2/move_package_service.js.map +1 -0
  535. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js +28 -33
  536. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.client.js.map +1 -0
  537. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js +129 -107
  538. package/dist/esm/grpc/proto/sui/rpc/v2/name_service.js.map +1 -0
  539. package/dist/esm/grpc/proto/sui/rpc/v2/object.js +100 -85
  540. package/dist/esm/grpc/proto/sui/rpc/v2/object.js.map +1 -0
  541. package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js +42 -30
  542. package/dist/esm/grpc/proto/sui/rpc/v2/object_reference.js.map +1 -0
  543. package/dist/esm/grpc/proto/sui/rpc/v2/owner.js +72 -40
  544. package/dist/esm/grpc/proto/sui/rpc/v2/owner.js.map +1 -0
  545. package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js +42 -38
  546. package/dist/esm/grpc/proto/sui/rpc/v2/protocol_config.js.map +1 -0
  547. package/dist/esm/grpc/proto/sui/rpc/v2/signature.js +544 -481
  548. package/dist/esm/grpc/proto/sui/rpc/v2/signature.js.map +1 -0
  549. package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js +52 -13
  550. package/dist/esm/grpc/proto/sui/rpc/v2/signature_scheme.js.map +1 -0
  551. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js +23 -28
  552. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.client.js.map +1 -0
  553. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js +74 -60
  554. package/dist/esm/grpc/proto/sui/rpc/v2/signature_verification_service.js.map +1 -0
  555. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js +49 -66
  556. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.client.js.map +1 -0
  557. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js +623 -490
  558. package/dist/esm/grpc/proto/sui/rpc/v2/state_service.js.map +1 -0
  559. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js +33 -32
  560. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.client.js.map +1 -0
  561. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js +50 -36
  562. package/dist/esm/grpc/proto/sui/rpc/v2/subscription_service.js.map +1 -0
  563. package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js +737 -701
  564. package/dist/esm/grpc/proto/sui/rpc/v2/system_state.js.map +1 -0
  565. package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js +1177 -917
  566. package/dist/esm/grpc/proto/sui/rpc/v2/transaction.js.map +1 -0
  567. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js +28 -27
  568. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.client.js.map +1 -0
  569. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js +169 -133
  570. package/dist/esm/grpc/proto/sui/rpc/v2/transaction_execution_service.js.map +1 -0
  571. package/dist/esm/index.js +21 -107
  572. package/dist/esm/index.js.map +1 -0
  573. package/dist/esm/jsonRpc/client.js +646 -727
  574. package/dist/esm/jsonRpc/client.js.map +1 -0
  575. package/dist/esm/jsonRpc/core.d.ts +7 -7
  576. package/dist/esm/jsonRpc/core.js +550 -581
  577. package/dist/esm/jsonRpc/core.js.map +1 -0
  578. package/dist/esm/jsonRpc/errors.js +36 -41
  579. package/dist/esm/jsonRpc/errors.js.map +1 -0
  580. package/dist/esm/jsonRpc/http-transport.js +65 -93
  581. package/dist/esm/jsonRpc/http-transport.js.map +1 -0
  582. package/dist/esm/jsonRpc/index.js +6 -20
  583. package/dist/esm/jsonRpc/index.js.map +1 -0
  584. package/dist/esm/jsonRpc/json-rpc-resolver.js +281 -276
  585. package/dist/esm/jsonRpc/json-rpc-resolver.js.map +1 -0
  586. package/dist/esm/jsonRpc/rpc-websocket-client.js +147 -189
  587. package/dist/esm/jsonRpc/rpc-websocket-client.js.map +1 -0
  588. package/dist/esm/jsonRpc/types/chain.js +4 -0
  589. package/dist/esm/jsonRpc/types/chain.js.map +1 -0
  590. package/dist/esm/jsonRpc/types/changes.js +4 -0
  591. package/dist/esm/jsonRpc/types/changes.js.map +1 -0
  592. package/dist/esm/jsonRpc/types/coins.js +4 -0
  593. package/dist/esm/jsonRpc/types/coins.js.map +1 -0
  594. package/dist/esm/jsonRpc/types/common.js +4 -0
  595. package/dist/esm/jsonRpc/types/common.js.map +1 -0
  596. package/dist/esm/jsonRpc/types/generated.d.ts +1 -1
  597. package/dist/esm/jsonRpc/types/generated.js +4 -0
  598. package/dist/esm/jsonRpc/types/generated.js.map +1 -0
  599. package/dist/esm/jsonRpc/types/index.js +4 -0
  600. package/dist/esm/jsonRpc/types/index.js.map +1 -0
  601. package/dist/esm/jsonRpc/types/params.js +4 -0
  602. package/dist/esm/jsonRpc/types/params.js.map +1 -0
  603. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +49 -48
  604. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js.map +1 -0
  605. package/dist/esm/keypairs/ed25519/index.js +5 -10
  606. package/dist/esm/keypairs/ed25519/index.js.map +1 -0
  607. package/dist/esm/keypairs/ed25519/keypair.js +128 -146
  608. package/dist/esm/keypairs/ed25519/keypair.js.map +1 -0
  609. package/dist/esm/keypairs/ed25519/publickey.js +64 -67
  610. package/dist/esm/keypairs/ed25519/publickey.js.map +1 -0
  611. package/dist/esm/keypairs/index.js +3 -0
  612. package/dist/esm/keypairs/index.js.map +1 -0
  613. package/dist/esm/keypairs/passkey/index.js +5 -12
  614. package/dist/esm/keypairs/passkey/index.js.map +1 -0
  615. package/dist/esm/keypairs/passkey/keypair.js +236 -243
  616. package/dist/esm/keypairs/passkey/keypair.js.map +1 -0
  617. package/dist/esm/keypairs/passkey/publickey.js +154 -140
  618. package/dist/esm/keypairs/passkey/publickey.js.map +1 -0
  619. package/dist/esm/keypairs/passkey/types.js +4 -0
  620. package/dist/esm/keypairs/passkey/types.js.map +1 -0
  621. package/dist/esm/keypairs/secp256k1/index.js +5 -10
  622. package/dist/esm/keypairs/secp256k1/index.js.map +1 -0
  623. package/dist/esm/keypairs/secp256k1/keypair.js +120 -134
  624. package/dist/esm/keypairs/secp256k1/keypair.js.map +1 -0
  625. package/dist/esm/keypairs/secp256k1/publickey.js +64 -71
  626. package/dist/esm/keypairs/secp256k1/publickey.js.map +1 -0
  627. package/dist/esm/keypairs/secp256r1/index.js +5 -10
  628. package/dist/esm/keypairs/secp256r1/index.js.map +1 -0
  629. package/dist/esm/keypairs/secp256r1/keypair.js +118 -131
  630. package/dist/esm/keypairs/secp256r1/keypair.js.map +1 -0
  631. package/dist/esm/keypairs/secp256r1/publickey.js +63 -66
  632. package/dist/esm/keypairs/secp256r1/publickey.js.map +1 -0
  633. package/dist/esm/multisig/index.js +5 -10
  634. package/dist/esm/multisig/index.js.map +1 -0
  635. package/dist/esm/multisig/publickey.d.ts +1 -1
  636. package/dist/esm/multisig/publickey.js +216 -253
  637. package/dist/esm/multisig/publickey.js.map +1 -0
  638. package/dist/esm/multisig/signer.js +57 -89
  639. package/dist/esm/multisig/signer.js.map +1 -0
  640. package/dist/esm/transactions/Arguments.d.ts +4 -4
  641. package/dist/esm/transactions/Arguments.js +9 -13
  642. package/dist/esm/transactions/Arguments.js.map +1 -0
  643. package/dist/esm/transactions/Commands.js +105 -118
  644. package/dist/esm/transactions/Commands.js.map +1 -0
  645. package/dist/esm/transactions/Inputs.js +49 -61
  646. package/dist/esm/transactions/Inputs.js.map +1 -0
  647. package/dist/esm/transactions/ObjectCache.d.ts +8 -8
  648. package/dist/esm/transactions/ObjectCache.js +200 -223
  649. package/dist/esm/transactions/ObjectCache.js.map +1 -0
  650. package/dist/esm/transactions/Transaction.d.ts +32 -32
  651. package/dist/esm/transactions/Transaction.js +611 -696
  652. package/dist/esm/transactions/Transaction.js.map +1 -0
  653. package/dist/esm/transactions/TransactionData.d.ts +9 -9
  654. package/dist/esm/transactions/TransactionData.js +386 -415
  655. package/dist/esm/transactions/TransactionData.js.map +1 -0
  656. package/dist/esm/transactions/__tests__/Transaction.test.js +167 -0
  657. package/dist/esm/transactions/__tests__/Transaction.test.js.map +1 -0
  658. package/dist/esm/transactions/__tests__/bcs.test.js +200 -0
  659. package/dist/esm/transactions/__tests__/bcs.test.js.map +1 -0
  660. package/dist/esm/transactions/data/internal.js +158 -205
  661. package/dist/esm/transactions/data/internal.js.map +1 -0
  662. package/dist/esm/transactions/data/v1.js +419 -487
  663. package/dist/esm/transactions/data/v1.js.map +1 -0
  664. package/dist/esm/transactions/data/v2.d.ts +5 -5
  665. package/dist/esm/transactions/data/v2.js +89 -107
  666. package/dist/esm/transactions/data/v2.js.map +1 -0
  667. package/dist/esm/transactions/executor/caching.d.ts +2 -2
  668. package/dist/esm/transactions/executor/caching.js +66 -93
  669. package/dist/esm/transactions/executor/caching.js.map +1 -0
  670. package/dist/esm/transactions/executor/parallel.js +329 -352
  671. package/dist/esm/transactions/executor/parallel.js.map +1 -0
  672. package/dist/esm/transactions/executor/queue.js +58 -64
  673. package/dist/esm/transactions/executor/queue.js.map +1 -0
  674. package/dist/esm/transactions/executor/serial.d.ts +5 -5
  675. package/dist/esm/transactions/executor/serial.js +96 -110
  676. package/dist/esm/transactions/executor/serial.js.map +1 -0
  677. package/dist/esm/transactions/hash.js +15 -9
  678. package/dist/esm/transactions/hash.js.map +1 -0
  679. package/dist/esm/transactions/index.js +15 -41
  680. package/dist/esm/transactions/index.js.map +1 -0
  681. package/dist/esm/transactions/intents/CoinWithBalance.js +127 -165
  682. package/dist/esm/transactions/intents/CoinWithBalance.js.map +1 -0
  683. package/dist/esm/transactions/object.js +86 -92
  684. package/dist/esm/transactions/object.js.map +1 -0
  685. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js +18 -15
  686. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js.map +1 -0
  687. package/dist/esm/transactions/pure.js +34 -39
  688. package/dist/esm/transactions/pure.js.map +1 -0
  689. package/dist/esm/transactions/resolve.js +58 -69
  690. package/dist/esm/transactions/resolve.js.map +1 -0
  691. package/dist/esm/transactions/serializer.js +145 -144
  692. package/dist/esm/transactions/serializer.js.map +1 -0
  693. package/dist/esm/transactions/utils.d.ts +1 -1
  694. package/dist/esm/transactions/utils.js +110 -109
  695. package/dist/esm/transactions/utils.js.map +1 -0
  696. package/dist/esm/utils/constants.js +26 -36
  697. package/dist/esm/utils/constants.js.map +1 -0
  698. package/dist/esm/utils/derived-objects.js +11 -10
  699. package/dist/esm/utils/derived-objects.js.map +1 -0
  700. package/dist/esm/utils/dynamic-fields.js +16 -16
  701. package/dist/esm/utils/dynamic-fields.js.map +1 -0
  702. package/dist/esm/utils/format.js +13 -13
  703. package/dist/esm/utils/format.js.map +1 -0
  704. package/dist/esm/utils/index.js +15 -76
  705. package/dist/esm/utils/index.js.map +1 -0
  706. package/dist/esm/utils/move-registry.js +34 -17
  707. package/dist/esm/utils/move-registry.js.map +1 -0
  708. package/dist/esm/utils/sui-types.js +70 -54
  709. package/dist/esm/utils/sui-types.js.map +1 -0
  710. package/dist/esm/utils/suins.js +29 -29
  711. package/dist/esm/utils/suins.js.map +1 -0
  712. package/dist/esm/verify/index.js +5 -14
  713. package/dist/esm/verify/index.js.map +1 -0
  714. package/dist/esm/verify/verify.js +76 -93
  715. package/dist/esm/verify/verify.js.map +1 -0
  716. package/dist/esm/version.js +6 -6
  717. package/dist/esm/version.js.map +1 -0
  718. package/dist/esm/w/call/allocation.js +307 -402
  719. package/dist/esm/w/call/allocation.js.map +1 -0
  720. package/dist/esm/w/call/arb.js +100 -129
  721. package/dist/esm/w/call/arb.js.map +1 -0
  722. package/dist/esm/w/call/arbitration.js +1170 -1568
  723. package/dist/esm/w/call/arbitration.js.map +1 -0
  724. package/dist/esm/w/call/base.js +288 -315
  725. package/dist/esm/w/call/base.js.map +1 -0
  726. package/dist/esm/w/call/contact.js +318 -442
  727. package/dist/esm/w/call/contact.js.map +1 -0
  728. package/dist/esm/w/call/demand.js +673 -841
  729. package/dist/esm/w/call/demand.js.map +1 -0
  730. package/dist/esm/w/call/entity.js +162 -203
  731. package/dist/esm/w/call/entity.js.map +1 -0
  732. package/dist/esm/w/call/guard-ins.d.ts +1 -0
  733. package/dist/esm/w/call/guard-ins.js +4373 -4366
  734. package/dist/esm/w/call/guard-ins.js.map +1 -0
  735. package/dist/esm/w/call/guard.d.ts +10 -0
  736. package/dist/esm/w/call/guard.js +1061 -1115
  737. package/dist/esm/w/call/guard.js.map +1 -0
  738. package/dist/esm/w/call/index.d.ts +1 -1
  739. package/dist/esm/w/call/index.js +24 -54
  740. package/dist/esm/w/call/index.js.map +1 -0
  741. package/dist/esm/w/call/machine.js +1086 -1433
  742. package/dist/esm/w/call/machine.js.map +1 -0
  743. package/dist/esm/w/call/order.js +301 -448
  744. package/dist/esm/w/call/order.js.map +1 -0
  745. package/dist/esm/w/call/passport.js +204 -240
  746. package/dist/esm/w/call/passport.js.map +1 -0
  747. package/dist/esm/w/call/payment.js +177 -215
  748. package/dist/esm/w/call/payment.js.map +1 -0
  749. package/dist/esm/w/call/permission.js +1172 -1320
  750. package/dist/esm/w/call/permission.js.map +1 -0
  751. package/dist/esm/w/call/personal.js +121 -156
  752. package/dist/esm/w/call/personal.js.map +1 -0
  753. package/dist/esm/w/call/progress.js +625 -797
  754. package/dist/esm/w/call/progress.js.map +1 -0
  755. package/dist/esm/w/call/proof.js +61 -103
  756. package/dist/esm/w/call/proof.js.map +1 -0
  757. package/dist/esm/w/call/repository.js +1017 -1251
  758. package/dist/esm/w/call/repository.js.map +1 -0
  759. package/dist/esm/w/call/resource.js +108 -124
  760. package/dist/esm/w/call/resource.js.map +1 -0
  761. package/dist/esm/w/call/reward.js +660 -847
  762. package/dist/esm/w/call/reward.js.map +1 -0
  763. package/dist/esm/w/call/service.js +1849 -2400
  764. package/dist/esm/w/call/service.js.map +1 -0
  765. package/dist/esm/w/call/treasury.js +815 -1125
  766. package/dist/esm/w/call/treasury.js.map +1 -0
  767. package/dist/esm/w/call/util.js +553 -576
  768. package/dist/esm/w/call/util.js.map +1 -0
  769. package/dist/esm/w/common.d.ts +1 -1
  770. package/dist/esm/w/common.js +579 -580
  771. package/dist/esm/w/common.js.map +1 -0
  772. package/dist/esm/w/exception.js +570 -573
  773. package/dist/esm/w/exception.js.map +1 -0
  774. package/dist/esm/w/index.js +4 -0
  775. package/dist/esm/w/index.js.map +1 -0
  776. package/dist/esm/w/local/account.js +652 -709
  777. package/dist/esm/w/local/account.js.map +1 -0
  778. package/dist/esm/w/local/cache.js +176 -147
  779. package/dist/esm/w/local/cache.js.map +1 -0
  780. package/dist/esm/w/local/config.js +46 -60
  781. package/dist/esm/w/local/config.js.map +1 -0
  782. package/dist/esm/w/local/index.js +196 -273
  783. package/dist/esm/w/local/index.js.map +1 -0
  784. package/dist/esm/w/local/local.d.ts +2 -2
  785. package/dist/esm/w/local/local.js +631 -626
  786. package/dist/esm/w/local/local.js.map +1 -0
  787. package/dist/esm/w/local/storage.js +168 -136
  788. package/dist/esm/w/local/storage.js.map +1 -0
  789. package/dist/esm/w/local/token.js +149 -151
  790. package/dist/esm/w/local/token.js.map +1 -0
  791. package/dist/esm/w/local/util.js +45 -22
  792. package/dist/esm/w/local/util.js.map +1 -0
  793. package/dist/esm/w/local/wip.js +1038 -781
  794. package/dist/esm/w/local/wip.js.map +1 -0
  795. package/dist/esm/w/messenger/crypto.js +491 -387
  796. package/dist/esm/w/messenger/crypto.js.map +1 -0
  797. package/dist/esm/w/messenger/index.js +27 -24
  798. package/dist/esm/w/messenger/index.js.map +1 -0
  799. package/dist/esm/w/messenger/messenger-api.js +1111 -1017
  800. package/dist/esm/w/messenger/messenger-api.js.map +1 -0
  801. package/dist/esm/w/messenger/messenger-manager.js +944 -1052
  802. package/dist/esm/w/messenger/messenger-manager.js.map +1 -0
  803. package/dist/esm/w/messenger/messenger.d.ts +1 -1
  804. package/dist/esm/w/messenger/messenger.js +1258 -1421
  805. package/dist/esm/w/messenger/messenger.js.map +1 -0
  806. package/dist/esm/w/messenger/server.js +388 -499
  807. package/dist/esm/w/messenger/server.js.map +1 -0
  808. package/dist/esm/w/messenger/session.js +394 -399
  809. package/dist/esm/w/messenger/session.js.map +1 -0
  810. package/dist/esm/w/messenger/storage.js +840 -751
  811. package/dist/esm/w/messenger/storage.js.map +1 -0
  812. package/dist/esm/w/messenger/types.d.ts +2 -2
  813. package/dist/esm/w/messenger/types.js +80 -85
  814. package/dist/esm/w/messenger/types.js.map +1 -0
  815. package/dist/esm/w/messenger/utils.js +28 -16
  816. package/dist/esm/w/messenger/utils.js.map +1 -0
  817. package/dist/esm/w/query/bult-in.js +95 -100
  818. package/dist/esm/w/query/bult-in.js.map +1 -0
  819. package/dist/esm/w/query/event.js +128 -125
  820. package/dist/esm/w/query/event.js.map +1 -0
  821. package/dist/esm/w/query/index.js +3 -0
  822. package/dist/esm/w/query/index.js.map +1 -0
  823. package/dist/esm/w/query/object.js +1560 -1574
  824. package/dist/esm/w/query/object.js.map +1 -0
  825. package/dist/esm/w/query/received.js +57 -63
  826. package/dist/esm/w/query/received.js.map +1 -0
  827. package/dist/esm/w/query/util.js +48 -56
  828. package/dist/esm/w/query/util.js.map +1 -0
  829. package/dist/esm/w/util.js +578 -673
  830. package/dist/esm/w/util.js.map +1 -0
  831. package/package.json +14 -9
  832. package/dist/cjs/graphql/client.js +0 -98
  833. package/dist/cjs/graphql/core.js +0 -506
  834. package/dist/cjs/graphql/generated/2024.1/tada-env.js +0 -13141
  835. package/dist/cjs/graphql/generated/2024.1/tsconfig.tada.js +0 -11
  836. package/dist/cjs/graphql/generated/2024.4/tada-env.js +0 -13287
  837. package/dist/cjs/graphql/generated/2024.4/tsconfig.tada.js +0 -11
  838. package/dist/cjs/graphql/generated/latest/tada-env.js +0 -12925
  839. package/dist/cjs/graphql/generated/latest/tsconfig.tada.js +0 -11
  840. package/dist/cjs/graphql/generated/queries.js +0 -807
  841. package/dist/cjs/graphql/index.js +0 -25
  842. package/dist/cjs/graphql/schemas/2024.1/index.js +0 -28
  843. package/dist/cjs/graphql/schemas/2024.4/index.js +0 -28
  844. package/dist/cjs/graphql/schemas/latest/index.js +0 -28
  845. package/dist/cjs/graphql/types.js +0 -16
  846. package/dist/cjs/package.json +0 -5
  847. package/dist/cjs/w/local/.eslintrc.js +0 -15
  848. package/dist/cjs/w/messenger/.eslintrc.js +0 -15
  849. package/dist/cjs/zklogin/address.js +0 -93
  850. package/dist/cjs/zklogin/bcs.js +0 -41
  851. package/dist/cjs/zklogin/index.js +0 -45
  852. package/dist/cjs/zklogin/jwt-decode.js +0 -88
  853. package/dist/cjs/zklogin/jwt-utils.js +0 -128
  854. package/dist/cjs/zklogin/nonce.js +0 -60
  855. package/dist/cjs/zklogin/poseidon.js +0 -64
  856. package/dist/cjs/zklogin/publickey.js +0 -281
  857. package/dist/cjs/zklogin/signature.js +0 -57
  858. package/dist/cjs/zklogin/utils.js +0 -98
  859. package/dist/esm/graphql/client.js +0 -79
  860. package/dist/esm/graphql/core.js +0 -505
  861. package/dist/esm/graphql/generated/2024.1/tada-env.js +0 -13121
  862. package/dist/esm/graphql/generated/2024.1/tsconfig.tada.js +0 -16
  863. package/dist/esm/graphql/generated/2024.4/tada-env.js +0 -13267
  864. package/dist/esm/graphql/generated/2024.4/tsconfig.tada.js +0 -16
  865. package/dist/esm/graphql/generated/latest/tada-env.js +0 -12905
  866. package/dist/esm/graphql/generated/latest/tsconfig.tada.js +0 -16
  867. package/dist/esm/graphql/generated/queries.js +0 -788
  868. package/dist/esm/graphql/index.js +0 -8
  869. package/dist/esm/graphql/schemas/2024.1/index.js +0 -8
  870. package/dist/esm/graphql/schemas/2024.4/index.js +0 -8
  871. package/dist/esm/graphql/schemas/latest/index.js +0 -8
  872. package/dist/esm/graphql/types.js +0 -0
  873. package/dist/esm/package.json +0 -5
  874. package/dist/esm/w/local/.eslintrc.js +0 -23
  875. package/dist/esm/w/messenger/.eslintrc.js +0 -23
  876. package/dist/esm/zklogin/address.js +0 -78
  877. package/dist/esm/zklogin/bcs.js +0 -21
  878. package/dist/esm/zklogin/index.js +0 -38
  879. package/dist/esm/zklogin/jwt-decode.js +0 -68
  880. package/dist/esm/zklogin/jwt-utils.js +0 -108
  881. package/dist/esm/zklogin/nonce.js +0 -40
  882. package/dist/esm/zklogin/poseidon.js +0 -61
  883. package/dist/esm/zklogin/publickey.js +0 -265
  884. package/dist/esm/zklogin/signature.js +0 -37
  885. package/dist/esm/zklogin/utils.js +0 -78
  886. package/dist/tsconfig.esm.tsbuildinfo +0 -1
  887. 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