@fluidframework/map 0.59.4001 → 1.1.0-75972

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 (45) hide show
  1. package/.eslintrc.js +1 -1
  2. package/dist/directory.d.ts +3 -2
  3. package/dist/directory.d.ts.map +1 -1
  4. package/dist/directory.js +63 -62
  5. package/dist/directory.js.map +1 -1
  6. package/dist/interfaces.d.ts +13 -14
  7. package/dist/interfaces.d.ts.map +1 -1
  8. package/dist/interfaces.js.map +1 -1
  9. package/dist/map.d.ts +7 -2
  10. package/dist/map.d.ts.map +1 -1
  11. package/dist/map.js +9 -2
  12. package/dist/map.js.map +1 -1
  13. package/dist/mapKernel.d.ts +20 -11
  14. package/dist/mapKernel.d.ts.map +1 -1
  15. package/dist/mapKernel.js +160 -82
  16. package/dist/mapKernel.js.map +1 -1
  17. package/dist/packageVersion.d.ts +1 -1
  18. package/dist/packageVersion.d.ts.map +1 -1
  19. package/dist/packageVersion.js +1 -1
  20. package/dist/packageVersion.js.map +1 -1
  21. package/lib/directory.d.ts +3 -2
  22. package/lib/directory.d.ts.map +1 -1
  23. package/lib/directory.js +63 -62
  24. package/lib/directory.js.map +1 -1
  25. package/lib/interfaces.d.ts +13 -14
  26. package/lib/interfaces.d.ts.map +1 -1
  27. package/lib/interfaces.js.map +1 -1
  28. package/lib/map.d.ts +7 -2
  29. package/lib/map.d.ts.map +1 -1
  30. package/lib/map.js +9 -2
  31. package/lib/map.js.map +1 -1
  32. package/lib/mapKernel.d.ts +20 -11
  33. package/lib/mapKernel.d.ts.map +1 -1
  34. package/lib/mapKernel.js +160 -82
  35. package/lib/mapKernel.js.map +1 -1
  36. package/lib/packageVersion.d.ts +1 -1
  37. package/lib/packageVersion.d.ts.map +1 -1
  38. package/lib/packageVersion.js +1 -1
  39. package/lib/packageVersion.js.map +1 -1
  40. package/package.json +15 -28
  41. package/src/directory.ts +77 -69
  42. package/src/interfaces.ts +14 -16
  43. package/src/map.ts +14 -3
  44. package/src/mapKernel.ts +195 -90
  45. package/src/packageVersion.ts +1 -1
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/map";
8
- export const pkgVersion = "0.59.4001";
8
+ export const pkgVersion = "1.1.0-75972";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,qBAAqB,CAAC;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/map\";\nexport const pkgVersion = \"0.59.4001\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,qBAAqB,CAAC;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/map\";\nexport const pkgVersion = \"1.1.0-75972\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/map",
3
- "version": "0.59.4001",
3
+ "version": "1.1.0-75972",
4
4
  "description": "Distributed map",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -62,45 +62,32 @@
62
62
  "dependencies": {
63
63
  "@fluidframework/common-definitions": "^0.20.1",
64
64
  "@fluidframework/common-utils": "^0.32.1",
65
- "@fluidframework/container-utils": "^0.59.4001",
66
- "@fluidframework/core-interfaces": "^0.43.1000",
67
- "@fluidframework/datastore-definitions": "^0.59.4001",
68
- "@fluidframework/driver-utils": "^0.59.4001",
65
+ "@fluidframework/container-utils": "1.1.0-75972",
66
+ "@fluidframework/core-interfaces": "1.1.0-75972",
67
+ "@fluidframework/datastore-definitions": "1.1.0-75972",
68
+ "@fluidframework/driver-utils": "1.1.0-75972",
69
69
  "@fluidframework/protocol-definitions": "^0.1028.2000",
70
- "@fluidframework/runtime-definitions": "^0.59.4001",
71
- "@fluidframework/runtime-utils": "^0.59.4001",
72
- "@fluidframework/shared-object-base": "^0.59.4001",
70
+ "@fluidframework/runtime-definitions": "1.1.0-75972",
71
+ "@fluidframework/runtime-utils": "1.1.0-75972",
72
+ "@fluidframework/shared-object-base": "1.1.0-75972",
73
73
  "path-browserify": "^1.0.1"
74
74
  },
75
75
  "devDependencies": {
76
- "@fluid-internal/test-dds-utils": "^0.59.4001",
77
- "@fluidframework/build-common": "^0.23.0",
78
- "@fluidframework/build-tools": "^0.2.70857",
76
+ "@fluid-internal/test-dds-utils": "1.1.0-75972",
77
+ "@fluidframework/build-common": "^0.24.0-0",
78
+ "@fluidframework/build-tools": "^0.2.71273",
79
79
  "@fluidframework/eslint-config-fluid": "^0.28.2000",
80
- "@fluidframework/map-previous": "npm:@fluidframework/map@0.59.4000",
81
- "@fluidframework/mocha-test-setup": "^0.59.4001",
82
- "@fluidframework/test-runtime-utils": "^0.59.4001",
80
+ "@fluidframework/map-previous": "npm:@fluidframework/map@^1.0.0",
81
+ "@fluidframework/mocha-test-setup": "1.1.0-75972",
82
+ "@fluidframework/test-runtime-utils": "1.1.0-75972",
83
83
  "@microsoft/api-extractor": "^7.22.2",
84
84
  "@rushstack/eslint-config": "^2.5.1",
85
85
  "@types/mocha": "^9.1.1",
86
86
  "@types/node": "^14.18.0",
87
- "@typescript-eslint/eslint-plugin": "~5.9.0",
88
- "@typescript-eslint/parser": "~5.9.0",
89
87
  "concurrently": "^6.2.0",
90
88
  "copyfiles": "^2.1.0",
91
89
  "cross-env": "^7.0.2",
92
90
  "eslint": "~8.6.0",
93
- "eslint-plugin-editorconfig": "~3.2.0",
94
- "eslint-plugin-eslint-comments": "~3.2.0",
95
- "eslint-plugin-import": "~2.25.4",
96
- "eslint-plugin-jest": "~26.1.3",
97
- "eslint-plugin-jsdoc": "~39.3.0",
98
- "eslint-plugin-mocha": "~10.0.3",
99
- "eslint-plugin-promise": "~6.0.0",
100
- "eslint-plugin-react": "~7.28.0",
101
- "eslint-plugin-tsdoc": "~0.2.14",
102
- "eslint-plugin-unicorn": "~40.0.0",
103
- "eslint-plugin-unused-imports": "~2.0.0",
104
91
  "mocha": "^10.0.0",
105
92
  "nyc": "^15.0.0",
106
93
  "rimraf": "^2.6.2",
@@ -108,7 +95,7 @@
108
95
  "typescript-formatter": "7.1.0"
109
96
  },
110
97
  "typeValidation": {
111
- "version": "0.59.4001",
98
+ "version": "1.1.0",
112
99
  "broken": {}
113
100
  }
114
101
  }
package/src/directory.ts CHANGED
@@ -17,7 +17,7 @@ import {
17
17
  IChannelServices,
18
18
  IChannelFactory,
19
19
  } from "@fluidframework/datastore-definitions";
20
- import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
20
+ import { ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
21
21
  import { IFluidSerializer, SharedObject, ValueType } from "@fluidframework/shared-object-base";
22
22
  import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
23
23
  import * as path from "path-browserify";
@@ -204,67 +204,6 @@ export interface IDirectoryNewStorageFormat {
204
204
  content: IDirectoryDataObject;
205
205
  }
206
206
 
207
- function serializeDirectory(root: SubDirectory, serializer: IFluidSerializer): ISummaryTreeWithStats {
208
- const MinValueSizeSeparateSnapshotBlob = 8 * 1024;
209
-
210
- const builder = new SummaryTreeBuilder();
211
- let counter = 0;
212
- const blobs: string[] = [];
213
-
214
- const stack: [SubDirectory, IDirectoryDataObject][] = [];
215
- const content: IDirectoryDataObject = {};
216
- stack.push([root, content]);
217
-
218
- while (stack.length > 0) {
219
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
220
- const [currentSubDir, currentSubDirObject] = stack.pop()!;
221
- for (const [key, value] of currentSubDir.getSerializedStorage(serializer)) {
222
- if (!currentSubDirObject.storage) {
223
- currentSubDirObject.storage = {};
224
- }
225
- const result: ISerializableValue = {
226
- type: value.type,
227
- value: value.value && JSON.parse(value.value) as object,
228
- };
229
- if (value.value && value.value.length >= MinValueSizeSeparateSnapshotBlob) {
230
- const extraContent: IDirectoryDataObject = {};
231
- let largeContent = extraContent;
232
- if (currentSubDir.absolutePath !== posix.sep) {
233
- for (const dir of currentSubDir.absolutePath.substr(1).split(posix.sep)) {
234
- const subDataObject: IDirectoryDataObject = {};
235
- largeContent.subdirectories = { [dir]: subDataObject };
236
- largeContent = subDataObject;
237
- }
238
- }
239
- largeContent.storage = { [key]: result };
240
- const blobName = `blob${counter}`;
241
- counter++;
242
- blobs.push(blobName);
243
- builder.addBlob(blobName, JSON.stringify(extraContent));
244
- } else {
245
- currentSubDirObject.storage[key] = result;
246
- }
247
- }
248
-
249
- for (const [subdirName, subdir] of currentSubDir.subdirectories()) {
250
- if (!currentSubDirObject.subdirectories) {
251
- currentSubDirObject.subdirectories = {};
252
- }
253
- const subDataObject: IDirectoryDataObject = {};
254
- currentSubDirObject.subdirectories[subdirName] = subDataObject;
255
- stack.push([subdir as SubDirectory, subDataObject]);
256
- }
257
- }
258
-
259
- const newFormat: IDirectoryNewStorageFormat = {
260
- blobs,
261
- content,
262
- };
263
- builder.addBlob(snapshotFileName, JSON.stringify(newFormat));
264
-
265
- return builder.getSummaryTree();
266
- }
267
-
268
207
  /**
269
208
  * The factory that defines the directory.
270
209
  * @sealed
@@ -397,7 +336,7 @@ export class SharedDirectory extends SharedObject<ISharedDirectoryEvents> implem
397
336
  runtime: IFluidDataStoreRuntime,
398
337
  attributes: IChannelAttributes,
399
338
  ) {
400
- super(id, runtime, attributes);
339
+ super(id, runtime, attributes, "fluid_directory_");
401
340
  this.localValueMaker = new LocalValueMaker(this.serializer);
402
341
  this.setMessageHandlers();
403
342
  // Mirror the containedValueChanged op on the SharedDirectory
@@ -582,8 +521,11 @@ export class SharedDirectory extends SharedObject<ISharedDirectoryEvents> implem
582
521
  * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
583
522
  * @internal
584
523
  */
585
- protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {
586
- return serializeDirectory(this.root, serializer);
524
+ protected summarizeCore(
525
+ serializer: IFluidSerializer,
526
+ telemetryContext?: ITelemetryContext,
527
+ ): ISummaryTreeWithStats {
528
+ return this.serializeDirectory(this.root, serializer);
587
529
  }
588
530
 
589
531
  /**
@@ -822,6 +764,72 @@ export class SharedDirectory extends SharedObject<ISharedDirectoryEvents> implem
822
764
  protected applyStashedOp() {
823
765
  throw new Error("not implemented");
824
766
  }
767
+
768
+ private serializeDirectory(
769
+ root: SubDirectory,
770
+ serializer: IFluidSerializer,
771
+ telemetryContext?: ITelemetryContext,
772
+ ): ISummaryTreeWithStats {
773
+ const MinValueSizeSeparateSnapshotBlob = 8 * 1024;
774
+
775
+ const builder = new SummaryTreeBuilder();
776
+ let counter = 0;
777
+ const blobs: string[] = [];
778
+
779
+ const stack: [SubDirectory, IDirectoryDataObject][] = [];
780
+ const content: IDirectoryDataObject = {};
781
+ stack.push([root, content]);
782
+
783
+ while (stack.length > 0) {
784
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
785
+ const [currentSubDir, currentSubDirObject] = stack.pop()!;
786
+ for (const [key, value] of currentSubDir.getSerializedStorage(serializer)) {
787
+ if (!currentSubDirObject.storage) {
788
+ currentSubDirObject.storage = {};
789
+ }
790
+ const result: ISerializableValue = {
791
+ type: value.type,
792
+ // eslint-disable-next-line @typescript-eslint/ban-types
793
+ value: value.value && JSON.parse(value.value) as object,
794
+ };
795
+ if (value.value && value.value.length >= MinValueSizeSeparateSnapshotBlob) {
796
+ const extraContent: IDirectoryDataObject = {};
797
+ let largeContent = extraContent;
798
+ if (currentSubDir.absolutePath !== posix.sep) {
799
+ for (const dir of currentSubDir.absolutePath.substr(1).split(posix.sep)) {
800
+ const subDataObject: IDirectoryDataObject = {};
801
+ largeContent.subdirectories = { [dir]: subDataObject };
802
+ largeContent = subDataObject;
803
+ }
804
+ }
805
+ largeContent.storage = { [key]: result };
806
+ const blobName = `blob${counter}`;
807
+ counter++;
808
+ blobs.push(blobName);
809
+ builder.addBlob(blobName, JSON.stringify(extraContent));
810
+ } else {
811
+ currentSubDirObject.storage[key] = result;
812
+ }
813
+ }
814
+
815
+ for (const [subdirName, subdir] of currentSubDir.subdirectories()) {
816
+ if (!currentSubDirObject.subdirectories) {
817
+ currentSubDirObject.subdirectories = {};
818
+ }
819
+ const subDataObject: IDirectoryDataObject = {};
820
+ currentSubDirObject.subdirectories[subdirName] = subDataObject;
821
+ stack.push([subdir as SubDirectory, subDataObject]);
822
+ }
823
+ }
824
+
825
+ const newFormat: IDirectoryNewStorageFormat = {
826
+ blobs,
827
+ content,
828
+ };
829
+ builder.addBlob(snapshotFileName, JSON.stringify(newFormat));
830
+
831
+ return builder.getSummaryTree();
832
+ }
825
833
  }
826
834
 
827
835
  /**
@@ -1421,14 +1429,14 @@ class SubDirectory extends TypedEventEmitter<IDirectoryEvents> implements IDirec
1421
1429
  return false;
1422
1430
  }
1423
1431
 
1424
- if (this.pendingKeys.has(op.key)) {
1432
+ const pendingKeyMessageId = this.pendingKeys.get(op.key);
1433
+ if (pendingKeyMessageId !== undefined) {
1425
1434
  // Found an NACK op, clear it from the directory if the latest sequence number in the directory
1426
1435
  // match the message's and don't process the op.
1427
1436
  if (local) {
1428
1437
  assert(localOpMetadata !== undefined,
1429
1438
  0x011 /* pendingMessageId is missing from the local client's operation */);
1430
1439
  const pendingMessageId = localOpMetadata as number;
1431
- const pendingKeyMessageId = this.pendingKeys.get(op.key);
1432
1440
  if (pendingKeyMessageId === pendingMessageId) {
1433
1441
  this.pendingKeys.delete(op.key);
1434
1442
  }
@@ -1455,12 +1463,12 @@ class SubDirectory extends TypedEventEmitter<IDirectoryEvents> implements IDirec
1455
1463
  local: boolean,
1456
1464
  localOpMetadata: unknown,
1457
1465
  ): boolean {
1458
- if (this.pendingSubDirectories.has(op.subdirName)) {
1466
+ const pendingSubDirectoryMessageId = this.pendingSubDirectories.get(op.subdirName);
1467
+ if (pendingSubDirectoryMessageId !== undefined) {
1459
1468
  if (local) {
1460
1469
  assert(localOpMetadata !== undefined,
1461
1470
  0x012 /* pendingMessageId is missing from the local client's operation */);
1462
1471
  const pendingMessageId = localOpMetadata as number;
1463
- const pendingSubDirectoryMessageId = this.pendingSubDirectories.get(op.subdirName);
1464
1472
  if (pendingSubDirectoryMessageId === pendingMessageId) {
1465
1473
  this.pendingSubDirectories.delete(op.subdirName);
1466
1474
  }
package/src/interfaces.ts CHANGED
@@ -144,9 +144,10 @@ export interface IDirectory extends Map<string, any>, IEventProvider<IDirectoryE
144
144
  * ```typescript
145
145
  * (path: string, local: boolean, target: IEventThisPlaceHolder) => void
146
146
  * ```
147
- * - `path` - The relative path to the key that is created.It is relative from the object which raises the event.
147
+ * - `path` - The relative path to the subdirectory that is created.
148
+ * It is relative from the object which raises the event.
148
149
  *
149
- * - `local` - Whether the clear originated from the this client.
150
+ * - `local` - Whether the create originated from the this client.
150
151
  *
151
152
  * - `target` - The ISharedDirectory itself.
152
153
  *
@@ -159,9 +160,10 @@ export interface IDirectory extends Map<string, any>, IEventProvider<IDirectoryE
159
160
  * ```typescript
160
161
  * (path: string, local: boolean, target: IEventThisPlaceHolder) => void
161
162
  * ```
162
- * - `path` - The relative path to the key that is deleted.It is relative from the object which raises the event.
163
+ * - `path` - The relative path to the subdirectory that is deleted.
164
+ * It is relative from the object which raises the event.
163
165
  *
164
- * - `local` - Whether the clear originated from the this client.
166
+ * - `local` - Whether the delete originated from the this client.
165
167
  *
166
168
  * - `target` - The ISharedDirectory itself.
167
169
  */
@@ -216,9 +218,10 @@ export interface ISharedDirectoryEvents extends ISharedObjectEvents {
216
218
  * ```typescript
217
219
  * (path: string, local: boolean, target: IEventThisPlaceHolder) => void
218
220
  * ```
219
- * - `path` - The relative path to the key that is created. It is relative from the object which raises the event.
221
+ * - `path` - The relative path to the subdirectory that is created.
222
+ * It is relative from the object which raises the event.
220
223
  *
221
- * - `local` - Whether the clear originated from the this client.
224
+ * - `local` - Whether the creation originated from the this client.
222
225
  *
223
226
  * - `target` - The ISharedDirectory itself.
224
227
  *
@@ -231,9 +234,10 @@ export interface ISharedDirectoryEvents extends ISharedObjectEvents {
231
234
  * ```typescript
232
235
  * (path: string, local: boolean, target: IEventThisPlaceHolder) => void
233
236
  * ```
234
- * - `path` - The relative path to the key that is deleted. It is relative from the object which raises the event.
237
+ * - `path` - The relative path to the subdirectory that is deleted.
238
+ * It is relative from the object which raises the event.
235
239
  *
236
- * - `local` - Whether the clear originated from the this client.
240
+ * - `local` - Whether the delete originated from the this client.
237
241
  *
238
242
  * - `target` - The ISharedDirectory itself.
239
243
  *
@@ -306,7 +310,6 @@ export interface IDirectoryValueChanged extends IValueChanged {
306
310
  * (
307
311
  * changed: IValueChanged,
308
312
  * local: boolean,
309
- * op: ISequencedDocumentMessage | null,
310
313
  * target: IEventThisPlaceHolder,
311
314
  * ) => void
312
315
  * ```
@@ -314,8 +317,6 @@ export interface IDirectoryValueChanged extends IValueChanged {
314
317
  *
315
318
  * - `local` - Whether the change originated from the this client.
316
319
  *
317
- * - `op` - The op that caused the change in value.
318
- *
319
320
  * - `target` - The map itself.
320
321
  *
321
322
  * ### "clear"
@@ -325,12 +326,10 @@ export interface IDirectoryValueChanged extends IValueChanged {
325
326
  * #### Listener signature
326
327
  *
327
328
  * ```typescript
328
- * (local: boolean, op: ISequencedDocumentMessage | null, target: IEventThisPlaceHolder) => void
329
+ * (local: boolean, target: IEventThisPlaceHolder) => void
329
330
  * ```
330
331
  * - `local` - Whether the clear originated from the this client.
331
332
  *
332
- * - `op` - The op that caused the clear.
333
- *
334
333
  * - `target` - The map itself.
335
334
  */
336
335
  export interface ISharedMapEvents extends ISharedObjectEvents {
@@ -340,8 +339,7 @@ export interface ISharedMapEvents extends ISharedObjectEvents {
340
339
  target: IEventThisPlaceHolder) => void);
341
340
  (event: "clear", listener: (
342
341
  local: boolean,
343
- target: IEventThisPlaceHolder
344
- ) => void);
342
+ target: IEventThisPlaceHolder) => void);
345
343
  }
346
344
 
347
345
  /**
package/src/map.ts CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  IChannelServices,
12
12
  IChannelFactory,
13
13
  } from "@fluidframework/datastore-definitions";
14
- import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
14
+ import { ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
15
15
  import { readAndParse } from "@fluidframework/driver-utils";
16
16
  import {
17
17
  IFluidSerializer,
@@ -144,7 +144,7 @@ export class SharedMap extends SharedObject<ISharedMapEvents> implements IShared
144
144
  runtime: IFluidDataStoreRuntime,
145
145
  attributes: IChannelAttributes,
146
146
  ) {
147
- super(id, runtime, attributes);
147
+ super(id, runtime, attributes, "fluid_map_");
148
148
  this.kernel = new MapKernel(
149
149
  this.serializer,
150
150
  this.handle,
@@ -245,7 +245,10 @@ export class SharedMap extends SharedObject<ISharedMapEvents> implements IShared
245
245
  * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
246
246
  * @internal
247
247
  */
248
- protected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {
248
+ protected summarizeCore(
249
+ serializer: IFluidSerializer,
250
+ telemetryContext?: ITelemetryContext,
251
+ ): ISummaryTreeWithStats {
249
252
  let currentSize = 0;
250
253
  let counter = 0;
251
254
  let headerBlob: IMapDataObjectSerializable = {};
@@ -365,4 +368,12 @@ export class SharedMap extends SharedObject<ISharedMapEvents> implements IShared
365
368
  this.kernel.tryProcessMessage(message.contents, local, localOpMetadata);
366
369
  }
367
370
  }
371
+
372
+ /**
373
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}
374
+ * @internal
375
+ */
376
+ protected rollback(content: any, localOpMetadata: unknown) {
377
+ this.kernel.rollback(content, localOpMetadata);
378
+ }
368
379
  }