trac-msb 0.2.8 → 0.2.10

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 (151) hide show
  1. package/.github/workflows/acceptance-tests.yml +7 -11
  2. package/.github/workflows/lint-pr-title.yml +26 -0
  3. package/.github/workflows/unit-tests.yml +2 -8
  4. package/CODE_OF_CONDUCT.md +128 -0
  5. package/README.md +33 -18
  6. package/docker-compose.yml +1 -0
  7. package/docs/trac_network_http_api.openapi.yaml +889 -0
  8. package/msb.mjs +5 -22
  9. package/package.json +14 -10
  10. package/proto/network.proto +74 -0
  11. package/rpc/create_server.js +2 -2
  12. package/rpc/handlers.js +165 -92
  13. package/rpc/routes/v1.js +3 -1
  14. package/rpc/rpc_server.js +4 -4
  15. package/rpc/rpc_services.js +62 -25
  16. package/rpc/utils/helpers.js +83 -52
  17. package/src/config/args.js +46 -0
  18. package/src/config/config.js +78 -5
  19. package/src/config/env.js +70 -3
  20. package/src/core/network/Network.js +34 -70
  21. package/src/core/network/identity/NetworkWalletFactory.js +2 -2
  22. package/src/core/network/protocols/LegacyProtocol.js +67 -0
  23. package/src/core/network/protocols/NetworkMessages.js +48 -0
  24. package/src/core/network/protocols/ProtocolInterface.js +31 -0
  25. package/src/core/network/protocols/ProtocolSession.js +59 -0
  26. package/src/core/network/protocols/V1Protocol.js +64 -0
  27. package/src/core/network/protocols/legacy/NetworkMessageRouter.js +84 -0
  28. package/src/core/network/protocols/legacy/handlers/GetRequestHandler.js +53 -0
  29. package/src/core/network/protocols/legacy/handlers/ResponseHandler.js +37 -0
  30. package/src/core/network/{messaging → protocols/legacy}/validators/base/BaseResponse.js +2 -3
  31. package/src/core/network/protocols/shared/handlers/RoleOperationHandler.js +88 -0
  32. package/src/core/network/protocols/shared/handlers/SubnetworkOperationHandler.js +93 -0
  33. package/src/core/network/{messaging → protocols/shared}/handlers/TransferOperationHandler.js +17 -16
  34. package/src/core/network/{messaging → protocols/shared}/handlers/base/BaseOperationHandler.js +10 -15
  35. package/src/core/network/{messaging → protocols/shared}/validators/PartialBootstrapDeployment.js +2 -2
  36. package/src/core/network/{messaging → protocols/shared}/validators/PartialRoleAccess.js +5 -5
  37. package/src/core/network/{messaging → protocols/shared}/validators/PartialTransaction.js +4 -4
  38. package/src/core/network/{messaging → protocols/shared}/validators/PartialTransfer.js +4 -4
  39. package/src/core/network/{messaging → protocols/shared}/validators/base/PartialOperation.js +14 -12
  40. package/src/core/network/protocols/v1/NetworkMessageRouter.js +15 -0
  41. package/src/core/network/services/ConnectionManager.js +5 -5
  42. package/src/core/network/services/MessageOrchestrator.js +2 -2
  43. package/src/core/network/services/TransactionPoolService.js +5 -6
  44. package/src/core/network/services/TransactionRateLimiterService.js +12 -13
  45. package/src/core/network/services/ValidatorObserverService.js +5 -6
  46. package/src/core/state/State.js +3 -5
  47. package/src/index.js +156 -181
  48. package/src/messages/network/v1/NetworkMessageBuilder.js +325 -0
  49. package/src/messages/network/v1/NetworkMessageDirector.js +137 -0
  50. package/src/messages/network/v1/networkMessageFactory.js +12 -0
  51. package/src/messages/state/ApplyStateMessageBuilder.js +661 -0
  52. package/src/messages/state/ApplyStateMessageDirector.js +516 -0
  53. package/src/messages/state/applyStateMessageFactory.js +12 -0
  54. package/src/utils/buffer.js +53 -1
  55. package/src/utils/check.js +1 -1
  56. package/src/utils/cli.js +0 -8
  57. package/src/utils/constants.js +33 -30
  58. package/src/utils/fileUtils.js +13 -0
  59. package/src/utils/normalizers.js +84 -2
  60. package/src/utils/protobuf/network.cjs +840 -0
  61. package/src/utils/protobuf/operationHelpers.js +10 -0
  62. package/src/utils/type.js +26 -0
  63. package/tests/acceptance/v1/balance/balance.test.mjs +1 -2
  64. package/tests/acceptance/v1/broadcast-transaction/broadcast-transaction.test.mjs +26 -30
  65. package/tests/acceptance/v1/health/health.test.mjs +33 -0
  66. package/tests/acceptance/v1/rpc.test.mjs +4 -3
  67. package/tests/acceptance/v1/tx/tx.test.mjs +27 -16
  68. package/tests/acceptance/v1/tx-details/tx-details.test.mjs +26 -12
  69. package/tests/fixtures/check.fixtures.js +33 -32
  70. package/tests/fixtures/networkV1.fixtures.js +85 -0
  71. package/tests/fixtures/protobuf.fixtures.js +109 -25
  72. package/tests/helpers/StateNetworkFactory.js +2 -2
  73. package/tests/helpers/address.js +6 -0
  74. package/tests/helpers/autobaseTestHelpers.js +2 -1
  75. package/tests/helpers/config.js +2 -1
  76. package/tests/helpers/setupApplyTests.js +59 -56
  77. package/tests/unit/messages/messages.test.js +12 -0
  78. package/tests/unit/messages/network/NetworkMessageBuilder.test.js +276 -0
  79. package/tests/unit/messages/network/NetworkMessageDirector.test.js +201 -0
  80. package/tests/unit/messages/state/applyStateMessageBuilder.complete.test.js +521 -0
  81. package/tests/unit/messages/state/applyStateMessageBuilder.partial.test.js +233 -0
  82. package/tests/unit/network/ConnectionManager.test.js +6 -5
  83. package/tests/unit/network/networkModule.test.js +3 -2
  84. package/tests/unit/state/apply/addAdmin/addAdminHappyPathScenario.js +10 -6
  85. package/tests/unit/state/apply/addAdmin/addAdminScenarioHelpers.js +9 -6
  86. package/tests/unit/state/apply/addAdmin/state.apply.addAdmin.test.js +10 -7
  87. package/tests/unit/state/apply/addIndexer/addIndexerScenarioHelpers.js +18 -21
  88. package/tests/unit/state/apply/addWriter/addWriterScenarioHelpers.js +53 -38
  89. package/tests/unit/state/apply/adminRecovery/adminRecoveryScenarioHelpers.js +46 -35
  90. package/tests/unit/state/apply/appendWhitelist/appendWhitelistScenarioHelpers.js +13 -16
  91. package/tests/unit/state/apply/balanceInitialization/balanceInitializationScenarioHelpers.js +17 -11
  92. package/tests/unit/state/apply/banValidator/banValidatorScenarioHelpers.js +11 -12
  93. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentScenarioHelpers.js +9 -7
  94. package/tests/unit/state/apply/common/commonScenarioHelper.js +15 -14
  95. package/tests/unit/state/apply/common/payload-structure/initializationDisabledScenario.js +9 -4
  96. package/tests/unit/state/apply/disableInitialization/disableInitializationScenarioHelpers.js +17 -11
  97. package/tests/unit/state/apply/removeWriter/removeWriterScenarioHelpers.js +19 -14
  98. package/tests/unit/state/apply/transfer/transferDoubleSpendAcrossValidatorsScenario.js +37 -29
  99. package/tests/unit/state/apply/transfer/transferScenarioHelpers.js +9 -7
  100. package/tests/unit/state/apply/txOperation/txOperationScenarioHelpers.js +11 -9
  101. package/tests/unit/unit.test.js +1 -1
  102. package/tests/unit/utils/buffer/buffer.test.js +62 -1
  103. package/tests/unit/utils/fileUtils/readAddressesFromWhitelistFile.test.js +4 -3
  104. package/tests/unit/utils/fileUtils/readBalanceMigrationFile.test.js +3 -2
  105. package/tests/unit/utils/migrationUtils/validateAddressFromIncomingFile.test.js +3 -2
  106. package/tests/unit/utils/normalizers/normalizers.test.js +469 -0
  107. package/tests/unit/utils/protobuf/operationHelpers.test.js +120 -2
  108. package/tests/unit/utils/type/type.test.js +25 -0
  109. package/tests/unit/utils/utils.test.js +1 -0
  110. package/docs/networking-dualstack-plan.md +0 -75
  111. package/docs/networking-layer-redesign.md +0 -155
  112. package/src/core/network/messaging/NetworkMessages.js +0 -64
  113. package/src/core/network/messaging/handlers/GetRequestHandler.js +0 -113
  114. package/src/core/network/messaging/handlers/ResponseHandler.js +0 -107
  115. package/src/core/network/messaging/handlers/RoleOperationHandler.js +0 -114
  116. package/src/core/network/messaging/handlers/SubnetworkOperationHandler.js +0 -149
  117. package/src/core/network/messaging/routes/NetworkMessageRouter.js +0 -98
  118. package/src/core/network/messaging/validators/AdminResponse.js +0 -58
  119. package/src/core/network/messaging/validators/CustomNodeResponse.js +0 -46
  120. package/src/messages/base/StateBuilder.js +0 -25
  121. package/src/messages/completeStateMessages/CompleteStateMessageBuilder.js +0 -425
  122. package/src/messages/completeStateMessages/CompleteStateMessageDirector.js +0 -252
  123. package/src/messages/completeStateMessages/CompleteStateMessageOperations.js +0 -296
  124. package/src/messages/partialStateMessages/PartialStateMessageBuilder.js +0 -272
  125. package/src/messages/partialStateMessages/PartialStateMessageDirector.js +0 -137
  126. package/src/messages/partialStateMessages/PartialStateMessageOperations.js +0 -138
  127. package/tests/integration/apply/addAdmin/addAdminBasic.test.js +0 -69
  128. package/tests/integration/apply/addAdmin/addAdminRecovery.test.js +0 -126
  129. package/tests/integration/apply/addIndexer.test.js +0 -239
  130. package/tests/integration/apply/addWhitelist.test.js +0 -53
  131. package/tests/integration/apply/addWriter.test.js +0 -245
  132. package/tests/integration/apply/apply.test.js +0 -19
  133. package/tests/integration/apply/banValidator.test.js +0 -116
  134. package/tests/integration/apply/postTx/invalidSubValues.test.js +0 -103
  135. package/tests/integration/apply/postTx/postTx.test.js +0 -196
  136. package/tests/integration/apply/removeIndexer.test.js +0 -132
  137. package/tests/integration/apply/removeWriter.test.js +0 -168
  138. package/tests/integration/apply/transfer.test.js +0 -83
  139. package/tests/integration/integration.test.js +0 -9
  140. package/tests/unit/messageOperations/assembleAddIndexerMessage.test.js +0 -21
  141. package/tests/unit/messageOperations/assembleAddWriterMessage.test.js +0 -17
  142. package/tests/unit/messageOperations/assembleAdminMessage.test.js +0 -68
  143. package/tests/unit/messageOperations/assembleBanWriterMessage.test.js +0 -17
  144. package/tests/unit/messageOperations/assemblePostTransaction.test.js +0 -424
  145. package/tests/unit/messageOperations/assembleRemoveIndexerMessage.test.js +0 -19
  146. package/tests/unit/messageOperations/assembleRemoveWriterMessage.test.js +0 -17
  147. package/tests/unit/messageOperations/assembleWhitelistMessages.test.js +0 -59
  148. package/tests/unit/messageOperations/commonsStateMessageOperationsTest.js +0 -278
  149. package/tests/unit/messageOperations/stateMessageOperations.test.js +0 -19
  150. /package/src/core/network/{messaging → protocols/legacy}/validators/ValidatorResponse.js +0 -0
  151. /package/src/utils/{operations.js → applyOperations.js} +0 -0
@@ -1,278 +0,0 @@
1
- import b4a from 'b4a';
2
- import {OperationType} from "../../src/utils/constants.js";
3
- import {bufferToAddress, isAddressValid} from "../../src/core/state/utils/address.js";
4
- import {errorMessageIncludes} from "../utils/regexHelper.js"
5
- import { config } from '../../helpers/config.js'
6
-
7
- export async function messageOperationsEkoTest(t, fnName, assembler, wallet, writingKey, opType, msgValueLength, expectedMessageAddress) {
8
- console.log('address:', expectedMessageAddress)
9
- t.test(`${fnName} - Happy Path`, async (k) => {
10
- const msg = await assembler(wallet, writingKey);
11
- k.ok(msg, 'Message should be created');
12
- k.is(Object.keys(msg).length, 3, 'Message should have 3 keys');
13
- k.is(Object.keys(msg.eko).length, msgValueLength, `Message value should have ${msgValueLength} keys`);
14
-
15
- k.is(msg.type, opType, `Message type should be ${opType}`);
16
-
17
- if (msg.type === OperationType.ADD_WRITER || msg.type === OperationType.REMOVE_WRITER || msg.type === OperationType.ADD_ADMIN) {
18
- k.ok(b4a.equals(msg.eko.wk, writingKey), 'Message wk should be the writing key');
19
- }
20
-
21
- k.ok(bufferToAddress(msg.address, config.addressPrefix) === expectedMessageAddress, 'Message key should be the the expected one');
22
- k.ok(isAddressValid(msg.address, config.addressPrefix), 'Message address should be a valid address');
23
-
24
- k.is(msg.eko.nonce.length, 32, 'Message nonce should be 32 bytes long');
25
- k.ok(b4a.isBuffer(msg.eko.nonce), 'Message nonce should be a buffer');
26
- k.is(msg.eko.sig.length, 64, 'Message signature should be 64 bytes long');
27
- k.ok(b4a.isBuffer(msg.eko.sig), 'Message signature should be a buffer');
28
- });
29
-
30
- t.test(`${fnName} - Invalid wallet - 'ą' does not belongs to the TRAC bench alphabet`, async (k) => {
31
- const wallet = {
32
- address: 'trac1y6kkq48fgu3urrhg0gm7h8zdyxl3gnaazd2u7568lfl5zxqs285q6kuljką'
33
- }
34
- await k.exception(
35
- async () => await assembler(wallet, writingKey),
36
- errorMessageIncludes('Wallet should have a valid TRAC address')
37
- );
38
- });
39
-
40
- t.test(`${fnName} - Invalid wallet instance - trac address is to short`, async (k) => {
41
- const wallet = {
42
- address: 'trac1y6kkq48fgu3ur'
43
- }
44
- await k.exception(
45
- async () => await assembler(wallet, writingKey),
46
- errorMessageIncludes('Wallet should have a valid TRAC address')
47
- );
48
- });
49
-
50
- t.test(`${fnName} - Invalid wallet instance - invalid prefix`, async (k) => {
51
- const wallet = {
52
- address: 'testnet1y6kkq48fgu3urrhg0gm7h8zdyxl3gnaazd2u7568lfl5zxqs285q6kuljk'
53
- }
54
- await k.exception(
55
- async () => await assembler(wallet, writingKey),
56
- errorMessageIncludes('Wallet should have a valid TRAC address')
57
- );
58
- });
59
-
60
- t.test(`${fnName} - Invalid wallet instance - empty string`, async (k) => {
61
- const wallet = {
62
- address: ''
63
- }
64
- await k.exception(
65
- async () => await assembler(wallet, writingKey),
66
- errorMessageIncludes('Wallet should have a valid TRAC address')
67
- );
68
- });
69
-
70
- t.test(`${fnName} - Invalid wallet instance - null Wallet `, async (k) => {
71
- await k.exception(
72
- async () => await assembler(null, writingKey),
73
- errorMessageIncludes('Wallet must be a valid wallet object')
74
- );
75
- });
76
-
77
- t.test(`${fnName} - Invalid wallet instance - undefined Wallet`, async (k) => {
78
- await k.exception(
79
- async () => await assembler(undefined, writingKey),
80
- errorMessageIncludes('Wallet must be a valid wallet object')
81
- );
82
- });
83
- //
84
- // //TODO: fix - works on node, but not on bare.
85
- //
86
- //
87
- // t.test(`${fnName} - Invalid writing key - not hex`, async (k) => {
88
- // try {
89
- // const invalidHexKey = b4a.from("1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdeg", 'hex');
90
- // await k.exception(
91
- // async () => await assembler(wallet, invalidHexKey),
92
- // errorMessageIncludes('Writer key must be a 32 length buffer')
93
- // );
94
- // } catch (error) {
95
- // k.pass('Invalid hex string was rejected');
96
- // }
97
- // });
98
-
99
-
100
- t.test(`${fnName} - Invalid writing key - invalid length`, async (k) => {
101
- await k.exception(
102
- async () => await assembler(
103
- wallet,
104
- b4a.from("1234567890a", 'hex')
105
- ),
106
- errorMessageIncludes('Writer key must be a 32 length buffer')
107
- );
108
- });
109
-
110
-
111
- t.test(`${fnName} - Invalid writing key - empty buffer`, async (k) => {
112
- await k.exception(
113
- async () => await assembler(
114
- wallet,
115
- b4a.alloc(0)
116
- ),
117
- errorMessageIncludes('Writer key must be a 32 length buffer')
118
- );
119
- });
120
-
121
- t.test(`${fnName} - Null writing key`, async (k) => {
122
- await k.exception(
123
- async () => await assembler(
124
- wallet,
125
- null
126
- ),
127
- errorMessageIncludes('Writer key must be a 32 length buffer')
128
- );
129
- });
130
-
131
-
132
- t.test(`${fnName} - undefined writing key`, async (k) => {
133
- await k.exception(
134
- async () => await assembler(
135
- wallet,
136
- undefined
137
- ),
138
- errorMessageIncludes('Writer key must be a 32 length buffer')
139
- );
140
- });
141
-
142
- }
143
-
144
- export async function messageOperationsBkoTest(t, fnName, assembler, wallet, writingKey, opType, msgValueLength, expectedMessageAddress) {
145
-
146
- t.test(`${fnName} - Happy Path`, async (k) => {
147
- const msg = await assembler(wallet, expectedMessageAddress);
148
-
149
- k.ok(msg, 'Message should be created');
150
- k.is(Object.keys(msg).length, 3, 'Message should have 3 keys');
151
- k.is(Object.keys(msg.bko).length, msgValueLength, `Message value should have ${msgValueLength} keys`);
152
-
153
-
154
- k.is(msg.type, opType, `Message type should be ${opType}`);
155
-
156
- k.ok(bufferToAddress(msg.address, config.addressPrefix) === expectedMessageAddress, 'Message address should be the the expected one');
157
- k.is(msg.bko.nonce.length, 32, 'Message nonce should be 32 bytes long');
158
- k.ok(b4a.isBuffer(msg.bko.nonce), 'Message nonce should be a buffer');
159
- k.is(msg.bko.sig.length, 64, 'Message signature should be 64 bytes long');
160
- k.ok(b4a.isBuffer(msg.bko.sig), 'Message signature should be a buffer');
161
- });
162
-
163
- t.test(`${fnName} - Invalid wallet instance - 'ą' does not belongs to the TRAC bench alphabet`, async (k) => {
164
- const invalidWallet = {
165
- address: 'trac1y6kkq48fgu3urrhg0gm7h8zdyxl3gnaazd2u7568lfl5zxqs285q6kuljką'
166
- }
167
-
168
- await k.exception(
169
- async () => await assembler(invalidWallet, expectedMessageAddress),
170
- errorMessageIncludes('Wallet should have a valid TRAC address')
171
- );
172
- });
173
-
174
- t.test(`${fnName} - Invalid wallet instance - trac address is to short`, async (k) => {
175
- const wallet = {
176
- address: 'trac1y6kkq48fgu3ur'
177
- }
178
- await k.exception(
179
- async () => await assembler(wallet, expectedMessageAddress),
180
- errorMessageIncludes('Wallet should have a valid TRAC address')
181
- );
182
- });
183
-
184
- t.test(`${fnName} - Invalid wallet instance - invalid prefix`, async (k) => {
185
- const wallet = {
186
- address: 'testnet1y6kkq48fgu3urrhg0gm7h8zdyxl3gnaazd2u7568lfl5zxqs285q6kuljk'
187
- }
188
- await k.exception(
189
- async () => await assembler(wallet, expectedMessageAddress),
190
- errorMessageIncludes('Wallet should have a valid TRAC address')
191
- );
192
- });
193
-
194
-
195
- t.test(`${fnName} - Invalid wallet instance - empty string`, async (k) => {
196
- const wallet = {
197
- address: ''
198
- }
199
- await k.exception(
200
- async () => await assembler(wallet, expectedMessageAddress),
201
- errorMessageIncludes('Wallet should have a valid TRAC address')
202
- );
203
- });
204
-
205
- t.test(`${fnName} - Invalid wallet instance - Null Wallet`, async (k) => {
206
- await k.exception(
207
- async () => await assembler(null, expectedMessageAddress),
208
- errorMessageIncludes('Wallet must be a valid wallet object')
209
- );
210
- });
211
-
212
- t.test(`${fnName} - Invalid wallet instance - undefined Wallet`, async (k) => {
213
- await k.exception(
214
- async () => await assembler(undefined, expectedMessageAddress),
215
- errorMessageIncludes('Wallet must be a valid wallet object')
216
- );
217
- });
218
-
219
- t.test(`${fnName} - Address parameter - 'ą' does not belongs to the TRAC bench alphabet`, async (k) => {
220
-
221
- const invalid = 'trac1y6kkq48fgu3urrhg0gm7h8zdyxl3gnaazd2u7568lfl5zxqs285q6kuljką';
222
-
223
- await k.exception(
224
- async () => await assembler(wallet, invalid),
225
- errorMessageIncludes('Address field must be a valid TRAC bech32m address with length 63')
226
- );
227
- });
228
-
229
- t.test(`${fnName} - Address parameter - trac address is to short`, async (k) => {
230
- const invalid = 'trac1y6kkq48fgu3ur';
231
-
232
- await k.exception(
233
- async () => await assembler(wallet, invalid),
234
- errorMessageIncludes('Address field must be a valid TRAC bech32m address with length 63')
235
- );
236
- });
237
-
238
- t.test(`${fnName} - Address parameter - invalid prefix`, async (k) => {
239
- const invalid = 'testnet1y6kkq48fgu3urrhg0gm7h8zdyxl3gnaazd2u7568lfl5zxqs285q6kuljk';
240
-
241
- await k.exception(
242
- async () => await assembler(wallet, invalid),
243
- errorMessageIncludes('Address field must be a valid TRAC bech32m address with length 63')
244
- );
245
- });
246
-
247
-
248
- t.test(`${fnName} - Address parameter - empty string`, async (k) => {
249
- const invalid = '';
250
-
251
- await k.exception(
252
- async () => await assembler(wallet, invalid),
253
- errorMessageIncludes('Address field must be a valid TRAC bech32m address with length 63')
254
- );
255
- });
256
-
257
- t.test(`${fnName} - Address parameter - Null`, async (k) => {
258
-
259
- await k.exception(
260
- async () => await assembler(wallet, null),
261
- errorMessageIncludes('Address field must be a valid TRAC bech32m address with length 63')
262
- );
263
- });
264
-
265
- t.test(`${fnName} - Address parameter - undefined`, async (k) => {
266
- await k.exception(
267
- async () => await assembler(wallet, undefined),
268
- errorMessageIncludes('Address field must be a valid TRAC bech32m address with length 63')
269
- );
270
- });
271
-
272
- t.test(`${fnName} - Address parameter - address is the same as wallet address`, async (k) => {
273
- await k.exception(
274
- async () => await assembler(wallet, wallet.address),
275
- errorMessageIncludes('Address must not be the same as the wallet address for basic operations')
276
- );
277
- });
278
- }
@@ -1,19 +0,0 @@
1
- import { default as test } from 'brittle';
2
-
3
- async function runMsgUtilsTests() {
4
- test.pause();
5
- await import('./assembleAdminMessage.test.js');
6
- await import('./assembleAddWriterMessage.test.js');
7
- await import('./assembleRemoveWriterMessage.test.js');
8
- await import('./assembleAddIndexerMessage.test.js');
9
- await import('./assembleRemoveIndexerMessage.test.js');
10
- await import('./assembleBanWriterMessage.test.js');
11
- await import('./assembleWhitelistMessages.test.js');
12
- await import('./assembleWhitelistMessages.test.js');
13
- await import('./assemblePostTransaction.test.js');
14
-
15
- // TODO: Implement mocked tests for MessageOperations.verifyEventMessage
16
- test.resume();
17
- }
18
-
19
- await runMsgUtilsTests();
File without changes