@dxos/messaging 0.1.58-next.3349da8 → 0.1.58-next.ffb4cc4
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.
- package/dist/lib/browser/index.mjs +50 -53
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +50 -53
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/package.json +12 -13
- package/src/messenger.ts +1 -2
- package/src/signal-client/signal-client.ts +1 -1
- package/src/signal-manager/memory-signal-manager.ts +2 -5
- package/src/signal-manager/websocket-signal-manager.ts +3 -6
|
@@ -3,11 +3,10 @@ import "@dxos/node-std/globals";
|
|
|
3
3
|
// packages/core/mesh/messaging/src/messenger.ts
|
|
4
4
|
import { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from "@dxos/async";
|
|
5
5
|
import { Context } from "@dxos/context";
|
|
6
|
-
import { TimeoutError as ProtocolTimeoutError } from "@dxos/errors";
|
|
7
6
|
import { invariant } from "@dxos/invariant";
|
|
8
7
|
import { PublicKey } from "@dxos/keys";
|
|
9
8
|
import { log } from "@dxos/log";
|
|
10
|
-
import { schema, trace } from "@dxos/protocols";
|
|
9
|
+
import { TimeoutError as ProtocolTimeoutError, schema, trace } from "@dxos/protocols";
|
|
11
10
|
import { ComplexMap, ComplexSet } from "@dxos/util";
|
|
12
11
|
|
|
13
12
|
// packages/core/mesh/messaging/src/timeouts.ts
|
|
@@ -48,14 +47,14 @@ var Messenger = class {
|
|
|
48
47
|
id: traceId
|
|
49
48
|
}), {
|
|
50
49
|
F: __dxlog_file,
|
|
51
|
-
L:
|
|
50
|
+
L: 74,
|
|
52
51
|
S: this,
|
|
53
52
|
C: (f, a) => f(...a)
|
|
54
53
|
});
|
|
55
54
|
this._ctx = new Context({
|
|
56
55
|
onError: (err) => log.catch(err, void 0, {
|
|
57
56
|
F: __dxlog_file,
|
|
58
|
-
L:
|
|
57
|
+
L: 76,
|
|
59
58
|
S: this,
|
|
60
59
|
C: (f, a) => f(...a)
|
|
61
60
|
})
|
|
@@ -65,7 +64,7 @@ var Messenger = class {
|
|
|
65
64
|
from: message.author
|
|
66
65
|
}, {
|
|
67
66
|
F: __dxlog_file,
|
|
68
|
-
L:
|
|
67
|
+
L: 80,
|
|
69
68
|
S: this,
|
|
70
69
|
C: (f, a) => f(...a)
|
|
71
70
|
});
|
|
@@ -79,7 +78,7 @@ var Messenger = class {
|
|
|
79
78
|
id: traceId
|
|
80
79
|
}), {
|
|
81
80
|
F: __dxlog_file,
|
|
82
|
-
L:
|
|
81
|
+
L: 95,
|
|
83
82
|
S: this,
|
|
84
83
|
C: (f, a) => f(...a)
|
|
85
84
|
});
|
|
@@ -94,7 +93,7 @@ var Messenger = class {
|
|
|
94
93
|
async sendMessage({ author, recipient, payload }) {
|
|
95
94
|
invariant(!this._closed, "Closed", {
|
|
96
95
|
F: __dxlog_file,
|
|
97
|
-
L:
|
|
96
|
+
L: 107,
|
|
98
97
|
S: this,
|
|
99
98
|
A: [
|
|
100
99
|
"!this._closed",
|
|
@@ -108,7 +107,7 @@ var Messenger = class {
|
|
|
108
107
|
};
|
|
109
108
|
invariant(!this._onAckCallbacks.has(reliablePayload.messageId), void 0, {
|
|
110
109
|
F: __dxlog_file,
|
|
111
|
-
L:
|
|
110
|
+
L: 114,
|
|
112
111
|
S: this,
|
|
113
112
|
A: [
|
|
114
113
|
"!this._onAckCallbacks.has(reliablePayload.messageId!)",
|
|
@@ -121,7 +120,7 @@ var Messenger = class {
|
|
|
121
120
|
recipient
|
|
122
121
|
}, {
|
|
123
122
|
F: __dxlog_file,
|
|
124
|
-
L:
|
|
123
|
+
L: 115,
|
|
125
124
|
S: this,
|
|
126
125
|
C: (f, a) => f(...a)
|
|
127
126
|
});
|
|
@@ -136,7 +135,7 @@ var Messenger = class {
|
|
|
136
135
|
messageId: reliablePayload.messageId
|
|
137
136
|
}, {
|
|
138
137
|
F: __dxlog_file,
|
|
139
|
-
L:
|
|
138
|
+
L: 129,
|
|
140
139
|
S: this,
|
|
141
140
|
C: (f, a) => f(...a)
|
|
142
141
|
});
|
|
@@ -148,7 +147,7 @@ var Messenger = class {
|
|
|
148
147
|
err
|
|
149
148
|
}, {
|
|
150
149
|
F: __dxlog_file,
|
|
151
|
-
L:
|
|
150
|
+
L: 131,
|
|
152
151
|
S: this,
|
|
153
152
|
C: (f, a) => f(...a)
|
|
154
153
|
}));
|
|
@@ -158,7 +157,7 @@ var Messenger = class {
|
|
|
158
157
|
messageId: reliablePayload.messageId
|
|
159
158
|
}, {
|
|
160
159
|
F: __dxlog_file,
|
|
161
|
-
L:
|
|
160
|
+
L: 140,
|
|
162
161
|
S: this,
|
|
163
162
|
C: (f, a) => f(...a)
|
|
164
163
|
});
|
|
@@ -182,7 +181,7 @@ var Messenger = class {
|
|
|
182
181
|
async errorLimitCheck() {
|
|
183
182
|
log(`checking error limit ${this._errorCount}`, void 0, {
|
|
184
183
|
F: __dxlog_file,
|
|
185
|
-
L:
|
|
184
|
+
L: 165,
|
|
186
185
|
S: this,
|
|
187
186
|
C: (f, a) => f(...a)
|
|
188
187
|
});
|
|
@@ -197,7 +196,7 @@ var Messenger = class {
|
|
|
197
196
|
this._rebooting = true;
|
|
198
197
|
log("rebooting Messenger/SignalManager", void 0, {
|
|
199
198
|
F: __dxlog_file,
|
|
200
|
-
L:
|
|
199
|
+
L: 177,
|
|
201
200
|
S: this,
|
|
202
201
|
C: (f, a) => f(...a)
|
|
203
202
|
});
|
|
@@ -205,14 +204,14 @@ var Messenger = class {
|
|
|
205
204
|
await this._signalManager.close();
|
|
206
205
|
log("pausing", void 0, {
|
|
207
206
|
F: __dxlog_file,
|
|
208
|
-
L:
|
|
207
|
+
L: 180,
|
|
209
208
|
S: this,
|
|
210
209
|
C: (f, a) => f(...a)
|
|
211
210
|
});
|
|
212
211
|
await new Promise((resolve) => setTimeout(resolve, NETWORK_REBOOT_DELAY));
|
|
213
212
|
log("done pausing", void 0, {
|
|
214
213
|
F: __dxlog_file,
|
|
215
|
-
L:
|
|
214
|
+
L: 182,
|
|
216
215
|
S: this,
|
|
217
216
|
C: (f, a) => f(...a)
|
|
218
217
|
});
|
|
@@ -220,7 +219,7 @@ var Messenger = class {
|
|
|
220
219
|
await this._signalManager.open();
|
|
221
220
|
log("done rebooting", void 0, {
|
|
222
221
|
F: __dxlog_file,
|
|
223
|
-
L:
|
|
222
|
+
L: 185,
|
|
224
223
|
S: this,
|
|
225
224
|
C: (f, a) => f(...a)
|
|
226
225
|
});
|
|
@@ -234,7 +233,7 @@ var Messenger = class {
|
|
|
234
233
|
async listen({ peerId, payloadType, onMessage }) {
|
|
235
234
|
invariant(!this._closed, "Closed", {
|
|
236
235
|
F: __dxlog_file,
|
|
237
|
-
L:
|
|
236
|
+
L: 204,
|
|
238
237
|
S: this,
|
|
239
238
|
A: [
|
|
240
239
|
"!this._closed",
|
|
@@ -298,7 +297,7 @@ var Messenger = class {
|
|
|
298
297
|
async _handleReliablePayload({ author, recipient, payload }) {
|
|
299
298
|
invariant(payload.type_url === "dxos.mesh.messaging.ReliablePayload", void 0, {
|
|
300
299
|
F: __dxlog_file,
|
|
301
|
-
L:
|
|
300
|
+
L: 265,
|
|
302
301
|
S: this,
|
|
303
302
|
A: [
|
|
304
303
|
"payload.type_url === 'dxos.mesh.messaging.ReliablePayload'",
|
|
@@ -312,7 +311,7 @@ var Messenger = class {
|
|
|
312
311
|
messageId: reliablePayload.messageId
|
|
313
312
|
}, {
|
|
314
313
|
F: __dxlog_file,
|
|
315
|
-
L:
|
|
314
|
+
L: 268,
|
|
316
315
|
S: this,
|
|
317
316
|
C: (f, a) => f(...a)
|
|
318
317
|
});
|
|
@@ -334,7 +333,7 @@ var Messenger = class {
|
|
|
334
333
|
async _handleAcknowledgement({ payload }) {
|
|
335
334
|
invariant(payload.type_url === "dxos.mesh.messaging.Acknowledgement", void 0, {
|
|
336
335
|
F: __dxlog_file,
|
|
337
|
-
L:
|
|
336
|
+
L: 290,
|
|
338
337
|
S: this,
|
|
339
338
|
A: [
|
|
340
339
|
"payload.type_url === 'dxos.mesh.messaging.Acknowledgement'",
|
|
@@ -350,7 +349,7 @@ var Messenger = class {
|
|
|
350
349
|
to: author
|
|
351
350
|
}, {
|
|
352
351
|
F: __dxlog_file,
|
|
353
|
-
L:
|
|
352
|
+
L: 303,
|
|
354
353
|
S: this,
|
|
355
354
|
C: (f, a) => f(...a)
|
|
356
355
|
});
|
|
@@ -401,7 +400,7 @@ var Messenger = class {
|
|
|
401
400
|
elapsed
|
|
402
401
|
}, {
|
|
403
402
|
F: __dxlog_file,
|
|
404
|
-
L:
|
|
403
|
+
L: 351,
|
|
405
404
|
S: this,
|
|
406
405
|
C: (f, a) => f(...a)
|
|
407
406
|
});
|
|
@@ -1141,7 +1140,6 @@ var MemorySignalManagerContext = class {
|
|
|
1141
1140
|
}
|
|
1142
1141
|
};
|
|
1143
1142
|
var MemorySignalManager = class {
|
|
1144
|
-
// prettier-ignore
|
|
1145
1143
|
constructor(_context) {
|
|
1146
1144
|
this._context = _context;
|
|
1147
1145
|
this.statusChanged = new Event2();
|
|
@@ -1182,7 +1180,7 @@ var MemorySignalManager = class {
|
|
|
1182
1180
|
async join({ topic, peerId }) {
|
|
1183
1181
|
invariant4(!this._ctx.disposed, "Closed", {
|
|
1184
1182
|
F: __dxlog_file4,
|
|
1185
|
-
L:
|
|
1183
|
+
L: 101,
|
|
1186
1184
|
S: this,
|
|
1187
1185
|
A: [
|
|
1188
1186
|
"!this._ctx.disposed",
|
|
@@ -1223,7 +1221,7 @@ var MemorySignalManager = class {
|
|
|
1223
1221
|
async leave({ topic, peerId }) {
|
|
1224
1222
|
invariant4(!this._ctx.disposed, "Closed", {
|
|
1225
1223
|
F: __dxlog_file4,
|
|
1226
|
-
L:
|
|
1224
|
+
L: 137,
|
|
1227
1225
|
S: this,
|
|
1228
1226
|
A: [
|
|
1229
1227
|
"!this._ctx.disposed",
|
|
@@ -1255,13 +1253,13 @@ var MemorySignalManager = class {
|
|
|
1255
1253
|
...dec(payload)
|
|
1256
1254
|
}, {
|
|
1257
1255
|
F: __dxlog_file4,
|
|
1258
|
-
L:
|
|
1256
|
+
L: 157,
|
|
1259
1257
|
S: this,
|
|
1260
1258
|
C: (f, a) => f(...a)
|
|
1261
1259
|
});
|
|
1262
1260
|
invariant4(recipient, void 0, {
|
|
1263
1261
|
F: __dxlog_file4,
|
|
1264
|
-
L:
|
|
1262
|
+
L: 159,
|
|
1265
1263
|
S: this,
|
|
1266
1264
|
A: [
|
|
1267
1265
|
"recipient",
|
|
@@ -1270,7 +1268,7 @@ var MemorySignalManager = class {
|
|
|
1270
1268
|
});
|
|
1271
1269
|
invariant4(!this._ctx.disposed, "Closed", {
|
|
1272
1270
|
F: __dxlog_file4,
|
|
1273
|
-
L:
|
|
1271
|
+
L: 160,
|
|
1274
1272
|
S: this,
|
|
1275
1273
|
A: [
|
|
1276
1274
|
"!this._ctx.disposed",
|
|
@@ -1285,7 +1283,7 @@ var MemorySignalManager = class {
|
|
|
1285
1283
|
recipient
|
|
1286
1284
|
}, {
|
|
1287
1285
|
F: __dxlog_file4,
|
|
1288
|
-
L:
|
|
1286
|
+
L: 166,
|
|
1289
1287
|
S: this,
|
|
1290
1288
|
C: (f, a) => f(...a)
|
|
1291
1289
|
});
|
|
@@ -1297,7 +1295,7 @@ var MemorySignalManager = class {
|
|
|
1297
1295
|
recipient
|
|
1298
1296
|
}, {
|
|
1299
1297
|
F: __dxlog_file4,
|
|
1300
|
-
L:
|
|
1298
|
+
L: 171,
|
|
1301
1299
|
S: this,
|
|
1302
1300
|
C: (f, a) => f(...a)
|
|
1303
1301
|
});
|
|
@@ -1310,7 +1308,7 @@ var MemorySignalManager = class {
|
|
|
1310
1308
|
recipient
|
|
1311
1309
|
}, {
|
|
1312
1310
|
F: __dxlog_file4,
|
|
1313
|
-
L:
|
|
1311
|
+
L: 179,
|
|
1314
1312
|
S: this,
|
|
1315
1313
|
C: (f, a) => f(...a)
|
|
1316
1314
|
});
|
|
@@ -1322,7 +1320,7 @@ var MemorySignalManager = class {
|
|
|
1322
1320
|
...dec(payload)
|
|
1323
1321
|
}, {
|
|
1324
1322
|
F: __dxlog_file4,
|
|
1325
|
-
L:
|
|
1323
|
+
L: 183,
|
|
1326
1324
|
S: this,
|
|
1327
1325
|
C: (f, a) => f(...a)
|
|
1328
1326
|
});
|
|
@@ -1336,7 +1334,7 @@ var MemorySignalManager = class {
|
|
|
1336
1334
|
err
|
|
1337
1335
|
}, {
|
|
1338
1336
|
F: __dxlog_file4,
|
|
1339
|
-
L:
|
|
1337
|
+
L: 188,
|
|
1340
1338
|
S: this,
|
|
1341
1339
|
C: (f, a) => f(...a)
|
|
1342
1340
|
});
|
|
@@ -1347,7 +1345,7 @@ var MemorySignalManager = class {
|
|
|
1347
1345
|
peerId
|
|
1348
1346
|
}, {
|
|
1349
1347
|
F: __dxlog_file4,
|
|
1350
|
-
L:
|
|
1348
|
+
L: 193,
|
|
1351
1349
|
S: this,
|
|
1352
1350
|
C: (f, a) => f(...a)
|
|
1353
1351
|
});
|
|
@@ -1358,7 +1356,7 @@ var MemorySignalManager = class {
|
|
|
1358
1356
|
peerId
|
|
1359
1357
|
}, {
|
|
1360
1358
|
F: __dxlog_file4,
|
|
1361
|
-
L:
|
|
1359
|
+
L: 198,
|
|
1362
1360
|
S: this,
|
|
1363
1361
|
C: (f, a) => f(...a)
|
|
1364
1362
|
});
|
|
@@ -1404,7 +1402,6 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1404
1402
|
}
|
|
1405
1403
|
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
|
|
1406
1404
|
var WebsocketSignalManager = class {
|
|
1407
|
-
// prettier-ignore
|
|
1408
1405
|
constructor(_hosts) {
|
|
1409
1406
|
this._hosts = _hosts;
|
|
1410
1407
|
this._servers = /* @__PURE__ */ new Map();
|
|
@@ -1418,7 +1415,7 @@ var WebsocketSignalManager = class {
|
|
|
1418
1415
|
hosts: this._hosts
|
|
1419
1416
|
}, {
|
|
1420
1417
|
F: __dxlog_file5,
|
|
1421
|
-
L:
|
|
1418
|
+
L: 43,
|
|
1422
1419
|
S: this,
|
|
1423
1420
|
C: (f, a) => f(...a)
|
|
1424
1421
|
});
|
|
@@ -1440,7 +1437,7 @@ var WebsocketSignalManager = class {
|
|
|
1440
1437
|
hosts: this._hosts
|
|
1441
1438
|
}, {
|
|
1442
1439
|
F: __dxlog_file5,
|
|
1443
|
-
L:
|
|
1440
|
+
L: 65,
|
|
1444
1441
|
S: this,
|
|
1445
1442
|
C: (f, a) => f(...a)
|
|
1446
1443
|
});
|
|
@@ -1448,7 +1445,7 @@ var WebsocketSignalManager = class {
|
|
|
1448
1445
|
id: this._instanceId
|
|
1449
1446
|
}), {
|
|
1450
1447
|
F: __dxlog_file5,
|
|
1451
|
-
L:
|
|
1448
|
+
L: 66,
|
|
1452
1449
|
S: this,
|
|
1453
1450
|
C: (f, a) => f(...a)
|
|
1454
1451
|
});
|
|
@@ -1461,7 +1458,7 @@ var WebsocketSignalManager = class {
|
|
|
1461
1458
|
id: this._instanceId
|
|
1462
1459
|
}), {
|
|
1463
1460
|
F: __dxlog_file5,
|
|
1464
|
-
L:
|
|
1461
|
+
L: 73,
|
|
1465
1462
|
S: this,
|
|
1466
1463
|
C: (f, a) => f(...a)
|
|
1467
1464
|
});
|
|
@@ -1483,13 +1480,13 @@ var WebsocketSignalManager = class {
|
|
|
1483
1480
|
peerId
|
|
1484
1481
|
}, {
|
|
1485
1482
|
F: __dxlog_file5,
|
|
1486
|
-
L:
|
|
1483
|
+
L: 93,
|
|
1487
1484
|
S: this,
|
|
1488
1485
|
C: (f, a) => f(...a)
|
|
1489
1486
|
});
|
|
1490
1487
|
invariant5(this._opened, "Closed", {
|
|
1491
1488
|
F: __dxlog_file5,
|
|
1492
|
-
L:
|
|
1489
|
+
L: 94,
|
|
1493
1490
|
S: this,
|
|
1494
1491
|
A: [
|
|
1495
1492
|
"this._opened",
|
|
@@ -1507,13 +1504,13 @@ var WebsocketSignalManager = class {
|
|
|
1507
1504
|
peerId
|
|
1508
1505
|
}, {
|
|
1509
1506
|
F: __dxlog_file5,
|
|
1510
|
-
L:
|
|
1507
|
+
L: 100,
|
|
1511
1508
|
S: this,
|
|
1512
1509
|
C: (f, a) => f(...a)
|
|
1513
1510
|
});
|
|
1514
1511
|
invariant5(this._opened, "Closed", {
|
|
1515
1512
|
F: __dxlog_file5,
|
|
1516
|
-
L:
|
|
1513
|
+
L: 101,
|
|
1517
1514
|
S: this,
|
|
1518
1515
|
A: [
|
|
1519
1516
|
"this._opened",
|
|
@@ -1528,13 +1525,13 @@ var WebsocketSignalManager = class {
|
|
|
1528
1525
|
async sendMessage({ author, recipient, payload }) {
|
|
1529
1526
|
log5(`Signal ${recipient}`, void 0, {
|
|
1530
1527
|
F: __dxlog_file5,
|
|
1531
|
-
L:
|
|
1528
|
+
L: 115,
|
|
1532
1529
|
S: this,
|
|
1533
1530
|
C: (f, a) => f(...a)
|
|
1534
1531
|
});
|
|
1535
1532
|
invariant5(this._opened, "Closed", {
|
|
1536
1533
|
F: __dxlog_file5,
|
|
1537
|
-
L:
|
|
1534
|
+
L: 116,
|
|
1538
1535
|
S: this,
|
|
1539
1536
|
A: [
|
|
1540
1537
|
"this._opened",
|
|
@@ -1548,7 +1545,7 @@ var WebsocketSignalManager = class {
|
|
|
1548
1545
|
payload
|
|
1549
1546
|
}).catch((err) => log5(err, void 0, {
|
|
1550
1547
|
F: __dxlog_file5,
|
|
1551
|
-
L:
|
|
1548
|
+
L: 119,
|
|
1552
1549
|
S: this,
|
|
1553
1550
|
C: (f, a) => f(...a)
|
|
1554
1551
|
}));
|
|
@@ -1557,13 +1554,13 @@ var WebsocketSignalManager = class {
|
|
|
1557
1554
|
async subscribeMessages(peerId) {
|
|
1558
1555
|
log5(`Subscribed for message stream peerId=${peerId}`, void 0, {
|
|
1559
1556
|
F: __dxlog_file5,
|
|
1560
|
-
L:
|
|
1557
|
+
L: 124,
|
|
1561
1558
|
S: this,
|
|
1562
1559
|
C: (f, a) => f(...a)
|
|
1563
1560
|
});
|
|
1564
1561
|
invariant5(this._opened, "Closed", {
|
|
1565
1562
|
F: __dxlog_file5,
|
|
1566
|
-
L:
|
|
1563
|
+
L: 125,
|
|
1567
1564
|
S: this,
|
|
1568
1565
|
A: [
|
|
1569
1566
|
"this._opened",
|
|
@@ -1575,13 +1572,13 @@ var WebsocketSignalManager = class {
|
|
|
1575
1572
|
async unsubscribeMessages(peerId) {
|
|
1576
1573
|
log5(`Subscribed for message stream peerId=${peerId}`, void 0, {
|
|
1577
1574
|
F: __dxlog_file5,
|
|
1578
|
-
L:
|
|
1575
|
+
L: 131,
|
|
1579
1576
|
S: this,
|
|
1580
1577
|
C: (f, a) => f(...a)
|
|
1581
1578
|
});
|
|
1582
1579
|
invariant5(this._opened, "Closed", {
|
|
1583
1580
|
F: __dxlog_file5,
|
|
1584
|
-
L:
|
|
1581
|
+
L: 132,
|
|
1585
1582
|
S: this,
|
|
1586
1583
|
A: [
|
|
1587
1584
|
"this._opened",
|
|
@@ -1594,7 +1591,7 @@ var WebsocketSignalManager = class {
|
|
|
1594
1591
|
this._ctx = new Context4({
|
|
1595
1592
|
onError: (err) => log5.catch(err, void 0, {
|
|
1596
1593
|
F: __dxlog_file5,
|
|
1597
|
-
L:
|
|
1594
|
+
L: 139,
|
|
1598
1595
|
S: this,
|
|
1599
1596
|
C: (f, a) => f(...a)
|
|
1600
1597
|
})
|