@fluidframework/ordered-collection 2.118.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -4
- package/README.md +53 -50
- package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
- package/dist/consensusOrderedCollection.js +5 -4
- package/dist/consensusOrderedCollection.js.map +1 -1
- package/dist/consensusOrderedCollectionFactory.d.ts +1 -1
- package/dist/consensusOrderedCollectionFactory.d.ts.map +1 -1
- package/dist/consensusOrderedCollectionFactory.js +9 -9
- package/dist/consensusOrderedCollectionFactory.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/snapshotableArray.js +1 -4
- package/dist/snapshotableArray.js.map +1 -1
- package/dist/testUtils.js +4 -5
- package/dist/testUtils.js.map +1 -1
- package/lib/consensusOrderedCollection.js +5 -4
- package/lib/consensusOrderedCollection.js.map +1 -1
- package/lib/consensusOrderedCollectionFactory.js +9 -9
- package/lib/consensusOrderedCollectionFactory.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/public.d.ts +1 -1
- package/lib/snapshotableArray.js +1 -4
- package/lib/snapshotableArray.js.map +1 -1
- package/package.json +37 -57
- package/src/packageVersion.ts +1 -1
- package/tsconfig.json +1 -1
- package/internal.d.ts +0 -11
- package/legacy.d.ts +0 -11
- /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
- /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,42 @@
|
|
|
1
1
|
# @fluidframework/ordered-collection
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 3.0.0
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
### Minor Changes
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- Removal of direct CommonJS support ([#28124](https://github.com/microsoft/FluidFramework/pull/28124)) [0f84e3b8878](https://github.com/microsoft/FluidFramework/commit/0f84e3b8878a5e75b2253976d98fd963bbd9db88)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Direct `require()` import is no longer directly supported.
|
|
10
|
+
Package is transpiled as ECMAScript Module.
|
|
11
|
+
|
|
12
|
+
See [Removal of direct CommonJS support in v3.0](https://github.com/microsoft/FluidFramework/issues/27444) for more information.
|
|
13
|
+
|
|
14
|
+
- Require modern TypeScript module resolution ([#27970](https://github.com/microsoft/FluidFramework/pull/27970)) [325e2016ca9](https://github.com/microsoft/FluidFramework/commit/325e2016ca9978d4a1f7552c97ba34feac9df41f)
|
|
15
|
+
|
|
16
|
+
Fluid Framework Client packages no longer include type declaration compatibility entrypoints for TypeScript's legacy Node10 resolution mode (`"moduleResolution": "node"` or `"node10"`).
|
|
17
|
+
Applications upgrading to Fluid Framework 3.0 must use one of the following supported configurations:
|
|
18
|
+
- `"module": "Node16"` with `"moduleResolution": "Node16"`
|
|
19
|
+
- `"module": "NodeNext"` with `"moduleResolution": "NodeNext"`
|
|
20
|
+
- `"module": "ESNext"` with `"moduleResolution": "Bundler"`
|
|
21
|
+
|
|
22
|
+
Existing public package entrypoints exposed through `package.json` exports, including `/alpha`, `/beta`, and `/legacy`, remain available under supported module resolution modes.
|
|
23
|
+
|
|
24
|
+
See [Removal of Node10 resolutions in v3.0](https://github.com/microsoft/FluidFramework/issues/27457) for more information.
|
|
25
|
+
|
|
26
|
+
- Client packages now target ES2022 ([#27846](https://github.com/microsoft/FluidFramework/pull/27846)) [91c78541bdd](https://github.com/microsoft/FluidFramework/commit/91c78541bddcbca5d6c5f357b023eeaee617d885)
|
|
27
|
+
|
|
28
|
+
The TypeScript compilation `target` and `lib` for the Fluid Framework client packages have been raised from ES2021/ES2020 to **ES2022**.
|
|
29
|
+
The published JavaScript now uses ES2022 language features (with correspondingly less down-leveling), so consuming these packages requires a runtime that supports ES2022.
|
|
30
|
+
All actively supported Node.js versions and evergreen browsers already meet this requirement.
|
|
31
|
+
|
|
32
|
+
Note that Fluid Framework has not officially supported targets older than ES2022 since before 2.0: this is documented in [ClientRequirements.md](https://github.com/microsoft/FluidFramework/blob/main/ClientRequirements.md) as well as the README for every client package.
|
|
33
|
+
|
|
34
|
+
It is possible this change could impact users of less up to date JavaScript runtimes.
|
|
35
|
+
Impacted users can use a tool like [babel](https://babeljs.io/) to transpile out unsupported language features.
|
|
36
|
+
|
|
37
|
+
- Build with TypeScript 6 ([#28052](https://github.com/microsoft/FluidFramework/pull/28052)) [7ab015c49de](https://github.com/microsoft/FluidFramework/commit/7ab015c49deec84833cdfe1fb5e1606b901f6e81)
|
|
38
|
+
|
|
39
|
+
FluidFramework Client SDK is now built using TypeScript 6. Consumers should build with TypeScript v6 or v7 or compatible tooling.
|
|
10
40
|
|
|
11
41
|
## 2.116.0
|
|
12
42
|
|
package/README.md
CHANGED
|
@@ -9,15 +9,15 @@ A consensus distributed data structure that implement a ordered queue of items.
|
|
|
9
9
|
|
|
10
10
|
## Using Fluid Framework libraries
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
library consumers should always prefer `^`.
|
|
12
|
+
For a dependency on a Fluid Framework library's public APIs, we recommend a `^` (caret) version range.
|
|
13
|
+
For example, use `^1.3.4`.
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
For a dependency on an unstable API, such as a `beta` API, we recommend a more restrictive version range.
|
|
16
|
+
For example, use a `~` version range.
|
|
17
17
|
|
|
18
18
|
## Installation
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Run this command to install the package:
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
23
|
npm i @fluidframework/ordered-collection
|
|
@@ -25,16 +25,16 @@ npm i @fluidframework/ordered-collection
|
|
|
25
25
|
|
|
26
26
|
## Importing from this package
|
|
27
27
|
|
|
28
|
-
This package
|
|
29
|
-
For
|
|
28
|
+
This package uses [package.json exports](https://nodejs.org/api/packages.html#exports) to separate APIs by support level.
|
|
29
|
+
For information about the support guarantees, read [API Support Levels](https://fluidframework.com/docs/build/releases-and-apitags/#api-support-levels).
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Import the `public` APIs from `@fluidframework/ordered-collection`.
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Import the `legacy` APIs from `@fluidframework/ordered-collection/legacy`.
|
|
34
34
|
|
|
35
35
|
## API Documentation
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
Read the **@fluidframework/ordered-collection** API documentation at <https://fluidframework.com/docs/apis/ordered-collection>.
|
|
38
38
|
|
|
39
39
|
<!-- prettier-ignore-end -->
|
|
40
40
|
|
|
@@ -47,62 +47,69 @@ API documentation for **@fluidframework/ordered-collection** is available at <ht
|
|
|
47
47
|
|
|
48
48
|
## Minimum Client Requirements
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
These requirements
|
|
52
|
-
|
|
50
|
+
Fluid Framework client libraries support the platforms in this document.
|
|
51
|
+
These requirements are intentionally restrictive.
|
|
52
|
+
Within a major version series, we can relax these requirements, but we cannot make them stricter.
|
|
53
|
+
For a Long Term Support (LTS) version, we might need to support these platforms for several years.
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
If
|
|
56
|
-
|
|
55
|
+
Other configurations can work, but Fluid Framework does not support them.
|
|
56
|
+
If an unsupported configuration stops working, we do not classify this as a bug.
|
|
57
|
+
To request support for a configuration that is not listed, file an issue.
|
|
58
|
+
The product team will evaluate your request.
|
|
59
|
+
In the issue, specify the current status of the configuration:
|
|
60
|
+
|
|
61
|
+
- The configuration works but needs official support.
|
|
62
|
+
- The configuration does not work and requires changes.
|
|
57
63
|
|
|
58
64
|
### Supported Runtimes
|
|
59
65
|
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
66
|
+
- Fluid Framework supports Node.js versions 22 and 24 while they receive [upstream support](https://nodejs.org/en/about/previous-releases).
|
|
67
|
+
- Fluid Framework will stop support for version 22 [when upstream support ends on 2027-04-30](https://github.com/nodejs/release#release-schedule).
|
|
68
|
+
- Fluid Framework does not support Node.js with the `--no-experimental-fetch` flag.
|
|
69
|
+
- Fluid Framework supports modern browsers that support the ES2022 standard library.
|
|
63
70
|
|
|
64
71
|
### Supported Tools
|
|
65
72
|
|
|
66
|
-
- TypeScript
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
- [
|
|
70
|
-
-
|
|
71
|
-
|
|
73
|
+
- [TypeScript 6.0](https://typescriptdocs.com/release-notes/TypeScript%206.0):
|
|
74
|
+
- Fluid Framework supports all [`strict`](https://www.typescriptlang.org/tsconfig) options.
|
|
75
|
+
- Set the build targets (`lib`, `target`) to `ES2022` or later.
|
|
76
|
+
- Enable [`strictNullChecks`](https://www.typescriptlang.org/tsconfig).
|
|
77
|
+
- Fluid Framework does not support [configuration options deprecated in TypeScript 6.0](https://typescriptdocs.com/release-notes/TypeScript%206.0#breaking-changes-and-deprecations-in-typescript-6-0).
|
|
78
|
+
- Fluid Framework does not fully support `exactOptionalPropertyTypes`.
|
|
79
|
+
If you enable this option, do not use `in`, `Reflect.has`, `Object.hasOwn`, or `Object.prototype.hasOwnProperty` to narrow members of Fluid Framework types.
|
|
80
|
+
These methods can incorrectly exclude `undefined` from the possible values.
|
|
72
81
|
- [webpack](https://webpack.js.org/) 5
|
|
73
|
-
- We
|
|
74
|
-
Other bundlers
|
|
82
|
+
- We do not require a specific bundler.
|
|
83
|
+
Other bundlers that handle ES Modules can work, but we actively test only webpack.
|
|
75
84
|
|
|
76
85
|
### Module Resolution
|
|
77
86
|
|
|
78
|
-
[`Node16`, `NodeNext`, or `Bundler`](https://www.typescriptlang.org/tsconfig#moduleResolution)
|
|
79
|
-
|
|
87
|
+
In TypeScript `compilerOptions`, use [`Node16`, `Node20`, `NodeNext`, or `Bundler`](https://www.typescriptlang.org/tsconfig#moduleResolution) module resolution.
|
|
88
|
+
These settings follow the [Node.js v12+ ESM Resolution and Loading algorithm](https://nodejs.github.io/nodejs.dev/en/api/v20/esm/#resolution-and-loading-algorithm).
|
|
89
|
+
|
|
90
|
+
Do not use `Node10` module resolution.
|
|
80
91
|
|
|
81
92
|
### Module Formats
|
|
82
93
|
|
|
83
94
|
- ES Modules:
|
|
84
|
-
ES Modules
|
|
85
|
-
-
|
|
86
|
-
|
|
87
|
-
This is done to accommodate some workflows without good ES Module support.
|
|
88
|
-
If you have a workflow you would like included in this list, file an issue.
|
|
89
|
-
Once this list of workflows motivating CommonJS support is empty, we may drop support for CommonJS one year after notice of the change is posted here.
|
|
90
|
-
|
|
91
|
-
- Testing with Jest (which lacks [stable ESM support](https://jestjs.io/docs/ecmascript-modules) due to [unstable APIs in NodeJs](https://github.com/nodejs/node/issues/37648))
|
|
95
|
+
Use ES Modules to consume Fluid Framework client packages, including in Node.js.
|
|
96
|
+
- CommonJS:
|
|
97
|
+
Fluid Framework does not officially support CommonJS in version 3.0 or later.
|
|
92
98
|
|
|
93
99
|
## Contribution Guidelines
|
|
94
100
|
|
|
95
|
-
|
|
101
|
+
You can [contribute](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md) to Fluid Framework in these ways:
|
|
96
102
|
|
|
97
|
-
-
|
|
98
|
-
- [Submit
|
|
99
|
-
- Review
|
|
103
|
+
- Answer questions in [GitHub Discussions](https://github.com/microsoft/FluidFramework/discussions).
|
|
104
|
+
- [Submit bug reports](https://github.com/microsoft/FluidFramework/issues) and help verify fixes.
|
|
105
|
+
- Review [source code changes](https://github.com/microsoft/FluidFramework/pulls).
|
|
100
106
|
- [Contribute bug fixes](https://github.com/microsoft/FluidFramework/blob/main/CONTRIBUTING.md).
|
|
101
107
|
|
|
102
|
-
|
|
108
|
+
For detailed instructions, read the [repo documentation](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Home.md).
|
|
103
109
|
|
|
104
|
-
This project
|
|
105
|
-
For more information
|
|
110
|
+
This project follows the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
|
|
111
|
+
For more information, read the [Code of Conduct frequently asked questions](https://opensource.microsoft.com/codeofconduct/faq/).
|
|
112
|
+
For questions or comments, contact [opencode@microsoft.com](mailto:opencode@microsoft.com).
|
|
106
113
|
|
|
107
114
|
This project may contain Microsoft trademarks or logos for Microsoft projects, products, or services.
|
|
108
115
|
Use of these trademarks or logos must follow Microsoft’s [Trademark & Brand Guidelines](https://www.microsoft.com/trademarks).
|
|
@@ -110,13 +117,9 @@ Use of Microsoft trademarks or logos in modified versions of this project must n
|
|
|
110
117
|
|
|
111
118
|
## Help
|
|
112
119
|
|
|
113
|
-
|
|
114
|
-
Check out [fluidframework.com](https://fluidframework.com/docs/).
|
|
115
|
-
|
|
116
|
-
Still not finding what you're looking for?
|
|
117
|
-
Please [file an issue](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Contributing/Submitting-Bugs-and-Feature-Requests.md).
|
|
120
|
+
Read the [Fluid Framework documentation](https://fluidframework.com/docs/) for information about Fluid Framework concepts and APIs.
|
|
118
121
|
|
|
119
|
-
|
|
122
|
+
To request information that the documentation does not contain, [create an issue](https://github.com/microsoft/FluidFramework/blob/main/docs/content/Contributing/Submitting-Bugs-and-Feature-Requests.md).
|
|
120
123
|
|
|
121
124
|
## Trademark
|
|
122
125
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
|
|
3
|
-
"extends": "
|
|
3
|
+
"extends": "<projectFolder>/../../../common/build/build-common/api-extractor-model.esm.json"
|
|
4
4
|
}
|
|
@@ -30,6 +30,11 @@ const idForLocalUnattachedClient = undefined;
|
|
|
30
30
|
// TODO: #22835 Use undefined instead of any (breaking change)
|
|
31
31
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
32
|
class ConsensusOrderedCollection extends internal_4.SharedObject {
|
|
33
|
+
data;
|
|
34
|
+
/**
|
|
35
|
+
* The set of values that have been acquired but not yet completed or released
|
|
36
|
+
*/
|
|
37
|
+
jobTracking = new Map();
|
|
33
38
|
/**
|
|
34
39
|
* Constructs a new consensus collection. If the object is non-local an id and service interfaces will
|
|
35
40
|
* be provided
|
|
@@ -37,10 +42,6 @@ class ConsensusOrderedCollection extends internal_4.SharedObject {
|
|
|
37
42
|
constructor(id, runtime, attributes, data) {
|
|
38
43
|
super(id, runtime, attributes, "fluid_consensusOrderedCollection_");
|
|
39
44
|
this.data = data;
|
|
40
|
-
/**
|
|
41
|
-
* The set of values that have been acquired but not yet completed or released
|
|
42
|
-
*/
|
|
43
|
-
this.jobTracking = new Map();
|
|
44
45
|
// We can't simply call this.removeClient(this.runtime.clientId) in on runtime disconnected,
|
|
45
46
|
// because other clients may disconnect concurrently.
|
|
46
47
|
// Disconnect order matters because it defines the order items go back to the queue.
|
|
@@ -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/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport {\n\ttype IFluidSerializer,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { extractTelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n\ttype ConsensusCallback,\n\tConsensusResult,\n\ttype IConsensusOrderedCollection,\n\ttype IConsensusOrderedCollectionEvents,\n\ttype IOrderedCollection,\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/**\n * The type of the resolve function to call after the local operation is acknowledged.\n */\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 * @deprecated Use {@link IConsensusOrderedCollection} for typing and the appropriate factory to create instances. This implementation class will be removed in a future release.\n * @legacy @beta\n */\n\n// TODO: #22835 Use undefined instead of any (breaking change)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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\t}\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\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(res);\n\t\t\t}\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([...this.jobTracking.entries()], serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive(): boolean {\n\t\treturn this.runtime.connected && this.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string): Promise<void> {\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): void {\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): void {\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\textractTelemetryLoggerExt(this.logger).sendErrorEvent(\n\t\t\t\t\t{ eventName: \"ConsensusQueue_release\" },\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string): void {\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(\n\t\t\tcontent as Iterable<[string, { value: T; clientId: string | undefined }]>,\n\t\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(): void {\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 override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.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(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"acquire\": {\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, messageEnvelope.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"complete\": {\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"release\": {\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(op);\n\t\t\t\t}\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 = messageContent.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): void {\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): void {\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): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer): unknown {\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IConsensusOrderedCollectionOperation<T>;\n\t\t// Submit the original op so we can match the ACK when it arrives during remote op processing.\n\t\t// Use a no-op resolve function since we don't need to wait for the result. Note - this results in `acquire()` promises resolving to `false`.\n\t\tconst resolve: PendingResolve<T> = () => {};\n\t\tthis.submitLocalMessage(op, resolve);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"function\",\n\t\t\t0xc93 /* localOpMetadata should be a function */,\n\t\t);\n\t\t// A resolve function is passed as the localOpMetadata on this.submitLocalMessage().\n\t\t// On rollback we resolve with undefined and the promises will handle it appropriately.\n\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\tresolve(undefined);\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/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport {\n\ttype IFluidSerializer,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { extractTelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n\ttype ConsensusCallback,\n\tConsensusResult,\n\ttype IConsensusOrderedCollection,\n\ttype IConsensusOrderedCollectionEvents,\n\ttype IOrderedCollection,\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/**\n * The type of the resolve function to call after the local operation is acknowledged.\n */\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 * @deprecated Use {@link IConsensusOrderedCollection} for typing and the appropriate factory to create instances. This implementation class will be removed in a future release.\n * @legacy @beta\n */\n\n// TODO: #22835 Use undefined instead of any (breaking change)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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\t}\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\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(res);\n\t\t\t}\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([...this.jobTracking.entries()], serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive(): boolean {\n\t\treturn this.runtime.connected && this.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string): Promise<void> {\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): void {\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): void {\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\textractTelemetryLoggerExt(this.logger).sendErrorEvent(\n\t\t\t\t\t{ eventName: \"ConsensusQueue_release\" },\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string): void {\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(\n\t\t\tcontent as Iterable<[string, { value: T; clientId: string | undefined }]>,\n\t\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(): void {\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 override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.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(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"acquire\": {\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, messageEnvelope.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"complete\": {\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"release\": {\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(op);\n\t\t\t\t}\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 = messageContent.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): void {\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): void {\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): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer): unknown {\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IConsensusOrderedCollectionOperation<T>;\n\t\t// Submit the original op so we can match the ACK when it arrives during remote op processing.\n\t\t// Use a no-op resolve function since we don't need to wait for the result. Note - this results in `acquire()` promises resolving to `false`.\n\t\tconst resolve: PendingResolve<T> = () => {};\n\t\tthis.submitLocalMessage(op, resolve);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"function\",\n\t\t\t0xc93 /* localOpMetadata should be a function */,\n\t\t);\n\t\t// A resolve function is passed as the localOpMetadata on this.submitLocalMessage().\n\t\t// On rollback we resolve with undefined and the promises will handle it appropriately.\n\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\tresolve(undefined);\n\t}\n}\n"]}
|
|
@@ -22,7 +22,7 @@ export declare class ConsensusQueueFactory<T> implements IChannelFactory<IConsen
|
|
|
22
22
|
* {@inheritDoc ConsensusQueueClass}
|
|
23
23
|
* @legacy @beta
|
|
24
24
|
*/
|
|
25
|
-
export declare const ConsensusQueue: import("@fluidframework/shared-object-base
|
|
25
|
+
export declare const ConsensusQueue: import("@fluidframework/shared-object-base", { with: { "resolution-mode": "import" } }).ISharedObjectKind<IConsensusOrderedCollection<any>> & import("@fluidframework/shared-object-base", { with: { "resolution-mode": "import" } }).SharedObjectKind<IConsensusOrderedCollection<any>>;
|
|
26
26
|
/**
|
|
27
27
|
* {@inheritDoc ConsensusQueueClass}
|
|
28
28
|
* @deprecated Use {@link IConsensusOrderedCollection} for typing instead. This type alias will be removed in a future release.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusOrderedCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AAIxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAGnE;;;;GAIG;AACH,qBAAa,qBAAqB,CAAC,CAAC,CACnC,YAAW,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAK1D,OAAc,IAAI,SAAuD;IAEzE,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAEY,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAOnC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B,CAAC,CAAC,CAAC;CAM3F;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"consensusOrderedCollectionFactory.d.ts","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,gDAAgD,CAAC;AAIxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAGnE;;;;GAIG;AACH,qBAAa,qBAAqB,CAAC,CAAC,CACnC,YAAW,eAAe,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAK1D,OAAc,IAAI,SAAuD;IAEzE,gBAAuB,UAAU,EAAE,kBAAkB,CAInD;IAEF,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,IAAW,UAAU,IAAI,kBAAkB,CAE1C;IAEY,IAAI,CAChB,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,kBAAkB,GAC5B,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAOnC,MAAM,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,2BAA2B,CAAC,CAAC,CAAC;CAM3F;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,0RACgD,CAAC;AAe5E;;;;GAIG;AAGH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -15,6 +15,15 @@ const packageVersion_js_1 = require("./packageVersion.js");
|
|
|
15
15
|
* @internal
|
|
16
16
|
*/
|
|
17
17
|
class ConsensusQueueFactory {
|
|
18
|
+
// New type string, to be activated once the migration has been fully shipped dark and is safe to flip.
|
|
19
|
+
// See LegacyTypeAwareRegistry in packages/runtime/datastore/src/dataStoreRuntime.ts.
|
|
20
|
+
// public static Type = "consensus-queue";
|
|
21
|
+
static Type = "https://graph.microsoft.com/types/consensus-queue";
|
|
22
|
+
static Attributes = {
|
|
23
|
+
type: ConsensusQueueFactory.Type,
|
|
24
|
+
snapshotFormatVersion: "0.1",
|
|
25
|
+
packageVersion: packageVersion_js_1.pkgVersion,
|
|
26
|
+
};
|
|
18
27
|
get type() {
|
|
19
28
|
return ConsensusQueueFactory.Type;
|
|
20
29
|
}
|
|
@@ -35,15 +44,6 @@ class ConsensusQueueFactory {
|
|
|
35
44
|
}
|
|
36
45
|
}
|
|
37
46
|
exports.ConsensusQueueFactory = ConsensusQueueFactory;
|
|
38
|
-
// New type string, to be activated once the migration has been fully shipped dark and is safe to flip.
|
|
39
|
-
// See LegacyTypeAwareRegistry in packages/runtime/datastore/src/dataStoreRuntime.ts.
|
|
40
|
-
// public static Type = "consensus-queue";
|
|
41
|
-
ConsensusQueueFactory.Type = "https://graph.microsoft.com/types/consensus-queue";
|
|
42
|
-
ConsensusQueueFactory.Attributes = {
|
|
43
|
-
type: ConsensusQueueFactory.Type,
|
|
44
|
-
snapshotFormatVersion: "0.1",
|
|
45
|
-
packageVersion: packageVersion_js_1.pkgVersion,
|
|
46
|
-
};
|
|
47
47
|
/**
|
|
48
48
|
* {@inheritDoc ConsensusQueueClass}
|
|
49
49
|
* @legacy @beta
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,mGAAmG;AACnG,2DAA0D;AAE1D,2DAAiD;AAEjD;;;;GAIG;AACH,MAAa,qBAAqB;
|
|
1
|
+
{"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAQH,0EAAqF;AAErF,mGAAmG;AACnG,2DAA0D;AAE1D,2DAAiD;AAEjD;;;;GAIG;AACH,MAAa,qBAAqB;IAGjC,uGAAuG;IACvG,qFAAqF;IACrF,0CAA0C;IACnC,MAAM,CAAC,IAAI,GAAG,mDAAmD,CAAC;IAElE,MAAM,CAAU,UAAU,GAAuB;QACvD,IAAI,EAAE,qBAAqB,CAAC,IAAI;QAChC,qBAAqB,EAAE,KAAK;QAC5B,cAAc,EAAE,8BAAU;KAC1B,CAAC;IAEF,IAAW,IAAI;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,qBAAqB,CAAC,UAAU,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,uCAAmB,CAAI,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,uCAAmB,CAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7E,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAvCF,sDAwCC;AAED;;;GAGG;AACU,QAAA,cAAc,GAC1B,IAAA,iCAAsB,EAA8B,qBAAqB,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\n// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory\nimport { ConsensusQueueClass } from \"./consensusQueue.js\";\nimport type { IConsensusOrderedCollection } 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<T>\n\timplements IChannelFactory<IConsensusOrderedCollection<T>>\n{\n\t// New type string, to be activated once the migration has been fully shipped dark and is safe to flip.\n\t// See LegacyTypeAwareRegistry in packages/runtime/datastore/src/dataStoreRuntime.ts.\n\t// public static Type = \"consensus-queue\";\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(): string {\n\t\treturn ConsensusQueueFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn ConsensusQueueFactory.Attributes;\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection<T>> {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusQueueClass<T>(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection<T> {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusQueueClass<T>(id, document, this.attributes);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n\n/**\n * {@inheritDoc ConsensusQueueClass}\n * @legacy @beta\n */\nexport const ConsensusQueue =\n\tcreateSharedObjectKind<IConsensusOrderedCollection>(ConsensusQueueFactory);\n\n// For #22835, consider exposing a helper to produce type specific ConsensusQueue.\n// One problem, with doing so is that nothing inside ConsensusQueue validates the shape of T.\n// A DDS load might find content that is not the same, expected type.\n// But that is not any worse than the `any` that exists currently.\n// /**\n// * Factory for shared object kind for queue-shaped ordered collections of specific type.\n// * @legacy @beta\n// */\n// export function TypedConsensusQueue<T>(): ISharedObjectKind<IConsensusOrderedCollection<T>> &\n// \tSharedObjectKind<IConsensusOrderedCollection<T>> {\n// \treturn ConsensusQueue;\n// }\n\n/**\n * {@inheritDoc ConsensusQueueClass}\n * @deprecated Use {@link IConsensusOrderedCollection} for typing instead. This type alias will be removed in a future release.\n * @legacy @beta\n */\n// TODO: #22835 Use undefined instead of any (breaking change)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, import-x/no-deprecated\nexport type ConsensusQueue<T = any> = ConsensusQueueClass<T>;\n"]}
|
package/dist/packageVersion.d.ts
CHANGED
|
@@ -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 = "
|
|
8
|
+
export declare const pkgVersion = "3.0.0";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,uCAAuC,CAAC;AAC5D,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,uCAAuC,CAAC;AAC5D,eAAO,MAAM,UAAU,UAAU,CAAC"}
|
package/dist/packageVersion.js
CHANGED
|
@@ -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 = "
|
|
11
|
+
exports.pkgVersion = "3.0.0";
|
|
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,
|
|
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,OAAO,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 = \"3.0.0\";\n"]}
|
|
@@ -7,10 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.SnapshotableArray = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
9
|
class SnapshotableArray extends Array {
|
|
10
|
-
|
|
11
|
-
super(...arguments);
|
|
12
|
-
this.data = [];
|
|
13
|
-
}
|
|
10
|
+
data = [];
|
|
14
11
|
asArray() {
|
|
15
12
|
return this.data;
|
|
16
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotableArray.js","sourceRoot":"","sources":["../src/snapshotableArray.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,MAAa,iBAAqB,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"snapshotableArray.js","sourceRoot":"","sources":["../src/snapshotableArray.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAA6D;AAE7D,MAAa,iBAAqB,SAAQ,KAAK;IACpC,IAAI,GAAQ,EAAE,CAAC;IAElB,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAS;QAC9B,IAAA,iBAAM,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAEM,IAAI;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACzB,CAAC;CACD;AAfD,8CAeC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nexport class SnapshotableArray<T> extends Array {\n\tprotected data: T[] = [];\n\n\tpublic asArray(): T[] {\n\t\treturn this.data;\n\t}\n\n\tpublic async loadFrom(from: T[]): Promise<void> {\n\t\tassert(this.data.length === 0, 0x06b /* \"Loading snapshot into a non-empty collection\" */);\n\t\tthis.data = from;\n\t}\n\n\tpublic size(): number {\n\t\treturn this.data.length;\n\t}\n}\n"]}
|
package/dist/testUtils.js
CHANGED
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.acquireAndComplete = acquireAndComplete;
|
|
8
|
+
exports.waitAcquireAndComplete = waitAcquireAndComplete;
|
|
9
|
+
exports.acquireAndRelease = acquireAndRelease;
|
|
10
|
+
exports.waitAcquireAndRelease = waitAcquireAndRelease;
|
|
8
11
|
const interfaces_js_1 = require("./interfaces.js");
|
|
9
12
|
/**
|
|
10
13
|
* Helper method to acquire and complete an item
|
|
@@ -19,7 +22,6 @@ async function acquireAndComplete(collection) {
|
|
|
19
22
|
});
|
|
20
23
|
return res;
|
|
21
24
|
}
|
|
22
|
-
exports.acquireAndComplete = acquireAndComplete;
|
|
23
25
|
/**
|
|
24
26
|
* Helper method to acquire and complete an item
|
|
25
27
|
* Should be used in test code only
|
|
@@ -33,7 +35,6 @@ async function waitAcquireAndComplete(collection) {
|
|
|
33
35
|
});
|
|
34
36
|
return res;
|
|
35
37
|
}
|
|
36
|
-
exports.waitAcquireAndComplete = waitAcquireAndComplete;
|
|
37
38
|
/**
|
|
38
39
|
* Helper method to acquire and release an item
|
|
39
40
|
* Should be used in test code only
|
|
@@ -47,7 +48,6 @@ async function acquireAndRelease(collection) {
|
|
|
47
48
|
});
|
|
48
49
|
return res;
|
|
49
50
|
}
|
|
50
|
-
exports.acquireAndRelease = acquireAndRelease;
|
|
51
51
|
/**
|
|
52
52
|
* Helper method to acquire and release an item
|
|
53
53
|
* Should be used in test code only
|
|
@@ -61,5 +61,4 @@ async function waitAcquireAndRelease(collection) {
|
|
|
61
61
|
});
|
|
62
62
|
return res;
|
|
63
63
|
}
|
|
64
|
-
exports.waitAcquireAndRelease = waitAcquireAndRelease;
|
|
65
64
|
//# sourceMappingURL=testUtils.js.map
|
package/dist/testUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AASH,gDASC;AAOD,wDASC;AAOD,8CASC;AAOD,sDASC;AAhED,mDAAoF;AAEpF;;;;GAIG;AACI,KAAK,UAAU,kBAAkB,CACvC,UAA0C;IAE1C,IAAI,GAAkB,CAAC;IACvB,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAQ,EAAE,EAAE;QAC3C,GAAG,GAAG,KAAK,CAAC;QACZ,OAAO,+BAAe,CAAC,QAAQ,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAC3C,UAA0C;IAE1C,IAAI,GAAkB,CAAC;IACvB,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,KAAQ,EAAE,EAAE;QAClD,GAAG,GAAG,KAAK,CAAC;QACZ,OAAO,+BAAe,CAAC,QAAQ,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,GAAQ,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CACtC,UAA0C;IAE1C,IAAI,GAAkB,CAAC;IACvB,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,KAAQ,EAAE,EAAE;QAC3C,GAAG,GAAG,KAAK,CAAC;QACZ,OAAO,+BAAe,CAAC,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,qBAAqB,CAC1C,UAA0C;IAE1C,IAAI,GAAkB,CAAC;IACvB,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,KAAQ,EAAE,EAAE;QAClD,GAAG,GAAG,KAAK,CAAC;QACZ,OAAO,+BAAe,CAAC,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,GAAQ,CAAC;AACjB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ConsensusResult, type IConsensusOrderedCollection } from \"./interfaces.js\";\n\n/**\n * Helper method to acquire and complete an item\n * Should be used in test code only\n * @internal\n */\nexport async function acquireAndComplete<T>(\n\tcollection: IConsensusOrderedCollection<T>,\n): Promise<T | undefined> {\n\tlet res: T | undefined;\n\tawait collection.acquire(async (value: T) => {\n\t\tres = value;\n\t\treturn ConsensusResult.Complete;\n\t});\n\treturn res;\n}\n\n/**\n * Helper method to acquire and complete an item\n * Should be used in test code only\n * @internal\n */\nexport async function waitAcquireAndComplete<T>(\n\tcollection: IConsensusOrderedCollection<T>,\n): Promise<T> {\n\tlet res: T | undefined;\n\tawait collection.waitAndAcquire(async (value: T) => {\n\t\tres = value;\n\t\treturn ConsensusResult.Complete;\n\t});\n\treturn res as T;\n}\n\n/**\n * Helper method to acquire and release an item\n * Should be used in test code only\n * @internal\n */\nexport async function acquireAndRelease<T>(\n\tcollection: IConsensusOrderedCollection<T>,\n): Promise<T | undefined> {\n\tlet res: T | undefined;\n\tawait collection.acquire(async (value: T) => {\n\t\tres = value;\n\t\treturn ConsensusResult.Release;\n\t});\n\treturn res;\n}\n\n/**\n * Helper method to acquire and release an item\n * Should be used in test code only\n * @internal\n */\nexport async function waitAcquireAndRelease<T>(\n\tcollection: IConsensusOrderedCollection<T>,\n): Promise<T> {\n\tlet res: T | undefined;\n\tawait collection.waitAndAcquire(async (value: T) => {\n\t\tres = value;\n\t\treturn ConsensusResult.Release;\n\t});\n\treturn res as T;\n}\n"]}
|
|
@@ -27,6 +27,11 @@ const idForLocalUnattachedClient = undefined;
|
|
|
27
27
|
// TODO: #22835 Use undefined instead of any (breaking change)
|
|
28
28
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
29
|
export class ConsensusOrderedCollection extends SharedObject {
|
|
30
|
+
data;
|
|
31
|
+
/**
|
|
32
|
+
* The set of values that have been acquired but not yet completed or released
|
|
33
|
+
*/
|
|
34
|
+
jobTracking = new Map();
|
|
30
35
|
/**
|
|
31
36
|
* Constructs a new consensus collection. If the object is non-local an id and service interfaces will
|
|
32
37
|
* be provided
|
|
@@ -34,10 +39,6 @@ export class ConsensusOrderedCollection extends SharedObject {
|
|
|
34
39
|
constructor(id, runtime, attributes, data) {
|
|
35
40
|
super(id, runtime, attributes, "fluid_consensusOrderedCollection_");
|
|
36
41
|
this.data = data;
|
|
37
|
-
/**
|
|
38
|
-
* The set of values that have been acquired but not yet completed or released
|
|
39
|
-
*/
|
|
40
|
-
this.jobTracking = new Map();
|
|
41
42
|
// We can't simply call this.removeClient(this.runtime.clientId) in on runtime disconnected,
|
|
42
43
|
// because other clients may disconnect concurrently.
|
|
43
44
|
// Disconnect order matters because it defines the order items go back to the queue.
|
|
@@ -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/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport {\n\ttype IFluidSerializer,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { extractTelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n\ttype ConsensusCallback,\n\tConsensusResult,\n\ttype IConsensusOrderedCollection,\n\ttype IConsensusOrderedCollectionEvents,\n\ttype IOrderedCollection,\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/**\n * The type of the resolve function to call after the local operation is acknowledged.\n */\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 * @deprecated Use {@link IConsensusOrderedCollection} for typing and the appropriate factory to create instances. This implementation class will be removed in a future release.\n * @legacy @beta\n */\n\n// TODO: #22835 Use undefined instead of any (breaking change)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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\t}\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\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(res);\n\t\t\t}\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([...this.jobTracking.entries()], serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive(): boolean {\n\t\treturn this.runtime.connected && this.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string): Promise<void> {\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): void {\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): void {\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\textractTelemetryLoggerExt(this.logger).sendErrorEvent(\n\t\t\t\t\t{ eventName: \"ConsensusQueue_release\" },\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string): void {\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(\n\t\t\tcontent as Iterable<[string, { value: T; clientId: string | undefined }]>,\n\t\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(): void {\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 override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.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(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"acquire\": {\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, messageEnvelope.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"complete\": {\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"release\": {\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(op);\n\t\t\t\t}\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 = messageContent.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): void {\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): void {\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): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer): unknown {\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IConsensusOrderedCollectionOperation<T>;\n\t\t// Submit the original op so we can match the ACK when it arrives during remote op processing.\n\t\t// Use a no-op resolve function since we don't need to wait for the result. Note - this results in `acquire()` promises resolving to `false`.\n\t\tconst resolve: PendingResolve<T> = () => {};\n\t\tthis.submitLocalMessage(op, resolve);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"function\",\n\t\t\t0xc93 /* localOpMetadata should be a function */,\n\t\t);\n\t\t// A resolve function is passed as the localOpMetadata on this.submitLocalMessage().\n\t\t// On rollback we resolve with undefined and the promises will handle it appropriately.\n\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\tresolve(undefined);\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/internal\";\nimport type {\n\tIChannelAttributes,\n\tIFluidDataStoreRuntime,\n\tIChannelStorageService,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tISummaryTreeWithStats,\n\tIRuntimeMessageCollection,\n\tIRuntimeMessagesContent,\n\tISequencedMessageEnvelope,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { SummaryTreeBuilder } from \"@fluidframework/runtime-utils/internal\";\nimport {\n\ttype IFluidSerializer,\n\tSharedObject,\n} from \"@fluidframework/shared-object-base/internal\";\nimport { extractTelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport {\n\ttype ConsensusCallback,\n\tConsensusResult,\n\ttype IConsensusOrderedCollection,\n\ttype IConsensusOrderedCollectionEvents,\n\ttype IOrderedCollection,\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/**\n * The type of the resolve function to call after the local operation is acknowledged.\n */\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 * @deprecated Use {@link IConsensusOrderedCollection} for typing and the appropriate factory to create instances. This implementation class will be removed in a future release.\n * @legacy @beta\n */\n\n// TODO: #22835 Use undefined instead of any (breaking change)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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\t}\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\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(res);\n\t\t\t}\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([...this.jobTracking.entries()], serializer);\n\t\tbuilder.addBlob(snapshotFileNameTracking, blobContent);\n\t\treturn builder.getSummaryTree();\n\t}\n\n\tprotected isActive(): boolean {\n\t\treturn this.runtime.connected && this.deltaManager.active;\n\t}\n\n\tprotected async complete(acquireId: string): Promise<void> {\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): void {\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): void {\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\textractTelemetryLoggerExt(this.logger).sendErrorEvent(\n\t\t\t\t\t{ eventName: \"ConsensusQueue_release\" },\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected releaseCore(acquireId: string): void {\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(\n\t\t\tcontent as Iterable<[string, { value: T; clientId: string | undefined }]>,\n\t\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(): void {\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 override processMessagesCore(messagesCollection: IRuntimeMessageCollection): void {\n\t\tconst { envelope, local, messagesContent } = messagesCollection;\n\t\tfor (const messageContent of messagesContent) {\n\t\t\tthis.processMessage(envelope, messageContent, local);\n\t\t}\n\t}\n\n\tprivate processMessage(\n\t\tmessageEnvelope: ISequencedMessageEnvelope,\n\t\tmessageContent: IRuntimeMessagesContent,\n\t\tlocal: boolean,\n\t): void {\n\t\tif (messageEnvelope.type === MessageType.Operation) {\n\t\t\tconst op = messageContent.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(this.deserializeValue(op.value, this.serializer) as T);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.addCore(op.deserializedValue);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"acquire\": {\n\t\t\t\t\tvalue = this.acquireCore(op.acquireId, messageEnvelope.clientId ?? undefined);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"complete\": {\n\t\t\t\t\tthis.completeCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"release\": {\n\t\t\t\t\tthis.releaseCore(op.acquireId);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\tunreachableCase(op);\n\t\t\t\t}\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 = messageContent.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): void {\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): void {\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): string {\n\t\treturn serializer.stringify(value, this.handle);\n\t}\n\n\tprivate deserializeValue(content: string, serializer: IFluidSerializer): unknown {\n\t\treturn serializer.parse(content);\n\t}\n\n\tprotected applyStashedOp(content: unknown): void {\n\t\tconst op = content as IConsensusOrderedCollectionOperation<T>;\n\t\t// Submit the original op so we can match the ACK when it arrives during remote op processing.\n\t\t// Use a no-op resolve function since we don't need to wait for the result. Note - this results in `acquire()` promises resolving to `false`.\n\t\tconst resolve: PendingResolve<T> = () => {};\n\t\tthis.submitLocalMessage(op, resolve);\n\t}\n\n\t/**\n\t * {@inheritDoc @fluidframework/shared-object-base#SharedObject.rollback}\n\t * @sealed\n\t */\n\tprotected rollback(content: unknown, localOpMetadata: unknown): void {\n\t\tassert(\n\t\t\ttypeof localOpMetadata === \"function\",\n\t\t\t0xc93 /* localOpMetadata should be a function */,\n\t\t);\n\t\t// A resolve function is passed as the localOpMetadata on this.submitLocalMessage().\n\t\t// On rollback we resolve with undefined and the promises will handle it appropriately.\n\t\tconst resolve = localOpMetadata as PendingResolve<T>;\n\t\tresolve(undefined);\n\t}\n}\n"]}
|
|
@@ -12,6 +12,15 @@ import { pkgVersion } from "./packageVersion.js";
|
|
|
12
12
|
* @internal
|
|
13
13
|
*/
|
|
14
14
|
export class ConsensusQueueFactory {
|
|
15
|
+
// New type string, to be activated once the migration has been fully shipped dark and is safe to flip.
|
|
16
|
+
// See LegacyTypeAwareRegistry in packages/runtime/datastore/src/dataStoreRuntime.ts.
|
|
17
|
+
// public static Type = "consensus-queue";
|
|
18
|
+
static Type = "https://graph.microsoft.com/types/consensus-queue";
|
|
19
|
+
static Attributes = {
|
|
20
|
+
type: ConsensusQueueFactory.Type,
|
|
21
|
+
snapshotFormatVersion: "0.1",
|
|
22
|
+
packageVersion: pkgVersion,
|
|
23
|
+
};
|
|
15
24
|
get type() {
|
|
16
25
|
return ConsensusQueueFactory.Type;
|
|
17
26
|
}
|
|
@@ -31,15 +40,6 @@ export class ConsensusQueueFactory {
|
|
|
31
40
|
return collection;
|
|
32
41
|
}
|
|
33
42
|
}
|
|
34
|
-
// New type string, to be activated once the migration has been fully shipped dark and is safe to flip.
|
|
35
|
-
// See LegacyTypeAwareRegistry in packages/runtime/datastore/src/dataStoreRuntime.ts.
|
|
36
|
-
// public static Type = "consensus-queue";
|
|
37
|
-
ConsensusQueueFactory.Type = "https://graph.microsoft.com/types/consensus-queue";
|
|
38
|
-
ConsensusQueueFactory.Attributes = {
|
|
39
|
-
type: ConsensusQueueFactory.Type,
|
|
40
|
-
snapshotFormatVersion: "0.1",
|
|
41
|
-
packageVersion: pkgVersion,
|
|
42
|
-
};
|
|
43
43
|
/**
|
|
44
44
|
* {@inheritDoc ConsensusQueueClass}
|
|
45
45
|
* @legacy @beta
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,mGAAmG;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"consensusOrderedCollectionFactory.js","sourceRoot":"","sources":["../src/consensusOrderedCollectionFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,mGAAmG;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,OAAO,qBAAqB;IAGjC,uGAAuG;IACvG,qFAAqF;IACrF,0CAA0C;IACnC,MAAM,CAAC,IAAI,GAAG,mDAAmD,CAAC;IAElE,MAAM,CAAU,UAAU,GAAuB;QACvD,IAAI,EAAE,qBAAqB,CAAC,IAAI;QAChC,qBAAqB,EAAE,KAAK;QAC5B,cAAc,EAAE,UAAU;KAC1B,CAAC;IAEF,IAAW,IAAI;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACpB,OAAO,qBAAqB,CAAC,UAAU,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,OAA+B,EAC/B,EAAU,EACV,QAA0B,EAC1B,UAA8B;QAE9B,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAI,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,QAAgC,EAAE,EAAU;QACzD,wFAAwF;QACxF,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7E,UAAU,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC;IACnB,CAAC;;AAGF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAC1B,sBAAsB,CAA8B,qBAAqB,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type {\n\tIChannelAttributes,\n\tIChannelFactory,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { createSharedObjectKind } from \"@fluidframework/shared-object-base/internal\";\n\n// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class in factory\nimport { ConsensusQueueClass } from \"./consensusQueue.js\";\nimport type { IConsensusOrderedCollection } 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<T>\n\timplements IChannelFactory<IConsensusOrderedCollection<T>>\n{\n\t// New type string, to be activated once the migration has been fully shipped dark and is safe to flip.\n\t// See LegacyTypeAwareRegistry in packages/runtime/datastore/src/dataStoreRuntime.ts.\n\t// public static Type = \"consensus-queue\";\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(): string {\n\t\treturn ConsensusQueueFactory.Type;\n\t}\n\n\tpublic get attributes(): IChannelAttributes {\n\t\treturn ConsensusQueueFactory.Attributes;\n\t}\n\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<IConsensusOrderedCollection<T>> {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusQueueClass<T>(id, runtime, attributes);\n\t\tawait collection.load(services);\n\t\treturn collection;\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): IConsensusOrderedCollection<T> {\n\t\t// eslint-disable-next-line import-x/no-deprecated -- Internal usage of deprecated class\n\t\tconst collection = new ConsensusQueueClass<T>(id, document, this.attributes);\n\t\tcollection.initializeLocal();\n\t\treturn collection;\n\t}\n}\n\n/**\n * {@inheritDoc ConsensusQueueClass}\n * @legacy @beta\n */\nexport const ConsensusQueue =\n\tcreateSharedObjectKind<IConsensusOrderedCollection>(ConsensusQueueFactory);\n\n// For #22835, consider exposing a helper to produce type specific ConsensusQueue.\n// One problem, with doing so is that nothing inside ConsensusQueue validates the shape of T.\n// A DDS load might find content that is not the same, expected type.\n// But that is not any worse than the `any` that exists currently.\n// /**\n// * Factory for shared object kind for queue-shaped ordered collections of specific type.\n// * @legacy @beta\n// */\n// export function TypedConsensusQueue<T>(): ISharedObjectKind<IConsensusOrderedCollection<T>> &\n// \tSharedObjectKind<IConsensusOrderedCollection<T>> {\n// \treturn ConsensusQueue;\n// }\n\n/**\n * {@inheritDoc ConsensusQueueClass}\n * @deprecated Use {@link IConsensusOrderedCollection} for typing instead. This type alias will be removed in a future release.\n * @legacy @beta\n */\n// TODO: #22835 Use undefined instead of any (breaking change)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, import-x/no-deprecated\nexport type ConsensusQueue<T = any> = ConsensusQueueClass<T>;\n"]}
|
package/lib/legacy.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib
|
|
8
|
+
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -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 = "
|
|
8
|
+
export declare const pkgVersion = "3.0.0";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,uCAAuC,CAAC;AAC5D,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"packageVersion.d.ts","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,uCAAuC,CAAC;AAC5D,eAAO,MAAM,UAAU,UAAU,CAAC"}
|
package/lib/packageVersion.js
CHANGED
|
@@ -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,
|
|
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,OAAO,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 = \"3.0.0\";\n"]}
|
package/lib/public.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
/*
|
|
7
7
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib
|
|
8
|
+
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib" in @fluid-tools/build-cli.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
export {}
|
package/lib/snapshotableArray.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotableArray.js","sourceRoot":"","sources":["../src/snapshotableArray.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,MAAM,OAAO,iBAAqB,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"snapshotableArray.js","sourceRoot":"","sources":["../src/snapshotableArray.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,MAAM,OAAO,iBAAqB,SAAQ,KAAK;IACpC,IAAI,GAAQ,EAAE,CAAC;IAElB,OAAO;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAS;QAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAEM,IAAI;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACzB,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/core-utils/internal\";\n\nexport class SnapshotableArray<T> extends Array {\n\tprotected data: T[] = [];\n\n\tpublic asArray(): T[] {\n\t\treturn this.data;\n\t}\n\n\tpublic async loadFrom(from: T[]): Promise<void> {\n\t\tassert(this.data.length === 0, 0x06b /* \"Loading snapshot into a non-empty collection\" */);\n\t\tthis.data = from;\n\t}\n\n\tpublic size(): number {\n\t\treturn this.data.length;\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/ordered-collection",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Consensus Collection",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -14,50 +14,30 @@
|
|
|
14
14
|
"type": "module",
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"require": {
|
|
22
|
-
"types": "./dist/public.d.ts",
|
|
23
|
-
"default": "./dist/index.js"
|
|
17
|
+
"types": "./lib/public.d.ts",
|
|
18
|
+
"default": "./lib/index.js",
|
|
19
|
+
"internal-entrypoint-generation": {
|
|
20
|
+
"types": "./dist/public.d.ts"
|
|
24
21
|
}
|
|
25
22
|
},
|
|
26
23
|
"./legacy": {
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"require": {
|
|
32
|
-
"types": "./dist/legacy.d.ts",
|
|
33
|
-
"default": "./dist/index.js"
|
|
24
|
+
"types": "./lib/legacy.d.ts",
|
|
25
|
+
"default": "./lib/index.js",
|
|
26
|
+
"internal-entrypoint-generation": {
|
|
27
|
+
"types": "./dist/legacy.d.ts"
|
|
34
28
|
}
|
|
35
29
|
},
|
|
36
30
|
"./internal": {
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
"default": "./lib/index.js"
|
|
40
|
-
},
|
|
41
|
-
"require": {
|
|
42
|
-
"types": "./dist/index.d.ts",
|
|
43
|
-
"default": "./dist/index.js"
|
|
44
|
-
}
|
|
31
|
+
"types": "./lib/index.d.ts",
|
|
32
|
+
"default": "./lib/index.js"
|
|
45
33
|
},
|
|
46
34
|
"./internal/test": {
|
|
47
35
|
"allow-ff-test-exports": {
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
"default": "./lib/test/index.js"
|
|
51
|
-
},
|
|
52
|
-
"require": {
|
|
53
|
-
"types": "./dist/test/index.d.ts",
|
|
54
|
-
"default": "./dist/test/index.js"
|
|
55
|
-
}
|
|
36
|
+
"types": "./lib/test/index.d.ts",
|
|
37
|
+
"default": "./lib/test/index.js"
|
|
56
38
|
}
|
|
57
39
|
}
|
|
58
40
|
},
|
|
59
|
-
"main": "lib/index.js",
|
|
60
|
-
"types": "lib/public.d.ts",
|
|
61
41
|
"c8": {
|
|
62
42
|
"all": true,
|
|
63
43
|
"cache-dir": "nyc/.cache",
|
|
@@ -81,29 +61,29 @@
|
|
|
81
61
|
"temp-directory": "nyc/.nyc_output"
|
|
82
62
|
},
|
|
83
63
|
"dependencies": {
|
|
84
|
-
"@fluid-internal/client-utils": "~
|
|
85
|
-
"@fluidframework/core-interfaces": "~
|
|
86
|
-
"@fluidframework/core-utils": "~
|
|
87
|
-
"@fluidframework/datastore-definitions": "~
|
|
88
|
-
"@fluidframework/driver-definitions": "~
|
|
89
|
-
"@fluidframework/runtime-definitions": "~
|
|
90
|
-
"@fluidframework/runtime-utils": "~
|
|
91
|
-
"@fluidframework/shared-object-base": "~
|
|
92
|
-
"@fluidframework/telemetry-utils": "~
|
|
64
|
+
"@fluid-internal/client-utils": "~3.0.0",
|
|
65
|
+
"@fluidframework/core-interfaces": "~3.0.0",
|
|
66
|
+
"@fluidframework/core-utils": "~3.0.0",
|
|
67
|
+
"@fluidframework/datastore-definitions": "~3.0.0",
|
|
68
|
+
"@fluidframework/driver-definitions": "~3.0.0",
|
|
69
|
+
"@fluidframework/runtime-definitions": "~3.0.0",
|
|
70
|
+
"@fluidframework/runtime-utils": "~3.0.0",
|
|
71
|
+
"@fluidframework/shared-object-base": "~3.0.0",
|
|
72
|
+
"@fluidframework/telemetry-utils": "~3.0.0",
|
|
93
73
|
"uuid": "^11.1.0"
|
|
94
74
|
},
|
|
95
75
|
"devDependencies": {
|
|
96
76
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
97
77
|
"@biomejs/biome": "~2.4.5",
|
|
98
|
-
"@fluid-internal/mocha-test-setup": "~
|
|
99
|
-
"@fluid-private/stochastic-test-utils": "~
|
|
100
|
-
"@fluid-private/test-dds-utils": "~
|
|
78
|
+
"@fluid-internal/mocha-test-setup": "~3.0.0",
|
|
79
|
+
"@fluid-private/stochastic-test-utils": "~3.0.0",
|
|
80
|
+
"@fluid-private/test-dds-utils": "~3.0.0",
|
|
101
81
|
"@fluid-tools/build-cli": "^0.67.0",
|
|
102
82
|
"@fluidframework/build-common": "^2.0.3",
|
|
103
83
|
"@fluidframework/build-tools": "^0.67.0",
|
|
104
84
|
"@fluidframework/eslint-config-fluid": "^14.0.0",
|
|
105
85
|
"@fluidframework/ordered-collection-previous": "npm:@fluidframework/ordered-collection@2.116.0",
|
|
106
|
-
"@fluidframework/test-runtime-utils": "~
|
|
86
|
+
"@fluidframework/test-runtime-utils": "~3.0.0",
|
|
107
87
|
"@microsoft/api-extractor": "7.58.1",
|
|
108
88
|
"@types/mocha": "^10.0.10",
|
|
109
89
|
"@types/node": "~22.19.17",
|
|
@@ -116,7 +96,7 @@
|
|
|
116
96
|
"mocha": "^11.7.5",
|
|
117
97
|
"mocha-multi-reporters": "^1.5.1",
|
|
118
98
|
"rimraf": "^6.1.3",
|
|
119
|
-
"typescript": "~
|
|
99
|
+
"typescript": "~6.0.3"
|
|
120
100
|
},
|
|
121
101
|
"typeValidation": {
|
|
122
102
|
"broken": {},
|
|
@@ -125,20 +105,21 @@
|
|
|
125
105
|
"scripts": {
|
|
126
106
|
"build": "fluid-build . --task build",
|
|
127
107
|
"build:api-reports": "concurrently \"npm:build:api-reports:*\"",
|
|
128
|
-
"build:api-reports:current": "api-extractor run --local --config api-extractor/api-extractor.current.json",
|
|
129
|
-
"build:api-reports:legacy": "api-extractor run --local --config api-extractor/api-extractor.legacy.json",
|
|
108
|
+
"build:api-reports:current": "api-extractor run --local --config api-extractor/api-extractor-report.current.json",
|
|
109
|
+
"build:api-reports:legacy": "api-extractor run --local --config api-extractor/api-extractor-report.legacy.json",
|
|
110
|
+
"build:cjs": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
|
|
130
111
|
"build:commonjs": "fluid-build . --task commonjs",
|
|
131
112
|
"build:compile": "fluid-build . --task compile",
|
|
132
|
-
"build:docs": "api-extractor run --local",
|
|
113
|
+
"build:docs": "api-extractor run --local --config api-extractor/api-extractor-model.json",
|
|
133
114
|
"build:entrypoints": "fluid-build . --task build:entrypoints",
|
|
134
115
|
"build:entrypoints:cjs": "flub generate entrypoints --resolutionConditions require --outFileLegacyBeta legacy --outDir ./dist",
|
|
135
|
-
"build:entrypoints:esm": "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib
|
|
136
|
-
"build:
|
|
116
|
+
"build:entrypoints:esm": "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib",
|
|
117
|
+
"build:esm": "tsc --project ./tsconfig.json",
|
|
137
118
|
"build:genver": "gen-version",
|
|
138
119
|
"build:test": "concurrently npm:build:test:esm npm:build:test:cjs",
|
|
139
120
|
"build:test:cjs": "fluid-tsc commonjs --project ./src/test/tsconfig.cjs.json",
|
|
140
121
|
"build:test:esm": "tsc --project ./src/test/tsconfig.json",
|
|
141
|
-
"check:are-the-types-wrong": "attw --pack . --exclude-entrypoints ./internal/test",
|
|
122
|
+
"check:are-the-types-wrong": "attw --pack . --profile esm-only --exclude-entrypoints ./internal/test",
|
|
142
123
|
"check:biome": "biome check .",
|
|
143
124
|
"check:exports": "concurrently \"npm:check:exports:*\"",
|
|
144
125
|
"check:exports:bundle-release-tags": "api-extractor run --config api-extractor/api-extractor-lint-bundle.json",
|
|
@@ -148,9 +129,9 @@
|
|
|
148
129
|
"check:exports:esm:public": "api-extractor run --config api-extractor/api-extractor-lint-public.esm.json",
|
|
149
130
|
"check:format": "npm run check:biome",
|
|
150
131
|
"ci:build:api-reports": "concurrently \"npm:ci:build:api-reports:*\"",
|
|
151
|
-
"ci:build:api-reports:current": "api-extractor run --config api-extractor/api-extractor.current.json",
|
|
152
|
-
"ci:build:api-reports:legacy": "api-extractor run --config api-extractor/api-extractor.legacy.json",
|
|
153
|
-
"ci:build:docs": "api-extractor run",
|
|
132
|
+
"ci:build:api-reports:current": "api-extractor run --config api-extractor/api-extractor-report.current.json",
|
|
133
|
+
"ci:build:api-reports:legacy": "api-extractor run --config api-extractor/api-extractor-report.legacy.json",
|
|
134
|
+
"ci:build:docs": "api-extractor run --config api-extractor/api-extractor-model.json",
|
|
154
135
|
"clean": "rimraf --glob dist lib {alpha,beta,internal,legacy}.d.ts \"**/*.tsbuildinfo\" \"**/*.build.log\" _api-extractor-temp nyc",
|
|
155
136
|
"eslint": "eslint --quiet --format stylish src",
|
|
156
137
|
"eslint:fix": "eslint --quiet --format stylish src --fix --fix-type problem,suggestion,layout",
|
|
@@ -164,7 +145,6 @@
|
|
|
164
145
|
"test:mocha:cjs": "cross-env FLUID_TEST_MODULE_SYSTEM=CJS mocha",
|
|
165
146
|
"test:mocha:esm": "mocha",
|
|
166
147
|
"test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
|
|
167
|
-
"tsc": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
|
|
168
148
|
"typetests:gen": "flub generate typetests --dir . -v"
|
|
169
149
|
}
|
|
170
150
|
}
|
package/src/packageVersion.ts
CHANGED
package/tsconfig.json
CHANGED
package/internal.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "./lib/index.js";
|
package/legacy.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
|
8
|
-
* Generated by "flub generate entrypoints --outFileLegacyBeta legacy --outDir ./lib --node10TypeCompat" in @fluid-tools/build-cli.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export * from "./lib/legacy.js";
|
|
File without changes
|
|
File without changes
|