@fluidframework/ordered-collection 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606

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 (39) hide show
  1. package/dist/consensusOrderedCollection.d.ts +3 -3
  2. package/dist/consensusOrderedCollection.d.ts.map +1 -1
  3. package/dist/consensusOrderedCollection.js +1 -1
  4. package/dist/consensusOrderedCollection.js.map +1 -1
  5. package/dist/consensusOrderedCollectionFactory.d.ts +1 -1
  6. package/dist/consensusOrderedCollectionFactory.d.ts.map +1 -1
  7. package/dist/consensusOrderedCollectionFactory.js.map +1 -1
  8. package/dist/consensusQueue.d.ts +1 -1
  9. package/dist/consensusQueue.d.ts.map +1 -1
  10. package/dist/consensusQueue.js.map +1 -1
  11. package/dist/interfaces.d.ts +1 -1
  12. package/dist/interfaces.d.ts.map +1 -1
  13. package/dist/interfaces.js.map +1 -1
  14. package/dist/packageVersion.d.ts +1 -1
  15. package/dist/packageVersion.js +1 -1
  16. package/dist/packageVersion.js.map +1 -1
  17. package/lib/consensusOrderedCollection.d.ts +3 -3
  18. package/lib/consensusOrderedCollection.d.ts.map +1 -1
  19. package/lib/consensusOrderedCollection.js +1 -1
  20. package/lib/consensusOrderedCollection.js.map +1 -1
  21. package/lib/consensusOrderedCollectionFactory.d.ts +1 -1
  22. package/lib/consensusOrderedCollectionFactory.d.ts.map +1 -1
  23. package/lib/consensusOrderedCollectionFactory.js.map +1 -1
  24. package/lib/consensusQueue.d.ts +1 -1
  25. package/lib/consensusQueue.d.ts.map +1 -1
  26. package/lib/consensusQueue.js.map +1 -1
  27. package/lib/interfaces.d.ts +1 -1
  28. package/lib/interfaces.d.ts.map +1 -1
  29. package/lib/interfaces.js.map +1 -1
  30. package/lib/packageVersion.d.ts +1 -1
  31. package/lib/packageVersion.js +1 -1
  32. package/lib/packageVersion.js.map +1 -1
  33. package/lib/test/consensusOrderedCollection.spec.js.map +1 -1
  34. package/package.json +20 -17
  35. package/src/consensusOrderedCollection.ts +4 -4
  36. package/src/consensusOrderedCollectionFactory.ts +1 -1
  37. package/src/consensusQueue.ts +1 -1
  38. package/src/interfaces.ts +2 -2
  39. package/src/packageVersion.ts +1 -1
@@ -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 { IChannelAttributes, IChannelStorageService, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
5
6
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
- import { IChannelAttributes, IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
7
- import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-base";
8
7
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
9
- import { ConsensusCallback, IConsensusOrderedCollection, IOrderedCollection, IConsensusOrderedCollectionEvents } from "./interfaces.js";
8
+ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-base";
9
+ import { ConsensusCallback, IConsensusOrderedCollection, IConsensusOrderedCollectionEvents, IOrderedCollection } from "./interfaces.js";
10
10
  /**
11
11
  * Implementation of a consensus collection shared object
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollection.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EACN,iBAAiB,EAEjB,2BAA2B,EAC3B,kBAAkB,EAClB,iCAAiC,EACjC,MAAM,iBAAiB,CAAC;AA8DzB;;;;;;;;;GASG;AACH,qBAAa,0BAA0B,CAAC,CAAC,GAAG,GAAG,CAC9C,SAAQ,YAAY,CAAC,iCAAiC,CAAC,CAAC,CAAC,CACzD,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAexC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbtB;;OAEG;IACH,OAAO,CAAC,WAAW,CAAiC;IAEpD;;;OAGG;IACH,SAAS,aACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB,EACb,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAc7C;;OAEG;IACU,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzC;;;OAGG;IACU,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBtE;;OAEG;IACU,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAa5E,SAAS,CAAC,QAAQ;cAIF,QAAQ,CAAC,SAAS,EAAE,MAAM;IAe1C,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IASxC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;IAiBnC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM;IAUvC;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxE,SAAS,CAAC,YAAY;IAQtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;YAqCX,MAAM;IAepB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,WAAW;YAmBL,eAAe;IAY7B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAKxB,SAAS,CAAC,cAAc,IAAI,IAAI;CAGhC"}
1
+ {"version":3,"file":"consensusOrderedCollection.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EACN,iBAAiB,EAEjB,2BAA2B,EAC3B,iCAAiC,EACjC,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AA8DzB;;;;;;;;;GASG;AACH,qBAAa,0BAA0B,CAAC,CAAC,GAAG,GAAG,CAC9C,SAAQ,YAAY,CAAC,iCAAiC,CAAC,CAAC,CAAC,CACzD,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAexC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbtB;;OAEG;IACH,OAAO,CAAC,WAAW,CAAiC;IAEpD;;;OAGG;IACH,SAAS,aACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB,EACb,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAc7C;;OAEG;IACU,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzC;;;OAGG;IACU,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBtE;;OAEG;IACU,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAa5E,SAAS,CAAC,QAAQ;cAIF,QAAQ,CAAC,SAAS,EAAE,MAAM;IAe1C,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IASxC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;IAiBnC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM;IAUvC;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxE,SAAS,CAAC,YAAY;IAQtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;YAqCX,MAAM;IAepB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,WAAW;YAmBL,eAAe;IAY7B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAKxB,SAAS,CAAC,cAAc,IAAI,IAAI;CAGhC"}
@@ -8,8 +8,8 @@ exports.ConsensusOrderedCollection = void 0;
8
8
  const client_utils_1 = require("@fluid-internal/client-utils");
9
9
  const core_utils_1 = require("@fluidframework/core-utils");
10
10
  const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
11
- const shared_object_base_1 = require("@fluidframework/shared-object-base");
12
11
  const runtime_utils_1 = require("@fluidframework/runtime-utils");
12
+ const shared_object_base_1 = require("@fluidframework/shared-object-base");
13
13
  const uuid_1 = require("uuid");
14
14
  const interfaces_js_1 = require("./interfaces.js");
15
15
  const snapshotFileNameData = "header";
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollection.js","sourceRoot":"","sources":["../src/consensusOrderedCollection.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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n\tConsensusCallback,\n\tConsensusResult,\n\tIConsensusOrderedCollection,\n\tIOrderedCollection,\n\tIConsensusOrderedCollectionEvents,\n} from \"./interfaces.js\";\n\nconst snapshotFileNameData = \"header\";\nconst snapshotFileNameTracking = \"jobTracking\";\n\ninterface IConsensusOrderedCollectionValue<T> {\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\treadonly acquireId: string;\n\n\t// The actual value\n\treadonly value: T;\n}\n\n/**\n * An operation for consensus ordered collection\n */\ninterface IConsensusOrderedCollectionAddOperation<T> {\n\topName: \"add\";\n\t// serialized value\n\tvalue: string;\n\tdeserializedValue?: T;\n}\n\ninterface IConsensusOrderedCollectionAcquireOperation {\n\topName: \"acquire\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionCompleteOperation {\n\topName: \"complete\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionReleaseOperation {\n\topName: \"release\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ntype IConsensusOrderedCollectionOperation<T> =\n\t| IConsensusOrderedCollectionAddOperation<T>\n\t| IConsensusOrderedCollectionAcquireOperation\n\t| IConsensusOrderedCollectionCompleteOperation\n\t| IConsensusOrderedCollectionReleaseOperation;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve<T> = (value: IConsensusOrderedCollectionValue<T> | undefined) => void;\n\n/**\n * For job tracking, we need to keep track of which client \"owns\" a given value.\n * Key is the acquireId from when it was acquired\n * Value is the acquired value, and the id of the client who acquired it, or undefined for unattached client\n */\ntype JobTrackingInfo<T> = Map<string, { value: T; clientId: string | undefined }>;\nconst idForLocalUnattachedClient = undefined;\n\n/**\n * Implementation of a consensus collection shared object\n *\n * Implements the shared object's communication, and the semantics around the\n * release/complete mechanism following acquire.\n *\n * Generally not used directly. A derived type will pass in a backing data type\n * IOrderedCollection that will define the deterministic add/acquire order and snapshot ability.\n * @alpha\n */\nexport class ConsensusOrderedCollection<T = any>\n\textends SharedObject<IConsensusOrderedCollectionEvents<T>>\n\timplements IConsensusOrderedCollection<T>\n{\n\t/**\n\t * The set of values that have been acquired but not yet completed or released\n\t */\n\tprivate jobTracking: JobTrackingInfo<T> = new Map();\n\n\t/**\n\t * Constructs a new consensus collection. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tprotected constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\tprivate readonly data: IOrderedCollection<T>,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_consensusOrderedCollection_\");\n\n\t\t// We can't simply call this.removeClient(this.runtime.clientId) in on runtime disconnected,\n\t\t// because other clients may disconnect concurrently.\n\t\t// Disconnect order matters because it defines the order items go back to the queue.\n\t\t// So we put items back to queue only when we process our own removeMember event.\n\t\truntime.getQuorum().on(\"removeMember\", (clientId: string) => {\n\t\t\tassert(!!clientId, 0x067 /* \"Missing clientId for removal!\" */);\n\t\t\tthis.removeClient(clientId);\n\t\t});\n\t}\n\n\t/**\n\t * Add a value to the consensus collection.\n\t */\n\tpublic async add(value: T): Promise<void> {\n\t\tconst valueSer = this.serializeValue(value, this.serializer);\n\n\t\tif (!this.isAttached()) {\n\t\t\t// For the case where this is not attached yet, explicitly JSON\n\t\t\t// clone the value to match the behavior of going thru the wire.\n\t\t\tconst addValue = this.deserializeValue(valueSer, this.serializer) as T;\n\t\t\tthis.addCore(addValue);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.submit<IConsensusOrderedCollectionAddOperation<T>>({\n\t\t\topName: \"add\",\n\t\t\tvalue: valueSer,\n\t\t\tdeserializedValue: value,\n\t\t});\n\t}\n\n\t/**\n\t * Remove a value from the consensus collection. If the collection is empty, returns false.\n\t * Otherwise calls callback with the value\n\t */\n\tpublic async acquire(callback: ConsensusCallback<T>): Promise<boolean> {\n\t\tconst result = await this.acquireInternal();\n\t\tif (result === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst res = await callback(result.value);\n\n\t\tswitch (res) {\n\t\t\tcase ConsensusResult.Complete:\n\t\t\t\tawait this.complete(result.acquireId);\n\t\t\t\tbreak;\n\t\t\tcase ConsensusResult.Release:\n\t\t\t\tthis.release(result.acquireId);\n\t\t\t\tthis.emit(\"localRelease\", result.value, true /* intentional */);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(res);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Wait for a value to be available and acquire it from the consensus collection\n\t */\n\tpublic async waitAndAcquire(callback: ConsensusCallback<T>): Promise<void> {\n\t\tdo {\n\t\t\tif (this.data.size() === 0) {\n\t\t\t\t// Wait for new entry before trying to acquire again\n\t\t\t\tawait this.newAckBasedPromise<T>((resolve) => {\n\t\t\t\t\tthis.once(\"add\", resolve);\n\t\t\t\t});\n\t\t\t}\n\t\t} while (!(await this.acquire(callback)));\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// If we are transitioning from unattached to attached mode,\n\t\t// then we are losing all checked out work!\n\t\tthis.removeClient(idForLocalUnattachedClient);\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tlet blobContent = this.serializeValue(this.data.asArray(), serializer);\n\t\tbuilder.addBlob(snapshotFileNameData, blobContent);\n\t\tblobContent = this.serializeValue(Array.from(this.jobTracking.entries()), serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive() {\n\t\treturn this.runtime.connected && this.runtime.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.completeCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tawait this.submit<IConsensusOrderedCollectionCompleteOperation>({\n\t\t\t\topName: \"complete\",\n\t\t\t\tacquireId,\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected completeCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.emit(\"complete\", rec.value);\n\t\t}\n\t}\n\n\tprotected release(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.releaseCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tthis.submit<IConsensusOrderedCollectionReleaseOperation>({\n\t\t\t\topName: \"release\",\n\t\t\t\tacquireId,\n\t\t\t}).catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: \"ConsensusQueue_release\" }, error);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.data.add(rec.value);\n\t\t\tthis.emit(\"add\", rec.value, false /* newlyAdded */);\n\t\t}\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\tassert(\n\t\t\tthis.jobTracking.size === 0,\n\t\t\t0x068 /* \"On consensusOrderedCollection load, job tracking size > 0\" */,\n\t\t);\n\t\tconst blob = await storage.readBlob(snapshotFileNameTracking);\n\t\tconst rawContentTracking = bufferToString(blob, \"utf8\");\n\t\tconst content = this.deserializeValue(rawContentTracking, this.serializer);\n\t\tthis.jobTracking = new Map(content) as JobTrackingInfo<T>;\n\n\t\tassert(\n\t\t\tthis.data.size() === 0,\n\t\t\t0x069 /* \"On consensusOrderedCollection load, data size > 0\" */,\n\t\t);\n\t\tconst blob2 = await storage.readBlob(snapshotFileNameData);\n\t\tconst rawContentData = bufferToString(blob2, \"utf8\");\n\t\tconst content2 = this.deserializeValue(rawContentData, this.serializer) as T[];\n\t\tthis.data.loadFrom(content2);\n\t}\n\n\tprotected onDisconnect() {\n\t\tfor (const [, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === this.runtime.clientId) {\n\t\t\t\tthis.emit(\"localRelease\", value, false /* intentional */);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.contents as IConsensusOrderedCollectionOperation<T>;\n\t\t\tlet value: IConsensusOrderedCollectionValue<T> | undefined;\n\t\t\tswitch (op.opName) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\tif (op.deserializedValue !== undefined) {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"acquire\":\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, message.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"complete\":\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"release\":\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t\tif (local) {\n\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\t\t\tresolve(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async submit<TMessage extends IConsensusOrderedCollectionOperation<T>>(\n\t\tmessage: TMessage,\n\t): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tassert(this.isAttached(), 0x06a /* \"Trying to submit message while detached!\" */);\n\n\t\treturn this.newAckBasedPromise<IConsensusOrderedCollectionValue<T> | undefined>(\n\t\t\t(resolve) => {\n\t\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t\t// op is ack'd.\n\t\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t\t// If we fail due to runtime being disposed, it's better to return undefined then unhandled exception.\n\t\t\t},\n\t\t).catch((error) => undefined);\n\t}\n\n\tprivate addCore(value: T) {\n\t\tthis.data.add(value);\n\t\tthis.emit(\"add\", value, true /* newlyAdded */);\n\t}\n\n\tprivate acquireCore(\n\t\tacquireId: string,\n\t\tclientId?: string,\n\t): IConsensusOrderedCollectionValue<T> | undefined {\n\t\tif (this.data.size() === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst value = this.data.remove();\n\n\t\tconst value2: IConsensusOrderedCollectionValue<T> = {\n\t\t\tacquireId,\n\t\t\tvalue,\n\t\t};\n\t\tthis.jobTracking.set(value2.acquireId, { value, clientId });\n\n\t\tthis.emit(\"acquire\", value, clientId);\n\t\treturn value2;\n\t}\n\n\tprivate async acquireInternal(): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tif (!this.isAttached()) {\n\t\t\t// can be undefined if queue is empty\n\t\t\treturn this.acquireCore(uuid(), idForLocalUnattachedClient);\n\t\t}\n\n\t\treturn this.submit<IConsensusOrderedCollectionAcquireOperation>({\n\t\t\topName: \"acquire\",\n\t\t\tacquireId: uuid(),\n\t\t});\n\t}\n\n\tprivate removeClient(clientIdToRemove?: string) {\n\t\tconst added: T[] = [];\n\t\tfor (const [acquireId, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === clientIdToRemove) {\n\t\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\t\tthis.data.add(value);\n\t\t\t\tadded.push(value);\n\t\t\t}\n\t\t}\n\n\t\t// Raise all events only after all state changes are completed,\n\t\t// to guarantee same ordering of operations if collection is manipulated from events.\n\t\tadded.map((value) => this.emit(\"add\", value, false /* newlyAdded */));\n\t}\n\n\tprivate serializeValue(value, serializer: IFluidSerializer) {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(): void {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusOrderedCollection.js","sourceRoot":"","sources":["../src/consensusOrderedCollection.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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tIChannelAttributes,\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n\tConsensusCallback,\n\tConsensusResult,\n\tIConsensusOrderedCollection,\n\tIConsensusOrderedCollectionEvents,\n\tIOrderedCollection,\n} from \"./interfaces.js\";\n\nconst snapshotFileNameData = \"header\";\nconst snapshotFileNameTracking = \"jobTracking\";\n\ninterface IConsensusOrderedCollectionValue<T> {\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\treadonly acquireId: string;\n\n\t// The actual value\n\treadonly value: T;\n}\n\n/**\n * An operation for consensus ordered collection\n */\ninterface IConsensusOrderedCollectionAddOperation<T> {\n\topName: \"add\";\n\t// serialized value\n\tvalue: string;\n\tdeserializedValue?: T;\n}\n\ninterface IConsensusOrderedCollectionAcquireOperation {\n\topName: \"acquire\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionCompleteOperation {\n\topName: \"complete\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionReleaseOperation {\n\topName: \"release\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ntype IConsensusOrderedCollectionOperation<T> =\n\t| IConsensusOrderedCollectionAddOperation<T>\n\t| IConsensusOrderedCollectionAcquireOperation\n\t| IConsensusOrderedCollectionCompleteOperation\n\t| IConsensusOrderedCollectionReleaseOperation;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve<T> = (value: IConsensusOrderedCollectionValue<T> | undefined) => void;\n\n/**\n * For job tracking, we need to keep track of which client \"owns\" a given value.\n * Key is the acquireId from when it was acquired\n * Value is the acquired value, and the id of the client who acquired it, or undefined for unattached client\n */\ntype JobTrackingInfo<T> = Map<string, { value: T; clientId: string | undefined }>;\nconst idForLocalUnattachedClient = undefined;\n\n/**\n * Implementation of a consensus collection shared object\n *\n * Implements the shared object's communication, and the semantics around the\n * release/complete mechanism following acquire.\n *\n * Generally not used directly. A derived type will pass in a backing data type\n * IOrderedCollection that will define the deterministic add/acquire order and snapshot ability.\n * @alpha\n */\nexport class ConsensusOrderedCollection<T = any>\n\textends SharedObject<IConsensusOrderedCollectionEvents<T>>\n\timplements IConsensusOrderedCollection<T>\n{\n\t/**\n\t * The set of values that have been acquired but not yet completed or released\n\t */\n\tprivate jobTracking: JobTrackingInfo<T> = new Map();\n\n\t/**\n\t * Constructs a new consensus collection. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tprotected constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\tprivate readonly data: IOrderedCollection<T>,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_consensusOrderedCollection_\");\n\n\t\t// We can't simply call this.removeClient(this.runtime.clientId) in on runtime disconnected,\n\t\t// because other clients may disconnect concurrently.\n\t\t// Disconnect order matters because it defines the order items go back to the queue.\n\t\t// So we put items back to queue only when we process our own removeMember event.\n\t\truntime.getQuorum().on(\"removeMember\", (clientId: string) => {\n\t\t\tassert(!!clientId, 0x067 /* \"Missing clientId for removal!\" */);\n\t\t\tthis.removeClient(clientId);\n\t\t});\n\t}\n\n\t/**\n\t * Add a value to the consensus collection.\n\t */\n\tpublic async add(value: T): Promise<void> {\n\t\tconst valueSer = this.serializeValue(value, this.serializer);\n\n\t\tif (!this.isAttached()) {\n\t\t\t// For the case where this is not attached yet, explicitly JSON\n\t\t\t// clone the value to match the behavior of going thru the wire.\n\t\t\tconst addValue = this.deserializeValue(valueSer, this.serializer) as T;\n\t\t\tthis.addCore(addValue);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.submit<IConsensusOrderedCollectionAddOperation<T>>({\n\t\t\topName: \"add\",\n\t\t\tvalue: valueSer,\n\t\t\tdeserializedValue: value,\n\t\t});\n\t}\n\n\t/**\n\t * Remove a value from the consensus collection. If the collection is empty, returns false.\n\t * Otherwise calls callback with the value\n\t */\n\tpublic async acquire(callback: ConsensusCallback<T>): Promise<boolean> {\n\t\tconst result = await this.acquireInternal();\n\t\tif (result === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst res = await callback(result.value);\n\n\t\tswitch (res) {\n\t\t\tcase ConsensusResult.Complete:\n\t\t\t\tawait this.complete(result.acquireId);\n\t\t\t\tbreak;\n\t\t\tcase ConsensusResult.Release:\n\t\t\t\tthis.release(result.acquireId);\n\t\t\t\tthis.emit(\"localRelease\", result.value, true /* intentional */);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(res);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Wait for a value to be available and acquire it from the consensus collection\n\t */\n\tpublic async waitAndAcquire(callback: ConsensusCallback<T>): Promise<void> {\n\t\tdo {\n\t\t\tif (this.data.size() === 0) {\n\t\t\t\t// Wait for new entry before trying to acquire again\n\t\t\t\tawait this.newAckBasedPromise<T>((resolve) => {\n\t\t\t\t\tthis.once(\"add\", resolve);\n\t\t\t\t});\n\t\t\t}\n\t\t} while (!(await this.acquire(callback)));\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// If we are transitioning from unattached to attached mode,\n\t\t// then we are losing all checked out work!\n\t\tthis.removeClient(idForLocalUnattachedClient);\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tlet blobContent = this.serializeValue(this.data.asArray(), serializer);\n\t\tbuilder.addBlob(snapshotFileNameData, blobContent);\n\t\tblobContent = this.serializeValue(Array.from(this.jobTracking.entries()), serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive() {\n\t\treturn this.runtime.connected && this.runtime.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.completeCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tawait this.submit<IConsensusOrderedCollectionCompleteOperation>({\n\t\t\t\topName: \"complete\",\n\t\t\t\tacquireId,\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected completeCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.emit(\"complete\", rec.value);\n\t\t}\n\t}\n\n\tprotected release(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.releaseCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tthis.submit<IConsensusOrderedCollectionReleaseOperation>({\n\t\t\t\topName: \"release\",\n\t\t\t\tacquireId,\n\t\t\t}).catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: \"ConsensusQueue_release\" }, error);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.data.add(rec.value);\n\t\t\tthis.emit(\"add\", rec.value, false /* newlyAdded */);\n\t\t}\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\tassert(\n\t\t\tthis.jobTracking.size === 0,\n\t\t\t0x068 /* \"On consensusOrderedCollection load, job tracking size > 0\" */,\n\t\t);\n\t\tconst blob = await storage.readBlob(snapshotFileNameTracking);\n\t\tconst rawContentTracking = bufferToString(blob, \"utf8\");\n\t\tconst content = this.deserializeValue(rawContentTracking, this.serializer);\n\t\tthis.jobTracking = new Map(content) as JobTrackingInfo<T>;\n\n\t\tassert(\n\t\t\tthis.data.size() === 0,\n\t\t\t0x069 /* \"On consensusOrderedCollection load, data size > 0\" */,\n\t\t);\n\t\tconst blob2 = await storage.readBlob(snapshotFileNameData);\n\t\tconst rawContentData = bufferToString(blob2, \"utf8\");\n\t\tconst content2 = this.deserializeValue(rawContentData, this.serializer) as T[];\n\t\tthis.data.loadFrom(content2);\n\t}\n\n\tprotected onDisconnect() {\n\t\tfor (const [, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === this.runtime.clientId) {\n\t\t\t\tthis.emit(\"localRelease\", value, false /* intentional */);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.contents as IConsensusOrderedCollectionOperation<T>;\n\t\t\tlet value: IConsensusOrderedCollectionValue<T> | undefined;\n\t\t\tswitch (op.opName) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\tif (op.deserializedValue !== undefined) {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"acquire\":\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, message.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"complete\":\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"release\":\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t\tif (local) {\n\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\t\t\tresolve(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async submit<TMessage extends IConsensusOrderedCollectionOperation<T>>(\n\t\tmessage: TMessage,\n\t): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tassert(this.isAttached(), 0x06a /* \"Trying to submit message while detached!\" */);\n\n\t\treturn this.newAckBasedPromise<IConsensusOrderedCollectionValue<T> | undefined>(\n\t\t\t(resolve) => {\n\t\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t\t// op is ack'd.\n\t\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t\t// If we fail due to runtime being disposed, it's better to return undefined then unhandled exception.\n\t\t\t},\n\t\t).catch((error) => undefined);\n\t}\n\n\tprivate addCore(value: T) {\n\t\tthis.data.add(value);\n\t\tthis.emit(\"add\", value, true /* newlyAdded */);\n\t}\n\n\tprivate acquireCore(\n\t\tacquireId: string,\n\t\tclientId?: string,\n\t): IConsensusOrderedCollectionValue<T> | undefined {\n\t\tif (this.data.size() === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst value = this.data.remove();\n\n\t\tconst value2: IConsensusOrderedCollectionValue<T> = {\n\t\t\tacquireId,\n\t\t\tvalue,\n\t\t};\n\t\tthis.jobTracking.set(value2.acquireId, { value, clientId });\n\n\t\tthis.emit(\"acquire\", value, clientId);\n\t\treturn value2;\n\t}\n\n\tprivate async acquireInternal(): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tif (!this.isAttached()) {\n\t\t\t// can be undefined if queue is empty\n\t\t\treturn this.acquireCore(uuid(), idForLocalUnattachedClient);\n\t\t}\n\n\t\treturn this.submit<IConsensusOrderedCollectionAcquireOperation>({\n\t\t\topName: \"acquire\",\n\t\t\tacquireId: uuid(),\n\t\t});\n\t}\n\n\tprivate removeClient(clientIdToRemove?: string) {\n\t\tconst added: T[] = [];\n\t\tfor (const [acquireId, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === clientIdToRemove) {\n\t\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\t\tthis.data.add(value);\n\t\t\t\tadded.push(value);\n\t\t\t}\n\t\t}\n\n\t\t// Raise all events only after all state changes are completed,\n\t\t// to guarantee same ordering of operations if collection is manipulated from events.\n\t\tadded.map((value) => this.emit(\"add\", value, false /* newlyAdded */));\n\t}\n\n\tprivate serializeValue(value, serializer: IFluidSerializer) {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(): void {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IChannelAttributes, IFluidDataStoreRuntime, IChannelServices } from "@fluidframework/datastore-definitions";
5
+ import { IChannelAttributes, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
6
  import { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from "./interfaces.js";
7
7
  /**
8
8
  * The factory that defines the consensus queue
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,2BAA2B,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAGlG;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,kCAAkC;IAC/E,OAAc,IAAI,SAAuD;IAEzE,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC;IAMhC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B;CAKxF"}
1
+ {"version":3,"file":"consensusOrderedCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,2BAA2B,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAGlG;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,kCAAkC;IAC/E,OAAc,IAAI,SAAuD;IAEzE,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC;IAMhC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B;CAKxF"}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,2DAAqD;AAErD,2DAAiD;AAEjD;;;;GAIG;AACH,MAAa,qBAAqB;IASjC,IAAW,IAAI;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,qBAAqB,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,kCAAc,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,UAAU,GAAG,IAAI,kCAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAnCF,sDAoCC;AAnCc,0BAAI,GAAG,mDAAmD,CAAC;AAElD,gCAAU,GAAuB;IACvD,IAAI,EAAE,qBAAqB,CAAC,IAAI;IAChC,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusQueue } from \"./consensusQueue.js\";\nimport { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue\n *\n * @internal\n */\nexport class ConsensusQueueFactory implements IConsensusOrderedCollectionFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-queue\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusQueueFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type() {\n\t\treturn ConsensusQueueFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn ConsensusQueueFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection> {\n\t\tconst collection = new ConsensusQueue(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection {\n\t\tconst collection = new ConsensusQueue(id, document, this.attributes);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,2DAAqD;AAErD,2DAAiD;AAEjD;;;;GAIG;AACH,MAAa,qBAAqB;IASjC,IAAW,IAAI;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,qBAAqB,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,kCAAc,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,UAAU,GAAG,IAAI,kCAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAnCF,sDAoCC;AAnCc,0BAAI,GAAG,mDAAmD,CAAC;AAElD,gCAAU,GAAuB;IACvD,IAAI,EAAE,qBAAqB,CAAC,IAAI;IAChC,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,8BAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusQueue } from \"./consensusQueue.js\";\nimport { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue\n *\n * @internal\n */\nexport class ConsensusQueueFactory implements IConsensusOrderedCollectionFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-queue\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusQueueFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type() {\n\t\treturn ConsensusQueueFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn ConsensusQueueFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection> {\n\t\tconst collection = new ConsensusQueue(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection {\n\t\tconst collection = new ConsensusQueue(id, document, this.attributes);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidDataStoreRuntime, IChannelAttributes, IChannelFactory } from "@fluidframework/datastore-definitions";
5
+ import { IChannelAttributes, IChannelFactory, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
6
  import { ConsensusOrderedCollection } from "./consensusOrderedCollection.js";
7
7
  /**
8
8
  * Implementation of a consensus stack
@@ -1 +1 @@
1
- {"version":3,"file":"consensusQueue.d.ts","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAqB7E;;;;;GAKG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACzE;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAI1E;;;;OAIG;WACW,UAAU,IAAI,eAAe;IAI3C;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;CAI/B"}
1
+ {"version":3,"file":"consensusQueue.d.ts","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAqB7E;;;;;GAKG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACzE;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAI1E;;;;OAIG;WACW,UAAU,IAAI,eAAe;IAI3C;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;CAI/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusQueue.js","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,mFAA6E;AAC7E,iGAA+E;AAE/E,iEAA2D;AAE3D;;GAEG;AACH,MAAM,iBAAqB,SAAQ,wCAAoB;IAC/C,GAAG,CAAC,KAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEM,MAAM;QACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC9C;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAO,CAAC;IAC/B,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAa,cAAwB,SAAQ,0DAA6B;IACzE;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAU,OAA+B,EAAE,EAAW;QACzE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,4DAAqB,CAAC,IAAI,CAAsB,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,4DAAqB,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B;QAE9B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,iBAAiB,EAAK,CAAC,CAAC;IAC5D,CAAC;CACD;AAhCD,wCAgCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelAttributes,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusOrderedCollection } from \"./consensusOrderedCollection.js\";\nimport { ConsensusQueueFactory } from \"./consensusOrderedCollectionFactory.js\";\nimport { IOrderedCollection } from \"./interfaces.js\";\nimport { SnapshotableArray } from \"./snapshotableArray.js\";\n\n/**\n * An JS array based queue implementation that is the backing data structure for ConsensusQueue\n */\nclass SnapshotableQueue<T> extends SnapshotableArray<T> implements IOrderedCollection<T> {\n\tpublic add(value: T) {\n\t\tthis.data.push(value);\n\t}\n\n\tpublic remove(): T {\n\t\tif (this.size() === 0) {\n\t\t\tthrow new Error(\"SnapshotableQueue is empty\");\n\t\t}\n\t\treturn this.data.shift() as T;\n\t}\n}\n\n/**\n * Implementation of a consensus stack\n *\n * An derived type of ConsensusOrderedCollection with a queue as the backing data and order.\n * @alpha\n */\nexport class ConsensusQueue<T = any> extends ConsensusOrderedCollection<T> {\n\t/**\n\t * Create a new consensus queue\n\t *\n\t * @param runtime - data store runtime the new consensus queue belongs to\n\t * @param id - optional name of theconsensus queue\n\t * @returns newly create consensus queue (but not attached yet)\n\t */\n\tpublic static create<T = any>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, ConsensusQueueFactory.Type) as ConsensusQueue<T>;\n\t}\n\n\t/**\n\t * Get a factory for ConsensusQueue to register with the data store.\n\t *\n\t * @returns a factory that creates and load ConsensusQueue\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new ConsensusQueueFactory();\n\t}\n\n\t/**\n\t * Constructs a new consensus queue. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, new SnapshotableQueue<T>());\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusQueue.js","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAOH,mFAA6E;AAC7E,iGAA+E;AAE/E,iEAA2D;AAE3D;;GAEG;AACH,MAAM,iBAAqB,SAAQ,wCAAoB;IAC/C,GAAG,CAAC,KAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEM,MAAM;QACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC9C;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAO,CAAC;IAC/B,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAa,cAAwB,SAAQ,0DAA6B;IACzE;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAU,OAA+B,EAAE,EAAW;QACzE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,4DAAqB,CAAC,IAAI,CAAsB,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,4DAAqB,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B;QAE9B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,iBAAiB,EAAK,CAAC,CAAC;IAC5D,CAAC;CACD;AAhCD,wCAgCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusOrderedCollection } from \"./consensusOrderedCollection.js\";\nimport { ConsensusQueueFactory } from \"./consensusOrderedCollectionFactory.js\";\nimport { IOrderedCollection } from \"./interfaces.js\";\nimport { SnapshotableArray } from \"./snapshotableArray.js\";\n\n/**\n * An JS array based queue implementation that is the backing data structure for ConsensusQueue\n */\nclass SnapshotableQueue<T> extends SnapshotableArray<T> implements IOrderedCollection<T> {\n\tpublic add(value: T) {\n\t\tthis.data.push(value);\n\t}\n\n\tpublic remove(): T {\n\t\tif (this.size() === 0) {\n\t\t\tthrow new Error(\"SnapshotableQueue is empty\");\n\t\t}\n\t\treturn this.data.shift() as T;\n\t}\n}\n\n/**\n * Implementation of a consensus stack\n *\n * An derived type of ConsensusOrderedCollection with a queue as the backing data and order.\n * @alpha\n */\nexport class ConsensusQueue<T = any> extends ConsensusOrderedCollection<T> {\n\t/**\n\t * Create a new consensus queue\n\t *\n\t * @param runtime - data store runtime the new consensus queue belongs to\n\t * @param id - optional name of theconsensus queue\n\t * @returns newly create consensus queue (but not attached yet)\n\t */\n\tpublic static create<T = any>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, ConsensusQueueFactory.Type) as ConsensusQueue<T>;\n\t}\n\n\t/**\n\t * Get a factory for ConsensusQueue to register with the data store.\n\t *\n\t * @returns a factory that creates and load ConsensusQueue\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new ConsensusQueueFactory();\n\t}\n\n\t/**\n\t * Constructs a new consensus queue. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, new SnapshotableQueue<T>());\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidDataStoreRuntime, IChannelServices, IChannelAttributes, IChannelFactory } from "@fluidframework/datastore-definitions";
5
+ import { IChannelAttributes, IChannelFactory, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
6
  import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-object-base";
7
7
  /**
8
8
  * @alpha
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;GAEG;AACH,oBAAY,eAAe;IAC1B,OAAO,IAAA;IACP,QAAQ,IAAA;CACR;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,kCAAmC,SAAQ,eAAe;IAC1E,IAAI,CACH,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAExC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B,CAAC;CAClF;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAiC,CAAC,CAAC,CAAE,SAAQ,mBAAmB;IAChF;;;;OAIG;IACH,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACxE;;;OAGG;IACH,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAE1E;;OAEG;IACH,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAClF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,GAAG,CACnD,SAAQ,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;IAC3D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,EAAE,CAAC;IAEf,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACpE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,OAAE;IAEd;;OAEG;IACH,MAAM,IAAI,CAAC,CAAC;IAEZ;;OAEG;IACH,IAAI,IAAI,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;GAEG;AACH,oBAAY,eAAe;IAC1B,OAAO,IAAA;IACP,QAAQ,IAAA;CACR;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,kCAAmC,SAAQ,eAAe;IAC1E,IAAI,CACH,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAExC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B,CAAC;CAClF;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAiC,CAAC,CAAC,CAAE,SAAQ,mBAAmB;IAChF;;;;OAIG;IACH,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACxE;;;OAGG;IACH,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAE1E;;OAEG;IACH,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAClF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,GAAG,CACnD,SAAQ,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;IAC3D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,EAAE,CAAC;IAEf,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACpE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,OAAE;IAEd;;OAEG;IACH,MAAM,IAAI,CAAC,CAAC;IAEZ;;OAEG;IACH,IAAI,IAAI,MAAM,CAAC;CACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH;;GAEG;AACH,IAAY,eAGX;AAHD,WAAY,eAAe;IAC1B,2DAAO,CAAA;IACP,6DAAQ,CAAA;AACT,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n\tIChannelAttributes,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\n\n/**\n * @alpha\n */\nexport enum ConsensusResult {\n\tRelease,\n\tComplete,\n}\n\n/**\n * Callback provided to acquire() and waitAndAcquire() methods.\n * @returns ConsensusResult indicating whether item was completed, or releases back to the queue.\n * @alpha\n */\nexport type ConsensusCallback<T> = (value: T) => Promise<ConsensusResult>;\n\n/**\n * Consensus Ordered Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusOrderedCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel\n * @internal\n */\nexport interface IConsensusOrderedCollectionFactory extends IChannelFactory {\n\tload(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection>;\n\n\tcreate(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection;\n}\n\n/**\n * Events notifying about addition, acquisition, release and completion of items\n * @alpha\n */\nexport interface IConsensusOrderedCollectionEvents<T> extends ISharedObjectEvents {\n\t/**\n\t * Event fires when new item is added to the queue or\n\t * an item previously acquired is returned back to a queue (including client loosing connection)\n\t * @param newlyAdded - indicates if it's newly added item of previously acquired item\n\t */\n\t(event: \"add\", listener: (value: T, newlyAdded: boolean) => void): this;\n\t/**\n\t * Event fires when a client acquired an item\n\t * Fires both for locally acquired items, as well as items acquired by remote clients\n\t */\n\t(event: \"acquire\", listener: (value: T, clientId?: string) => void): this;\n\n\t/**\n\t * \"Complete event fires when a client completes an item.\n\t */\n\t(event: \"complete\", listener: (value: T) => void): this;\n\n\t/**\n\t * Event fires when locally acquired item is being released back to the queue.\n\t * Please note that release process is asynchronous, so it takes a while for it to happen\n\t * (\"add\" event will be fired as result of it)\n\t * @param intentional - indicates whether release was intentional (result of returning\n\t * ConsensusResult.Release from callback) or it happened as result of lost connection.\n\t */\n\t(event: \"localRelease\", listener: (value: T, intentional: boolean) => void): this;\n}\n\n/**\n * Consensus Ordered Collection interface\n *\n * An consensus ordered collection is a distributed data structure, which\n * holds a collection of JSON-able or handles, and has a\n * deterministic add/remove order.\n *\n * @remarks\n * The order the server receive the add/remove operation determines the\n * order those operation are applied to the collection. Different clients\n * issuing `add` or `acquire` operations at the same time will be sequenced.\n * The order dictates which `add` is done first, thus determining the order\n * in which it appears in the collection. It also determines which client\n * will get the first removed item, etc. All operations are asynchronous.\n * A function `waitAndAcquire` is provided to wait for and remove an entry in the collection.\n *\n * As a client acquires an item, it processes it and then returns a value (via callback)\n * indicating whether it has completed processing the item, or whether the item should be\n * released back to the collection for another client to process.\n *\n * All objects added to the collection will be cloned (via JSON).\n * They will not be references to the original input object. Thus changed to\n * the input object will not reflect the object in the collection.\n * @alpha\n */\nexport interface IConsensusOrderedCollection<T = any>\n\textends ISharedObject<IConsensusOrderedCollectionEvents<T>> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T): Promise<void>;\n\n\t/**\n\t * Retrieves a value from the collection.\n\t * @returns Returns true (and calls callback with acquired value) if collection was not empty.\n\t * Otherwise returns false.\n\t */\n\tacquire(callback: ConsensusCallback<T>): Promise<boolean>;\n\n\t/**\n\t * Wait for a value to be available and remove it from the consensus collection\n\t * Calls callback with retrieved value.\n\t */\n\twaitAndAcquire(callback: ConsensusCallback<T>): Promise<void>;\n}\n\n/**\n * Interface for object that can be snapshoted\n *\n * TODO: move this to be use in other place\n * TODO: currently input and output is not symmetrical, can they become symmetrical?\n * @alpha\n */\nexport interface ISnapshotable<T> {\n\tasArray(): T[];\n\n\tloadFrom(values: T[]): void;\n}\n\n/**\n * Ordered Collection interface\n *\n * Collection of objects that has deterministic add and remove ordering.\n * Object implementing this interface can be used as the data backing\n * for the ConsensusOrderedCollection\n * @alpha\n */\nexport interface IOrderedCollection<T = any> extends ISnapshotable<T> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T);\n\n\t/**\n\t * Retrieves a value from the collection.\n\t */\n\tremove(): T;\n\n\t/**\n\t * Return the size of the collection\n\t */\n\tsize(): number;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH;;GAEG;AACH,IAAY,eAGX;AAHD,WAAY,eAAe;IAC1B,2DAAO,CAAA;IACP,6DAAQ,CAAA;AACT,CAAC,EAHW,eAAe,+BAAf,eAAe,QAG1B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\n\n/**\n * @alpha\n */\nexport enum ConsensusResult {\n\tRelease,\n\tComplete,\n}\n\n/**\n * Callback provided to acquire() and waitAndAcquire() methods.\n * @returns ConsensusResult indicating whether item was completed, or releases back to the queue.\n * @alpha\n */\nexport type ConsensusCallback<T> = (value: T) => Promise<ConsensusResult>;\n\n/**\n * Consensus Ordered Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusOrderedCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel\n * @internal\n */\nexport interface IConsensusOrderedCollectionFactory extends IChannelFactory {\n\tload(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection>;\n\n\tcreate(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection;\n}\n\n/**\n * Events notifying about addition, acquisition, release and completion of items\n * @alpha\n */\nexport interface IConsensusOrderedCollectionEvents<T> extends ISharedObjectEvents {\n\t/**\n\t * Event fires when new item is added to the queue or\n\t * an item previously acquired is returned back to a queue (including client loosing connection)\n\t * @param newlyAdded - indicates if it's newly added item of previously acquired item\n\t */\n\t(event: \"add\", listener: (value: T, newlyAdded: boolean) => void): this;\n\t/**\n\t * Event fires when a client acquired an item\n\t * Fires both for locally acquired items, as well as items acquired by remote clients\n\t */\n\t(event: \"acquire\", listener: (value: T, clientId?: string) => void): this;\n\n\t/**\n\t * \"Complete event fires when a client completes an item.\n\t */\n\t(event: \"complete\", listener: (value: T) => void): this;\n\n\t/**\n\t * Event fires when locally acquired item is being released back to the queue.\n\t * Please note that release process is asynchronous, so it takes a while for it to happen\n\t * (\"add\" event will be fired as result of it)\n\t * @param intentional - indicates whether release was intentional (result of returning\n\t * ConsensusResult.Release from callback) or it happened as result of lost connection.\n\t */\n\t(event: \"localRelease\", listener: (value: T, intentional: boolean) => void): this;\n}\n\n/**\n * Consensus Ordered Collection interface\n *\n * An consensus ordered collection is a distributed data structure, which\n * holds a collection of JSON-able or handles, and has a\n * deterministic add/remove order.\n *\n * @remarks\n * The order the server receive the add/remove operation determines the\n * order those operation are applied to the collection. Different clients\n * issuing `add` or `acquire` operations at the same time will be sequenced.\n * The order dictates which `add` is done first, thus determining the order\n * in which it appears in the collection. It also determines which client\n * will get the first removed item, etc. All operations are asynchronous.\n * A function `waitAndAcquire` is provided to wait for and remove an entry in the collection.\n *\n * As a client acquires an item, it processes it and then returns a value (via callback)\n * indicating whether it has completed processing the item, or whether the item should be\n * released back to the collection for another client to process.\n *\n * All objects added to the collection will be cloned (via JSON).\n * They will not be references to the original input object. Thus changed to\n * the input object will not reflect the object in the collection.\n * @alpha\n */\nexport interface IConsensusOrderedCollection<T = any>\n\textends ISharedObject<IConsensusOrderedCollectionEvents<T>> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T): Promise<void>;\n\n\t/**\n\t * Retrieves a value from the collection.\n\t * @returns Returns true (and calls callback with acquired value) if collection was not empty.\n\t * Otherwise returns false.\n\t */\n\tacquire(callback: ConsensusCallback<T>): Promise<boolean>;\n\n\t/**\n\t * Wait for a value to be available and remove it from the consensus collection\n\t * Calls callback with retrieved value.\n\t */\n\twaitAndAcquire(callback: ConsensusCallback<T>): Promise<void>;\n}\n\n/**\n * Interface for object that can be snapshoted\n *\n * TODO: move this to be use in other place\n * TODO: currently input and output is not symmetrical, can they become symmetrical?\n * @alpha\n */\nexport interface ISnapshotable<T> {\n\tasArray(): T[];\n\n\tloadFrom(values: T[]): void;\n}\n\n/**\n * Ordered Collection interface\n *\n * Collection of objects that has deterministic add and remove ordering.\n * Object implementing this interface can be used as the data backing\n * for the ConsensusOrderedCollection\n * @alpha\n */\nexport interface IOrderedCollection<T = any> extends ISnapshotable<T> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T);\n\n\t/**\n\t * Retrieves a value from the collection.\n\t */\n\tremove(): T;\n\n\t/**\n\t * Return the size of the collection\n\t */\n\tsize(): number;\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/ordered-collection";
8
- export declare const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export declare const pkgVersion = "2.0.0-dev-rc.3.0.0.250606";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -8,5 +8,5 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.pkgVersion = exports.pkgName = void 0;
10
10
  exports.pkgName = "@fluidframework/ordered-collection";
11
- exports.pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
11
+ exports.pkgVersion = "2.0.0-dev-rc.3.0.0.250606";
12
12
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,oCAAoC,CAAC;AAC/C,QAAA,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/ordered-collection\";\nexport const pkgVersion = \"2.0.0-dev-rc.2.0.0.245554\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,oCAAoC,CAAC;AAC/C,QAAA,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/ordered-collection\";\nexport const pkgVersion = \"2.0.0-dev-rc.3.0.0.250606\";\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 { IChannelAttributes, IChannelStorageService, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
5
6
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
6
- import { IChannelAttributes, IFluidDataStoreRuntime, IChannelStorageService } from "@fluidframework/datastore-definitions";
7
- import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-base";
8
7
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
9
- import { ConsensusCallback, IConsensusOrderedCollection, IOrderedCollection, IConsensusOrderedCollectionEvents } from "./interfaces.js";
8
+ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-base";
9
+ import { ConsensusCallback, IConsensusOrderedCollection, IConsensusOrderedCollectionEvents, IOrderedCollection } from "./interfaces.js";
10
10
  /**
11
11
  * Implementation of a consensus collection shared object
12
12
  *
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollection.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EACN,iBAAiB,EAEjB,2BAA2B,EAC3B,kBAAkB,EAClB,iCAAiC,EACjC,MAAM,iBAAiB,CAAC;AA8DzB;;;;;;;;;GASG;AACH,qBAAa,0BAA0B,CAAC,CAAC,GAAG,GAAG,CAC9C,SAAQ,YAAY,CAAC,iCAAiC,CAAC,CAAC,CAAC,CACzD,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAexC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbtB;;OAEG;IACH,OAAO,CAAC,WAAW,CAAiC;IAEpD;;;OAGG;IACH,SAAS,aACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB,EACb,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAc7C;;OAEG;IACU,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzC;;;OAGG;IACU,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBtE;;OAEG;IACU,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAa5E,SAAS,CAAC,QAAQ;cAIF,QAAQ,CAAC,SAAS,EAAE,MAAM;IAe1C,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IASxC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;IAiBnC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM;IAUvC;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxE,SAAS,CAAC,YAAY;IAQtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;YAqCX,MAAM;IAepB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,WAAW;YAmBL,eAAe;IAY7B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAKxB,SAAS,CAAC,cAAc,IAAI,IAAI;CAGhC"}
1
+ {"version":3,"file":"consensusOrderedCollection.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAEpF,OAAO,EACN,iBAAiB,EAEjB,2BAA2B,EAC3B,iCAAiC,EACjC,kBAAkB,EAClB,MAAM,iBAAiB,CAAC;AA8DzB;;;;;;;;;GASG;AACH,qBAAa,0BAA0B,CAAC,CAAC,GAAG,GAAG,CAC9C,SAAQ,YAAY,CAAC,iCAAiC,CAAC,CAAC,CAAC,CACzD,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAexC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbtB;;OAEG;IACH,OAAO,CAAC,WAAW,CAAiC;IAEpD;;;OAGG;IACH,SAAS,aACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB,EACb,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAc7C;;OAEG;IACU,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzC;;;OAGG;IACU,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBtE;;OAEG;IACU,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,qBAAqB;IAa5E,SAAS,CAAC,QAAQ;cAIF,QAAQ,CAAC,SAAS,EAAE,MAAM;IAe1C,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM;IASxC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;IAiBnC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM;IAUvC;;OAEG;cACa,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxE,SAAS,CAAC,YAAY;IAQtB,SAAS,CAAC,WAAW,CACpB,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,OAAO,EACd,eAAe,EAAE,OAAO;YAqCX,MAAM;IAepB,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,WAAW;YAmBL,eAAe;IAY7B,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,gBAAgB;IAKxB,SAAS,CAAC,cAAc,IAAI,IAAI;CAGhC"}
@@ -5,8 +5,8 @@
5
5
  import { bufferToString } from "@fluid-internal/client-utils";
6
6
  import { assert, unreachableCase } from "@fluidframework/core-utils";
7
7
  import { MessageType } from "@fluidframework/protocol-definitions";
8
- import { SharedObject } from "@fluidframework/shared-object-base";
9
8
  import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
9
+ import { SharedObject } from "@fluidframework/shared-object-base";
10
10
  import { v4 as uuid } from "uuid";
11
11
  import { ConsensusResult, } from "./interfaces.js";
12
12
  const snapshotFileNameData = "header";
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollection.js","sourceRoot":"","sources":["../src/consensusOrderedCollection.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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n\tConsensusCallback,\n\tConsensusResult,\n\tIConsensusOrderedCollection,\n\tIOrderedCollection,\n\tIConsensusOrderedCollectionEvents,\n} from \"./interfaces.js\";\n\nconst snapshotFileNameData = \"header\";\nconst snapshotFileNameTracking = \"jobTracking\";\n\ninterface IConsensusOrderedCollectionValue<T> {\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\treadonly acquireId: string;\n\n\t// The actual value\n\treadonly value: T;\n}\n\n/**\n * An operation for consensus ordered collection\n */\ninterface IConsensusOrderedCollectionAddOperation<T> {\n\topName: \"add\";\n\t// serialized value\n\tvalue: string;\n\tdeserializedValue?: T;\n}\n\ninterface IConsensusOrderedCollectionAcquireOperation {\n\topName: \"acquire\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionCompleteOperation {\n\topName: \"complete\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionReleaseOperation {\n\topName: \"release\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ntype IConsensusOrderedCollectionOperation<T> =\n\t| IConsensusOrderedCollectionAddOperation<T>\n\t| IConsensusOrderedCollectionAcquireOperation\n\t| IConsensusOrderedCollectionCompleteOperation\n\t| IConsensusOrderedCollectionReleaseOperation;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve<T> = (value: IConsensusOrderedCollectionValue<T> | undefined) => void;\n\n/**\n * For job tracking, we need to keep track of which client \"owns\" a given value.\n * Key is the acquireId from when it was acquired\n * Value is the acquired value, and the id of the client who acquired it, or undefined for unattached client\n */\ntype JobTrackingInfo<T> = Map<string, { value: T; clientId: string | undefined }>;\nconst idForLocalUnattachedClient = undefined;\n\n/**\n * Implementation of a consensus collection shared object\n *\n * Implements the shared object's communication, and the semantics around the\n * release/complete mechanism following acquire.\n *\n * Generally not used directly. A derived type will pass in a backing data type\n * IOrderedCollection that will define the deterministic add/acquire order and snapshot ability.\n * @alpha\n */\nexport class ConsensusOrderedCollection<T = any>\n\textends SharedObject<IConsensusOrderedCollectionEvents<T>>\n\timplements IConsensusOrderedCollection<T>\n{\n\t/**\n\t * The set of values that have been acquired but not yet completed or released\n\t */\n\tprivate jobTracking: JobTrackingInfo<T> = new Map();\n\n\t/**\n\t * Constructs a new consensus collection. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tprotected constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\tprivate readonly data: IOrderedCollection<T>,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_consensusOrderedCollection_\");\n\n\t\t// We can't simply call this.removeClient(this.runtime.clientId) in on runtime disconnected,\n\t\t// because other clients may disconnect concurrently.\n\t\t// Disconnect order matters because it defines the order items go back to the queue.\n\t\t// So we put items back to queue only when we process our own removeMember event.\n\t\truntime.getQuorum().on(\"removeMember\", (clientId: string) => {\n\t\t\tassert(!!clientId, 0x067 /* \"Missing clientId for removal!\" */);\n\t\t\tthis.removeClient(clientId);\n\t\t});\n\t}\n\n\t/**\n\t * Add a value to the consensus collection.\n\t */\n\tpublic async add(value: T): Promise<void> {\n\t\tconst valueSer = this.serializeValue(value, this.serializer);\n\n\t\tif (!this.isAttached()) {\n\t\t\t// For the case where this is not attached yet, explicitly JSON\n\t\t\t// clone the value to match the behavior of going thru the wire.\n\t\t\tconst addValue = this.deserializeValue(valueSer, this.serializer) as T;\n\t\t\tthis.addCore(addValue);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.submit<IConsensusOrderedCollectionAddOperation<T>>({\n\t\t\topName: \"add\",\n\t\t\tvalue: valueSer,\n\t\t\tdeserializedValue: value,\n\t\t});\n\t}\n\n\t/**\n\t * Remove a value from the consensus collection. If the collection is empty, returns false.\n\t * Otherwise calls callback with the value\n\t */\n\tpublic async acquire(callback: ConsensusCallback<T>): Promise<boolean> {\n\t\tconst result = await this.acquireInternal();\n\t\tif (result === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst res = await callback(result.value);\n\n\t\tswitch (res) {\n\t\t\tcase ConsensusResult.Complete:\n\t\t\t\tawait this.complete(result.acquireId);\n\t\t\t\tbreak;\n\t\t\tcase ConsensusResult.Release:\n\t\t\t\tthis.release(result.acquireId);\n\t\t\t\tthis.emit(\"localRelease\", result.value, true /* intentional */);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(res);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Wait for a value to be available and acquire it from the consensus collection\n\t */\n\tpublic async waitAndAcquire(callback: ConsensusCallback<T>): Promise<void> {\n\t\tdo {\n\t\t\tif (this.data.size() === 0) {\n\t\t\t\t// Wait for new entry before trying to acquire again\n\t\t\t\tawait this.newAckBasedPromise<T>((resolve) => {\n\t\t\t\t\tthis.once(\"add\", resolve);\n\t\t\t\t});\n\t\t\t}\n\t\t} while (!(await this.acquire(callback)));\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// If we are transitioning from unattached to attached mode,\n\t\t// then we are losing all checked out work!\n\t\tthis.removeClient(idForLocalUnattachedClient);\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tlet blobContent = this.serializeValue(this.data.asArray(), serializer);\n\t\tbuilder.addBlob(snapshotFileNameData, blobContent);\n\t\tblobContent = this.serializeValue(Array.from(this.jobTracking.entries()), serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive() {\n\t\treturn this.runtime.connected && this.runtime.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.completeCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tawait this.submit<IConsensusOrderedCollectionCompleteOperation>({\n\t\t\t\topName: \"complete\",\n\t\t\t\tacquireId,\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected completeCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.emit(\"complete\", rec.value);\n\t\t}\n\t}\n\n\tprotected release(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.releaseCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tthis.submit<IConsensusOrderedCollectionReleaseOperation>({\n\t\t\t\topName: \"release\",\n\t\t\t\tacquireId,\n\t\t\t}).catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: \"ConsensusQueue_release\" }, error);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.data.add(rec.value);\n\t\t\tthis.emit(\"add\", rec.value, false /* newlyAdded */);\n\t\t}\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\tassert(\n\t\t\tthis.jobTracking.size === 0,\n\t\t\t0x068 /* \"On consensusOrderedCollection load, job tracking size > 0\" */,\n\t\t);\n\t\tconst blob = await storage.readBlob(snapshotFileNameTracking);\n\t\tconst rawContentTracking = bufferToString(blob, \"utf8\");\n\t\tconst content = this.deserializeValue(rawContentTracking, this.serializer);\n\t\tthis.jobTracking = new Map(content) as JobTrackingInfo<T>;\n\n\t\tassert(\n\t\t\tthis.data.size() === 0,\n\t\t\t0x069 /* \"On consensusOrderedCollection load, data size > 0\" */,\n\t\t);\n\t\tconst blob2 = await storage.readBlob(snapshotFileNameData);\n\t\tconst rawContentData = bufferToString(blob2, \"utf8\");\n\t\tconst content2 = this.deserializeValue(rawContentData, this.serializer) as T[];\n\t\tthis.data.loadFrom(content2);\n\t}\n\n\tprotected onDisconnect() {\n\t\tfor (const [, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === this.runtime.clientId) {\n\t\t\t\tthis.emit(\"localRelease\", value, false /* intentional */);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.contents as IConsensusOrderedCollectionOperation<T>;\n\t\t\tlet value: IConsensusOrderedCollectionValue<T> | undefined;\n\t\t\tswitch (op.opName) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\tif (op.deserializedValue !== undefined) {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"acquire\":\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, message.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"complete\":\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"release\":\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t\tif (local) {\n\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\t\t\tresolve(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async submit<TMessage extends IConsensusOrderedCollectionOperation<T>>(\n\t\tmessage: TMessage,\n\t): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tassert(this.isAttached(), 0x06a /* \"Trying to submit message while detached!\" */);\n\n\t\treturn this.newAckBasedPromise<IConsensusOrderedCollectionValue<T> | undefined>(\n\t\t\t(resolve) => {\n\t\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t\t// op is ack'd.\n\t\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t\t// If we fail due to runtime being disposed, it's better to return undefined then unhandled exception.\n\t\t\t},\n\t\t).catch((error) => undefined);\n\t}\n\n\tprivate addCore(value: T) {\n\t\tthis.data.add(value);\n\t\tthis.emit(\"add\", value, true /* newlyAdded */);\n\t}\n\n\tprivate acquireCore(\n\t\tacquireId: string,\n\t\tclientId?: string,\n\t): IConsensusOrderedCollectionValue<T> | undefined {\n\t\tif (this.data.size() === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst value = this.data.remove();\n\n\t\tconst value2: IConsensusOrderedCollectionValue<T> = {\n\t\t\tacquireId,\n\t\t\tvalue,\n\t\t};\n\t\tthis.jobTracking.set(value2.acquireId, { value, clientId });\n\n\t\tthis.emit(\"acquire\", value, clientId);\n\t\treturn value2;\n\t}\n\n\tprivate async acquireInternal(): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tif (!this.isAttached()) {\n\t\t\t// can be undefined if queue is empty\n\t\t\treturn this.acquireCore(uuid(), idForLocalUnattachedClient);\n\t\t}\n\n\t\treturn this.submit<IConsensusOrderedCollectionAcquireOperation>({\n\t\t\topName: \"acquire\",\n\t\t\tacquireId: uuid(),\n\t\t});\n\t}\n\n\tprivate removeClient(clientIdToRemove?: string) {\n\t\tconst added: T[] = [];\n\t\tfor (const [acquireId, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === clientIdToRemove) {\n\t\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\t\tthis.data.add(value);\n\t\t\t\tadded.push(value);\n\t\t\t}\n\t\t}\n\n\t\t// Raise all events only after all state changes are completed,\n\t\t// to guarantee same ordering of operations if collection is manipulated from events.\n\t\tadded.map((value) => this.emit(\"add\", value, false /* newlyAdded */));\n\t}\n\n\tprivate serializeValue(value, serializer: IFluidSerializer) {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(): void {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusOrderedCollection.js","sourceRoot":"","sources":["../src/consensusOrderedCollection.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 } from \"@fluid-internal/client-utils\";\nimport { assert, unreachableCase } from \"@fluidframework/core-utils\";\nimport {\n\tIChannelAttributes,\n\tIChannelStorageService,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISequencedDocumentMessage, MessageType } from \"@fluidframework/protocol-definitions\";\nimport { ISummaryTreeWithStats } from \"@fluidframework/runtime-definitions\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils\";\nimport { IFluidSerializer, SharedObject } from \"@fluidframework/shared-object-base\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n\tConsensusCallback,\n\tConsensusResult,\n\tIConsensusOrderedCollection,\n\tIConsensusOrderedCollectionEvents,\n\tIOrderedCollection,\n} from \"./interfaces.js\";\n\nconst snapshotFileNameData = \"header\";\nconst snapshotFileNameTracking = \"jobTracking\";\n\ninterface IConsensusOrderedCollectionValue<T> {\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\treadonly acquireId: string;\n\n\t// The actual value\n\treadonly value: T;\n}\n\n/**\n * An operation for consensus ordered collection\n */\ninterface IConsensusOrderedCollectionAddOperation<T> {\n\topName: \"add\";\n\t// serialized value\n\tvalue: string;\n\tdeserializedValue?: T;\n}\n\ninterface IConsensusOrderedCollectionAcquireOperation {\n\topName: \"acquire\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionCompleteOperation {\n\topName: \"complete\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ninterface IConsensusOrderedCollectionReleaseOperation {\n\topName: \"release\";\n\t// an ID used to indicate acquired item.\n\t// Used in acquire/release/complete ops.\n\tacquireId: string;\n}\n\ntype IConsensusOrderedCollectionOperation<T> =\n\t| IConsensusOrderedCollectionAddOperation<T>\n\t| IConsensusOrderedCollectionAcquireOperation\n\t| IConsensusOrderedCollectionCompleteOperation\n\t| IConsensusOrderedCollectionReleaseOperation;\n\n/** The type of the resolve function to call after the local operation is ack'd */\ntype PendingResolve<T> = (value: IConsensusOrderedCollectionValue<T> | undefined) => void;\n\n/**\n * For job tracking, we need to keep track of which client \"owns\" a given value.\n * Key is the acquireId from when it was acquired\n * Value is the acquired value, and the id of the client who acquired it, or undefined for unattached client\n */\ntype JobTrackingInfo<T> = Map<string, { value: T; clientId: string | undefined }>;\nconst idForLocalUnattachedClient = undefined;\n\n/**\n * Implementation of a consensus collection shared object\n *\n * Implements the shared object's communication, and the semantics around the\n * release/complete mechanism following acquire.\n *\n * Generally not used directly. A derived type will pass in a backing data type\n * IOrderedCollection that will define the deterministic add/acquire order and snapshot ability.\n * @alpha\n */\nexport class ConsensusOrderedCollection<T = any>\n\textends SharedObject<IConsensusOrderedCollectionEvents<T>>\n\timplements IConsensusOrderedCollection<T>\n{\n\t/**\n\t * The set of values that have been acquired but not yet completed or released\n\t */\n\tprivate jobTracking: JobTrackingInfo<T> = new Map();\n\n\t/**\n\t * Constructs a new consensus collection. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tprotected constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t\tprivate readonly data: IOrderedCollection<T>,\n\t) {\n\t\tsuper(id, runtime, attributes, \"fluid_consensusOrderedCollection_\");\n\n\t\t// We can't simply call this.removeClient(this.runtime.clientId) in on runtime disconnected,\n\t\t// because other clients may disconnect concurrently.\n\t\t// Disconnect order matters because it defines the order items go back to the queue.\n\t\t// So we put items back to queue only when we process our own removeMember event.\n\t\truntime.getQuorum().on(\"removeMember\", (clientId: string) => {\n\t\t\tassert(!!clientId, 0x067 /* \"Missing clientId for removal!\" */);\n\t\t\tthis.removeClient(clientId);\n\t\t});\n\t}\n\n\t/**\n\t * Add a value to the consensus collection.\n\t */\n\tpublic async add(value: T): Promise<void> {\n\t\tconst valueSer = this.serializeValue(value, this.serializer);\n\n\t\tif (!this.isAttached()) {\n\t\t\t// For the case where this is not attached yet, explicitly JSON\n\t\t\t// clone the value to match the behavior of going thru the wire.\n\t\t\tconst addValue = this.deserializeValue(valueSer, this.serializer) as T;\n\t\t\tthis.addCore(addValue);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.submit<IConsensusOrderedCollectionAddOperation<T>>({\n\t\t\topName: \"add\",\n\t\t\tvalue: valueSer,\n\t\t\tdeserializedValue: value,\n\t\t});\n\t}\n\n\t/**\n\t * Remove a value from the consensus collection. If the collection is empty, returns false.\n\t * Otherwise calls callback with the value\n\t */\n\tpublic async acquire(callback: ConsensusCallback<T>): Promise<boolean> {\n\t\tconst result = await this.acquireInternal();\n\t\tif (result === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst res = await callback(result.value);\n\n\t\tswitch (res) {\n\t\t\tcase ConsensusResult.Complete:\n\t\t\t\tawait this.complete(result.acquireId);\n\t\t\t\tbreak;\n\t\t\tcase ConsensusResult.Release:\n\t\t\t\tthis.release(result.acquireId);\n\t\t\t\tthis.emit(\"localRelease\", result.value, true /* intentional */);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunreachableCase(res);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Wait for a value to be available and acquire it from the consensus collection\n\t */\n\tpublic async waitAndAcquire(callback: ConsensusCallback<T>): Promise<void> {\n\t\tdo {\n\t\t\tif (this.data.size() === 0) {\n\t\t\t\t// Wait for new entry before trying to acquire again\n\t\t\t\tawait this.newAckBasedPromise<T>((resolve) => {\n\t\t\t\t\tthis.once(\"add\", resolve);\n\t\t\t\t});\n\t\t\t}\n\t\t} while (!(await this.acquire(callback)));\n\t}\n\n\tprotected summarizeCore(serializer: IFluidSerializer): ISummaryTreeWithStats {\n\t\t// If we are transitioning from unattached to attached mode,\n\t\t// then we are losing all checked out work!\n\t\tthis.removeClient(idForLocalUnattachedClient);\n\n\t\tconst builder = new SummaryTreeBuilder();\n\t\tlet blobContent = this.serializeValue(this.data.asArray(), serializer);\n\t\tbuilder.addBlob(snapshotFileNameData, blobContent);\n\t\tblobContent = this.serializeValue(Array.from(this.jobTracking.entries()), serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive() {\n\t\treturn this.runtime.connected && this.runtime.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.completeCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tawait this.submit<IConsensusOrderedCollectionCompleteOperation>({\n\t\t\t\topName: \"complete\",\n\t\t\t\tacquireId,\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected completeCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.emit(\"complete\", rec.value);\n\t\t}\n\t}\n\n\tprotected release(acquireId: string) {\n\t\tif (!this.isAttached()) {\n\t\t\tthis.releaseCore(acquireId);\n\t\t\treturn;\n\t\t}\n\n\t\t// if not active, this item already was released to queue (as observed by other clients)\n\t\tif (this.isActive()) {\n\t\t\tthis.submit<IConsensusOrderedCollectionReleaseOperation>({\n\t\t\t\topName: \"release\",\n\t\t\t\tacquireId,\n\t\t\t}).catch((error) => {\n\t\t\t\tthis.logger.sendErrorEvent({ eventName: \"ConsensusQueue_release\" }, error);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string) {\n\t\t// Note: item may be no longer in jobTracking and returned back to queue!\n\t\tconst rec = this.jobTracking.get(acquireId);\n\t\tif (rec !== undefined) {\n\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\tthis.data.add(rec.value);\n\t\t\tthis.emit(\"add\", rec.value, false /* newlyAdded */);\n\t\t}\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\tassert(\n\t\t\tthis.jobTracking.size === 0,\n\t\t\t0x068 /* \"On consensusOrderedCollection load, job tracking size > 0\" */,\n\t\t);\n\t\tconst blob = await storage.readBlob(snapshotFileNameTracking);\n\t\tconst rawContentTracking = bufferToString(blob, \"utf8\");\n\t\tconst content = this.deserializeValue(rawContentTracking, this.serializer);\n\t\tthis.jobTracking = new Map(content) as JobTrackingInfo<T>;\n\n\t\tassert(\n\t\t\tthis.data.size() === 0,\n\t\t\t0x069 /* \"On consensusOrderedCollection load, data size > 0\" */,\n\t\t);\n\t\tconst blob2 = await storage.readBlob(snapshotFileNameData);\n\t\tconst rawContentData = bufferToString(blob2, \"utf8\");\n\t\tconst content2 = this.deserializeValue(rawContentData, this.serializer) as T[];\n\t\tthis.data.loadFrom(content2);\n\t}\n\n\tprotected onDisconnect() {\n\t\tfor (const [, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === this.runtime.clientId) {\n\t\t\t\tthis.emit(\"localRelease\", value, false /* intentional */);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected processCore(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalOpMetadata: unknown,\n\t) {\n\t\tif (message.type === MessageType.Operation) {\n\t\t\tconst op = message.contents as IConsensusOrderedCollectionOperation<T>;\n\t\t\tlet value: IConsensusOrderedCollectionValue<T> | undefined;\n\t\t\tswitch (op.opName) {\n\t\t\t\tcase \"add\":\n\t\t\t\t\tif (op.deserializedValue !== undefined) {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"acquire\":\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, message.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"complete\":\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"release\":\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tunreachableCase(op);\n\t\t\t}\n\t\t\tif (local) {\n\t\t\t\t// Resolve the pending promise for this operation now that we have received an ack for it.\n\t\t\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\t\t\tresolve(value);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async submit<TMessage extends IConsensusOrderedCollectionOperation<T>>(\n\t\tmessage: TMessage,\n\t): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tassert(this.isAttached(), 0x06a /* \"Trying to submit message while detached!\" */);\n\n\t\treturn this.newAckBasedPromise<IConsensusOrderedCollectionValue<T> | undefined>(\n\t\t\t(resolve) => {\n\t\t\t\t// Send the resolve function as the localOpMetadata. This will be provided back to us when the\n\t\t\t\t// op is ack'd.\n\t\t\t\tthis.submitLocalMessage(message, resolve);\n\t\t\t\t// If we fail due to runtime being disposed, it's better to return undefined then unhandled exception.\n\t\t\t},\n\t\t).catch((error) => undefined);\n\t}\n\n\tprivate addCore(value: T) {\n\t\tthis.data.add(value);\n\t\tthis.emit(\"add\", value, true /* newlyAdded */);\n\t}\n\n\tprivate acquireCore(\n\t\tacquireId: string,\n\t\tclientId?: string,\n\t): IConsensusOrderedCollectionValue<T> | undefined {\n\t\tif (this.data.size() === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst value = this.data.remove();\n\n\t\tconst value2: IConsensusOrderedCollectionValue<T> = {\n\t\t\tacquireId,\n\t\t\tvalue,\n\t\t};\n\t\tthis.jobTracking.set(value2.acquireId, { value, clientId });\n\n\t\tthis.emit(\"acquire\", value, clientId);\n\t\treturn value2;\n\t}\n\n\tprivate async acquireInternal(): Promise<IConsensusOrderedCollectionValue<T> | undefined> {\n\t\tif (!this.isAttached()) {\n\t\t\t// can be undefined if queue is empty\n\t\t\treturn this.acquireCore(uuid(), idForLocalUnattachedClient);\n\t\t}\n\n\t\treturn this.submit<IConsensusOrderedCollectionAcquireOperation>({\n\t\t\topName: \"acquire\",\n\t\t\tacquireId: uuid(),\n\t\t});\n\t}\n\n\tprivate removeClient(clientIdToRemove?: string) {\n\t\tconst added: T[] = [];\n\t\tfor (const [acquireId, { value, clientId }] of this.jobTracking) {\n\t\t\tif (clientId === clientIdToRemove) {\n\t\t\t\tthis.jobTracking.delete(acquireId);\n\t\t\t\tthis.data.add(value);\n\t\t\t\tadded.push(value);\n\t\t\t}\n\t\t}\n\n\t\t// Raise all events only after all state changes are completed,\n\t\t// to guarantee same ordering of operations if collection is manipulated from events.\n\t\tadded.map((value) => this.emit(\"add\", value, false /* newlyAdded */));\n\t}\n\n\tprivate serializeValue(value, serializer: IFluidSerializer) {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-return\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(): void {\n\t\tthrow new Error(\"not implemented\");\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IChannelAttributes, IFluidDataStoreRuntime, IChannelServices } from "@fluidframework/datastore-definitions";
5
+ import { IChannelAttributes, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
6
  import { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from "./interfaces.js";
7
7
  /**
8
8
  * The factory that defines the consensus queue
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,2BAA2B,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAGlG;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,kCAAkC;IAC/E,OAAc,IAAI,SAAuD;IAEzE,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC;IAMhC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B;CAKxF"}
1
+ {"version":3,"file":"consensusOrderedCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,2BAA2B,EAAE,kCAAkC,EAAE,MAAM,iBAAiB,CAAC;AAGlG;;;;GAIG;AACH,qBAAa,qBAAsB,YAAW,kCAAkC;IAC/E,OAAc,IAAI,SAAuD;IAEzE,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,WAEd;IAED,IAAW,UAAU,uBAEpB;IAED;;OAEG;IACU,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC;IAMhC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B;CAKxF"}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IASjC,IAAW,IAAI;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,qBAAqB,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAlCa,0BAAI,GAAG,mDAAmD,CAAC;AAElD,gCAAU,GAAuB;IACvD,IAAI,EAAE,qBAAqB,CAAC,IAAI;IAChC,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,UAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusQueue } from \"./consensusQueue.js\";\nimport { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue\n *\n * @internal\n */\nexport class ConsensusQueueFactory implements IConsensusOrderedCollectionFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-queue\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusQueueFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type() {\n\t\treturn ConsensusQueueFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn ConsensusQueueFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection> {\n\t\tconst collection = new ConsensusQueue(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection {\n\t\tconst collection = new ConsensusQueue(id, document, this.attributes);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IASjC,IAAW,IAAI;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,qBAAqB,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAlCa,0BAAI,GAAG,mDAAmD,CAAC;AAElD,gCAAU,GAAuB;IACvD,IAAI,EAAE,qBAAqB,CAAC,IAAI;IAChC,qBAAqB,EAAE,KAAK;IAC5B,cAAc,EAAE,UAAU;CAC1B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusQueue } from \"./consensusQueue.js\";\nimport { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from \"./interfaces.js\";\nimport { pkgVersion } from \"./packageVersion.js\";\n\n/**\n * The factory that defines the consensus queue\n *\n * @internal\n */\nexport class ConsensusQueueFactory implements IConsensusOrderedCollectionFactory {\n\tpublic static Type = \"https://graph.microsoft.com/types/consensus-queue\";\n\n\tpublic static readonly Attributes: IChannelAttributes = {\n\t\ttype: ConsensusQueueFactory.Type,\n\t\tsnapshotFormatVersion: \"0.1\",\n\t\tpackageVersion: pkgVersion,\n\t};\n\n\tpublic get type() {\n\t\treturn ConsensusQueueFactory.Type;\n\t}\n\n\tpublic get attributes() {\n\t\treturn ConsensusQueueFactory.Attributes;\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/datastore-definitions#IChannelFactory.load}\n\t */\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection> {\n\t\tconst collection = new ConsensusQueue(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection {\n\t\tconst collection = new ConsensusQueue(id, document, this.attributes);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidDataStoreRuntime, IChannelAttributes, IChannelFactory } from "@fluidframework/datastore-definitions";
5
+ import { IChannelAttributes, IChannelFactory, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
6
  import { ConsensusOrderedCollection } from "./consensusOrderedCollection.js";
7
7
  /**
8
8
  * Implementation of a consensus stack
@@ -1 +1 @@
1
- {"version":3,"file":"consensusQueue.d.ts","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAqB7E;;;;;GAKG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACzE;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAI1E;;;;OAIG;WACW,UAAU,IAAI,eAAe;IAI3C;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;CAI/B"}
1
+ {"version":3,"file":"consensusQueue.d.ts","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAqB7E;;;;;GAKG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,0BAA0B,CAAC,CAAC,CAAC;IACzE;;;;;;OAMG;WACW,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,MAAM;IAI1E;;;;OAIG;WACW,UAAU,IAAI,eAAe;IAI3C;;;OAGG;gBAEF,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,sBAAsB,EAC/B,UAAU,EAAE,kBAAkB;CAI/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusQueue.js","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;GAEG;AACH,MAAM,iBAAqB,SAAQ,iBAAoB;IAC/C,GAAG,CAAC,KAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEM,MAAM;QACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC9C;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAO,CAAC;IAC/B,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,cAAwB,SAAQ,0BAA6B;IACzE;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAU,OAA+B,EAAE,EAAW;QACzE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAsB,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,qBAAqB,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B;QAE9B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,iBAAiB,EAAK,CAAC,CAAC;IAC5D,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelAttributes,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusOrderedCollection } from \"./consensusOrderedCollection.js\";\nimport { ConsensusQueueFactory } from \"./consensusOrderedCollectionFactory.js\";\nimport { IOrderedCollection } from \"./interfaces.js\";\nimport { SnapshotableArray } from \"./snapshotableArray.js\";\n\n/**\n * An JS array based queue implementation that is the backing data structure for ConsensusQueue\n */\nclass SnapshotableQueue<T> extends SnapshotableArray<T> implements IOrderedCollection<T> {\n\tpublic add(value: T) {\n\t\tthis.data.push(value);\n\t}\n\n\tpublic remove(): T {\n\t\tif (this.size() === 0) {\n\t\t\tthrow new Error(\"SnapshotableQueue is empty\");\n\t\t}\n\t\treturn this.data.shift() as T;\n\t}\n}\n\n/**\n * Implementation of a consensus stack\n *\n * An derived type of ConsensusOrderedCollection with a queue as the backing data and order.\n * @alpha\n */\nexport class ConsensusQueue<T = any> extends ConsensusOrderedCollection<T> {\n\t/**\n\t * Create a new consensus queue\n\t *\n\t * @param runtime - data store runtime the new consensus queue belongs to\n\t * @param id - optional name of theconsensus queue\n\t * @returns newly create consensus queue (but not attached yet)\n\t */\n\tpublic static create<T = any>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, ConsensusQueueFactory.Type) as ConsensusQueue<T>;\n\t}\n\n\t/**\n\t * Get a factory for ConsensusQueue to register with the data store.\n\t *\n\t * @returns a factory that creates and load ConsensusQueue\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new ConsensusQueueFactory();\n\t}\n\n\t/**\n\t * Constructs a new consensus queue. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, new SnapshotableQueue<T>());\n\t}\n}\n"]}
1
+ {"version":3,"file":"consensusQueue.js","sourceRoot":"","sources":["../src/consensusQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;GAEG;AACH,MAAM,iBAAqB,SAAQ,iBAAoB;IAC/C,GAAG,CAAC,KAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEM,MAAM;QACZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC9C;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAO,CAAC;IAC/B,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,cAAwB,SAAQ,0BAA6B;IACzE;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAAU,OAA+B,EAAE,EAAW;QACzE,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAsB,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,UAAU;QACvB,OAAO,IAAI,qBAAqB,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,YACC,EAAU,EACV,OAA+B,EAC/B,UAA8B;QAE9B,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,iBAAiB,EAAK,CAAC,CAAC;IAC5D,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ConsensusOrderedCollection } from \"./consensusOrderedCollection.js\";\nimport { ConsensusQueueFactory } from \"./consensusOrderedCollectionFactory.js\";\nimport { IOrderedCollection } from \"./interfaces.js\";\nimport { SnapshotableArray } from \"./snapshotableArray.js\";\n\n/**\n * An JS array based queue implementation that is the backing data structure for ConsensusQueue\n */\nclass SnapshotableQueue<T> extends SnapshotableArray<T> implements IOrderedCollection<T> {\n\tpublic add(value: T) {\n\t\tthis.data.push(value);\n\t}\n\n\tpublic remove(): T {\n\t\tif (this.size() === 0) {\n\t\t\tthrow new Error(\"SnapshotableQueue is empty\");\n\t\t}\n\t\treturn this.data.shift() as T;\n\t}\n}\n\n/**\n * Implementation of a consensus stack\n *\n * An derived type of ConsensusOrderedCollection with a queue as the backing data and order.\n * @alpha\n */\nexport class ConsensusQueue<T = any> extends ConsensusOrderedCollection<T> {\n\t/**\n\t * Create a new consensus queue\n\t *\n\t * @param runtime - data store runtime the new consensus queue belongs to\n\t * @param id - optional name of theconsensus queue\n\t * @returns newly create consensus queue (but not attached yet)\n\t */\n\tpublic static create<T = any>(runtime: IFluidDataStoreRuntime, id?: string) {\n\t\treturn runtime.createChannel(id, ConsensusQueueFactory.Type) as ConsensusQueue<T>;\n\t}\n\n\t/**\n\t * Get a factory for ConsensusQueue to register with the data store.\n\t *\n\t * @returns a factory that creates and load ConsensusQueue\n\t */\n\tpublic static getFactory(): IChannelFactory {\n\t\treturn new ConsensusQueueFactory();\n\t}\n\n\t/**\n\t * Constructs a new consensus queue. If the object is non-local an id and service interfaces will\n\t * be provided\n\t */\n\tpublic constructor(\n\t\tid: string,\n\t\truntime: IFluidDataStoreRuntime,\n\t\tattributes: IChannelAttributes,\n\t) {\n\t\tsuper(id, runtime, attributes, new SnapshotableQueue<T>());\n\t}\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IFluidDataStoreRuntime, IChannelServices, IChannelAttributes, IChannelFactory } from "@fluidframework/datastore-definitions";
5
+ import { IChannelAttributes, IChannelFactory, IChannelServices, IFluidDataStoreRuntime } from "@fluidframework/datastore-definitions";
6
6
  import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-object-base";
7
7
  /**
8
8
  * @alpha
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;GAEG;AACH,oBAAY,eAAe;IAC1B,OAAO,IAAA;IACP,QAAQ,IAAA;CACR;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,kCAAmC,SAAQ,eAAe;IAC1E,IAAI,CACH,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAExC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B,CAAC;CAClF;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAiC,CAAC,CAAC,CAAE,SAAQ,mBAAmB;IAChF;;;;OAIG;IACH,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACxE;;;OAGG;IACH,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAE1E;;OAEG;IACH,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAClF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,GAAG,CACnD,SAAQ,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;IAC3D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,EAAE,CAAC;IAEf,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACpE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,OAAE;IAEd;;OAEG;IACH,MAAM,IAAI,CAAC,CAAC;IAEZ;;OAEG;IACH,IAAI,IAAI,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF;;GAEG;AACH,oBAAY,eAAe;IAC1B,OAAO,IAAA;IACP,QAAQ,IAAA;CACR;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,kCAAmC,SAAQ,eAAe;IAC1E,IAAI,CACH,QAAQ,EAAE,sBAAsB,EAChC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAExC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B,CAAC;CAClF;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAiC,CAAC,CAAC,CAAE,SAAQ,mBAAmB;IAChF;;;;OAIG;IACH,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACxE;;;OAGG;IACH,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAE1E;;OAEG;IACH,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAExD;;;;;;OAMG;IACH,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAClF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,GAAG,CACnD,SAAQ,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC;IAC3D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE1D;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,EAAE,CAAC;IAEf,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACpE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,OAAE;IAEd;;OAEG;IACH,MAAM,IAAI,CAAC,CAAC;IAEZ;;OAEG;IACH,IAAI,IAAI,MAAM,CAAC;CACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IAC1B,2DAAO,CAAA;IACP,6DAAQ,CAAA;AACT,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIFluidDataStoreRuntime,\n\tIChannelServices,\n\tIChannelAttributes,\n\tIChannelFactory,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\n\n/**\n * @alpha\n */\nexport enum ConsensusResult {\n\tRelease,\n\tComplete,\n}\n\n/**\n * Callback provided to acquire() and waitAndAcquire() methods.\n * @returns ConsensusResult indicating whether item was completed, or releases back to the queue.\n * @alpha\n */\nexport type ConsensusCallback<T> = (value: T) => Promise<ConsensusResult>;\n\n/**\n * Consensus Ordered Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusOrderedCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel\n * @internal\n */\nexport interface IConsensusOrderedCollectionFactory extends IChannelFactory {\n\tload(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection>;\n\n\tcreate(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection;\n}\n\n/**\n * Events notifying about addition, acquisition, release and completion of items\n * @alpha\n */\nexport interface IConsensusOrderedCollectionEvents<T> extends ISharedObjectEvents {\n\t/**\n\t * Event fires when new item is added to the queue or\n\t * an item previously acquired is returned back to a queue (including client loosing connection)\n\t * @param newlyAdded - indicates if it's newly added item of previously acquired item\n\t */\n\t(event: \"add\", listener: (value: T, newlyAdded: boolean) => void): this;\n\t/**\n\t * Event fires when a client acquired an item\n\t * Fires both for locally acquired items, as well as items acquired by remote clients\n\t */\n\t(event: \"acquire\", listener: (value: T, clientId?: string) => void): this;\n\n\t/**\n\t * \"Complete event fires when a client completes an item.\n\t */\n\t(event: \"complete\", listener: (value: T) => void): this;\n\n\t/**\n\t * Event fires when locally acquired item is being released back to the queue.\n\t * Please note that release process is asynchronous, so it takes a while for it to happen\n\t * (\"add\" event will be fired as result of it)\n\t * @param intentional - indicates whether release was intentional (result of returning\n\t * ConsensusResult.Release from callback) or it happened as result of lost connection.\n\t */\n\t(event: \"localRelease\", listener: (value: T, intentional: boolean) => void): this;\n}\n\n/**\n * Consensus Ordered Collection interface\n *\n * An consensus ordered collection is a distributed data structure, which\n * holds a collection of JSON-able or handles, and has a\n * deterministic add/remove order.\n *\n * @remarks\n * The order the server receive the add/remove operation determines the\n * order those operation are applied to the collection. Different clients\n * issuing `add` or `acquire` operations at the same time will be sequenced.\n * The order dictates which `add` is done first, thus determining the order\n * in which it appears in the collection. It also determines which client\n * will get the first removed item, etc. All operations are asynchronous.\n * A function `waitAndAcquire` is provided to wait for and remove an entry in the collection.\n *\n * As a client acquires an item, it processes it and then returns a value (via callback)\n * indicating whether it has completed processing the item, or whether the item should be\n * released back to the collection for another client to process.\n *\n * All objects added to the collection will be cloned (via JSON).\n * They will not be references to the original input object. Thus changed to\n * the input object will not reflect the object in the collection.\n * @alpha\n */\nexport interface IConsensusOrderedCollection<T = any>\n\textends ISharedObject<IConsensusOrderedCollectionEvents<T>> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T): Promise<void>;\n\n\t/**\n\t * Retrieves a value from the collection.\n\t * @returns Returns true (and calls callback with acquired value) if collection was not empty.\n\t * Otherwise returns false.\n\t */\n\tacquire(callback: ConsensusCallback<T>): Promise<boolean>;\n\n\t/**\n\t * Wait for a value to be available and remove it from the consensus collection\n\t * Calls callback with retrieved value.\n\t */\n\twaitAndAcquire(callback: ConsensusCallback<T>): Promise<void>;\n}\n\n/**\n * Interface for object that can be snapshoted\n *\n * TODO: move this to be use in other place\n * TODO: currently input and output is not symmetrical, can they become symmetrical?\n * @alpha\n */\nexport interface ISnapshotable<T> {\n\tasArray(): T[];\n\n\tloadFrom(values: T[]): void;\n}\n\n/**\n * Ordered Collection interface\n *\n * Collection of objects that has deterministic add and remove ordering.\n * Object implementing this interface can be used as the data backing\n * for the ConsensusOrderedCollection\n * @alpha\n */\nexport interface IOrderedCollection<T = any> extends ISnapshotable<T> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T);\n\n\t/**\n\t * Retrieves a value from the collection.\n\t */\n\tremove(): T;\n\n\t/**\n\t * Return the size of the collection\n\t */\n\tsize(): number;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IAC1B,2DAAO,CAAA;IACP,6DAAQ,CAAA;AACT,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { ISharedObject, ISharedObjectEvents } from \"@fluidframework/shared-object-base\";\n\n/**\n * @alpha\n */\nexport enum ConsensusResult {\n\tRelease,\n\tComplete,\n}\n\n/**\n * Callback provided to acquire() and waitAndAcquire() methods.\n * @returns ConsensusResult indicating whether item was completed, or releases back to the queue.\n * @alpha\n */\nexport type ConsensusCallback<T> = (value: T) => Promise<ConsensusResult>;\n\n/**\n * Consensus Ordered Collection channel factory interface\n *\n * Extends the base IChannelFactory to return a more definite type of IConsensusOrderedCollection\n * Use for the runtime to create and load distributed data structure by type name of each channel\n * @internal\n */\nexport interface IConsensusOrderedCollectionFactory extends IChannelFactory {\n\tload(\n\t\tdocument: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection>;\n\n\tcreate(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection;\n}\n\n/**\n * Events notifying about addition, acquisition, release and completion of items\n * @alpha\n */\nexport interface IConsensusOrderedCollectionEvents<T> extends ISharedObjectEvents {\n\t/**\n\t * Event fires when new item is added to the queue or\n\t * an item previously acquired is returned back to a queue (including client loosing connection)\n\t * @param newlyAdded - indicates if it's newly added item of previously acquired item\n\t */\n\t(event: \"add\", listener: (value: T, newlyAdded: boolean) => void): this;\n\t/**\n\t * Event fires when a client acquired an item\n\t * Fires both for locally acquired items, as well as items acquired by remote clients\n\t */\n\t(event: \"acquire\", listener: (value: T, clientId?: string) => void): this;\n\n\t/**\n\t * \"Complete event fires when a client completes an item.\n\t */\n\t(event: \"complete\", listener: (value: T) => void): this;\n\n\t/**\n\t * Event fires when locally acquired item is being released back to the queue.\n\t * Please note that release process is asynchronous, so it takes a while for it to happen\n\t * (\"add\" event will be fired as result of it)\n\t * @param intentional - indicates whether release was intentional (result of returning\n\t * ConsensusResult.Release from callback) or it happened as result of lost connection.\n\t */\n\t(event: \"localRelease\", listener: (value: T, intentional: boolean) => void): this;\n}\n\n/**\n * Consensus Ordered Collection interface\n *\n * An consensus ordered collection is a distributed data structure, which\n * holds a collection of JSON-able or handles, and has a\n * deterministic add/remove order.\n *\n * @remarks\n * The order the server receive the add/remove operation determines the\n * order those operation are applied to the collection. Different clients\n * issuing `add` or `acquire` operations at the same time will be sequenced.\n * The order dictates which `add` is done first, thus determining the order\n * in which it appears in the collection. It also determines which client\n * will get the first removed item, etc. All operations are asynchronous.\n * A function `waitAndAcquire` is provided to wait for and remove an entry in the collection.\n *\n * As a client acquires an item, it processes it and then returns a value (via callback)\n * indicating whether it has completed processing the item, or whether the item should be\n * released back to the collection for another client to process.\n *\n * All objects added to the collection will be cloned (via JSON).\n * They will not be references to the original input object. Thus changed to\n * the input object will not reflect the object in the collection.\n * @alpha\n */\nexport interface IConsensusOrderedCollection<T = any>\n\textends ISharedObject<IConsensusOrderedCollectionEvents<T>> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T): Promise<void>;\n\n\t/**\n\t * Retrieves a value from the collection.\n\t * @returns Returns true (and calls callback with acquired value) if collection was not empty.\n\t * Otherwise returns false.\n\t */\n\tacquire(callback: ConsensusCallback<T>): Promise<boolean>;\n\n\t/**\n\t * Wait for a value to be available and remove it from the consensus collection\n\t * Calls callback with retrieved value.\n\t */\n\twaitAndAcquire(callback: ConsensusCallback<T>): Promise<void>;\n}\n\n/**\n * Interface for object that can be snapshoted\n *\n * TODO: move this to be use in other place\n * TODO: currently input and output is not symmetrical, can they become symmetrical?\n * @alpha\n */\nexport interface ISnapshotable<T> {\n\tasArray(): T[];\n\n\tloadFrom(values: T[]): void;\n}\n\n/**\n * Ordered Collection interface\n *\n * Collection of objects that has deterministic add and remove ordering.\n * Object implementing this interface can be used as the data backing\n * for the ConsensusOrderedCollection\n * @alpha\n */\nexport interface IOrderedCollection<T = any> extends ISnapshotable<T> {\n\t/**\n\t * Adds a value to the collection\n\t */\n\tadd(value: T);\n\n\t/**\n\t * Retrieves a value from the collection.\n\t */\n\tremove(): T;\n\n\t/**\n\t * Return the size of the collection\n\t */\n\tsize(): number;\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/ordered-collection";
8
- export declare const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export declare const pkgVersion = "2.0.0-dev-rc.3.0.0.250606";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/ordered-collection";
8
- export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export const pkgVersion = "2.0.0-dev-rc.3.0.0.250606";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/ordered-collection\";\nexport const pkgVersion = \"2.0.0-dev-rc.2.0.0.245554\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,oCAAoC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/ordered-collection\";\nexport const pkgVersion = \"2.0.0-dev-rc.3.0.0.250606\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"consensusOrderedCollection.spec.js","sourceRoot":"","sources":["../../src/test/consensusOrderedCollection.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAmB,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACN,2BAA2B,EAC3B,0CAA0C,EAE1C,yBAAyB,EACzB,WAAW,GACX,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,eAAe,EAA+B,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,SAAS,yBAAyB,CAAC,EAAU,EAAE,cAA2C;IACzF,MAAM,gBAAgB,GAAG,IAAI,yBAAyB,EAAE,CAAC;IACzD,cAAc,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAqB;QAClC,eAAe,EAAE,gBAAgB,CAAC,qBAAqB,EAAE;QACzD,aAAa,EAAE,IAAI,WAAW,EAAE;KAChC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC5D,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,cAAc,CAAC;AACvB,CAAC;AAED,SAAS,qBAAqB,CAAC,EAAU;IACxC,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,yBAAyB,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,+BAA+B,CACvC,EAAU,EACV,cAA0D;IAE1D,MAAM,gBAAgB,GAAG,IAAI,yBAAyB,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,cAAc,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IACjF,MAAM,QAAQ,GAAqB;QAClC,eAAe,EAAE,gBAAgB,CAAC,qBAAqB,EAAE;QACzD,aAAa,EAAE,IAAI,WAAW,EAAE;KAChC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACxD,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AACzC,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,SAAS,QAAQ,CAChB,KAAY,EACZ,MAAa,EACb,OAA0C,EAC1C,eAA2B;QAE3B,IAAI,cAA2C,CAAC;QAEhD,KAAK,UAAU,UAAU;YACxB,MAAM,IAAI,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;YAChD,eAAe,EAAE,CAAC;YAClB,YAAY,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,KAAK,UAAU,iBAAiB;YAC/B,eAAe,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACpD,eAAe,EAAE,CAAC;YAClB,YAAY,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,KAAK,UAAU,OAAO,CAAC,IAAI;YAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvC,eAAe,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC/B,UAAU,CAAC,KAAK,IAAI,EAAE;gBACrB,cAAc,GAAG,OAAO,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;gBAClC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBACxC,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;gBAClD,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC3B,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,WAAW,CAAC,CAAC;gBACpD,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;gBAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;gBACrC,MAAM,CAAC,MAAM,EAAE,yCAAyC,CAAC,CAAC;gBAC1D,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEtB,MAAM,aAAa,GAAG,MAAM,UAAU,EAAE,CAAC;gBACzC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBACpE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;gBACrC,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,MAAM,CAAC,YAAY,EAC7B,cAAc,CAAC,MAAM,CAAC,YAAY,CAClC,CAAC;gBAEF,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;gBACzC,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC3B,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtD,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;oBACvC,OAAO,eAAe,CAAC,OAAO,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,eAAe,EAAE,CAAC;gBAClB,MAAM,OAAO,CAAC;gBACd,MAAM,CAAC,WAAW,CAAC,MAAM,iBAAiB,EAAE,EAAE,WAAW,CAAC,CAAC;gBAC3D,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;gBAClC,IAAI,KAAK,GAAG,KAAK,CAAC;gBAClB,IAAI,GAAQ,CAAC;gBACb,MAAM,CAAC,GAAG,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBACvD,MAAM,CAAC,KAAK,EAAE,qCAAqC,CAAC,CAAC;oBACrD,GAAG,GAAG,KAAK,CAAC;oBACZ,OAAO,eAAe,CAAC,QAAQ,CAAC;gBACjC,CAAC,CAAC,CAAC;gBAEH,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;gBAChC,eAAe,EAAE,CAAC;gBAClB,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM,EAAE,CAAC;gBACT,8EAA8E;gBAC9E,eAAe,EAAE,CAAC;gBAClB,YAAY,CAAC,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;gBACtC,MAAM,CAAC,CAAC;gBACR,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;gBAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACzB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;iBACpB;gBAED,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;oBAC1B,MAAM,CAAC,WAAW,CAAC,MAAM,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC;iBAC7C;gBACD,MAAM,CAAC,WAAW,CACjB,MAAM,UAAU,EAAE,EAClB,SAAS,EACT,+CAA+C,CAC/C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;gBACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,EAAE;oBAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,+BAA+B,CAAC,CAAC;oBAC5E,QAAQ,IAAI,CAAC,CAAC;gBACf,CAAC,CAAC;gBACF,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBAEtC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE;oBACjC,MAAM,CAAC,WAAW,CACjB,KAAK,EACL,MAAM,CAAC,WAAW,CAAC,EACnB,gCAAgC,CAChC,CAAC;oBACF,WAAW,IAAI,CAAC,CAAC;gBAClB,CAAC,CAAC;gBACF,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;gBAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACzB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;iBACpB;gBAED,eAAe,EAAE,CAAC;gBAElB,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC1B,OAAO,KAAK,GAAG,CAAC,EAAE;oBACjB,MAAM,UAAU,EAAE,CAAC;oBACnB,KAAK,IAAI,CAAC,CAAC;iBACX;gBACD,MAAM,CAAC,WAAW,CACjB,MAAM,UAAU,EAAE,EAClB,SAAS,EACT,+CAA+C,CAC/C,CAAC;gBAEF,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;gBACzE,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;gBAEhF,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACvC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;gBACvC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;gBAClC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACnC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACzB,QAAQ,CACP,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,GAAG,EAAE,CAAC,qBAAqB,CAAC,8BAA8B,CAAC,EAC3D,GAAG,EAAE,GAAE,CAAC,CACR,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACpC,MAAM,uBAAuB,GAC5B,IAAI,2BAA2B,EAAE,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,QAAQ,CACP,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,CAAC,CAAC,EAAE,CAAC,CAAC,EACN,GAAG,EAAE,CACJ,yBAAyB,CACxB,gCAAgC,EAAE,OAAO,EAAE,EAC3C,uBAAuB,CACvB,EACF,GAAG,EAAE;YACJ,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;QAC9C,CAAC,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAClC,IAAI,uBAAmE,CAAC;QACxE,IAAI,iBAAsD,CAAC;QAC3D,IAAI,eAA4C,CAAC;QACjD,IAAI,eAA4C,CAAC;QAEjD,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,uBAAuB,GAAG,IAAI,0CAA0C,EAAE,CAAC;YAE3E,0CAA0C;YAC1C,MAAM,SAAS,GAAG,+BAA+B,CAChD,aAAa,EACb,uBAAuB,CACvB,CAAC;YACF,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC;YACvC,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC;YAE/C,2CAA2C;YAC3C,MAAM,SAAS,GAAG,+BAA+B,CAChD,aAAa,EACb,uBAAuB,CACvB,CAAC;YACF,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD;;eAEG;YACH,MAAM,SAAS,GAAG,WAAW,CAAC;YAE9B,0GAA0G;YAC1G,UAAU;YACV,IAAI,UAAU,GAAW,EAAE,CAAC;YAC5B,IAAI,UAAU,GAAY,KAAK,CAAC;YAChC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAU,EAAE,KAAc,EAAE,EAAE;gBACxD,UAAU,GAAG,KAAK,CAAC;gBACnB,UAAU,GAAG,KAAK,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,sDAAsD;YACtD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE7C,iDAAiD;YACjD,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,KAAK,CAAC;YAEZ,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CACX,UAAU,EACV,SAAS,EACT,mDAAmD,CACnD,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,+CAA+C,CAAC,CAAC;YAEhF;;eAEG;YAEH,0GAA0G;YAC1G,UAAU;YACV,IAAI,aAAa,GAAW,EAAE,CAAC;YAC/B,IAAI,gBAAgB,GAAuB,EAAE,CAAC;YAC9C,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,KAAU,EAAE,QAAiB,EAAE,EAAE;gBAC/D,aAAa,GAAG,KAAK,CAAC;gBACtB,gBAAgB,GAAG,QAAQ,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,sCAAsC;YACtC,IAAI,GAAQ,CAAC;YACb,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACvD,GAAG,GAAG,KAAK,CAAC;gBACZ,OAAO,eAAe,CAAC,QAAQ,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,iDAAiD;YACjD,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YACpC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,YAAY,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAEjE,MAAM,OAAO,CAAC;YAEd,oEAAoE;YACpE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,mDAAmD,CAAC,CAAC;YAElF,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CACX,aAAa,EACb,SAAS,EACT,sDAAsD,CACtD,CAAC;YACF,MAAM,CAAC,KAAK,CACX,gBAAgB,EAChB,iBAAiB,CAAC,QAAQ,EAC1B,gFAAgF,CAChF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,SAAS,GAAG,WAAW,CAAC;YAE9B,mGAAmG;YACnG,iBAAiB;YACjB,IAAI,UAAU,GAAW,EAAE,CAAC;YAC5B,IAAI,UAAU,GAAY,KAAK,CAAC;YAChC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAU,EAAE,KAAc,EAAE,EAAE;gBACxD,UAAU,GAAG,KAAK,CAAC;gBACnB,UAAU,GAAG,KAAK,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC;YAEpC,uDAAuD;YACvD,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE7C,kCAAkC;YAClC,iBAAiB,CAAC,SAAS,GAAG,IAAI,CAAC;YAEnC,wBAAwB;YACxB,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,MAAM,KAAK,CAAC;YAEZ,8DAA8D;YAC9D,MAAM,CAAC,KAAK,CACX,UAAU,EACV,SAAS,EACT,mDAAmD,CACnD,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,+CAA+C,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QACnC,MAAM,2BAA2B;YAMhC;gBALQ,oBAAe,GAAa,EAAE,CAAC;gBAC/B,uBAAkB,GAAG,CAAC,CAAC;gBAK9B,IAAI,CAAC,uBAAuB,GAAG,IAAI,2BAA2B,EAAE,CAAC;gBACjE,IAAI,CAAC,UAAU,GAAG,yBAAyB,CAC1C,oBAAoB,EACpB,IAAI,CAAC,uBAAuB,CAC5B,CAAC;YACH,CAAC;YAEO,KAAK,CAAC,OAAO,CAAC,IAAS;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACd,CAAC;YAEO,KAAK,CAAC,UAAU;gBACvB,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjD,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;gBAClD,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBACtE,OAAO,IAAI,CAAC;YACb,CAAC;YAED,IAAW,YAAY;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC;YACxB,CAAC;YAED,IAAW,sBAAsB;gBAChC,OAAO,IAAI,CAAC,eAAe,CAAC;YAC7B,CAAC;YAEM,KAAK,CAAC,iBAAiB;gBAC7B,MAAM,aAAa,GAAG,qBAAqB,CAC1C,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAC5C,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9D,CAAC;YAEM,KAAK,CAAC,oBAAoB;gBAChC,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAiB,CAAC;gBAChE,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC,CAAC;gBAC7D,sDAAsD;gBACtD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CACjD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC,YAAY,CAC/C,CAAC;YACH,CAAC;YAEM,KAAK,CAAC,gBAAgB;gBAC5B,MAAM,cAAc,GAAG,qBAAqB,CAC3C,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAC5C,CAAC;gBACF,MAAM,cAAc,GAAG,qBAAqB,CAC3C,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAC5C,CAAC;gBACF,MAAM,gBAAgB,GAAG;oBACxB,iBAAiB,EAAE,cAAc,CAAC,MAAM;oBACxC,SAAS,EAAE;wBACV,iBAAiB,EAAE,cAAc,CAAC,MAAM;qBACxC;iBACD,CAAC;gBACF,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBACrC,IAAI,CAAC,eAAe,CAAC,IAAI,CACxB,cAAc,CAAC,MAAM,CAAC,YAAY,EAClC,cAAc,CAAC,MAAM,CAAC,YAAY,CAClC,CAAC;YACH,CAAC;SACD;QAED,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport { IGCTestProvider, runGCTests } from \"@fluid-private/test-dds-utils\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { ConsensusQueueFactory } from \"../consensusOrderedCollectionFactory.js\";\nimport { ConsensusResult, IConsensusOrderedCollection } from \"../interfaces.js\";\nimport { acquireAndComplete, waitAcquireAndComplete } from \"../testUtils.js\";\n\nfunction createConnectedCollection(id: string, runtimeFactory: MockContainerRuntimeFactory) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\truntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\n\tconst factory = new ConsensusQueueFactory();\n\tconst testCollection = factory.create(dataStoreRuntime, id);\n\ttestCollection.connect(services);\n\treturn testCollection;\n}\n\nfunction createLocalCollection(id: string) {\n\tconst factory = new ConsensusQueueFactory();\n\treturn factory.create(new MockFluidDataStoreRuntime(), id);\n}\n\nfunction createCollectionForReconnection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactoryForReconnection,\n) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst containerRuntime = runtimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\n\tconst factory = new ConsensusQueueFactory();\n\tconst collection = factory.create(dataStoreRuntime, id);\n\tcollection.connect(services);\n\treturn { collection, containerRuntime };\n}\n\ndescribe(\"ConsensusOrderedCollection\", () => {\n\tfunction generate(\n\t\tinput: any[],\n\t\toutput: any[],\n\t\tcreator: () => IConsensusOrderedCollection,\n\t\tprocessMessages: () => void,\n\t) {\n\t\tlet testCollection: IConsensusOrderedCollection;\n\n\t\tasync function removeItem() {\n\t\t\tconst resP = acquireAndComplete(testCollection);\n\t\t\tprocessMessages();\n\t\t\tsetImmediate(() => processMessages());\n\t\t\treturn resP;\n\t\t}\n\n\t\tasync function waitAndRemoveItem() {\n\t\t\tprocessMessages();\n\t\t\tconst resP = waitAcquireAndComplete(testCollection);\n\t\t\tprocessMessages();\n\t\t\tsetImmediate(() => processMessages());\n\t\t\treturn resP;\n\t\t}\n\n\t\tasync function addItem(item) {\n\t\t\tconst waitP = testCollection.add(item);\n\t\t\tprocessMessages();\n\t\t\treturn waitP;\n\t\t}\n\n\t\tdescribe(\"ConsensusQueue\", () => {\n\t\t\tbeforeEach(async () => {\n\t\t\t\ttestCollection = creator();\n\t\t\t});\n\n\t\t\tit(\"Can create a collection\", () => {\n\t\t\t\tassert.ok(testCollection);\n\t\t\t});\n\n\t\t\tit(\"Can add and remove data\", async () => {\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t\tawait addItem(\"testValue\");\n\t\t\t\tassert.strictEqual(await removeItem(), \"testValue\");\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can add and remove a handle\", async () => {\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t\tconst handle = testCollection.handle;\n\t\t\t\tassert(handle, \"Need an actual handle to test this case\");\n\t\t\t\tawait addItem(handle);\n\n\t\t\t\tconst acquiredValue = await removeItem();\n\t\t\t\tassert.strictEqual(acquiredValue.absolutePath, handle.absolutePath);\n\t\t\t\tconst dataStore = await handle.get();\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tdataStore.handle.absolutePath,\n\t\t\t\t\ttestCollection.handle.absolutePath,\n\t\t\t\t);\n\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can add and release data\", async () => {\n\t\t\t\tawait addItem(\"testValue\");\n\t\t\t\tconst promise = testCollection.acquire(async (value) => {\n\t\t\t\t\tassert.strictEqual(value, \"testValue\");\n\t\t\t\t\treturn ConsensusResult.Release;\n\t\t\t\t});\n\t\t\t\tprocessMessages();\n\t\t\t\tawait promise;\n\t\t\t\tassert.strictEqual(await waitAndRemoveItem(), \"testValue\");\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can wait for data\", async () => {\n\t\t\t\tlet added = false;\n\t\t\t\tlet res: any;\n\t\t\t\tconst p = testCollection.waitAndAcquire(async (value) => {\n\t\t\t\t\tassert(added, \"Wait resolved before value is added\");\n\t\t\t\t\tres = value;\n\t\t\t\t\treturn ConsensusResult.Complete;\n\t\t\t\t});\n\n\t\t\t\tconst p2 = addItem(\"testValue\");\n\t\t\t\tprocessMessages();\n\t\t\t\tadded = true;\n\t\t\t\tawait p2;\n\t\t\t\t// There are two hops here - one \"acquire\" message, another \"release\" message.\n\t\t\t\tprocessMessages();\n\t\t\t\tsetImmediate(() => processMessages());\n\t\t\t\tawait p;\n\t\t\t\tassert.strictEqual(res, \"testValue\");\n\t\t\t});\n\n\t\t\tit(\"Data ordering\", async () => {\n\t\t\t\tfor (const item of input) {\n\t\t\t\t\tawait addItem(item);\n\t\t\t\t}\n\n\t\t\t\tfor (const item of output) {\n\t\t\t\t\tassert.strictEqual(await removeItem(), item);\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tawait removeItem(),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"Remove from empty collection should undefined\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Event\", async () => {\n\t\t\t\tlet addCount = 0;\n\t\t\t\tlet removeCount = 0;\n\t\t\t\tconst addListener = (value) => {\n\t\t\t\t\tassert.strictEqual(value, input[addCount], \"Added event value not matched\");\n\t\t\t\t\taddCount += 1;\n\t\t\t\t};\n\t\t\t\ttestCollection.on(\"add\", addListener);\n\n\t\t\t\tconst acquireListener = (value) => {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\toutput[removeCount],\n\t\t\t\t\t\t\"Remove event value not matched\",\n\t\t\t\t\t);\n\t\t\t\t\tremoveCount += 1;\n\t\t\t\t};\n\t\t\t\ttestCollection.on(\"acquire\", acquireListener);\n\n\t\t\t\tfor (const item of input) {\n\t\t\t\t\tawait addItem(item);\n\t\t\t\t}\n\n\t\t\t\tprocessMessages();\n\n\t\t\t\tlet count = output.length;\n\t\t\t\twhile (count > 0) {\n\t\t\t\t\tawait removeItem();\n\t\t\t\t\tcount -= 1;\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tawait removeItem(),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"Remove from empty collection should undefined\",\n\t\t\t\t);\n\n\t\t\t\tassert.strictEqual(addCount, input.length, \"Incorrect number add event\");\n\t\t\t\tassert.strictEqual(removeCount, output.length, \"Incorrect number remove event\");\n\n\t\t\t\ttestCollection.off(\"add\", addListener);\n\t\t\t\ttestCollection.off(\"acquire\", acquireListener);\n\t\t\t});\n\n\t\t\tit(\"can clone object value\", async () => {\n\t\t\t\tconst obj = { x: 1 };\n\t\t\t\tawait addItem(obj);\n\t\t\t\tconst result = await removeItem();\n\t\t\t\tassert.notStrictEqual(result, obj);\n\t\t\t\tassert.strictEqual(result.x, 1);\n\t\t\t});\n\t\t});\n\t}\n\n\tdescribe(\"Detached\", () => {\n\t\tgenerate(\n\t\t\t[1, 2],\n\t\t\t[1, 2],\n\t\t\t() => createLocalCollection(\"consensus-ordered-collection\"),\n\t\t\t() => {},\n\t\t);\n\t});\n\n\tdescribe(\"Attached, connected\", () => {\n\t\tconst containerRuntimeFactory: MockContainerRuntimeFactory =\n\t\t\tnew MockContainerRuntimeFactory();\n\t\tlet counter = 0;\n\n\t\tgenerate(\n\t\t\t[1, 2],\n\t\t\t[1, 2],\n\t\t\t() =>\n\t\t\t\tcreateConnectedCollection(\n\t\t\t\t\t`consensus-ordered-collection_${++counter}`,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t),\n\t\t\t() => {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t},\n\t\t);\n\t});\n\n\tdescribe(\"Reconnection flow\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet containerRuntime1: MockContainerRuntimeForReconnection;\n\t\tlet testCollection1: IConsensusOrderedCollection;\n\t\tlet testCollection2: IConsensusOrderedCollection;\n\n\t\tbeforeEach(async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\n\t\t\t// Create first ConsensusOrderedCollection\n\t\t\tconst response1 = createCollectionForReconnection(\n\t\t\t\t\"collection1\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t\ttestCollection1 = response1.collection;\n\t\t\tcontainerRuntime1 = response1.containerRuntime;\n\n\t\t\t// Create second ConsensusOrderedCollection\n\t\t\tconst response2 = createCollectionForReconnection(\n\t\t\t\t\"collection2\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t\ttestCollection2 = response2.collection;\n\t\t});\n\n\t\tit(\"can resend unacked ops on reconnection\", async () => {\n\t\t\t/**\n\t\t\t * First, we will add a value to the first collection and verify the op is resent.\n\t\t\t */\n\t\t\tconst testValue = \"testValue\";\n\n\t\t\t// Add a listener to the second collection. This is used to verify that the added value reaches the remote\n\t\t\t// client.\n\t\t\tlet addedValue: string = \"\";\n\t\t\tlet newlyAdded: boolean = false;\n\t\t\ttestCollection2.on(\"add\", (value: any, added: boolean) => {\n\t\t\t\taddedValue = value;\n\t\t\t\tnewlyAdded = added;\n\t\t\t});\n\n\t\t\t// Add a value to the first ConsensusOrderedCollection\n\t\t\tconst waitP = testCollection1.add(testValue);\n\n\t\t\t// Disconnect and reconnect the first collection.\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tawait waitP;\n\n\t\t\t// Verify that the remote collection received the added value.\n\t\t\tassert.equal(\n\t\t\t\taddedValue,\n\t\t\t\ttestValue,\n\t\t\t\t\"The remote client did not receive the added value\",\n\t\t\t);\n\t\t\tassert.equal(newlyAdded, true, \"The remote client's value was not newly added\");\n\n\t\t\t/**\n\t\t\t * Now, we will acquire the added value in the first collection and verify the op is resent.\n\t\t\t */\n\n\t\t\t// Add a listener to the second collection. This is used to verify that the acquired op reaches the remote\n\t\t\t// client.\n\t\t\tlet acquiredValue: string = \"\";\n\t\t\tlet acquiredClientId: string | undefined = \"\";\n\t\t\ttestCollection2.on(\"acquire\", (value: any, clientId?: string) => {\n\t\t\t\tacquiredValue = value;\n\t\t\t\tacquiredClientId = clientId;\n\t\t\t});\n\n\t\t\t// Acquire the previously added value.\n\t\t\tlet res: any;\n\t\t\tconst resultP = testCollection1.acquire(async (value) => {\n\t\t\t\tres = value;\n\t\t\t\treturn ConsensusResult.Complete;\n\t\t\t});\n\n\t\t\t// Disconnect and reconnect the first collection.\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tsetImmediate(() => containerRuntimeFactory.processAllMessages());\n\n\t\t\tawait resultP;\n\n\t\t\t// Verify that the value acquired is the one that was added earlier.\n\t\t\tassert.equal(res, testValue, \"The acquired value does not match the added value\");\n\n\t\t\t// Verify that the remote collection received the acquired op.\n\t\t\tassert.equal(\n\t\t\t\tacquiredValue,\n\t\t\t\ttestValue,\n\t\t\t\t\"The remote client did not receive the acquired value\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tacquiredClientId,\n\t\t\t\tcontainerRuntime1.clientId,\n\t\t\t\t\"The remote client did not get the correct id of client that acquired the value\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can store ops in disconnected state and resend them on reconnection\", async () => {\n\t\t\tconst testValue = \"testValue\";\n\n\t\t\t// Add a listener to the second collection. This is used to verify that the added value reaches the\n\t\t\t// remote client.\n\t\t\tlet addedValue: string = \"\";\n\t\t\tlet newlyAdded: boolean = false;\n\t\t\ttestCollection2.on(\"add\", (value: any, added: boolean) => {\n\t\t\t\taddedValue = value;\n\t\t\t\tnewlyAdded = added;\n\t\t\t});\n\n\t\t\t// Disconnect the first collection\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\t// Add a value to the first ConsensusOrderedCollection.\n\t\t\tconst waitP = testCollection1.add(testValue);\n\n\t\t\t// Reconnect the first collection.\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tawait waitP;\n\n\t\t\t// Verify that the remote collection received the added value.\n\t\t\tassert.equal(\n\t\t\t\taddedValue,\n\t\t\t\ttestValue,\n\t\t\t\t\"The remote client did not receive the added value\",\n\t\t\t);\n\t\t\tassert.equal(newlyAdded, true, \"The remote client's value was not newly added\");\n\t\t});\n\t});\n\n\tdescribe(\"Garbage Collection\", () => {\n\t\tclass GCOrderedCollectionProvider implements IGCTestProvider {\n\t\t\tprivate _expectedRoutes: string[] = [];\n\t\t\tprivate subCollectionCount = 0;\n\t\t\tprivate readonly collection: IConsensusOrderedCollection;\n\t\t\tprivate readonly containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\t\tconstructor() {\n\t\t\t\tthis.containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t\tthis.collection = createConnectedCollection(\n\t\t\t\t\t\"ordered-collection\",\n\t\t\t\t\tthis.containerRuntimeFactory,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tprivate async addItem(item: any) {\n\t\t\t\tconst waitP = this.collection.add(item);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t\treturn waitP;\n\t\t\t}\n\n\t\t\tprivate async removeItem() {\n\t\t\t\tconst resP = acquireAndComplete(this.collection);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t\tsetImmediate(() => this.containerRuntimeFactory.processAllMessages());\n\t\t\t\treturn resP;\n\t\t\t}\n\n\t\t\tpublic get sharedObject() {\n\t\t\t\treturn this.collection;\n\t\t\t}\n\n\t\t\tpublic get expectedOutboundRoutes() {\n\t\t\t\treturn this._expectedRoutes;\n\t\t\t}\n\n\t\t\tpublic async addOutboundRoutes() {\n\t\t\t\tconst subCollection = createLocalCollection(\n\t\t\t\t\t`subCollection-${++this.subCollectionCount}`,\n\t\t\t\t);\n\t\t\t\tawait this.addItem(subCollection.handle);\n\t\t\t\tthis._expectedRoutes.push(subCollection.handle.absolutePath);\n\t\t\t}\n\n\t\t\tpublic async deleteOutboundRoutes() {\n\t\t\t\tconst deletedHandle = (await this.removeItem()) as IFluidHandle;\n\t\t\t\tassert(deletedHandle, \"Route must be added before deleting\");\n\t\t\t\t// Remove deleted handle's route from expected routes.\n\t\t\t\tthis._expectedRoutes = this._expectedRoutes.filter(\n\t\t\t\t\t(route) => route !== deletedHandle.absolutePath,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpublic async addNestedHandles() {\n\t\t\t\tconst subCollection1 = createLocalCollection(\n\t\t\t\t\t`subCollection-${++this.subCollectionCount}`,\n\t\t\t\t);\n\t\t\t\tconst subCollection2 = createLocalCollection(\n\t\t\t\t\t`subCollection-${++this.subCollectionCount}`,\n\t\t\t\t);\n\t\t\t\tconst containingObject = {\n\t\t\t\t\tcollection1Handle: subCollection1.handle,\n\t\t\t\t\tnestedObj: {\n\t\t\t\t\t\tcollection2Handle: subCollection2.handle,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait this.addItem(containingObject);\n\t\t\t\tthis._expectedRoutes.push(\n\t\t\t\t\tsubCollection1.handle.absolutePath,\n\t\t\t\t\tsubCollection2.handle.absolutePath,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\trunGCTests(GCOrderedCollectionProvider);\n\t});\n});\n"]}
1
+ {"version":3,"file":"consensusOrderedCollection.spec.js","sourceRoot":"","sources":["../../src/test/consensusOrderedCollection.spec.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 { strict as assert } from \"assert\";\nimport { IGCTestProvider, runGCTests } from \"@fluid-private/test-dds-utils\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { IChannelServices } from \"@fluidframework/datastore-definitions\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { ConsensusQueueFactory } from \"../consensusOrderedCollectionFactory.js\";\nimport { ConsensusResult, IConsensusOrderedCollection } from \"../interfaces.js\";\nimport { acquireAndComplete, waitAcquireAndComplete } from \"../testUtils.js\";\n\nfunction createConnectedCollection(id: string, runtimeFactory: MockContainerRuntimeFactory) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\truntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\n\tconst factory = new ConsensusQueueFactory();\n\tconst testCollection = factory.create(dataStoreRuntime, id);\n\ttestCollection.connect(services);\n\treturn testCollection;\n}\n\nfunction createLocalCollection(id: string) {\n\tconst factory = new ConsensusQueueFactory();\n\treturn factory.create(new MockFluidDataStoreRuntime(), id);\n}\n\nfunction createCollectionForReconnection(\n\tid: string,\n\truntimeFactory: MockContainerRuntimeFactoryForReconnection,\n) {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst containerRuntime = runtimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services: IChannelServices = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\n\tconst factory = new ConsensusQueueFactory();\n\tconst collection = factory.create(dataStoreRuntime, id);\n\tcollection.connect(services);\n\treturn { collection, containerRuntime };\n}\n\ndescribe(\"ConsensusOrderedCollection\", () => {\n\tfunction generate(\n\t\tinput: any[],\n\t\toutput: any[],\n\t\tcreator: () => IConsensusOrderedCollection,\n\t\tprocessMessages: () => void,\n\t) {\n\t\tlet testCollection: IConsensusOrderedCollection;\n\n\t\tasync function removeItem() {\n\t\t\tconst resP = acquireAndComplete(testCollection);\n\t\t\tprocessMessages();\n\t\t\tsetImmediate(() => processMessages());\n\t\t\treturn resP;\n\t\t}\n\n\t\tasync function waitAndRemoveItem() {\n\t\t\tprocessMessages();\n\t\t\tconst resP = waitAcquireAndComplete(testCollection);\n\t\t\tprocessMessages();\n\t\t\tsetImmediate(() => processMessages());\n\t\t\treturn resP;\n\t\t}\n\n\t\tasync function addItem(item) {\n\t\t\tconst waitP = testCollection.add(item);\n\t\t\tprocessMessages();\n\t\t\treturn waitP;\n\t\t}\n\n\t\tdescribe(\"ConsensusQueue\", () => {\n\t\t\tbeforeEach(async () => {\n\t\t\t\ttestCollection = creator();\n\t\t\t});\n\n\t\t\tit(\"Can create a collection\", () => {\n\t\t\t\tassert.ok(testCollection);\n\t\t\t});\n\n\t\t\tit(\"Can add and remove data\", async () => {\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t\tawait addItem(\"testValue\");\n\t\t\t\tassert.strictEqual(await removeItem(), \"testValue\");\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can add and remove a handle\", async () => {\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t\tconst handle = testCollection.handle;\n\t\t\t\tassert(handle, \"Need an actual handle to test this case\");\n\t\t\t\tawait addItem(handle);\n\n\t\t\t\tconst acquiredValue = await removeItem();\n\t\t\t\tassert.strictEqual(acquiredValue.absolutePath, handle.absolutePath);\n\t\t\t\tconst dataStore = await handle.get();\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tdataStore.handle.absolutePath,\n\t\t\t\t\ttestCollection.handle.absolutePath,\n\t\t\t\t);\n\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can add and release data\", async () => {\n\t\t\t\tawait addItem(\"testValue\");\n\t\t\t\tconst promise = testCollection.acquire(async (value) => {\n\t\t\t\t\tassert.strictEqual(value, \"testValue\");\n\t\t\t\t\treturn ConsensusResult.Release;\n\t\t\t\t});\n\t\t\t\tprocessMessages();\n\t\t\t\tawait promise;\n\t\t\t\tassert.strictEqual(await waitAndRemoveItem(), \"testValue\");\n\t\t\t\tassert.strictEqual(await removeItem(), undefined);\n\t\t\t});\n\n\t\t\tit(\"Can wait for data\", async () => {\n\t\t\t\tlet added = false;\n\t\t\t\tlet res: any;\n\t\t\t\tconst p = testCollection.waitAndAcquire(async (value) => {\n\t\t\t\t\tassert(added, \"Wait resolved before value is added\");\n\t\t\t\t\tres = value;\n\t\t\t\t\treturn ConsensusResult.Complete;\n\t\t\t\t});\n\n\t\t\t\tconst p2 = addItem(\"testValue\");\n\t\t\t\tprocessMessages();\n\t\t\t\tadded = true;\n\t\t\t\tawait p2;\n\t\t\t\t// There are two hops here - one \"acquire\" message, another \"release\" message.\n\t\t\t\tprocessMessages();\n\t\t\t\tsetImmediate(() => processMessages());\n\t\t\t\tawait p;\n\t\t\t\tassert.strictEqual(res, \"testValue\");\n\t\t\t});\n\n\t\t\tit(\"Data ordering\", async () => {\n\t\t\t\tfor (const item of input) {\n\t\t\t\t\tawait addItem(item);\n\t\t\t\t}\n\n\t\t\t\tfor (const item of output) {\n\t\t\t\t\tassert.strictEqual(await removeItem(), item);\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tawait removeItem(),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"Remove from empty collection should undefined\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"Event\", async () => {\n\t\t\t\tlet addCount = 0;\n\t\t\t\tlet removeCount = 0;\n\t\t\t\tconst addListener = (value) => {\n\t\t\t\t\tassert.strictEqual(value, input[addCount], \"Added event value not matched\");\n\t\t\t\t\taddCount += 1;\n\t\t\t\t};\n\t\t\t\ttestCollection.on(\"add\", addListener);\n\n\t\t\t\tconst acquireListener = (value) => {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\toutput[removeCount],\n\t\t\t\t\t\t\"Remove event value not matched\",\n\t\t\t\t\t);\n\t\t\t\t\tremoveCount += 1;\n\t\t\t\t};\n\t\t\t\ttestCollection.on(\"acquire\", acquireListener);\n\n\t\t\t\tfor (const item of input) {\n\t\t\t\t\tawait addItem(item);\n\t\t\t\t}\n\n\t\t\t\tprocessMessages();\n\n\t\t\t\tlet count = output.length;\n\t\t\t\twhile (count > 0) {\n\t\t\t\t\tawait removeItem();\n\t\t\t\t\tcount -= 1;\n\t\t\t\t}\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tawait removeItem(),\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"Remove from empty collection should undefined\",\n\t\t\t\t);\n\n\t\t\t\tassert.strictEqual(addCount, input.length, \"Incorrect number add event\");\n\t\t\t\tassert.strictEqual(removeCount, output.length, \"Incorrect number remove event\");\n\n\t\t\t\ttestCollection.off(\"add\", addListener);\n\t\t\t\ttestCollection.off(\"acquire\", acquireListener);\n\t\t\t});\n\n\t\t\tit(\"can clone object value\", async () => {\n\t\t\t\tconst obj = { x: 1 };\n\t\t\t\tawait addItem(obj);\n\t\t\t\tconst result = await removeItem();\n\t\t\t\tassert.notStrictEqual(result, obj);\n\t\t\t\tassert.strictEqual(result.x, 1);\n\t\t\t});\n\t\t});\n\t}\n\n\tdescribe(\"Detached\", () => {\n\t\tgenerate(\n\t\t\t[1, 2],\n\t\t\t[1, 2],\n\t\t\t() => createLocalCollection(\"consensus-ordered-collection\"),\n\t\t\t() => {},\n\t\t);\n\t});\n\n\tdescribe(\"Attached, connected\", () => {\n\t\tconst containerRuntimeFactory: MockContainerRuntimeFactory =\n\t\t\tnew MockContainerRuntimeFactory();\n\t\tlet counter = 0;\n\n\t\tgenerate(\n\t\t\t[1, 2],\n\t\t\t[1, 2],\n\t\t\t() =>\n\t\t\t\tcreateConnectedCollection(\n\t\t\t\t\t`consensus-ordered-collection_${++counter}`,\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t),\n\t\t\t() => {\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t},\n\t\t);\n\t});\n\n\tdescribe(\"Reconnection flow\", () => {\n\t\tlet containerRuntimeFactory: MockContainerRuntimeFactoryForReconnection;\n\t\tlet containerRuntime1: MockContainerRuntimeForReconnection;\n\t\tlet testCollection1: IConsensusOrderedCollection;\n\t\tlet testCollection2: IConsensusOrderedCollection;\n\n\t\tbeforeEach(async () => {\n\t\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactoryForReconnection();\n\n\t\t\t// Create first ConsensusOrderedCollection\n\t\t\tconst response1 = createCollectionForReconnection(\n\t\t\t\t\"collection1\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t\ttestCollection1 = response1.collection;\n\t\t\tcontainerRuntime1 = response1.containerRuntime;\n\n\t\t\t// Create second ConsensusOrderedCollection\n\t\t\tconst response2 = createCollectionForReconnection(\n\t\t\t\t\"collection2\",\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t);\n\t\t\ttestCollection2 = response2.collection;\n\t\t});\n\n\t\tit(\"can resend unacked ops on reconnection\", async () => {\n\t\t\t/**\n\t\t\t * First, we will add a value to the first collection and verify the op is resent.\n\t\t\t */\n\t\t\tconst testValue = \"testValue\";\n\n\t\t\t// Add a listener to the second collection. This is used to verify that the added value reaches the remote\n\t\t\t// client.\n\t\t\tlet addedValue: string = \"\";\n\t\t\tlet newlyAdded: boolean = false;\n\t\t\ttestCollection2.on(\"add\", (value: any, added: boolean) => {\n\t\t\t\taddedValue = value;\n\t\t\t\tnewlyAdded = added;\n\t\t\t});\n\n\t\t\t// Add a value to the first ConsensusOrderedCollection\n\t\t\tconst waitP = testCollection1.add(testValue);\n\n\t\t\t// Disconnect and reconnect the first collection.\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tawait waitP;\n\n\t\t\t// Verify that the remote collection received the added value.\n\t\t\tassert.equal(\n\t\t\t\taddedValue,\n\t\t\t\ttestValue,\n\t\t\t\t\"The remote client did not receive the added value\",\n\t\t\t);\n\t\t\tassert.equal(newlyAdded, true, \"The remote client's value was not newly added\");\n\n\t\t\t/**\n\t\t\t * Now, we will acquire the added value in the first collection and verify the op is resent.\n\t\t\t */\n\n\t\t\t// Add a listener to the second collection. This is used to verify that the acquired op reaches the remote\n\t\t\t// client.\n\t\t\tlet acquiredValue: string = \"\";\n\t\t\tlet acquiredClientId: string | undefined = \"\";\n\t\t\ttestCollection2.on(\"acquire\", (value: any, clientId?: string) => {\n\t\t\t\tacquiredValue = value;\n\t\t\t\tacquiredClientId = clientId;\n\t\t\t});\n\n\t\t\t// Acquire the previously added value.\n\t\t\tlet res: any;\n\t\t\tconst resultP = testCollection1.acquire(async (value) => {\n\t\t\t\tres = value;\n\t\t\t\treturn ConsensusResult.Complete;\n\t\t\t});\n\n\t\t\t// Disconnect and reconnect the first collection.\n\t\t\tcontainerRuntime1.connected = false;\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tsetImmediate(() => containerRuntimeFactory.processAllMessages());\n\n\t\t\tawait resultP;\n\n\t\t\t// Verify that the value acquired is the one that was added earlier.\n\t\t\tassert.equal(res, testValue, \"The acquired value does not match the added value\");\n\n\t\t\t// Verify that the remote collection received the acquired op.\n\t\t\tassert.equal(\n\t\t\t\tacquiredValue,\n\t\t\t\ttestValue,\n\t\t\t\t\"The remote client did not receive the acquired value\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tacquiredClientId,\n\t\t\t\tcontainerRuntime1.clientId,\n\t\t\t\t\"The remote client did not get the correct id of client that acquired the value\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can store ops in disconnected state and resend them on reconnection\", async () => {\n\t\t\tconst testValue = \"testValue\";\n\n\t\t\t// Add a listener to the second collection. This is used to verify that the added value reaches the\n\t\t\t// remote client.\n\t\t\tlet addedValue: string = \"\";\n\t\t\tlet newlyAdded: boolean = false;\n\t\t\ttestCollection2.on(\"add\", (value: any, added: boolean) => {\n\t\t\t\taddedValue = value;\n\t\t\t\tnewlyAdded = added;\n\t\t\t});\n\n\t\t\t// Disconnect the first collection\n\t\t\tcontainerRuntime1.connected = false;\n\n\t\t\t// Add a value to the first ConsensusOrderedCollection.\n\t\t\tconst waitP = testCollection1.add(testValue);\n\n\t\t\t// Reconnect the first collection.\n\t\t\tcontainerRuntime1.connected = true;\n\n\t\t\t// Process the messages.\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tawait waitP;\n\n\t\t\t// Verify that the remote collection received the added value.\n\t\t\tassert.equal(\n\t\t\t\taddedValue,\n\t\t\t\ttestValue,\n\t\t\t\t\"The remote client did not receive the added value\",\n\t\t\t);\n\t\t\tassert.equal(newlyAdded, true, \"The remote client's value was not newly added\");\n\t\t});\n\t});\n\n\tdescribe(\"Garbage Collection\", () => {\n\t\tclass GCOrderedCollectionProvider implements IGCTestProvider {\n\t\t\tprivate _expectedRoutes: string[] = [];\n\t\t\tprivate subCollectionCount = 0;\n\t\t\tprivate readonly collection: IConsensusOrderedCollection;\n\t\t\tprivate readonly containerRuntimeFactory: MockContainerRuntimeFactory;\n\n\t\t\tconstructor() {\n\t\t\t\tthis.containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\t\t\tthis.collection = createConnectedCollection(\n\t\t\t\t\t\"ordered-collection\",\n\t\t\t\t\tthis.containerRuntimeFactory,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tprivate async addItem(item: any) {\n\t\t\t\tconst waitP = this.collection.add(item);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t\treturn waitP;\n\t\t\t}\n\n\t\t\tprivate async removeItem() {\n\t\t\t\tconst resP = acquireAndComplete(this.collection);\n\t\t\t\tthis.containerRuntimeFactory.processAllMessages();\n\t\t\t\tsetImmediate(() => this.containerRuntimeFactory.processAllMessages());\n\t\t\t\treturn resP;\n\t\t\t}\n\n\t\t\tpublic get sharedObject() {\n\t\t\t\treturn this.collection;\n\t\t\t}\n\n\t\t\tpublic get expectedOutboundRoutes() {\n\t\t\t\treturn this._expectedRoutes;\n\t\t\t}\n\n\t\t\tpublic async addOutboundRoutes() {\n\t\t\t\tconst subCollection = createLocalCollection(\n\t\t\t\t\t`subCollection-${++this.subCollectionCount}`,\n\t\t\t\t);\n\t\t\t\tawait this.addItem(subCollection.handle);\n\t\t\t\tthis._expectedRoutes.push(subCollection.handle.absolutePath);\n\t\t\t}\n\n\t\t\tpublic async deleteOutboundRoutes() {\n\t\t\t\tconst deletedHandle = (await this.removeItem()) as IFluidHandle;\n\t\t\t\tassert(deletedHandle, \"Route must be added before deleting\");\n\t\t\t\t// Remove deleted handle's route from expected routes.\n\t\t\t\tthis._expectedRoutes = this._expectedRoutes.filter(\n\t\t\t\t\t(route) => route !== deletedHandle.absolutePath,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpublic async addNestedHandles() {\n\t\t\t\tconst subCollection1 = createLocalCollection(\n\t\t\t\t\t`subCollection-${++this.subCollectionCount}`,\n\t\t\t\t);\n\t\t\t\tconst subCollection2 = createLocalCollection(\n\t\t\t\t\t`subCollection-${++this.subCollectionCount}`,\n\t\t\t\t);\n\t\t\t\tconst containingObject = {\n\t\t\t\t\tcollection1Handle: subCollection1.handle,\n\t\t\t\t\tnestedObj: {\n\t\t\t\t\t\tcollection2Handle: subCollection2.handle,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait this.addItem(containingObject);\n\t\t\t\tthis._expectedRoutes.push(\n\t\t\t\t\tsubCollection1.handle.absolutePath,\n\t\t\t\t\tsubCollection2.handle.absolutePath,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\trunGCTests(GCOrderedCollectionProvider);\n\t});\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/ordered-collection",
3
- "version": "2.0.0-dev-rc.2.0.0.245554",
3
+ "version": "2.0.0-dev-rc.3.0.0.250606",
4
4
  "description": "Consensus Collection",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -77,27 +77,28 @@
77
77
  "temp-directory": "nyc/.nyc_output"
78
78
  },
79
79
  "dependencies": {
80
- "@fluid-internal/client-utils": "2.0.0-dev-rc.2.0.0.245554",
81
- "@fluidframework/core-interfaces": "2.0.0-dev-rc.2.0.0.245554",
82
- "@fluidframework/core-utils": "2.0.0-dev-rc.2.0.0.245554",
83
- "@fluidframework/datastore-definitions": "2.0.0-dev-rc.2.0.0.245554",
80
+ "@fluid-internal/client-utils": "2.0.0-dev-rc.3.0.0.250606",
81
+ "@fluidframework/core-interfaces": "2.0.0-dev-rc.3.0.0.250606",
82
+ "@fluidframework/core-utils": "2.0.0-dev-rc.3.0.0.250606",
83
+ "@fluidframework/datastore-definitions": "2.0.0-dev-rc.3.0.0.250606",
84
84
  "@fluidframework/protocol-definitions": "^3.2.0",
85
- "@fluidframework/runtime-definitions": "2.0.0-dev-rc.2.0.0.245554",
86
- "@fluidframework/runtime-utils": "2.0.0-dev-rc.2.0.0.245554",
87
- "@fluidframework/shared-object-base": "2.0.0-dev-rc.2.0.0.245554",
88
- "@fluidframework/telemetry-utils": "2.0.0-dev-rc.2.0.0.245554",
85
+ "@fluidframework/runtime-definitions": "2.0.0-dev-rc.3.0.0.250606",
86
+ "@fluidframework/runtime-utils": "2.0.0-dev-rc.3.0.0.250606",
87
+ "@fluidframework/shared-object-base": "2.0.0-dev-rc.3.0.0.250606",
88
+ "@fluidframework/telemetry-utils": "2.0.0-dev-rc.3.0.0.250606",
89
89
  "uuid": "^9.0.0"
90
90
  },
91
91
  "devDependencies": {
92
92
  "@arethetypeswrong/cli": "^0.13.3",
93
- "@fluid-internal/mocha-test-setup": "2.0.0-dev-rc.2.0.0.245554",
94
- "@fluid-private/test-dds-utils": "2.0.0-dev-rc.2.0.0.245554",
93
+ "@biomejs/biome": "^1.6.2",
94
+ "@fluid-internal/mocha-test-setup": "2.0.0-dev-rc.3.0.0.250606",
95
+ "@fluid-private/test-dds-utils": "2.0.0-dev-rc.3.0.0.250606",
95
96
  "@fluid-tools/build-cli": "^0.34.0",
96
97
  "@fluidframework/build-common": "^2.0.3",
97
98
  "@fluidframework/build-tools": "^0.34.0",
98
99
  "@fluidframework/eslint-config-fluid": "^5.1.0",
99
100
  "@fluidframework/ordered-collection-previous": "npm:@fluidframework/ordered-collection@2.0.0-internal.8.0.0",
100
- "@fluidframework/test-runtime-utils": "2.0.0-dev-rc.2.0.0.245554",
101
+ "@fluidframework/test-runtime-utils": "2.0.0-dev-rc.3.0.0.250606",
101
102
  "@microsoft/api-extractor": "^7.42.3",
102
103
  "@types/mocha": "^9.1.1",
103
104
  "@types/node": "^18.19.0",
@@ -144,16 +145,18 @@
144
145
  "build:test:cjs": "fluid-tsc commonjs --project ./src/test/tsconfig.cjs.json",
145
146
  "build:test:esm": "tsc --project ./src/test/tsconfig.json",
146
147
  "check:are-the-types-wrong": "attw --pack . --entrypoints .",
148
+ "check:biome": "biome check .",
149
+ "check:prettier": "prettier --check . --cache --ignore-path ../../../.prettierignore",
147
150
  "check:release-tags": "api-extractor run --local --config ./api-extractor-lint.json",
148
151
  "ci:build:docs": "api-extractor run",
149
152
  "clean": "rimraf --glob dist lib \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc",
150
153
  "eslint": "eslint --format stylish src",
151
154
  "eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
152
- "format": "npm run prettier:fix",
153
- "lint": "npm run prettier && npm run check:release-tags && npm run eslint",
154
- "lint:fix": "npm run prettier:fix && npm run eslint:fix",
155
- "prettier": "prettier --check . --cache --ignore-path ../../../.prettierignore",
156
- "prettier:fix": "prettier --write . --cache --ignore-path ../../../.prettierignore",
155
+ "format": "fluid-build --task format .",
156
+ "format:biome": "biome check --apply .",
157
+ "format:prettier": "prettier --write . --cache --ignore-path ../../../.prettierignore",
158
+ "lint": "fluid-build . --task lint",
159
+ "lint:fix": "fluid-build . --task eslint:fix --task format",
157
160
  "test": "npm run test:mocha",
158
161
  "test:coverage": "c8 npm test",
159
162
  "test:mocha": "npm run test:mocha:esm && echo skipping cjs to avoid overhead - npm run test:mocha:cjs",
@@ -5,22 +5,22 @@
5
5
 
6
6
  import { bufferToString } from "@fluid-internal/client-utils";
7
7
  import { assert, unreachableCase } from "@fluidframework/core-utils";
8
- import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
9
8
  import {
10
9
  IChannelAttributes,
11
- IFluidDataStoreRuntime,
12
10
  IChannelStorageService,
11
+ IFluidDataStoreRuntime,
13
12
  } from "@fluidframework/datastore-definitions";
14
- import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-base";
13
+ import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
15
14
  import { ISummaryTreeWithStats } from "@fluidframework/runtime-definitions";
16
15
  import { SummaryTreeBuilder } from "@fluidframework/runtime-utils";
16
+ import { IFluidSerializer, SharedObject } from "@fluidframework/shared-object-base";
17
17
  import { v4 as uuid } from "uuid";
18
18
  import {
19
19
  ConsensusCallback,
20
20
  ConsensusResult,
21
21
  IConsensusOrderedCollection,
22
- IOrderedCollection,
23
22
  IConsensusOrderedCollectionEvents,
23
+ IOrderedCollection,
24
24
  } from "./interfaces.js";
25
25
 
26
26
  const snapshotFileNameData = "header";
@@ -5,8 +5,8 @@
5
5
 
6
6
  import {
7
7
  IChannelAttributes,
8
- IFluidDataStoreRuntime,
9
8
  IChannelServices,
9
+ IFluidDataStoreRuntime,
10
10
  } from "@fluidframework/datastore-definitions";
11
11
  import { ConsensusQueue } from "./consensusQueue.js";
12
12
  import { IConsensusOrderedCollection, IConsensusOrderedCollectionFactory } from "./interfaces.js";
@@ -4,9 +4,9 @@
4
4
  */
5
5
 
6
6
  import {
7
- IFluidDataStoreRuntime,
8
7
  IChannelAttributes,
9
8
  IChannelFactory,
9
+ IFluidDataStoreRuntime,
10
10
  } from "@fluidframework/datastore-definitions";
11
11
  import { ConsensusOrderedCollection } from "./consensusOrderedCollection.js";
12
12
  import { ConsensusQueueFactory } from "./consensusOrderedCollectionFactory.js";
package/src/interfaces.ts CHANGED
@@ -4,10 +4,10 @@
4
4
  */
5
5
 
6
6
  import {
7
- IFluidDataStoreRuntime,
8
- IChannelServices,
9
7
  IChannelAttributes,
10
8
  IChannelFactory,
9
+ IChannelServices,
10
+ IFluidDataStoreRuntime,
11
11
  } from "@fluidframework/datastore-definitions";
12
12
  import { ISharedObject, ISharedObjectEvents } from "@fluidframework/shared-object-base";
13
13
 
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/ordered-collection";
9
- export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
9
+ export const pkgVersion = "2.0.0-dev-rc.3.0.0.250606";