Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/humble-pants-love.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@fluidframework/presence": minor
"__section": feature
---
presence API set now at public support level

All `@fluidframework/presence` APIs that had been `@beta` have been promoted to `@public` support with the exception of `getPresence` which is being relocated.

Check warning on line 7 in .changeset/humble-pants-love.md

View workflow job for this annotation

GitHub Actions / vale

[vale] reported by reviewdog 🐶 [Microsoft.Wordiness] Consider using 'except for' instead of 'with the exception of'. Raw Output: {"message": "[Microsoft.Wordiness] Consider using 'except for' instead of 'with the exception of'.", "location": {"path": ".changeset/humble-pants-love.md", "range": {"start": {"line": 7, "column": 99}}}, "severity": "INFO"}
Copy link

Copilot AI Apr 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The changeset text says getPresence "is being relocated", but in this PR it’s still imported from @fluidframework/presence/beta in multiple places. Consider clarifying the wording (e.g. that getPresence remains on the /beta entrypoint for now and will move in a follow-up) to avoid implying the relocation is already complete.

Suggested change
All `@fluidframework/presence` APIs that had been `@beta` have been promoted to `@public` support with the exception of `getPresence` which is being relocated.
All `@fluidframework/presence` APIs that had been `@beta` have been promoted to `@public` support with the exception of `getPresence`, which remains on the `/beta` entrypoint for now and will be relocated in a follow-up.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will leave as is for now - it depends on what order PRs are completed in. #26399 does the relocation. Ideally both happen in the same release.

4 changes: 2 additions & 2 deletions docs/docs/build/presence.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ function usePresence(container: IFluidContainer): void {
#### Schema Definition and Workspace

```typescript
import type { Latest, LatestMap, Presence, StatesWorkspaceSchema } from "@fluidframework/presence/beta";
import { StateFactory } from "@fluidframework/presence/beta";
import type { Latest, LatestMap, Presence, StatesWorkspaceSchema } from "@fluidframework/presence";
import { StateFactory } from "@fluidframework/presence";

interface PointXY { x: number; y: number }

Expand Down
9 changes: 2 additions & 7 deletions examples/apps/presence-tracker/src/FocusTracker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,8 @@

import { TypedEventEmitter } from "@fluid-internal/client-utils";
import type { IEvent } from "@fluidframework/core-interfaces";
import type {
Attendee,
LatestRaw,
Presence,
StatesWorkspace,
} from "@fluidframework/presence/beta";
import { AttendeeStatus, StateFactory } from "@fluidframework/presence/beta";
import type { Attendee, LatestRaw, Presence, StatesWorkspace } from "@fluidframework/presence";
import { AttendeeStatus, StateFactory } from "@fluidframework/presence";

/**
* IFocusState is the data that individual session clients share via presence.
Expand Down
9 changes: 2 additions & 7 deletions examples/apps/presence-tracker/src/MouseTracker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,8 @@

import { TypedEventEmitter } from "@fluid-internal/client-utils";
import type { IEvent } from "@fluidframework/core-interfaces";
import type {
Presence,
Attendee,
LatestRaw,
StatesWorkspace,
} from "@fluidframework/presence/beta";
import { AttendeeStatus, StateFactory } from "@fluidframework/presence/beta";
import type { Presence, Attendee, LatestRaw, StatesWorkspace } from "@fluidframework/presence";
import { AttendeeStatus, StateFactory } from "@fluidframework/presence";

/**
* IMousePosition is the data that individual session clients share via presence.
Expand Down
7 changes: 2 additions & 5 deletions examples/apps/presence-tracker/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@
* Licensed under the MIT License.
*/

import {
getPresence,
type AttendeeId,
type AttendeeStatus,
} from "@fluidframework/presence/beta";
import type { AttendeeId, AttendeeStatus } from "@fluidframework/presence";
import { getPresence } from "@fluidframework/presence/beta";
import { TinyliciousClient } from "@fluidframework/tinylicious-client";
import type { ContainerSchema, IFluidContainer } from "fluid-framework";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
StateFactory,
type StatesWorkspace,
type StatesWorkspaceSchema,
} from "@fluidframework/presence/beta";
} from "@fluidframework/presence";

import type { DieValue } from "./controller.js";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/

import type { AzureMember, IAzureAudience } from "@fluidframework/azure-client";
import type { LatestRaw, Presence } from "@fluidframework/presence/beta";
import type { LatestRaw, Presence } from "@fluidframework/presence";

import type { IDiceRollerController } from "./controller.js";
import type { ICustomUserDetails } from "./fluid.js";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

```ts

// @public
export class BrandedType<out Brand> {
static [Symbol.hasInstance](value: never): value is never;
protected constructor();
protected readonly brand: (dummy: never) => Brand;
}

// @public
export type ConfigTypes = string | number | boolean | number[] | string[] | boolean[] | undefined;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

```ts

// @beta
// @public
export class BrandedType<out Brand> {
static [Symbol.hasInstance](value: never): value is never;
protected constructor();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

```ts

// @beta
// @public
export class BrandedType<out Brand> {
static [Symbol.hasInstance](value: never): value is never;
protected constructor();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

```ts

// @public
export class BrandedType<out Brand> {
static [Symbol.hasInstance](value: never): value is never;
protected constructor();
protected readonly brand: (dummy: never) => Brand;
}

// @public
export type ConfigTypes = string | number | boolean | number[] | string[] | boolean[] | undefined;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

```ts

// @public
export class BrandedType<out Brand> {
static [Symbol.hasInstance](value: never): value is never;
protected constructor();
protected readonly brand: (dummy: never) => Brand;
}

// @public
export type ConfigTypes = string | number | boolean | number[] | string[] | boolean[] | undefined;

Expand Down
2 changes: 1 addition & 1 deletion packages/common/core-interfaces/src/brandedType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
* }
* ```
*
* @beta
* @public
*/
export declare class BrandedType<out Brand> {
/**
Expand Down
6 changes: 3 additions & 3 deletions packages/common/core-interfaces/src/deepReadonly.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import type {
* @privateRemarks
* WeakRef should be added when lib is updated to ES2021 or later.
*
* @beta
* @public
* @system
*/
export type DeepReadonlySupportedGenericsDefault =
Expand All @@ -29,7 +29,7 @@ export type DeepReadonlySupportedGenericsDefault =
/**
* Options for {@link DeepReadonly}.
*
* @beta
* @public
*/
export interface DeepReadonlyOptions {
/**
Expand Down Expand Up @@ -58,7 +58,7 @@ export interface DeepReadonlyOptions {
* {@link DeepReadonlySupportedGenericsDefault} for generics that have
* immutability applied to generic type by default.
*
* @beta
* @public
*/
export type DeepReadonly<
T,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const RecursionMarkerSymbol: unique symbol = Symbol("recursion here");
* @privateRemarks
* WeakRef should be added when lib is updated to ES2021 or later.
*
* @beta
* @public
*/
export type ReadonlySupportedGenerics =
| IFluidHandle
Expand All @@ -46,7 +46,7 @@ export type ReadonlySupportedGenerics =
* depth limit when a recursive type is found. Use of `0` will stop applying
* `DeepReadonly` at the first point recursion is detected.
*
* @beta
* @public
* @system
*/
export type DeepReadonlyRecursionLimit = "NoLimit" | 0 | `+${string}`;
Expand All @@ -67,7 +67,7 @@ export type DeepReadonlyRecursionLimit = "NoLimit" | 0 | `+${string}`;
* exported anyway. All in namespace are left exported to avoid api-extractor
* potentially failing to validate other modules correctly.
*
* @beta
* @public
* @system
*/
// eslint-disable-next-line @typescript-eslint/no-namespace
Expand Down
4 changes: 2 additions & 2 deletions packages/common/core-interfaces/src/jsonDeserialized.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import type { InternalUtilityTypes } from "./exposedInternalUtilityTypes.js";
/**
* Options for {@link JsonDeserialized}.
*
* @beta
* @public
*/
export interface JsonDeserializedOptions {
/**
Expand Down Expand Up @@ -107,7 +107,7 @@ export interface JsonDeserializedOptions {
* function foo<T>(): JsonDeserialized<T> { ... }
* ```
*
* @beta
* @public
*/
export type JsonDeserialized<
T,
Expand Down
4 changes: 2 additions & 2 deletions packages/common/core-interfaces/src/jsonSerializable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import type { InternalUtilityTypes } from "./exposedInternalUtilityTypes.js";
/**
* Options for {@link JsonSerializable}.
*
* @beta
* @public
*/
export interface JsonSerializableOptions {
/**
Expand Down Expand Up @@ -130,7 +130,7 @@ export interface JsonSerializableOptions {
* proper use, that will never be an issue as any filtering of types will happen
* before T recursion.
*
* @beta
* @public
*/
export type JsonSerializable<
T,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* @privateRemarks type is used over interface; so inspection of type
* result can be more informative than just the type name.
*
* @beta
* @public
* @system
*/
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
Expand All @@ -25,7 +25,7 @@ export type SerializationErrorPerUndefinedArrayElement = {
* @privateRemarks type is used over interface; so inspection of type
* result can be more informative than just the type name.
*
* @beta
* @public
* @system
*/
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
Expand Down
6 changes: 3 additions & 3 deletions packages/common/core-interfaces/src/jsonType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* Prefer using `JsonSerializable<unknown>` or `JsonDeserialized<unknown>` over this type that
* is an implementation detail.
*
* @beta
* @public
*/
export type JsonTypeWith<T> =
// eslint-disable-next-line @rushstack/no-new-null
Expand All @@ -30,7 +30,7 @@ export type JsonTypeWith<T> =
/**
* Portion of {@link JsonTypeWith} that is an object (including array) and not null.
*
* @beta
* @public
*/
export type NonNullJsonObjectWith<T> =
| { [key: string | number]: JsonTypeWith<T> }
Expand All @@ -51,7 +51,7 @@ export type NonNullJsonObjectWith<T> =
* ```
* does not prevent later `x = 5`. (Does prevent `x.a = 2`.)
*
* @beta
* @public
*/
export type ReadonlyJsonTypeWith<TReadonlyAlternates> =
// eslint-disable-next-line @rushstack/no-new-null
Expand Down
4 changes: 2 additions & 2 deletions packages/common/core-interfaces/src/opaqueJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { BrandedType } from "./brandedType.js";
* be read.
*
* @sealed
* @beta
* @public
*/
export declare class OpaqueJsonDeserialized<
T,
Expand Down Expand Up @@ -59,7 +59,7 @@ export declare class OpaqueJsonDeserialized<
* when "instance" will be forwarded along.
*
* @sealed
* @beta
* @public
*/
export declare class OpaqueJsonSerializable<
T,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* Licensed under the MIT License.
*/

import type { BrandedType } from "@fluidframework/core-interfaces/internal";
import type { BrandedType } from "@fluidframework/core-interfaces";

import { createInstanceOf } from "./testUtils.js";
import type { BrandedString } from "./testValues.js";
Expand Down
Loading
Loading