@fluid-experimental/data-objects 2.0.0-dev-rc.5.0.0.265721 → 2.0.0-dev-rc.5.0.0.268409

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.
@@ -0,0 +1,17 @@
1
+ ## Alpha API Report File for "@fluid-experimental/data-objects"
2
+
3
+ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
+
5
+ ```ts
6
+
7
+ import { IErrorEvent } from '@fluidframework/core-interfaces';
8
+ import { IEventProvider } from '@fluidframework/core-interfaces';
9
+ import type { IFluidDataStoreFactory } from '@fluidframework/runtime-definitions/internal';
10
+ import { IInboundSignalMessage } from '@fluidframework/runtime-definitions/internal';
11
+ import { Jsonable } from '@fluidframework/datastore-definitions/internal';
12
+ import type { NamedFluidDataStoreRegistryEntry } from '@fluidframework/runtime-definitions/internal';
13
+ import type { SharedObjectKind } from '@fluidframework/shared-object-base';
14
+
15
+ // (No @packageDocumentation comment for this package)
16
+
17
+ ```
@@ -0,0 +1,17 @@
1
+ ## Beta API Report File for "@fluid-experimental/data-objects"
2
+
3
+ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
+
5
+ ```ts
6
+
7
+ import { IErrorEvent } from '@fluidframework/core-interfaces';
8
+ import { IEventProvider } from '@fluidframework/core-interfaces';
9
+ import type { IFluidDataStoreFactory } from '@fluidframework/runtime-definitions/internal';
10
+ import { IInboundSignalMessage } from '@fluidframework/runtime-definitions/internal';
11
+ import { Jsonable } from '@fluidframework/datastore-definitions/internal';
12
+ import type { NamedFluidDataStoreRegistryEntry } from '@fluidframework/runtime-definitions/internal';
13
+ import type { SharedObjectKind } from '@fluidframework/shared-object-base';
14
+
15
+ // (No @packageDocumentation comment for this package)
16
+
17
+ ```
@@ -0,0 +1,17 @@
1
+ ## Public API Report File for "@fluid-experimental/data-objects"
2
+
3
+ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
+
5
+ ```ts
6
+
7
+ import { IErrorEvent } from '@fluidframework/core-interfaces';
8
+ import { IEventProvider } from '@fluidframework/core-interfaces';
9
+ import type { IFluidDataStoreFactory } from '@fluidframework/runtime-definitions/internal';
10
+ import { IInboundSignalMessage } from '@fluidframework/runtime-definitions/internal';
11
+ import { Jsonable } from '@fluidframework/datastore-definitions/internal';
12
+ import type { NamedFluidDataStoreRegistryEntry } from '@fluidframework/runtime-definitions/internal';
13
+ import type { SharedObjectKind } from '@fluidframework/shared-object-base';
14
+
15
+ // (No @packageDocumentation comment for this package)
16
+
17
+ ```
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { EventEmitter } from "@fluid-internal/client-utils";
6
- import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct/internal";
7
- import { IErrorEvent } from "@fluidframework/core-interfaces";
5
+ import { IErrorEvent, type IEventProvider } from "@fluidframework/core-interfaces";
8
6
  import { Jsonable } from "@fluidframework/datastore-definitions/internal";
9
- import { IInboundSignalMessage } from "@fluidframework/runtime-definitions";
7
+ import type { IFluidDataStoreFactory, NamedFluidDataStoreRegistryEntry } from "@fluidframework/runtime-definitions/internal";
8
+ import { IInboundSignalMessage } from "@fluidframework/runtime-definitions/internal";
9
+ import type { SharedObjectKind } from "@fluidframework/shared-object-base";
10
10
  /**
11
11
  * @internal
12
12
  */
@@ -17,7 +17,7 @@ export type SignalListener<T> = (clientId: string, local: boolean, payload: Json
17
17
  * provides explicit methods around signal requests to other connected clients.
18
18
  * @internal
19
19
  */
20
- export interface ISignaler {
20
+ export interface ISignaler extends IEventProvider<IErrorEvent> {
21
21
  /**
22
22
  * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`
23
23
  * method regarding multiple registrations, callback order, etc.
@@ -52,22 +52,15 @@ export interface IRuntimeSignaler {
52
52
  submitSignal(type: string, content: Jsonable<unknown>): void;
53
53
  }
54
54
  /**
55
- * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static
56
- * users to get an ISignaler without a custom DO.
55
+ * Implementation of ISignaler for declarative API.
56
+ * @privateRemarks
57
+ * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.
58
+ * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.
57
59
  * @internal
58
60
  */
59
- export declare class Signaler extends DataObject<{
60
- Events: IErrorEvent;
61
- }> implements EventEmitter, ISignaler {
62
- private _signaler;
63
- private get signaler();
64
- static readonly Name = "@fluid-example/signaler";
65
- static readonly factory: DataObjectFactory<Signaler, {
66
- Events: IErrorEvent;
67
- }>;
68
- protected hasInitialized(): Promise<void>;
69
- onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
70
- offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
71
- submitSignal<T>(signalName: string, payload?: Jsonable<T>): void;
72
- }
61
+ export declare const Signaler: {
62
+ readonly factory: IFluidDataStoreFactory & {
63
+ readonly registryEntry: NamedFluidDataStoreRegistryEntry;
64
+ };
65
+ } & SharedObjectKind<ISignaler>;
73
66
  //# sourceMappingURL=signaler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signaler.d.ts","sourceRoot":"","sources":["../../src/signaler/signaler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAqB,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAM5E;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAE;CAC3D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAAE;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAsED;;;;GAIG;AACH,qBAAa,QACZ,SAAQ,UAAU,CAAC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAC1C,YAAW,YAAY,EAAE,SAAS;IAElC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,KAAK,QAAQ,GAGnB;IAED,gBAAuB,IAAI,6BAA6B;IAExD,gBAAuB,OAAO;gBAXD,WAAW;OAWgD;cAExE,cAAc;IASvB,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS;IAKvE,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS;IAKxE,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;CAGhE"}
1
+ {"version":3,"file":"signaler.d.ts","sourceRoot":"","sources":["../../src/signaler/signaler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC1E,OAAO,KAAK,EACX,sBAAsB,EACtB,gCAAgC,EAChC,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAM3E;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC7D;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAE;CAC3D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAAE;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAkHD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE;IACtB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG;QAC1C,QAAQ,CAAC,aAAa,EAAE,gCAAgC,CAAC;KACzD,CAAC;CACF,GAAG,gBAAgB,CAAC,SAAS,CAAuC,CAAC"}
@@ -68,11 +68,10 @@ class InternalSignaler extends client_utils_1.TypedEventEmitter {
68
68
  }
69
69
  }
70
70
  /**
71
- * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static
72
- * users to get an ISignaler without a custom DO.
73
- * @internal
71
+ * DataObject implementation of ISignaler for fluid-static plug-and-play.
72
+ * Allows fluid-static users to get an ISignaler without a custom DataObject.
74
73
  */
75
- class Signaler extends internal_1.DataObject {
74
+ class SignalerClass extends internal_1.DataObject {
76
75
  get signaler() {
77
76
  (0, internal_2.assert)(this._signaler !== undefined, 0x24b /* "internal signaler should be defined" */);
78
77
  return this._signaler;
@@ -96,7 +95,14 @@ class Signaler extends internal_1.DataObject {
96
95
  this.signaler.submitSignal(signalName, payload);
97
96
  }
98
97
  }
99
- exports.Signaler = Signaler;
100
- Signaler.Name = "@fluid-example/signaler";
101
- Signaler.factory = new internal_1.DataObjectFactory(Signaler.Name, Signaler, [], {});
98
+ SignalerClass.Name = "@fluid-example/signaler";
99
+ SignalerClass.factory = new internal_1.DataObjectFactory(SignalerClass.Name, SignalerClass, [], {});
100
+ /**
101
+ * Implementation of ISignaler for declarative API.
102
+ * @privateRemarks
103
+ * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.
104
+ * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.
105
+ * @internal
106
+ */
107
+ exports.Signaler = (0, internal_1.createDataObjectKind)(SignalerClass);
102
108
  //# sourceMappingURL=signaler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signaler.js","sourceRoot":"","sources":["../../src/signaler/signaler.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 { EventEmitter, TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct/internal\";\nimport { IErrorEvent } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions/internal\";\nimport { IInboundSignalMessage } from \"@fluidframework/runtime-definitions\";\n\n// TODO:\n// add way to mark with current sequence number for ordering signals relative to ops\n// throttling and batching\n\n/**\n * @internal\n */\nexport type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;\n\n/**\n * ISignaler defines an interface for working with signals that is similar to the more common\n * eventing patterns of EventEmitter. In addition to sending and responding to signals, it\n * provides explicit methods around signal requests to other connected clients.\n * @internal\n */\nexport interface ISignaler {\n\t/**\n\t * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n\t * method regarding multiple registrations, callback order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to add\n\t * @returns This ISignaler\n\t */\n\tonSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n\t * `off` method regarding multiple registrations, removal order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to remove\n\t * @returns This ISignaler\n\t */\n\toffSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Send a signal with payload to its connected listeners.\n\t * @param signalName - The name of the signal\n\t * @param payload - The data to send with the signal\n\t */\n\tsubmitSignal<T>(signalName: string, payload?: Jsonable<T>);\n}\n\n/**\n * Duck type of something that provides the expected signalling functionality:\n * A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals\n * @internal\n */\nexport interface IRuntimeSignaler {\n\tconnected: boolean;\n\ton(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n\tsubmitSignal(type: string, content: Jsonable<unknown>): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. InternalSignaler wraps a runtime\n * object with signaling functionality (e.g. ContainerRuntime or FluidDataStoreRuntime) and can\n * then be used in place of the original signaler. It uses a separate internal EventEmitter to\n * manage callbacks, and thus will reflect that behavior with regards to callback registration and\n * deregistration.\n */\nclass InternalSignaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n\tprivate readonly emitter = new EventEmitter();\n\n\tprivate readonly signalerId: string | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * Object to wrap that can submit and listen to signals\n\t\t */\n\t\tprivate readonly signaler: IRuntimeSignaler,\n\t\t/**\n\t\t * Optional id to assign to this manager that will be attached to\n\t\t * signal names. Useful to avoid collisions if there are multiple\n\t\t * signal users at the Container level\n\t\t */\n\t\tsignalerId?: string,\n\t) {\n\t\tsuper();\n\t\tthis.emitter.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t\tthis.signalerId = signalerId ? `#${signalerId}` : undefined;\n\t\tthis.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n\t\t\tconst clientId = message.clientId;\n\t\t\t// Only call listeners when the runtime is connected and if the signal has an\n\t\t\t// identifiable sender clientId. The listener is responsible for deciding how\n\t\t\t// it wants to handle local/remote signals\n\t\t\tif (this.signaler.connected && clientId !== null) {\n\t\t\t\tthis.emitter.emit(message.type, clientId, local, message.content);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getSignalerSignalName(signalName: string): string {\n\t\treturn this.signalerId ? `${signalName}${this.signalerId}` : signalName;\n\t}\n\n\t// ISignaler methods\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.on(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.off(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tif (this.signaler.connected) {\n\t\t\tthis.signaler.submitSignal(signalerSignalName, payload);\n\t\t}\n\t}\n}\n\n/**\n * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static\n * users to get an ISignaler without a custom DO.\n * @internal\n */\nexport class Signaler\n\textends DataObject<{ Events: IErrorEvent }>\n\timplements EventEmitter, ISignaler\n{\n\tprivate _signaler: InternalSignaler | undefined;\n\tprivate get signaler(): InternalSignaler {\n\t\tassert(this._signaler !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n\t\treturn this._signaler;\n\t}\n\n\tpublic static readonly Name = \"@fluid-example/signaler\";\n\n\tpublic static readonly factory = new DataObjectFactory(Signaler.Name, Signaler, [], {});\n\n\tprotected async hasInitialized() {\n\t\tthis._signaler = new InternalSignaler(this.runtime);\n\t\tthis.signaler.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t}\n\n\t// ISignaler methods Note these are all passthroughs\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.onSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.offSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tthis.signaler.submitSignal(signalName, payload);\n\t}\n}\n"]}
1
+ {"version":3,"file":"signaler.js","sourceRoot":"","sources":["../../src/signaler/signaler.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 { EventEmitter, TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tDataObject,\n\tDataObjectFactory,\n\tcreateDataObjectKind,\n} from \"@fluidframework/aqueduct/internal\";\nimport { IErrorEvent, type IEventProvider } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tIFluidDataStoreFactory,\n\tNamedFluidDataStoreRegistryEntry,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { IInboundSignalMessage } from \"@fluidframework/runtime-definitions/internal\";\nimport type { SharedObjectKind } from \"@fluidframework/shared-object-base\";\n\n// TODO:\n// add way to mark with current sequence number for ordering signals relative to ops\n// throttling and batching\n\n/**\n * @internal\n */\nexport type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;\n\n/**\n * ISignaler defines an interface for working with signals that is similar to the more common\n * eventing patterns of EventEmitter. In addition to sending and responding to signals, it\n * provides explicit methods around signal requests to other connected clients.\n * @internal\n */\nexport interface ISignaler extends IEventProvider<IErrorEvent> {\n\t/**\n\t * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n\t * method regarding multiple registrations, callback order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to add\n\t * @returns This ISignaler\n\t */\n\tonSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n\t * `off` method regarding multiple registrations, removal order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to remove\n\t * @returns This ISignaler\n\t */\n\toffSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Send a signal with payload to its connected listeners.\n\t * @param signalName - The name of the signal\n\t * @param payload - The data to send with the signal\n\t */\n\tsubmitSignal<T>(signalName: string, payload?: Jsonable<T>);\n}\n\n/**\n * Duck type of something that provides the expected signalling functionality:\n * A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals\n * @internal\n */\nexport interface IRuntimeSignaler {\n\tconnected: boolean;\n\ton(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n\tsubmitSignal(type: string, content: Jsonable<unknown>): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. InternalSignaler wraps a runtime\n * object with signaling functionality (e.g. ContainerRuntime or FluidDataStoreRuntime) and can\n * then be used in place of the original signaler. It uses a separate internal EventEmitter to\n * manage callbacks, and thus will reflect that behavior with regards to callback registration and\n * deregistration.\n */\nclass InternalSignaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n\tprivate readonly emitter = new EventEmitter();\n\n\tprivate readonly signalerId: string | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * Object to wrap that can submit and listen to signals\n\t\t */\n\t\tprivate readonly signaler: IRuntimeSignaler,\n\t\t/**\n\t\t * Optional id to assign to this manager that will be attached to\n\t\t * signal names. Useful to avoid collisions if there are multiple\n\t\t * signal users at the Container level\n\t\t */\n\t\tsignalerId?: string,\n\t) {\n\t\tsuper();\n\t\tthis.emitter.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t\tthis.signalerId = signalerId ? `#${signalerId}` : undefined;\n\t\tthis.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n\t\t\tconst clientId = message.clientId;\n\t\t\t// Only call listeners when the runtime is connected and if the signal has an\n\t\t\t// identifiable sender clientId. The listener is responsible for deciding how\n\t\t\t// it wants to handle local/remote signals\n\t\t\tif (this.signaler.connected && clientId !== null) {\n\t\t\t\tthis.emitter.emit(message.type, clientId, local, message.content);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getSignalerSignalName(signalName: string): string {\n\t\treturn this.signalerId ? `${signalName}${this.signalerId}` : signalName;\n\t}\n\n\t// ISignaler methods\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.on(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.off(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tif (this.signaler.connected) {\n\t\t\tthis.signaler.submitSignal(signalerSignalName, payload);\n\t\t}\n\t}\n}\n\n/**\n * DataObject implementation of ISignaler for fluid-static plug-and-play.\n * Allows fluid-static users to get an ISignaler without a custom DataObject.\n */\nclass SignalerClass extends DataObject<{ Events: IErrorEvent }> implements EventEmitter, ISignaler {\n\tprivate _signaler: InternalSignaler | undefined;\n\tprivate get signaler(): InternalSignaler {\n\t\tassert(this._signaler !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n\t\treturn this._signaler;\n\t}\n\n\tpublic static readonly Name = \"@fluid-example/signaler\";\n\n\tpublic static readonly factory = new DataObjectFactory(\n\t\tSignalerClass.Name,\n\t\tSignalerClass,\n\t\t[],\n\t\t{},\n\t);\n\n\tprotected async hasInitialized() {\n\t\tthis._signaler = new InternalSignaler(this.runtime);\n\t\tthis.signaler.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t}\n\n\t// ISignaler methods Note these are all passthroughs\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.onSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.offSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tthis.signaler.submitSignal(signalName, payload);\n\t}\n}\n\n/**\n * Implementation of ISignaler for declarative API.\n * @privateRemarks\n * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.\n * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.\n * @internal\n */\nexport const Signaler: {\n\treadonly factory: IFluidDataStoreFactory & {\n\t\treadonly registryEntry: NamedFluidDataStoreRegistryEntry;\n\t};\n} & SharedObjectKind<ISignaler> = createDataObjectKind(SignalerClass);\n"]}
@@ -2,11 +2,11 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { EventEmitter } from "@fluid-internal/client-utils";
6
- import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct/internal";
7
- import { IErrorEvent } from "@fluidframework/core-interfaces";
5
+ import { IErrorEvent, type IEventProvider } from "@fluidframework/core-interfaces";
8
6
  import { Jsonable } from "@fluidframework/datastore-definitions/internal";
9
- import { IInboundSignalMessage } from "@fluidframework/runtime-definitions";
7
+ import type { IFluidDataStoreFactory, NamedFluidDataStoreRegistryEntry } from "@fluidframework/runtime-definitions/internal";
8
+ import { IInboundSignalMessage } from "@fluidframework/runtime-definitions/internal";
9
+ import type { SharedObjectKind } from "@fluidframework/shared-object-base";
10
10
  /**
11
11
  * @internal
12
12
  */
@@ -17,7 +17,7 @@ export type SignalListener<T> = (clientId: string, local: boolean, payload: Json
17
17
  * provides explicit methods around signal requests to other connected clients.
18
18
  * @internal
19
19
  */
20
- export interface ISignaler {
20
+ export interface ISignaler extends IEventProvider<IErrorEvent> {
21
21
  /**
22
22
  * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`
23
23
  * method regarding multiple registrations, callback order, etc.
@@ -52,22 +52,15 @@ export interface IRuntimeSignaler {
52
52
  submitSignal(type: string, content: Jsonable<unknown>): void;
53
53
  }
54
54
  /**
55
- * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static
56
- * users to get an ISignaler without a custom DO.
55
+ * Implementation of ISignaler for declarative API.
56
+ * @privateRemarks
57
+ * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.
58
+ * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.
57
59
  * @internal
58
60
  */
59
- export declare class Signaler extends DataObject<{
60
- Events: IErrorEvent;
61
- }> implements EventEmitter, ISignaler {
62
- private _signaler;
63
- private get signaler();
64
- static readonly Name = "@fluid-example/signaler";
65
- static readonly factory: DataObjectFactory<Signaler, {
66
- Events: IErrorEvent;
67
- }>;
68
- protected hasInitialized(): Promise<void>;
69
- onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
70
- offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
71
- submitSignal<T>(signalName: string, payload?: Jsonable<T>): void;
72
- }
61
+ export declare const Signaler: {
62
+ readonly factory: IFluidDataStoreFactory & {
63
+ readonly registryEntry: NamedFluidDataStoreRegistryEntry;
64
+ };
65
+ } & SharedObjectKind<ISignaler>;
73
66
  //# sourceMappingURL=signaler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signaler.d.ts","sourceRoot":"","sources":["../../src/signaler/signaler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAqB,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAM5E;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAE;CAC3D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAAE;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAsED;;;;GAIG;AACH,qBAAa,QACZ,SAAQ,UAAU,CAAC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAC1C,YAAW,YAAY,EAAE,SAAS;IAElC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,KAAK,QAAQ,GAGnB;IAED,gBAAuB,IAAI,6BAA6B;IAExD,gBAAuB,OAAO;gBAXD,WAAW;OAWgD;cAExE,cAAc;IASvB,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS;IAKvE,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS;IAKxE,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;CAGhE"}
1
+ {"version":3,"file":"signaler.d.ts","sourceRoot":"","sources":["../../src/signaler/signaler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC1E,OAAO,KAAK,EACX,sBAAsB,EACtB,gCAAgC,EAChC,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAM3E;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC7D;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACxE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAE;CAC3D;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,OAAE;IACxF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC7D;AAkHD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE;IACtB,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG;QAC1C,QAAQ,CAAC,aAAa,EAAE,gCAAgC,CAAC;KACzD,CAAC;CACF,GAAG,gBAAgB,CAAC,SAAS,CAAuC,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { EventEmitter, TypedEventEmitter } from "@fluid-internal/client-utils";
6
- import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct/internal";
6
+ import { DataObject, DataObjectFactory, createDataObjectKind, } from "@fluidframework/aqueduct/internal";
7
7
  import { assert } from "@fluidframework/core-utils/internal";
8
8
  /**
9
9
  * Note: currently experimental and under development
@@ -65,11 +65,10 @@ class InternalSignaler extends TypedEventEmitter {
65
65
  }
66
66
  }
67
67
  /**
68
- * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static
69
- * users to get an ISignaler without a custom DO.
70
- * @internal
68
+ * DataObject implementation of ISignaler for fluid-static plug-and-play.
69
+ * Allows fluid-static users to get an ISignaler without a custom DataObject.
71
70
  */
72
- export class Signaler extends DataObject {
71
+ class SignalerClass extends DataObject {
73
72
  get signaler() {
74
73
  assert(this._signaler !== undefined, 0x24b /* "internal signaler should be defined" */);
75
74
  return this._signaler;
@@ -93,6 +92,14 @@ export class Signaler extends DataObject {
93
92
  this.signaler.submitSignal(signalName, payload);
94
93
  }
95
94
  }
96
- Signaler.Name = "@fluid-example/signaler";
97
- Signaler.factory = new DataObjectFactory(Signaler.Name, Signaler, [], {});
95
+ SignalerClass.Name = "@fluid-example/signaler";
96
+ SignalerClass.factory = new DataObjectFactory(SignalerClass.Name, SignalerClass, [], {});
97
+ /**
98
+ * Implementation of ISignaler for declarative API.
99
+ * @privateRemarks
100
+ * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.
101
+ * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.
102
+ * @internal
103
+ */
104
+ export const Signaler = createDataObjectKind(SignalerClass);
98
105
  //# sourceMappingURL=signaler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signaler.js","sourceRoot":"","sources":["../../src/signaler/signaler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAuD7D;;;;;;;;GAQG;AACH,MAAM,gBAAiB,SAAQ,iBAA8B;IAK5D;IACC;;OAEG;IACc,QAA0B;IAC3C;;;;OAIG;IACH,UAAmB;QAEnB,KAAK,EAAE,CAAC;QARS,aAAQ,GAAR,QAAQ,CAAkB;QAR3B,YAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QAiB7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAA8B,EAAE,KAAc,EAAE,EAAE;YAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YAClC,6EAA6E;YAC7E,8EAA8E;YAC9E,0CAA0C;YAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,UAAkB;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACzE,CAAC;IAED,oBAAoB;IAEb,QAAQ,CAAI,UAAkB,EAAE,QAA2B;QACjE,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,SAAS,CAAI,UAAkB,EAAE,QAA2B;QAClE,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,YAAY,CAAI,UAAkB,EAAE,OAAqB;QAC/D,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,QACZ,SAAQ,UAAmC;IAI3C,IAAY,QAAQ;QACnB,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACxF,OAAO,IAAI,CAAC,SAAS,CAAC;IACvB,CAAC;IAMS,KAAK,CAAC,cAAc;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,qDAAqD;IAE9C,QAAQ,CAAI,UAAkB,EAAE,QAA2B;QACjE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,SAAS,CAAI,UAAkB,EAAE,QAA2B;QAClE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,YAAY,CAAI,UAAkB,EAAE,OAAqB;QAC/D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;;AAzBsB,aAAI,GAAG,yBAAyB,CAAC;AAEjC,gBAAO,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter, TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { DataObject, DataObjectFactory } from \"@fluidframework/aqueduct/internal\";\nimport { IErrorEvent } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions/internal\";\nimport { IInboundSignalMessage } from \"@fluidframework/runtime-definitions\";\n\n// TODO:\n// add way to mark with current sequence number for ordering signals relative to ops\n// throttling and batching\n\n/**\n * @internal\n */\nexport type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;\n\n/**\n * ISignaler defines an interface for working with signals that is similar to the more common\n * eventing patterns of EventEmitter. In addition to sending and responding to signals, it\n * provides explicit methods around signal requests to other connected clients.\n * @internal\n */\nexport interface ISignaler {\n\t/**\n\t * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n\t * method regarding multiple registrations, callback order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to add\n\t * @returns This ISignaler\n\t */\n\tonSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n\t * `off` method regarding multiple registrations, removal order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to remove\n\t * @returns This ISignaler\n\t */\n\toffSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Send a signal with payload to its connected listeners.\n\t * @param signalName - The name of the signal\n\t * @param payload - The data to send with the signal\n\t */\n\tsubmitSignal<T>(signalName: string, payload?: Jsonable<T>);\n}\n\n/**\n * Duck type of something that provides the expected signalling functionality:\n * A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals\n * @internal\n */\nexport interface IRuntimeSignaler {\n\tconnected: boolean;\n\ton(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n\tsubmitSignal(type: string, content: Jsonable<unknown>): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. InternalSignaler wraps a runtime\n * object with signaling functionality (e.g. ContainerRuntime or FluidDataStoreRuntime) and can\n * then be used in place of the original signaler. It uses a separate internal EventEmitter to\n * manage callbacks, and thus will reflect that behavior with regards to callback registration and\n * deregistration.\n */\nclass InternalSignaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n\tprivate readonly emitter = new EventEmitter();\n\n\tprivate readonly signalerId: string | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * Object to wrap that can submit and listen to signals\n\t\t */\n\t\tprivate readonly signaler: IRuntimeSignaler,\n\t\t/**\n\t\t * Optional id to assign to this manager that will be attached to\n\t\t * signal names. Useful to avoid collisions if there are multiple\n\t\t * signal users at the Container level\n\t\t */\n\t\tsignalerId?: string,\n\t) {\n\t\tsuper();\n\t\tthis.emitter.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t\tthis.signalerId = signalerId ? `#${signalerId}` : undefined;\n\t\tthis.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n\t\t\tconst clientId = message.clientId;\n\t\t\t// Only call listeners when the runtime is connected and if the signal has an\n\t\t\t// identifiable sender clientId. The listener is responsible for deciding how\n\t\t\t// it wants to handle local/remote signals\n\t\t\tif (this.signaler.connected && clientId !== null) {\n\t\t\t\tthis.emitter.emit(message.type, clientId, local, message.content);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getSignalerSignalName(signalName: string): string {\n\t\treturn this.signalerId ? `${signalName}${this.signalerId}` : signalName;\n\t}\n\n\t// ISignaler methods\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.on(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.off(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tif (this.signaler.connected) {\n\t\t\tthis.signaler.submitSignal(signalerSignalName, payload);\n\t\t}\n\t}\n}\n\n/**\n * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static\n * users to get an ISignaler without a custom DO.\n * @internal\n */\nexport class Signaler\n\textends DataObject<{ Events: IErrorEvent }>\n\timplements EventEmitter, ISignaler\n{\n\tprivate _signaler: InternalSignaler | undefined;\n\tprivate get signaler(): InternalSignaler {\n\t\tassert(this._signaler !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n\t\treturn this._signaler;\n\t}\n\n\tpublic static readonly Name = \"@fluid-example/signaler\";\n\n\tpublic static readonly factory = new DataObjectFactory(Signaler.Name, Signaler, [], {});\n\n\tprotected async hasInitialized() {\n\t\tthis._signaler = new InternalSignaler(this.runtime);\n\t\tthis.signaler.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t}\n\n\t// ISignaler methods Note these are all passthroughs\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.onSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.offSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tthis.signaler.submitSignal(signalName, payload);\n\t}\n}\n"]}
1
+ {"version":3,"file":"signaler.js","sourceRoot":"","sources":["../../src/signaler/signaler.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 { EventEmitter, TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tDataObject,\n\tDataObjectFactory,\n\tcreateDataObjectKind,\n} from \"@fluidframework/aqueduct/internal\";\nimport { IErrorEvent, type IEventProvider } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { Jsonable } from \"@fluidframework/datastore-definitions/internal\";\nimport type {\n\tIFluidDataStoreFactory,\n\tNamedFluidDataStoreRegistryEntry,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { IInboundSignalMessage } from \"@fluidframework/runtime-definitions/internal\";\nimport type { SharedObjectKind } from \"@fluidframework/shared-object-base\";\n\n// TODO:\n// add way to mark with current sequence number for ordering signals relative to ops\n// throttling and batching\n\n/**\n * @internal\n */\nexport type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;\n\n/**\n * ISignaler defines an interface for working with signals that is similar to the more common\n * eventing patterns of EventEmitter. In addition to sending and responding to signals, it\n * provides explicit methods around signal requests to other connected clients.\n * @internal\n */\nexport interface ISignaler extends IEventProvider<IErrorEvent> {\n\t/**\n\t * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`\n\t * method regarding multiple registrations, callback order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to add\n\t * @returns This ISignaler\n\t */\n\tonSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Remove a listener for the specified signal. It behaves in the same way as EventEmitter's\n\t * `off` method regarding multiple registrations, removal order, etc.\n\t * @param signalName - The name of the signal\n\t * @param listener - The callback signal handler to remove\n\t * @returns This ISignaler\n\t */\n\toffSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;\n\t/**\n\t * Send a signal with payload to its connected listeners.\n\t * @param signalName - The name of the signal\n\t * @param payload - The data to send with the signal\n\t */\n\tsubmitSignal<T>(signalName: string, payload?: Jsonable<T>);\n}\n\n/**\n * Duck type of something that provides the expected signalling functionality:\n * A way to verify we can signal, a way to send a signal, and a way to listen for incoming signals\n * @internal\n */\nexport interface IRuntimeSignaler {\n\tconnected: boolean;\n\ton(event: \"signal\", listener: (message: IInboundSignalMessage, local: boolean) => void);\n\tsubmitSignal(type: string, content: Jsonable<unknown>): void;\n}\n\n/**\n * Note: currently experimental and under development\n *\n * Helper class to assist common scenarios around working with signals. InternalSignaler wraps a runtime\n * object with signaling functionality (e.g. ContainerRuntime or FluidDataStoreRuntime) and can\n * then be used in place of the original signaler. It uses a separate internal EventEmitter to\n * manage callbacks, and thus will reflect that behavior with regards to callback registration and\n * deregistration.\n */\nclass InternalSignaler extends TypedEventEmitter<IErrorEvent> implements ISignaler {\n\tprivate readonly emitter = new EventEmitter();\n\n\tprivate readonly signalerId: string | undefined;\n\n\tconstructor(\n\t\t/**\n\t\t * Object to wrap that can submit and listen to signals\n\t\t */\n\t\tprivate readonly signaler: IRuntimeSignaler,\n\t\t/**\n\t\t * Optional id to assign to this manager that will be attached to\n\t\t * signal names. Useful to avoid collisions if there are multiple\n\t\t * signal users at the Container level\n\t\t */\n\t\tsignalerId?: string,\n\t) {\n\t\tsuper();\n\t\tthis.emitter.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t\tthis.signalerId = signalerId ? `#${signalerId}` : undefined;\n\t\tthis.signaler.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n\t\t\tconst clientId = message.clientId;\n\t\t\t// Only call listeners when the runtime is connected and if the signal has an\n\t\t\t// identifiable sender clientId. The listener is responsible for deciding how\n\t\t\t// it wants to handle local/remote signals\n\t\t\tif (this.signaler.connected && clientId !== null) {\n\t\t\t\tthis.emitter.emit(message.type, clientId, local, message.content);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate getSignalerSignalName(signalName: string): string {\n\t\treturn this.signalerId ? `${signalName}${this.signalerId}` : signalName;\n\t}\n\n\t// ISignaler methods\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.on(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tthis.emitter.off(signalerSignalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tconst signalerSignalName = this.getSignalerSignalName(signalName);\n\t\tif (this.signaler.connected) {\n\t\t\tthis.signaler.submitSignal(signalerSignalName, payload);\n\t\t}\n\t}\n}\n\n/**\n * DataObject implementation of ISignaler for fluid-static plug-and-play.\n * Allows fluid-static users to get an ISignaler without a custom DataObject.\n */\nclass SignalerClass extends DataObject<{ Events: IErrorEvent }> implements EventEmitter, ISignaler {\n\tprivate _signaler: InternalSignaler | undefined;\n\tprivate get signaler(): InternalSignaler {\n\t\tassert(this._signaler !== undefined, 0x24b /* \"internal signaler should be defined\" */);\n\t\treturn this._signaler;\n\t}\n\n\tpublic static readonly Name = \"@fluid-example/signaler\";\n\n\tpublic static readonly factory = new DataObjectFactory(\n\t\tSignalerClass.Name,\n\t\tSignalerClass,\n\t\t[],\n\t\t{},\n\t);\n\n\tprotected async hasInitialized() {\n\t\tthis._signaler = new InternalSignaler(this.runtime);\n\t\tthis.signaler.on(\"error\", (error) => {\n\t\t\tthis.emit(\"error\", error);\n\t\t});\n\t}\n\n\t// ISignaler methods Note these are all passthroughs\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.onSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler {\n\t\tthis.signaler.offSignal(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>) {\n\t\tthis.signaler.submitSignal(signalName, payload);\n\t}\n}\n\n/**\n * Implementation of ISignaler for declarative API.\n * @privateRemarks\n * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.\n * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.\n * @internal\n */\nexport const Signaler: {\n\treadonly factory: IFluidDataStoreFactory & {\n\t\treadonly registryEntry: NamedFluidDataStoreRegistryEntry;\n\t};\n} & SharedObjectKind<ISignaler> = createDataObjectKind(SignalerClass);\n"]}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.43.1"
8
+ "packageVersion": "7.45.1"
9
9
  }
10
10
  ]
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-experimental/data-objects",
3
- "version": "2.0.0-dev-rc.5.0.0.265721",
3
+ "version": "2.0.0-dev-rc.5.0.0.268409",
4
4
  "description": "A collection of ready to use Fluid Data Objects",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -27,29 +27,30 @@
27
27
  "main": "lib/index.js",
28
28
  "types": "lib/index.d.ts",
29
29
  "dependencies": {
30
- "@fluid-internal/client-utils": "2.0.0-dev-rc.5.0.0.265721",
31
- "@fluidframework/aqueduct": "2.0.0-dev-rc.5.0.0.265721",
32
- "@fluidframework/core-interfaces": "2.0.0-dev-rc.5.0.0.265721",
33
- "@fluidframework/core-utils": "2.0.0-dev-rc.5.0.0.265721",
34
- "@fluidframework/datastore-definitions": "2.0.0-dev-rc.5.0.0.265721",
35
- "@fluidframework/map": "2.0.0-dev-rc.5.0.0.265721",
36
- "@fluidframework/runtime-definitions": "2.0.0-dev-rc.5.0.0.265721"
30
+ "@fluid-internal/client-utils": "2.0.0-dev-rc.5.0.0.268409",
31
+ "@fluidframework/aqueduct": "2.0.0-dev-rc.5.0.0.268409",
32
+ "@fluidframework/core-interfaces": "2.0.0-dev-rc.5.0.0.268409",
33
+ "@fluidframework/core-utils": "2.0.0-dev-rc.5.0.0.268409",
34
+ "@fluidframework/datastore-definitions": "2.0.0-dev-rc.5.0.0.268409",
35
+ "@fluidframework/map": "2.0.0-dev-rc.5.0.0.268409",
36
+ "@fluidframework/runtime-definitions": "2.0.0-dev-rc.5.0.0.268409",
37
+ "@fluidframework/shared-object-base": "2.0.0-dev-rc.5.0.0.268409"
37
38
  },
38
39
  "devDependencies": {
39
40
  "@arethetypeswrong/cli": "^0.15.2",
40
- "@biomejs/biome": "^1.6.2",
41
+ "@biomejs/biome": "^1.7.3",
41
42
  "@fluid-tools/build-cli": "^0.39.0-264124",
42
43
  "@fluidframework/build-common": "^2.0.3",
43
44
  "@fluidframework/build-tools": "^0.39.0-264124",
44
- "@fluidframework/eslint-config-fluid": "^5.1.0",
45
- "@microsoft/api-extractor": "^7.43.1",
45
+ "@fluidframework/eslint-config-fluid": "^5.3.0",
46
+ "@microsoft/api-extractor": "^7.45.1",
46
47
  "@types/node": "^18.19.0",
47
48
  "copyfiles": "^2.4.1",
48
49
  "cross-env": "^7.0.3",
49
50
  "eslint": "~8.55.0",
50
51
  "prettier": "~3.0.3",
51
52
  "rimraf": "^4.4.0",
52
- "typescript": "~5.3.3"
53
+ "typescript": "~5.4.5"
53
54
  },
54
55
  "typeValidation": {
55
56
  "disabled": true,
@@ -4,11 +4,20 @@
4
4
  */
5
5
 
6
6
  import { EventEmitter, TypedEventEmitter } from "@fluid-internal/client-utils";
7
- import { DataObject, DataObjectFactory } from "@fluidframework/aqueduct/internal";
8
- import { IErrorEvent } from "@fluidframework/core-interfaces";
7
+ import {
8
+ DataObject,
9
+ DataObjectFactory,
10
+ createDataObjectKind,
11
+ } from "@fluidframework/aqueduct/internal";
12
+ import { IErrorEvent, type IEventProvider } from "@fluidframework/core-interfaces";
9
13
  import { assert } from "@fluidframework/core-utils/internal";
10
14
  import { Jsonable } from "@fluidframework/datastore-definitions/internal";
11
- import { IInboundSignalMessage } from "@fluidframework/runtime-definitions";
15
+ import type {
16
+ IFluidDataStoreFactory,
17
+ NamedFluidDataStoreRegistryEntry,
18
+ } from "@fluidframework/runtime-definitions/internal";
19
+ import { IInboundSignalMessage } from "@fluidframework/runtime-definitions/internal";
20
+ import type { SharedObjectKind } from "@fluidframework/shared-object-base";
12
21
 
13
22
  // TODO:
14
23
  // add way to mark with current sequence number for ordering signals relative to ops
@@ -25,7 +34,7 @@ export type SignalListener<T> = (clientId: string, local: boolean, payload: Json
25
34
  * provides explicit methods around signal requests to other connected clients.
26
35
  * @internal
27
36
  */
28
- export interface ISignaler {
37
+ export interface ISignaler extends IEventProvider<IErrorEvent> {
29
38
  /**
30
39
  * Adds a listener for the specified signal. It behaves in the same way as EventEmitter's `on`
31
40
  * method regarding multiple registrations, callback order, etc.
@@ -130,14 +139,10 @@ class InternalSignaler extends TypedEventEmitter<IErrorEvent> implements ISignal
130
139
  }
131
140
 
132
141
  /**
133
- * DataObject implementation of ISignaler for fluid-static plug-and-play. Allows fluid-static
134
- * users to get an ISignaler without a custom DO.
135
- * @internal
142
+ * DataObject implementation of ISignaler for fluid-static plug-and-play.
143
+ * Allows fluid-static users to get an ISignaler without a custom DataObject.
136
144
  */
137
- export class Signaler
138
- extends DataObject<{ Events: IErrorEvent }>
139
- implements EventEmitter, ISignaler
140
- {
145
+ class SignalerClass extends DataObject<{ Events: IErrorEvent }> implements EventEmitter, ISignaler {
141
146
  private _signaler: InternalSignaler | undefined;
142
147
  private get signaler(): InternalSignaler {
143
148
  assert(this._signaler !== undefined, 0x24b /* "internal signaler should be defined" */);
@@ -146,7 +151,12 @@ export class Signaler
146
151
 
147
152
  public static readonly Name = "@fluid-example/signaler";
148
153
 
149
- public static readonly factory = new DataObjectFactory(Signaler.Name, Signaler, [], {});
154
+ public static readonly factory = new DataObjectFactory(
155
+ SignalerClass.Name,
156
+ SignalerClass,
157
+ [],
158
+ {},
159
+ );
150
160
 
151
161
  protected async hasInitialized() {
152
162
  this._signaler = new InternalSignaler(this.runtime);
@@ -171,3 +181,16 @@ export class Signaler
171
181
  this.signaler.submitSignal(signalName, payload);
172
182
  }
173
183
  }
184
+
185
+ /**
186
+ * Implementation of ISignaler for declarative API.
187
+ * @privateRemarks
188
+ * `factory` part of the type is included here to satisfy the usage in `@fluid-example/presence-tracker`, which is accessing encapsulated API surfaces from this.
189
+ * If this eventually gets promoted to `@public` and/or part of `fluid-framework`, that part of the type should be left as `@internal` or `@alpha`.
190
+ * @internal
191
+ */
192
+ export const Signaler: {
193
+ readonly factory: IFluidDataStoreFactory & {
194
+ readonly registryEntry: NamedFluidDataStoreRegistryEntry;
195
+ };
196
+ } & SharedObjectKind<ISignaler> = createDataObjectKind(SignalerClass);
@@ -1,56 +0,0 @@
1
- ## API Report File for "@fluid-experimental/data-objects"
2
-
3
- > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4
-
5
- ```ts
6
-
7
- import { DataObject } from '@fluidframework/aqueduct/internal';
8
- import { DataObjectFactory } from '@fluidframework/aqueduct/internal';
9
- import { EventEmitter } from '@fluid-internal/client-utils';
10
- import { IErrorEvent } from '@fluidframework/core-interfaces';
11
- import { IInboundSignalMessage } from '@fluidframework/runtime-definitions';
12
- import { Jsonable } from '@fluidframework/datastore-definitions/internal';
13
-
14
- // @internal
15
- export interface IRuntimeSignaler {
16
- // (undocumented)
17
- connected: boolean;
18
- // (undocumented)
19
- on(event: "signal", listener: (message: IInboundSignalMessage, local: boolean) => void): any;
20
- // (undocumented)
21
- submitSignal(type: string, content: Jsonable<unknown>): void;
22
- }
23
-
24
- // @internal
25
- export interface ISignaler {
26
- offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
27
- onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
28
- submitSignal<T>(signalName: string, payload?: Jsonable<T>): any;
29
- }
30
-
31
- // @internal
32
- export class Signaler extends DataObject<{
33
- Events: IErrorEvent;
34
- }> implements EventEmitter, ISignaler {
35
- // (undocumented)
36
- static readonly factory: DataObjectFactory<Signaler, {
37
- Events: IErrorEvent;
38
- }>;
39
- // (undocumented)
40
- protected hasInitialized(): Promise<void>;
41
- // (undocumented)
42
- static readonly Name = "@fluid-example/signaler";
43
- // (undocumented)
44
- offSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
45
- // (undocumented)
46
- onSignal<T>(signalName: string, listener: SignalListener<T>): ISignaler;
47
- // (undocumented)
48
- submitSignal<T>(signalName: string, payload?: Jsonable<T>): void;
49
- }
50
-
51
- // @internal (undocumented)
52
- export type SignalListener<T> = (clientId: string, local: boolean, payload: Jsonable<T>) => void;
53
-
54
- // (No @packageDocumentation comment for this package)
55
-
56
- ```