@fluidframework/map 2.0.0-internal.4.3.1 → 2.0.0-internal.4.4.1
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/CHANGELOG.md +4 -0
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +120 -97
- package/dist/directory.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/lib/directory.d.ts.map +1 -1
- package/lib/directory.js +120 -97
- package/lib/directory.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/package.json +12 -12
- package/src/directory.ts +155 -117
- package/src/packageVersion.ts +1 -1
package/CHANGELOG.md
CHANGED
package/dist/directory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../src/directory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../src/directory.ts"],"names":[],"mappings":"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"}
|
package/dist/directory.js
CHANGED
|
@@ -372,7 +372,11 @@ class SharedDirectory extends shared_object_base_1.SharedObject {
|
|
|
372
372
|
let newSubDir = currentSubDir.getSubDirectory(subdirName);
|
|
373
373
|
if (!newSubDir) {
|
|
374
374
|
const createInfo = subdirObject.ci;
|
|
375
|
-
newSubDir = new SubDirectory(
|
|
375
|
+
newSubDir = new SubDirectory(
|
|
376
|
+
// If csn is -1, then initialize it with 0, otherwise we will never process ops for this
|
|
377
|
+
// sub directory. This could be done at serialization time too, but we need to maintain
|
|
378
|
+
// back compat too and also we will actually know the state when it was serialized.
|
|
379
|
+
createInfo !== undefined && createInfo.csn > -1 ? createInfo.csn : 0, createInfo !== undefined
|
|
376
380
|
? new Set(createInfo.ccIds)
|
|
377
381
|
: new Set(), this, this.runtime, this.serializer, posix.join(currentSubDir.absolutePath, subdirName));
|
|
378
382
|
currentSubDir.populateSubDirectory(subdirName, newSubDir);
|
|
@@ -661,16 +665,12 @@ function isClearLocalOpMetadata(metadata) {
|
|
|
661
665
|
}
|
|
662
666
|
function isSubDirLocalOpMetadata(metadata) {
|
|
663
667
|
return (metadata !== undefined &&
|
|
664
|
-
typeof metadata.pendingMessageId === "number" &&
|
|
665
668
|
(metadata.type === "createSubDir" || metadata.type === "deleteSubDir"));
|
|
666
669
|
}
|
|
667
670
|
function isDirectoryLocalOpMetadata(metadata) {
|
|
668
|
-
return (metadata
|
|
669
|
-
|
|
670
|
-
(metadata
|
|
671
|
-
metadata.type === "deleteSubDir" ||
|
|
672
|
-
(metadata.type === "clear" && typeof metadata.previousStorage === "object") ||
|
|
673
|
-
metadata.type === "createSubDir"));
|
|
671
|
+
return (isKeyEditLocalOpMetadata(metadata) ||
|
|
672
|
+
isClearLocalOpMetadata(metadata) ||
|
|
673
|
+
isSubDirLocalOpMetadata(metadata));
|
|
674
674
|
}
|
|
675
675
|
/* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */
|
|
676
676
|
function assertNonNullClientId(clientId) {
|
|
@@ -715,18 +715,24 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
715
715
|
*/
|
|
716
716
|
this._subdirectories = new Map();
|
|
717
717
|
/**
|
|
718
|
-
* Keys that have been modified locally but not yet ack'd from the server.
|
|
718
|
+
* Keys that have been modified locally but not yet ack'd from the server. This is for operations on keys like
|
|
719
|
+
* set/delete operations on keys. The value of this map is list of pendingMessageIds at which that key
|
|
720
|
+
* was modified. We don't store the type of ops, and behaviour of key ops are different from behaviour of sub
|
|
721
|
+
* directory ops, so we have separate map from subDirectories tracker.
|
|
719
722
|
*/
|
|
720
723
|
this.pendingKeys = new Map();
|
|
721
724
|
/**
|
|
722
|
-
* Subdirectories that have been
|
|
725
|
+
* Subdirectories that have been deleted locally but not yet ack'd from the server. This maintains the record
|
|
726
|
+
* of delete op that are pending or yet to be acked from server. This is maintained just to track the locally
|
|
727
|
+
* deleted sub directory.
|
|
723
728
|
*/
|
|
724
|
-
this.
|
|
729
|
+
this.pendingDeleteSubDirectoriesTracker = new Map();
|
|
725
730
|
/**
|
|
726
|
-
* Subdirectories that have been
|
|
727
|
-
* of
|
|
731
|
+
* Subdirectories that have been created locally but not yet ack'd from the server. This maintains the record
|
|
732
|
+
* of create op that are pending or yet to be acked from server. This is maintained just to track the locally
|
|
733
|
+
* created sub directory.
|
|
728
734
|
*/
|
|
729
|
-
this.
|
|
735
|
+
this.pendingCreateSubDirectoriesTracker = new Map();
|
|
730
736
|
/**
|
|
731
737
|
* This is used to assign a unique id to every outgoing operation and helps in tracking unack'd ops.
|
|
732
738
|
*/
|
|
@@ -893,8 +899,7 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
893
899
|
* @returns - true if there is pending delete.
|
|
894
900
|
*/
|
|
895
901
|
isSubDirectoryDeletePending(subDirName) {
|
|
896
|
-
|
|
897
|
-
if (pendingDeleteSubDirectory !== undefined && pendingDeleteSubDirectory > 0) {
|
|
902
|
+
if (this.pendingDeleteSubDirectoriesTracker.has(subDirName)) {
|
|
898
903
|
return true;
|
|
899
904
|
}
|
|
900
905
|
return false;
|
|
@@ -1134,7 +1139,8 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1134
1139
|
*/
|
|
1135
1140
|
processCreateSubDirectoryMessage(msg, op, local, localOpMetadata) {
|
|
1136
1141
|
this.throwIfDisposed();
|
|
1137
|
-
if (!this.
|
|
1142
|
+
if (!(this.isMessageForCurrentInstanceOfSubDirectory(msg) &&
|
|
1143
|
+
this.needProcessSubDirectoryOperation(msg, op, local, localOpMetadata))) {
|
|
1138
1144
|
return;
|
|
1139
1145
|
}
|
|
1140
1146
|
assertNonNullClientId(msg.clientId);
|
|
@@ -1150,10 +1156,9 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1150
1156
|
this.throwIfDisposed();
|
|
1151
1157
|
// Create the sub directory locally first.
|
|
1152
1158
|
this.createSubDirectoryCore(op.subdirName, true, -1, (_c = this.runtime.clientId) !== null && _c !== void 0 ? _c : "detached");
|
|
1153
|
-
|
|
1159
|
+
this.updatePendingSubDirMessageCount(op);
|
|
1154
1160
|
const localOpMetadata = {
|
|
1155
1161
|
type: "createSubDir",
|
|
1156
|
-
pendingMessageId: newMessageId,
|
|
1157
1162
|
};
|
|
1158
1163
|
return localOpMetadata;
|
|
1159
1164
|
}
|
|
@@ -1182,10 +1187,9 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1182
1187
|
applyStashedDeleteSubDirMessage(op) {
|
|
1183
1188
|
this.throwIfDisposed();
|
|
1184
1189
|
const subDir = this.deleteSubDirectoryCore(op.subdirName, true);
|
|
1185
|
-
|
|
1190
|
+
this.updatePendingSubDirMessageCount(op);
|
|
1186
1191
|
const metadata = {
|
|
1187
1192
|
type: "deleteSubDir",
|
|
1188
|
-
pendingMessageId: newMessageId,
|
|
1189
1193
|
subDirectory: subDir,
|
|
1190
1194
|
};
|
|
1191
1195
|
return metadata;
|
|
@@ -1214,8 +1218,11 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1214
1218
|
(0, common_utils_1.assert)(isClearLocalOpMetadata(localOpMetadata), 0x32b /* Invalid localOpMetadata for clear */);
|
|
1215
1219
|
// We don't reuse the metadata pendingMessageId but send a new one on each submit.
|
|
1216
1220
|
const pendingClearMessageId = this.pendingClearMessageIds.shift();
|
|
1217
|
-
|
|
1218
|
-
|
|
1221
|
+
// Only submit the op, if we have record for it, otherwise it is possible that the older instance
|
|
1222
|
+
// is already deleted, in which case we don't need to submit the op.
|
|
1223
|
+
if (pendingClearMessageId === localOpMetadata.pendingMessageId) {
|
|
1224
|
+
this.submitClearMessage(op, localOpMetadata.previousStorage);
|
|
1225
|
+
}
|
|
1219
1226
|
}
|
|
1220
1227
|
/**
|
|
1221
1228
|
* Get a new pending message id for the op and cache it to track the pending op
|
|
@@ -1253,33 +1260,41 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1253
1260
|
(0, common_utils_1.assert)(isKeyEditLocalOpMetadata(localOpMetadata), 0x32d /* Invalid localOpMetadata in submit */);
|
|
1254
1261
|
// clear the old pending message id
|
|
1255
1262
|
const pendingMessageIds = this.pendingKeys.get(op.key);
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
pendingMessageIds
|
|
1259
|
-
|
|
1260
|
-
|
|
1263
|
+
// Only submit the op, if we have record for it, otherwise it is possible that the older instance
|
|
1264
|
+
// is already deleted, in which case we don't need to submit the op.
|
|
1265
|
+
if (pendingMessageIds !== undefined &&
|
|
1266
|
+
pendingMessageIds[0] === localOpMetadata.pendingMessageId) {
|
|
1267
|
+
pendingMessageIds.shift();
|
|
1268
|
+
if (pendingMessageIds.length === 0) {
|
|
1269
|
+
this.pendingKeys.delete(op.key);
|
|
1270
|
+
}
|
|
1271
|
+
this.submitKeyMessage(op, localOpMetadata.previousValue);
|
|
1261
1272
|
}
|
|
1262
|
-
this.submitKeyMessage(op, localOpMetadata.previousValue);
|
|
1263
1273
|
}
|
|
1264
|
-
|
|
1265
|
-
* Get a new pending message id for the op and cache it to track the pending op
|
|
1266
|
-
*/
|
|
1267
|
-
getSubDirMessageId(op) {
|
|
1274
|
+
incrementPendingSubDirCount(map, subDirName) {
|
|
1268
1275
|
var _c;
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1276
|
+
const count = (_c = map.get(subDirName)) !== null && _c !== void 0 ? _c : 0;
|
|
1277
|
+
map.set(subDirName, count + 1);
|
|
1278
|
+
}
|
|
1279
|
+
decrementPendingSubDirCount(map, subDirName) {
|
|
1280
|
+
var _c;
|
|
1281
|
+
const count = (_c = map.get(subDirName)) !== null && _c !== void 0 ? _c : 0;
|
|
1282
|
+
map.set(subDirName, count - 1);
|
|
1283
|
+
if (count <= 1) {
|
|
1284
|
+
map.delete(subDirName);
|
|
1277
1285
|
}
|
|
1286
|
+
}
|
|
1287
|
+
/**
|
|
1288
|
+
* Update the count for pending create/delete of the sub directory so that it can be validated on receiving op
|
|
1289
|
+
* or while resubmitting the op.
|
|
1290
|
+
*/
|
|
1291
|
+
updatePendingSubDirMessageCount(op) {
|
|
1278
1292
|
if (op.type === "deleteSubDirectory") {
|
|
1279
|
-
|
|
1280
|
-
|
|
1293
|
+
this.incrementPendingSubDirCount(this.pendingDeleteSubDirectoriesTracker, op.subdirName);
|
|
1294
|
+
}
|
|
1295
|
+
else if (op.type === "createSubDirectory") {
|
|
1296
|
+
this.incrementPendingSubDirCount(this.pendingCreateSubDirectoriesTracker, op.subdirName);
|
|
1281
1297
|
}
|
|
1282
|
-
return newMessageId;
|
|
1283
1298
|
}
|
|
1284
1299
|
/**
|
|
1285
1300
|
* Submit a create subdirectory operation.
|
|
@@ -1287,10 +1302,9 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1287
1302
|
*/
|
|
1288
1303
|
submitCreateSubDirectoryMessage(op) {
|
|
1289
1304
|
this.throwIfDisposed();
|
|
1290
|
-
|
|
1305
|
+
this.updatePendingSubDirMessageCount(op);
|
|
1291
1306
|
const localOpMetadata = {
|
|
1292
1307
|
type: "createSubDir",
|
|
1293
|
-
pendingMessageId: newMessageId,
|
|
1294
1308
|
};
|
|
1295
1309
|
this.directory.submitDirectoryMessage(op, localOpMetadata);
|
|
1296
1310
|
}
|
|
@@ -1301,10 +1315,9 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1301
1315
|
*/
|
|
1302
1316
|
submitDeleteSubDirectoryMessage(op, subDir) {
|
|
1303
1317
|
this.throwIfDisposed();
|
|
1304
|
-
|
|
1318
|
+
this.updatePendingSubDirMessageCount(op);
|
|
1305
1319
|
const localOpMetadata = {
|
|
1306
1320
|
type: "deleteSubDir",
|
|
1307
|
-
pendingMessageId: newMessageId,
|
|
1308
1321
|
subDirectory: subDir,
|
|
1309
1322
|
};
|
|
1310
1323
|
this.directory.submitDirectoryMessage(op, localOpMetadata);
|
|
@@ -1317,18 +1330,22 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1317
1330
|
*/
|
|
1318
1331
|
resubmitSubDirectoryMessage(op, localOpMetadata) {
|
|
1319
1332
|
(0, common_utils_1.assert)(isSubDirLocalOpMetadata(localOpMetadata), 0x32f /* Invalid localOpMetadata for sub directory op */);
|
|
1320
|
-
//
|
|
1321
|
-
|
|
1322
|
-
(
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1333
|
+
// Only submit the op, if we have record for it, otherwise it is possible that the older instance
|
|
1334
|
+
// is already deleted, in which case we don't need to submit the op.
|
|
1335
|
+
if (localOpMetadata.type === "createSubDir" &&
|
|
1336
|
+
!this.pendingCreateSubDirectoriesTracker.has(op.subdirName)) {
|
|
1337
|
+
return;
|
|
1338
|
+
}
|
|
1339
|
+
else if (localOpMetadata.type === "deleteSubDir" &&
|
|
1340
|
+
!this.pendingDeleteSubDirectoriesTracker.has(op.subdirName)) {
|
|
1341
|
+
return;
|
|
1327
1342
|
}
|
|
1328
1343
|
if (localOpMetadata.type === "createSubDir") {
|
|
1344
|
+
this.decrementPendingSubDirCount(this.pendingCreateSubDirectoriesTracker, op.subdirName);
|
|
1329
1345
|
this.submitCreateSubDirectoryMessage(op);
|
|
1330
1346
|
}
|
|
1331
1347
|
else {
|
|
1348
|
+
this.decrementPendingSubDirCount(this.pendingDeleteSubDirectoriesTracker, op.subdirName);
|
|
1332
1349
|
this.submitDeleteSubDirectoryMessage(op, localOpMetadata.subDirectory);
|
|
1333
1350
|
}
|
|
1334
1351
|
}
|
|
@@ -1432,7 +1449,7 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1432
1449
|
}
|
|
1433
1450
|
else if (op.type === "createSubDirectory" && localOpMetadata.type === "createSubDir") {
|
|
1434
1451
|
this.deleteSubDirectoryCore(op.subdirName, true);
|
|
1435
|
-
this.
|
|
1452
|
+
this.decrementPendingSubDirCount(this.pendingCreateSubDirectoriesTracker, op.subdirName);
|
|
1436
1453
|
}
|
|
1437
1454
|
else if (op.type === "deleteSubDirectory" && localOpMetadata.type === "deleteSubDir") {
|
|
1438
1455
|
if (localOpMetadata.subDirectory !== undefined) {
|
|
@@ -1441,13 +1458,7 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1441
1458
|
this._subdirectories.set(op.subdirName, localOpMetadata.subDirectory);
|
|
1442
1459
|
this.emit("subDirectoryCreated", op.subdirName, true, this);
|
|
1443
1460
|
}
|
|
1444
|
-
this.
|
|
1445
|
-
const count = this.pendingDeleteSubDirectoriesCount.get(op.subdirName);
|
|
1446
|
-
(0, common_utils_1.assert)(count !== undefined && count > 0, 0x5ab /* should have record for delete op */);
|
|
1447
|
-
this.pendingDeleteSubDirectoriesCount.set(op.subdirName, count - 1);
|
|
1448
|
-
if (count === 1) {
|
|
1449
|
-
this.pendingDeleteSubDirectoriesCount.delete(op.subdirName);
|
|
1450
|
-
}
|
|
1461
|
+
this.decrementPendingSubDirCount(this.pendingDeleteSubDirectoriesTracker, op.subDirName);
|
|
1451
1462
|
}
|
|
1452
1463
|
else {
|
|
1453
1464
|
throw new Error("Unsupported op for rollback");
|
|
@@ -1540,51 +1551,63 @@ class SubDirectory extends common_utils_1.TypedEventEmitter {
|
|
|
1540
1551
|
* @returns True if the operation should be processed, false otherwise
|
|
1541
1552
|
*/
|
|
1542
1553
|
needProcessSubDirectoryOperation(msg, op, local, localOpMetadata) {
|
|
1543
|
-
const pendingSubDirectoryMessageId = this.pendingSubDirectories.get(op.subdirName);
|
|
1544
1554
|
assertNonNullClientId(msg.clientId);
|
|
1545
|
-
|
|
1555
|
+
const pendingDeleteCount = this.pendingDeleteSubDirectoriesTracker.get(op.subdirName);
|
|
1556
|
+
const pendingCreateCount = this.pendingCreateSubDirectoriesTracker.get(op.subdirName);
|
|
1557
|
+
if ((pendingDeleteCount !== undefined && pendingDeleteCount > 0) ||
|
|
1558
|
+
(pendingCreateCount !== undefined && pendingCreateCount > 0)) {
|
|
1546
1559
|
if (local) {
|
|
1547
1560
|
(0, common_utils_1.assert)(isSubDirLocalOpMetadata(localOpMetadata), 0x012 /* pendingMessageId is missing from the local client's operation */);
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
pendingMessageIds.shift();
|
|
1552
|
-
if (pendingMessageIds.length === 0) {
|
|
1553
|
-
this.pendingSubDirectories.delete(op.subdirName);
|
|
1561
|
+
if (localOpMetadata.type === "deleteSubDir") {
|
|
1562
|
+
(0, common_utils_1.assert)(pendingDeleteCount !== undefined && pendingDeleteCount > 0, 0x6c2 /* pendingDeleteCount should exist */);
|
|
1563
|
+
this.decrementPendingSubDirCount(this.pendingDeleteSubDirectoriesTracker, op.subdirName);
|
|
1554
1564
|
}
|
|
1555
|
-
if (
|
|
1556
|
-
|
|
1557
|
-
(
|
|
1558
|
-
this.pendingDeleteSubDirectoriesCount.set(op.subdirName, count - 1);
|
|
1559
|
-
if (count === 1) {
|
|
1560
|
-
this.pendingDeleteSubDirectoriesCount.delete(op.subdirName);
|
|
1561
|
-
}
|
|
1565
|
+
else if (localOpMetadata.type === "createSubDir") {
|
|
1566
|
+
(0, common_utils_1.assert)(pendingCreateCount !== undefined && pendingCreateCount > 0, 0x6c3 /* pendingCreateCount should exist */);
|
|
1567
|
+
this.decrementPendingSubDirCount(this.pendingCreateSubDirectoriesTracker, op.subdirName);
|
|
1562
1568
|
}
|
|
1563
1569
|
}
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
subDirectory
|
|
1570
|
-
//
|
|
1570
|
+
if (op.type === "deleteSubDirectory") {
|
|
1571
|
+
const resetSubDirectoryTree = (directory) => {
|
|
1572
|
+
if (!directory) {
|
|
1573
|
+
return;
|
|
1574
|
+
}
|
|
1575
|
+
// If this is delete op and we have keys in this subDirectory, then we need to delete these
|
|
1576
|
+
// keys except the pending ones as they will be sequenced after this delete.
|
|
1577
|
+
directory.clearExceptPendingKeys(local);
|
|
1578
|
+
// In case of delete op, we need to reset the creation seq number and client ids of
|
|
1571
1579
|
// creators as the previous directory is getting deleted and we will initialize again when
|
|
1572
1580
|
// we will receive op for the create again.
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1581
|
+
directory.sequenceNumber = -1;
|
|
1582
|
+
directory.clientIds.clear();
|
|
1583
|
+
// Do the same thing for the subtree of the directory. If create is not pending for a child, then just
|
|
1584
|
+
// delete it.
|
|
1585
|
+
const subDirectories = directory.subdirectories();
|
|
1586
|
+
for (const [subDirName, subDir] of subDirectories) {
|
|
1587
|
+
if (directory.pendingCreateSubDirectoriesTracker.has(subDirName)) {
|
|
1588
|
+
resetSubDirectoryTree(subDir);
|
|
1589
|
+
continue;
|
|
1590
|
+
}
|
|
1591
|
+
directory.deleteSubDirectoryCore(subDirName, false);
|
|
1592
|
+
}
|
|
1593
|
+
};
|
|
1594
|
+
const subDirectory = this._subdirectories.get(op.subdirName);
|
|
1595
|
+
resetSubDirectoryTree(subDirectory);
|
|
1576
1596
|
}
|
|
1577
1597
|
if (op.type === "createSubDirectory") {
|
|
1578
1598
|
const dir = this._subdirectories.get(op.subdirName);
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
dir.sequenceNumber
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
dir
|
|
1587
|
-
|
|
1599
|
+
// Child sub directory create seq number can't be lower than the parent subdirectory.
|
|
1600
|
+
if (this.sequenceNumber !== -1 && this.sequenceNumber < msg.sequenceNumber) {
|
|
1601
|
+
if ((dir === null || dir === void 0 ? void 0 : dir.sequenceNumber) === -1) {
|
|
1602
|
+
// Only set the seq on the first message, could be more
|
|
1603
|
+
dir.sequenceNumber = msg.sequenceNumber;
|
|
1604
|
+
}
|
|
1605
|
+
// The client created the dir at or after the dirs seq, so list its client id as a creator.
|
|
1606
|
+
if (dir !== undefined &&
|
|
1607
|
+
!dir.clientIds.has(msg.clientId) &&
|
|
1608
|
+
dir.sequenceNumber <= msg.sequenceNumber) {
|
|
1609
|
+
dir.clientIds.add(msg.clientId);
|
|
1610
|
+
}
|
|
1588
1611
|
}
|
|
1589
1612
|
}
|
|
1590
1613
|
return false;
|