-
Notifications
You must be signed in to change notification settings - Fork 562
build(client): bump version to 2.73.1 #25921
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
build(client): bump version to 2.73.1 #25921
Conversation
Bumps client release group to 2.74.0. Command used: ``` pnpm -r --include-workspace-root exec npm pkg set version=2.74.0 pnpm build --worker ```
…25912) ## Description This PR removes the use of `object-sizeof` from the summary size check flow. ## Context The [object-sizeof](https://www.npmjs.com/package/object-sizeof) library has serious sizing inconsistencies, and has shown performance issues with large data sizes. Using the current dependency version of object-sizeof (1.6), we can see a string of length 13 ("Hello, World!") shows up drastically different in a few scenarios: ```plaintext Original string length: 13 // str.length Sizeof original string: 26 bytes Original buffer length: 13 // buffer.bytelength Sizeof original buffer: 2186 bytes Compressed string length: 21 // using Pako.deflate Sizeof compressed string: 232 bytes Compressed buffer length: 21 // using Pako.deflate Sizeof compressed buffer: 232 bytes ``` Even after upgrading to object-sizeof v2.6, we can see some oddities ```plaintext Original string length: 13 // str.length Sizeof original string: 28 bytes Original buffer length: 13 // buffer.bytelength Sizeof original buffer: 13 bytes Compressed string length: 21 Sizeof compressed string: 21 bytes Compressed buffer length: 21 Sizeof compressed buffer: 21 bytes ``` Sizeof is known to do _some_ amount of internal multipliers to align sizes with ECMA storage values and memory allocation. For our use-case, we want storage-size, and we have the ability to use built-in size checks to achieve that.
…5914) ## Description In some scenarios, Nexus' session pruning will attempt to iterate over too many sessions, causing a timeout or limit errors. We should allow pre-emptively limiting the amount of sessions to retrieve from storage. --------- Co-authored-by: zhangxin511 <[email protected]>
## Description Fixes a grammatical mismatch (documents -> is) and a missing word. ## Reviewer Guidance The review process is outlined on [this wiki page](https://github.com/microsoft/FluidFramework/wiki/PR-Guidelines#guidelines).
## Description This PR updates our `glob` depdencies to `10.5.0` to avoid using `10.4.5` which has security vulnerabilities. Since all consumers of `10.4.5` are able to use `10.5.0`, we only need to update the lockfiles. To do so I did the following: 1. Add a pnpm override to use `[email protected]` 2. Run `pnpm i --no-frozen-lockfile` 3. Remove the override 4. Run `pnpm i --no-frozen-lockfile` again This results in the lock file no longer referencing the `10.4.5` version. ## Misc [AB#53799](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/53799)
Renames test modules, test-cases directory, and removes unneeded folder hierarchy.
|
Warning WARNING: This PR is targeting a release branch! All changes must first be merged into Changes to release branches require approval from the Patch Triage group before merging. For more details, see our internal documentation for the patch policy and processes for |
This PR updates oclif and related plugins to their latest versions: - Update @oclif/core from ^4.0.30 to ^4.8.0 - Update oclif from ^4.15.16 to ^4.22.50 - Update @oclif/plugin-autocomplete from ^3.2.7 to ^3.2.39 - Update @oclif/plugin-commands from ^4.1.5 to ^4.1.38 - Update @oclif/plugin-help from ^6.2.16 to ^6.2.36 - Update @oclif/plugin-not-found from ^3.2.24 to ^3.2.73 - Update @oclif/test from ^4.1.0 to ^4.1.15
Commands used: ``` pnpm exec flub typetests -g client --reset --normalize --previous pnpm install --no-frozen-lockfile pnpm run build ```
…#25923) The RegEx used to implement this rule was overly permissive and yielded lots of false positives. This PR updates the rule to leverage the TSDoc parser directly to extract block tags/comments and evaluate them explicitly. Unfortunately, this makes it harder to implement auto-fix behavior, so that has been removed. [AB#50920](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/50920)
…t#25663) Updates @typescript-eslint packages from v7 to v8 with necessary rule migrations and configuration adjustments. ## Changes - Update @typescript-eslint/eslint-plugin and @typescript-eslint/parser to v8 - Migrate rule: `no-throw-literal` → `only-throw-error` - Remove deprecated and deleted rules: `ban-types`, `no-empty-interface`, and others - I removed all typescript-eslint rules that are deleted or deprecated. This resulted in some trivial changes to the config of some rules (rulesets often keep the old, even deleted, rules around for awhile "just in case" -- they just set them to "off" -- so we'll still see them in the printed configs). - Update codebase for new rule requirements (explicit returns, type annotations) ## Test plan - CI passes with updated ESLint configuration - All lint errors resolved across codebase
The APIs neede to enable incremental summary have been tagged as @ alpha so that they can be used by applications. The list of APIs that are marked @ alpha: - `configuredSharedTreeAlpha` - This is a new API which is similar to `configuredSharedTreeBeta` but has a couple more options exposed for configuring incremental summaries. - `SharedTreeOptionsAlpha` - Extension of `SharedTreeOptionsBeta` that includes options to enable incremental summarization. - `IncrementalEncodingPolicy` - Policy type to determine whether a node / field should be incrementally encoded. - `incrementalEncodingPolicyForAllowedTypes` - This function returns an `IncrementalEncodingPolicy` which will determine if `AllowedTypes` are opted into incremental summarization. - `incrementalSummaryHint` - This is a symbol that should be put in the metadata property of `AllowedTypes` to opt-in these types to be incrementally summarized. [AB#54252](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/54252) [AB#46028](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/46028)
## Description There are several locations that we need/want to use `StageTrace`. It should live in a shared location to facilitate that. This takes the move from microsoft#25643 into its own PR. ## Breaking Changes Not technically breaking: moves internal `StageTrace` API from Nexus and R11s-base utils into `services-core` ## Reviewer Guidance I'm open to moving this to `services-client`, but I think this is fine.
…osoft#25927) The standard clear event has the below limitation. It does not tell you which subdirectory was cleared. - It's emitted on the root SharedDirectory for all clear operations - But it does NOT include the path of which directory was cleared The event only provides: - local: Whether it was a local or remote operation - target: SharedDirectory itself This limitation came to notice while adding event testing for directory: microsoft#25477. The oracle needs to track the state of every directory in the tree (root and all subdirectories). When a clear operation happens: - Without path information: The oracle would have to clear ALL directories in its model, even though only one specific directory was cleared - Can't distinguish: A clear on /subdir1 vs /subdir2 vs root (/) would all look the same This change adds a new event `clearInternal` which takes in the absolute path and it is marked as internal. [AB#54326](https://dev.azure.com/fluidframework/internal/_workitems/edit/54326)
…ithRetries (microsoft#26094) ## Description Fixes a bug where `loadSummarizerContainerAndMakeSummary` wasn't propagating the `fullTree` flag to `trySummarizeWithRetries`, causing incremental summaries to always be generated even when full tree summaries were requested via the `Fluid.Summarizer.FullTree.OnDemand` config flag. In`trySummarizeWithRetries` we hardcode `fullTree: false`, so this meant the `fullTree` option was silently ignored when retry logic was enabled. ## Solution - Added `summarizeOptions` parameter to `trySummarizeWithRetries` to accept the caller's options - Added `summarizeOptions` parameter to `summarizeOnDemandWithRetries` to pass through options - Updated `summarizeOnDemand` to pass `summarizeOptions` when calling `summarizeOnDemandWithRetries` ## Testing Added telemetry verification to existing e2e tests to validate that: - `fullTree` is `false` in `Summarize_generate` telemetry when config is not set - `fullTree` is `true` in `Summarize_generate` telemetry when `Fluid.Summarizer.FullTree.OnDemand` config is enabled
…t#26097) These new restrictions insulate branches and their dependents from experiencing incomplete transaction changes. This is important because incomplete transaction changes may not uphold application invariants. ## Breaking Changes This breaking change only affects the behavior of `TreeBranch` methods (currently released as beta). These changes will be released in the next release (2.80) which allows breaking changes to beta APIs. * Invoking `TreeBranch.fork()` now throws an error if a transaction is ongoing on the branch. * Invoking `TreeBranch.merge(sourceBranch)` now throws an error if a transaction is ongoing on the source branch. * Invoking `TreeBranch.rebaseOnto(targetBranch)` now throws an error if a transaction is ongoing on the target branch. --------- Co-authored-by: Copilot <[email protected]>
…#26088) ## Context Revision tags are used in two places: 1. On commit objects (`GraphCommit.revision`) to give the commit a unique ID 2. In the changeset data for a given commit, including in IDs identify subtrees that are detached by the changeset (`ChangeAtomId.revision`) There is a general expectation that if a commit has a given revision `foo`, then the change atom IDs in the changeset for that commit will also utilize revision `foo` for describing changes/entities (e.g., detached subtrees) brought about by the changeset. This correspondence between commit ID and changeset IDs is leveraged when garbage-collecting detached subtrees: once the graph commit with revision `foo` falls outside the collaboration window (and some other conditions are met), the `DetachedFieldIndex` (which tracks detached subtrees) garbage-collects all detached subtrees that are associated with revision `foo`. Transactions present a challenge because the changesets produced for the individual edits that make up the transactions are first housed within individual commits (all with their own revision IDs) then composed under a single commit (with its own revision). ## Before This Change Before this PR, the commits that represent the edits that make up the transaction would be produced like normal (non-transaction commits): each edit would be represented by one commit with its own ID and the changeset in that commit would use that ID. This then forced us to do two things when the transaction was committed and a composed changeset with a new commit ID was produced: 1. Update the composed changeset so that its IDs used the same revision tags as the commit object for the whole transaction. 2. Tell the `DetachedFieldIndex` to update all the IDs associated with each of the individual composed commits so that they instead refer to the final transaction commit ID. IOW, we started with individual commits like this: `[{ revision: "bar", changeset: [{id: "bar"}]}, { revision: "baz", changeset: [{ id: "baz"}]}]` then composed them into this: `{ revision: "foo", changeset: [{ id: "bar"}, { id: "baz" }]}` then updated the changeset IDs to get this: `{ revision: "foo", changeset: [{ id: "foo"}, { id: "foo" }]}` ## After This Change After this change, we start with individual commits like this: `[{ revision: "foo", changeset: [{id: "foo"}]}, { revision: "foo", changeset: [{ id: "foo"}]}]` then compose them into this: `{ revision: "foo", changeset: [{ id: "foo"}, { id: "foo" }]}` ## Motivation * The new approach does not require the corrective steps 1 and 2 from the old approach. * Fewer revision tags are minted (because we no longer mint a tag for each transaction step) More generally, ensuring that IDs are adjusted before the changes applied is better for supporting future features like merging another branch in an open transaction and reverting edits in an open transaction. This is because such changesets come with local IDs that may collide with the ones used in the other transaction steps' changesets, thus requiring a more complex ID replacement mechanism. The new approach means that only the revision-replacing code (which will need to be used for such cases) needs to have this more complex logic, whereas the old approach would have required all entities that use these IDs (at least `DetachedFieldIndex`, maybe more in the future) to adopt this more complex logic. In other words, by making the ID substitution before other components/subsystems take a dependency on them, these other components can remain oblivious to it. ## Noteworthy Implications Before this change, the `GraphCommit`s on a single branch all had unique revision tags. This is still true outside of transactions but is no longer true in general because all the commits in a transaction now have the same revision (the revision of the transaction). This does not affect existing logic outside the transaction code. ## Breaking Changes None. Some snapshot files had to be updated because the number of revisions minted has changed: a single revision is now minted for the whole transaction as opposed to one per step + one for the overall transaction. This does not affect compatibility.
## Description This PR adds one option to track socket io sockets by using socket io room feature. Instead of adding socket object to internal map, it makes sockets to join another unique room for later operations. It helps with some AFR improvements in token reovcation and draining. The change is controlled by a flag: useSocketIoRoomFeature Changes include: 1. Add logic to add socket to a room in tracking 1. Remove deprecated code 1. Add customization to set up socket io server in web socket server setup ## Breaking Changes None --------- Co-authored-by: Yunho <[email protected]> Co-authored-by: Yunho <[email protected]>
… deps (microsoft#26016)" (microsoft#26101) This slightly reverts commit 7d88924 by restoring client root dev dependency on `type-fest` that is required by imports of `@fluidframework/build-tools` but is not declared as a regular dependency.
) This bug was discovered while adding an oracle for directory. The events are being emitted for disposed or unreachable directory and subdirectories. To fix this, I added the `isNotDisposedAndReachable` check. When processing remote operations (set, delete, clear), we need to decide whether to emit events. However, there's a timing window issue: 1. User calls deleteSubDirectory("foo") locally 2. A pending delete is added, but disposed stays false 3. The directory won't be fully disposed until the delete op is sequenced 4. During this window, the directory is invisible in the optimistic view but not yet disposed 5. Just checking !this.disposed would be incorrect because: - The directory might have a pending delete → should NOT emit events - An ancestor might have a pending delete → directory is unreachable → should NOT emit events The below two conditions are needed: - `!this.disposed`: Directory itself isn't fully deleted - `getWorkingDirectory !== undefined`: Directory is reachable (no pending ancestor deletes) [ADO#54749](https://dev.azure.com/fluidframework/internal/_workitems/edit/54749)
…ar locally (microsoft#26102) Remote ops emit valueChanged ops for deleted keys. This change adds the same behavior for local ops. [ADO#55457](https://dev.azure.com/fluidframework/internal/_workitems/edit/55457)
## Description Portion of microsoft#25597 to expose `container.uploadBlob` via OdspClient's OdspFluidContainer. ## Reviewer Guidance Advice on tests/docs necessary to alter the beta API in this way would be appreciated.
according to actual Audience behavior. [AB#56268](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/56268) Pay attention to connectivity only while self-client is a member of the [Signal-based] Audience. Attendee status can only be properly represented while self client is a member of the audience. Otherwise, audience might be in the process of refreshing. Also fix [AB#56270](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/56270) - PresenceDatastoreManager check for alternateProvider (alternate primary join provider nomination) such that Join signal is actually deferred (improving overall Join performance) until self is known in audience. Relocate "joined" sense to PresenceManager - Move and simplify logic (from PresenceDatastoreManager) to handle Join timing. SystemWorkspace (that manages Attendees) should be coordinated as-well; so, keep all of the logic for when to Join in PresenceManager. - Now self-Attendee status should reflect when Presence as a whole thinks it has joined. Future: self-Attendee connect event "attendeeConnected" should be announced. Add a container-runtime test option to disable Summarizer such that Presence multi-client tests are more efficient and reliable (no Summarizer needed).
…Core (microsoft#26113) ## Summary - Fixes error "Internal error: calling method before _details is initialized!" thrown when `disconnectCore` is called before the connection handshake completes - Added `this.hasDetails` check before accessing `this.clientId` in `R11sDocumentDeltaConnection.disconnectCore` ## Problem When `disconnectCore` is called before `initialize` completes (e.g., connection timeout, connect_error), `_details` is undefined. The `clientId` getter accesses `details`, which throws if `_details` is not initialized. This prevents proper socket disconnect and causes telemetry errors. ## Solution Check `this.hasDetails` (a protected getter in the base class) before accessing `this.clientId`. If the handshake never completed, we skip the `client_disconnect` emit—which is appropriate since there's no clientId to report anyway. [AB#56336](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/56336)
…microsoft#26118) Packages that re-export type-fest types in their public API need type-fest as a production dependency, not a dev dependency. ## Changes - **build-infrastructure**: exports `Opaque`, `PackageJson`, `SetRequired` from type-fest in its public API - **build-tools**: exports `PackageJson` which uses `SetRequired` from type-fest This ensures consumers of these packages have access to the type-fest types at compile time.
…26108) Enable the unicorn/explicit-length-check ESLint rule in the @fluidframework/tree package. This is part of an ongoing effort to incrementally remove global ESLint rule overrides from eslint.config.mts and .eslintrc.cjs. This rule enforces more explicit and readable length/size checks by standardizing: - length !== 0 → length > 0 (checking for non-empty) - length >= 1 → length > 0 (checking for non-empty) - length < 1 → length === 0 (checking for empty)
…#26114) Removes multiple unicorn/prefer-* rule overrides from the @fluidframework/tree package and fixes the resulting errors. This PR enables the following ESLint rules by fixing all violations: - prefer-string-slice: Replace substring() with slice() - prefer-native-coercion-functions: Use String/Number directly instead of wrapper arrows - prefer-array-some: Replace .find() !== undefined and .findIndex() !== -1 with .some() - prefer-set-has: Use Set.has() for repeated membership checks - prefer-default-parameters: Use default parameter syntax instead of || fallbacks - prefer-array-index-of: Replace .findIndex(x => x === val) with .indexOf(val) This is part of an ongoing effort to incrementally remove global ESLint rule overrides from eslint.config.mts and .eslintrc.cjs. | Override Name | Errors Fixed | Files Touched | Overrides Still Required | |---------------|--------------|---------------|--------------------------| | `unicorn/prefer-string-slice` | 6 | 3 | 0 | | `unicorn/prefer-native-coercion-functions` | 3 | 1 | 0 | | `unicorn/prefer-array-some` | 3 | 3 | 0 | | `unicorn/prefer-dom-node-remove` | 0 | 2 | 2 (inline) | | `unicorn/prefer-set-has` | 1 | 1 | 0 | | `unicorn/prefer-default-parameters` | 1 | 1 | 0 | | `unicorn/prefer-math-trunc` | 0 | 0 | 0 | | `unicorn/prefer-array-index-of` | 1 | 1 | 0 |
…crosoft#26115) Removes the unicorn/no-lonely-if: off override from the @fluidframework/tree package and fixes the resulting errors. Combines nested if statements that are the only statement in their parent if block (without an else) into single conditions using &&. This is part of an ongoing effort to incrementally remove global ESLint rule overrides from eslint.config.mts and .eslintrc.cjs. All fixes follow the same pattern - combining nested conditions with &&:
…6109) Removes the unicorn/prefer-spread: off override from the @fluidframework/tree package and fixes the resulting errors. Replace Array.from(), Array.slice(), and Array.concat() calls with spread syntax to comply with the unicorn/prefer-spread ESLint rule. This is part of an ongoing effort to incrementally remove global ESLint rule overrides from eslint.config.mts and .eslintrc.cjs. **ESLint Disable Overrides:** In src/test/simple-tree/list.spec.ts, five instances required inline eslint-disable-next-line comments: - concat() method tests (3 occurrences): These tests specifically verify concat() behavior with proxy arrays and spreadability - converting them would defeat the test purpose. - reduce()/reduceRight() callbacks (2 occurrences): concat() preserves TypeScript type inference better than spread in this context, avoiding @typescript-eslint/no-unsafe-return errors.
This partially reverts "build: streamline by removing unneeded build deps (microsoft#25733)" (commit ee07c75). It lets "compile" task only depend on ancestor "api" and preserves the commented out line removal. To make the build more efficient, API entrypoint generation should be made distinct from api-extractor reports.
…26106) ## Description This PR addresses two limitations of the current revision replacement capabilities: 1. The inability to handle inputs where the same `localId` value is used in the context of different revisions. 2. The inability to map the same `ChangeAtomId` input value to the same `ChangeAtomId` output value across multiple modular changesets. See the new tests in src/test/shared-tree/sharedTreeChangeFamily.spec.ts for more details on the relevant scenarios. ## Motivation Both limitations need to be addressed in order for merging and reverting to be supported within open transactions. ## Breaking Changes None --------- Co-authored-by: daesunp <[email protected]>
…26122) Removes the unicorn/no-negated-condition: off override from the @fluidframework/tree package and fixes the resulting errors. Refactors negated conditions to use positive conditions with swapped branches. This is part of an ongoing effort to incrementally remove global ESLint rule overrides from eslint.config.mts and .eslintrc.cjs. No inline overrides needed. Changes include: - x !== undefined ? valueA : valueB + x === undefined ? valueB : valueA - !isValid(x) ? defaultValue : x + isValid(x) ? x : defaultValue - if (!condition) { doA(); } else { doB(); } + if (condition) { doB(); } else { doA(); } - if (x !== y) { doA(); } else { doB(); } + if (x === y) { doB(); } else { doA(); } Some changes had nested negated conditions that needed multiple swaps.
…n receiving ops (microsoft#26099) Added validation that the clientSequenceNumbers for a given client are always increasing. Currently, if the clientSequenceNumber for a client is repeated (say, the same op is sequenced twice by the service), it doesn't fail when the op is received in delta manager. It instead fails later when the op is processed for consumption. For exampls, we have been seeing failures with assert 0x645 which is thrown by id compressor when it sees these duplicate ops. With this validation, these failures should be deteced as soon as the op is received by the delta manager with a much clear data corruption error because the document is corrupted in these scenarios. [AB#53297](https://dev.azure.com/fluidframework/235294da-091d-4c29-84fc-cdfc3d90890b/_workitems/edit/53297)
Generates release notes and changelogs for the 2.80.0 release.
## Problem The `glob.IOptions` type is exported in the public API of build-tools, so the types need to be a prod dep, not a devDep.
This change implements the No Change constraint in SharedTree for the table support effort. To implement this constraint, we: 1 - Added a new EncodedModularChangesetV2 type i - This also required us to refactor EncodedModularChangeset by renaming it to EncodedModularChangesetV1 and exporting a couple more types from that file for reuse by EncodedModularChangesetV2 ii - Lightly refactored modular changeset codec to handle codec versions iii - Created new versions for related codecs to use the new encoded modular changeset 2 - Added a new TransactionConstraint, named NoChangeConstraint, to the public API i - Since the new constraint is an alpha API, we couldn't union it directly onto the preexisting TransactionConstraint type (which is public), this PR adds a new TransactionConstraintAlpha type which includes NoChangeConstraint ii - Update SharedTree alpha APIs which used to use TransactionConstraints use TransactionConstraintAlpha --------- Co-authored-by: yann-achard-MS <[email protected]>
2e62038 to
862896d
Compare
|
🔗 No broken links found! ✅ Your attention to detail is admirable. linkcheck output |
Bumps the version to the next patch version.