@fluid-experimental/tree 0.54.3 → 0.55.2

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 (51) hide show
  1. package/.eslintrc.js +1 -1
  2. package/api/tree.api.md +3 -3
  3. package/dist/RevisionValueCache.d.ts.map +1 -1
  4. package/dist/RevisionValueCache.js +2 -0
  5. package/dist/RevisionValueCache.js.map +1 -1
  6. package/dist/SummaryBackCompatibility.d.ts +1 -1
  7. package/dist/SummaryBackCompatibility.d.ts.map +1 -1
  8. package/dist/SummaryBackCompatibility.js.map +1 -1
  9. package/dist/default-edits/UndoRedoHandler.d.ts +1 -1
  10. package/dist/default-edits/UndoRedoHandler.d.ts.map +1 -1
  11. package/dist/default-edits/UndoRedoHandler.js +4 -0
  12. package/dist/default-edits/UndoRedoHandler.js.map +1 -1
  13. package/dist/generic/GenericSharedTree.d.ts +5 -5
  14. package/dist/generic/GenericSharedTree.d.ts.map +1 -1
  15. package/dist/generic/GenericSharedTree.js +5 -19
  16. package/dist/generic/GenericSharedTree.js.map +1 -1
  17. package/dist/generic/Summary.d.ts +2 -1
  18. package/dist/generic/Summary.d.ts.map +1 -1
  19. package/dist/generic/Summary.js.map +1 -1
  20. package/lib/RevisionValueCache.d.ts.map +1 -1
  21. package/lib/RevisionValueCache.js +2 -0
  22. package/lib/RevisionValueCache.js.map +1 -1
  23. package/lib/SummaryBackCompatibility.d.ts +1 -1
  24. package/lib/SummaryBackCompatibility.d.ts.map +1 -1
  25. package/lib/SummaryBackCompatibility.js.map +1 -1
  26. package/lib/default-edits/UndoRedoHandler.d.ts +1 -1
  27. package/lib/default-edits/UndoRedoHandler.d.ts.map +1 -1
  28. package/lib/default-edits/UndoRedoHandler.js +4 -0
  29. package/lib/default-edits/UndoRedoHandler.js.map +1 -1
  30. package/lib/generic/GenericSharedTree.d.ts +5 -5
  31. package/lib/generic/GenericSharedTree.d.ts.map +1 -1
  32. package/lib/generic/GenericSharedTree.js +6 -20
  33. package/lib/generic/GenericSharedTree.js.map +1 -1
  34. package/lib/generic/Summary.d.ts +2 -1
  35. package/lib/generic/Summary.d.ts.map +1 -1
  36. package/lib/generic/Summary.js.map +1 -1
  37. package/lib/test/SnapshotUtilities.tests.js +2 -1
  38. package/lib/test/SnapshotUtilities.tests.js.map +1 -1
  39. package/lib/test/utilities/TestSerializer.d.ts +4 -2
  40. package/lib/test/utilities/TestSerializer.d.ts.map +1 -1
  41. package/lib/test/utilities/TestSerializer.js +4 -1
  42. package/lib/test/utilities/TestSerializer.js.map +1 -1
  43. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  44. package/lib/test/utilities/TestUtilities.js +2 -1
  45. package/lib/test/utilities/TestUtilities.js.map +1 -1
  46. package/package.json +21 -19
  47. package/src/RevisionValueCache.ts +2 -0
  48. package/src/SummaryBackCompatibility.ts +1 -1
  49. package/src/default-edits/UndoRedoHandler.ts +5 -1
  50. package/src/generic/GenericSharedTree.ts +15 -22
  51. package/src/generic/Summary.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryBackCompatibility.d.ts","sourceRoot":"","sources":["../src/SummaryBackCompatibility.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEvF,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,uBAAuB,CAAC,OAAO,CAAE,SAAQ,qBAAqB;IAC9E,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,qBAAqB,GAAG,WAAW,CAmBlH;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EACjD,OAAO,EAAE,qBAAqB,GAC5B,iBAAiB,CAAC,OAAO,CAAC,GAAG,WAAW,CA4C1C"}
1
+ {"version":3,"file":"SummaryBackCompatibility.d.ts","sourceRoot":"","sources":["../src/SummaryBackCompatibility.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEvF,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,uBAAuB,CAAC,OAAO,CAAE,SAAQ,qBAAqB;IAC9E,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,qBAAqB,GAAG,WAAW,CAmBlH;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EACjD,OAAO,EAAE,qBAAqB,GAC5B,iBAAiB,CAAC,OAAO,CAAC,GAAG,WAAW,CA4C1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"SummaryBackCompatibility.js","sourceRoot":"","sources":["../src/SummaryBackCompatibility.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAgBzC;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAA4B;IAC5E,IAAI,OAAuC,CAAC;IAC5C,IAAI;QACH,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KACxC;IAAC,WAAM;QACP,OAAO,8BAA8B,CAAC;KACtC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAChC,OAAO,0BAA0B,CAAC;KAClC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,SAAS,EAAE;QAC1B,uBAAS,OAAO,IAAK,OAAO,EAAG;KAC/B;IAED,OAAO,2BAA2B,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACzC,OAA8B;IAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,iBAAiB,EAAE;QAClC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAqC,CAAC;QAE3E,IAAI,WAAW,KAAK,SAAS,EAAE;YAC9B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACpC,OAAO,+BAA+B,CAAC;aACvC;YAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAE5C,oHAAoH;YACpH,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;gBACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;aAC7C;SACD;KACD;SAAM,IAAI,OAAO,KAAK,OAAO,EAAE;QAC/B,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAA2C,CAAC;QAEpF,IAAI,cAAc,KAAK,SAAS,EAAE;YACjC;;eAEG;YACH,MAAM,YAAY,GAAG,IAAI,CAAC;YAE1B,yEAAyE;YACzE,MAAM,YAAY,GAAG,IAAI,OAAO,CAAU,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAC9E,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,EAAE,CAAC,CACtF,CAAC;YAEF,OAAO;gBACN,WAAW;gBACX,WAAW,EAAE,YAAY,CAAC,iBAAiB,EAAE;gBAC7C,OAAO,EAAE,iBAAiB;aAC1B,CAAC;SACF;KACD;SAAM;QACN,OAAO,iCAAiC,CAAC;KACzC;IAED,OAAO,2BAA2B,CAAC;AACpC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidSerializer } from '@fluidframework/core-interfaces';\nimport { ErrorString } from './Common';\nimport { EditLog } from './EditLog';\nimport { ChangeNode, Edit, SharedTreeSummaryBase, SharedTreeSummary } from './generic';\n\n/** The summary format version that is read by SharedTree. */\nexport const readFormatVersion = '0.1.0';\n\n/**\n * Legacy summary format currently still used for writing.\n * TODO:#49901: Remove export when this format is no longer written.\n * @internal\n */\nexport interface SharedTreeSummary_0_0_2<TChange> extends SharedTreeSummaryBase {\n\treadonly currentTree: ChangeNode;\n\n\t/**\n\t * A list of edits.\n\t */\n\treadonly sequencedEdits: readonly Edit<TChange>[];\n}\n\n/**\n * Deserializes a JSON object produced by `serialize()` and uses it to initialize the tree with the encoded state.\n * Also constructs handle objects from their serialized form.\n *\n * @param jsonSummary - The string to deserialize.\n * @param serializer - The serializer required to deserialize handles in the string.\n * @returns A SharedTree summary or an ErrorString if the summary could not be interpreted.\n *\n */\nexport function deserialize(jsonSummary: string, serializer: IFluidSerializer): SharedTreeSummaryBase | ErrorString {\n\tlet summary: Partial<SharedTreeSummaryBase>;\n\ttry {\n\t\tsummary = serializer.parse(jsonSummary);\n\t} catch {\n\t\treturn 'Json syntax error in Summary';\n\t}\n\n\tif (typeof summary !== 'object') {\n\t\treturn 'Summary is not an object';\n\t}\n\n\tconst { version } = summary;\n\n\tif (version !== undefined) {\n\t\treturn { version, ...summary };\n\t}\n\n\treturn 'Missing fields on summary';\n}\n\n/**\n * @returns SharedTreeSummary that can be used to initialize a SharedTree, or an ErrorString if the summary could not be converted.\n *\n */\nexport function convertSummaryToReadFormat<TChange>(\n\tsummary: SharedTreeSummaryBase\n): SharedTreeSummary<TChange> | ErrorString {\n\tconst { version } = summary;\n\n\tif (version === readFormatVersion) {\n\t\tconst { currentTree, editHistory } = summary as SharedTreeSummary<TChange>;\n\n\t\tif (editHistory !== undefined) {\n\t\t\tif (typeof editHistory !== 'object') {\n\t\t\t\treturn 'Edit history is not an object';\n\t\t\t}\n\n\t\t\tconst { editChunks, editIds } = editHistory;\n\n\t\t\t// TODO:#45414: Add more robust validation of the summary's fields. Even if they are present, they may be malformed.\n\t\t\tif (editChunks !== undefined && editIds !== undefined) {\n\t\t\t\treturn { currentTree, editHistory, version };\n\t\t\t}\n\t\t}\n\t} else if (version === '0.0.2') {\n\t\tconst { currentTree, sequencedEdits } = summary as SharedTreeSummary_0_0_2<TChange>;\n\n\t\tif (sequencedEdits !== undefined) {\n\t\t\t/**\n\t\t\t * The number of edits that can safely fit in a blob upload.\n\t\t\t */\n\t\t\tconst maxChunkSize = 1000;\n\n\t\t\t// This saves all of the edits in the summary as part of the first chunk.\n\t\t\tconst temporaryLog = new EditLog<TChange>(undefined, undefined, maxChunkSize);\n\t\t\tsequencedEdits.forEach((edit) =>\n\t\t\t\ttemporaryLog.addSequencedEdit(edit, { sequenceNumber: 1, referenceSequenceNumber: 0 })\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcurrentTree,\n\t\t\t\teditHistory: temporaryLog.getEditLogSummary(),\n\t\t\t\tversion: readFormatVersion,\n\t\t\t};\n\t\t}\n\t} else {\n\t\treturn 'Format version is not supported';\n\t}\n\n\treturn 'Missing fields on summary';\n}\n"]}
1
+ {"version":3,"file":"SummaryBackCompatibility.js","sourceRoot":"","sources":["../src/SummaryBackCompatibility.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAgBzC;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,UAA4B;IAC5E,IAAI,OAAuC,CAAC;IAC5C,IAAI;QACH,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KACxC;IAAC,WAAM;QACP,OAAO,8BAA8B,CAAC;KACtC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAChC,OAAO,0BAA0B,CAAC;KAClC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,SAAS,EAAE;QAC1B,uBAAS,OAAO,IAAK,OAAO,EAAG;KAC/B;IAED,OAAO,2BAA2B,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACzC,OAA8B;IAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,iBAAiB,EAAE;QAClC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAqC,CAAC;QAE3E,IAAI,WAAW,KAAK,SAAS,EAAE;YAC9B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACpC,OAAO,+BAA+B,CAAC;aACvC;YAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC;YAE5C,oHAAoH;YACpH,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;gBACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;aAC7C;SACD;KACD;SAAM,IAAI,OAAO,KAAK,OAAO,EAAE;QAC/B,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAA2C,CAAC;QAEpF,IAAI,cAAc,KAAK,SAAS,EAAE;YACjC;;eAEG;YACH,MAAM,YAAY,GAAG,IAAI,CAAC;YAE1B,yEAAyE;YACzE,MAAM,YAAY,GAAG,IAAI,OAAO,CAAU,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAC9E,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,uBAAuB,EAAE,CAAC,EAAE,CAAC,CACtF,CAAC;YAEF,OAAO;gBACN,WAAW;gBACX,WAAW,EAAE,YAAY,CAAC,iBAAiB,EAAE;gBAC7C,OAAO,EAAE,iBAAiB;aAC1B,CAAC;SACF;KACD;SAAM;QACN,OAAO,iCAAiC,CAAC;KACzC;IAED,OAAO,2BAA2B,CAAC;AACpC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidSerializer } from '@fluidframework/shared-object-base';\nimport { ErrorString } from './Common';\nimport { EditLog } from './EditLog';\nimport { ChangeNode, Edit, SharedTreeSummaryBase, SharedTreeSummary } from './generic';\n\n/** The summary format version that is read by SharedTree. */\nexport const readFormatVersion = '0.1.0';\n\n/**\n * Legacy summary format currently still used for writing.\n * TODO:#49901: Remove export when this format is no longer written.\n * @internal\n */\nexport interface SharedTreeSummary_0_0_2<TChange> extends SharedTreeSummaryBase {\n\treadonly currentTree: ChangeNode;\n\n\t/**\n\t * A list of edits.\n\t */\n\treadonly sequencedEdits: readonly Edit<TChange>[];\n}\n\n/**\n * Deserializes a JSON object produced by `serialize()` and uses it to initialize the tree with the encoded state.\n * Also constructs handle objects from their serialized form.\n *\n * @param jsonSummary - The string to deserialize.\n * @param serializer - The serializer required to deserialize handles in the string.\n * @returns A SharedTree summary or an ErrorString if the summary could not be interpreted.\n *\n */\nexport function deserialize(jsonSummary: string, serializer: IFluidSerializer): SharedTreeSummaryBase | ErrorString {\n\tlet summary: Partial<SharedTreeSummaryBase>;\n\ttry {\n\t\tsummary = serializer.parse(jsonSummary);\n\t} catch {\n\t\treturn 'Json syntax error in Summary';\n\t}\n\n\tif (typeof summary !== 'object') {\n\t\treturn 'Summary is not an object';\n\t}\n\n\tconst { version } = summary;\n\n\tif (version !== undefined) {\n\t\treturn { version, ...summary };\n\t}\n\n\treturn 'Missing fields on summary';\n}\n\n/**\n * @returns SharedTreeSummary that can be used to initialize a SharedTree, or an ErrorString if the summary could not be converted.\n *\n */\nexport function convertSummaryToReadFormat<TChange>(\n\tsummary: SharedTreeSummaryBase\n): SharedTreeSummary<TChange> | ErrorString {\n\tconst { version } = summary;\n\n\tif (version === readFormatVersion) {\n\t\tconst { currentTree, editHistory } = summary as SharedTreeSummary<TChange>;\n\n\t\tif (editHistory !== undefined) {\n\t\t\tif (typeof editHistory !== 'object') {\n\t\t\t\treturn 'Edit history is not an object';\n\t\t\t}\n\n\t\t\tconst { editChunks, editIds } = editHistory;\n\n\t\t\t// TODO:#45414: Add more robust validation of the summary's fields. Even if they are present, they may be malformed.\n\t\t\tif (editChunks !== undefined && editIds !== undefined) {\n\t\t\t\treturn { currentTree, editHistory, version };\n\t\t\t}\n\t\t}\n\t} else if (version === '0.0.2') {\n\t\tconst { currentTree, sequencedEdits } = summary as SharedTreeSummary_0_0_2<TChange>;\n\n\t\tif (sequencedEdits !== undefined) {\n\t\t\t/**\n\t\t\t * The number of edits that can safely fit in a blob upload.\n\t\t\t */\n\t\t\tconst maxChunkSize = 1000;\n\n\t\t\t// This saves all of the edits in the summary as part of the first chunk.\n\t\t\tconst temporaryLog = new EditLog<TChange>(undefined, undefined, maxChunkSize);\n\t\t\tsequencedEdits.forEach((edit) =>\n\t\t\t\ttemporaryLog.addSequencedEdit(edit, { sequenceNumber: 1, referenceSequenceNumber: 0 })\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tcurrentTree,\n\t\t\t\teditHistory: temporaryLog.getEditLogSummary(),\n\t\t\t\tversion: readFormatVersion,\n\t\t\t};\n\t\t}\n\t} else {\n\t\treturn 'Format version is not supported';\n\t}\n\n\treturn 'Missing fields on summary';\n}\n"]}
@@ -16,7 +16,7 @@ export interface IUndoConsumer {
16
16
  * undo redo stack manager
17
17
  */
18
18
  export declare class SharedTreeUndoRedoHandler {
19
- private readonly stackManager;
19
+ private stackManager;
20
20
  constructor(stackManager: IUndoConsumer);
21
21
  attachTree(tree: SharedTree): void;
22
22
  detachTree(tree: SharedTree): void;
@@ -1 +1 @@
1
- {"version":3,"file":"UndoRedoHandler.d.ts","sourceRoot":"","sources":["../../src/default-edits/UndoRedoHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,WAAW,WAAW;IAC3B,MAAM,QAAG;IACT,OAAO,QAAG;CACV;AAED,MAAM,WAAW,aAAa;IAC7B,sBAAsB,CAAC,UAAU,EAAE,WAAW,OAAE;CAChD;AAED;;;GAGG;AACH,qBAAa,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,aAAa;IAEjD,UAAU,CAAC,IAAI,EAAE,UAAU;IAG3B,UAAU,CAAC,IAAI,EAAE,UAAU;IAIlC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAc/B;CACF;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,WAAW;IAC3C,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAArC,MAAM,EAAE,MAAM,EAAmB,IAAI,EAAE,UAAU;IAE9D,MAAM;IASN,OAAO;CAGd"}
1
+ {"version":3,"file":"UndoRedoHandler.d.ts","sourceRoot":"","sources":["../../src/default-edits/UndoRedoHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,MAAM,WAAW,WAAW;IAC3B,MAAM,QAAG;IACT,OAAO,QAAG;CACV;AAED,MAAM,WAAW,aAAa;IAC7B,sBAAsB,CAAC,UAAU,EAAE,WAAW,OAAE;CAChD;AAED;;;GAGG;AACH,qBAAa,yBAAyB;IAGzB,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,aAAa;IAExC,UAAU,CAAC,IAAI,EAAE,UAAU;IAG3B,UAAU,CAAC,IAAI,EAAE,UAAU;IAIlC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAc/B;CACF;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,WAAW;IAG3C,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAArC,MAAM,EAAE,MAAM,EAAmB,IAAI,EAAE,UAAU;IAE9D,MAAM;IASN,OAAO;CAGd"}
@@ -9,6 +9,8 @@ import { SharedTreeEvent } from '../generic';
9
9
  * undo redo stack manager
10
10
  */
11
11
  export class SharedTreeUndoRedoHandler {
12
+ // False positive
13
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly
12
14
  constructor(stackManager) {
13
15
  this.stackManager = stackManager;
14
16
  this.treeDeltaHandler = (eventArguments) => {
@@ -29,6 +31,8 @@ export class SharedTreeUndoRedoHandler {
29
31
  * Tracks a change on a shared tree and allows reverting it
30
32
  */
31
33
  export class SharedTreeRevertible {
34
+ // False positive
35
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly
32
36
  constructor(editId, tree) {
33
37
  this.editId = editId;
34
38
  this.tree = tree;
@@ -1 +1 @@
1
- {"version":3,"file":"UndoRedoHandler.js","sourceRoot":"","sources":["../../src/default-edits/UndoRedoHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAA+B,eAAe,EAAE,MAAM,YAAY,CAAC;AAe1E;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IACrC,YAA6B,YAA2B;QAA3B,iBAAY,GAAZ,YAAY,CAAe;QASvC,qBAAgB,GAAG,CAAC,cAAuD,EAAE,EAAE;YAC/F,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;YAE/C,IAAI,KAAK,EAAE;gBACV,IAAI,CAAC,YAAY,CAAC,sBAAsB,CACvC,IAAI,oBAAoB,CACvB,MAAM,EACN,kBAAkB,CACjB,IAAI,EACJ,sGAAsG,CACtG,CACD,CACD,CAAC;aACF;QACF,CAAC,CAAC;IAvByD,CAAC;IAErD,UAAU,CAAC,IAAgB;QACjC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IACM,UAAU,CAAC,IAAgB;QACjC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,CAAC;CAiBD;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAChC,YAAoB,MAAc,EAAmB,IAAgB;QAAjD,WAAM,GAAN,MAAM,CAAQ;QAAmB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAElE,MAAM;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAE3E,+DAA+D;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC;IAEM,OAAO;QACb,OAAO;IACR,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assertNotUndefined } from '../Common';\nimport { EditId } from '../Identifiers';\nimport { EditCommittedEventArguments, SharedTreeEvent } from '../generic';\nimport { SharedTree } from './SharedTree';\n\n// TODO: We temporarily duplicate these contracts from 'framework/undo-redo' to unblock development\n// while we decide on the correct layering for undo.\n\nexport interface IRevertible {\n\trevert();\n\tdiscard();\n}\n\nexport interface IUndoConsumer {\n\tpushToCurrentOperation(revertible: IRevertible);\n}\n\n/**\n * A shared tree undo redo handler that will add revertible local tree changes to the provided\n * undo redo stack manager\n */\nexport class SharedTreeUndoRedoHandler {\n\tconstructor(private readonly stackManager: IUndoConsumer) {}\n\n\tpublic attachTree(tree: SharedTree) {\n\t\ttree.on(SharedTreeEvent.EditCommitted, this.treeDeltaHandler);\n\t}\n\tpublic detachTree(tree: SharedTree) {\n\t\ttree.off(SharedTreeEvent.EditCommitted, this.treeDeltaHandler);\n\t}\n\n\tprivate readonly treeDeltaHandler = (eventArguments: EditCommittedEventArguments<SharedTree>) => {\n\t\tconst { editId, local, tree } = eventArguments;\n\n\t\tif (local) {\n\t\t\tthis.stackManager.pushToCurrentOperation(\n\t\t\t\tnew SharedTreeRevertible(\n\t\t\t\t\teditId,\n\t\t\t\t\tassertNotUndefined(\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\t'An edit committed event for a revertible edit should include the target SharedTree in its arguments.'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t};\n}\n\n/**\n * Tracks a change on a shared tree and allows reverting it\n */\nexport class SharedTreeRevertible implements IRevertible {\n\tconstructor(private editId: EditId, private readonly tree: SharedTree) {}\n\n\tpublic revert() {\n\t\tconst editIndex = this.tree.edits.getIndexOfId(this.editId);\n\t\tconst edit = this.tree.edits.getEditInSessionAtIndex(editIndex);\n\t\tconst snapshotBefore = this.tree.logViewer.getSnapshotInSession(editIndex);\n\n\t\t// Apply the revert edit and set it as the new revertible edit.\n\t\tthis.editId = this.tree.editor.revert(edit, snapshotBefore);\n\t}\n\n\tpublic discard() {\n\t\treturn;\n\t}\n}\n"]}
1
+ {"version":3,"file":"UndoRedoHandler.js","sourceRoot":"","sources":["../../src/default-edits/UndoRedoHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAA+B,eAAe,EAAE,MAAM,YAAY,CAAC;AAe1E;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IACrC,iBAAiB;IACjB,8DAA8D;IAC9D,YAAoB,YAA2B;QAA3B,iBAAY,GAAZ,YAAY,CAAe;QAS9B,qBAAgB,GAAG,CAAC,cAAuD,EAAE,EAAE;YAC/F,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;YAE/C,IAAI,KAAK,EAAE;gBACV,IAAI,CAAC,YAAY,CAAC,sBAAsB,CACvC,IAAI,oBAAoB,CACvB,MAAM,EACN,kBAAkB,CACjB,IAAI,EACJ,sGAAsG,CACtG,CACD,CACD,CAAC;aACF;QACF,CAAC,CAAC;IAvBgD,CAAC;IAE5C,UAAU,CAAC,IAAgB;QACjC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IACM,UAAU,CAAC,IAAgB;QACjC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,CAAC;CAiBD;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAChC,iBAAiB;IACjB,8DAA8D;IAC9D,YAAoB,MAAc,EAAmB,IAAgB;QAAjD,WAAM,GAAN,MAAM,CAAQ;QAAmB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAElE,MAAM;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAE3E,+DAA+D;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC;IAEM,OAAO;QACb,OAAO;IACR,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assertNotUndefined } from '../Common';\nimport { EditId } from '../Identifiers';\nimport { EditCommittedEventArguments, SharedTreeEvent } from '../generic';\nimport { SharedTree } from './SharedTree';\n\n// TODO: We temporarily duplicate these contracts from 'framework/undo-redo' to unblock development\n// while we decide on the correct layering for undo.\n\nexport interface IRevertible {\n\trevert();\n\tdiscard();\n}\n\nexport interface IUndoConsumer {\n\tpushToCurrentOperation(revertible: IRevertible);\n}\n\n/**\n * A shared tree undo redo handler that will add revertible local tree changes to the provided\n * undo redo stack manager\n */\nexport class SharedTreeUndoRedoHandler {\n\t// False positive\n\t// eslint-disable-next-line @typescript-eslint/prefer-readonly\n\tconstructor(private stackManager: IUndoConsumer) {}\n\n\tpublic attachTree(tree: SharedTree) {\n\t\ttree.on(SharedTreeEvent.EditCommitted, this.treeDeltaHandler);\n\t}\n\tpublic detachTree(tree: SharedTree) {\n\t\ttree.off(SharedTreeEvent.EditCommitted, this.treeDeltaHandler);\n\t}\n\n\tprivate readonly treeDeltaHandler = (eventArguments: EditCommittedEventArguments<SharedTree>) => {\n\t\tconst { editId, local, tree } = eventArguments;\n\n\t\tif (local) {\n\t\t\tthis.stackManager.pushToCurrentOperation(\n\t\t\t\tnew SharedTreeRevertible(\n\t\t\t\t\teditId,\n\t\t\t\t\tassertNotUndefined(\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\t'An edit committed event for a revertible edit should include the target SharedTree in its arguments.'\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t};\n}\n\n/**\n * Tracks a change on a shared tree and allows reverting it\n */\nexport class SharedTreeRevertible implements IRevertible {\n\t// False positive\n\t// eslint-disable-next-line @typescript-eslint/prefer-readonly\n\tconstructor(private editId: EditId, private readonly tree: SharedTree) {}\n\n\tpublic revert() {\n\t\tconst editIndex = this.tree.edits.getIndexOfId(this.editId);\n\t\tconst edit = this.tree.edits.getEditInSessionAtIndex(editIndex);\n\t\tconst snapshotBefore = this.tree.logViewer.getSnapshotInSession(editIndex);\n\n\t\t// Apply the revert edit and set it as the new revertible edit.\n\t\tthis.editId = this.tree.editor.revert(edit, snapshotBefore);\n\t}\n\n\tpublic discard() {\n\t\treturn;\n\t}\n}\n"]}
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidSerializer } from '@fluidframework/core-interfaces';
6
- import { ISequencedDocumentMessage, ITree } from '@fluidframework/protocol-definitions';
5
+ import { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';
7
6
  import { IFluidDataStoreRuntime, IChannelStorageService, IChannelAttributes } from '@fluidframework/datastore-definitions';
8
- import { ISharedObjectEvents, SharedObject } from '@fluidframework/shared-object-base';
7
+ import { IFluidSerializer, ISharedObjectEvents, SharedObject } from '@fluidframework/shared-object-base';
9
8
  import { ITelemetryLogger } from '@fluidframework/common-definitions';
9
+ import { ISummaryTreeWithStats } from '@fluidframework/runtime-definitions';
10
10
  import { OrderedEditSet } from '../EditLog';
11
11
  import { EditId } from '../Identifiers';
12
12
  import { Snapshot } from '../Snapshot';
@@ -148,9 +148,9 @@ export declare abstract class GenericSharedTree<TChange> extends SharedObject<IS
148
148
  */
149
149
  private uploadEditChunk;
150
150
  /**
151
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.snapshotCore}
151
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
152
152
  */
153
- snapshotCore(serializer: IFluidSerializer): ITree;
153
+ summarizeCore(serializer: IFluidSerializer, fullTree: boolean): ISummaryTreeWithStats;
154
154
  /**
155
155
  * Saves this SharedTree into a serialized summary.
156
156
  *
@@ -1 +1 @@
1
- {"version":3,"file":"GenericSharedTree.d.ts","sourceRoot":"","sources":["../../src/generic/GenericSharedTree.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GenericSharedTree.d.ts","sourceRoot":"","sources":["../../src/generic/GenericSharedTree.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,8 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { bufferToString, IsoBuffer } from '@fluidframework/common-utils';
6
- import { FileMode, TreeEntry } from '@fluidframework/protocol-definitions';
7
6
  import { AttachState } from '@fluidframework/container-definitions';
8
- import { serializeHandles, SharedObject } from '@fluidframework/shared-object-base';
7
+ import { createSingleBlobSummary, serializeHandles, SharedObject, } from '@fluidframework/shared-object-base';
9
8
  import { ChildLogger, PerformanceEvent } from '@fluidframework/telemetry-utils';
10
9
  import { assert, assertNotUndefined, fail } from '../Common';
11
10
  import { EditLog } from '../EditLog';
@@ -213,23 +212,10 @@ export class GenericSharedTree extends SharedObject {
213
212
  }
214
213
  }
215
214
  /**
216
- * {@inheritDoc @fluidframework/shared-object-base#SharedObject.snapshotCore}
215
+ * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}
217
216
  */
218
- snapshotCore(serializer) {
219
- const tree = {
220
- entries: [
221
- {
222
- mode: FileMode.File,
223
- path: snapshotFileName,
224
- type: TreeEntry[TreeEntry.Blob],
225
- value: {
226
- contents: this.saveSerializedSummary({ serializer }),
227
- encoding: 'utf-8',
228
- },
229
- },
230
- ],
231
- };
232
- return tree;
217
+ summarizeCore(serializer, fullTree) {
218
+ return createSingleBlobSummary(snapshotFileName, this.saveSerializedSummary({ serializer }));
233
219
  }
234
220
  /**
235
221
  * Saves this SharedTree into a serialized summary.
@@ -373,7 +359,7 @@ export class GenericSharedTree extends SharedObject {
373
359
  }
374
360
  else if (type === SharedTreeOpType.Edit) {
375
361
  const semiSerializedEdit = message.contents.edit;
376
- // semiSerializedEdit may have handles which have been replaced by `serializer.replaceHandles`.
362
+ // semiSerializedEdit may have handles which have been replaced by `serializer.encode`.
377
363
  // Since there is no API to un-replace them except via parse, re-stringify the edit, then parse it.
378
364
  // Stringify using JSON, not IFluidSerializer since OPs use JSON directly.
379
365
  // TODO:Performance:#48025: Avoid this serialization round trip.
@@ -442,7 +428,7 @@ export class GenericSharedTree extends SharedObject {
442
428
  // IFluidHandles are not allowed in Ops.
443
429
  // Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.
444
430
  // So replace the handles before sending:
445
- const semiSerialized = this.serializer.replaceHandles(editOp, this.handle);
431
+ const semiSerialized = this.serializer.encode(editOp, this.handle);
446
432
  // TODO:44711: what should be passed in when unattached?
447
433
  this.submitLocalMessage(semiSerialized);
448
434
  this.editLog.addLocalEdit(edit);
@@ -1 +1 @@
1
- {"version":3,"file":"GenericSharedTree.js","sourceRoot":"","sources":["../../src/generic/GenericSharedTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString, IsoBuffer } from '@fluidframework/common-utils';\nimport { IFluidHandle, IFluidSerializer } from '@fluidframework/core-interfaces';\nimport { FileMode, ISequencedDocumentMessage, ITree, TreeEntry } from '@fluidframework/protocol-definitions';\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelAttributes,\n} from '@fluidframework/datastore-definitions';\nimport { AttachState } from '@fluidframework/container-definitions';\nimport { ISharedObjectEvents, serializeHandles, SharedObject } from '@fluidframework/shared-object-base';\nimport { ITelemetryLogger } from '@fluidframework/common-definitions';\nimport { ChildLogger, ITelemetryLoggerPropertyBags, PerformanceEvent } from '@fluidframework/telemetry-utils';\nimport { assert, assertNotUndefined, fail } from '../Common';\nimport { EditLog, OrderedEditSet } from '../EditLog';\nimport { EditId } from '../Identifiers';\nimport { Snapshot } from '../Snapshot';\nimport { initialTree } from '../InitialTree';\nimport { CachingLogViewer, EditStatusCallback, LogViewer } from '../LogViewer';\nimport { convertSummaryToReadFormat, deserialize, readFormatVersion } from '../SummaryBackCompatibility';\nimport {\n\tEdit,\n\tSharedTreeOpType,\n\tSharedTreeEditOp,\n\tSharedTreeHandleOp,\n\tEditWithoutId,\n\tSharedTreeOp,\n\tEditStatus,\n} from './PersistedTypes';\nimport { serialize, SharedTreeSummarizer, SharedTreeSummary, SharedTreeSummaryBase } from './Summary';\nimport { GenericTransaction } from './GenericTransaction';\nimport { newEdit } from './GenericEditUtilities';\n\n/**\n * Filename where the snapshot is stored.\n */\nconst snapshotFileName = 'header';\n\nconst initialSummary: SharedTreeSummary<unknown> = {\n\tversion: readFormatVersion,\n\tcurrentTree: initialTree,\n\teditHistory: {\n\t\teditChunks: [],\n\t\teditIds: [],\n\t},\n};\n\n/**\n * An event emitted by a `SharedTree` to indicate a state change. See {@link ISharedTreeEvents} for event argument information.\n * @public\n */\nexport enum SharedTreeEvent {\n\t/**\n\t * An edit has been committed to the log.\n\t * This happens when either:\n\t * \t1. A locally generated edit is added to the log.\n\t * \t2. A remotely generated edit is added to the log.\n\t * Note that, for locally generated edits, this event will not be emitted again when that edit is sequenced.\n\t * Passed the EditId of the committed edit, i.e. supports callbacks of type {@link EditCommittedHandler}.\n\t */\n\tEditCommitted = 'committedEdit',\n}\n\n/**\n * An event emitted by a `SharedTree` for diagnostic purposes.\n * See {@link ISharedTreeEvents} for event argument information.\n */\nexport enum SharedTreeDiagnosticEvent {\n\t/**\n\t * A single catch up blob has been uploaded.\n\t */\n\tCatchUpBlobUploaded = 'uploadedCatchUpBlob',\n\t/**\n\t * A valid edit (local or remote) has been applied.\n\t * Passed the EditId of the applied edit.\n\t * Note that this may be called multiple times, due to concurrent edits causing reordering,\n\t * and/or due to not caching the output of every edit.\n\t */\n\tAppliedEdit = 'appliedEdit',\n\t/**\n\t * An invalid edit (local or remote) has been dropped.\n\t * Passed the EditId of the dropped edit.\n\t * Note that this may be called multiple times, due to concurrent edits causing reordering,\n\t * and/or due to not caching the output of every edit.\n\t */\n\tDroppedInvalidEdit = 'droppedInvalidEdit',\n\t/**\n\t * A malformed edit (local or remote) has been dropped.\n\t * Passed the EditId of the dropped edit.\n\t * Note that this may be called multiple times, due to concurrent edits causing reordering,\n\t * and/or due to not caching the output of every edit.\n\t */\n\tDroppedMalformedEdit = 'droppedMalformedEdit',\n}\n\n/**\n * The arguments included when the EditCommitted SharedTreeEvent is emitted.\n * @public\n */\nexport interface EditCommittedEventArguments<TSharedTree> {\n\t/** The ID of the edit committed. */\n\teditId: EditId;\n\t/** Whether or not this is a local edit. */\n\tlocal: boolean;\n\t/** The tree the edit was committed on. Required for local edit events handled by SharedTreeUndoRedoHandler. */\n\ttree: TSharedTree;\n}\n\n/**\n * Events which may be emitted by `SharedTree`. See {@link SharedTreeEvent} for documentation of event semantics.\n */\nexport interface ISharedTreeEvents<TSharedTree> extends ISharedObjectEvents {\n\t(event: 'committedEdit', listener: EditCommittedHandler<TSharedTree>);\n}\n\n/**\n * Expected type for a handler of the `EditCommitted` event.\n */\nexport type EditCommittedHandler<TSharedTree> = (args: EditCommittedEventArguments<TSharedTree>) => void;\n\nconst sharedTreeTelemetryProperties: ITelemetryLoggerPropertyBags = { all: { isSharedTreeEvent: true } };\n\n/**\n * A distributed tree.\n * @public\n */\nexport abstract class GenericSharedTree<TChange> extends SharedObject<ISharedTreeEvents<TChange>> {\n\t/**\n\t * The log of completed edits for this SharedTree.\n\t */\n\tprivate editLog: EditLog<TChange>;\n\n\t/**\n\t * As an implementation detail, SharedTree uses a log viewer that caches snapshots at different revisions.\n\t * It is not exposed to avoid accidental correctness issues, but `logViewer` is exposed in order to give clients a way\n\t * to access the revision history.\n\t */\n\tprivate cachingLogViewer: CachingLogViewer<TChange>;\n\n\t/**\n\t * Viewer for trees defined by editLog. This allows access to views of the tree at different revisions (various points in time).\n\t */\n\tpublic get logViewer(): LogViewer {\n\t\treturn this.cachingLogViewer;\n\t}\n\n\tprotected readonly logger: ITelemetryLogger;\n\n\tpublic readonly transactionFactory: (snapshot: Snapshot) => GenericTransaction<TChange>;\n\n\t/** Indicates if the client is the oldest member of the quorum. */\n\tprivate currentIsOldest: boolean;\n\n\tprivate readonly processEditResult = (editResult: EditStatus, editId: EditId): void => {\n\t\t// TODO:#44859: Invalid results should be handled by the app\n\t\tthis.emit(GenericSharedTree.eventFromEditResult(editResult), editId);\n\t};\n\n\t/**\n\t * Create a new SharedTreeFactory.\n\t * @param runtime - The runtime the SharedTree will be associated with\n\t * @param id - Unique ID for the SharedTree\n\t * @param expensiveValidation - Enable expensive asserts.\n\t * @param summarizeHistory - Determines if the history is included in summaries.\n\t */\n\tpublic constructor(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\ttransactionFactory: (snapshot: Snapshot) => GenericTransaction<TChange>,\n\t\tattributes: IChannelAttributes,\n\t\tprivate readonly expensiveValidation = false,\n\t\tprotected readonly summarizeHistory = true\n\t) {\n\t\tsuper(id, runtime, attributes);\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.transactionFactory = transactionFactory;\n\n\t\t// This code is somewhat duplicated from OldestClientObserver because it currently depends on the container runtime\n\t\t// which SharedTree does not have access to.\n\t\t// TODO:#55900: Get rid of copy-pasted OldestClientObserver code\n\t\tconst quorum = this.runtime.getQuorum();\n\t\tthis.currentIsOldest = this.computeIsOldest();\n\t\tquorum.on('addMember', this.updateOldest);\n\t\tquorum.on('removeMember', this.updateOldest);\n\t\truntime.on('connected', this.updateOldest);\n\t\truntime.on('disconnected', this.updateOldest);\n\n\t\tthis.logger = ChildLogger.create(runtime.logger, 'SharedTree', sharedTreeTelemetryProperties);\n\t\tconst { editLog, cachingLogViewer } = this.createEditLogFromSummary(initialSummary, this.processEditResult);\n\n\t\tthis.editLog = editLog;\n\t\tthis.cachingLogViewer = cachingLogViewer;\n\t}\n\n\t/**\n\t * Re-computes currentIsOldest and emits an event if it has changed.\n\t * TODO:#55900: Get rid of copy-pasted OldestClientObserver code\n\t */\n\tprivate readonly updateOldest = () => {\n\t\tconst oldest = this.computeIsOldest();\n\t\tif (this.currentIsOldest !== oldest) {\n\t\t\tthis.currentIsOldest = oldest;\n\t\t\tif (oldest) {\n\t\t\t\tthis.emit('becameOldest');\n\t\t\t} else {\n\t\t\t\tthis.emit('lostOldest');\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Computes the oldest client in the quorum, true by default if the container is detached and false by default if the client isn't connected.\n\t * TODO:#55900: Get rid of copy-pasted OldestClientObserver code\n\t */\n\tprivate computeIsOldest(): boolean {\n\t\t// If the container is detached, we are the only ones that know about it and are the oldest by default.\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If we're not connected we can't be the oldest connected client.\n\t\tif (!this.runtime.connected) {\n\t\t\treturn false;\n\t\t}\n\n\t\tassert(this.runtime.clientId !== undefined, 'Client id should be set if connected.');\n\n\t\tconst quorum = this.runtime.getQuorum();\n\t\tconst selfSequencedClient = quorum.getMember(this.runtime.clientId);\n\t\t// When in readonly mode our clientId will not be present in the quorum.\n\t\tif (selfSequencedClient === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst members = quorum.getMembers();\n\t\tfor (const sequencedClient of members.values()) {\n\t\t\tif (sequencedClient.sequenceNumber < selfSequencedClient.sequenceNumber) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// No member of the quorum was older\n\t\treturn true;\n\t}\n\n\t/**\n\t * @returns the current view of the tree.\n\t */\n\tpublic get currentView(): Snapshot {\n\t\treturn this.logViewer.getSnapshotInSession(Number.POSITIVE_INFINITY);\n\t}\n\n\t/**\n\t * @returns the edit history of the tree.\n\t */\n\tpublic get edits(): OrderedEditSet<TChange> {\n\t\treturn this.editLog;\n\t}\n\n\t/**\n\t * Convenience helper for applying an edit containing the given changes.\n\t * Opens an edit, applies the given changes, and closes the edit. See (`openEdit()`/`applyChanges()`/`closeEdit()`).\n\t *\n\t * For convenient imperative variants of edits, see `editor`.\n\t * @internal\n\t */\n\tpublic applyEdit(...changes: TChange[]): EditId {\n\t\tconst edit = newEdit(changes);\n\t\tthis.processLocalEdit(edit);\n\t\treturn edit.id;\n\t}\n\n\tprivate deserializeHandle(serializedHandle: string): IFluidHandle<ArrayBufferLike> {\n\t\tconst deserializeHandle = this.serializer.parse(serializedHandle);\n\t\tassert(typeof deserializeHandle === 'object');\n\t\treturn deserializeHandle as IFluidHandle<ArrayBufferLike>;\n\t}\n\n\t/**\n\t * Uploads the edit chunk and sends the chunk starting revision along with the resulting handle as an op.\n\t */\n\tprivate async uploadEditChunk(edits: readonly EditWithoutId<TChange>[], startRevision: number): Promise<void> {\n\t\ttry {\n\t\t\tconst editHandle = await this.runtime.uploadBlob(IsoBuffer.from(JSON.stringify({ edits })));\n\t\t\tthis.submitLocalMessage({\n\t\t\t\teditHandle: serializeHandles(editHandle, this.serializer, this.handle),\n\t\t\t\tstartRevision,\n\t\t\t\ttype: SharedTreeOpType.Handle,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\t// If chunk load fails, we will try again later in loadCore on the oldest client so we log the error instead of throwing.\n\t\t\tthis.logger.sendErrorEvent(\n\t\t\t\t{\n\t\t\t\t\teventName: 'EditChunkUploadFailure',\n\t\t\t\t},\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.snapshotCore}\n\t */\n\tpublic snapshotCore(serializer: IFluidSerializer): ITree {\n\t\tconst tree: ITree = {\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tmode: FileMode.File,\n\t\t\t\t\tpath: snapshotFileName,\n\t\t\t\t\ttype: TreeEntry[TreeEntry.Blob],\n\t\t\t\t\tvalue: {\n\t\t\t\t\t\tcontents: this.saveSerializedSummary({ serializer }),\n\t\t\t\t\t\tencoding: 'utf-8',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\n\t\treturn tree;\n\t}\n\n\t/**\n\t * Saves this SharedTree into a serialized summary.\n\t *\n\t * @param options - Optional serializer and summarizer to use. If not passed in, SharedTree's serializer and summarizer are used.\n\t * @internal\n\t */\n\tpublic saveSerializedSummary(options?: {\n\t\tserializer?: IFluidSerializer;\n\t\tsummarizer?: SharedTreeSummarizer<TChange>;\n\t}): string {\n\t\tconst { serializer, summarizer } = options || {};\n\n\t\treturn serialize(\n\t\t\tsummarizer ? summarizer(this.editLog, this.currentView) : this.saveSummary(),\n\t\t\tserializer || this.serializer,\n\t\t\tthis.handle\n\t\t);\n\t}\n\n\t/**\n\t * Saves this SharedTree into a summary.\n\t * @internal\n\t */\n\tpublic saveSummary(): SharedTreeSummaryBase {\n\t\t// If local changes exist, emulate the sequencing of those changes.\n\t\t// Doing so is necessary so edits created during DataObject.initializingFirstTime are included.\n\t\t// Doing so is safe because it is guaranteed that the DDS has not yet been attached. This is because summary creation is only\n\t\t// ever invoked on a DataObject containing local changes when it is attached for the first time. In post-attach flows, an extra\n\t\t// instance of the DataObject is created for generating summaries and will never have local edits.\n\t\tif (this.editLog.numberOfLocalEdits > 0) {\n\t\t\tassert(\n\t\t\t\tthis.runtime.attachState !== AttachState.Attached,\n\t\t\t\t'Summarizing should not occur with local edits except on first attach.'\n\t\t\t);\n\t\t\tthis.editLog.sequenceLocalEdits();\n\t\t}\n\n\t\tassert(this.editLog.numberOfLocalEdits === 0, 'generateSummary must not be called with local edits');\n\t\treturn this.generateSummary(this.editLog);\n\t}\n\n\t/**\n\t * Generates a SharedTree summary for the current state of the tree.\n\t * Will never be called when local edits are present.\n\t */\n\tprotected abstract generateSummary(editLog: OrderedEditSet<TChange>): SharedTreeSummaryBase;\n\n\t/**\n\t * Initialize shared tree with a summary.\n\t * @internal\n\t */\n\tpublic loadSummary(summary: SharedTreeSummaryBase): void {\n\t\tconst { editLog, cachingLogViewer } = this.createEditLogFromSummary(summary, this.processEditResult);\n\t\tthis.editLog = editLog;\n\t\tthis.cachingLogViewer = cachingLogViewer;\n\n\t\tif (this.runtime.connected) {\n\t\t\tconst noChunksReadyForUpload = this.editLog.getEditChunksReadyForUpload()[Symbol.iterator]().next().done;\n\t\t\tif (noChunksReadyForUpload === undefined || !noChunksReadyForUpload) {\n\t\t\t\t// A client does not become a member of the quorum until it is within the collaboration window.\n\t\t\t\t//\n\t\t\t\t// The collaboration window is the range from the minimum sequence number enforced by the server and head.\n\t\t\t\t// When a client sends an op, they include the last sequence number the client has processed. We call this the reference\n\t\t\t\t// sequence number.\n\t\t\t\t//\n\t\t\t\t// If there are no members in the quorum, we send a no op op in order to have this client added as a member to the quorum.\n\t\t\t\t// This is required so we can ensure only the oldest client will upload blobs during summary load.\n\t\t\t\tif (this.runtime.getQuorum().getMembers().size === 0) {\n\t\t\t\t\tconst noop: SharedTreeOp = {\n\t\t\t\t\t\ttype: SharedTreeOpType.NoOp,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.submitLocalMessage(noop);\n\t\t\t\t} else if (this.currentIsOldest) {\n\t\t\t\t\tvoid this.uploadCatchUpBlobs();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this client becomes the oldest, it should take care of uploading catch up blobs.\n\t\t\tthis.on('becameOldest', () => void this.uploadCatchUpBlobs());\n\t\t}\n\t}\n\n\tprivate static eventFromEditResult(editStatus: EditStatus): SharedTreeDiagnosticEvent {\n\t\tswitch (editStatus) {\n\t\t\tcase EditStatus.Applied:\n\t\t\t\treturn SharedTreeDiagnosticEvent.AppliedEdit;\n\t\t\tcase EditStatus.Invalid:\n\t\t\t\treturn SharedTreeDiagnosticEvent.DroppedInvalidEdit;\n\t\t\tdefault:\n\t\t\t\treturn SharedTreeDiagnosticEvent.DroppedMalformedEdit;\n\t\t}\n\t}\n\n\tprivate createEditLogFromSummary(\n\t\tsummary: SharedTreeSummaryBase,\n\t\tcallback: EditStatusCallback\n\t): { editLog: EditLog<TChange>; cachingLogViewer: CachingLogViewer<TChange> } {\n\t\tconst convertedSummary = convertSummaryToReadFormat<TChange>(summary);\n\t\tif (typeof convertedSummary === 'string') {\n\t\t\tfail(convertedSummary);\n\t\t}\n\t\tconst { editHistory, currentTree } = convertedSummary;\n\t\tconst currentView = Snapshot.fromTree(currentTree);\n\n\t\tconst editLog = new EditLog(editHistory, this.logger);\n\t\tconst logViewer = new CachingLogViewer(\n\t\t\teditLog,\n\t\t\tSnapshot.fromTree(initialTree),\n\t\t\t// TODO:#47830: Store multiple checkpoints in summary.\n\t\t\t[[editLog.length, { snapshot: currentView }]],\n\t\t\tthis.expensiveValidation,\n\t\t\tcallback,\n\t\t\tthis.logger,\n\t\t\tthis.transactionFactory,\n\t\t\t0\n\t\t);\n\n\t\treturn { editLog, cachingLogViewer: logViewer };\n\t}\n\n\t/**\n\t * Upload any full chunks that have yet to be uploaded.\n\t */\n\tprivate async uploadCatchUpBlobs(): Promise<void> {\n\t\tfor (const [startRevision, chunk] of this.editLog.getEditChunksReadyForUpload()) {\n\t\t\tawait this.uploadEditChunk(chunk, startRevision);\n\t\t\tthis.emit(SharedTreeDiagnosticEvent.CatchUpBlobUploaded);\n\t\t}\n\t}\n\n\t/**\n\t * Compares this shared tree to another for equality.\n\t *\n\t * Equality means that the histories as captured by the EditLogs are equal.\n\t *\n\t * Equality does not include:\n\t * - if an edit is open\n\t * - the shared tree's id\n\t * - local vs sequenced status of edits\n\t * - registered event listeners\n\t * - state of caches\n\t * */\n\tpublic equals<TOtherChangeTypes>(sharedTree: GenericSharedTree<TOtherChangeTypes>): boolean {\n\t\tif (!this.currentView.equals(sharedTree.currentView)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.editLog.equals(sharedTree.editLog);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst summaryLoadPerformanceEvent = PerformanceEvent.start(this.logger, { eventName: 'SummaryLoad' });\n\n\t\ttry {\n\t\t\tconst newBlob = await storage.readBlob(snapshotFileName);\n\t\t\tconst blobData = bufferToString(newBlob, 'utf8');\n\n\t\t\tconst summary = deserialize(blobData, this.serializer);\n\t\t\tif (typeof summary === 'string') {\n\t\t\t\tfail(summary);\n\t\t\t}\n\t\t\tthis.loadSummary(summary);\n\n\t\t\tsummaryLoadPerformanceEvent.end({ historySize: this.edits.length });\n\t\t} catch (error) {\n\t\t\tsummaryLoadPerformanceEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processCore}\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean): void {\n\t\tthis.cachingLogViewer.setMinimumSequenceNumber(message.minimumSequenceNumber);\n\t\tconst { type } = message.contents;\n\t\tif (type === SharedTreeOpType.Handle) {\n\t\t\tconst { editHandle, startRevision } = message.contents as SharedTreeHandleOp;\n\t\t\tthis.editLog.processEditChunkHandle(this.deserializeHandle(editHandle), startRevision);\n\t\t} else if (type === SharedTreeOpType.Edit) {\n\t\t\tconst semiSerializedEdit = message.contents.edit;\n\t\t\t// semiSerializedEdit may have handles which have been replaced by `serializer.replaceHandles`.\n\t\t\t// Since there is no API to un-replace them except via parse, re-stringify the edit, then parse it.\n\t\t\t// Stringify using JSON, not IFluidSerializer since OPs use JSON directly.\n\t\t\t// TODO:Performance:#48025: Avoid this serialization round trip.\n\t\t\tconst stringEdit = JSON.stringify(semiSerializedEdit);\n\t\t\tconst parsedEdit = this.serializer.parse(stringEdit);\n\t\t\tconst edit = parsedEdit as Edit<TChange>;\n\t\t\tthis.processSequencedEdit(edit, message);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.registerCore}\n\t */\n\tprotected registerCore(): void {\n\t\t// Do nothing\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onDisconnect}\n\t */\n\tprotected onDisconnect(): void {\n\t\t// Do nothing\n\t}\n\n\tprivate processSequencedEdit(edit: Edit<TChange>, message: ISequencedDocumentMessage): void {\n\t\tconst { id: editId } = edit;\n\t\tconst wasLocalEdit = this.editLog.isLocalEdit(editId);\n\n\t\t// If the id of the supplied edit matches a non-local edit already present in the log, this would normally be indicative of an error.\n\t\t// However, the @fluidframework packages prior to 0.37.x have a bug which can cause data corruption by sequencing duplicate edits--\n\t\t// see discussion on the following github issue: https://github.com/microsoft/FluidFramework/issues/4399\n\t\t// To work around this issue, we currently tolerate duplicate ops in loaded documents.\n\t\t// This could be strengthened in the future to only apply to documents which may have been impacted.\n\t\tconst shouldIgnoreEdit = this.editLog.tryGetIndexOfId(editId) !== undefined && !wasLocalEdit;\n\t\tif (shouldIgnoreEdit) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editLog.addSequencedEdit(edit, message);\n\t\tif (!wasLocalEdit) {\n\t\t\tconst eventArguments: EditCommittedEventArguments<GenericSharedTree<TChange>> = {\n\t\t\t\teditId,\n\t\t\t\tlocal: false,\n\t\t\t\ttree: this,\n\t\t\t};\n\t\t\tthis.emit(SharedTreeEvent.EditCommitted, eventArguments);\n\t\t} else {\n\t\t\t// If this client created the edit that filled up a chunk, it is responsible for uploading that chunk.\n\t\t\tconst lastPair = this.editLog.getLastEditChunk();\n\t\t\tif (lastPair !== undefined) {\n\t\t\t\tconst [startRevision, chunk] = lastPair;\n\t\t\t\tconst edits = assertNotUndefined(chunk.edits);\n\t\t\t\tif (edits.length === this.editLog.editsPerChunk) {\n\t\t\t\t\tvoid this.uploadEditChunk(edits, startRevision);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add an `Edit` directly.\n\t * External users should use one of the more specialized functions, like applyEdit which handles constructing the actual `Edit` object.\n\t * This is exposed as it is useful for testing, particularly with invalid and malformed Edits.\n\t * @internal\n\t */\n\tpublic processLocalEdit(edit: Edit<TChange>): void {\n\t\tconst editOp: SharedTreeEditOp<TChange> = {\n\t\t\ttype: SharedTreeOpType.Edit,\n\t\t\tedit,\n\t\t};\n\n\t\t// IFluidHandles are not allowed in Ops.\n\t\t// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.\n\t\t// So replace the handles before sending:\n\t\tconst semiSerialized = this.serializer.replaceHandles(editOp, this.handle);\n\n\t\t// TODO:44711: what should be passed in when unattached?\n\t\tthis.submitLocalMessage(semiSerialized);\n\t\tthis.editLog.addLocalEdit(edit);\n\n\t\tconst eventArguments: EditCommittedEventArguments<GenericSharedTree<TChange>> = {\n\t\t\teditId: edit.id,\n\t\t\tlocal: true,\n\t\t\ttree: this,\n\t\t};\n\t\tthis.emit(SharedTreeEvent.EditCommitted, eventArguments);\n\t}\n\n\tpublic getRuntime(): IFluidDataStoreRuntime {\n\t\treturn this.runtime;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error('not implemented');\n\t}\n}\n"]}
1
+ {"version":3,"file":"GenericSharedTree.js","sourceRoot":"","sources":["../../src/generic/GenericSharedTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { bufferToString, IsoBuffer } from '@fluidframework/common-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { ISequencedDocumentMessage } from '@fluidframework/protocol-definitions';\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n\tIChannelAttributes,\n} from '@fluidframework/datastore-definitions';\nimport { AttachState } from '@fluidframework/container-definitions';\nimport {\n\tcreateSingleBlobSummary,\n\tIFluidSerializer,\n\tISharedObjectEvents,\n\tserializeHandles,\n\tSharedObject,\n} from '@fluidframework/shared-object-base';\nimport { ITelemetryLogger } from '@fluidframework/common-definitions';\nimport { ChildLogger, ITelemetryLoggerPropertyBags, PerformanceEvent } from '@fluidframework/telemetry-utils';\nimport { ISummaryTreeWithStats } from '@fluidframework/runtime-definitions';\nimport { assert, assertNotUndefined, fail } from '../Common';\nimport { EditLog, OrderedEditSet } from '../EditLog';\nimport { EditId } from '../Identifiers';\nimport { Snapshot } from '../Snapshot';\nimport { initialTree } from '../InitialTree';\nimport { CachingLogViewer, EditStatusCallback, LogViewer } from '../LogViewer';\nimport { convertSummaryToReadFormat, deserialize, readFormatVersion } from '../SummaryBackCompatibility';\nimport {\n\tEdit,\n\tSharedTreeOpType,\n\tSharedTreeEditOp,\n\tSharedTreeHandleOp,\n\tEditWithoutId,\n\tSharedTreeOp,\n\tEditStatus,\n} from './PersistedTypes';\nimport { serialize, SharedTreeSummarizer, SharedTreeSummary, SharedTreeSummaryBase } from './Summary';\nimport { GenericTransaction } from './GenericTransaction';\nimport { newEdit } from './GenericEditUtilities';\n\n/**\n * Filename where the snapshot is stored.\n */\nconst snapshotFileName = 'header';\n\nconst initialSummary: SharedTreeSummary<unknown> = {\n\tversion: readFormatVersion,\n\tcurrentTree: initialTree,\n\teditHistory: {\n\t\teditChunks: [],\n\t\teditIds: [],\n\t},\n};\n\n/**\n * An event emitted by a `SharedTree` to indicate a state change. See {@link ISharedTreeEvents} for event argument information.\n * @public\n */\nexport enum SharedTreeEvent {\n\t/**\n\t * An edit has been committed to the log.\n\t * This happens when either:\n\t * \t1. A locally generated edit is added to the log.\n\t * \t2. A remotely generated edit is added to the log.\n\t * Note that, for locally generated edits, this event will not be emitted again when that edit is sequenced.\n\t * Passed the EditId of the committed edit, i.e. supports callbacks of type {@link EditCommittedHandler}.\n\t */\n\tEditCommitted = 'committedEdit',\n}\n\n/**\n * An event emitted by a `SharedTree` for diagnostic purposes.\n * See {@link ISharedTreeEvents} for event argument information.\n */\nexport enum SharedTreeDiagnosticEvent {\n\t/**\n\t * A single catch up blob has been uploaded.\n\t */\n\tCatchUpBlobUploaded = 'uploadedCatchUpBlob',\n\t/**\n\t * A valid edit (local or remote) has been applied.\n\t * Passed the EditId of the applied edit.\n\t * Note that this may be called multiple times, due to concurrent edits causing reordering,\n\t * and/or due to not caching the output of every edit.\n\t */\n\tAppliedEdit = 'appliedEdit',\n\t/**\n\t * An invalid edit (local or remote) has been dropped.\n\t * Passed the EditId of the dropped edit.\n\t * Note that this may be called multiple times, due to concurrent edits causing reordering,\n\t * and/or due to not caching the output of every edit.\n\t */\n\tDroppedInvalidEdit = 'droppedInvalidEdit',\n\t/**\n\t * A malformed edit (local or remote) has been dropped.\n\t * Passed the EditId of the dropped edit.\n\t * Note that this may be called multiple times, due to concurrent edits causing reordering,\n\t * and/or due to not caching the output of every edit.\n\t */\n\tDroppedMalformedEdit = 'droppedMalformedEdit',\n}\n\n/**\n * The arguments included when the EditCommitted SharedTreeEvent is emitted.\n * @public\n */\nexport interface EditCommittedEventArguments<TSharedTree> {\n\t/** The ID of the edit committed. */\n\teditId: EditId;\n\t/** Whether or not this is a local edit. */\n\tlocal: boolean;\n\t/** The tree the edit was committed on. Required for local edit events handled by SharedTreeUndoRedoHandler. */\n\ttree: TSharedTree;\n}\n\n/**\n * Events which may be emitted by `SharedTree`. See {@link SharedTreeEvent} for documentation of event semantics.\n */\nexport interface ISharedTreeEvents<TSharedTree> extends ISharedObjectEvents {\n\t(event: 'committedEdit', listener: EditCommittedHandler<TSharedTree>);\n}\n\n/**\n * Expected type for a handler of the `EditCommitted` event.\n */\nexport type EditCommittedHandler<TSharedTree> = (args: EditCommittedEventArguments<TSharedTree>) => void;\n\nconst sharedTreeTelemetryProperties: ITelemetryLoggerPropertyBags = { all: { isSharedTreeEvent: true } };\n\n/**\n * A distributed tree.\n * @public\n */\nexport abstract class GenericSharedTree<TChange> extends SharedObject<ISharedTreeEvents<TChange>> {\n\t/**\n\t * The log of completed edits for this SharedTree.\n\t */\n\tprivate editLog: EditLog<TChange>;\n\n\t/**\n\t * As an implementation detail, SharedTree uses a log viewer that caches snapshots at different revisions.\n\t * It is not exposed to avoid accidental correctness issues, but `logViewer` is exposed in order to give clients a way\n\t * to access the revision history.\n\t */\n\tprivate cachingLogViewer: CachingLogViewer<TChange>;\n\n\t/**\n\t * Viewer for trees defined by editLog. This allows access to views of the tree at different revisions (various points in time).\n\t */\n\tpublic get logViewer(): LogViewer {\n\t\treturn this.cachingLogViewer;\n\t}\n\n\tprotected readonly logger: ITelemetryLogger;\n\n\tpublic readonly transactionFactory: (snapshot: Snapshot) => GenericTransaction<TChange>;\n\n\t/** Indicates if the client is the oldest member of the quorum. */\n\tprivate currentIsOldest: boolean;\n\n\tprivate readonly processEditResult = (editResult: EditStatus, editId: EditId): void => {\n\t\t// TODO:#44859: Invalid results should be handled by the app\n\t\tthis.emit(GenericSharedTree.eventFromEditResult(editResult), editId);\n\t};\n\n\t/**\n\t * Create a new SharedTreeFactory.\n\t * @param runtime - The runtime the SharedTree will be associated with\n\t * @param id - Unique ID for the SharedTree\n\t * @param expensiveValidation - Enable expensive asserts.\n\t * @param summarizeHistory - Determines if the history is included in summaries.\n\t */\n\tpublic constructor(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\ttransactionFactory: (snapshot: Snapshot) => GenericTransaction<TChange>,\n\t\tattributes: IChannelAttributes,\n\t\tprivate readonly expensiveValidation = false,\n\t\tprotected readonly summarizeHistory = true\n\t) {\n\t\tsuper(id, runtime, attributes);\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.transactionFactory = transactionFactory;\n\n\t\t// This code is somewhat duplicated from OldestClientObserver because it currently depends on the container runtime\n\t\t// which SharedTree does not have access to.\n\t\t// TODO:#55900: Get rid of copy-pasted OldestClientObserver code\n\t\tconst quorum = this.runtime.getQuorum();\n\t\tthis.currentIsOldest = this.computeIsOldest();\n\t\tquorum.on('addMember', this.updateOldest);\n\t\tquorum.on('removeMember', this.updateOldest);\n\t\truntime.on('connected', this.updateOldest);\n\t\truntime.on('disconnected', this.updateOldest);\n\n\t\tthis.logger = ChildLogger.create(runtime.logger, 'SharedTree', sharedTreeTelemetryProperties);\n\t\tconst { editLog, cachingLogViewer } = this.createEditLogFromSummary(initialSummary, this.processEditResult);\n\n\t\tthis.editLog = editLog;\n\t\tthis.cachingLogViewer = cachingLogViewer;\n\t}\n\n\t/**\n\t * Re-computes currentIsOldest and emits an event if it has changed.\n\t * TODO:#55900: Get rid of copy-pasted OldestClientObserver code\n\t */\n\tprivate readonly updateOldest = () => {\n\t\tconst oldest = this.computeIsOldest();\n\t\tif (this.currentIsOldest !== oldest) {\n\t\t\tthis.currentIsOldest = oldest;\n\t\t\tif (oldest) {\n\t\t\t\tthis.emit('becameOldest');\n\t\t\t} else {\n\t\t\t\tthis.emit('lostOldest');\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Computes the oldest client in the quorum, true by default if the container is detached and false by default if the client isn't connected.\n\t * TODO:#55900: Get rid of copy-pasted OldestClientObserver code\n\t */\n\tprivate computeIsOldest(): boolean {\n\t\t// If the container is detached, we are the only ones that know about it and are the oldest by default.\n\t\tif (this.runtime.attachState === AttachState.Detached) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If we're not connected we can't be the oldest connected client.\n\t\tif (!this.runtime.connected) {\n\t\t\treturn false;\n\t\t}\n\n\t\tassert(this.runtime.clientId !== undefined, 'Client id should be set if connected.');\n\n\t\tconst quorum = this.runtime.getQuorum();\n\t\tconst selfSequencedClient = quorum.getMember(this.runtime.clientId);\n\t\t// When in readonly mode our clientId will not be present in the quorum.\n\t\tif (selfSequencedClient === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst members = quorum.getMembers();\n\t\tfor (const sequencedClient of members.values()) {\n\t\t\tif (sequencedClient.sequenceNumber < selfSequencedClient.sequenceNumber) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// No member of the quorum was older\n\t\treturn true;\n\t}\n\n\t/**\n\t * @returns the current view of the tree.\n\t */\n\tpublic get currentView(): Snapshot {\n\t\treturn this.logViewer.getSnapshotInSession(Number.POSITIVE_INFINITY);\n\t}\n\n\t/**\n\t * @returns the edit history of the tree.\n\t */\n\tpublic get edits(): OrderedEditSet<TChange> {\n\t\treturn this.editLog;\n\t}\n\n\t/**\n\t * Convenience helper for applying an edit containing the given changes.\n\t * Opens an edit, applies the given changes, and closes the edit. See (`openEdit()`/`applyChanges()`/`closeEdit()`).\n\t *\n\t * For convenient imperative variants of edits, see `editor`.\n\t * @internal\n\t */\n\tpublic applyEdit(...changes: TChange[]): EditId {\n\t\tconst edit = newEdit(changes);\n\t\tthis.processLocalEdit(edit);\n\t\treturn edit.id;\n\t}\n\n\tprivate deserializeHandle(serializedHandle: string): IFluidHandle<ArrayBufferLike> {\n\t\tconst deserializeHandle = this.serializer.parse(serializedHandle);\n\t\tassert(typeof deserializeHandle === 'object');\n\t\treturn deserializeHandle as IFluidHandle<ArrayBufferLike>;\n\t}\n\n\t/**\n\t * Uploads the edit chunk and sends the chunk starting revision along with the resulting handle as an op.\n\t */\n\tprivate async uploadEditChunk(edits: readonly EditWithoutId<TChange>[], startRevision: number): Promise<void> {\n\t\ttry {\n\t\t\tconst editHandle = await this.runtime.uploadBlob(IsoBuffer.from(JSON.stringify({ edits })));\n\t\t\tthis.submitLocalMessage({\n\t\t\t\teditHandle: serializeHandles(editHandle, this.serializer, this.handle),\n\t\t\t\tstartRevision,\n\t\t\t\ttype: SharedTreeOpType.Handle,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\t// If chunk load fails, we will try again later in loadCore on the oldest client so we log the error instead of throwing.\n\t\t\tthis.logger.sendErrorEvent(\n\t\t\t\t{\n\t\t\t\t\teventName: 'EditChunkUploadFailure',\n\t\t\t\t},\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.summarizeCore}\n\t */\n\tpublic summarizeCore(serializer: IFluidSerializer, fullTree: boolean): ISummaryTreeWithStats {\n\t\treturn createSingleBlobSummary(snapshotFileName, this.saveSerializedSummary({ serializer }));\n\t}\n\n\t/**\n\t * Saves this SharedTree into a serialized summary.\n\t *\n\t * @param options - Optional serializer and summarizer to use. If not passed in, SharedTree's serializer and summarizer are used.\n\t * @internal\n\t */\n\tpublic saveSerializedSummary(options?: {\n\t\tserializer?: IFluidSerializer;\n\t\tsummarizer?: SharedTreeSummarizer<TChange>;\n\t}): string {\n\t\tconst { serializer, summarizer } = options || {};\n\n\t\treturn serialize(\n\t\t\tsummarizer ? summarizer(this.editLog, this.currentView) : this.saveSummary(),\n\t\t\tserializer || this.serializer,\n\t\t\tthis.handle\n\t\t);\n\t}\n\n\t/**\n\t * Saves this SharedTree into a summary.\n\t * @internal\n\t */\n\tpublic saveSummary(): SharedTreeSummaryBase {\n\t\t// If local changes exist, emulate the sequencing of those changes.\n\t\t// Doing so is necessary so edits created during DataObject.initializingFirstTime are included.\n\t\t// Doing so is safe because it is guaranteed that the DDS has not yet been attached. This is because summary creation is only\n\t\t// ever invoked on a DataObject containing local changes when it is attached for the first time. In post-attach flows, an extra\n\t\t// instance of the DataObject is created for generating summaries and will never have local edits.\n\t\tif (this.editLog.numberOfLocalEdits > 0) {\n\t\t\tassert(\n\t\t\t\tthis.runtime.attachState !== AttachState.Attached,\n\t\t\t\t'Summarizing should not occur with local edits except on first attach.'\n\t\t\t);\n\t\t\tthis.editLog.sequenceLocalEdits();\n\t\t}\n\n\t\tassert(this.editLog.numberOfLocalEdits === 0, 'generateSummary must not be called with local edits');\n\t\treturn this.generateSummary(this.editLog);\n\t}\n\n\t/**\n\t * Generates a SharedTree summary for the current state of the tree.\n\t * Will never be called when local edits are present.\n\t */\n\tprotected abstract generateSummary(editLog: OrderedEditSet<TChange>): SharedTreeSummaryBase;\n\n\t/**\n\t * Initialize shared tree with a summary.\n\t * @internal\n\t */\n\tpublic loadSummary(summary: SharedTreeSummaryBase): void {\n\t\tconst { editLog, cachingLogViewer } = this.createEditLogFromSummary(summary, this.processEditResult);\n\t\tthis.editLog = editLog;\n\t\tthis.cachingLogViewer = cachingLogViewer;\n\n\t\tif (this.runtime.connected) {\n\t\t\tconst noChunksReadyForUpload = this.editLog.getEditChunksReadyForUpload()[Symbol.iterator]().next().done;\n\t\t\tif (noChunksReadyForUpload === undefined || !noChunksReadyForUpload) {\n\t\t\t\t// A client does not become a member of the quorum until it is within the collaboration window.\n\t\t\t\t//\n\t\t\t\t// The collaboration window is the range from the minimum sequence number enforced by the server and head.\n\t\t\t\t// When a client sends an op, they include the last sequence number the client has processed. We call this the reference\n\t\t\t\t// sequence number.\n\t\t\t\t//\n\t\t\t\t// If there are no members in the quorum, we send a no op op in order to have this client added as a member to the quorum.\n\t\t\t\t// This is required so we can ensure only the oldest client will upload blobs during summary load.\n\t\t\t\tif (this.runtime.getQuorum().getMembers().size === 0) {\n\t\t\t\t\tconst noop: SharedTreeOp = {\n\t\t\t\t\t\ttype: SharedTreeOpType.NoOp,\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.submitLocalMessage(noop);\n\t\t\t\t} else if (this.currentIsOldest) {\n\t\t\t\t\tvoid this.uploadCatchUpBlobs();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this client becomes the oldest, it should take care of uploading catch up blobs.\n\t\t\tthis.on('becameOldest', () => void this.uploadCatchUpBlobs());\n\t\t}\n\t}\n\n\tprivate static eventFromEditResult(editStatus: EditStatus): SharedTreeDiagnosticEvent {\n\t\tswitch (editStatus) {\n\t\t\tcase EditStatus.Applied:\n\t\t\t\treturn SharedTreeDiagnosticEvent.AppliedEdit;\n\t\t\tcase EditStatus.Invalid:\n\t\t\t\treturn SharedTreeDiagnosticEvent.DroppedInvalidEdit;\n\t\t\tdefault:\n\t\t\t\treturn SharedTreeDiagnosticEvent.DroppedMalformedEdit;\n\t\t}\n\t}\n\n\tprivate createEditLogFromSummary(\n\t\tsummary: SharedTreeSummaryBase,\n\t\tcallback: EditStatusCallback\n\t): { editLog: EditLog<TChange>; cachingLogViewer: CachingLogViewer<TChange> } {\n\t\tconst convertedSummary = convertSummaryToReadFormat<TChange>(summary);\n\t\tif (typeof convertedSummary === 'string') {\n\t\t\tfail(convertedSummary);\n\t\t}\n\t\tconst { editHistory, currentTree } = convertedSummary;\n\t\tconst currentView = Snapshot.fromTree(currentTree);\n\n\t\tconst editLog = new EditLog(editHistory, this.logger);\n\t\tconst logViewer = new CachingLogViewer(\n\t\t\teditLog,\n\t\t\tSnapshot.fromTree(initialTree),\n\t\t\t// TODO:#47830: Store multiple checkpoints in summary.\n\t\t\t[[editLog.length, { snapshot: currentView }]],\n\t\t\tthis.expensiveValidation,\n\t\t\tcallback,\n\t\t\tthis.logger,\n\t\t\tthis.transactionFactory,\n\t\t\t0\n\t\t);\n\n\t\treturn { editLog, cachingLogViewer: logViewer };\n\t}\n\n\t/**\n\t * Upload any full chunks that have yet to be uploaded.\n\t */\n\tprivate async uploadCatchUpBlobs(): Promise<void> {\n\t\tfor (const [startRevision, chunk] of this.editLog.getEditChunksReadyForUpload()) {\n\t\t\tawait this.uploadEditChunk(chunk, startRevision);\n\t\t\tthis.emit(SharedTreeDiagnosticEvent.CatchUpBlobUploaded);\n\t\t}\n\t}\n\n\t/**\n\t * Compares this shared tree to another for equality.\n\t *\n\t * Equality means that the histories as captured by the EditLogs are equal.\n\t *\n\t * Equality does not include:\n\t * - if an edit is open\n\t * - the shared tree's id\n\t * - local vs sequenced status of edits\n\t * - registered event listeners\n\t * - state of caches\n\t * */\n\tpublic equals<TOtherChangeTypes>(sharedTree: GenericSharedTree<TOtherChangeTypes>): boolean {\n\t\tif (!this.currentView.equals(sharedTree.currentView)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.editLog.equals(sharedTree.editLog);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.loadCore}\n\t */\n\tprotected async loadCore(storage: IChannelStorageService): Promise<void> {\n\t\tconst summaryLoadPerformanceEvent = PerformanceEvent.start(this.logger, { eventName: 'SummaryLoad' });\n\n\t\ttry {\n\t\t\tconst newBlob = await storage.readBlob(snapshotFileName);\n\t\t\tconst blobData = bufferToString(newBlob, 'utf8');\n\n\t\t\tconst summary = deserialize(blobData, this.serializer);\n\t\t\tif (typeof summary === 'string') {\n\t\t\t\tfail(summary);\n\t\t\t}\n\t\t\tthis.loadSummary(summary);\n\n\t\t\tsummaryLoadPerformanceEvent.end({ historySize: this.edits.length });\n\t\t} catch (error) {\n\t\t\tsummaryLoadPerformanceEvent.cancel(undefined, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.processCore}\n\t */\n\tprotected processCore(message: ISequencedDocumentMessage, local: boolean): void {\n\t\tthis.cachingLogViewer.setMinimumSequenceNumber(message.minimumSequenceNumber);\n\t\tconst { type } = message.contents;\n\t\tif (type === SharedTreeOpType.Handle) {\n\t\t\tconst { editHandle, startRevision } = message.contents as SharedTreeHandleOp;\n\t\t\tthis.editLog.processEditChunkHandle(this.deserializeHandle(editHandle), startRevision);\n\t\t} else if (type === SharedTreeOpType.Edit) {\n\t\t\tconst semiSerializedEdit = message.contents.edit;\n\t\t\t// semiSerializedEdit may have handles which have been replaced by `serializer.encode`.\n\t\t\t// Since there is no API to un-replace them except via parse, re-stringify the edit, then parse it.\n\t\t\t// Stringify using JSON, not IFluidSerializer since OPs use JSON directly.\n\t\t\t// TODO:Performance:#48025: Avoid this serialization round trip.\n\t\t\tconst stringEdit = JSON.stringify(semiSerializedEdit);\n\t\t\tconst parsedEdit = this.serializer.parse(stringEdit);\n\t\t\tconst edit = parsedEdit as Edit<TChange>;\n\t\t\tthis.processSequencedEdit(edit, message);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.registerCore}\n\t */\n\tprotected registerCore(): void {\n\t\t// Do nothing\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.onDisconnect}\n\t */\n\tprotected onDisconnect(): void {\n\t\t// Do nothing\n\t}\n\n\tprivate processSequencedEdit(edit: Edit<TChange>, message: ISequencedDocumentMessage): void {\n\t\tconst { id: editId } = edit;\n\t\tconst wasLocalEdit = this.editLog.isLocalEdit(editId);\n\n\t\t// If the id of the supplied edit matches a non-local edit already present in the log, this would normally be indicative of an error.\n\t\t// However, the @fluidframework packages prior to 0.37.x have a bug which can cause data corruption by sequencing duplicate edits--\n\t\t// see discussion on the following github issue: https://github.com/microsoft/FluidFramework/issues/4399\n\t\t// To work around this issue, we currently tolerate duplicate ops in loaded documents.\n\t\t// This could be strengthened in the future to only apply to documents which may have been impacted.\n\t\tconst shouldIgnoreEdit = this.editLog.tryGetIndexOfId(editId) !== undefined && !wasLocalEdit;\n\t\tif (shouldIgnoreEdit) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editLog.addSequencedEdit(edit, message);\n\t\tif (!wasLocalEdit) {\n\t\t\tconst eventArguments: EditCommittedEventArguments<GenericSharedTree<TChange>> = {\n\t\t\t\teditId,\n\t\t\t\tlocal: false,\n\t\t\t\ttree: this,\n\t\t\t};\n\t\t\tthis.emit(SharedTreeEvent.EditCommitted, eventArguments);\n\t\t} else {\n\t\t\t// If this client created the edit that filled up a chunk, it is responsible for uploading that chunk.\n\t\t\tconst lastPair = this.editLog.getLastEditChunk();\n\t\t\tif (lastPair !== undefined) {\n\t\t\t\tconst [startRevision, chunk] = lastPair;\n\t\t\t\tconst edits = assertNotUndefined(chunk.edits);\n\t\t\t\tif (edits.length === this.editLog.editsPerChunk) {\n\t\t\t\t\tvoid this.uploadEditChunk(edits, startRevision);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Add an `Edit` directly.\n\t * External users should use one of the more specialized functions, like applyEdit which handles constructing the actual `Edit` object.\n\t * This is exposed as it is useful for testing, particularly with invalid and malformed Edits.\n\t * @internal\n\t */\n\tpublic processLocalEdit(edit: Edit<TChange>): void {\n\t\tconst editOp: SharedTreeEditOp<TChange> = {\n\t\t\ttype: SharedTreeOpType.Edit,\n\t\t\tedit,\n\t\t};\n\n\t\t// IFluidHandles are not allowed in Ops.\n\t\t// Ops can contain Fluid's Serializable (for payloads) which allows IFluidHandles.\n\t\t// So replace the handles before sending:\n\t\tconst semiSerialized = this.serializer.encode(editOp, this.handle);\n\n\t\t// TODO:44711: what should be passed in when unattached?\n\t\tthis.submitLocalMessage(semiSerialized);\n\t\tthis.editLog.addLocalEdit(edit);\n\n\t\tconst eventArguments: EditCommittedEventArguments<GenericSharedTree<TChange>> = {\n\t\t\teditId: edit.id,\n\t\t\tlocal: true,\n\t\t\ttree: this,\n\t\t};\n\t\tthis.emit(SharedTreeEvent.EditCommitted, eventArguments);\n\t}\n\n\tpublic getRuntime(): IFluidDataStoreRuntime {\n\t\treturn this.runtime;\n\t}\n\n\tprotected applyStashedOp() {\n\t\tthrow new Error('not implemented');\n\t}\n}\n"]}
@@ -2,7 +2,8 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidHandle, IFluidSerializer } from '@fluidframework/core-interfaces';
5
+ import { IFluidHandle } from '@fluidframework/core-interfaces';
6
+ import { IFluidSerializer } from '@fluidframework/shared-object-base';
6
7
  import { EditLogSummary, OrderedEditSet } from '../EditLog';
7
8
  import { Snapshot } from '../Snapshot';
8
9
  import { SharedTreeSummary_0_0_2 } from '../SummaryBackCompatibility';
@@ -1 +1 @@
1
- {"version":3,"file":"Summary.d.ts","sourceRoot":"","sources":["../../src/generic/Summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGjF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAqB,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;;;;;GAMG;AACH,oBAAY,oBAAoB,CAAC,OAAO,IAAI,CAC3C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,QAAQ,KACjB,qBAAqB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,OAAO,CAAE,SAAQ,qBAAqB;IACxE,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAElH;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAC5C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,QAAQ,GACnB,uBAAuB,CAAC,OAAO,CAAC,CAwBlC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAClD,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,QAAQ,GACnB,iBAAiB,CAAC,OAAO,CAAC,CAM5B"}
1
+ {"version":3,"file":"Summary.d.ts","sourceRoot":"","sources":["../../src/generic/Summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAoB,MAAM,oCAAoC,CAAC;AAExF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAqB,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,EAAE,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;;;;;GAMG;AACH,oBAAY,oBAAoB,CAAC,OAAO,IAAI,CAC3C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,QAAQ,KACjB,qBAAqB,CAAC;AAE3B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,OAAO,CAAE,SAAQ,qBAAqB;IACxE,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAElH;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAC5C,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,QAAQ,GACnB,uBAAuB,CAAC,OAAO,CAAC,CAwBlC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAClD,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,EAChC,WAAW,EAAE,QAAQ,GACnB,iBAAiB,CAAC,OAAO,CAAC,CAM5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"Summary.js","sourceRoot":"","sources":["../../src/generic/Summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAA2B,MAAM,6BAA6B,CAAC;AAGzF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAqCrC;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,OAA8B,EAAE,UAA4B,EAAE,IAAkB;IACzG,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACpC,OAAgC,EAChC,WAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAE5D,MAAM,cAAc,GAAoB,EAAE,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,MAAM,CACL,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACpB,4FAA4F,CAC5F,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,cAAc,CAAC,IAAI,CAAC;gBACnB,OAAO;gBACP,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,kDAAkD,CAAC;aAC9F,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,WAAW,EAAE,WAAW,CAAC,iBAAiB,EAAE;QAC5C,cAAc;QACd,OAAO,EAAE,aAAa;KACtB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAC1C,OAAgC,EAChC,WAAqB;IAErB,OAAO;QACN,WAAW,EAAE,WAAW,CAAC,iBAAiB,EAAE;QAC5C,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC5C,OAAO,EAAE,iBAAiB;KAC1B,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle, IFluidSerializer } from '@fluidframework/core-interfaces';\nimport { serializeHandles } from '@fluidframework/shared-object-base';\nimport { assert, assertNotUndefined } from '../Common';\nimport { EditLogSummary, OrderedEditSet } from '../EditLog';\nimport { Snapshot } from '../Snapshot';\nimport { readFormatVersion, SharedTreeSummary_0_0_2 } from '../SummaryBackCompatibility';\nimport { ChangeNode, Edit } from './PersistedTypes';\n\n/**\n * Format version for summaries that are written.\n * When next changing the format, we should add a new format version variable for the edit-specific summaries and assign it an independent\n * version number.\n */\nexport const formatVersion = '0.0.2';\n\n/**\n * Handler for summarizing the tree state.\n * The handler is invoked when saving a summary. It accepts a view of the current state of the tree, the sequenced edits known\n * to the SharedTree, and optional helpers for serializing the edit information.\n * @returns a summary of the supplied state.\n * @internal\n */\nexport type SharedTreeSummarizer<TChange> = (\n\teditLog: OrderedEditSet<TChange>,\n\tcurrentView: Snapshot\n) => SharedTreeSummaryBase;\n\n/**\n * The minimal information on a SharedTree summary. Contains the summary format version.\n */\nexport interface SharedTreeSummaryBase {\n\t/**\n\t * Field on summary under which version is stored.\n\t */\n\treadonly version: string;\n}\n\n/**\n * The contents of a SharedTree summary: the current tree, and the edits needed to get from `initialTree` to the current tree.\n * @public\n */\nexport interface SharedTreeSummary<TChange> extends SharedTreeSummaryBase {\n\treadonly currentTree: ChangeNode;\n\n\t/**\n\t * Information that can populate an edit log.\n\t */\n\treadonly editHistory?: EditLogSummary<TChange>;\n}\n\n/**\n * Serializes a SharedTree summary into a JSON string. This may later be used to initialize a SharedTree's state via `deserialize()`\n * Also replaces handle objects with their serialized form.\n *\n * @param summary - The SharedTree summary to serialize.\n * @param serializer - The serializer required to serialize handles in the summary.\n * @param bind - The object handle required to serialize handles in the summary\n */\nexport function serialize(summary: SharedTreeSummaryBase, serializer: IFluidSerializer, bind: IFluidHandle): string {\n\treturn assertNotUndefined(serializeHandles(summary, serializer, bind));\n}\n\n/**\n * Preserves the full history in the generated summary.\n * @public\n */\nexport function fullHistorySummarizer<TChange>(\n\teditLog: OrderedEditSet<TChange>,\n\tcurrentView: Snapshot\n): SharedTreeSummary_0_0_2<TChange> {\n\tconst { editChunks, editIds } = editLog.getEditLogSummary();\n\n\tconst sequencedEdits: Edit<TChange>[] = [];\n\tlet idIndex = 0;\n\teditChunks.forEach(({ chunk }) => {\n\t\tassert(\n\t\t\tArray.isArray(chunk),\n\t\t\t'Handles should not be included in the summary until format version 0.1.0 is being written.'\n\t\t);\n\n\t\tchunk.forEach(({ changes }) => {\n\t\t\tsequencedEdits.push({\n\t\t\t\tchanges,\n\t\t\t\tid: assertNotUndefined(editIds[idIndex++], 'Number of edits should match number of edit IDs.'),\n\t\t\t});\n\t\t});\n\t});\n\n\treturn {\n\t\tcurrentTree: currentView.getChangeNodeTree(),\n\t\tsequencedEdits,\n\t\tversion: formatVersion,\n\t};\n}\n\n/**\n * Generates a summary with format version 0.1.0. This will prefer handles over edits in edit chunks where possible.\n */\nexport function fullHistorySummarizer_0_1_0<TChange>(\n\teditLog: OrderedEditSet<TChange>,\n\tcurrentView: Snapshot\n): SharedTreeSummary<TChange> {\n\treturn {\n\t\tcurrentTree: currentView.getChangeNodeTree(),\n\t\teditHistory: editLog.getEditLogSummary(true),\n\t\tversion: readFormatVersion,\n\t};\n}\n"]}
1
+ {"version":3,"file":"Summary.js","sourceRoot":"","sources":["../../src/generic/Summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAoB,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACxF,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAA2B,MAAM,6BAA6B,CAAC;AAGzF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAqCrC;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,OAA8B,EAAE,UAA4B,EAAE,IAAkB;IACzG,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACpC,OAAgC,EAChC,WAAqB;IAErB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAE5D,MAAM,cAAc,GAAoB,EAAE,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,MAAM,CACL,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACpB,4FAA4F,CAC5F,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,cAAc,CAAC,IAAI,CAAC;gBACnB,OAAO;gBACP,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,kDAAkD,CAAC;aAC9F,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,WAAW,EAAE,WAAW,CAAC,iBAAiB,EAAE;QAC5C,cAAc;QACd,OAAO,EAAE,aAAa;KACtB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAC1C,OAAgC,EAChC,WAAqB;IAErB,OAAO;QACN,WAAW,EAAE,WAAW,CAAC,iBAAiB,EAAE;QAC5C,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC5C,OAAO,EAAE,iBAAiB;KAC1B,CAAC;AACH,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { IFluidSerializer, serializeHandles } from '@fluidframework/shared-object-base';\nimport { assert, assertNotUndefined } from '../Common';\nimport { EditLogSummary, OrderedEditSet } from '../EditLog';\nimport { Snapshot } from '../Snapshot';\nimport { readFormatVersion, SharedTreeSummary_0_0_2 } from '../SummaryBackCompatibility';\nimport { ChangeNode, Edit } from './PersistedTypes';\n\n/**\n * Format version for summaries that are written.\n * When next changing the format, we should add a new format version variable for the edit-specific summaries and assign it an independent\n * version number.\n */\nexport const formatVersion = '0.0.2';\n\n/**\n * Handler for summarizing the tree state.\n * The handler is invoked when saving a summary. It accepts a view of the current state of the tree, the sequenced edits known\n * to the SharedTree, and optional helpers for serializing the edit information.\n * @returns a summary of the supplied state.\n * @internal\n */\nexport type SharedTreeSummarizer<TChange> = (\n\teditLog: OrderedEditSet<TChange>,\n\tcurrentView: Snapshot\n) => SharedTreeSummaryBase;\n\n/**\n * The minimal information on a SharedTree summary. Contains the summary format version.\n */\nexport interface SharedTreeSummaryBase {\n\t/**\n\t * Field on summary under which version is stored.\n\t */\n\treadonly version: string;\n}\n\n/**\n * The contents of a SharedTree summary: the current tree, and the edits needed to get from `initialTree` to the current tree.\n * @public\n */\nexport interface SharedTreeSummary<TChange> extends SharedTreeSummaryBase {\n\treadonly currentTree: ChangeNode;\n\n\t/**\n\t * Information that can populate an edit log.\n\t */\n\treadonly editHistory?: EditLogSummary<TChange>;\n}\n\n/**\n * Serializes a SharedTree summary into a JSON string. This may later be used to initialize a SharedTree's state via `deserialize()`\n * Also replaces handle objects with their serialized form.\n *\n * @param summary - The SharedTree summary to serialize.\n * @param serializer - The serializer required to serialize handles in the summary.\n * @param bind - The object handle required to serialize handles in the summary\n */\nexport function serialize(summary: SharedTreeSummaryBase, serializer: IFluidSerializer, bind: IFluidHandle): string {\n\treturn assertNotUndefined(serializeHandles(summary, serializer, bind));\n}\n\n/**\n * Preserves the full history in the generated summary.\n * @public\n */\nexport function fullHistorySummarizer<TChange>(\n\teditLog: OrderedEditSet<TChange>,\n\tcurrentView: Snapshot\n): SharedTreeSummary_0_0_2<TChange> {\n\tconst { editChunks, editIds } = editLog.getEditLogSummary();\n\n\tconst sequencedEdits: Edit<TChange>[] = [];\n\tlet idIndex = 0;\n\teditChunks.forEach(({ chunk }) => {\n\t\tassert(\n\t\t\tArray.isArray(chunk),\n\t\t\t'Handles should not be included in the summary until format version 0.1.0 is being written.'\n\t\t);\n\n\t\tchunk.forEach(({ changes }) => {\n\t\t\tsequencedEdits.push({\n\t\t\t\tchanges,\n\t\t\t\tid: assertNotUndefined(editIds[idIndex++], 'Number of edits should match number of edit IDs.'),\n\t\t\t});\n\t\t});\n\t});\n\n\treturn {\n\t\tcurrentTree: currentView.getChangeNodeTree(),\n\t\tsequencedEdits,\n\t\tversion: formatVersion,\n\t};\n}\n\n/**\n * Generates a summary with format version 0.1.0. This will prefer handles over edits in edit chunks where possible.\n */\nexport function fullHistorySummarizer_0_1_0<TChange>(\n\teditLog: OrderedEditSet<TChange>,\n\tcurrentView: Snapshot\n): SharedTreeSummary<TChange> {\n\treturn {\n\t\tcurrentTree: currentView.getChangeNodeTree(),\n\t\teditHistory: editLog.getEditLogSummary(true),\n\t\tversion: readFormatVersion,\n\t};\n}\n"]}
@@ -2,12 +2,13 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ import { FluidSerializer } from '@fluidframework/shared-object-base';
5
6
  import { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';
6
7
  import { expect } from 'chai';
7
8
  import { comparePayloads } from '../Common';
8
9
  describe('SnapshotUtilities', () => {
9
10
  describe('comparePayloads', () => {
10
- const serializer = new MockFluidDataStoreRuntime().IFluidSerializer;
11
+ const serializer = new FluidSerializer(new MockFluidDataStoreRuntime().IFluidHandleContext, () => { });
11
12
  const binder = { bind: () => void {} };
12
13
  let Equality;
13
14
  (function (Equality) {
@@ -1 +1 @@
1
- {"version":3,"file":"SnapshotUtilities.tests.js","sourceRoot":"","sources":["../../src/test/SnapshotUtilities.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { FluidSerializer } from '@fluidframework/runtime-utils';\nimport { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { comparePayloads } from '../Common';\nimport { Payload } from '../generic';\n\ndescribe('SnapshotUtilities', () => {\n\tdescribe('comparePayloads', () => {\n\t\tconst serializer: FluidSerializer = new MockFluidDataStoreRuntime().IFluidSerializer;\n\t\tconst binder: IFluidHandle = { bind: () => void {} } as unknown as IFluidHandle;\n\n\t\tenum Equality {\n\t\t\tEqual,\n\t\t\tUnequal,\n\t\t\tUnspecified,\n\t\t}\n\n\t\tfunction checkEquality(equal: boolean, equality: Equality): void {\n\t\t\tif (equality !== Equality.Unspecified) {\n\t\t\t\texpect(equal).equals(equality === Equality.Equal);\n\t\t\t}\n\t\t}\n\n\t\tfunction check(\n\t\t\ta: Payload,\n\t\t\tb: Payload,\n\t\t\tflags: { initial: Equality; serialized: Equality; deserialized: Equality; roundtrip: Equality }\n\t\t): void {\n\t\t\t// Check reflexive\n\t\t\texpect(comparePayloads(a, a)).equal(true);\n\t\t\texpect(comparePayloads(b, b)).equal(true);\n\n\t\t\tcheckEquality(comparePayloads(a, b), flags.initial);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(b, a), flags.initial);\n\n\t\t\tconst [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);\n\t\t\tconst [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);\n\n\t\t\tcheckEquality(aString === bString, flags.serialized);\n\t\t\tcheckEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);\n\t\t}\n\n\t\tfunction checkSerialization(a: Payload, roundtrip: Equality): [string, Payload] {\n\t\t\tconst aString = serializer.stringify(a, binder);\n\t\t\tconst a2: Payload = serializer.parse(aString);\n\t\t\tconst aString2 = serializer.stringify(a2, binder);\n\t\t\texpect(aString2).equal(aString);\n\t\t\tcheckEquality(comparePayloads(a, a2), roundtrip);\n\n\t\t\t// Check second round trip, should always be equal\n\t\t\tconst a3: Payload = serializer.parse(aString2);\n\t\t\texpect(comparePayloads(a3, a2)).true;\n\n\t\t\treturn [aString, a2];\n\t\t}\n\n\t\tconst allEqual = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Equal,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\t// For when the inputs are logically equal, but may serialize differently due to field ordering.\n\t\tconst allEqualUnstable = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tconst allUnequal = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tit('compares numbers correctly', () => {\n\t\t\tcheck(0, 0, allEqual);\n\t\t\tcheck(1, 1, allEqual);\n\t\t\tcheck(0, 1, allUnequal);\n\t\t\tcheck(-1, 1, allUnequal);\n\t\t\tcheck(5.2, 5.200000001, allUnequal);\n\t\t});\n\n\t\tit('compares strings', () => {\n\t\t\tcheck('', '', allEqual);\n\t\t\tcheck(' ', '', allUnequal);\n\t\t\tcheck('1', '+1', allUnequal);\n\t\t\t// This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work\n\t\t\t// Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.\n\t\t\tcheck('𤭢', '𤭢', allEqual);\n\t\t\tcheck('𤭢', '', allUnequal);\n\t\t\tcheck('several characters', 'several characters', allEqual);\n\t\t\tcheck('several characters', 'several_characters', allUnequal);\n\t\t});\n\n\t\tit('compares arrays', () => {\n\t\t\tcheck([], [], allEqual);\n\t\t\tcheck([1], [1], allEqual);\n\t\t\tcheck([[1]], [[1]], allEqual);\n\t\t\tcheck([[1]], [[2]], allUnequal);\n\t\t\tcheck([], [1], allUnequal);\n\t\t\tcheck([1, 2], [2, 1], allUnequal);\n\t\t});\n\n\t\tit('compares objects', () => {\n\t\t\tcheck({ 1: 'x' }, { 1: 'x' }, allEqual);\n\t\t\tcheck({ x: 'x' }, { y: 'x' }, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: {} }, allUnequal);\n\t\t\tcheck({ x: {} }, { x: {} }, allEqual);\n\t\t\tcheck({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);\n\t\t\tcheck({ 1: 'x' }, {}, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);\n\t\t\tcheck({ field: 'a' }, { field: 'b' }, allUnequal);\n\n\t\t\t// Fluid Serialization arbitrarily orders fields.\n\t\t\t// Thus any object with more than one field may have non-deterministic serialization.\n\t\t\t// However objects have field order, and we need to check comparePayloads is not impacted by it.\n\t\t\tcheck({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);\n\t\t});\n\n\t\tit('compares mixed types', () => {\n\t\t\tcheck({ 0: 1 }, [1], allUnequal);\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\t\t\t/* eslint-disable no-null/no-null */\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(1, '1', allUnequal);\n\t\t\tcheck(null, 0, allUnequal);\n\t\t\t/* eslint-enable no-null/no-null */\n\t\t\tcheck('', 0, allUnequal);\n\t\t});\n\n\t\tconst sameAfter = {\n\t\t\tinitial: Equality.Unspecified,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\t\tconst differentAfter = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\n\t\tit('lossy cases', () => {\n\t\t\t// Undefined fields are omitted in json, and thus lost on the round trip.\n\t\t\tcheck({ x: undefined }, { y: undefined }, sameAfter);\n\t\t\tcheck({ x: undefined }, {}, sameAfter);\n\n\t\t\t// NaN and Infinity become null\n\t\t\tcheck(NaN, NaN, sameAfter);\n\t\t\tcheck(NaN, 7, differentAfter);\n\t\t\tcheck(Infinity, Infinity, sameAfter);\n\t\t\tcheck(-Infinity, Infinity, sameAfter);\n\t\t\tcheck(NaN, 'NaN', differentAfter);\n\n\t\t\t// json loses -0 on round trip\n\t\t\tcheck(-0, -0, sameAfter);\n\t\t});\n\n\t\tit('compares handles', () => {\n\t\t\tfunction makeMockHandle(data: string): IFluidHandle {\n\t\t\t\tconst handleObject = { absolutePath: data, IFluidHandle: undefined as unknown };\n\t\t\t\thandleObject.IFluidHandle = handleObject;\n\t\t\t\tconst handle = handleObject as IFluidHandle;\n\t\t\t\t// Handle gets modified by serializing. This is probably because handle is malformed.\n\t\t\t\t// To avoid this being an issue, round trip it.\n\t\t\t\tconst serialized = serializer.stringify(handle, binder);\n\t\t\t\tconst finalHandle: IFluidHandle = serializer.parse(serialized);\n\t\t\t\treturn finalHandle;\n\t\t\t}\n\t\t\t// Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic\n\t\t\t// so use allEqualUnstable not allEqual.\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('y'), allUnequal);\n\t\t\tcheck({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);\n\t\t});\n\n\t\t// These are cases that are allowed by the type system and produce unexpected results due to Json serialization.\n\t\t// Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.\n\t\tit.skip('strange cases', () => {\n\t\t\t// Top level undefined fails in JSON.parse.\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)\n\t\t\t// eslint-disable-next-line no-null/no-null\n\t\t\tcheck(undefined, null, sameAfter);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"SnapshotUtilities.tests.js","sourceRoot":"","sources":["../../src/test/SnapshotUtilities.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { FluidSerializer } from '@fluidframework/shared-object-base';\nimport { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { comparePayloads } from '../Common';\nimport { Payload } from '../generic';\n\ndescribe('SnapshotUtilities', () => {\n\tdescribe('comparePayloads', () => {\n\t\tconst serializer = new FluidSerializer(new MockFluidDataStoreRuntime().IFluidHandleContext, () => {});\n\t\tconst binder: IFluidHandle = { bind: () => void {} } as unknown as IFluidHandle;\n\n\t\tenum Equality {\n\t\t\tEqual,\n\t\t\tUnequal,\n\t\t\tUnspecified,\n\t\t}\n\n\t\tfunction checkEquality(equal: boolean, equality: Equality): void {\n\t\t\tif (equality !== Equality.Unspecified) {\n\t\t\t\texpect(equal).equals(equality === Equality.Equal);\n\t\t\t}\n\t\t}\n\n\t\tfunction check(\n\t\t\ta: Payload,\n\t\t\tb: Payload,\n\t\t\tflags: { initial: Equality; serialized: Equality; deserialized: Equality; roundtrip: Equality }\n\t\t): void {\n\t\t\t// Check reflexive\n\t\t\texpect(comparePayloads(a, a)).equal(true);\n\t\t\texpect(comparePayloads(b, b)).equal(true);\n\n\t\t\tcheckEquality(comparePayloads(a, b), flags.initial);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(b, a), flags.initial);\n\n\t\t\tconst [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);\n\t\t\tconst [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);\n\n\t\t\tcheckEquality(aString === bString, flags.serialized);\n\t\t\tcheckEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);\n\t\t}\n\n\t\tfunction checkSerialization(a: Payload, roundtrip: Equality): [string, Payload] {\n\t\t\tconst aString = serializer.stringify(a, binder);\n\t\t\tconst a2: Payload = serializer.parse(aString);\n\t\t\tconst aString2 = serializer.stringify(a2, binder);\n\t\t\texpect(aString2).equal(aString);\n\t\t\tcheckEquality(comparePayloads(a, a2), roundtrip);\n\n\t\t\t// Check second round trip, should always be equal\n\t\t\tconst a3: Payload = serializer.parse(aString2);\n\t\t\texpect(comparePayloads(a3, a2)).true;\n\n\t\t\treturn [aString, a2];\n\t\t}\n\n\t\tconst allEqual = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Equal,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\t// For when the inputs are logically equal, but may serialize differently due to field ordering.\n\t\tconst allEqualUnstable = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tconst allUnequal = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tit('compares numbers correctly', () => {\n\t\t\tcheck(0, 0, allEqual);\n\t\t\tcheck(1, 1, allEqual);\n\t\t\tcheck(0, 1, allUnequal);\n\t\t\tcheck(-1, 1, allUnequal);\n\t\t\tcheck(5.2, 5.200000001, allUnequal);\n\t\t});\n\n\t\tit('compares strings', () => {\n\t\t\tcheck('', '', allEqual);\n\t\t\tcheck(' ', '', allUnequal);\n\t\t\tcheck('1', '+1', allUnequal);\n\t\t\t// This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work\n\t\t\t// Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.\n\t\t\tcheck('𤭢', '𤭢', allEqual);\n\t\t\tcheck('𤭢', '', allUnequal);\n\t\t\tcheck('several characters', 'several characters', allEqual);\n\t\t\tcheck('several characters', 'several_characters', allUnequal);\n\t\t});\n\n\t\tit('compares arrays', () => {\n\t\t\tcheck([], [], allEqual);\n\t\t\tcheck([1], [1], allEqual);\n\t\t\tcheck([[1]], [[1]], allEqual);\n\t\t\tcheck([[1]], [[2]], allUnequal);\n\t\t\tcheck([], [1], allUnequal);\n\t\t\tcheck([1, 2], [2, 1], allUnequal);\n\t\t});\n\n\t\tit('compares objects', () => {\n\t\t\tcheck({ 1: 'x' }, { 1: 'x' }, allEqual);\n\t\t\tcheck({ x: 'x' }, { y: 'x' }, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: {} }, allUnequal);\n\t\t\tcheck({ x: {} }, { x: {} }, allEqual);\n\t\t\tcheck({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);\n\t\t\tcheck({ 1: 'x' }, {}, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);\n\t\t\tcheck({ field: 'a' }, { field: 'b' }, allUnequal);\n\n\t\t\t// Fluid Serialization arbitrarily orders fields.\n\t\t\t// Thus any object with more than one field may have non-deterministic serialization.\n\t\t\t// However objects have field order, and we need to check comparePayloads is not impacted by it.\n\t\t\tcheck({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);\n\t\t});\n\n\t\tit('compares mixed types', () => {\n\t\t\tcheck({ 0: 1 }, [1], allUnequal);\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\t\t\t/* eslint-disable no-null/no-null */\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(1, '1', allUnequal);\n\t\t\tcheck(null, 0, allUnequal);\n\t\t\t/* eslint-enable no-null/no-null */\n\t\t\tcheck('', 0, allUnequal);\n\t\t});\n\n\t\tconst sameAfter = {\n\t\t\tinitial: Equality.Unspecified,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\t\tconst differentAfter = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\n\t\tit('lossy cases', () => {\n\t\t\t// Undefined fields are omitted in json, and thus lost on the round trip.\n\t\t\tcheck({ x: undefined }, { y: undefined }, sameAfter);\n\t\t\tcheck({ x: undefined }, {}, sameAfter);\n\n\t\t\t// NaN and Infinity become null\n\t\t\tcheck(NaN, NaN, sameAfter);\n\t\t\tcheck(NaN, 7, differentAfter);\n\t\t\tcheck(Infinity, Infinity, sameAfter);\n\t\t\tcheck(-Infinity, Infinity, sameAfter);\n\t\t\tcheck(NaN, 'NaN', differentAfter);\n\n\t\t\t// json loses -0 on round trip\n\t\t\tcheck(-0, -0, sameAfter);\n\t\t});\n\n\t\tit('compares handles', () => {\n\t\t\tfunction makeMockHandle(data: string): IFluidHandle {\n\t\t\t\tconst handleObject = { absolutePath: data, IFluidHandle: undefined as unknown };\n\t\t\t\thandleObject.IFluidHandle = handleObject;\n\t\t\t\tconst handle = handleObject as IFluidHandle;\n\t\t\t\t// Handle gets modified by serializing. This is probably because handle is malformed.\n\t\t\t\t// To avoid this being an issue, round trip it.\n\t\t\t\tconst serialized = serializer.stringify(handle, binder);\n\t\t\t\tconst finalHandle: IFluidHandle = serializer.parse(serialized);\n\t\t\t\treturn finalHandle;\n\t\t\t}\n\t\t\t// Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic\n\t\t\t// so use allEqualUnstable not allEqual.\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('y'), allUnequal);\n\t\t\tcheck({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);\n\t\t});\n\n\t\t// These are cases that are allowed by the type system and produce unexpected results due to Json serialization.\n\t\t// Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.\n\t\tit.skip('strange cases', () => {\n\t\t\t// Top level undefined fails in JSON.parse.\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)\n\t\t\t// eslint-disable-next-line no-null/no-null\n\t\t\tcheck(undefined, null, sameAfter);\n\t\t});\n\t});\n});\n"]}
@@ -2,11 +2,13 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidHandle, IFluidSerializer, IRequest, IResponse } from '@fluidframework/core-interfaces';
5
+ import { IFluidHandle, IRequest, IResponse } from '@fluidframework/core-interfaces';
6
+ import { IFluidSerializer } from '@fluidframework/shared-object-base';
6
7
  export declare class TestFluidSerializer implements IFluidSerializer {
7
8
  constructor();
8
9
  get IFluidSerializer(): this;
9
- replaceHandles(value: any, bind: IFluidHandle): void;
10
+ encode(value: any, bind: IFluidHandle): void;
11
+ decode(input: any): any;
10
12
  stringify(value: any, bind: IFluidHandle): string;
11
13
  parse(value: string): unknown;
12
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TestSerializer.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEtG,qBAAa,mBAAoB,YAAW,gBAAgB;;IAG3D,IAAW,gBAAgB,SAE1B;IAEM,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAIpD,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAIjD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC;AAED,qBAAa,eAAgB,YAAW,YAAY;IAC5C,YAAY,MAAC;IACb,UAAU,MAAC;IAElB,IAAW,YAAY,IAAI,YAAY,CAEtC;IAEY,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAIzB,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIhC,WAAW,IAAI,IAAI;IAIb,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAGjE"}
1
+ {"version":3,"file":"TestSerializer.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,qBAAa,mBAAoB,YAAW,gBAAgB;;IAG3D,IAAW,gBAAgB,SAE1B;IAEM,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAI5C,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;IAIvB,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAIjD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGpC;AAED,qBAAa,eAAgB,YAAW,YAAY;IAC5C,YAAY,MAAC;IACb,UAAU,MAAC;IAElB,IAAW,YAAY,IAAI,YAAY,CAEtC;IAEY,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAIzB,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIhC,WAAW,IAAI,IAAI;IAIb,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAGjE"}
@@ -7,7 +7,10 @@ export class TestFluidSerializer {
7
7
  get IFluidSerializer() {
8
8
  return this;
9
9
  }
10
- replaceHandles(value, bind) {
10
+ encode(value, bind) {
11
+ throw new Error('Method not implemented.');
12
+ }
13
+ decode(input) {
11
14
  throw new Error('Method not implemented.');
12
15
  }
13
16
  stringify(value, bind) {
@@ -1 +1 @@
1
- {"version":3,"file":"TestSerializer.js","sourceRoot":"","sources":["../../../src/test/utilities/TestSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,mBAAmB;IAC/B,gBAAsB,CAAC;IAEvB,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,cAAc,CAAC,KAAU,EAAE,IAAkB;QACnD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,SAAS,CAAC,KAAU,EAAE,IAAkB;QAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACD;AAED,MAAM,OAAO,eAAe;IAI3B,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,IAAI,CAAC,MAAoB;QAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,WAAW;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAiB;QAC3C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle, IFluidSerializer, IRequest, IResponse } from '@fluidframework/core-interfaces';\n\nexport class TestFluidSerializer implements IFluidSerializer {\n\tpublic constructor() {}\n\n\tpublic get IFluidSerializer() {\n\t\treturn this;\n\t}\n\n\tpublic replaceHandles(value: any, bind: IFluidHandle): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic stringify(value: any, bind: IFluidHandle): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\tpublic parse(value: string): unknown {\n\t\treturn JSON.parse(value);\n\t}\n}\n\nexport class TestFluidHandle implements IFluidHandle {\n\tpublic absolutePath;\n\tpublic isAttached;\n\n\tpublic get IFluidHandle(): IFluidHandle {\n\t\treturn this;\n\t}\n\n\tpublic async get(): Promise<any> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic bind(handle: IFluidHandle): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic attachGraph(): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n}\n"]}
1
+ {"version":3,"file":"TestSerializer.js","sourceRoot":"","sources":["../../../src/test/utilities/TestSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,OAAO,mBAAmB;IAC/B,gBAAsB,CAAC;IAEvB,IAAW,gBAAgB;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,KAAU,EAAE,IAAkB;QAC3C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,KAAU;QACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,SAAS,CAAC,KAAU,EAAE,IAAkB;QAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACD;AAED,MAAM,OAAO,eAAe;IAI3B,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,IAAI,CAAC,MAAoB;QAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,WAAW;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAiB;QAC3C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC5C,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle, IRequest, IResponse } from '@fluidframework/core-interfaces';\nimport { IFluidSerializer } from '@fluidframework/shared-object-base';\n\nexport class TestFluidSerializer implements IFluidSerializer {\n\tpublic constructor() {}\n\n\tpublic get IFluidSerializer() {\n\t\treturn this;\n\t}\n\n\tpublic encode(value: any, bind: IFluidHandle): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic decode(input: any): any {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic stringify(value: any, bind: IFluidHandle): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\tpublic parse(value: string): unknown {\n\t\treturn JSON.parse(value);\n\t}\n}\n\nexport class TestFluidHandle implements IFluidHandle {\n\tpublic absolutePath;\n\tpublic isAttached;\n\n\tpublic get IFluidHandle(): IFluidHandle {\n\t\treturn this;\n\t}\n\n\tpublic async get(): Promise<any> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic bind(handle: IFluidHandle): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic attachGraph(): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tpublic async resolveHandle(request: IRequest): Promise<IResponse> {\n\t\tthrow new Error('Method not implemented.');\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.ts"],"names":[],"mappings":"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"}
@@ -140,9 +140,10 @@ async function setUpLocalServerTestSharedTreeGeneric(factoryGetter, options) {
140
140
  const { id, initialTree, testObjectProvider, setupEditId, summarizeHistory } = options;
141
141
  const treeId = id !== null && id !== void 0 ? id : 'test';
142
142
  const registry = [[treeId, factoryGetter(summarizeHistory)]];
143
+ const innerRequestHandler = async (request, runtime) => runtime.IFluidHandleContext.resolveHandle(request);
143
144
  const runtimeFactory = () => new TestContainerRuntimeFactory(TestDataStoreType, new TestFluidObjectFactory(registry), {
144
145
  summaryOptions: { initialSummarizerDelayMs: 0 },
145
- });
146
+ }, [innerRequestHandler]);
146
147
  let provider;
147
148
  let container;
148
149
  if (testObjectProvider !== undefined) {