wowok 2.1.10 → 2.1.13

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