diff --git a/packages/common/container-definitions/api-report/container-definitions.api.md b/packages/common/container-definitions/api-report/container-definitions.api.md index c944d5611f6e..b95c56b4c83a 100644 --- a/packages/common/container-definitions/api-report/container-definitions.api.md +++ b/packages/common/container-definitions/api-report/container-definitions.api.md @@ -204,7 +204,7 @@ export interface IContainerContext { // @deprecated (undocumented) readonly submitFn: (type: MessageType, contents: any, batch: boolean, appData?: any) => number; // (undocumented) - readonly submitSignalFn: (contents: any) => void; + readonly submitSignalFn: (contents: any, targetClientId?: string) => void; // (undocumented) readonly submitSummaryFn: (summaryOp: ISummaryContent, referenceSequenceNumber?: number) => number; // (undocumented) @@ -260,7 +260,7 @@ export interface IDeltaManager extends IEventProvider // (undocumented) readonly readOnlyInfo: ReadOnlyInfo; readonly serviceConfiguration: IClientConfiguration | undefined; - submitSignal(content: any): void; + submitSignal(content: any, targetClientId?: string): void; readonly version: string; } diff --git a/packages/common/container-definitions/src/deltas.ts b/packages/common/container-definitions/src/deltas.ts index 845078dab3df..0624c352f7ff 100644 --- a/packages/common/container-definitions/src/deltas.ts +++ b/packages/common/container-definitions/src/deltas.ts @@ -216,7 +216,7 @@ export interface IDeltaManager extends IEventProvider */ // TODO: use `unknown` instead (API breaking) // eslint-disable-next-line @typescript-eslint/no-explicit-any - submitSignal(content: any): void; + submitSignal(content: any, targetClientId?: string): void; } /** diff --git a/packages/common/container-definitions/src/runtime.ts b/packages/common/container-definitions/src/runtime.ts index 2c9e78bcaeb2..8b460f0fa2b2 100644 --- a/packages/common/container-definitions/src/runtime.ts +++ b/packages/common/container-definitions/src/runtime.ts @@ -165,7 +165,7 @@ export interface IContainerContext { ) => number; // TODO: use `unknown` instead (API breaking) // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly submitSignalFn: (contents: any) => void; + readonly submitSignalFn: (contents: any, targetClientId?: string) => void; readonly disposeFn?: (error?: ICriticalContainerError) => void; readonly closeFn: (error?: ICriticalContainerError) => void; readonly deltaManager: IDeltaManager; diff --git a/packages/common/driver-definitions/api-report/driver-definitions.api.md b/packages/common/driver-definitions/api-report/driver-definitions.api.md index c08136b414c1..0b45c49399d8 100644 --- a/packages/common/driver-definitions/api-report/driver-definitions.api.md +++ b/packages/common/driver-definitions/api-report/driver-definitions.api.md @@ -147,7 +147,7 @@ export interface IDocumentDeltaConnection extends IDisposable, IEventProvider this.submitBatch(batch, referenceSequenceNumber), - (message) => this.submitSignal(message), + (content, targetClientId) => this.submitSignal(content, targetClientId), (error?: ICriticalContainerError) => this.dispose(error), (error?: ICriticalContainerError) => this.close(error), this.updateDirtyContainerState, diff --git a/packages/loader/container-loader/src/containerContext.ts b/packages/loader/container-loader/src/containerContext.ts index 41a9fc0efa56..16927ad4145a 100644 --- a/packages/loader/container-loader/src/containerContext.ts +++ b/packages/loader/container-loader/src/containerContext.ts @@ -85,7 +85,7 @@ export class ContainerContext implements IContainerContext { batch: IBatchMessage[], referenceSequenceNumber?: number, ) => number, - public readonly submitSignalFn: (contents: any) => void, + public readonly submitSignalFn: (content: any, targetClientId?: string) => void, public readonly disposeFn: (error?: ICriticalContainerError) => void, public readonly closeFn: (error?: ICriticalContainerError) => void, public readonly updateDirtyContainerState: (dirty: boolean) => void, diff --git a/packages/loader/container-loader/src/contracts.ts b/packages/loader/container-loader/src/contracts.ts index d4c531a81834..8be141784255 100644 --- a/packages/loader/container-loader/src/contracts.ts +++ b/packages/loader/container-loader/src/contracts.ts @@ -100,7 +100,7 @@ export interface IConnectionManager { * Submits signal to relay service. * Called only when active connection is present. */ - submitSignal(content: any): void; + submitSignal(content: any, targetClientId?: string): void; /** * Submits messages to relay service. diff --git a/packages/loader/container-loader/src/deltaManager.ts b/packages/loader/container-loader/src/deltaManager.ts index c66def1a1263..1c5904dab4db 100644 --- a/packages/loader/container-loader/src/deltaManager.ts +++ b/packages/loader/container-loader/src/deltaManager.ts @@ -301,8 +301,8 @@ export class DeltaManager return message.clientSequenceNumber; } - public submitSignal(content: any) { - return this.connectionManager.submitSignal(content); + public submitSignal(content: any, targetClientId?: string) { + return this.connectionManager.submitSignal(content, targetClientId); } public flush() { diff --git a/packages/runtime/container-runtime/api-report/container-runtime.api.md b/packages/runtime/container-runtime/api-report/container-runtime.api.md index d45941ca61c7..b85b98d8cfff 100644 --- a/packages/runtime/container-runtime/api-report/container-runtime.api.md +++ b/packages/runtime/container-runtime/api-report/container-runtime.api.md @@ -212,9 +212,8 @@ export class ContainerRuntime extends TypedEventEmitter; summarize(options: { fullTree?: boolean; diff --git a/packages/runtime/container-runtime/src/containerRuntime.ts b/packages/runtime/container-runtime/src/containerRuntime.ts index 121f5e7194ec..48db350dae7f 100644 --- a/packages/runtime/container-runtime/src/containerRuntime.ts +++ b/packages/runtime/container-runtime/src/containerRuntime.ts @@ -989,7 +989,7 @@ export class ContainerRuntime summaryOp: ISummaryContent, referenceSequenceNumber?: number, ) => number; - private readonly submitSignalFn: (contents: any) => void; + private readonly submitSignalFn: (content: any, targetClientId?: string) => void; public readonly disposeFn: (error?: ICriticalContainerError) => void; public readonly closeFn: (error?: ICriticalContainerError) => void; @@ -2664,16 +2664,28 @@ export class ContainerRuntime * Submits the signal to be sent to other clients. * @param type - Type of the signal. * @param content - Content of the signal. + * @param targetClientId - When specified, the signal is only sent to the provided client id. */ - public submitSignal(type: string, content: any) { + public submitSignal(type: string, content: any, targetClientId?: string) { this.verifyNotClosed(); const envelope = this.createNewSignalEnvelope(undefined /* address */, type, content); - return this.submitSignalFn(envelope); + return this.submitSignalFn(envelope, targetClientId); } - public submitDataStoreSignal(address: string, type: string, content: any) { + /** + * Submits the signal to be sent to other clients. + * @param type - Type of the signal. + * @param content - Content of the signal. + * @param targetClientId - When specified, the signal is only sent to the provided client id. + */ + public submitDataStoreSignal( + address: string, + type: string, + content: any, + targetClientId?: string, + ) { const envelope = this.createNewSignalEnvelope(address, type, content); - return this.submitSignalFn(envelope); + return this.submitSignalFn(envelope, targetClientId); } public setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void { diff --git a/packages/runtime/container-runtime/src/dataStoreContext.ts b/packages/runtime/container-runtime/src/dataStoreContext.ts index 92113724ebb1..f9988bbab20a 100644 --- a/packages/runtime/container-runtime/src/dataStoreContext.ts +++ b/packages/runtime/container-runtime/src/dataStoreContext.ts @@ -721,11 +721,17 @@ export abstract class FluidDataStoreContext } } - public submitSignal(type: string, content: any) { + /** + * Submits the signal to be sent to other clients. + * @param type - Type of the signal. + * @param content - Content of the signal. + * @param targetClientId - When specified, the signal is only sent to the provided client id. + */ + public submitSignal(type: string, content: any, targetClientId?: string) { this.verifyNotClosed("submitSignal"); assert(!!this.channel, 0x147 /* "Channel must exist on submitting signal" */); - return this._containerRuntime.submitDataStoreSignal(this.id, type, content); + return this._containerRuntime.submitDataStoreSignal(this.id, type, content, targetClientId); } /** diff --git a/packages/runtime/container-runtime/src/deltaManagerProxyBase.ts b/packages/runtime/container-runtime/src/deltaManagerProxyBase.ts index ee8baedfafb2..4d98bef92a2a 100644 --- a/packages/runtime/container-runtime/src/deltaManagerProxyBase.ts +++ b/packages/runtime/container-runtime/src/deltaManagerProxyBase.ts @@ -101,8 +101,8 @@ export class DeltaManagerProxyBase super.dispose(); } - public submitSignal(content: any): void { - return this.deltaManager.submitSignal(content); + public submitSignal(content: any, targetClientId?: string): void { + return this.deltaManager.submitSignal(content, targetClientId); } public flush(): void { diff --git a/packages/runtime/datastore-definitions/api-report/datastore-definitions.api.md b/packages/runtime/datastore-definitions/api-report/datastore-definitions.api.md index bbdf8567a75f..252a2b86d56c 100644 --- a/packages/runtime/datastore-definitions/api-report/datastore-definitions.api.md +++ b/packages/runtime/datastore-definitions/api-report/datastore-definitions.api.md @@ -127,7 +127,7 @@ export interface IFluidDataStoreRuntime extends IEventProvider; // (undocumented) readonly rootRoutingContext: IFluidHandleContext; - submitSignal(type: string, content: any): void; + submitSignal(type: string, content: any, targetClientId?: string): void; uploadBlob(blob: ArrayBufferLike, signal?: AbortSignal): Promise>; waitAttached(): Promise; } diff --git a/packages/runtime/datastore-definitions/src/dataStoreRuntime.ts b/packages/runtime/datastore-definitions/src/dataStoreRuntime.ts index 7f15356b6d9c..c4856ae2e63d 100644 --- a/packages/runtime/datastore-definitions/src/dataStoreRuntime.ts +++ b/packages/runtime/datastore-definitions/src/dataStoreRuntime.ts @@ -112,8 +112,9 @@ export interface IFluidDataStoreRuntime * Submits the signal to be sent to other clients. * @param type - Type of the signal. * @param content - Content of the signal. + * @param targetClientId - When specified, the signal is only sent to the provided client id. */ - submitSignal(type: string, content: any): void; + submitSignal(type: string, content: any, targetClientId?: string): void; /** * Returns the current quorum. diff --git a/packages/runtime/datastore/api-report/datastore.api.md b/packages/runtime/datastore/api-report/datastore.api.md index fd6073a27d9c..0b1e27fa9f6d 100644 --- a/packages/runtime/datastore/api-report/datastore.api.md +++ b/packages/runtime/datastore/api-report/datastore.api.md @@ -118,8 +118,7 @@ export class FluidDataStoreRuntime extends TypedEventEmitter; updateUsedRoutes(usedRoutes: string[]): void; // (undocumented) diff --git a/packages/runtime/datastore/src/dataStoreRuntime.ts b/packages/runtime/datastore/src/dataStoreRuntime.ts index cf9daf9ba030..d0d5a3eb6a17 100644 --- a/packages/runtime/datastore/src/dataStoreRuntime.ts +++ b/packages/runtime/datastore/src/dataStoreRuntime.ts @@ -860,9 +860,15 @@ export class FluidDataStoreRuntime this.submit(type, content, localOpMetadata); } - public submitSignal(type: string, content: any) { + /** + * Submits the signal to be sent to other clients. + * @param type - Type of the signal. + * @param content - Content of the signal. + * @param targetClientId - When specified, the signal is only sent to the provided client id. + */ + public submitSignal(type: string, content: any, targetClientId?: string) { this.verifyNotClosed(); - return this.dataStoreContext.submitSignal(type, content); + return this.dataStoreContext.submitSignal(type, content, targetClientId); } /** diff --git a/packages/runtime/runtime-definitions/api-report/runtime-definitions.api.md b/packages/runtime/runtime-definitions/api-report/runtime-definitions.api.md index 519b1471721c..b65a7433e3a0 100644 --- a/packages/runtime/runtime-definitions/api-report/runtime-definitions.api.md +++ b/packages/runtime/runtime-definitions/api-report/runtime-definitions.api.md @@ -266,7 +266,7 @@ export interface IFluidDataStoreContext extends IEventProvider>; } diff --git a/packages/runtime/runtime-definitions/src/dataStoreContext.ts b/packages/runtime/runtime-definitions/src/dataStoreContext.ts index 1353690f32d6..09a73b445e9f 100644 --- a/packages/runtime/runtime-definitions/src/dataStoreContext.ts +++ b/packages/runtime/runtime-definitions/src/dataStoreContext.ts @@ -464,8 +464,9 @@ export interface IFluidDataStoreContext * Submits the signal to be sent to other clients. * @param type - Type of the signal. * @param content - Content of the signal. + * @param targetClientId - When specified, the signal is only sent to the provided client id. */ - submitSignal(type: string, content: any): void; + submitSignal(type: string, content: any, targetClientId?: string): void; /** * Called to make the data store locally visible in the container. This happens automatically for root data stores